From 488f2d2c6b16411b397edbcbb3c9c6f2d73aae07 Mon Sep 17 00:00:00 2001 From: Travis Gerke Date: Thu, 23 Jul 2026 09:48:01 -0700 Subject: [PATCH 1/2] Migrate the docs site from Quarto to Astro Starlight The site was using Quarto as a plain static site generator: 23 pages of pure markdown, no executable chunks, stock cosmo theme. This replaces it with an Astro Starlight project in the same site/ directory (now a pnpm workspace member), with a product-style landing page and a zinc design system matching the app chrome, in light and dark. - Content converted qmd -> md/mdx with slugs preserved; callouts become Starlight asides, screenshots move to src/assets for optimization, custom heading anchors kept via remark-heading-id - starlight-links-validator fails the build on broken internal links; Pagefind search and a sitemap come with Starlight - Old .html URLs redirect via meta-refresh stubs in public/ - docs.yml builds with pnpm instead of Quarto; workflow_dispatch from a branch builds without deploying - scripts/screenshots.mjs default --out follows the images move --- .github/workflows/docs.yml | 19 +- .gitignore | 6 +- CLAUDE.md | 2 +- CONTRIBUTING.md | 4 +- biome.json | 5 +- pnpm-lock.yaml | 4264 ++++++++++++++++- pnpm-workspace.yaml | 1 + scripts/screenshots.mjs | 6 +- site/_quarto.yml | 78 - site/astro.config.mjs | 72 + site/index.qmd | 72 - site/package.json | 17 + site/public/compliance.html | 6 + site/public/data-lifecycle.html | 6 + site/public/deployment.html | 6 + site/public/favicon.svg | 1 + site/public/glossary.html | 6 + site/public/guide/amendments.html | 6 + site/public/guide/analytics.html | 6 + site/public/guide/blinding.html | 6 + site/public/guide/data-capture.html | 6 + site/public/guide/exports-and-archive.html | 6 + site/public/guide/lab-import.html | 6 + site/public/guide/medical-coding.html | 6 + site/public/guide/notifications.html | 6 + site/public/guide/protocol-import.html | 6 + site/public/guide/review.html | 6 + site/public/guide/rtsm-integration.html | 6 + site/public/guide/rules-and-derivations.html | 6 + site/public/guide/site-forms.html | 6 + site/public/guide/study-builds.html | 6 + site/public/guide/user-admin.html | 6 + site/public/guide/why-protocol-first.html | 6 + site/public/installation.html | 6 + site/public/start-here.html | 6 + site/public/tour.html | 6 + .../assets/screenshots}/access-log.png | Bin .../assets/screenshots}/amendments-diff.png | Bin .../assets/screenshots}/amendments-impact.png | Bin .../assets/screenshots}/anomalies.png | Bin .../assets/screenshots}/approval-queue.png | Bin .../assets/screenshots}/audit-trail.png | Bin .../assets/screenshots}/blinded-entry.png | Bin .../assets/screenshots}/blinded-field.png | Bin .../assets/screenshots}/break-blind.png | Bin .../assets/screenshots}/coding.png | Bin .../assets/screenshots}/dynamic-fields.png | Bin .../assets/screenshots}/form-entry.png | Bin .../assets/screenshots}/lab-import.png | Bin .../assets/screenshots}/login.png | Bin .../screenshots}/notifications-bell.png | Bin .../assets/screenshots}/protocol-review.png | Bin .../assets/screenshots}/queries.png | Bin .../assets/screenshots}/repeating-entry.png | Bin .../assets/screenshots}/rtsm-panel.png | Bin .../assets/screenshots}/rules-panel.png | Bin .../screenshots}/rules-syntax-error.png | Bin .../assets/screenshots}/sign-form.png | Bin .../assets/screenshots}/site-forms-editor.png | Bin .../assets/screenshots}/snapshot-exports.png | Bin .../assets/screenshots}/studies.png | Bin .../screenshots}/study-builder-edit.png | Bin .../assets/screenshots}/study-builder.png | Bin .../assets/screenshots}/study-overview.png | Bin .../assets/screenshots}/subject-lifecycle.png | Bin .../assets/screenshots}/subject-matrix.png | Bin .../assets/screenshots}/team.png | Bin .../assets/screenshots}/users-admin.png | Bin .../assets/screenshots}/workbench-python.png | Bin .../assets/screenshots}/workbench-r.png | Bin .../assets/screenshots}/workbench-sql.png | Bin site/src/components/Footer.astro | 18 + site/src/content.config.ts | 7 + .../content/docs/compliance.md} | 6 +- .../content/docs/data-lifecycle.md} | 40 +- .../content/docs/deployment.md} | 17 +- .../content/docs/glossary.md} | 73 +- .../content/docs/guide/amendments.md} | 21 +- .../content/docs/guide/analytics.md} | 14 +- .../content/docs/guide/blinding.md} | 19 +- .../content/docs/guide/data-capture.md} | 27 +- .../docs/guide/exports-and-archive.md} | 17 +- .../content/docs/guide/lab-import.md} | 5 +- .../content/docs/guide/medical-coding.md} | 3 +- .../content/docs/guide/notifications.md} | 18 +- .../content/docs/guide/protocol-import.md} | 7 +- .../content/docs/guide/review.md} | 13 +- .../content/docs/guide/rtsm-integration.md} | 7 +- .../docs/guide/rules-and-derivations.md} | 22 +- .../content/docs/guide/site-forms.md} | 9 +- .../content/docs/guide/study-builds.md} | 15 +- .../content/docs/guide/user-admin.md} | 11 +- .../content/docs/guide/why-protocol-first.md} | 3 +- site/src/content/docs/index.mdx | 184 + .../content/docs/installation.md} | 19 +- .../content/docs/start-here.md} | 68 +- site/{tour.qmd => src/content/docs/tour.md} | 43 +- site/src/styles/custom.css | 211 + site/theme.scss | 33 - site/tsconfig.json | 5 + 100 files changed, 4997 insertions(+), 623 deletions(-) delete mode 100644 site/_quarto.yml create mode 100644 site/astro.config.mjs delete mode 100644 site/index.qmd create mode 100644 site/package.json create mode 100644 site/public/compliance.html create mode 100644 site/public/data-lifecycle.html create mode 100644 site/public/deployment.html create mode 100644 site/public/favicon.svg create mode 100644 site/public/glossary.html create mode 100644 site/public/guide/amendments.html create mode 100644 site/public/guide/analytics.html create mode 100644 site/public/guide/blinding.html create mode 100644 site/public/guide/data-capture.html create mode 100644 site/public/guide/exports-and-archive.html create mode 100644 site/public/guide/lab-import.html create mode 100644 site/public/guide/medical-coding.html create mode 100644 site/public/guide/notifications.html create mode 100644 site/public/guide/protocol-import.html create mode 100644 site/public/guide/review.html create mode 100644 site/public/guide/rtsm-integration.html create mode 100644 site/public/guide/rules-and-derivations.html create mode 100644 site/public/guide/site-forms.html create mode 100644 site/public/guide/study-builds.html create mode 100644 site/public/guide/user-admin.html create mode 100644 site/public/guide/why-protocol-first.html create mode 100644 site/public/installation.html create mode 100644 site/public/start-here.html create mode 100644 site/public/tour.html rename site/{images => src/assets/screenshots}/access-log.png (100%) rename site/{images => src/assets/screenshots}/amendments-diff.png (100%) rename site/{images => src/assets/screenshots}/amendments-impact.png (100%) rename site/{images => src/assets/screenshots}/anomalies.png (100%) rename site/{images => src/assets/screenshots}/approval-queue.png (100%) rename site/{images => src/assets/screenshots}/audit-trail.png (100%) rename site/{images => src/assets/screenshots}/blinded-entry.png (100%) rename site/{images => src/assets/screenshots}/blinded-field.png (100%) rename site/{images => src/assets/screenshots}/break-blind.png (100%) rename site/{images => src/assets/screenshots}/coding.png (100%) rename site/{images => src/assets/screenshots}/dynamic-fields.png (100%) rename site/{images => src/assets/screenshots}/form-entry.png (100%) rename site/{images => src/assets/screenshots}/lab-import.png (100%) rename site/{images => src/assets/screenshots}/login.png (100%) rename site/{images => src/assets/screenshots}/notifications-bell.png (100%) rename site/{images => src/assets/screenshots}/protocol-review.png (100%) rename site/{images => src/assets/screenshots}/queries.png (100%) rename site/{images => src/assets/screenshots}/repeating-entry.png (100%) rename site/{images => src/assets/screenshots}/rtsm-panel.png (100%) rename site/{images => src/assets/screenshots}/rules-panel.png (100%) rename site/{images => src/assets/screenshots}/rules-syntax-error.png (100%) rename site/{images => src/assets/screenshots}/sign-form.png (100%) rename site/{images => src/assets/screenshots}/site-forms-editor.png (100%) rename site/{images => src/assets/screenshots}/snapshot-exports.png (100%) rename site/{images => src/assets/screenshots}/studies.png (100%) rename site/{images => src/assets/screenshots}/study-builder-edit.png (100%) rename site/{images => src/assets/screenshots}/study-builder.png (100%) rename site/{images => src/assets/screenshots}/study-overview.png (100%) rename site/{images => src/assets/screenshots}/subject-lifecycle.png (100%) rename site/{images => src/assets/screenshots}/subject-matrix.png (100%) rename site/{images => src/assets/screenshots}/team.png (100%) rename site/{images => src/assets/screenshots}/users-admin.png (100%) rename site/{images => src/assets/screenshots}/workbench-python.png (100%) rename site/{images => src/assets/screenshots}/workbench-r.png (100%) rename site/{images => src/assets/screenshots}/workbench-sql.png (100%) create mode 100644 site/src/components/Footer.astro create mode 100644 site/src/content.config.ts rename site/{compliance.qmd => src/content/docs/compliance.md} (96%) rename site/{data-lifecycle.qmd => src/content/docs/data-lifecycle.md} (85%) rename site/{deployment.qmd => src/content/docs/deployment.md} (96%) rename site/{glossary.qmd => src/content/docs/glossary.md} (76%) rename site/{guide/amendments.qmd => src/content/docs/guide/amendments.md} (84%) rename site/{guide/analytics.qmd => src/content/docs/guide/analytics.md} (94%) rename site/{guide/blinding.qmd => src/content/docs/guide/blinding.md} (82%) rename site/{guide/data-capture.qmd => src/content/docs/guide/data-capture.md} (84%) rename site/{guide/exports-and-archive.qmd => src/content/docs/guide/exports-and-archive.md} (86%) rename site/{guide/lab-import.qmd => src/content/docs/guide/lab-import.md} (95%) rename site/{guide/medical-coding.qmd => src/content/docs/guide/medical-coding.md} (97%) rename site/{guide/notifications.qmd => src/content/docs/guide/notifications.md} (79%) rename site/{guide/protocol-import.qmd => src/content/docs/guide/protocol-import.md} (93%) rename site/{guide/review.qmd => src/content/docs/guide/review.md} (84%) rename site/{guide/rtsm-integration.qmd => src/content/docs/guide/rtsm-integration.md} (91%) rename site/{guide/rules-and-derivations.qmd => src/content/docs/guide/rules-and-derivations.md} (91%) rename site/{guide/site-forms.qmd => src/content/docs/guide/site-forms.md} (88%) rename site/{guide/study-builds.qmd => src/content/docs/guide/study-builds.md} (91%) rename site/{guide/user-admin.qmd => src/content/docs/guide/user-admin.md} (90%) rename site/{guide/why-protocol-first.qmd => src/content/docs/guide/why-protocol-first.md} (98%) create mode 100644 site/src/content/docs/index.mdx rename site/{installation.qmd => src/content/docs/installation.md} (94%) rename site/{start-here.qmd => src/content/docs/start-here.md} (55%) rename site/{tour.qmd => src/content/docs/tour.md} (80%) create mode 100644 site/src/styles/custom.css delete mode 100644 site/theme.scss create mode 100644 site/tsconfig.json diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index aedefa8..a69b11c 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -23,19 +23,28 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Set up Quarto - uses: quarto-dev/quarto-actions/setup@v2 + - uses: pnpm/action-setup@v4 + # version is taken from packageManager in package.json - - name: Render site - run: quarto render site + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: pnpm + + - run: pnpm install --frozen-lockfile + + - name: Build site + run: pnpm --filter site build - name: Upload Pages artifact uses: actions/upload-pages-artifact@v3 with: - path: site/_site + path: site/dist deploy: needs: build + # workflow_dispatch from a branch validates the build without publishing + if: github.ref == 'refs/heads/main' runs-on: ubuntu-latest environment: name: github-pages diff --git a/.gitignore b/.gitignore index 34628a9..4bdf5f7 100644 --- a/.gitignore +++ b/.gitignore @@ -16,9 +16,9 @@ coverage/ apps/api/data/ # Generated release artifact (pnpm validation-pack) validation-pack/ -# Quarto docs site build output -site/_site/ -site/.quarto/ +# Astro docs site build output and generated types +site/dist/ +site/.astro/ __pycache__/ # terraform (infra/terraform/*): state is local and contains secrets diff --git a/CLAUDE.md b/CLAUDE.md index 0c6c89b..7ec0634 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -5,7 +5,7 @@ - **Regulatory claims are verified against source text, never cited from model memory.** Any statement attributing a requirement or position to 21 CFR Part 11, ICH E6(R3), GAMP 5, CDISC standards, or similar — in - `docs/regulatory-traceability.md`, `site/compliance.qmd`, ADRs, the + `docs/regulatory-traceability.md`, `site/src/content/docs/compliance.md`, ADRs, the validation pack, or PR descriptions — must be checked against the authoritative full text before it lands. Maintainers keep a local mirror at `~/claude-clinical-skills/sources/` (integrity-checked via its diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 67846c9..8201211 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -46,7 +46,7 @@ tests skip locally (and fail on CI). ## Refreshing docs screenshots -The screenshots in `site/images/` are generated, not hand-captured. After a +The screenshots in `site/src/assets/screenshots/` are generated, not hand-captured. After a UI change that shows up in the docs, regenerate them: ```sh @@ -72,7 +72,7 @@ unpublished protocol import), then captures every page at 1440x900 with The state setup is idempotent, so the script can be re-run against a stack it already touched — useful with `--only name,name` to redo a subset (names are the PNG basenames) and `--out dir` to write somewhere other than -`site/images/`. But the pages show whatever is in the database, so canonical +`site/src/assets/screenshots/`. But the pages show whatever is in the database, so canonical screenshots want the fresh stack above; leftover dev data will appear in list pages. diff --git a/biome.json b/biome.json index 29c297d..bf7a837 100644 --- a/biome.json +++ b/biome.json @@ -7,8 +7,9 @@ "!**/node_modules", "!**/coverage", "!validation-pack", - "!site/_site", - "!site/.quarto" + "!.claude", + "!site/.astro", + "!**/*.astro" ] }, "formatter": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3bc0acd..3079db0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -97,7 +97,7 @@ importers: version: 5.9.3 vitest: specifier: ^3.0.0 - version: 3.2.6(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4) + version: 3.2.6(@types/debug@4.1.13)(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0) apps/web: dependencies: @@ -125,7 +125,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.0.0 - version: 4.3.2(vite@6.4.3(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)) + version: 4.3.2(vite@6.4.3(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0)) '@types/node': specifier: ^26.1.0 version: 26.1.0 @@ -137,7 +137,7 @@ importers: version: 19.2.3(@types/react@19.2.17) '@vitejs/plugin-react': specifier: ^4.3.0 - version: 4.7.0(vite@6.4.3(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)) + version: 4.7.0(vite@6.4.3(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0)) tailwindcss: specifier: ^4.0.0 version: 4.3.2 @@ -146,7 +146,7 @@ importers: version: 5.9.3 vite: specifier: ^6.0.0 - version: 6.4.3(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4) + version: 6.4.3(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0) packages/odm: dependencies: @@ -165,7 +165,7 @@ importers: version: 5.9.3 vitest: specifier: ^3.0.0 - version: 3.2.6(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4) + version: 3.2.6(@types/debug@4.1.13)(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0) packages/rules: dependencies: @@ -181,7 +181,7 @@ importers: version: 5.9.3 vitest: specifier: ^3.0.0 - version: 3.2.6(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4) + version: 3.2.6(@types/debug@4.1.13)(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0) packages/schemas: dependencies: @@ -194,7 +194,7 @@ importers: version: 5.9.3 vitest: specifier: ^3.0.0 - version: 3.2.6(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4) + version: 3.2.6(@types/debug@4.1.13)(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0) packages/usdm: dependencies: @@ -210,10 +210,132 @@ importers: version: 5.9.3 vitest: specifier: ^3.0.0 - version: 3.2.6(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4) + version: 3.2.6(@types/debug@4.1.13)(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0) + + site: + dependencies: + '@astrojs/starlight': + specifier: ^0.41.4 + version: 0.41.4(@astrojs/markdown-remark@7.2.1)(astro@7.1.3(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@26.1.0)(jiti@2.7.0)(rollup@4.62.2)(tsx@4.22.4)(yaml@2.9.0))(typescript@5.9.3) + astro: + specifier: ^7.1.3 + version: 7.1.3(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@26.1.0)(jiti@2.7.0)(rollup@4.62.2)(tsx@4.22.4)(yaml@2.9.0) + remark-heading-id: + specifier: ^1.0.1 + version: 1.0.1 + sharp: + specifier: ^0.35.3 + version: 0.35.3(@types/node@26.1.0) + starlight-links-validator: + specifier: ^0.25.2 + version: 0.25.2(@astrojs/starlight@0.41.4(@astrojs/markdown-remark@7.2.1)(astro@7.1.3(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@26.1.0)(jiti@2.7.0)(rollup@4.62.2)(tsx@4.22.4)(yaml@2.9.0))(typescript@5.9.3))(astro@7.1.3(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@26.1.0)(jiti@2.7.0)(rollup@4.62.2)(tsx@4.22.4)(yaml@2.9.0)) packages: + '@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] + libc: [glibc] + + '@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] + libc: [musl] + + '@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] + libc: [glibc] + + '@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] + libc: [musl] + + '@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/internal-helpers@0.10.1': + resolution: {integrity: sha512-5phcroT/vmOOrYuuAxtkbPixy5hePtlz9i8K4OeDv3dNK6/UQRuXPOSRTxIOBbUY5Sonw2UaxjbuVc43Mcir6Q==} + + '@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/prism@4.0.2': + resolution: {integrity: sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==} + engines: {node: '>=22.12.0'} + + '@astrojs/sitemap@3.7.3': + resolution: {integrity: sha512-f8euLVsyeAmAkSm/1M2Kb8sL8byQmfgbvBNaHFItCheTj/IpiJYSEWVcqDHZ/yEHxiS7+w87mQkzwZaPHmk5GA==} + + '@astrojs/starlight@0.41.4': + resolution: {integrity: sha512-cRCKZhM2BKYViCakBiN68aVwPn5qj/XtMMq//G54xOWdXXcvic1gMMEI+veNlIKOqqC4QmIjcjk4jiFtlZ3mMg==} + peerDependencies: + '@astrojs/markdown-remark': ^7.2.0 + astro: ^7.0.2 + peerDependenciesMeta: + '@astrojs/markdown-remark': + optional: true + + '@astrojs/telemetry@3.3.3': + resolution: {integrity: sha512-C1TLn5sPJr0x4vk56piHWKbnqlEB8BKyte5Y45V02U+D7BGO5eMqZDH5aPjnkXQWJggvmsTXxH03QMZ9NgWLzQ==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + '@babel/code-frame@7.29.7': resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} @@ -354,6 +476,71 @@ packages: cpu: [x64] os: [win32] + '@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] + libc: [glibc] + + '@bruits/satteri-linux-arm64-musl@0.9.5': + resolution: {integrity: sha512-v39HxiwGC5Rqm01HksP6+5Y+xKLPlsuVFgIgpEAo+SiQ22c+mJVhS3u7Z6ePAKdhL5NJoK1xq70kLz3L13AhpQ==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@bruits/satteri-linux-x64-gnu@0.9.5': + resolution: {integrity: sha512-F3uO8uFp3pAP5ZGXttwvh57GS7s0lL953tnNdyI2gRyP4kOOkp6pyGojNJzCjkDvWI2Cvb9iNrKok3aqQPauAw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@bruits/satteri-linux-x64-musl@0.9.5': + resolution: {integrity: sha512-bicEqglLlz++mWyADaZoP0JY20s4vDfLjaPYgQqC+NI4zZLTOOg1T4GB8aqtc822Pqji8SQBmSrTb7CrP8i08Q==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@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'} + + '@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'} + + '@ctrl/tinycolor@4.2.0': + resolution: {integrity: sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==} + engines: {node: '>=14'} + '@drizzle-team/brocli@0.10.2': resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} @@ -868,6 +1055,18 @@ packages: cpu: [x64] os: [win32] + '@expressive-code/core@0.44.1': + resolution: {integrity: sha512-3dDo9N8D7hYrLNNMMWFovg3+aDUtnQm7c7z0GZc1c0LEFVBc0Q6lKG+tVT28gDadOvsgOANfCn35fgpe97Pmgg==} + + '@expressive-code/plugin-frames@0.44.1': + resolution: {integrity: sha512-HC/bdRao9225ApcgO/e3jn8ZOhldKO7ob1O/Tcipvtv7Vb5nMphZhMtD9uuywpvxkPYBHJi3504WhrKg05Dwqg==} + + '@expressive-code/plugin-shiki@0.44.1': + resolution: {integrity: sha512-YApiZt3buUzBwL5tqj8G+sYC5NjMjRCHgQwr9bmGl69rtcHy6fE9dooWUeKYB978fJT2BuxT5FeHcF47rA3SEg==} + + '@expressive-code/plugin-text-markers@0.44.1': + resolution: {integrity: sha512-B3BsJoJ8CFMlcIX9f+X9tcI3C4zPDO601+YuLi9GheSTNro7ZfqSjLptMQKBHOWZvxnAtY5zvIX7iO/qtBhNBg==} + '@fastify/ajv-compiler@4.0.5': resolution: {integrity: sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A==} @@ -889,6 +1088,168 @@ packages: '@fastify/proxy-addr@5.1.0': resolution: {integrity: sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw==} + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.35.3': + resolution: {integrity: sha512-RMnFX7YQsMoh7lWfcM4NEHHymBX/rLuKNPVM84XE9ONPcaSCDgE7CHIHpSgPcO2xcRthgBy1HfNO319mwhIAkg==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.35.3': + resolution: {integrity: sha512-Xo+5uFBtLN0BKqieTxiFzFPQAUlBbbH5iBKyRX/z1JrbnYsHTfKJnUfL8+p2TPXr1pXqao4eeL4Rl144uDpK9w==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [darwin] + + '@img/sharp-freebsd-wasm32@0.35.3': + resolution: {integrity: sha512-lUxcqWIj2wMQ9BrwNjngcr1gWUr5xgaGThBRqPPalIC2n67Cqj1uPh8NnA/ZhAg8hUbKl+kVHKwgUIwe6ZYPrg==} + engines: {node: '>=20.9.0'} + os: [freebsd] + + '@img/sharp-libvips-darwin-arm64@1.3.2': + resolution: {integrity: sha512-9J6ypZFpQBj4YnePGoq/S38w6nz+vqg5WZLrLGY4YuSemdMq47GMLBPO42MzwdGwpg/agZ7xzZcFHa48xlywfg==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.3.2': + resolution: {integrity: sha512-m2pW1n6cns9VaubNwsZ+c3CRYjxNQWgJ5gPlnL1nbBcpkBvFm6SCFN5o0psFHI8w9n11NKhFkeEDns98tiqbEw==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.3.2': + resolution: {integrity: sha512-dqVSFynCox4C/J8kT16V7SIFAns0IjgLwkvYT7p8LQVmJ5OS5b6tI9IGflxTeuBS//zXeFIUbwt5dwxyZ17cnA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-arm@1.3.2': + resolution: {integrity: sha512-1eMLzy92I4J6rmi4mAT8yC3HxOtniyGELlzGbNMLLeqe052ahFQ0h6LFq+lh5DsDIdYViIDst08abvSbcEdLXQ==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-ppc64@1.3.2': + resolution: {integrity: sha512-3z0NHDxD6n5I9gc05U1eW1AyRm+Gznzq3naMrthPNqE6oYykcogW0l/jfpJdjYnuNl8R7yI9pNbE1XiUeyq0Aw==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-riscv64@1.3.2': + resolution: {integrity: sha512-bsb4rI+NldGOsXuej2r8OdSS8+zXDVaCWxyWrcv6kneTOlgAHtZABRzBBCwdsPiD90J4myNJuHpg6kA20ImW/w==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-s390x@1.3.2': + resolution: {integrity: sha512-/ABshyj8gCpyIrNXnHn4LorDJ0HHm1VhXPBlxZ8zAtfVPAaSafXPGn+sUSIRiwaSBy0mmFjSjiXI5mkcwdChKQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-x64@1.3.2': + resolution: {integrity: sha512-ITPEtgffGJ0S6G9dRyw/366tJQqFRcHWPHhC+Stpg3Z8AEMrDrTr2lhdz4f/Y/HMbRh//7Z5mBzEpVdi62Oc3w==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linuxmusl-arm64@1.3.2': + resolution: {integrity: sha512-zE9EdiUzUmg5mDT5a1rk5fYJ6GWPloTwWBYDS14naqHsL+EaMpDj1AWnpLgh3u0YCORv2Tt50wrcrpYqkP97Kw==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-libvips-linuxmusl-x64@1.3.2': + resolution: {integrity: sha512-m0lrLiUt+lBYnCFr8qV/65yMR4E/c7/wf78I5eKTdkEakFAlZ9QlzEM3QIhhAwVeUhLAHLcCq7a7Vszq/oFNZQ==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-linux-arm64@0.35.3': + resolution: {integrity: sha512-QgKDspHPnrU+GQ55XPhGwyhC8acLVOOSyAvo1oVfFmrIXLkDNmGWzAfDZ4xK8oSA1qBQrALcHX0G5UZni/SuFQ==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-arm@0.35.3': + resolution: {integrity: sha512-affVWCTLooy8TSxbDx2qkzuDeaWLNVBA+P//FNBirHsXpP2fuBhk5AuboYUnrDnzoXes8GFjpTx0SBFOCRg+FA==} + engines: {node: '>=20.9.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-ppc64@0.35.3': + resolution: {integrity: sha512-sMd8rDxmpLOwv/7N44klFjOD5DUO7FLdjiXDI0hoxYaf7Ar262dQIEkosE98bps+5HPLtp/EvNqeqQtOycP/IA==} + engines: {node: '>=20.9.0'} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-riscv64@0.35.3': + resolution: {integrity: sha512-0Eob78yjlYPfL5vMNWAW55l3R9Y6BQS/gOfe0ZcP9mEz9ohhKSt4im1hayiknXgf8AWrFqMvJcKIdmLmEe7yeQ==} + engines: {node: '>=20.9.0'} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-s390x@0.35.3': + resolution: {integrity: sha512-KgAxQ0DxpNOq1rG2t5cgTgShJFGSuU7XO45cqC+1NVOuZnP6tlgZRuSYOfNupGkHID0o3cJOsw4DVeJpMovcGw==} + engines: {node: '>=20.9.0'} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-x64@0.35.3': + resolution: {integrity: sha512-8pqvxubL2PGdhlPy6GLqzDYMUjyRmKAwKHYKixpdJYBUK7PJ0C029XdsnpFIdgRZG68fZiGdHVWcKPvtiPB4cA==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-linuxmusl-arm64@0.35.3': + resolution: {integrity: sha512-Vz0iQjzzcSX3HCbfwFfCSG/9SCIqyO0mH2sXyiHaAYfBk0cRsCWXRyQYX0ovCK/PAQBbTzQ0dsPQHh5MAFL59w==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-linuxmusl-x64@0.35.3': + resolution: {integrity: sha512-6O1NPKcDVj9QEdg7Hx549EX8U0rp6yXQERqru6yRN7fGBn32UvIRJUlWnk+8xDCiG76hXVBbX82NZ/ZKr0euIg==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-wasm32@0.35.3': + resolution: {integrity: sha512-cZ0XkcYGpHZkqW6iCkqTcmUC0CD9DhD5d/qeZlZkfRBn6GnHniZXLUo5+9xw8Iv76YE6LQFN9YNBlKREcCG76w==} + engines: {node: '>=20.9.0'} + + '@img/sharp-webcontainers-wasm32@0.35.3': + resolution: {integrity: sha512-2rnq7bX3NzeR2T4YWgz8qiG4h3TSdMe+vN1iQXpJleSJ3SM5zQ8Fy2SyyXAWlbxpEZ2Y+Z4u1BePgJEYbSy80Q==} + engines: {node: '>=20.9.0'} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.35.3': + resolution: {integrity: sha512-4bPwFdMbeC4JQ8L8LOyWp6nsHcboP5fxkp6iPOXz2Vg49R42TuMs2whkJ5OAP4/Ul035qOzy0AecOF9VOscn4w==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.35.3': + resolution: {integrity: sha512-r53mXsBN6lFUDiST764SvgwUdHAqM4rPAiDzAmf4fLoB6X/rkfyTrLCg6+g17wJJiCmB3JYgHuUldCWUIRFSXw==} + engines: {node: ^20.9.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.35.3': + resolution: {integrity: sha512-D4y1vNeZrIIJCN+uHaWVtH86B+aCrdMYYjicy9pXHvbGZeGYLLSd3wdVuC37FxVXlU1ARsk84eKWfWMXGYEqvA==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [win32] + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -905,9 +1266,18 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@mdx-js/mdx@3.1.1': + resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} + '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + '@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@1.3.0': resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} engines: {node: ^14.21.3 || >=16} @@ -1010,81 +1380,232 @@ packages: resolution: {integrity: sha512-t64wIsPEtNd4aUPuTAyeL2ubxATCBGmeluaKXEMAFk/8w6AJIVVkeLKMBpgLW6LU2t5cQxT+env/c6jxbtTQBg==} engines: {node: '>= 10'} - '@pinojs/redact@0.4.0': - resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} + '@oslojs/encoding@1.1.0': + resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} - '@rolldown/pluginutils@1.0.0-beta.27': - resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} + '@oxc-project/types@0.139.0': + resolution: {integrity: sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==} - '@rollup/rollup-android-arm-eabi@4.62.2': - resolution: {integrity: sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==} - cpu: [arm] - os: [android] + '@pagefind/darwin-arm64@1.5.2': + resolution: {integrity: sha512-MXpI+7HsAdPkvJ0gk9xj9g541BCqBZOBbdwj9g6lB5LCj6kSV6nqDSjzcAJwvOsfu0fjwvC8hQU+ecfhp+MpiQ==} + cpu: [arm64] + os: [darwin] - '@rollup/rollup-android-arm64@4.62.2': - resolution: {integrity: sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==} + '@pagefind/darwin-x64@1.5.2': + resolution: {integrity: sha512-IojxFWMEJe0RQ7PQ3KXQsPIImNsbpPYpoZ+QUDrL8fAl/O27IX+LVLs74/UzEZy5uA2LD8Nz1AiwKr72vrkZQw==} + cpu: [x64] + os: [darwin] + + '@pagefind/default-ui@1.5.2': + resolution: {integrity: sha512-pm1LMnQg8N2B3n2TnjKlhaFihpz6zTiA4HiGQ6/slKO/+8K9CAU5kcjdSSPgpuk1PMuuN4hxLipUIifnrkl3Sg==} + + '@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] + + '@pinojs/redact@0.4.0': + resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} + + '@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] - '@rollup/rollup-darwin-arm64@4.62.2': - resolution: {integrity: sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==} + '@rolldown/binding-darwin-arm64@1.1.5': + resolution: {integrity: sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.62.2': - resolution: {integrity: sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==} + '@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] - '@rollup/rollup-freebsd-arm64@4.62.2': - resolution: {integrity: sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.62.2': - resolution: {integrity: sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==} + '@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] - '@rollup/rollup-linux-arm-gnueabihf@4.62.2': - resolution: {integrity: sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==} - cpu: [arm] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-arm-musleabihf@4.62.2': - resolution: {integrity: sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==} + '@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] - libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.62.2': - resolution: {integrity: sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==} + '@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] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.62.2': - resolution: {integrity: sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==} + '@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] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.62.2': - resolution: {integrity: sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==} - cpu: [loong64] + '@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] libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.62.2': - resolution: {integrity: sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==} - cpu: [loong64] + '@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] - libc: [musl] + libc: [glibc] - '@rollup/rollup-linux-ppc64-gnu@4.62.2': - resolution: {integrity: sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==} - cpu: [ppc64] + '@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] + libc: [glibc] + + '@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] + libc: [musl] + + '@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.27': + resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + + '@rollup/pluginutils@5.4.0': + resolution: {integrity: sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.62.2': + resolution: {integrity: sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.62.2': + resolution: {integrity: sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.62.2': + resolution: {integrity: sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.62.2': + resolution: {integrity: sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.62.2': + resolution: {integrity: sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.62.2': + resolution: {integrity: sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.62.2': + resolution: {integrity: sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.62.2': + resolution: {integrity: sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.62.2': + resolution: {integrity: sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.62.2': + resolution: {integrity: sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.62.2': + resolution: {integrity: sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.62.2': + resolution: {integrity: sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.62.2': + resolution: {integrity: sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==} + cpu: [ppc64] os: [linux] libc: [glibc] @@ -1154,6 +1675,37 @@ packages: cpu: [x64] os: [win32] + '@shikijs/core@4.3.1': + resolution: {integrity: sha512-ANMDxuaPsNMdDC1m4vfvhlDmJweMwkE5XitTwrq2rWHx5jM+dlm4MmHt2PP6t0uejfR77SuhrhJ0zEijIF/uhA==} + engines: {node: '>=20'} + + '@shikijs/engine-javascript@4.3.1': + resolution: {integrity: sha512-JBItcnPuYq7jVJdZo/vMj94r+szT7XEjHFX+mvFDGSEIbVAXAGyHAHzhbWzpGOwYidCZrErJLLgn2PVeiokHnQ==} + engines: {node: '>=20'} + + '@shikijs/engine-oniguruma@4.3.1': + resolution: {integrity: sha512-OXyNMzg0pews+msMj4cHeqT4xiYKKvbnn6VbdAXxfoFl3SSx4fJTc8FadECuc5/H9p3BzhNAoAUXKwAu9rWYhg==} + engines: {node: '>=20'} + + '@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@4.3.1': + resolution: {integrity: sha512-dgpoJ4WqNi2yTmizQHBJ5zcX6j2lE6icN/0yt4l1kkf16jrY/pwPLoTb1ETsWMz0OBLf9ZNvwmxft+cH+N9qSA==} + engines: {node: '>=20'} + + '@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==} + '@swc/helpers@0.5.23': resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==} @@ -1301,12 +1853,39 @@ packages: '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/hast@3.0.5': + resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==} + + '@types/js-yaml@4.0.9': + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdx@2.0.14': + resolution: {integrity: sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/nlcst@2.0.3': + resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} + + '@types/node@24.13.3': + resolution: {integrity: sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==} + '@types/node@26.1.0': resolution: {integrity: sha512-O0A1G3xPGy4w7AgQdAQYUlQ+BKk2Oovw8eRpofyp5KdBZULnbe+WqaOVNrm705SHphCiG4XHsACrSmPu1f+Kgw==} @@ -1316,6 +1895,9 @@ packages: '@types/pdfkit@0.17.6': resolution: {integrity: sha512-tIwzxk2uWKp0Cq9JIluQXJid77lYhF52EsIOwhsMF4iWLA6YneoBR1xVKYYdAysHuepUB0OX4tdwMiUDdGKmig==} + '@types/picomatch@4.0.3': + resolution: {integrity: sha512-iG0T6+nYJ9FAPmx9SsUlnwcq1ZVRuCXcVEvWnntoPlrOpwtSTKNDC9uVAxTsC3PUvJ+99n4RpAcNgBbHX3JSnQ==} + '@types/react-dom@19.2.3': resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: @@ -1324,9 +1906,21 @@ packages: '@types/react@19.2.17': resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==} + '@types/sax@1.2.7': + resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/yazl@3.3.1': resolution: {integrity: sha512-DIWfCKpsTp6hE5BDBHV3+fIL/bLUF9Bv13iDrWnMlmhQpH67buNvI291ZauQ1xcccxK3FqQ9honnXpq4R8NMuQ==} + '@ungap/structured-clone@1.3.3': + resolution: {integrity: sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==} + '@vitejs/plugin-react@4.7.0': resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} engines: {node: ^14.18.0 || >=16.0.0} @@ -1365,6 +1959,16 @@ packages: abstract-logging@2.0.1: resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} + engines: {node: '>=0.4.0'} + hasBin: true + ajv-formats@3.0.1: resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} peerDependencies: @@ -1376,13 +1980,57 @@ packages: ajv@8.20.0: resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + am-i-vibing@0.4.0: + resolution: {integrity: sha512-MxT4XZL7pzLHpuvhDKdMaQHMGGkJDLluKBLsbstn+8wv9sWcFT6h+0ve9qkml95amVTZtZV83gQe2hY+ojgHLg==} + hasBin: true + + ansi-escapes@7.3.0: + resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} + engines: {node: '>=18'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + anynum@1.0.1: resolution: {integrity: sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==} + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + array-iterate@2.0.1: + resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + astring@1.9.0: + resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} + hasBin: true + + astro-expressive-code@0.44.1: + resolution: {integrity: sha512-DT1LnCqbHasBKlvzJ3m6LR4VI94wwx3W9EV/YbP1te4rqjOHsvsezHYuqb5MeLWLftXms/1FA9QBbwCo43DnJQ==} + peerDependencies: + astro: ^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta || ^7.0.0 + + astro@7.1.3: + resolution: {integrity: sha512-4dhPyAAXthf3xLEYnG8SeL7yr/nTPPABfY7e9YF0yuO+vK9Xp+8Q5j4xzsmL3GueukQv4oNwGNTBepLOiDGeJA==} + 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 + atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} @@ -1390,6 +2038,13 @@ packages: avvio@9.2.0: resolution: {integrity: sha512-2t/sy01ArdHHE0vRH5Hsay+RtCZt3dLPji7W7/MMOCEgze5b7SNDC4j5H6FnVgPkI1MTNFGzHdHrVXDDl7QSSQ==} + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + base64-js@0.0.8: resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==} engines: {node: '>= 0.4'} @@ -1402,6 +2057,15 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + bcp-47-match@2.0.3: + resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} + + bcp-47@2.1.1: + resolution: {integrity: sha512-KLw+H/gd2p4zly1X7Yh/qziuyae5/w/QFnvTng9eZL5fvszL7Whl3MBoWF8yxL7ksUjBfOD+OxkytiqbBpG+Fw==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + brotli@1.3.3: resolution: {integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==} @@ -1427,21 +2091,65 @@ packages: caniuse-lite@1.0.30001800: resolution: {integrity: sha512-MMHtuAz9Ys840zAY5F4k6fV5GaivZ9sPk+nz0mY+GYVzRBnYkN0mpqkSR92oWRQ19yQWo4HvBV/FnC16AJX8MA==} + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai@5.3.3: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + check-error@2.1.3: resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} engines: {node: '>= 16'} + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + + ci-info@4.4.0: + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} + engines: {node: '>=8'} + clone@2.1.2: resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} engines: {node: '>=0.8'} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + + common-ancestor-path@2.0.0: + resolution: {integrity: sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==} + engines: {node: '>= 18'} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie-es@1.2.3: + resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==} + cookie-es@3.1.1: resolution: {integrity: sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==} @@ -1449,6 +2157,40 @@ packages: resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} engines: {node: '>=18'} + cookie@2.0.1: + resolution: {integrity: sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==} + engines: {node: '>=22'} + + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-selector-parser@3.3.0: + resolution: {integrity: sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==} + + 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} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + 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'} + csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} @@ -1461,21 +2203,57 @@ packages: supports-color: optional: true + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} + devalue@5.8.2: + resolution: {integrity: sha512-DObPPAfdtFbXjxLqK8s2Xk9ZuWz5+ZoFEhC7J76es4GU/rEiXwHTmbImoCdyoCOcBH1UF3+Cz6Z2sYD4hyl5TA==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dfa@1.2.0: resolution: {integrity: sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==} + diff@8.0.4: + resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} + engines: {node: '>=0.3.1'} + + direction@2.0.1: + resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} + hasBin: true + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + drizzle-kit@0.31.10: resolution: {integrity: sha512-7OZcmQUrdGI+DUNNsKBn1aW8qSoKuTH7d0mYgSP8bAzdFzKoovxEFnoGQp2dVs82EOJeYycqRtciopszwUf8bw==} hasBin: true @@ -1572,6 +2350,10 @@ packages: sqlite3: optional: true + dset@3.1.4: + resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} + engines: {node: '>=4'} + electron-to-chromium@1.5.384: resolution: {integrity: sha512-g6KAKY1vkYsADvSPWvdJsuYT0ixdcu6lUtD9P/wJKGBEDlZVXh2AX42j1mPqqaQPDluWjara9ziQ7xqAeXCt5A==} @@ -1579,9 +2361,30 @@ packages: resolution: {integrity: sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==} engines: {node: '>=10.13.0'} + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + 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==} + + esast-util-from-estree@2.0.0: + resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} + + esast-util-from-js@2.0.1: + resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} + esbuild@0.18.20: resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} engines: {node: '>=12'} @@ -1601,13 +2404,47 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + + estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + estree-util-scope@1.0.0: + resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} + + estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + expect-type@1.4.0: resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} engines: {node: '>=12.0.0'} + expressive-code@0.44.1: + resolution: {integrity: sha512-GakidxhapWDzpKLqEaFQ8wGk6gAqEtPQibu8+yPBfnDLgev5Vdsh1pasTxnrXL/mzIknyqeTwhMHTghdaiUrTg==} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + fast-decode-uri-component@1.0.1: resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} @@ -1620,9 +2457,18 @@ packages: fast-querystring@1.1.2: resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} + 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.3: resolution: {integrity: sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==} + fast-wrap-ansi@0.2.2: + resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} + fast-xml-builder@1.2.0: resolution: {integrity: sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==} @@ -1655,9 +2501,20 @@ packages: resolution: {integrity: sha512-Zf4Xve4RymLl7NgaavNebZ01joJ8MfVerOG43wy7SHLO+r+K0C6d/SE0BiR7AV5V1VOCFlOP7ecdo+I4qmiHrQ==} engines: {node: '>=20'} + flattie@1.1.1: + resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} + engines: {node: '>=8'} + + fontace@0.4.1: + resolution: {integrity: sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==} + fontkit@2.0.4: resolution: {integrity: sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==} + fontkitten@1.0.3: + resolution: {integrity: sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==} + engines: {node: '>=20'} + fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1675,54 +2532,190 @@ packages: get-tsconfig@4.14.0: resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} + get-tsconfig@5.0.0-beta.4: + resolution: {integrity: sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ==} + engines: {node: '>=20.20.0'} + + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - ipaddr.js@2.4.0: - resolution: {integrity: sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==} - engines: {node: '>= 10'} + h3@1.15.11: + resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} - is-unsafe@1.0.1: - resolution: {integrity: sha512-CLK2+VdgERgD96EYm5lUQssZYlRg2tkZnbsxZoacmSiRxiFJ4Nk4SzjCl+Ur+v3kXIY9dTIdb3IH22y1mZ56LA==} + has-flag@5.0.1: + resolution: {integrity: sha512-CsNUt5x9LUdx6hnk/E2SZLsDyvfqANZSUq4+D3D8RzDJ2M+HDTIkF60ibS1vHaK55vzgiZw1bEPFG9yH7l33wA==} + engines: {node: '>=12'} - isbot@5.1.44: - resolution: {integrity: sha512-PGEHtwMnKbZpeSEXW2Utx+/JWed7dp6DiH0WWg33vGSDA7RUvpUeJSVlLrVkQ1RCpvDOUc/eH9ql7VsdbBZ8pA==} - engines: {node: '>=18'} + hast-util-embedded@3.0.0: + resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} - jiti@2.7.0: - resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} - hasBin: true + hast-util-format@1.1.0: + resolution: {integrity: sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==} - jose@6.2.3: - resolution: {integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==} + hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} - js-md5@0.8.3: - resolution: {integrity: sha512-qR0HB5uP6wCuRMrWPTrkMaev7MJZwJuuw4fnwAzRgP4J4/F8RwtodOKpGp4XpqsLBFzzgqIO42efFAyz2Et6KQ==} + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + hast-util-has-property@3.0.0: + resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} - js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + hast-util-is-body-ok-link@3.0.1: + resolution: {integrity: sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==} - jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} - hasBin: true + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} - json-schema-ref-resolver@3.0.0: - resolution: {integrity: sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A==} + hast-util-minify-whitespace@1.0.1: + resolution: {integrity: sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==} - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true + hast-util-phrasing@3.0.1: + resolution: {integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==} - jsonata@2.2.1: - resolution: {integrity: sha512-xd1uwUrKeIcJbsWhaoS3qAX4Ea8m0Mw0G5nlnAQvPT7TbZ5qaPdzBVTQia9KfyuyQm+nenfyjvzUDTRYHsC2sw==} + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + + hast-util-select@6.0.4: + resolution: {integrity: sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==} + + hast-util-to-estree@3.1.3: + resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + 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==} + + html-escaper@3.0.3: + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + html-whitespace-sensitive-tag-names@3.0.1: + resolution: {integrity: sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==} + + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + + i18next@26.3.6: + resolution: {integrity: sha512-Bu5Z2nAXgfVyM8xvW3jk9EKRIuX37PudsrBViThNFx7CR7aaYTpP01cxNB/E4c4UUzTDiAZRstEhsRfPOL/8xA==} + peerDependencies: + typescript: ^5 || ^6 || ^7 + peerDependenciesMeta: + typescript: + optional: true + + inline-style-parser@0.2.7: + resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + + ipaddr.js@2.4.0: + resolution: {integrity: sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==} + engines: {node: '>= 10'} + + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + + is-absolute-url@5.0.0: + resolution: {integrity: sha512-sdJyNpBnQHuVnBunfzjAecOhZr2+A30ywfFvu3EnxtKLUWfwGgyWUmqHbGZiU6vTfHpCPm5GvLe4BAvlU9n8VQ==} + engines: {node: '>=20'} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-docker@4.0.0: + resolution: {integrity: sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==} + engines: {node: '>=20'} + hasBin: true + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-unsafe@1.0.1: + resolution: {integrity: sha512-CLK2+VdgERgD96EYm5lUQssZYlRg2tkZnbsxZoacmSiRxiFJ4Nk4SzjCl+Ur+v3kXIY9dTIdb3IH22y1mZ56LA==} + + isbot@5.1.44: + resolution: {integrity: sha512-PGEHtwMnKbZpeSEXW2Utx+/JWed7dp6DiH0WWg33vGSDA7RUvpUeJSVlLrVkQ1RCpvDOUc/eH9ql7VsdbBZ8pA==} + engines: {node: '>=18'} + + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + + jose@6.2.3: + resolution: {integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==} + + js-md5@0.8.3: + resolution: {integrity: sha512-qR0HB5uP6wCuRMrWPTrkMaev7MJZwJuuw4fnwAzRgP4J4/F8RwtodOKpGp4XpqsLBFzzgqIO42efFAyz2Et6KQ==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + js-yaml@4.3.0: + resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-schema-ref-resolver@3.0.0: + resolution: {integrity: sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonata@2.2.1: + resolution: {integrity: sha512-xd1uwUrKeIcJbsWhaoS3qAX4Ea8m0Mw0G5nlnAQvPT7TbZ5qaPdzBVTQia9KfyuyQm+nenfyjvzUDTRYHsC2sw==} + engines: {node: '>= 8'} + + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + + klona@2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} engines: {node: '>= 8'} light-my-request@6.6.0: @@ -1805,15 +2798,207 @@ packages: linebreak@1.1.0: resolution: {integrity: sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==} + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + loupe@3.2.1: resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + lru-cache@11.5.2: + resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + magicast@0.5.3: + resolution: {integrity: sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==} + + markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + mdast-util-definitions@6.0.0: + resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} + + mdast-util-directive@3.1.0: + resolution: {integrity: sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==} + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.3: + resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-directive@4.0.0: + resolution: {integrity: sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-extension-mdx-expression@3.0.1: + resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==} + + micromark-extension-mdx-jsx@3.0.2: + resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==} + + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-mdx-expression@2.0.3: + resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-events-to-acorn@2.0.3: + resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1822,6 +3007,19 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + neotraverse@1.0.1: + resolution: {integrity: sha512-WmmLty1YWwJl9yZi77v2dVIV6X2kuYV8YYBI/G3LWGKdGHmHUvL1z7FW0iDvEvGAwNEoc5x1tOOOyDnf5jJw/w==} + engines: {node: '>= 10'} + + nlcst-to-string@4.0.0: + resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} + + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + + node-mock-http@1.0.4: + resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} + node-releases@2.0.50: resolution: {integrity: sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==} engines: {node: '>=18'} @@ -1830,22 +3028,73 @@ packages: resolution: {integrity: sha512-n+YP+NKwR5zRWa60k3GiQ6Q3B4KXCoAw40dAKeCtYn020iNN74aWK2liXIC3ZEATeGql7we3tE3t8QwhY0eskw==} engines: {node: '>=6.0.0'} + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + oauth4webapi@3.8.6: resolution: {integrity: sha512-iwemM91xz8nryHti2yTmg5fhyEMVOkOXwHNqbvcATjyajb5oQxCQzrNOA6uElRHuMhQQTKUyFKV9y/CNyg25BQ==} + obug@2.1.4: + resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} + 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-exit-leak-free@2.1.2: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} + oniguruma-parser@0.12.2: + resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} + + oniguruma-to-es@4.3.6: + resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} + openid-client@6.8.4: resolution: {integrity: sha512-QSw0BA08piujetEwfZsHoTrDpMEha7GDZDicQqVwX4u0ChCjefvjDB++TZ8BTg76UpwhzIQgdvvfgfl3HpCSAw==} + p-limit@7.3.1: + resolution: {integrity: sha512-0trZaiG7Y7kN/Egy9a8j47t9osC0Tch4PaIWd9yGF6bvmlk7muExRvGNYb8sXBwEKMoNKsbNN9P8EefuQekE4Q==} + engines: {node: '>=20'} + + p-queue@9.3.3: + resolution: {integrity: sha512-NXAOdnEe5FsZJfT4oK84lE1Y5cFFdWlRuOo5tww8DyNMxyRXwn39fIkUtNLKppcPC+UYU/bXujNCUGDv01y7CA==} + engines: {node: '>=20'} + + p-timeout@7.0.1: + resolution: {integrity: sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==} + engines: {node: '>=20'} + + package-manager-detector@1.8.0: + resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==} + + pagefind@1.5.2: + resolution: {integrity: sha512-XTUaK0hXMCu2jszWE584JGQT7y284TmMV9l/HX3rnG5uo3rHI/uHU56XTyyyPFjeWEBxECbAi0CaFDJOONtG0Q==} + hasBin: true + pako@0.2.9: resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + + parse-latin@7.0.0: + resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + path-expression-matcher@1.6.1: resolution: {integrity: sha512-h7bxdzhHk8Knyc4Tj+jMaa7fEEoUJy7p1qtbVgkYg1Uhpe5Np5VuGXCRZnkZvU+Q42M1vStt0ifa3ueykRJPmQ==} engines: {node: '>=14.0.0'} @@ -1860,13 +3109,24 @@ packages: pdfkit@0.19.1: resolution: {integrity: sha512-6Gzk+wDwTs4VSxsR5rCMTnIl5nlmkye1oWB0l2hDB1EX6ZNSIBroKQEv+2+fPPn+stVjyqzmsqRJVDfB9fo5DA==} + piccolore@0.1.3: + resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + picomatch@4.0.4: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + engines: {node: '>=12'} + pino-abstract-transport@3.0.0: resolution: {integrity: sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==} @@ -1890,23 +3150,51 @@ packages: png-js@1.1.0: resolution: {integrity: sha512-PM/uYGzGdNSzqeOgly68+6wKQDL1SY0a/N+OEa/+br6LnHWOAJB0Npiamnodfq3jd2LS/i2fMeOKSAILjA+m5Q==} + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.1.4: + resolution: {integrity: sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==} + engines: {node: '>=4'} + postcss@8.5.16: resolution: {integrity: sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.19: + resolution: {integrity: sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ==} + engines: {node: ^10 || ^12 || >=14} + postgres@3.4.9: resolution: {integrity: sha512-GD3qdB0x1z9xgFI6cdRD6xu2Sp2WCOEoe3mtnyB5Ee0XrrL5Pe+e4CCnJrRMnL1zYtRDZmQQVbvOttLnKDLnaw==} engines: {node: '>=12'} + prismjs@1.30.0: + 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-warning@4.0.1: resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==} process-warning@5.0.0: resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} + property-information@7.2.0: + resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} + quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + react-dom@19.2.7: resolution: {integrity: sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==} peerDependencies: @@ -1920,6 +3208,10 @@ packages: resolution: {integrity: sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==} engines: {node: '>=0.10.0'} + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} + real-require@0.2.0: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} @@ -1927,6 +3219,76 @@ packages: real-require@1.0.0: resolution: {integrity: sha512-P4nbQYQfePJxRSmY+v/KINxVucm4NF3p3s7pJveMTtom52FR4YGltUQLB8idDXwDDWW+eYrWDFbuzUnjoWHF7g==} + recma-build-jsx@1.0.0: + resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} + + recma-jsx@1.0.1: + resolution: {integrity: sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + recma-parse@1.0.0: + resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} + + recma-stringify@1.0.0: + resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + + rehype-expressive-code@0.44.1: + resolution: {integrity: sha512-+VZgs7Evw4LXRN3owpoBNSTpYuW6GeOdjqcUT1TuY8o/4MGPtbd0EU7Bgrju7X8KrQ6SslOBAuGWJ5fV5TriJQ==} + + rehype-format@5.0.1: + resolution: {integrity: sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==} + + rehype-parse@9.0.1: + resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-recma@1.0.0: + resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + + rehype-stringify@10.0.1: + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} + + rehype@13.0.2: + resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==} + + remark-directive@4.0.0: + resolution: {integrity: sha512-7sxn4RfF1o3izevPV1DheyGDD6X4c9hrGpfdUpm7uC++dqrnJxIZVkk7CoKqcLm0VUMAuOol7Mno3m6g8cfMuA==} + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-heading-id@1.0.1: + resolution: {integrity: sha512-GmJjuCeEkYvwFlvn/Skjc/1Qafj71412gbQnrwUmP/tKskmAf1cMRlZRNoovV+aIvsSRkTb2rCmGv2b9RdoJbQ==} + engines: {node: '>=8'} + + remark-mdx@3.1.1: + resolution: {integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + 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==} + require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} @@ -1941,6 +3303,18 @@ packages: resolution: {integrity: sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==} engines: {node: '>=10'} + 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'} @@ -1948,6 +3322,11 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + rolldown@1.1.5: + resolution: {integrity: sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rollup@4.62.2: resolution: {integrity: sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -1961,6 +3340,13 @@ packages: resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} engines: {node: '>=10'} + 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'} + scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} @@ -1989,9 +3375,34 @@ packages: set-cookie-parser@2.7.2: resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} + sharp@0.35.3: + resolution: {integrity: sha512-ej0zVHuZGHCiABXcNxeYhpRnPNPAcvbG8RMdBAhDAxLKkCRVSpK3Iyu7qbqw3JMzoj0REeM6f3tJLtVwl0023Q==} + engines: {node: '>=20.9.0'} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + shiki@4.3.1: + resolution: {integrity: sha512-oR+qDVi2OjX1tmDpyv+3KviX01KzO6Af+0NNnKnsp9491UEGz2YpxTuJboS/6VhYpTdqzmuJBuiTlrAWWJAssw==} + engines: {node: '>=20'} + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + sitemap@9.0.1: + resolution: {integrity: sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ==} + engines: {node: '>=20.19.5', npm: '>=10.8.2'} + hasBin: true + + smol-toml@1.7.0: + resolution: {integrity: sha512-aqVvWoyO21L23mb+drl4RmMXbf6N7FdHjAhTRA9ZBL7apWBgfWC16KjrASI+1p9GAroljyMHj6fK67i0UiTNvQ==} + engines: {node: '>= 18'} + sonic-boom@4.2.1: resolution: {integrity: sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==} @@ -2006,6 +3417,13 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -2013,15 +3431,47 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + starlight-links-validator@0.25.2: + resolution: {integrity: sha512-RQiHkM8FHKermsjMkSb+uS/q50Dv5P0O0ECWKxJyTv4stuO8QTorIEKnITDDLEf9/xyg7M69arxiK2ola3OMqA==} + engines: {node: '>=22.12.0'} + peerDependencies: + '@astrojs/starlight': '>=0.41.0' + astro: '>=7.0.2' + std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + stream-replace-string@2.0.0: + resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + strip-literal@3.1.0: resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} strnum@2.4.1: resolution: {integrity: sha512-M9eUSMT2dCB2cTNPG7UYj6KuK7RJR2SN2+yCV/fTW3xzTCS6EaGZ5pSMgDIjB7r8zSfTGk+dvvn9rTjpVS9Mwg==} + style-to-js@1.1.21: + resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} + + style-to-object@1.0.14: + resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} + + supports-color@10.2.2: + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} + engines: {node: '>=18'} + + supports-hyperlinks@4.5.0: + resolution: {integrity: sha512-ZW2OvfeCXrNTbLakPUzjQG922EeGCOteFSVoek5DKStTh898wf7zgtuFlzQN8HfZCxC3Eh02yJVrRW51hADf+w==} + engines: {node: '>=20'} + + svgo@4.0.2: + resolution: {integrity: sha512-ekx94z1rRc5LDi6oSUaeRnYhd0UOJxdtQCL2rF8xpWxD3TPAsISWOrxezqGovqS38GRZOdpDfvQe3ts6F7nsng==} + engines: {node: '>=16'} + hasBin: true + tailwindcss@4.3.2: resolution: {integrity: sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==} @@ -2029,6 +3479,10 @@ packages: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} + terminal-link@5.0.0: + resolution: {integrity: sha512-qFAy10MTMwjzjU8U16YS4YoZD+NQLHzLssFMNqgravjbvIPNiqkGFR4yjhJfmY9R5OFU7+yHxc6y+uGHkKwLRA==} + engines: {node: '>=20'} + thread-stream@4.2.0: resolution: {integrity: sha512-e2zZ96wSChazBsbENf/Pcm/4swHt2cEKQ92rhUjkL9GCKiTDJIaTBenjE/m9DXi0QBmTMDkFDdOomUy20A1tDQ==} engines: {node: '>=20'} @@ -2039,9 +3493,17 @@ 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.2.4: + resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} + engines: {node: '>=18'} + tinyglobby@0.2.17: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} @@ -2062,6 +3524,12 @@ packages: resolution: {integrity: sha512-5DXWzE4Vz7xNHsv+xQ+MGfJYyC78Aok3tEr0MNwHoRf7vZnga1mQXZ4/Nsodld4VR6Wd+VhfmqnNrsRJyYPfrQ==} engines: {node: '>=20'} + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -2075,6 +3543,18 @@ packages: engines: {node: '>=14.17'} hasBin: true + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + + ultrahtml@1.7.0: + resolution: {integrity: sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==} + + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + + undici-types@7.18.2: + resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + undici-types@8.3.0: resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} @@ -2084,17 +3564,140 @@ packages: unicode-trie@2.0.0: resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} + 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@3.0.0: + resolution: {integrity: sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==} + + 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==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + + 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@2.1.2: + resolution: {integrity: sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@1.4.1: + resolution: {integrity: sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==} + + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + + 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 peerDependencies: browserslist: '>= 4.21.0' + url-extras@0.1.0: + resolution: {integrity: sha512-8tzwTeXFPuX/5PHuCDQE5Dd9Ts4rwoq2t9aIT+HS4iAVpmj5l4Ao7Q+BuuFjvWRqrLswBhQDk8O96ZicgCqQqw==} + engines: {node: '>=20'} + use-sync-external-store@1.6.0: resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite-node@3.2.4: resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -2140,6 +3743,57 @@ packages: yaml: optional: true + vite@8.1.5: + resolution: {integrity: sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==} + 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.3: + resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + vite: + optional: true + vitest@3.2.6: resolution: {integrity: sha512-xejya+bT/j/+R/AGa1XOfRxLmNUlLtlwjRsFUILF+xHfzElmGcmFydy2gqqIrd62ptIEfwVMofd19uNWD9L7Nw==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -2168,6 +3822,9 @@ packages: jsdom: optional: true + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + why-is-node-running@2.3.0: resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} @@ -2177,17 +3834,208 @@ packages: resolution: {integrity: sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==} engines: {node: '>=16.0.0'} + xxhash-wasm@1.1.0: + resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yazl@3.3.1: resolution: {integrity: sha512-BbETDVWG+VcMUle37k5Fqp//7SDOK2/1+T7X8TD96M3D9G8jK5VLUdQVdVjGi8im7FGkazX7kk5hkU8X4L5Bng==} + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} + engines: {node: '>=12.20'} + zod@4.4.3: resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + snapshots: + '@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/internal-helpers@0.10.1': + dependencies: + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + js-yaml: 4.3.0 + picomatch: 4.0.5 + retext-smartypants: 6.2.0 + shiki: 4.3.1 + smol-toml: 1.7.0 + unified: 11.0.5 + + '@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.1.3(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@26.1.0)(jiti@2.7.0)(rollup@4.62.2)(tsx@4.22.4)(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.1.3(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@26.1.0)(jiti@2.7.0)(rollup@4.62.2)(tsx@4.22.4)(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/prism@4.0.2': + dependencies: + prismjs: 1.30.0 + + '@astrojs/sitemap@3.7.3': + dependencies: + sitemap: 9.0.1 + stream-replace-string: 2.0.0 + zod: 4.4.3 + + '@astrojs/starlight@0.41.4(@astrojs/markdown-remark@7.2.1)(astro@7.1.3(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@26.1.0)(jiti@2.7.0)(rollup@4.62.2)(tsx@4.22.4)(yaml@2.9.0))(typescript@5.9.3)': + dependencies: + '@astrojs/markdown-satteri': 0.3.4 + '@astrojs/mdx': 7.0.3(@astrojs/markdown-satteri@0.3.4)(astro@7.1.3(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@26.1.0)(jiti@2.7.0)(rollup@4.62.2)(tsx@4.22.4)(yaml@2.9.0)) + '@astrojs/sitemap': 3.7.3 + '@pagefind/default-ui': 1.5.2 + '@types/hast': 3.0.5 + '@types/js-yaml': 4.0.9 + '@types/mdast': 4.0.4 + astro: 7.1.3(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@26.1.0)(jiti@2.7.0)(rollup@4.62.2)(tsx@4.22.4)(yaml@2.9.0) + astro-expressive-code: 0.44.1(astro@7.1.3(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@26.1.0)(jiti@2.7.0)(rollup@4.62.2)(tsx@4.22.4)(yaml@2.9.0)) + bcp-47: 2.1.1 + hast-util-from-html: 2.0.3 + hast-util-select: 6.0.4 + hast-util-to-string: 3.0.1 + hastscript: 9.0.1 + i18next: 26.3.6(typescript@5.9.3) + js-yaml: 4.3.0 + klona: 2.0.6 + magic-string: 0.30.21 + mdast-util-directive: 3.1.0 + mdast-util-to-markdown: 2.1.2 + mdast-util-to-string: 4.0.0 + pagefind: 1.5.2 + rehype: 13.0.2 + rehype-format: 5.0.1 + remark-directive: 4.0.0 + satteri: 0.9.5 + ultrahtml: 1.7.0 + unified: 11.0.5 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + optionalDependencies: + '@astrojs/markdown-remark': 7.2.1 + transitivePeerDependencies: + - supports-color + - typescript + + '@astrojs/telemetry@3.3.3': + dependencies: + ci-info: 4.4.0 + dset: 3.1.4 + is-docker: 4.0.0 + package-manager-detector: 1.8.0 + '@babel/code-frame@7.29.7': dependencies: '@babel/helper-validator-identifier': 7.29.7 @@ -2335,6 +4183,55 @@ snapshots: '@biomejs/cli-win32-x64@2.5.2': optional: true + '@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 + + '@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 + + '@ctrl/tinycolor@4.2.0': {} + '@drizzle-team/brocli@0.10.2': {} '@duckdb/node-api@1.5.4-r.1': @@ -2626,6 +4523,31 @@ snapshots: '@esbuild/win32-x64@0.28.1': optional: true + '@expressive-code/core@0.44.1': + dependencies: + '@ctrl/tinycolor': 4.2.0 + hast-util-select: 6.0.4 + hast-util-to-html: 9.0.5 + hast-util-to-text: 4.0.2 + hastscript: 9.0.1 + postcss: 8.5.19 + postcss-nested: 6.2.0(postcss@8.5.19) + unist-util-visit: 5.1.0 + unist-util-visit-parents: 6.0.2 + + '@expressive-code/plugin-frames@0.44.1': + dependencies: + '@expressive-code/core': 0.44.1 + + '@expressive-code/plugin-shiki@0.44.1': + dependencies: + '@expressive-code/core': 0.44.1 + shiki: 4.3.1 + + '@expressive-code/plugin-text-markers@0.44.1': + dependencies: + '@expressive-code/core': 0.44.1 + '@fastify/ajv-compiler@4.0.5': dependencies: ajv: 8.20.0 @@ -2654,107 +4576,336 @@ snapshots: '@fastify/forwarded': 3.0.1 ipaddr.js: 2.4.0 - '@jridgewell/gen-mapping@0.3.13': - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/remapping@2.3.5': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/resolve-uri@3.1.2': {} + '@img/colour@1.1.0': {} - '@jridgewell/sourcemap-codec@1.5.5': {} + '@img/sharp-darwin-arm64@0.35.3': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.3.2 + optional: true - '@jridgewell/trace-mapping@0.3.31': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 + '@img/sharp-darwin-x64@0.35.3': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.3.2 + optional: true - '@napi-rs/wasm-runtime@0.2.12': + '@img/sharp-freebsd-wasm32@0.35.3': dependencies: - '@emnapi/core': 1.11.1 - '@emnapi/runtime': 1.11.1 - '@tybys/wasm-util': 0.10.3 + '@img/sharp-wasm32': 0.35.3 optional: true - '@noble/ciphers@1.3.0': {} + '@img/sharp-libvips-darwin-arm64@1.3.2': + optional: true - '@noble/hashes@1.8.0': {} + '@img/sharp-libvips-darwin-x64@1.3.2': + optional: true - '@nodable/entities@2.2.0': {} + '@img/sharp-libvips-linux-arm64@1.3.2': + optional: true - '@node-rs/argon2-android-arm-eabi@2.0.2': + '@img/sharp-libvips-linux-arm@1.3.2': optional: true - '@node-rs/argon2-android-arm64@2.0.2': + '@img/sharp-libvips-linux-ppc64@1.3.2': optional: true - '@node-rs/argon2-darwin-arm64@2.0.2': + '@img/sharp-libvips-linux-riscv64@1.3.2': optional: true - '@node-rs/argon2-darwin-x64@2.0.2': + '@img/sharp-libvips-linux-s390x@1.3.2': optional: true - '@node-rs/argon2-freebsd-x64@2.0.2': + '@img/sharp-libvips-linux-x64@1.3.2': optional: true - '@node-rs/argon2-linux-arm-gnueabihf@2.0.2': + '@img/sharp-libvips-linuxmusl-arm64@1.3.2': optional: true - '@node-rs/argon2-linux-arm64-gnu@2.0.2': + '@img/sharp-libvips-linuxmusl-x64@1.3.2': optional: true - '@node-rs/argon2-linux-arm64-musl@2.0.2': + '@img/sharp-linux-arm64@0.35.3': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.3.2 optional: true - '@node-rs/argon2-linux-x64-gnu@2.0.2': + '@img/sharp-linux-arm@0.35.3': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.3.2 optional: true - '@node-rs/argon2-linux-x64-musl@2.0.2': + '@img/sharp-linux-ppc64@0.35.3': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.3.2 optional: true - '@node-rs/argon2-wasm32-wasi@2.0.2': - dependencies: - '@napi-rs/wasm-runtime': 0.2.12 + '@img/sharp-linux-riscv64@0.35.3': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.3.2 optional: true - '@node-rs/argon2-win32-arm64-msvc@2.0.2': + '@img/sharp-linux-s390x@0.35.3': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.3.2 optional: true - '@node-rs/argon2-win32-ia32-msvc@2.0.2': + '@img/sharp-linux-x64@0.35.3': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.3.2 optional: true - '@node-rs/argon2-win32-x64-msvc@2.0.2': + '@img/sharp-linuxmusl-arm64@0.35.3': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.3.2 optional: true - '@node-rs/argon2@2.0.2': + '@img/sharp-linuxmusl-x64@0.35.3': optionalDependencies: - '@node-rs/argon2-android-arm-eabi': 2.0.2 - '@node-rs/argon2-android-arm64': 2.0.2 - '@node-rs/argon2-darwin-arm64': 2.0.2 - '@node-rs/argon2-darwin-x64': 2.0.2 - '@node-rs/argon2-freebsd-x64': 2.0.2 - '@node-rs/argon2-linux-arm-gnueabihf': 2.0.2 - '@node-rs/argon2-linux-arm64-gnu': 2.0.2 - '@node-rs/argon2-linux-arm64-musl': 2.0.2 - '@node-rs/argon2-linux-x64-gnu': 2.0.2 - '@node-rs/argon2-linux-x64-musl': 2.0.2 - '@node-rs/argon2-wasm32-wasi': 2.0.2 - '@node-rs/argon2-win32-arm64-msvc': 2.0.2 - '@node-rs/argon2-win32-ia32-msvc': 2.0.2 - '@node-rs/argon2-win32-x64-msvc': 2.0.2 + '@img/sharp-libvips-linuxmusl-x64': 1.3.2 + optional: true - '@pinojs/redact@0.4.0': {} + '@img/sharp-wasm32@0.35.3': + dependencies: + '@emnapi/runtime': 1.11.1 + optional: true - '@rolldown/pluginutils@1.0.0-beta.27': {} + '@img/sharp-webcontainers-wasm32@0.35.3': + dependencies: + '@img/sharp-wasm32': 0.35.3 + optional: true - '@rollup/rollup-android-arm-eabi@4.62.2': + '@img/sharp-win32-arm64@0.35.3': optional: true - '@rollup/rollup-android-arm64@4.62.2': + '@img/sharp-win32-ia32@0.35.3': + optional: true + + '@img/sharp-win32-x64@0.35.3': + optional: true + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@mdx-js/mdx@3.1.1': + dependencies: + '@types/estree': 1.0.9 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.5 + '@types/mdx': 2.0.14 + acorn: 8.17.0 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-util-scope: 1.0.0 + estree-walker: 3.0.3 + 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.17.0) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 + remark-mdx: 3.1.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + source-map: 0.7.6 + unified: 11.0.5 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@napi-rs/wasm-runtime@0.2.12': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@tybys/wasm-util': 0.10.3 + 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@1.3.0': {} + + '@noble/hashes@1.8.0': {} + + '@nodable/entities@2.2.0': {} + + '@node-rs/argon2-android-arm-eabi@2.0.2': + optional: true + + '@node-rs/argon2-android-arm64@2.0.2': + optional: true + + '@node-rs/argon2-darwin-arm64@2.0.2': + optional: true + + '@node-rs/argon2-darwin-x64@2.0.2': + optional: true + + '@node-rs/argon2-freebsd-x64@2.0.2': + optional: true + + '@node-rs/argon2-linux-arm-gnueabihf@2.0.2': + optional: true + + '@node-rs/argon2-linux-arm64-gnu@2.0.2': + optional: true + + '@node-rs/argon2-linux-arm64-musl@2.0.2': + optional: true + + '@node-rs/argon2-linux-x64-gnu@2.0.2': + optional: true + + '@node-rs/argon2-linux-x64-musl@2.0.2': + optional: true + + '@node-rs/argon2-wasm32-wasi@2.0.2': + dependencies: + '@napi-rs/wasm-runtime': 0.2.12 + optional: true + + '@node-rs/argon2-win32-arm64-msvc@2.0.2': + optional: true + + '@node-rs/argon2-win32-ia32-msvc@2.0.2': + optional: true + + '@node-rs/argon2-win32-x64-msvc@2.0.2': + optional: true + + '@node-rs/argon2@2.0.2': + optionalDependencies: + '@node-rs/argon2-android-arm-eabi': 2.0.2 + '@node-rs/argon2-android-arm64': 2.0.2 + '@node-rs/argon2-darwin-arm64': 2.0.2 + '@node-rs/argon2-darwin-x64': 2.0.2 + '@node-rs/argon2-freebsd-x64': 2.0.2 + '@node-rs/argon2-linux-arm-gnueabihf': 2.0.2 + '@node-rs/argon2-linux-arm64-gnu': 2.0.2 + '@node-rs/argon2-linux-arm64-musl': 2.0.2 + '@node-rs/argon2-linux-x64-gnu': 2.0.2 + '@node-rs/argon2-linux-x64-musl': 2.0.2 + '@node-rs/argon2-wasm32-wasi': 2.0.2 + '@node-rs/argon2-win32-arm64-msvc': 2.0.2 + '@node-rs/argon2-win32-ia32-msvc': 2.0.2 + '@node-rs/argon2-win32-x64-msvc': 2.0.2 + + '@oslojs/encoding@1.1.0': {} + + '@oxc-project/types@0.139.0': {} + + '@pagefind/darwin-arm64@1.5.2': + optional: true + + '@pagefind/darwin-x64@1.5.2': + optional: true + + '@pagefind/default-ui@1.5.2': {} + + '@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 + + '@pinojs/redact@0.4.0': {} + + '@rolldown/binding-android-arm64@1.1.5': + optional: true + + '@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.27': {} + + '@rolldown/pluginutils@1.0.1': {} + + '@rollup/pluginutils@5.4.0(rollup@4.62.2)': + dependencies: + '@types/estree': 1.0.9 + estree-walker: 2.0.2 + picomatch: 4.0.5 + optionalDependencies: + rollup: 4.62.2 + + '@rollup/rollup-android-arm-eabi@4.62.2': + optional: true + + '@rollup/rollup-android-arm64@4.62.2': optional: true '@rollup/rollup-darwin-arm64@4.62.2': @@ -2826,6 +4977,46 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.62.2': optional: true + '@shikijs/core@4.3.1': + dependencies: + '@shikijs/primitive': 4.3.1 + '@shikijs/types': 4.3.1 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + hast-util-to-html: 9.0.5 + + '@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@4.3.1': + dependencies: + '@shikijs/types': 4.3.1 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@4.3.1': + dependencies: + '@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.5 + + '@shikijs/themes@4.3.1': + dependencies: + '@shikijs/types': 4.3.1 + + '@shikijs/types@4.3.1': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + + '@shikijs/vscode-textmate@10.0.2': {} + '@swc/helpers@0.5.23': dependencies: tslib: 2.8.1 @@ -2891,12 +5082,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.3.2 '@tailwindcss/oxide-win32-x64-msvc': 4.3.2 - '@tailwindcss/vite@4.3.2(vite@6.4.3(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4))': + '@tailwindcss/vite@4.3.2(vite@6.4.3(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0))': dependencies: '@tailwindcss/node': 4.3.2 '@tailwindcss/oxide': 4.3.2 tailwindcss: 4.3.2 - vite: 6.4.3(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4) + vite: 6.4.3(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0) '@tanstack/history@1.162.0': {} @@ -2963,10 +5154,40 @@ snapshots: '@types/deep-eql': 4.0.2 assertion-error: 2.0.1 + '@types/debug@4.1.13': + dependencies: + '@types/ms': 2.1.0 + '@types/deep-eql@4.0.2': {} + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.9 + '@types/estree@1.0.9': {} + '@types/hast@3.0.5': + dependencies: + '@types/unist': 3.0.3 + + '@types/js-yaml@4.0.9': {} + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdx@2.0.14': {} + + '@types/ms@2.1.0': {} + + '@types/nlcst@2.0.3': + dependencies: + '@types/unist': 3.0.3 + + '@types/node@24.13.3': + dependencies: + undici-types: 7.18.2 + '@types/node@26.1.0': dependencies: undici-types: 8.3.0 @@ -2979,6 +5200,8 @@ snapshots: dependencies: '@types/node': 26.1.0 + '@types/picomatch@4.0.3': {} + '@types/react-dom@19.2.3(@types/react@19.2.17)': dependencies: '@types/react': 19.2.17 @@ -2987,11 +5210,21 @@ snapshots: dependencies: csstype: 3.2.3 + '@types/sax@1.2.7': + dependencies: + '@types/node': 26.1.0 + + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + '@types/yazl@3.3.1': dependencies: '@types/node': 26.1.0 - '@vitejs/plugin-react@4.7.0(vite@6.4.3(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4))': + '@ungap/structured-clone@1.3.3': {} + + '@vitejs/plugin-react@4.7.0(vite@6.4.3(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0))': dependencies: '@babel/core': 7.29.7 '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7) @@ -2999,7 +5232,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.4.3(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4) + vite: 6.4.3(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0) transitivePeerDependencies: - supports-color @@ -3011,13 +5244,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.6(vite@6.4.3(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4))': + '@vitest/mocker@3.2.6(vite@6.4.3(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0))': dependencies: '@vitest/spy': 3.2.6 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 6.4.3(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4) + vite: 6.4.3(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0) '@vitest/pretty-format@3.2.6': dependencies: @@ -3047,6 +5280,12 @@ snapshots: abstract-logging@2.0.1: {} + acorn-jsx@5.3.2(acorn@8.17.0): + dependencies: + acorn: 8.17.0 + + acorn@8.17.0: {} + ajv-formats@3.0.1(ajv@8.20.0): optionalDependencies: ajv: 8.20.0 @@ -3058,10 +5297,132 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + am-i-vibing@0.4.0: + dependencies: + process-ancestry: 0.1.0 + + ansi-escapes@7.3.0: + dependencies: + environment: 1.1.0 + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.2 + anynum@1.0.1: {} + arg@5.0.2: {} + + argparse@2.0.1: {} + + aria-query@5.3.2: {} + + array-iterate@2.0.1: {} + assertion-error@2.0.1: {} + astring@1.9.0: {} + + astro-expressive-code@0.44.1(astro@7.1.3(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@26.1.0)(jiti@2.7.0)(rollup@4.62.2)(tsx@4.22.4)(yaml@2.9.0)): + dependencies: + astro: 7.1.3(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@26.1.0)(jiti@2.7.0)(rollup@4.62.2)(tsx@4.22.4)(yaml@2.9.0) + rehype-expressive-code: 0.44.1 + url-extras: 0.1.0 + + astro@7.1.3(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@26.1.0)(jiti@2.7.0)(rollup@4.62.2)(tsx@4.22.4)(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.4.0(rollup@4.62.2) + 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: 2.0.1 + devalue: 5.8.2 + 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.3.0 + jsonc-parser: 3.3.1 + magic-string: 0.30.21 + magicast: 0.5.3 + mrmime: 2.0.1 + neotraverse: 1.0.1 + obug: 2.1.4 + p-limit: 7.3.1 + p-queue: 9.3.3 + package-manager-detector: 1.8.0 + piccolore: 0.1.3 + picomatch: 4.0.5 + semver: 7.8.5 + 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 + vite: 8.1.5(@types/node@26.1.0)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0) + vitefu: 1.1.3(vite@8.1.5(@types/node@26.1.0)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)) + xxhash-wasm: 1.1.0 + yargs-parser: 22.0.0 + zod: 4.4.3 + optionalDependencies: + '@astrojs/markdown-remark': 7.2.1 + sharp: 0.35.3(@types/node@26.1.0) + 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 + atomic-sleep@1.0.0: {} avvio@9.2.0: @@ -3069,12 +5430,26 @@ snapshots: '@fastify/error': 4.2.0 fastq: 1.20.1 + axobject-query@4.1.0: {} + + bail@2.0.2: {} + base64-js@0.0.8: {} base64-js@1.5.1: {} baseline-browser-mapping@2.10.40: {} + bcp-47-match@2.0.3: {} + + bcp-47@2.1.1: + dependencies: + is-alphabetical: 2.0.1 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + + boolbase@1.0.0: {} + brotli@1.3.3: dependencies: base64-js: 1.5.1 @@ -3099,6 +5474,8 @@ snapshots: caniuse-lite@1.0.30001800: {} + ccount@2.0.1: {} + chai@5.3.3: dependencies: assertion-error: 2.0.1 @@ -3107,30 +5484,126 @@ snapshots: loupe: 3.2.1 pathval: 2.0.1 - check-error@2.1.3: {} + character-entities-html4@2.1.0: {} - clone@2.1.2: {} + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + check-error@2.1.3: {} + + chokidar@5.0.0: + dependencies: + readdirp: 5.0.0 + + ci-info@4.4.0: {} + + clone@2.1.2: {} + + clsx@2.1.1: {} + + collapse-white-space@2.1.0: {} + + comma-separated-tokens@2.0.3: {} + + commander@11.1.0: {} + + common-ancestor-path@2.0.0: {} convert-source-map@2.0.0: {} + cookie-es@1.2.3: {} + cookie-es@3.1.1: {} cookie@1.1.1: {} + cookie@2.0.1: {} + + crossws@0.3.5: + dependencies: + uncrypto: 0.1.3 + + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-selector-parser@3.3.0: {} + + 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: {} + + cssesc@3.0.0: {} + + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + csstype@3.2.3: {} debug@4.4.3: dependencies: ms: 2.1.3 + decode-named-character-reference@1.3.0: + dependencies: + character-entities: 2.0.2 + deep-eql@5.0.2: {} + defu@6.1.7: {} + dequal@2.0.3: {} + destr@2.0.5: {} + detect-libc@2.1.2: {} + devalue@5.8.2: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + dfa@1.2.0: {} + diff@8.0.4: {} + + direction@2.0.1: {} + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + drizzle-kit@0.31.10: dependencies: '@drizzle-team/brocli': 0.10.2 @@ -3142,6 +5615,8 @@ snapshots: optionalDependencies: postgres: 3.4.9 + dset@3.1.4: {} + electron-to-chromium@1.5.384: {} enhanced-resolve@5.21.6: @@ -3149,8 +5624,30 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.3.3 + entities@4.5.0: {} + + entities@6.0.1: {} + + environment@1.1.0: {} + es-module-lexer@1.7.0: {} + es-module-lexer@2.3.1: {} + + esast-util-from-estree@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + unist-util-position-from-estree: 2.0.0 + + esast-util-from-js@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + acorn: 8.17.0 + esast-util-from-estree: 2.0.0 + vfile-message: 4.0.3 + esbuild@0.18.20: optionalDependencies: '@esbuild/android-arm': 0.18.20 @@ -3236,12 +5733,56 @@ snapshots: escalade@3.2.0: {} + escape-string-regexp@5.0.0: {} + + estree-util-attach-comments@3.0.0: + dependencies: + '@types/estree': 1.0.9 + + estree-util-build-jsx@3.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + + estree-util-is-identifier-name@3.0.0: {} + + estree-util-scope@1.0.0: + dependencies: + '@types/estree': 1.0.9 + devlop: 1.1.0 + + estree-util-to-js@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + astring: 1.9.0 + source-map: 0.7.6 + + estree-util-visit@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.3 + + estree-walker@2.0.2: {} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.9 + eventemitter3@5.0.4: {} + expect-type@1.4.0: {} + expressive-code@0.44.1: + dependencies: + '@expressive-code/core': 0.44.1 + '@expressive-code/plugin-frames': 0.44.1 + '@expressive-code/plugin-shiki': 0.44.1 + '@expressive-code/plugin-text-markers': 0.44.1 + + extend@3.0.2: {} + fast-decode-uri-component@1.0.1: {} fast-deep-equal@3.1.3: {} @@ -3259,8 +5800,18 @@ snapshots: dependencies: fast-decode-uri-component: 1.0.1 + 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.3: {} + fast-wrap-ansi@0.2.2: + dependencies: + fast-string-width: 3.0.2 + fast-xml-builder@1.2.0: dependencies: path-expression-matcher: 1.6.1 @@ -3305,12 +5856,22 @@ snapshots: optionalDependencies: picomatch: 4.0.4 + fdir@6.5.0(picomatch@4.0.5): + optionalDependencies: + picomatch: 4.0.5 + find-my-way@9.6.0: dependencies: fast-deep-equal: 3.1.3 fast-querystring: 1.1.2 safe-regex2: 5.1.1 + flattie@1.1.1: {} + + fontace@0.4.1: + dependencies: + fontkitten: 1.0.3 + fontkit@2.0.4: dependencies: '@swc/helpers': 0.5.23 @@ -3323,6 +5884,10 @@ snapshots: unicode-properties: 1.4.1 unicode-trie: 2.0.0 + fontkitten@1.0.3: + dependencies: + tiny-inflate: 1.0.3 + fsevents@2.3.2: optional: true @@ -3335,10 +5900,252 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + get-tsconfig@5.0.0-beta.4: + dependencies: + resolve-pkg-maps: 1.0.0 + + github-slugger@2.0.0: {} + graceful-fs@4.2.11: {} + 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.4 + uncrypto: 0.1.3 + + has-flag@5.0.1: {} + + hast-util-embedded@3.0.0: + dependencies: + '@types/hast': 3.0.5 + hast-util-is-element: 3.0.0 + + hast-util-format@1.1.0: + dependencies: + '@types/hast': 3.0.5 + hast-util-embedded: 3.0.0 + hast-util-minify-whitespace: 1.0.1 + hast-util-phrasing: 3.0.1 + hast-util-whitespace: 3.0.0 + html-whitespace-sensitive-tag-names: 3.0.1 + unist-util-visit-parents: 6.0.2 + + hast-util-from-html@2.0.3: + dependencies: + '@types/hast': 3.0.5 + 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.5 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.2.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.5 + + hast-util-is-body-ok-link@3.0.1: + dependencies: + '@types/hast': 3.0.5 + + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.5 + + hast-util-minify-whitespace@1.0.1: + dependencies: + '@types/hast': 3.0.5 + hast-util-embedded: 3.0.0 + hast-util-is-element: 3.0.0 + hast-util-whitespace: 3.0.0 + unist-util-is: 6.0.1 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.5 + + hast-util-phrasing@3.0.1: + dependencies: + '@types/hast': 3.0.5 + hast-util-embedded: 3.0.0 + hast-util-has-property: 3.0.0 + hast-util-is-body-ok-link: 3.0.1 + hast-util-is-element: 3.0.0 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.3.3 + 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-select@6.0.4: + dependencies: + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 + bcp-47-match: 2.0.3 + comma-separated-tokens: 2.0.3 + css-selector-parser: 3.3.0 + devlop: 1.1.0 + direction: 2.0.1 + hast-util-has-property: 3.0.0 + hast-util-to-string: 3.0.1 + hast-util-whitespace: 3.0.0 + nth-check: 2.1.1 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.1.0 + zwitch: 2.0.4 + + hast-util-to-estree@3.1.3: + dependencies: + '@types/estree': 1.0.9 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.5 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-attach-comments: 3.0.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.21 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-jsx-runtime@2.3.6: + dependencies: + '@types/estree': 1.0.9 + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.21 + unist-util-position: 5.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + hast-util-to-parse5@8.0.1: + dependencies: + '@types/hast': 3.0.5 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 7.2.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.5 + + hast-util-to-text@4.0.2: + dependencies: + '@types/hast': 3.0.5 + '@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.5 + + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.5 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + + html-escaper@3.0.3: {} + + html-void-elements@3.0.0: {} + + html-whitespace-sensitive-tag-names@3.0.1: {} + + http-cache-semantics@4.2.0: {} + + i18next@26.3.6(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 + + inline-style-parser@0.2.7: {} + ipaddr.js@2.4.0: {} + iron-webcrypto@1.2.1: {} + + is-absolute-url@5.0.0: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-decimal@2.0.1: {} + + is-docker@4.0.0: {} + + is-hexadecimal@2.0.1: {} + + is-plain-obj@4.1.0: {} + is-unsafe@1.0.1: {} isbot@5.1.44: {} @@ -3353,6 +6160,10 @@ snapshots: js-tokens@9.0.1: {} + js-yaml@4.3.0: + dependencies: + argparse: 2.0.1 + jsesc@3.1.0: {} json-schema-ref-resolver@3.0.0: @@ -3365,6 +6176,10 @@ snapshots: jsonata@2.2.1: {} + jsonc-parser@3.3.1: {} + + klona@2.0.6: {} + light-my-request@6.6.0: dependencies: cookie: 1.1.1 @@ -3389,73 +6204,632 @@ snapshots: lightningcss-linux-arm64-gnu@1.32.0: optional: true - lightningcss-linux-arm64-musl@1.32.0: - optional: true + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + + linebreak@1.1.0: + dependencies: + base64-js: 0.0.8 + unicode-trie: 2.0.0 + + lodash@4.18.1: {} + + longest-streak@3.1.0: {} + + loupe@3.2.1: {} + + lru-cache@11.5.2: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magicast@0.5.3: + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + source-map-js: 1.2.1 + + markdown-extensions@2.0.0: {} + + markdown-table@3.0.4: {} + + 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-directive@3.1.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-visit-parents: 6.0.2 + transitivePeerDependencies: + - supports-color + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + mdast-util-from-markdown@2.0.3: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.3 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.3 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 + + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.3 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + 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.1.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + mdn-data@2.0.28: {} + + mdn-data@2.27.1: {} + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-directive@4.0.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + parse-entities: 4.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-expression@3.0.1: + dependencies: + '@types/estree': 1.0.9 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-jsx@3.0.2: + dependencies: + '@types/estree': 1.0.9 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 + + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + '@types/estree': 1.0.9 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.3 + + micromark-extension-mdxjs@3.0.0: + dependencies: + 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 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-mdx-expression@2.0.3: + dependencies: + '@types/estree': 1.0.9 + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.3 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 - lightningcss-linux-x64-gnu@1.32.0: - optional: true + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.3.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 - lightningcss-linux-x64-musl@1.32.0: - optional: true + micromark-util-encode@2.0.1: {} - lightningcss-win32-arm64-msvc@1.32.0: - optional: true + micromark-util-events-to-acorn@2.0.3: + dependencies: + '@types/estree': 1.0.9 + '@types/unist': 3.0.3 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 - lightningcss-win32-x64-msvc@1.32.0: - optional: true + micromark-util-html-tag-name@2.0.1: {} - lightningcss@1.32.0: + micromark-util-normalize-identifier@2.0.1: dependencies: - detect-libc: 2.1.2 - optionalDependencies: - lightningcss-android-arm64: 1.32.0 - lightningcss-darwin-arm64: 1.32.0 - lightningcss-darwin-x64: 1.32.0 - lightningcss-freebsd-x64: 1.32.0 - lightningcss-linux-arm-gnueabihf: 1.32.0 - lightningcss-linux-arm64-gnu: 1.32.0 - lightningcss-linux-arm64-musl: 1.32.0 - lightningcss-linux-x64-gnu: 1.32.0 - lightningcss-linux-x64-musl: 1.32.0 - lightningcss-win32-arm64-msvc: 1.32.0 - lightningcss-win32-x64-msvc: 1.32.0 + micromark-util-symbol: 2.0.1 - linebreak@1.1.0: + micromark-util-resolve-all@2.0.1: dependencies: - base64-js: 0.0.8 - unicode-trie: 2.0.0 + micromark-util-types: 2.0.2 - loupe@3.2.1: {} + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 - lru-cache@5.1.1: + micromark-util-subtokenize@2.1.0: dependencies: - yallist: 3.1.1 + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - magic-string@0.30.21: + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@types/debug': 4.1.13 + debug: 4.4.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + + mrmime@2.0.1: {} ms@2.1.3: {} nanoid@3.3.15: {} + neotraverse@1.0.1: {} + + nlcst-to-string@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + + node-fetch-native@1.6.7: {} + + node-mock-http@1.0.4: {} + node-releases@2.0.50: {} nodemailer@9.0.3: {} + normalize-path@3.0.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + oauth4webapi@3.8.6: {} + obug@2.1.4: {} + + ofetch@1.5.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.4 + + ohash@2.0.11: {} + on-exit-leak-free@2.1.2: {} + oniguruma-parser@0.12.2: {} + + oniguruma-to-es@4.3.6: + dependencies: + oniguruma-parser: 0.12.2 + regex: 6.1.0 + regex-recursion: 6.0.2 + openid-client@6.8.4: dependencies: jose: 6.2.3 oauth4webapi: 3.8.6 + p-limit@7.3.1: + dependencies: + yocto-queue: 1.2.2 + + p-queue@9.3.3: + dependencies: + eventemitter3: 5.0.4 + p-timeout: 7.0.1 + + p-timeout@7.0.1: {} + + package-manager-detector@1.8.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@0.2.9: {} pako@1.0.11: {} + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.3.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + 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 + + parse5@7.3.0: + dependencies: + entities: 6.0.1 + path-expression-matcher@1.6.1: {} pathe@2.0.3: {} @@ -3471,10 +6845,16 @@ snapshots: linebreak: 1.1.0 png-js: 1.1.0 + piccolore@0.1.3: {} + picocolors@1.1.1: {} + picomatch@2.3.2: {} + picomatch@4.0.4: {} + picomatch@4.0.5: {} + pino-abstract-transport@3.0.0: dependencies: split2: 4.2.0 @@ -3507,20 +6887,44 @@ snapshots: dependencies: browserify-zlib: 0.2.0 + postcss-nested@6.2.0(postcss@8.5.19): + dependencies: + postcss: 8.5.19 + postcss-selector-parser: 6.1.4 + + postcss-selector-parser@6.1.4: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + postcss@8.5.16: dependencies: nanoid: 3.3.15 picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.5.19: + dependencies: + nanoid: 3.3.15 + picocolors: 1.1.1 + source-map-js: 1.2.1 + postgres@3.4.9: {} + prismjs@1.30.0: {} + + process-ancestry@0.1.0: {} + process-warning@4.0.1: {} process-warning@5.0.0: {} + property-information@7.2.0: {} + quick-format-unescaped@4.0.4: {} + radix3@1.1.2: {} + react-dom@19.2.7(react@19.2.7): dependencies: react: 19.2.7 @@ -3530,10 +6934,155 @@ snapshots: react@19.2.7: {} + readdirp@5.0.0: {} + real-require@0.2.0: {} real-require@1.0.0: {} + recma-build-jsx@1.0.0: + dependencies: + '@types/estree': 1.0.9 + estree-util-build-jsx: 3.0.1 + vfile: 6.0.3 + + recma-jsx@1.0.1(acorn@8.17.0): + dependencies: + 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 + unified: 11.0.5 + + recma-parse@1.0.0: + dependencies: + '@types/estree': 1.0.9 + esast-util-from-js: 2.0.1 + unified: 11.0.5 + vfile: 6.0.3 + + recma-stringify@1.0.0: + dependencies: + '@types/estree': 1.0.9 + estree-util-to-js: 2.0.0 + unified: 11.0.5 + vfile: 6.0.3 + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.1.0: + dependencies: + regex-utilities: 2.3.0 + + rehype-expressive-code@0.44.1: + dependencies: + expressive-code: 0.44.1 + + rehype-format@5.0.1: + dependencies: + '@types/hast': 3.0.5 + hast-util-format: 1.1.0 + + rehype-parse@9.0.1: + dependencies: + '@types/hast': 3.0.5 + hast-util-from-html: 2.0.3 + unified: 11.0.5 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.5 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + rehype-recma@1.0.0: + dependencies: + '@types/estree': 1.0.9 + '@types/hast': 3.0.5 + hast-util-to-estree: 3.1.3 + transitivePeerDependencies: + - supports-color + + rehype-stringify@10.0.1: + dependencies: + '@types/hast': 3.0.5 + hast-util-to-html: 9.0.5 + unified: 11.0.5 + + rehype@13.0.2: + dependencies: + '@types/hast': 3.0.5 + rehype-parse: 9.0.1 + rehype-stringify: 10.0.1 + unified: 11.0.5 + + remark-directive@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-directive: 3.1.0 + micromark-extension-directive: 4.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-heading-id@1.0.1: + dependencies: + lodash: 4.18.1 + unist-util-visit: 1.4.1 + + remark-mdx@3.1.1: + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.1 + 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 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + require-from-string@2.0.2: {} resolve-pkg-maps@1.0.0: {} @@ -3542,10 +7091,56 @@ snapshots: ret@0.5.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: {} rfdc@1.4.1: {} + 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.62.2: dependencies: '@types/estree': 1.0.9 @@ -3583,6 +7178,25 @@ snapshots: safe-stable-stringify@2.5.0: {} + satteri@0.9.5: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.5 + '@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: {} + scheduler@0.27.0: {} secure-json-parse@4.1.0: {} @@ -3599,8 +7213,63 @@ snapshots: set-cookie-parser@2.7.2: {} + sharp@0.35.3(@types/node@26.1.0): + dependencies: + '@img/colour': 1.1.0 + detect-libc: 2.1.2 + semver: 7.8.5 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.35.3 + '@img/sharp-darwin-x64': 0.35.3 + '@img/sharp-freebsd-wasm32': 0.35.3 + '@img/sharp-libvips-darwin-arm64': 1.3.2 + '@img/sharp-libvips-darwin-x64': 1.3.2 + '@img/sharp-libvips-linux-arm': 1.3.2 + '@img/sharp-libvips-linux-arm64': 1.3.2 + '@img/sharp-libvips-linux-ppc64': 1.3.2 + '@img/sharp-libvips-linux-riscv64': 1.3.2 + '@img/sharp-libvips-linux-s390x': 1.3.2 + '@img/sharp-libvips-linux-x64': 1.3.2 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.2 + '@img/sharp-libvips-linuxmusl-x64': 1.3.2 + '@img/sharp-linux-arm': 0.35.3 + '@img/sharp-linux-arm64': 0.35.3 + '@img/sharp-linux-ppc64': 0.35.3 + '@img/sharp-linux-riscv64': 0.35.3 + '@img/sharp-linux-s390x': 0.35.3 + '@img/sharp-linux-x64': 0.35.3 + '@img/sharp-linuxmusl-arm64': 0.35.3 + '@img/sharp-linuxmusl-x64': 0.35.3 + '@img/sharp-webcontainers-wasm32': 0.35.3 + '@img/sharp-win32-arm64': 0.35.3 + '@img/sharp-win32-ia32': 0.35.3 + '@img/sharp-win32-x64': 0.35.3 + '@types/node': 26.1.0 + + 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.5 + siginfo@2.0.0: {} + sisteransi@1.0.5: {} + + sitemap@9.0.1: + dependencies: + '@types/node': 24.13.3 + '@types/sax': 1.2.7 + arg: 5.0.2 + sax: 1.6.0 + + smol-toml@1.7.0: {} + sonic-boom@4.2.1: dependencies: atomic-sleep: 1.0.0 @@ -3614,12 +7283,42 @@ snapshots: source-map@0.6.1: {} + source-map@0.7.6: {} + + space-separated-tokens@2.0.2: {} + split2@4.2.0: {} stackback@0.0.2: {} + starlight-links-validator@0.25.2(@astrojs/starlight@0.41.4(@astrojs/markdown-remark@7.2.1)(astro@7.1.3(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@26.1.0)(jiti@2.7.0)(rollup@4.62.2)(tsx@4.22.4)(yaml@2.9.0))(typescript@5.9.3))(astro@7.1.3(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@26.1.0)(jiti@2.7.0)(rollup@4.62.2)(tsx@4.22.4)(yaml@2.9.0)): + dependencies: + '@astrojs/markdown-satteri': 0.3.4 + '@astrojs/starlight': 0.41.4(@astrojs/markdown-remark@7.2.1)(astro@7.1.3(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@26.1.0)(jiti@2.7.0)(rollup@4.62.2)(tsx@4.22.4)(yaml@2.9.0))(typescript@5.9.3) + '@types/picomatch': 4.0.3 + astro: 7.1.3(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@26.1.0)(jiti@2.7.0)(rollup@4.62.2)(tsx@4.22.4)(yaml@2.9.0) + github-slugger: 2.0.0 + hast-util-from-html: 2.0.3 + is-absolute-url: 5.0.0 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-to-hast: 13.2.1 + picomatch: 4.0.5 + satteri: 0.9.5 + terminal-link: 5.0.0 + unist-util-visit: 5.1.0 + yaml: 2.9.0 + transitivePeerDependencies: + - supports-color + std-env@3.10.0: {} + stream-replace-string@2.0.0: {} + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + strip-literal@3.1.0: dependencies: js-tokens: 9.0.1 @@ -3628,10 +7327,40 @@ snapshots: dependencies: anynum: 1.0.1 + style-to-js@1.1.21: + dependencies: + style-to-object: 1.0.14 + + style-to-object@1.0.14: + dependencies: + inline-style-parser: 0.2.7 + + supports-color@10.2.2: {} + + supports-hyperlinks@4.5.0: + dependencies: + has-flag: 5.0.1 + supports-color: 10.2.2 + + 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 + tailwindcss@4.3.2: {} tapable@2.3.3: {} + terminal-link@5.0.0: + dependencies: + ansi-escapes: 7.3.0 + supports-hyperlinks: 4.5.0 + thread-stream@4.2.0: dependencies: real-require: 1.0.0 @@ -3640,12 +7369,16 @@ snapshots: tinybench@2.9.0: {} + tinyclip@0.1.15: {} + tinyexec@0.3.2: {} + tinyexec@1.2.4: {} + 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@1.1.1: {} @@ -3655,6 +7388,10 @@ snapshots: toad-cache@3.7.1: {} + trim-lines@3.0.1: {} + + trough@2.2.0: {} + tslib@2.8.1: {} tsx@4.22.4: @@ -3665,6 +7402,14 @@ snapshots: typescript@5.9.3: {} + ufo@1.6.4: {} + + ultrahtml@1.7.0: {} + + uncrypto@0.1.3: {} + + undici-types@7.18.2: {} + undici-types@8.3.0: {} unicode-properties@1.4.1: @@ -3677,23 +7422,125 @@ snapshots: pako: 0.2.9 tiny-inflate: 1.0.3 + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + 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@3.0.0: {} + + 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 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-visit: 5.1.0 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-children@3.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@2.1.2: + dependencies: + unist-util-is: 3.0.0 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@1.4.1: + dependencies: + unist-util-visit-parents: 2.1.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 + + unstorage@1.17.5: + dependencies: + anymatch: 3.1.3 + chokidar: 5.0.0 + destr: 2.0.5 + h3: 1.15.11 + lru-cache: 11.5.2 + node-fetch-native: 1.6.7 + ofetch: 1.5.1 + ufo: 1.6.4 + update-browserslist-db@1.2.3(browserslist@4.28.4): dependencies: browserslist: 4.28.4 escalade: 3.2.0 picocolors: 1.1.1 + url-extras@0.1.0: {} + use-sync-external-store@1.6.0(react@19.2.7): dependencies: react: 19.2.7 - vite-node@3.2.4(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4): + util-deprecate@1.0.2: {} + + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + vite-node@3.2.4(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.4.3(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4) + vite: 6.4.3(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0) transitivePeerDependencies: - '@types/node' - jiti @@ -3708,7 +7555,7 @@ snapshots: - tsx - yaml - vite@6.4.3(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4): + vite@6.4.3(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.4) @@ -3722,12 +7569,32 @@ snapshots: jiti: 2.7.0 lightningcss: 1.32.0 tsx: 4.22.4 + yaml: 2.9.0 + + vite@8.1.5(@types/node@26.1.0)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.4)(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': 26.1.0 + esbuild: 0.28.1 + fsevents: 2.3.3 + jiti: 2.7.0 + tsx: 4.22.4 + yaml: 2.9.0 - vitest@3.2.6(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4): + vitefu@1.1.3(vite@8.1.5(@types/node@26.1.0)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)): + optionalDependencies: + vite: 8.1.5(@types/node@26.1.0)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0) + + vitest@3.2.6(@types/debug@4.1.13)(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.6 - '@vitest/mocker': 3.2.6(vite@6.4.3(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)) + '@vitest/mocker': 3.2.6(vite@6.4.3(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0)) '@vitest/pretty-format': 3.2.6 '@vitest/runner': 3.2.6 '@vitest/snapshot': 3.2.6 @@ -3745,10 +7612,11 @@ snapshots: tinyglobby: 0.2.17 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.4.3(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4) - vite-node: 3.2.4(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4) + vite: 6.4.3(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0) + vite-node: 3.2.4(@types/node@26.1.0)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: + '@types/debug': 4.1.13 '@types/node': 26.1.0 transitivePeerDependencies: - jiti @@ -3764,6 +7632,8 @@ snapshots: - tsx - yaml + web-namespaces@2.0.1: {} + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 @@ -3771,10 +7641,20 @@ snapshots: xml-naming@0.1.0: {} + xxhash-wasm@1.1.0: {} + yallist@3.1.1: {} + yaml@2.9.0: {} + + yargs-parser@22.0.0: {} + yazl@3.3.1: dependencies: buffer-crc32: 1.0.0 + yocto-queue@1.2.2: {} + zod@4.4.3: {} + + zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 1304dae..aa1651a 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,6 +1,7 @@ packages: - apps/* - packages/* + - site allowBuilds: esbuild: true # fontkit (via pdfkit) pulls @swc/helpers, which requires tslib without declaring it. diff --git a/scripts/screenshots.mjs b/scripts/screenshots.mjs index 60f4cdc..1fcb44d 100644 --- a/scripts/screenshots.mjs +++ b/scripts/screenshots.mjs @@ -1,5 +1,5 @@ #!/usr/bin/env node -// Docs screenshot generator — reproduces every site/images/*.png against the +// Docs screenshot generator — reproduces every site/src/assets/screenshots/*.png against the // dev stack, so a UI refresh is one command instead of an ad-hoc Playwright // session. See CONTRIBUTING.md ("Refreshing docs screenshots") for the recipe. // @@ -48,7 +48,7 @@ function flagValue(name) { const only = flagValue("--only") ?.split(",") .map((s) => s.trim()); -const outDir = path.resolve(root, flagValue("--out") ?? "site/images"); +const outDir = path.resolve(root, flagValue("--out") ?? "site/src/assets/screenshots"); // --------------------------------------------------------------------------- // Reference states (recovered from the previous captures) @@ -226,7 +226,7 @@ DEMO-003,SITE.001,SCREENING,DIABP,76,2026-07-02 // bell): opened by demo-dm, so demo-inv and demo-coord get the notification. const MANUAL_QUERY_BODY = "Please verify the diastolic value against the source document."; -// The documented workbench examples (site/guide/analytics.qmd) against the +// The documented workbench examples (site/src/content/docs/guide/analytics.md) against the // demo snapshot's ig_vs table. const SQL_EXAMPLE = `SELECT subject_key, it_vs_sysbp, it_vs_diabp, it_vs_sysbp - it_vs_diabp AS pulse_pressure diff --git a/site/_quarto.yml b/site/_quarto.yml deleted file mode 100644 index cd1addc..0000000 --- a/site/_quarto.yml +++ /dev/null @@ -1,78 +0,0 @@ -project: - type: website - -website: - title: "edc-core" - description: "A modern, open-source Electronic Data Capture system for clinical research" - site-url: https://tgerke.github.io/edc-core/ - repo-url: https://github.com/tgerke/edc-core - repo-actions: [issue] - page-navigation: true - navbar: - background: dark - pinned: true - left: - - href: index.qmd - text: Home - - href: start-here.qmd - text: Start here - - href: installation.qmd - text: Installation - - href: deployment.qmd - text: Deployment - - href: tour.qmd - text: Five-minute tour - - text: User guide - href: guide/study-builds.qmd - - href: data-lifecycle.qmd - text: Data lifecycle - - href: compliance.qmd - text: Compliance - right: - - icon: github - href: https://github.com/tgerke/edc-core - aria-label: GitHub - sidebar: - - title: "User guide" - style: floating - contents: - - section: "Building studies" - contents: - - guide/why-protocol-first.qmd - - guide/protocol-import.qmd - - guide/study-builds.qmd - - guide/rules-and-derivations.qmd - - guide/site-forms.qmd - - guide/amendments.qmd - - section: "Capturing data" - contents: - - guide/data-capture.qmd - - guide/lab-import.qmd - - guide/rtsm-integration.qmd - - guide/blinding.qmd - - section: "Review and oversight" - contents: - - guide/review.qmd - - guide/medical-coding.qmd - - guide/notifications.qmd - - guide/user-admin.qmd - - section: "Analytics and exports" - contents: - - guide/analytics.qmd - - guide/exports-and-archive.qmd - - section: "Reference" - contents: - - glossary.qmd - page-footer: - left: "edc-core is AGPL-3.0 · clinical research infrastructure should stay open" - right: - - icon: github - href: https://github.com/tgerke/edc-core - -format: - html: - theme: [cosmo, theme.scss] - toc: true - code-copy: true - code-overflow: wrap - link-external-newwindow: true diff --git a/site/astro.config.mjs b/site/astro.config.mjs new file mode 100644 index 0000000..b32bad1 --- /dev/null +++ b/site/astro.config.mjs @@ -0,0 +1,72 @@ +// @ts-check +import starlight from "@astrojs/starlight"; +import { defineConfig } from "astro/config"; +import remarkHeadingId from "remark-heading-id"; +import starlightLinksValidator from "starlight-links-validator"; + +export default defineConfig({ + site: "https://tgerke.github.io", + base: "/edc-core", + markdown: { + remarkPlugins: [remarkHeadingId], + }, + integrations: [ + starlight({ + title: "edc-core", + description: "A modern, open-source Electronic Data Capture system for clinical research", + social: [{ icon: "github", label: "GitHub", href: "https://github.com/tgerke/edc-core" }], + customCss: ["./src/styles/custom.css"], + components: { + Footer: "./src/components/Footer.astro", + }, + plugins: [starlightLinksValidator({ errorOnLocalLinks: false })], + sidebar: [ + { + label: "Getting started", + items: ["start-here", "installation", "deployment", "tour"], + }, + { + label: "Building studies", + items: [ + "guide/why-protocol-first", + "guide/protocol-import", + "guide/study-builds", + "guide/rules-and-derivations", + "guide/site-forms", + "guide/amendments", + ], + }, + { + label: "Capturing data", + items: [ + "guide/data-capture", + "guide/lab-import", + "guide/rtsm-integration", + "guide/blinding", + ], + }, + { + label: "Review and oversight", + items: [ + "guide/review", + "guide/medical-coding", + "guide/notifications", + "guide/user-admin", + ], + }, + { + label: "Analytics and exports", + items: ["guide/analytics", "guide/exports-and-archive"], + }, + { + label: "Architecture and compliance", + items: ["data-lifecycle", "compliance"], + }, + { + label: "Reference", + items: ["glossary"], + }, + ], + }), + ], +}); diff --git a/site/index.qmd b/site/index.qmd deleted file mode 100644 index c7cf210..0000000 --- a/site/index.qmd +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: "edc-core" -subtitle: "A modern, open-source Electronic Data Capture system for clinical research" -toc: false ---- - -::: {.hero-lead} -Commercial EDC platforms are expensive, closed, and dated. The open-source -alternatives run on legacy stacks. **edc-core** is a from-scratch EDC built on -modern web technology, an analytics-native data architecture, and CDISC -standards, designed so that regulatory expectations (21 CFR Part 11, -ICH E6(R3)) are structural properties of the system rather than afterthoughts. -::: - -![The analytics workbench: self-service SQL over an immutable, version-pinned -study snapshot.](images/workbench-sql.png){.screenshot} - -## Why edc-core - -**No vendor lock-in.** AGPL-3.0 licensed: nobody can take this code and sell -it back to you as a closed platform. - -**Programmable study builds.** First-class CDISC ODM v2.0 import/export means -study builds can be file-driven, code-driven, and LLM-assisted. The visual -builder writes through exactly the same versioned-metadata API. - -**Self-service analytics, in the EDC.** Data managers query published study -snapshots with real SQL, R, and Python, not a bespoke, vendor-locked reporting -layer. Every execution is read-only, sandboxed, version-pinned, and audited. -And a listing's rows can [become site queries in -bulk](guide/analytics.qmd#from-listings-to-queries), each traceable back to -the code that raised it, so the workbench doubles as the study's -data-cleaning surface. - -**Compliance by construction.** Append-only audit trails enforced at the -database level, Part 11 e-signatures bound to record versions, an audit-trail -review UI, and a validation pack shipped with every release. - -**Standards as the interface.** ODM v2.0 (XML + JSON) for metadata, -Dataset-JSON v1.1 for data exchange, CDASH-aligned demo CRFs, and a -self-contained study archive that outlives the running system. - -## Where to start - -| | | -|---|---| -| [Installation](installation.qmd) | Run the full stack locally with Podman or Docker, or deploy the published container images. | -| [Five-minute tour](tour.qmd) | Seed the demo study and walk the whole lifecycle: entry → query → verify → sign → snapshot → analyze. | -| [User guide](guide/study-builds.qmd) | Study builds, data capture, review workflows, and the analytics workbench. | -| [Compliance](compliance.qmd) | How edc-core maps to 21 CFR Part 11 and ICH E6(R3), and what the validation pack contains. | - -: {tbl-colwidths="[30,70]"} - -## Start here by role - -| | | -|---|---| -| [New to EDC](start-here.qmd#entry-level) | Entry-level data managers: vocabulary first, then a guided loop through entry, review, coding, and analytics. | -| [Study builders](start-here.qmd#study-builders) | Experienced data managers: versioned builds, protocol import, site layouts, and integrations. | -| [CRO and sponsor leadership](start-here.qmd#leadership) | Compliance posture, oversight evidence, and the exit path, without touching a form. | -| [Clinical operations](start-here.qmd#clinical-ops) | Site-facing workflows: subjects, entry, queries, and signatures. | - -: {tbl-colwidths="[30,70]"} - -::: {.callout-note} -**Status: alpha.** The full workflow (protocol-first or forms-first build, -capture, clean, code, sign, snapshot, analyze with SQL, R, and Python, -export) is released as -[v0.5.0](https://github.com/tgerke/edc-core/releases/tag/v0.5.0), but -edc-core has not yet been used in a production study. Follow progress on -[GitHub](https://github.com/tgerke/edc-core). -::: diff --git a/site/package.json b/site/package.json new file mode 100644 index 0000000..dd5122f --- /dev/null +++ b/site/package.json @@ -0,0 +1,17 @@ +{ + "name": "site", + "private": true, + "type": "module", + "scripts": { + "dev": "astro dev", + "build": "astro build", + "preview": "astro preview" + }, + "dependencies": { + "@astrojs/starlight": "^0.41.4", + "astro": "^7.1.3", + "remark-heading-id": "^1.0.1", + "sharp": "^0.35.3", + "starlight-links-validator": "^0.25.2" + } +} diff --git a/site/public/compliance.html b/site/public/compliance.html new file mode 100644 index 0000000..dc065e5 --- /dev/null +++ b/site/public/compliance.html @@ -0,0 +1,6 @@ + + + + +Redirecting +

