From b599f1a017d4f31f3627a4456be5222d4d95622d Mon Sep 17 00:00:00 2001 From: Abdulmuizz Hamzat <103611443+buildwithhamzat@users.noreply.github.com> Date: Wed, 22 Jul 2026 22:30:10 +0100 Subject: [PATCH] chore(docs): migrate the docs site from Fumadocs to Blume (#753) * Update documentation for ClassroomIO: change Fumadocs to Blume, revise MDX format conventions, and clarify sidebar navigation requirements. * docs: update README and scripts for improved preview and error handling * docs: update Discord link in configuration and documentation * docs: add token-auth route and update documentation formatting * Fix formatting in auto-comment-issues.yml * Fix JSON syntax by adding a comma * fix(docs): declare Blume's Astro build deps so Cloudflare build resolves them blume build generates an Astro project under apps/docs/.blume/ that imports astro, @astrojs/mdx, @tailwindcss/vite, tailwindcss, @tailwindcss/typography, @shikijs/twoslash and @scalar/astro. Under pnpm's isolated node_modules these are nested inside blume and not resolvable from the docs app, so a clean --frozen-lockfile build (Cloudflare) fails at 'Cannot find module astro/config'. Declare them directly in @cio/docs, pinned to blume's resolved versions. * refactor(docs): update API reference paths and documentation for clarity * fix: change platofrm url to docs home page * Refactor documentation for self-hosting ClassroomIO - Removed the Supabase Cloud setup guide as it is no longer needed. - Updated the Enterprise SSO documentation to include a reference link for SSO & licensing. - Added new documentation for Content Security Policy (CSP) configuration. - Created a new section for configuring SMTP for email notifications. - Introduced a comprehensive configuration index for self-hosted ClassroomIO, detailing environment variables and their usage. - Added documentation for optional integrations including Google OAuth, OpenAI, and Unsplash. - Documented the generation and usage of required secrets for ClassroomIO. - Created a section for SSO & licensing, detailing the requirements for Enterprise features. - Added object storage configuration documentation, covering both bundled MinIO and external S3-compatible services. - Documented versioning and upgrade processes for ClassroomIO. - Updated the Coolify and Docker self-hosting guides to streamline configuration references and upgrade instructions. - Enhanced the Railway self-hosting guide with links to relevant configuration sections. - Updated token authentication documentation to reference SSO & licensing. * Add comprehensive guides for ClassroomIO features and functionalities - Introduced a new guide for the Student Dashboard, detailing navigation and features available to students. - Added a guide on using Tags for organizing and filtering courses within ClassroomIO. - Created a guide on how to take attendance in courses, including marking attendance and related functionalities. - Developed a Terminology guide to clarify key terms used throughout ClassroomIO. - Implemented a Token Auth guide for signing users into ClassroomIO from external applications using JWT. - Added instructions for using math in the editor with LaTeX support. - Created a guide for customizing the welcome email sent to students upon enrollment in courses. - Added a guide explaining what ClassroomIO is and its key features. - Updated the home documentation to provide a clearer overview of ClassroomIO and its resources. - Enhanced self-hosted configuration documentation with a new guide for deploying ClassroomIO on Dokploy. - Updated links in the self-hosted configuration documentation for better navigation. - Added new images to support the Dokploy deployment guide. - Updated asset packaging script to handle redirects for the new guide structure. - Fixed footer link to point to the correct Getting Started guide. * chore: uprage version * feat(docs): add DigitalOcean deployment guide and flatten guides structure - Add a guide for deploying ClassroomIO on DigitalOcean using Docker Compose and Caddy for automatic HTTPS. - List DigitalOcean as a deployment option in the self-hosting index. - Move guides out of content/docs/guides into content/docs (student-dashboard, tags, terminology, token-auth, what-is-classroomio, audience, cohorts, community, course, enterprise-sso, mcp, organization, quickstart/*). - Rename home.mdx to index.mdx. - Update package-assets script to emit redirects for the old guides paths. --------- Co-authored-by: Rotimi Best --- .github/workflows/auto-comment-issues.yml | 2 +- .github/workflows/deploy-docs.yml | 68 + .github/workflows/upload-openapi-spec.yml | 7 + README.md | 2 +- .../lib/features/course/pages/settings.svelte | 2 +- .../routes/(app)/org/[slug]/api/+page.svelte | 2 +- apps/docs/.gitignore | 27 +- apps/docs/.nvmrc | 2 +- apps/docs/README.md | 50 +- apps/docs/app/app.css | 16 - apps/docs/app/components/mdx.tsx | 15 - apps/docs/app/components/not-found.tsx | 28 - apps/docs/app/entry.server.tsx | 38 - apps/docs/app/lib/layout.shared.tsx | 68 - apps/docs/app/lib/source.server.ts | 35 - apps/docs/app/root.tsx | 175 - apps/docs/app/routes.ts | 8 - apps/docs/app/routes/api-reference.ts | 33 - apps/docs/app/routes/docs.tsx | 129 - apps/docs/app/routes/home.tsx | 5 - apps/docs/app/routes/search.ts | 10 - apps/docs/blume.config.ts | 198 + apps/docs/content/docs/api.mdx | 94 - apps/docs/content/docs/audience.mdx | 14 +- apps/docs/content/docs/cohorts.mdx | 8 +- apps/docs/content/docs/community.mdx | 12 +- .../docs/contributor-guides/demo-accounts.mdx | 34 - .../docs/contributor-guides/design.mdx | 11 - .../content/docs/contributor-guides/meta.json | 11 - .../contributor-guides/student-dashboard.mdx | 34 - .../contributor-guides/supabase-cloud.mdx | 167 - apps/docs/content/docs/course.mdx | 28 +- apps/docs/content/docs/enterprise-sso.mdx | 35 +- .../academy-sharing-and-branding.mdx | 29 +- .../docs/{ => guides}/certificates.mdx | 31 +- .../adding-translation-to-code.mdx | 0 .../contributing}/cloudflare-setup.mdx | 13 +- .../guides/contributing/demo-accounts.mdx | 21 + .../docs/guides/contributing/design.mdx | 8 + .../contributing}/devs.mdx | 2 +- .../contributing}/gitpod.mdx | 12 +- .../docs/guides/contributing/index.mdx | 54 + .../org-site-opengraph-and-favicon.mdx | 16 +- .../guides/contributing/student-dashboard.mdx | 21 + .../docs/{ => guides}/course-enrollment.mdx | 53 +- .../docs/{ => guides}/course-landingpage.mdx | 35 +- .../docs/{ => guides}/course-progression.mdx | 31 +- .../docs/{ => guides}/course-types.mdx | 28 +- .../docs/{ => guides}/create-exercise.mdx | 41 +- .../docs/{ => guides}/create-first-course.mdx | 31 +- .../docs/{ => guides}/custom-domain.mdx | 21 +- .../{ => guides}/customize-organization.mdx | 28 +- .../docs/{ => guides}/grade-exercise.mdx | 21 +- apps/docs/content/docs/guides/index.mdx | 45 + .../docs/{ => guides}/invite-students.mdx | 12 +- .../docs/{ => guides}/invite-team-member.mdx | 15 +- .../content/docs/{ => guides}/live-class.mdx | 35 +- .../docs/{ => guides}/org-landing-page.mdx | 29 +- .../{ => guides}/roles-and-permissions.mdx | 22 +- .../docs/{ => guides}/take-attendance.mdx | 14 +- .../docs/{ => guides}/use-math-in-editor.mdx | 2 - .../docs/{ => guides}/welcome-email.mdx | 19 +- apps/docs/content/docs/home.mdx | 25 - apps/docs/content/docs/index.mdx | 27 + apps/docs/content/docs/mcp.mdx | 12 +- apps/docs/content/docs/meta.json | 61 - apps/docs/content/docs/organization.mdx | 40 +- apps/docs/content/docs/quickstart/meta.json | 4 - apps/docs/content/docs/quickstart/signup.mdx | 16 +- .../docs/self-hosted/configuration/csp.mdx | 41 + .../docs/self-hosted/configuration/email.mdx | 38 + .../docs/self-hosted/configuration/index.mdx | 47 + .../configuration/integrations.mdx | 48 + .../self-hosted/configuration/secrets.mdx | 56 + .../docs/self-hosted/configuration/sso.mdx | 34 + .../self-hosted/configuration/storage.mdx | 74 + .../self-hosted/configuration/versions.mdx | 53 + .../docs/content/docs/self-hosted/coolify.mdx | 123 +- .../content/docs/self-hosted/digitalocean.mdx | 559 ++ apps/docs/content/docs/self-hosted/docker.mdx | 174 +- .../docs/content/docs/self-hosted/dokploy.mdx | 194 + apps/docs/content/docs/self-hosted/index.mdx | 97 + apps/docs/content/docs/self-hosted/meta.json | 4 - .../docs/content/docs/self-hosted/railway.mdx | 82 +- apps/docs/content/docs/student-dashboard.mdx | 18 +- apps/docs/content/docs/tags.mdx | 10 +- apps/docs/content/docs/token-auth.mdx | 15 +- apps/docs/package.json | 45 +- .../public/dokploy-01-create-project.webp | Bin 0 -> 14286 bytes .../public/dokploy-02-compose-service.webp | Bin 0 -> 21446 bytes apps/docs/public/dokploy-03-raw-compose.webp | Bin 0 -> 30736 bytes apps/docs/public/dokploy-04-env-vars.webp | Bin 0 -> 49982 bytes apps/docs/public/dokploy-05-deploy-logs.webp | Bin 0 -> 44256 bytes apps/docs/public/dokploy-06-add-domain.webp | Bin 0 -> 26108 bytes apps/docs/public/dokploy-07-signup.webp | Bin 0 -> 16612 bytes apps/docs/react-router.config.ts | 9 - apps/docs/scripts/fetch-openapi.mjs | 66 + apps/docs/scripts/package-assets.mjs | 57 + apps/docs/source.config.ts | 7 - apps/docs/tsconfig.json | 34 - apps/docs/vite.config.ts | 28 - apps/docs/workers/app.ts | 41 - apps/docs/wrangler.jsonc | 14 +- apps/website/src/lib/components/footer.svelte | 2 +- .../src/lib/components/oss-section.svelte | 2 +- .../src/routes/automation/+page.svelte | 2 +- apps/website/vercel.json | 12 - package.json | 5 +- packages/utils/src/openapi/public-api.ts | 6 +- pnpm-lock.yaml | 6185 ++++++++++++----- skills/write-docs/SKILL.md | 41 +- 111 files changed, 6819 insertions(+), 3646 deletions(-) create mode 100644 .github/workflows/deploy-docs.yml delete mode 100644 apps/docs/app/app.css delete mode 100644 apps/docs/app/components/mdx.tsx delete mode 100644 apps/docs/app/components/not-found.tsx delete mode 100644 apps/docs/app/entry.server.tsx delete mode 100644 apps/docs/app/lib/layout.shared.tsx delete mode 100644 apps/docs/app/lib/source.server.ts delete mode 100644 apps/docs/app/root.tsx delete mode 100644 apps/docs/app/routes.ts delete mode 100644 apps/docs/app/routes/api-reference.ts delete mode 100644 apps/docs/app/routes/docs.tsx delete mode 100644 apps/docs/app/routes/home.tsx delete mode 100644 apps/docs/app/routes/search.ts create mode 100644 apps/docs/blume.config.ts delete mode 100644 apps/docs/content/docs/api.mdx delete mode 100644 apps/docs/content/docs/contributor-guides/demo-accounts.mdx delete mode 100644 apps/docs/content/docs/contributor-guides/design.mdx delete mode 100644 apps/docs/content/docs/contributor-guides/meta.json delete mode 100644 apps/docs/content/docs/contributor-guides/student-dashboard.mdx delete mode 100644 apps/docs/content/docs/contributor-guides/supabase-cloud.mdx rename apps/docs/content/docs/{ => guides}/academy-sharing-and-branding.mdx (70%) rename apps/docs/content/docs/{ => guides}/certificates.mdx (76%) rename apps/docs/content/docs/{contributor-guides => guides/contributing}/adding-translation-to-code.mdx (100%) rename apps/docs/content/docs/{contributor-guides => guides/contributing}/cloudflare-setup.mdx (89%) create mode 100644 apps/docs/content/docs/guides/contributing/demo-accounts.mdx create mode 100644 apps/docs/content/docs/guides/contributing/design.mdx rename apps/docs/content/docs/{contributor-guides => guides/contributing}/devs.mdx (98%) rename apps/docs/content/docs/{contributor-guides => guides/contributing}/gitpod.mdx (62%) create mode 100644 apps/docs/content/docs/guides/contributing/index.mdx rename apps/docs/content/docs/{contributor-guides => guides/contributing}/org-site-opengraph-and-favicon.mdx (93%) create mode 100644 apps/docs/content/docs/guides/contributing/student-dashboard.mdx rename apps/docs/content/docs/{ => guides}/course-enrollment.mdx (76%) rename apps/docs/content/docs/{ => guides}/course-landingpage.mdx (56%) rename apps/docs/content/docs/{ => guides}/course-progression.mdx (80%) rename apps/docs/content/docs/{ => guides}/course-types.mdx (71%) rename apps/docs/content/docs/{ => guides}/create-exercise.mdx (72%) rename apps/docs/content/docs/{ => guides}/create-first-course.mdx (78%) rename apps/docs/content/docs/{ => guides}/custom-domain.mdx (72%) rename apps/docs/content/docs/{ => guides}/customize-organization.mdx (74%) rename apps/docs/content/docs/{ => guides}/grade-exercise.mdx (65%) create mode 100644 apps/docs/content/docs/guides/index.mdx rename apps/docs/content/docs/{ => guides}/invite-students.mdx (90%) rename apps/docs/content/docs/{ => guides}/invite-team-member.mdx (77%) rename apps/docs/content/docs/{ => guides}/live-class.mdx (78%) rename apps/docs/content/docs/{ => guides}/org-landing-page.mdx (65%) rename apps/docs/content/docs/{ => guides}/roles-and-permissions.mdx (68%) rename apps/docs/content/docs/{ => guides}/take-attendance.mdx (65%) rename apps/docs/content/docs/{ => guides}/use-math-in-editor.mdx (95%) rename apps/docs/content/docs/{ => guides}/welcome-email.mdx (74%) delete mode 100644 apps/docs/content/docs/home.mdx create mode 100644 apps/docs/content/docs/index.mdx delete mode 100644 apps/docs/content/docs/meta.json delete mode 100644 apps/docs/content/docs/quickstart/meta.json create mode 100644 apps/docs/content/docs/self-hosted/configuration/csp.mdx create mode 100644 apps/docs/content/docs/self-hosted/configuration/email.mdx create mode 100644 apps/docs/content/docs/self-hosted/configuration/index.mdx create mode 100644 apps/docs/content/docs/self-hosted/configuration/integrations.mdx create mode 100644 apps/docs/content/docs/self-hosted/configuration/secrets.mdx create mode 100644 apps/docs/content/docs/self-hosted/configuration/sso.mdx create mode 100644 apps/docs/content/docs/self-hosted/configuration/storage.mdx create mode 100644 apps/docs/content/docs/self-hosted/configuration/versions.mdx create mode 100644 apps/docs/content/docs/self-hosted/digitalocean.mdx create mode 100644 apps/docs/content/docs/self-hosted/dokploy.mdx create mode 100644 apps/docs/content/docs/self-hosted/index.mdx delete mode 100644 apps/docs/content/docs/self-hosted/meta.json create mode 100644 apps/docs/public/dokploy-01-create-project.webp create mode 100644 apps/docs/public/dokploy-02-compose-service.webp create mode 100644 apps/docs/public/dokploy-03-raw-compose.webp create mode 100644 apps/docs/public/dokploy-04-env-vars.webp create mode 100644 apps/docs/public/dokploy-05-deploy-logs.webp create mode 100644 apps/docs/public/dokploy-06-add-domain.webp create mode 100644 apps/docs/public/dokploy-07-signup.webp delete mode 100644 apps/docs/react-router.config.ts create mode 100644 apps/docs/scripts/fetch-openapi.mjs create mode 100644 apps/docs/scripts/package-assets.mjs delete mode 100644 apps/docs/source.config.ts delete mode 100644 apps/docs/tsconfig.json delete mode 100644 apps/docs/vite.config.ts delete mode 100644 apps/docs/workers/app.ts delete mode 100644 apps/website/vercel.json diff --git a/.github/workflows/auto-comment-issues.yml b/.github/workflows/auto-comment-issues.yml index 8c7235af..f02a2605 100644 --- a/.github/workflows/auto-comment-issues.yml +++ b/.github/workflows/auto-comment-issues.yml @@ -20,4 +20,4 @@ jobs: issue-number: ${{ github.event.issue.number }} body: | Thanks for the issue, our team will look into it as soon as possible. If you would like to work on this issue, please wait for us to decide if it's ready. To claim an issue that does not have the "needs triage" label, please leave a comment that says ".take". If you have any questions, please reach out to us on [Discord](https://discord.gg/KJUb2AwM) or follow up on the issue itself. - For full info on how to contribute, please check out our [contributors guide](https://classroomio.com/docs/contributorguides/devs) + For full info on how to contribute, please check out our [contributors guide](https://classroomio.com/docs/contributor-guides/devs). diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml new file mode 100644 index 00000000..506e7484 --- /dev/null +++ b/.github/workflows/deploy-docs.yml @@ -0,0 +1,68 @@ +name: Deploy Docs + +on: + push: + branches: [main] + paths: + - 'apps/docs/**' + - 'packages/utils/src/openapi/**' + # Called by upload-openapi-spec.yml: the API reference is rendered statically + # at build time, so a new spec in R2 only reaches the site via a docs rebuild. + workflow_call: + workflow_dispatch: + +jobs: + deploy: + runs-on: ubuntu-latest + environment: production + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + # Blume requires Node >= 22.12; the rest of the monorepo is still on 20. + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version-file: 'apps/docs/.nvmrc' + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + + - name: Get pnpm store directory + shell: bash + run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV + + - name: Setup pnpm cache + uses: actions/cache@v4 + with: + path: ${{ env.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + # scripts/fetch-openapi.mjs imports @cio/utils/openapi/public-api from dist. + - name: Build workspace dependencies + run: pnpm turbo run build --filter=@cio/docs^... + + # Reports broken internal links and heading anchors. Advisory rather than + # a gate, because the checker is base-unaware and always reports two known + # classes of false positive: links into the /api reference (Scalar's route + # is not in the page index) and every image under public/ (it resolves public/ + # against the site root, which deployment.base '/docs' moves). Read the log + # for anything outside those two. + - name: Validate links and anchors + run: pnpm --filter @cio/docs validate + continue-on-error: true + + - name: Build docs + run: pnpm --filter @cio/docs build + + - name: Deploy to Cloudflare + run: pnpm --filter @cio/docs exec wrangler deploy + env: + CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} diff --git a/.github/workflows/upload-openapi-spec.yml b/.github/workflows/upload-openapi-spec.yml index df18af00..e41de6f8 100644 --- a/.github/workflows/upload-openapi-spec.yml +++ b/.github/workflows/upload-openapi-spec.yml @@ -70,3 +70,10 @@ jobs: CLOUDFLARE_ZONE_ID: ${{ secrets.CLOUDFLARE_ZONE_ID }} PUBLIC_SUPABASE_URL: ${{ secrets.PUBLIC_SUPABASE_URL }} PUBLIC_SUPABASE_ANON_KEY: ${{ secrets.PUBLIC_SUPABASE_ANON_KEY }} + + # The docs render the API reference statically from this spec, so a fresh + # upload only reaches classroomio.com/docs/api once they rebuild. + redeploy-docs: + needs: generate-and-upload-openapi + uses: ./.github/workflows/deploy-docs.yml + secrets: inherit diff --git a/README.md b/README.md index 1cec460a..969ae653 100644 --- a/README.md +++ b/README.md @@ -250,7 +250,7 @@ cp .env.example .env # copy env template, edit for your domain The script reads root `.env` via `docker compose --env-file .env` and auto-generates a secure `PRIVATE_SERVER_KEY` (and `BETTER_AUTH_SECRET`) when missing. -See [`.env.example`](.env.example) for the full list of environment variables with required/optional grouping, and [`docker/docs/SELF_HOST.md`](docker/docs/SELF_HOST.md) for the complete Docker self-hosting guide. To raise upload caps (documents, videos, assignment files), set the `UPLOAD_MAX_*_MB` vars in `.env` — see the [docs](https://docs.classroomio.com/docs/self-hosted/docker#optional--upload-file-size-limits). +See [`.env.example`](.env.example) for the full list of environment variables with required/optional grouping, and [`docker/docs/SELF_HOST.md`](docker/docs/SELF_HOST.md) for the complete Docker self-hosting guide. To raise upload caps (documents, videos, assignment files), set the `UPLOAD_MAX_*_MB` vars in `.env` — see the [docs](https://classroomio.com/docs/self-hosted/docker#optional--upload-file-size-limits). ## Publishing diff --git a/apps/dashboard/src/lib/features/course/pages/settings.svelte b/apps/dashboard/src/lib/features/course/pages/settings.svelte index dc375a33..fba37548 100644 --- a/apps/dashboard/src/lib/features/course/pages/settings.svelte +++ b/apps/dashboard/src/lib/features/course/pages/settings.svelte @@ -492,7 +492,7 @@ {$t('course.navItem.settings.course_type_desc')} {$t('automation.api.subtitle')} - diff --git a/apps/docs/.gitignore b/apps/docs/.gitignore index ff4d372e..511bf181 100644 --- a/apps/docs/.gitignore +++ b/apps/docs/.gitignore @@ -2,23 +2,16 @@ node_modules .DS_Store .cache -.vercel -.output -.nitro .wrangler -/build/ -/api/ -/server/build -/public/build -/test-results/ -/playwright-report/ -/blob-report/ -/playwright/.cache/ -.tanstack -.react-router .dev.vars -src/routeTree.gen.ts -.source -worker-configuration.d.ts -.react-router +# Blume build output, and the packaged assets served by the worker. +/dist/ +/build/ +/.blume/ +/.blume-verify/ +/.astro/ + +# Fetched at build time by scripts/fetch-openapi.mjs. +/openapi/ +.blume-verify/ diff --git a/apps/docs/.nvmrc b/apps/docs/.nvmrc index 0f35649c..dc0bb0f4 100644 --- a/apps/docs/.nvmrc +++ b/apps/docs/.nvmrc @@ -1 +1 @@ -v20.19.3 +v22.12.0 diff --git a/apps/docs/README.md b/apps/docs/README.md index 108fabd5..e387fecf 100644 --- a/apps/docs/README.md +++ b/apps/docs/README.md @@ -1,14 +1,48 @@ # docs -This is a Tanstack Start application generated with -[Create Fumadocs](https://github.com/fuma-nama/fumadocs). +The ClassroomIO documentation site, built with [Blume](https://useblume.dev) (Astro + Vite). Served at +[classroomio.com/docs](https://classroomio.com/docs). -Run development server: +## Requirements + +Node **>= 22.12** (see `.nvmrc`). The rest of the monorepo is still on Node 20, so switch versions +before working here: ```bash -npm run dev -# or -pnpm dev -# or -yarn dev +nvm use ``` + +## Develop + +```bash +pnpm dev # fetches the OpenAPI spec, then starts the dev server +pnpm build # builds to dist/, then packages to build/ for the worker +pnpm preview # builds, then serves through the worker on :4173 +pnpm validate # checks internal links and heading anchors +``` + +Use `pnpm preview` before deploying anything that touches routing. `pnpm dev` serves pages straight +from Blume and never sees Cloudflare's asset server, so it cannot show you the `_redirects` rules, the +404 page, or the trailing-slash handling — only `preview` runs the site the way production does. + +## How it's served + +The site is fully static. `classroomio.com/docs/*` is proxied by the marketing site +(`apps/website/src/hooks.server.ts`) to the `cio-docs` worker, which serves the build as static +assets — there is no server-side rendering. + +Two things follow from being mounted at `/docs`: + +- **Links** are authored root-relative (`/course-enrollment`). Blume prepends the base at build time. +- **Images** must be written with the base (`/docs/certificates-rules.webp`). Blume deliberately does + not rebase images, so an unprefixed path would 404. + +`scripts/package-assets.mjs` moves `dist/` under `build/docs/` to match the served path and writes the +`_redirects` file (`/docs` → `/docs/home`, and the legacy `/docs/how-to-guides/*` → `/docs/*`). + +## API reference + +`/docs/api` is the Scalar API reference, rendered at build time (the old `/docs/api/reference` path +301s here). `scripts/fetch-openapi.mjs` pulls the spec from R2 and injects the bearer auth scheme via +`@cio/utils/openapi/public-api`. Because it is static, a new spec reaches the site only on a rebuild — +`.github/workflows/upload-openapi-spec.yml` triggers one automatically. diff --git a/apps/docs/app/app.css b/apps/docs/app/app.css deleted file mode 100644 index 862f1776..00000000 --- a/apps/docs/app/app.css +++ /dev/null @@ -1,16 +0,0 @@ -@import 'tailwindcss'; -@import 'fumadocs-ui/css/neutral.css'; -@import 'fumadocs-ui/css/preset.css'; - -@source "../../../packages/ui/src/**/*.{ts,tsx}"; - -/* - * The docs layout is nested inside HomeLayout, whose navbar is `sticky h-14 top-0` - * (3.5rem) but does not expose its height to the docs layout. Fumadocs hardcodes - * `--fd-docs-height: 100dvh`, so the sidebar and TOC end up 3.5rem taller than the - * visible area and their bottom (footer / last nav items) is clipped below the fold. - * Subtract the navbar height so both columns can scroll to the end. - */ -#nd-docs-layout { - --fd-docs-height: calc(100dvh - 3.5rem); -} diff --git a/apps/docs/app/components/mdx.tsx b/apps/docs/app/components/mdx.tsx deleted file mode 100644 index f88ca8a3..00000000 --- a/apps/docs/app/components/mdx.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import defaultMdxComponents from 'fumadocs-ui/mdx'; -import type { MDXComponents } from 'mdx/types'; - -export function getMDXComponents(components?: MDXComponents) { - return { - ...defaultMdxComponents, - ...components - } satisfies MDXComponents; -} - -export const useMDXComponents = getMDXComponents; - -declare global { - type MDXProvidedComponents = ReturnType; -} diff --git a/apps/docs/app/components/not-found.tsx b/apps/docs/app/components/not-found.tsx deleted file mode 100644 index 16c05b21..00000000 --- a/apps/docs/app/components/not-found.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { Link } from 'react-router'; -import { HomeLayout } from 'fumadocs-ui/layouts/home'; - -export function NotFound() { - return ( - -
-

404

-

Page Not Found

-

- The page you are looking for might have been removed, had its name changed, or is - temporarily unavailable. -

- - Back to Home - -
-
- ); -} diff --git a/apps/docs/app/entry.server.tsx b/apps/docs/app/entry.server.tsx deleted file mode 100644 index 9f18a98e..00000000 --- a/apps/docs/app/entry.server.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import type { AppLoadContext, EntryContext } from 'react-router'; -import { ServerRouter } from 'react-router'; -import { isbot } from 'isbot'; -import { renderToReadableStream } from 'react-dom/server'; - -export default async function handleRequest( - request: Request, - responseStatusCode: number, - responseHeaders: Headers, - routerContext: EntryContext, - _loadContext: AppLoadContext -) { - let shellRendered = false; - const userAgent = request.headers.get('user-agent'); - - const body = await renderToReadableStream( - , - { - onError(error: unknown) { - responseStatusCode = 500; - if (shellRendered) { - console.error(error); - } - } - } - ); - shellRendered = true; - - if ((userAgent && isbot(userAgent)) || routerContext.isSpaMode) { - await body.allReady; - } - - responseHeaders.set('Content-Type', 'text/html'); - return new Response(body, { - headers: responseHeaders, - status: responseStatusCode - }); -} diff --git a/apps/docs/app/lib/layout.shared.tsx b/apps/docs/app/lib/layout.shared.tsx deleted file mode 100644 index b73f552e..00000000 --- a/apps/docs/app/lib/layout.shared.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import type { BaseLayoutProps } from 'fumadocs-ui/layouts/shared'; -import { SquareArrowOutUpRight } from 'lucide-react'; - -export function baseOptions(): BaseLayoutProps { - return { - nav: { - title: ( -
- ClassroomIO logo - ClassroomIO -
- ) - }, - links: [ - { - text: ( -
- Contact -
- ), - url: 'https://twitter.com/classroomio', - external: true - }, - { - text: ( -
- Demo -
- ), - url: 'https://dub.sh/ciodemo', - external: true - }, - { - text: ( -
- Feedback -
- ), - url: 'https://feedback.classroomio.com', - external: true - }, - { - text: ( -
- Dashboard -
- ), - url: 'https://app.classroomio.com/', - external: true - }, - { - type: 'icon', - label: 'Discord', - icon: ( - discord icon - ), - text: 'Discord', - url: 'https://dub.sh/ciodiscord', - external: true - } - ], - githubUrl: 'https://github.com/classroomio/classroomio' - }; -} diff --git a/apps/docs/app/lib/source.server.ts b/apps/docs/app/lib/source.server.ts deleted file mode 100644 index 8e4b86c6..00000000 --- a/apps/docs/app/lib/source.server.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { loader, multiple } from 'fumadocs-core/source'; -import * as icons from 'lucide-static'; -import { docs } from 'fumadocs-mdx:collections/server'; - -export const source = loader({ - source: multiple({ - docs: docs.toFumadocsSource() - }), - baseUrl: '/', - icon(icon) { - if (!icon) { - return; - } - - if (icon in icons) { - return icons[icon as keyof typeof icons]; - } - } -}); - -export async function getDocsRouteData(slugs: string[]) { - const page = source.getPage(slugs); - if (!page) { - return null; - } - - if (page.data.type === 'docs') { - return { - tree: source.pageTree as object, - slugs, - pageType: 'docs' as const, - path: page.path - }; - } -} diff --git a/apps/docs/app/root.tsx b/apps/docs/app/root.tsx deleted file mode 100644 index a90a0069..00000000 --- a/apps/docs/app/root.tsx +++ /dev/null @@ -1,175 +0,0 @@ -import * as React from 'react'; - -import type { LinksFunction, MetaFunction } from 'react-router'; -import { - isRouteErrorResponse, - Links, - Meta, - Outlet, - Scripts, - ScrollRestoration, - useRouteError -} from 'react-router'; -import { RootProvider } from 'fumadocs-ui/provider/react-router'; - -import { NotFound } from '@/components/not-found'; -import './app.css'; - -const DEFAULT_META_TITLE = - 'ClassroomIO Docs | Customer, Partner, and Employee Education'; -const DEFAULT_META_DESCRIPTION = - 'Learn how to create customer academies, partner certification programs, and employee training workflows in ClassroomIO.'; -const DEFAULT_OG_IMAGE_URL = 'https://brand.cdn.clsrio.com/og/classroomio-opengraph.jpg'; -const DEFAULT_OG_IMAGE_ALT = 'ClassroomIO documentation for customer, partner, and employee education'; - -export const links: LinksFunction = () => [ - { rel: 'icon', href: '/docs/favicon.ico' } -]; - -export const meta: MetaFunction = () => [ - { - title: DEFAULT_META_TITLE - }, - { - name: 'description', - content: DEFAULT_META_DESCRIPTION - }, - { - property: 'og:url', - content: 'https://classroomio.com/docs' - }, - { - property: 'og:type', - content: 'website' - }, - { - property: 'og:title', - content: DEFAULT_META_TITLE - }, - { - property: 'og:description', - content: DEFAULT_META_DESCRIPTION - }, - { - property: 'og:image', - content: DEFAULT_OG_IMAGE_URL - }, - { - property: 'og:image:alt', - content: DEFAULT_OG_IMAGE_ALT - }, - { - property: 'og:image:type', - content: 'image/jpeg' - }, - { - property: 'og:image:width', - content: '1920' - }, - { - property: 'og:image:height', - content: '1080' - }, - { - property: 'og:image:secure_url', - content: DEFAULT_OG_IMAGE_URL - }, - // WebP fallback for better compression on supported platforms - { - property: 'og:image', - content: 'https://brand.cdn.clsrio.com/og/classroomio-opengraph.webp' - }, - { - property: 'og:image:alt', - content: DEFAULT_OG_IMAGE_ALT - }, - { - property: 'og:image:type', - content: 'image/webp' - }, - { - property: 'og:image:width', - content: '1920' - }, - { - property: 'og:image:height', - content: '1080' - }, - { - property: 'og:image:secure_url', - content: 'https://brand.cdn.clsrio.com/og/classroomio-opengraph.webp' - }, - { - name: 'twitter:card', - content: 'summary_large_image' - }, - { - property: 'twitter:domain', - content: 'classroomio.com' - }, - { - property: 'twitter:url', - content: 'https://classroomio.com/docs' - }, - { - name: 'twitter:title', - content: DEFAULT_META_TITLE - }, - { - name: 'twitter:description', - content: DEFAULT_META_DESCRIPTION - }, - { - name: 'twitter:creator', - content: '@classroomio' - }, - { - name: 'twitter:image', - content: DEFAULT_OG_IMAGE_URL - }, - { - name: 'twitter:image:alt', - content: DEFAULT_OG_IMAGE_ALT - } -]; - -export function Layout({ children }: { children: React.ReactNode }) { - return ( - - - - - - - - - {children} - - - - - ); -} - -export default function App() { - return ; -} - -export function ErrorBoundary() { - const error = useRouteError(); - - if (isRouteErrorResponse(error) && error.status === 404) { - return ; - } - - return ( - -
-

Docs Error

-

- The docs app hit an unexpected error while rendering this page. -

-
-
- ); -} diff --git a/apps/docs/app/routes.ts b/apps/docs/app/routes.ts deleted file mode 100644 index c6793054..00000000 --- a/apps/docs/app/routes.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { type RouteConfig, index, route } from '@react-router/dev/routes'; - -export default [ - index('routes/home.tsx'), - route('api/reference', 'routes/api-reference.ts'), - route('api/search', 'routes/search.ts'), - route('*', 'routes/docs.tsx') -] satisfies RouteConfig; diff --git a/apps/docs/app/routes/api-reference.ts b/apps/docs/app/routes/api-reference.ts deleted file mode 100644 index 410748db..00000000 --- a/apps/docs/app/routes/api-reference.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { getHtmlDocument } from '@scalar/core/libs/html-rendering'; -import { - enrichPublicApiOpenApiSpec, - PUBLIC_API_BEARER_SCHEME, - PUBLIC_API_OPENAPI_URL -} from '@cio/utils/openapi/public-api'; - -export async function loader() { - const response = await fetch(PUBLIC_API_OPENAPI_URL); - - if (!response.ok) { - throw new Response('Failed to load the public API OpenAPI specification.', { status: 502 }); - } - - const spec = enrichPublicApiOpenApiSpec((await response.json()) as Record); - - return new Response( - getHtmlDocument({ - content: JSON.stringify(spec), - pageTitle: 'ClassroomIO Public API Reference', - theme: 'none', - authentication: { - preferredSecurityScheme: PUBLIC_API_BEARER_SCHEME - } - }), - { - headers: { - 'content-type': 'text/html; charset=utf-8', - 'cache-control': 'public, max-age=300' - } - } - ); -} diff --git a/apps/docs/app/routes/docs.tsx b/apps/docs/app/routes/docs.tsx deleted file mode 100644 index 21b7990a..00000000 --- a/apps/docs/app/routes/docs.tsx +++ /dev/null @@ -1,129 +0,0 @@ -import { useMemo } from 'react'; - -import type * as PageTree from 'fumadocs-core/page-tree'; -import browserCollections from 'fumadocs-mdx:collections/browser'; -import { isRouteErrorResponse, redirect, useLoaderData, useRouteError } from 'react-router'; -import { DocsLayout } from 'fumadocs-ui/layouts/docs'; -import { DocsBody, DocsDescription, DocsPage, DocsTitle } from 'fumadocs-ui/layouts/docs/page'; -import { HomeLayout } from 'fumadocs-ui/layouts/home'; - -import { NotFound } from '@/components/not-found'; -import { baseOptions } from '@/lib/layout.shared'; - -const clientLoader = browserCollections.docs.createClientLoader({ - component({ toc, frontmatter, default: MDX }) { - return ( - - {frontmatter.title} - {frontmatter.description} - - - - - ); - } -}); - -export async function loader({ params }: { params: Record }) { - const slug = params['*']; - - // How-to guides were flattened to the docs root; permanently redirect the old - // `.../how-to-guides/` URLs to `.../`. - if (slug && slug.includes('how-to-guides/')) { - throw redirect('/' + slug.replace('how-to-guides/', ''), 301); - } - - const slugs = slug ? slug.split('/') : ['home']; - const { getDocsRouteData } = await import('@/lib/source.server'); - const routeData = await getDocsRouteData(slugs); - if (!routeData) { - throw new Response('Not Found', { status: 404 }); - } - - if (routeData.pageType === 'docs') { - await clientLoader.preload(routeData.path); - } - - return routeData; -} - -export default function DocsRoute() { - const data = useLoaderData(); - const tree = useMemo(() => transformPageTree(data.tree as PageTree.Root), [data.tree]); - - return ( - - - - - - ); -} - -export function ErrorBoundary() { - const error = useRouteError(); - - if (isRouteErrorResponse(error) && error.status === 404) { - return ; - } - - return ( - -
-

Docs Error

-

- The docs page could not be rendered. -

-
-
- ); -} - -function MdxContent({ path }: { path: string }) { - const Content = clientLoader.getComponent(path); - return ; -} - -function transformPageTree(root: PageTree.Root): PageTree.Root { - function mapNode(item: T): T { - if (typeof item.icon === 'string') { - item = { - ...item, - icon: ( - - ) - }; - } - - if (item.type === 'folder') { - return { - ...item, - index: item.index ? mapNode(item.index) : undefined, - children: item.children.map(mapNode) - }; - } - - return item; - } - - return { - ...root, - children: root.children.map(mapNode), - fallback: root.fallback ? transformPageTree(root.fallback) : undefined - }; -} diff --git a/apps/docs/app/routes/home.tsx b/apps/docs/app/routes/home.tsx deleted file mode 100644 index ba730c88..00000000 --- a/apps/docs/app/routes/home.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { redirect } from 'react-router'; - -export function loader() { - throw redirect('/home'); -} diff --git a/apps/docs/app/routes/search.ts b/apps/docs/app/routes/search.ts deleted file mode 100644 index 7c97aaa1..00000000 --- a/apps/docs/app/routes/search.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { createFromSource } from 'fumadocs-core/search/server'; - -export async function loader({ request }: { request: Request }) { - const { source } = await import('@/lib/source.server'); - const server = createFromSource(source, { - language: 'english' - }); - - return server.GET(request); -} diff --git a/apps/docs/blume.config.ts b/apps/docs/blume.config.ts new file mode 100644 index 00000000..070203ef --- /dev/null +++ b/apps/docs/blume.config.ts @@ -0,0 +1,198 @@ +import { defineConfig } from 'blume'; + +/** + * The site is served at classroomio.com/docs, proxied to this worker by the + * marketing site (apps/website/src/hooks.server.ts). `deployment.base` only + * rewrites URLs in the emitted HTML — it does not nest the build output, so + * scripts/package-assets.mjs moves dist/ under docs/ to match the served path. + * + * Redirects are NOT declared here: under a base, Astro prefixes a redirect's + * source but not its target, so it would emit `url=/guides` instead of + * `/docs/guides`. They live in scripts/package-assets.mjs as a `_redirects` file. + */ +export default defineConfig({ + title: 'ClassroomIO Docs | Customer, Partner, and Employee Education', + description: + 'Learn how to create customer academies, partner certification programs, and employee training workflows in ClassroomIO.', + logo: { + text: 'ClassroomIO', + image: '/docs/logo-192.png', + href: '/docs' + }, + content: { + root: 'content/docs' + }, + deployment: { + output: 'static', + site: 'https://classroomio.com', + base: '/docs' + }, + github: { + owner: 'classroomio', + repo: 'classroomio', + dir: 'apps/docs' + }, + theme: { + mode: 'system' + }, + search: { + provider: 'orama' + }, + ai: { + llmsTxt: true + }, + seo: { + x: { + creator: '@classroomio', + handle: '@classroomio' + } + }, + openapi: { + enabled: true, + renderer: 'scalar', + route: '/api', + sources: [{ label: 'API', spec: './openapi/public-api.json' }] + }, + navigation: { + tabs: [ + { label: 'Platform', path: '/', icon: 'house' }, + { label: 'Guides', path: '/guides', icon: 'book-open' }, + { label: 'Self Hosting', path: '/self-hosted', icon: 'server' }, + { label: 'API', path: '/api', icon: 'code' } + ], + sidebar: [ + { + label: 'Platform', + items: [ + '/', + { + label: 'Introduction', + items: [ + '/what-is-classroomio', + '/terminology', + { + label: 'Quickstart', + items: ['/quickstart/signup', '/quickstart/onboarding'] + } + ] + }, + { + label: 'Core Features', + items: [ + '/course', + '/cohorts', + '/mcp', + '/tags', + '/audience', + '/community', + '/organization', + '/student-dashboard', + '/enterprise-sso', + '/token-auth' + ] + } + ] + }, + { + label: 'Guides', + root: '/guides', + items: [ + '/guides', + { + label: '', // User Guides + items: [ + { + label: 'Get started', + items: ['/guides/create-first-course'] + }, + { + label: 'Build a course', + items: [ + '/guides/course-types', + '/guides/create-exercise', + '/guides/grade-exercise', + '/guides/course-progression', + '/guides/use-math-in-editor', + '/guides/certificates' + ] + }, + { + label: 'Live classes', + items: ['/guides/live-class', '/guides/take-attendance'] + }, + { + label: 'Enrollment & students', + items: [ + '/guides/course-enrollment', + '/guides/welcome-email', + '/guides/invite-students' + ] + }, + { + label: 'Publish your academy', + items: [ + '/guides/course-landingpage', + '/guides/org-landing-page', + '/guides/academy-sharing-and-branding', + '/guides/custom-domain' + ] + }, + { + label: 'Organization & team', + items: [ + '/guides/customize-organization', + '/guides/invite-team-member', + '/guides/roles-and-permissions' + ] + } + ] + }, + { + label: 'Developer Guides', + items: [ + '/guides/contributing', + '/guides/contributing/devs', + '/guides/contributing/design', + '/guides/contributing/cloudflare-setup', + '/guides/contributing/org-site-opengraph-and-favicon', + '/guides/contributing/gitpod', + '/guides/contributing/demo-accounts', + '/guides/contributing/student-dashboard', + '/guides/contributing/adding-translation-to-code' + ] + } + ] + }, + { + label: 'Self Hosting', + root: '/self-hosted', + items: [ + '/self-hosted', + { + label: 'Platforms', + items: [ + '/self-hosted/docker', + '/self-hosted/digitalocean', + '/self-hosted/railway', + '/self-hosted/coolify', + '/self-hosted/dokploy' + ] + }, + { + label: 'Configuration', + items: [ + '/self-hosted/configuration', + '/self-hosted/configuration/secrets', + '/self-hosted/configuration/email', + '/self-hosted/configuration/storage', + '/self-hosted/configuration/csp', + '/self-hosted/configuration/integrations', + '/self-hosted/configuration/sso', + '/self-hosted/configuration/versions' + ] + }, + ] + } + ] + } +}); diff --git a/apps/docs/content/docs/api.mdx b/apps/docs/content/docs/api.mdx deleted file mode 100644 index 285506a1..00000000 --- a/apps/docs/content/docs/api.mdx +++ /dev/null @@ -1,94 +0,0 @@ ---- -title: API -description: Use the ClassroomIO public API to manage audience members and courses with organization-scoped API keys. ---- - -import { Callout } from 'fumadocs-ui/components/callout'; -import { Step, Steps } from 'fumadocs-ui/components/steps'; - -The ClassroomIO public API is available under: - -```text -https://api.classroomio.com/public-api/v1 -``` - -Every request must include an organization-scoped API key as a Bearer token. - -## Get an API key - -Generate keys in the ClassroomIO dashboard as an **organization admin**. - - - - Sign in to [ClassroomIO](https://app.classroomio.com). - - - In the org sidebar, open the **Automation** section, then **API**. - - - Or go directly to [`/org/*/api`](https://app.classroomio.com/org/*/api). The `*` picks your current organization automatically. - - - Click **Generate API key**, name the key, and copy the secret immediately. Keys are shown only once and look like `cio_api_...`. - - - Send the key on every request as `Authorization: Bearer cio_api_your_key_here`. - - - - - On ClassroomIO Cloud, API key creation is available on **Early Adopter** and **Enterprise** plans. Self-hosted deployments require **Enterprise**. - - -## Interactive Reference - -- [Open the interactive API reference](/docs/api/reference) - -The reference page includes an **Authorize** button. Paste your API key there to try endpoints without writing curl commands. - -### Try requests in the reference UI - -1. Open the [interactive API reference](/docs/api/reference). -2. Click **Authorize** (lock icon). -3. Select **bearerAuth** and paste your full `cio_api_...` key. -4. Use **Try it** on any endpoint. - -### curl example - -```bash -curl https://api.classroomio.com/public-api/v1/audience \ - -H "Authorization: Bearer cio_api_your_key_here" -``` - -## Current Surface - -Current public API groups: - -- `audience` -- `courses` - -Implemented route families: - -- `GET /public-api/v1/audience` -- `POST /public-api/v1/audience` -- `POST /public-api/v1/audience/assign-courses` -- `GET /public-api/v1/audience/:memberId` -- `PUT /public-api/v1/audience/:memberId` -- `DELETE /public-api/v1/audience/:memberId` -- `GET /public-api/v1/courses` -- `GET /public-api/v1/courses/:courseId` -- `GET /public-api/v1/courses/:courseId/students` -- `GET /public-api/v1/courses/:courseId/export` - -## OpenAPI - -Raw OpenAPI JSON: - -- [Public API OpenAPI JSON](https://api.cdn.clsrio.com/openapi/public-api/openapi-latest.json) -- [Interactive API Reference](/docs/api/reference) - -## Notes - -- API keys are organization-scoped. -- Enrollment is handled through `POST /public-api/v1/audience/assign-courses`. -- The API documentation will expand as the remaining public API write endpoints are added. diff --git a/apps/docs/content/docs/audience.mdx b/apps/docs/content/docs/audience.mdx index a7e128a0..39502859 100644 --- a/apps/docs/content/docs/audience.mdx +++ b/apps/docs/content/docs/audience.mdx @@ -3,13 +3,11 @@ title: Audience description: Manage all students in your organization — view status, assign to courses, and handle invites from one place. --- -import { Callout } from 'fumadocs-ui/components/callout'; - **Audience** is your org-wide student directory. It shows every person who belongs to your organization — whether they signed up themselves, accepted a course invite, or were added directly. From here you can search, sort, bulk-assign to courses, and manage pending invites. - - Your plan sets a maximum audience size. When you reach the limit, a banner appears and you cannot invite more students until you upgrade or remove existing members. - +:::info[Plan limits] +Your plan sets a maximum audience size. When you reach the limit, a banner appears and you cannot invite more students until you upgrade or remove existing members. +::: ## What Audience shows @@ -48,6 +46,6 @@ Use **Import Users** to bulk-add students from a CSV file. Use **Export** to dow ## Related guides -- [How Course Enrollment Works](/docs/course-enrollment) — how students join courses -- [How to Invite Students](/docs/invite-students) — send course-specific invites -- [Roles and Permissions](/docs/roles-and-permissions) — difference between students and team members +- [How Course Enrollment Works](/guides/course-enrollment) — how students join courses +- [How to Invite Students](/guides/invite-students) — send course-specific invites +- [Roles and Permissions](/guides/roles-and-permissions) — difference between students and team members diff --git a/apps/docs/content/docs/cohorts.mdx b/apps/docs/content/docs/cohorts.mdx index efbad2a0..c116b13f 100644 --- a/apps/docs/content/docs/cohorts.mdx +++ b/apps/docs/content/docs/cohorts.mdx @@ -3,8 +3,6 @@ title: Cohorts description: Learn what Cohorts are in ClassroomIO, how goals work, and what students see in the Cohorts view. --- -import { Callout } from 'fumadocs-ui/components/callout'; - **Cohorts** group multiple courses into a structured learning path. Use them when students need to complete a set of courses toward a shared outcome (onboarding, certification prep, role-based training). Individual courses still live in the LMS; cohorts add goals and a dedicated **Cohorts** view for students. ## Cohorts vs courses @@ -14,7 +12,7 @@ import { Callout } from 'fumadocs-ui/components/callout'; | **Course** | Single content container with lessons | **Home**, **My Learning**, **Explore** | | **Cohort** | Multiple courses with shared goals | **Cohorts** in the LMS | -A student can be enrolled in courses without belonging to a cohort, and in a cohort that references several courses. See [Student Dashboard](/docs/student-dashboard) for how those views fit together. +A student can be enrolled in courses without belonging to a cohort, and in a cohort that references several courses. See [Student Dashboard](/student-dashboard) for how those views fit together. ## Admin workflow @@ -49,6 +47,6 @@ In the LMS, students open **Cohorts** to see cohorts they belong to. Each cohort - **Courses** — linked courses with progress - **Goals** — personal goal status when goals are configured - +:::info Legacy deployments may still have data in the original `program` tables. Run the migration script `pnpm --filter @cio/db migrate:programs-to-cohorts` after applying the cohort schema migration to copy existing data into the new tables without dropping the legacy tables. - +::: diff --git a/apps/docs/content/docs/community.mdx b/apps/docs/content/docs/community.mdx index a22636e1..8e1e7354 100644 --- a/apps/docs/content/docs/community.mdx +++ b/apps/docs/content/docs/community.mdx @@ -3,8 +3,6 @@ title: Community description: An org-wide Q&A forum where students and instructors can ask questions, share answers, and discuss topics across all courses. --- -import { Callout } from 'fumadocs-ui/components/callout'; - **Community** is an org-wide Q&A forum. Anyone in your organization can post a question, answer others, or leave comments. Questions can be tied to a specific course or posted for the whole organization to see. ## How it works @@ -22,11 +20,11 @@ From the **Community** section in the sidebar, click **Ask Community**. Fill in Admins can delete any question or comment. Authors can edit or delete their own posts. - - Community is org-wide and searchable across all courses. The **Newsfeed** tab inside each course is a course-scoped activity feed for announcements and updates — it is not a Q&A forum. - +:::info[Community vs course Newsfeed] +Community is org-wide and searchable across all courses. The **Newsfeed** tab inside each course is a course-scoped activity feed for announcements and updates — it is not a Q&A forum. +::: ## Related guides -- [Course](/docs/course) — course-level features including Newsfeed -- [Roles and Permissions](/docs/roles-and-permissions) — who can post and moderate +- [Course](/course) — course-level features including Newsfeed +- [Roles and Permissions](/guides/roles-and-permissions) — who can post and moderate diff --git a/apps/docs/content/docs/contributor-guides/demo-accounts.mdx b/apps/docs/content/docs/contributor-guides/demo-accounts.mdx deleted file mode 100644 index 10c64800..00000000 --- a/apps/docs/content/docs/contributor-guides/demo-accounts.mdx +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Login with Demo Accounts -description: Quick login guide using demo accounts for testing. ---- - -import { Callout } from 'fumadocs-ui/components/callout'; - -This guide will help you get started quickly once you setup our local environment and you want to start using the [dashboard](https://app.classroomio.com). - - - The assumption of this guide is that you've gone through our README and you've setup `supabase` - and you have `dashboard` running locally. - - -## Admin Login Credentials - -Once you have the `dashboard` service running locally and you have setup supabase, we added seed data that can allow you access an admin account to a demo organization and a student account to a student dashboard. This allows you see what ClassroomIO can do quickly without trying to figure it out. - -**Login:** admin@test.com - -**Password:** 123456 - -
- -
diff --git a/apps/docs/content/docs/contributor-guides/design.mdx b/apps/docs/content/docs/contributor-guides/design.mdx deleted file mode 100644 index 038505d4..00000000 --- a/apps/docs/content/docs/contributor-guides/design.mdx +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Design Contribution Guide -description: Guidelines for contributing design improvements. ---- - -import { Callout } from 'fumadocs-ui/components/callout'; - - - - This page is a work in progress. Help us expand it by contributing! - diff --git a/apps/docs/content/docs/contributor-guides/meta.json b/apps/docs/content/docs/contributor-guides/meta.json deleted file mode 100644 index 9175bdf1..00000000 --- a/apps/docs/content/docs/contributor-guides/meta.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "devs": "Developers Guide", - "design": "Design Contribution Guide", - "supabase-cloud": "Supabase Cloud Setup", - "cloudflare-setup": "Cloudflare Setup", - "org-site-opengraph-and-favicon": "Org-Site Open Graph & Favicon", - "gitpod": "Gitpod Setup", - "demo-accounts": "Login with Demo Accounts", - "student-dashboard": "Student Dashboard Guide", - "adding-translation-to-code": "Adding Translations to Code" -} diff --git a/apps/docs/content/docs/contributor-guides/student-dashboard.mdx b/apps/docs/content/docs/contributor-guides/student-dashboard.mdx deleted file mode 100644 index 889f706b..00000000 --- a/apps/docs/content/docs/contributor-guides/student-dashboard.mdx +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Student Dashboard - Developers Guide -description: Guide to setting up the student dashboard locally. ---- - -import { Callout } from 'fumadocs-ui/components/callout'; - -In this guide I will be showing you how to set up a local student dashboard that a student will see. This dashboard will allow students to view their grades, attendance, and other information. This dashboard will also allow students to submit assignments and view their grades for those assignments. - -## Follow the steps in this video - -### Requirements - - - Make sure to use 2 different browser windows: The reason is that one will be for the admin and - another for the students. For the student we will need to set the cookies value to hold the - organization siteName since we are using the subdomain to access the student dashboard like on - production. - - -### Demo - -
- -
diff --git a/apps/docs/content/docs/contributor-guides/supabase-cloud.mdx b/apps/docs/content/docs/contributor-guides/supabase-cloud.mdx deleted file mode 100644 index 988f3a0a..00000000 --- a/apps/docs/content/docs/contributor-guides/supabase-cloud.mdx +++ /dev/null @@ -1,167 +0,0 @@ ---- -title: Supabase Cloud Setup -description: Guide to setting up Supabase cloud for ClassroomIO. ---- - -import { Step, Steps } from 'fumadocs-ui/components/steps'; -import { Callout } from 'fumadocs-ui/components/callout'; - -In this guide, you will learn how to setup a supabase cloud project and link it to your local environment. - -## Who is this guide for? - -1. You don't want to setup supabase on your local machine -2. You can't run docker on your computer -3. You are experiencing performance issues using supabase locally -4. You want to selfhost our frontend app but use supabase cloud - -If your requirement matches any of the above, then this guide is for you. - -## Video Walkthrough - -
- -
- -## Step by Step Guide - - - -### Create a Supabase project - -For this step you need to have signed up for supabase and create an account, just visit [supabase.com](https://supabase.com). - -Once you have an account just click on the _New Project_ on your dashboard. After that you should see a similar screen to the below, fill in the fields. - -![New project in supabase](/new-project.webp) - - - Make sure you save your database password somewhere, else you won't be able to get it back - anywhere in the dashboard for security reasons. - - - - - -### Setup Supabase CLI - -Follow the instructions [here](https://supabase.com/docs/guides/local-development/cli/getting-started) to setup the Supabase CLI on your computer. - - - - -### Login to Supabase via the CLI - -Open your terminal and go to the root of the project. Run the following: - -```zsh title="Terminal" -supabase login -``` - -Follow the instruction in your terminal to generate your access token. Paste the token in the console and hit **Enter** - - - - -### Push migrations to your Supabase project - -- Go to the supabase dashboard, go to your project, click on the settings icon on the left side bar - -![DB URL in the supabase dashboard](/db-url.webp) - -- Copy the URL in the image above for your `db url` -- Paste it somewhere -- In the url, replace `[YOUR PASSWORD]` with your db password (which you saved in section 1). -- Then run in your terminal: - -```zsh title="Terminal" -supabase db push --db-url "URL HERE" -``` - - - Make sure you preserve the double quotes before and after the url. Only replace `URL HERE` with - your `db url` that contains your password - - -#### Result - -![Result of supabase db push](/db-push-result.webp) - - - - -### Configure Auth in your Supabase project - -Here we will update our email configurations, to prevent supabase from sending confirmation emails on signup. This is because we don't use Supabase for email verification, we handle that internally due to the quality of the email. - -![Authentication configuration](/auth-settings.webp) - - - - -### Configure SMTP - -Supabase [now requires adding custom SMTP](https://github.com/orgs/supabase/discussions/29370) to your supabase project in order to avoid abuse of their system. Without adding a custom SMTP, your signup requests to your supabase project will fail. To avoid this, you should go to the [SMTP section](https://supabase.com/dashboard/project/_/settings/auth) of your supabase settings. - -Make sure to toggle **Enable Custom SMTP** and fill in the following fields: - -- Sender email -- Sender name -- SMTP host -- SMTP port -- SMTP username -- SMTP password - -![SMTP Settings](/smtp-settings.webp) - - - Learn more about setting up SMTP [here](https://supabase.com/docs/guides/auth/auth-smtp) - - - - - -### Add configurations to your environment variables - -Now with all these set up you need to get update the .env file in `apps/dashboard`. You need to update the following environment variables: - -```zsh title="env" -PUBLIC_SUPABASE_URL= -PUBLIC_SUPABASE_ANON_KEY= -PRIVATE_SUPABASE_SERVICE_ROLE= -``` - -To get the correct environment variables, follow the instructions in this image: - -![Source of supabase environment variables](/match-env.webp) - - - - -### Tada - That's all - -Now you can run: - -```zsh title="Terminal" -pnpm dev --filter=dashboard -``` - -- Open the url in your browser -- Click on Sign up -- And that's it... - - - Visit the [Sign up guide](/docs/quickstart/signup) to learn how to signup - - - - diff --git a/apps/docs/content/docs/course.mdx b/apps/docs/content/docs/course.mdx index df6c52cd..620122b0 100644 --- a/apps/docs/content/docs/course.mdx +++ b/apps/docs/content/docs/course.mdx @@ -3,9 +3,7 @@ title: Course description: Overview of courses in ClassroomIO — lifecycle, settings, admin areas, and links to detailed guides. --- -import { Callout } from 'fumadocs-ui/components/callout'; - -A **course** in ClassroomIO is a container for lessons, exercises, people, and settings. Students enroll into a course to access its content in the LMS. This page summarizes how courses work for admins. For step-by-step setup, start with [Creating Your First Course](/docs/create-first-course). +A **course** in ClassroomIO is a container for lessons, exercises, people, and settings. Students enroll into a course to access its content in the LMS. This page summarizes how courses work for admins. For step-by-step setup, start with [Creating Your First Course](/guides/create-first-course). ## Course lifecycle @@ -15,7 +13,7 @@ A **course** in ClassroomIO is a container for lessons, exercises, people, and s | **Published** | Live on your academy; visible in Explore and on the public landing page | | **Deleted** | Soft-deleted; no longer appears anywhere in the app | -Publishing makes a course discoverable. Combine publish state with **Allow New Students**, price, and invites to control who can actually join. See [How Course Enrollment Works](/docs/course-enrollment). +Publishing makes a course discoverable. Combine publish state with **Allow New Students**, price, and invites to control who can actually join. See [How Course Enrollment Works](/guides/course-enrollment). ## Key settings @@ -26,9 +24,9 @@ Publishing makes a course discoverable. Combine publish state with **Allow New S | **Price** | **Landing page** editor | Free vs paid enrollment | | **Course type** | Course **Settings** | Changes nav, compliance, and public access behavior | - - Self-paced, Live class, Compliance, and Public types change what admins and students see in the app. See [Course Types](/docs/course-types) for when to use each. - +:::info[Course type changes more than a label] +Self-paced, Live class, Compliance, and Public types change what admins and students see in the app. See [Course Types](/guides/course-types) for when to use each. +::: ## Admin areas inside a course @@ -47,18 +45,18 @@ When you open a course from the **Courses** list, the sidebar gives you: The **People** tab lists everyone in the course group. Members appear when they enroll or when you add them from **Add people**. Email-only invites show as **Pending** until the student signs in. -Enrollment paths (public, invite link, admin assignment, paid) are documented in [How Course Enrollment Works](/docs/course-enrollment). For sending invites, see [How to Invite Students](/docs/invite-students). +Enrollment paths (public, invite link, admin assignment, paid) are documented in [How Course Enrollment Works](/guides/course-enrollment). For sending invites, see [How to Invite Students](/guides/invite-students). ## What students see -After enrolling, students open the course from **Home** or **My Learning** in the [Student Dashboard](/docs/student-dashboard). Published courses they have not joined yet may appear in **Explore**. +After enrolling, students open the course from **Home** or **My Learning** in the [Student Dashboard](/student-dashboard). Published courses they have not joined yet may appear in **Explore**. ## Related guides -- [Creating Your First Course](/docs/create-first-course) -- [Course Types](/docs/course-types) -- [How Course Enrollment Works](/docs/course-enrollment) -- [How to Invite Students](/docs/invite-students) -- [Create a Course Landing Page](/docs/course-landingpage) -- [Student Dashboard](/docs/student-dashboard) +- [Creating Your First Course](/guides/create-first-course) +- [Course Types](/guides/course-types) +- [How Course Enrollment Works](/guides/course-enrollment) +- [How to Invite Students](/guides/invite-students) +- [Create a Course Landing Page](/guides/course-landingpage) +- [Student Dashboard](/student-dashboard) \ No newline at end of file diff --git a/apps/docs/content/docs/enterprise-sso.mdx b/apps/docs/content/docs/enterprise-sso.mdx index 1349a35c..16d2d722 100644 --- a/apps/docs/content/docs/enterprise-sso.mdx +++ b/apps/docs/content/docs/enterprise-sso.mdx @@ -3,27 +3,24 @@ title: Enterprise SSO description: Configure Single Sign-On (SSO) with OIDC for your organization. --- -import { Callout } from 'fumadocs-ui/components/callout'; - -# Enterprise SSO - ClassroomIO supports Single Sign-On (SSO) via OpenID Connect (OIDC), allowing your organization members to sign in using your existing identity provider (IdP). - - SSO requires an **Enterprise** plan. - - **Cloud:** [Contact us](mailto:support@classroomio.com) to upgrade. - - **Self-hosted:** Requires an Enterprise license key. If you are not using Enterprise-only features, you do not need a key. - [Book a call](http://cal.com/classroomio/enterprise) to get your license. - +:::info[Enterprise Feature] +SSO requires an **Enterprise** plan. - - Set `LICENSE_KEY` in the API service environment. - Local development: `apps/api/.env`. - Docker Compose: repository root `.env`. - If you do not use Enterprise-only features, leave `LICENSE_KEY` unset. - +**Cloud:** [Contact us](mailto:support@classroomio.com) to upgrade. + +**Self-hosted:** Requires an Enterprise license key. If you are not using Enterprise-only features, you do not need a key. +[Book a call](http://cal.com/classroomio/enterprise) to get your license. +::: + +:::note[Where to set `LICENSE_KEY` (self-hosted)] +Set `LICENSE_KEY` in the API service environment. +Local development: `apps/api/.env`. +Docker Compose: repository root `.env`. +If you do not use Enterprise-only features, leave `LICENSE_KEY` unset. +See [Self Hosting → SSO & licensing](/self-hosted/configuration/sso) for per-platform placement. +::: ## Supported Providers @@ -198,4 +195,4 @@ SAML 2.0 support is planned for a future release. Currently, only OIDC is suppor - `POST /organization/sso` - Create SSO connection (Admin) - `PUT /organization/sso/policy` - Update SSO policy (Admin) -See the [API documentation](/docs/api) for full details. +See the [API documentation](/api) for full details. diff --git a/apps/docs/content/docs/academy-sharing-and-branding.mdx b/apps/docs/content/docs/guides/academy-sharing-and-branding.mdx similarity index 70% rename from apps/docs/content/docs/academy-sharing-and-branding.mdx rename to apps/docs/content/docs/guides/academy-sharing-and-branding.mdx index fe40a5b9..4650e7fa 100644 --- a/apps/docs/content/docs/academy-sharing-and-branding.mdx +++ b/apps/docs/content/docs/guides/academy-sharing-and-branding.mdx @@ -3,17 +3,14 @@ title: Sharing Your Academy (Open Graph & Favicon) description: How favicons, link previews, and social embeds work when you share your academy URL on Discord, Slack, iMessage, and other platforms. --- -import { Callout } from 'fumadocs-ui/components/callout'; -import { Step, Steps } from 'fumadocs-ui/components/steps'; - -When you share your academy URL — for example `https://ciodevs.myclassroomio.com` or your [custom domain](/docs/custom-domain) — chat apps and social networks build a **link preview** from two things: +When you share your academy URL — for example `https://ciodevs.myclassroomio.com` or your [custom domain](/guides/custom-domain) — chat apps and social networks build a **link preview** from two things: 1. **Meta tags** in the page HTML (title, description) 2. An **Open Graph image** (`og:image`) — the large preview thumbnail ClassroomIO generates both automatically for cloud academies. This guide explains what you control in the dashboard and what to expect when you change branding. -For the public homepage editor, see [Customize Your Academy Landing Page](/docs/org-landing-page). For org name, logo, and theme, see [Customize Your Organization](/docs/customize-organization). +For the public homepage editor, see [Customize Your Academy Landing Page](/guides/org-landing-page). For org name, logo, and theme, see [Customize Your Organization](/guides/customize-organization). ## Favicon (browser tab icon) @@ -27,7 +24,7 @@ The favicon is the small icon shown in the browser tab when someone opens your p Expand **Settings** in the sidebar, click **Organization**, then open the **Custom Domain** tab. -![Custom favicon settings](/custom-favicon-setup.webp) +![Custom favicon settings](/docs/custom-favicon-setup.webp) @@ -41,9 +38,9 @@ Use the image picker in the **Custom favicon** section and click **Save favicon* If you have **not** uploaded a custom favicon, ClassroomIO uses your **organization logo** (the same image as in **Settings → Organization**). You do not need to upload the same file twice unless you want a different crop or format for the tab icon. - - The academy favicon is shown on **public org-site pages** (landing page, course catalog, public course pages). It is not applied to the admin dashboard, LMS, or login screens on `app.classroomio.com`. - +:::info[Where the favicon appears] +The academy favicon is shown on **public org-site pages** (landing page, course catalog, public course pages). It is not applied to the admin dashboard, LMS, or login screens on `app.classroomio.com`. +::: ## Link previews (Open Graph) @@ -75,9 +72,9 @@ The generated card includes: | **Hero subheading or footer tagline** | Description updates on next page load | Regenerated on paid plans (free plans do not show tagline on the image) | | **Organization logo** | Unchanged | Regenerated | - - Text meta tags (title and description) update as soon as someone loads your site. The **thumbnail image** is cached for performance. After a branding change, visit your public academy URL once, then share the link again as a **new message** in Discord or Slack if the old preview still appears. - +:::warning[Previews can lag behind saves] +Text meta tags (title and description) update as soon as someone loads your site. The **thumbnail image** is cached for performance. After a branding change, visit your public academy URL once, then share the link again as a **new message** in Discord or Slack if the old preview still appears. +::: ### Refreshing Discord or Slack embeds @@ -95,8 +92,8 @@ Public **course** pages use the course logo or banner for `og:image` when availa ## Related guides -- [Customize Your Organization](/docs/customize-organization) — name, logo, brand color -- [Customize Your Academy Landing Page](/docs/org-landing-page) — hero heading and subheading (used in title and description) -- [Set Up a Custom Domain](/docs/custom-domain) — share links on your own hostname +- [Customize Your Organization](/guides/customize-organization) — name, logo, brand color +- [Customize Your Academy Landing Page](/guides/org-landing-page) — hero heading and subheading (used in title and description) +- [Set Up a Custom Domain](/guides/custom-domain) — share links on your own hostname -For implementation details (API routes, CDN caching, contributor setup), see [Org-Site Open Graph & Favicon](/docs/contributor-guides/org-site-opengraph-and-favicon). +For implementation details (API routes, CDN caching, contributor setup), see [Org-Site Open Graph & Favicon](/guides/contributing/org-site-opengraph-and-favicon). diff --git a/apps/docs/content/docs/certificates.mdx b/apps/docs/content/docs/guides/certificates.mdx similarity index 76% rename from apps/docs/content/docs/certificates.mdx rename to apps/docs/content/docs/guides/certificates.mdx index 74184399..5ecc83a1 100644 --- a/apps/docs/content/docs/certificates.mdx +++ b/apps/docs/content/docs/guides/certificates.mdx @@ -3,20 +3,17 @@ title: How to Create Certificates description: Configure certificate rules for a course, set completion requirements, and let students download their certificates. --- -import { Callout } from 'fumadocs-ui/components/callout'; -import { Step, Steps } from 'fumadocs-ui/components/steps'; - Certificates recognize students for completing a course. You configure the rules on a per-course basis — how much of the course must be completed, whether a final exercise must be passed, and when certificates expire. Students can then download their certificate from the **Certificates** tab in the LMS. - - Certificate features require a paid plan. The controls are visible on free plans but disabled. - +:::warning[Paid plan required] +Certificate features require a paid plan. The controls are visible on free plans but disabled. +::: ## Configure certificate rules Open your course in the admin dashboard and go to the **Certificates** tab. -![Certificate rules panel with the download toggle and completion threshold](/certificates-rules.webp) +![Certificate rules panel with the download toggle and completion threshold](/docs/certificates-rules.webp) @@ -55,7 +52,7 @@ Enter text in the email message field. This message is included in the notificat Set up how the certificate looks before the course goes live, so the first student to qualify gets the finished version. On the **Certificates** tab, click **Customize design** to open the certificate editor. -![Certificate design editor showing the template picker and live preview](/certificates-design-editor.webp) +![Certificate design editor showing the template picker and live preview](/docs/certificates-design-editor.webp) @@ -70,7 +67,7 @@ Choose a **Template** and an accent color to match your brand. A live preview sh Under **Signatories**, turn on **Show signatory 1** and fill in **Signatory 1 name** and **Signatory 1 role**, then use **Signature image** to upload a signature graphic. You can enable a second signatory the same way. -![Signatories section with name, role, and signature image upload](/certificates-signatories.webp) +![Signatories section with name, role, and signature image upload](/docs/certificates-signatories.webp) @@ -80,21 +77,21 @@ Set a **Certificate ID format** so every issued certificate carries a unique, ve - +:::info Finalize the design and signatures before you publish the course. Certificates are generated from the current design when a student qualifies, so getting it right up front means no one receives an unfinished certificate. - +::: ## What students see Once a student meets all the configured requirements, their certificate appears in the **Certificates** tab when they open the course in the LMS. They can view and download it from there. -![Student certificate view with download buttons](/certificates-student-download.webp) +![Student certificate view with download buttons](/docs/certificates-student-download.webp) ## Related guides -- [Creating Your First Course](/docs/create-first-course) — course setup overview -- [How to Create an Exercise](/docs/create-exercise) — create the exercise you reference as a final exercise -- [How to Grade an Exercise](/docs/grade-exercise) — grade submissions before certificates are issued -- [Control Course Progression](/docs/course-progression): require completion before the certificate unlocks -- [Student Dashboard](/docs/student-dashboard) — where students access their certificates +- [Creating Your First Course](/guides/create-first-course) — course setup overview +- [How to Create an Exercise](/guides/create-exercise) — create the exercise you reference as a final exercise +- [How to Grade an Exercise](/guides/grade-exercise) — grade submissions before certificates are issued +- [Control Course Progression](/guides/course-progression): require completion before the certificate unlocks +- [Student Dashboard](/student-dashboard) — where students access their certificates diff --git a/apps/docs/content/docs/contributor-guides/adding-translation-to-code.mdx b/apps/docs/content/docs/guides/contributing/adding-translation-to-code.mdx similarity index 100% rename from apps/docs/content/docs/contributor-guides/adding-translation-to-code.mdx rename to apps/docs/content/docs/guides/contributing/adding-translation-to-code.mdx diff --git a/apps/docs/content/docs/contributor-guides/cloudflare-setup.mdx b/apps/docs/content/docs/guides/contributing/cloudflare-setup.mdx similarity index 89% rename from apps/docs/content/docs/contributor-guides/cloudflare-setup.mdx rename to apps/docs/content/docs/guides/contributing/cloudflare-setup.mdx index ebef15fd..64bf0129 100644 --- a/apps/docs/content/docs/contributor-guides/cloudflare-setup.mdx +++ b/apps/docs/content/docs/guides/contributing/cloudflare-setup.mdx @@ -3,7 +3,14 @@ title: Cloudflare Setup description: Guide to setting up Cloudflare for ClassroomIO. --- -In this guide, you will learn how to get your Cloudflare environment variables and configure R2 buckets. ClassroomIO supports Cloudflare R2 for video uploads, document uploads, and media (images and video thumbnails). For on-premise or data-residency deployments, you can use [MinIO](/docs/self-hosted/docker#optional--object-storage) instead. +In this guide, you will learn how to get your Cloudflare environment variables and configure R2 buckets. ClassroomIO supports Cloudflare R2 for video uploads, document uploads, and media (images and video thumbnails). For on-premise or data-residency deployments, you can use [MinIO](/self-hosted/configuration/storage) instead. + +:::note[`CLOUDFLARE_*` is the legacy R2 config] +The `CLOUDFLARE_*` variables below are a **fallback**, read only when the generic `OBJECT_STORAGE_*` +variables are absent. For new deployments prefer `OBJECT_STORAGE_*` — they cover Cloudflare R2 as well +(point `OBJECT_STORAGE_ENDPOINT` at `https://.r2.cloudflarestorage.com`). See +[Self Hosting → Object storage & uploads](/self-hosted/configuration/storage). +::: ## R2 buckets overview @@ -45,7 +52,7 @@ Used for: uploading videos (presigned PUT) and playing them back (presigned GET) "AllowedOrigins": ["http://localhost:5173", "https://your-app-domain.com"], "AllowedMethods": ["GET", "HEAD", "PUT"], "AllowedHeaders": ["*"], - "MaxAgeSeconds": 3600 + "MaxAgeSeconds": 3600, } ] ``` @@ -75,7 +82,7 @@ If the dashboard uploads or downloads documents directly to/from R2 via presigne Used for: serving images and video thumbnails (the dashboard loads these via the public URL from `CLOUDFLARE_IMAGE_BUCKET_DOMAIN`). If that URL is on a different origin than the dashboard, the bucket needs CORS for **GET** and **HEAD**. -Org-site **Open Graph preview images** are also stored in this bucket under `og/{siteName}.png` and served at `{CLOUDFLARE_IMAGE_BUCKET_DOMAIN}/og/{siteName}.png`. See [Org-Site Open Graph & Favicon](/docs/contributor-guides/org-site-opengraph-and-favicon). +Org-site **Open Graph preview images** are also stored in this bucket under `og/{siteName}.png` and served at `{CLOUDFLARE_IMAGE_BUCKET_DOMAIN}/og/{siteName}.png`. See [Org-Site Open Graph & Favicon](/guides/contributing/org-site-opengraph-and-favicon). 1. In **R2** → select the **media** bucket. 2. Open **Settings** → **CORS policy**. diff --git a/apps/docs/content/docs/guides/contributing/demo-accounts.mdx b/apps/docs/content/docs/guides/contributing/demo-accounts.mdx new file mode 100644 index 00000000..88e4c7db --- /dev/null +++ b/apps/docs/content/docs/guides/contributing/demo-accounts.mdx @@ -0,0 +1,21 @@ +--- +title: Login with Demo Accounts +description: Quick login guide using demo accounts for testing. +--- + +This guide will help you get started quickly once you setup our local environment and you want to start using the [dashboard](https://app.classroomio.com). + +:::note +The assumption of this guide is that you've gone through our README and you've setup `supabase` +and you have `dashboard` running locally. +::: + +## Admin Login Credentials + +Once you have the `dashboard` service running locally and you have setup supabase, we added seed data that can allow you access an admin account to a demo organization and a student account to a student dashboard. This allows you see what ClassroomIO can do quickly without trying to figure it out. + +**Login:** admin@test.com + +**Password:** 123456 + + diff --git a/apps/docs/content/docs/guides/contributing/design.mdx b/apps/docs/content/docs/guides/contributing/design.mdx new file mode 100644 index 00000000..057abe67 --- /dev/null +++ b/apps/docs/content/docs/guides/contributing/design.mdx @@ -0,0 +1,8 @@ +--- +title: Design Contribution Guide +description: Guidelines for contributing design improvements. +--- + +:::warning[Work in Progress] +This page is a work in progress. Help us expand it by contributing! +::: diff --git a/apps/docs/content/docs/contributor-guides/devs.mdx b/apps/docs/content/docs/guides/contributing/devs.mdx similarity index 98% rename from apps/docs/content/docs/contributor-guides/devs.mdx rename to apps/docs/content/docs/guides/contributing/devs.mdx index 3e65b3f5..889d5aa6 100644 --- a/apps/docs/content/docs/contributor-guides/devs.mdx +++ b/apps/docs/content/docs/guides/contributing/devs.mdx @@ -17,7 +17,7 @@ We invite innovative minds to contribute to the evolution of ClassroomIO. If you Ready to dive into the code and make a real impact? Here's your path: -1. **Fork the Repository:** Fork our repository or use [Gitpod](/docs/contributor-guides/gitpod) +1. **Fork the Repository:** Fork our repository or use [Gitpod](/guides/contributing/gitpod) 2. **Implementation:** Code it out, test it and apply your changes. diff --git a/apps/docs/content/docs/contributor-guides/gitpod.mdx b/apps/docs/content/docs/guides/contributing/gitpod.mdx similarity index 62% rename from apps/docs/content/docs/contributor-guides/gitpod.mdx rename to apps/docs/content/docs/guides/contributing/gitpod.mdx index a9306913..d2dc9122 100644 --- a/apps/docs/content/docs/contributor-guides/gitpod.mdx +++ b/apps/docs/content/docs/guides/contributing/gitpod.mdx @@ -3,8 +3,6 @@ title: Gitpod Setup description: Guide to setting up Gitpod for ClassroomIO development. --- -import { Callout } from 'fumadocs-ui/components/callout'; - ## One Click Setup - This will open a fully configured workspace in your browser with all the necessary dependencies already installed. @@ -12,11 +10,11 @@ import { Callout } from 'fumadocs-ui/components/callout'; [![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/rotimi-best/classroomio) - - Gitpod does not utilize `localhost` for accessing services. Instead, it uses its own URL after - starting all the necessary services. The correct URLs to access the project are automatically - inserted into the `.env` file upon initialization. - +:::note[Note] +Gitpod does not utilize `localhost` for accessing services. Instead, it uses its own URL after +starting all the necessary services. The correct URLs to access the project are automatically +inserted into the `.env` file upon initialization. +::: ### Viewing URLs in Terminals diff --git a/apps/docs/content/docs/guides/contributing/index.mdx b/apps/docs/content/docs/guides/contributing/index.mdx new file mode 100644 index 00000000..1ab1346c --- /dev/null +++ b/apps/docs/content/docs/guides/contributing/index.mdx @@ -0,0 +1,54 @@ +--- +title: Contributor Guides +description: Set up ClassroomIO locally, understand the codebase, and contribute code, design, or translations. +--- + +ClassroomIO is open source and we welcome contributions. These guides cover getting the project +running on your machine, the conventions we follow, and the infrastructure behind the platform. + +If you are here to *use* ClassroomIO rather than work on it, start with +[What is ClassroomIO](/what-is-classroomio) instead. + +## Get set up + + + + Run the monorepo locally: prerequisites, install, and the apps you can start. + + + Spin up a ready-made cloud dev environment instead of installing locally. + + + Sign in to your local instance with seeded demo users. + + + +## Contribute + + + + How to propose and hand off design work. + + + Wire up new copy so it can be translated. + + + How the student-facing dashboard is put together. + + + +## Infrastructure + + + + The Cloudflare services the platform depends on and how they are configured. + + + How OG images and favicons are generated and cached for public org sites. + + + +:::note[Looking to self-host instead?] +Running ClassroomIO on your own infrastructure is covered separately in +[Self Hosting](/self-hosted). +::: diff --git a/apps/docs/content/docs/contributor-guides/org-site-opengraph-and-favicon.mdx b/apps/docs/content/docs/guides/contributing/org-site-opengraph-and-favicon.mdx similarity index 93% rename from apps/docs/content/docs/contributor-guides/org-site-opengraph-and-favicon.mdx rename to apps/docs/content/docs/guides/contributing/org-site-opengraph-and-favicon.mdx index d3142e01..80a8cd43 100644 --- a/apps/docs/content/docs/contributor-guides/org-site-opengraph-and-favicon.mdx +++ b/apps/docs/content/docs/guides/contributing/org-site-opengraph-and-favicon.mdx @@ -3,11 +3,9 @@ title: Org-Site Open Graph & Favicon description: Contributor reference for dynamic OG image generation, favicon fallback, CDN caching, and social embed behavior on public org-site routes. --- -import { Callout } from 'fumadocs-ui/components/callout'; - This document describes how ClassroomIO generates **Open Graph preview images** and **favicons** for public org-site routes (`*.myclassroomio.com`, BYOD custom domains, and self-hosted single-org mode). It covers caching layers, invalidation, and why crawlers such as Discord need a fast, stable image URL. -For admin-facing behavior, see [Sharing Your Academy (Open Graph & Favicon)](/docs/academy-sharing-and-branding). +For admin-facing behavior, see [Sharing Your Academy (Open Graph & Favicon)](/guides/academy-sharing-and-branding). ## Overview @@ -174,9 +172,9 @@ Rendered from root `+layout.svelte` via `OrgSiteFavicon` when `data.isOrgSite` i Regeneration runs on the next OG API request or warm fetch after the etag mismatch. - - There is no background job on organization `PUT`. Regen depends on a page visit (warm) or an external fetch of the OG endpoint. - +:::info[No save-hook regen] +There is no background job on organization `PUT`. Regen depends on a page visit (warm) or an external fetch of the OG endpoint. +::: ## Self-hosted notes @@ -194,6 +192,6 @@ Regeneration runs on the next OG API request or warm fetch after the etag mismat ## Related docs -- [Sharing Your Academy (Open Graph & Favicon)](/docs/academy-sharing-and-branding) — admin-facing guide -- [Cloudflare Setup](/docs/contributor-guides/cloudflare-setup) — R2 media bucket and `CLOUDFLARE_IMAGE_BUCKET_DOMAIN` -- [Customize Your Organization](/docs/customize-organization) — logo, name, theme (user docs) +- [Sharing Your Academy (Open Graph & Favicon)](/guides/academy-sharing-and-branding) — admin-facing guide +- [Cloudflare Setup](/guides/contributing/cloudflare-setup) — R2 media bucket and `CLOUDFLARE_IMAGE_BUCKET_DOMAIN` +- [Customize Your Organization](/guides/customize-organization) — logo, name, theme (user docs) diff --git a/apps/docs/content/docs/guides/contributing/student-dashboard.mdx b/apps/docs/content/docs/guides/contributing/student-dashboard.mdx new file mode 100644 index 00000000..a59771a0 --- /dev/null +++ b/apps/docs/content/docs/guides/contributing/student-dashboard.mdx @@ -0,0 +1,21 @@ +--- +title: Student Dashboard - Developers Guide +description: Guide to setting up the student dashboard locally. +--- + +In this guide I will be showing you how to set up a local student dashboard that a student will see. This dashboard will allow students to view their grades, attendance, and other information. This dashboard will also allow students to submit assignments and view their grades for those assignments. + +## Follow the steps in this video + +### Requirements + +:::note[ℹ️ Important] +Make sure to use 2 different browser windows: The reason is that one will be for the admin and +another for the students. For the student we will need to set the cookies value to hold the +organization siteName since we are using the subdomain to access the student dashboard like on +production. +::: + +### Demo + + diff --git a/apps/docs/content/docs/course-enrollment.mdx b/apps/docs/content/docs/guides/course-enrollment.mdx similarity index 76% rename from apps/docs/content/docs/course-enrollment.mdx rename to apps/docs/content/docs/guides/course-enrollment.mdx index 1c327775..0d66fc7d 100644 --- a/apps/docs/content/docs/course-enrollment.mdx +++ b/apps/docs/content/docs/guides/course-enrollment.mdx @@ -3,9 +3,6 @@ title: How Course Enrollment Works description: Understand the ways students can join a course in ClassroomIO—public enrollment, invites, admin assignment, and paid access—and how to restrict who can enroll. --- -import { Callout } from 'fumadocs-ui/components/callout'; -import { Step, Steps } from 'fumadocs-ui/components/steps'; - Enrollment is how a student becomes a member of a course group and gets access to lessons, exercises, and the LMS. ClassroomIO supports several enrollment paths. Which ones are available depends on your course price, publish status, and settings. ## Enrollment paths at a glance @@ -40,9 +37,9 @@ On a **free** course (`cost` is 0) with **Allow New Students** enabled, anyone w No invite token is required. This is the default for free, published courses. - - In the course dashboard, go to **Settings** and find **Allow New Students**. When enabled, anyone can self-enroll from the course landing page. When disabled, the public **Enroll** button is hidden and open self-enrollment is blocked — but **course invite links** and **People → Add people** still work. - +:::info[Allow New Students] +In the course dashboard, go to **Settings** and find **Allow New Students**. When enabled, anyone can self-enroll from the course landing page. When disabled, the public **Enroll** button is hidden and open self-enrollment is blocked — but **course invite links** and **People → Add people** still work. +::: ## Email invites @@ -54,11 +51,11 @@ From **People → Add people**, you enter one or more email addresses and Classr When a student opens the link, they sign in (or sign up) and click **Join course**. ClassroomIO validates the token, expiry, and usage limit before enrolling them. -For step-by-step instructions, see [How to Invite Students](/docs/invite-students). +For step-by-step instructions, see [How to Invite Students](/guides/invite-students). - - **Allow New Students** can be off and email invites still work. The toggle only blocks unsolicited self-enrollment from the landing page; it does not block people you explicitly invited. Invites also work on **unpublished** courses, so you can pre-enroll students before a course goes live. - +:::info[Email invites work on closed or unpublished courses] +**Allow New Students** can be off and email invites still work. The toggle only blocks unsolicited self-enrollment from the landing page; it does not block people you explicitly invited. Invites also work on **unpublished** courses, so you can pre-enroll students before a course goes live. +::: ## Direct add (People) @@ -68,9 +65,9 @@ From the course dashboard, open **People → Add people**, select the students y This does **not** require **Allow New Students** to be on. Use it for closed courses where you control exactly who gets access. - - Revoking an invite or turning off public enrollment does not remove students who have already joined. It only blocks future enrollments through that path. - +:::note[Already enrolled students] +Revoking an invite or turning off public enrollment does not remove students who have already joined. It only blocks future enrollments through that path. +::: ## Paid courses @@ -83,7 +80,7 @@ Paid courses are useful when you want to prevent casual sign-ups on a free landi | Goal | Suggested setup | | --- | --- | | Anyone can join | Free course, published, **Allow New Students** on | -| Only people you email invites to | **Allow New Students** off (optional), send [email invites](/docs/invite-students) | +| Only people you email invites to | **Allow New Students** off (optional), send [email invites](/guides/invite-students) | | Only people you add manually | **Allow New Students** off, use **People → Add people** to directly enroll existing students | | Paywall + optional invites | Set a price, send invites to buyers who should skip or supplement checkout | | Visible in catalog, enrollment closed | Published course, **Allow New Students** off, use invites or **People** to add members | @@ -102,9 +99,9 @@ Restricting who can **join** a course is not the same as hiding it from every st | **Price** | Whether open self-enrollment requires payment | | **Internal Enrollment Only** (org-wide) | When on, any student in your organization can self-enroll in any published course, bypassing per-course **Allow New Students** | - - **Explore** in the student LMS lists published courses the student has not enrolled in yet. Turning off **Allow New Students** blocks open enrollment from the landing page. It does **not** remove the course from Explore. ClassroomIO does not support hiding a published course from specific people in Explore today. - +:::warning[Explore shows published courses] +**Explore** in the student LMS lists published courses the student has not enrolled in yet. Turning off **Allow New Students** blocks open enrollment from the landing page. It does **not** remove the course from Explore. ClassroomIO does not support hiding a published course from specific people in Explore today. +::: **Workarounds:** @@ -112,7 +109,7 @@ Restricting who can **join** a course is not the same as hiding it from every st - Use **Allow New Students** off plus invites or **People** so only the people you choose can actually join. - Accept that enrolled students may see the course in Explore even when they cannot self-enroll. -For where students see enrolled vs available courses, see [Student Dashboard](/docs/student-dashboard). +For where students see enrolled vs available courses, see [Student Dashboard](/student-dashboard). ## People and membership @@ -125,9 +122,9 @@ When a student enrolls or you add them from **People**, they become a member of The **People** tab in the course dashboard is the source of truth for course membership. - - **Compliance** courses also track completion status (for example **not started**). That is separate from membership. A student can appear in **People** as soon as they are enrolled while still showing **not started** on the Compliance dashboard until they begin the course. - +:::info[People vs Compliance status] +**Compliance** courses also track completion status (for example **not started**). That is separate from membership. A student can appear in **People** as soon as they are enrolled while still showing **not started** on the Compliance dashboard until they begin the course. +::: ## Organization-level access settings (separate from course enrollment) @@ -181,10 +178,10 @@ Enable **Disable Signup** and **Internal Enrollment Only** in **Settings → Aut ## Related guides -- [How to Invite Students](/docs/invite-students) — create, send, and revoke course invite links -- [Customize the Welcome Email](/docs/welcome-email): the message students get when they enroll -- [Roles and Permissions](/docs/roles-and-permissions) — who can create courses and access the admin dashboard -- [Student Dashboard](/docs/student-dashboard) — Home, My Learning, Explore, and Cohorts -- [Set Up a Custom Domain](/docs/custom-domain) — org URLs used in enrollment links -- [Create a Course Landing Page](/docs/course-landingpage) — pricing, publish state, and what prospects see before enrolling -- [Creating Your First Course](/docs/create-first-course) — create and publish a course +- [How to Invite Students](/guides/invite-students) — create, send, and revoke course invite links +- [Customize the Welcome Email](/guides/welcome-email): the message students get when they enroll +- [Roles and Permissions](/guides/roles-and-permissions) — who can create courses and access the admin dashboard +- [Student Dashboard](/student-dashboard) — Home, My Learning, Explore, and Cohorts +- [Set Up a Custom Domain](/guides/custom-domain) — org URLs used in enrollment links +- [Create a Course Landing Page](/guides/course-landingpage) — pricing, publish state, and what prospects see before enrolling +- [Creating Your First Course](/guides/create-first-course) — create and publish a course diff --git a/apps/docs/content/docs/course-landingpage.mdx b/apps/docs/content/docs/guides/course-landingpage.mdx similarity index 56% rename from apps/docs/content/docs/course-landingpage.mdx rename to apps/docs/content/docs/guides/course-landingpage.mdx index 4e7ad742..73282f37 100644 --- a/apps/docs/content/docs/course-landingpage.mdx +++ b/apps/docs/content/docs/guides/course-landingpage.mdx @@ -3,10 +3,7 @@ title: Create a Course Landing Page description: Build and edit a course landing page, including pricing, hero buttons, preview, and publish settings. --- -import { Callout } from 'fumadocs-ui/components/callout'; -import { Step, Steps } from 'fumadocs-ui/components/steps'; - -A **course landing page** is the public page for one course. Prospects read the description, see pricing, and click **Enroll** if enrollment is open. This is separate from your [academy landing page](/docs/org-landing-page), which is the academy homepage. +A **course landing page** is the public page for one course. Prospects read the description, see pricing, and click **Enroll** if enrollment is open. This is separate from your [academy landing page](/guides/org-landing-page), which is the academy homepage. ## Open the editor @@ -47,7 +44,7 @@ Use the preview control next to **Save** to see the page. Confirm behavior on th | **Instructors** | Instructor cards | | **Footer** | Supporting links and copy | -Hero and pricing interact with [course enrollment](/docs/course-enrollment): a free course with **Allow New Students** on shows an open **Enroll** button; paid or closed courses route visitors through payment or invites. +Hero and pricing interact with [course enrollment](/guides/course-enrollment): a free course with **Allow New Students** on shows an open **Enroll** button; paid or closed courses route visitors through payment or invites. ## Pricing and currency @@ -58,9 +55,9 @@ Set the course price in the **Pricing** section. ClassroomIO supports these curr | US Dollar | USD | | Nigerian Naira | NGN | - - If you need a currency outside USD and NGN, that requires product support today. Pick the closest supported currency or keep the course free and handle payment outside ClassroomIO. - +:::info[Other currencies] +If you need a currency outside USD and NGN, that requires product support today. Pick the closest supported currency or keep the course free and handle payment outside ClassroomIO. +::: ## Publish and Allow New Students @@ -72,24 +69,24 @@ Landing page content can be ready before you open enrollment: | **Allow New Students** | Public **Enroll** works (for free courses) | | **Price > 0** | Enrollment requires payment or a valid invite | -See [How Course Enrollment Works](/docs/course-enrollment) for closed cohorts and invite-only access. +See [How Course Enrollment Works](/guides/course-enrollment) for closed cohorts and invite-only access. ## Preview vs live site -The in-app preview shows layout and copy. Test **Enroll**, external links, and payment on your live academy URL (subdomain or [custom domain](/docs/custom-domain)) before sharing publicly. +The in-app preview shows layout and copy. Test **Enroll**, external links, and payment on your live academy URL (subdomain or [custom domain](/guides/custom-domain)) before sharing publicly. - - The org homepage preview in **Settings → Landing Page** disables link clicks. Course landing previews should still be checked on the live site for enrollment flows. - +:::warning[Org landing page preview] +The org homepage preview in **Settings → Landing Page** disables link clicks. Course landing previews should still be checked on the live site for enrollment flows. +::: ## What students see after enrolling -After a successful enroll, students land in the [Student Dashboard](/docs/student-dashboard) (**Home** / **My Learning**). The course may disappear from **Explore** once they are a member. +After a successful enroll, students land in the [Student Dashboard](/student-dashboard) (**Home** / **My Learning**). The course may disappear from **Explore** once they are a member. ## Related guides -- [How Course Enrollment Works](/docs/course-enrollment) — who can join and how Explore relates to publish settings -- [How to Invite Students](/docs/invite-students) — invite links when public enroll is off -- [Course Types](/docs/course-types) — how type affects public vs LMS access -- [Set Up a Custom Domain](/docs/custom-domain) — host for your landing page URL -- [Creating Your First Course](/docs/create-first-course) +- [How Course Enrollment Works](/guides/course-enrollment) — who can join and how Explore relates to publish settings +- [How to Invite Students](/guides/invite-students) — invite links when public enroll is off +- [Course Types](/guides/course-types) — how type affects public vs LMS access +- [Set Up a Custom Domain](/guides/custom-domain) — host for your landing page URL +- [Creating Your First Course](/guides/create-first-course) diff --git a/apps/docs/content/docs/course-progression.mdx b/apps/docs/content/docs/guides/course-progression.mdx similarity index 80% rename from apps/docs/content/docs/course-progression.mdx rename to apps/docs/content/docs/guides/course-progression.mdx index d41eef47..e2e27c8f 100644 --- a/apps/docs/content/docs/course-progression.mdx +++ b/apps/docs/content/docs/guides/course-progression.mdx @@ -3,9 +3,6 @@ title: Control Course Progression description: Require students to move through a course in order, with lessons and exercises that only complete when your rules are met. --- -import { Callout } from 'fumadocs-ui/components/callout'; -import { Step, Steps } from 'fumadocs-ui/components/steps'; - By default students can open any unlocked item in any order. With **sequential** progression they must finish each item before the next one unlocks, and you decide what "finished" means for every lesson and exercise. This is the backbone of a structured training flow: watch the video, pass the quiz, earn the certificate. @@ -19,12 +16,12 @@ In the course's **Settings** tab, find the **Student progression** section and p | **Free** | Students open any unlocked item in any order and mark lessons complete themselves. | | **Sequential** | The next item stays locked until the current (or previous) item is complete. | -![Student progression setting with Free and Sequential options](/progression-mode.webp) +![Student progression setting with Free and Sequential options](/docs/progression-mode.webp) - +:::info If a course is just a video and a quiz, turn off **Content grouping** in the same settings so the content list is a flat list instead of grouped sections. - +::: ## Set how a lesson completes @@ -36,12 +33,12 @@ Open a lesson, go to its **Settings** tab, and choose a **Completion rule**: | **Video watch** | The student watches the selected videos. Set the **Watch threshold (%)** (for example 95%). | | **None** | The lesson never blocks progression. | -![Lesson Completion rule options with Manual, Video watch, and None](/progression-completion-rule.webp) +![Lesson Completion rule options with Manual, Video watch, and None](/docs/progression-completion-rule.webp) - +:::warning **Video watch** only enforces uploaded videos. While the rule is active the player blocks skipping ahead and pauses when the student switches tabs, so the watch percentage reflects real viewing. The lesson completes once the threshold is reached. - +::: ## Set how an exercise completes @@ -58,7 +55,7 @@ In the course's **Certificates** settings, turn on certificate download and set 100%). The certificate unlocks only after the student completes that share of the course, which, under sequential progression, means they have watched the videos and finished the exercises in order. -See [How to Create Certificates](/docs/certificates) for templates, signatures, and the certificate ID. +See [How to Create Certificates](/guides/certificates) for templates, signatures, and the certificate ID. ## What students see @@ -72,7 +69,7 @@ quiz that follows a lesson stays locked until that lesson is complete. In the co out with a lock icon and cannot be opened; it unlocks automatically once the previous required item is done. If a student opens a not-yet-available item directly, they see a **Complete previous content first** notice. -![Locked exercise in the content list with a lock icon](/progression-locked.webp) +![Locked exercise in the content list with a lock icon](/docs/progression-locked.webp) @@ -81,7 +78,7 @@ opens a not-yet-available item directly, they see a **Complete previous content On a **Video watch** lesson, the progress percentage climbs as they watch. Trying to jump ahead shows a "you cannot skip ahead" notice, and the video pauses if they leave the tab. -![Video player showing the "You cannot skip ahead on this video" notice](/progression-cant-skip.webp) +![Video player showing the "You cannot skip ahead on this video" notice](/docs/progression-cant-skip.webp) @@ -90,14 +87,14 @@ ahead" notice, and the video pauses if they leave the tab. Reaching the watch threshold marks the lesson complete and unlocks the next item. After they finish the final requirement, the course is complete and they can view and download their certificate. -![Course requirements complete modal showing congratulations and View certificate button](/progression-student-course-complete.webp) +![Course requirements complete modal showing congratulations and View certificate button](/docs/progression-student-course-complete.webp) ## Related guides -- [Course Types](/docs/course-types): Self-paced, Live class, Compliance, and Public -- [How to Create an Exercise](/docs/create-exercise): build the quiz that gates progression -- [How to Create Certificates](/docs/certificates): what students earn at the end -- [Run a Live Class](/docs/live-class): schedule live sessions alongside on-demand content +- [Course Types](/guides/course-types): Self-paced, Live class, Compliance, and Public +- [How to Create an Exercise](/guides/create-exercise): build the quiz that gates progression +- [How to Create Certificates](/guides/certificates): what students earn at the end +- [Run a Live Class](/guides/live-class): schedule live sessions alongside on-demand content diff --git a/apps/docs/content/docs/course-types.mdx b/apps/docs/content/docs/guides/course-types.mdx similarity index 71% rename from apps/docs/content/docs/course-types.mdx rename to apps/docs/content/docs/guides/course-types.mdx index f33ec1f2..0a375260 100644 --- a/apps/docs/content/docs/course-types.mdx +++ b/apps/docs/content/docs/guides/course-types.mdx @@ -3,8 +3,6 @@ title: Course Types description: Learn what Self-paced, Live class, Compliance, and Public course types do in ClassroomIO and when to use each. --- -import { Callout } from 'fumadocs-ui/components/callout'; - Course **type** is set in each course's **Settings**. It is easy to miss because the dropdown alone does not show every change. Types mainly affect admin navigation, compliance tracking, grading, and whether the course uses the normal enroll-and-LMS flow. ## Types at a glance @@ -27,7 +25,7 @@ Use self-paced for standard training, onboarding content, and evergreen material **Live class** adds instructor grading workflows. Admins and tutors see a **Marks** section in the course sidebar to review and grade student work. Use live class when an instructor scores assignments and you need a dedicated grading view. To schedule sessions with a -join link, automatic reminders, and a calendar invite, see [Run a Live Class](/docs/live-class). +join link, automatic reminders, and a calendar invite, see [Run a Live Class](/guides/live-class). ## Compliance @@ -41,9 +39,9 @@ join link, automatic reminders, and a calendar invite, see [Run a Live Class](/d Use compliance for mandatory training where you must track who completed requirements by a deadline. - - A student can appear in **People** as soon as they enroll while still showing **not started** on the Compliance dashboard. Membership and completion status are separate. - +:::info[Compliance status vs People membership] +A student can appear in **People** as soon as they enroll while still showing **not started** on the Compliance dashboard. Membership and completion status are separate. +::: ## Public @@ -51,9 +49,9 @@ Use compliance for mandatory training where you must track who completed require Use public when you want open educational content without requiring accounts. Public courses are not a substitute for private cohort enrollment. - - Switching type after launch can change which sidebar items appear and how completion is tracked. Pick the type that matches your delivery model before students enroll when possible. - +:::warning[Changing type on an existing course] +Switching type after launch can change which sidebar items appear and how completion is tracked. Pick the type that matches your delivery model before students enroll when possible. +::: ## Why types can feel identical in Settings @@ -68,9 +66,9 @@ Open the course sidebar after changing type to confirm the right tools are avail ## Related guides -- [Course](/docs/course) — course overview and admin areas -- [Run a Live Class](/docs/live-class): schedule sessions, reminders, and calendar invites -- [Control Course Progression](/docs/course-progression): sequential learning and completion rules -- [How Course Enrollment Works](/docs/course-enrollment) — enrollment (not used for Public in the same way) -- [Student Dashboard](/docs/student-dashboard) — student LMS views -- [Creating Your First Course](/docs/create-first-course) +- [Course](/course) — course overview and admin areas +- [Run a Live Class](/guides/live-class): schedule sessions, reminders, and calendar invites +- [Control Course Progression](/guides/course-progression): sequential learning and completion rules +- [How Course Enrollment Works](/guides/course-enrollment) — enrollment (not used for Public in the same way) +- [Student Dashboard](/student-dashboard) — student LMS views +- [Creating Your First Course](/guides/create-first-course) diff --git a/apps/docs/content/docs/create-exercise.mdx b/apps/docs/content/docs/guides/create-exercise.mdx similarity index 72% rename from apps/docs/content/docs/create-exercise.mdx rename to apps/docs/content/docs/guides/create-exercise.mdx index 6fee498c..70308759 100644 --- a/apps/docs/content/docs/create-exercise.mdx +++ b/apps/docs/content/docs/guides/create-exercise.mdx @@ -3,10 +3,7 @@ title: How to Create an Exercise description: Learn how to create exercises in ClassroomIO. --- -import { Callout } from 'fumadocs-ui/components/callout'; -import { Step, Steps } from 'fumadocs-ui/components/steps'; - -In ClassroomIO, exercises are a great way to assess students' understanding through practice activities. Once you've [set up your organization](/docs/customize-organization), [created a course](/docs/create-first-course), and [added a lesson](/docs/create-first-course#adding-lessons), you can start creating exercises. Follow the process below to create your first exercise. +In ClassroomIO, exercises are a great way to assess students' understanding through practice activities. Once you've [set up your organization](/guides/customize-organization), [created a course](/guides/create-first-course), and [added a lesson](/guides/create-first-course#adding-lessons), you can start creating exercises. Follow the process below to create your first exercise. @@ -14,7 +11,7 @@ In ClassroomIO, exercises are a great way to assess students' understanding thro Access the courses page from the dashboard by clicking on **Courses** via the sidebar menu. -![Organization dashboard displaying a sidebar menu](/organization-dashboard.webp) +![Organization dashboard displaying a sidebar menu](/docs/organization-dashboard.webp) @@ -23,7 +20,7 @@ Access the courses page from the dashboard by clicking on **Courses** via the si On the courses page, click on a course to go to the course page. -![Courses page for organization displaying a sidebar menu and a course card component](/courses-page.webp) +![Courses page for organization displaying a sidebar menu and a course card component](/docs/courses-page.webp) @@ -34,7 +31,7 @@ On the course page, click on **Lessons** via the left sidebar menu and select th > Alternatively, you can click on the **⌄** icon next to the **Lessons** option to select a lesson. -![Course page displaying sidebar menu with the lesson page open](/course-page.webp) +![Course page displaying sidebar menu with the lesson page open](/docs/course-page.webp) @@ -43,23 +40,23 @@ On the course page, click on **Lessons** via the left sidebar menu and select th Locate the tabs at the top of the page and select the **Exercises** tab. Then click on the **Add** button. On the modal, select a method to create an exercise. You can create an exercise: -![Course page displaying sidebar menu with the exercise tab open](/exercise.webp) +![Course page displaying sidebar menu with the exercise tab open](/docs/exercise.webp) 1. **From scratch**: Create an exercise by adding the questions yourself. This is handy if you've prepared your questions. - Enter the exercise name and click on the **Finish** button. - Click on the newly created exercise and provide the exercise description, due date, and question details. -![A pop-up displaying new exercise with an empty field](/from-scratch.webp) +![A pop-up displaying new exercise with an empty field](/docs/from-scratch.webp) 2. **Using a template**: You can select from an array of templates with predefined exercises complete with questions and options. - Select a template and click on the **Finish** button. -![A pop-up displaying new exercise with an array of exercise templates](/using-a-template.webp) +![A pop-up displaying new exercise with an array of exercise templates](/docs/using-a-template.webp) 3. **Using AI**: AI helps you generate exercises directly from lesson notes. - Enter the number of questions and options. Next, click on the **Generate** button. -![A pop-up displaying new exercise with two questions about the exercise content](/using-AI.webp) +![A pop-up displaying new exercise with two questions about the exercise content](/docs/using-AI.webp) @@ -68,7 +65,7 @@ Locate the tabs at the top of the page and select the **Exercises** tab. Then cl To preview the exercise, click on the **preview icon**. This is to ensure the exercise looks and functions as expected. -![Exercise content edit page](/preview.webp) +![Exercise content edit page](/docs/preview.webp) @@ -77,7 +74,7 @@ To preview the exercise, click on the **preview icon**. This is to ensure the ex To add a question, click on the **add icon**. -![Exercise content edit page with a red box highlight on the add icon](/add-question.webp) +![Exercise content edit page with a red box highlight on the add icon](/docs/add-question.webp) @@ -86,7 +83,7 @@ To add a question, click on the **add icon**. To reorder questions, click on the **three dots** > **Reorder Questions**, then drag and drop the questions. -![A pop-up showing the question order for exercise](/reorder-questions.webp) +![A pop-up showing the question order for exercise](/docs/reorder-questions.webp) @@ -102,7 +99,7 @@ After previewing, adding, and rearranging questions, ensure to save your changes You've successfully created your first exercise and it is now accessible to students enrolled in the course. Move on to the next section to start grading your exercise. -![Course page displaying sidebar menu with the exercise tab open showing the newly created exercise](/new-exercise.webp) +![Course page displaying sidebar menu with the exercise tab open showing the newly created exercise](/docs/new-exercise.webp) @@ -112,18 +109,18 @@ You've successfully created your first exercise and it is now accessible to stud When a quiz is ready, you can email every enrolled student a one-click link to take it. On the exercise page, open the **⋯** menu at the top and choose **Notify students**. -![Exercise menu showing the Notify students option](/notify-students-menu.webp) +![Exercise menu showing the Notify students option](/docs/notify-students-menu.webp) The send runs in the background. A progress indicator appears while emails go out, then confirms when it is done. You can run it again at any time to nudge students who have not taken the quiz yet. - +:::info Notifying students is handy after a live session: schedule the quiz, then send the notification so attendees know to -complete it. See [Run a Live Class](/docs/live-class). - +complete it. See [Run a Live Class](/guides/live-class). +::: ## Related guides -- [How to Grade an Exercise](/docs/grade-exercise): review and score submissions -- [Control Course Progression](/docs/course-progression): require a passing score before the next item unlocks -- [How to Create Certificates](/docs/certificates): issue certificates on completion +- [How to Grade an Exercise](/guides/grade-exercise): review and score submissions +- [Control Course Progression](/guides/course-progression): require a passing score before the next item unlocks +- [How to Create Certificates](/guides/certificates): issue certificates on completion diff --git a/apps/docs/content/docs/create-first-course.mdx b/apps/docs/content/docs/guides/create-first-course.mdx similarity index 78% rename from apps/docs/content/docs/create-first-course.mdx rename to apps/docs/content/docs/guides/create-first-course.mdx index e2fb245e..e67bea3d 100644 --- a/apps/docs/content/docs/create-first-course.mdx +++ b/apps/docs/content/docs/guides/create-first-course.mdx @@ -3,24 +3,9 @@ title: Creating Your First Course description: Learn how to create your first course on ClassroomIO. --- -import { Step, Steps } from 'fumadocs-ui/components/steps'; -import { Callout } from 'fumadocs-ui/components/callout'; +Below is a video guiding you through the process of creating your inaugural course. Should you have any inquiries, feel free to drop a comment in the YouTube comment section, reach out to us on **[Discord](https://classroomio.com/discord)**, or send a DM on **[Twitter](https://x.com/rotimi_best?s=20)**. - -Below is a video guiding you through the process of creating your inaugural course. Should you have any inquiries, feel free to drop a comment in the YouTube comment section, reach out to us on **[Discord](https://discord.gg/BSaEzcfu)**, or send a DM on **[Twitter](https://x.com/rotimi_best?s=20)**. - -
- -
+ ## Procedure @@ -63,9 +48,9 @@ On the course page, click "Lessons" in the sidebar to access the lessons page. C Provide the lesson title, select a tutor, date, and optionally lock the lesson or notes. - - Locking the lesson renders it inaccessible to students upon course publication. - +:::note[💡 Tip] +Locking the lesson renders it inaccessible to students upon course publication. +::: Save your changes to be redirected to the lesson page for material addition. @@ -95,9 +80,9 @@ To embed slides, navigate to the slides tab and input the link to the slides. Cl Embedding videos is simple: select the "Videos" tab to open the modal for adding videos. From the "Add By" options in the modal, select the "YouTube Link" tab. Input the link to the YouTube video and click the "Add Video" button. Once added, the video is automatically included in your materials. You can delete the video using the trash icon. - - Please note that for now, we do not support adding videos from local sources. - +:::warning +Please note that for now, we do not support adding videos from local sources. +::: ## Publishing a course diff --git a/apps/docs/content/docs/custom-domain.mdx b/apps/docs/content/docs/guides/custom-domain.mdx similarity index 72% rename from apps/docs/content/docs/custom-domain.mdx rename to apps/docs/content/docs/guides/custom-domain.mdx index d3f3e82d..3d3c2f46 100644 --- a/apps/docs/content/docs/custom-domain.mdx +++ b/apps/docs/content/docs/guides/custom-domain.mdx @@ -3,9 +3,6 @@ title: Set Up a Custom Domain description: Connect and verify a custom domain for your ClassroomIO academy and learn which links use your org URL. --- -import { Callout } from 'fumadocs-ui/components/callout'; -import { Step, Steps } from 'fumadocs-ui/components/steps'; - Every organization gets a default site at `https://.myclassroomio.com`. You can connect your own domain (for example `https://learn.yourcompany.com`) so students see your brand in the browser bar and in links. ## How ClassroomIO picks a base URL @@ -48,9 +45,9 @@ Open your custom domain in a browser. Sign in, open a course landing page, and c - - An unverified custom domain is not used for generated links. Until verification succeeds, ClassroomIO keeps using `.myclassroomio.com`. - +:::warning[Verification required] +An unverified custom domain is not used for generated links. Until verification succeeds, ClassroomIO keeps using `.myclassroomio.com`. +::: ## Which links use your org URL @@ -61,7 +58,7 @@ Open your custom domain in a browser. Sign in, open a course landing page, and c | Org site landing page and course catalog | Yes | | Organization team invite (some flows) | May still use platform URL until fully aligned | -Course invites are documented in [How to Invite Students](/docs/invite-students). Those links should point at your academy, not `app.classroomio.com`, when your domain is verified. +Course invites are documented in [How to Invite Students](/guides/invite-students). Those links should point at your academy, not `app.classroomio.com`, when your domain is verified. ## Email sender address @@ -73,8 +70,8 @@ Students should sign in on your academy so sessions and redirects stay on your a ## Related guides -- [Customize Your Organization](/docs/customize-organization) — org profile and default subdomain -- [Customize Your Academy Landing Page](/docs/org-landing-page) — public homepage on your domain -- [How to Invite Students](/docs/invite-students) — enrollment links on your academy -- [How Course Enrollment Works](/docs/course-enrollment) — enrollment paths and org signup -- [Organization](/docs/organization) — org settings overview +- [Customize Your Organization](/guides/customize-organization) — org profile and default subdomain +- [Customize Your Academy Landing Page](/guides/org-landing-page) — public homepage on your domain +- [How to Invite Students](/guides/invite-students) — enrollment links on your academy +- [How Course Enrollment Works](/guides/course-enrollment) — enrollment paths and org signup +- [Organization](/organization) — org settings overview diff --git a/apps/docs/content/docs/customize-organization.mdx b/apps/docs/content/docs/guides/customize-organization.mdx similarity index 74% rename from apps/docs/content/docs/customize-organization.mdx rename to apps/docs/content/docs/guides/customize-organization.mdx index 8f0475d1..4fb6b609 100644 --- a/apps/docs/content/docs/customize-organization.mdx +++ b/apps/docs/content/docs/guides/customize-organization.mdx @@ -3,13 +3,9 @@ title: Customize Your Organization description: Learn how to customize your organization settings. --- -import { Step, Steps } from 'fumadocs-ui/components/steps'; -import { Callout } from 'fumadocs-ui/components/callout'; - - ClassroomIO empowers every organization to tailor their experience to their unique needs. In this guide, you will learn how to customize your organization settings. To access this, from your admin dashboard, navigate to **Settings** > **Organization**. -![ClassroomIO Organization settings page](/customize-organization.webp) +![ClassroomIO Organization settings page](/docs/customize-organization.webp) ## Update Organization Profile @@ -66,7 +62,7 @@ Upon onboarding, each organization in ClassroomIO is assigned a custom Domain UR Click the Edit Domain button to navigate to the domain setup page. -![Custom Domain setup](/domain-setup-one.webp) +![Custom Domain setup](/docs/domain-setup-one.webp) @@ -75,7 +71,7 @@ Click the Edit Domain button to navigate to the domain setup page. Fill the field with your desired URL. -![Edit Custom domain URL](/domain-setup-two.webp) +![Edit Custom domain URL](/docs/domain-setup-two.webp) @@ -86,16 +82,16 @@ Click on Update Domain to save the changes. > You can click on **View Site** to be redirected to your Organization website with the updated URL. -![Edit Custom domain URL](/domain-setup-three.webp) +![Edit Custom domain URL](/docs/domain-setup-three.webp) -For full custom domain setup (DNS, verification, which links use your domain), see [Set Up a Custom Domain](/docs/custom-domain). +For full custom domain setup (DNS, verification, which links use your domain), see [Set Up a Custom Domain](/guides/custom-domain). -For the public homepage (hero, nav, footer), see [Customize Your Academy Landing Page](/docs/org-landing-page). +For the public homepage (hero, nav, footer), see [Customize Your Academy Landing Page](/guides/org-landing-page). -For favicon and link-preview behavior when sharing your academy URL, see [Sharing Your Academy (Open Graph & Favicon)](/docs/academy-sharing-and-branding). +For favicon and link-preview behavior when sharing your academy URL, see [Sharing Your Academy (Open Graph & Favicon)](/guides/academy-sharing-and-branding). ## Set Brand Color @@ -103,8 +99,8 @@ We understand that every organization has a preferred color that suits their bra ## Related guides -- [Organization](/docs/organization) — org settings overview -- [Customize Your Academy Landing Page](/docs/org-landing-page) — public homepage -- [Set Up a Custom Domain](/docs/custom-domain) — your own hostname -- [Sharing Your Academy (Open Graph & Favicon)](/docs/academy-sharing-and-branding) — link previews and browser tab icon -- [Roles and Permissions](/docs/roles-and-permissions) — team access +- [Organization](/organization) — org settings overview +- [Customize Your Academy Landing Page](/guides/org-landing-page) — public homepage +- [Set Up a Custom Domain](/guides/custom-domain) — your own hostname +- [Sharing Your Academy (Open Graph & Favicon)](/guides/academy-sharing-and-branding) — link previews and browser tab icon +- [Roles and Permissions](/guides/roles-and-permissions) — team access diff --git a/apps/docs/content/docs/grade-exercise.mdx b/apps/docs/content/docs/guides/grade-exercise.mdx similarity index 65% rename from apps/docs/content/docs/grade-exercise.mdx rename to apps/docs/content/docs/guides/grade-exercise.mdx index 850c6d7c..2838c4e7 100644 --- a/apps/docs/content/docs/grade-exercise.mdx +++ b/apps/docs/content/docs/guides/grade-exercise.mdx @@ -3,9 +3,6 @@ title: How to Grade an Exercise description: Review student submissions, move them through the grading workflow, score answers, and leave feedback. --- -import { Callout } from 'fumadocs-ui/components/callout'; -import { Step, Steps } from 'fumadocs-ui/components/steps'; - When students submit exercises, their work appears in the **Submissions** tab of the course dashboard. Exercises move through a three-stage workflow: **Submitted → In Progress → Graded**. ## Grading workflow @@ -18,9 +15,9 @@ When students submit exercises, their work appears in the **Submissions** tab of Submissions are displayed as cards on a board. Drag a card between columns or open it to change its status manually. - - Exercises that use only objective question types (multiple choice, etc.) are auto-graded when submitted. They move directly to **Graded** without manual review. Exercises with open-ended or video questions require manual review and are flagged **Manual grading required**. - +:::info[Auto-graded exercises] +Exercises that use only objective question types (multiple choice, etc.) are auto-graded when submitted. They move directly to **Graded** without manual review. Exercises with open-ended or video questions require manual review and are flagged **Manual grading required**. +::: ## Grade a submission @@ -60,12 +57,12 @@ Click **Submit Grades**. The card moves to **Graded** and the student's score is Click **Grade with AI** inside the grading modal to get an AI-suggested score and rationale for open-ended answers. Review the suggestion and click **Accept** to apply it or **Reject** to discard it and grade manually. - - AI grading is a suggestion. Always review the reasoning before accepting, especially for nuanced or context-dependent answers. - +:::warning[Review AI grades before submitting] +AI grading is a suggestion. Always review the reasoning before accepting, especially for nuanced or context-dependent answers. +::: ## Related guides -- [How to Create an Exercise](/docs/create-exercise) — create and configure exercises -- [How to Create Certificates](/docs/certificates) — certificates that depend on exercise scores -- [Course](/docs/course) — course overview including the Submissions tab +- [How to Create an Exercise](/guides/create-exercise) — create and configure exercises +- [How to Create Certificates](/guides/certificates) — certificates that depend on exercise scores +- [Course](/course) — course overview including the Submissions tab diff --git a/apps/docs/content/docs/guides/index.mdx b/apps/docs/content/docs/guides/index.mdx new file mode 100644 index 00000000..9b66649d --- /dev/null +++ b/apps/docs/content/docs/guides/index.mdx @@ -0,0 +1,45 @@ +--- +title: Guides +description: User guides for running your ClassroomIO academy, and developer guides for contributing to the project. +--- + +These guides cover everything from setup to day-to-day usage, split by who they're for. + +## User Guides + +Everything you need to build and run your academy — creating courses and exercises, running live +classes, enrolling students, publishing your landing pages, and managing your organization and team. + + + + The platform's key features and capabilities. + + + Sign up and get your organization onboarded. + + + Build a course end to end, from lessons to publishing. + + + The words ClassroomIO uses, and what they mean. + + + +## Developer Guides + +ClassroomIO is open source and we welcome contributions. These cover getting the project running on +your machine, the conventions we follow, and the infrastructure behind the platform. + + + + Start here: local setup, contributing code, design, and translations. + + + Run the monorepo locally: prerequisites, install, and the apps you can start. + + + +:::note[Looking to self-host instead?] +Running ClassroomIO on your own infrastructure is covered separately in +[Self Hosting](/self-hosted). +::: diff --git a/apps/docs/content/docs/invite-students.mdx b/apps/docs/content/docs/guides/invite-students.mdx similarity index 90% rename from apps/docs/content/docs/invite-students.mdx rename to apps/docs/content/docs/guides/invite-students.mdx index 432f4ffd..e5edee1a 100644 --- a/apps/docs/content/docs/invite-students.mdx +++ b/apps/docs/content/docs/guides/invite-students.mdx @@ -3,11 +3,9 @@ title: How to Invite Students description: Learn how to invite students to your courses using email invitations and how enrollment works for free and paid courses. --- -import { Step, Steps } from 'fumadocs-ui/components/steps'; - Course invitations in ClassroomIO let you add students to a course by sending them a secure enrollment link by email. Each invite is unique and can have its own expiry and usage limits. -For a full overview of enrollment paths (public enroll, invites, admin assignment, and paid access), see [How Course Enrollment Works](/docs/course-enrollment). +For a full overview of enrollment paths (public enroll, invites, admin assignment, and paid access), see [How Course Enrollment Works](/guides/course-enrollment). ## How course invitations work @@ -80,7 +78,7 @@ Revoking does not remove students who have already joined; it only invalidates t ## Related guides -- [How Course Enrollment Works](/docs/course-enrollment) — enrollment paths, Allow New Students, and Explore visibility -- [Roles and Permissions](/docs/roles-and-permissions) — who can manage courses vs learn in the LMS -- [Set Up a Custom Domain](/docs/custom-domain) — which host appears in invite links -- [Student Dashboard](/docs/student-dashboard) — where students land after joining +- [How Course Enrollment Works](/guides/course-enrollment) — enrollment paths, Allow New Students, and Explore visibility +- [Roles and Permissions](/guides/roles-and-permissions) — who can manage courses vs learn in the LMS +- [Set Up a Custom Domain](/guides/custom-domain) — which host appears in invite links +- [Student Dashboard](/student-dashboard) — where students land after joining diff --git a/apps/docs/content/docs/invite-team-member.mdx b/apps/docs/content/docs/guides/invite-team-member.mdx similarity index 77% rename from apps/docs/content/docs/invite-team-member.mdx rename to apps/docs/content/docs/guides/invite-team-member.mdx index 687caf99..2f74f67a 100644 --- a/apps/docs/content/docs/invite-team-member.mdx +++ b/apps/docs/content/docs/guides/invite-team-member.mdx @@ -3,14 +3,11 @@ title: Inviting a Team Member description: Add admins and tutors to your organization by email invite or a reusable invite link. --- -import { Callout } from 'fumadocs-ui/components/callout'; -import { Step, Steps } from 'fumadocs-ui/components/steps'; - Team members are people who help you run your organization — **Admins** have full access, **Tutors** can manage the courses they are assigned to. Both are different from students, who use the LMS and cannot access the admin dashboard. - - Email invites and link invites for team members require a paid plan. - +:::warning[Paid plan required] +Email invites and link invites for team members require a paid plan. +::: To invite a team member, go to **Settings → Organization**, then click **Manage Team**. @@ -70,6 +67,6 @@ Toggle the link off to stop accepting new members through it. You can re-enable ## Related guides -- [Roles and Permissions](/docs/roles-and-permissions) — what admins and tutors can do -- [How to Invite Students](/docs/invite-students) — invite students to a specific course (separate from team invites) -- [Organization](/docs/organization) — org settings overview +- [Roles and Permissions](/guides/roles-and-permissions) — what admins and tutors can do +- [How to Invite Students](/guides/invite-students) — invite students to a specific course (separate from team invites) +- [Organization](/organization) — org settings overview diff --git a/apps/docs/content/docs/live-class.mdx b/apps/docs/content/docs/guides/live-class.mdx similarity index 78% rename from apps/docs/content/docs/live-class.mdx rename to apps/docs/content/docs/guides/live-class.mdx index 48158ba2..cc913134 100644 --- a/apps/docs/content/docs/live-class.mdx +++ b/apps/docs/content/docs/guides/live-class.mdx @@ -3,16 +3,13 @@ title: Run a Live Class description: Schedule a live session on a Live class course, set the join link, time, and timezone, and let ClassroomIO remind students and send a calendar invite. --- -import { Callout } from 'fumadocs-ui/components/callout'; -import { Step, Steps } from 'fumadocs-ui/components/steps'; - A **Live class** course runs around scheduled sessions you host on your own video tool (Zoom, Google Meet, Teams). ClassroomIO handles everything around the session: the join link, the schedule, automatic reminders, a calendar invite, and a one-click way for students to join. ## Set the course type -Set the course type to **Live class** in the course's **Settings** tab. See [Course Types](/docs/course-types) +Set the course type to **Live class** in the course's **Settings** tab. See [Course Types](/guides/course-types) for what each type does. ## Schedule the session @@ -20,7 +17,7 @@ for what each type does. Each session lives on a lesson. Create the lesson for what you'll run live, then open its **Settings** tab and fill in the **Live session** section. -![Lesson Settings tab showing the Live session fields for join link, date and time, and timezone](/live-class-session-settings.webp) +![Lesson Settings tab showing the Live session fields for join link, date and time, and timezone](/docs/live-class-session-settings.webp) @@ -28,7 +25,7 @@ the **Live session** section. ### Create a lesson to run live Add a lesson to the course for the session you'll hold live (for example, the webinar topic). See -[Creating Your First Course](/docs/create-first-course#adding-lessons) for adding lessons. +[Creating Your First Course](/guides/create-first-course#adding-lessons) for adding lessons. @@ -69,18 +66,18 @@ Once a session is scheduled, enrolled students automatically receive: - **A Join session button.** On their **LMS Home**, students see a **Join session** button on the course while a session is upcoming, which opens the join link directly. -![LMS Home Live Sessions card with a Join session button](/live-class-lms-card.webp) +![LMS Home Live Sessions card with a Join session button](/docs/live-class-lms-card.webp) In the course content sidebar, a live-session lesson shows a red live (broadcast) icon, so you and your students can spot it at a glance. -![Student live session card showing the countdown and Add to calendar button](/live-class-student-card.webp) +![Student live session card showing the countdown and Add to calendar button](/docs/live-class-student-card.webp) - +:::info Reminders are sent to enrolled students only. The times shown in emails and the calendar invite use the **Timezone** you set on the session. The welcome email, reminders, and updates all reference the same calendar event, so students never get a duplicate on their calendar. - +::: ## Change the session time @@ -89,24 +86,24 @@ saving asks you to confirm with **Notify students of the change?**. Choosing **S student about the update with a fresh calendar invite that updates the existing event on their calendar instead of creating a duplicate. -![Confirmation dialog asking to notify students of the session change](/live-class-change-time.webp) +![Confirmation dialog asking to notify students of the session change](/docs/live-class-change-time.webp) - +:::warning **Save and notify** emails all enrolled students. Use it when the time or link actually changed. For a first-time schedule there is nothing to notify, so it saves without sending. - +::: ## After the session Pair the session with a post-session quiz and a certificate to round out the workflow: -- Add a graded quiz with [How to Create an Exercise](/docs/create-exercise), then use **Notify students** +- Add a graded quiz with [How to Create an Exercise](/guides/create-exercise), then use **Notify students** to send everyone a link to take it. -- Issue completion certificates with [How to Create Certificates](/docs/certificates). +- Issue completion certificates with [How to Create Certificates](/guides/certificates). ## Related guides -- [Course Types](/docs/course-types): what Live class and the other types do -- [How to Create an Exercise](/docs/create-exercise): add a post-session quiz -- [How to Create Certificates](/docs/certificates): recognize completion -- [How Course Enrollment Works](/docs/course-enrollment): how students join the course +- [Course Types](/guides/course-types): what Live class and the other types do +- [How to Create an Exercise](/guides/create-exercise): add a post-session quiz +- [How to Create Certificates](/guides/certificates): recognize completion +- [How Course Enrollment Works](/guides/course-enrollment): how students join the course diff --git a/apps/docs/content/docs/org-landing-page.mdx b/apps/docs/content/docs/guides/org-landing-page.mdx similarity index 65% rename from apps/docs/content/docs/org-landing-page.mdx rename to apps/docs/content/docs/guides/org-landing-page.mdx index 60dbd42c..dd1feeca 100644 --- a/apps/docs/content/docs/org-landing-page.mdx +++ b/apps/docs/content/docs/guides/org-landing-page.mdx @@ -3,16 +3,13 @@ title: Customize Your Academy Landing Page description: Edit your academy landing page, including nav, hero buttons, footer, preview mode, and what the summary labels mean. --- -import { Callout } from 'fumadocs-ui/components/callout'; -import { Step, Steps } from 'fumadocs-ui/components/steps'; - Your **academy landing page** is the public homepage for your academy (for example `https://ciodevs.myclassroomio.com` or your custom domain). Students and prospects see it before they sign in. This guide covers the editor in **Settings → Landing Page**. -For org profile and subdomain setup, see [Customize Your Organization](/docs/customize-organization) and [Set Up a Custom Domain](/docs/custom-domain). +For org profile and subdomain setup, see [Customize Your Organization](/guides/customize-organization) and [Set Up a Custom Domain](/guides/custom-domain). - - Some landing themes require a paid plan. If the customize option is locked, upgrade or pick a theme included in your plan. - +:::warning[Paid plan required] +Some landing themes require a paid plan. If the customize option is locked, upgrade or pick a theme included in your plan. +::: ## Open the landing page settings @@ -50,11 +47,11 @@ The hero section supports a primary and optional secondary action. | **Primary** (e.g. Get Started, Start Learning) | Often points to `/login` | Label and destination URL | | **Secondary** (e.g. View Cohorts) | Optional second CTA | Label and destination URL | -Use your academy paths (for example `/login` or `/courses`) so visitors stay on your academy domain. After you verify a [custom domain](/docs/custom-domain), test buttons on the live site, not only in preview. +Use your academy paths (for example `/login` or `/courses`) so visitors stay on your academy domain. After you verify a [custom domain](/guides/custom-domain), test buttons on the live site, not only in preview. - - The thumbnail preview on the Landing Page settings screen renders with links disabled. Use **Open Academy** or open your live academy URL to test buttons like **Get Started** and **View Cohorts**. - +:::warning[Preview disables link clicks] +The thumbnail preview on the Landing Page settings screen renders with links disabled. Use **Open Academy** or open your live academy URL to test buttons like **Get Started** and **View Cohorts**. +::: ## Footer @@ -75,8 +72,8 @@ Always validate hero and footer links on the live site before sharing the URL ex ## Related guides -- [Customize Your Organization](/docs/customize-organization) — org name, logo, brand color -- [Set Up a Custom Domain](/docs/custom-domain) — use your own domain on the landing page -- [Sharing Your Academy (Open Graph & Favicon)](/docs/academy-sharing-and-branding) — how shared links pick up title, description, and preview image -- [Create a Course Landing Page](/docs/course-landingpage) — per-course public pages (separate from the org homepage) -- [Student Dashboard](/docs/student-dashboard) — where students go after signing in +- [Customize Your Organization](/guides/customize-organization) — org name, logo, brand color +- [Set Up a Custom Domain](/guides/custom-domain) — use your own domain on the landing page +- [Sharing Your Academy (Open Graph & Favicon)](/guides/academy-sharing-and-branding) — how shared links pick up title, description, and preview image +- [Create a Course Landing Page](/guides/course-landingpage) — per-course public pages (separate from the org homepage) +- [Student Dashboard](/student-dashboard) — where students go after signing in diff --git a/apps/docs/content/docs/roles-and-permissions.mdx b/apps/docs/content/docs/guides/roles-and-permissions.mdx similarity index 68% rename from apps/docs/content/docs/roles-and-permissions.mdx rename to apps/docs/content/docs/guides/roles-and-permissions.mdx index dd9cfba0..59c5675b 100644 --- a/apps/docs/content/docs/roles-and-permissions.mdx +++ b/apps/docs/content/docs/guides/roles-and-permissions.mdx @@ -3,8 +3,6 @@ title: Roles and Permissions description: Understand org roles in ClassroomIO, who can create courses, and how admin access differs from the student LMS. --- -import { Callout } from 'fumadocs-ui/components/callout'; - ClassroomIO uses organization roles to control what each person can do. This guide covers the three built-in roles, who can create courses, and how that relates to course enrollment (which is controlled separately per course). ## Organization roles @@ -15,11 +13,11 @@ ClassroomIO uses organization roles to control what each person can do. This gui | **Tutor** | Instructors, content authors | Yes | No | Yes (courses they teach) | | **Student** | Learners | No (LMS only) | No | No | -Admins have full control over organization settings, billing, domains, and all courses. Tutors can manage content for courses they are assigned to but cannot create new courses or change org-wide settings. Students use the [Student Dashboard](/docs/student-dashboard) to learn. +Admins have full control over organization settings, billing, domains, and all courses. Tutors can manage content for courses they are assigned to but cannot create new courses or change org-wide settings. Students use the [Student Dashboard](/student-dashboard) to learn. - - ClassroomIO does not support per-person flags like "this user can create courses but that user cannot." Access is set by role. To limit who joins a **course**, use course settings, invites, and **People** instead. See [How Course Enrollment Works](/docs/course-enrollment). - +:::info[Per-person enroll or create toggles] +ClassroomIO does not support per-person flags like "this user can create courses but that user cannot." Access is set by role. To limit who joins a **course**, use course settings, invites, and **People** instead. See [How Course Enrollment Works](/guides/course-enrollment). +::: ## Who can create courses @@ -38,7 +36,7 @@ Students sign in on your academy and land in the LMS. Admins and tutors can swit ## Inviting team members -To add Admins or Tutors, use [Inviting a Team Member](/docs/invite-team-member). Team invites are separate from [student course invites](/docs/invite-students). +To add Admins or Tutors, use [Inviting a Team Member](/guides/invite-team-member). Team invites are separate from [student course invites](/guides/invite-students). ## Organization signup vs course enrollment @@ -55,8 +53,8 @@ Configure org signup under **Settings → Organization**. Configure per-course a ## Related guides -- [How Course Enrollment Works](/docs/course-enrollment) — restrict who can join each course -- [How to Invite Students](/docs/invite-students) — course enrollment links -- [Inviting a Team Member](/docs/invite-team-member) — add admins and tutors -- [Student Dashboard](/docs/student-dashboard) — what students see in the LMS -- [Organization](/docs/organization) — org settings overview +- [How Course Enrollment Works](/guides/course-enrollment) — restrict who can join each course +- [How to Invite Students](/guides/invite-students) — course enrollment links +- [Inviting a Team Member](/guides/invite-team-member) — add admins and tutors +- [Student Dashboard](/student-dashboard) — what students see in the LMS +- [Organization](/organization) — org settings overview diff --git a/apps/docs/content/docs/take-attendance.mdx b/apps/docs/content/docs/guides/take-attendance.mdx similarity index 65% rename from apps/docs/content/docs/take-attendance.mdx rename to apps/docs/content/docs/guides/take-attendance.mdx index a82ce5f9..e13d26bb 100644 --- a/apps/docs/content/docs/take-attendance.mdx +++ b/apps/docs/content/docs/guides/take-attendance.mdx @@ -3,8 +3,6 @@ title: How to Take Attendance description: Record lesson attendance for each student in a course using the Attendance tab. --- -import { Callout } from 'fumadocs-ui/components/callout'; - The **Attendance** tab in a course lets you track which students attended each lesson. Only students who are enrolled in the course appear in the attendance grid — enroll them first via **People** if they are missing. It displays a grid with students as rows and lessons as columns. A checked box means the student was present; unchecked means absent. ## Mark attendance @@ -18,9 +16,9 @@ Changes save immediately — there is no separate save button. Use the search bar to filter students by name if the course has a large group. - - Students can view their own attendance record in the Attendance tab when they open the course in the LMS, but they cannot edit it. - +:::info[Students see read-only attendance] +Students can view their own attendance record in the Attendance tab when they open the course in the LMS, but they cannot edit it. +::: ## Pagination @@ -28,6 +26,6 @@ The table shows 10 students per page. Use the page controls at the bottom to mov ## Related guides -- [Creating Your First Course](/docs/create-first-course) — adding lessons to a course -- [How Course Enrollment Works](/docs/course-enrollment) — how students join a course -- [Course](/docs/course) — course overview and available tabs +- [Creating Your First Course](/guides/create-first-course) — adding lessons to a course +- [How Course Enrollment Works](/guides/course-enrollment) — how students join a course +- [Course](/course) — course overview and available tabs diff --git a/apps/docs/content/docs/use-math-in-editor.mdx b/apps/docs/content/docs/guides/use-math-in-editor.mdx similarity index 95% rename from apps/docs/content/docs/use-math-in-editor.mdx rename to apps/docs/content/docs/guides/use-math-in-editor.mdx index ff66a691..929b7911 100644 --- a/apps/docs/content/docs/use-math-in-editor.mdx +++ b/apps/docs/content/docs/guides/use-math-in-editor.mdx @@ -3,8 +3,6 @@ title: Use Math in the Editor description: Add and edit LaTeX math blocks and inline expressions inside the ClassroomIO rich text editor. --- -import { Step, Steps } from 'fumadocs-ui/components/steps'; - ClassroomIO’s rich text editor includes built-in math support with KaTeX rendering. You can insert inline expressions, add block equations, and edit them later without extra setup. diff --git a/apps/docs/content/docs/welcome-email.mdx b/apps/docs/content/docs/guides/welcome-email.mdx similarity index 74% rename from apps/docs/content/docs/welcome-email.mdx rename to apps/docs/content/docs/guides/welcome-email.mdx index c7ec791d..12078d1b 100644 --- a/apps/docs/content/docs/welcome-email.mdx +++ b/apps/docs/content/docs/guides/welcome-email.mdx @@ -3,9 +3,6 @@ title: Customize the Welcome Email description: Write a custom message that students receive automatically when they enroll in a course. --- -import { Callout } from 'fumadocs-ui/components/callout'; -import { Step, Steps } from 'fumadocs-ui/components/steps'; - Every course can send a personalized welcome email when a student enrolls. Use it to greet students, share what to expect, or include a link such as a live session URL. @@ -34,28 +31,28 @@ Save the course settings. Your message is now used for new enrollments. -![Course Settings Welcome email rich text editor](/welcome-email-editor.webp) +![Course Settings Welcome email rich text editor](/docs/welcome-email-editor.webp) ## How it sends The welcome email goes out automatically whenever a student enrolls, whether they self-enroll, accept an invite, or are added from the audience. Your message appears in the email above the standard "Sign in to the LMS" link. - +:::info Leave the **Welcome email** blank to use ClassroomIO's default welcome message. Formatting is cleaned for safe email delivery, so some advanced styling may be simplified. - +::: ## Live class courses: automatic session invite For a **Live class** course with a scheduled session, the welcome email also attaches a calendar invite for the next session, so students can add it to their calendar the moment they enroll. You do not set this up here; it is pulled from -the session you scheduled on the lesson. See [Run a Live Class](/docs/live-class). +the session you scheduled on the lesson. See [Run a Live Class](/guides/live-class). -![Rendered welcome email showing the Sign in to the LMS link and calendar invite attachment](/welcome-email-preview.webp) +![Rendered welcome email showing the Sign in to the LMS link and calendar invite attachment](/docs/welcome-email-preview.webp) ## Related guides -- [How to Invite Students](/docs/invite-students): add students to a course -- [How Course Enrollment Works](/docs/course-enrollment): the enrollment flow -- [Run a Live Class](/docs/live-class): include your session link in the welcome message +- [How to Invite Students](/guides/invite-students): add students to a course +- [How Course Enrollment Works](/guides/course-enrollment): the enrollment flow +- [Run a Live Class](/guides/live-class): include your session link in the welcome message diff --git a/apps/docs/content/docs/home.mdx b/apps/docs/content/docs/home.mdx deleted file mode 100644 index bcaa10a2..00000000 --- a/apps/docs/content/docs/home.mdx +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: Welcome to ClassroomIO -description: Learn how to create customer academies, partner certification programs, and employee training workflows in ClassroomIO. ---- - -ClassroomIO documentation for customer, partner, and employee education - -Welcome to the ClassroomIO documentation—your comprehensive guide to streamlining training for everyone. Our all-in-one platform empowers bootcamps, educators, and businesses to manage training programs easily. Run multiple classes and cohorts from a single UI with our mobile-first application, ensuring students can access all published content from any device. - -## What You'll Find Here - -This documentation covers everything from setup to usage, including: - -- **Core Features**: Well-detailed explanations of ClassroomIO's capabilities and how to take advantage of them -- **Developer & Designer Resources**: Everything needed to successfully contribute to the project -- **Practical Guides**: From simple functionalities to complex use cases - -If something isn't covered in this documentation, please feel free to [open an issue](https://github.com/classroomio/classroomio/issues) and we'll address it. - -## Get Started - -Ready to begin? Check out our [What is ClassroomIO](/docs/what-is-classroomio) page to learn about the platform's key features and capabilities. diff --git a/apps/docs/content/docs/index.mdx b/apps/docs/content/docs/index.mdx new file mode 100644 index 00000000..507d4296 --- /dev/null +++ b/apps/docs/content/docs/index.mdx @@ -0,0 +1,27 @@ +--- +title: Welcome to ClassroomIO +description: Documentation for ClassroomIO — guides for using the platform, contributing to it, and self-hosting it. +--- + +ClassroomIO documentation for customer, partner, and employee education + +Welcome to the ClassroomIO documentation. ClassroomIO is an all-in-one platform for bootcamps, +educators, and businesses to run training programs — multiple classes and cohorts from a single, +mobile-first UI. + +## Where to go next + + + + User guides for building and running your academy, plus developer guides for contributing. + + + Run ClassroomIO on your own infrastructure with Docker, Railway, Coolify, or Dokploy. + + + +If something isn't covered in this documentation, please +[open an issue](https://github.com/classroomio/classroomio/issues) and we'll address it. diff --git a/apps/docs/content/docs/mcp.mdx b/apps/docs/content/docs/mcp.mdx index c5fc2f1a..bd24378e 100644 --- a/apps/docs/content/docs/mcp.mdx +++ b/apps/docs/content/docs/mcp.mdx @@ -3,8 +3,6 @@ title: MCP description: Connect Claude Code, Codex, Cursor, OpenCode, and other MCP clients to ClassroomIO for draft-based course authoring. --- -import { Callout } from 'fumadocs-ui/components/callout'; - `@classroomio/mcp` is a thin stdio MCP server for ClassroomIO course authoring. It does not parse PDFs or generate course structures itself. The agent does that work. The MCP @@ -475,8 +473,8 @@ For broad revisions, prefer this sequence: That keeps major AI-assisted edits reviewable and explicit. - - Keep published drafts for history and auditability. Do not treat omission from a draft as an - instruction to delete live sections or lessons. Destructive changes should only happen through - explicit user intent. - +:::note[Operational Rule] +Keep published drafts for history and auditability. Do not treat omission from a draft as an +instruction to delete live sections or lessons. Destructive changes should only happen through +explicit user intent. +::: diff --git a/apps/docs/content/docs/meta.json b/apps/docs/content/docs/meta.json deleted file mode 100644 index aeb2bfea..00000000 --- a/apps/docs/content/docs/meta.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "pages": [ - "---Introduction---", - "home", - "what-is-classroomio", - "terminology", - "quickstart", - - "---Core Features---", - "course", - "cohorts", - "api", - "mcp", - "tags", - "audience", - "community", - "organization", - "student-dashboard", - - "---Enterprise---", - "enterprise-sso", - "token-auth", - - "---Get started---", - "create-first-course", - - "---Build a course---", - "course-types", - "create-exercise", - "grade-exercise", - "course-progression", - "use-math-in-editor", - "certificates", - - "---Live classes---", - "live-class", - "take-attendance", - - "---Enrollment & students---", - "course-enrollment", - "welcome-email", - "invite-students", - - "---Publish your academy---", - "course-landingpage", - "org-landing-page", - "academy-sharing-and-branding", - "custom-domain", - - "---Organization & team---", - "customize-organization", - "invite-team-member", - "roles-and-permissions", - - "---Contributor guides---", - "contributor-guides", - - "---Self Hosting---", - "self-hosted" - ] -} diff --git a/apps/docs/content/docs/organization.mdx b/apps/docs/content/docs/organization.mdx index 3a734886..05f2755e 100644 --- a/apps/docs/content/docs/organization.mdx +++ b/apps/docs/content/docs/organization.mdx @@ -3,40 +3,38 @@ title: Organization description: Overview of organizations in ClassroomIO — settings, branding, domains, roles, and related guides. --- -import { Callout } from 'fumadocs-ui/components/callout'; - An **organization** in ClassroomIO holds courses, people, branding, and your academy. Every admin and student belongs to an organization. This page points you to the right guides for setup and day-to-day management. ## What you configure at org level | Area | Where | Guide | | --- | --- | --- | -| Name, logo, brand color | **Settings → Organization** | [Customize Your Organization](/docs/customize-organization) | -| Public homepage | **Settings → Landing Page** | [Customize Your Academy Landing Page](/docs/org-landing-page) | -| Custom domain | **Settings → Organization** | [Set Up a Custom Domain](/docs/custom-domain) | -| Team roles | **Settings → Organization** | [Roles and Permissions](/docs/roles-and-permissions), [Inviting a Team Member](/docs/invite-team-member) | -| Signup rules, Internal Enrollment Only | **Settings → Authentication → General** | [How Course Enrollment Works](/docs/course-enrollment) (org access section) | +| Name, logo, brand color | **Settings → Organization** | [Customize Your Organization](/guides/customize-organization) | +| Public homepage | **Settings → Landing Page** | [Customize Your Academy Landing Page](/guides/org-landing-page) | +| Custom domain | **Settings → Organization** | [Set Up a Custom Domain](/guides/custom-domain) | +| Team roles | **Settings → Organization** | [Roles and Permissions](/guides/roles-and-permissions), [Inviting a Team Member](/guides/invite-team-member) | +| Signup rules, Internal Enrollment Only | **Settings → Authentication → General** | [How Course Enrollment Works](/guides/course-enrollment) (org access section) | ## Default URL -On creation, each org gets `https://.myclassroomio.com` as its academy URL. You can connect a [custom domain](/docs/custom-domain) so students use your own hostname. +On creation, each org gets `https://.myclassroomio.com` as its academy URL. You can connect a [custom domain](/guides/custom-domain) so students use your own hostname. - - Share your academy URL with students. The generic `app.classroomio.com` host is for platform access when no org subdomain applies. Course and enroll links should use your academy when possible. - +:::info[Academy vs admin app] +Share your academy URL with students. The generic `app.classroomio.com` host is for platform access when no org subdomain applies. Course and enroll links should use your academy when possible. +::: ## Courses and cohorts inside an org -- **Courses** are individual learning containers. See [Course](/docs/course). -- **Cohorts** group courses with shared goals. See [Cohorts](/docs/cohorts). -- **Students** use the [Student Dashboard](/docs/student-dashboard) after they sign in. +- **Courses** are individual learning containers. See [Course](/course). +- **Cohorts** group courses with shared goals. See [Cohorts](/cohorts). +- **Students** use the [Student Dashboard](/student-dashboard) after they sign in. ## Related guides -- [Customize Your Organization](/docs/customize-organization) -- [Customize Your Academy Landing Page](/docs/org-landing-page) -- [Set Up a Custom Domain](/docs/custom-domain) -- [Roles and Permissions](/docs/roles-and-permissions) -- [How Course Enrollment Works](/docs/course-enrollment) -- [Course](/docs/course) -- [Cohorts](/docs/cohorts) +- [Customize Your Organization](/guides/customize-organization) +- [Customize Your Academy Landing Page](/guides/org-landing-page) +- [Set Up a Custom Domain](/guides/custom-domain) +- [Roles and Permissions](/guides/roles-and-permissions) +- [How Course Enrollment Works](/guides/course-enrollment) +- [Course](/course) +- [Cohorts](/cohorts) diff --git a/apps/docs/content/docs/quickstart/meta.json b/apps/docs/content/docs/quickstart/meta.json deleted file mode 100644 index 78cbef96..00000000 --- a/apps/docs/content/docs/quickstart/meta.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "signup": "Sign Up", - "onboarding": "Onboarding" -} diff --git a/apps/docs/content/docs/quickstart/signup.mdx b/apps/docs/content/docs/quickstart/signup.mdx index 2a8c03c4..739d934c 100644 --- a/apps/docs/content/docs/quickstart/signup.mdx +++ b/apps/docs/content/docs/quickstart/signup.mdx @@ -3,9 +3,7 @@ title: Sign Up for ClassroomIO description: Get started with ClassroomIO by signing up for an account. --- -import { Step, Steps } from 'fumadocs-ui/components/steps'; - -If you're new to ClassroomIO, you must create an account to set up and launch your organization. By signing up, you'll gain access to all the [exciting features we offer](/docs/what-is-classroomio#key-features) to supercharge your classroom. +If you're new to ClassroomIO, you must create an account to set up and launch your organization. By signing up, you'll gain access to all the [exciting features we offer](/what-is-classroomio#key-features) to supercharge your classroom. @@ -13,7 +11,7 @@ If you're new to ClassroomIO, you must create an account to set up and launch yo Navigate to [app.classroomio.com](https://app.classroomio.com) and click the **Signup** button at the top right corner of the page. -![ClassroomIO website with a navigation bar at the top of the page containing the logo on the left along with the login and signup button on the right. Also, the page contains an email field with a Join waiting list button.](/dashboard-homepage-signedout.webp) +![ClassroomIO website with a navigation bar at the top of the page containing the logo on the left along with the login and signup button on the right. Also, the page contains an email field with a Join waiting list button.](/docs/dashboard-homepage-signedout.webp) @@ -24,7 +22,7 @@ On the signup page, enter your **valid email address**. Next, create a secure pa You can also sign up using your Google account. -![ClassroomIO sign-up page with a sign-up form containing inputs for Your Name, Your Password, and, Confirm Password. At the bottom, there is a Create Account button, a Sign up with Google button, and, a link to log in if you already have an account.](/signup-page.webp) +![ClassroomIO sign-up page with a sign-up form containing inputs for Your Name, Your Password, and, Confirm Password. At the bottom, there is a Create Account button, a Sign up with Google button, and, a link to log in if you already have an account.](/docs/signup-page.webp) @@ -33,11 +31,11 @@ You can also sign up using your Google account. After completing the Signup form, you'll be redirected to the **Onboarding** page. There, you'll provide your **Full Name** and **Name of Organization.** As you enter your organization name, the **Organization Site Name** field will auto-fill. To proceed, click **Continue**. -![ClassroomIO onboarding page with a form containing inputs for Full Name, Name of Organization, and, Organization Site Name. At the bottom, there is a Continue button.](/onboarding-page1.webp) +![ClassroomIO onboarding page with a form containing inputs for Full Name, Name of Organization, and, Organization Site Name. At the bottom, there is a Continue button.](/docs/onboarding-page1.webp) Next, you'll complete a brief survey regarding what brought you to ClassroomIO and how you discovered our platform. Your responses will help us tailor ClassroomIO's features to best suit your needs. Finally, click **Continue** to submit. -![ClassroomIO second slide of onboarding page with a questionnaire](/onboarding-page2.webp) +![ClassroomIO second slide of onboarding page with a questionnaire](/docs/onboarding-page2.webp) @@ -46,14 +44,14 @@ Next, you'll complete a brief survey regarding what brought you to ClassroomIO a You are successfully signed up and ready to use ClassroomIO when you see the dashboard. -![ClassroomIO dashboard with a big pop-up containing a welcome message](/dashboard-homepage-signedin.webp) +![ClassroomIO dashboard with a big pop-up containing a welcome message](/docs/dashboard-homepage-signedin.webp) ### What Next? -After signing up successfully, you can now set up and [customize your Organization](/docs/customize-organization). +After signing up successfully, you can now set up and [customize your Organization](/guides/customize-organization). diff --git a/apps/docs/content/docs/self-hosted/configuration/csp.mdx b/apps/docs/content/docs/self-hosted/configuration/csp.mdx new file mode 100644 index 00000000..df5ed25f --- /dev/null +++ b/apps/docs/content/docs/self-hosted/configuration/csp.mdx @@ -0,0 +1,41 @@ +--- +title: CSP / allowed domains +description: Allow the external CDN, font, media, and frame domains your self-hosted dashboard needs to load. +--- + +When `PUBLIC_IS_SELFHOSTED=true`, the dashboard ships a strict Content Security Policy that allows only +`'self'`. If you load assets from external domains — a CDN, custom fonts, embedded video, an external +media/storage host — you must add those domains, or the browser blocks them. + +## Variables + +Set the broad override, or the per-directive variables for finer control. All are **comma-separated** +lists of domains. + +| Variable | Description | +|----------|-------------| +| `ALLOWED_EXTERNAL_DOMAINS` | Overrides all per-directive vars below with one allowlist | +| `CSP_SCRIPT_SRC_DOMAINS` | Domains allowed in `script-src` | +| `CSP_STYLE_SRC_DOMAINS` | Domains allowed in `style-src` | +| `CSP_CONNECT_SRC_DOMAINS` | Domains allowed in `connect-src` | +| `CSP_FRAME_SRC_DOMAINS` | Domains allowed in `frame-src` | +| `CSP_FONT_SRC_DOMAINS` | Domains allowed in `font-src` | +| `CSP_MEDIA_SRC_DOMAINS` | Domains allowed in `img-src` and `media-src` | + +```zsh title=".env" +# One broad allowlist… +ALLOWED_EXTERNAL_DOMAINS=https://fonts.googleapis.com,https://storage.yourdomain.com +# …or per-directive, e.g. just your object-storage host for uploaded media: +CSP_MEDIA_SRC_DOMAINS=https://storage.yourdomain.com +``` + +:::note[Runtime — no rebuild needed] +CSP domain variables are read at **container startup**. Change them and restart the container — you do +not need to rebuild any image. +::: + +:::warning[You don't need to add the API] +Normal dashboard traffic is proxied to the API **same-origin**, so the API host does not need to be in +the CSP. Add external hosts only — your CDN, video provider, font host, and object-storage/media domain +(the most common one, so browsers can load uploaded media). +::: diff --git a/apps/docs/content/docs/self-hosted/configuration/email.mdx b/apps/docs/content/docs/self-hosted/configuration/email.mdx new file mode 100644 index 00000000..7c85e5aa --- /dev/null +++ b/apps/docs/content/docs/self-hosted/configuration/email.mdx @@ -0,0 +1,38 @@ +--- +title: Email (SMTP) +description: Configure SMTP so ClassroomIO can send signup verification, password reset, and invite emails. +--- + +ClassroomIO sends transactional email — **signup verification, password resets, and invite emails** — +over SMTP. Without it the app still runs, but it can't send any of those messages, so have mail +credentials ready before you deploy. + +## Variables + +| Variable | Description | +|----------|-------------| +| `SMTP_HOST` | SMTP server hostname | +| `SMTP_PORT` | SMTP server port (commonly `587`) | +| `SMTP_USER` | SMTP username | +| `SMTP_PASSWORD` | SMTP password | +| `SMTP_SENDER` | From address, e.g. `ClassroomIO ` | + +```zsh title=".env" +SMTP_HOST=smtp.yourprovider.com +SMTP_PORT=587 +SMTP_USER= +SMTP_PASSWORD= +SMTP_SENDER=ClassroomIO +``` + +:::note[Which services need SMTP] +The **jobs** worker sends the mail, and the **api** reads the same values. On Docker they come from the +single root `.env`; on Railway set them on `cio-jobs` (and `cio-api`); on Coolify they apply to the +whole compose stack. The jobs worker won't send invites or notifications if SMTP is unset. +::: + +## Providers + +Any standard SMTP provider works — including transactional services such as **Zoho / ZeptoMail**, +Postmark, Resend (SMTP), Amazon SES, or Mailgun. See the +[Nodemailer SMTP docs](https://nodemailer.com/smtp/) for provider-specific setup and port/TLS options. diff --git a/apps/docs/content/docs/self-hosted/configuration/index.mdx b/apps/docs/content/docs/self-hosted/configuration/index.mdx new file mode 100644 index 00000000..3beb99b6 --- /dev/null +++ b/apps/docs/content/docs/self-hosted/configuration/index.mdx @@ -0,0 +1,47 @@ +--- +title: Configuration +description: Shared configuration reference for self-hosting ClassroomIO — secrets, email, storage, CSP, integrations, licensing, and versions. +--- + +However you deploy ClassroomIO — [Docker](/self-hosted/docker), [Railway](/self-hosted/railway), or +[Coolify](/self-hosted/coolify) — the stack reads the **same set of environment variables**. This +section is the single source of truth for what each group of variables does. The provider guides show +you *where* to set them for that platform; these pages explain *what* to set and *why*. + +## How to read these pages + +ClassroomIO is configured entirely through environment variables. On Docker they live in one root +`.env` file that every `docker compose` command reads via `--env-file .env`; on Railway and Coolify you +set the same variables on each service. + +:::note[Value = required, blank = optional] +Throughout these pages and the provider guides, a variable shown **with a value** is one you should +set for a working deployment. A variable left **blank after `=`** is optional — fill it in only if you +use that feature. Leaving an optional variable blank never causes a build or boot error. +::: + +## Configuration topics + + + + Generate `BETTER_AUTH_SECRET` and `PRIVATE_SERVER_KEY` — the stack won't boot without them. + + + SMTP for signup verification, password resets, and invite emails. + + + MinIO or S3/R2 for file and video uploads, plus upload size limits. + + + Allow the CDN, font, and media domains your dashboard needs to load. + + + Google OAuth, Unsplash, OpenAI transcription and AI course generation. + + + Set `LICENSE_KEY` to unlock Enterprise features such as SSO. + + + Pin `CIO_VERSION`, upgrade safely, and roll back. + + diff --git a/apps/docs/content/docs/self-hosted/configuration/integrations.mdx b/apps/docs/content/docs/self-hosted/configuration/integrations.mdx new file mode 100644 index 00000000..805a3c00 --- /dev/null +++ b/apps/docs/content/docs/self-hosted/configuration/integrations.mdx @@ -0,0 +1,48 @@ +--- +title: Integrations +description: Optional integrations for self-hosted ClassroomIO — Google OAuth, Unsplash, OpenAI, and branding. +--- + +These integrations are all **optional** — ClassroomIO runs without any of them. Add a variable only if +you use that feature; leaving it blank never causes a build or boot error. + +## Google OAuth + +Let users sign in with Google. + +| Variable | Description | +|----------|-------------| +| `GOOGLE_CLIENT_ID` | Google OAuth client ID | +| `GOOGLE_CLIENT_SECRET` | Google OAuth client secret | + +## OpenAI (transcription & AI course generation) + +Powers video transcription and AI course generation. These jobs run on the **jobs** worker, so set the +key wherever the worker reads its environment. + +| Variable | Description | +|----------|-------------| +| `OPENAI_API_KEY` | OpenAI API key — transcription + AI course generation | + +## Unsplash + +Enables the in-app Unsplash image search. + +| Variable | Description | +|----------|-------------| +| `UNSPLASH_API_KEY` | Unsplash API access key | + +## Branding & routing + +| Variable | Description | +|----------|-------------| +| `PUBLIC_APP_TITLE` | Custom app title | +| `PUBLIC_APP_DESCRIPTION` | Custom app description / meta tag | +| `PUBLIC_OG_IMAGE_URL` | Custom Open Graph image URL | +| `PRIVATE_APP_HOST` | Dashboard host for multi-subdomain routing | +| `PRIVATE_APP_SUBDOMAINS` | Subdomains served by the dashboard | + +:::note[Enterprise features] +`LICENSE_KEY` unlocks Enterprise-only integrations such as SSO — see +[SSO & licensing](/self-hosted/configuration/sso). +::: diff --git a/apps/docs/content/docs/self-hosted/configuration/secrets.mdx b/apps/docs/content/docs/self-hosted/configuration/secrets.mdx new file mode 100644 index 00000000..29965e92 --- /dev/null +++ b/apps/docs/content/docs/self-hosted/configuration/secrets.mdx @@ -0,0 +1,56 @@ +--- +title: Environment & secrets +description: Generate the two secrets ClassroomIO needs to boot — BETTER_AUTH_SECRET and PRIVATE_SERVER_KEY. +--- + +ClassroomIO needs two secrets before it will run. Generate them once, keep them safe, and reuse the +same values across the services that need them. + +## The two secrets + +```zsh title="Terminal" +openssl rand -hex 32 # BETTER_AUTH_SECRET +openssl rand -hex 32 # PRIVATE_SERVER_KEY (must be identical in the api and dashboard) +``` + +| Variable | What it's for | Where it goes | +|----------|---------------|---------------| +| `BETTER_AUTH_SECRET` | Signs authentication sessions. | The **api** service. | +| `PRIVATE_SERVER_KEY` | Authenticates server-side dashboard → API requests. | **Both** the api and dashboard — the value must be **identical** in each. | + +:::danger[The stack won't start without them] +The compose file **fails fast** if `BETTER_AUTH_SECRET` or `PRIVATE_SERVER_KEY` is empty — the +containers refuse to boot rather than run with a predictable, guessable session-signing secret. Set +both to a strong random value (e.g. `openssl rand -hex 32`). +::: + +:::note[Who generates them] +Only the source-build path's `run-docker-full-stack.sh` auto-generates these when missing. The +pre-built image path, Railway, and Coolify do **not** run that script — you generate the secrets +yourself and paste them in. +::: + +## Database credentials + +Postgres runs inside the stack (or as a managed plugin on Railway). Set a strong password — the +defaults are for local use only. + +| Variable | Description | Default | +|----------|-------------|---------| +| `POSTGRES_DB` | Database name | `classroomio` | +| `POSTGRES_USER` | Database user | `postgres` | +| `POSTGRES_PASSWORD` | Database password — set a **strong** value in production | `postgres` | + +## Mode & routing basics + +| Variable | Description | Default | +|----------|-------------|---------| +| `PUBLIC_IS_SELFHOSTED` | Self-hosted mode flag | `true` | +| `PRIVATE_SERVER_URL` | Internal API URL for server-side rendering (over the container network) | `http://api:3081` | +| `DASHBOARD_ORIGIN` | Public dashboard origin, used as the auth base URL and in invite/email links | `http://localhost:3082` | + +:::warning[Use an `https://` origin in production] +`DASHBOARD_ORIGIN` (and `ORIGIN` on the dashboard) must be the real `https://` URL your users visit — +auth session cookies are `Secure`, so login silently fails over plain HTTP on any public domain. See +[Self Hosting → HTTPS is required in production](/self-hosted#https-is-required-in-production). +::: diff --git a/apps/docs/content/docs/self-hosted/configuration/sso.mdx b/apps/docs/content/docs/self-hosted/configuration/sso.mdx new file mode 100644 index 00000000..935d4576 --- /dev/null +++ b/apps/docs/content/docs/self-hosted/configuration/sso.mdx @@ -0,0 +1,34 @@ +--- +title: SSO & licensing +description: Set LICENSE_KEY to unlock Enterprise features such as SSO on your self-hosted ClassroomIO. +--- + +Enterprise-only features — **SSO**, **token auth**, and no-tracking mode — require an Enterprise +**license key**. If you don't use any Enterprise feature, you don't need a key; leave `LICENSE_KEY` +unset and everything else works. + +## Setting `LICENSE_KEY` + +`LICENSE_KEY` is read by the **api** service. Set it wherever that service takes its environment: + +| Deployment | Where to set it | +|------------|-----------------| +| Local development | `apps/api/.env` | +| Docker Compose | repository root `.env` | +| Railway | the `cio-api` service environment | +| Coolify | the resource's environment variables | + +```zsh title=".env" +LICENSE_KEY= +``` + +## Getting a license + +[Book a call](http://cal.com/classroomio/enterprise) to get an Enterprise license key. + +## Feature docs + +Once the key is set, configure the features themselves: + +- [Enterprise SSO](/enterprise-sso) — Single Sign-On with OIDC (Okta, Azure AD, and more). +- [Token Auth](/token-auth) — issue signed tokens to log users in from your own app. diff --git a/apps/docs/content/docs/self-hosted/configuration/storage.mdx b/apps/docs/content/docs/self-hosted/configuration/storage.mdx new file mode 100644 index 00000000..241ddd50 --- /dev/null +++ b/apps/docs/content/docs/self-hosted/configuration/storage.mdx @@ -0,0 +1,74 @@ +--- +title: Object storage & uploads +description: Configure object storage (MinIO or S3-compatible) for file and video uploads, plus upload size limits. +--- + +ClassroomIO stores uploaded files and videos in **object storage**. You have two choices: run the +**bundled MinIO** alongside the stack, or point ClassroomIO at an **external S3-compatible** service +(AWS S3, Cloudflare R2, etc.). Both speak the S3 API and use the same `OBJECT_STORAGE_*` variables. + +## Option 1 — Bundled MinIO (default) + +The Docker and Coolify compose files include **MinIO** under the `minio` profile, and the startup +script auto-configures it. You only change these for custom credentials. + +| Variable | Default | +|----------|---------| +| `MINIO_ROOT_USER` | randomized by the script (`minioadmin` if you skip it) | +| `MINIO_ROOT_PASSWORD` | randomized by the script (`minioadmin` if you skip it) | +| `OBJECT_STORAGE_ENDPOINT` | `http://minio:9000` | +| `OBJECT_STORAGE_PUBLIC_ENDPOINT` | `http://localhost:9000` | +| `OBJECT_STORAGE_ACCESS_KEY_ID` | matches `MINIO_ROOT_USER` | +| `OBJECT_STORAGE_SECRET_ACCESS_KEY` | matches `MINIO_ROOT_PASSWORD` | +| `OBJECT_STORAGE_FORCE_PATH_STYLE` | `true` (required for MinIO) | +| `OBJECT_STORAGE_MEDIA_PUBLIC_BASE_URL` | `http://localhost:9000/media` | + +:::warning[MinIO is your durability boundary] +Single-node MinIO has no redundancy — its volume is the only thing protecting your uploads. Give it +**persistent storage** and **back it up**. If you'd rather not operate storage yourself, use external +**Cloudflare R2 / AWS S3** instead (R2 has no egress fees) — see below. +::: + +## Option 2 — External S3 / Cloudflare R2 + +The `OBJECT_STORAGE_*` variables speak the S3 API, so they work with **any S3-compatible provider**, +including Cloudflare R2 and AWS S3. Point them at the provider and start **without** the bundled MinIO +(`./run-docker-full-stack.sh --no-minio`, or leave the `minio` profile off). + +| Variable | Description | +|----------|-------------| +| `OBJECT_STORAGE_ENDPOINT` | Provider endpoint the app uploads to (for R2: `https://.r2.cloudflarestorage.com`) | +| `OBJECT_STORAGE_PUBLIC_ENDPOINT` | Public endpoint browsers download from | +| `OBJECT_STORAGE_ACCESS_KEY_ID` / `OBJECT_STORAGE_SECRET_ACCESS_KEY` | Provider credentials | +| `OBJECT_STORAGE_REGION` | Region (some providers require it; `auto` for R2) | +| `OBJECT_STORAGE_FORCE_PATH_STYLE` | `true` for MinIO; `false` for R2 | +| `OBJECT_STORAGE_MEDIA_PUBLIC_BASE_URL` | Public base URL for media (`…/media`) | +| `OBJECT_STORAGE_BUCKET_VIDEOS` / `_DOCUMENTS` / `_MEDIA` | Bucket names (default `videos`, `documents`, `media`) | + +:::note[Legacy `CLOUDFLARE_*` variables] +ClassroomIO also accepts a legacy Cloudflare R2 config (`CLOUDFLARE_ACCOUNT_ID`, `CLOUDFLARE_ACCESS_KEY`, +`CLOUDFLARE_SECRET_ACCESS_KEY`, …). It is a **fallback** used only when the `OBJECT_STORAGE_*` variables +are absent — prefer `OBJECT_STORAGE_*` for new deployments (it covers R2 too). For step-by-step R2 bucket +and CORS setup, see the [Cloudflare Setup](/guides/contributing/cloudflare-setup) guide. +::: + +## Upload file size limits + +Set these to raise or lower upload caps (values are in **megabytes**). Compose passes them through to +the `api` and `dashboard` containers. Unset = built-in defaults. On [Railway](/self-hosted/railway) or +[Coolify](/self-hosted/coolify), set the **same** values on both the API and dashboard services. + +| Variable | Default | Applies to | +|----------|---------|------------| +| `UPLOAD_MAX_DOCUMENT_MB` | 5 | Course lesson documents | +| `UPLOAD_MAX_IMAGE_MB` | 5 | Avatars, media library, editor images | +| `UPLOAD_MAX_VIDEO_MB` | 800 | Lesson video uploads | +| `UPLOAD_MAX_EXERCISE_FILE_MB` | 2 | Student assignment file-upload questions | +| `UPLOAD_MAX_AGENT_DOCUMENT_MB` | 5 | AI assistant document uploads | +| `UPLOAD_MAX_LANDING_IMAGE_MB` | 0.5 | Org landing page cover images | +| `UPLOAD_MAX_THUMBNAIL_MB` | 5 | Media thumbnail uploads | + +:::warning[Reverse proxy limits] +If you raise these values, also increase your reverse proxy body-size limit (e.g. nginx +`client_max_body_size`) so large uploads aren't rejected before they reach ClassroomIO. +::: diff --git a/apps/docs/content/docs/self-hosted/configuration/versions.mdx b/apps/docs/content/docs/self-hosted/configuration/versions.mdx new file mode 100644 index 00000000..40159e0d --- /dev/null +++ b/apps/docs/content/docs/self-hosted/configuration/versions.mdx @@ -0,0 +1,53 @@ +--- +title: Versions & upgrades +description: Pin CIO_VERSION, upgrade ClassroomIO safely, and roll back to a previous release. +--- + +ClassroomIO publishes versioned images. `CIO_VERSION` controls which tag you run. + +## Choosing a tag + +- **Pin an exact release** (e.g. `1.0.0`) in production, so a merge to `main` never restarts you onto + changed images unattended. +- `latest` is the freshest `main` build — it moves on **every merge** (rolling; may include unreleased + code). The version tags (`1.0.0`, `1.0`, `1`) are the immutable, pinned releases. + +```zsh title=".env" +CIO_VERSION=1.0.0 # pin a release; blank or "latest" = rolling main build +``` + +:::note[Confirm the tag exists] +Before deploying, confirm the tag you set actually exists at +[hub.docker.com/r/classroomio](https://hub.docker.com/r/classroomio/). +::: + +## Upgrading + +### Pre-built images (Docker) + +Bump `CIO_VERSION` in `.env`, then re-pull and recreate: + +```zsh title="Terminal" +docker compose -f docker-compose.images.yaml --env-file .env --profile minio pull +docker compose -f docker-compose.images.yaml --env-file .env --profile minio up -d +``` + +### Build from source (Docker) + +`git pull`, then re-run `./run-docker-full-stack.sh --build` to rebuild. + +### Railway / Coolify + +Set `CIO_VERSION` to the newer release and redeploy. Because you pin a version, a new release never +restarts you onto changed images unattended. + +## Rolling back + +Set `CIO_VERSION` back to the previous release and run the same upgrade command (or redeploy). Pinned +versions make rollbacks reproducible. + +:::warning[Back up before upgrading] +Database schema migrations run **automatically** when the API starts. Back up your Postgres volume +(and object storage) before a major upgrade, and avoid `docker compose down -v` / `docker volume prune`, +which delete your data volumes. +::: diff --git a/apps/docs/content/docs/self-hosted/coolify.mdx b/apps/docs/content/docs/self-hosted/coolify.mdx index b2243144..73908285 100644 --- a/apps/docs/content/docs/self-hosted/coolify.mdx +++ b/apps/docs/content/docs/self-hosted/coolify.mdx @@ -3,9 +3,6 @@ title: Coolify description: Deploy ClassroomIO on Coolify using the pull-based Docker Compose stack, with a video walkthrough. --- -import { Callout } from 'fumadocs-ui/components/callout'; -import { Step, Steps } from 'fumadocs-ui/components/steps'; - [Coolify](https://coolify.io) is a self-hosted PaaS (an open-source Heroku/Netlify alternative) you run on your own VPS. It runs ClassroomIO from the published `classroomio/*` images — your Coolify host **pulls** them and never builds anything. ## Watch the walkthrough @@ -13,9 +10,7 @@ import { Step, Steps } from 'fumadocs-ui/components/steps'; Prefer to follow along? This video walks through the whole Coolify deployment end to end. The written steps below mirror it, and the [Environment variable reference](#environment-variable-reference) has every value to copy. {/* TODO: replace REPLACE_WITH_VIDEO_ID with the Coolify walkthrough video id once recorded */} -
- -
+ ## Prerequisites @@ -24,15 +19,17 @@ Prefer to follow along? This video walks through the whole Coolify deployment en - An **SMTP provider** (or Zoho/ZeptoMail) for signup verification, password reset, and invite emails. See [Nodemailer SMTP docs](https://nodemailer.com/smtp/). - *Optional:* an **OpenAI API key** (transcription + AI course generation) and Google OAuth / Unsplash keys. - - You'll reuse `BETTER_AUTH_SECRET` and `PRIVATE_SERVER_KEY` across services. Coolify does **not** - run our secret-generation script, so generate them once yourself and keep them handy: +:::note[Two secrets to generate first] +You'll reuse `BETTER_AUTH_SECRET` and `PRIVATE_SERVER_KEY` across services. Coolify does **not** +run our secret-generation script, so generate them once yourself and keep them handy: - ```zsh title="Terminal" - openssl rand -hex 32 # BETTER_AUTH_SECRET - openssl rand -hex 32 # PRIVATE_SERVER_KEY (must be identical in the api and dashboard services) - ``` - +```zsh title="Terminal" +openssl rand -hex 32 # BETTER_AUTH_SECRET +openssl rand -hex 32 # PRIVATE_SERVER_KEY (must be identical in the api and dashboard services) +``` + +See [Configuration → Environment & secrets](/self-hosted/configuration/secrets) for what each does. +::: ## Step-by-step walkthrough @@ -45,7 +42,7 @@ This uses a **Docker Compose resource**: you paste the compose file and set ever Log in to Coolify and **create a project**. When you add a resource, Coolify asks what type it is — GitHub, a Docker image, a service, or a **Docker Compose** file. Choose **Docker Compose**, then **paste the contents of [`docker-compose.images.yaml`](https://github.com/classroomio/classroomio/blob/main/docker-compose.images.yaml)** into the editor. -![Showing list of options to choose from](/coolify-02-services.webp) +![Showing list of options to choose from](/docs/coolify-02-services.webp) @@ -53,8 +50,8 @@ Log in to Coolify and **create a project**. When you add a resource, Coolify ask ### Confirm the services parsed After saving, Coolify parses the compose file and lists the services: `postgres`, `redis`, `api`, `dashboard`, `jobs` (and `minio` once you enable its profile in the next step). Confirm they all appear before moving on. -![Select composer file type](/coolify-01-add-resource.webp) -![Coolify showing the parsed ClassroomIO services](/coolify-02-services.webp) +![Select composer file type](/docs/coolify-01-add-resource.webp) +![Coolify showing the parsed ClassroomIO services](/docs/coolify-02-services.webp) @@ -79,15 +76,15 @@ SMTP_SENDER=ClassroomIO 👉 The essentials above get you started, but the complete list of what to set — object storage, domains, and every optional variable — is in the [**Environment variable reference**](#environment-variable-reference) below. Copy that full block before you deploy. - - There's no way to guess which variables Coolify needs, so the [Environment variable - reference](#environment-variable-reference) spells it out. The rule is simple: **every variable - shown with a value must be set** for a smooth deployment (secrets, database, domains, object - storage, and SMTP are all needed). **Every variable left blank after `=` is optional** — fill it in - only if you use that integration. Leaving an optional one blank never causes a build or boot error. - +:::note[How to read the reference: value = required, blank = optional] +There's no way to guess which variables Coolify needs, so the [Environment variable +reference](#environment-variable-reference) spells it out. The rule is simple: **every variable +shown with a value must be set** for a smooth deployment (secrets, database, domains, object +storage, and SMTP are all needed). **Every variable left blank after `=` is optional** — fill it in +only if you use that integration. Leaving an optional one blank never causes a build or boot error. +::: -![Setting the environment variables in Coolify](/coolify-03-env-vars.webp) +![Setting the environment variables in Coolify](/docs/coolify-03-env-vars.webp) @@ -95,14 +92,14 @@ SMTP_SENDER=ClassroomIO `CIO_VERSION` chooses the tag pulled for `classroomio/{api,dashboard,jobs}`. **Confirm the tag you use actually exists** at [hub.docker.com/r/classroomio](https://hub.docker.com/r/classroomio/) before deploying. - - Set `CIO_VERSION=1.0.0` to pin an exact release. `latest` is the freshest `main` build — it moves - on every merge (rolling; may include unreleased code), while the version tags (`1.0.0`, `1.0`, `1`) - are immutable, pinned releases. Pinning an exact release makes upgrades deliberate and deploys - reproducible. - +:::note[Pin a released version] +Set `CIO_VERSION=1.0.0` to pin an exact release. `latest` is the freshest `main` build — it moves +on every merge (rolling; may include unreleased code), while the version tags (`1.0.0`, `1.0`, `1`) +are immutable, pinned releases. Pinning an exact release makes upgrades deliberate and deploys +reproducible. +::: -![Confirming the classroomio image tags on Docker Hub](/coolify-04-image-tag.webp) +![Confirming the classroomio image tags on Docker Hub](/docs/coolify-04-image-tag.webp) @@ -112,7 +109,7 @@ Open the **dashboard** service → **Settings** and set its domain, including th The dashboard proxies API calls server-side, so you normally only expose the dashboard publicly — the `api` service stays internal. -![Setting the dashboard service domain in Coolify](/coolify-05-dashboard-domain.webp) +![Setting the dashboard service domain in Coolify](/docs/coolify-05-dashboard-domain.webp) @@ -120,7 +117,7 @@ The dashboard proxies API calls server-side, so you normally only expose the das Click **Deploy**. Coolify pulls `classroomio/{api,dashboard,jobs}:${CIO_VERSION}`, starts Postgres + Redis, the API container runs database setup on first boot, then the dashboard and the **jobs worker** come up. Watch the **logs** — they tell you when every service is up. -![Coolify deploy logs showing the stack coming up](/coolify-06-deploy-logs.webp) +![Coolify deploy logs showing the stack coming up](/docs/coolify-06-deploy-logs.webp) @@ -128,7 +125,7 @@ Click **Deploy**. Coolify pulls `classroomio/{api,dashboard,jobs}:${CIO_VERSION} Once the logs show the stack is healthy, open your dashboard URL (`https://dash.yourdomain.com`) in a new browser tab and **sign up**. The **first** account becomes the organization **admin**. Every signup or sign-in after that joins as a student — unless you invite them with a specific role. -![The running ClassroomIO dashboard sign-up page](/railway-12-signup.webp) +![The running ClassroomIO dashboard sign-up page](/docs/railway-12-signup.webp) @@ -137,11 +134,11 @@ Once the logs show the stack is healthy, open your dashboard URL (`https://dash. You set these on the resource's Environment Variables page (Step 3). This is the complete picture — copy the block below, then replace the placeholder values with your own. - - **Every variable shown with a value below is required** for a working deployment. **Every variable - left blank after `=` is optional** — fill it in only if you use that feature. A blank optional - variable never causes a build or boot error, so don't put junk into fields you aren't using. - +:::note[Value = required, blank = optional] +**Every variable shown with a value below is required** for a working deployment. **Every variable +left blank after `=` is optional** — fill it in only if you use that feature. A blank optional +variable never causes a build or boot error, so don't put junk into fields you aren't using. +::: ```zsh title=".env — a complete working Coolify deployment" # ── Secrets (generate with: openssl rand -hex 32) ── @@ -228,12 +225,12 @@ SKIP_DB_SETUP= # blank = run DB setup on first boot (leave blank) | `CSP_MEDIA_SRC_DOMAINS` | Your storage domain — otherwise the browser's CSP blocks uploaded media. | | `SMTP_HOST` / `SMTP_PORT` / `SMTP_USER` / `SMTP_PASSWORD` / `SMTP_SENDER` | SMTP server for signup verification, password reset, and invites. | - - Of the above, `BETTER_AUTH_SECRET` and `PRIVATE_SERVER_KEY` are the two the compose file - **fails fast** on: leave either empty and the containers refuse to boot (so ClassroomIO never runs - with a predictable session-signing secret). The rest won't abort the boot, but the deployment - won't work correctly without them — set them all. - +:::warning[If the stack won't start at all] +Of the above, `BETTER_AUTH_SECRET` and `PRIVATE_SERVER_KEY` are the two the compose file +**fails fast** on: leave either empty and the containers refuse to boot (so ClassroomIO never runs +with a predictable session-signing secret). The rest won't abort the boot, but the deployment +won't work correctly without them — set them all. +::: ### Optional — leave blank unless you need them @@ -253,31 +250,29 @@ SKIP_DB_SETUP= # blank = run DB setup on first boot (leave blank) ### Object storage -Recommended: the **bundled MinIO** — enable its profile with `COMPOSE_PROFILES=minio` and Coolify -runs MinIO alongside the stack. Give the MinIO volume persistent storage in Coolify and route its -public URL (`OBJECT_STORAGE_PUBLIC_ENDPOINT` / `OBJECT_STORAGE_MEDIA_PUBLIC_BASE_URL`) so browsers -can load media. Prefer fully-managed storage instead? Point the same `OBJECT_STORAGE_*` variables -at external **S3 / Cloudflare R2** and leave the `minio` profile off — see the -[Cloudflare Setup](/docs/contributor-guides/cloudflare-setup) guide for R2. +Enable the **bundled MinIO** with `COMPOSE_PROFILES=minio` and Coolify runs it alongside the stack. +**Give the MinIO volume persistent storage in Coolify** and route its public URL +(`OBJECT_STORAGE_PUBLIC_ENDPOINT` / `OBJECT_STORAGE_MEDIA_PUBLIC_BASE_URL`) so browsers can load media. - - Single-node MinIO has no redundancy — its volume is the only thing protecting your uploads. Give - it persistent storage in Coolify and back it up. If you'd rather not operate storage, use external - **Cloudflare R2 / AWS S3** instead (R2 has no egress fees): point the same `OBJECT_STORAGE_*` - vars at the provider. - +:::warning[MinIO is your durability boundary] +Single-node MinIO has no redundancy — its volume is the only thing protecting your uploads, so give it +persistent storage in Coolify and back it up. +::: + +Prefer managed storage? Point the `OBJECT_STORAGE_*` variables at external S3 / Cloudflare R2 and leave +the `minio` profile off. See [Configuration → Object storage & uploads](/self-hosted/configuration/storage). ### Upload size limits (optional) Set `UPLOAD_MAX_*_MB` in Coolify's env for both the `api` and `dashboard` services (same values in each), e.g. `UPLOAD_MAX_DOCUMENT_MB=50`. See -[Docker self-hosting → Upload file size limits](/docs/self-hosted/docker#optional--upload-file-size-limits). +[Configuration → Upload file size limits](/self-hosted/configuration/storage#upload-file-size-limits). ## Upgrades & rollback -Bump `CIO_VERSION` to a newer release and redeploy; roll back by setting it to the previous version and redeploying. Because you pin a version, a new release never restarts you onto broken images unattended. +Bump `CIO_VERSION` to a newer release and redeploy; roll back by setting it to the previous version and redeploying. Because you pin a version, a new release never restarts you onto broken images unattended. See [Configuration → Versions & upgrades](/self-hosted/configuration/versions) for the full upgrade and backup steps. - - Schema migrations run automatically on API startup. Back up your Postgres (and object storage) - before a major upgrade. - +:::warning[Back up before upgrading] +Schema migrations run automatically on API startup. Back up your Postgres (and object storage) +before a major upgrade. +::: diff --git a/apps/docs/content/docs/self-hosted/digitalocean.mdx b/apps/docs/content/docs/self-hosted/digitalocean.mdx new file mode 100644 index 00000000..a373c50c --- /dev/null +++ b/apps/docs/content/docs/self-hosted/digitalocean.mdx @@ -0,0 +1,559 @@ +--- +title: DigitalOcean +description: Deploy ClassroomIO to a DigitalOcean droplet with Docker Compose and Caddy, including automatic HTTPS. +--- + +Run ClassroomIO on a plain **DigitalOcean droplet** — no PaaS in between. You get the +[pull-based Docker Compose stack](/self-hosted/docker) plus a [Caddy](https://caddyserver.com) +reverse proxy that obtains and renews HTTPS certificates automatically. + +Nothing here is DigitalOcean-specific. The same steps work unchanged on **Hetzner, Vultr, Linode, +AWS Lightsail**, or any Ubuntu 24.04 server you can SSH into. + +:::note[How this differs from the PaaS guides] +[Railway](/self-hosted/railway), [Coolify](/self-hosted/coolify) and [Dokploy](/self-hosted/dokploy) +terminate HTTPS for you. On a raw VPS you provide that yourself — this page covers the reverse proxy, +the certificates, and closing your internal ports off from the internet. +::: + +## Prerequisites + +- A **droplet running Ubuntu 24.04**. Minimum **2 vCPU / 4 GB RAM / 80 GB disk**; see + [Server requirements](/self-hosted#server-requirements). Measured idle usage of the full stack is + ~1.4 GB, but the jobs worker spikes during video transcoding. +- **SSH access** to it. +- A **domain** you control, with two DNS **A records** pointing at the droplet's public IP: + + | Type | Name | Value | + | ---- | ----- | ----------------- | + | A | `app` | your droplet's IP | + | A | `s3` | your droplet's IP | + +- An **SMTP provider** for signup verification, password resets, and invites — see + [Configuration → Email (SMTP)](/self-hosted/configuration/email). + +:::note[No domain? You can still get real HTTPS] +Use [sslip.io](https://sslip.io), a public wildcard-DNS service where `..sslip.io` +resolves to that IP — so no records are needed. In Step 1 set +`export DOMAIN=.sslip.io` instead of your own domain, and **every other command on +this page is identical**. Read the [caveat](#a-note-on-sslipio) before using it for anything real. +::: + +## Why two hostnames + +The dashboard is served from `app.`, and object storage from `s3.`. + +Storage needs its own hostname because video and document uploads hand **presigned S3 URLs** to the +browser, and AWS SigV4 signs the full request path. Serving storage under a path on the app host +(`app.example.com/s3`) means the proxy must strip that prefix, which invalidates the signature and +breaks every upload with `SignatureDoesNotMatch`. A separate hostname preserves the path and the +`Host` header. + +## Deployment + + + + +### Set your domain + +Everything below derives from this one variable. Run it in **every** new SSH session: + +```zsh title="Terminal" +export DOMAIN=yourdomain.com +``` + +Using sslip.io instead? Set it to your droplet's IP plus `.sslip.io`: + +```zsh title="Terminal" +export DOMAIN=203.0.113.10.sslip.io +``` + +Your dashboard will be `https://app.$DOMAIN` and storage `https://s3.$DOMAIN`. + + + +### Create a non-root user + +Connect as root, then create the account you'll actually work from: + +```zsh title="Terminal" +adduser cio +usermod -aG sudo cio +rsync --archive --chown=cio:cio ~/.ssh /home/cio +``` + +**Before going further**, open a second terminal and confirm the new user can log in: + +```zsh title="Terminal" +ssh cio@ 'echo works' +``` + +:::danger[Verify first, then lock down] +Only once that prints `works`, disable root login. If the key copy failed and you have already +disabled root SSH, you are locked out of the droplet. + +```zsh title="Terminal" +sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config +sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config +systemctl restart ssh +``` +::: + +Close the root session. Everything from here runs as `cio`. + + + +### Firewall and swap + +```zsh title="Terminal" +sudo apt update && sudo apt upgrade -y + +sudo ufw allow OpenSSH +sudo ufw allow 80/tcp +sudo ufw allow 443/tcp +sudo ufw --force enable + +sudo apt install -y unattended-upgrades + +sudo fallocate -l 2G /swapfile +sudo chmod 600 /swapfile +sudo mkswap /swapfile +sudo swapon /swapfile +echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab +``` + +The swap file matters: a video transcode can spike memory enough to get Postgres killed on a 4 GB +server. + + + +### Install Docker + +```zsh title="Terminal" +sudo apt install -y ca-certificates curl +sudo install -m 0755 -d /etc/apt/keyrings +sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc +sudo chmod a+r /etc/apt/keyrings/docker.asc + +echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \ +https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" \ + | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null + +sudo apt update +sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin + +sudo usermod -aG docker cio +``` + +:::warning[Use the literal username, not `$USER`] +`$USER` expands to whoever runs the shell — run it from a root session and it grants **root** rather +than your user, and every later Docker command fails with `permission denied` on +`/var/run/docker.sock`. Check with `getent group docker`. +::: + +Group membership only applies to a **new login**, so reconnect, then verify: + +```zsh title="Terminal" +exit +ssh cio@ +export DOMAIN=yourdomain.com + +id | grep -o docker # -> docker +docker compose version # must be v2.24.0 or newer +``` + +Compose **v2.24.0+** is required — Step 6 uses the `!override` YAML tag. Older versions +*concatenate* port lists instead of replacing them, which would leave your internal services exposed +to the internet. + + + +### Download the compose file + +```zsh title="Terminal" +mkdir -p ~/classroomio && cd ~/classroomio +curl -O https://raw.githubusercontent.com/classroomio/classroomio/main/docker-compose.images.yaml +``` + +This is the same [pull-based stack](/self-hosted/docker#run-from-pre-built-images-recommended) used +by the other guides — it pulls the published `classroomio/*` images and builds nothing. + + + +### Create the `.env` file + +This generates every secret for you. Paste it whole: + +```zsh title="Terminal" +cd ~/classroomio +MINIO_PASS=$(openssl rand -hex 24) + +cat > .env < + +OPENAI_API_KEY= +UNSPLASH_API_KEY= +LICENSE_KEY= +EOF + +chmod 600 .env +``` + +Then fill in your SMTP credentials with `nano .env`. + +Three of these break deployments more often than all the others combined: + +- **`OBJECT_STORAGE_PUBLIC_ENDPOINT`** — where the browser fetches video from. Left at the template + default of `localhost`, every video URL points at the *visitor's own machine*. +- **`DASHBOARD_ORIGIN`** — must match the browser URL exactly, `https://` included, no trailing + slash. A mismatch breaks login with CSRF errors. +- **`CSP_MEDIA_SRC_DOMAINS` / `CSP_CONNECT_SRC_DOMAINS`** — because storage is on a second hostname, + the browser blocks its media unless these allow it. Symptom: the page looks fine, images and video + silently don't load, and the only clue is in the browser console. + +:::note[Keep values unquoted and comment-free] +One value per line, no trailing `# comment`. Compose can fold an inline comment into the value and +silently corrupt a password or URL. +::: + +Every remaining variable is documented in [Configuration](/self-hosted/configuration). + + + +### Add Caddy and close the internal ports + +Right now each part of ClassroomIO runs on its own port number — the dashboard on `3082`, file +storage on `9000`. That leaves two problems: nobody wants to visit `yoursite.com:3082`, and neither +port is encrypted, so there would be no padlock in the browser. + +Caddy fixes both. It's a small web server that sits in front of everything on the normal web ports +(`80` and `443`). It gets an HTTPS certificate for your domain automatically, then sends each +visitor to the right service based on the address they typed: + +| Visitor types | Caddy sends them to | +| ------------- | ------------------- | +| `app.` | the dashboard | +| `s3.` | file storage | + +The second half of this step closes the internal ports, so the only way in from the internet is +through Caddy. + +```zsh title="Terminal" +cat > ~/classroomio/docker-compose.caddy.yaml <<'EOF' +services: + caddy: + image: caddy:2-alpine + container_name: cio-caddy + restart: unless-stopped + ports: + - '80:80' + - '443:443' + - '443:443/udp' + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile:ro + - caddy-data:/data + - caddy-config:/config + depends_on: + - dashboard + + api: + ports: !override + - '127.0.0.1:3081:3081' + + dashboard: + ports: !override + - '127.0.0.1:3082:3082' + + minio: + ports: !override + - '127.0.0.1:9000:9000' + - '127.0.0.1:9001:9001' + +volumes: + caddy-data: + caddy-config: +EOF +``` + +```zsh title="Terminal" +cat > ~/classroomio/Caddyfile < + + +### Download the images + +Save the long compose command as an alias first: + +```zsh title="Terminal" +echo "alias dc='docker compose -f ~/classroomio/docker-compose.images.yaml -f ~/classroomio/docker-compose.caddy.yaml --env-file ~/classroomio/.env -p classroomio --profile minio'" >> ~/.bashrc +source ~/.bashrc + +dc config --services +``` + +You should see: `postgres redis api dashboard jobs minio minio-init caddy` + +Then pull: + +```zsh title="Terminal" +dc pull +``` + +:::warning[This downloads ~12 GB and takes 10–20 minutes] +The images are large (`api` 3.7 GB, `dashboard` 3.9 GB, `jobs` 4.2 GB). On a 2-vCPU droplet the +**progress bars sit still for minutes at a time — this is normal, it is not frozen.** Don't cancel it. +::: + + + +### Start and verify + +```zsh title="Terminal" +dc up -d +``` + +Services start in dependency order — Postgres and Redis must report healthy before the API starts, +because the API runs database migrations on boot. A full start takes about **40 seconds**. + +```zsh title="Terminal" +dc ps +``` + +``` +NAME STATUS PORTS +cio-api Up About a minute (healthy) 127.0.0.1:3081->3081/tcp +cio-caddy Up 42 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, ... +cio-dashboard Up 43 seconds 3000/tcp, 127.0.0.1:3082->3082/tcp +cio-jobs Up About a minute +cio-minio Up About a minute 127.0.0.1:9000-9001->9000-9001/tcp +cio-postgres Up About a minute (healthy) +cio-redis Up About a minute (healthy) +``` + +`cio-minio-init` is absent on purpose — it creates the storage buckets and exits. Confirm it worked: + +```zsh title="Terminal" +docker logs cio-minio-init | tail -4 +``` + +``` +Bucket created successfully `local/videos`. +Bucket created successfully `local/documents`. +Bucket created successfully `local/media`. +Access permission for `local/media` is set to `download` +``` + +Check the certificates were issued: + +```zsh title="Terminal" +docker logs cio-caddy 2>&1 | grep "certificate obtained" +``` + +Now confirm nothing internal is exposed. **Run this from your own machine, not the droplet:** + +```zsh title="Terminal" +for p in 3081 3082 9000 9001; do + curl -s --max-time 6 -o /dev/null "http://:$p" \ + && echo "port $p REACHABLE <-- problem" \ + || echo "port $p no response (correct)" +done +``` + +All four must report `no response`. If any is reachable, your Compose version ignored `!override` — +check that `docker compose version` is v2.24.0 or newer. + + + +### Sign up + +Open `https://app.` and create the first account — it becomes the organization +**admin**. Every signup after that joins as a student unless you invite them with a specific role. + +Then verify uploads end to end: create a course, upload an image, and upload a short video. Watch the +worker process it with `dc logs -f jobs`. In your browser's DevTools the media URLs must point at +`https://s3./...` — if you see `localhost:9000`, `OBJECT_STORAGE_PUBLIC_ENDPOINT` is +wrong. + + + + +## Day-to-day commands + +```zsh title="Terminal" +dc ps # status +dc logs -f api dashboard # stream logs +dc up -d # apply an .env change +dc down # stop, keeping all data +``` + +:::danger[Never use `dc down -v`] +The `-v` flag deletes the `postgres-data`, `redis-data` and `minio-data` volumes — your database and +every upload. Plain `dc down` is always safe. +::: + +## Backups + +```zsh title="Terminal" +mkdir -p ~/backups + +docker exec cio-postgres pg_dump -U postgres classroomio | gzip > ~/backups/cio-db-$(date +%F).sql.gz + +docker run --rm -v classroomio_minio-data:/data -v ~/backups:/backup alpine \ + tar czf /backup/cio-minio-$(date +%F).tar.gz -C /data . +``` + +Run both on a daily cron, copy them off the droplet, and enable DigitalOcean snapshots for whole-box +recovery. + +## A note on sslip.io + +sslip.io is genuinely useful for evaluation, but it is **not on the +[Public Suffix List](https://publicsuffix.org)**. Let's Encrypt scopes its *certificates per +registered domain* limit using that list, so certificates for `sslip.io` count against a quota shared +with everyone else using the service. + +In practice that means issuance can occasionally fail with `too many certificates already issued` +through no fault of your configuration. If it happens, wait a few hours or move to a domain of your +own. **For production, use your own domain.** + +## Moving from sslip.io to your own domain + +1. Add the two **A records** from [Prerequisites](#prerequisites) and confirm with + `dig +short app.yourdomain.com`. +2. Update six lines in `~/classroomio/.env`: + + ```zsh title=".env" + DASHBOARD_ORIGIN=https://app.yourdomain.com + PRIVATE_APP_HOST=yourdomain.com + OBJECT_STORAGE_PUBLIC_ENDPOINT=https://s3.yourdomain.com + OBJECT_STORAGE_MEDIA_PUBLIC_BASE_URL=https://s3.yourdomain.com/media + CSP_MEDIA_SRC_DOMAINS=s3.yourdomain.com + CSP_CONNECT_SRC_DOMAINS=s3.yourdomain.com + ``` + +3. Change the two site addresses in `~/classroomio/Caddyfile`. +4. Apply, then clear cached media URLs — presigned URLs are cached in Redis for 50 minutes, so + without this the old hostname keeps being served: + + ```zsh title="Terminal" + dc up -d + docker exec cio-redis sh -c "redis-cli --scan --pattern 'presign:download:*' | xargs -r redis-cli del" + ``` + +Existing uploads keep working — media URLs are generated per request from the new endpoint. + +## Troubleshooting + +| Symptom | Cause | +| ------- | ----- | +| `permission denied` on `/var/run/docker.sock` | Your user isn't in the `docker` group, or you haven't logged out and back in since adding it | +| A port answers from outside the droplet | Compose older than v2.24.0 ignored `!override` | +| No certificate issued | Port 80 must be reachable; behind Cloudflare set the records to **DNS only** (the orange proxy breaks HTTP-01 validation) | +| Video won't play, or `SignatureDoesNotMatch` | `OBJECT_STORAGE_PUBLIC_ENDPOINT` must be a bare hostname, never a path prefix | +| Images/video blank, CSP errors in console | `CSP_MEDIA_SRC_DOMAINS` / `CSP_CONNECT_SRC_DOMAINS` missing | +| Uploads stuck at "processing" | The `jobs` worker isn't running — check `dc logs jobs` | +| No emails | `dc logs api \| grep -i smtp`; `ECONNREFUSED` means SMTP isn't configured | +| Login loops or CSRF errors | `DASHBOARD_ORIGIN` doesn't exactly match the browser URL | +| Containers being OOM-killed | A transcode on 4 GB can exhaust memory; confirm swap with `swapon --show`, or resize to 8 GB | + +## Configuration reference + +This deployment reads the same variables as every other self-hosted install: + + + + `BETTER_AUTH_SECRET`, `PRIVATE_SERVER_KEY`, database, mode/routing. + + + Signup verification, password resets, invites. + + + MinIO or external S3/R2, plus upload size limits. + + + Allowed external CDN, font, and media domains. + + + Google OAuth, Unsplash, OpenAI. + + + Pinning `CIO_VERSION`, upgrading, and rolling back. + + + +## Upgrades + +Check which versions exist, then pin one — never guess a tag, as an unpublished one fails the pull +with `manifest unknown`: + +```zsh title="Terminal" +curl -s "https://hub.docker.com/v2/repositories/classroomio/dashboard/tags?page_size=20&ordering=last_updated" \ + | tr ',' '\n' | grep '"name"' + +sed -i 's/^CIO_VERSION=.*/CIO_VERSION=/' ~/classroomio/.env +dc pull && dc up -d +``` + +Migrations run automatically on API startup. Roll back by setting `CIO_VERSION` to the previous +release and repeating — which is why you pin an exact version rather than `latest`. See +[Configuration → Versions & upgrades](/self-hosted/configuration/versions). diff --git a/apps/docs/content/docs/self-hosted/docker.mdx b/apps/docs/content/docs/self-hosted/docker.mdx index 6dcc079d..16cae9ab 100644 --- a/apps/docs/content/docs/self-hosted/docker.mdx +++ b/apps/docs/content/docs/self-hosted/docker.mdx @@ -3,14 +3,12 @@ title: Docker description: Self-host ClassroomIO with Docker — pull pre-built images (recommended) or build from source. --- -import { Callout } from 'fumadocs-ui/components/callout'; - Docker is one way to self-host ClassroomIO. There are two paths: - **Run from pre-built images (recommended)** — pull the published `classroomio/{api,dashboard,jobs}` images. You only need one compose file and a `.env`; no repository clone and no heavy local build. - **Build from source** — clone the repo and build the images yourself (needs ~8 GB RAM for the dashboard build). -![Selfhost ClassroomIO](/selfhost-classroomio.webp) +![Selfhost ClassroomIO](/docs/selfhost-classroomio.webp) ## Run from Pre-built Images (recommended) @@ -43,12 +41,11 @@ SMTP_PASSWORD= SMTP_SENDER= ``` - - This path does **not** run `run-docker-full-stack.sh`, so secrets are not auto-generated. You must - set `BETTER_AUTH_SECRET` and `PRIVATE_SERVER_KEY` yourself — e.g. `openssl rand -hex 32`. The - compose file fails fast with a clear error if either is empty, so it never boots with a - predictable session-signing secret. - +:::danger[Set strong secrets — the stack won't start without them] +This path does **not** run `run-docker-full-stack.sh`, so secrets are not auto-generated. You must set +`BETTER_AUTH_SECRET` and `PRIVATE_SERVER_KEY` yourself, or the compose file fails fast. See +[Configuration → Environment & secrets](/self-hosted/configuration/secrets). +::: 3. Pull and start the stack (MinIO is included via the `minio` profile): @@ -103,131 +100,54 @@ Open `.env` and set `DASHBOARD_ORIGIN` for your domain. For local development th The script builds and starts Postgres, Redis, MinIO (object storage), the API, the dashboard, and the background **jobs** worker. - - Run without `--build` and the script **pulls** the published `classroomio/*` images at the - `CIO_VERSION` in your `.env` instead of building locally — that's the faster default path. - +:::note[Default is pull, not build] +Run without `--build` and the script **pulls** the published `classroomio/*` images at the +`CIO_VERSION` in your `.env` instead of building locally — that's the faster default path. +::: -## Upgrading to a New Version +## One `.env`, One Command -ClassroomIO publishes versioned images. `CIO_VERSION` controls which tag you run: +Docker self-hosting uses a single root `.env` file. Every `docker compose` command reads it via `--env-file .env` — you never need separate env files per service. See [`.env.example`](https://github.com/classroomio/classroomio/blob/main/.env.example) for the full template. -- Pin an exact release (e.g. `1.0.0`) in production so a merge to `main` never restarts you onto changed images unattended. -- `latest` = the freshest `main` build — it moves on every merge (rolling; may include unreleased code). Version tags (`1.0.0`, `1.0`, `1`) are the immutable, pinned releases. +## Configuration -**Pre-built images path** — bump `CIO_VERSION` in `.env`, then re-pull and recreate: +Every variable the stack reads is documented once in the shared +[Configuration](/self-hosted/configuration) section — set the ones you need in your root `.env`: + + + + `BETTER_AUTH_SECRET`, `PRIVATE_SERVER_KEY`, database, and mode/routing basics. + + + SMTP for signup verification, password resets, and invites. + + + MinIO or external S3/R2, plus upload size limits. + + + Allowed external CDN, font, and media domains. + + + Google OAuth, Unsplash, OpenAI, branding. + + + `LICENSE_KEY` for Enterprise features. + + + +## Upgrading + +ClassroomIO publishes versioned images and `CIO_VERSION` controls which tag you run. To upgrade the +pre-built images path, bump `CIO_VERSION` and re-pull: ```zsh title="Terminal" docker compose -f docker-compose.images.yaml --env-file .env --profile minio pull docker compose -f docker-compose.images.yaml --env-file .env --profile minio up -d ``` -**Rollback** — set `CIO_VERSION` back to the previous release and run the same two commands. - -**Build-from-source path** — `git pull`, then re-run `./run-docker-full-stack.sh --build` to rebuild. - - - Database schema migrations run automatically when the API starts. Back up your Postgres volume - (and object storage) before a major upgrade, and avoid `docker compose down -v` / `docker volume - prune`, which delete your data volumes. - - -## One `.env`, One Command - -Docker self-hosting uses a single root `.env` file. Every `docker compose` command reads it via `--env-file .env` — you never need separate env files per service. See [`.env.example`](https://github.com/classroomio/classroomio/blob/main/.env.example) for the full template. - -## Environment Variables - -### Required - -| Variable | Description | Default | -|----------|-------------|---------| -| `POSTGRES_DB` | Database name | `classroomio` | -| `POSTGRES_USER` | Database user | `postgres` | -| `POSTGRES_PASSWORD` | Database password | `postgres` | -| `BETTER_AUTH_SECRET` | Auth session signing secret (required — stack won't start if empty) | — | -| `PRIVATE_SERVER_KEY` | Dashboard-to-API auth key (must be identical in api + dashboard) | Auto-generated by the script | -| `PUBLIC_IS_SELFHOSTED` | Self-hosted mode flag | `true` | -| `PRIVATE_SERVER_URL` | Internal API URL for SSR (Docker network) | `http://api:3081` | -| `DASHBOARD_ORIGIN` | Dashboard origin for invite links, email links, etc. | `http://localhost:3082` | - -### CSP Domains (Runtime) - -CSP domain variables are **runtime** — set them in your `.env`. No image rebuild is needed when changing them. - -| Variable | Description | -|----------|-------------| -| `ALLOWED_EXTERNAL_DOMAINS` | Overrides all per-directive CSP vars (comma-separated) | -| `CSP_SCRIPT_SRC_DOMAINS` | Domains allowed in `script-src` | -| `CSP_STYLE_SRC_DOMAINS` | Domains allowed in `style-src` | -| `CSP_CONNECT_SRC_DOMAINS` | Domains allowed in `connect-src` | -| `CSP_FRAME_SRC_DOMAINS` | Domains allowed in `frame-src` | -| `CSP_FONT_SRC_DOMAINS` | Domains allowed in `font-src` | -| `CSP_MEDIA_SRC_DOMAINS` | Domains allowed in `img-src` and `media-src` | - - - When `PUBLIC_IS_SELFHOSTED=true`, the dashboard starts with only `'self'` allowed. Set `ALLOWED_EXTERNAL_DOMAINS` (or the per-directive vars) with your CDN, video, and font domains. The API does not need to be added for normal dashboard traffic because requests are proxied same-origin. Since these are runtime env vars, you can change them by restarting the container — no rebuild required. - - -### Optional — Email - -Configure SMTP. Without email config, the app works but cannot send invites, password resets, or notifications. - -| Variable | Description | -|----------|-------------| -| `SMTP_HOST`, `SMTP_PORT`, `SMTP_USER`, `SMTP_PASSWORD`, `SMTP_SENDER` | SMTP server | - -### Optional — Object Storage - -The bundled **MinIO** is included by default and the startup script auto-configures it — you only need to change these for custom credentials or an external S3-compatible service. - -| Variable | Default | -|----------|---------| -| `MINIO_ROOT_USER` | randomized by the script (`minioadmin` if you skip it) | -| `MINIO_ROOT_PASSWORD` | randomized by the script (`minioadmin` if you skip it) | -| `OBJECT_STORAGE_ENDPOINT` | `http://minio:9000` | -| `OBJECT_STORAGE_PUBLIC_ENDPOINT` | `http://localhost:9000` | -| `OBJECT_STORAGE_ACCESS_KEY_ID` | matches `MINIO_ROOT_USER` | -| `OBJECT_STORAGE_SECRET_ACCESS_KEY` | matches `MINIO_ROOT_PASSWORD` | -| `OBJECT_STORAGE_FORCE_PATH_STYLE` | `true` | -| `OBJECT_STORAGE_MEDIA_PUBLIC_BASE_URL` | `http://localhost:9000/media` | - - - The `OBJECT_STORAGE_*` variables speak the S3 API, so they work with any S3-compatible provider. - To use Cloudflare R2 or AWS S3, point `OBJECT_STORAGE_ENDPOINT` at the provider's endpoint and set - the matching access key / secret, then start without the bundled MinIO via - `./run-docker-full-stack.sh --no-minio`. See the [Cloudflare Setup](/docs/contributor-guides/cloudflare-setup) guide for R2. - - -### Optional — Integrations - -| Variable | Description | -|----------|-------------| -| `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET` | Google OAuth | -| `PRIVATE_APP_HOST`, `PRIVATE_APP_SUBDOMAINS` | Multi-subdomain routing | -| `UNSPLASH_API_KEY` | Unsplash image search | -| `OPENAI_API_KEY` | Transcription + AI course generation (used by the jobs worker) | -| `LICENSE_KEY` | Enterprise features (SSO, token-auth, no-tracking) | -| `PUBLIC_APP_TITLE`, `PUBLIC_APP_DESCRIPTION`, `PUBLIC_OG_IMAGE_URL` | Custom branding | - -### Optional — Upload file size limits - -Set these in the root `.env` to raise or lower upload caps (values are in **megabytes**). Compose passes them through to the `api` and `dashboard` containers. Unset = built-in defaults. On [Railway](/docs/self-hosted/railway) or [Coolify](/docs/self-hosted/coolify), set the same variables on both the API and dashboard services. - -| Variable | Default | Applies to | -|----------|---------|------------| -| `UPLOAD_MAX_DOCUMENT_MB` | 5 | Course lesson documents | -| `UPLOAD_MAX_IMAGE_MB` | 5 | Avatars, media library, editor images | -| `UPLOAD_MAX_VIDEO_MB` | 800 | Lesson video uploads | -| `UPLOAD_MAX_EXERCISE_FILE_MB` | 2 | Student assignment file-upload questions | -| `UPLOAD_MAX_AGENT_DOCUMENT_MB` | 5 | AI assistant document uploads | -| `UPLOAD_MAX_LANDING_IMAGE_MB` | 0.5 | Org landing page cover images | -| `UPLOAD_MAX_THUMBNAIL_MB` | 5 | Media thumbnail uploads | - - - If you raise these values, also increase your reverse proxy body-size limit (e.g. nginx - `client_max_body_size`) so large uploads are not rejected before they reach ClassroomIO. - +For the build-from-source path, `git pull` and re-run `./run-docker-full-stack.sh --build`. See +[Configuration → Versions & upgrades](/self-hosted/configuration/versions) for pinning, rollback, and +the pre-upgrade backup steps. ## Common Commands @@ -253,8 +173,8 @@ docker image prune -a -f # free unused images docker container prune -f # free stopped containers ``` - - Avoid `docker volume prune` after `docker compose ... down` — it can remove your database and storage volumes. - +:::warning[Volume prune deletes data] +Avoid `docker volume prune` after `docker compose ... down` — it can remove your database and storage volumes. +::: Then restart: `./run-docker-full-stack.sh` diff --git a/apps/docs/content/docs/self-hosted/dokploy.mdx b/apps/docs/content/docs/self-hosted/dokploy.mdx new file mode 100644 index 00000000..e3c9182b --- /dev/null +++ b/apps/docs/content/docs/self-hosted/dokploy.mdx @@ -0,0 +1,194 @@ +--- +title: Dokploy +description: Deploy ClassroomIO on Dokploy using the pull-based Docker Compose stack. +--- + +[Dokploy](https://dokploy.com) is an open-source, self-hosted PaaS — a Heroku/Vercel alternative you run +on your own VPS. It deploys ClassroomIO from the published `classroomio/*` images using the **same +pull-based Docker Compose file** as the [Docker](/self-hosted/docker) and [Coolify](/self-hosted/coolify) +guides — Dokploy **pulls** the images and never builds anything. + +## Watch the walkthrough + +Prefer to follow along? This video walks through the whole Dokploy deployment end to end. The written +steps below mirror it. + + + +## Prerequisites + +- A running **Dokploy instance** with a **server connected** to it. Dokploy runs on any VPS — + DigitalOcean, Hetzner, AWS (Lightsail/EC2), or another provider. See Dokploy's + [installation guide](https://docs.dokploy.com/docs/core/installation) to set this up. +- A server sized for ClassroomIO. Dokploy's own baseline stack needs ~2 GB RAM, and ClassroomIO's + seven services need **8 GB for reliable operation** — provision for both. See + [Server requirements](/self-hosted#server-requirements). +- A **domain** with a DNS **A record pointing at your server's public IP**. Dokploy's built-in Traefik + proxy terminates HTTPS and issues the certificate. +- An **SMTP provider** for signup verification, password reset, and invite emails — see + [Configuration → Email (SMTP)](/self-hosted/configuration/email). +- *Optional:* an **OpenAI API key** (transcription + AI course generation) and Google OAuth / Unsplash + keys — see [Configuration → Integrations](/self-hosted/configuration/integrations). + +:::note[Two secrets to generate first] +Dokploy does **not** run our secret-generation script, so generate `BETTER_AUTH_SECRET` and +`PRIVATE_SERVER_KEY` yourself and keep them handy: + +```zsh title="Terminal" +openssl rand -hex 32 # BETTER_AUTH_SECRET +openssl rand -hex 32 # PRIVATE_SERVER_KEY (must be identical in the api and dashboard services) +``` + +See [Configuration → Environment & secrets](/self-hosted/configuration/secrets) for what each does. +::: + +## Step-by-step walkthrough + +This uses a Dokploy **Compose** service: you paste the compose file, set every environment value +yourself, deploy, then attach the dashboard domain. The flow is: **create a project → add a Compose +service → paste the compose file → set environment variables → point your domain → deploy → add the +dashboard domain → sign up**. + + + + +### Create a project + +In the Dokploy dashboard, open **Projects** and click **Create Project**. Give it a name (e.g. +`classroomio`) and open it. + +![Creating a project in Dokploy](/docs/dokploy-01-create-project.webp) + + + +### Add a Compose service + +Inside the project, click **Create Service** and choose **Compose** from the service types. When +prompted, **select the server** you connected to Dokploy — this is the VPS ClassroomIO runs on. + +![Adding a Compose service and selecting the server](/docs/dokploy-02-compose-service.webp) + + + +### Choose the Raw (manual) provider and paste the compose file + +Dokploy asks where the compose file comes from — GitHub, GitLab, Bitbucket, or **Raw**. Choose **Raw** +(the manual option) and paste the contents of +[`docker-compose.images.yaml`](https://github.com/classroomio/classroomio/blob/main/docker-compose.images.yaml) +— the same pull-based stack used for the [Docker](/self-hosted/docker) and [Coolify](/self-hosted/coolify) +deployments. + +![Choosing the Raw provider and pasting the compose file](/docs/dokploy-03-raw-compose.webp) + + + +### Set the environment variables + +Open the service's **Environment** tab and add your configuration. At minimum: + +```zsh title="Environment" +COMPOSE_PROFILES=minio # runs the bundled MinIO object storage +DASHBOARD_ORIGIN=https://dash.yourdomain.com +PUBLIC_SERVER_URL=https://dash.yourdomain.com +BETTER_AUTH_SECRET= +PRIVATE_SERVER_KEY= # identical in the api and dashboard services +POSTGRES_PASSWORD= +# Email (signup verification, password reset, invites) +SMTP_HOST=smtp.yourprovider.com +SMTP_PORT=587 +SMTP_USER= +SMTP_PASSWORD= +SMTP_SENDER=ClassroomIO +``` + +The full variable reference — object storage, CSP, integrations, licensing, versions — lives in the +shared [Configuration](/self-hosted/configuration) section. Copy what you need before deploying. + +![Setting the environment variables in Dokploy](/docs/dokploy-04-env-vars.webp) + + + +### Point your domain at the server + +Before the domain will work, add a DNS **A record** for it (e.g. `dash.yourdomain.com`) pointing at +your server's public IP. Do this for the dashboard domain — and any other domain you plan to use (such +as storage). DNS can take a few minutes to propagate. + + + + +### Deploy + +Click **Deploy**. Dokploy pulls `classroomio/{api,dashboard,jobs}` plus Postgres, Redis, and MinIO, +then starts the stack. The API runs database setup on first boot. Watch the **logs** until every +service is up — this is your first deploy. + +![Dokploy deploy logs showing the stack coming up](/docs/dokploy-05-deploy-logs.webp) + + + +### Add the dashboard domain + +Open the service's **Domains** section and click **Add Domain**. In the modal that appears: + +- **Service:** select **dashboard** — the service this domain routes to. +- **Host:** your dashboard domain, e.g. `dash.yourdomain.com`. +- **Container Port:** `3082` — the port the dashboard listens on. +- **HTTPS:** turn it on, then choose **Let's Encrypt** as the certificate provider. + +Create the domain. Dokploy provisions the certificate through Traefik — it usually only takes a moment. + +![Adding the dashboard domain with port 3082 and Let's Encrypt](/docs/dokploy-06-add-domain.webp) + + + +### Open the app and sign up + +Once the certificate is issued, open your dashboard URL (`https://dash.yourdomain.com`) in a new browser +tab and **sign up**. The **first** account becomes the organization **admin**; every signup after that +joins as a student unless you invite them with a specific role. + +![The running ClassroomIO dashboard sign-up page](/docs/dokploy-07-signup.webp) + + + + +## Environment variable reference + +Dokploy reads the same variables as every other self-hosted install. Rather than repeat them, use the +shared [Configuration](/self-hosted/configuration) section: + + + + `BETTER_AUTH_SECRET`, `PRIVATE_SERVER_KEY`, database, mode/routing. + + + Signup verification, password resets, invites. + + + MinIO or external S3/R2, plus upload size limits. + + + Allowed external CDN, font, and media domains. + + + Google OAuth, Unsplash, OpenAI. + + + `LICENSE_KEY` for Enterprise features. + + + +:::warning[MinIO is your durability boundary] +If you use the bundled MinIO, give its volume **persistent storage** in Dokploy and set +`OBJECT_STORAGE_PUBLIC_ENDPOINT` / `OBJECT_STORAGE_MEDIA_PUBLIC_BASE_URL` to a domain that resolves to +your server, so browsers can load uploaded media. Prefer managed storage? Point the `OBJECT_STORAGE_*` +vars at Cloudflare R2 / AWS S3 instead. See [Object storage & uploads](/self-hosted/configuration/storage). +::: + +## Upgrades & rollback + +Set `CIO_VERSION` in the service environment to pin a release, then redeploy to upgrade; roll back by +setting it to the previous version and redeploying. See +[Configuration → Versions & upgrades](/self-hosted/configuration/versions) for pinning, rollback, and +the pre-upgrade backup steps. diff --git a/apps/docs/content/docs/self-hosted/index.mdx b/apps/docs/content/docs/self-hosted/index.mdx new file mode 100644 index 00000000..e1026461 --- /dev/null +++ b/apps/docs/content/docs/self-hosted/index.mdx @@ -0,0 +1,97 @@ +--- +title: Self Hosting +description: Run ClassroomIO on your own infrastructure — with Docker, DigitalOcean, Railway, Coolify, or Dokploy. +--- + +ClassroomIO is open source, and you can run the whole platform on your own infrastructure. Every +option below runs the same stack — the API, the dashboard, and the background jobs worker, backed by +Postgres and Redis. + +Pick the path that matches where you want it to run. + + + + Run anywhere Docker runs. Pull the pre-built images, or build from source. + + + A plain VPS, end to end — Docker Compose plus Caddy for automatic HTTPS. + + + Deploy to Railway from a template. The quickest managed option. + + + Self-hosted PaaS on your own VPS, from a Docker Compose resource. + + + Self-hosted PaaS on your own VPS, deployed from a raw Docker Compose file. + + + +## Which should I choose? + +| Option | Best for | +| ------------------------------------- | --------------------------------------------------------------------- | +| [Docker](/self-hosted/docker) | Full control on your own server, or as the base for another platform. | +| [DigitalOcean](/self-hosted/digitalocean) | A raw VPS with no PaaS — you set up the reverse proxy and HTTPS yourself. Works on any Ubuntu server. | +| [Railway](/self-hosted/railway) | Getting a working instance up with the least infrastructure work. | +| [Coolify](/self-hosted/coolify) | Running a PaaS on your own VPS, managing several apps alongside it. | +| [Dokploy](/self-hosted/dokploy) | Running a Traefik-based PaaS on your own VPS, deployed from a pasted Compose file. | + +:::note[You need an SMTP provider] +Signup verification, password resets, and invite emails all send over SMTP. Whichever option you +pick, have mail credentials ready before you start. +::: + +## What you'll need + +- A **Postgres** database and a **Redis** instance (both are included in the Docker and Coolify compose files). +- An **SMTP provider** for transactional email. +- Object storage (**MinIO** or S3-compatible) if you want file and video uploads. +- *Optional:* an **OpenAI API key** for transcription and AI course generation. + +For the full environment variable reference — secrets, email, storage, CSP, integrations, licensing, +and versions — see the [Configuration](/self-hosted/configuration) section, which documents every +variable the stack reads. + +## Server requirements + +ClassroomIO is not a single container — it runs **seven services**: Postgres, Redis, MinIO (object +storage), the API, the dashboard, and a background **jobs worker** that handles video processing, +transcription, and AI course generation. The jobs worker spikes RAM whenever it runs, so a server's +idle memory use understates what you actually need. + +| Resource | Minimum | Recommended | +| -------- | ---------------- | ------------- | +| CPU | 2 vCPU | 4 vCPU | +| RAM | 4 GB | **8 GB** | +| Disk | 20 GB + uploads | 40 GB+ SSD | + +:::warning[Don't under-provision RAM] +A **1 GB server cannot run ClassroomIO at all** — it exhausts memory on the base stack before the +app is even up. **2 GB is only enough for a PaaS control plane** (Coolify, Dokploy) with little left +over for the app. Target **8 GB for reliable operation**, especially once the jobs worker starts +processing video or AI generation. +::: + +:::note[Running a PaaS on the same box?] +Coolify and Dokploy need roughly **2 GB for themselves** on top of ClassroomIO's requirement. If +they share the server, size it for both — e.g. 8 GB for ClassroomIO plus the PaaS overhead. +::: + +Building the images **from source** is a separate, heavier job that needs ~8 GB RAM at build time — +see the [Docker guide](/self-hosted/docker#build-from-source). Pulling the pre-built images (the +default) avoids that. + +## HTTPS is required in production + +:::warning[Serve over HTTPS on any real domain] +ClassroomIO's authentication session cookies are marked `Secure`, so browsers refuse to store or +send them over plain HTTP — **login silently fails**. Plain HTTP works only for local evaluation on +`localhost`. Any internet-facing deployment **must** be served over HTTPS. +::: + +Terminate TLS at a reverse proxy in front of the stack: + +- **Railway** and **Coolify** issue the certificate and terminate HTTPS for you — nothing extra to do. +- **Raw Docker** on your own server: put **nginx**, **Caddy**, or **Traefik** in front, and set + `DASHBOARD_ORIGIN` / `ORIGIN` to the `https://` URL your users visit. diff --git a/apps/docs/content/docs/self-hosted/meta.json b/apps/docs/content/docs/self-hosted/meta.json deleted file mode 100644 index b2bead0f..00000000 --- a/apps/docs/content/docs/self-hosted/meta.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "title": "Self Hosting", - "pages": ["docker", "railway", "coolify"] -} diff --git a/apps/docs/content/docs/self-hosted/railway.mdx b/apps/docs/content/docs/self-hosted/railway.mdx index a5adaa05..3dfd2414 100644 --- a/apps/docs/content/docs/self-hosted/railway.mdx +++ b/apps/docs/content/docs/self-hosted/railway.mdx @@ -3,9 +3,6 @@ title: Railway description: Deploy ClassroomIO on Railway with the one-click template. --- -import { Callout } from 'fumadocs-ui/components/callout'; -import { Step, Steps } from 'fumadocs-ui/components/steps'; - The quickest hosted deployment is the [Railway Template](https://railway.com/deploy/classroomio-1?referralCode=8OyIj5). It provisions the API, dashboard, and jobs worker services plus the Postgres and Redis plugins for you. [![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/classroomio-1?referralCode=8OyIj5) @@ -14,9 +11,7 @@ The quickest hosted deployment is the [Railway Template](https://railway.com/dep Prefer to follow along? This video walks through the whole deployment end to end. The written steps below mirror it, and the [Environment variable reference](#environment-variable-reference) has every value to copy. -
- -
+ ## Prerequisites @@ -24,14 +19,16 @@ Prefer to follow along? This video walks through the whole deployment end to end - An **SMTP provider** (or Zoho/ZeptoMail) for signup verification, password reset, and invite emails. See [SMTP Setup](#smtp-setup). - *Optional:* a **custom domain** for the dashboard and storage, an **OpenAI API key** (transcription + AI course generation), and Google OAuth / Unsplash keys. - - You'll reuse `BETTER_AUTH_SECRET` and `PRIVATE_SERVER_KEY` across services. Generate them once and keep them handy: +:::note[Two secrets to generate first] +You'll reuse `BETTER_AUTH_SECRET` and `PRIVATE_SERVER_KEY` across services. Generate them once and keep them handy: - ```zsh title="Terminal" - openssl rand -hex 32 # BETTER_AUTH_SECRET - openssl rand -hex 32 # PRIVATE_SERVER_KEY (must be identical in cio-api and cio-dashboard) - ``` - +```zsh title="Terminal" +openssl rand -hex 32 # BETTER_AUTH_SECRET +openssl rand -hex 32 # PRIVATE_SERVER_KEY (must be identical in cio-api and cio-dashboard) +``` + +See [Configuration → Environment & secrets](/self-hosted/configuration/secrets) for what each does. +::: ## Step-by-step walkthrough @@ -45,7 +42,7 @@ The one-click template provisions **all of the services** for you — Postgres, Click the **Deploy on Railway** button above. Railway opens the template page where all of the ClassroomIO services are listed and ready to configure. -![Railway template page for ClassroomIO after clicking Deploy](/railway-01-deploy-template.webp) +![Railway template page for ClassroomIO after clicking Deploy](/docs/railway-01-deploy-template.webp) @@ -59,7 +56,7 @@ The template comes with every service preconfigured — most need nothing from y The next three steps cover the services that **do** need input: `cio-jobs`, `cio-minio`, and `cio-api`. -![The Railway template listing all preconfigured ClassroomIO services](/railway-02-services-overview.webp) +![The Railway template listing all preconfigured ClassroomIO services](/docs/railway-02-services-overview.webp) @@ -73,7 +70,7 @@ The next three steps cover the services that **do** need input: `cio-jobs`, `cio - `SMTP_SENDER` - `SMTP_PASSWORD` -![Entering the SMTP variables on the cio-jobs service in the template](/railway-03-jobs-smtp.webp) +![Entering the SMTP variables on the cio-jobs service in the template](/docs/railway-03-jobs-smtp.webp) @@ -85,7 +82,7 @@ Set the storage credentials on `cio-minio`: - `MINIO_ROOT_USER` - `MINIO_ROOT_PASSWORD` -![Configuring MINIO_SERVER_URL and credentials on the cio-minio service](/railway-04-minio-credentials.webp) +![Configuring MINIO_SERVER_URL and credentials on the cio-minio service](/docs/railway-04-minio-credentials.webp) @@ -93,8 +90,8 @@ Set the storage credentials on `cio-minio`: On `cio-api`, set the SMTP host and any additional values you want. See the [Environment variable reference](#environment-variable-reference) below for the full list (object storage, auth secrets, dashboard origin, and more). -![Configuring the cio-api service variables in the template](/railway-05-api-config.webp) -![Additional cio-api configuration options](/railway-06-api-config-additional.webp) +![Configuring the cio-api service variables in the template](/docs/railway-05-api-config.webp) +![Additional cio-api configuration options](/docs/railway-06-api-config-additional.webp) @@ -102,17 +99,17 @@ On `cio-api`, set the SMTP host and any additional values you want. See the [Env Click **Deploy**. Railway begins building and bringing the services online — Redis, Postgres, and the rest come up first. -![Railway deploying the ClassroomIO services after clicking Deploy](/railway-07-deploying.webp) +![Railway deploying the ClassroomIO services after clicking Deploy](/docs/railway-07-deploying.webp) ### First boot may crash — this is expected - - On the first deploy, `cio-api` can crash. This is expected **only when you rely on the Railway-generated subdomain**: the API needs the dashboard's public domain (Better Auth's base URL), which doesn't exist yet. If you're using your **own custom subdomain**, this crash doesn't happen — skip ahead to signing up. - +:::warning[Only if you use the Railway-generated subdomain] +On the first deploy, `cio-api` can crash. This is expected **only when you rely on the Railway-generated subdomain**: the API needs the dashboard's public domain (Better Auth's base URL), which doesn't exist yet. If you're using your **own custom subdomain**, this crash doesn't happen — skip ahead to signing up. +::: -![cio-api crashing on first boot before the dashboard domain exists](/railway-08-first-boot-crash.webp) +![cio-api crashing on first boot before the dashboard domain exists](/docs/railway-08-first-boot-crash.webp) @@ -120,7 +117,7 @@ Click **Deploy**. Railway begins building and bringing the services online — R Open **cio-dashboard → Settings → Networking** and click **Generate Domain**. Railway assigns the public domain the API needs. -![cio-dashboard Settings and Networking with the Generate Domain button](/railway-09-generate-domain.webp) +![cio-dashboard Settings and Networking with the Generate Domain button](/docs/railway-09-generate-domain.webp) @@ -128,8 +125,8 @@ Open **cio-dashboard → Settings → Networking** and click **Generate Domain** Redeploy **cio-dashboard**, then **cio-api**, so both pick up the newly generated domain. They should now boot cleanly. -![Redeploying the cio-dashboard](/railway-10-redeploy-dashboard.webp) -![Redeploying the cio-api](/railway-11-redeploy-api.webp) +![Redeploying the cio-dashboard](/docs/railway-10-redeploy-dashboard.webp) +![Redeploying the cio-api](/docs/railway-11-redeploy-api.webp) @@ -137,7 +134,7 @@ Redeploy **cio-dashboard**, then **cio-api**, so both pick up the newly generate Open the generated dashboard URL in a **new browser tab** and **sign up** to create your first account. -![The running ClassroomIO dashboard sign-up page on the Railway domain](/railway-12-signup.webp) +![The running ClassroomIO dashboard sign-up page on the Railway domain](/docs/railway-12-signup.webp) @@ -197,7 +194,7 @@ ALLOWED_EXTERNAL_DOMAINS="https://fonts.googleapis.com" Optional: add `PUBLIC_APP_TITLE`, `PUBLIC_APP_DESCRIPTION`, `PUBLIC_OG_IMAGE_URL` for custom branding. You can also use per-directive CSP vars (`CSP_SCRIPT_SRC_DOMAINS`, `CSP_MEDIA_SRC_DOMAINS`, etc.) instead of `ALLOWED_EXTERNAL_DOMAINS` for finer control. -**Upload size limits** (optional): add the same `UPLOAD_MAX_*_MB` values to **cio-api** and **cio-dashboard** (e.g. `UPLOAD_MAX_DOCUMENT_MB=50`). See [Docker self-hosting → Upload file size limits](/docs/self-hosted/docker#optional--upload-file-size-limits). +**Upload size limits** (optional): add the same `UPLOAD_MAX_*_MB` values to **cio-api** and **cio-dashboard** (e.g. `UPLOAD_MAX_DOCUMENT_MB=50`). See [Configuration → Upload file size limits](/self-hosted/configuration/storage#upload-file-size-limits). ### cio-jobs (background worker) @@ -222,9 +219,9 @@ SMTP_HOST= SMTP_PORT= SMTP_USER= SMTP_PASSWORD= SMTP_SENDER= OPENAI_API_KEY= ``` - - `PRIVATE_SERVER_KEY` must be the same value in both API and dashboard. It authenticates server-side dashboard requests to the API. Referencing `${{cio-api.PRIVATE_SERVER_KEY}}` in the dashboard keeps them in sync. - +:::note[PRIVATE_SERVER_KEY] +`PRIVATE_SERVER_KEY` must be the same value in both API and dashboard. It authenticates server-side dashboard requests to the API. Referencing `${{cio-api.PRIVATE_SERVER_KEY}}` in the dashboard keeps them in sync. +::: ### cio-minio (object storage) @@ -245,17 +242,22 @@ The api and jobs services reach MinIO over **two** endpoints: the private `OBJEC (browser-facing presigned downloads and public images) — already wired in the env blocks above. `OBJECT_STORAGE_FORCE_PATH_STYLE=true` is required for MinIO. - - Single-node MinIO has no redundancy — the Railway Volume is the only thing protecting your - uploads. Back it up. If you'd rather not operate storage, use external **Cloudflare R2 / AWS S3** - instead (R2 has no egress fees): point the same `OBJECT_STORAGE_*` vars at the provider. See the - [Cloudflare Setup](/docs/contributor-guides/cloudflare-setup) guide for R2. - +:::warning[MinIO is your durability boundary] +Single-node MinIO has no redundancy — the Railway Volume is the only thing protecting your uploads, so +back it up. See [Configuration → Object storage & uploads](/self-hosted/configuration/storage) for +external Cloudflare R2 / AWS S3 alternatives. +::: ### SMTP Setup -You need SMTP for email sending. See [Nodemailer SMTP docs](https://nodemailer.com/smtp/) for provider setup. +See [Configuration → Email (SMTP)](/self-hosted/configuration/email) for the SMTP variables and provider setup. ### SSO (Enterprise) -SSO requires a license key. Set `LICENSE_KEY` in your API environment. [Book a call](http://cal.com/classroomio/enterprise) to get a license. +SSO requires a `LICENSE_KEY` on the `cio-api` service. See [Configuration → SSO & licensing](/self-hosted/configuration/sso). + +## Upgrades + +Set `CIO_VERSION` on the ClassroomIO services to pin a release, then redeploy to upgrade. See +[Configuration → Versions & upgrades](/self-hosted/configuration/versions) for pinning, rollback, and +the pre-upgrade backup steps. diff --git a/apps/docs/content/docs/student-dashboard.mdx b/apps/docs/content/docs/student-dashboard.mdx index 70d7a5d5..a8bf9dd2 100644 --- a/apps/docs/content/docs/student-dashboard.mdx +++ b/apps/docs/content/docs/student-dashboard.mdx @@ -3,8 +3,6 @@ title: Student Dashboard description: Learn how students navigate the LMS, including Home, My Learning, Cohorts, and Explore. --- -import { Callout } from 'fumadocs-ui/components/callout'; - The student dashboard (LMS) is where students open courses, track progress, and discover new content. If you are an admin, this page helps you explain what students see after they join your organization. Students reach the LMS after they sign in on your academy. The left sidebar lists the main areas below. **Exercise** and **Community** only appear when your organization has those features enabled. @@ -42,9 +40,9 @@ Both show enrolled courses. My Learning adds clearer filtering for students mana **Explore** lists **published, active courses** in your organization that the student has **not** enrolled in yet. Each card links to the course landing page so they can read details and enroll (if enrollment is open). - - A course can appear in Explore even when public self-enrollment is turned off. **Allow New Students** controls whether someone can join from the landing page, not whether the course is visible in Explore. To restrict who can join, see [How Course Enrollment Works](/docs/course-enrollment). - +:::info[Explore is a catalog, not an enrollment gate] +A course can appear in Explore even when public self-enrollment is turned off. **Allow New Students** controls whether someone can join from the landing page, not whether the course is visible in Explore. To restrict who can join, see [How Course Enrollment Works](/guides/course-enrollment). +::: Explore is useful when you want students to discover optional or elective courses without assigning them manually. @@ -58,7 +56,7 @@ Explore is useful when you want students to discover optional or elective course | Courses not yet joined | Explore | | Multi-course tracks with goals | Cohorts | -For how admins create cohorts and set goals, see [Cohorts](/docs/cohorts). +For how admins create cohorts and set goals, see [Cohorts](/cohorts). ## What students see right after enrolling @@ -82,7 +80,7 @@ If you added them from **People** but they have not signed in yet, they may show ## Related guides -- [How Course Enrollment Works](/docs/course-enrollment) — how students join courses and what settings control access -- [How to Invite Students](/docs/invite-students) — send enrollment links by email -- [Cohorts](/docs/cohorts) — multi-course tracks and goals for admins -- [Create a Course Landing Page](/docs/course-landingpage) — what prospects see before enrolling +- [How Course Enrollment Works](/guides/course-enrollment) — how students join courses and what settings control access +- [How to Invite Students](/guides/invite-students) — send enrollment links by email +- [Cohorts](/cohorts) — multi-course tracks and goals for admins +- [Create a Course Landing Page](/guides/course-landingpage) — what prospects see before enrolling diff --git a/apps/docs/content/docs/tags.mdx b/apps/docs/content/docs/tags.mdx index 16af90ba..7bd0bd65 100644 --- a/apps/docs/content/docs/tags.mdx +++ b/apps/docs/content/docs/tags.mdx @@ -3,8 +3,6 @@ title: Tags description: Organize and filter courses with organization-scoped tags in ClassroomIO. --- -import { Callout } from 'fumadocs-ui/components/callout'; - Tags in ClassroomIO help teams structure course catalogs and improve discovery across admin and student experiences. @@ -63,7 +61,7 @@ Current tags-related endpoints include: - `PUT /course/:courseId/tags` - `GET /organization/courses/public?siteName=&tags=<...>` - - Archive/restore lifecycle, advanced facet semantics, and expanded LMS filtering UX are being - incrementally rolled out. - +:::note[In Progress] +Archive/restore lifecycle, advanced facet semantics, and expanded LMS filtering UX are being +incrementally rolled out. +::: diff --git a/apps/docs/content/docs/token-auth.mdx b/apps/docs/content/docs/token-auth.mdx index 2d43ff8b..7683fcf3 100644 --- a/apps/docs/content/docs/token-auth.mdx +++ b/apps/docs/content/docs/token-auth.mdx @@ -3,22 +3,17 @@ title: Token Auth description: Sign users in to ClassroomIO from your own app with a short-lived JWT. --- -import { Callout } from 'fumadocs-ui/components/callout'; -import { Step, Steps } from 'fumadocs-ui/components/steps'; - -# Token Auth - Token Auth lets an external app sign a user in to ClassroomIO without asking for a ClassroomIO password. Your backend signs a short-lived JWT with your organization's Token Auth secret, then redirects the user's browser to ClassroomIO's token exchange URL. Use Token Auth when you already authenticate users in another product and want a trusted handoff into your ClassroomIO academy. - - Token Auth requires an **Enterprise** plan. +:::info[Enterprise Feature] +Token Auth requires an **Enterprise** plan. - **Cloud:** [Contact us](mailto:support@classroomio.com) to upgrade. +**Cloud:** [Contact us](mailto:support@classroomio.com) to upgrade. - **Self-hosted:** Requires an Enterprise license key. Set `LICENSE_KEY` in the API service environment. - +**Self-hosted:** Requires an Enterprise license key. Set `LICENSE_KEY` in the API service environment — see [Self Hosting → SSO & licensing](/self-hosted/configuration/sso). +::: ## How It Works diff --git a/apps/docs/package.json b/apps/docs/package.json index d5d3a02e..492194c1 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -2,44 +2,29 @@ "name": "@cio/docs", "type": "module", "scripts": { - "dev": "react-router dev", - "build": "react-router build", - "preview": "wrangler dev --port 4173", - "start": "wrangler dev --port 3000", + "prebuild": "node scripts/fetch-openapi.mjs", + "dev": "node scripts/fetch-openapi.mjs && blume dev", + "build": "blume build && node scripts/package-assets.mjs", + "preview": "pnpm run build && wrangler dev --port 4173", "deploy": "pnpm run build && wrangler deploy", - "cf-typegen": "wrangler types && react-router typegen", - "types:check": "fumadocs-mdx && wrangler types && react-router typegen && tsc --noEmit", - "postinstall": "fumadocs-mdx" + "validate": "blume validate" }, "dependencies": { + "@astrojs/mdx": "7.0.3", "@cio/utils": "workspace:*", - "@scalar/core": "^0.3.28", - "@react-router/dev": "^7.9.4", - "fumadocs-core": "16.2.1", - "fumadocs-mdx": "14.0.4", - "fumadocs-ui": "16.2.1", - "isbot": "^5.1.30", - "lucide-react": "^0.562.0", - "lucide-static": "^0.552.0", - "react": "^19.2.0", - "react-router": "^7.9.4", - "react-dom": "^19.2.0", - "tailwind-merge": "^3.3.1", - "vite": "^7.2.0" + "@scalar/astro": "0.4.9", + "@shikijs/twoslash": "4.3.1", + "@tailwindcss/typography": "0.5.19", + "@tailwindcss/vite": "4.1.18", + "astro": "7.0.9", + "blume": "1.1.2", + "mermaid": "^11.16.0", + "tailwindcss": "4.1.18" }, "devDependencies": { - "@cloudflare/vite-plugin": "1.15.3", - "@tailwindcss/vite": "^4.1.16", - "@types/mdx": "^2.0.13", - "@types/node": "^24.10.0", - "@types/react": "^19.2.2", - "@types/react-dom": "^19.2.2", - "tailwindcss": "^4.1.16", - "typescript": "^5.9.3", - "vite-tsconfig-paths": "^5.1.4", "wrangler": "4.86.0" }, "engines": { - "node": "^20.19.3" + "node": ">=22.12.0" } } diff --git a/apps/docs/public/dokploy-01-create-project.webp b/apps/docs/public/dokploy-01-create-project.webp new file mode 100644 index 0000000000000000000000000000000000000000..52c4af9a1e7229f138bdd36cbc192680a0d40465 GIT binary patch literal 14286 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 literal 0 HcmV?d00001 diff --git a/apps/docs/public/dokploy-02-compose-service.webp b/apps/docs/public/dokploy-02-compose-service.webp new file mode 100644 index 0000000000000000000000000000000000000000..5b57ed35e98669ada32e6bb67a9020f7f4b0df26 GIT binary patch literal 21446 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 literal 0 HcmV?d00001 diff --git a/apps/docs/public/dokploy-04-env-vars.webp b/apps/docs/public/dokploy-04-env-vars.webp new file mode 100644 index 0000000000000000000000000000000000000000..c91ccd521e4928a5e1e3d758fffeb4ee7eb7bf84 GIT binary patch literal 49982 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 literal 0 HcmV?d00001 diff --git a/apps/docs/public/dokploy-06-add-domain.webp b/apps/docs/public/dokploy-06-add-domain.webp new file mode 100644 index 0000000000000000000000000000000000000000..f55ce8b48640204c8d1b5cc835391829d9c284e0 GIT binary patch literal 26108 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�Y1>gc8ocbHCM3L>NZf_U&#e^Z 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 { + try { + await access(path); + return true; + } catch { + return false; + } +}; + +let response; + +try { + response = await fetch(PUBLIC_API_OPENAPI_URL); +} catch (error) { + if (await exists(OUTPUT)) { + console.warn( + `[docs] Could not reach ${PUBLIC_API_OPENAPI_URL} (${error.cause?.code ?? error.message}). Reusing the spec already in openapi/.` + ); + process.exit(0); + } + + throw new Error( + `Failed to reach the OpenAPI spec at ${PUBLIC_API_OPENAPI_URL}, and no previously fetched copy exists in openapi/. The API reference cannot be built.`, + { cause: error } + ); +} + +if (!response.ok) { + if (await exists(OUTPUT)) { + console.warn( + `[docs] ${PUBLIC_API_OPENAPI_URL} returned ${response.status} ${response.statusText}. Reusing the spec already in openapi/.` + ); + process.exit(0); + } + + throw new Error( + `Failed to fetch the OpenAPI spec from ${PUBLIC_API_OPENAPI_URL}: ${response.status} ${response.statusText}` + ); +} + +const spec = enrichPublicApiOpenApiSpec(await response.json()); + +await mkdir(dirname(OUTPUT), { recursive: true }); +await writeFile(OUTPUT, `${JSON.stringify(spec, null, 2)}\n`); + +console.log(`[docs] Wrote enriched OpenAPI spec to ${OUTPUT}`); diff --git a/apps/docs/scripts/package-assets.mjs b/apps/docs/scripts/package-assets.mjs new file mode 100644 index 00000000..562aba1e --- /dev/null +++ b/apps/docs/scripts/package-assets.mjs @@ -0,0 +1,57 @@ +/** + * Packages `blume build` output for the assets-only Cloudflare Worker. + * + * Two things have to be reconciled: + * + * 1. `deployment.base: '/docs'` makes Blume emit URLs like `/docs/foo`, but it + * does NOT nest the output — pages land in `dist/foo/index.html`. The worker + * is asked for `/docs/foo` (the website proxies the full path through), so + * the build is moved under `build/docs/` to line up with the served paths. + * + * 2. Astro's own `redirects` are unusable under a base: it prefixes a + * redirect's source but not its target, emitting `url=/guides` rather than + * `/docs/guides`. So the redirects are written here as a Cloudflare + * `_redirects` file, which must sit at the root of the assets directory. + */ +import { readdirSync } from 'node:fs'; +import { cp, mkdir, rm, writeFile } from 'node:fs/promises'; +import { dirname, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const root = resolve(dirname(fileURLToPath(import.meta.url)), '..'); +const dist = resolve(root, 'dist'); +const out = resolve(root, 'build'); +const content = resolve(root, 'content/docs'); + +const slugs = (dir) => + readdirSync(resolve(content, dir), { withFileTypes: true }) + .filter((e) => e.isFile() && e.name.endsWith('.mdx') && e.name !== 'index.mdx') + .map((e) => e.name.replace(/\.mdx$/, '')); + +// Guides moved from `/docs/` to `/docs/guides/` (Blume scopes a tab's +// sidebar by route prefix). The old URLs are public, so forward them. +const rootSlugs = new Set(slugs('.')); +const GUIDE_REDIRECTS = slugs('guides') + // A slug that is also a root page would shadow it — `_redirects` beats assets. + .filter((slug) => !rootSlugs.has(slug)) + .map((slug) => `/docs/${slug} /docs/guides/${slug} 301`) + .join('\n'); + +const REDIRECTS = `# Generated by scripts/package-assets.mjs — do not edit. +/docs/ /docs 301 +/docs/home /docs 301 +/docs/how-to-guides/* /docs/:splat 301 +/docs/api/reference /docs/api 301 + +/docs/contributor-guides /docs/guides/contributing 301 +/docs/contributor-guides/* /docs/guides/contributing/:splat 301 +${GUIDE_REDIRECTS} +`; + +await rm(out, { recursive: true, force: true }); +await mkdir(out, { recursive: true }); + +await cp(dist, resolve(out, 'docs'), { recursive: true }); +await writeFile(resolve(out, '_redirects'), REDIRECTS); + +console.log('[docs] Packaged dist/ -> build/docs/ with _redirects'); diff --git a/apps/docs/source.config.ts b/apps/docs/source.config.ts deleted file mode 100644 index 6f2fa4ea..00000000 --- a/apps/docs/source.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig, defineDocs } from 'fumadocs-mdx/config'; - -export const docs = defineDocs({ - dir: 'content/docs' -}); - -export default defineConfig(); diff --git a/apps/docs/tsconfig.json b/apps/docs/tsconfig.json deleted file mode 100644 index e672259e..00000000 --- a/apps/docs/tsconfig.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "include": [ - ".react-router/types/**/*", - "app/**/*.ts", - "app/**/*.tsx", - "workers/**/*.ts", - "worker-configuration.d.ts", - "react-router.config.ts", - "source.config.ts", - "vite.config.ts" - ], - "compilerOptions": { - "strict": true, - "esModuleInterop": true, - "jsx": "react-jsx", - "module": "ESNext", - "moduleResolution": "Bundler", - "lib": ["DOM", "DOM.Iterable", "ES2022"], - "types": ["vite/client"], - "isolatedModules": true, - "resolveJsonModule": true, - "skipLibCheck": true, - "target": "ES2022", - "allowJs": true, - "forceConsistentCasingInFileNames": true, - "baseUrl": ".", - "rootDirs": [".", "./.react-router/types"], - "paths": { - "@/*": ["./app/*"], - "fumadocs-mdx:collections/*": [".source/*"] - }, - "noEmit": true - } -} diff --git a/apps/docs/vite.config.ts b/apps/docs/vite.config.ts deleted file mode 100644 index 82b4a058..00000000 --- a/apps/docs/vite.config.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { defineConfig } from 'vite'; -import mdx from 'fumadocs-mdx/vite'; -import { reactRouter } from '@react-router/dev/vite'; -import { cloudflare } from '@cloudflare/vite-plugin'; -import tailwindcss from '@tailwindcss/vite'; -import tsConfigPaths from 'vite-tsconfig-paths'; - -export default defineConfig({ - server: { - host: '127.0.0.1', - port: 3000 - }, - base: '/docs/', - ssr: { - optimizeDeps: { - include: ['fumadocs-ui/components/callout', 'fumadocs-ui/components/steps'] - } - }, - plugins: [ - cloudflare({ viteEnvironment: { name: 'ssr' } }), - mdx(await import('./source.config')), - tailwindcss(), - tsConfigPaths({ - projects: ['./tsconfig.json'] - }), - reactRouter() - ] -}); diff --git a/apps/docs/workers/app.ts b/apps/docs/workers/app.ts deleted file mode 100644 index d577eb34..00000000 --- a/apps/docs/workers/app.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { createRequestHandler } from 'react-router'; - -declare module 'react-router' { - export interface AppLoadContext { - cloudflare: { - env: Env; - ctx: ExecutionContext; - }; - } -} - -const requestHandler = createRequestHandler( - () => import('virtual:react-router/server-build'), - import.meta.env.MODE -); - -const BASENAME = '/docs'; - -export default { - async fetch(request, env, ctx) { - const url = new URL(request.url); - - // The app is built with base: '/docs', so HTML references assets at - // /docs/assets/... and /docs/*.webp, but the ASSETS binding only knows - // about the flat build/client/ layout. Re-fetch with the prefix stripped - // so static files resolve before we fall through to SSR - if (url.pathname.startsWith(`${BASENAME}/`)) { - const strippedUrl = new URL(url); - strippedUrl.pathname = url.pathname.slice(BASENAME.length); - - const assetResponse = await env.ASSETS.fetch(new Request(strippedUrl, request)); - if (assetResponse.status !== 404) { - return assetResponse; - } - } - - return requestHandler(request, { - cloudflare: { env, ctx } - }); - } -} satisfies ExportedHandler; diff --git a/apps/docs/wrangler.jsonc b/apps/docs/wrangler.jsonc index a629475b..a19202f3 100644 --- a/apps/docs/wrangler.jsonc +++ b/apps/docs/wrangler.jsonc @@ -1,12 +1,18 @@ { "$schema": "node_modules/wrangler/config-schema.json", "name": "cio-docs", - "main": "./workers/app.ts", "compatibility_date": "2026-03-13", - "compatibility_flags": ["nodejs_compat"], + // Static assets only — no Worker script. The site is prerendered by Blume and + // packaged into ./build by scripts/package-assets.mjs, which nests it under + // docs/ so the paths the website proxies through (/docs/*) resolve directly. "assets": { - "binding": "ASSETS", - "directory": "./build/client" + "directory": "./build", + "not_found_handling": "404-page", + // Blume's canonical URLs and internal links carry no trailing slash + // (/docs/home, not /docs/home/), which also matches the URLs the old + // Fumadocs site served. Without this, Cloudflare's default + // auto-trailing-slash would 307 every one of them. + "html_handling": "drop-trailing-slash" }, "observability": { "logs": { diff --git a/apps/website/src/lib/components/footer.svelte b/apps/website/src/lib/components/footer.svelte index 944ea4df..65a0bae7 100644 --- a/apps/website/src/lib/components/footer.svelte +++ b/apps/website/src/lib/components/footer.svelte @@ -165,7 +165,7 @@

  • Getting Started diff --git a/apps/website/src/lib/components/oss-section.svelte b/apps/website/src/lib/components/oss-section.svelte index 8238595c..62310ddb 100644 --- a/apps/website/src/lib/components/oss-section.svelte +++ b/apps/website/src/lib/components/oss-section.svelte @@ -73,7 +73,7 @@ {#if stars}{stars}{/if} zod": "3.22.3" + "miniflare>zod": "3.22.3", + "blume>zod": "^3.24.0" } }, "packageManager": "pnpm@10.19.0+sha512.c9fc7236e92adf5c8af42fd5bf1612df99c2ceb62f27047032f4720b33f8eacdde311865e91c411f2774f618d82f320808ecb51718bfa82c060c4ba7c76a32b8" diff --git a/packages/utils/src/openapi/public-api.ts b/packages/utils/src/openapi/public-api.ts index d4424fd2..1c85b64b 100644 --- a/packages/utils/src/openapi/public-api.ts +++ b/packages/utils/src/openapi/public-api.ts @@ -4,7 +4,9 @@ export const PUBLIC_API_BEARER_SCHEME = 'bearerAuth'; const HTTP_METHODS = ['get', 'post', 'put', 'patch', 'delete', 'options', 'head'] as const; -export const PUBLIC_API_OPENAPI_DESCRIPTION = `# Authentication +export const PUBLIC_API_OPENAPI_DESCRIPTION = `Use the ClassroomIO public API to manage audience members and courses with organization-scoped API keys. + +# Authentication All public API endpoints require an **organization-scoped API key** sent as a Bearer token. @@ -31,7 +33,7 @@ Use the **Authorize** button (lock icon) on this page, choose **bearerAuth**, pa ## Plan access -On ClassroomIO Cloud, API keys are available on **Early Adopter** and **Enterprise** plans. Self-hosted deployments require **Enterprise**. +> **Paid Access** — On ClassroomIO Cloud, API key creation is available on **Early Adopter** and **Enterprise** plans. Self-hosted deployments require **Enterprise**. `; type OpenApiDocument = Record; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0f386fae..08d53356 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,6 +7,7 @@ settings: overrides: zod: 4.2.1 miniflare>zod: 3.22.3 + blume>zod: ^3.24.0 patchedDependencies: layerchart@2.0.0-next.27: @@ -226,19 +227,19 @@ importers: devDependencies: '@sveltejs/adapter-auto': specifier: ^3.0.0 - version: 3.3.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))) + version: 3.3.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))) '@sveltejs/kit': specifier: ^2.9.0 - version: 2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) '@sveltejs/vite-plugin-svelte': specifier: ^5.0.0 - version: 5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) '@tailwindcss/postcss': specifier: ^4.2.2 version: 4.2.2 bits-ui: specifier: ^2.16.1 - version: 2.16.1(@internationalized/date@3.10.1)(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0) + version: 2.16.1(@internationalized/date@3.10.1)(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0) clsx: specifier: ^2.1.1 version: 2.1.1 @@ -277,7 +278,7 @@ importers: version: 5.9.3 vite: specifier: ^6.0.0 - version: 6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + version: 6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) vitest: specifier: ^2.0.4 version: 2.1.9(@types/node@24.10.4)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.32.0)(sass@1.97.1) @@ -612,76 +613,37 @@ importers: apps/docs: dependencies: + '@astrojs/mdx': + specifier: 7.0.3 + version: 7.0.3(@astrojs/markdown-satteri@0.3.4)(astro@7.0.9(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@24.10.4)(@vercel/functions@3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.54.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) '@cio/utils': specifier: workspace:* version: link:../../packages/utils - '@react-router/dev': - specifier: ^7.9.4 - version: 7.13.2(@react-router/serve@7.13.2(react-router@7.13.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(typescript@5.9.3))(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(react-router@7.13.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(sass@1.97.1)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))(wrangler@4.86.0(@cloudflare/workers-types@4.20260511.1)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(yaml@2.8.2) - '@scalar/core': - specifier: ^0.3.28 - version: 0.3.28 - fumadocs-core: - specifier: 16.2.1 - version: 16.2.1(@tanstack/react-router@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(lucide-react@0.562.0(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react-router@7.13.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3) - fumadocs-mdx: - specifier: 14.0.4 - version: 14.0.4(fumadocs-core@16.2.1(@tanstack/react-router@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(lucide-react@0.562.0(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react-router@7.13.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3))(react@19.2.3)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) - fumadocs-ui: - specifier: 16.2.1 - version: 16.2.1(@tanstack/react-router@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(lucide-react@0.562.0(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react-router@7.13.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.18) - isbot: - specifier: ^5.1.30 - version: 5.1.37 - lucide-react: - specifier: ^0.562.0 - version: 0.562.0(react@19.2.3) - lucide-static: - specifier: ^0.552.0 - version: 0.552.0 - react: - specifier: ^19.2.0 - version: 19.2.3 - react-dom: - specifier: ^19.2.0 - version: 19.2.3(react@19.2.3) - react-router: - specifier: ^7.9.4 - version: 7.13.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - tailwind-merge: - specifier: ^3.3.1 - version: 3.4.0 - vite: - specifier: ^7.2.0 - version: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) - devDependencies: - '@cloudflare/vite-plugin': - specifier: 1.15.3 - version: 1.15.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))(workerd@1.20260426.1)(wrangler@4.86.0(@cloudflare/workers-types@4.20260511.1)(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + '@scalar/astro': + specifier: 0.4.9 + version: 0.4.9(astro@7.0.9(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@24.10.4)(@vercel/functions@3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.54.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) + '@shikijs/twoslash': + specifier: 4.3.1 + version: 4.3.1(typescript@5.9.3) + '@tailwindcss/typography': + specifier: 0.5.19 + version: 0.5.19(tailwindcss@4.1.18) '@tailwindcss/vite': - specifier: ^4.1.16 - version: 4.1.18(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) - '@types/mdx': - specifier: ^2.0.13 - version: 2.0.13 - '@types/node': - specifier: ^24.10.0 - version: 24.10.4 - '@types/react': - specifier: ^19.2.2 - version: 19.2.7 - '@types/react-dom': - specifier: ^19.2.2 - version: 19.2.3(@types/react@19.2.7) + specifier: 4.1.18 + version: 4.1.18(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) + astro: + specifier: 7.0.9 + version: 7.0.9(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@24.10.4)(@vercel/functions@3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.54.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) + blume: + specifier: 1.1.2 + version: 1.1.2(4833f745f9fd8f626b4a7791f185a353) + mermaid: + specifier: ^11.16.0 + version: 11.16.0 tailwindcss: - specifier: ^4.1.16 + specifier: 4.1.18 version: 4.1.18 - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vite-tsconfig-paths: - specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.3)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + devDependencies: wrangler: specifier: 4.86.0 version: 4.86.0(@cloudflare/workers-types@4.20260511.1)(bufferutil@4.1.0)(utf-8-validate@6.0.6) @@ -709,10 +671,10 @@ importers: version: link:../../packages/tsconfig '@sveltejs/vite-plugin-svelte': specifier: ^6.2.1 - version: 6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) '@tailwindcss/vite': specifier: ^4.1.16 - version: 4.1.18(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.1.18(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) dotenv: specifier: ^16.3.1 version: 16.6.1 @@ -730,10 +692,10 @@ importers: version: 5.9.3 vite: specifier: ^7.1.4 - version: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + version: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) vite-plugin-css-injected-by-js: specifier: ^3.5.2 - version: 3.5.2(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 3.5.2(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) apps/jobs: dependencies: @@ -1125,7 +1087,7 @@ importers: version: 22.19.3 autoprefixer: specifier: ^10.4.20 - version: 10.4.23(postcss@8.5.9) + version: 10.4.23(postcss@8.5.19) clsx: specifier: ^2.1.1 version: 2.1.1 @@ -1140,7 +1102,7 @@ importers: version: 5.46.0 svelte-check: specifier: ^4.0.0 - version: 4.3.5(picomatch@4.0.4)(svelte@5.46.0)(typescript@5.9.3) + version: 4.3.5(picomatch@4.0.5)(svelte@5.46.0)(typescript@5.9.3) tailwind-merge: specifier: ^2.5.4 version: 2.6.0 @@ -1167,7 +1129,7 @@ importers: dependencies: '@better-auth/sso': specifier: ^1.4.18 - version: 1.4.18(@better-auth/utils@0.3.0)(better-auth@1.4.18(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(@tanstack/react-start@1.143.4(crossws@0.4.1(srvx@0.9.8))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(drizzle-kit@0.31.8)(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20260511.1)(@opentelemetry/api@1.9.1)(@types/pg@8.16.0)(kysely@0.28.9)(pg@8.18.0)(postgres@3.4.7))(pg@8.18.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.10)(svelte@5.46.0)(vitest@2.1.9(@types/node@24.10.4)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.32.0)(sass@1.97.1))(vue@3.5.26(typescript@5.9.3))) + version: 1.4.18(@better-auth/utils@0.3.0)(better-auth@1.4.18(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(@tanstack/react-start@1.143.4(crossws@0.4.1(srvx@0.9.8))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.8)(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20260511.1)(@opentelemetry/api@1.9.1)(@types/pg@8.16.0)(kysely@0.28.9)(pg@8.18.0)(postgres@3.4.7))(pg@8.18.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.10)(svelte@5.46.0)(vitest@2.1.9(@types/node@24.10.4)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.32.0)(sass@1.97.1))(vue@3.5.26(typescript@5.9.3))) '@cio/email': specifier: workspace:* version: link:../email @@ -1185,7 +1147,7 @@ importers: version: 6.0.0 better-auth: specifier: ^1.4.18 - version: 1.4.18(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(@tanstack/react-start@1.143.4(crossws@0.4.1(srvx@0.9.8))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(drizzle-kit@0.31.8)(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20260511.1)(@opentelemetry/api@1.9.1)(@types/pg@8.16.0)(kysely@0.28.9)(pg@8.18.0)(postgres@3.4.7))(pg@8.18.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.10)(svelte@5.46.0)(vitest@2.1.9(@types/node@24.10.4)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.32.0)(sass@1.97.1))(vue@3.5.26(typescript@5.9.3)) + version: 1.4.18(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(@tanstack/react-start@1.143.4(crossws@0.4.1(srvx@0.9.8))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.8)(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20260511.1)(@opentelemetry/api@1.9.1)(@types/pg@8.16.0)(kysely@0.28.9)(pg@8.18.0)(postgres@3.4.7))(pg@8.18.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.10)(svelte@5.46.0)(vitest@2.1.9(@types/node@24.10.4)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.32.0)(sass@1.97.1))(vue@3.5.26(typescript@5.9.3)) drizzle-kit: specifier: ^0.31.8 version: 0.31.8 @@ -1374,7 +1336,7 @@ importers: version: 8.6.15(react@19.2.3)(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6)) '@storybook/addon-svelte-csf': specifier: ^5.0.6 - version: 5.0.10(@storybook/svelte@8.6.15(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0))(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 5.0.10(@storybook/svelte@8.6.15(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0))(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) '@storybook/blocks': specifier: ^8.4.2 version: 8.6.14(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6)) @@ -1383,19 +1345,19 @@ importers: version: 8.6.15(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0) '@storybook/svelte-vite': specifier: ^10.0.2 - version: 10.1.10(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(esbuild@0.25.12)(rollup@4.54.0)(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 10.1.10(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(esbuild@0.25.12)(rollup@4.54.0)(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) '@storybook/sveltekit': specifier: ^8.4.2 - version: 8.6.15(@babel/core@7.29.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(postcss-load-config@4.0.2(postcss@8.5.9)(ts-node@10.9.2(@types/node@24.10.4)(typescript@5.9.3)))(postcss@8.5.9)(sass@1.97.1)(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 8.6.15(@babel/core@7.29.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(postcss-load-config@4.0.2(postcss@8.5.19)(ts-node@10.9.2(@types/node@24.10.4)(typescript@5.9.3)))(postcss@8.5.19)(sass@1.97.1)(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) '@storybook/test': specifier: ^8.4.2 version: 8.6.14(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6)) '@sveltejs/vite-plugin-svelte': specifier: ^6.2.1 - version: 6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) '@tailwindcss/vite': specifier: ^4.1.16 - version: 4.1.18(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.1.18(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) '@tiptap/core': specifier: ^3.7.1 version: 3.14.0(@tiptap/pm@3.14.0) @@ -1428,7 +1390,7 @@ importers: version: 0.3.50(svelte@5.46.0)(typescript@5.9.3) vite: specifier: ^7.1.4 - version: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + version: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) packages/tsconfig: {} @@ -1560,13 +1522,13 @@ importers: version: 3.22.0 '@sveltejs/adapter-auto': specifier: ^3.0.0 - version: 3.3.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))) + version: 3.3.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))) '@sveltejs/kit': specifier: ^2.5.27 - version: 2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) '@sveltejs/vite-plugin-svelte': specifier: ^6.2.1 - version: 6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) '@tailwindcss/cli': specifier: ^4.1.18 version: 4.2.1 @@ -1590,13 +1552,13 @@ importers: version: 3.0.2 bits-ui: specifier: ^2.16.1 - version: 2.16.1(@internationalized/date@3.10.1)(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0) + version: 2.16.1(@internationalized/date@3.10.1)(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0) clsx: specifier: ^2.1.1 version: 2.1.1 jsrepo: specifier: ^3.5.1 - version: 3.5.1(svelte@5.46.0)(vue@3.5.26(typescript@5.9.3)) + version: 3.5.1(svelte@5.46.0)(vue@3.5.26(typescript@6.0.3)) layerchart: specifier: 2.0.0-next.27 version: 2.0.0-next.27(patch_hash=51dabc4b4462058655e01199047915e5582cfd0492e97d6ecd0c244dc17e5a3a)(svelte@5.46.0) @@ -1605,7 +1567,7 @@ importers: version: 1.1.0(svelte@5.46.0) runed: specifier: ^0.37.1 - version: 0.37.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(zod@4.2.1) + version: 0.37.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(zod@4.2.1) shiki: specifier: ^3.22.0 version: 3.22.0 @@ -1620,7 +1582,7 @@ importers: version: 1.0.7(svelte@5.46.0) svelte-toolbelt: specifier: ^0.10.6 - version: 0.10.6(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0) + version: 0.10.6(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0) tailwind-merge: specifier: ^3.4.0 version: 3.4.0 @@ -1670,6 +1632,12 @@ packages: peerDependencies: zod: 4.2.1 + '@ai-sdk/gateway@2.0.111': + resolution: {integrity: sha512-pZR4Is/0IGH1tDY6XgJltoH3hxVqZ+2StQMhWkBtCWWaa4JYKP8gAiNPDxy585HenQfcAqr1qsO9FgSYkHxo5w==} + engines: {node: '>=18'} + peerDependencies: + zod: 4.2.1 + '@ai-sdk/gateway@3.0.95': resolution: {integrity: sha512-ZmUNNbZl3V42xwQzPaNUi+s8eqR2lnrxf0bvB6YbLXpLjHYv0k2Y78t12cNOfY0bxGeuVVTLyk856uLuQIuXEQ==} engines: {node: '>=18'} @@ -1700,6 +1668,12 @@ packages: peerDependencies: zod: 4.2.1 + '@ai-sdk/provider-utils@3.0.28': + resolution: {integrity: sha512-bXlX1WX7E50a2N+AJW+1a/x63m52aPhm+6xYe5THxWrx9vW9NR7E2Ay+1G1ndlCdMdYKo2Fnsd7kBhuyQPaphw==} + engines: {node: '>=18'} + peerDependencies: + zod: 4.2.1 + '@ai-sdk/provider-utils@4.0.23': resolution: {integrity: sha512-z8GlDaCmRSDlqkMF2f4/RFgWxdarvIbyuk+m6WXT1LYgsnGiXRJGTD2Z1+SDl3LqtFuRtGX1aghYvQLoHL/9pg==} engines: {node: '>=18'} @@ -1712,6 +1686,10 @@ packages: peerDependencies: zod: 4.2.1 + '@ai-sdk/provider@2.0.3': + resolution: {integrity: sha512-h88OPkavHTiN9tMn2l5awAznGB0lXzjcLhgR1/rvjB2zlLprsNxbM2tt6OJsHUxduLC3klq0/eqaSf6fX5XVww==} + engines: {node: '>=18'} + '@ai-sdk/provider@3.0.10': resolution: {integrity: sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw==} engines: {node: '>=18'} @@ -1733,6 +1711,9 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} + '@antfu/install-pkg@1.1.0': + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + '@asamuzakjp/css-color@3.2.0': resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} @@ -1747,6 +1728,137 @@ packages: '@asamuzakjp/nwsapi@2.3.9': resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} + '@astrojs/check@0.9.9': + resolution: {integrity: sha512-A5UW8uIuErLWEoRQvzgXpO1gTjUFtK8r7nU2Z7GewAMxUb7bPvpk11qaKKgxqXlHJWlAvaaxy+Xg28A6bmQ1Tg==} + hasBin: true + peerDependencies: + typescript: ^5.0.0 || ^6.0.0 + + '@astrojs/compiler-binding-darwin-arm64@0.3.1': + resolution: {integrity: sha512-IEmEF2fUIlTHtpeE/isyEGVOB14cEyh/LZOFYt6wn3jNyVpdC8aR5OZ+RzFUR/f+8ZDM1LaMwZKvoA7eMyJeFw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@astrojs/compiler-binding-darwin-x64@0.3.1': + resolution: {integrity: sha512-GF2kIxjpPDLsn94zbZNMsxEmkU828QqnmM7kiQJnaooS3jmI+I7kk6+oI6EpwOsK3femCMdcm+wmOsEqtGrmjQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@astrojs/compiler-binding-linux-arm64-gnu@0.3.1': + resolution: {integrity: sha512-XJL3SDmOtVrqFhCirNcHwE91+IesJqlgNo23I4qW9QUYfwzm/TBZuH61fgqsb1ttgR1mMYz6ooPWs0JDhwMqpQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@astrojs/compiler-binding-linux-arm64-musl@0.3.1': + resolution: {integrity: sha512-xqE8BVbDoBueK/B47w30PtkVofUWJKGkwoMVE+EOMLf11rnoANxIAdA9FPqY+rng4oNI5ndHGsri1yPj2k8vZQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@astrojs/compiler-binding-linux-x64-gnu@0.3.1': + resolution: {integrity: sha512-1y0StU1qiCuDFH3rmbRJXcxdfHxFPrES1Rd+RLffosvUR7I2cH5SF5SFnBN9vXpzpkmyElZm3Yr47iJBPN7vVA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@astrojs/compiler-binding-linux-x64-musl@0.3.1': + resolution: {integrity: sha512-16q0fYf7kpbmdObZEeZJEup8hQv/whgNwVjrSvT8umrKwLDSnNIWiQpm09lQQu6bweZB0XyIvHwlPitvJhC+hg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@astrojs/compiler-binding-wasm32-wasi@0.3.1': + resolution: {integrity: sha512-cB456shIwDv/PrVT+2QG7LFndpHkVge5HjqADKZgGaAc9JHVktCtjSrcdkRQ+3tbkPazNKaTLRjXLIiz2NIx9g==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@astrojs/compiler-binding-win32-arm64-msvc@0.3.1': + resolution: {integrity: sha512-ur/9+If/yTE69mmeX5MqSZndL0HOyx67GeNZUy3N7wVdWpLz9UTJXwyWS4UR2PUQHitghjsM5xoX0Ge56WRVQQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@astrojs/compiler-binding-win32-x64-msvc@0.3.1': + resolution: {integrity: sha512-k0W+kDBzDkNZOqu4kElDvCOIbKw5Ut9S1WZ1Krj3KTgNuBERNKXsMMsRLLcbgfdMdbe7bTekQLshZrrvmYpmwA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@astrojs/compiler-binding@0.3.1': + resolution: {integrity: sha512-DaAUj29AIBU2XdJ8uwcab8lW5O2pk9pY8AXkcMw0sw77nVa3oeTYRcO+Dvbbpoexf6ThMc0FMWYCQ/wN1/T7oQ==} + engines: {node: ^20.19.0 || >=22.12.0} + + '@astrojs/compiler-rs@0.3.1': + resolution: {integrity: sha512-aT7xkgsbNoS6nriY5qKpbihK43slFHO41iqgHCTdOvn1ifaQxLCc5yXy+6GzAtiafoaC1zA7OwVXCXMsvUZOkg==} + engines: {node: '>=22.12.0'} + + '@astrojs/compiler@2.13.1': + resolution: {integrity: sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==} + + '@astrojs/internal-helpers@0.10.1': + resolution: {integrity: sha512-5phcroT/vmOOrYuuAxtkbPixy5hePtlz9i8K4OeDv3dNK6/UQRuXPOSRTxIOBbUY5Sonw2UaxjbuVc43Mcir6Q==} + + '@astrojs/language-server@2.16.12': + resolution: {integrity: sha512-3LpFphBCzveUgm5ZVDINB/v3YA4TgPa1EMOEFn3Zt/Ww6jojR25iN+kmzeUz7v/b9xkmq+hMACTX4hizN3VCEQ==} + hasBin: true + peerDependencies: + prettier: ^3.0.0 + prettier-plugin-astro: '>=0.11.0' + peerDependenciesMeta: + prettier: + optional: true + prettier-plugin-astro: + optional: true + + '@astrojs/markdown-remark@7.2.1': + resolution: {integrity: sha512-jPVNIqTvk+yKviikszv/Y1U4jGUSKpp/Nw48QZV4qjWgp70j4Lkq3lhSDRbWwCfgKvEyO9GHuVbV1dM2WYXy1w==} + + '@astrojs/markdown-satteri@0.3.4': + resolution: {integrity: sha512-6Lvt/bQZEBW+zzdhPblvfZEy5PGEYJaUsUqaCgwHeRPxZJL1gc9I+DRLKWJjjYTWDzVUTzXlMq4WwSK+X34CVw==} + + '@astrojs/mdx@7.0.3': + resolution: {integrity: sha512-RxyIwU0uFam5ftwqKOjpIdhnFxZ/kEikeimLyQy3eGXbHT8WgRGzzesOIHVU8+m9TY8ag5WVOyvV24/GyqPdPQ==} + engines: {node: '>=22.12.0'} + peerDependencies: + '@astrojs/markdown-satteri': ^0.3.1 + astro: ^7.0.0 + peerDependenciesMeta: + '@astrojs/markdown-satteri': + optional: true + + '@astrojs/node@11.0.2': + resolution: {integrity: sha512-/ijULxT+A5Cm8wSwWZ2vgqfim1b05D6B8n/a9l6MMA4FCotIH73g7fL7y76XojKXpTe75FVvQH92OxsMqea9kQ==} + peerDependencies: + astro: ^7.0.0 + + '@astrojs/prism@4.0.2': + resolution: {integrity: sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==} + engines: {node: '>=22.12.0'} + + '@astrojs/react@6.0.1': + resolution: {integrity: sha512-Afs1sEm72P2plDnrOGxmIteJ7bjx/VqxlcaQLNip5eHJ5tIvKUORQetC9UKcvgwKnj51t60HWl5mOANkOsWs4w==} + engines: {node: '>=22.12.0'} + peerDependencies: + '@types/react': ^17.0.50 || ^18.0.21 || ^19.0.0 + '@types/react-dom': ^17.0.17 || ^18.0.6 || ^19.0.0 + react: ^17.0.2 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.2 || ^18.0.0 || ^19.0.0 + + '@astrojs/telemetry@3.3.3': + resolution: {integrity: sha512-C1TLn5sPJr0x4vk56piHWKbnqlEB8BKyte5Y45V02U+D7BGO5eMqZDH5aPjnkXQWJggvmsTXxH03QMZ9NgWLzQ==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + + '@astrojs/vercel@11.0.3': + resolution: {integrity: sha512-UMhcZ/lWB0/B2l1L8BJh6QxysjZt8SLS9e40xRfBdVhfi3Y6SIDw+99rY/+OGW/yem/S7sBRkvqvto8neevO2A==} + peerDependencies: + astro: ^7.0.0 + + '@astrojs/yaml2ts@0.2.4': + resolution: {integrity: sha512-8oddpOae35pJsXPQXhTkM0ypfKPskVsh2bCxRtbf7e+/Epw2nReakFYpLKjZMEr75CsoF203PMnCocpfz0s69A==} + '@authenio/xml-encryption@2.0.2': resolution: {integrity: sha512-cTlrKttbrRHEw3W+0/I609A2Matj5JQaRvfLtEIGZvlN0RaPi+3ANsMeqAyCAVlH/lUIW2tmtBlSMni74lcXeg==} engines: {node: '>=12'} @@ -2031,6 +2143,10 @@ packages: resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} + engines: {node: '>=6.9.0'} + '@babel/helper-remap-async-to-generator@7.27.1': resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} engines: {node: '>=6.9.0'} @@ -2051,10 +2167,18 @@ packages: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.28.5': resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.27.1': resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} @@ -2076,8 +2200,8 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@7.29.2': - resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} engines: {node: '>=6.0.0'} hasBin: true @@ -2459,6 +2583,18 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-self@7.29.7': + resolution: {integrity: sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.29.7': + resolution: {integrity: sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-regenerator@7.28.4': resolution: {integrity: sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==} engines: {node: '>=6.9.0'} @@ -2588,6 +2724,10 @@ packages: resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -2618,10 +2758,73 @@ packages: '@better-fetch/fetch@1.1.21': resolution: {integrity: sha512-/ImESw0sskqlVR94jB+5+Pxjf+xBwDZF/N5+y2/q4EqD7IARUTSpPfIo8uf39SYpCxyOCtbyYpUrZ3F/k0zT4A==} + '@braintree/sanitize-url@7.1.2': + resolution: {integrity: sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==} + '@bramus/specificity@2.4.2': resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} hasBin: true + '@bruits/satteri-darwin-arm64@0.9.5': + resolution: {integrity: sha512-iw4nZgx9v30lWo/MTngQqi1pI78KI0DnkSm+lVJGYdmPLgAyDNJigVhpG42/Iq55A6c1Ll8q66ljyyRiQUxwow==} + cpu: [arm64] + os: [darwin] + + '@bruits/satteri-darwin-x64@0.9.5': + resolution: {integrity: sha512-6T26Z5Kf3cFW2PSlk9p7zT7yVxvuBSiJvYyz9u8KjYwMTqZyIDOj2wDyNpxKV4+6yUVG7rddq2QwvG/8LJA2+Q==} + cpu: [x64] + os: [darwin] + + '@bruits/satteri-linux-arm64-gnu@0.9.5': + resolution: {integrity: sha512-u51id17uJwNEMK9nBlICsq6U31c+XVqQueVBkwRIzZG+gMpS8TOJctt5h5Wz33Z8xnMdTd+adtACVz0yHgGuOA==} + cpu: [arm64] + os: [linux] + + '@bruits/satteri-linux-arm64-musl@0.9.5': + resolution: {integrity: sha512-v39HxiwGC5Rqm01HksP6+5Y+xKLPlsuVFgIgpEAo+SiQ22c+mJVhS3u7Z6ePAKdhL5NJoK1xq70kLz3L13AhpQ==} + cpu: [arm64] + os: [linux] + + '@bruits/satteri-linux-x64-gnu@0.9.5': + resolution: {integrity: sha512-F3uO8uFp3pAP5ZGXttwvh57GS7s0lL953tnNdyI2gRyP4kOOkp6pyGojNJzCjkDvWI2Cvb9iNrKok3aqQPauAw==} + cpu: [x64] + os: [linux] + + '@bruits/satteri-linux-x64-musl@0.9.5': + resolution: {integrity: sha512-bicEqglLlz++mWyADaZoP0JY20s4vDfLjaPYgQqC+NI4zZLTOOg1T4GB8aqtc822Pqji8SQBmSrTb7CrP8i08Q==} + cpu: [x64] + os: [linux] + + '@bruits/satteri-wasm32-wasi@0.9.5': + resolution: {integrity: sha512-zauAuMwfPnKPUkd4AFixRFpXdgKwP2mKgxrIIo2gJzW0/ZneF9dbHnLkojSpaBnCCp7VUL1hIi5WWZvB1CqmAQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@bruits/satteri-win32-arm64-msvc@0.9.5': + resolution: {integrity: sha512-SrfE7NEsgZjBvU3c+RR6oQRu0ToXY5uVJEbieXEF0YTctIV2zAVlbaMjWLts074QCgh3a+XHWkR/lWh2VH2LUg==} + cpu: [arm64] + os: [win32] + + '@bruits/satteri-win32-x64-msvc@0.9.5': + resolution: {integrity: sha512-5Kw9ZAtTGS8WHizyn+CJhjjfIQrw+7jcZodpmpXJjefnO15M8UexIi6JR2E5thyvsmHyhL6ZDDMUNR4bKJPd4g==} + cpu: [x64] + os: [win32] + + '@capsizecss/unpack@4.0.1': + resolution: {integrity: sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ==} + engines: {node: '>=18'} + + '@chevrotain/types@11.1.2': + resolution: {integrity: sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==} + + '@clack/core@1.4.3': + resolution: {integrity: sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ==} + engines: {node: '>= 20.12.0'} + + '@clack/prompts@1.7.0': + resolution: {integrity: sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==} + engines: {node: '>= 20.12.0'} + '@cloudflare/kv-asset-handler@0.4.0': resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} engines: {node: '>=18.0.0'} @@ -2648,33 +2851,12 @@ packages: workerd: optional: true - '@cloudflare/unenv-preset@2.7.11': - resolution: {integrity: sha512-se23f1D4PxKrMKOq+Stz+Yn7AJ9ITHcEecXo2Yjb+UgbUDCEBch1FXQC6hx6uT5fNA3kmX3mfzeZiUmpK1W9IQ==} - peerDependencies: - unenv: 2.0.0-rc.24 - workerd: ^1.20251106.1 - peerDependenciesMeta: - workerd: - optional: true - - '@cloudflare/vite-plugin@1.15.3': - resolution: {integrity: sha512-o199VPWhPoKolIW7bfdk1Vzfpa/gE+1wA+J/B8Is8MH/pAVhNQG1rVxAXjNsOAuRMwfJxRwBKDScwVVZFuUUlw==} - peerDependencies: - vite: ^6.1.0 || ^7.0.0 - wrangler: ^4.51.0 - '@cloudflare/workerd-darwin-64@1.20250617.0': resolution: {integrity: sha512-toG8JUKVLIks4oOJLe9FeuixE84pDpMZ32ip7mCpE7JaFc5BqGFvevk0YC/db3T71AQlialjRwioH3jS/dzItA==} engines: {node: '>=16'} cpu: [x64] os: [darwin] - '@cloudflare/workerd-darwin-64@1.20251125.0': - resolution: {integrity: sha512-xDIVJi8fPxBseRoEIzLiUJb0N+DXnah/ynS+Unzn58HEoKLetUWiV/T1Fhned//lo5krnToG9KRgVRs0SOOTpw==} - engines: {node: '>=16'} - cpu: [x64] - os: [darwin] - '@cloudflare/workerd-darwin-64@1.20260426.1': resolution: {integrity: sha512-Ch7DqsmYzSQRTY87pZpsGsFVz9VVBnLPnCBOHxKt1HH25a7oMu1w1PbPWqVmE0VerCLsj/TScX7Ob3v6E14TZw==} engines: {node: '>=16'} @@ -2687,12 +2869,6 @@ packages: cpu: [arm64] os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20251125.0': - resolution: {integrity: sha512-k5FQET5PXnWjeDqZUpl4Ah/Rn0bH6mjfUtTyeAy6ky7QB3AZpwIhgWQD0vOFB3OvJaK4J/K4cUtNChYXB9mY/A==} - engines: {node: '>=16'} - cpu: [arm64] - os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20260426.1': resolution: {integrity: sha512-0m0U8vaPRH25SpKjbSyRql6gmPe4rCsETRV2WW0qBnuMdKNr5Vh5/Uez80xVrfiCCRMTULGeg63Nqg2vg6CDOA==} engines: {node: '>=16'} @@ -2705,12 +2881,6 @@ packages: cpu: [x64] os: [linux] - '@cloudflare/workerd-linux-64@1.20251125.0': - resolution: {integrity: sha512-at6n/FomkftykWx0EqVLUZ0juUFz3ORtEPeBbW9ZZ3BQEyfVUtYfdcz/f1cN8Yyb7TE9ovF071P0mBRkx83ODw==} - engines: {node: '>=16'} - cpu: [x64] - os: [linux] - '@cloudflare/workerd-linux-64@1.20260426.1': resolution: {integrity: sha512-C8LlC8uSYzg49y51n++75esxZmMp+Uz1OKHHA/4lkv6rjOTbcHQJuEwSLppjybVIXpv7A8MBhbu9iyCTvyv1mw==} engines: {node: '>=16'} @@ -2723,12 +2893,6 @@ packages: cpu: [arm64] os: [linux] - '@cloudflare/workerd-linux-arm64@1.20251125.0': - resolution: {integrity: sha512-EiRn+jrNaIs1QveabXGHFoyn3s/l02ui6Yp3nssyNhtmtgviddtt8KObBfM1jQKjXTpZlunhwdN4Bxf4jhlOMw==} - engines: {node: '>=16'} - cpu: [arm64] - os: [linux] - '@cloudflare/workerd-linux-arm64@1.20260426.1': resolution: {integrity: sha512-ESVp/OIFMAqjQsa8BOP2BQQz5Vpfv6ncN6lNnIuNeOgsISQBdYk+LA60bwQHMud9tvmnSYtONp1zkZ8OQz+x6w==} engines: {node: '>=16'} @@ -2741,12 +2905,6 @@ packages: cpu: [x64] os: [win32] - '@cloudflare/workerd-windows-64@1.20251125.0': - resolution: {integrity: sha512-6fdIsSeu65g++k8Y2DKzNKs0BkoU+KKI6GAAVBOLh2vvVWWnCP1OgMdVb5JAdjDrjDT5i0GSQu0bgQ8fPsW6zw==} - engines: {node: '>=16'} - cpu: [x64] - os: [win32] - '@cloudflare/workerd-windows-64@1.20260426.1': resolution: {integrity: sha512-d3Xj/IjINRgNVwH+eKhpUn4xkkcEewbWXbOvBlapiirKWh5zl9m0Epi3qOqmjyRYK6MICqIGXg4qZBEt0lxudw==} engines: {node: '>=16'} @@ -2834,15 +2992,42 @@ packages: '@drizzle-team/brocli@0.10.2': resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} + '@emmetio/abbreviation@2.3.3': + resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==} + + '@emmetio/css-abbreviation@2.1.8': + resolution: {integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==} + + '@emmetio/css-parser@0.4.1': + resolution: {integrity: sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ==} + + '@emmetio/html-matcher@1.3.0': + resolution: {integrity: sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==} + + '@emmetio/scanner@1.0.4': + resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==} + + '@emmetio/stream-reader-utils@0.1.0': + resolution: {integrity: sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==} + + '@emmetio/stream-reader@2.2.0': + resolution: {integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==} + + '@emnapi/core@1.11.1': + resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} + '@emnapi/core@1.7.1': resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} - '@emnapi/runtime@1.7.1': - resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + '@emnapi/runtime@1.11.1': + resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + '@esbuild-kit/core-utils@3.3.2': resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} deprecated: 'Merged into tsx: https://tsx.is' @@ -2887,6 +3072,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.28.1': + resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.18.20': resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} @@ -2929,6 +3120,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.28.1': + resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.18.20': resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} engines: {node: '>=12'} @@ -2971,6 +3168,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.28.1': + resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.18.20': resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} engines: {node: '>=12'} @@ -3013,6 +3216,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.28.1': + resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.18.20': resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} engines: {node: '>=12'} @@ -3055,6 +3264,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.28.1': + resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.18.20': resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} engines: {node: '>=12'} @@ -3097,6 +3312,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.28.1': + resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.18.20': resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} engines: {node: '>=12'} @@ -3139,6 +3360,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.28.1': + resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.18.20': resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} engines: {node: '>=12'} @@ -3181,6 +3408,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.28.1': + resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.18.20': resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} engines: {node: '>=12'} @@ -3223,6 +3456,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.28.1': + resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.18.20': resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} engines: {node: '>=12'} @@ -3265,6 +3504,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.28.1': + resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.18.20': resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} engines: {node: '>=12'} @@ -3307,6 +3552,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.28.1': + resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.18.20': resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} engines: {node: '>=12'} @@ -3349,6 +3600,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.28.1': + resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.18.20': resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} engines: {node: '>=12'} @@ -3391,6 +3648,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.28.1': + resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.18.20': resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} engines: {node: '>=12'} @@ -3433,6 +3696,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.28.1': + resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.18.20': resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} engines: {node: '>=12'} @@ -3475,6 +3744,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.28.1': + resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.18.20': resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} engines: {node: '>=12'} @@ -3517,6 +3792,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.28.1': + resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.18.20': resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} engines: {node: '>=12'} @@ -3559,6 +3840,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.28.1': + resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.25.12': resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} engines: {node: '>=18'} @@ -3583,6 +3870,12 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.28.1': + resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.18.20': resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} engines: {node: '>=12'} @@ -3625,6 +3918,12 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.28.1': + resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.25.12': resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} engines: {node: '>=18'} @@ -3649,6 +3948,12 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.28.1': + resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.18.20': resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} engines: {node: '>=12'} @@ -3691,6 +3996,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.28.1': + resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openharmony-arm64@0.25.12': resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} engines: {node: '>=18'} @@ -3709,6 +4020,12 @@ packages: cpu: [arm64] os: [openharmony] + '@esbuild/openharmony-arm64@0.28.1': + resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.18.20': resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} engines: {node: '>=12'} @@ -3751,6 +4068,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.28.1': + resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.18.20': resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} engines: {node: '>=12'} @@ -3793,6 +4116,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.28.1': + resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.18.20': resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} engines: {node: '>=12'} @@ -3835,6 +4164,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.28.1': + resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.18.20': resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} engines: {node: '>=12'} @@ -3877,6 +4212,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.28.1': + resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.9.0': resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4053,6 +4394,15 @@ packages: resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} engines: {node: '>=6.9.0'} + '@iconify-json/lucide@1.2.117': + resolution: {integrity: sha512-7isYKJKWRZ8NfLNSY8pIYmRWiMBkopL4/X22gZfFmePFhc7az0hQ5biqBLG6vdDEvMctFu2suZB3yQ29RL+8tA==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@3.1.4': + resolution: {integrity: sha512-b1S7B1k9ohZ+iNTi2ATxbRYG9fTrJmUT0rc46bvVnNxqNRGW7dyo/vRREwyniI5IRN2RSJHDcm+s3BjWrSAjHw==} + '@img/colour@1.1.0': resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} engines: {node: '>=18'} @@ -4357,6 +4707,10 @@ packages: '@ioredis/commands@1.5.1': resolution: {integrity: sha512-JH8ZL/ywcJyR9MmJ5BNqZllXNZQqQbnVZOqpPQqE1vHiFgAw4NHbvE0FOduNU8IX9babitBT46571OnPTT0Zcw==} + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + '@istanbuljs/load-nyc-config@1.1.0': resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -4476,6 +4830,11 @@ packages: resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} hasBin: true + '@mapbox/node-pre-gyp@2.0.3': + resolution: {integrity: sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==} + engines: {node: '>=18'} + hasBin: true + '@mdx-js/mdx@3.1.1': resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} @@ -4485,8 +4844,8 @@ packages: '@types/react': '>=16' react: '>=16' - '@mjackson/node-fetch-server@0.2.0': - resolution: {integrity: sha512-EMlH1e30yzmTpGLQjlFmaDAjyOeZhng1/XCd7DExR8PNAnG/G1tyruZxEoUe11ClnwGhGrtsdnyyUx1frSzjng==} + '@mermaid-js/parser@1.2.0': + resolution: {integrity: sha512-oYPyv8A4As1yH5Bx+04iQEQxXuIQDe0GKCNSRgao6z8AM9jixXIfP0vsppRLvGf+nKIOb9/LdpWA4YuJiVvESA==} '@modelcontextprotocol/sdk@1.27.1': resolution: {integrity: sha512-sr6GbP+4edBwFndLbM60gf07z0FQ79gaExpnsjMGePXqFcSSb7t6iscpjk9DhFhwd+mTEQrzNafGP8/iGGFYaA==} @@ -4498,6 +4857,16 @@ packages: '@cfworker/json-schema': optional: true + '@modelcontextprotocol/sdk@1.29.0': + resolution: {integrity: sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==} + engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + zod: 4.2.1 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} cpu: [arm64] @@ -4531,6 +4900,12 @@ packages: '@napi-rs/wasm-runtime@1.1.1': resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} + '@napi-rs/wasm-runtime@1.1.6': + resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + '@noble/ciphers@2.1.1': resolution: {integrity: sha512-bysYuiVfhxNJuldNXlFEitTVdNnYUc+XNJZd7Qm2a5j1vZHgY+fazadNFWFaMK/2vye0JVlxV3gHmC0WDfAOQw==} engines: {node: '>= 20.19.0'} @@ -4751,6 +5126,9 @@ packages: resolution: {integrity: sha512-a61ljmRVVyG5MC/698C8/FfFDw5a8LOIvyOLW5fztgUXqUpc1jOfQzOitSCbge657OgXXThmY3Tk8fpiDb4UcA==} engines: {node: '>= 20.0.0'} + '@oslojs/encoding@1.1.0': + resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} + '@oxc-parser/binding-android-arm-eabi@0.112.0': resolution: {integrity: sha512-retxBzJ39Da7Lh/eZTn9+HJgTeDUxZIpuI0urOsmcFsBKXAth3lc1jIvwseQ9qbAI/VrsoFOXiGIzgclARbAHg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4873,6 +5251,44 @@ packages: '@oxc-project/types@0.112.0': resolution: {integrity: sha512-m6RebKHIRsax2iCwVpYW2ErQwa4ywHJrE4sCK3/8JK8ZZAWOKXaRJFl/uP51gaVyyXlaS4+chU1nSCdzYf6QqQ==} + '@oxc-project/types@0.139.0': + resolution: {integrity: sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==} + + '@pagefind/darwin-arm64@1.5.2': + resolution: {integrity: sha512-MXpI+7HsAdPkvJ0gk9xj9g541BCqBZOBbdwj9g6lB5LCj6kSV6nqDSjzcAJwvOsfu0fjwvC8hQU+ecfhp+MpiQ==} + cpu: [arm64] + os: [darwin] + + '@pagefind/darwin-x64@1.5.2': + resolution: {integrity: sha512-IojxFWMEJe0RQ7PQ3KXQsPIImNsbpPYpoZ+QUDrL8fAl/O27IX+LVLs74/UzEZy5uA2LD8Nz1AiwKr72vrkZQw==} + cpu: [x64] + os: [darwin] + + '@pagefind/freebsd-x64@1.5.2': + resolution: {integrity: sha512-7EVzo9+0w+2cbe671BtMj10UlNo83I+HrLVLfRxO731svHRJKUfJ/mo05gU14pe9PCfpKNQT8FS3Xc/oDN6pOA==} + cpu: [x64] + os: [freebsd] + + '@pagefind/linux-arm64@1.5.2': + resolution: {integrity: sha512-Ovt9+K35sqzn8H3ZMXGwls4TD/wMJuvRtShHIsmUQREmaxjrDEX7gHckRCrwYJ4XE1H1p6HkLz3wukrAnsfXQw==} + cpu: [arm64] + os: [linux] + + '@pagefind/linux-x64@1.5.2': + resolution: {integrity: sha512-V+tFqHKXhQKq/WqPBD67AFy7scn1/aZID00ws4fSDd+1daSi5UHR9VVlRrOUYKxn3VuFQYRD7lYXdZK1WED1YA==} + cpu: [x64] + os: [linux] + + '@pagefind/windows-arm64@1.5.2': + resolution: {integrity: sha512-hN9Nh90fNW61nNRCW9ZyQrAj/mD0eRvmJ8NlTUzkbuW8kIzGJUi3cxjFkEcMZ5h/8FsKWD/VcouZl4yo1F7B6g==} + cpu: [arm64] + os: [win32] + + '@pagefind/windows-x64@1.5.2': + resolution: {integrity: sha512-Fa2Iyw7kaDRzGMfNYNUXNW2zbL5FQVDgSOcbDHdzBrDEdpqOqg8TcZ68F22ol6NJ9IGzvUdmeyZypLW5dyhqsg==} + cpu: [x64] + os: [win32] + '@parcel/watcher-android-arm64@2.5.1': resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} engines: {node: '>= 10.0.0'} @@ -4955,6 +5371,36 @@ packages: resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} engines: {node: '>= 10.0.0'} + '@pierre/diffs@1.2.12': + resolution: {integrity: sha512-pY/gmgWL03WnagqCyCnBi3QtRXUv4hCIY6FYqd5b1ZGaoI6a4Bsji8j+yRl2RfzPh/8Hf19rCl1GE80G6a1cLQ==} + peerDependencies: + react: ^18.3.1 || ^19.0.0 + react-dom: ^18.3.1 || ^19.0.0 + + '@pierre/theme@1.1.0': + resolution: {integrity: sha512-GC2OWTAfTIIWWYhPCygwG8t2EtePQkRfON4MI2rwIkJylmiyqIttJID2dCL8sUD8cNdEvYkEyfEHHKMeCiDLoQ==} + engines: {vscode: ^1.0.0} + + '@pierre/theming@0.0.2': + resolution: {integrity: sha512-QM1M4stXfnzfaE8I8YbjXSApV8c+2dBsXJj8eYg9WTpBR/cTmCZIcfGnN4p13iRrYu2Br/R/OJfEL7uR8Qjctw==} + peerDependencies: + '@pierre/theme': ^1.1.0 + '@shikijs/themes': ^3.0.0 || ^4.0.0 + react: ^18.3.1 || ^19.0.0 + react-dom: ^18.3.1 || ^19.0.0 + shiki: ^3.0.0 || ^4.0.0 + peerDependenciesMeta: + '@pierre/theme': + optional: true + '@shikijs/themes': + optional: true + react: + optional: true + react-dom: + optional: true + shiki: + optional: true + '@playwright/test@1.57.0': resolution: {integrity: sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA==} engines: {node: '>=18'} @@ -5001,25 +5447,9 @@ packages: '@quansync/fs@1.0.0': resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} - '@radix-ui/number@1.1.1': - resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} - '@radix-ui/primitive@1.1.3': resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} - '@radix-ui/react-accordion@1.2.12': - resolution: {integrity: sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-arrow@1.1.7': resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} peerDependencies: @@ -5046,32 +5476,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-collapsible@1.1.12': - resolution: {integrity: sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-collection@1.1.7': - resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-compose-refs@1.1.2': resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} peerDependencies: @@ -5090,28 +5494,6 @@ packages: '@types/react': optional: true - '@radix-ui/react-dialog@1.1.15': - resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-direction@1.1.1': - resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@radix-ui/react-dismissable-layer@1.1.11': resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} peerDependencies: @@ -5125,28 +5507,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-focus-guards@1.1.3': - resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-focus-scope@1.1.7': - resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-hover-card@1.1.15': resolution: {integrity: sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==} peerDependencies: @@ -5160,41 +5520,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-id@1.1.1': - resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-navigation-menu@1.2.14': - resolution: {integrity: sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-popover@1.1.15': - resolution: {integrity: sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-popper@1.2.8': resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==} peerDependencies: @@ -5247,32 +5572,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-roving-focus@1.1.11': - resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-scroll-area@1.2.10': - resolution: {integrity: sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-slot@1.2.3': resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} peerDependencies: @@ -5282,28 +5581,6 @@ packages: '@types/react': optional: true - '@radix-ui/react-slot@1.2.4': - resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-tabs@1.1.13': - resolution: {integrity: sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-use-callback-ref@1.1.1': resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} peerDependencies: @@ -5376,74 +5653,9 @@ packages: '@types/react': optional: true - '@radix-ui/react-visually-hidden@1.2.3': - resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/rect@1.1.1': resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} - '@react-router/dev@7.13.2': - resolution: {integrity: sha512-8Lgf+WCEIPDhp22YB3fyoiWnNyM39sjkfWnSxAwy+Sg83OHxnQFQg0OK1oPM9lm1n/hxJe4lLYOPNwDSyeGiog==} - engines: {node: '>=20.0.0'} - hasBin: true - peerDependencies: - '@react-router/serve': ^7.13.2 - '@vitejs/plugin-rsc': ~0.5.7 - react-router: ^7.13.2 - react-server-dom-webpack: ^19.2.3 - typescript: ^5.1.0 - vite: ^5.1.0 || ^6.0.0 || ^7.0.0 - wrangler: ^3.28.2 || ^4.0.0 - peerDependenciesMeta: - '@react-router/serve': - optional: true - '@vitejs/plugin-rsc': - optional: true - react-server-dom-webpack: - optional: true - typescript: - optional: true - wrangler: - optional: true - - '@react-router/express@7.13.2': - resolution: {integrity: sha512-OuhenOg3LmCLT23+WA6CU/nIyhGv0/3kmyqpQuXxearj6Gbn1ufI+mkejFWPXsNJf+/y1ttY6P6XL8PzNX5E8w==} - engines: {node: '>=20.0.0'} - peerDependencies: - express: ^4.17.1 || ^5 - react-router: 7.13.2 - typescript: ^5.1.0 - peerDependenciesMeta: - typescript: - optional: true - - '@react-router/node@7.13.2': - resolution: {integrity: sha512-1q0v1gclPga2mNQ7Q+MLuLdEPRpDefAmz25jOlrEz+jSyYkaFt9qbSdkTUPw/QIg/DDnnT3QV8lhgr6r5iIAOA==} - engines: {node: '>=20.0.0'} - peerDependencies: - react-router: 7.13.2 - typescript: ^5.1.0 - peerDependenciesMeta: - typescript: - optional: true - - '@react-router/serve@7.13.2': - resolution: {integrity: sha512-H/clM2tMw7daRd7bTM0kYYim4ZLrcWd30DY+R/xu8h2t2YvdfLAfHD0GfqGu3Ds8yAOrWFqH5Ly7BM7jk7fvCg==} - engines: {node: '>=20.0.0'} - hasBin: true - peerDependencies: - react-router: 7.13.2 - '@redis/bloom@1.2.0': resolution: {integrity: sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==} peerDependencies: @@ -5476,15 +5688,104 @@ packages: '@remirror/core-constants@3.0.0': resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} - '@remix-run/node-fetch-server@0.13.0': - resolution: {integrity: sha512-1EsNo0ZpgXu/90AWoRZf/oE3RVTUS80tiTUpt+hv5pjtAkw7icN4WskDwz/KdAw5ARbJLMhZBrO1NqThmy/McA==} + '@rolldown/binding-android-arm64@1.1.5': + resolution: {integrity: sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] - '@remix-run/node-fetch-server@0.8.1': - resolution: {integrity: sha512-J1dev372wtJqmqn9U/qbpbZxbJSQrogNN2+Qv1lKlpATpe/WQ9aCZfl/xSb9d2Rgh1IyLSvNxZAXPZxruO6Xig==} + '@rolldown/binding-darwin-arm64@1.1.5': + resolution: {integrity: sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.1.5': + resolution: {integrity: sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.1.5': + resolution: {integrity: sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.1.5': + resolution: {integrity: sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.1.5': + resolution: {integrity: sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.1.5': + resolution: {integrity: sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-ppc64-gnu@1.1.5': + resolution: {integrity: sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@rolldown/binding-linux-s390x-gnu@1.1.5': + resolution: {integrity: sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.1.5': + resolution: {integrity: sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.1.5': + resolution: {integrity: sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.1.5': + resolution: {integrity: sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.1.5': + resolution: {integrity: sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.1.5': + resolution: {integrity: sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.1.5': + resolution: {integrity: sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] '@rolldown/pluginutils@1.0.0-beta.40': resolution: {integrity: sha512-s3GeJKSQOwBlzdUrj4ISjJj5SfSh+aqn0wjOar4Bx95iV1ETI7F6S/5hLcfAxZ9kXDcyrAkxPlqmd1ZITttf+w==} + '@rolldown/pluginutils@1.0.0-rc.3': + resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + '@rollup/plugin-commonjs@25.0.8': resolution: {integrity: sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A==} engines: {node: '>=14.0.0'} @@ -5644,6 +5945,16 @@ packages: cpu: [x64] os: [win32] + '@scalar/astro@0.4.9': + resolution: {integrity: sha512-GfcqviMFZM9arUfW7R6B6xwpKFGzFQSCEwMZX/whax1D6nRLu0om5quU8shIoRzA/+qypfSy81ZO9Cq9Y/1L/A==} + engines: {node: '>=22'} + peerDependencies: + astro: ^4.0.0 || ^5.0.0 + + '@scalar/client-side-rendering@0.3.2': + resolution: {integrity: sha512-HXgfSnSQSLaTZupSmN2w4O1Gv0wXdFl+GtrZHQEoNQ4HSzgCtk9fKcmSVxaZiPjyx6eon/x3Ic+Ka5T4tXskyA==} + engines: {node: '>=22'} + '@scalar/core@0.3.28': resolution: {integrity: sha512-Ka+g5P3Fe4f9lsJcBxfI+XAgwMYeZRgzIBWw1/HBrDoRmH3rV/N//410MBKEYXUw7pWpS+dZPJANZRvU5jtxhw==} engines: {node: '>=20'} @@ -5652,16 +5963,48 @@ packages: resolution: {integrity: sha512-G7oGybO2QXM+MIxa4OZLXaYsS9mxKygFgOcY4UOXO6xpVoY5+8rahdak9cPk7HNj8RZSt4m/BveoT8g5BtnXxg==} engines: {node: '>=20'} + '@scalar/helpers@0.9.0': + resolution: {integrity: sha512-M34CLRCttqC1bXthI/QSzQj0s5C6nrU2PFWf/vOT3RpycbiGDGQbqR+5RfFzpOIQvRqbHfNdcRbeiZBw+vCbkQ==} + engines: {node: '>=22'} + '@scalar/hono-api-reference@0.9.30': resolution: {integrity: sha512-a9cPluqfi1bgX2p7PJl/2O4jgPcoAl/ecSAe74TbPYIi27A0O0bkUBscO7WNRJhWJ1GVVxX8NvJTNlDxUNBlpg==} engines: {node: '>=20'} peerDependencies: hono: ^4.10.3 + '@scalar/json-magic@0.12.17': + resolution: {integrity: sha512-Vw2nrUDIjhvMP6vxFtkiiFlabJ6SyTtfn1BsOxgnr1hIB+/rkngMguiDzl5em21VjyfFGIoADia+QWKM2hdcdA==} + engines: {node: '>=22'} + + '@scalar/openapi-parser@0.28.8': + resolution: {integrity: sha512-BO98D3TLfKNL80UnE1sIAmI6DQRmOaH0AHnlAooTn1sQjNbRDaeHyRO53EEjo7HjFEdHeQtiRzoXmMB4jvt8AA==} + engines: {node: '>=22'} + + '@scalar/openapi-types@0.9.1': + resolution: {integrity: sha512-gkGhSkxSzADaBiNg+ZAbJuwj+ZUmzP2Pg9CWZ7ZP+0fck2WjPeDDM7aAbouAm0aQQMF9xBjSPXSA9a/qTHYaTw==} + engines: {node: '>=22'} + + '@scalar/openapi-upgrader@0.2.9': + resolution: {integrity: sha512-D5b0rGLLZgmkO9mdW2j/ND1KBlH1u3RCpr87HPxv9P9ZSr6PtM5iLqFOJq0ACiaHjY2mikCrxgDmnUEhTzRpHQ==} + engines: {node: '>=22'} + + '@scalar/schemas@0.7.2': + resolution: {integrity: sha512-6Ble6WcbiKgD3ypIva+wgZv1qIClmeEjXA6jrOo1bKpYUu6sh4e89LZxDK+LULa2jQl/2O5GEaa6aZ0ImlpkHg==} + engines: {node: '>=22'} + + '@scalar/types@0.16.2': + resolution: {integrity: sha512-QAlCtDVRsX/UV1N9ctLqPsKQy84eceFf4dMnTZM0JhaRfwS/Ovwp8oFf3POSpqQILNiqLFZLE6IV6p/5rNoAag==} + engines: {node: '>=22'} + '@scalar/types@0.5.4': resolution: {integrity: sha512-5FNQH/zx3tnERzxfpErscPHfRxLCuhncmhFYiaSz196Xi2iG1YI08BtxTV2slfT6of52epJ/MrKerarplKf9eg==} engines: {node: '>=20'} + '@scalar/validation@0.6.0': + resolution: {integrity: sha512-tpmmG+/xRE2Kn9RpflU3AIyZv08v10+E1ZrJCx7z6+/91zHVxy0M73kC1LT4/8PbYNt85ywyC8+n+D99JdMcGA==} + engines: {node: '>=20'} + '@sentry-internal/browser-utils@10.53.1': resolution: {integrity: sha512-X4d6y8sBMjmNhcDW4eMBU3ASsNIMz8dqaFkhyIMN/dkYr/yZKnbRZPaVuVUGvHKjnlficPpIH0/HK9KBjrYxPw==} engines: {node: '>=18'} @@ -5824,63 +6167,77 @@ packages: '@shikijs/core@1.29.2': resolution: {integrity: sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ==} - '@shikijs/core@3.20.0': - resolution: {integrity: sha512-f2ED7HYV4JEk827mtMDwe/yQ25pRiXZmtHjWF8uzZKuKiEsJR7Ce1nuQ+HhV9FzDcbIo4ObBCD9GPTzNuy9S1g==} - '@shikijs/core@3.22.0': resolution: {integrity: sha512-iAlTtSDDbJiRpvgL5ugKEATDtHdUVkqgHDm/gbD2ZS9c88mx7G1zSYjjOxp5Qa0eaW0MAQosFRmJSk354PRoQA==} + '@shikijs/core@4.3.1': + resolution: {integrity: sha512-ANMDxuaPsNMdDC1m4vfvhlDmJweMwkE5XitTwrq2rWHx5jM+dlm4MmHt2PP6t0uejfR77SuhrhJ0zEijIF/uhA==} + engines: {node: '>=20'} + '@shikijs/engine-javascript@1.29.2': resolution: {integrity: sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A==} - '@shikijs/engine-javascript@3.20.0': - resolution: {integrity: sha512-OFx8fHAZuk7I42Z9YAdZ95To6jDePQ9Rnfbw9uSRTSbBhYBp1kEOKv/3jOimcj3VRUKusDYM6DswLauwfhboLg==} - '@shikijs/engine-javascript@3.22.0': resolution: {integrity: sha512-jdKhfgW9CRtj3Tor0L7+yPwdG3CgP7W+ZEqSsojrMzCjD1e0IxIbwUMDDpYlVBlC08TACg4puwFGkZfLS+56Tw==} + '@shikijs/engine-javascript@4.3.1': + resolution: {integrity: sha512-JBItcnPuYq7jVJdZo/vMj94r+szT7XEjHFX+mvFDGSEIbVAXAGyHAHzhbWzpGOwYidCZrErJLLgn2PVeiokHnQ==} + engines: {node: '>=20'} + '@shikijs/engine-oniguruma@1.29.2': resolution: {integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==} - '@shikijs/engine-oniguruma@3.20.0': - resolution: {integrity: sha512-Yx3gy7xLzM0ZOjqoxciHjA7dAt5tyzJE3L4uQoM83agahy+PlW244XJSrmJRSBvGYELDhYXPacD4R/cauV5bzQ==} - '@shikijs/engine-oniguruma@3.22.0': resolution: {integrity: sha512-DyXsOG0vGtNtl7ygvabHd7Mt5EY8gCNqR9Y7Lpbbd/PbJvgWrqaKzH1JW6H6qFkuUa8aCxoiYVv8/YfFljiQxA==} + '@shikijs/engine-oniguruma@4.3.1': + resolution: {integrity: sha512-OXyNMzg0pews+msMj4cHeqT4xiYKKvbnn6VbdAXxfoFl3SSx4fJTc8FadECuc5/H9p3BzhNAoAUXKwAu9rWYhg==} + engines: {node: '>=20'} + '@shikijs/langs@1.29.2': resolution: {integrity: sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ==} - '@shikijs/langs@3.20.0': - resolution: {integrity: sha512-le+bssCxcSHrygCWuOrYJHvjus6zhQ2K7q/0mgjiffRbkhM4o1EWu2m+29l0yEsHDbWaWPNnDUTRVVBvBBeKaA==} - '@shikijs/langs@3.22.0': resolution: {integrity: sha512-x/42TfhWmp6H00T6uwVrdTJGKgNdFbrEdhaDwSR5fd5zhQ1Q46bHq9EO61SCEWJR0HY7z2HNDMaBZp8JRmKiIA==} - '@shikijs/rehype@3.20.0': - resolution: {integrity: sha512-/sqob3V/lJK0m2mZ64nkcWPN88im0D9atkI3S3PUBvtJZTHnJXVwZhHQFRDyObgEIa37IpHYHR3CuFtXB5bT2g==} + '@shikijs/langs@4.3.1': + resolution: {integrity: sha512-m0l9nsDqgBHvbZbk7A0/kXz/impK3uB/c6rAn6Gpg/uPtdZRQ+alsN/17MU5thb68XTj/4DxkZAotrM0GGSpDQ==} + engines: {node: '>=20'} + + '@shikijs/primitive@4.3.1': + resolution: {integrity: sha512-CXQRQOYy1leqQ8ceTeJdmXv/bsUY++6QyLpXJ94LZAAYj5X2SKRdc5ipguv4NPyGVKItB2PPwUpRNe0Sjh5S1A==} + engines: {node: '>=20'} '@shikijs/themes@1.29.2': resolution: {integrity: sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g==} - '@shikijs/themes@3.20.0': - resolution: {integrity: sha512-U1NSU7Sl26Q7ErRvJUouArxfM2euWqq1xaSrbqMu2iqa+tSp0D1Yah8216sDYbdDHw4C8b75UpE65eWorm2erQ==} - '@shikijs/themes@3.22.0': resolution: {integrity: sha512-o+tlOKqsr6FE4+mYJG08tfCFDS+3CG20HbldXeVoyP+cYSUxDhrFf3GPjE60U55iOkkjbpY2uC3It/eeja35/g==} - '@shikijs/transformers@3.20.0': - resolution: {integrity: sha512-PrHHMRr3Q5W1qB/42kJW6laqFyWdhrPF2hNR9qjOm1xcSiAO3hAHo7HaVyHE6pMyevmy3i51O8kuGGXC78uK3g==} + '@shikijs/themes@4.3.1': + resolution: {integrity: sha512-dgpoJ4WqNi2yTmizQHBJ5zcX6j2lE6icN/0yt4l1kkf16jrY/pwPLoTb1ETsWMz0OBLf9ZNvwmxft+cH+N9qSA==} + engines: {node: '>=20'} + + '@shikijs/transformers@4.3.1': + resolution: {integrity: sha512-z6ir0bGDgWcF2FduktEfPgIsdOtIlDiLAjFBgBzE42Q9xHbkkIXZtORHzlLVB71iZP9elEcqKg6keajvOUwE2A==} + engines: {node: '>=20'} + + '@shikijs/twoslash@4.3.1': + resolution: {integrity: sha512-xK8inH/gK++1V4rTxrwCwjvaNwkkJ7oDjOIpdqONVxIpAFnVC3gzqjH5KiXGTelUcxpUJ3PtOKWct1YQ0kAloA==} + engines: {node: '>=20'} + peerDependencies: + typescript: '>=5.5.0' '@shikijs/types@1.29.2': resolution: {integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==} - '@shikijs/types@3.20.0': - resolution: {integrity: sha512-lhYAATn10nkZcBQ0BlzSbJA3wcmL5MXUUF8d2Zzon6saZDlToKaiRX60n2+ZaHJCmXEcZRWNzn+k9vplr8Jhsw==} - '@shikijs/types@3.22.0': resolution: {integrity: sha512-491iAekgKDBFE67z70Ok5a8KBMsQ2IJwOWw3us/7ffQkIBCyOQfm/aNwVMBUriP02QshIfgHCBSIYAl3u2eWjg==} + '@shikijs/types@4.3.1': + resolution: {integrity: sha512-CHFxE0jztBIZRHH6gxXE7DXUCFXjReEGxZ/j0rfSLGKZuwp2xBYycEP14875DSa9KLL/6700oxIq6oO6ef9K2g==} + engines: {node: '>=20'} + '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} @@ -5896,6 +6253,10 @@ packages: '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + '@sindresorhus/is@7.2.0': resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} engines: {node: '>=18'} @@ -6799,11 +7160,94 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' + '@tailwindcss/typography@0.5.20': + resolution: {integrity: sha512-hwbzQuNUfcPvbegQFatVPl/MY/tcM9KLl963hQ5laJKPh81TEZ1+dNG9PirGvcaDBkp+BCshExAyKVPW91dozw==} + peerDependencies: + tailwindcss: '>=3.0.0 || >=4.0.0 || insiders' + '@tailwindcss/vite@4.1.18': resolution: {integrity: sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==} peerDependencies: vite: ^5.2.0 || ^6 || ^7 + '@takumi-rs/core-darwin-arm64@2.4.0': + resolution: {integrity: sha512-a09YpZiS7UKCSoQjnza8wxXuWnANoNxNCoCj7KV6TEUjhUgMvHPE/YTW3wWBP24t00oobbluW8tMQTspYeOOLw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@takumi-rs/core-darwin-x64@2.4.0': + resolution: {integrity: sha512-xlNztcnmV6fXkltVHsCvh5OEaHE3bzfefCmX4Jca5ZwHXTIWSlo3rKeAY/aX/+UPM9YX+GHqqXDM0+tNGEdYaw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@takumi-rs/core-linux-arm64-gnu@2.4.0': + resolution: {integrity: sha512-yHLn1DS2Tj+smvKcDSLRg5mdp96U0Xg2XGF0NYbqb1nsCIr4CRdPzsHnU9K2HvEjtsXLRZYbEgMFS/rrvh1/jQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@takumi-rs/core-linux-arm64-musl@2.4.0': + resolution: {integrity: sha512-CPpEe7UgBql01R1rSuOm/ukuUM6iPecCg0QGh+9xmBcq9VxzNS7FKgWqOVTQbPNc+V3HsJQ2kzPGm6LFeMf6Qw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@takumi-rs/core-linux-x64-gnu@2.4.0': + resolution: {integrity: sha512-narVoruMDK/3x83DiyhVHpggPVB8vYxBmDLtXqSzvZDaiifaXF8UGSJ8YUUrBAm2RSmj7zwfrGFQRZeh0hJoGA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@takumi-rs/core-linux-x64-musl@2.4.0': + resolution: {integrity: sha512-2Aqbyqh3gqkzH2B81XMsNsCdozN5+yuU9RJDCPOk9D5ON2GqCHcelpwfKDei8JM4Ei3Kfg20yKB+Uyj/SumjJg==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@takumi-rs/core-win32-arm64-msvc@2.4.0': + resolution: {integrity: sha512-JVFuihQs9X6N1mR78myrmuWBMnFrfhSU+x4Og1izxrexdDQ9JzzjsDHnPA0rFYgbtXEhDooh3Yr25AovqH0GOw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@takumi-rs/core-win32-x64-msvc@2.4.0': + resolution: {integrity: sha512-p3oyLNDkDvA8JLYEvvucctCDsVcm96RN+2Tr6jFHp/dKSY5XcbN9vwKKJwMgXG0CRRR4Cc+sA9VFNda1VEms9A==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@takumi-rs/core@2.4.0': + resolution: {integrity: sha512-Ky0dwV6iplZgQuTGV3jyxRO3bGLr2GD91vrf/e6Pk1L5CmL//U34LbF12NZwBvN/Uuxf1SJvsH78sGxcF+ojKA==} + engines: {node: '>=18'} + peerDependencies: + csstype: '*' + peerDependenciesMeta: + csstype: + optional: true + + '@takumi-rs/helpers@2.4.0': + resolution: {integrity: sha512-6F31kseLQlUBUjbUjDdjQfi2KSBQdEHxaNV0QEcbLDCupSE+NS+kr0FrDKG8oSgANP5ei6caM5PgLK9+5oC+qw==} + engines: {node: '>=18'} + peerDependencies: + preact: ^10.0.0 + react: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + preact: + optional: true + react: + optional: true + + '@takumi-rs/wasm@2.4.0': + resolution: {integrity: sha512-Ww29JLu4LczOy0bl35BdPxxbLiIMHoNV8ee5CTnlsMUXP+43l80TOtWK8fprP+XsS/cM8gjt5v0grwT+ET/pxg==} + engines: {node: '>=18'} + peerDependencies: + csstype: '*' + peerDependenciesMeta: + csstype: + optional: true + '@tanstack/directive-functions-plugin@1.142.1': resolution: {integrity: sha512-k4HhAaitobp+z2pXBkmoWgE8Ollhx7fQXpVL+PQ7HeHZc2PilrQtC3ysxvoPunufrztIxweSE9HAWkZ2AFNaLw==} engines: {node: '>=12'} @@ -7201,6 +7645,9 @@ packages: '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} @@ -7225,24 +7672,99 @@ packages: '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + '@types/d3-array@3.2.2': + resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} + + '@types/d3-axis@3.0.6': + resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} + + '@types/d3-brush@3.0.6': + resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} + + '@types/d3-chord@3.0.6': + resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} + '@types/d3-color@3.1.3': resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + '@types/d3-contour@3.0.6': + resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} + + '@types/d3-delaunay@6.0.4': + resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} + + '@types/d3-dispatch@3.0.7': + resolution: {integrity: sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==} + '@types/d3-drag@3.0.7': resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} + '@types/d3-dsv@3.0.7': + resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-fetch@3.0.7': + resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} + + '@types/d3-force@3.0.10': + resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==} + + '@types/d3-format@3.0.4': + resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} + + '@types/d3-geo@3.1.0': + resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} + + '@types/d3-hierarchy@3.1.7': + resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} + '@types/d3-interpolate@3.0.4': resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + '@types/d3-path@3.1.1': + resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} + + '@types/d3-polygon@3.0.2': + resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} + + '@types/d3-quadtree@3.0.6': + resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} + + '@types/d3-random@3.0.4': + resolution: {integrity: sha512-UHYId5WTCx4L4YNel7NU00XUXXgvgpgZOvp10PuvsQENjMDXhh2RyFc0KBjO7B45ne4Ha1yVH7ii0vnzKkuzWA==} + + '@types/d3-scale-chromatic@3.1.0': + resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==} + + '@types/d3-scale@4.0.9': + resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + '@types/d3-selection@3.0.11': resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==} + '@types/d3-shape@3.1.8': + resolution: {integrity: sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==} + + '@types/d3-time-format@4.0.3': + resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} + + '@types/d3-time@3.0.4': + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + '@types/d3-transition@3.0.9': resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==} '@types/d3-zoom@3.0.8': resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} + '@types/d3@7.4.3': + resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} + '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} @@ -7265,6 +7787,9 @@ packages: '@types/fs-extra@11.0.4': resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + '@types/geojson@7946.0.16': + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} @@ -7322,6 +7847,9 @@ packages: '@types/mysql@2.15.27': resolution: {integrity: sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA==} + '@types/nlcst@2.0.3': + resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} + '@types/node@20.19.27': resolution: {integrity: sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==} @@ -7528,19 +8056,119 @@ packages: resolution: {integrity: sha512-IrDKrw7pCRUR94zeuCSUWQ+w8JEf5ZX5jl/e6AHGSLi1/zIr0lgutfn/7JpfCey+urpgQEdrZVYzCaVVKiTwhQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript/vfs@1.6.4': + resolution: {integrity: sha512-PJFXFS4ZJKiJ9Qiuix6Dz/OwEIqHD7Dme1UwZhTK11vR+5dqW2ACbdndWQexBzCx+CPuMe5WBYQWCsFyGlQLlQ==} + peerDependencies: + typescript: '*' + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} deprecated: Potential CWE-502 - Update to 1.3.1 or higher + '@upsetjs/venn.js@2.0.0': + resolution: {integrity: sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==} + + '@vercel/analytics@1.6.1': + resolution: {integrity: sha512-oH9He/bEM+6oKlv3chWuOOcp8Y6fo6/PSro8hEkgCW3pu9/OiCXiUpRUogDh3Fs3LH2sosDrx8CxeOLBEE+afg==} + peerDependencies: + '@remix-run/react': ^2 + '@sveltejs/kit': ^1 || ^2 + next: '>= 13' + react: ^18 || ^19 || ^19.0.0-rc + svelte: '>= 4' + vue: ^3 + vue-router: ^4 + peerDependenciesMeta: + '@remix-run/react': + optional: true + '@sveltejs/kit': + optional: true + next: + optional: true + react: + optional: true + svelte: + optional: true + vue: + optional: true + vue-router: + optional: true + + '@vercel/analytics@2.0.1': + resolution: {integrity: sha512-MTQG6V9qQrt1tsDeF+2Uoo5aPjqbVPys1xvnIftXSJYG2SrwXRHnqEvVoYID7BTruDz4lCd2Z7rM1BdkUehk2g==} + peerDependencies: + '@remix-run/react': ^2 + '@sveltejs/kit': ^1 || ^2 + next: '>= 13' + nuxt: '>= 3' + react: ^18 || ^19 || ^19.0.0-rc + svelte: '>= 4' + vue: ^3 + vue-router: ^4 + peerDependenciesMeta: + '@remix-run/react': + optional: true + '@sveltejs/kit': + optional: true + next: + optional: true + nuxt: + optional: true + react: + optional: true + svelte: + optional: true + vue: + optional: true + vue-router: + optional: true + + '@vercel/cli-config@0.2.0': + resolution: {integrity: sha512-fJRRRB7734BDuXZ89yBEaA2ncYhH7bWX30mk04W80J6VAfQc+4iB8lyzAdaGpFV3/vNlkt9VZt+/uoQoWX6UsQ==} + + '@vercel/cli-exec@1.0.0': + resolution: {integrity: sha512-kQF8LGie/Hbdq9/psJxLE7owRTcqMQMhgybU04gCeR7cbQAr5t8OrjefDNColJv1QSSucFt4pLwRiARVmlOnug==} + engines: {node: '>= 18'} + + '@vercel/functions@3.7.5': + resolution: {integrity: sha512-ESf8BbeDebqRUyMi09JwRbQqpLn4g6fjcVVHPsHB56j2dSqRrSHO4h3X4aaxJf6iQQjzhAtDGI2xCWQ27JE8PA==} + engines: {node: '>= 20'} + peerDependencies: + '@aws-sdk/credential-provider-web-identity': '*' + ws: '>=8' + peerDependenciesMeta: + '@aws-sdk/credential-provider-web-identity': + optional: true + ws: + optional: true + '@vercel/nft@0.26.5': resolution: {integrity: sha512-NHxohEqad6Ra/r4lGknO52uc/GrWILXAMs1BB4401GTqww0fw1bAqzpG1XHuDO+dprg4GvsD9ZLLSsdo78p9hQ==} engines: {node: '>=16'} hasBin: true + '@vercel/nft@1.10.2': + resolution: {integrity: sha512-w+WyX5Ulmj4dtTZrxaulqrjaLZHSbnPzx75SJsTNYmotKsqn1JlLnDJa+lz5hn90HJofhl/2MAtw0mCrgM3qYw==} + engines: {node: '>=20'} + hasBin: true + '@vercel/oidc@3.1.0': resolution: {integrity: sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==} engines: {node: '>= 20'} + '@vercel/oidc@3.8.0': + resolution: {integrity: sha512-r00laGW6Pv778RoR6M2NxX91ycSj+PBwVo+fOb9Bif+F0IyUKt25zrvBzfEzQpeAzbqOgPZyQibEWDdDFApd+A==} + engines: {node: '>= 20'} + + '@vercel/routing-utils@5.3.3': + resolution: {integrity: sha512-KYm2sLNUD48gDScv8ob4ejc3Gww2jcJyW80hTdYlenAPz/5BQar1Gyh38xrUuZ532TUwSb5mV1uRbAuiykq0EQ==} + + '@vitejs/plugin-react@5.2.0': + resolution: {integrity: sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + '@vitest/coverage-v8@1.6.1': resolution: {integrity: sha512-6YeRZwuO4oTGKxD3bijok756oktHSIm3eczVVzNe3scqzuhLwltIF3S9ZL/vwOVIpURmU6SnZhziXXAfw8/Qlw==} peerDependencies: @@ -7616,6 +8244,32 @@ packages: '@vitest/utils@2.1.9': resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} + '@volar/kit@2.4.28': + resolution: {integrity: sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==} + peerDependencies: + typescript: '*' + + '@volar/language-core@2.4.28': + resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==} + + '@volar/language-server@2.4.28': + resolution: {integrity: sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw==} + + '@volar/language-service@2.4.28': + resolution: {integrity: sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw==} + + '@volar/source-map@2.4.28': + resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==} + + '@volar/typescript@2.4.28': + resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} + + '@vscode/emmet-helper@2.11.0': + resolution: {integrity: sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==} + + '@vscode/l10n@0.0.18': + resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} + '@vue/compiler-core@3.5.26': resolution: {integrity: sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w==} @@ -7679,9 +8333,13 @@ packages: abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} + abbrev@3.0.1: + resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} + engines: {node: ^18.17.0 || >=20.5.0} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} accepts@2.0.0: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} @@ -7715,6 +8373,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} + engines: {node: '>=0.4.0'} + hasBin: true + add-stream@1.0.0: resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} @@ -7726,12 +8389,26 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} + ai@5.0.212: + resolution: {integrity: sha512-NmSi5BHrQpWNzCeisFqXLWyxyDbERIdvlJ7rNeIk8CB/GUqkKAPoEDn75uTuL3h9SCfFGVW5HTrRE8nX+ydqAg==} + engines: {node: '>=18'} + peerDependencies: + zod: 4.2.1 + ai@6.0.158: resolution: {integrity: sha512-gLTp1UXFtMqKUi3XHs33K7UFglbvojkxF/aq337TxnLGOhHIW9+GyP2jwW4hYX87f1es+wId3VQoPRRu9zEStQ==} engines: {node: '>=18'} peerDependencies: zod: 4.2.1 + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + ajv-formats@3.0.1: resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} peerDependencies: @@ -7740,6 +8417,11 @@ packages: ajv: optional: true + ajv-i18n@4.2.0: + resolution: {integrity: sha512-v/ei2UkCEeuKNXh8RToiFsUclmU+G57LO1Oo22OagNMENIw+Yb8eMwvHu7Vn9fmkjJyv6XclhJ8TbuigSglPkg==} + peerDependencies: + ajv: ^8.0.0-beta.0 + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -7750,6 +8432,10 @@ packages: resolution: {integrity: sha512-x8eEZ/ZhC6OjCKanec3y7DpCj/Kymife0yVkq56XDWUwZcZotzC0ejgO5/dbgRiBVMRb09dY+JP9dySCHysl9A==} engines: {node: '>=8'} + am-i-vibing@0.4.0: + resolution: {integrity: sha512-MxT4XZL7pzLHpuvhDKdMaQHMGGkJDLluKBLsbstn+8wv9sWcFT6h+0ve9qkml95amVTZtZV83gQe2hY+ojgHLg==} + hasBin: true + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -7812,10 +8498,6 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-hidden@1.2.6: - resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} - engines: {node: '>=10'} - aria-query@5.1.3: resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} @@ -7830,12 +8512,12 @@ packages: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} - array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + array-iterate@2.0.1: + resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} + array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -7865,9 +8547,22 @@ packages: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} hasBin: true + astro@7.0.9: + resolution: {integrity: sha512-WB5pA4LLQnmqjBh6EIu0z8aUV4q2/AoThgSZq57Rsp+oqqvPu7OwZ5eF+W4ku20TUTxIhiJW8dccuGvJPiW2UA==} + engines: {node: '>=22.12.0', npm: '>=9.6.5', pnpm: '>=7.1.0'} + hasBin: true + peerDependencies: + '@astrojs/markdown-remark': 7.2.1 + peerDependenciesMeta: + '@astrojs/markdown-remark': + optional: true + async-sema@3.1.1: resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -7894,9 +8589,6 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} - babel-dead-code-elimination@1.0.11: - resolution: {integrity: sha512-mwq3W3e/pKSI6TG8lXMiDWvEi1VXYlSBlJlB3l+I0bAb5u1RNUl88udos85eOPNK3m5EXK9uO7d2g08pesTySQ==} - babel-dead-code-elimination@1.0.12: resolution: {integrity: sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==} @@ -7929,6 +8621,9 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-react-compiler@1.0.0: + resolution: {integrity: sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==} + babel-preset-current-node-syntax@1.2.0: resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} peerDependencies: @@ -7966,10 +8661,6 @@ packages: resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==} hasBin: true - basic-auth@2.0.1: - resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} - engines: {node: '>= 0.8'} - bcrypt@6.0.0: resolution: {integrity: sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==} engines: {node: '>= 18'} @@ -8078,6 +8769,52 @@ packages: bluebird@3.4.7: resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} + blume@1.1.2: + resolution: {integrity: sha512-AnW/vqsP4Fp2t1ZMW6GWYoWNbsoShuaoLBA1xGebW4W2ZH+vNR9UJcxGdOxZ3idF9OkyJbNjZTkY8J3S7JuIAg==} + engines: {node: '>=22.12.0'} + hasBin: true + peerDependencies: + '@ai-sdk/openai-compatible': ^1.0.41 + '@astrojs/cloudflare': ^14.0.0 + '@astrojs/netlify': ^8.0.0 + '@astrojs/svelte': ^9.0.0 + '@astrojs/vue': ^7.0.0 + '@mixedbread/sdk': ^0.76.0 + '@notionhq/client': ^2.2.15 + '@openrouter/ai-sdk-provider': ^1.5.4 + '@oramacloud/client': ^2.1.0 + '@sanity/client': ^6.21.0 + algoliasearch: ^5.55.0 + flexsearch: ^0.8.0 + typesense: ^3.0.0 + peerDependenciesMeta: + '@ai-sdk/openai-compatible': + optional: true + '@astrojs/cloudflare': + optional: true + '@astrojs/netlify': + optional: true + '@astrojs/svelte': + optional: true + '@astrojs/vue': + optional: true + '@mixedbread/sdk': + optional: true + '@notionhq/client': + optional: true + '@openrouter/ai-sdk-provider': + optional: true + '@oramacloud/client': + optional: true + '@sanity/client': + optional: true + algoliasearch: + optional: true + flexsearch: + optional: true + typesense: + optional: true + body-parser@1.20.4: resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -8278,19 +9015,27 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} + ci-info@4.4.0: + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} + engines: {node: '>=8'} + + citty@0.1.6: + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + cjs-module-lexer@1.4.3: resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} cjs-module-lexer@2.2.0: resolution: {integrity: sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==} - class-variance-authority@0.7.1: - resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} - classcat@5.0.5: resolution: {integrity: sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==} @@ -8371,6 +9116,10 @@ packages: comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + commander@12.1.0: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} @@ -8399,23 +9148,16 @@ packages: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} + common-ancestor-path@2.0.0: + resolution: {integrity: sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==} + engines: {node: '>= 18'} + commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} - compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} - - compression@1.8.1: - resolution: {integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==} - engines: {node: '>= 0.8.0'} - - compute-scroll-into-view@3.1.1: - resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} - concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -8431,16 +9173,13 @@ packages: confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - confbox@0.2.4: - resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - content-disposition@1.0.1: resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==} engines: {node: '>=18'} @@ -8530,6 +9269,9 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie-es@1.2.3: + resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==} + cookie-es@2.0.1: resolution: {integrity: sha512-aVf4A4hI2w70LnF7GG+7xDQUkliwiXWXFvTjkip4+b64ygDQ2sJPRSKFDHbxn8o0xu9QzPkMuuiWIXyFSE2slA==} @@ -8572,6 +9314,12 @@ packages: resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} engines: {node: '>= 0.10'} + cose-base@1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + + cose-base@2.2.0: + resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + create-jest@29.7.0: resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -8591,6 +9339,9 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + crossws@0.4.1: resolution: {integrity: sha512-E7WKBcHVhAVrY6JYD5kteNqVq1GSZxqGrdSiwXR9at+XHi43HJoCQKXcCczR5LBnBquFZPsB3o7HklulKoBU5w==} peerDependencies: @@ -8602,9 +9353,16 @@ packages: css-line-break@2.1.0: resolution: {integrity: sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==} + css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + css-select@5.2.2: resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + css-tree@3.2.1: resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} @@ -8621,6 +9379,10 @@ packages: engines: {node: '>=4'} hasBin: true + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + cssstyle@4.6.0: resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} engines: {node: '>=18'} @@ -8631,6 +9393,20 @@ packages: custom-event-polyfill@1.0.7: resolution: {integrity: sha512-TDDkd5DkaZxZFM8p+1I3yAlvM3rSr1wbrOliG4yJiwinMZN8z/iGL7BTlDkrJcYTmgUSb4ywVCc3ZaUtOtC76w==} + cytoscape-cose-bilkent@4.1.0: + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape-fcose@2.2.0: + resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape@3.34.0: + resolution: {integrity: sha512-62rNSrioXw93uliKFBwjukeQyeWwH2PqDrTac31r2P6464u3AUvTk0xS4LVvT251g7IgkFunrI48ZEZGjywSOg==} + engines: {node: '>=0.10'} + d3-array@2.12.1: resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} @@ -8790,6 +9566,9 @@ packages: resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} engines: {node: '>=12'} + dagre-d3-es@7.0.14: + resolution: {integrity: sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==} + dagre@0.8.5: resolution: {integrity: sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==} @@ -8818,6 +9597,9 @@ packages: dayjs@1.11.19: resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} + dayjs@1.11.21: + resolution: {integrity: sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==} + debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -8894,6 +9676,9 @@ packages: defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + delaunator@5.0.1: resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} @@ -8916,6 +9701,9 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -8937,15 +9725,18 @@ packages: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} - detect-node-es@1.1.0: - resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - devalue@5.6.1: resolution: {integrity: sha512-jDwizj+IlEZBunHcOuuFVBnIMPAEHvTsJj0BcIp94xYguLRVBcXO853px/MyIJvbVzWdsGvrRweIUWJw8hBP7A==} + devalue@5.8.1: + resolution: {integrity: sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw==} + devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + diacritics@1.3.0: + resolution: {integrity: sha512-wlwEkqcsaxvPJML+rDh/2iS824jbREk6DUMUKkEaSlxdYHeS43cClJtsWglvw2RfeXGm6ohKDqsXteJ5sP5enA==} + didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} @@ -8965,6 +9756,10 @@ packages: resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} engines: {node: '>=0.3.1'} + diff@9.0.0: + resolution: {integrity: sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==} + engines: {node: '>=0.3.1'} + dijkstrajs@1.0.3: resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} @@ -9018,6 +9813,9 @@ packages: dompurify@3.3.3: resolution: {integrity: sha512-Oj6pzI2+RqBfFG+qOaOLbFXLQ90ARpcGG6UePL82bJLtdsa6CYJD7nmiU8MW9nQNOtCHV3lZ/Bzq1X0QYbBZCA==} + dompurify@3.4.12: + resolution: {integrity: sha512-zQvGet8Z2sWbQhCmfFz/T5QWH2oBmjnqK3qvOjaqaNLrLEF912WamU+ohnTp0TCep/MFVHpdJuCZEdFOdTnEFg==} + domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} @@ -9028,6 +9826,10 @@ packages: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} + dot-prop@6.0.1: + resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} + engines: {node: '>=10'} + dotenv@16.6.1: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} @@ -9136,6 +9938,10 @@ packages: sqlite3: optional: true + dset@3.1.4: + resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} + engines: {node: '>=4'} + duck@0.1.12: resolution: {integrity: sha512-wkctla1O6VfP89gQ+J/yDesM0S7B7XLXjKGzXxMDVFg7uEn706niAtyYovKbyq1oT9YwDcly721/iUWoc8MVRg==} @@ -9146,6 +9952,11 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + electron-to-chromium@1.5.267: resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} @@ -9156,6 +9967,9 @@ packages: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} + emmet@2.4.11: + resolution: {integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==} + emoji-regex-xs@1.0.0: resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} @@ -9186,6 +10000,10 @@ packages: entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + entities@3.0.1: + resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} + engines: {node: '>=0.12'} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -9198,6 +10016,14 @@ packages: resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} engines: {node: '>=0.12'} + entities@8.0.0: + resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} + engines: {node: '>=20.19.0'} + + epub-gen-memory@1.1.2: + resolution: {integrity: sha512-vwGM6MVNqKIskFzPZqhi4ZOs0ZTUXco9oDuHFX1vB2Il9pTAkaHWFBFgHrrl832dYmBPb/raGVUZXFvZYueRyw==} + engines: {node: '>=10.0.0'} + error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} @@ -9218,6 +10044,9 @@ packages: es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-module-lexer@2.3.1: + resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} + es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -9229,6 +10058,9 @@ packages: es-toolkit@1.43.0: resolution: {integrity: sha512-SKCT8AsWvYzBBuUqMk4NPwFlSdqLpJwmy6AP322ERn8W2YLIB6JBXnwMI2Qsh2gfphT3q7EKAxKb23cvFHFwKA==} + es-toolkit@1.49.0: + resolution: {integrity: sha512-G5iZ6Pc/FNRY/soKZHC+TxGDD83rHUDXxzaWhGCX44vAv/tMs56WMusnm/KMNK+luUPsgA9U28cGr4RDlSzL2g==} + es6-promise@3.3.1: resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} @@ -9278,6 +10110,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.28.1: + resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -9418,9 +10255,6 @@ packages: estree-util-to-js@2.0.0: resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} - estree-util-value-to-estree@3.5.0: - resolution: {integrity: sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==} - estree-util-visit@2.0.0: resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} @@ -9438,6 +10272,13 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + eventsource-parser@3.0.6: resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} engines: {node: '>=18.0.0'} @@ -9480,10 +10321,6 @@ packages: peerDependencies: express: '>= 4.11' - express@4.22.1: - resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==} - engines: {node: '>= 0.10.0'} - express@5.2.1: resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} engines: {node: '>= 18'} @@ -9491,6 +10328,10 @@ packages: exsolve@1.0.8: resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -9514,9 +10355,18 @@ packages: fast-sha256@1.3.0: resolution: {integrity: sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==} + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fast-wrap-ansi@0.2.2: + resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} + fast-xml-parser@5.2.5: resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} hasBin: true @@ -9566,14 +10416,13 @@ packages: file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + filelist@1.0.6: + resolution: {integrity: sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - finalhandler@1.3.2: - resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==} - engines: {node: '>= 0.8'} - finalhandler@2.1.1: resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} engines: {node: '>= 18.0.0'} @@ -9605,6 +10454,10 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + flattie@1.1.1: + resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} + engines: {node: '>=8'} + follow-redirects@1.15.11: resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} engines: {node: '>=4.0'} @@ -9614,6 +10467,13 @@ packages: debug: optional: true + fontace@0.4.1: + resolution: {integrity: sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==} + + fontkitten@1.0.3: + resolution: {integrity: sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==} + engines: {node: '>=20'} + for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} @@ -9649,10 +10509,6 @@ packages: framesync@6.1.2: resolution: {integrity: sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g==} - fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - fresh@2.0.0: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} @@ -9678,79 +10534,6 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - fumadocs-core@16.2.1: - resolution: {integrity: sha512-UpvXlOLpOfjc5RZ/x/xNP2rAQJuy4J3nUUNHdDCq1dhj3y5UeVPVbmhwoQNdbM2fWNvtjgrv5j9miCeOCZJD1w==} - peerDependencies: - '@mixedbread/sdk': ^0.19.0 - '@orama/core': 1.x.x - '@tanstack/react-router': 1.x.x - '@types/react': '*' - algoliasearch: 5.x.x - lucide-react: '*' - next: 16.x.x - react: ^19.2.0 - react-dom: ^19.2.0 - react-router: 7.x.x - waku: ^0.26.0 || ^0.27.0 - peerDependenciesMeta: - '@mixedbread/sdk': - optional: true - '@orama/core': - optional: true - '@tanstack/react-router': - optional: true - '@types/react': - optional: true - algoliasearch: - optional: true - lucide-react: - optional: true - next: - optional: true - react: - optional: true - react-dom: - optional: true - react-router: - optional: true - waku: - optional: true - - fumadocs-mdx@14.0.4: - resolution: {integrity: sha512-q8g/cnFByFkdxvkUgHLsn7QrT4uHY3XkBFd5YJrbpI8cxlV8v64lS6Yrkmu/gigiuvLkysZN6zXVVIbdZcoZvw==} - hasBin: true - peerDependencies: - '@fumadocs/mdx-remote': ^1.4.0 - fumadocs-core: ^15.0.0 || ^16.0.0 - next: ^15.3.0 || ^16.0.0 - react: '*' - vite: 6.x.x || 7.x.x - peerDependenciesMeta: - '@fumadocs/mdx-remote': - optional: true - next: - optional: true - react: - optional: true - vite: - optional: true - - fumadocs-ui@16.2.1: - resolution: {integrity: sha512-wyZmOZI1pUOEKUXPcQu3PIPfPk8GgcvmQc/YIUom6uAhzhnyhOIl0rhxnrrWx68elUSw6T3tpbt13iQtrFDJeA==} - peerDependencies: - '@types/react': '*' - next: 16.x.x - react: ^19.2.0 - react-dom: ^19.2.0 - tailwindcss: ^4.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - next: - optional: true - tailwindcss: - optional: true - function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} @@ -9792,10 +10575,6 @@ packages: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} - get-nonce@1.0.1: - resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} - engines: {node: '>=6'} - get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} @@ -9805,14 +10584,6 @@ packages: engines: {node: '>=6.9.0'} hasBin: true - get-port@5.1.1: - resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} - engines: {node: '>=8'} - - get-port@7.2.0: - resolution: {integrity: sha512-afP4W205ONCuMoPBqcR6PSXnzX35KTcJygfJfcp+QY+uwm3p20p1YczWXhlICIzGMCxYBQcySEcOgsJcrkyobg==} - engines: {node: '>=16'} - get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -9831,10 +10602,14 @@ packages: get-tsconfig@4.13.0: resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} + get-tsconfig@5.0.0-beta.4: + resolution: {integrity: sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ==} + engines: {node: '>=20.20.0'} + git-raw-commits@2.0.11: resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} engines: {node: '>=10'} - deprecated: Deprecated and no longer maintained. Use @conventional-changelog/git-client instead. + deprecated: This package is no longer maintained. For the JavaScript API, please use @conventional-changelog/git-client instead. hasBin: true git-remote-origin-url@2.0.0: @@ -9844,7 +10619,7 @@ packages: git-semver-tags@4.1.1: resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==} engines: {node: '>=10'} - deprecated: Deprecated and no longer maintained. Use @conventional-changelog/git-client instead. + deprecated: This package is no longer maintained. For the JavaScript API, please use @conventional-changelog/git-client instead. hasBin: true gitconfiglocal@1.0.0: @@ -9912,6 +10687,13 @@ packages: graphlib@2.1.8: resolution: {integrity: sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==} + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + + h3@1.15.11: + resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} + h3@2.0.1-rc.6: resolution: {integrity: sha512-kKLFVFNJlDVTbQjakz1ZTFSHB9+oi9+Khf0v7xQsUKU3iOqu2qmrFzTD56YsDvvj2nBgqVDphGRXB2VRursw4w==} engines: {node: '>=20.11.1'} @@ -9921,6 +10703,9 @@ packages: crossws: optional: true + hachure-fill@0.5.2: + resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} + handlebars@4.7.8: resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} engines: {node: '>=0.4.7'} @@ -9960,6 +10745,12 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} + + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + hast-util-has-property@3.0.0: resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} @@ -9969,6 +10760,15 @@ packages: hast-util-interactive@3.0.0: resolution: {integrity: sha512-9VFa3kP6AT40BNYcPmn3jpsG+1KPDF0rUFCrFVQDUsuUXZ3YLODm8UGV0tmYzFpcOIQXTAOi2ccS3ywlj2dQTA==} + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + hast-util-to-estree@3.1.3: resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==} @@ -9978,12 +10778,21 @@ packages: hast-util-to-jsx-runtime@2.3.6: resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + hast-util-to-parse5@8.0.1: + resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} + hast-util-to-string@3.0.1: resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} + hast-util-to-text@4.0.2: + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + hey-listen@1.0.8: resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} @@ -10043,6 +10852,9 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + html-escaper@3.0.3: + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + html-to-image@1.11.13: resolution: {integrity: sha512-cuOPoI7WApyhBElTTb9oqsawRvZ0rHhaHwghRLlTuffoD1B2aDemlCruLeZrUIIdvG7gs9xeELEPm6PhuASqrg==} @@ -10059,6 +10871,12 @@ packages: htmlparser2@10.1.0: resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} + htmlparser2@7.2.0: + resolution: {integrity: sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==} + + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + http-errors@2.0.1: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} @@ -10107,11 +10925,6 @@ packages: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} - image-size@2.0.2: - resolution: {integrity: sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==} - engines: {node: '>=16.x'} - hasBin: true - immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} @@ -10188,6 +11001,9 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} @@ -10240,6 +11056,15 @@ packages: engines: {node: '>=8'} hasBin: true + is-docker@4.0.0: + resolution: {integrity: sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==} + engines: {node: '>=20'} + hasBin: true + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -10414,6 +11239,11 @@ packages: resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} + jake@10.9.4: + resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} + engines: {node: '>=10'} + hasBin: true + jessy@3.1.1: resolution: {integrity: sha512-Eivuwu3H8qfm4DldbyBci4RJMgoPK3pT3BCzIWNrGPOatkl4jh91PO4LZp7N2zIz8jQlYqs5bPKOkf138jRYqw==} engines: {node: '>=4'} @@ -10558,6 +11388,9 @@ packages: joi@17.13.3: resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} + jose@5.10.0: + resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==} + jose@6.1.3: resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==} @@ -10597,11 +11430,6 @@ packages: canvas: optional: true - jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} - hasBin: true - jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -10639,6 +11467,9 @@ packages: engines: {node: '>=6'} hasBin: true + jsonc-parser@2.3.1: + resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==} + jsonc-parser@3.3.1: resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} @@ -10649,6 +11480,10 @@ packages: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + jspdf-autotable@3.8.4: resolution: {integrity: sha512-rSffGoBsJYX83iTRv8Ft7FhqfgEL2nLpGAIiqruEQQ3e4r0qdLFbPUB7N9HAle0I3XgpisvyW751VHCqKUVOgQ==} peerDependencies: @@ -10679,9 +11514,20 @@ packages: resolution: {integrity: sha512-aeQoDkuRWSqQN6nSvVCEFvfXdqo1OQiCmmW1kc9xSdjutPv7BGO7pqY9sQRJpMOGrEdfDgF2TfRXe5eUAD2Waw==} hasBin: true + katex@0.16.47: + resolution: {integrity: sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==} + hasBin: true + + katex@0.17.0: + resolution: {integrity: sha512-Vdw0ATsQ9V+LuegM/BTwQqV/6cTl5lbGcIrU+BCgLxyf6bo38ybOr372tuSIxir3CN720flu1meYR6XzNMwQnw==} + hasBin: true + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} @@ -10710,10 +11556,20 @@ packages: peerDependencies: svelte: ^5.0.0 + layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + + layout-base@2.0.1: + resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} + leven@4.1.0: + resolution: {integrity: sha512-KZ9W9nWDT7rF7Dazg8xyLHGLrmpgq2nVNFUckhqdW3szVP6YhCpp/RAnpmVExA9JvrMynjwSLVrEj3AepHR6ew==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -10990,6 +11846,10 @@ packages: lodash.isarguments@3.1.0: resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. + lodash.ismatch@4.4.0: resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} @@ -11024,10 +11884,6 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.2.4: - resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} - engines: {node: 20 || >=22} - lru-cache@11.2.7: resolution: {integrity: sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==} engines: {node: 20 || >=22} @@ -11039,13 +11895,8 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} - lucide-react@0.562.0: - resolution: {integrity: sha512-82hOAu7y0dbVuFfmO4bYF1XEwYk/mEbM5E+b1jgci/udUBEE/R7LF5Ip0CCEmXe8AybRM8L+04eP+LGZeDvkiw==} - peerDependencies: - react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - lucide-static@0.552.0: - resolution: {integrity: sha512-wL+9EAx8k/4i/w9qGuAwHrrV8SryVsJk+Ug9SErtg18Zq95FMwMXlu4Dhl4RS8C2b1oxFu66p7YK96yrNsm6cg==} + lru_map@0.4.1: + resolution: {integrity: sha512-I+lBvqMMFfqaV8CJCISjI3wbjmwVu/VyOoU7+qtu9d7ioW5klMgsTTiUOUp+DJvfTTzKXoPbyC6YfgkNcyPSOg==} lucide-svelte@0.468.0: resolution: {integrity: sha512-n0ecAFtCY5LEeL+PJ1Xj4n3c2gzj8tMpak0KMGnvoSJEjCsCnRB0mekBtJZAo7beyynW9Qj5Um1KfMBAeTNplw==} @@ -11067,6 +11918,9 @@ packages: magicast@0.3.5: resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + magicast@0.5.3: + resolution: {integrity: sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==} + make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} @@ -11113,6 +11967,16 @@ packages: engines: {node: '>= 18'} hasBin: true + marked@16.4.2: + resolution: {integrity: sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==} + engines: {node: '>= 20'} + hasBin: true + + marked@18.0.6: + resolution: {integrity: sha512-MrV5puXBfuiy6wl6DLaq3BtIJQAJToAd5zt/ZKhRfGRAuFPALE7/4Y7jnxRQoEgK/pBgurGqLyAuRgZ2xOjr6w==} + engines: {node: '>= 20'} + hasBin: true + marked@7.0.5: resolution: {integrity: sha512-lwNAFTfXgqpt/XvK17a/8wY9/q6fcSPZT1aP6QW0u74VwaJF/Z9KbRcX23sWE4tODM+AolJNcUtErTkgOeFP/Q==} engines: {node: '>= 16'} @@ -11122,6 +11986,9 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + mdast-util-definitions@6.0.0: + resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} + mdast-util-find-and-replace@3.0.2: resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} @@ -11173,6 +12040,9 @@ packages: mdast-util-toc@7.1.0: resolution: {integrity: sha512-2TVKotOQzqdY7THOdn2gGzS9d1Sdd66bvxUyw3aNpWfcPXCLYSJCCgfPy30sEtuzkDraJgqF35dzgmz6xlvH/w==} + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + mdn-data@2.27.1: resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} @@ -11206,9 +12076,6 @@ packages: resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} engines: {node: '>=10'} - merge-descriptors@1.0.3: - resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} - merge-descriptors@2.0.0: resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} engines: {node: '>=18'} @@ -11220,9 +12087,8 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} + mermaid@11.16.0: + resolution: {integrity: sha512-Zvm3kbstgdpvIJPPItlL7fppIZ3kibvc1oZIGxdvk9t6UFz6flv+Jw7FtRGKwfcI8OckmH04LqG6LlS6X4B1pA==} micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} @@ -11349,9 +12215,9 @@ packages: resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} engines: {node: '>=18'} - mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} hasBin: true mime@3.0.0: @@ -11384,11 +12250,6 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - miniflare@4.20251125.0: - resolution: {integrity: sha512-xY6deLx0Drt8GfGG2Fv0fHUocHAIG/Iv62Kl36TPfDzgq7/+DQ5gYNisxnmyISQdA/sm7kOvn2XRBncxjWYrLg==} - engines: {node: '>=18.0.0'} - hasBin: true - miniflare@4.20260426.0: resolution: {integrity: sha512-KM+v76d04qT+NsPfVKVQEgnnuLNE3uzCCl2QKMTJ5OXor5JbBm1vpkQwQ+l7o5ELCrZ74RnyKhJKLiJyUA39Tw==} engines: {node: '>=18.0.0'} @@ -11436,6 +12297,10 @@ packages: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -11460,10 +12325,6 @@ packages: module-details-from-path@1.0.4: resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} - morgan@1.10.1: - resolution: {integrity: sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==} - engines: {node: '>= 0.8.0'} - motion-dom@12.38.0: resolution: {integrity: sha512-pdkHLD8QYRp8VfiNLb8xIBJis1byQ9gPT3Jnh2jqfFtAsWUA3dEepDlsWe/xMpO8McV+VdpKVcp+E+TGJEtOoA==} @@ -11491,6 +12352,9 @@ packages: msgpackr@1.11.12: resolution: {integrity: sha512-RBdJ1Un7yGlXWajrkxcSa93nvQ0w4zBf60c0yYv7YtBelP8H2FA7XsfBbMHtXKXUMUxH7zV3Zuozh+kUQWhHvg==} + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + mustache@4.2.0: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} hasBin: true @@ -11511,6 +12375,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@3.3.16: + resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + nanoid@5.1.5: resolution: {integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==} engines: {node: ^18 || >=20} @@ -11528,14 +12397,6 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - - negotiator@0.6.4: - resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} - engines: {node: '>= 0.6'} - negotiator@1.0.0: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} @@ -11543,11 +12404,12 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - next-themes@0.4.6: - resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} - peerDependencies: - react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + neotraverse@0.6.18: + resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} + engines: {node: '>= 10'} + + nlcst-to-string@4.0.0: + resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} node-abort-controller@3.1.1: resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} @@ -11562,6 +12424,9 @@ packages: node-ensure@0.0.0: resolution: {integrity: sha512-DRI60hzo2oKN1ma0ckc6nQWlHU69RH6xN0sjQTjMpChPfTYvKZdcQFfdYK2RWbJcKyUizSIy/l8OTGxMAM1QDw==} + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -11583,9 +12448,15 @@ packages: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true + node-html-parser@9.0.0: + resolution: {integrity: sha512-MhdaHPyxnyYu/sf0TpiRvDnTrkum0UKHC7FdbDGIUQNlx3I7xzwXoyV0eMUMv/XU+lkJT1glOUzpDPq7b2p1Ew==} + node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + node-mock-http@1.0.4: + resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} + node-releases@2.0.27: resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} @@ -11604,6 +12475,11 @@ packages: engines: {node: '>=6'} hasBin: true + nopt@8.1.0: + resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -11623,10 +12499,6 @@ packages: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - npm-to-yarn@3.0.1: - resolution: {integrity: sha512-tt6PvKu4WyzPwWUzy/hvPFqn+uwXO0K1ZHka8az3NnrhWJDmSqI8ncWq0fkL0k/lmmi5tAC11FXwXuh0rFbt1A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - npmlog@5.0.1: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} deprecated: This package is no longer supported. @@ -11661,21 +12533,20 @@ packages: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} + obug@2.1.3: + resolution: {integrity: sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==} + engines: {node: '>=12.20.0'} + + ofetch@1.5.1: + resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} + ohash@2.0.11: resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} - on-finished@2.3.0: - resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} - engines: {node: '>= 0.8'} - on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} - on-headers@1.1.0: - resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} - engines: {node: '>= 0.8'} - once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -11694,12 +12565,18 @@ packages: oniguruma-parser@0.12.1: resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} + oniguruma-parser@0.12.2: + resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} + oniguruma-to-es@2.3.0: resolution: {integrity: sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==} oniguruma-to-es@4.3.4: resolution: {integrity: sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==} + oniguruma-to-es@4.3.6: + resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} + open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -11738,10 +12615,18 @@ packages: orderedmap@2.1.1: resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} + os-paths@4.4.0: + resolution: {integrity: sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg==} + engines: {node: '>= 6.0'} + os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} + ow@0.28.2: + resolution: {integrity: sha512-dD4UpyBh/9m4X2NVjA+73/ZPBRF+uF4zIMFvvQsabMiEK8x41L3rQ8EENOi35kyyoaJwNxEeJcP6Fj1H4U409Q==} + engines: {node: '>=12'} + oxc-parser@0.112.0: resolution: {integrity: sha512-7rQ3QdJwobMQLMZwQaPuPYMEF2fDRZwf51lZ//V+bA37nejjKW5ifMHbbCwvA889Y4RLhT+/wLJpPRhAoBaZYw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -11762,6 +12647,10 @@ packages: resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} engines: {node: '>=18'} + p-limit@7.3.0: + resolution: {integrity: sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==} + engines: {node: '>=20'} + p-locate@2.0.0: resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} engines: {node: '>=4'} @@ -11778,9 +12667,13 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-map@7.0.4: - resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} - engines: {node: '>=18'} + p-queue@9.3.1: + resolution: {integrity: sha512-POWdiIPmsUPGwb4FeQ4OBg46aqmcInSWe45CKDsGHiOBiVQM9chqfQTuqhuTzcg2Vz9faTI65at0KkVyVEiCHw==} + engines: {node: '>=20'} + + p-timeout@7.0.1: + resolution: {integrity: sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==} + engines: {node: '>=20'} p-try@1.0.0: resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} @@ -11793,6 +12686,13 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-manager-detector@1.7.0: + resolution: {integrity: sha512-xg1eHpwYL/D/HEdWw2goFZP6vV0FH7W+PZ5rFkGjdIDLtxq7EkzBUeT3m+lndYCt8wKbmofUu1MUdMCXkCk9ZQ==} + + pagefind@1.5.2: + resolution: {integrity: sha512-XTUaK0hXMCu2jszWE584JGQT7y284TmMV9l/HX3rnG5uo3rHI/uHU56XTyyyPFjeWEBxECbAi0CaFDJOONtG0Q==} + hasBin: true + pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} @@ -11814,6 +12714,9 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} + parse-latin@7.0.0: + resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} + parse-srcset@1.0.2: resolution: {integrity: sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==} @@ -11833,6 +12736,12 @@ packages: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-data-parser@0.1.0: + resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} + path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} @@ -11860,8 +12769,8 @@ packages: resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} engines: {node: 18 || 20 || >=22} - path-to-regexp@0.1.13: - resolution: {integrity: sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==} + path-to-regexp@6.1.0: + resolution: {integrity: sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==} path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} @@ -11931,6 +12840,9 @@ packages: pgpass@1.0.5: resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} + piccolore@0.1.3: + resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -11942,8 +12854,8 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} - picomatch@4.0.4: - resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} engines: {node: '>=12'} pify@2.3.0: @@ -11969,9 +12881,6 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - pkg-types@2.3.0: - resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} - playwright-core@1.57.0: resolution: {integrity: sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==} engines: {node: '>=18'} @@ -11997,6 +12906,12 @@ packages: resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} engines: {node: '>=10.13.0'} + points-on-curve@0.2.0: + resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} + + points-on-path@0.2.1: + resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} + polished@4.3.1: resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} engines: {node: '>=10'} @@ -12077,12 +12992,12 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + postcss@8.5.19: + resolution: {integrity: sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.9: - resolution: {integrity: sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} postgres-array@2.0.0: @@ -12213,6 +13128,10 @@ packages: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} + process-ancestry@0.1.0: + resolution: {integrity: sha512-tGqJW/UnclpYASFcM6Xh8D8l/BMtaQ9+CSG0vlJSJTcdMM4lDRv4c6H0Pdcsfted+bVczdYSfk2fdukg2gQkZg==} + engines: {node: '>=18.0.0'} + process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -12342,6 +13261,9 @@ packages: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + raf@3.4.1: resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} @@ -12371,56 +13293,10 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react-medium-image-zoom@5.4.0: - resolution: {integrity: sha512-BsE+EnFVQzFIlyuuQrZ9iTwyKpKkqdFZV1ImEQN573QPqGrIUuNni7aF+sZwDcxlsuOMayCr6oO/PZR/yJnbRg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - react-refresh@0.14.2: - resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + react-refresh@0.18.0: + resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} engines: {node: '>=0.10.0'} - react-remove-scroll-bar@2.3.8: - resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - react-remove-scroll@2.7.2: - resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - react-router@7.13.2: - resolution: {integrity: sha512-tX1Aee+ArlKQP+NIUd7SE6Li+CiGKwQtbS+FfRxPX6Pe4vHOo6nr9d++u5cwg+Z8K/x8tP+7qLmujDtfrAoUJA==} - engines: {node: '>=20.0.0'} - peerDependencies: - react: '>=18' - react-dom: '>=18' - peerDependenciesMeta: - react-dom: - optional: true - - react-style-singleton@2.2.3: - resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - react@19.2.3: resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} engines: {node: '>=0.10.0'} @@ -12544,12 +13420,18 @@ packages: resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} hasBin: true + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + rehype-recma@1.0.0: resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} rehype-slug@6.0.0: resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} + rehype-stringify@10.0.1: + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} + rehype-unwrap-images@1.0.0: resolution: {integrity: sha512-wzW5Mk9IlVF2UwXC5NtIZsx1aHYbV8+bLWjJnlZaaamz5QU52RppWtq1uEZJqGo8d9Y4RuDqidB6r9RFpKugIg==} @@ -12565,6 +13447,10 @@ packages: remark-rehype@11.1.2: resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + remark-smartypants@3.0.2: + resolution: {integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==} + engines: {node: '>=16.0.0'} + remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} @@ -12574,8 +13460,11 @@ packages: remark-unwrap-images@4.0.1: resolution: {integrity: sha512-J9HibCHx0/X7ovgqaFe0otizCHpbb1s6Jh3IeiD5ibQm2Oz/OhCDXSKMEW5T54iBw5CxuqRL6BrYp+jLLdqBOw==} - remark@15.0.1: - resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + request-light@0.5.8: + resolution: {integrity: sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==} + + request-light@0.7.0: + resolution: {integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==} require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} @@ -12620,6 +13509,18 @@ packages: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} + retext-latin@4.0.0: + resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} + + retext-smartypants@6.2.0: + resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==} + + retext-stringify@4.0.0: + resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==} + + retext@9.0.0: + resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} + reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -12646,6 +13547,11 @@ packages: robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + rolldown@1.1.5: + resolution: {integrity: sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rollup@4.54.0: resolution: {integrity: sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -12657,6 +13563,9 @@ packages: rou3@0.7.12: resolution: {integrity: sha512-iFE4hLDuloSWcD7mjdCDhx2bKcIsYbtOTpfH5MHHLSKMOUyjqQXTeZVa289uuwEGEKFoE/BAPbhaU4B774nceg==} + roughjs@4.6.6: + resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} + router@2.2.0: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} @@ -12750,6 +13659,13 @@ packages: engines: {node: '>=14.0.0'} hasBin: true + satteri@0.9.5: + resolution: {integrity: sha512-ZuWVl+vnM64y+/TtX8Kosv2c00W+hLQiiwnEL6H0UKVVrxFqMw4D2CJHHQaouVd89OAhtBBfjWLqhKi3TVUV4w==} + + sax@1.6.0: + resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} + engines: {node: '>=11.0.0'} + saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} @@ -12760,12 +13676,13 @@ packages: schema-dts@1.1.5: resolution: {integrity: sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==} - scroll-into-view-if-needed@3.1.0: - resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} - scule@1.3.0: resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -12784,10 +13701,6 @@ packages: engines: {node: '>=10'} hasBin: true - send@0.19.2: - resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} - engines: {node: '>= 0.8.0'} - send@1.2.1: resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} engines: {node: '>= 18'} @@ -12812,14 +13725,13 @@ packages: resolution: {integrity: sha512-xcRN39BdsnO9Tf+VzsE7b3JyTJASItIV1FVFewJKCFcW4s4haIKS3e6vj8PGB9qBwC7tnuOywQMdv5N4qkzi7Q==} engines: {node: '>=10'} - serve-static@1.16.3: - resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} - engines: {node: '>= 0.8.0'} - serve-static@2.2.1: resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} engines: {node: '>= 18'} + server-destroy@1.0.1: + resolution: {integrity: sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==} + set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} @@ -12866,12 +13778,13 @@ packages: shiki@1.29.2: resolution: {integrity: sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==} - shiki@3.20.0: - resolution: {integrity: sha512-kgCOlsnyWb+p0WU+01RjkCH+eBVsjL1jOwUYWv0YDWkM2/A46+LDKVs5yZCUXjJG6bj4ndFoAg5iLIIue6dulg==} - shiki@3.22.0: resolution: {integrity: sha512-LBnhsoYEe0Eou4e1VgJACes+O6S6QC0w71fCSp5Oya79inkwkm15gQ1UF6VtQ8j/taMDh79hAB49WUk8ALQW3g==} + shiki@4.3.1: + resolution: {integrity: sha512-oR+qDVi2OjX1tmDpyv+3KviX01KzO6Af+0NNnKnsp9491UEGz2YpxTuJboS/6VhYpTdqzmuJBuiTlrAWWJAssw==} + engines: {node: '>=20'} + side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} @@ -12898,6 +13811,10 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-icons@13.21.0: + resolution: {integrity: sha512-LI5pVJPBv6oc79OMsffwb6kEqnmB8P1Cjg1crNUlhsxPETQ5UzbCKQdxU+7MW6+DD1qfPkla/vSKlLD4IfyXpQ==} + engines: {node: '>=0.12.18'} + simple-icons@16.9.0: resolution: {integrity: sha512-aKst2C7cLkFyaiQ/Crlwxt9xYOpGPk05XuJZ0ZTJNNCzHCKYrGWz2ebJSi5dG8CmTCxUF/BGs6A8uyJn/EQxqw==} engines: {node: '>=0.12.18'} @@ -12920,6 +13837,14 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} + slugify@1.6.9: + resolution: {integrity: sha512-vZ7rfeehZui7wQs438JXBckYLkIIdfHOXsaVEUMyS5fHo1483l1bMdo0EDSWYclY0yZKFOipDy4KHuKs6ssvdg==} + engines: {node: '>=8.0.0'} + + smol-toml@1.7.0: + resolution: {integrity: sha512-aqVvWoyO21L23mb+drl4RmMXbf6N7FdHjAhTRA9ZBL7apWBgfWC16KjrASI+1p9GAroljyMHj6fK67i0UiTNvQ==} + engines: {node: '>= 18'} + solid-js@1.9.10: resolution: {integrity: sha512-Coz956cos/EPDlhs6+jsdTxKuJDPT7B5SVIWgABwROyxjY7Xbr8wkzD68Et+NxnV7DLJ3nJdAC2r9InuV/4Jew==} @@ -13071,6 +13996,10 @@ packages: resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -13114,6 +14043,9 @@ packages: style-value-types@5.1.2: resolution: {integrity: sha512-Vs9fNreYF9j6W2VvuDTP7kepALi7sk0xtk2Tu8Yxi9UoajJdEVpNpCov0HsLTqXvNGKX+Uv09pkozVITi1jf3Q==} + stylis@4.4.0: + resolution: {integrity: sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==} + sucrase@3.35.1: resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} engines: {node: '>=16 || 14 >=14.17'} @@ -13342,6 +14274,11 @@ packages: resolution: {integrity: sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==} engines: {node: '>=12.0.0'} + svgo@4.0.2: + resolution: {integrity: sha512-ekx94z1rRc5LDi6oSUaeRnYhd0UOJxdtQCL2rF8xpWxD3TPAsISWOrxezqGovqS38GRZOdpDfvQe3ts6F7nsng==} + engines: {node: '>=16'} + hasBin: true + symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} @@ -13402,6 +14339,10 @@ packages: tailwindcss@4.2.2: resolution: {integrity: sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==} + takumi-js@2.4.0: + resolution: {integrity: sha512-CX3Tl5B8o0G1qlnc0CGs4Ez/FZhVdFaYyST40MNsLQDtV4QnBebplkl+rcbLeV2hhC0B3eii3y9VVrSoMOhckw==} + engines: {node: '>=18'} + tapable@2.3.0: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} @@ -13411,6 +14352,10 @@ packages: engines: {node: '>=10'} deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + tar@7.5.20: + resolution: {integrity: sha512-9FcyK4PA6+WbzlTM9WhQm6vB5W7cP7dUiPsv1g7YDwEQnQ1CGpK3MGlKk/ITVWMk05kHZuBhmVhiv8LZoy/PFQ==} + engines: {node: '>=18'} + test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} @@ -13444,6 +14389,9 @@ packages: tiny-glob@0.2.9: resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} + tiny-inflate@1.0.3: + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} @@ -13453,19 +14401,23 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + tinyclip@0.1.15: + resolution: {integrity: sha512-uo33abH+Ays0xYaDysoBt494Hb3hsEczMpcC0MwFl773pazORx4fmvKhclhR1wonUbB6vvpRsvVMwnhfqeMc+A==} + engines: {node: ^16.14.0 || >= 17.3.0} + tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyexec@1.0.2: - resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + tinyexec@1.2.4: + resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} engines: {node: '>=18'} tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} - tinyglobby@0.2.16: - resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} tinypool@0.8.4: @@ -13636,17 +14588,6 @@ packages: engines: {node: '>=16.20.2'} hasBin: true - tsconfck@3.1.6: - resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} - engines: {node: ^18 || >=20} - deprecated: unmaintained - hasBin: true - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - tslib@2.4.0: resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} @@ -13695,6 +14636,14 @@ packages: tw-animate-css@1.4.0: resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} + twoslash-protocol@0.3.9: + resolution: {integrity: sha512-9/iwp+CXOnjFMPQuPL5PkuRbZnDoNpBvtJCLs9t8kDYkL3YHujbvnHfZA1i5fApDftVEdBw+T/4F+dH5kIzpYQ==} + + twoslash@0.3.9: + resolution: {integrity: sha512-rDclk+OtzuTX+tnea7DYLCkqGQ3eP0IyfD+kzUJ7t46X/NzlaxwrhecmEBNuSCuEn3V+n1PhcjUUQQ7gUJzX5Q==} + peerDependencies: + typescript: ^5.5.0 || ^6.0.0 + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -13739,6 +14688,10 @@ packages: resolution: {integrity: sha512-GeJop7+u7BYlQ6yQCAY1nBQiRSHR+6OdCEtd8Bwp9a3NK3+fWAVjOaPKJDteB9f6cIJ0wt4IfnScjLG450EpXA==} engines: {node: '>=20'} + type-fest@5.8.0: + resolution: {integrity: sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA==} + engines: {node: '>=20'} + type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -13750,6 +14703,12 @@ packages: typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + typesafe-path@0.2.2: + resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==} + + typescript-auto-import-cache@0.3.6: + resolution: {integrity: sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==} + typescript-eslint@8.50.1: resolution: {integrity: sha512-ytTHO+SoYSbhAH9CrYnMhiLx8To6PSSvqnvXyPUgPETCvB6eBKmTI9w6XMPS3HsBRGkwTVBX+urA8dYQx6bHfQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -13765,6 +14724,11 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} + engines: {node: '>=14.17'} + hasBin: true + uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} @@ -13776,12 +14740,18 @@ packages: engines: {node: '>=0.8.0'} hasBin: true + ultrahtml@1.7.0: + resolution: {integrity: sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==} + unconfig-core@7.5.0: resolution: {integrity: sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==} unconfig@7.5.0: resolution: {integrity: sha512-oi8Qy2JV4D3UQ0PsopR28CzdQ3S/5A1zwsUwp/rosSbfhJ5z7b90bIyTwi/F7hCLD4SGcZVjDzd4XoUQcEanvA==} + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + underscore@1.13.8: resolution: {integrity: sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==} @@ -13795,10 +14765,6 @@ packages: resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} engines: {node: '>=14.0'} - undici@7.14.0: - resolution: {integrity: sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ==} - engines: {node: '>=20.18.1'} - undici@7.24.6: resolution: {integrity: sha512-Xi4agocCbRzt0yYMZGMA6ApD7gvtUFaxm4ZmeacWI4cZxaF6C+8I8QfofC20NAePiB/IcvZmzkJ7XPa471AEtA==} engines: {node: '>=20.18.1'} @@ -13807,6 +14773,10 @@ packages: resolution: {integrity: sha512-6KQ/+QxK49Z/p3HO6E5ZCZWNnCasyZLa5ExaVYyvPxUwKtbCPMKELJOqh7EqOle0t9cH/7d2TaaTRRa6Nhs4YQ==} engines: {node: '>=20.18.1'} + undici@8.7.0: + resolution: {integrity: sha512-N7iQtfyLhIMOFgQubvmLV26svHpO0bqKnAiWotTQCVKCmWrcGbBotPuW1x+xwYZ2VHdSTVUfPQQnlEt1/LouTQ==} + engines: {node: '>=22.19.0'} + unenv@2.0.0-rc.17: resolution: {integrity: sha512-B06u0wXkEd+o5gOCMl/ZHl5cfpYbDZKAT+HWTL+Hws6jWu7dCiqBBXXXzMFcFVJb8D4ytAnYmxJA83uwOQRSsg==} @@ -13832,9 +14802,18 @@ packages: unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + unifont@0.7.4: + resolution: {integrity: sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg==} + + unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + unist-util-is@6.0.1: resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + unist-util-modify-children@4.0.0: + resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} + unist-util-position-from-estree@2.0.0: resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} @@ -13850,12 +14829,18 @@ packages: unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + unist-util-visit-children@3.0.0: + resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} + unist-util-visit-parents@6.0.2: resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -13876,6 +14861,68 @@ packages: resolution: {integrity: sha512-0IzJGKbD6qHm0wg5sNndcCjhNDrtAr08/mySr9TGJ6biD7N03ZldidqXopkOvhAABaeFtRGYBrX1YkgMhKrFOQ==} engines: {node: '>=10'} + unstorage@1.17.5: + resolution: {integrity: sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==} + peerDependencies: + '@azure/app-configuration': ^1.8.0 + '@azure/cosmos': ^4.2.0 + '@azure/data-tables': ^13.3.0 + '@azure/identity': ^4.6.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.26.0 + '@capacitor/preferences': ^6 || ^7 || ^8 + '@deno/kv': '>=0.9.0' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.34.3 + '@vercel/blob': '>=0.27.1' + '@vercel/functions': ^2.2.12 || ^3.0.0 + '@vercel/kv': ^1 || ^2 || ^3 + aws4fetch: ^1.0.20 + db0: '>=0.2.1' + idb-keyval: ^6.2.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.4 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@deno/kv': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/blob': + optional: true + '@vercel/functions': + optional: true + '@vercel/kv': + optional: true + aws4fetch: + optional: true + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + uploadthing: + optional: true + update-browserslist-db@1.2.3: resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true @@ -13888,26 +14935,6 @@ packages: url-polyfill@1.1.14: resolution: {integrity: sha512-p4f3TTAG6ADVF3mwbXw7hGw+QJyw5CnNGvYh5fCuQQZIiuKUswqcznyV3pGDP9j0TSmC4UvRKm8kl1QsX1diiQ==} - use-callback-ref@1.3.3: - resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - use-sidecar@1.1.3: - resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - use-sync-external-store@1.6.0: resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} peerDependencies: @@ -13923,13 +14950,13 @@ packages: util@0.12.5: resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - utrie@1.0.2: resolution: {integrity: sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==} + uuid@14.0.1: + resolution: {integrity: sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==} + hasBin: true + uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). @@ -13950,6 +14977,10 @@ packages: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} + vali-date@1.0.0: + resolution: {integrity: sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg==} + engines: {node: '>=0.10.0'} + valibot@1.3.1: resolution: {integrity: sha512-sfdRir/QFM0JaF22hqTroPc5xy4DimuGQVKFrzF1YfGwaS1nJot3Y8VqMdLO2Lg27fMzat2yD3pY5PbAYO39Gg==} peerDependencies: @@ -13971,6 +15002,9 @@ packages: peerDependencies: svelte: ^5.0.0 + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + vfile-message@2.0.4: resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} @@ -13990,24 +15024,11 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite-node@3.2.4: - resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - vite-plugin-css-injected-by-js@3.5.2: resolution: {integrity: sha512-2MpU/Y+SCZyWUB6ua3HbJCrgnF0KACAsmzOQt1UvRVJCGF6S8xdA3ZUhWcWdM9ivG4I5az8PnQmwwrkC2CAQrQ==} peerDependencies: vite: '>2.0.0-0' - vite-tsconfig-paths@5.1.4: - resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} - peerDependencies: - vite: '*' - peerDependenciesMeta: - vite: - optional: true - vite@5.4.21: resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} engines: {node: ^18.0.0 || >=20.0.0} @@ -14119,6 +15140,49 @@ packages: yaml: optional: true + vite@8.1.4: + resolution: {integrity: sha512-bTT9PsdWO+MQMNG9ZXIP/qM9wGh37DFxTV/sPq9cFpHr3w4jkgef032PkAL9jAqhk3Nz8NQw3O8n6/xFkqO4QQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.3.0 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + vitefu@1.1.1: resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} peerDependencies: @@ -14185,12 +15249,114 @@ packages: jsdom: optional: true + volar-service-css@0.0.71: + resolution: {integrity: sha512-wRRFt9BpjMKCazcgOh67MSjUjiWUCAh99DyYSDIOTuxaRjEtDC7PpB0k1Y1wbJIW/pVtMUSVbpPo3UGSm0Byxw==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-emmet@0.0.71: + resolution: {integrity: sha512-zqjzt6bN95e3CUstBm0PBFAJnrfz0ZAARka87fart46/gNCLLuP3Vujy8V/J8HEziTFLnfkgIASLFYPUhonJcA==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-html@0.0.71: + resolution: {integrity: sha512-e8tHPhgQ7ooLfudAEIku+kgd9pWkq3SSz8RbnQDI1+Eb8wbenkLGHqoirLqz5ORLV6wIMr2Iv08RWBG5eOcgpw==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-prettier@0.0.71: + resolution: {integrity: sha512-Rz7JVH3qD108UCdmIEiZvOBNljMt2nLFdbN8AXcDfn7xD9F5I2aCIsDVqBbXw21PsnxG0b7MfwtNF+zPS/NKUg==} + peerDependencies: + '@volar/language-service': ~2.4.0 + prettier: ^2.2 || ^3.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + prettier: + optional: true + + volar-service-typescript-twoslash-queries@0.0.71: + resolution: {integrity: sha512-9K2k72s4n7rV9s4bX0MyjbX9iBribvKZbBJKuEmTCZfeWJXs6Yh7bGpY4eoc7UufAjvpheBqwyZCOIPBvxCv0A==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-typescript@0.0.71: + resolution: {integrity: sha512-yTtM/BVT6hoyEYnDtaCyAtNhdNeS/mhTTABlBOdw3NNiRBUin3IznFJpgfjer4c6RYopiPjjQjc9VFhxVl1mLw==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-yaml@0.0.71: + resolution: {integrity: sha512-qYGWGuVpUTnZGu5P/CR4KLK4aIR8RrcVnmfZ2eRcj9q/I8VZCoC5yy9FtEvfNvnDp4MU17yhdJcvpQPIqhJS2Q==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + vscode-css-languageservice@6.3.10: + resolution: {integrity: sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA==} + + vscode-html-languageservice@5.6.2: + resolution: {integrity: sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg==} + + vscode-json-languageservice@4.1.8: + resolution: {integrity: sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==} + engines: {npm: '>=7.0.0'} + + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + vscode-jsonrpc@9.0.1: + resolution: {integrity: sha512-rfuA6T75H6m5EkbhtEPzre9pT0HPcDI2MMy4+nPFIBks5J8JBAUHD4tRYSgaBOijIEC7SRkC1kKyXTLqbmh9jw==} + engines: {node: '>=14.0.0'} + + vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + + vscode-languageserver-protocol@3.18.2: + resolution: {integrity: sha512-XRyDbT0Pp3sSNti3JmxVEUMySWCSi1hhM+/KUlCy1hV1zmrqpM1OwO12EAki8blhmLuIMpaJrYbo0OzGVfK2Qg==} + + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + + vscode-languageserver-types@3.18.0: + resolution: {integrity: sha512-8TsGPNMIMiiBdkORgRSvLjuiEIiAFtO+KssmYWxQ+uSVvlf7RjK8YKCOjPzZ+YA04jXEV7+7LvkSmHkhpNS99g==} + + vscode-languageserver@9.0.1: + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} + hasBin: true + + vscode-nls@5.2.0: + resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} + vscode-oniguruma@1.7.0: resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} vscode-textmate@8.0.0: resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + vue@3.5.26: resolution: {integrity: sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA==} peerDependencies: @@ -14214,6 +15380,9 @@ packages: walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + web-vitals@4.2.4: resolution: {integrity: sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==} @@ -14295,11 +15464,6 @@ packages: engines: {node: '>=16'} hasBin: true - workerd@1.20251125.0: - resolution: {integrity: sha512-oQYfgu3UZ15HlMcEyilKD1RdielRnKSG5MA0xoi1theVs99Rop9AEFYicYCyK1R4YjYblLRYEiL1tMgEFqpReA==} - engines: {node: '>=16'} - hasBin: true - workerd@1.20260426.1: resolution: {integrity: sha512-ELvGgN8c9oo+E6EPyecxk1TEf6/eAK4TxxQTW5mQ87C7jbjCzhMbg0P2ije49UBHV0dkBYPJcJvcklUltipl2A==} engines: {node: '>=16'} @@ -14368,6 +15532,14 @@ packages: utf-8-validate: optional: true + xdg-app-paths@5.5.1: + resolution: {integrity: sha512-hI3flOB4PLZIy5prbtTpirobtPE2ZtZ52szO+2mM9Efp6ErM398La+C1lIpNWDfNoQk+6Lsi6nMcCwVB7pxeMQ==} + engines: {node: '>= 6.0'} + + xdg-portable@7.3.0: + resolution: {integrity: sha512-sqMMuL1rc0FmMBOzCpd0yuy9trqF2yTTVe+E9ogwCSWQCdDEtQUwrZPT6AxqtsFGRNxycgncbP/xmOOSPw5ZUw==} + engines: {node: '>= 6.0'} + xml-crypto@6.1.2: resolution: {integrity: sha512-leBOVQdVi8FvPJrMYoum7Ici9qyxfE4kVi+AkpUoYCSXaQF4IlBm1cneTK9oAxR61LpYxTx7lNcsnBIeRpGW2w==} engines: {node: '>=16'} @@ -14405,6 +15577,9 @@ packages: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} + xxhash-wasm@1.1.0: + resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} + y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} @@ -14418,6 +15593,14 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yaml-language-server@1.23.0: + resolution: {integrity: sha512-3qVyCOexLCWw06PQa5kRPwvMWMZ/eZeCRWUvgD6a0OkqL/4iCnxy2WumbWifa937Uo5xhyWJ0uxlU39ljhNh7A==} + hasBin: true + yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} @@ -14427,6 +15610,16 @@ packages: engines: {node: '>= 14.6'} hasBin: true + yaml@2.8.3: + resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==} + engines: {node: '>= 14.6'} + hasBin: true + + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} @@ -14439,6 +15632,10 @@ packages: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yargs@15.4.1: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} @@ -14499,6 +15696,9 @@ packages: zod@3.22.3: resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==} + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zod@4.2.1: resolution: {integrity: sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw==} @@ -14530,6 +15730,13 @@ snapshots: '@ai-sdk/provider-utils': 4.0.23(zod@4.2.1) zod: 4.2.1 + '@ai-sdk/gateway@2.0.111(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.3 + '@ai-sdk/provider-utils': 3.0.28(zod@3.25.76) + '@vercel/oidc': 3.1.0 + zod: 3.25.76 + '@ai-sdk/gateway@3.0.95(zod@4.2.1)': dependencies: '@ai-sdk/provider': 3.0.8 @@ -14562,6 +15769,13 @@ snapshots: '@ai-sdk/provider-utils': 4.0.23(zod@4.2.1) zod: 4.2.1 + '@ai-sdk/provider-utils@3.0.28(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.3 + '@standard-schema/spec': 1.1.0 + eventsource-parser: 3.0.8 + zod: 3.25.76 + '@ai-sdk/provider-utils@4.0.23(zod@4.2.1)': dependencies: '@ai-sdk/provider': 3.0.8 @@ -14576,6 +15790,10 @@ snapshots: eventsource-parser: 3.0.8 zod: 4.2.1 + '@ai-sdk/provider@2.0.3': + dependencies: + json-schema: 0.4.0 + '@ai-sdk/provider@3.0.10': dependencies: json-schema: 0.4.0 @@ -14599,6 +15817,11 @@ snapshots: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 + '@antfu/install-pkg@1.1.0': + dependencies: + package-manager-detector: 1.7.0 + tinyexec: 1.2.4 + '@asamuzakjp/css-color@3.2.0': dependencies: '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) @@ -14625,6 +15848,235 @@ snapshots: '@asamuzakjp/nwsapi@2.3.9': {} + '@astrojs/check@0.9.9(prettier@3.8.2)(typescript@6.0.3)': + dependencies: + '@astrojs/language-server': 2.16.12(prettier@3.8.2)(typescript@6.0.3) + chokidar: 4.0.3 + kleur: 4.1.5 + typescript: 6.0.3 + yargs: 17.7.2 + transitivePeerDependencies: + - prettier + - prettier-plugin-astro + + '@astrojs/compiler-binding-darwin-arm64@0.3.1': + optional: true + + '@astrojs/compiler-binding-darwin-x64@0.3.1': + optional: true + + '@astrojs/compiler-binding-linux-arm64-gnu@0.3.1': + optional: true + + '@astrojs/compiler-binding-linux-arm64-musl@0.3.1': + optional: true + + '@astrojs/compiler-binding-linux-x64-gnu@0.3.1': + optional: true + + '@astrojs/compiler-binding-linux-x64-musl@0.3.1': + optional: true + + '@astrojs/compiler-binding-wasm32-wasi@0.3.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + dependencies: + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + optional: true + + '@astrojs/compiler-binding-win32-arm64-msvc@0.3.1': + optional: true + + '@astrojs/compiler-binding-win32-x64-msvc@0.3.1': + optional: true + + '@astrojs/compiler-binding@0.3.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + optionalDependencies: + '@astrojs/compiler-binding-darwin-arm64': 0.3.1 + '@astrojs/compiler-binding-darwin-x64': 0.3.1 + '@astrojs/compiler-binding-linux-arm64-gnu': 0.3.1 + '@astrojs/compiler-binding-linux-arm64-musl': 0.3.1 + '@astrojs/compiler-binding-linux-x64-gnu': 0.3.1 + '@astrojs/compiler-binding-linux-x64-musl': 0.3.1 + '@astrojs/compiler-binding-wasm32-wasi': 0.3.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + '@astrojs/compiler-binding-win32-arm64-msvc': 0.3.1 + '@astrojs/compiler-binding-win32-x64-msvc': 0.3.1 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + + '@astrojs/compiler-rs@0.3.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + dependencies: + '@astrojs/compiler-binding': 0.3.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + + '@astrojs/compiler@2.13.1': {} + + '@astrojs/internal-helpers@0.10.1': + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + js-yaml: 4.1.1 + picomatch: 4.0.5 + retext-smartypants: 6.2.0 + shiki: 4.3.1 + smol-toml: 1.7.0 + unified: 11.0.5 + + '@astrojs/language-server@2.16.12(prettier@3.8.2)(typescript@6.0.3)': + dependencies: + '@astrojs/compiler': 2.13.1 + '@astrojs/yaml2ts': 0.2.4 + '@jridgewell/sourcemap-codec': 1.5.5 + '@volar/kit': 2.4.28(typescript@6.0.3) + '@volar/language-core': 2.4.28 + '@volar/language-server': 2.4.28 + '@volar/language-service': 2.4.28 + muggle-string: 0.4.1 + tinyglobby: 0.2.17 + volar-service-css: 0.0.71(@volar/language-service@2.4.28) + volar-service-emmet: 0.0.71(@volar/language-service@2.4.28) + volar-service-html: 0.0.71(@volar/language-service@2.4.28) + volar-service-prettier: 0.0.71(@volar/language-service@2.4.28)(prettier@3.8.2) + volar-service-typescript: 0.0.71(@volar/language-service@2.4.28) + volar-service-typescript-twoslash-queries: 0.0.71(@volar/language-service@2.4.28) + volar-service-yaml: 0.0.71(@volar/language-service@2.4.28) + vscode-html-languageservice: 5.6.2 + vscode-uri: 3.1.0 + optionalDependencies: + prettier: 3.8.2 + transitivePeerDependencies: + - typescript + + '@astrojs/markdown-remark@7.2.1': + dependencies: + '@astrojs/internal-helpers': 0.10.1 + '@astrojs/prism': 4.0.2 + github-slugger: 2.0.0 + hast-util-from-html: 2.0.3 + hast-util-to-text: 4.0.2 + mdast-util-definitions: 6.0.0 + rehype-raw: 7.0.0 + rehype-stringify: 10.0.1 + remark-gfm: 4.0.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + remark-smartypants: 3.0.2 + unified: 11.0.5 + unist-util-remove-position: 5.0.0 + unist-util-visit: 5.1.0 + unist-util-visit-parents: 6.0.2 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@astrojs/markdown-satteri@0.3.4': + dependencies: + '@astrojs/internal-helpers': 0.10.1 + '@astrojs/prism': 4.0.2 + github-slugger: 2.0.0 + hast-util-from-html: 2.0.3 + satteri: 0.9.5 + + '@astrojs/mdx@7.0.3(@astrojs/markdown-satteri@0.3.4)(astro@7.0.9(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@24.10.4)(@vercel/functions@3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.54.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': + dependencies: + '@astrojs/internal-helpers': 0.10.1 + '@astrojs/markdown-remark': 7.2.1 + '@mdx-js/mdx': 3.1.1 + acorn: 8.17.0 + astro: 7.0.9(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@24.10.4)(@vercel/functions@3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.54.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) + es-module-lexer: 2.3.1 + estree-util-visit: 2.0.0 + hast-util-to-html: 9.0.5 + piccolore: 0.1.3 + rehype-raw: 7.0.0 + remark-gfm: 4.0.1 + remark-smartypants: 3.0.2 + source-map: 0.7.6 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + optionalDependencies: + '@astrojs/markdown-satteri': 0.3.4 + transitivePeerDependencies: + - supports-color + + '@astrojs/node@11.0.2(astro@7.0.9(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@24.10.4)(@vercel/functions@3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.54.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': + dependencies: + '@astrojs/internal-helpers': 0.10.1 + astro: 7.0.9(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@24.10.4)(@vercel/functions@3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.54.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) + send: 1.2.1 + server-destroy: 1.0.1 + transitivePeerDependencies: + - supports-color + + '@astrojs/prism@4.0.2': + dependencies: + prismjs: 1.30.0 + + '@astrojs/react@6.0.1(@types/node@24.10.4)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(jiti@2.6.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)': + dependencies: + '@astrojs/internal-helpers': 0.10.1 + '@types/react': 19.2.7 + '@types/react-dom': 19.2.3(@types/react@19.2.7) + '@vitejs/plugin-react': 5.2.0(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) + devalue: 5.8.1 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + ultrahtml: 1.7.0 + vite: 8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) + transitivePeerDependencies: + - '@types/node' + - '@vitejs/devtools' + - esbuild + - jiti + - less + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + '@astrojs/telemetry@3.3.3': + dependencies: + ci-info: 4.4.0 + dset: 3.1.4 + is-docker: 4.0.0 + package-manager-detector: 1.7.0 + + '@astrojs/vercel@11.0.3(@aws-sdk/credential-provider-web-identity@3.958.0)(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(astro@7.0.9(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@24.10.4)(@vercel/functions@3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.54.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))(encoding@0.1.13)(react@19.2.3)(rollup@4.54.0)(svelte@5.46.0)(vue@3.5.26(typescript@5.9.3))(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))': + dependencies: + '@astrojs/internal-helpers': 0.10.1 + '@vercel/analytics': 1.6.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(react@19.2.3)(svelte@5.46.0)(vue@3.5.26(typescript@5.9.3)) + '@vercel/functions': 3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + '@vercel/nft': 1.10.2(encoding@0.1.13)(rollup@4.54.0) + '@vercel/routing-utils': 5.3.3 + astro: 7.0.9(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@24.10.4)(@vercel/functions@3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.54.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) + esbuild: 0.28.1 + tinyglobby: 0.2.17 + transitivePeerDependencies: + - '@aws-sdk/credential-provider-web-identity' + - '@remix-run/react' + - '@sveltejs/kit' + - encoding + - next + - react + - rollup + - supports-color + - svelte + - vue + - vue-router + - ws + + '@astrojs/yaml2ts@0.2.4': + dependencies: + yaml: 2.9.0 + '@authenio/xml-encryption@2.0.2': dependencies: '@xmldom/xmldom': 0.8.11 @@ -15181,7 +16633,7 @@ snapshots: '@babel/code-frame@7.26.2': dependencies: - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-validator-identifier': 7.29.7 js-tokens: 4.0.0 picocolors: 1.1.1 optional: true @@ -15194,7 +16646,7 @@ snapshots: '@babel/code-frame@7.29.0': dependencies: - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-validator-identifier': 7.29.7 js-tokens: 4.0.0 picocolors: 1.1.1 @@ -15229,10 +16681,10 @@ snapshots: '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) '@babel/helpers': 7.29.2 - '@babel/parser': 7.29.2 + '@babel/parser': 7.29.7 '@babel/template': 7.28.6 '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3 @@ -15252,8 +16704,8 @@ snapshots: '@babel/generator@7.29.1': dependencies: - '@babel/parser': 7.29.2 - '@babel/types': 7.29.0 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 @@ -15327,7 +16779,7 @@ snapshots: '@babel/helper-member-expression-to-functions@7.28.5': dependencies: '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color @@ -15341,7 +16793,7 @@ snapshots: '@babel/helper-module-imports@7.28.6': dependencies: '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color @@ -15374,12 +16826,14 @@ snapshots: '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.29.7 '@babel/helper-plugin-utils@7.27.1': {} '@babel/helper-plugin-utils@7.28.6': {} + '@babel/helper-plugin-utils@7.29.7': {} + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -15416,15 +16870,19 @@ snapshots: '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@7.29.7': {} + '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-identifier@7.29.7': {} + '@babel/helper-validator-option@7.27.1': {} '@babel/helper-wrap-function@7.28.3': dependencies: '@babel/template': 7.27.2 '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color @@ -15436,15 +16894,15 @@ snapshots: '@babel/helpers@7.29.2': dependencies: '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 '@babel/parser@7.28.5': dependencies: '@babel/types': 7.28.5 - '@babel/parser@7.29.2': + '@babel/parser@7.29.7': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.28.5)': dependencies: @@ -15870,6 +17328,16 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-transform-regenerator@7.28.4(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -16087,8 +17555,8 @@ snapshots: '@babel/template@7.28.6': dependencies: '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.2 - '@babel/types': 7.29.0 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 '@babel/traverse@7.28.5': dependencies: @@ -16107,9 +17575,9 @@ snapshots: '@babel/code-frame': 7.29.0 '@babel/generator': 7.29.1 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.2 + '@babel/parser': 7.29.7 '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -16124,6 +17592,11 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@babel/types@7.29.7': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@bcoe/v8-coverage@0.2.3': {} '@better-auth/core@1.4.18(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.2.1))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0)': @@ -16147,11 +17620,11 @@ snapshots: samlify: 2.10.2 zod: 4.2.1 - '@better-auth/sso@1.4.18(@better-auth/utils@0.3.0)(better-auth@1.4.18(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(@tanstack/react-start@1.143.4(crossws@0.4.1(srvx@0.9.8))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(drizzle-kit@0.31.8)(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20260511.1)(@opentelemetry/api@1.9.1)(@types/pg@8.16.0)(kysely@0.28.9)(pg@8.18.0)(postgres@3.4.7))(pg@8.18.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.10)(svelte@5.46.0)(vitest@2.1.9(@types/node@24.10.4)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.32.0)(sass@1.97.1))(vue@3.5.26(typescript@5.9.3)))': + '@better-auth/sso@1.4.18(@better-auth/utils@0.3.0)(better-auth@1.4.18(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(@tanstack/react-start@1.143.4(crossws@0.4.1(srvx@0.9.8))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.8)(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20260511.1)(@opentelemetry/api@1.9.1)(@types/pg@8.16.0)(kysely@0.28.9)(pg@8.18.0)(postgres@3.4.7))(pg@8.18.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.10)(svelte@5.46.0)(vitest@2.1.9(@types/node@24.10.4)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.32.0)(sass@1.97.1))(vue@3.5.26(typescript@5.9.3)))': dependencies: '@better-auth/utils': 0.3.0 '@better-fetch/fetch': 1.1.21 - better-auth: 1.4.18(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(@tanstack/react-start@1.143.4(crossws@0.4.1(srvx@0.9.8))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(drizzle-kit@0.31.8)(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20260511.1)(@opentelemetry/api@1.9.1)(@types/pg@8.16.0)(kysely@0.28.9)(pg@8.18.0)(postgres@3.4.7))(pg@8.18.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.10)(svelte@5.46.0)(vitest@2.1.9(@types/node@24.10.4)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.32.0)(sass@1.97.1))(vue@3.5.26(typescript@5.9.3)) + better-auth: 1.4.18(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(@tanstack/react-start@1.143.4(crossws@0.4.1(srvx@0.9.8))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.8)(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20260511.1)(@opentelemetry/api@1.9.1)(@types/pg@8.16.0)(kysely@0.28.9)(pg@8.18.0)(postgres@3.4.7))(pg@8.18.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.10)(svelte@5.46.0)(vitest@2.1.9(@types/node@24.10.4)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.32.0)(sass@1.97.1))(vue@3.5.26(typescript@5.9.3)) fast-xml-parser: 5.2.5 jose: 6.1.3 samlify: 2.10.2 @@ -16167,10 +17640,61 @@ snapshots: '@better-fetch/fetch@1.1.21': {} + '@braintree/sanitize-url@7.1.2': {} + '@bramus/specificity@2.4.2': dependencies: css-tree: 3.2.1 + '@bruits/satteri-darwin-arm64@0.9.5': + optional: true + + '@bruits/satteri-darwin-x64@0.9.5': + optional: true + + '@bruits/satteri-linux-arm64-gnu@0.9.5': + optional: true + + '@bruits/satteri-linux-arm64-musl@0.9.5': + optional: true + + '@bruits/satteri-linux-x64-gnu@0.9.5': + optional: true + + '@bruits/satteri-linux-x64-musl@0.9.5': + optional: true + + '@bruits/satteri-wasm32-wasi@0.9.5': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + optional: true + + '@bruits/satteri-win32-arm64-msvc@0.9.5': + optional: true + + '@bruits/satteri-win32-x64-msvc@0.9.5': + optional: true + + '@capsizecss/unpack@4.0.1': + dependencies: + fontkitten: 1.0.3 + + '@chevrotain/types@11.1.2': {} + + '@clack/core@1.4.3': + dependencies: + fast-wrap-ansi: 0.2.2 + sisteransi: 1.0.5 + + '@clack/prompts@1.7.0': + dependencies: + '@clack/core': 1.4.3 + fast-string-width: 3.0.2 + fast-wrap-ansi: 0.2.2 + sisteransi: 1.0.5 + '@cloudflare/kv-asset-handler@0.4.0': dependencies: mime: 3.0.0 @@ -16189,71 +17713,33 @@ snapshots: optionalDependencies: workerd: 1.20250617.0 - '@cloudflare/unenv-preset@2.7.11(unenv@2.0.0-rc.24)(workerd@1.20260426.1)': - dependencies: - unenv: 2.0.0-rc.24 - optionalDependencies: - workerd: 1.20260426.1 - - '@cloudflare/vite-plugin@1.15.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))(workerd@1.20260426.1)(wrangler@4.86.0(@cloudflare/workers-types@4.20260511.1)(bufferutil@4.1.0)(utf-8-validate@6.0.6))': - dependencies: - '@cloudflare/unenv-preset': 2.7.11(unenv@2.0.0-rc.24)(workerd@1.20260426.1) - '@remix-run/node-fetch-server': 0.8.1 - get-port: 7.2.0 - miniflare: 4.20251125.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) - picocolors: 1.1.1 - tinyglobby: 0.2.16 - unenv: 2.0.0-rc.24 - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) - wrangler: 4.86.0(@cloudflare/workers-types@4.20260511.1)(bufferutil@4.1.0)(utf-8-validate@6.0.6) - ws: 8.18.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - workerd - '@cloudflare/workerd-darwin-64@1.20250617.0': optional: true - '@cloudflare/workerd-darwin-64@1.20251125.0': - optional: true - '@cloudflare/workerd-darwin-64@1.20260426.1': optional: true '@cloudflare/workerd-darwin-arm64@1.20250617.0': optional: true - '@cloudflare/workerd-darwin-arm64@1.20251125.0': - optional: true - '@cloudflare/workerd-darwin-arm64@1.20260426.1': optional: true '@cloudflare/workerd-linux-64@1.20250617.0': optional: true - '@cloudflare/workerd-linux-64@1.20251125.0': - optional: true - '@cloudflare/workerd-linux-64@1.20260426.1': optional: true '@cloudflare/workerd-linux-arm64@1.20250617.0': optional: true - '@cloudflare/workerd-linux-arm64@1.20251125.0': - optional: true - '@cloudflare/workerd-linux-arm64@1.20260426.1': optional: true '@cloudflare/workerd-windows-64@1.20250617.0': optional: true - '@cloudflare/workerd-windows-64@1.20251125.0': - optional: true - '@cloudflare/workerd-windows-64@1.20260426.1': optional: true @@ -16315,13 +17801,42 @@ snapshots: '@drizzle-team/brocli@0.10.2': {} + '@emmetio/abbreviation@2.3.3': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/css-abbreviation@2.1.8': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/css-parser@0.4.1': + dependencies: + '@emmetio/stream-reader': 2.2.0 + '@emmetio/stream-reader-utils': 0.1.0 + + '@emmetio/html-matcher@1.3.0': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/scanner@1.0.4': {} + + '@emmetio/stream-reader-utils@0.1.0': {} + + '@emmetio/stream-reader@2.2.0': {} + + '@emnapi/core@1.11.1': + dependencies: + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.8.1 + optional: true + '@emnapi/core@1.7.1': dependencies: '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.7.1': + '@emnapi/runtime@1.11.1': dependencies: tslib: 2.8.1 optional: true @@ -16331,6 +17846,11 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.2.2': + dependencies: + tslib: 2.8.1 + optional: true + '@esbuild-kit/core-utils@3.3.2': dependencies: esbuild: 0.18.20 @@ -16359,6 +17879,9 @@ snapshots: '@esbuild/aix-ppc64@0.27.3': optional: true + '@esbuild/aix-ppc64@0.28.1': + optional: true + '@esbuild/android-arm64@0.18.20': optional: true @@ -16380,6 +17903,9 @@ snapshots: '@esbuild/android-arm64@0.27.3': optional: true + '@esbuild/android-arm64@0.28.1': + optional: true + '@esbuild/android-arm@0.18.20': optional: true @@ -16401,6 +17927,9 @@ snapshots: '@esbuild/android-arm@0.27.3': optional: true + '@esbuild/android-arm@0.28.1': + optional: true + '@esbuild/android-x64@0.18.20': optional: true @@ -16422,6 +17951,9 @@ snapshots: '@esbuild/android-x64@0.27.3': optional: true + '@esbuild/android-x64@0.28.1': + optional: true + '@esbuild/darwin-arm64@0.18.20': optional: true @@ -16443,6 +17975,9 @@ snapshots: '@esbuild/darwin-arm64@0.27.3': optional: true + '@esbuild/darwin-arm64@0.28.1': + optional: true + '@esbuild/darwin-x64@0.18.20': optional: true @@ -16464,6 +17999,9 @@ snapshots: '@esbuild/darwin-x64@0.27.3': optional: true + '@esbuild/darwin-x64@0.28.1': + optional: true + '@esbuild/freebsd-arm64@0.18.20': optional: true @@ -16485,6 +18023,9 @@ snapshots: '@esbuild/freebsd-arm64@0.27.3': optional: true + '@esbuild/freebsd-arm64@0.28.1': + optional: true + '@esbuild/freebsd-x64@0.18.20': optional: true @@ -16506,6 +18047,9 @@ snapshots: '@esbuild/freebsd-x64@0.27.3': optional: true + '@esbuild/freebsd-x64@0.28.1': + optional: true + '@esbuild/linux-arm64@0.18.20': optional: true @@ -16527,6 +18071,9 @@ snapshots: '@esbuild/linux-arm64@0.27.3': optional: true + '@esbuild/linux-arm64@0.28.1': + optional: true + '@esbuild/linux-arm@0.18.20': optional: true @@ -16548,6 +18095,9 @@ snapshots: '@esbuild/linux-arm@0.27.3': optional: true + '@esbuild/linux-arm@0.28.1': + optional: true + '@esbuild/linux-ia32@0.18.20': optional: true @@ -16569,6 +18119,9 @@ snapshots: '@esbuild/linux-ia32@0.27.3': optional: true + '@esbuild/linux-ia32@0.28.1': + optional: true + '@esbuild/linux-loong64@0.18.20': optional: true @@ -16590,6 +18143,9 @@ snapshots: '@esbuild/linux-loong64@0.27.3': optional: true + '@esbuild/linux-loong64@0.28.1': + optional: true + '@esbuild/linux-mips64el@0.18.20': optional: true @@ -16611,6 +18167,9 @@ snapshots: '@esbuild/linux-mips64el@0.27.3': optional: true + '@esbuild/linux-mips64el@0.28.1': + optional: true + '@esbuild/linux-ppc64@0.18.20': optional: true @@ -16632,6 +18191,9 @@ snapshots: '@esbuild/linux-ppc64@0.27.3': optional: true + '@esbuild/linux-ppc64@0.28.1': + optional: true + '@esbuild/linux-riscv64@0.18.20': optional: true @@ -16653,6 +18215,9 @@ snapshots: '@esbuild/linux-riscv64@0.27.3': optional: true + '@esbuild/linux-riscv64@0.28.1': + optional: true + '@esbuild/linux-s390x@0.18.20': optional: true @@ -16674,6 +18239,9 @@ snapshots: '@esbuild/linux-s390x@0.27.3': optional: true + '@esbuild/linux-s390x@0.28.1': + optional: true + '@esbuild/linux-x64@0.18.20': optional: true @@ -16695,6 +18263,9 @@ snapshots: '@esbuild/linux-x64@0.27.3': optional: true + '@esbuild/linux-x64@0.28.1': + optional: true + '@esbuild/netbsd-arm64@0.25.12': optional: true @@ -16707,6 +18278,9 @@ snapshots: '@esbuild/netbsd-arm64@0.27.3': optional: true + '@esbuild/netbsd-arm64@0.28.1': + optional: true + '@esbuild/netbsd-x64@0.18.20': optional: true @@ -16728,6 +18302,9 @@ snapshots: '@esbuild/netbsd-x64@0.27.3': optional: true + '@esbuild/netbsd-x64@0.28.1': + optional: true + '@esbuild/openbsd-arm64@0.25.12': optional: true @@ -16740,6 +18317,9 @@ snapshots: '@esbuild/openbsd-arm64@0.27.3': optional: true + '@esbuild/openbsd-arm64@0.28.1': + optional: true + '@esbuild/openbsd-x64@0.18.20': optional: true @@ -16761,6 +18341,9 @@ snapshots: '@esbuild/openbsd-x64@0.27.3': optional: true + '@esbuild/openbsd-x64@0.28.1': + optional: true + '@esbuild/openharmony-arm64@0.25.12': optional: true @@ -16770,6 +18353,9 @@ snapshots: '@esbuild/openharmony-arm64@0.27.3': optional: true + '@esbuild/openharmony-arm64@0.28.1': + optional: true + '@esbuild/sunos-x64@0.18.20': optional: true @@ -16791,6 +18377,9 @@ snapshots: '@esbuild/sunos-x64@0.27.3': optional: true + '@esbuild/sunos-x64@0.28.1': + optional: true + '@esbuild/win32-arm64@0.18.20': optional: true @@ -16812,6 +18401,9 @@ snapshots: '@esbuild/win32-arm64@0.27.3': optional: true + '@esbuild/win32-arm64@0.28.1': + optional: true + '@esbuild/win32-ia32@0.18.20': optional: true @@ -16833,6 +18425,9 @@ snapshots: '@esbuild/win32-ia32@0.27.3': optional: true + '@esbuild/win32-ia32@0.28.1': + optional: true + '@esbuild/win32-x64@0.18.20': optional: true @@ -16854,6 +18449,9 @@ snapshots: '@esbuild/win32-x64@0.27.3': optional: true + '@esbuild/win32-x64@0.28.1': + optional: true + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.2(jiti@2.6.1))': dependencies: eslint: 9.39.2(jiti@2.6.1) @@ -17061,6 +18659,18 @@ snapshots: '@hutson/parse-repository-url@3.0.2': {} + '@iconify-json/lucide@1.2.117': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify/types@2.0.0': {} + + '@iconify/utils@3.1.4': + dependencies: + '@antfu/install-pkg': 1.1.0 + '@iconify/types': 2.0.0 + import-meta-resolve: 4.2.0 + '@img/colour@1.1.0': {} '@img/sharp-darwin-arm64@0.33.5': @@ -17209,12 +18819,12 @@ snapshots: '@img/sharp-wasm32@0.33.5': dependencies: - '@emnapi/runtime': 1.7.1 + '@emnapi/runtime': 1.11.1 optional: true '@img/sharp-wasm32@0.34.5': dependencies: - '@emnapi/runtime': 1.7.1 + '@emnapi/runtime': 1.11.1 optional: true '@img/sharp-win32-arm64@0.34.5': @@ -17334,6 +18944,10 @@ snapshots: '@ioredis/commands@1.5.1': {} + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.3 + '@istanbuljs/load-nyc-config@1.1.0': dependencies: camelcase: 5.3.1 @@ -17578,13 +19192,26 @@ snapshots: - encoding - supports-color + '@mapbox/node-pre-gyp@2.0.3(encoding@0.1.13)': + dependencies: + consola: 3.4.2 + detect-libc: 2.1.2 + https-proxy-agent: 7.0.6 + node-fetch: 2.7.0(encoding@0.1.13) + nopt: 8.1.0 + semver: 7.7.4 + tar: 7.5.20 + transitivePeerDependencies: + - encoding + - supports-color + '@mdx-js/mdx@3.1.1': dependencies: '@types/estree': 1.0.8 '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 '@types/mdx': 2.0.13 - acorn: 8.15.0 + acorn: 8.17.0 collapse-white-space: 2.1.0 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 @@ -17593,7 +19220,7 @@ snapshots: hast-util-to-jsx-runtime: 2.3.6 markdown-extensions: 2.0.0 recma-build-jsx: 1.0.0 - recma-jsx: 1.0.1(acorn@8.15.0) + recma-jsx: 1.0.1(acorn@8.17.0) recma-stringify: 1.0.0 rehype-recma: 1.0.0 remark-mdx: 3.1.1 @@ -17603,7 +19230,7 @@ snapshots: unified: 11.0.5 unist-util-position-from-estree: 2.0.0 unist-util-stringify-position: 4.0.0 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 vfile: 6.0.3 transitivePeerDependencies: - supports-color @@ -17614,7 +19241,9 @@ snapshots: '@types/react': 19.2.7 react: 19.2.3 - '@mjackson/node-fetch-server@0.2.0': {} + '@mermaid-js/parser@1.2.0': + dependencies: + '@chevrotain/types': 11.1.2 '@modelcontextprotocol/sdk@1.27.1(zod@4.2.1)': dependencies: @@ -17638,6 +19267,28 @@ snapshots: transitivePeerDependencies: - supports-color + '@modelcontextprotocol/sdk@1.29.0(zod@3.25.76)': + dependencies: + '@hono/node-server': 1.19.11(hono@4.12.7) + ajv: 8.18.0 + ajv-formats: 3.0.1(ajv@8.18.0) + content-type: 1.0.5 + cors: 2.8.6 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.0.8 + express: 5.2.1 + express-rate-limit: 8.3.1(express@5.2.1) + hono: 4.12.7 + jose: 6.1.3 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) + transitivePeerDependencies: + - supports-color + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': optional: true @@ -17659,10 +19310,17 @@ snapshots: '@napi-rs/wasm-runtime@1.1.1': dependencies: '@emnapi/core': 1.7.1 - '@emnapi/runtime': 1.7.1 + '@emnapi/runtime': 1.11.1 '@tybys/wasm-util': 0.10.1 optional: true + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@tybys/wasm-util': 0.10.3 + optional: true + '@noble/ciphers@2.1.1': {} '@noble/hashes@2.0.1': {} @@ -17930,6 +19588,8 @@ snapshots: '@orama/orama@3.1.18': {} + '@oslojs/encoding@1.1.0': {} + '@oxc-parser/binding-android-arm-eabi@0.112.0': optional: true @@ -17994,6 +19654,29 @@ snapshots: '@oxc-project/types@0.112.0': {} + '@oxc-project/types@0.139.0': {} + + '@pagefind/darwin-arm64@1.5.2': + optional: true + + '@pagefind/darwin-x64@1.5.2': + optional: true + + '@pagefind/freebsd-x64@1.5.2': + optional: true + + '@pagefind/linux-arm64@1.5.2': + optional: true + + '@pagefind/linux-x64@1.5.2': + optional: true + + '@pagefind/windows-arm64@1.5.2': + optional: true + + '@pagefind/windows-x64@1.5.2': + optional: true + '@parcel/watcher-android-arm64@2.5.1': optional: true @@ -18054,6 +19737,30 @@ snapshots: '@parcel/watcher-win32-ia32': 2.5.1 '@parcel/watcher-win32-x64': 2.5.1 + '@pierre/diffs@1.2.12(@shikijs/themes@4.3.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@pierre/theme': 1.1.0 + '@pierre/theming': 0.0.2(@pierre/theme@1.1.0)(@shikijs/themes@4.3.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(shiki@3.22.0) + '@shikijs/transformers': 4.3.1 + diff: 9.0.0 + hast-util-to-html: 9.0.5 + lru_map: 0.4.1 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + shiki: 3.22.0 + transitivePeerDependencies: + - '@shikijs/themes' + + '@pierre/theme@1.1.0': {} + + '@pierre/theming@0.0.2(@pierre/theme@1.1.0)(@shikijs/themes@4.3.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(shiki@3.22.0)': + optionalDependencies: + '@pierre/theme': 1.1.0 + '@shikijs/themes': 4.3.1 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + shiki: 3.22.0 + '@playwright/test@1.57.0': dependencies: playwright: 1.57.0 @@ -18109,27 +19816,8 @@ snapshots: dependencies: quansync: 1.0.0 - '@radix-ui/number@1.1.1': {} - '@radix-ui/primitive@1.1.3': {} - '@radix-ui/react-accordion@1.2.12(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - optionalDependencies: - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) - '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -18155,34 +19843,6 @@ snapshots: '@types/react': 19.2.7 '@types/react-dom': 19.2.3(@types/react@19.2.7) - '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - optionalDependencies: - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) - - '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - optionalDependencies: - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.7)(react@19.2.3)': dependencies: react: 19.2.3 @@ -18195,34 +19855,6 @@ snapshots: optionalDependencies: '@types/react': 19.2.7 - '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.3) - aria-hidden: 1.2.6 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - react-remove-scroll: 2.7.2(@types/react@19.2.7)(react@19.2.3) - optionalDependencies: - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) - - '@radix-ui/react-direction@1.1.1(@types/react@19.2.7)(react@19.2.3)': - dependencies: - react: 19.2.3 - optionalDependencies: - '@types/react': 19.2.7 - '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@radix-ui/primitive': 1.1.3 @@ -18236,23 +19868,6 @@ snapshots: '@types/react': 19.2.7 '@types/react-dom': 19.2.3(@types/react@19.2.7) - '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.7)(react@19.2.3)': - dependencies: - react: 19.2.3 - optionalDependencies: - '@types/react': 19.2.7 - - '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - optionalDependencies: - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) - '@radix-ui/react-hover-card@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@radix-ui/primitive': 1.1.3 @@ -18270,58 +19885,6 @@ snapshots: '@types/react': 19.2.7 '@types/react-dom': 19.2.3(@types/react@19.2.7) - '@radix-ui/react-id@1.1.1(@types/react@19.2.7)(react@19.2.3)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.3) - react: 19.2.3 - optionalDependencies: - '@types/react': 19.2.7 - - '@radix-ui/react-navigation-menu@1.2.14(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - optionalDependencies: - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) - - '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.3) - aria-hidden: 1.2.6 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - react-remove-scroll: 2.7.2(@types/react@19.2.7)(react@19.2.3) - optionalDependencies: - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) - '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@floating-ui/react-dom': 2.1.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -18369,40 +19932,6 @@ snapshots: '@types/react': 19.2.7 '@types/react-dom': 19.2.3(@types/react@19.2.7) - '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - optionalDependencies: - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) - - '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': - dependencies: - '@radix-ui/number': 1.1.1 - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - optionalDependencies: - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) - '@radix-ui/react-slot@1.2.3(@types/react@19.2.7)(react@19.2.3)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3) @@ -18410,29 +19939,6 @@ snapshots: optionalDependencies: '@types/react': 19.2.7 - '@radix-ui/react-slot@1.2.4(@types/react@19.2.7)(react@19.2.3)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3) - react: 19.2.3 - optionalDependencies: - '@types/react': 19.2.7 - - '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - optionalDependencies: - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.7)(react@19.2.3)': dependencies: react: 19.2.3 @@ -18487,100 +19993,8 @@ snapshots: optionalDependencies: '@types/react': 19.2.7 - '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': - dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - optionalDependencies: - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) - '@radix-ui/rect@1.1.1': {} - '@react-router/dev@7.13.2(@react-router/serve@7.13.2(react-router@7.13.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(typescript@5.9.3))(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(react-router@7.13.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(sass@1.97.1)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))(wrangler@4.86.0(@cloudflare/workers-types@4.20260511.1)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(yaml@2.8.2)': - dependencies: - '@babel/core': 7.28.5 - '@babel/generator': 7.28.5 - '@babel/parser': 7.28.5 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.28.5) - '@babel/preset-typescript': 7.28.5(@babel/core@7.28.5) - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - '@react-router/node': 7.13.2(react-router@7.13.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(typescript@5.9.3) - '@remix-run/node-fetch-server': 0.13.0 - arg: 5.0.2 - babel-dead-code-elimination: 1.0.11 - chokidar: 4.0.3 - dedent: 1.7.1 - es-module-lexer: 1.7.0 - exit-hook: 2.2.1 - isbot: 5.1.37 - jsesc: 3.0.2 - lodash: 4.17.21 - p-map: 7.0.4 - pathe: 1.1.2 - picocolors: 1.1.1 - pkg-types: 2.3.0 - prettier: 3.6.2 - react-refresh: 0.14.2 - react-router: 7.13.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - semver: 7.7.3 - tinyglobby: 0.2.15 - valibot: 1.3.1(typescript@5.9.3) - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) - vite-node: 3.2.4(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) - optionalDependencies: - '@react-router/serve': 7.13.2(react-router@7.13.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(typescript@5.9.3) - typescript: 5.9.3 - wrangler: 4.86.0(@cloudflare/workers-types@4.20260511.1)(bufferutil@4.1.0)(utf-8-validate@6.0.6) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - '@react-router/express@7.13.2(express@4.22.1)(react-router@7.13.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(typescript@5.9.3)': - dependencies: - '@react-router/node': 7.13.2(react-router@7.13.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(typescript@5.9.3) - express: 4.22.1 - react-router: 7.13.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - optionalDependencies: - typescript: 5.9.3 - optional: true - - '@react-router/node@7.13.2(react-router@7.13.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(typescript@5.9.3)': - dependencies: - '@mjackson/node-fetch-server': 0.2.0 - react-router: 7.13.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - optionalDependencies: - typescript: 5.9.3 - - '@react-router/serve@7.13.2(react-router@7.13.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(typescript@5.9.3)': - dependencies: - '@mjackson/node-fetch-server': 0.2.0 - '@react-router/express': 7.13.2(express@4.22.1)(react-router@7.13.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(typescript@5.9.3) - '@react-router/node': 7.13.2(react-router@7.13.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(typescript@5.9.3) - compression: 1.8.1 - express: 4.22.1 - get-port: 5.1.1 - morgan: 1.10.1 - react-router: 7.13.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - source-map-support: 0.5.21 - transitivePeerDependencies: - - supports-color - - typescript - optional: true - '@redis/bloom@1.2.0(@redis/client@1.6.1)': dependencies: '@redis/client': 1.6.1 @@ -18609,13 +20023,62 @@ snapshots: '@remirror/core-constants@3.0.0': {} - '@remix-run/node-fetch-server@0.13.0': {} + '@rolldown/binding-android-arm64@1.1.5': + optional: true - '@remix-run/node-fetch-server@0.8.1': {} + '@rolldown/binding-darwin-arm64@1.1.5': + optional: true + + '@rolldown/binding-darwin-x64@1.1.5': + optional: true + + '@rolldown/binding-freebsd-x64@1.1.5': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.1.5': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.1.5': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.1.5': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.1.5': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.1.5': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.1.5': + optional: true + + '@rolldown/binding-linux-x64-musl@1.1.5': + optional: true + + '@rolldown/binding-openharmony-arm64@1.1.5': + optional: true + + '@rolldown/binding-wasm32-wasi@1.1.5': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.1.5': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.1.5': + optional: true '@rolldown/pluginutils@1.0.0-beta.40': optional: true + '@rolldown/pluginutils@1.0.0-rc.3': {} + + '@rolldown/pluginutils@1.0.1': {} + '@rollup/plugin-commonjs@25.0.8(rollup@4.54.0)': dependencies: '@rollup/pluginutils': 5.3.0(rollup@4.54.0) @@ -18659,7 +20122,7 @@ snapshots: dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 - picomatch: 4.0.4 + picomatch: 4.0.5 optionalDependencies: rollup: 4.54.0 @@ -18729,17 +20192,67 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.54.0': optional: true + '@scalar/astro@0.4.9(astro@7.0.9(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@24.10.4)(@vercel/functions@3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.54.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': + dependencies: + '@scalar/client-side-rendering': 0.3.2 + astro: 7.0.9(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@24.10.4)(@vercel/functions@3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.54.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) + + '@scalar/client-side-rendering@0.3.2': + dependencies: + '@scalar/schemas': 0.7.2 + '@scalar/types': 0.16.2 + '@scalar/validation': 0.6.0 + '@scalar/core@0.3.28': dependencies: '@scalar/types': 0.5.4 '@scalar/helpers@0.2.4': {} + '@scalar/helpers@0.9.0': {} + '@scalar/hono-api-reference@0.9.30(hono@4.11.3)': dependencies: '@scalar/core': 0.3.28 hono: 4.11.3 + '@scalar/json-magic@0.12.17': + dependencies: + '@scalar/helpers': 0.9.0 + pathe: 2.0.3 + yaml: 2.9.0 + + '@scalar/openapi-parser@0.28.8': + dependencies: + '@scalar/helpers': 0.9.0 + '@scalar/json-magic': 0.12.17 + '@scalar/openapi-types': 0.9.1 + '@scalar/openapi-upgrader': 0.2.9 + ajv: 8.18.0 + ajv-draft-04: 1.0.0(ajv@8.18.0) + ajv-formats: 3.0.1(ajv@8.18.0) + jsonpointer: 5.0.1 + leven: 4.1.0 + yaml: 2.9.0 + + '@scalar/openapi-types@0.9.1': {} + + '@scalar/openapi-upgrader@0.2.9': + dependencies: + '@scalar/openapi-types': 0.9.1 + + '@scalar/schemas@0.7.2': + dependencies: + '@scalar/helpers': 0.9.0 + '@scalar/validation': 0.6.0 + + '@scalar/types@0.16.2': + dependencies: + '@scalar/helpers': 0.9.0 + nanoid: 5.1.6 + type-fest: 5.8.0 + zod: 4.2.1 + '@scalar/types@0.5.4': dependencies: '@scalar/helpers': 0.2.4 @@ -18747,6 +20260,8 @@ snapshots: type-fest: 5.0.0 zod: 4.2.1 + '@scalar/validation@0.6.0': {} + '@sentry-internal/browser-utils@10.53.1': dependencies: '@sentry/core': 10.53.1 @@ -18953,16 +20468,17 @@ snapshots: '@types/hast': 3.0.4 hast-util-to-html: 9.0.5 - '@shikijs/core@3.20.0': + '@shikijs/core@3.22.0': dependencies: - '@shikijs/types': 3.20.0 + '@shikijs/types': 3.22.0 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 hast-util-to-html: 9.0.5 - '@shikijs/core@3.22.0': + '@shikijs/core@4.3.1': dependencies: - '@shikijs/types': 3.22.0 + '@shikijs/primitive': 4.3.1 + '@shikijs/types': 4.3.1 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 hast-util-to-html: 9.0.5 @@ -18973,82 +20489,97 @@ snapshots: '@shikijs/vscode-textmate': 10.0.2 oniguruma-to-es: 2.3.0 - '@shikijs/engine-javascript@3.20.0': - dependencies: - '@shikijs/types': 3.20.0 - '@shikijs/vscode-textmate': 10.0.2 - oniguruma-to-es: 4.3.4 - '@shikijs/engine-javascript@3.22.0': dependencies: '@shikijs/types': 3.22.0 '@shikijs/vscode-textmate': 10.0.2 oniguruma-to-es: 4.3.4 + '@shikijs/engine-javascript@4.3.1': + dependencies: + '@shikijs/types': 4.3.1 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.6 + '@shikijs/engine-oniguruma@1.29.2': dependencies: '@shikijs/types': 1.29.2 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/engine-oniguruma@3.20.0': - dependencies: - '@shikijs/types': 3.20.0 - '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/engine-oniguruma@3.22.0': dependencies: '@shikijs/types': 3.22.0 '@shikijs/vscode-textmate': 10.0.2 + '@shikijs/engine-oniguruma@4.3.1': + dependencies: + '@shikijs/types': 4.3.1 + '@shikijs/vscode-textmate': 10.0.2 + '@shikijs/langs@1.29.2': dependencies: '@shikijs/types': 1.29.2 - '@shikijs/langs@3.20.0': - dependencies: - '@shikijs/types': 3.20.0 - '@shikijs/langs@3.22.0': dependencies: '@shikijs/types': 3.22.0 - '@shikijs/rehype@3.20.0': + '@shikijs/langs@4.3.1': dependencies: - '@shikijs/types': 3.20.0 + '@shikijs/types': 4.3.1 + + '@shikijs/primitive@4.3.1': + dependencies: + '@shikijs/types': 4.3.1 + '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - hast-util-to-string: 3.0.1 - shiki: 3.20.0 - unified: 11.0.5 - unist-util-visit: 5.0.0 '@shikijs/themes@1.29.2': dependencies: '@shikijs/types': 1.29.2 - '@shikijs/themes@3.20.0': - dependencies: - '@shikijs/types': 3.20.0 - '@shikijs/themes@3.22.0': dependencies: '@shikijs/types': 3.22.0 - '@shikijs/transformers@3.20.0': + '@shikijs/themes@4.3.1': dependencies: - '@shikijs/core': 3.20.0 - '@shikijs/types': 3.20.0 + '@shikijs/types': 4.3.1 + + '@shikijs/transformers@4.3.1': + dependencies: + '@shikijs/core': 4.3.1 + '@shikijs/types': 4.3.1 + + '@shikijs/twoslash@4.3.1(typescript@5.9.3)': + dependencies: + '@shikijs/core': 4.3.1 + '@shikijs/types': 4.3.1 + twoslash: 0.3.9(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@shikijs/twoslash@4.3.1(typescript@6.0.3)': + dependencies: + '@shikijs/core': 4.3.1 + '@shikijs/types': 4.3.1 + twoslash: 0.3.9(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color '@shikijs/types@1.29.2': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - '@shikijs/types@3.20.0': + '@shikijs/types@3.22.0': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - '@shikijs/types@3.22.0': + '@shikijs/types@4.3.1': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 @@ -19065,6 +20596,8 @@ snapshots: '@sinclair/typebox@0.27.8': {} + '@sindresorhus/is@4.6.0': {} + '@sindresorhus/is@7.2.0': {} '@sinonjs/commons@3.0.1': @@ -19534,11 +21067,11 @@ snapshots: storybook: 8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6) ts-dedent: 2.2.0 - '@storybook/addon-svelte-csf@5.0.10(@storybook/svelte@8.6.15(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0))(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))': + '@storybook/addon-svelte-csf@5.0.10(@storybook/svelte@8.6.15(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0))(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@storybook/csf': 0.1.13 '@storybook/svelte': 8.6.15(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0) - '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) dedent: 1.7.1 es-toolkit: 1.43.0 esrap: 1.4.9 @@ -19546,7 +21079,7 @@ snapshots: storybook: 8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6) svelte: 5.46.0 svelte-ast-print: 0.4.2(svelte@5.46.0) - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) zimmerframe: 1.1.4 transitivePeerDependencies: - babel-plugin-macros @@ -19569,26 +21102,26 @@ snapshots: react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - '@storybook/builder-vite@10.1.10(esbuild@0.25.12)(rollup@4.54.0)(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))': + '@storybook/builder-vite@10.1.10(esbuild@0.25.12)(rollup@4.54.0)(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: - '@storybook/csf-plugin': 10.1.10(esbuild@0.25.12)(rollup@4.54.0)(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) - '@vitest/mocker': 3.2.4(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + '@storybook/csf-plugin': 10.1.10(esbuild@0.25.12)(rollup@4.54.0)(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) + '@vitest/mocker': 3.2.4(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) storybook: 8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6) ts-dedent: 2.2.0 - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - esbuild - msw - rollup - webpack - '@storybook/builder-vite@8.6.15(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))': + '@storybook/builder-vite@8.6.15(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@storybook/csf-plugin': 8.6.15(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6)) browser-assert: 1.2.1 storybook: 8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6) ts-dedent: 2.2.0 - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) '@storybook/components@8.6.15(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))': dependencies: @@ -19615,14 +21148,14 @@ snapshots: - supports-color - utf-8-validate - '@storybook/csf-plugin@10.1.10(esbuild@0.25.12)(rollup@4.54.0)(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))': + '@storybook/csf-plugin@10.1.10(esbuild@0.25.12)(rollup@4.54.0)(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: storybook: 8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6) unplugin: 2.3.11 optionalDependencies: esbuild: 0.25.12 rollup: 4.54.0 - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) '@storybook/csf-plugin@8.6.14(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))': dependencies: @@ -19669,37 +21202,37 @@ snapshots: react-dom: 19.2.3(react@19.2.3) storybook: 8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6) - '@storybook/svelte-vite@10.1.10(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(esbuild@0.25.12)(rollup@4.54.0)(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))': + '@storybook/svelte-vite@10.1.10(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(esbuild@0.25.12)(rollup@4.54.0)(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: - '@storybook/builder-vite': 10.1.10(esbuild@0.25.12)(rollup@4.54.0)(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + '@storybook/builder-vite': 10.1.10(esbuild@0.25.12)(rollup@4.54.0)(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) '@storybook/svelte': 10.1.10(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0) - '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) magic-string: 0.30.21 storybook: 8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6) svelte: 5.46.0 svelte2tsx: 0.7.46(svelte@5.46.0)(typescript@5.9.3) typescript: 5.9.3 - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - esbuild - msw - rollup - webpack - '@storybook/svelte-vite@8.6.15(@babel/core@7.29.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(postcss-load-config@4.0.2(postcss@8.5.9)(ts-node@10.9.2(@types/node@24.10.4)(typescript@5.9.3)))(postcss@8.5.9)(sass@1.97.1)(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))': + '@storybook/svelte-vite@8.6.15(@babel/core@7.29.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(postcss-load-config@4.0.2(postcss@8.5.19)(ts-node@10.9.2(@types/node@24.10.4)(typescript@5.9.3)))(postcss@8.5.19)(sass@1.97.1)(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: - '@storybook/builder-vite': 8.6.15(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + '@storybook/builder-vite': 8.6.15(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) '@storybook/svelte': 8.6.15(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0) - '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) magic-string: 0.30.21 storybook: 8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6) svelte: 5.46.0 - svelte-preprocess: 5.1.4(@babel/core@7.29.0)(postcss-load-config@4.0.2(postcss@8.5.9)(ts-node@10.9.2(@types/node@24.10.4)(typescript@5.9.3)))(postcss@8.5.9)(sass@1.97.1)(svelte@5.46.0)(typescript@5.9.3) + svelte-preprocess: 5.1.4(@babel/core@7.29.0)(postcss-load-config@4.0.2(postcss@8.5.19)(ts-node@10.9.2(@types/node@24.10.4)(typescript@5.9.3)))(postcss@8.5.19)(sass@1.97.1)(svelte@5.46.0)(typescript@5.9.3) svelte2tsx: 0.7.46(svelte@5.46.0)(typescript@5.9.3) sveltedoc-parser: 4.2.1 ts-dedent: 2.2.0 typescript: 5.9.3 - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - '@babel/core' - coffeescript @@ -19735,15 +21268,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@storybook/sveltekit@8.6.15(@babel/core@7.29.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(postcss-load-config@4.0.2(postcss@8.5.9)(ts-node@10.9.2(@types/node@24.10.4)(typescript@5.9.3)))(postcss@8.5.9)(sass@1.97.1)(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))': + '@storybook/sveltekit@8.6.15(@babel/core@7.29.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(postcss-load-config@4.0.2(postcss@8.5.19)(ts-node@10.9.2(@types/node@24.10.4)(typescript@5.9.3)))(postcss@8.5.19)(sass@1.97.1)(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@storybook/addon-actions': 8.6.15(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6)) - '@storybook/builder-vite': 8.6.15(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + '@storybook/builder-vite': 8.6.15(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) '@storybook/svelte': 8.6.15(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0) - '@storybook/svelte-vite': 8.6.15(@babel/core@7.29.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(postcss-load-config@4.0.2(postcss@8.5.9)(ts-node@10.9.2(@types/node@24.10.4)(typescript@5.9.3)))(postcss@8.5.9)(sass@1.97.1)(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + '@storybook/svelte-vite': 8.6.15(@babel/core@7.29.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(postcss-load-config@4.0.2(postcss@8.5.19)(ts-node@10.9.2(@types/node@24.10.4)(typescript@5.9.3)))(postcss@8.5.19)(sass@1.97.1)(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) storybook: 8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6) svelte: 5.46.0 - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - '@babel/core' - '@sveltejs/vite-plugin-svelte' @@ -19790,14 +21323,14 @@ snapshots: '@sveltejs/kit': 2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.46.0)(vite@5.4.21(@types/node@22.19.3)(lightningcss@1.32.0)(sass@1.97.1)))(svelte@5.46.0)(vite@5.4.21(@types/node@22.19.3)(lightningcss@1.32.0)(sass@1.97.1)) import-meta-resolve: 4.2.0 - '@sveltejs/adapter-auto@3.3.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))': + '@sveltejs/adapter-auto@3.3.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))': dependencies: - '@sveltejs/kit': 2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + '@sveltejs/kit': 2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) import-meta-resolve: 4.2.0 - '@sveltejs/adapter-auto@3.3.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))': + '@sveltejs/adapter-auto@3.3.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))': dependencies: - '@sveltejs/kit': 2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + '@sveltejs/kit': 2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) import-meta-resolve: 4.2.0 '@sveltejs/adapter-cloudflare@7.2.8(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.46.0)(vite@5.4.21(@types/node@20.19.27)(lightningcss@1.32.0)(sass@1.97.1)))(svelte@5.46.0)(vite@5.4.21(@types/node@20.19.27)(lightningcss@1.32.0)(sass@1.97.1)))(wrangler@4.21.2(@cloudflare/workers-types@4.20260511.1)(bufferutil@4.1.0)(utf-8-validate@6.0.6))': @@ -19894,11 +21427,11 @@ snapshots: optionalDependencies: '@opentelemetry/api': 1.9.1 - '@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))': + '@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@standard-schema/spec': 1.1.0 '@sveltejs/acorn-typescript': 1.0.8(acorn@8.15.0) - '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) '@types/cookie': 0.6.0 acorn: 8.15.0 cookie: 0.6.0 @@ -19911,15 +21444,15 @@ snapshots: set-cookie-parser: 2.7.2 sirv: 3.0.2 svelte: 5.46.0 - vite: 6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) optionalDependencies: '@opentelemetry/api': 1.9.1 - '@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))': + '@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@standard-schema/spec': 1.1.0 '@sveltejs/acorn-typescript': 1.0.8(acorn@8.15.0) - '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) '@types/cookie': 0.6.0 acorn: 8.15.0 cookie: 0.6.0 @@ -19932,7 +21465,29 @@ snapshots: set-cookie-parser: 2.7.2 sirv: 3.0.2 svelte: 5.46.0 - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) + optionalDependencies: + '@opentelemetry/api': 1.9.1 + optional: true + + '@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': + dependencies: + '@standard-schema/spec': 1.1.0 + '@sveltejs/acorn-typescript': 1.0.8(acorn@8.15.0) + '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) + '@types/cookie': 0.6.0 + acorn: 8.15.0 + cookie: 0.6.0 + devalue: 5.6.1 + esm-env: 1.2.2 + kleur: 4.1.5 + magic-string: 0.30.21 + mrmime: 2.0.1 + sade: 1.8.1 + set-cookie-parser: 2.7.2 + sirv: 3.0.2 + svelte: 5.46.0 + vite: 8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) optionalDependencies: '@opentelemetry/api': 1.9.1 @@ -19963,21 +21518,40 @@ snapshots: transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))': + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) debug: 4.4.3 svelte: 5.46.0 - vite: 6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte-inspector@5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))': + '@sveltejs/vite-plugin-svelte-inspector@5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) debug: 4.4.3 svelte: 5.46.0 - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte-inspector@5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': + dependencies: + '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) + debug: 4.4.3 + svelte: 5.46.0 + vite: 8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) + transitivePeerDependencies: + - supports-color + optional: true + + '@sveltejs/vite-plugin-svelte-inspector@5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': + dependencies: + '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) + debug: 4.4.3 + svelte: 5.46.0 + vite: 8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - supports-color @@ -20020,28 +21594,53 @@ snapshots: transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))': + '@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) debug: 4.4.3 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.21 svelte: 5.46.0 - vite: 6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) - vitefu: 1.1.1(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + vite: 6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) + vitefu: 1.1.1(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))': + '@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte-inspector': 5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) debug: 4.4.3 deepmerge: 4.3.1 magic-string: 0.30.21 svelte: 5.46.0 - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) - vitefu: 1.1.1(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) + vitefu: 1.1.1(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) + debug: 4.4.3 + deepmerge: 4.3.1 + magic-string: 0.30.21 + svelte: 5.46.0 + vite: 8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) + vitefu: 1.1.1(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) + transitivePeerDependencies: + - supports-color + optional: true + + '@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) + debug: 4.4.3 + deepmerge: 4.3.1 + magic-string: 0.30.21 + svelte: 5.46.0 + vite: 8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) + vitefu: 1.1.1(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) transitivePeerDependencies: - supports-color @@ -20278,19 +21877,86 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 4.1.18 - '@tailwindcss/vite@4.1.18(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))': + '@tailwindcss/typography@0.5.20(tailwindcss@4.2.2)': + dependencies: + postcss-selector-parser: 6.0.10 + tailwindcss: 4.2.2 + + '@tailwindcss/vite@4.1.18(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@tailwindcss/node': 4.1.18 '@tailwindcss/oxide': 4.1.18 tailwindcss: 4.1.18 - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) + + '@tailwindcss/vite@4.1.18(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': + dependencies: + '@tailwindcss/node': 4.1.18 + '@tailwindcss/oxide': 4.1.18 + tailwindcss: 4.1.18 + vite: 8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) + + '@takumi-rs/core-darwin-arm64@2.4.0': + optional: true + + '@takumi-rs/core-darwin-x64@2.4.0': + optional: true + + '@takumi-rs/core-linux-arm64-gnu@2.4.0': + optional: true + + '@takumi-rs/core-linux-arm64-musl@2.4.0': + optional: true + + '@takumi-rs/core-linux-x64-gnu@2.4.0': + optional: true + + '@takumi-rs/core-linux-x64-musl@2.4.0': + optional: true + + '@takumi-rs/core-win32-arm64-msvc@2.4.0': + optional: true + + '@takumi-rs/core-win32-x64-msvc@2.4.0': + optional: true + + '@takumi-rs/core@2.4.0(csstype@3.2.3)(preact@10.28.1)(react@19.2.3)': + dependencies: + '@takumi-rs/helpers': 2.4.0(preact@10.28.1)(react@19.2.3) + optionalDependencies: + '@takumi-rs/core-darwin-arm64': 2.4.0 + '@takumi-rs/core-darwin-x64': 2.4.0 + '@takumi-rs/core-linux-arm64-gnu': 2.4.0 + '@takumi-rs/core-linux-arm64-musl': 2.4.0 + '@takumi-rs/core-linux-x64-gnu': 2.4.0 + '@takumi-rs/core-linux-x64-musl': 2.4.0 + '@takumi-rs/core-win32-arm64-msvc': 2.4.0 + '@takumi-rs/core-win32-x64-msvc': 2.4.0 + csstype: 3.2.3 + transitivePeerDependencies: + - preact + - react + + '@takumi-rs/helpers@2.4.0(preact@10.28.1)(react@19.2.3)': + optionalDependencies: + preact: 10.28.1 + react: 19.2.3 + + '@takumi-rs/wasm@2.4.0(csstype@3.2.3)(preact@10.28.1)(react@19.2.3)': + dependencies: + '@takumi-rs/helpers': 2.4.0(preact@10.28.1)(react@19.2.3) + optionalDependencies: + csstype: 3.2.3 + transitivePeerDependencies: + - preact + - react '@tanstack/directive-functions-plugin@1.142.1(vite@5.4.21(@types/node@20.19.27)(lightningcss@1.32.0)(sass@1.97.1))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.29.0 '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 '@tanstack/router-utils': 1.141.0 babel-dead-code-elimination: 1.0.12 pathe: 2.0.3 @@ -20300,17 +21966,17 @@ snapshots: - supports-color optional: true - '@tanstack/directive-functions-plugin@1.142.1(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))': + '@tanstack/directive-functions-plugin@1.142.1(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.29.0 '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 '@tanstack/router-utils': 1.141.0 babel-dead-code-elimination: 1.0.12 pathe: 2.0.3 tiny-invariant: 1.3.3 - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - supports-color optional: true @@ -20375,19 +22041,19 @@ snapshots: - webpack optional: true - '@tanstack/react-start@1.143.4(crossws@0.4.1(srvx@0.9.8))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))': + '@tanstack/react-start@1.143.4(crossws@0.4.1(srvx@0.9.8))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@tanstack/react-router': 1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@tanstack/react-start-client': 1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@tanstack/react-start-server': 1.143.4(crossws@0.4.1(srvx@0.9.8))(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@tanstack/router-utils': 1.161.6 '@tanstack/start-client-core': 1.143.4 - '@tanstack/start-plugin-core': 1.143.4(@tanstack/react-router@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(crossws@0.4.1(srvx@0.9.8))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + '@tanstack/start-plugin-core': 1.143.4(@tanstack/react-router@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(crossws@0.4.1(srvx@0.9.8))(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) '@tanstack/start-server-core': 1.143.4(crossws@0.4.1(srvx@0.9.8)) pathe: 2.0.3 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - '@rsbuild/core' - crossws @@ -20436,7 +22102,7 @@ snapshots: '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) '@babel/template': 7.28.6 '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 '@tanstack/router-core': 1.143.4 '@tanstack/router-generator': 1.143.4 '@tanstack/router-utils': 1.141.0 @@ -20452,14 +22118,14 @@ snapshots: - supports-color optional: true - '@tanstack/router-plugin@1.143.4(@tanstack/react-router@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))': + '@tanstack/router-plugin@1.143.4(@tanstack/react-router@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) '@babel/template': 7.28.6 '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 '@tanstack/router-core': 1.143.4 '@tanstack/router-generator': 1.143.4 '@tanstack/router-utils': 1.141.0 @@ -20470,7 +22136,7 @@ snapshots: zod: 4.2.1 optionalDependencies: '@tanstack/react-router': 1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - supports-color optional: true @@ -20479,12 +22145,12 @@ snapshots: dependencies: '@babel/core': 7.29.0 '@babel/generator': 7.29.1 - '@babel/parser': 7.29.2 + '@babel/parser': 7.29.7 '@babel/preset-typescript': 7.28.5(@babel/core@7.29.0) ansis: 4.2.0 diff: 8.0.4 pathe: 2.0.3 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 transitivePeerDependencies: - supports-color optional: true @@ -20493,13 +22159,13 @@ snapshots: dependencies: '@babel/core': 7.29.0 '@babel/generator': 7.29.1 - '@babel/parser': 7.29.2 - '@babel/types': 7.29.0 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 ansis: 4.2.0 babel-dead-code-elimination: 1.0.12 diff: 8.0.4 pathe: 2.0.3 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 transitivePeerDependencies: - supports-color optional: true @@ -20512,7 +22178,7 @@ snapshots: '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) '@babel/template': 7.28.6 '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 '@tanstack/directive-functions-plugin': 1.142.1(vite@5.4.21(@types/node@20.19.27)(lightningcss@1.32.0)(sass@1.97.1)) babel-dead-code-elimination: 1.0.12 tiny-invariant: 1.3.3 @@ -20521,7 +22187,7 @@ snapshots: - vite optional: true - '@tanstack/server-functions-plugin@1.142.1(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))': + '@tanstack/server-functions-plugin@1.142.1(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.29.0 @@ -20529,8 +22195,8 @@ snapshots: '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) '@babel/template': 7.28.6 '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - '@tanstack/directive-functions-plugin': 1.142.1(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + '@babel/types': 7.29.7 + '@tanstack/directive-functions-plugin': 1.142.1(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) babel-dead-code-elimination: 1.0.12 tiny-invariant: 1.3.3 transitivePeerDependencies: @@ -20555,7 +22221,7 @@ snapshots: dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.29.0 - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 '@rolldown/pluginutils': 1.0.0-beta.40 '@tanstack/router-core': 1.143.4 '@tanstack/router-generator': 1.143.4 @@ -20569,7 +22235,7 @@ snapshots: exsolve: 1.0.8 pathe: 2.0.3 srvx: 0.9.8 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 ufo: 1.6.3 vite: 5.4.21(@types/node@20.19.27)(lightningcss@1.32.0)(sass@1.97.1) vitefu: 1.1.3(vite@5.4.21(@types/node@20.19.27)(lightningcss@1.32.0)(sass@1.97.1)) @@ -20584,17 +22250,17 @@ snapshots: - webpack optional: true - '@tanstack/start-plugin-core@1.143.4(@tanstack/react-router@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(crossws@0.4.1(srvx@0.9.8))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))': + '@tanstack/start-plugin-core@1.143.4(@tanstack/react-router@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(crossws@0.4.1(srvx@0.9.8))(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.29.0 - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 '@rolldown/pluginutils': 1.0.0-beta.40 '@tanstack/router-core': 1.143.4 '@tanstack/router-generator': 1.143.4 - '@tanstack/router-plugin': 1.143.4(@tanstack/react-router@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + '@tanstack/router-plugin': 1.143.4(@tanstack/react-router@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) '@tanstack/router-utils': 1.141.0 - '@tanstack/server-functions-plugin': 1.142.1(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + '@tanstack/server-functions-plugin': 1.142.1(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) '@tanstack/start-client-core': 1.143.4 '@tanstack/start-server-core': 1.143.4(crossws@0.4.1(srvx@0.9.8)) babel-dead-code-elimination: 1.0.12 @@ -20602,10 +22268,10 @@ snapshots: exsolve: 1.0.8 pathe: 2.0.3 srvx: 0.9.8 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 ufo: 1.6.3 - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) - vitefu: 1.1.3(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + vite: 8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) + vitefu: 1.1.3(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) xmlbuilder2: 4.0.3 zod: 4.2.1 transitivePeerDependencies: @@ -20950,6 +22616,11 @@ snapshots: tslib: 2.8.1 optional: true + '@tybys/wasm-util@0.10.3': + dependencies: + tslib: 2.8.1 + optional: true + '@types/aria-query@5.0.4': {} '@types/babel__core@7.20.5': @@ -20962,16 +22633,16 @@ snapshots: '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.29.7 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.29.7 '@types/bcrypt@6.0.0': dependencies: @@ -20983,18 +22654,81 @@ snapshots: '@types/cookie@0.6.0': {} + '@types/d3-array@3.2.2': {} + + '@types/d3-axis@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-brush@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-chord@3.0.6': {} + '@types/d3-color@3.1.3': {} + '@types/d3-contour@3.0.6': + dependencies: + '@types/d3-array': 3.2.2 + '@types/geojson': 7946.0.16 + + '@types/d3-delaunay@6.0.4': {} + + '@types/d3-dispatch@3.0.7': {} + '@types/d3-drag@3.0.7': dependencies: '@types/d3-selection': 3.0.11 + '@types/d3-dsv@3.0.7': {} + + '@types/d3-ease@3.0.2': {} + + '@types/d3-fetch@3.0.7': + dependencies: + '@types/d3-dsv': 3.0.7 + + '@types/d3-force@3.0.10': {} + + '@types/d3-format@3.0.4': {} + + '@types/d3-geo@3.1.0': + dependencies: + '@types/geojson': 7946.0.16 + + '@types/d3-hierarchy@3.1.7': {} + '@types/d3-interpolate@3.0.4': dependencies: '@types/d3-color': 3.1.3 + '@types/d3-path@3.1.1': {} + + '@types/d3-polygon@3.0.2': {} + + '@types/d3-quadtree@3.0.6': {} + + '@types/d3-random@3.0.4': {} + + '@types/d3-scale-chromatic@3.1.0': {} + + '@types/d3-scale@4.0.9': + dependencies: + '@types/d3-time': 3.0.4 + '@types/d3-selection@3.0.11': {} + '@types/d3-shape@3.1.8': + dependencies: + '@types/d3-path': 3.1.1 + + '@types/d3-time-format@4.0.3': {} + + '@types/d3-time@3.0.4': {} + + '@types/d3-timer@3.0.2': {} + '@types/d3-transition@3.0.9': dependencies: '@types/d3-selection': 3.0.11 @@ -21004,6 +22738,39 @@ snapshots: '@types/d3-interpolate': 3.0.4 '@types/d3-selection': 3.0.11 + '@types/d3@7.4.3': + dependencies: + '@types/d3-array': 3.2.2 + '@types/d3-axis': 3.0.6 + '@types/d3-brush': 3.0.6 + '@types/d3-chord': 3.0.6 + '@types/d3-color': 3.1.3 + '@types/d3-contour': 3.0.6 + '@types/d3-delaunay': 6.0.4 + '@types/d3-dispatch': 3.0.7 + '@types/d3-drag': 3.0.7 + '@types/d3-dsv': 3.0.7 + '@types/d3-ease': 3.0.2 + '@types/d3-fetch': 3.0.7 + '@types/d3-force': 3.0.10 + '@types/d3-format': 3.0.4 + '@types/d3-geo': 3.1.0 + '@types/d3-hierarchy': 3.1.7 + '@types/d3-interpolate': 3.0.4 + '@types/d3-path': 3.1.1 + '@types/d3-polygon': 3.0.2 + '@types/d3-quadtree': 3.0.6 + '@types/d3-random': 3.0.4 + '@types/d3-scale': 4.0.9 + '@types/d3-scale-chromatic': 3.1.0 + '@types/d3-selection': 3.0.11 + '@types/d3-shape': 3.1.8 + '@types/d3-time': 3.0.4 + '@types/d3-time-format': 4.0.3 + '@types/d3-timer': 3.0.2 + '@types/d3-transition': 3.0.9 + '@types/d3-zoom': 3.0.8 + '@types/debug@4.1.12': dependencies: '@types/ms': 2.1.0 @@ -21029,6 +22796,8 @@ snapshots: '@types/jsonfile': 6.1.4 '@types/node': 24.10.4 + '@types/geojson@7946.0.16': {} + '@types/graceful-fs@4.1.9': dependencies: '@types/node': 24.10.4 @@ -21089,6 +22858,10 @@ snapshots: dependencies: '@types/node': 24.10.4 + '@types/nlcst@2.0.3': + dependencies: + '@types/unist': 3.0.3 + '@types/node@20.19.27': dependencies: undici-types: 6.21.0 @@ -21305,7 +23078,7 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 - semver: 7.7.3 + semver: 7.7.4 ts-api-utils: 1.4.3(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 @@ -21321,7 +23094,7 @@ snapshots: debug: 4.4.3 minimatch: 9.0.5 semver: 7.7.4 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 ts-api-utils: 2.1.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -21336,7 +23109,7 @@ snapshots: '@typescript-eslint/types': 7.0.1 '@typescript-eslint/typescript-estree': 7.0.1(typescript@5.9.3) eslint: 9.39.2(jiti@2.6.1) - semver: 7.7.3 + semver: 7.7.4 transitivePeerDependencies: - supports-color - typescript @@ -21362,14 +23135,63 @@ snapshots: '@typescript-eslint/types': 8.50.1 eslint-visitor-keys: 4.2.1 + '@typescript/vfs@1.6.4(typescript@5.9.3)': + dependencies: + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript/vfs@1.6.4(typescript@6.0.3)': + dependencies: + debug: 4.4.3 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + '@ungap/structured-clone@1.3.0': {} + '@upsetjs/venn.js@2.0.0': + optionalDependencies: + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + '@vercel/analytics@1.6.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(react@19.2.3)(svelte@5.46.0)(vue@3.5.26(typescript@5.9.3))': + optionalDependencies: + '@sveltejs/kit': 2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) + react: 19.2.3 + svelte: 5.46.0 + vue: 3.5.26(typescript@5.9.3) + + '@vercel/analytics@2.0.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(react@19.2.3)(svelte@5.46.0)(vue@3.5.26(typescript@5.9.3))': + optionalDependencies: + '@sveltejs/kit': 2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) + react: 19.2.3 + svelte: 5.46.0 + vue: 3.5.26(typescript@5.9.3) + + '@vercel/cli-config@0.2.0': + dependencies: + xdg-app-paths: 5.5.1 + zod: 4.2.1 + + '@vercel/cli-exec@1.0.0': + dependencies: + execa: 5.1.1 + + '@vercel/functions@3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))': + dependencies: + '@vercel/oidc': 3.8.0 + optionalDependencies: + '@aws-sdk/credential-provider-web-identity': 3.958.0 + ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) + '@vercel/nft@0.26.5(encoding@0.1.13)': dependencies: '@mapbox/node-pre-gyp': 1.0.11(encoding@0.1.13) '@rollup/pluginutils': 4.2.1 - acorn: 8.15.0 - acorn-import-attributes: 1.9.5(acorn@8.15.0) + acorn: 8.17.0 + acorn-import-attributes: 1.9.5(acorn@8.17.0) async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 @@ -21382,8 +23204,52 @@ snapshots: - encoding - supports-color + '@vercel/nft@1.10.2(encoding@0.1.13)(rollup@4.54.0)': + dependencies: + '@mapbox/node-pre-gyp': 2.0.3(encoding@0.1.13) + '@rollup/pluginutils': 5.3.0(rollup@4.54.0) + acorn: 8.17.0 + acorn-import-attributes: 1.9.5(acorn@8.17.0) + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 13.0.6 + graceful-fs: 4.2.11 + node-gyp-build: 4.8.4 + picomatch: 4.0.5 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + '@vercel/oidc@3.1.0': {} + '@vercel/oidc@3.8.0': + dependencies: + '@vercel/cli-config': 0.2.0 + '@vercel/cli-exec': 1.0.0 + jose: 5.10.0 + + '@vercel/routing-utils@5.3.3': + dependencies: + path-to-regexp: 6.1.0 + path-to-regexp-updated: path-to-regexp@6.3.0 + optionalDependencies: + ajv: 6.12.6 + + '@vitejs/plugin-react@5.2.0(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.0) + '@rolldown/pluginutils': 1.0.0-rc.3 + '@types/babel__core': 7.20.5 + react-refresh: 0.18.0 + vite: 8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) + transitivePeerDependencies: + - supports-color + '@vitest/coverage-v8@1.6.1(vitest@1.6.1(@types/node@20.19.27)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.32.0)(sass@1.97.1))': dependencies: '@ampproject/remapping': 2.3.0 @@ -21448,13 +23314,13 @@ snapshots: optionalDependencies: vite: 5.4.21(@types/node@24.10.4)(lightningcss@1.32.0)(sass@1.97.1) - '@vitest/mocker@3.2.4(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@3.2.4(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) '@vitest/pretty-format@2.0.5': dependencies: @@ -21523,9 +23389,59 @@ snapshots: loupe: 3.2.1 tinyrainbow: 1.2.0 + '@volar/kit@2.4.28(typescript@6.0.3)': + dependencies: + '@volar/language-service': 2.4.28 + '@volar/typescript': 2.4.28 + typesafe-path: 0.2.2 + typescript: 6.0.3 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + + '@volar/language-core@2.4.28': + dependencies: + '@volar/source-map': 2.4.28 + + '@volar/language-server@2.4.28': + dependencies: + '@volar/language-core': 2.4.28 + '@volar/language-service': 2.4.28 + '@volar/typescript': 2.4.28 + path-browserify: 1.0.1 + request-light: 0.7.0 + vscode-languageserver: 9.0.1 + vscode-languageserver-protocol: 3.18.2 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + + '@volar/language-service@2.4.28': + dependencies: + '@volar/language-core': 2.4.28 + vscode-languageserver-protocol: 3.18.2 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + + '@volar/source-map@2.4.28': {} + + '@volar/typescript@2.4.28': + dependencies: + '@volar/language-core': 2.4.28 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vscode/emmet-helper@2.11.0': + dependencies: + emmet: 2.4.11 + jsonc-parser: 2.3.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.18.0 + vscode-uri: 3.1.0 + + '@vscode/l10n@0.0.18': {} + '@vue/compiler-core@3.5.26': dependencies: - '@babel/parser': 7.29.2 + '@babel/parser': 7.29.7 '@vue/shared': 3.5.26 entities: 7.0.1 estree-walker: 2.0.2 @@ -21540,14 +23456,14 @@ snapshots: '@vue/compiler-sfc@3.5.26': dependencies: - '@babel/parser': 7.29.2 + '@babel/parser': 7.29.7 '@vue/compiler-core': 3.5.26 '@vue/compiler-dom': 3.5.26 '@vue/compiler-ssr': 3.5.26 '@vue/shared': 3.5.26 estree-walker: 2.0.2 magic-string: 0.30.21 - postcss: 8.5.9 + postcss: 8.5.19 source-map-js: 1.2.1 optional: true @@ -21583,6 +23499,13 @@ snapshots: vue: 3.5.26(typescript@5.9.3) optional: true + '@vue/server-renderer@3.5.26(vue@3.5.26(typescript@6.0.3))': + dependencies: + '@vue/compiler-ssr': 3.5.26 + '@vue/shared': 3.5.26 + vue: 3.5.26(typescript@6.0.3) + optional: true + '@vue/shared@3.5.26': optional: true @@ -21628,24 +23551,24 @@ snapshots: abbrev@1.1.1: {} - accepts@1.3.8: + abbrev@3.0.1: {} + + abort-controller@3.0.0: dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - optional: true + event-target-shim: 5.0.1 accepts@2.0.0: dependencies: mime-types: 3.0.2 negotiator: 1.0.0 - acorn-import-attributes@1.9.5(acorn@8.15.0): + acorn-import-attributes@1.9.5(acorn@8.17.0): dependencies: - acorn: 8.15.0 + acorn: 8.17.0 - acorn-jsx@5.3.2(acorn@8.15.0): + acorn-jsx@5.3.2(acorn@8.17.0): dependencies: - acorn: 8.15.0 + acorn: 8.17.0 acorn-walk@8.3.2: {} @@ -21657,6 +23580,8 @@ snapshots: acorn@8.15.0: {} + acorn@8.17.0: {} + add-stream@1.0.0: {} agent-base@6.0.2: @@ -21667,6 +23592,14 @@ snapshots: agent-base@7.1.4: {} + ai@5.0.212(zod@3.25.76): + dependencies: + '@ai-sdk/gateway': 2.0.111(zod@3.25.76) + '@ai-sdk/provider': 2.0.3 + '@ai-sdk/provider-utils': 3.0.28(zod@3.25.76) + '@opentelemetry/api': 1.9.0 + zod: 3.25.76 + ai@6.0.158(zod@4.2.1): dependencies: '@ai-sdk/gateway': 3.0.95(zod@4.2.1) @@ -21675,10 +23608,18 @@ snapshots: '@opentelemetry/api': 1.9.0 zod: 4.2.1 + ajv-draft-04@1.0.0(ajv@8.18.0): + optionalDependencies: + ajv: 8.18.0 + ajv-formats@3.0.1(ajv@8.18.0): optionalDependencies: ajv: 8.18.0 + ajv-i18n@4.2.0(ajv@8.18.0): + dependencies: + ajv: 8.18.0 + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -21697,6 +23638,10 @@ snapshots: dependencies: try-catch: 3.0.1 + am-i-vibing@0.4.0: + dependencies: + process-ancestry: 0.1.0 + ansi-colors@4.1.3: {} ansi-escapes@4.3.2: @@ -21746,10 +23691,6 @@ snapshots: argparse@2.0.1: {} - aria-hidden@1.2.6: - dependencies: - tslib: 2.8.1 - aria-query@5.1.3: dependencies: deep-equal: 2.2.3 @@ -21765,11 +23706,10 @@ snapshots: call-bound: 1.0.4 is-array-buffer: 3.0.5 - array-flatten@1.1.1: - optional: true - array-ify@1.0.0: {} + array-iterate@2.0.1: {} + array-union@2.1.0: {} arrify@1.0.1: {} @@ -21792,19 +23732,114 @@ snapshots: astring@1.9.0: {} + astro@7.0.9(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@24.10.4)(@vercel/functions@3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.54.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0): + dependencies: + '@astrojs/compiler-rs': 0.3.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + '@astrojs/internal-helpers': 0.10.1 + '@astrojs/markdown-satteri': 0.3.4 + '@astrojs/telemetry': 3.3.3 + '@capsizecss/unpack': 4.0.1 + '@clack/prompts': 1.7.0 + '@oslojs/encoding': 1.1.0 + '@rollup/pluginutils': 5.3.0(rollup@4.54.0) + am-i-vibing: 0.4.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + ci-info: 4.4.0 + clsx: 2.1.1 + common-ancestor-path: 2.0.0 + cookie: 1.1.1 + devalue: 5.8.1 + diff: 8.0.4 + dset: 3.1.4 + es-module-lexer: 2.3.1 + esbuild: 0.28.1 + flattie: 1.1.1 + fontace: 0.4.1 + get-tsconfig: 5.0.0-beta.4 + github-slugger: 2.0.0 + html-escaper: 3.0.3 + http-cache-semantics: 4.2.0 + js-yaml: 4.1.1 + jsonc-parser: 3.3.1 + magic-string: 0.30.21 + magicast: 0.5.3 + mrmime: 2.0.1 + neotraverse: 0.6.18 + obug: 2.1.3 + p-limit: 7.3.0 + p-queue: 9.3.1 + package-manager-detector: 1.7.0 + piccolore: 0.1.3 + picomatch: 4.0.5 + semver: 7.7.4 + shiki: 4.3.1 + smol-toml: 1.7.0 + svgo: 4.0.2 + tinyclip: 0.1.15 + tinyexec: 1.2.4 + tinyglobby: 0.2.17 + ultrahtml: 1.7.0 + unifont: 0.7.4 + unstorage: 1.17.5(@vercel/functions@3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(ioredis@5.10.1) + vite: 8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) + vitefu: 1.1.3(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) + xxhash-wasm: 1.1.0 + yargs-parser: 22.0.0 + zod: 4.2.1 + optionalDependencies: + '@astrojs/markdown-remark': 7.2.1 + sharp: 0.34.5 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@emnapi/core' + - '@emnapi/runtime' + - '@netlify/blobs' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - '@vitejs/devtools' + - aws4fetch + - db0 + - idb-keyval + - ioredis + - jiti + - less + - rollup + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - uploadthing + - yaml + async-sema@3.1.1: {} + async@3.2.6: {} + asynckit@0.4.0: {} atob@2.1.2: {} - autoprefixer@10.4.23(postcss@8.5.9): + autoprefixer@10.4.23(postcss@8.5.19): dependencies: browserslist: 4.28.1 caniuse-lite: 1.0.30001761 fraction.js: 5.3.4 picocolors: 1.1.1 - postcss: 8.5.9 + postcss: 8.5.19 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: @@ -21821,21 +23856,12 @@ snapshots: axobject-query@4.1.0: {} - babel-dead-code-elimination@1.0.11: - dependencies: - '@babel/core': 7.28.5 - '@babel/parser': 7.28.5 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - transitivePeerDependencies: - - supports-color - babel-dead-code-elimination@1.0.12: dependencies: '@babel/core': 7.29.0 - '@babel/parser': 7.29.2 + '@babel/parser': 7.29.7 '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color optional: true @@ -21866,7 +23892,7 @@ snapshots: babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.5 + '@babel/types': 7.29.7 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 @@ -21894,6 +23920,10 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-react-compiler@1.0.0: + dependencies: + '@babel/types': 7.29.7 + babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.5): dependencies: '@babel/core': 7.28.5 @@ -21934,11 +23964,6 @@ snapshots: baseline-browser-mapping@2.9.11: {} - basic-auth@2.0.1: - dependencies: - safe-buffer: 5.1.2 - optional: true - bcrypt@6.0.0: dependencies: node-addon-api: 8.5.0 @@ -21971,7 +23996,7 @@ snapshots: vitest: 2.1.9(@types/node@20.19.27)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.32.0)(sass@1.97.1) vue: 3.5.26(typescript@5.9.3) - better-auth@1.4.18(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(@tanstack/react-start@1.143.4(crossws@0.4.1(srvx@0.9.8))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(drizzle-kit@0.31.8)(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20260511.1)(@opentelemetry/api@1.9.1)(@types/pg@8.16.0)(kysely@0.28.9)(pg@8.18.0)(postgres@3.4.7))(pg@8.18.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.10)(svelte@5.46.0)(vitest@2.1.9(@types/node@24.10.4)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.32.0)(sass@1.97.1))(vue@3.5.26(typescript@5.9.3)): + better-auth@1.4.18(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(@tanstack/react-start@1.143.4(crossws@0.4.1(srvx@0.9.8))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.8)(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20260511.1)(@opentelemetry/api@1.9.1)(@types/pg@8.16.0)(kysely@0.28.9)(pg@8.18.0)(postgres@3.4.7))(pg@8.18.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.10)(svelte@5.46.0)(vitest@2.1.9(@types/node@24.10.4)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.32.0)(sass@1.97.1))(vue@3.5.26(typescript@5.9.3)): dependencies: '@better-auth/core': 1.4.18(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.2.1))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0) '@better-auth/telemetry': 1.4.18(@better-auth/core@1.4.18(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.2.1))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0)) @@ -21986,8 +24011,8 @@ snapshots: nanostores: 1.1.0 zod: 4.2.1 optionalDependencies: - '@sveltejs/kit': 2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) - '@tanstack/react-start': 1.143.4(crossws@0.4.1(srvx@0.9.8))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + '@sveltejs/kit': 2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) + '@tanstack/react-start': 1.143.4(crossws@0.4.1(srvx@0.9.8))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) drizzle-kit: 0.31.8 drizzle-orm: 0.44.7(@cloudflare/workers-types@4.20260511.1)(@opentelemetry/api@1.9.1)(@types/pg@8.16.0)(kysely@0.28.9)(pg@8.18.0)(postgres@3.4.7) pg: 8.18.0 @@ -22034,28 +24059,28 @@ snapshots: transitivePeerDependencies: - '@sveltejs/kit' - bits-ui@2.16.1(@internationalized/date@3.10.1)(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0): + bits-ui@2.16.1(@internationalized/date@3.10.1)(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0): dependencies: '@floating-ui/core': 1.7.3 '@floating-ui/dom': 1.7.4 '@internationalized/date': 3.10.1 esm-env: 1.2.2 - runed: 0.35.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0) + runed: 0.35.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0) svelte: 5.46.0 - svelte-toolbelt: 0.10.6(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0) + svelte-toolbelt: 0.10.6(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0) tabbable: 6.3.0 transitivePeerDependencies: - '@sveltejs/kit' - bits-ui@2.16.1(@internationalized/date@3.10.1)(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0): + bits-ui@2.16.1(@internationalized/date@3.10.1)(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0): dependencies: '@floating-ui/core': 1.7.3 '@floating-ui/dom': 1.7.4 '@internationalized/date': 3.10.1 esm-env: 1.2.2 - runed: 0.35.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0) + runed: 0.35.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0) svelte: 5.46.0 - svelte-toolbelt: 0.10.6(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0) + svelte-toolbelt: 0.10.6(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0) tabbable: 6.3.0 transitivePeerDependencies: - '@sveltejs/kit' @@ -22064,6 +24089,114 @@ snapshots: bluebird@3.4.7: {} + blume@1.1.2(4833f745f9fd8f626b4a7791f185a353): + dependencies: + '@astrojs/check': 0.9.9(prettier@3.8.2)(typescript@6.0.3) + '@astrojs/markdown-satteri': 0.3.4 + '@astrojs/mdx': 7.0.3(@astrojs/markdown-satteri@0.3.4)(astro@7.0.9(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@24.10.4)(@vercel/functions@3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.54.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) + '@astrojs/node': 11.0.2(astro@7.0.9(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@24.10.4)(@vercel/functions@3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.54.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) + '@astrojs/react': 6.0.1(@types/node@24.10.4)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(jiti@2.6.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) + '@astrojs/vercel': 11.0.3(@aws-sdk/credential-provider-web-identity@3.958.0)(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(astro@7.0.9(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@24.10.4)(@vercel/functions@3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.54.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))(encoding@0.1.13)(react@19.2.3)(rollup@4.54.0)(svelte@5.46.0)(vue@3.5.26(typescript@5.9.3))(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + '@clack/prompts': 1.7.0 + '@iconify-json/lucide': 1.2.117 + '@iconify/types': 2.0.0 + '@iconify/utils': 3.1.4 + '@modelcontextprotocol/sdk': 1.29.0(zod@3.25.76) + '@orama/orama': 3.1.18 + '@pierre/diffs': 1.2.12(@shikijs/themes@4.3.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@scalar/astro': 0.4.9(astro@7.0.9(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@24.10.4)(@vercel/functions@3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.54.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) + '@scalar/openapi-parser': 0.28.8 + '@scalar/openapi-types': 0.9.1 + '@shikijs/transformers': 4.3.1 + '@shikijs/twoslash': 4.3.1(typescript@6.0.3) + '@tailwindcss/typography': 0.5.20(tailwindcss@4.2.2) + '@tailwindcss/vite': 4.1.18(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) + '@vercel/analytics': 2.0.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(react@19.2.3)(svelte@5.46.0)(vue@3.5.26(typescript@5.9.3)) + ai: 5.0.212(zod@3.25.76) + astro: 7.0.9(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@24.10.4)(@vercel/functions@3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.54.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) + babel-plugin-react-compiler: 1.0.0 + citty: 0.1.6 + consola: 3.4.2 + dompurify: 3.4.12 + epub-gen-memory: 1.1.2(encoding@0.1.13) + github-slugger: 2.0.0 + gray-matter: 4.0.3 + jiti: 2.6.1 + js-yaml: 4.1.1 + katex: 0.17.0 + marked: 18.0.6 + mermaid: 11.16.0 + node-html-parser: 9.0.0 + pagefind: 1.5.2 + pathe: 2.0.3 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + satteri: 0.9.5 + shiki: 4.3.1 + simple-icons: 13.21.0 + tailwindcss: 4.2.2 + takumi-js: 2.4.0(csstype@3.2.3)(preact@10.28.1)(react@19.2.3) + tinyglobby: 0.2.17 + twoslash: 0.3.9(typescript@6.0.3) + typescript: 6.0.3 + undici: 8.7.0 + zod: 3.25.76 + transitivePeerDependencies: + - '@astrojs/markdown-remark' + - '@aws-sdk/credential-provider-web-identity' + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@cfworker/json-schema' + - '@deno/kv' + - '@emnapi/core' + - '@emnapi/runtime' + - '@netlify/blobs' + - '@planetscale/database' + - '@remix-run/react' + - '@shikijs/themes' + - '@sveltejs/kit' + - '@types/node' + - '@types/react' + - '@types/react-dom' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - '@vitejs/devtools' + - aws4fetch + - csstype + - db0 + - encoding + - esbuild + - idb-keyval + - ioredis + - less + - next + - nuxt + - preact + - prettier + - prettier-plugin-astro + - rollup + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - svelte + - terser + - tsx + - uploadthing + - vite + - vue + - vue-router + - ws + - yaml + body-parser@1.20.4: dependencies: bytes: 3.1.2 @@ -22095,8 +24228,7 @@ snapshots: transitivePeerDependencies: - supports-color - boolbase@1.0.0: - optional: true + boolbase@1.0.0: {} bowser@2.13.1: {} @@ -22322,16 +24454,20 @@ snapshots: chownr@2.0.0: {} + chownr@3.0.0: {} + ci-info@3.9.0: {} + ci-info@4.4.0: {} + + citty@0.1.6: + dependencies: + consola: 3.4.2 + cjs-module-lexer@1.4.3: {} cjs-module-lexer@2.2.0: {} - class-variance-authority@0.7.1: - dependencies: - clsx: 2.1.1 - classcat@5.0.5: {} cli-cursor@5.0.0: @@ -22404,6 +24540,8 @@ snapshots: comma-separated-tokens@2.0.3: {} + commander@11.1.0: {} + commander@12.1.0: {} commander@14.0.2: {} @@ -22418,6 +24556,8 @@ snapshots: commander@9.5.0: {} + common-ancestor-path@2.0.0: {} + commondir@1.0.1: {} compare-func@2.0.0: @@ -22425,26 +24565,6 @@ snapshots: array-ify: 1.0.0 dot-prop: 5.3.0 - compressible@2.0.18: - dependencies: - mime-db: 1.54.0 - optional: true - - compression@1.8.1: - dependencies: - bytes: 3.1.2 - compressible: 2.0.18 - debug: 2.6.9 - negotiator: 0.6.4 - on-headers: 1.1.0 - safe-buffer: 5.2.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - optional: true - - compute-scroll-into-view@3.1.1: {} - concat-map@0.0.1: {} concat-stream@2.0.0: @@ -22468,15 +24588,10 @@ snapshots: confbox@0.1.8: {} - confbox@0.2.4: {} + consola@3.4.2: {} console-control-strings@1.1.0: {} - content-disposition@0.5.4: - dependencies: - safe-buffer: 5.2.1 - optional: true - content-disposition@1.0.1: {} content-type@1.0.5: {} @@ -22595,6 +24710,8 @@ snapshots: convert-source-map@2.0.0: {} + cookie-es@1.2.3: {} + cookie-es@2.0.1: optional: true @@ -22630,6 +24747,14 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 + cose-base@1.0.3: + dependencies: + layout-base: 1.0.2 + + cose-base@2.2.0: + dependencies: + layout-base: 2.0.1 + create-jest@29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@types/node@20.19.27)(typescript@5.9.3)): dependencies: '@jest/types': 29.6.3 @@ -22659,6 +24784,10 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + crossws@0.3.5: + dependencies: + uncrypto: 0.1.3 + crossws@0.4.1(srvx@0.9.8): optionalDependencies: srvx: 0.9.8 @@ -22669,6 +24798,14 @@ snapshots: utrie: 1.0.2 optional: true + css-select@4.3.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + css-select@5.2.2: dependencies: boolbase: 1.0.0 @@ -22676,20 +24813,27 @@ snapshots: domhandler: 5.0.3 domutils: 3.2.2 nth-check: 2.1.1 - optional: true + + css-tree@2.2.1: + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.1 css-tree@3.2.1: dependencies: mdn-data: 2.27.1 source-map-js: 1.2.1 - css-what@6.2.2: - optional: true + css-what@6.2.2: {} css.escape@1.5.1: {} cssesc@3.0.0: {} + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + cssstyle@4.6.0: dependencies: '@asamuzakjp/css-color': 3.2.0 @@ -22699,6 +24843,18 @@ snapshots: custom-event-polyfill@1.0.7: {} + cytoscape-cose-bilkent@4.1.0(cytoscape@3.34.0): + dependencies: + cose-base: 1.0.3 + cytoscape: 3.34.0 + + cytoscape-fcose@2.2.0(cytoscape@3.34.0): + dependencies: + cose-base: 2.2.0 + cytoscape: 3.34.0 + + cytoscape@3.34.0: {} + d3-array@2.12.1: dependencies: internmap: 1.0.1 @@ -22888,6 +25044,11 @@ snapshots: d3-transition: 3.0.1(d3-selection@3.0.0) d3-zoom: 3.0.0 + dagre-d3-es@7.0.14: + dependencies: + d3: 7.9.0 + lodash-es: 4.17.22 + dagre@0.8.5: dependencies: graphlib: 2.1.8 @@ -22917,6 +25078,8 @@ snapshots: dayjs@1.11.19: {} + dayjs@1.11.21: {} + debug@2.6.9: dependencies: ms: 2.0.0 @@ -22989,6 +25152,8 @@ snapshots: defu@6.1.4: {} + defu@6.1.7: {} + delaunator@5.0.1: dependencies: robust-predicates: 3.0.2 @@ -23003,6 +25168,8 @@ snapshots: dequal@2.0.3: {} + destr@2.0.5: {} + destroy@1.2.0: {} detect-indent@6.1.0: {} @@ -23013,14 +25180,16 @@ snapshots: detect-newline@3.1.0: {} - detect-node-es@1.1.0: {} - devalue@5.6.1: {} + devalue@5.8.1: {} + devlop@1.1.0: dependencies: dequal: 2.0.3 + diacritics@1.3.0: {} + didyoumean@1.2.2: {} diff-sequences@29.6.3: {} @@ -23029,8 +25198,9 @@ snapshots: diff@5.2.0: {} - diff@8.0.4: - optional: true + diff@8.0.4: {} + + diff@9.0.0: {} dijkstrajs@1.0.3: {} @@ -23087,6 +25257,10 @@ snapshots: optionalDependencies: '@types/trusted-types': 2.0.7 + dompurify@3.4.12: + optionalDependencies: + '@types/trusted-types': 2.0.7 + domutils@2.8.0: dependencies: dom-serializer: 1.4.1 @@ -23103,6 +25277,10 @@ snapshots: dependencies: is-obj: 2.0.0 + dot-prop@6.0.1: + dependencies: + is-obj: 2.0.0 + dotenv@16.6.1: {} dotenv@17.2.3: {} @@ -23130,6 +25308,8 @@ snapshots: pg: 8.18.0 postgres: 3.4.7 + dset@3.1.4: {} + duck@0.1.12: dependencies: underscore: 1.13.8 @@ -23142,12 +25322,21 @@ snapshots: ee-first@1.1.1: {} + ejs@3.1.10: + dependencies: + jake: 10.9.4 + electron-to-chromium@1.5.267: {} electron-to-chromium@1.5.335: {} emittery@0.13.1: {} + emmet@2.4.11: + dependencies: + '@emmetio/abbreviation': 2.3.3 + '@emmetio/css-abbreviation': 2.1.8 + emoji-regex-xs@1.0.0: {} emoji-regex@10.6.0: {} @@ -23178,12 +25367,34 @@ snapshots: entities@2.2.0: {} + entities@3.0.1: {} + entities@4.5.0: {} entities@6.0.1: {} entities@7.0.1: {} + entities@8.0.0: {} + + epub-gen-memory@1.1.2(encoding@0.1.13): + dependencies: + abort-controller: 3.0.0 + css-select: 4.3.0 + diacritics: 1.3.0 + dom-serializer: 1.4.1 + domhandler: 4.3.1 + domutils: 2.8.0 + ejs: 3.1.10 + htmlparser2: 7.2.0 + jszip: 3.10.1 + mime: 2.6.0 + node-fetch: 2.7.0(encoding@0.1.13) + ow: 0.28.2 + slugify: 1.6.9 + transitivePeerDependencies: + - encoding + error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 @@ -23208,6 +25419,8 @@ snapshots: es-module-lexer@1.7.0: {} + es-module-lexer@2.3.1: {} + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -23221,6 +25434,8 @@ snapshots: es-toolkit@1.43.0: {} + es-toolkit@1.49.0: {} + es6-promise@3.3.1: {} esast-util-from-estree@2.0.0: @@ -23233,7 +25448,7 @@ snapshots: esast-util-from-js@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 - acorn: 8.15.0 + acorn: 8.17.0 esast-util-from-estree: 2.0.0 vfile-message: 4.0.3 @@ -23436,6 +25651,35 @@ snapshots: '@esbuild/win32-ia32': 0.27.3 '@esbuild/win32-x64': 0.27.3 + esbuild@0.28.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.1 + '@esbuild/android-arm': 0.28.1 + '@esbuild/android-arm64': 0.28.1 + '@esbuild/android-x64': 0.28.1 + '@esbuild/darwin-arm64': 0.28.1 + '@esbuild/darwin-x64': 0.28.1 + '@esbuild/freebsd-arm64': 0.28.1 + '@esbuild/freebsd-x64': 0.28.1 + '@esbuild/linux-arm': 0.28.1 + '@esbuild/linux-arm64': 0.28.1 + '@esbuild/linux-ia32': 0.28.1 + '@esbuild/linux-loong64': 0.28.1 + '@esbuild/linux-mips64el': 0.28.1 + '@esbuild/linux-ppc64': 0.28.1 + '@esbuild/linux-riscv64': 0.28.1 + '@esbuild/linux-s390x': 0.28.1 + '@esbuild/linux-x64': 0.28.1 + '@esbuild/netbsd-arm64': 0.28.1 + '@esbuild/netbsd-x64': 0.28.1 + '@esbuild/openbsd-arm64': 0.28.1 + '@esbuild/openbsd-x64': 0.28.1 + '@esbuild/openharmony-arm64': 0.28.1 + '@esbuild/sunos-x64': 0.28.1 + '@esbuild/win32-arm64': 0.28.1 + '@esbuild/win32-ia32': 0.28.1 + '@esbuild/win32-x64': 0.28.1 + escalade@3.2.0: {} escape-html@1.0.3: {} @@ -23581,20 +25825,20 @@ snapshots: espree@10.4.0: dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) eslint-visitor-keys: 4.2.1 espree@9.2.0: dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) eslint-visitor-keys: 3.4.3 espree@9.6.1: dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -23646,10 +25890,6 @@ snapshots: astring: 1.9.0 source-map: 0.7.6 - estree-util-value-to-estree@3.5.0: - dependencies: - '@types/estree': 1.0.8 - estree-util-visit@2.0.0: dependencies: '@types/estree-jsx': 1.0.5 @@ -23665,6 +25905,10 @@ snapshots: etag@1.8.1: {} + event-target-shim@5.0.1: {} + + eventemitter3@5.0.4: {} + eventsource-parser@3.0.6: {} eventsource-parser@3.0.8: {} @@ -23716,43 +25960,6 @@ snapshots: express: 5.2.1 ip-address: 10.1.0 - express@4.22.1: - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.4 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.7.2 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.3.2 - fresh: 0.5.2 - http-errors: 2.0.1 - merge-descriptors: 1.0.3 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.13 - proxy-addr: 2.0.7 - qs: 6.14.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.19.2 - serve-static: 1.16.3 - setprototypeof: 1.2.0 - statuses: 2.0.2 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - optional: true - express@5.2.1: dependencies: accepts: 2.0.0 @@ -23788,6 +25995,10 @@ snapshots: exsolve@1.0.8: {} + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + extend@3.0.2: {} external-editor@3.1.0: @@ -23812,8 +26023,18 @@ snapshots: fast-sha256@1.3.0: {} + fast-string-truncated-width@3.0.3: {} + + fast-string-width@3.0.2: + dependencies: + fast-string-truncated-width: 3.0.3 + fast-uri@3.1.0: {} + fast-wrap-ansi@0.2.2: + dependencies: + fast-string-width: 3.0.2 + fast-xml-parser@5.2.5: dependencies: strnum: 2.1.2 @@ -23832,9 +26053,9 @@ snapshots: optionalDependencies: picomatch: 4.0.3 - fdir@6.5.0(picomatch@4.0.4): + fdir@6.5.0(picomatch@4.0.5): optionalDependencies: - picomatch: 4.0.4 + picomatch: 4.0.5 fflate@0.4.8: {} @@ -23858,23 +26079,14 @@ snapshots: file-uri-to-path@1.0.0: {} + filelist@1.0.6: + dependencies: + minimatch: 5.1.6 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 - finalhandler@1.3.2: - dependencies: - debug: 2.6.9 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.2 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - optional: true - finalhandler@2.1.1: dependencies: debug: 4.4.3 @@ -23917,8 +26129,18 @@ snapshots: flatted@3.3.3: {} + flattie@1.1.1: {} + follow-redirects@1.15.11: {} + fontace@0.4.1: + dependencies: + fontkitten: 1.0.3 + + fontkitten@1.0.3: + dependencies: + tiny-inflate: 1.0.3 + for-each@0.3.5: dependencies: is-callable: 1.2.7 @@ -23950,9 +26172,6 @@ snapshots: dependencies: tslib: 2.4.0 - fresh@0.5.2: - optional: true - fresh@2.0.0: {} fs-extra@11.3.3: @@ -23973,99 +26192,6 @@ snapshots: fsevents@2.3.3: optional: true - fumadocs-core@16.2.1(@tanstack/react-router@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(lucide-react@0.562.0(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react-router@7.13.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3): - dependencies: - '@formatjs/intl-localematcher': 0.6.2 - '@orama/orama': 3.1.18 - '@shikijs/rehype': 3.20.0 - '@shikijs/transformers': 3.20.0 - estree-util-value-to-estree: 3.5.0 - github-slugger: 2.0.0 - hast-util-to-estree: 3.1.3 - hast-util-to-jsx-runtime: 2.3.6 - image-size: 2.0.2 - negotiator: 1.0.0 - npm-to-yarn: 3.0.1 - path-to-regexp: 8.3.0 - remark: 15.0.1 - remark-gfm: 4.0.1 - remark-rehype: 11.1.2 - scroll-into-view-if-needed: 3.1.0 - shiki: 3.20.0 - unist-util-visit: 5.0.0 - optionalDependencies: - '@tanstack/react-router': 1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@types/react': 19.2.7 - lucide-react: 0.562.0(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - react-router: 7.13.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - transitivePeerDependencies: - - supports-color - - fumadocs-mdx@14.0.4(fumadocs-core@16.2.1(@tanstack/react-router@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(lucide-react@0.562.0(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react-router@7.13.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3))(react@19.2.3)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)): - dependencies: - '@mdx-js/mdx': 3.1.1 - '@standard-schema/spec': 1.1.0 - chokidar: 5.0.0 - esbuild: 0.27.2 - estree-util-value-to-estree: 3.5.0 - fumadocs-core: 16.2.1(@tanstack/react-router@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(lucide-react@0.562.0(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react-router@7.13.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3) - js-yaml: 4.1.1 - lru-cache: 11.2.4 - mdast-util-to-markdown: 2.1.2 - picocolors: 1.1.1 - picomatch: 4.0.3 - remark-mdx: 3.1.1 - tinyexec: 1.0.2 - tinyglobby: 0.2.15 - unified: 11.0.5 - unist-util-remove-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.3 - zod: 4.2.1 - optionalDependencies: - react: 19.2.3 - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) - transitivePeerDependencies: - - supports-color - - fumadocs-ui@16.2.1(@tanstack/react-router@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(lucide-react@0.562.0(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react-router@7.13.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.18): - dependencies: - '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-navigation-menu': 1.2.14(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-scroll-area': 1.2.10(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-slot': 1.2.4(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - class-variance-authority: 0.7.1 - fumadocs-core: 16.2.1(@tanstack/react-router@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(lucide-react@0.562.0(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react-router@7.13.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3) - lodash.merge: 4.6.2 - next-themes: 0.4.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - postcss-selector-parser: 7.1.1 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - react-medium-image-zoom: 5.4.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - scroll-into-view-if-needed: 3.1.0 - tailwind-merge: 3.4.0 - optionalDependencies: - '@types/react': 19.2.7 - tailwindcss: 4.1.18 - transitivePeerDependencies: - - '@mixedbread/sdk' - - '@orama/core' - - '@tanstack/react-router' - - '@types/react-dom' - - algoliasearch - - lucide-react - - react-router - - supports-color - - waku - function-bind@1.1.2: {} functional-red-black-tree@1.0.1: {} @@ -24109,8 +26235,6 @@ snapshots: hasown: 2.0.2 math-intrinsics: 1.1.0 - get-nonce@1.0.1: {} - get-package-type@0.1.0: {} get-pkg-repo@4.2.1: @@ -24120,11 +26244,6 @@ snapshots: through2: 2.0.5 yargs: 16.2.0 - get-port@5.1.1: - optional: true - - get-port@7.2.0: {} - get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -24143,6 +26262,10 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + get-tsconfig@5.0.0-beta.4: + dependencies: + resolve-pkg-maps: 1.0.0 + git-raw-commits@2.0.11: dependencies: dargs: 7.0.0 @@ -24231,6 +26354,25 @@ snapshots: dependencies: lodash: 4.17.21 + gray-matter@4.0.3: + dependencies: + js-yaml: 3.14.2 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + + h3@1.15.11: + dependencies: + cookie-es: 1.2.3 + crossws: 0.3.5 + defu: 6.1.7 + destr: 2.0.5 + iron-webcrypto: 1.2.1 + node-mock-http: 1.0.4 + radix3: 1.1.2 + ufo: 1.6.3 + uncrypto: 0.1.3 + h3@2.0.1-rc.6(crossws@0.4.1(srvx@0.9.8)): dependencies: rou3: 0.7.12 @@ -24239,6 +26381,8 @@ snapshots: crossws: 0.4.1(srvx@0.9.8) optional: true + hachure-fill@0.5.2: {} + handlebars@4.7.8: dependencies: minimist: 1.2.8 @@ -24272,6 +26416,26 @@ snapshots: dependencies: function-bind: 1.1.2 + hast-util-from-html@2.0.3: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.3 + parse5: 7.3.0 + vfile: 6.0.3 + vfile-message: 4.0.3 + + hast-util-from-parse5@8.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.1.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + hast-util-has-property@3.0.0: dependencies: '@types/hast': 3.0.4 @@ -24285,6 +26449,30 @@ snapshots: '@types/hast': 3.0.4 hast-util-has-property: 3.0.0 + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.3.0 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.1 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + parse5: 7.3.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + hast-util-to-estree@3.1.3: dependencies: '@types/estree': 1.0.8 @@ -24340,14 +26528,39 @@ snapshots: transitivePeerDependencies: - supports-color + hast-util-to-parse5@8.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + hast-util-to-string@3.0.1: dependencies: '@types/hast': 3.0.4 + hast-util-to-text@4.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + hast-util-whitespace@3.0.0: dependencies: '@types/hast': 3.0.4 + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + hey-listen@1.0.8: {} highlight.js@11.11.1: {} @@ -24392,6 +26605,8 @@ snapshots: html-escaper@2.0.2: {} + html-escaper@3.0.3: {} + html-to-image@1.11.13: {} html-void-elements@3.0.0: {} @@ -24416,6 +26631,15 @@ snapshots: domutils: 3.2.2 entities: 7.0.1 + htmlparser2@7.2.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 3.0.1 + + http-cache-semantics@4.2.0: {} + http-errors@2.0.1: dependencies: depd: 2.0.0 @@ -24467,8 +26691,6 @@ snapshots: ignore@7.0.5: {} - image-size@2.0.2: {} - immediate@3.0.6: {} immutable@5.1.4: {} @@ -24480,15 +26702,15 @@ snapshots: import-in-the-middle@2.0.6: dependencies: - acorn: 8.15.0 - acorn-import-attributes: 1.9.5(acorn@8.15.0) + acorn: 8.17.0 + acorn-import-attributes: 1.9.5(acorn@8.17.0) cjs-module-lexer: 2.2.0 module-details-from-path: 1.0.4 import-in-the-middle@3.0.1: dependencies: - acorn: 8.15.0 - acorn-import-attributes: 1.9.5(acorn@8.15.0) + acorn: 8.17.0 + acorn-import-attributes: 1.9.5(acorn@8.17.0) cjs-module-lexer: 2.2.0 module-details-from-path: 1.0.4 @@ -24560,6 +26782,8 @@ snapshots: ipaddr.js@1.9.1: {} + iron-webcrypto@1.2.1: {} + is-alphabetical@2.0.1: {} is-alphanumerical@2.0.1: @@ -24610,6 +26834,10 @@ snapshots: is-docker@2.2.1: {} + is-docker@4.0.0: {} + + is-extendable@0.1.1: {} + is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -24722,7 +26950,8 @@ snapshots: isarray@2.0.5: {} - isbot@5.1.37: {} + isbot@5.1.37: + optional: true isexe@2.0.0: {} @@ -24739,7 +26968,7 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.28.5 - '@babel/parser': 7.28.5 + '@babel/parser': 7.29.7 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -24749,7 +26978,7 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: '@babel/core': 7.28.5 - '@babel/parser': 7.28.5 + '@babel/parser': 7.29.7 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.7.4 @@ -24783,6 +27012,12 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 + jake@10.9.4: + dependencies: + async: 3.2.6 + filelist: 1.0.6 + picocolors: 1.1.1 + jessy@3.1.1: {} jest-changed-files@29.7.0: @@ -25058,7 +27293,7 @@ snapshots: '@babel/generator': 7.28.5 '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.28.5) '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.28.5) - '@babel/types': 7.28.5 + '@babel/types': 7.29.7 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 @@ -25137,6 +27372,8 @@ snapshots: '@sideway/formula': 3.0.1 '@sideway/pinpoint': 2.0.0 + jose@5.10.0: {} + jose@6.1.3: {} js-tokens@4.0.0: {} @@ -25208,8 +27445,6 @@ snapshots: transitivePeerDependencies: - '@noble/hashes' - jsesc@3.0.2: {} - jsesc@3.1.0: {} json-buffer@3.0.1: {} @@ -25232,6 +27467,8 @@ snapshots: json5@2.2.3: {} + jsonc-parser@2.3.1: {} + jsonc-parser@3.3.1: {} jsonfile@6.2.0: @@ -25242,6 +27479,8 @@ snapshots: jsonparse@1.3.1: {} + jsonpointer@5.0.1: {} + jspdf-autotable@3.8.4(jspdf@2.5.2): dependencies: jspdf: 2.5.2 @@ -25258,14 +27497,14 @@ snapshots: dompurify: 2.5.8 html2canvas: 1.4.1 - jsrepo@3.5.1(svelte@5.46.0)(vue@3.5.26(typescript@5.9.3)): + jsrepo@3.5.1(svelte@5.46.0)(vue@3.5.26(typescript@6.0.3)): dependencies: commander: 14.0.3 oxc-parser: 0.112.0 unconfig: 7.5.0 optionalDependencies: svelte: 5.46.0 - vue: 3.5.26(typescript@5.9.3) + vue: 3.5.26(typescript@6.0.3) jszip@3.10.1: dependencies: @@ -25280,10 +27519,20 @@ snapshots: dependencies: commander: 8.3.0 + katex@0.16.47: + dependencies: + commander: 8.3.0 + + katex@0.17.0: + dependencies: + commander: 8.3.0 + keyv@4.5.4: dependencies: json-buffer: 3.0.1 + khroma@2.1.0: {} + kind-of@6.0.3: {} kleur@3.0.3: {} @@ -25327,8 +27576,14 @@ snapshots: runed: 0.28.0(svelte@5.46.0) svelte: 5.46.0 + layout-base@1.0.2: {} + + layout-base@2.0.1: {} + leven@3.1.0: {} + leven@4.1.0: {} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -25539,6 +27794,8 @@ snapshots: lodash.isarguments@3.1.0: {} + lodash.isequal@4.5.0: {} + lodash.ismatch@4.4.0: {} lodash.memoize@4.1.2: {} @@ -25574,8 +27831,6 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.2.4: {} - lru-cache@11.2.7: {} lru-cache@5.1.1: @@ -25586,11 +27841,7 @@ snapshots: dependencies: yallist: 4.0.0 - lucide-react@0.562.0(react@19.2.3): - dependencies: - react: 19.2.3 - - lucide-static@0.552.0: {} + lru_map@0.4.1: {} lucide-svelte@0.468.0(svelte@5.46.0): dependencies: @@ -25610,6 +27861,12 @@ snapshots: '@babel/types': 7.28.5 source-map-js: 1.2.1 + magicast@0.5.3: + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + source-map-js: 1.2.1 + make-dir@3.1.0: dependencies: semver: 6.3.1 @@ -25658,10 +27915,20 @@ snapshots: marked@15.0.12: {} + marked@16.4.2: {} + + marked@18.0.6: {} + marked@7.0.5: {} math-intrinsics@1.1.0: {} + mdast-util-definitions@6.0.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + unist-util-visit: 5.1.0 + mdast-util-find-and-replace@3.0.2: dependencies: '@types/mdast': 4.0.4 @@ -25806,7 +28073,7 @@ snapshots: micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 vfile: 6.0.3 mdast-util-to-markdown@2.1.2: @@ -25818,7 +28085,7 @@ snapshots: mdast-util-to-string: 4.0.0 micromark-util-classify-character: 2.0.1 micromark-util-decode-string: 2.0.1 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 zwitch: 2.0.4 mdast-util-to-string@4.0.0: @@ -25833,7 +28100,9 @@ snapshots: github-slugger: 2.0.0 mdast-util-to-string: 4.0.0 unist-util-is: 6.0.1 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 + + mdn-data@2.0.28: {} mdn-data@2.27.1: {} @@ -25878,17 +28147,35 @@ snapshots: type-fest: 0.18.1 yargs-parser: 20.2.9 - merge-descriptors@1.0.3: - optional: true - merge-descriptors@2.0.0: {} merge-stream@2.0.0: {} merge2@1.4.1: {} - methods@1.1.2: - optional: true + mermaid@11.16.0: + dependencies: + '@braintree/sanitize-url': 7.1.2 + '@iconify/utils': 3.1.4 + '@mermaid-js/parser': 1.2.0 + '@types/d3': 7.4.3 + '@upsetjs/venn.js': 2.0.0 + cytoscape: 3.34.0 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.34.0) + cytoscape-fcose: 2.2.0(cytoscape@3.34.0) + d3: 7.9.0 + d3-sankey: 0.12.3 + dagre-d3-es: 7.0.14 + dayjs: 1.11.21 + dompurify: 3.3.3 + es-toolkit: 1.49.0 + katex: 0.16.47 + khroma: 2.1.0 + marked: 16.4.2 + roughjs: 4.6.6 + stylis: 4.4.0 + ts-dedent: 2.2.0 + uuid: 14.0.1 micromark-core-commonmark@2.0.3: dependencies: @@ -26009,8 +28296,8 @@ snapshots: micromark-extension-mdxjs@3.0.0: dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) micromark-extension-mdx-expression: 3.0.1 micromark-extension-mdx-jsx: 3.0.2 micromark-extension-mdx-md: 2.0.0 @@ -26171,8 +28458,7 @@ snapshots: dependencies: mime-db: 1.54.0 - mime@1.6.0: - optional: true + mime@2.6.0: {} mime@3.0.0: {} @@ -26204,24 +28490,6 @@ snapshots: - bufferutil - utf-8-validate - miniflare@4.20251125.0(bufferutil@4.1.0)(utf-8-validate@6.0.6): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - acorn: 8.14.0 - acorn-walk: 8.3.2 - exit-hook: 2.2.1 - glob-to-regexp: 0.4.1 - sharp: 0.33.5 - stoppable: 1.1.0 - undici: 7.14.0 - workerd: 1.20251125.0 - ws: 8.18.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) - youch: 4.1.0-beta.10 - zod: 3.22.3 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - miniflare@4.20260426.0(bufferutil@4.1.0)(utf-8-validate@6.0.6): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -26275,6 +28543,10 @@ snapshots: minipass: 3.3.6 yallist: 4.0.0 + minizlib@3.1.0: + dependencies: + minipass: 7.1.3 + mkdirp@0.5.6: dependencies: minimist: 1.2.8 @@ -26283,7 +28555,7 @@ snapshots: mlly@1.8.0: dependencies: - acorn: 8.15.0 + acorn: 8.17.0 pathe: 2.0.3 pkg-types: 1.3.1 ufo: 1.6.3 @@ -26298,17 +28570,6 @@ snapshots: module-details-from-path@1.0.4: {} - morgan@1.10.1: - dependencies: - basic-auth: 2.0.1 - debug: 2.6.9 - depd: 2.0.0 - on-finished: 2.3.0 - on-headers: 1.1.0 - transitivePeerDependencies: - - supports-color - optional: true - motion-dom@12.38.0: dependencies: motion-utils: 12.36.0 @@ -26339,6 +28600,8 @@ snapshots: optionalDependencies: msgpackr-extract: 3.0.3 + muggle-string@0.4.1: {} + mustache@4.2.0: {} mute-stream@1.0.0: {} @@ -26353,6 +28616,8 @@ snapshots: nanoid@3.3.11: {} + nanoid@3.3.16: {} + nanoid@5.1.5: {} nanoid@5.1.6: {} @@ -26361,20 +28626,15 @@ snapshots: natural-compare@1.4.0: {} - negotiator@0.6.3: - optional: true - - negotiator@0.6.4: - optional: true - negotiator@1.0.0: {} neo-async@2.6.2: {} - next-themes@0.4.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + neotraverse@0.6.18: {} + + nlcst-to-string@4.0.0: dependencies: - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@types/nlcst': 2.0.3 node-abort-controller@3.1.1: {} @@ -26384,6 +28644,8 @@ snapshots: node-ensure@0.0.0: {} + node-fetch-native@1.6.7: {} + node-fetch@2.7.0(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 @@ -26399,8 +28661,15 @@ snapshots: node-gyp-build@4.8.4: {} + node-html-parser@9.0.0: + dependencies: + css-select: 5.2.2 + entities: 8.0.0 + node-int64@0.4.0: {} + node-mock-http@1.0.4: {} + node-releases@2.0.27: {} node-releases@2.0.37: {} @@ -26415,6 +28684,10 @@ snapshots: dependencies: abbrev: 1.1.1 + nopt@8.1.0: + dependencies: + abbrev: 3.0.1 + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 @@ -26439,8 +28712,6 @@ snapshots: dependencies: path-key: 4.0.0 - npm-to-yarn@3.0.1: {} - npmlog@5.0.1: dependencies: are-we-there-yet: 2.0.0 @@ -26451,7 +28722,6 @@ snapshots: nth-check@2.1.1: dependencies: boolbase: 1.0.0 - optional: true nwsapi@2.2.23: {} @@ -26477,20 +28747,20 @@ snapshots: has-symbols: 1.1.0 object-keys: 1.1.1 - ohash@2.0.11: {} + obug@2.1.3: {} - on-finished@2.3.0: + ofetch@1.5.1: dependencies: - ee-first: 1.1.1 - optional: true + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.3 + + ohash@2.0.11: {} on-finished@2.4.1: dependencies: ee-first: 1.1.1 - on-headers@1.1.0: - optional: true - once@1.4.0: dependencies: wrappy: 1.0.2 @@ -26509,6 +28779,8 @@ snapshots: oniguruma-parser@0.12.1: {} + oniguruma-parser@0.12.2: {} + oniguruma-to-es@2.3.0: dependencies: emoji-regex-xs: 1.0.0 @@ -26521,6 +28793,12 @@ snapshots: regex: 6.1.0 regex-recursion: 6.0.2 + oniguruma-to-es@4.3.6: + dependencies: + oniguruma-parser: 0.12.2 + regex: 6.1.0 + regex-recursion: 6.0.2 + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 @@ -26561,8 +28839,18 @@ snapshots: orderedmap@2.1.1: {} + os-paths@4.4.0: {} + os-tmpdir@1.0.2: {} + ow@0.28.2: + dependencies: + '@sindresorhus/is': 4.6.0 + callsites: 3.1.0 + dot-prop: 6.0.1 + lodash.isequal: 4.5.0 + vali-date: 1.0.0 + oxc-parser@0.112.0: dependencies: '@oxc-project/types': 0.112.0 @@ -26604,6 +28892,10 @@ snapshots: dependencies: yocto-queue: 1.2.2 + p-limit@7.3.0: + dependencies: + yocto-queue: 1.2.2 + p-locate@2.0.0: dependencies: p-limit: 1.3.0 @@ -26620,7 +28912,12 @@ snapshots: dependencies: p-limit: 3.1.0 - p-map@7.0.4: {} + p-queue@9.3.1: + dependencies: + eventemitter3: 5.0.4 + p-timeout: 7.0.1 + + p-timeout@7.0.1: {} p-try@1.0.0: {} @@ -26628,6 +28925,18 @@ snapshots: package-json-from-dist@1.0.1: {} + package-manager-detector@1.7.0: {} + + pagefind@1.5.2: + optionalDependencies: + '@pagefind/darwin-arm64': 1.5.2 + '@pagefind/darwin-x64': 1.5.2 + '@pagefind/freebsd-x64': 1.5.2 + '@pagefind/linux-arm64': 1.5.2 + '@pagefind/linux-x64': 1.5.2 + '@pagefind/windows-arm64': 1.5.2 + '@pagefind/windows-x64': 1.5.2 + pako@1.0.11: {} papaparse@5.5.3: {} @@ -26658,6 +28967,15 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + parse-latin@7.0.0: + dependencies: + '@types/nlcst': 2.0.3 + '@types/unist': 3.0.3 + nlcst-to-string: 4.0.0 + unist-util-modify-children: 4.0.0 + unist-util-visit-children: 3.0.0 + vfile: 6.0.3 + parse-srcset@1.0.2: {} parse5-htmlparser2-tree-adapter@7.1.0: @@ -26681,6 +28999,10 @@ snapshots: parseurl@1.3.3: {} + path-browserify@1.0.1: {} + + path-data-parser@0.1.0: {} + path-exists@3.0.0: {} path-exists@4.0.0: {} @@ -26698,8 +29020,7 @@ snapshots: lru-cache: 11.2.7 minipass: 7.1.3 - path-to-regexp@0.1.13: - optional: true + path-to-regexp@6.1.0: {} path-to-regexp@6.3.0: {} @@ -26761,13 +29082,15 @@ snapshots: dependencies: split2: 4.2.0 + piccolore@0.1.3: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} picomatch@4.0.3: {} - picomatch@4.0.4: {} + picomatch@4.0.5: {} pify@2.3.0: {} @@ -26787,12 +29110,6 @@ snapshots: mlly: 1.8.0 pathe: 2.0.3 - pkg-types@2.3.0: - dependencies: - confbox: 0.2.4 - exsolve: 1.0.8 - pathe: 2.0.3 - playwright-core@1.57.0: {} playwright@1.57.0: @@ -26817,6 +29134,13 @@ snapshots: pngjs@5.0.0: {} + points-on-curve@0.2.0: {} + + points-on-path@0.2.1: + dependencies: + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + polished@4.3.1: dependencies: '@babel/runtime': 7.28.4 @@ -26850,6 +29174,15 @@ snapshots: postcss: 8.5.6 ts-node: 10.9.2(@types/node@20.19.27)(typescript@5.9.3) + postcss-load-config@4.0.2(postcss@8.5.19)(ts-node@10.9.2(@types/node@24.10.4)(typescript@5.9.3)): + dependencies: + lilconfig: 3.1.3 + yaml: 2.8.2 + optionalDependencies: + postcss: 8.5.19 + ts-node: 10.9.2(@types/node@24.10.4)(typescript@5.9.3) + optional: true + postcss-load-config@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@types/node@20.19.27)(typescript@5.9.3)): dependencies: lilconfig: 3.1.3 @@ -26874,15 +29207,6 @@ snapshots: postcss: 8.5.6 ts-node: 10.9.2(@types/node@24.10.4)(typescript@5.9.3) - postcss-load-config@4.0.2(postcss@8.5.9)(ts-node@10.9.2(@types/node@24.10.4)(typescript@5.9.3)): - dependencies: - lilconfig: 3.1.3 - yaml: 2.8.2 - optionalDependencies: - postcss: 8.5.9 - ts-node: 10.9.2(@types/node@24.10.4)(typescript@5.9.3) - optional: true - postcss-nested@6.2.0(postcss@8.5.6): dependencies: postcss: 8.5.6 @@ -26913,13 +29237,13 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.5.6: + postcss@8.5.19: dependencies: - nanoid: 3.3.11 + nanoid: 3.3.16 picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.9: + postcss@8.5.6: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -27002,6 +29326,8 @@ snapshots: prismjs@1.30.0: {} + process-ancestry@0.1.0: {} + process-nextick-args@2.0.1: {} process@0.11.10: {} @@ -27155,6 +29481,8 @@ snapshots: quick-lru@4.0.1: {} + radix3@1.1.2: {} + raf@3.4.1: dependencies: performance-now: 2.1.0 @@ -27187,47 +29515,7 @@ snapshots: react-is@18.3.1: {} - react-medium-image-zoom@5.4.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3): - dependencies: - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - - react-refresh@0.14.2: {} - - react-remove-scroll-bar@2.3.8(@types/react@19.2.7)(react@19.2.3): - dependencies: - react: 19.2.3 - react-style-singleton: 2.2.3(@types/react@19.2.7)(react@19.2.3) - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.2.7 - - react-remove-scroll@2.7.2(@types/react@19.2.7)(react@19.2.3): - dependencies: - react: 19.2.3 - react-remove-scroll-bar: 2.3.8(@types/react@19.2.7)(react@19.2.3) - react-style-singleton: 2.2.3(@types/react@19.2.7)(react@19.2.3) - tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.2.7)(react@19.2.3) - use-sidecar: 1.1.3(@types/react@19.2.7)(react@19.2.3) - optionalDependencies: - '@types/react': 19.2.7 - - react-router@7.13.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3): - dependencies: - cookie: 1.1.1 - react: 19.2.3 - set-cookie-parser: 2.7.2 - optionalDependencies: - react-dom: 19.2.3(react@19.2.3) - - react-style-singleton@2.2.3(@types/react@19.2.7)(react@19.2.3): - dependencies: - get-nonce: 1.0.1 - react: 19.2.3 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.2.7 + react-refresh@0.18.0: {} react@19.2.3: {} @@ -27297,10 +29585,10 @@ snapshots: estree-util-build-jsx: 3.0.1 vfile: 6.0.3 - recma-jsx@1.0.1(acorn@8.15.0): + recma-jsx@1.0.1(acorn@8.17.0): dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) estree-util-to-js: 2.0.0 recma-parse: 1.0.0 recma-stringify: 1.0.0 @@ -27396,6 +29684,12 @@ snapshots: dependencies: jsesc: 3.1.0 + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + rehype-recma@1.0.0: dependencies: '@types/estree': 1.0.8 @@ -27412,6 +29706,12 @@ snapshots: hast-util-to-string: 3.0.1 unist-util-visit: 5.0.0 + rehype-stringify@10.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + unified: 11.0.5 + rehype-unwrap-images@1.0.0: dependencies: '@types/hast': 3.0.4 @@ -27454,6 +29754,13 @@ snapshots: unified: 11.0.5 vfile: 6.0.3 + remark-smartypants@3.0.2: + dependencies: + retext: 9.0.0 + retext-smartypants: 6.2.0 + unified: 11.0.5 + unist-util-visit: 5.1.0 + remark-stringify@11.0.0: dependencies: '@types/mdast': 4.0.4 @@ -27471,14 +29778,9 @@ snapshots: hast-util-whitespace: 3.0.0 unist-util-visit: 5.0.0 - remark@15.0.1: - dependencies: - '@types/mdast': 4.0.4 - remark-parse: 11.0.0 - remark-stringify: 11.0.0 - unified: 11.0.5 - transitivePeerDependencies: - - supports-color + request-light@0.5.8: {} + + request-light@0.7.0: {} require-directory@2.1.1: {} @@ -27516,6 +29818,31 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 + retext-latin@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + parse-latin: 7.0.0 + unified: 11.0.5 + + retext-smartypants@6.2.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unist-util-visit: 5.1.0 + + retext-stringify@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unified: 11.0.5 + + retext@9.0.0: + dependencies: + '@types/nlcst': 2.0.3 + retext-latin: 4.0.0 + retext-stringify: 4.0.0 + unified: 11.0.5 + reusify@1.1.0: {} rgbcolor@1.0.1: @@ -27536,6 +29863,27 @@ snapshots: robust-predicates@3.0.2: {} + rolldown@1.1.5: + dependencies: + '@oxc-project/types': 0.139.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.1.5 + '@rolldown/binding-darwin-arm64': 1.1.5 + '@rolldown/binding-darwin-x64': 1.1.5 + '@rolldown/binding-freebsd-x64': 1.1.5 + '@rolldown/binding-linux-arm-gnueabihf': 1.1.5 + '@rolldown/binding-linux-arm64-gnu': 1.1.5 + '@rolldown/binding-linux-arm64-musl': 1.1.5 + '@rolldown/binding-linux-ppc64-gnu': 1.1.5 + '@rolldown/binding-linux-s390x-gnu': 1.1.5 + '@rolldown/binding-linux-x64-gnu': 1.1.5 + '@rolldown/binding-linux-x64-musl': 1.1.5 + '@rolldown/binding-openharmony-arm64': 1.1.5 + '@rolldown/binding-wasm32-wasi': 1.1.5 + '@rolldown/binding-win32-arm64-msvc': 1.1.5 + '@rolldown/binding-win32-x64-msvc': 1.1.5 + rollup@4.54.0: dependencies: '@types/estree': 1.0.8 @@ -27568,6 +29916,13 @@ snapshots: rou3@0.7.12: {} + roughjs@4.6.6: + dependencies: + hachure-fill: 0.5.2 + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + points-on-path: 0.2.1 + router@2.2.0: dependencies: debug: 4.4.3 @@ -27612,32 +29967,32 @@ snapshots: optionalDependencies: '@sveltejs/kit': 2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.46.0)(vite@5.4.21(@types/node@20.19.27)(lightningcss@1.32.0)(sass@1.97.1)))(svelte@5.46.0)(vite@5.4.21(@types/node@20.19.27)(lightningcss@1.32.0)(sass@1.97.1)) - runed@0.35.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0): + runed@0.35.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0): dependencies: dequal: 2.0.3 esm-env: 1.2.2 lz-string: 1.5.0 svelte: 5.46.0 optionalDependencies: - '@sveltejs/kit': 2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + '@sveltejs/kit': 2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) - runed@0.35.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0): + runed@0.35.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0): dependencies: dequal: 2.0.3 esm-env: 1.2.2 lz-string: 1.5.0 svelte: 5.46.0 optionalDependencies: - '@sveltejs/kit': 2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + '@sveltejs/kit': 2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) - runed@0.37.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(zod@4.2.1): + runed@0.37.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(zod@4.2.1): dependencies: dequal: 2.0.3 esm-env: 1.2.2 lz-string: 1.5.0 svelte: 5.46.0 optionalDependencies: - '@sveltejs/kit': 2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + '@sveltejs/kit': 2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) zod: 4.2.1 rusha@0.8.14: {} @@ -27702,6 +30057,25 @@ snapshots: optionalDependencies: '@parcel/watcher': 2.5.1 + satteri@0.9.5: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + optionalDependencies: + '@bruits/satteri-darwin-arm64': 0.9.5 + '@bruits/satteri-darwin-x64': 0.9.5 + '@bruits/satteri-linux-arm64-gnu': 0.9.5 + '@bruits/satteri-linux-arm64-musl': 0.9.5 + '@bruits/satteri-linux-x64-gnu': 0.9.5 + '@bruits/satteri-linux-x64-musl': 0.9.5 + '@bruits/satteri-wasm32-wasi': 0.9.5 + '@bruits/satteri-win32-arm64-msvc': 0.9.5 + '@bruits/satteri-win32-x64-msvc': 0.9.5 + + sax@1.6.0: {} + saxes@6.0.0: dependencies: xmlchars: 2.2.0 @@ -27710,12 +30084,13 @@ snapshots: schema-dts@1.1.5: {} - scroll-into-view-if-needed@3.1.0: - dependencies: - compute-scroll-into-view: 3.1.1 - scule@1.3.0: {} + section-matter@1.0.0: + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + semver@5.7.2: {} semver@6.3.1: {} @@ -27724,25 +30099,6 @@ snapshots: semver@7.7.4: {} - send@0.19.2: - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.1 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - optional: true - send@1.2.1: dependencies: debug: 4.4.3 @@ -27775,16 +30131,6 @@ snapshots: seroval@1.5.2: optional: true - serve-static@1.16.3: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.19.2 - transitivePeerDependencies: - - supports-color - optional: true - serve-static@2.2.1: dependencies: encodeurl: 2.0.0 @@ -27794,6 +30140,8 @@ snapshots: transitivePeerDependencies: - supports-color + server-destroy@1.0.1: {} + set-blocking@2.0.0: {} set-cookie-parser@2.7.2: {} @@ -27901,17 +30249,6 @@ snapshots: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - shiki@3.20.0: - dependencies: - '@shikijs/core': 3.20.0 - '@shikijs/engine-javascript': 3.20.0 - '@shikijs/engine-oniguruma': 3.20.0 - '@shikijs/langs': 3.20.0 - '@shikijs/themes': 3.20.0 - '@shikijs/types': 3.20.0 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - shiki@3.22.0: dependencies: '@shikijs/core': 3.22.0 @@ -27923,6 +30260,17 @@ snapshots: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 + shiki@4.3.1: + dependencies: + '@shikijs/core': 4.3.1 + '@shikijs/engine-javascript': 4.3.1 + '@shikijs/engine-oniguruma': 4.3.1 + '@shikijs/langs': 4.3.1 + '@shikijs/themes': 4.3.1 + '@shikijs/types': 4.3.1 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 @@ -27957,6 +30305,8 @@ snapshots: signal-exit@4.1.0: {} + simple-icons@13.21.0: {} + simple-icons@16.9.0: {} simple-swizzle@0.2.4: @@ -27979,6 +30329,10 @@ snapshots: slash@3.0.0: {} + slugify@1.6.9: {} + + smol-toml@1.7.0: {} + solid-js@1.9.10: dependencies: csstype: 3.2.3 @@ -28149,6 +30503,8 @@ snapshots: dependencies: ansi-regex: 6.2.2 + strip-bom-string@1.0.0: {} + strip-bom@3.0.0: {} strip-bom@4.0.0: {} @@ -28187,6 +30543,8 @@ snapshots: hey-listen: 1.0.8 tslib: 2.4.0 + stylis@4.4.0: {} + sucrase@3.35.1: dependencies: '@jridgewell/gen-mapping': 0.3.13 @@ -28194,7 +30552,7 @@ snapshots: lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.7 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 ts-interface-checker: 0.1.13 supports-color@10.2.2: {} @@ -28241,11 +30599,11 @@ snapshots: transitivePeerDependencies: - picomatch - svelte-check@4.3.5(picomatch@4.0.4)(svelte@5.46.0)(typescript@5.9.3): + svelte-check@4.3.5(picomatch@4.0.5)(svelte@5.46.0)(typescript@5.9.3): dependencies: '@jridgewell/trace-mapping': 0.3.31 chokidar: 4.0.3 - fdir: 6.5.0(picomatch@4.0.4) + fdir: 6.5.0(picomatch@4.0.5) picocolors: 1.1.1 sade: 1.8.1 svelte: 5.46.0 @@ -28300,7 +30658,7 @@ snapshots: svelte: 5.46.0 tslib: 2.8.1 - svelte-preprocess@5.1.4(@babel/core@7.29.0)(postcss-load-config@4.0.2(postcss@8.5.9)(ts-node@10.9.2(@types/node@24.10.4)(typescript@5.9.3)))(postcss@8.5.9)(sass@1.97.1)(svelte@5.46.0)(typescript@5.9.3): + svelte-preprocess@5.1.4(@babel/core@7.29.0)(postcss-load-config@4.0.2(postcss@8.5.19)(ts-node@10.9.2(@types/node@24.10.4)(typescript@5.9.3)))(postcss@8.5.19)(sass@1.97.1)(svelte@5.46.0)(typescript@5.9.3): dependencies: '@types/pug': 2.0.10 detect-indent: 6.1.0 @@ -28310,8 +30668,8 @@ snapshots: svelte: 5.46.0 optionalDependencies: '@babel/core': 7.29.0 - postcss: 8.5.9 - postcss-load-config: 4.0.2(postcss@8.5.9)(ts-node@10.9.2(@types/node@24.10.4)(typescript@5.9.3)) + postcss: 8.5.19 + postcss-load-config: 4.0.2(postcss@8.5.19)(ts-node@10.9.2(@types/node@24.10.4)(typescript@5.9.3)) sass: 1.97.1 typescript: 5.9.3 @@ -28355,19 +30713,19 @@ snapshots: transitivePeerDependencies: - '@sveltejs/kit' - svelte-toolbelt@0.10.6(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0): + svelte-toolbelt@0.10.6(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0): dependencies: clsx: 2.1.1 - runed: 0.35.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0) + runed: 0.35.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0) style-to-object: 1.0.14 svelte: 5.46.0 transitivePeerDependencies: - '@sveltejs/kit' - svelte-toolbelt@0.10.6(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0): + svelte-toolbelt@0.10.6(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0): dependencies: clsx: 2.1.1 - runed: 0.35.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.0) + runed: 0.35.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0) style-to-object: 1.0.14 svelte: 5.46.0 transitivePeerDependencies: @@ -28422,6 +30780,16 @@ snapshots: svg-pathdata@6.0.3: optional: true + svgo@4.0.2: + dependencies: + commander: 11.1.0 + css-select: 5.2.2 + css-tree: 3.2.1 + css-what: 6.2.2 + csso: 5.0.5 + picocolors: 1.1.1 + sax: 1.6.0 + symbol-tree@3.2.4: {} tabbable@6.3.0: {} @@ -28487,6 +30855,16 @@ snapshots: tailwindcss@4.2.2: {} + takumi-js@2.4.0(csstype@3.2.3)(preact@10.28.1)(react@19.2.3): + dependencies: + '@takumi-rs/core': 2.4.0(csstype@3.2.3)(preact@10.28.1)(react@19.2.3) + '@takumi-rs/helpers': 2.4.0(preact@10.28.1)(react@19.2.3) + '@takumi-rs/wasm': 2.4.0(csstype@3.2.3)(preact@10.28.1)(react@19.2.3) + transitivePeerDependencies: + - csstype + - preact + - react + tapable@2.3.0: {} tar@6.2.1: @@ -28498,6 +30876,14 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 + tar@7.5.20: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.3 + minizlib: 3.1.0 + yallist: 5.0.0 + test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 @@ -28537,6 +30923,8 @@ snapshots: globalyzer: 0.1.0 globrex: 0.1.2 + tiny-inflate@1.0.3: {} + tiny-invariant@1.3.3: {} tiny-warning@1.0.3: @@ -28544,19 +30932,21 @@ snapshots: tinybench@2.9.0: {} + tinyclip@0.1.15: {} + tinyexec@0.3.2: {} - tinyexec@1.0.2: {} + tinyexec@1.2.4: {} tinyglobby@0.2.15: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 - tinyglobby@0.2.16: + tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 tinypool@0.8.4: {} @@ -28730,10 +31120,6 @@ snapshots: normalize-path: 3.0.0 plimit-lit: 1.6.1 - tsconfck@3.1.6(typescript@5.9.3): - optionalDependencies: - typescript: 5.9.3 - tslib@2.4.0: {} tslib@2.8.1: {} @@ -28774,6 +31160,24 @@ snapshots: tw-animate-css@1.4.0: {} + twoslash-protocol@0.3.9: {} + + twoslash@0.3.9(typescript@5.9.3): + dependencies: + '@typescript/vfs': 1.6.4(typescript@5.9.3) + twoslash-protocol: 0.3.9 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + twoslash@0.3.9(typescript@6.0.3): + dependencies: + '@typescript/vfs': 1.6.4(typescript@6.0.3) + twoslash-protocol: 0.3.9 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -28800,6 +31204,10 @@ snapshots: dependencies: tagged-tag: 1.0.0 + type-fest@5.8.0: + dependencies: + tagged-tag: 1.0.0 + type-is@1.6.18: dependencies: media-typer: 0.3.0 @@ -28813,6 +31221,12 @@ snapshots: typedarray@0.0.6: {} + typesafe-path@0.2.2: {} + + typescript-auto-import-cache@0.3.6: + dependencies: + semver: 7.7.4 + typescript-eslint@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): dependencies: '@typescript-eslint/eslint-plugin': 8.50.1(@typescript-eslint/parser@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) @@ -28834,6 +31248,8 @@ snapshots: typescript@5.9.3: {} + typescript@6.0.3: {} + uc.micro@2.1.0: {} ufo@1.6.3: {} @@ -28841,6 +31257,8 @@ snapshots: uglify-js@3.19.3: optional: true + ultrahtml@1.7.0: {} + unconfig-core@7.5.0: dependencies: '@quansync/fs': 1.0.0 @@ -28854,6 +31272,8 @@ snapshots: quansync: 1.0.0 unconfig-core: 7.5.0 + uncrypto@0.1.3: {} + underscore@1.13.8: {} undici-types@6.21.0: {} @@ -28864,12 +31284,12 @@ snapshots: dependencies: '@fastify/busboy': 2.1.1 - undici@7.14.0: {} - undici@7.24.6: {} undici@7.24.8: {} + undici@8.7.0: {} + unenv@2.0.0-rc.17: dependencies: defu: 6.1.4 @@ -28903,10 +31323,26 @@ snapshots: trough: 2.2.0 vfile: 6.0.3 + unifont@0.7.4: + dependencies: + css-tree: 3.2.1 + ofetch: 1.5.1 + ohash: 2.0.11 + + unist-util-find-after@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-is@6.0.1: dependencies: '@types/unist': 3.0.3 + unist-util-modify-children@4.0.0: + dependencies: + '@types/unist': 3.0.3 + array-iterate: 2.0.1 + unist-util-position-from-estree@2.0.0: dependencies: '@types/unist': 3.0.3 @@ -28918,7 +31354,7 @@ snapshots: unist-util-remove-position@5.0.0: dependencies: '@types/unist': 3.0.3 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 unist-util-stringify-position@2.0.3: dependencies: @@ -28928,6 +31364,10 @@ snapshots: dependencies: '@types/unist': 3.0.3 + unist-util-visit-children@3.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-visit-parents@6.0.2: dependencies: '@types/unist': 3.0.3 @@ -28939,24 +31379,44 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + universalify@2.0.1: {} unpipe@1.0.0: {} unplugin@1.16.1: dependencies: - acorn: 8.15.0 + acorn: 8.17.0 webpack-virtual-modules: 0.6.2 unplugin@2.3.11: dependencies: '@jridgewell/remapping': 2.3.5 - acorn: 8.15.0 - picomatch: 4.0.4 + acorn: 8.17.0 + picomatch: 4.0.5 webpack-virtual-modules: 0.6.2 unsplash-js@7.0.20: {} + unstorage@1.17.5(@vercel/functions@3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(ioredis@5.10.1): + dependencies: + anymatch: 3.1.3 + chokidar: 5.0.0 + destr: 2.0.5 + h3: 1.15.11 + lru-cache: 11.2.7 + node-fetch-native: 1.6.7 + ofetch: 1.5.1 + ufo: 1.6.3 + optionalDependencies: + '@vercel/functions': 3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + ioredis: 5.10.1 + update-browserslist-db@1.2.3(browserslist@4.28.1): dependencies: browserslist: 4.28.1 @@ -28975,21 +31435,6 @@ snapshots: url-polyfill@1.1.14: {} - use-callback-ref@1.3.3(@types/react@19.2.7)(react@19.2.3): - dependencies: - react: 19.2.3 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.2.7 - - use-sidecar@1.1.3(@types/react@19.2.7)(react@19.2.3): - dependencies: - detect-node-es: 1.1.0 - react: 19.2.3 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.2.7 - use-sync-external-store@1.6.0(react@19.2.3): dependencies: react: 19.2.3 @@ -29008,14 +31453,13 @@ snapshots: is-typed-array: 1.1.15 which-typed-array: 1.1.19 - utils-merge@1.0.1: - optional: true - utrie@1.0.2: dependencies: base64-arraybuffer: 1.0.2 optional: true + uuid@14.0.1: {} + uuid@8.3.2: {} uuid@9.0.1: {} @@ -29030,9 +31474,12 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 + vali-date@1.0.0: {} + valibot@1.3.1(typescript@5.9.3): optionalDependencies: typescript: 5.9.3 + optional: true validate-npm-package-license@3.0.4: dependencies: @@ -29047,6 +31494,11 @@ snapshots: svelte: 5.46.0 svelte-toolbelt: 0.7.1(svelte@5.46.0) + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + vfile-message@2.0.4: dependencies: '@types/unist': 2.0.11 @@ -29153,41 +31605,9 @@ snapshots: - supports-color - terser - vite-node@3.2.4(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2): + vite-plugin-css-injected-by-js@3.5.2(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)): dependencies: - cac: 6.7.14 - debug: 4.4.3 - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - vite-plugin-css-injected-by-js@3.5.2(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)): - dependencies: - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) - - vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)): - dependencies: - debug: 4.4.3 - globrex: 0.1.2 - tsconfck: 3.1.6(typescript@5.9.3) - optionalDependencies: - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) - transitivePeerDependencies: - - supports-color - - typescript + vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) vite@5.4.21(@types/node@20.19.27)(lightningcss@1.32.0)(sass@1.97.1): dependencies: @@ -29222,7 +31642,7 @@ snapshots: lightningcss: 1.32.0 sass: 1.97.1 - vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2): + vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -29237,9 +31657,9 @@ snapshots: lightningcss: 1.32.0 sass: 1.97.1 tsx: 4.21.0 - yaml: 2.8.2 + yaml: 2.9.0 - vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2): + vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0): dependencies: esbuild: 0.27.2 fdir: 6.5.0(picomatch@4.0.3) @@ -29254,7 +31674,40 @@ snapshots: lightningcss: 1.32.0 sass: 1.97.1 tsx: 4.21.0 - yaml: 2.8.2 + yaml: 2.9.0 + + vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0): + dependencies: + lightningcss: 1.32.0 + picomatch: 4.0.5 + postcss: 8.5.19 + rolldown: 1.1.5 + tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 24.10.4 + esbuild: 0.25.12 + fsevents: 2.3.3 + jiti: 2.6.1 + sass: 1.97.1 + tsx: 4.21.0 + yaml: 2.9.0 + optional: true + + vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0): + dependencies: + lightningcss: 1.32.0 + picomatch: 4.0.5 + postcss: 8.5.19 + rolldown: 1.1.5 + tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 24.10.4 + esbuild: 0.28.1 + fsevents: 2.3.3 + jiti: 2.6.1 + sass: 1.97.1 + tsx: 4.21.0 + yaml: 2.9.0 vitefu@1.1.1(vite@5.4.21(@types/node@20.19.27)(lightningcss@1.32.0)(sass@1.97.1)): optionalDependencies: @@ -29268,24 +31721,37 @@ snapshots: optionalDependencies: vite: 5.4.21(@types/node@24.10.4)(lightningcss@1.32.0)(sass@1.97.1) - vitefu@1.1.1(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)): + vitefu@1.1.1(vite@6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)): optionalDependencies: - vite: 6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) - vitefu@1.1.1(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)): + vitefu@1.1.1(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)): optionalDependencies: - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) + + vitefu@1.1.1(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)): + optionalDependencies: + vite: 8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) + optional: true + + vitefu@1.1.1(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)): + optionalDependencies: + vite: 8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) vitefu@1.1.3(vite@5.4.21(@types/node@20.19.27)(lightningcss@1.32.0)(sass@1.97.1)): optionalDependencies: vite: 5.4.21(@types/node@20.19.27)(lightningcss@1.32.0)(sass@1.97.1) optional: true - vitefu@1.1.3(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)): + vitefu@1.1.3(vite@8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)): optionalDependencies: - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 8.1.4(@types/node@24.10.4)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) optional: true + vitefu@1.1.3(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)): + optionalDependencies: + vite: 8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) + vitest@1.6.1(@types/node@20.19.27)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.32.0)(sass@1.97.1): dependencies: '@vitest/expect': 1.6.1 @@ -29465,10 +31931,116 @@ snapshots: - supports-color - terser + volar-service-css@0.0.71(@volar/language-service@2.4.28): + dependencies: + vscode-css-languageservice: 6.3.10 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + + volar-service-emmet@0.0.71(@volar/language-service@2.4.28): + dependencies: + '@emmetio/css-parser': 0.4.1 + '@emmetio/html-matcher': 1.3.0 + '@vscode/emmet-helper': 2.11.0 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + + volar-service-html@0.0.71(@volar/language-service@2.4.28): + dependencies: + vscode-html-languageservice: 5.6.2 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + + volar-service-prettier@0.0.71(@volar/language-service@2.4.28)(prettier@3.8.2): + dependencies: + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + prettier: 3.8.2 + + volar-service-typescript-twoslash-queries@0.0.71(@volar/language-service@2.4.28): + dependencies: + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + + volar-service-typescript@0.0.71(@volar/language-service@2.4.28): + dependencies: + path-browserify: 1.0.1 + semver: 7.7.4 + typescript-auto-import-cache: 0.3.6 + vscode-languageserver-textdocument: 1.0.12 + vscode-nls: 5.2.0 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + + volar-service-yaml@0.0.71(@volar/language-service@2.4.28): + dependencies: + vscode-uri: 3.1.0 + yaml-language-server: 1.23.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + + vscode-css-languageservice@6.3.10: + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.1.0 + + vscode-html-languageservice@5.6.2: + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.18.0 + vscode-uri: 3.1.0 + + vscode-json-languageservice@4.1.8: + dependencies: + jsonc-parser: 3.3.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.18.0 + vscode-nls: 5.2.0 + vscode-uri: 3.1.0 + + vscode-jsonrpc@8.2.0: {} + + vscode-jsonrpc@9.0.1: {} + + vscode-languageserver-protocol@3.17.5: + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + + vscode-languageserver-protocol@3.18.2: + dependencies: + vscode-jsonrpc: 9.0.1 + vscode-languageserver-types: 3.18.0 + + vscode-languageserver-textdocument@1.0.12: {} + + vscode-languageserver-types@3.17.5: {} + + vscode-languageserver-types@3.18.0: {} + + vscode-languageserver@9.0.1: + dependencies: + vscode-languageserver-protocol: 3.17.5 + + vscode-nls@5.2.0: {} + vscode-oniguruma@1.7.0: {} vscode-textmate@8.0.0: {} + vscode-uri@3.1.0: {} + vue@3.5.26(typescript@5.9.3): dependencies: '@vue/compiler-dom': 3.5.26 @@ -29480,6 +32052,17 @@ snapshots: typescript: 5.9.3 optional: true + vue@3.5.26(typescript@6.0.3): + dependencies: + '@vue/compiler-dom': 3.5.26 + '@vue/compiler-sfc': 3.5.26 + '@vue/runtime-dom': 3.5.26 + '@vue/server-renderer': 3.5.26(vue@3.5.26(typescript@6.0.3)) + '@vue/shared': 3.5.26 + optionalDependencies: + typescript: 6.0.3 + optional: true + w3c-keyname@2.2.8: {} w3c-xmlserializer@5.0.0: @@ -29500,6 +32083,8 @@ snapshots: dependencies: makeerror: 1.0.12 + web-namespaces@2.0.1: {} + web-vitals@4.2.4: {} webidl-conversions@3.0.1: {} @@ -29588,14 +32173,6 @@ snapshots: '@cloudflare/workerd-linux-arm64': 1.20250617.0 '@cloudflare/workerd-windows-64': 1.20250617.0 - workerd@1.20251125.0: - optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20251125.0 - '@cloudflare/workerd-darwin-arm64': 1.20251125.0 - '@cloudflare/workerd-linux-64': 1.20251125.0 - '@cloudflare/workerd-linux-arm64': 1.20251125.0 - '@cloudflare/workerd-windows-64': 1.20251125.0 - workerd@1.20260426.1: optionalDependencies: '@cloudflare/workerd-darwin-64': 1.20260426.1 @@ -29672,6 +32249,15 @@ snapshots: bufferutil: 4.1.0 utf-8-validate: 6.0.6 + xdg-app-paths@5.5.1: + dependencies: + os-paths: 4.4.0 + xdg-portable: 7.3.0 + + xdg-portable@7.3.0: + dependencies: + os-paths: 4.4.0 + xml-crypto@6.1.2: dependencies: '@xmldom/is-dom-node': 1.0.1 @@ -29702,6 +32288,8 @@ snapshots: xtend@4.0.2: {} + xxhash-wasm@1.1.0: {} + y18n@4.0.3: {} y18n@5.0.8: {} @@ -29710,10 +32298,31 @@ snapshots: yallist@4.0.0: {} + yallist@5.0.0: {} + + yaml-language-server@1.23.0: + dependencies: + '@vscode/l10n': 0.0.18 + ajv: 8.18.0 + ajv-draft-04: 1.0.0(ajv@8.18.0) + ajv-i18n: 4.2.0(ajv@8.18.0) + prettier: 3.8.2 + request-light: 0.5.8 + vscode-json-languageservice: 4.1.8 + vscode-languageserver: 9.0.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.18.0 + vscode-uri: 3.1.0 + yaml: 2.8.3 + yaml@1.10.2: {} yaml@2.8.2: {} + yaml@2.8.3: {} + + yaml@2.9.0: {} + yargs-parser@18.1.3: dependencies: camelcase: 5.3.1 @@ -29723,6 +32332,8 @@ snapshots: yargs-parser@21.1.1: {} + yargs-parser@22.0.0: {} + yargs@15.4.1: dependencies: cliui: 6.0.0 @@ -29798,12 +32409,18 @@ snapshots: dependencies: zod: 4.2.1 + zod-to-json-schema@3.25.1(zod@3.25.76): + dependencies: + zod: 3.25.76 + zod-to-json-schema@3.25.1(zod@4.2.1): dependencies: zod: 4.2.1 zod@3.22.3: {} + zod@3.25.76: {} + zod@4.2.1: {} zustand@4.5.7(@types/react@19.2.7)(react@19.2.3): diff --git a/skills/write-docs/SKILL.md b/skills/write-docs/SKILL.md index 1fdf7330..347d6a89 100644 --- a/skills/write-docs/SKILL.md +++ b/skills/write-docs/SKILL.md @@ -3,7 +3,7 @@ name: write-docs description: Write accurate, product-grounded documentation pages for ClassroomIO. Use when adding content to stub pages, expanding thin docs, or creating new guide pages under apps/docs/content/docs/. --- -You are writing documentation for ClassroomIO — an LMS platform that lets organizations create and run training academies. Documentation lives in `apps/docs/content/docs/` and is rendered by Fumadocs. +You are writing documentation for ClassroomIO — an LMS platform that lets organizations create and run training academies. Documentation lives in `apps/docs/content/docs/` and is rendered by Blume. ## Research before writing @@ -47,15 +47,41 @@ These are the exact sidebar paths in the admin dashboard: ## MDX format conventions -All pages use Fumadocs components. Available imports: +Pages are rendered by Blume. Its components are global — **do not import anything**. + +**Callouts** are directives, not components. Types: `note`, `info`, `tip`, `success`, `warning`, `danger`. ```mdx -import { Callout } from 'fumadocs-ui/components/callout'; -import { Step, Steps } from 'fumadocs-ui/components/steps'; -import { Tab, Tabs } from 'fumadocs-ui/components/tabs'; +:::warning[Paid plan required] +Certificate features require a paid plan. +::: ``` -**Callout types**: `info`, `warn`, `error` +**Steps** for sequential procedures. Keep an `###` heading inside each `` — it is what +generates the linkable anchor: + +```mdx + + +### Enable downloadable certificates + +Turn on **Allow students download certificate**. + + +``` + +Also available without imports: ``/``, ``, ``, ``, +``, ``. Code fences take a title: ` ```zsh title="Terminal" `. Mermaid fences render +as diagrams. + +**Links and images follow different rules** — this trips people up: + +- **Links**: root-relative, no `/docs` prefix — `[Enrollment](/course-enrollment)`. Blume adds the + base at build time. +- **Images**: must include the `/docs` prefix — `![Alt](/docs/certificates-rules.webp)`. Blume does + not rebase images, so an unprefixed path 404s. Files live in `apps/docs/public/`. + +Run `pnpm --filter @cio/docs validate` to check links and anchors. **Frontmatter** (required on every page): ```mdx @@ -65,6 +91,9 @@ description: One sentence — shown in search results and link previews. --- ``` +New pages must also be added to the sidebar in `apps/docs/blume.config.ts` (`navigation.sidebar`) — +a page that isn't listed there will not appear in the nav. + ## Writing style - Address the reader as "you" (the admin/instructor).