This page moved to /edc-core/compliance/.

diff --git a/site/public/data-lifecycle.html b/site/public/data-lifecycle.html new file mode 100644 index 0000000..9aced8f --- /dev/null +++ b/site/public/data-lifecycle.html @@ -0,0 +1,6 @@ + + + + +Redirecting +

This page moved to /edc-core/data-lifecycle/.

diff --git a/site/public/deployment.html b/site/public/deployment.html new file mode 100644 index 0000000..e6e22d5 --- /dev/null +++ b/site/public/deployment.html @@ -0,0 +1,6 @@ + + + + +Redirecting +

This page moved to /edc-core/deployment/.

diff --git a/site/public/favicon.svg b/site/public/favicon.svg new file mode 100644 index 0000000..93b7f66 --- /dev/null +++ b/site/public/favicon.svg @@ -0,0 +1 @@ +edc-coree diff --git a/site/public/glossary.html b/site/public/glossary.html new file mode 100644 index 0000000..23890be --- /dev/null +++ b/site/public/glossary.html @@ -0,0 +1,6 @@ + + + + +Redirecting +

This page moved to /edc-core/glossary/.

diff --git a/site/public/guide/amendments.html b/site/public/guide/amendments.html new file mode 100644 index 0000000..c9f5e6e --- /dev/null +++ b/site/public/guide/amendments.html @@ -0,0 +1,6 @@ + + + + +Redirecting +

This page moved to /edc-core/guide/amendments/.

diff --git a/site/public/guide/analytics.html b/site/public/guide/analytics.html new file mode 100644 index 0000000..bca9560 --- /dev/null +++ b/site/public/guide/analytics.html @@ -0,0 +1,6 @@ + + + + +Redirecting +

This page moved to /edc-core/guide/analytics/.

diff --git a/site/public/guide/blinding.html b/site/public/guide/blinding.html new file mode 100644 index 0000000..954fbc3 --- /dev/null +++ b/site/public/guide/blinding.html @@ -0,0 +1,6 @@ + + + + +Redirecting +

This page moved to /edc-core/guide/blinding/.

diff --git a/site/public/guide/data-capture.html b/site/public/guide/data-capture.html new file mode 100644 index 0000000..e4c125c --- /dev/null +++ b/site/public/guide/data-capture.html @@ -0,0 +1,6 @@ + + + + +Redirecting +

This page moved to /edc-core/guide/data-capture/.

diff --git a/site/public/guide/exports-and-archive.html b/site/public/guide/exports-and-archive.html new file mode 100644 index 0000000..1a0c208 --- /dev/null +++ b/site/public/guide/exports-and-archive.html @@ -0,0 +1,6 @@ + + + + +Redirecting +

This page moved to /edc-core/guide/exports-and-archive/.

diff --git a/site/public/guide/lab-import.html b/site/public/guide/lab-import.html new file mode 100644 index 0000000..4843e7f --- /dev/null +++ b/site/public/guide/lab-import.html @@ -0,0 +1,6 @@ + + + + +Redirecting +

This page moved to /edc-core/guide/lab-import/.

diff --git a/site/public/guide/medical-coding.html b/site/public/guide/medical-coding.html new file mode 100644 index 0000000..04ef606 --- /dev/null +++ b/site/public/guide/medical-coding.html @@ -0,0 +1,6 @@ + + + + +Redirecting +

This page moved to /edc-core/guide/medical-coding/.

diff --git a/site/public/guide/notifications.html b/site/public/guide/notifications.html new file mode 100644 index 0000000..d309b32 --- /dev/null +++ b/site/public/guide/notifications.html @@ -0,0 +1,6 @@ + + + + +Redirecting +

This page moved to /edc-core/guide/notifications/.

diff --git a/site/public/guide/protocol-import.html b/site/public/guide/protocol-import.html new file mode 100644 index 0000000..dd4590d --- /dev/null +++ b/site/public/guide/protocol-import.html @@ -0,0 +1,6 @@ + + + + +Redirecting +

This page moved to /edc-core/guide/protocol-import/.

diff --git a/site/public/guide/review.html b/site/public/guide/review.html new file mode 100644 index 0000000..fa6bb94 --- /dev/null +++ b/site/public/guide/review.html @@ -0,0 +1,6 @@ + + + + +Redirecting +

This page moved to /edc-core/guide/review/.

diff --git a/site/public/guide/rtsm-integration.html b/site/public/guide/rtsm-integration.html new file mode 100644 index 0000000..d248c05 --- /dev/null +++ b/site/public/guide/rtsm-integration.html @@ -0,0 +1,6 @@ + + + + +Redirecting +

This page moved to /edc-core/guide/rtsm-integration/.

diff --git a/site/public/guide/rules-and-derivations.html b/site/public/guide/rules-and-derivations.html new file mode 100644 index 0000000..1551cf7 --- /dev/null +++ b/site/public/guide/rules-and-derivations.html @@ -0,0 +1,6 @@ + + + + +Redirecting +

This page moved to /edc-core/guide/rules-and-derivations/.

diff --git a/site/public/guide/site-forms.html b/site/public/guide/site-forms.html new file mode 100644 index 0000000..8d7d9af --- /dev/null +++ b/site/public/guide/site-forms.html @@ -0,0 +1,6 @@ + + + + +Redirecting +

This page moved to /edc-core/guide/site-forms/.

diff --git a/site/public/guide/study-builds.html b/site/public/guide/study-builds.html new file mode 100644 index 0000000..3aadeb5 --- /dev/null +++ b/site/public/guide/study-builds.html @@ -0,0 +1,6 @@ + + + + +Redirecting +

This page moved to /edc-core/guide/study-builds/.

diff --git a/site/public/guide/user-admin.html b/site/public/guide/user-admin.html new file mode 100644 index 0000000..a09d027 --- /dev/null +++ b/site/public/guide/user-admin.html @@ -0,0 +1,6 @@ + + + + +Redirecting +

This page moved to /edc-core/guide/user-admin/.

diff --git a/site/public/guide/why-protocol-first.html b/site/public/guide/why-protocol-first.html new file mode 100644 index 0000000..2ce5601 --- /dev/null +++ b/site/public/guide/why-protocol-first.html @@ -0,0 +1,6 @@ + + + + +Redirecting +

This page moved to /edc-core/guide/why-protocol-first/.

diff --git a/site/public/installation.html b/site/public/installation.html new file mode 100644 index 0000000..bff3915 --- /dev/null +++ b/site/public/installation.html @@ -0,0 +1,6 @@ + + + + +Redirecting +

This page moved to /edc-core/installation/.

diff --git a/site/public/start-here.html b/site/public/start-here.html new file mode 100644 index 0000000..778ae8c --- /dev/null +++ b/site/public/start-here.html @@ -0,0 +1,6 @@ + + + + +Redirecting +

This page moved to /edc-core/start-here/.

diff --git a/site/public/tour.html b/site/public/tour.html new file mode 100644 index 0000000..13aceba --- /dev/null +++ b/site/public/tour.html @@ -0,0 +1,6 @@ + + + + +Redirecting +

This page moved to /edc-core/tour/.

diff --git a/site/images/access-log.png b/site/src/assets/screenshots/access-log.png similarity index 100% rename from site/images/access-log.png rename to site/src/assets/screenshots/access-log.png diff --git a/site/images/amendments-diff.png b/site/src/assets/screenshots/amendments-diff.png similarity index 100% rename from site/images/amendments-diff.png rename to site/src/assets/screenshots/amendments-diff.png diff --git a/site/images/amendments-impact.png b/site/src/assets/screenshots/amendments-impact.png similarity index 100% rename from site/images/amendments-impact.png rename to site/src/assets/screenshots/amendments-impact.png diff --git a/site/images/anomalies.png b/site/src/assets/screenshots/anomalies.png similarity index 100% rename from site/images/anomalies.png rename to site/src/assets/screenshots/anomalies.png diff --git a/site/images/approval-queue.png b/site/src/assets/screenshots/approval-queue.png similarity index 100% rename from site/images/approval-queue.png rename to site/src/assets/screenshots/approval-queue.png diff --git a/site/images/audit-trail.png b/site/src/assets/screenshots/audit-trail.png similarity index 100% rename from site/images/audit-trail.png rename to site/src/assets/screenshots/audit-trail.png diff --git a/site/images/blinded-entry.png b/site/src/assets/screenshots/blinded-entry.png similarity index 100% rename from site/images/blinded-entry.png rename to site/src/assets/screenshots/blinded-entry.png diff --git a/site/images/blinded-field.png b/site/src/assets/screenshots/blinded-field.png similarity index 100% rename from site/images/blinded-field.png rename to site/src/assets/screenshots/blinded-field.png diff --git a/site/images/break-blind.png b/site/src/assets/screenshots/break-blind.png similarity index 100% rename from site/images/break-blind.png rename to site/src/assets/screenshots/break-blind.png diff --git a/site/images/coding.png b/site/src/assets/screenshots/coding.png similarity index 100% rename from site/images/coding.png rename to site/src/assets/screenshots/coding.png diff --git a/site/images/dynamic-fields.png b/site/src/assets/screenshots/dynamic-fields.png similarity index 100% rename from site/images/dynamic-fields.png rename to site/src/assets/screenshots/dynamic-fields.png diff --git a/site/images/form-entry.png b/site/src/assets/screenshots/form-entry.png similarity index 100% rename from site/images/form-entry.png rename to site/src/assets/screenshots/form-entry.png diff --git a/site/images/lab-import.png b/site/src/assets/screenshots/lab-import.png similarity index 100% rename from site/images/lab-import.png rename to site/src/assets/screenshots/lab-import.png diff --git a/site/images/login.png b/site/src/assets/screenshots/login.png similarity index 100% rename from site/images/login.png rename to site/src/assets/screenshots/login.png diff --git a/site/images/notifications-bell.png b/site/src/assets/screenshots/notifications-bell.png similarity index 100% rename from site/images/notifications-bell.png rename to site/src/assets/screenshots/notifications-bell.png diff --git a/site/images/protocol-review.png b/site/src/assets/screenshots/protocol-review.png similarity index 100% rename from site/images/protocol-review.png rename to site/src/assets/screenshots/protocol-review.png diff --git a/site/images/queries.png b/site/src/assets/screenshots/queries.png similarity index 100% rename from site/images/queries.png rename to site/src/assets/screenshots/queries.png diff --git a/site/images/repeating-entry.png b/site/src/assets/screenshots/repeating-entry.png similarity index 100% rename from site/images/repeating-entry.png rename to site/src/assets/screenshots/repeating-entry.png diff --git a/site/images/rtsm-panel.png b/site/src/assets/screenshots/rtsm-panel.png similarity index 100% rename from site/images/rtsm-panel.png rename to site/src/assets/screenshots/rtsm-panel.png diff --git a/site/images/rules-panel.png b/site/src/assets/screenshots/rules-panel.png similarity index 100% rename from site/images/rules-panel.png rename to site/src/assets/screenshots/rules-panel.png diff --git a/site/images/rules-syntax-error.png b/site/src/assets/screenshots/rules-syntax-error.png similarity index 100% rename from site/images/rules-syntax-error.png rename to site/src/assets/screenshots/rules-syntax-error.png diff --git a/site/images/sign-form.png b/site/src/assets/screenshots/sign-form.png similarity index 100% rename from site/images/sign-form.png rename to site/src/assets/screenshots/sign-form.png diff --git a/site/images/site-forms-editor.png b/site/src/assets/screenshots/site-forms-editor.png similarity index 100% rename from site/images/site-forms-editor.png rename to site/src/assets/screenshots/site-forms-editor.png diff --git a/site/images/snapshot-exports.png b/site/src/assets/screenshots/snapshot-exports.png similarity index 100% rename from site/images/snapshot-exports.png rename to site/src/assets/screenshots/snapshot-exports.png diff --git a/site/images/studies.png b/site/src/assets/screenshots/studies.png similarity index 100% rename from site/images/studies.png rename to site/src/assets/screenshots/studies.png diff --git a/site/images/study-builder-edit.png b/site/src/assets/screenshots/study-builder-edit.png similarity index 100% rename from site/images/study-builder-edit.png rename to site/src/assets/screenshots/study-builder-edit.png diff --git a/site/images/study-builder.png b/site/src/assets/screenshots/study-builder.png similarity index 100% rename from site/images/study-builder.png rename to site/src/assets/screenshots/study-builder.png diff --git a/site/images/study-overview.png b/site/src/assets/screenshots/study-overview.png similarity index 100% rename from site/images/study-overview.png rename to site/src/assets/screenshots/study-overview.png diff --git a/site/images/subject-lifecycle.png b/site/src/assets/screenshots/subject-lifecycle.png similarity index 100% rename from site/images/subject-lifecycle.png rename to site/src/assets/screenshots/subject-lifecycle.png diff --git a/site/images/subject-matrix.png b/site/src/assets/screenshots/subject-matrix.png similarity index 100% rename from site/images/subject-matrix.png rename to site/src/assets/screenshots/subject-matrix.png diff --git a/site/images/team.png b/site/src/assets/screenshots/team.png similarity index 100% rename from site/images/team.png rename to site/src/assets/screenshots/team.png diff --git a/site/images/users-admin.png b/site/src/assets/screenshots/users-admin.png similarity index 100% rename from site/images/users-admin.png rename to site/src/assets/screenshots/users-admin.png diff --git a/site/images/workbench-python.png b/site/src/assets/screenshots/workbench-python.png similarity index 100% rename from site/images/workbench-python.png rename to site/src/assets/screenshots/workbench-python.png diff --git a/site/images/workbench-r.png b/site/src/assets/screenshots/workbench-r.png similarity index 100% rename from site/images/workbench-r.png rename to site/src/assets/screenshots/workbench-r.png diff --git a/site/images/workbench-sql.png b/site/src/assets/screenshots/workbench-sql.png similarity index 100% rename from site/images/workbench-sql.png rename to site/src/assets/screenshots/workbench-sql.png diff --git a/site/src/components/Footer.astro b/site/src/components/Footer.astro new file mode 100644 index 0000000..cab3ce1 --- /dev/null +++ b/site/src/components/Footer.astro @@ -0,0 +1,18 @@ +--- +import Default from "@astrojs/starlight/components/Footer.astro"; +--- + + + + + diff --git a/site/src/content.config.ts b/site/src/content.config.ts new file mode 100644 index 0000000..7fbcf2c --- /dev/null +++ b/site/src/content.config.ts @@ -0,0 +1,7 @@ +import { defineCollection } from "astro:content"; +import { docsLoader } from "@astrojs/starlight/loaders"; +import { docsSchema } from "@astrojs/starlight/schema"; + +export const collections = { + docs: defineCollection({ loader: docsLoader(), schema: docsSchema() }), +}; diff --git a/site/compliance.qmd b/site/src/content/docs/compliance.md similarity index 96% rename from site/compliance.qmd rename to site/src/content/docs/compliance.md index 02f4ef4..1776bb9 100644 --- a/site/compliance.qmd +++ b/site/src/content/docs/compliance.md @@ -2,8 +2,8 @@ title: "Compliance" --- -::: {.callout-important} -## What a product can and can't claim + +:::danger[What a product can and can't claim] No software is "Part 11 compliant" on its own: compliance belongs to the sponsor's validated implementation, SOPs, and training. edc-core's job is to @@ -76,7 +76,7 @@ running system. ## Data lifecycle procedures -Requirements alone don't run a trial. The [data lifecycle](data-lifecycle.qmd) +Requirements alone don't run a trial. The [data lifecycle](/edc-core/data-lifecycle/) page walks ICH E6(R3) §4.2 element by element, from capture and audit trails through corrections, transfer, finalisation, retention, and destruction. For each, it separates what the system enforces by construction from what belongs diff --git a/site/data-lifecycle.qmd b/site/src/content/docs/data-lifecycle.md similarity index 85% rename from site/data-lifecycle.qmd rename to site/src/content/docs/data-lifecycle.md index 5b5a327..128a18e 100644 --- a/site/data-lifecycle.qmd +++ b/site/src/content/docs/data-lifecycle.md @@ -2,14 +2,14 @@ title: "Data lifecycle" --- + ICH E6(R3) §4.2 is blunt: "Procedures should be in place to cover the full data life cycle." This page is that map for edc-core: for each lifecycle element (§4.2.1–4.2.8), what the system enforces by construction, and what remains yours to write into SOPs and the data management plan. It is the procedures companion to traceability row E6-01. -::: {.callout-important} -## Mechanisms are not procedures +:::danger[Mechanisms are not procedures] edc-core can make a control *impossible to skip* (an audit trail with no off switch) or *cheap to follow* (a query dashboard). It cannot decide how much @@ -25,20 +25,20 @@ units, and edit checks are defined in CDISC ODM, versioned as immutable metadata versions, and every subject is pinned to a specific build, so "what were we collecting, and how was it checked, on this date?" is a lookup, not an archaeology project. Changes arrive as -[amendments](guide/study-builds.qmd), with deliberate, audited migration of +[amendments](/edc-core/guide/study-builds/), with deliberate, audited migration of existing subjects. §4.2.1(c) asks for automated validation checks whose implementation is "controlled and documented". In edc-core, edit checks live *inside* the versioned build: they fire on every accepted write, raise system -[queries](guide/review.qmd) when violated, and auto-close when the data is +[queries](/edc-core/guide/review/) when violated, and auto-close when the data is corrected. Changing a check is a metadata amendment: versioned, audited, and diffable, which is the control and the documentation. Every captured value carries its metadata (§4.2.1(b)): who wrote it, when, against which build, and by which path: manual entry, [lab -import](guide/lab-import.qmd) (`item_value.imported`), or [RTSM -integration](guide/rtsm-integration.qmd) (`item_value.integrated`). +import](/edc-core/guide/lab-import/) (`item_value.imported`), or [RTSM +integration](/edc-core/guide/rtsm-integration/) (`item_value.integrated`). **Yours to decide:** the extent of transcription verification for data transcribed from paper or EHR sources (§4.2.1(a)) is a risk-based call on @@ -52,7 +52,7 @@ turned off: - **User account history** (§4.2.2(a)(i)): account creation, activation changes, role grants and revocations are audit events; every API request - additionally lands in the [access log](guide/user-admin.qmd). + additionally lands in the [access log](/edc-core/guide/user-admin/). - **Data changes** (§4.2.2(a)(ii)): initial entry and every subsequent change or removal are separate versions with actor, timestamp, prior value, and, for corrections, a required reason for change. @@ -75,7 +75,7 @@ Timestamps are recorded server-side at write time and exported unambiguously **Yours to decide:** which metadata require routine review and how long the operational access log is kept (§4.2.2(e)); see [log -retention](deployment.qmd#access-logging-and-log-retention) for the +retention](/edc-core/deployment/#access-logging-and-log-retention) for the distinction between prunable telemetry and the never-pruned audit trail. ## Review of data and metadata (§4.2.3) @@ -85,10 +85,10 @@ built: | Review | Where | |---|---| -| Data review | [Query dashboard](guide/review.qmd): open/answered/closed lifecycle, manual and system-raised, monitor reopen | +| Data review | [Query dashboard](/edc-core/guide/review/): open/answered/closed lifecycle, manual and system-raised, monitor reopen | | Audit trail review | `/studies/:id/audit`: filter by action, entity, actor, time; export CSV (`audit.review`-gated) | -| Access review | [Access log](guide/user-admin.qmd) with CSV export | -| Security events | [Anomaly review](deployment.qmd#security-anomaly-detection) with audited acknowledgement | +| Access review | [Access log](/edc-core/guide/user-admin/) with CSV export | +| Security events | [Anomaly review](/edc-core/deployment/#security-anomaly-detection) with audited acknowledgement | **Yours to decide:** frequency, sampling, responsibility, and escalation, risk-based, adapted to the trial, and adjusted on experience, per §4.2.3. @@ -109,15 +109,15 @@ happened, not whether your source documents agree. ## Transfer, exchange and migration (§4.2.5) -Inbound transfers ([lab CSV](guide/lab-import.qmd), -[RTSM](guide/rtsm-integration.qmd)) go through the same audited write path +Inbound transfers ([lab CSV](/edc-core/guide/lab-import/), +[RTSM](/edc-core/guide/rtsm-integration/)) go through the same audited write path as manual entry and **never overwrite**: identical replays are idempotent, conflicting values are reported and not written. Every RTSM post, including rejects, lands in an append-only event record, and every import run keeps its row-level report; both are your reconciliation basis. Outbound, exports are Dataset-JSON v1.1 and CSV pinned to immutable -[snapshots](guide/analytics.qmd): the same snapshot version re-reads +[snapshots](/edc-core/guide/analytics/): the same snapshot version re-reads identically forever, so a transfer can be reconciled against its exact source at any later date. @@ -130,14 +130,14 @@ any migration. The path to a defensible database lock, in system terms: 1. Resolve open queries (the dashboard shows the study-wide count). -2. Complete [medical coding](guide/medical-coding.qmd) from the work queue. +2. Complete [medical coding](/edc-core/guide/medical-coding/) from the work queue. 3. Walk forms through the workflow: `complete`, `verified` where your plan requires it, investigator-`signed`, then `locked`, which restricts edit access exactly as §3.16.1(r) expects before final analysis. 4. Publish a snapshot: an immutable, version-pinned dataset that interim or final analysis references (traceability row E6-07). -Analysis-side, [workbench](guide/analytics.qmd) SQL, R, and Python executions +Analysis-side, [workbench](/edc-core/guide/analytics/) SQL, R, and Python executions record their snapshot version, full code, logs, and outputs; data extraction is documented by construction (§4.2.6(c)). @@ -153,7 +153,7 @@ metadata for every build, Dataset-JSON and CSV data pinned to a snapshot, the complete audit trail as CSV, the signature manifest, and per-subject PDF casebooks, retrievable and human-readable long after the running system is gone. In-system, records are protected by role-based access, the append-only -audit trail, and the [deployment controls](deployment.qmd) (TLS, encrypted +audit trail, and the [deployment controls](/edc-core/deployment/) (TLS, encrypted volumes, paired database + lake backups sized to your retention period). **Yours to decide:** the retention period itself (per study, per applicable @@ -195,11 +195,11 @@ Two governance topics sit beside the lifecycle elements: Assessing an unplanned unblinding's impact on trial results (§4.1.4) is yours to decide and document. - **Computerised systems** (§4.3): validation evidence ships per release as - the [validation pack](compliance.qmd); security controls, backup, and - monitoring are the [deployment page](deployment.qmd). Training (§4.3.2) + the [validation pack](/edc-core/compliance/); security controls, backup, and + monitoring are the [deployment page](/edc-core/deployment/). Training (§4.3.2) and your documented procedures for system use (§4.3.1) are organizational; this user guide is raw material for them, not a substitute. Section references are to the ICH E6(R3) guideline (adopted January 2025), Annex 1; the requirement-by-requirement map with test evidence is the -[traceability matrix](compliance.qmd). +[traceability matrix](/edc-core/compliance/). diff --git a/site/deployment.qmd b/site/src/content/docs/deployment.md similarity index 96% rename from site/deployment.qmd rename to site/src/content/docs/deployment.md index 9d5df09..6bfb55a 100644 --- a/site/deployment.qmd +++ b/site/src/content/docs/deployment.md @@ -2,6 +2,7 @@ title: "Deployment" --- + Two compose files live in `infra/`. `compose.yaml` is the **local development stack**: hard-coded database password, no TLS, every service port published to the host. `compose.prod.yaml` is the **supported @@ -28,18 +29,16 @@ the compose file. Two profiles cover the supported variations at a managed PostgreSQL, and drop `engines` on small hosts that don't use the analytics workbench. -::: {.callout-warning} -## One API instance, always +:::caution[One API instance, always] The notification and anomaly scheduler runs inside the API process and assumes a single instance. Never scale the `api` service past one replica; run a bigger VM instead. See [ADR-0011](https://github.com/tgerke/edc-core/blob/main/docs/adr/0011-single-vm-deployment-and-iac.md). ::: -To provision the VM itself, see [Installation](installation.qmd). +To provision the VM itself, see [Installation](/edc-core/installation/). -::: {.callout-note} -## Pseudonymized is not anonymous +:::note[Pseudonymized is not anonymous] edc-core keeps direct identifiers out of clinical tables by construction: subjects exist as keys, and the site holds the link to the person. Under GDPR @@ -86,7 +85,7 @@ they must never be reachable from outside the container network. With a proxy in front, the API sees the proxy's address unless you tell it which proxies to trust: set `EDC_TRUST_PROXY` on the API container (`1` for a single proxy layer you control, a hop count or address/CIDR list for -multi-hop setups) so the [access log](guide/user-admin.qmd), session +multi-hop setups) so the [access log](/edc-core/guide/user-admin/), session records, and IP-change audit events carry the real client address from `X-Forwarded-For`. Leave it **unset when no proxy is in front**: trusting the header without a proxy lets any client forge the address that lands in @@ -211,7 +210,7 @@ Before first real use. Items marked *(wired)* are already handled by - [ ] Review the authentication knobs against your SOPs (`EDC_SESSION_IDLE_MINUTES`, `EDC_SESSION_ABSOLUTE_HOURS`, `EDC_PASSWORD_MIN_LENGTH`, `EDC_MAX_FAILED_LOGINS`, `EDC_LOCKOUT_MINUTES`; - see [Installation](installation.qmd) for SSO). + see [Installation](/edc-core/installation/) for SSO). - [ ] A decision on user-agent-strict session binding. It is on by default (a session presented by a different client is revoked). Set `EDC_SESSION_UA_STRICT=0` only where UA churn is legitimate (managed @@ -220,9 +219,9 @@ Before first real use. Items marked *(wired)* are already handled by than revoked (anomaly detection still sees them); record the choice in your SOPs. - [ ] One API instance only: the notification scheduler assumes it (see - [Installation](installation.qmd)). + [Installation](/edc-core/installation/)). - [ ] Pin image tags to a released version; each release ships with its - [validation pack](compliance.qmd). + [validation pack](/edc-core/compliance/). - [ ] An `access_log` retention job, and a decision recorded for how long you keep it. - [ ] Anomaly thresholds reviewed (`EDC_ANOMALY_FAILED_LOGIN_THRESHOLD`, diff --git a/site/glossary.qmd b/site/src/content/docs/glossary.md similarity index 76% rename from site/glossary.qmd rename to site/src/content/docs/glossary.md index d9ea089..751bb4e 100644 --- a/site/glossary.qmd +++ b/site/src/content/docs/glossary.md @@ -2,6 +2,7 @@ title: "Glossary" --- + Clinical data management has a vocabulary problem: half its terms come from regulation, half from CDISC standards, and the rest from whatever the last EDC vendor called things. This page defines the terms as edc-core uses them, @@ -9,30 +10,30 @@ in plain language, with a link to the guide page that treats each one fully. **Amendment.** A mid-study change to the study definition, made as a new immutable build followed by an explicit, audited migration of in-flight -forms. See [Mid-study amendments](guide/amendments.qmd). +forms. See [Mid-study amendments](/edc-core/guide/amendments/). **Audit trail.** The permanent record of every create, change, and state transition in a study: who, when, what changed, and why. In edc-core the audit tables are append-only at the database level, so history cannot be -rewritten. See [Review workflows](guide/review.qmd#audit-trail-review). +rewritten. See [Review workflows](/edc-core/guide/review/#audit-trail-review). **Biomedical concept.** A CDISC-defined unit of clinical meaning ("systolic blood pressure") that a protocol schedules and a build turns into concrete -fields. Used by the [protocol import](guide/protocol-import.qmd) path. +fields. Used by the [protocol import](/edc-core/guide/protocol-import/) path. **Blinded item.** A field flagged so that only roles with the `data.unblind` permission can see its value; everyone else sees a locked, masked field. Typically the treatment arm in a blinded trial. See -[Blinding](guide/blinding.qmd). +[Blinding](/edc-core/guide/blinding/). **Build** (also *study build*, *metadata version*). A versioned, immutable snapshot of the study definition: events, forms, item groups, items, codelists, and rules, shaped as CDISC ODM. Everything the system renders -comes from a build. See [Study builds](guide/study-builds.qmd). +comes from a build. See [Study builds](/edc-core/guide/study-builds/). **Casebook.** A PDF rendering of one subject's complete captured data: current values, correction markers, queries, and the signature manifest. -See [Exports and the study archive](guide/exports-and-archive.qmd). +See [Exports and the study archive](/edc-core/guide/exports-and-archive/). **CDASH.** CDISC's standard for how data collection fields should be named and structured on CRFs. The demo study's forms are CDASH-aligned. @@ -48,48 +49,48 @@ across forms. **ConditionDef.** The ODM construct holding a named true/false expression. edc-core uses ConditionDefs for both edit checks and skip logic; which job one does depends on where it is referenced. See -[Rules and derivations](guide/rules-and-derivations.qmd). +[Rules and derivations](/edc-core/guide/rules-and-derivations/). **CRF / eCRF.** Case report form: the form on which a subject's study data is collected, "e" for electronic. In edc-core, CRFs render directly from the -build's metadata. See [Data capture](guide/data-capture.qmd). +build's metadata. See [Data capture](/edc-core/guide/data-capture/). **Cross-form check.** An edit check that reads the subject's other forms by qualifying item OIDs with a form OID (`` `FO.DM`.`IT.VISDT` ``). It fires on writes to any form it reads, and its query opens on its home form. See -[Rules and derivations](guide/rules-and-derivations.qmd#cross-form-checks). +[Rules and derivations](/edc-core/guide/rules-and-derivations/#cross-form-checks). **Data-equivalence.** The machine-checked property that a site's custom form layout collects exactly the same fields as the sponsor's build, with at -least the same required flags. See [Site form layouts](guide/site-forms.qmd). +least the same required flags. See [Site form layouts](/edc-core/guide/site-forms/). **Dataset-JSON.** The CDISC exchange format (v1.1) for tabular study data, accepted by FDA. One of the three snapshot export formats. See -[Exports and the study archive](guide/exports-and-archive.qmd). +[Exports and the study archive](/edc-core/guide/exports-and-archive/). **Derived value.** A field the server computes from other answers (BMI from height and weight) instead of accepting entry. Stored through the audited write path and permanently marked as derived. See -[Rules and derivations](guide/rules-and-derivations.qmd). +[Rules and derivations](/edc-core/guide/rules-and-derivations/). **Dictionary.** A licensed medical coding vocabulary loaded into edc-core: MedDRA for adverse events, WHODrug for medications. See -[Medical coding](guide/medical-coding.qmd). +[Medical coding](/edc-core/guide/medical-coding/). **Edit check.** A rule that inspects saved data and flags implausible or inconsistent values (systolic below 70, end date before start date). A failing check warns during entry and opens a system query on save. See -[Rules and derivations](guide/rules-and-derivations.qmd). +[Rules and derivations](/edc-core/guide/rules-and-derivations/). **Electronic signature.** A signature applied inside the system, requiring credential re-entry at the moment of signing and bound by hash to the exact record versions signed. See -[Review workflows](guide/review.qmd#electronic-signatures-21-cfr-part-11). +[Review workflows](/edc-core/guide/review/#electronic-signatures-21-cfr-part-11). **eTMF.** Electronic trial master file: the system holding a trial's essential documents. edc-core can file build definitions and snapshot manifests into an external eTMF automatically. See -[Exports and the study archive](guide/exports-and-archive.qmd#automatic-etmf-filing). +[Exports and the study archive](/edc-core/guide/exports-and-archive/#automatic-etmf-filing). **Event** (also *visit*). A scheduled point in the study (screening, week 4) that groups the forms collected there. Columns in the subject matrix. @@ -100,7 +101,7 @@ records the build version it was captured under. **ICH E6(R3).** The ICH harmonised guideline for Good Clinical Practice, adopted January 2025: the international ethical, scientific, and quality -standard for conducting clinical trials. [Compliance](compliance.qmd) +standard for conducting clinical trials. [Compliance](/edc-core/compliance/) describes how edc-core maps to it. **Item / ItemDef.** A single collected field ("What was the systolic blood @@ -118,26 +119,26 @@ they travel with the study definition. **Lake.** The per-study analytics store (DuckLake: Parquet files cataloged in Postgres) that snapshots publish into. The workbench queries the lake, -never live capture tables. See [Analytics workbench](guide/analytics.qmd). +never live capture tables. See [Analytics workbench](/edc-core/guide/analytics/). **Listing.** A workbench query or script whose result rows are data-cleaning findings: subjects with missing visits, out-of-window dates, values that disagree across forms. Listing rows can be turned into manual queries in bulk. See -[From listings to queries](guide/analytics.qmd#from-listings-to-queries). +[From listings to queries](/edc-core/guide/analytics/#from-listings-to-queries). **MedDRA.** The Medical Dictionary for Regulatory Activities, the licensed terminology used to code adverse events. See -[Medical coding](guide/medical-coding.qmd). +[Medical coding](/edc-core/guide/medical-coding/). **MethodDef.** The ODM construct holding a computation. An item that references a MethodDef is a derived value. See -[Rules and derivations](guide/rules-and-derivations.qmd). +[Rules and derivations](/edc-core/guide/rules-and-derivations/). **ODM.** CDISC's Operational Data Model, the standard format for study definitions and clinical data. edc-core's builds are ODM v2.0 documents (XML or JSON), importable and exportable at any time. See -[Study builds](guide/study-builds.qmd). +[Study builds](/edc-core/guide/study-builds/). **Parquet.** A compressed columnar file format common in analytics tooling. One of the three snapshot export formats, and the storage format of the lake. @@ -145,13 +146,13 @@ One of the three snapshot export formats, and the storage format of the lake. **Part 11** (21 CFR Part 11). FDA's regulation on electronic records and electronic signatures: the conditions under which they are trustworthy and equivalent to paper records and handwritten signatures. -[Compliance](compliance.qmd) describes how edc-core maps to it, and what no +[Compliance](/edc-core/compliance/) describes how edc-core maps to it, and what no software can claim on its own. **Query.** A threaded conversation attached to a form or item questioning the data. *System queries* open and close automatically with edit checks; *manual queries* are opened by reviewers and answered by sites. See -[Review workflows](guide/review.qmd#queries). +[Review workflows](/edc-core/guide/review/#queries). **Reason for change.** The explanation required whenever a saved value is modified. Stored with the old and new value in the audit trail. @@ -159,49 +160,49 @@ modified. Stored with the old and new value in the audit trail. **Repeating item group.** An item group collected multiple times within one form (several blood-pressure readings in one visit), each occurrence stored and checked independently. See -[Data capture](guide/data-capture.qmd#repeating-item-groups). +[Data capture](/edc-core/guide/data-capture/#repeating-item-groups). **RTSM / IRT.** Randomization and trial supply management (also called interactive response technology): the external system that randomizes subjects. edc-core receives its arm assignments; it never randomizes. See -[RTSM integration](guide/rtsm-integration.qmd). +[RTSM integration](/edc-core/guide/rtsm-integration/). **SDV** (source data verification). A monitor's comparison of entered data against source records, recorded in edc-core as the *verified* workflow -state. See [Review workflows](guide/review.qmd#source-data-verification). +state. See [Review workflows](/edc-core/guide/review/#source-data-verification). **Site form layout.** A site's approved rearrangement of the sponsor's forms: same fields, different grouping, order, and wording. See -[Site form layouts](guide/site-forms.qmd). +[Site form layouts](/edc-core/guide/site-forms/). **Skip logic.** A rule that marks a field or section as *not collected* while a condition is true, so the pregnancy-test question disappears when sex is recorded male. Authored on the -[rules page](guide/rules-and-derivations.qmd); the entry-side behavior is in -[Data capture](guide/data-capture.qmd#conditional-and-computed-fields). +[rules page](/edc-core/guide/rules-and-derivations/); the entry-side behavior is in +[Data capture](/edc-core/guide/data-capture/#conditional-and-computed-fields). **Snapshot.** An immutable, point-in-time publication of a study's data into typed analytics tables. Analyses and locks reference a snapshot ID and reproduce identically forever. See -[Analytics workbench](guide/analytics.qmd#snapshots). +[Analytics workbench](/edc-core/guide/analytics/#snapshots). **Subject lifecycle status.** A subject's disposition: screening, enrolled, screen failed, completed, or withdrawn, with reinstatement as the correction path. Distinct from form workflow states. See -[Data capture](guide/data-capture.qmd#subject-lifecycle). +[Data capture](/edc-core/guide/data-capture/#subject-lifecycle). **USDM.** CDISC's Unified Study Definitions Model, a machine-readable protocol format. edc-core compiles a USDM v4 package into a candidate study -build. See [Protocol import](guide/protocol-import.qmd). +build. See [Protocol import](/edc-core/guide/protocol-import/). **Verbatim term.** The term exactly as the site reported it ("stomach ake"), kept unchanged while coding attaches the standardized dictionary term beside -it. See [Medical coding](guide/medical-coding.qmd). +it. See [Medical coding](/edc-core/guide/medical-coding/). **WHODrug.** The licensed drug dictionary from the Uppsala Monitoring Centre, used to code medications. See -[Medical coding](guide/medical-coding.qmd). +[Medical coding](/edc-core/guide/medical-coding/). **Workflow state.** A form instance's position in the server-enforced state machine: `not started → in progress → complete → verified → signed → -locked`. See [Data capture](guide/data-capture.qmd#workflow-states). +locked`. See [Data capture](/edc-core/guide/data-capture/#workflow-states). diff --git a/site/guide/amendments.qmd b/site/src/content/docs/guide/amendments.md similarity index 84% rename from site/guide/amendments.qmd rename to site/src/content/docs/guide/amendments.md index e103a2c..18c66a9 100644 --- a/site/guide/amendments.qmd +++ b/site/src/content/docs/guide/amendments.md @@ -2,6 +2,7 @@ title: "Mid-study amendments" --- + Protocols change after first patient in. In edc-core an amendment is not an edit to the live study: it is a **new immutable build**, followed by an explicit, previewable **migration** of in-flight forms. Nothing moves @@ -22,9 +23,9 @@ AMD-002) already have entered data. Then protocol amendment 1 lands: - oxygen saturation (SpO2) is added, with a plausible-range edit check. Step zero is producing build v2, by any of the -[usual paths](study-builds.qmd): import the amended ODM file, edit v1 in +[usual paths](/edc-core/guide/study-builds/): import the amended ODM file, edit v1 in the visual builder and save, or re-import an amended -[protocol package](protocol-import.qmd). The moment a study has two or +[protocol package](/edc-core/guide/protocol-import/). The moment a study has two or more builds, an **Amendments** panel appears on its study page. ## Step 1: read the diff @@ -33,7 +34,7 @@ The panel compares any earlier build against the latest, grouped by what changed: items added, removed, or changed (data type, codelist, length, mandatory flag), edit checks, events, forms, and codelists. -![](../images/amendments-diff.png){.screenshot fig-alt="The Amendments panel diffing build v1 against v2: weight removed, oxygen saturation added, and a new edit check"} +![The Amendments panel diffing build v1 against v2: weight removed, oxygen saturation added, and a new edit check](../../../assets/screenshots/amendments-diff.png) Read it the way a reviewer would: does the diff say exactly what the protocol amendment says, and nothing else? A surprise entry here (a @@ -53,7 +54,7 @@ changes, which is why keeping identifiers stable across versions matters. - values that will **not cast** to a changed data type; - which **checks will re-run** after migration. -![](../images/amendments-impact.png){.screenshot fig-alt="The impact report: two forms will migrate, entered weight values become orphaned, and the new SpO2 check will re-run"} +![The impact report: two forms will migrate, entered weight values become orphaned, and the new SpO2 check will re-run](../../../assets/screenshots/amendments-impact.png) This report is the amendment's data-management review in one screen. In the demo: both subjects' forms are eligible, their weight values will be @@ -97,17 +98,17 @@ An amendment touches more than forms: still-equivalent layouts carry forward with an audited note, while a layout the amendment broke goes **stale** and capture falls back to standard forms until the site resubmits. See - [Site form layouts](site-forms.qmd#amendments). + [Site form layouts](/edc-core/guide/site-forms/#amendments). - **Protocol-derived builds** amend by importing the amended protocol as a new protocol version and publishing the next build; the migration tooling from there is identical. See - [Protocol import](protocol-import.qmd#amendments). + [Protocol import](/edc-core/guide/protocol-import/#amendments). - **Analytics snapshots** are unaffected by design: each snapshot is pinned to the data and builds as they stood at publish time, so analyses against pre-amendment snapshots reproduce forever. - **Lab-import mappings** that reference a removed item start failing loudly at validation, which is the intended signal to update the - mapping. See [Lab data import](lab-import.qmd). + mapping. See [Lab data import](/edc-core/guide/lab-import/). ## What leadership should expect to see @@ -122,9 +123,9 @@ doing the work. ## Where next -- [Study builds](study-builds.qmd): the versioning model amendments build +- [Study builds](/edc-core/guide/study-builds/): the versioning model amendments build on. -- [Rules and derivations](rules-and-derivations.qmd): what changing a +- [Rules and derivations](/edc-core/guide/rules-and-derivations/): what changing a check mid-study means. -- [Data capture](data-capture.qmd#workflow-states): the workflow states +- [Data capture](/edc-core/guide/data-capture/#workflow-states): the workflow states that decide migration eligibility. diff --git a/site/guide/analytics.qmd b/site/src/content/docs/guide/analytics.md similarity index 94% rename from site/guide/analytics.qmd rename to site/src/content/docs/guide/analytics.md index a3a4b65..0ba1428 100644 --- a/site/guide/analytics.qmd +++ b/site/src/content/docs/guide/analytics.md @@ -2,6 +2,7 @@ title: "Analytics workbench" --- + Most EDC systems make operational reporting a vendor-locked afterthought. edc-core gives data managers **real SQL, R, and Python, inside the EDC**, against versioned, analysis-ready study datasets. @@ -24,7 +25,7 @@ snapshot ID and are reproducible indefinitely, even as capture continues. Pick a snapshot, browse its tables and columns in the schema panel, and query with DuckDB SQL: -![](../images/workbench-sql.png){.screenshot fig-alt="SQL workbench"} +![SQL workbench](../../../assets/screenshots/workbench-sql.png) Every run executes in a locked-down, read-only session that can only see the selected study's snapshot (isolation is physical, at attach time, not a @@ -52,11 +53,11 @@ browser; scripts can be **saved and versioned** per study, and the execution history (code, logs, outputs, who and when) is retained and audited. This directly serves ICH E6(R3)'s expectation of traceable data transformations. -![](../images/workbench-r.png){.screenshot fig-alt="R workbench with execution history"} +![R workbench with execution history](../../../assets/screenshots/workbench-r.png) -![](../images/workbench-python.png){.screenshot fig-alt="Python workbench with a pandas result grid"} +![Python workbench with a pandas result grid](../../../assets/screenshots/workbench-python.png) -::: {.callout-note} +:::note The workbench is for *operational* analytics: data cleaning status, accrual, query aging, dataset review. It is deliberately not a validated statistical compute environment: statistical deliverables should be produced in your @@ -106,7 +107,6 @@ shows exactly why it will skip: | `site_forbidden` | `query.manage` is checked per target's site, so a site-scoped reviewer gets skips for other sites' rows rather than a failed batch. | | `form_locked` | Locked forms take no new queries. | -: {tbl-colwidths="[30,70]"} **Snapshot evidence, live targets.** The sandbox boundary does not move for this feature: engines still read only snapshots. What changes is that the @@ -119,7 +119,7 @@ silently queried. The endpoint also accepts `force`, which waives only the though the value moved. **What comes out is ordinary queries.** Created queries enter the normal -[query lifecycle](review.qmd#queries): same threads, same dashboard, same +[query lifecycle](/edc-core/guide/review/#queries): same threads, same dashboard, same site workflow. What they add is provenance: each records the workbench execution it came from, and its `query.opened` audit event carries the batch, execution, snapshot, lake version, and the script and script version @@ -137,7 +137,7 @@ the **study archive** bundles the whole study (every build's ODM, all datasets, the audit trail, signatures, casebooks) into one self-contained zip. When to use which format, what a casebook contains, and what the archive is for are covered on -[Exports, casebooks, and the study archive](exports-and-archive.qmd). +[Exports, casebooks, and the study archive](/edc-core/guide/exports-and-archive/). ## Permissions diff --git a/site/guide/blinding.qmd b/site/src/content/docs/guide/blinding.md similarity index 82% rename from site/guide/blinding.qmd rename to site/src/content/docs/guide/blinding.md index fabe772..2bfecf9 100644 --- a/site/guide/blinding.qmd +++ b/site/src/content/docs/guide/blinding.md @@ -2,6 +2,7 @@ title: "Blinding" --- + In a blinded trial, some values (most often the treatment arm) must be invisible to some people while staying real, versioned, audited data. In edc-core, blinding is a flag on the item definition, enforced everywhere @@ -35,12 +36,12 @@ the administered dose. The site coordinator, holding `data.unblind` as an entry role, sees a normal form; entering a dose next to a visible arm feels like entering anything else: -![](../images/blinded-entry.png){.screenshot fig-alt="The dosing form as the site coordinator sees it: the assigned arm is visible alongside the dose fields"} +![The dosing form as the site coordinator sees it: the assigned arm is visible alongside the dose fields](../../../assets/screenshots/blinded-entry.png) The monitor opens the same form and sees the item's presence and entry status, but never its value: -![](../images/blinded-field.png){.screenshot fig-alt="The same dosing form as the monitor sees it: the arm field is locked and shows a blinded placeholder instead of the value"} +![The same dosing form as the monitor sees it: the arm field is locked and shows a blinded placeholder instead of the value](../../../assets/screenshots/blinded-field.png) That is the whole user-facing contract: the blinded reviewer can still verify the form was filled, query it, and see *that* the arm changed in @@ -67,13 +68,13 @@ In the builder, tick **Blinded** on the item; in an ODM file, set other features: - **Arm assignments from an RTSM should land on a blinded item.** The - [RTSM integration](rtsm-integration.qmd) writes through a service + [RTSM integration](/edc-core/guide/rtsm-integration/) writes through a service account whose unblind grant is write-only in practice, so the arm is masked everywhere from the moment it arrives. - **Blinded items are never codable**, and edit checks that reference blinded items must not reveal the value in their message text; the build importer warns about both. See - [Rules and derivations](rules-and-derivations.qmd#pitfalls). + [Rules and derivations](/edc-core/guide/rules-and-derivations/#pitfalls). ## Breaking the blind @@ -83,7 +84,7 @@ matrix: **Break the blind…** on the subject's status menu, taking a category (planned, or unplanned: emergency, inadvertent, other) and a required reason. -![](../images/break-blind.png){.screenshot fig-alt="The subject matrix with the break-the-blind confirmation open: a category selector and required reason before anything is recorded"} +![The subject matrix with the break-the-blind confirmation open: a category selector and required reason before anything is recorded](../../../assets/screenshots/break-blind.png) The action writes an append-only `subject.unblinded` audit event and marks the subject with an **unblinded** badge, and the event prints in the @@ -100,7 +101,7 @@ subject's casebook. Two boundaries are deliberate: ## Governance Access to blinded data is a grant, not a setting. The -[team page](user-admin.qmd#study-teams) shows who holds `data.unblind`, +[team page](/edc-core/guide/user-admin/#study-teams) shows who holds `data.unblind`, at what scope, granted when and by whom; revoking it takes effect immediately. System administrators deliberately have no bypass: without a study role carrying the permission, an administrator sees `[BLINDED]` @@ -111,8 +112,8 @@ unblinding's impact on trial results remains your organization's call. ## Where next -- [RTSM integration](rtsm-integration.qmd): how the arm arrives without a +- [RTSM integration](/edc-core/guide/rtsm-integration/): how the arm arrives without a human ever typing it. -- [Data capture](data-capture.qmd#blinded-items): the entry-side summary. -- [User administration](user-admin.qmd): granting and revoking +- [Data capture](/edc-core/guide/data-capture/#blinded-items): the entry-side summary. +- [User administration](/edc-core/guide/user-admin/): granting and revoking `data.unblind`. diff --git a/site/guide/data-capture.qmd b/site/src/content/docs/guide/data-capture.md similarity index 84% rename from site/guide/data-capture.qmd rename to site/src/content/docs/guide/data-capture.md index f013315..ebd7fe4 100644 --- a/site/guide/data-capture.qmd +++ b/site/src/content/docs/guide/data-capture.md @@ -2,6 +2,7 @@ title: "Data capture" --- + ## The subject matrix Each study's home for site staff is the subject matrix: subjects as rows, @@ -9,7 +10,7 @@ scheduled events and forms as columns, with each cell showing that form's workflow state. Coordinators enroll subjects here and jump straight into entry. -![](../images/subject-matrix.png){.screenshot fig-alt="Subject matrix"} +![Subject matrix](../../../assets/screenshots/subject-matrix.png) Site-scoped roles (coordinator, investigator) see only their site's subjects; study-scoped roles (data manager, monitor) see all sites. @@ -31,14 +32,14 @@ Transitions happen inline on the matrix: the menu next to the subject's badge offers only the moves the current status allows, and terminal moves prompt for their reason before anything is recorded. -![](../images/subject-lifecycle.png){.screenshot fig-alt="The subject matrix with a lifecycle transition in progress: DEMO-003's screen-fail action prompting for a required reason"} +![The subject matrix with a lifecycle transition in progress: DEMO-003's screen-fail action prompting for a required reason](../../../assets/screenshots/subject-lifecycle.png) To walk the whole cycle in the demo: as `demo-coord`, register a new subject with status *screening*, **Enroll** them, then **Withdraw…** with a reason, and finally **Reinstate…** (reason again). Each transition, with its reason and the old and new status, is now in the audit trail, and the matrix badge tracked every step. Each subject's row also offers their -[PDF casebook](analytics.qmd#exports-and-the-study-archive) for download +[PDF casebook](/edc-core/guide/analytics/#exports-and-the-study-archive) for download (with `export.data`). Two deliberate boundaries: @@ -60,11 +61,11 @@ CRFs render directly from the study build's metadata: field types, required flags, units, and codelists all come from the ODM item definitions. Failing edit checks surface immediately as you type, before anything is saved. The exception is a [cross-form -check](rules-and-derivations.qmd#cross-form-checks), which compares against +check](/edc-core/guide/rules-and-derivations/#cross-form-checks), which compares against the subject's other forms: the browser never loads those, so its findings arrive with the save response, marked **checked on save**. -![](../images/form-entry.png){.screenshot fig-alt="Metadata-driven CRF with edit checks and query panel"} +![Metadata-driven CRF with edit checks and query panel](../../../assets/screenshots/form-entry.png) Saving writes each item value as a new immutable version row, in the same database transaction as its audit event. **Changing a saved value requires a @@ -72,13 +73,13 @@ reason for change**, and the previous value is never overwritten; the full version history stays queryable and appears in the audit trail. Values can also arrive in bulk from a central lab's batch file, through the -same audited write path; see [Lab data import](lab-import.qmd). Verbatim +same audited write path; see [Lab data import](/edc-core/guide/lab-import/). Verbatim AE and medication terms entered here are standardized later by data -management; see [Medical coding](medical-coding.qmd). +management; see [Medical coding](/edc-core/guide/medical-coding/). ## Conditional and computed fields -Builds that use [dynamic fields](study-builds.qmd#dynamic-fields) change the +Builds that use [dynamic fields](/edc-core/guide/study-builds/#dynamic-fields) change the form as answers land, evaluated instantly in the browser and re-checked by the server on every write: @@ -102,7 +103,7 @@ server on every write: `item_value.derived`. Entering into a computed field is rejected — on every path, including lab import and RTSM intake. -![](../images/dynamic-fields.png){.screenshot fig-alt="Demographics form where selecting Male hides the pregnancy-test field, and a retained value shows a not-collected badge with a Clear button"} +![Demographics form where selecting Male hides the pregnancy-test field, and a retained value shows a not-collected badge with a Clear button](../../../assets/screenshots/dynamic-fields.png) ## Repeating item groups @@ -114,7 +115,7 @@ opens a system query pinned to that occurrence: fixing occurrence 2 never touches occurrence 1. Analytics snapshots carry the occurrence as `item_group_repeat_key` in the dataset grain. -![](../images/repeating-entry.png){.screenshot fig-alt="Repeating item group with two occurrences and a per-occurrence edit check"} +![Repeating item group with two occurrences and a per-occurrence edit check](../../../assets/screenshots/repeating-entry.png) ## Workflow states @@ -140,7 +141,7 @@ the same mask follows the data into casebooks, audit review, and analytics snapshots. Blinded values are still captured, versioned, and audited normally: blinding scopes *visibility*, not collection. What each role sees, the break-the-blind workflow, and the governance around -`data.unblind` grants are on the [blinding page](blinding.qmd). +`data.unblind` grants are on the [blinding page](/edc-core/guide/blinding/). ## System queries from edit checks @@ -148,8 +149,8 @@ When a saved value fails an edit check, edc-core opens a **system query** on that item automatically. The query thread lives on the form (visible in the screenshot above) and in the study-wide queries dashboard. Correct the data and the system query closes itself; the resolution is audited like everything -else. A [cross-form check](rules-and-derivations.qmd#cross-form-checks) +else. A [cross-form check](/edc-core/guide/rules-and-derivations/#cross-form-checks) follows the same mechanics with one twist: its query opens on the check's home form, so a save on a different form can open or close a query here. Manual queries work the same way; see -[Review workflows](review.qmd). +[Review workflows](/edc-core/guide/review/). diff --git a/site/guide/exports-and-archive.qmd b/site/src/content/docs/guide/exports-and-archive.md similarity index 86% rename from site/guide/exports-and-archive.qmd rename to site/src/content/docs/guide/exports-and-archive.md index 0f8e216..e69ab8e 100644 --- a/site/guide/exports-and-archive.qmd +++ b/site/src/content/docs/guide/exports-and-archive.md @@ -2,6 +2,7 @@ title: "Exports, casebooks, and the study archive" --- + Sooner or later the data has to leave: to biostatistics, to a submission, to a sponsor handover, to a records room that will outlive every vendor contract. edc-core's exit paths are deliberately boring: open formats, @@ -15,7 +16,7 @@ demo). ## Snapshots are the export boundary -Everything exports from a [snapshot](analytics.qmd#snapshots), never from +Everything exports from a [snapshot](/edc-core/guide/analytics/#snapshots), never from live capture tables. That is what makes an export defensible: a snapshot is an immutable, point-in-time dataset, so the file you sent to biostatistics in March re-reads identically in November, no matter how @@ -24,10 +25,10 @@ fresh snapshot; the old one stays. ## Table exports -On the [workbench](analytics.qmd), every snapshot table card offers its +On the [workbench](/edc-core/guide/analytics/), every snapshot table card offers its download links: -![](../images/snapshot-exports.png){.screenshot fig-alt="Workbench table cards with per-table CSV, Parquet, and Dataset-JSON export links against a pinned snapshot"} +![Workbench table cards with per-table CSV, Parquet, and Dataset-JSON export links against a pinned snapshot](../../../assets/screenshots/snapshot-exports.png) Three formats, three audiences: @@ -41,7 +42,7 @@ Three formats, three audiences: Tables are one per ODM item group (`ig_vs`, `ig_ae`, …) plus `subjects`, `queries`, and `codings`, with repeating groups carried as -`item_group_repeat_key`. [Blinded items](blinding.qmd) are absent from +`item_group_repeat_key`. [Blinded items](/edc-core/guide/blinding/) are absent from snapshots by construction, so every export is blinded without anyone remembering to mask a column. @@ -76,7 +77,7 @@ the point: retention obligations run long after any system is decommissioned. Retrieval and retention duties under ICH E6(R3) §4.2.7, and what remains procedural (the retention period itself, storage location, periodic retrieval checks), are covered in the -[data lifecycle](../data-lifecycle.qmd) page. +[data lifecycle](/edc-core/data-lifecycle/) page. For CRO and sponsor leadership evaluating exit risk: this archive *is* the exit path. A study can be handed to a sponsor, a successor CRO, or a @@ -111,8 +112,8 @@ Like all grants, both are per-study and audited. ## Where next -- [Analytics workbench](analytics.qmd): querying snapshots before +- [Analytics workbench](/edc-core/guide/analytics/): querying snapshots before exporting them. -- [Blinding](blinding.qmd): why exports can't leak blinded values. -- [Data lifecycle](../data-lifecycle.qmd): retention, destruction, and +- [Blinding](/edc-core/guide/blinding/): why exports can't leak blinded values. +- [Data lifecycle](/edc-core/data-lifecycle/): retention, destruction, and the procedural side. diff --git a/site/guide/lab-import.qmd b/site/src/content/docs/guide/lab-import.md similarity index 95% rename from site/guide/lab-import.qmd rename to site/src/content/docs/guide/lab-import.md index ad09bb7..947766f 100644 --- a/site/guide/lab-import.qmd +++ b/site/src/content/docs/guide/lab-import.md @@ -2,6 +2,7 @@ title: "Lab data import" --- + Central labs deliver results as batch files. Instead of keying them in, users with the `data.import` permission (data managers and admins by default) upload the file, review a dry-run report, and execute. The @@ -16,7 +17,7 @@ the mapping for that lab, chooses the file, and clicks **Validate**. The dry-run report says exactly what would happen, per row, before anything is written: -![](../images/lab-import.png){.screenshot fig-alt="The lab import panel after validating a CSV: per-row outcomes including rows that would import, a skipped completed form, and a value conflict, with nothing written yet"} +![The lab import panel after validating a CSV: per-row outcomes including rows that would import, a skipped completed form, and a value conflict, with nothing written yet](../../../assets/screenshots/lab-import.png) If the report looks right, typing the study name confirms the import, which runs in the background with a final row-by-row report. The rest of this @@ -132,5 +133,5 @@ is permanently distinguishable, and each run writes `lab_import.started` - No unit conversion; the unit is stored verbatim. - If a form is still pinned to an older build that lacks a mapped item, its rows are skipped with a message; run the - [amendment migration](study-builds.qmd#mid-study-amendments) first. + [amendment migration](/edc-core/guide/study-builds/#mid-study-amendments) first. - Mappings cannot be deleted (runs reference them); rename retired ones. diff --git a/site/guide/medical-coding.qmd b/site/src/content/docs/guide/medical-coding.md similarity index 97% rename from site/guide/medical-coding.qmd rename to site/src/content/docs/guide/medical-coding.md index b52a2b7..b29d2b9 100644 --- a/site/guide/medical-coding.qmd +++ b/site/src/content/docs/guide/medical-coding.md @@ -2,6 +2,7 @@ title: "Medical coding" --- + Sites report adverse events and medications in their own words: "stomach ake", "asprin 81mg". Analysis needs standardized terms: regulatory datasets pair each verbatim with its dictionary-derived @@ -96,7 +97,7 @@ record, **not** in the form data: corrects the verbatim, the coding shows as **stale** on the coding page until a human confirms or recodes it. -![](../images/coding.png){.screenshot fig-alt="Medical coding work queue with auto-coded terms and one uncoded verbatim"} +![Medical coding work queue with auto-coded terms and one uncoded verbatim](../../../assets/screenshots/coding.png) **Auto-coding** handles the bulk: one click starts a background run that assigns every uncoded verbatim exactly matching a dictionary term diff --git a/site/guide/notifications.qmd b/site/src/content/docs/guide/notifications.md similarity index 79% rename from site/guide/notifications.qmd rename to site/src/content/docs/guide/notifications.md index c713389..7e24f19 100644 --- a/site/guide/notifications.qmd +++ b/site/src/content/docs/guide/notifications.md @@ -2,6 +2,7 @@ title: "Notifications" --- + Query aging is mostly waiting: the site doesn't know a query was opened, the reviewer doesn't know it was answered, the signer doesn't know the form is ready. edc-core closes those gaps with an in-app inbox (the bell @@ -19,28 +20,27 @@ to the affected form or page, and can be marked read individually or all at once. In the demo below, `demo-dm` has opened a manual query on DEMO-001's vitals, and `demo-inv`, who can answer it, finds it waiting: -![](../images/notifications-bell.png){.screenshot fig-alt="The notification inbox open from the header bell, showing a new-query notification with a deep link to the affected form"} +![The notification inbox open from the header bell, showing a new-query notification with a deep link to the affected form](../../../assets/screenshots/notifications-bell.png) ## What notifies whom | Event | Who is notified | |---|---| | Manual query opened | Site staff who can answer it (`query.answer`, at that site) | -| Queries created from a [workbench listing](analytics.qmd#from-listings-to-queries) | The same site staff, but one summary per site per batch, not one entry per query | +| Queries created from a [workbench listing](/edc-core/guide/analytics/#from-listings-to-queries) | The same site staff, but one summary per site per batch, not one entry per query | | Query answered | Reviewers who manage queries (`query.manage`) | | Form reaches complete or verified | Its potential signers (`data.sign`) | | Form overdue (optional, see below) | Site data-entry staff | | Site layout gone stale after an amendment | The site and the sponsor | | Security anomaly detected | System administrators | -: {tbl-colwidths="[45,55]"} Two rules keep the volume honest. Notifications are never sent to the person who caused the event. And **system queries from edit checks raise no notifications at all**: they open and close with the data during entry, and notifying anyone about self-resolving checks would train everyone to ignore the bell. That holds for -[cross-form checks](rules-and-derivations.qmd#cross-form-checks) too: a +[cross-form checks](/edc-core/guide/rules-and-derivations/#cross-form-checks) too: a save on one form can open a system query on another, and it waits on that form and the queries dashboard rather than in anyone's inbox. @@ -56,7 +56,7 @@ sign-ins, is the working loop between sites and reviewers. ## Email delivery With SMTP configured -([installation](../installation.qmd#notifications-and-email)), each +([installation](/edc-core/installation/#notifications-and-email)), each notification is also sent by email with the same deep link, so site staff who aren't logged in still hear about queries the day they're opened. Without SMTP, the in-app inbox works on its own. @@ -79,13 +79,13 @@ Reminders deduplicate, so a form nags once, not every tick. For clinical operations, the metric this machinery moves is **query aging**: the time from query opened to answered to closed. Every hop in that cycle that used to depend on someone remembering to check a dashboard is now a -push. The [analytics workbench](analytics.qmd) has the other half: the +push. The [analytics workbench](/edc-core/guide/analytics/) has the other half: the `queries` table in every snapshot, where aging is one SQL query away. ## Where next -- [Review workflows](review.qmd): the query lifecycle these notifications +- [Review workflows](/edc-core/guide/review/): the query lifecycle these notifications serve. -- [Installation](../installation.qmd#notifications-and-email): SMTP setup. -- [User administration](user-admin.qmd#security-anomalies): the +- [Installation](/edc-core/installation/#notifications-and-email): SMTP setup. +- [User administration](/edc-core/guide/user-admin/#security-anomalies): the administrator-facing anomaly notifications. diff --git a/site/guide/protocol-import.qmd b/site/src/content/docs/guide/protocol-import.md similarity index 93% rename from site/guide/protocol-import.qmd rename to site/src/content/docs/guide/protocol-import.md index 1908a9e..cbaf3a1 100644 --- a/site/guide/protocol-import.qmd +++ b/site/src/content/docs/guide/protocol-import.md @@ -2,9 +2,10 @@ title: "Protocol import (USDM)" --- + The protocol-first build path derives a study build from a CDISC **USDM v4** protocol package instead of hand-built forms. If you are new to structured -protocols, read [Why protocol-first?](why-protocol-first.qmd) first; this page +protocols, read [Why protocol-first?](/edc-core/guide/why-protocol-first/) first; this page is the how-to. ## What the importer accepts @@ -42,7 +43,7 @@ biomedical concepts: carry it. Click the badge to complete it: name the item, set the question text, datatype, and optional codelist. -![](../images/protocol-review.png){.screenshot fig-alt="The protocol review screen: the schedule of activities compiled from a USDM package, with per-concept resolution badges and the publish action"} +![The protocol review screen: the schedule of activities compiled from a USDM package, with per-concept resolution badges and the publish action](../../../assets/screenshots/protocol-review.png) **Publish build** stays disabled until every draft is completed, so a published build is always capture-ready. Publishing creates a normal study build (the @@ -109,7 +110,7 @@ resolve`), which map one-to-one onto workbook rows. Import the amended protocol as a new protocol version: it compiles to a new candidate, review works the same way, and publishing creates the next build -version. From there the standard [amendment tooling](study-builds.qmd) +version. From there the standard [amendment tooling](/edc-core/guide/study-builds/) applies: diff the builds, analyze the migration, and move in-flight subjects. diff --git a/site/guide/review.qmd b/site/src/content/docs/guide/review.md similarity index 84% rename from site/guide/review.qmd rename to site/src/content/docs/guide/review.md index 681f732..159b0c0 100644 --- a/site/guide/review.qmd +++ b/site/src/content/docs/guide/review.md @@ -2,6 +2,7 @@ title: "Review workflows" --- + ## Queries Queries are threaded conversations attached to a form or a specific item. @@ -15,12 +16,12 @@ They come from two places: Manual queries can also be opened in bulk from a workbench listing: a cleaning query's result rows become queries, each carrying provenance back to the exact execution and snapshot that flagged it. See -[From listings to queries](analytics.qmd#from-listings-to-queries). +[From listings to queries](/edc-core/guide/analytics/#from-listings-to-queries). Each study has a queries dashboard showing every query with status, origin, subject, and the latest message: -![](../images/queries.png){.screenshot fig-alt="Queries dashboard"} +![Queries dashboard](../../../assets/screenshots/queries.png) The full lifecycle (`open → answered → closed`, with reopen) is audited, and open queries are surfaced prominently on the affected form during entry. @@ -32,7 +33,7 @@ opening a manual query notifies the site staff who can answer it, an answer notifies the reviewers, and a form reaching complete or verified notifies its potential signers, in-app and (with SMTP configured) by email. The full event-to-recipient map, the overdue-reminder scan, and the deliberate -silences are on the [notifications page](notifications.qmd). +silences are on the [notifications page](/edc-core/guide/notifications/). ## Source data verification @@ -47,7 +48,7 @@ the moment of signature**, even mid-session: the signing panel states what the signature means and that later corrections will invalidate it, and asks the signer to prove their identity again before anything is recorded. -![](../images/sign-form.png){.screenshot fig-alt="The electronic-signature panel on a completed form: a Part 11 statement, credential fields, and the signature meaning, shown before signing"} +![The electronic-signature panel on a completed form: a Part 11 statement, credential fields, and the signature meaning, shown before signing](../../../assets/screenshots/sign-form.png) How the re-authentication happens follows how the account signs in: @@ -73,9 +74,9 @@ The audit page gives reviewers the study's complete trail, every create, change, and state transition with actor, timestamp, before/after values, and reason. Filter by action, entity, and user, or export the trail to CSV. -![](../images/audit-trail.png){.screenshot fig-alt="Audit trail with filters and CSV export"} +![Audit trail with filters and CSV export](../../../assets/screenshots/audit-trail.png) Under the hood, audit rows and item-value versions are append-only tables; PostgreSQL triggers reject `UPDATE` and `DELETE` outright, and the tests prove it. The trail is also included, in full, in every -[study archive](analytics.qmd#exports-and-the-study-archive). +[study archive](/edc-core/guide/analytics/#exports-and-the-study-archive). diff --git a/site/guide/rtsm-integration.qmd b/site/src/content/docs/guide/rtsm-integration.md similarity index 91% rename from site/guide/rtsm-integration.qmd rename to site/src/content/docs/guide/rtsm-integration.md index d199013..f1a2cfb 100644 --- a/site/guide/rtsm-integration.qmd +++ b/site/src/content/docs/guide/rtsm-integration.md @@ -2,6 +2,7 @@ title: "RTSM integration" --- + edc-core does not randomize subjects: randomization and trial supply management (RTSM/IRT) is deliberately an external system. What edc-core provides is the receiving end: the RTSM posts each subject's treatment-arm @@ -23,9 +24,9 @@ dedicated randomization form with a text item for the arm. OIDs are validated against the latest study build when you save, and every change is audited with the full before/after. For a blinded trial, mark the arm item `edc:Blinded="Yes"` in the build: masking then applies everywhere -by construction (see the [blinding guide](blinding.qmd)). +by construction (see the [blinding guide](/edc-core/guide/blinding/)). -![](../images/rtsm-panel.png){.screenshot fig-alt="The RTSM integration panel: intake configuration pointing at the arm item, API-key management, and the transfer log with an applied assignment"} +![The RTSM integration panel: intake configuration pointing at the arm item, API-key management, and the transfer log with an applied assignment](../../../assets/screenshots/rtsm-panel.png) **2. Mint an API key.** The RTSM authenticates with a study-scoped bearer token (`edcrtsm_…`). The raw token is shown exactly once at mint @@ -70,7 +71,7 @@ Unknown subjects are rejected rather than auto-enrolled (enrollment is a site act), and the rejected event (below) is the discrepancy signal for reconciliation. Withdrawn and screen-failed subjects are rejected too: a subject who is out of the study must not silently accept an -assignment, and [reinstatement](data-capture.qmd#subject-lifecycle) is +assignment, and [reinstatement](/edc-core/guide/data-capture/#subject-lifecycle) is the correction path if the disposition is wrong. ## The transfer record diff --git a/site/guide/rules-and-derivations.qmd b/site/src/content/docs/guide/rules-and-derivations.md similarity index 91% rename from site/guide/rules-and-derivations.qmd rename to site/src/content/docs/guide/rules-and-derivations.md index 560c891..910ad95 100644 --- a/site/guide/rules-and-derivations.qmd +++ b/site/src/content/docs/guide/rules-and-derivations.md @@ -2,6 +2,7 @@ title: "Rules and derivations" --- + A study build can do three things with logic: flag implausible data (edit checks), decide what gets collected (skip logic and dependent options), and compute values instead of collecting them (derivations). All three are @@ -9,7 +10,7 @@ authored the same way, in the **Conditions & methods** panel of the study builder, as small [JSONata](https://jsonata.org) expressions stored inside the ODM build. This page is the authoring guide; what these rules look like during data entry is covered in -[Data capture](data-capture.qmd#conditional-and-computed-fields). +[Data capture](/edc-core/guide/data-capture/#conditional-and-computed-fields). **Who does this:** anyone with the `study.manage` permission on the study (`demo-admin` or `demo-dm` in the seeded demo). Follow along by opening the @@ -24,7 +25,6 @@ demo study's latest build and clicking **Edit build**. | Withdraw one option from a choice list | Condition, wired to the option | The same attribute on a `CodeListItem` (vendor extension) | | Compute a value from other answers | Method, assigned to a field | A `MethodDef` referenced by the item's `MethodOID` | -: {tbl-colwidths="[34,26,40]"} The role follows from the wiring, and the builder shows it as a badge on each rule: an unwired condition is labeled **edit check**, a wired one @@ -33,7 +33,7 @@ Wiring a condition to a field changes what it does, not just where it appears: skip logic gates collection and never raises queries, while an edit check flags data and never hides anything. -![](../images/rules-panel.png){.screenshot fig-alt="The Conditions & methods panel on the builder page, listing the demo study's edit checks, skip conditions, and BMI derivation with role badges"} +![The Conditions & methods panel on the builder page, listing the demo study's edit checks, skip conditions, and BMI derivation with role badges](../../../assets/screenshots/rules-panel.png) ## JSONata in ten minutes @@ -110,7 +110,7 @@ As `demo-admin`, open the demo study, open the latest build, and click **Expression does not parse** with the parser's reason, immediately and before anything is saved: -![](../images/rules-syntax-error.png){.screenshot fig-alt="Editing a condition expression in the builder, with the live syntax checker reporting that the expression does not parse"} +![Editing a condition expression in the builder, with the live syntax checker reporting that the expression does not parse](../../../assets/screenshots/rules-syntax-error.png) 4. Leave it unwired: an unreferenced condition runs as an edit check. 5. Click **Save as new build**. The draft is validated whole and written as @@ -119,7 +119,7 @@ As `demo-admin`, open the demo study, open the latest build, and click Nothing you type is persisted until that save, so experimenting is free. Existing forms keep the build they were captured under; moving them to the -new build is an explicit [amendment migration](amendments.qmd). +new build is an explicit [amendment migration](/edc-core/guide/amendments/). ## Walkthrough: skip logic and dependent options @@ -138,7 +138,7 @@ Two things follow from the wiring: becomes skipped; it is retained, badged **not collected**, and queried until the site resolves it. The entry-side behavior, including the retained-value workflow, is described in - [Data capture](data-capture.qmd#conditional-and-computed-fields). + [Data capture](/edc-core/guide/data-capture/#conditional-and-computed-fields). The same mechanism, referenced from a codelist option instead of a field, withdraws that one option while the condition is true: the demo study @@ -252,7 +252,7 @@ Round-tripping is a tested property; option-level skip references use the ## Pitfalls - **Check messages are visible to everyone who sees the form.** Edit checks - may reference [blinded items](blinding.qmd), but the description text is + may reference [blinded items](/edc-core/guide/blinding/), but the description text is shown to blinded roles too; never word a message so it reveals the value. The importer warns when a check references a blinded item. - **A wired condition never raises queries.** If you want both behaviors @@ -261,13 +261,13 @@ Round-tripping is a tested property; option-level skip references use the an item affects every form that references that item. - **Rules version with the build.** Tightening a check mid-study is an amendment; when migrated forms re-run the new check, expect new system - queries where it fires. The [amendments page](amendments.qmd) shows how + queries where it fires. The [amendments page](/edc-core/guide/amendments/) shows how to preview that before executing. ## Where next -- [Data capture](data-capture.qmd#conditional-and-computed-fields): what +- [Data capture](/edc-core/guide/data-capture/#conditional-and-computed-fields): what sites see when these rules run. -- [Amendments](amendments.qmd): changing rules on a study that already has +- [Amendments](/edc-core/guide/amendments/): changing rules on a study that already has data. -- [Study builds](study-builds.qmd): the build model these rules live in. +- [Study builds](/edc-core/guide/study-builds/): the build model these rules live in. diff --git a/site/guide/site-forms.qmd b/site/src/content/docs/guide/site-forms.md similarity index 88% rename from site/guide/site-forms.qmd rename to site/src/content/docs/guide/site-forms.md index 1270f5f..87a1a86 100644 --- a/site/guide/site-forms.qmd +++ b/site/src/content/docs/guide/site-forms.md @@ -2,6 +2,7 @@ title: "Site form layouts" --- + The sponsor's build defines *what* every site collects. Site form layouts let each site decide *how*: regroup the fields of a visit into the forms that match its clinic flow, reorder them, and relabel questions in the wording its @@ -9,7 +10,7 @@ staff actually use. The data never changes: a layout only rearranges references to the build's fields, and the system proves that on every edit. This is the site half of the same idea as the -[protocol-first path](why-protocol-first.qmd): the protocol (or the sponsor's +[protocol-first path](/edc-core/guide/why-protocol-first/): the protocol (or the sponsor's build) governs the data; presentation is adaptable per stakeholder. A concrete example, using the demo study: Tampa General's screening visit @@ -35,7 +36,7 @@ Open **site forms** from the study page (you need the site-scoped drop, add, or weaken a field is flagged immediately; you cannot submit until it's clean. - ![](../images/site-forms-editor.png){.screenshot fig-alt="The site form layout editor with a draft layout open and the live data-equivalence panel confirming the layout still collects the sponsor's fields"} + ![The site form layout editor with a draft layout open and the live data-equivalence panel confirming the layout still collects the sponsor's fields](../../../assets/screenshots/site-forms-editor.png) 3. **Submit for approval.** The sponsor sees your layout with the equivalence check already passed, so the review is about workflow, not data. You'll @@ -43,7 +44,7 @@ Open **site forms** from the study page (you need the site-scoped 4. **Capture through it.** Once approved, the capture launcher on the same page opens your layout's forms for your site's subjects. Data entry, queries, signatures, and edit checks behave exactly as on standard forms. - So do [dynamic fields](data-capture.qmd#conditional-and-computed-fields): + So do [dynamic fields](/edc-core/guide/data-capture/#conditional-and-computed-fields): skip logic and computed values are protocol semantics, not layout, and follow each item into every variant. @@ -57,7 +58,7 @@ already passed structural data-equivalence validation (the badge is machine-checked, not self-declared), so the decision is whether the workflow is acceptable, with an optional note back to the site. -![](../images/approval-queue.png){.screenshot fig-alt="The sponsor's layout approval queue with a submitted site layout awaiting an approve or request-changes decision"} +![The sponsor's layout approval queue with a submitted site layout awaiting an approve or request-changes decision](../../../assets/screenshots/approval-queue.png) The part that matters for data management: captured values are identical in shape regardless of layout. Value rows key on the build's canonical field and diff --git a/site/guide/study-builds.qmd b/site/src/content/docs/guide/study-builds.md similarity index 91% rename from site/guide/study-builds.qmd rename to site/src/content/docs/guide/study-builds.md index a4efb24..611174b 100644 --- a/site/guide/study-builds.qmd +++ b/site/src/content/docs/guide/study-builds.md @@ -2,6 +2,7 @@ title: "Study builds" --- + A *study build* is a versioned, immutable snapshot of your study definition (events, forms, item groups, items, codelists, and edit checks), shaped as CDISC ODM v2.0. Everything else in edc-core renders from it: CRFs, the subject @@ -23,13 +24,13 @@ layouts, embedded clinical data) are dropped **with an explicit warning for each**. Review the import warnings before using a converted build. ![The study page lists every build; each exports back to ODM XML or -JSON.](../images/study-overview.png){.screenshot} +JSON.](../../../assets/screenshots/study-overview.png) **Use the visual builder.** Every build can be opened in the study builder: a tree of events and forms with a live, interactive preview of each CRF exactly as data entry will render it. -![](../images/study-builder.png){.screenshot fig-alt="Study builder with event/form tree and live form preview"} +![Study builder with event/form tree and live form preview](../../../assets/screenshots/study-builder.png) With the `study.manage` permission, **Edit build** switches the builder into a point-and-click editor: rename forms and sections, add or delete events, forms, @@ -38,7 +39,7 @@ assign codelists, toggle required/repeating flags, and wire skip conditions and derivation methods to fields and sections. The **Conditions & methods** panel below the form editor manages the rules themselves; JSONata expressions are syntax-checked as you type, and -[Rules and derivations](rules-and-derivations.qmd) is the full authoring +[Rules and derivations](/edc-core/guide/rules-and-derivations/) is the full authoring guide. Nothing is persisted while you work. **Save as new build** validates the draft and writes it through the same import path as a file, creating the next immutable version. @@ -46,7 +47,7 @@ A study with no builds yet offers a **start from scratch** shortcut that creates a minimal first build to edit. (Item definitions are shared: editing a question changes every form that references that item.) -![](../images/study-builder-edit.png){.screenshot fig-alt="Study builder in edit mode with an expanded item editor"} +![Study builder in edit mode with an expanded item editor](../../../assets/screenshots/study-builder-edit.png) **Script it.** Because file-driven and point-and-click builds hit the same versioned-metadata API, builds are automatable: generate ODM from your @@ -70,7 +71,7 @@ migration. Two rules are deliberate: signed and locked forms never migrate (their signatures bind to the build they were signed under), and values orphaned by removed items are never deleted. The full walkthrough, with the impact report explained line by line, is on the -[amendments page](amendments.qmd). +[amendments page](/edc-core/guide/amendments/). ## Edit checks @@ -84,7 +85,7 @@ includes three: A failing check warns instantly during entry and, on save, raises a **system query** attached to the item. When the data is corrected, the query closes -automatically. See [Data capture](data-capture.qmd). +automatically. See [Data capture](/edc-core/guide/data-capture/). ## Dynamic fields @@ -120,4 +121,4 @@ be authored in the builder's rules panel and item editors, or imported inside an ODM file; both land in the same build. What happens at the point of entry — fields appearing and disappearing, retained values that need clearing, read-only computed fields — is covered in -[Data capture](data-capture.qmd). +[Data capture](/edc-core/guide/data-capture/). diff --git a/site/guide/user-admin.qmd b/site/src/content/docs/guide/user-admin.md similarity index 90% rename from site/guide/user-admin.qmd rename to site/src/content/docs/guide/user-admin.md index 9f23906..ead32de 100644 --- a/site/guide/user-admin.qmd +++ b/site/src/content/docs/guide/user-admin.md @@ -2,6 +2,7 @@ title: "User administration" --- + Accounts and access are administered in two places: a system-wide *Users* page for account lifecycle, and a per-study *Team* page for role grants. Both write every action to the audit trail. @@ -14,7 +15,7 @@ requires signatures to stay attributable to one individual indefinitely, so a departed user's account is switched off but their name remains on everything they signed. -![](../images/users-admin.png){.screenshot fig-alt="Users administration page with account creation and lifecycle actions"} +![Users administration page with account creation and lifecycle actions](../../../assets/screenshots/users-admin.png) Creating an account takes a username, email, full name, and one choice: @@ -58,7 +59,7 @@ member of the study can see the team (who holds which role, at which scope, granted when and by whom), since that is their own delegation context. -![](../images/team.png){.screenshot fig-alt="Study team page listing role grants with their scopes"} Changing the team requires the `roles.grant` permission (held +![Study team page listing role grants with their scopes](../../../assets/screenshots/team.png) Changing the team requires the `roles.grant` permission (held by the `admin` role by default; system administrators can also grant, so a brand-new study's first grant is reachable). @@ -96,7 +97,7 @@ or status code, and export the current view to CSV for an inspection copy. Retention is your deployment's call; the table is ordinary operational data, separate from the append-only audit trail. -![](../images/access-log.png){.screenshot fig-alt="Access log with per-request rows and filters"} +![Access log with per-request rows and filters](../../../assets/screenshots/access-log.png) Sessions are also **bound to the client they were issued to**. A session token presented by a different browser than the one that signed in is @@ -116,8 +117,8 @@ anomaly**. Findings notify system administrators and wait under acknowledging one, with a note on what was done, writes the recorded response to the audit trail. -![](../images/anomalies.png){.screenshot fig-alt="Security anomalies review page with open findings and acknowledge actions"} +![Security anomalies review page with open findings and acknowledge actions](../../../assets/screenshots/anomalies.png) Detection thresholds and the operational side (what to put in your SOPs, how this relates to platform monitoring) are covered in the -[deployment guide](../deployment.qmd#security-anomaly-detection). +[deployment guide](/edc-core/deployment/#security-anomaly-detection). diff --git a/site/guide/why-protocol-first.qmd b/site/src/content/docs/guide/why-protocol-first.md similarity index 98% rename from site/guide/why-protocol-first.qmd rename to site/src/content/docs/guide/why-protocol-first.md index 5a77919..5da26df 100644 --- a/site/guide/why-protocol-first.qmd +++ b/site/src/content/docs/guide/why-protocol-first.md @@ -2,6 +2,7 @@ title: "Why protocol-first?" --- + edc-core can build a study two broad ways: you can design the forms yourself (ODM import, the visual builder, or a script), or you can hand it a structured protocol and let it derive the data requirements for you. This page explains @@ -97,7 +98,7 @@ the same versioned build store. - **You have (or can produce) a USDM package**, from a study design tool, a vendor export, or the Excel authoring route described in - [Protocol import](protocol-import.qmd): use the protocol-first path and + [Protocol import](/edc-core/guide/protocol-import/): use the protocol-first path and review the generated build. - **You have an existing ODM library or CRF book**: import the ODM directly. - **You are sketching a small study from scratch**: the visual builder is the diff --git a/site/src/content/docs/index.mdx b/site/src/content/docs/index.mdx new file mode 100644 index 0000000..073825c --- /dev/null +++ b/site/src/content/docs/index.mdx @@ -0,0 +1,184 @@ +--- +title: edc-core +description: A modern, open-source Electronic Data Capture system for clinical research +template: splash +tableOfContents: false +hero: + title: Electronic Data Capture, built like modern software + tagline: >- + Commercial EDC platforms are expensive, closed, and dated. The open-source + alternatives run on legacy stacks. edc-core is a from-scratch EDC built on + modern web technology, an analytics-native data architecture, and CDISC + standards, designed so that regulatory expectations (21 CFR Part 11, + ICH E6(R3)) are structural properties of the system rather than + afterthoughts. + actions: + - text: Get started + link: /edc-core/installation/ + icon: right-arrow + variant: primary + - text: Five-minute tour + link: /edc-core/tour/ + variant: secondary + - text: GitHub + link: https://github.com/tgerke/edc-core + icon: github + variant: minimal +--- + +import { Image } from "astro:assets"; +import workbench from "../../assets/screenshots/workbench-sql.png"; + +
+ +
+ The analytics workbench: a SQL editor over an immutable study snapshot, with a results grid +
+ The analytics workbench: self-service SQL over an immutable, version-pinned + study snapshot. +
+
+ +
+ +

Why edc-core

+ +
+
+

No vendor lock-in

+

+ AGPL-3.0 licensed: nobody can take this code and sell it back to you as + a closed platform. +

+
+
+

Programmable study builds

+

+ First-class CDISC ODM v2.0 import/export means study builds can be + file-driven, code-driven, and LLM-assisted. The visual builder writes + through exactly the same versioned-metadata API. +

+
+
+

Self-service analytics, in the EDC

+

+ Data managers query published study snapshots with real SQL, R, and + Python, not a bespoke, vendor-locked reporting layer. Every execution is + read-only, sandboxed, version-pinned, and audited. And a listing's rows + can become + site queries in bulk, so the workbench doubles as the study's + data-cleaning surface. +

+
+
+

Compliance by construction

+

+ Append-only audit trails enforced at the database level, Part 11 + e-signatures bound to record versions, an audit-trail review UI, and a + validation pack shipped with every release. +

+
+
+

Standards as the interface

+

+ ODM v2.0 (XML + JSON) for metadata, Dataset-JSON v1.1 for data exchange, + CDASH-aligned demo CRFs, and a self-contained study archive that + outlives the running system. +

+
+
+

Boring to operate

+

+ The supported production shape is one compose file on a single VM: + pinned release images, automatic TLS, paired database-and-lake backups, + and cloud-init or Terraform recipes for the major clouds. See + Deployment. +

+
+
+ +
+ +
+ +## Where to start + + + +
+ +
+ +## Start here by role + + + +
+ +
+ Status: alpha. The full workflow (protocol-first or + forms-first build, capture, clean, code, sign, snapshot, analyze with SQL, + R, and Python, export) is released as + v0.5.0, + but edc-core has not yet been used in a production study. Follow progress + on GitHub. +
+ +
diff --git a/site/installation.qmd b/site/src/content/docs/installation.md similarity index 94% rename from site/installation.qmd rename to site/src/content/docs/installation.md index e06c084..466775a 100644 --- a/site/installation.qmd +++ b/site/src/content/docs/installation.md @@ -2,6 +2,7 @@ title: "Installation" --- + edc-core ships as a small set of containers: a PostgreSQL system of record, a Node/TypeScript API, a browser SPA, and sandboxed R and Python engines. One compose file brings up the whole stack; rootless Podman is the recommended path, and Docker @@ -21,7 +22,7 @@ The badge boots the full dev stack in a free GitHub Codespace; no local tools needed, just a GitHub account. After ~3 minutes the web UI opens on the forwarded port; sign in as `admin` / `edc-demo-admin`, or as any seeded clinical-role user with the password `edc-demo-users` and take the -[five-minute tour](tour.qmd). The codespace is yours alone and the study is +[five-minute tour](/edc-core/tour/). The codespace is yours alone and the study is fictional; delete it when you're done. ## Quick start @@ -50,7 +51,7 @@ pnpm --filter @edc-core/api db:bootstrap-admin This creates a root administrator account and prints its generated credentials. Sign in with them at . -![](images/login.png){.screenshot fig-alt="The edc-core sign-in screen"} +![The edc-core sign-in screen](../../assets/screenshots/login.png) ### Seed the demo study (optional, recommended) @@ -60,7 +61,7 @@ pnpm --filter @edc-core/api db:seed-demo This creates a complete, CDASH-aligned demo study (`ST.CDASH.DEMO`) with two sites, one user per clinical role, enrolled subjects, and an open data query: -everything the [five-minute tour](tour.qmd) uses. The script prints the shared +everything the [five-minute tour](/edc-core/tour/) uses. The script prints the shared demo password (override it with the `EDC_DEMO_PASSWORD` environment variable) and is idempotent: it exits without changes if the demo study already exists. @@ -128,7 +129,7 @@ ghcr.io/tgerke/edc-core-py-engine Each release also attaches a **validation pack**: the regulatory traceability matrix joined to that exact release's automated test results. See -[Compliance](compliance.qmd). +[Compliance](/edc-core/compliance/). ## Production install @@ -147,7 +148,7 @@ docker compose -f compose.prod.yaml exec api pnpm --filter @edc-core/api db:boot at Caddy (certificates are provisioned and renewed automatically), publishes nothing else, and sets the production hardening variables for you. The remaining operational work (encrypted volumes, paired backups, retention -policy) is the [deployment guide](deployment.qmd). +policy) is the [deployment guide](/edc-core/deployment/). ### Provisioning the VM @@ -178,8 +179,7 @@ contract. Each provisions the VM, firewall (SSH restricted to your admin CIDR), static IP, and encrypted disk, and delegates the install to the same cloud-init file. Each directory's README is a complete walkthrough. -::: {.callout-tip} -## Running edc-core alongside ctms-core +:::tip[Running edc-core alongside ctms-core] Everything on this page installs edc-core on its own. To co-deploy it with [ctms-core](https://github.com/tgerke/ctms-core) (the eTMF/regulatory-document @@ -190,13 +190,12 @@ install walkthrough covers the combined topology and the pre-wired EDC-to-eTMF filing credential. ::: -::: {.callout-warning} -## The dev stack is not a deployment +:::caution[The dev stack is not a deployment] `infra/compose.yaml` (the quick start above) uses a hard-coded database password and no TLS. It is for local development only; anywhere networked, use `infra/compose.prod.yaml` and work through the -[deployment guide](deployment.qmd). +[deployment guide](/edc-core/deployment/). ::: ## Local development diff --git a/site/start-here.qmd b/site/src/content/docs/start-here.md similarity index 55% rename from site/start-here.qmd rename to site/src/content/docs/start-here.md index 5d9b40c..80a34d1 100644 --- a/site/start-here.qmd +++ b/site/src/content/docs/start-here.md @@ -1,8 +1,8 @@ --- title: "Start here" -toc: false --- + edc-core is used by people with very different jobs: coordinators keying visits at a site, data managers building and cleaning studies, monitors verifying data, and the people accountable for all of it. The guide pages @@ -10,7 +10,7 @@ serve all of them, but nobody needs to read everything. Pick the track that matches your role and read in order; each step says why it comes next. Every track names a demo persona (`demo-coord`, `demo-dm`, `demo-inv`, -`demo-cra`, `demo-admin`). If you [install the local stack](installation.qmd) +`demo-cra`, `demo-admin`). If you [install the local stack](/edc-core/installation/) and seed the demo study, you can sign in as that persona and do each step yourself rather than just reading about it. @@ -20,21 +20,21 @@ If terms like eCRF, edit check, and SDV are new, start with vocabulary and a guided loop before any reference material. Follow along as `demo-coord` for entry and `demo-dm` for review. -1. [Glossary](glossary.qmd): skim it once so the rest of the guide reads +1. [Glossary](/edc-core/glossary/): skim it once so the rest of the guide reads without stopping to look things up. -2. [Five-minute tour](tour.qmd): the whole lifecycle (enter → query → verify +2. [Five-minute tour](/edc-core/tour/): the whole lifecycle (enter → query → verify → sign → snapshot → analyze) in one sitting, switching personas at each step. -3. [Data capture](guide/data-capture.qmd): the subject matrix, entering +3. [Data capture](/edc-core/guide/data-capture/): the subject matrix, entering values, corrections with reasons, and what the form does on its own (skips, computed fields, repeating groups). -4. [Review workflows](guide/review.qmd): where queries come from, who +4. [Review workflows](/edc-core/guide/review/): where queries come from, who answers them, and what verification and signature mean. -5. [Medical coding](guide/medical-coding.qmd): why "asprin 81mg" needs a +5. [Medical coding](/edc-core/guide/medical-coding/): why "asprin 81mg" needs a dictionary term, and the queue where that happens. -6. [Analytics workbench](guide/analytics.qmd): the SQL section is enough to +6. [Analytics workbench](/edc-core/guide/analytics/): the SQL section is enough to answer "how clean is my study today" yourself, and - [From listings to queries](guide/analytics.qmd#from-listings-to-queries) + [From listings to queries](/edc-core/guide/analytics/#from-listings-to-queries) turns the answer into site queries. ## Study builders (advanced data managers) {#study-builders} @@ -43,25 +43,25 @@ You already run studies; this track is about building them in edc-core: versioned ODM builds, rules, and what happens after go-live. Work as `demo-dm` or `demo-admin`. -1. [Study builds](guide/study-builds.qmd): the versioned, immutable build +1. [Study builds](/edc-core/guide/study-builds/): the versioned, immutable build model everything else renders from, and the three ways to author one. -2. [Rules and derivations](guide/rules-and-derivations.qmd): edit checks +2. [Rules and derivations](/edc-core/guide/rules-and-derivations/): edit checks (single-form and cross-form), skip logic, and computed values, with a JSONata primer. -3. [Why protocol-first?](guide/why-protocol-first.qmd) and - [Protocol import](guide/protocol-import.qmd): deriving a build from a +3. [Why protocol-first?](/edc-core/guide/why-protocol-first/) and + [Protocol import](/edc-core/guide/protocol-import/): deriving a build from a USDM protocol package instead of hand-built forms. -4. [Mid-study amendments](guide/amendments.qmd): diff, impact analysis, and +4. [Mid-study amendments](/edc-core/guide/amendments/): diff, impact analysis, and audited migration once the protocol changes under live data. -5. [Site form layouts](guide/site-forms.qmd): letting sites adapt form +5. [Site form layouts](/edc-core/guide/site-forms/): letting sites adapt form presentation while you keep one data shape across the study. -6. [Lab data import](guide/lab-import.qmd) and - [RTSM integration](guide/rtsm-integration.qmd): external data through +6. [Lab data import](/edc-core/guide/lab-import/) and + [RTSM integration](/edc-core/guide/rtsm-integration/): external data through the same audited write path as typed entry. -7. [Blinding](guide/blinding.qmd): item-level masking, who sees what, and +7. [Blinding](/edc-core/guide/blinding/): item-level masking, who sees what, and the break-the-blind record. -8. [Analytics workbench](guide/analytics.qmd) and - [Exports and the study archive](guide/exports-and-archive.qmd): +8. [Analytics workbench](/edc-core/guide/analytics/) and + [Exports and the study archive](/edc-core/guide/exports-and-archive/): snapshots, R and Python against them, and every path data takes out. ## CRO and sponsor leadership {#leadership} @@ -70,19 +70,19 @@ You are deciding whether to trust a study to this system. This track covers the compliance posture, oversight evidence, and exit paths; none of it requires touching a form. -1. [Why edc-core](index.qmd#why-edc-core): the licensing and architecture +1. [Why edc-core](/edc-core/#why-edc-core): the licensing and architecture position in five paragraphs. -2. [Compliance](compliance.qmd): how the system maps to 21 CFR Part 11 and +2. [Compliance](/edc-core/compliance/): how the system maps to 21 CFR Part 11 and ICH E6(R3), what the validation pack contains, and what remains your organization's responsibility. -3. [Data lifecycle](data-lifecycle.qmd): the ICH E6(R3) data lifecycle +3. [Data lifecycle](/edc-core/data-lifecycle/): the ICH E6(R3) data lifecycle elements, one by one, with how each is handled. -4. [User administration](guide/user-admin.qmd): account lifecycle, per-study +4. [User administration](/edc-core/guide/user-admin/): account lifecycle, per-study role grants, the access log, and security anomaly review, which is the access-control story an auditor will ask about. -5. [Exports and the study archive](guide/exports-and-archive.qmd): the exit +5. [Exports and the study archive](/edc-core/guide/exports-and-archive/): the exit path, because your data outliving the system is part of the decision. -6. [Deployment](deployment.qmd): what running this in production actually +6. [Deployment](/edc-core/deployment/): what running this in production actually involves, whether or not you operate it yourself. ## Clinical operations and site staff {#clinical-ops} @@ -91,19 +91,19 @@ Your world is subjects, visits, and queries. This track stays on the site-facing surfaces. Follow along as `demo-coord` (coordinator) and `demo-inv` (investigator). -1. [Five-minute tour](tour.qmd): the fastest way to see what sites, monitors, +1. [Five-minute tour](/edc-core/tour/): the fastest way to see what sites, monitors, and data management each do in the system. -2. [Data capture](guide/data-capture.qmd): the subject matrix, subject +2. [Data capture](/edc-core/guide/data-capture/): the subject matrix, subject lifecycle (screening, enrolled, withdrawn, reinstated), entry, and corrections. -3. [Site form layouts](guide/site-forms.qmd): reorganizing a visit's forms +3. [Site form layouts](/edc-core/guide/site-forms/): reorganizing a visit's forms around your clinic's flow without changing what the study collects. -4. [Review workflows](guide/review.qmd): answering queries, what the monitor +4. [Review workflows](/edc-core/guide/review/): answering queries, what the monitor is doing when a form shows *verified*, and what signing commits you to. -5. [Notifications](guide/notifications.qmd): how query and signature work +5. [Notifications](/edc-core/guide/notifications/): how query and signature work finds you instead of waiting on a dashboard. -6. [Blinding](guide/blinding.qmd): why some staff see the arm while others +6. [Blinding](/edc-core/guide/blinding/): why some staff see the arm while others see a masked field, and what breaking the blind records. -If none of these fit, the [user guide sidebar](guide/study-builds.qmd) lists -every page by topic, and the [glossary](glossary.qmd) covers the vocabulary. +If none of these fit, the [user guide sidebar](/edc-core/guide/study-builds/) lists +every page by topic, and the [glossary](/edc-core/glossary/) covers the vocabulary. diff --git a/site/tour.qmd b/site/src/content/docs/tour.md similarity index 80% rename from site/tour.qmd rename to site/src/content/docs/tour.md index 46927f3..4852eb2 100644 --- a/site/tour.qmd +++ b/site/src/content/docs/tour.md @@ -2,6 +2,7 @@ title: "Five-minute tour" --- + This tour walks the entire clinical data lifecycle on the seeded demo study, from data entry with edit checks through query resolution, source data verification, Part 11 signature, snapshot publication, and self-service @@ -9,7 +10,7 @@ analytics, switching between the clinical roles that would perform each step in a real study. Prerequisite: a running stack with the demo study seeded -([Installation](installation.qmd)). The demo users are `demo-admin`, +([Installation](/edc-core/installation/)). The demo users are `demo-admin`, `demo-dm` (data manager), `demo-inv` (investigator), `demo-coord` (site coordinator), and `demo-cra` (monitor); they share the password printed by `db:seed-demo`. @@ -20,16 +21,16 @@ Sign in as **`demo-coord`**. You land on the studies list. Users only see studies they've been granted a role on, and site-scoped roles only see their site's subjects. -![](images/studies.png){.screenshot fig-alt="Studies list showing the demo study"} +![Studies list showing the demo study](../../assets/screenshots/studies.png) Open the study, then **subjects**. The subject matrix shows every subject × event × form and its workflow state at a glance, with each subject's lifecycle status (screening, enrolled, completed, withdrawn) badged next to their key: -![](images/subject-matrix.png){.screenshot fig-alt="Subject matrix with form status per event"} +![Subject matrix with form status per event](../../assets/screenshots/subject-matrix.png) -*Full guide: [Data capture](guide/data-capture.qmd).* +*Full guide: [Data capture](/edc-core/guide/data-capture/).* ## 2. Correct data and watch the query close itself @@ -37,7 +38,7 @@ DEMO-002's Vital Signs form is *in progress* with **1 open query**: the seeded systolic blood pressure (62 mmHg) failed the plausible-range edit check, which automatically raised a system query. -![](images/form-entry.png){.screenshot fig-alt="Vital Signs entry form with an open system query and edit check warnings"} +![Vital Signs entry form with an open system query and edit check warnings](../../assets/screenshots/form-entry.png) Enter a plausible value (say `118`) and save, providing a reason for change: every modification to saved clinical data requires one, and the prior value @@ -49,7 +50,7 @@ client-side for instant feedback and server-side as the source of truth. Checks can also read the subject's *other* forms (an AE onset date against the visit date, say); those run server-side only and come back marked **checked on save**. See -[cross-form checks](guide/rules-and-derivations.qmd#cross-form-checks). +[cross-form checks](/edc-core/guide/rules-and-derivations/#cross-form-checks). The demo study's forms are dynamic, too. On the Demographics form, the pregnancy-test question only appears while the subject's recorded sex allows @@ -76,8 +77,8 @@ DEMO-002: has closed itself: a write to one form re-evaluates the checks that read it, wherever their queries live. -*Full guide: [Data capture](guide/data-capture.qmd#conditional-and-computed-fields) -for the entry side, [Rules and derivations](guide/rules-and-derivations.qmd) +*Full guide: [Data capture](/edc-core/guide/data-capture/#conditional-and-computed-fields) +for the entry side, [Rules and derivations](/edc-core/guide/rules-and-derivations/) for authoring the checks and computations themselves.* ## 3. Verify as a monitor @@ -90,10 +91,10 @@ current state allow them. You can also review every query across the study from the **queries** dashboard: -![](images/queries.png){.screenshot fig-alt="Study-wide query dashboard"} +![Study-wide query dashboard](../../assets/screenshots/queries.png) -*Full guide: [Review workflows](guide/review.qmd) and -[Notifications](guide/notifications.qmd).* +*Full guide: [Review workflows](/edc-core/guide/review/) and +[Notifications](/edc-core/guide/notifications/).* ## 4. Sign as the investigator @@ -103,7 +104,7 @@ signature records name, date/time, and meaning, and is cryptographically bound (SHA-256) to the exact record versions signed. If the form is later reopened for editing, the signature is invalidated, visibly and irreversibly. -*Full guide: [Review workflows](guide/review.qmd#electronic-signatures-21-cfr-part-11).* +*Full guide: [Review workflows](/edc-core/guide/review/#electronic-signatures-21-cfr-part-11).* ## 5. Review the audit trail @@ -112,9 +113,9 @@ Any create, change, or state transition you just performed is in the study's to CSV. Append-only storage is enforced by database triggers, so history cannot be rewritten even by a buggy application path. -![](images/audit-trail.png){.screenshot fig-alt="Audit trail review UI with filters"} +![Audit trail review UI with filters](../../assets/screenshots/audit-trail.png) -*Full guide: [Review workflows](guide/review.qmd#audit-trail-review).* +*Full guide: [Review workflows](/edc-core/guide/review/#audit-trail-review).* ## 6. Publish a snapshot and analyze it @@ -126,14 +127,14 @@ return identical results forever. Run SQL against the pinned snapshot: -![](images/workbench-sql.png){.screenshot fig-alt="SQL workbench with query results"} +![SQL workbench with query results](../../assets/screenshots/workbench-sql.png) Or switch to the **R** or **Python** tab: scripts execute server-side in sandboxed containers with `lake_read()` / `lake_query()` helpers (data.frames in R, pandas DataFrames in Python), and every execution is recorded with its code, logs, and results: -![](images/workbench-r.png){.screenshot fig-alt="R workbench with console output and execution history"} +![R workbench with console output and execution history](../../assets/screenshots/workbench-r.png) Then close the loop the way a data manager would. A listing that finds problems can raise queries without re-keying anything. Run: @@ -153,8 +154,8 @@ hears about the batch once, and each query records the execution and snapshot that raised it. Run the preview again and every row now reports an existing query: the loop does not double-file. -*Full guide: [Analytics workbench](guide/analytics.qmd), and -[From listings to queries](guide/analytics.qmd#from-listings-to-queries) +*Full guide: [Analytics workbench](/edc-core/guide/analytics/), and +[From listings to queries](/edc-core/guide/analytics/#from-listings-to-queries) for this workflow.* ## 7. Export and archive @@ -166,10 +167,10 @@ JSON), all datasets, the complete audit trail, the signature manifest, and a PDF casebook for every subject. *Full guide: [Exports, casebooks, and the study -archive](guide/exports-and-archive.qmd).* +archive](/edc-core/guide/exports-and-archive/).* That's the whole loop: capture → clean → verify → sign → snapshot → analyze → archive, with every step audited. And it is a loop, not a line: the analysis step raises the next round of cleaning queries itself. For details on any -piece, head to the [user guide](guide/study-builds.qmd) or pick a -[reading track for your role](start-here.qmd). +piece, head to the [user guide](/edc-core/guide/study-builds/) or pick a +[reading track for your role](/edc-core/start-here/). diff --git a/site/src/styles/custom.css b/site/src/styles/custom.css new file mode 100644 index 0000000..ce9d387 --- /dev/null +++ b/site/src/styles/custom.css @@ -0,0 +1,211 @@ +/* edc-core design system: zinc palette matching the app chrome, blue accent. */ + +:root { + /* dark theme (Starlight default root) */ + --sl-color-accent-low: #1e3a8a; + --sl-color-accent: #3b82f6; + --sl-color-accent-high: #bfdbfe; + --sl-color-white: #fafafa; /* zinc-50 */ + --sl-color-gray-1: #e4e4e7; /* zinc-200 */ + --sl-color-gray-2: #d4d4d8; /* zinc-300 */ + --sl-color-gray-3: #a1a1aa; /* zinc-400 */ + --sl-color-gray-4: #71717a; /* zinc-500 */ + --sl-color-gray-5: #3f3f46; /* zinc-700 */ + --sl-color-gray-6: #27272a; /* zinc-800 */ + --sl-color-black: #18181b; /* zinc-900, the app chrome color */ + + --edc-screenshot-border: #3f3f46; + --edc-surface: #1f1f23; +} + +:root[data-theme="light"] { + --sl-color-accent-low: #dbeafe; + --sl-color-accent: #2563eb; + --sl-color-accent-high: #1e40af; + --sl-color-white: #18181b; /* text: zinc-900 */ + --sl-color-gray-1: #27272a; /* zinc-800 */ + --sl-color-gray-2: #3f3f46; /* zinc-700 */ + --sl-color-gray-3: #52525b; /* zinc-600 */ + --sl-color-gray-4: #a1a1aa; /* zinc-400 */ + --sl-color-gray-5: #e4e4e7; /* zinc-200 */ + --sl-color-gray-6: #f4f4f5; /* zinc-100 */ + --sl-color-gray-7: #fafafa; /* zinc-50 */ + --sl-color-black: #ffffff; + + --edc-screenshot-border: #e4e4e7; + --edc-surface: #fafafa; +} + +/* Content typography: slightly tighter headings, comfortable measure */ +.sl-markdown-content h2 { + letter-spacing: -0.015em; +} + +/* Every content image is an app screenshot: card treatment on a deliberate + surface so light-chrome screenshots sit well in dark mode too. */ +.sl-markdown-content img { + border: 1px solid var(--edc-screenshot-border); + border-radius: 0.75rem; + box-shadow: 0 1px 3px rgb(0 0 0 / 8%); + background: #ffffff; +} + +/* Tables: quieter borders, zinc header row */ +.sl-markdown-content table { + font-size: var(--sl-text-sm); +} +.sl-markdown-content th { + background: var(--edc-surface); +} + +/* --------------------------------------------------------------------------- + Landing page (index.mdx, template: splash) +--------------------------------------------------------------------------- */ + +.landing { + --landing-max: 72rem; +} + +/* Starlight splash hero: centered, constrained measure, product-style CTAs */ +.hero { + padding-block: 3.5rem 1.5rem; + grid-template-columns: 1fr; +} + +.hero .copy { + align-items: center; + text-align: center; + margin-inline: auto; +} + +.hero h1 { + max-width: 46rem; + font-size: clamp(2.2rem, 5vw, 3.5rem); + line-height: 1.08; + letter-spacing: -0.03em; +} + +.hero .tagline { + max-width: 46rem; + color: var(--sl-color-gray-3); + font-size: var(--sl-text-lg); +} + +.hero .actions { + justify-content: center; +} + +.sl-link-button.primary { + background: var(--sl-color-accent); + border-color: var(--sl-color-accent); + color: #ffffff; +} + +.sl-link-button.secondary { + border: 1px solid var(--sl-color-gray-5); +} + +.landing-shot { + max-width: var(--landing-max); + margin: 0 auto 4rem; +} + +.landing-shot img { + width: 100%; + height: auto; + border: 1px solid var(--edc-screenshot-border); + border-radius: 0.9rem; + box-shadow: 0 20px 50px -20px rgb(0 0 0 / 35%); + background: #ffffff; +} + +.landing-shot figcaption { + text-align: center; + color: var(--sl-color-gray-3); + font-size: var(--sl-text-sm); + margin-top: 0.9rem; +} + +.landing section { + max-width: var(--landing-max); + margin: 0 auto 4rem; +} + +.landing h2 { + font-size: var(--sl-text-2xl); + letter-spacing: -0.02em; + text-align: center; + margin-bottom: 2rem; +} + +.landing-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(17rem, 1fr)); + gap: 1rem; +} + +/* 4-card sections: 4-up on wide screens, 2x2 in between, instead of 3+1 */ +@media (min-width: 72rem) { + .landing-grid--4 { + grid-template-columns: repeat(4, 1fr); + } +} +@media (min-width: 40rem) and (max-width: 71.99rem) { + .landing-grid--4 { + grid-template-columns: repeat(2, 1fr); + } +} + +.landing-card { + border: 1px solid var(--sl-color-gray-5); + border-radius: 0.9rem; + padding: 1.4rem 1.5rem; + background: var(--edc-surface); +} + +.landing-card h3 { + font-size: var(--sl-text-base); + font-weight: 600; + letter-spacing: -0.01em; + margin-bottom: 0.6rem; +} + +.landing-card p { + font-size: var(--sl-text-sm); + color: var(--sl-color-gray-3); + line-height: 1.6; + margin: 0; +} + +.landing-card p a { + color: var(--sl-color-accent-high); +} + +a.landing-card { + display: block; + text-decoration: none; + color: inherit; + transition: + border-color 120ms ease, + transform 120ms ease; +} + +a.landing-card:hover { + border-color: var(--sl-color-accent); + transform: translateY(-2px); +} + +a.landing-card h3 { + color: var(--sl-color-accent-high); +} + +.landing-status { + border: 1px solid var(--sl-color-gray-5); + border-left: 4px solid var(--sl-color-accent); + border-radius: 0.6rem; + padding: 1.1rem 1.4rem; + font-size: var(--sl-text-sm); + color: var(--sl-color-gray-2); + max-width: 52rem; + margin-inline: auto; +} diff --git a/site/theme.scss b/site/theme.scss deleted file mode 100644 index 2d9f453..0000000 --- a/site/theme.scss +++ /dev/null @@ -1,33 +0,0 @@ -/*-- scss:defaults --*/ - -$font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, - "Helvetica Neue", Arial, sans-serif; -$font-family-monospace: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; - -$primary: #18181b; // zinc-900, matching the app chrome -$body-color: #27272a; // zinc-800 -$link-color: #2563eb; -$navbar-bg: #18181b; -$code-bg: #f4f4f5; // zinc-100 -$code-color: #18181b; - -/*-- scss:rules --*/ - -// screenshots: subtle card treatment -img.screenshot, -.screenshot img { - border: 1px solid #e4e4e7; // zinc-200 - border-radius: 0.75rem; - box-shadow: 0 1px 3px rgb(0 0 0 / 8%); -} - -.hero-lead { - font-size: 1.15rem; - color: #52525b; // zinc-600 - max-width: 46rem; -} - -figcaption { - color: #71717a; // zinc-500 - font-size: 0.875rem; -} diff --git a/site/tsconfig.json b/site/tsconfig.json new file mode 100644 index 0000000..8bf91d3 --- /dev/null +++ b/site/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "astro/tsconfigs/strict", + "include": [".astro/types.d.ts", "**/*"], + "exclude": ["dist"] +} From b179cf7740325cefd7c57fef8879ffb36c9ef860 Mon Sep 17 00:00:00 2001 From: Travis Gerke Date: Thu, 23 Jul 2026 09:53:30 -0700 Subject: [PATCH 2/2] Zero out Starlight's sibling margin inside the landing card grid Starlight's content spacing rule adds margin-top to every grid child after the first, so the first card in each row sat 1rem higher than its neighbors. --- site/src/styles/custom.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/site/src/styles/custom.css b/site/src/styles/custom.css index ce9d387..8d0f26a 100644 --- a/site/src/styles/custom.css +++ b/site/src/styles/custom.css @@ -144,6 +144,12 @@ gap: 1rem; } +/* Starlight's content sibling-spacing rule adds margin-top to every card + after the first, skewing the grid rows; the gap is the only spacing here. */ +.landing-grid > .landing-card { + margin-top: 0 !important; +} + /* 4-card sections: 4-up on wide screens, 2x2 in between, instead of 3+1 */ @media (min-width: 72rem) { .landing-grid--4 {