From 0c26da3eb68788720dffc55bb28859848eddceb1 Mon Sep 17 00:00:00 2001
From: GothwadTech <295316515+GothwadTech@users.noreply.github.com>
Date: Wed, 14 Oct 2026 08:26:09 +0000
Subject: [PATCH] Build Gothwad Tech developer documentation portal
Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
---
.github/workflows/ci.yml | 20 +
.gitignore | 10 +
.prettierignore | 6 +
.prettierrc.json | 1 +
README.md | 114 +-
SOURCES.md | 50 +
index.html | 24 +
package-lock.json | 4159 ++++++++++++++++++++++++++++++++
package.json | 38 +
playwright.config.ts | 22 +
public/_headers | 7 +
public/_redirects | 1 +
public/favicon.svg | 1 +
src/App.tsx | 1366 +++++++++++
src/content/accounts-setup.mdx | 71 +
src/content/accounts.mdx | 49 +
src/content/ai.mdx | 35 +
src/content/api.mdx | 65 +
src/content/architecture.mdx | 49 +
src/content/browser.mdx | 29 +
src/content/clashdrive.mdx | 40 +
src/content/cloudflare.mdx | 64 +
src/content/contributing.mdx | 47 +
src/content/education.mdx | 40 +
src/content/gothwadtech.mdx | 32 +
src/content/grixchat.mdx | 48 +
src/content/launcher.mdx | 33 +
src/content/mail-setup.mdx | 80 +
src/content/mail.mdx | 59 +
src/content/manager.mdx | 37 +
src/content/meet.mdx | 50 +
src/content/oauth.mdx | 112 +
src/content/quickstart.mdx | 59 +
src/content/security.mdx | 44 +
src/content/tube.mdx | 50 +
src/data.ts | 288 +++
src/main.tsx | 13 +
src/repositories.json | 275 +++
src/styles.css | 2600 ++++++++++++++++++++
src/vite-env.d.ts | 6 +
tests/content.test.mjs | 90 +
tests/e2e/site.spec.ts | 134 +
tsconfig.json | 20 +
vite.config.ts | 23 +
44 files changed, 10360 insertions(+), 1 deletion(-)
create mode 100644 .github/workflows/ci.yml
create mode 100644 .gitignore
create mode 100644 .prettierignore
create mode 100644 .prettierrc.json
create mode 100644 SOURCES.md
create mode 100644 index.html
create mode 100644 package-lock.json
create mode 100644 package.json
create mode 100644 playwright.config.ts
create mode 100644 public/_headers
create mode 100644 public/_redirects
create mode 100644 public/favicon.svg
create mode 100644 src/App.tsx
create mode 100644 src/content/accounts-setup.mdx
create mode 100644 src/content/accounts.mdx
create mode 100644 src/content/ai.mdx
create mode 100644 src/content/api.mdx
create mode 100644 src/content/architecture.mdx
create mode 100644 src/content/browser.mdx
create mode 100644 src/content/clashdrive.mdx
create mode 100644 src/content/cloudflare.mdx
create mode 100644 src/content/contributing.mdx
create mode 100644 src/content/education.mdx
create mode 100644 src/content/gothwadtech.mdx
create mode 100644 src/content/grixchat.mdx
create mode 100644 src/content/launcher.mdx
create mode 100644 src/content/mail-setup.mdx
create mode 100644 src/content/mail.mdx
create mode 100644 src/content/manager.mdx
create mode 100644 src/content/meet.mdx
create mode 100644 src/content/oauth.mdx
create mode 100644 src/content/quickstart.mdx
create mode 100644 src/content/security.mdx
create mode 100644 src/content/tube.mdx
create mode 100644 src/data.ts
create mode 100644 src/main.tsx
create mode 100644 src/repositories.json
create mode 100644 src/styles.css
create mode 100644 src/vite-env.d.ts
create mode 100644 tests/content.test.mjs
create mode 100644 tests/e2e/site.spec.ts
create mode 100644 tsconfig.json
create mode 100644 vite.config.ts
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..834baf7
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,20 @@
+name: Validate documentation
+on:
+ push:
+ pull_request:
+permissions:
+ contents: read
+jobs:
+ validate:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-node@v4
+ with:
+ node-version: 22
+ cache: npm
+ - run: npm ci
+ - run: npm test
+ - run: npm run build
+ - run: npx playwright install --with-deps chromium
+ - run: npm run test:e2e
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..2ad7677
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+node_modules/
+dist/
+.env
+.env.*
+!.env.example
+.dev.vars
+.research/
+*.tsbuildinfo
+playwright-report/
+test-results/
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 0000000..a0bee48
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,6 @@
+node_modules
+dist
+package-lock.json
+playwright-report
+test-results
+src/content
diff --git a/.prettierrc.json b/.prettierrc.json
new file mode 100644
index 0000000..8775053
--- /dev/null
+++ b/.prettierrc.json
@@ -0,0 +1 @@
+{ "singleQuote": true, "trailingComma": "all", "proseWrap": "preserve" }
diff --git a/README.md b/README.md
index 9b69328..6253f51 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,113 @@
-# docs
+# Gothwad Tech · Developer documentation
+
+A central, source-based documentation portal for the Gothwad Tech ecosystem. Built with **React 19, Vite, TypeScript, MDX, and CSS**, with a responsive Cloudflare-inspired interface and a distinct Gothwad identity.
+
+## Included
+
+- 12 product guides and 21 MDX pages in total.
+- Accounts deployment and OAuth / PKCE integration, Mail setup and REST reference, PlusTube web, Meet, GrixChat, and additional product orientations.
+- Full-text local search with `Ctrl+K` / `⌘K`, keyboard navigation, and no external search service.
+- Product category filters, a searchable public-repository inventory, and guide indexes.
+- Light/dark themes, responsive mobile navigation, heading anchors, page outlines, and copyable code blocks.
+- Source references, contribution links, and clearly labeled documentation boundaries.
+- Cloudflare Pages redirects and security/cache headers.
+- Content-integrity tests, browser tests, and GitHub Actions validation.
+
+**Coverage is intentionally explicit:** this is a curated initial documentation release, not a claim that every product or deployment is fully documented or verified. See [SOURCES.md](SOURCES.md). No live product infrastructure was changed.
+
+## Local development
+
+Use **Node.js 22.13 or later** (Node 22 LTS recommended).
+
+```bash
+npm ci
+npm run dev
+```
+
+Vite prints the local URL. The dev server listens on `0.0.0.0`; `.e2b.app` preview hosts are allowed. No environment variables or API keys are needed for this documentation site.
+
+```bash
+npm test # Metadata, content, links, and deployment-file checks
+npm run build # TypeScript check + Vite / MDX production build
+npm run preview # Serve the production dist directory
+```
+
+### Browser tests
+
+```bash
+npx playwright install --with-deps chromium
+npm run test:e2e
+```
+
+The Playwright configuration starts Vite automatically, or reuses the local development server. The tests cover all 21 guides, search, filters, deep links, anchors, code copy, theme persistence, feedback, repository search, not-found routes, and mobile overflow/navigation. To use an already-installed browser, set `CHROMIUM_PATH` to its executable. `TEST_BASE_URL` can point tests at a separately running production preview.
+
+## Deploy to Cloudflare Pages
+
+1. Push the finished code to the branch you intend to deploy. The current development work is on `arena/14d98888-docs`; production can follow your normal reviewed merge process.
+2. In Cloudflare, create a **Pages** project and connect `GothwadTech/docs`.
+3. Select the branch that contains this implementation.
+4. Configure:
+
+ | Setting | Value |
+ | ---------------------- | ----------------- |
+ | Framework preset | Vite |
+ | Build command | `npm run build` |
+ | Build output directory | `dist` |
+ | Root directory | Repository root |
+ | Environment variable | `NODE_VERSION=22` |
+
+5. Deploy and test `/`, `/products`, and a direct guide URL such as `/docs/oauth`.
+6. Add your own domain in the project's **Custom domains** settings and complete the DNS instructions Cloudflare supplies.
+
+No runtime Worker, database, or secret is required. `public/_redirects` ensures SPA deep links work. `public/_headers` sets safe static headers and long-lived caching only for hashed assets. This does not deploy the Accounts or Mail Workers; those are separate products with separate guides.
+
+This is a client-rendered SPA. Per-route titles and descriptions are updated in the browser. Prerendered HTML, a production-domain sitemap, and localized content can be added once the production domain and publishing strategy are decided; they are not presented as already implemented.
+
+## Content structure
+
+```text
+src/
+ App.tsx Layout, routing, search, and MDX UI components
+ data.ts Product and guide metadata
+ content/*.mdx Source-based documentation
+ repositories.json Public GitHub inventory snapshot
+ styles.css Responsive light and dark styles
+public/
+ favicon.svg
+ _redirects
+ _headers
+tests/
+ content.test.mjs Content and link integrity
+ e2e/site.spec.ts Browser interactions and route checks
+SOURCES.md Source revisions and coverage boundaries
+```
+
+### Add a guide
+
+1. Create `src/content/your-guide.mdx`.
+2. Add matching metadata to `docs` in `src/data.ts`. The slug must match the filename.
+3. Use `##` headings for the on-page outline and fenced code blocks for snippets.
+4. Add `… ` for warnings or configuration boundaries.
+5. Cite verified product source files and update `SOURCES.md` with the reviewed revision.
+6. Run tests and the build, then inspect the route, search results, mobile layout, and dark theme.
+
+MDX is compiled at build time and must be reviewed trusted repository content. There is no runtime upload or execution of untrusted MDX. Raw content is also bundled for local full-text search; never put secrets in a guide, even in a hidden component or example.
+
+### Refresh the repository inventory
+
+With your own authenticated GitHub CLI:
+
+```bash
+gh repo list GothwadTech --limit 100 \
+ --json name,description,url,isPrivate,isFork > src/repositories.json
+```
+
+Review the output and retain **public repositories only** before committing. This inventory is not fetched from visitors' browsers. Repo descriptions and product documentation are snapshots, not automatic live synchronization.
+
+## Privacy and feedback
+
+Search runs locally. Theme preference and page-helpfulness selections are stored only in the current browser's local storage; feedback is **not sent to a backend**. The interface links to GitHub issues for actionable feedback. The site does not request product tokens, cookies, passwords, or provider keys.
+
+## Source and licensing boundaries
+
+Product documentation is paraphrased from public GothwadTech source files and credits the relevant repositories. Product licenses differ: public source does not imply an open-source license. Browser's source-available restrictions and PlusTube's upstream Flow attribution are explicitly noted. No product secrets or native signing materials are included.
diff --git a/SOURCES.md b/SOURCES.md
new file mode 100644
index 0000000..c69dc3d
--- /dev/null
+++ b/SOURCES.md
@@ -0,0 +1,50 @@
+# Documentation sources and coverage
+
+Reviewed **October 14, 2026 (UTC)** using the public GothwadTech GitHub repositories and the authenticated GitHub CLI. The table records the reviewed source revisions. Central guides are curated paraphrases, not verbatim mirrors or live-updating API contracts.
+
+## Source revisions
+
+| Repository | Reviewed revision | Source material | Coverage |
+| --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | ------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
+| [accounts](https://github.com/GothwadTech/accounts) | [`a00407a5ac48`](https://github.com/GothwadTech/accounts/tree/a00407a5ac48376fce237bf96696d133d4792f74) | README; docs/SETUP.md, OAUTH.md, ARCHITECTURE.md | Local setup, deployment, OAuth, configuration. Code examples strengthen state validation and preserve the API base path. |
+| [mail](https://github.com/GothwadTech/mail) | [`3d31be6c9148`](https://github.com/GothwadTech/mail/tree/3d31be6c9148918e01952f6fbe5e41bb25276e82) | README; docs/SETUP.md, MAIL.md | Local setup, Worker/Pages deployment, SSO troubleshooting, REST endpoints, documented limits. |
+| [gothwadtech](https://github.com/GothwadTech/gothwadtech) | [`5e12d5de5bc8`](https://github.com/GothwadTech/gothwadtech/tree/5e12d5de5bc8743c0cf79a11a38226f6417f8234) | README; recursive repository tree | Web platform orientation. Corporate marketing claims are not reproduced as measured guarantees. |
+| [tubeweb](https://github.com/GothwadTech/tubeweb) | [`bcd3d70eeed6`](https://github.com/GothwadTech/tubeweb/tree/bcd3d70eeed6f27f413203aed5eba2eb9ec5a87e) | README; recursive repository tree | Website setup, Pages deployment, JSON release-data pipeline, upstream attribution. |
+| [meet](https://github.com/GothwadTech/meet) | [`dd2e84d9c9f2`](https://github.com/GothwadTech/meet/tree/dd2e84d9c9f2c1431aca0fbde7d1ea6e508e4eea) | README; package.json | Local setup, meeting verification, Pages deployment, browser/network limitations. |
+| [grixchat](https://github.com/GothwadTech/grixchat) | [`5a5757f791ec`](https://github.com/GothwadTech/grixchat/tree/5a5757f791ecb0108f3b5a2c1374c69491969680) | README; package.json | Mock and real development paths, API architecture, SQL ordering, Pages Functions. |
+| [ai](https://github.com/GothwadTech/ai) | [`678cb7438a79`](https://github.com/GothwadTech/ai/tree/678cb7438a79cba72152a98764a10639b7f34c66) | README; repository description | Short local-development orientation only. Public API and hosted architecture not verified. |
+| [launcher](https://github.com/GothwadTech/launcher) | [`bc9568b8f11d`](https://github.com/GothwadTech/launcher/tree/bc9568b8f11d6745a3e1984936bd03112d2240be) | README | Android prerequisites, debug/release builds, CI orientation, signing boundaries. |
+| [browser](https://github.com/GothwadTech/browser) | [`3c3f21046c91`](https://github.com/GothwadTech/browser/tree/3c3f21046c916dbb37993d575389377f60880a1d) | README | Product and installation orientation only; proprietary source restrictions called out. |
+| [manager](https://github.com/GothwadTech/manager) | [`3c3949acf7dd`](https://github.com/GothwadTech/manager/tree/3c3949acf7ddf675177728d60a4b83e15a56d7d2) | README | Android build prerequisites and safe test/release orientation. |
+| [education](https://github.com/GothwadTech/education) | [`60ebeff1b872`](https://github.com/GothwadTech/education/tree/60ebeff1b87238b90d70f13538c1c8c232fd1997) | README | Role-based product overview, local setup, explicit production-verification boundary. |
+| [Clashdrive](https://github.com/GothwadTech/Clashdrive) | [`7ece22222721`](https://github.com/GothwadTech/Clashdrive/tree/7ece222227219b38b358cc030ce8a0d4ad5a3e8e) | README | Bun setup, Telegram storage architecture, sharing and session cautions. |
+| [store](https://github.com/GothwadTech/store) | [`8a395713d305`](https://github.com/GothwadTech/store/tree/8a395713d3052ea6541a2b9e0b14de8d8f77a506) | Recursive repository tree; repository description | Inventory only; no README was available at review. No public API or deployment contract inferred. |
+
+## Central portal
+
+`quickstart`, `architecture`, `cloudflare`, `security`, and `contributing` are editorial guides for the actual implementation in this repository and the source-described product boundaries. The API page covers Accounts OAuth and the documented Mail API, not every internal endpoint across every product.
+
+The `tubeapp` README and public repository metadata were also reviewed for product context. App-specific Android release details are delegated to that repository instead of guessed from the website build.
+
+## Repository inventory
+
+`src/repositories.json` contains a snapshot of 39 public repositories returned by `gh repo list GothwadTech`. The directory links to undetailed repositories with **Repository only** coverage labels. A repository appearing here is not a claim that it is active, production-ready, or open-source. Additional repositories, prototypes, forks, and policy-only projects have not received full technical guides in this initial release.
+
+No source files from the `keystore` repository were accessed or imported. Only public repository metadata appears in the inventory.
+
+## Important distinctions
+
+- Accounts' frontend has no Vite build; publish `web/`. This docs site and the documented Vite web products publish `dist/`.
+- Mail uses a separate Supabase project and its current documented flow is shared-cookie SSO. Do not claim the optional future OAuth callback is required for this flow.
+- Mail attachment metadata is stored, not attachment bytes.
+- Accounts' server-to-server base and browser sign-in URL are distinct in the Mail deployment guide.
+- OAuth examples add explicit state validation and avoid dropping `/api` when constructing authorization URLs. They are illustrative integration code, not an official SDK package.
+- Accounts' listed Drive scopes do not prove a production Drive API or integration with Clash Drive.
+- Meet's static frontend still needs WebRTC signaling/connectivity. No load or capacity guarantee is made.
+- Browser's public repository declares proprietary/source-available restrictions.
+- PlusTube derives from Flow by A-EDev and contributors; attribution is retained.
+- Product backends and live domains were not deployed or end-to-end tested during this docs-site implementation. Local docs-site tests are not product integration tests.
+
+## Maintaining this record
+
+For an update, review the changed upstream source, record its commit, adjust affected MDX pages, and rerun the tests. Do not copy raw API keys, session responses, user data, private environment files, or signing materials into documentation.
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..e3d9057
--- /dev/null
+++ b/index.html
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+ Gothwad Tech Developers · Documentation
+
+
+
+
+
+
+
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..bab48b6
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,4159 @@
+{
+ "name": "gothwad-developer-docs",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "gothwad-developer-docs",
+ "version": "1.0.0",
+ "dependencies": {
+ "@fontsource-variable/inter": "^5.2.8",
+ "@mdx-js/react": "^3.1.1",
+ "lucide-react": "^0.468.0",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
+ "react-router-dom": "^7.1.0"
+ },
+ "devDependencies": {
+ "@mdx-js/rollup": "^3.1.1",
+ "@playwright/test": "^1.64.0",
+ "@types/mdx": "^2.0.13",
+ "@types/react": "^19.0.0",
+ "@types/react-dom": "^19.0.0",
+ "@vitejs/plugin-react": "^4.3.4",
+ "prettier": "^3.9.10",
+ "remark-gfm": "^4.0.1",
+ "typescript": "~5.7.3",
+ "vite": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=22.13.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
+ "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.29.7",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz",
+ "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz",
+ "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.7",
+ "@babel/generator": "^7.29.7",
+ "@babel/helper-compilation-targets": "^7.29.7",
+ "@babel/helper-module-transforms": "^7.29.7",
+ "@babel/helpers": "^7.29.7",
+ "@babel/parser": "^7.29.7",
+ "@babel/template": "^7.29.7",
+ "@babel/traverse": "^7.29.7",
+ "@babel/types": "^7.29.7",
+ "@jridgewell/remapping": "^2.3.5",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz",
+ "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.8",
+ "@babel/types": "^7.29.8",
+ "@jridgewell/gen-mapping": "^0.3.12",
+ "@jridgewell/trace-mapping": "^0.3.28",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz",
+ "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.29.7",
+ "@babel/helper-validator-option": "^7.29.7",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-globals": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz",
+ "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz",
+ "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz",
+ "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz",
+ "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz",
+ "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
+ "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz",
+ "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.29.10",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.10.tgz",
+ "integrity": "sha512-EMCx3AGZ3WfAl6ht7AyQoPm2Lh+BGYEMdc4Q6Hf7uSCDOZFuLq44qNwL+iaim8VlyYhRAo4X43+weadK8ZB4Yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.29.7",
+ "@babel/types": "^7.29.8"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.29.9",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.9.tgz",
+ "integrity": "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.8"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz",
+ "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz",
+ "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz",
+ "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.7",
+ "@babel/parser": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.29.10",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.10.tgz",
+ "integrity": "sha512-B3lYAs2nkKskbgQ1nfy8Ma9ao9Q1rntTAQHrzzyDuj+TSO+X3le6PfWwqDvodsb+OumE10eMFfuMCTQSQ5iuIQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.7",
+ "@babel/generator": "^7.29.8",
+ "@babel/helper-globals": "^7.29.7",
+ "@babel/parser": "^7.29.9",
+ "@babel/template": "^7.29.7",
+ "@babel/types": "^7.29.8",
+ "debug": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz",
+ "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz",
+ "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz",
+ "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz",
+ "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz",
+ "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz",
+ "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz",
+ "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz",
+ "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz",
+ "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz",
+ "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz",
+ "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz",
+ "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz",
+ "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz",
+ "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz",
+ "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz",
+ "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz",
+ "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz",
+ "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz",
+ "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz",
+ "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz",
+ "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz",
+ "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz",
+ "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz",
+ "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@fontsource-variable/inter": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/@fontsource-variable/inter/-/inter-5.3.0.tgz",
+ "integrity": "sha512-OupL48va4JNofb97w6NYeF9S7W/kHNKM0Er8Dem5nqi4jeOLrVJDoE8tZEpnMJmtkvNbB1EIPPwHcdkF6b1oUA==",
+ "license": "OFL-1.1",
+ "funding": {
+ "url": "https://github.com/sponsors/ayuhito"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/remapping": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz",
+ "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@mdx-js/mdx": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz",
+ "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdx": "^2.0.0",
+ "acorn": "^8.0.0",
+ "collapse-white-space": "^2.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "estree-util-scope": "^1.0.0",
+ "estree-walker": "^3.0.0",
+ "hast-util-to-jsx-runtime": "^2.0.0",
+ "markdown-extensions": "^2.0.0",
+ "recma-build-jsx": "^1.0.0",
+ "recma-jsx": "^1.0.0",
+ "recma-stringify": "^1.0.0",
+ "rehype-recma": "^1.0.0",
+ "remark-mdx": "^3.0.0",
+ "remark-parse": "^11.0.0",
+ "remark-rehype": "^11.0.0",
+ "source-map": "^0.7.0",
+ "unified": "^11.0.0",
+ "unist-util-position-from-estree": "^2.0.0",
+ "unist-util-stringify-position": "^4.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/@mdx-js/react": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz",
+ "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdx": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16",
+ "react": ">=16"
+ }
+ },
+ "node_modules/@mdx-js/rollup": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@mdx-js/rollup/-/rollup-3.1.1.tgz",
+ "integrity": "sha512-v8satFmBB+DqDzYohnm1u2JOvxx6Hl3pUvqzJvfs2Zk/ngZ1aRUhsWpXvwPkNeGN9c2NCm/38H29ZqXQUjf8dw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@mdx-js/mdx": "^3.0.0",
+ "@rollup/pluginutils": "^5.0.0",
+ "source-map": "^0.7.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ },
+ "peerDependencies": {
+ "rollup": ">=2"
+ }
+ },
+ "node_modules/@napi-rs/lzma-linux-x64-gnu": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz",
+ "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^22.20 || ^24.12 || >=25"
+ }
+ },
+ "node_modules/@playwright/test": {
+ "version": "1.64.0",
+ "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.64.0.tgz",
+ "integrity": "sha512-oTN9FNYuN6bqQMwiho6jJKLCG2/QOYCixGXuCjRmzOq23eODeukuY2XiAVoVpAECbuezMt1MHQjAiQxK8F+Y+g==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "playwright": "1.64.0"
+ },
+ "bin": {
+ "playwright": "cli.js"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz",
+ "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@rollup/pluginutils": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz",
+ "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-walker": "^2.0.2",
+ "picomatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/pluginutils/node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.64.6",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.64.6.tgz",
+ "integrity": "sha512-FkO19Fowv/OQeJZPVfdetJaI3/VpbZmBsnmAlR/rQ+b3QwfiGQiOpVegpSRH331kelvHTVw9hXYG3DwjAaRzyQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.64.6",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.64.6.tgz",
+ "integrity": "sha512-si5/Etm6MphPc2xYHnk455Shls/hoMjTy3mhXge4OPmvCw7TwC4KP4fKokAlKLV4XaQvLvgSHfafPcblLMYYdQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.64.6",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.64.6.tgz",
+ "integrity": "sha512-PQCl3q7b0BgvVt72i2xrWM6I5KliwwVe4GpWW5QDGyUQawDS9aPZss/aGyFqBmxdRxlE8wDc9CaxiQ5DHRSp/Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.64.6",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.64.6.tgz",
+ "integrity": "sha512-l9DFl1Itb1YYdSrP1K3U8ih44AOHa/p+Q4WMMDfGvH5qVWp+ajfgS1DlYo4yCRh8wJ2ZJv0Fqccf+ULAmMFjmg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.64.6",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.64.6.tgz",
+ "integrity": "sha512-bR4GR3205N9+od0+l5Dd9/iZTDpJkIe6d6Ydp2qbcQZJLmKBdYQQRp8gbWpbMt92twKJY66o1vK4NkoKQODIrA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.64.6",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.64.6.tgz",
+ "integrity": "sha512-XTVNaDzcFl2TeBglvxdGgsCv9JGtAGRAoJENmGBR/XvDH2mA2K0IXc2aMfP0dR8mexSXSKifJ85FixoXX1wfTw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.64.6",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.64.6.tgz",
+ "integrity": "sha512-qWc6qbc+25ugG9vqPR9P422KJBbVfZ05mjcMggoq8tsfWP+eRfC+/tiDdIlRF5VL2pDVZWN9zAhWsmu7R1+7Dw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.64.6",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.64.6.tgz",
+ "integrity": "sha512-V4Nwkp8844X/Xnww3PI1LYS0YPei8XQEVG70R+5MPZGO7AhYoun4hCN7Svs4U3wbQLZbwiz+9xRFhUZZdRl8Ww==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.64.6",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.64.6.tgz",
+ "integrity": "sha512-xb72A1aPaaIsp+a88VtRae/ovIEXislbUMyp7b9AQQU7ZkP2m/+ik6DW9TQcJyw5R8/RIailF9zExYwkjR++UA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.64.6",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.64.6.tgz",
+ "integrity": "sha512-pbcs1BVBwC43hZkjhjlF8Rx8m5G0KnhLZs9Azy/gqccP6UsNSzJr0hKGIAVPqzAH1O/NdPxxC9GVGb4msQg/aw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
+ "version": "4.64.6",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.64.6.tgz",
+ "integrity": "sha512-EKOC8os6Vsg487ZLKUqzLF99Jsmnq6tu7O7mAELakNpcA+8KadktFf/JYdRuHe/DzCUXmN38pUKu4XBcKlqGbQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-musl": {
+ "version": "4.64.6",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.64.6.tgz",
+ "integrity": "sha512-v/SQ68GnSlr/HyjB79sNXesGDwkOPu9JjbHfmWaymCiM+nZsQ9TstG1KfA4MuEvTr2d3PoY8PhFxj9bt0e32JA==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.64.6",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.64.6.tgz",
+ "integrity": "sha512-G3pmliMQ7r15zFFNwBlaT/xTdSLi4lfgI7CUrQueyKYheNVhrd8JrWCE6Ll8xf4AA1RZFqq+mNJYntiElsVOyA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-musl": {
+ "version": "4.64.6",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.64.6.tgz",
+ "integrity": "sha512-XQTB/IPoB/wG6x/wu9uomAt8YH61IAr5iZTubMiad/lu88sotq2ocz9hJd556+Jz2kIkF7ZQZIsUuWE3OWqtcA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.64.6",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.64.6.tgz",
+ "integrity": "sha512-O5mpokth6+ydMuwiGtY8fIjvOBfH7u6SzmDNmZ3k6GK5C6iEAC2q2ZN/T5L9jYILx0IcCT0KnfMDihQ5yQFSBw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.64.6",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.64.6.tgz",
+ "integrity": "sha512-aIFxbAD9v3TvIaEDsKmukjcDg1JS4/tFXw8SHyQQgzOwzWCQ4cyDK7Ju1pQKqUXDFkEu/BZCFDCDATsKhQcB/Q==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.64.6",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.64.6.tgz",
+ "integrity": "sha512-fuNo1UwBc6BxnHDOxxguQL/InhheMN3RJcJMb0b4xP8r5Q3CNCrJbVg0eCIFuJ4e/zAfjR2gYbOfbzO/G7CIyw==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.64.6",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.64.6.tgz",
+ "integrity": "sha512-05v6wFKDKJPZs9xlytVrrRu6IbRuoSvlH9xNwEOafXsKyjBFZPvAcZz2VIAB/M+lblYeKa9iOYC4RDVdfcAAaw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.64.6",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.64.6.tgz",
+ "integrity": "sha512-wJXKcdMjvkc/FaavZXNP1yW4i0pfOmhZAIWRSLG2yJ0PB0TWi7dkLErhX0u0vptDcXKKO/m1Y/YTeuyvb2MXwg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-openbsd-x64": {
+ "version": "4.64.6",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.64.6.tgz",
+ "integrity": "sha512-cwg7/h0ThvJwy8CBkmACdiHAxRWpbsCmIsjOt+Zzx0hTnIcSUmKYEV03bGg+hD827OnwUsbKh1ZZDW754xWyBA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-openharmony-arm64": {
+ "version": "4.64.6",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.64.6.tgz",
+ "integrity": "sha512-T0RkYIJbdYXJEQFw+tMBO09KDFdgmNxkHsof3wWAABrvnx15Yh8RytmrgYy9+q9cBeBNZF66MMQZC+5nzEz6vg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.64.6",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.64.6.tgz",
+ "integrity": "sha512-KlfpmF1AAIdAWxt8QQNClbpLFlAUfYOzqIuJ7IXEStMHpFRuH78RG6FjqPb3Rqhh0K89F5npvG+/i3Fjl6IveQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.64.6",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.64.6.tgz",
+ "integrity": "sha512-MrTLjd7Jlt9/ZavJZYG61KQv9Iy9bzbY+yXy73Xvwoa2uP66wvDShkyBr5Chz/yrE6lbD/zHMuTmKQVNQqBApg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
+ "version": "4.64.6",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.64.6.tgz",
+ "integrity": "sha512-8fWDH1CkPI8GdBKAxzHDza7UmgficsKo2+MVbvUgOGhB0629w5sHMg3Qu5y7TZsrYKHHWpz8fla4KvoT7WsO3Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.64.6",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.64.6.tgz",
+ "integrity": "sha512-9/c9PWdr5GCIHkkxiHM1HjNBQMVdftP4O8QTcoUAaRza2FSqJ4axbf8QAnBuE6BIGQDl71SaRPeDdDYid5ecTw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
+ "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
+ "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.28.2"
+ }
+ },
+ "node_modules/@types/debug": {
+ "version": "4.1.13",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz",
+ "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/ms": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
+ "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/estree-jsx": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz",
+ "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/hast": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz",
+ "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/mdx": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.14.tgz",
+ "integrity": "sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/ms": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
+ "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/react": {
+ "version": "19.3.0",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.3.0.tgz",
+ "integrity": "sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==",
+ "license": "MIT",
+ "dependencies": {
+ "csstype": "^3.2.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "19.3.0",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.3.0.tgz",
+ "integrity": "sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^19.3.0"
+ }
+ },
+ "node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.4.0.tgz",
+ "integrity": "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/@vitejs/plugin-react": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz",
+ "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.28.0",
+ "@babel/plugin-transform-react-jsx-self": "^7.27.1",
+ "@babel/plugin-transform-react-jsx-source": "^7.27.1",
+ "@rolldown/pluginutils": "1.0.0-beta.27",
+ "@types/babel__core": "^7.20.5",
+ "react-refresh": "^0.17.0"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.19.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.19.0.tgz",
+ "integrity": "sha512-oJlA3XiRm7Cyk6qFD2Jn8ak9B7jSy0qy00ADO3+8dpT0LSjFihQYv4C02LFCSYJV3Q37xYwwRy5m+IpIiUzqWw==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/astring": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz",
+ "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "astring": "bin/astring"
+ }
+ },
+ "node_modules/bail": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
+ "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.11.28",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.28.tgz",
+ "integrity": "sha512-br0LOmjJqr6Rt4AEkadbcNf67Zpo7EPwKsWbjnRrJIa1QYFHQBqM4C7F2WTbV8ahTEcg1Eo+Y0aWjjORInYFyA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.29.3",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.29.3.tgz",
+ "integrity": "sha512-1R4kiYKXGViqEN0CnoDrXc1StD9niAwu+j2dukWzrD4bJgsD4lDmEp0CRbc6E/vYJIfTHwPmwyaKtVSudICdPA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "baseline-browser-mapping": "^2.11.26",
+ "caniuse-lite": "^1.0.30001813",
+ "electron-to-chromium": "^1.5.439",
+ "node-releases": "^2.0.57",
+ "update-browserslist-db": "^1.3.3"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001816",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001816.tgz",
+ "integrity": "sha512-+8Yx7BXCoqk6IF8yTicjfUR6D/ldJzdlsodlEOiOSPmhK844WIgk67/zIQaGAOxNkZyyvBlrRFnLvqKIoqbAFw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/ccount": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
+ "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
+ "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-html4": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
+ "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-legacy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
+ "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-reference-invalid": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz",
+ "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/collapse-white-space": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz",
+ "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/comma-separated-tokens": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
+ "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cookie": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz",
+ "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+ "license": "MIT"
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decode-named-character-reference": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz",
+ "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "character-entities": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/devlop": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
+ "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dequal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.456",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.456.tgz",
+ "integrity": "sha512-8hboqI6xesozteFb8aa7OGknvxUtTeRJLz0FoePysUEh/oWbddykIGdgpEJRbPRg/nIMfBf2DFos+H2MtvJl2A==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/esast-util-from-estree": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz",
+ "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-visit": "^2.0.0",
+ "unist-util-position-from-estree": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/esast-util-from-js": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz",
+ "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "acorn": "^8.0.0",
+ "esast-util-from-estree": "^2.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz",
+ "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.25.12",
+ "@esbuild/android-arm": "0.25.12",
+ "@esbuild/android-arm64": "0.25.12",
+ "@esbuild/android-x64": "0.25.12",
+ "@esbuild/darwin-arm64": "0.25.12",
+ "@esbuild/darwin-x64": "0.25.12",
+ "@esbuild/freebsd-arm64": "0.25.12",
+ "@esbuild/freebsd-x64": "0.25.12",
+ "@esbuild/linux-arm": "0.25.12",
+ "@esbuild/linux-arm64": "0.25.12",
+ "@esbuild/linux-ia32": "0.25.12",
+ "@esbuild/linux-loong64": "0.25.12",
+ "@esbuild/linux-mips64el": "0.25.12",
+ "@esbuild/linux-ppc64": "0.25.12",
+ "@esbuild/linux-riscv64": "0.25.12",
+ "@esbuild/linux-s390x": "0.25.12",
+ "@esbuild/linux-x64": "0.25.12",
+ "@esbuild/netbsd-arm64": "0.25.12",
+ "@esbuild/netbsd-x64": "0.25.12",
+ "@esbuild/openbsd-arm64": "0.25.12",
+ "@esbuild/openbsd-x64": "0.25.12",
+ "@esbuild/openharmony-arm64": "0.25.12",
+ "@esbuild/sunos-x64": "0.25.12",
+ "@esbuild/win32-arm64": "0.25.12",
+ "@esbuild/win32-ia32": "0.25.12",
+ "@esbuild/win32-x64": "0.25.12"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/estree-util-attach-comments": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz",
+ "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-build-jsx": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz",
+ "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "estree-walker": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-is-identifier-name": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz",
+ "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-scope": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.1.tgz",
+ "integrity": "sha512-B0np3dcdxqILX5e9nEi5/Fr4K7gL4oYFVPV1zRa2e9wRCbQoZZNWOZFYyoInvXUPJXBXjss+QXlWLJChDEHDkA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "devlop": "^1.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-to-js": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz",
+ "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "astring": "^1.8.0",
+ "source-map": "^0.7.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-visit": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz",
+ "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/hast-util-to-estree": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz",
+ "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "devlop": "^1.0.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.0",
+ "mdast-util-mdx-jsx": "^3.0.0",
+ "mdast-util-mdxjs-esm": "^2.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "style-to-js": "^1.0.0",
+ "unist-util-position": "^5.0.0",
+ "zwitch": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-jsx-runtime": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz",
+ "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "mdast-util-mdx-expression": "^2.0.0",
+ "mdast-util-mdx-jsx": "^3.0.0",
+ "mdast-util-mdxjs-esm": "^2.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "style-to-js": "^1.0.0",
+ "unist-util-position": "^5.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-whitespace": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
+ "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/inline-style-parser": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz",
+ "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/is-alphabetical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz",
+ "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-alphanumerical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz",
+ "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-alphabetical": "^2.0.0",
+ "is-decimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-decimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz",
+ "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-hexadecimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz",
+ "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
+ "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/longest-streak": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
+ "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/lucide-react": {
+ "version": "0.468.0",
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.468.0.tgz",
+ "integrity": "sha512-6koYRhnM2N0GGZIdXzSeiNwguv1gt/FAjZOiPl76roBi3xKEXa4WmfpxgQwTTL4KipXjefrnf3oV4IsYhi4JFA==",
+ "license": "ISC",
+ "peerDependencies": {
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc"
+ }
+ },
+ "node_modules/markdown-extensions": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz",
+ "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/markdown-table": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz",
+ "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/mdast-util-find-and-replace": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.3.tgz",
+ "integrity": "sha512-xPgpDNl0/OXHsI7TlaIs22lWnH3KlpvZdXG1ET/m/YT2Hhdkx8lJV4kLphE6l9simyM4KPDFBwas08BgEob6Jw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "escape-string-regexp": "^5.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-from-markdown": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.1.0.tgz",
+ "integrity": "sha512-KRLgmPaP2H1ul2bpoJkOS+9pAcDAAj9Nu1mqLnh8NLeJG5tlvj42TH80PIGBpROWlRXLk0lDrWNuZCFy/tsB4A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark": "^4.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz",
+ "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-gfm-autolink-literal": "^2.0.0",
+ "mdast-util-gfm-footnote": "^2.0.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.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-autolink-literal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz",
+ "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "ccount": "^2.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-find-and-replace": "^3.0.0",
+ "micromark-util-character": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-footnote": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz",
+ "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.1.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-strikethrough": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.1.tgz",
+ "integrity": "sha512-OuJHqvr455pwu2OaOrir7dbzqs4jlWKOtlu9L6GjcIjjQwNyw02VntQsr/Ek6/A13vgnXfUhBekWRUP1OkNivw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-table": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz",
+ "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "markdown-table": "^3.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-task-list-item": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz",
+ "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz",
+ "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-mdx-expression": "^2.0.0",
+ "mdast-util-mdx-jsx": "^3.0.0",
+ "mdast-util-mdxjs-esm": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx-expression": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz",
+ "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx-jsx": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz",
+ "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "ccount": "^2.0.0",
+ "devlop": "^1.1.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "parse-entities": "^4.0.0",
+ "stringify-entities": "^4.0.0",
+ "unist-util-stringify-position": "^4.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdxjs-esm": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz",
+ "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-phrasing": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz",
+ "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-hast": {
+ "version": "13.2.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz",
+ "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@ungap/structured-clone": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "trim-lines": "^3.0.0",
+ "unist-util-position": "^5.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-markdown": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.2.0.tgz",
+ "integrity": "sha512-2Jn/ADrHFFyyniBMi0bncTbJqU78K3/TEYvzvwrWWzD9MYPUa/Gm4r3nOeKFQg/PDM5BsbDYdc8ackW4NTY6NA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "longest-streak": "^3.0.0",
+ "mdast-util-phrasing": "^4.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "micromark-util-html-tag-name": "^2.0.0",
+ "unist-util-visit": "^5.0.0",
+ "zwitch": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+ "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.3.tgz",
+ "integrity": "sha512-oGYfQzHSG5dOMovQcJ3fyTmZlWAWpi0XA0sJwJs+i6OT88o1+Jtw/8z0CmdowSLxGhhFK89rQ/oXph/wN02PNw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/debug": "^4.0.0",
+ "debug": "^4.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-edit-map": "^1.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-core-commonmark": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.4.tgz",
+ "integrity": "sha512-wxEeE8v8XVvOrxn1TZj74qYhAtTQsSqufHVS3uNVyT1MupXxhyaHk8/9xDNPh9BmL77QNDgWTkZ3RsYHB2ry7w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-factory-destination": "^2.0.0",
+ "micromark-factory-label": "^2.0.0",
+ "micromark-factory-space": "^2.1.0",
+ "micromark-factory-title": "^2.0.0",
+ "micromark-factory-whitespace": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-edit-map": "^1.0.0",
+ "micromark-util-html-tag-name": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.3"
+ }
+ },
+ "node_modules/micromark-extension-gfm": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz",
+ "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "micromark-extension-gfm-autolink-literal": "^2.0.0",
+ "micromark-extension-gfm-footnote": "^2.0.0",
+ "micromark-extension-gfm-strikethrough": "^2.0.0",
+ "micromark-extension-gfm-table": "^2.0.0",
+ "micromark-extension-gfm-tagfilter": "^2.0.0",
+ "micromark-extension-gfm-task-list-item": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-autolink-literal": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz",
+ "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-footnote": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz",
+ "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-strikethrough": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz",
+ "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-table": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.2.tgz",
+ "integrity": "sha512-pRzm4kDTu0MjlmBkxmS9yYhw60nncfcEwu9NNdPFSQEFXS95ZKyIIyTSHu/o3ReBUrLKYEq+7YaXCRn/bPB4MA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-tagfilter": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz",
+ "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-task-list-item": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz",
+ "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-mdx-expression": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz",
+ "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-factory-mdx-expression": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-events-to-acorn": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-extension-mdx-jsx": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz",
+ "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "micromark-factory-mdx-expression": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-events-to-acorn": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-mdx-md": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz",
+ "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-mdxjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz",
+ "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.0.0",
+ "acorn-jsx": "^5.0.0",
+ "micromark-extension-mdx-expression": "^3.0.0",
+ "micromark-extension-mdx-jsx": "^3.0.0",
+ "micromark-extension-mdx-md": "^2.0.0",
+ "micromark-extension-mdxjs-esm": "^3.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-mdxjs-esm": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz",
+ "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-events-to-acorn": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-position-from-estree": "^2.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-factory-destination": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz",
+ "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-label": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz",
+ "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-mdx-expression": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz",
+ "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-events-to-acorn": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-position-from-estree": "^2.0.0",
+ "vfile-message": "^4.0.0"
+ }
+ },
+ "node_modules/micromark-factory-space": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.1.0.tgz",
+ "integrity": "sha512-fS8hnLIjnjvdQIj39Geug8wWsR0HrYZ43KShKxNfwT7t2LOHo/LbWZEzEaSOjwtjdCsjoE6syHhonEzW0zv0+Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-title": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz",
+ "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-whitespace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz",
+ "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-chunked": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz",
+ "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-classify-character": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz",
+ "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-combine-extensions": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz",
+ "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-decode-numeric-character-reference": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz",
+ "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-decode-string": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz",
+ "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "decode-named-character-reference": "^1.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-edit-map": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-edit-map/-/micromark-util-edit-map-1.0.0.tgz",
+ "integrity": "sha512-Pa2ljlsEL6sVwFaYeyrOLSYbQt73JvGbPOYFq+9AElXiSnfI5Q4465RRZ1sHv7lDjDOnGRDDaqPXqClqWK/q1Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-encode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
+ "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-events-to-acorn": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz",
+ "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/unist": "^3.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-visit": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "vfile-message": "^4.0.0"
+ }
+ },
+ "node_modules/micromark-util-html-tag-name": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz",
+ "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-normalize-identifier": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz",
+ "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-resolve-all": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz",
+ "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-sanitize-uri": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
+ "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-subtokenize": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz",
+ "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-types": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.3.tgz",
+ "integrity": "sha512-oxB2Ik03hI0gv+VNn9tnh1t1YEe9MDPptViAEgfdf3YQHsn0pzGTgCdlSCJXcwhqm8phaEuM7zeEu3QQzVBrPg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.20",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.20.tgz",
+ "integrity": "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.58",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.58.tgz",
+ "integrity": "sha512-BdiKAgbfRlvfMq/XzO/AF9NPmaA8a+YpLAyAFTVFBj3gARrAIfWvNq7Q7NE4se3KgFu0KkrvQMxTS0XVnsGzHg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/parse-entities": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz",
+ "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "character-entities-legacy": "^3.0.0",
+ "character-reference-invalid": "^2.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "is-alphanumerical": "^2.0.0",
+ "is-decimal": "^2.0.0",
+ "is-hexadecimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/parse-entities/node_modules/@types/unist": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
+ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz",
+ "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/playwright": {
+ "version": "1.64.0",
+ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.64.0.tgz",
+ "integrity": "sha512-kVzTnYFYEyQ9RGzBjNCd2+yEqWmVbxl3AHPynv3qQ6JTjv4a+kwRcnqQwIpuP3NnrnIrE/Q6wWAIAvMfIE2/Yg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "playwright-core": "1.64.0"
+ },
+ "bin": {
+ "playwright": "cli.js"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/playwright-core": {
+ "version": "1.64.0",
+ "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.64.0.tgz",
+ "integrity": "sha512-T9r+MZkTECl2+oUcZ26YgZzTrYidTsIhYYkJix+6iDOymOb1FB2RLLSOxRGnZGv5DStt+aduIVbt+E8WygXYpg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "playwright-core": "cli.js"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.30",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.30.tgz",
+ "integrity": "sha512-zkd+e9S1AQHhmaBKye9zlFHWjOwVgqXl1q3ECYy8561K7qxR2cREf/STLskulBFd78k6AOFeA+ff1TtEzk9bAA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.20",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "3.9.10",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.10.tgz",
+ "integrity": "sha512-skGHTH1Yb9QvaTC4hWnRTzEYtCpApF0UMBPz+t/0ZPzP8ihefo/btKd+QA7pUE0fEwA1SbS/NmhyEcstdXOIdA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/property-information": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz",
+ "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/react": {
+ "version": "19.3.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.3.0.tgz",
+ "integrity": "sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "19.3.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.3.0.tgz",
+ "integrity": "sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q==",
+ "license": "MIT",
+ "dependencies": {
+ "scheduler": "^0.28.0"
+ },
+ "peerDependencies": {
+ "react": "^19.3.0"
+ }
+ },
+ "node_modules/react-refresh": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz",
+ "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-router": {
+ "version": "7.18.4",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.4.tgz",
+ "integrity": "sha512-PUPQcMhMGRAslLcvtlPz/kmzBEWPhLdgLFrL7pLNepBL6dX0lWj4WD2cUYVgYCuT3jxvghYFg81cDTj44DhetQ==",
+ "license": "MIT",
+ "dependencies": {
+ "cookie": "^1.0.1",
+ "set-cookie-parser": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=18",
+ "react-dom": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-router-dom": {
+ "version": "7.18.4",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.4.tgz",
+ "integrity": "sha512-yrfmJHIpDG7taCpqKjT1G5B6q3O2K+RN8/fgNf0lTjCwiPbQ0ei6vXX9ZjQR+7ld8Tr7Z5xmyMnZ8YJrphWQUw==",
+ "license": "MIT",
+ "dependencies": {
+ "react-router": "7.18.4"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=18",
+ "react-dom": ">=18"
+ }
+ },
+ "node_modules/recma-build-jsx": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz",
+ "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-util-build-jsx": "^3.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/recma-jsx": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz",
+ "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "acorn-jsx": "^5.0.0",
+ "estree-util-to-js": "^2.0.0",
+ "recma-parse": "^1.0.0",
+ "recma-stringify": "^1.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ },
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/recma-parse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz",
+ "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "esast-util-from-js": "^2.0.0",
+ "unified": "^11.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/recma-stringify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz",
+ "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-util-to-js": "^2.0.0",
+ "unified": "^11.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-recma": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz",
+ "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "hast-util-to-estree": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-gfm": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz",
+ "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-gfm": "^3.0.0",
+ "micromark-extension-gfm": "^3.0.0",
+ "remark-parse": "^11.0.0",
+ "remark-stringify": "^11.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-mdx": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz",
+ "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mdast-util-mdx": "^3.0.0",
+ "micromark-extension-mdxjs": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-parse": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz",
+ "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-rehype": {
+ "version": "11.1.2",
+ "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz",
+ "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "unified": "^11.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-stringify": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz",
+ "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.64.6",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.64.6.tgz",
+ "integrity": "sha512-fX1Vy+UNKdXn+xKDnu/HBXbHVr1AY8cSdQj9BU4kLv5aFCMqGpvrVbyUMmjN3DdzWhSAuTbcX8PCNEVaumthYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.9"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@napi-rs/lzma-linux-x64-gnu": "1.5.1",
+ "@rollup/rollup-android-arm-eabi": "4.64.6",
+ "@rollup/rollup-android-arm64": "4.64.6",
+ "@rollup/rollup-darwin-arm64": "4.64.6",
+ "@rollup/rollup-darwin-x64": "4.64.6",
+ "@rollup/rollup-freebsd-arm64": "4.64.6",
+ "@rollup/rollup-freebsd-x64": "4.64.6",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.64.6",
+ "@rollup/rollup-linux-arm-musleabihf": "4.64.6",
+ "@rollup/rollup-linux-arm64-gnu": "4.64.6",
+ "@rollup/rollup-linux-arm64-musl": "4.64.6",
+ "@rollup/rollup-linux-loong64-gnu": "4.64.6",
+ "@rollup/rollup-linux-loong64-musl": "4.64.6",
+ "@rollup/rollup-linux-ppc64-gnu": "4.64.6",
+ "@rollup/rollup-linux-ppc64-musl": "4.64.6",
+ "@rollup/rollup-linux-riscv64-gnu": "4.64.6",
+ "@rollup/rollup-linux-riscv64-musl": "4.64.6",
+ "@rollup/rollup-linux-s390x-gnu": "4.64.6",
+ "@rollup/rollup-linux-x64-gnu": "4.64.6",
+ "@rollup/rollup-linux-x64-musl": "4.64.6",
+ "@rollup/rollup-openbsd-x64": "4.64.6",
+ "@rollup/rollup-openharmony-arm64": "4.64.6",
+ "@rollup/rollup-win32-arm64-msvc": "4.64.6",
+ "@rollup/rollup-win32-ia32-msvc": "4.64.6",
+ "@rollup/rollup-win32-x64-gnu": "4.64.6",
+ "@rollup/rollup-win32-x64-msvc": "4.64.6",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.28.0.tgz",
+ "integrity": "sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==",
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/set-cookie-parser": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz",
+ "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==",
+ "license": "MIT"
+ },
+ "node_modules/source-map": {
+ "version": "0.7.6",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz",
+ "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz",
+ "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/space-separated-tokens": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
+ "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/stringify-entities": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
+ "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "character-entities-html4": "^2.0.0",
+ "character-entities-legacy": "^3.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/style-to-js": {
+ "version": "1.1.21",
+ "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz",
+ "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "style-to-object": "1.0.14"
+ }
+ },
+ "node_modules/style-to-object": {
+ "version": "1.0.14",
+ "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz",
+ "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inline-style-parser": "0.2.7"
+ }
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.17",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
+ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/trim-lines": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
+ "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/trough": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz",
+ "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.7.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
+ "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/unified": {
+ "version": "11.0.5",
+ "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz",
+ "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "bail": "^2.0.0",
+ "devlop": "^1.0.0",
+ "extend": "^3.0.0",
+ "is-plain-obj": "^4.0.0",
+ "trough": "^2.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-is": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz",
+ "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-position": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz",
+ "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-position-from-estree": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz",
+ "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz",
+ "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit-parents": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz",
+ "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.4.tgz",
+ "integrity": "sha512-t8wonIOdQyOjtPd2VktlBu6QjTVTks6v8bSi7kd0r2Vll8TK1JYDZtRRdbmCHOAMphkZgrzK+L+vXK4pyZ8t4A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/vfile": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
+ "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile-message": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz",
+ "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vite": {
+ "version": "6.4.4",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.4.tgz",
+ "integrity": "sha512-xGjU/SyjeNyb0E4KxXBvYz/1C+3JXuujvf2hXNOtnlcE+58o5ajd9N2/n2VhkiJvpCP2qQasnUpx5PXNeI+p1Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.25.0",
+ "fdir": "^6.4.4",
+ "picomatch": "^4.0.2",
+ "postcss": "^8.5.3",
+ "rollup": "^4.34.9",
+ "tinyglobby": "^0.2.13"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+ "jiti": ">=1.21.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/zwitch": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
+ "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..efbc8fb
--- /dev/null
+++ b/package.json
@@ -0,0 +1,38 @@
+{
+ "name": "gothwad-developer-docs",
+ "private": true,
+ "version": "1.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite --host 0.0.0.0",
+ "build": "tsc -b && vite build",
+ "preview": "vite preview --host 0.0.0.0",
+ "test": "node --test tests/*.test.mjs",
+ "test:e2e": "playwright test",
+ "format": "prettier --write .",
+ "format:check": "prettier --check ."
+ },
+ "dependencies": {
+ "@fontsource-variable/inter": "^5.2.8",
+ "@mdx-js/react": "^3.1.1",
+ "lucide-react": "^0.468.0",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
+ "react-router-dom": "^7.1.0"
+ },
+ "devDependencies": {
+ "@mdx-js/rollup": "^3.1.1",
+ "@playwright/test": "^1.64.0",
+ "@types/mdx": "^2.0.13",
+ "@types/react": "^19.0.0",
+ "@types/react-dom": "^19.0.0",
+ "@vitejs/plugin-react": "^4.3.4",
+ "prettier": "^3.9.10",
+ "remark-gfm": "^4.0.1",
+ "typescript": "~5.7.3",
+ "vite": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=22.13.0"
+ }
+}
diff --git a/playwright.config.ts b/playwright.config.ts
new file mode 100644
index 0000000..644366f
--- /dev/null
+++ b/playwright.config.ts
@@ -0,0 +1,22 @@
+import { defineConfig, devices } from '@playwright/test';
+export default defineConfig({
+ testDir: './tests/e2e',
+ fullyParallel: false,
+ workers: 1,
+ use: {
+ baseURL: process.env.TEST_BASE_URL || 'http://localhost:5173',
+ ...devices['Desktop Chrome'],
+ viewport: { width: 1440, height: 1000 },
+ launchOptions: process.env.CHROMIUM_PATH
+ ? {
+ executablePath: process.env.CHROMIUM_PATH,
+ args: ['--no-sandbox', '--disable-dev-shm-usage', '--no-zygote'],
+ }
+ : {},
+ },
+ webServer: {
+ command: 'npm run dev -- --port 5173',
+ url: 'http://localhost:5173',
+ reuseExistingServer: !process.env.CI,
+ },
+});
diff --git a/public/_headers b/public/_headers
new file mode 100644
index 0000000..b656c38
--- /dev/null
+++ b/public/_headers
@@ -0,0 +1,7 @@
+/*
+ X-Content-Type-Options: nosniff
+ Referrer-Policy: strict-origin-when-cross-origin
+ X-Frame-Options: DENY
+ Permissions-Policy: camera=(), microphone=(), geolocation=()
+/assets/*
+ Cache-Control: public, max-age=31536000, immutable
diff --git a/public/_redirects b/public/_redirects
new file mode 100644
index 0000000..7797f7c
--- /dev/null
+++ b/public/_redirects
@@ -0,0 +1 @@
+/* /index.html 200
diff --git a/public/favicon.svg b/public/favicon.svg
new file mode 100644
index 0000000..81865b0
--- /dev/null
+++ b/public/favicon.svg
@@ -0,0 +1 @@
+
diff --git a/src/App.tsx b/src/App.tsx
new file mode 100644
index 0000000..5c6737b
--- /dev/null
+++ b/src/App.tsx
@@ -0,0 +1,1366 @@
+import {
+ Suspense,
+ lazy,
+ useEffect,
+ useRef,
+ useState,
+ isValidElement,
+} from 'react';
+import type { ReactNode, ComponentProps, ComponentType } from 'react';
+import {
+ Link,
+ NavLink,
+ Route,
+ Routes,
+ useLocation,
+ useNavigate,
+} from 'react-router-dom';
+import {
+ ArrowUpRight,
+ ArrowRight,
+ ArrowLeft,
+ Search,
+ ChevronRight,
+ ChevronDown,
+ Sun,
+ Moon,
+ Github,
+ Menu,
+ X,
+ Home,
+ BookOpen,
+ Rocket,
+ Layers,
+ Grid2X2,
+ Code2,
+ LifeBuoy,
+ Fingerprint,
+ Mail,
+ Play,
+ Globe2,
+ MessageCircle,
+ Video,
+ Terminal,
+ Copy,
+ Check,
+ Info,
+ Clock3,
+ FileText,
+ CornerDownLeft,
+ Sparkles,
+ Cloud,
+ GitPullRequest,
+ ShieldCheck,
+ Hash,
+ ThumbsUp,
+ ThumbsDown,
+} from 'lucide-react';
+import { products, docs, categories, findDoc } from './data';
+import type { Product, Category, Doc } from './data';
+import repositories from './repositories.json';
+import type { MDXComponents } from 'mdx/types';
+
+const modules = import.meta.glob<{
+ default: ComponentType<{ components?: MDXComponents }>;
+}>('./content/*.mdx');
+const rawContent = import.meta.glob('./content/*.mdx', {
+ query: '?raw',
+ import: 'default',
+ eager: true,
+}) as Record;
+const contentComponents = Object.fromEntries(
+ Object.entries(modules).map(([path, load]) => [
+ path.split('/').pop()!.replace('.mdx', ''),
+ lazy(load),
+ ]),
+);
+const github = 'https://github.com/GothwadTech';
+function readPreference(key: string) {
+ try {
+ return localStorage.getItem(key);
+ } catch {
+ return null;
+ }
+}
+function savePreference(key: string, value: string) {
+ try {
+ localStorage.setItem(key, value);
+ return true;
+ } catch {
+ return false;
+ }
+}
+function useMobileLayout() {
+ const [mobile, setMobile] = useState(
+ () => window.matchMedia('(max-width: 760px)').matches,
+ );
+ useEffect(() => {
+ const media = window.matchMedia('(max-width: 760px)');
+ const update = () => setMobile(media.matches);
+ media.addEventListener('change', update);
+ return () => media.removeEventListener('change', update);
+ }, []);
+ return mobile;
+}
+function BrandMark({ small = false }: { small?: boolean }) {
+ return (
+
+
+
+
+
+ );
+}
+function Outside({ children, className, href, ...props }: ComponentProps<'a'>) {
+ return (
+
+ {children}
+
+ );
+}
+
+function Header({
+ onSearch,
+ onMenu,
+ menuOpen,
+ theme,
+ toggleTheme,
+}: {
+ onSearch: () => void;
+ onMenu: () => void;
+ menuOpen: boolean;
+ theme: string;
+ toggleTheme: () => void;
+}) {
+ return (
+
+ );
+}
+function Sidebar({ open, close }: { open: boolean; close: () => void }) {
+ const location = useLocation();
+ const [productsOpen, setProductsOpen] = useState(true);
+ const mobile = useMobileLayout();
+ const sidebarRef = useRef(null);
+ useEffect(() => {
+ if (!open || !mobile) return;
+ const active = document.activeElement as HTMLElement;
+ const overflow = document.body.style.overflow;
+ document.body.style.overflow = 'hidden';
+ sidebarRef.current
+ ?.querySelector('[aria-label="Close navigation"]')
+ ?.focus();
+ return () => {
+ document.body.style.overflow = overflow;
+ active?.focus();
+ };
+ }, [open, mobile]);
+ useEffect(() => {
+ close();
+ }, [location.pathname]); // eslint-disable-line
+ const nav = (
+ to: string,
+ label: string,
+ Icon: typeof Home,
+ extra?: ReactNode,
+ ) => (
+ `nav-item ${isActive ? 'active' : ''}`}
+ >
+
+ {label}
+ {extra}
+
+ );
+ return (
+ <>
+
+
+ >
+ );
+}
+function EcosystemArt() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ GOTHWAD TECH
+
+
+
+ Accounts
+
+
+
+ Mail
+
+
+
+
+ Browser
+
+
+
+ GrixChat
+
+
+
+ Meet
+
+
+
+
+
+
+
+
+ ONE ECOSYSTEM. ENDLESS POSSIBILITIES.
+
+
+ );
+}
+function Breadcrumb({
+ label = 'Documentation',
+ section,
+}: {
+ label?: string;
+ section?: string;
+}) {
+ return (
+
+
+
+
+
+
+ {section && (
+ <>
+ {section}
+
+ >
+ )}
+ {label}
+
+
+ Built in the open
+
+
+ );
+}
+function ProductCard({ product: p }: { product: Product }) {
+ return (
+
+
+ {p.name}
+ {p.description}
+
+
{p.tag}
+
+ View docs
+
+
+
+ );
+}
+function ProductExplorer({ full = false }: { full?: boolean }) {
+ const [category, setCategory] = useState('All products');
+ const [query, setQuery] = useState('');
+ const filtered = products.filter(
+ (p) =>
+ (category === 'All products' || p.category === category) &&
+ `${p.name} ${p.description} ${p.tag}`
+ .toLowerCase()
+ .includes(query.toLowerCase()),
+ );
+ const shown =
+ full || category !== 'All products' ? filtered : filtered.slice(0, 6);
+ return (
+
+
+
+
+ {full ? 'Find your next building block.' : 'Explore our products'}
+ {!full && {products.length} }
+
+
Everything you need to build with the Gothwad ecosystem.
+
+ {!full && (
+
+ View all products
+
+ )}
+
+ {full && (
+
+
+ setQuery(e.target.value)}
+ />
+
+ )}
+
+ {categories.map((c, index) => (
+ {
+ let next = index;
+ if (event.key === 'ArrowRight')
+ next = (index + 1) % categories.length;
+ else if (event.key === 'ArrowLeft')
+ next = (index - 1 + categories.length) % categories.length;
+ else if (event.key === 'Home') next = 0;
+ else if (event.key === 'End') next = categories.length - 1;
+ else return;
+ event.preventDefault();
+ setCategory(categories[next]);
+ event.currentTarget.parentElement
+ ?.querySelectorAll('[role="tab"]')
+ [next]?.focus();
+ }}
+ aria-selected={category === c}
+ onClick={() => setCategory(c)}
+ className={category === c ? 'selected' : ''}
+ >
+ {c === 'All products' && } {c}
+
+ ))}
+
+
+ {shown.map((p) => (
+
+ ))}
+
+ {!shown.length && (
+
+
+
No products found
+
Try another name or category.
+
{
+ setCategory('All products');
+ setQuery('');
+ }}
+ >
+ Clear filters
+
+
+ )}
+
+ );
+}
+function GuideCard({ doc, number }: { doc: Doc; number?: string }) {
+ return (
+
+
+
+ {number ? {number} : {doc.time} read }
+
+ {doc.title}
+ {doc.description}
+
+ Read the guide
+
+
+ );
+}
+function HomePage() {
+ return (
+
+
+
+
+
+ THE GOTHWAD DEVELOPER HUB
+
+
+ Big ideas.
+
+ Build them here.
+
+
+ Your starting point for everything Gothwad Tech.
+ Explore the docs, connect our
+ products, and bring
+ your next idea to life.
+
+
+
+
+ Built for developers. Open to possibilities.
+
+
+
+
+
+
+
+
+
+ New to Gothwad Tech?
+
+ Get to know the ecosystem and find the right tools for your project.
+
+
+
+ Take a quick tour
+
+
+
+
+
+
+
A little guidance. A lot of possibilities.
+
Practical guides to get you from idea to implementation.
+
+
+ All guides
+
+
+
+ {['oauth', 'mail-setup', 'cloudflare'].map((slug, i) => (
+
+ ))}
+
+
+
+
+
+
+
+
Great things are built together.
+
+ Explore the source, share an idea, or make your first contribution.
+
+
+
+ Find us on GitHub
+
+
+
+
+ );
+}
+function Footer() {
+ return (
+
+ © {new Date().getFullYear()} Gothwad Tech
+
+
Contribute
+
+ Give feedback
+
+
Made in India. Built for everyone.
+
+
+ );
+}
+function ProductsPage() {
+ return (
+
+
+
+
THE GOTHWAD ECOSYSTEM
+
One place. Every product.
+
+ From your first sign-in to your next big launch.
+
+ Find documentation for the tools you're building with.
+
+
+
+
+
+
+ Looking for another repository? Explore the{' '}
+ complete GitHub directory. Detailed
+ guide coverage varies by product.
+
+
+
+
+ );
+}
+function GuidesPage() {
+ return (
+
+
+
+
LEARN BY BUILDING
+
A clear path from idea to live.
+
+ Source-based walkthroughs for integrating, configuring,
+
+ and deploying the Gothwad ecosystem.
+
+
+
+ {docs
+ .filter(
+ (d) =>
+ d.section === 'Guides' ||
+ ['quickstart', 'security', 'contributing'].includes(d.slug),
+ )
+ .map((d) => (
+
+ ))}
+
+
+
+
+ Every guide includes source references. Need a missing guide?{' '}
+
+ Request documentation
+
+ .
+
+
+
+
+ );
+}
+function RepositoriesPage() {
+ const [query, setQuery] = useState('');
+ const filtered = repositories.filter((r) =>
+ `${r.name} ${r.description}`.toLowerCase().includes(query.toLowerCase()),
+ );
+ return (
+
+
+
+
BUILT IN THE OPEN
+
Explore the source.
+
+ A snapshot of GothwadTech's public repositories.
+
+ Reviewed October 14, 2026. Repository descriptions come from GitHub.
+
+
+
+
+ setQuery(e.target.value)}
+ placeholder="Search repositories..."
+ aria-label="Search repositories"
+ />
+ {filtered.length} repos
+
+
+ {filtered.map((r) => {
+ const product = products.find((p) => p.repo === r.name);
+ return (
+
+
+
+
+
+ {r.name}
+
+ {r.isFork && Fork }
+
+
+ {r.description ||
+ 'No repository description provided. Open the source to learn more.'}
+
+
+ {product ? (
+
+ Read docs
+
+ ) : r.name === 'docs' ? (
+
+ Read docs
+
+ ) : (
+
Repository only
+ )}
+
+ );
+ })}
+
+ {!filtered.length && (
+
+
No matching repositories
+ setQuery('')}>
+ Clear search
+
+
+ )}
+
+
+
+ Public visibility does not imply an open-source license. Check each
+ repository's license and current status before reuse.
+
+
+
+
+ );
+}
+
+function getText(node: ReactNode): string {
+ if (typeof node === 'string' || typeof node === 'number') return String(node);
+ if (Array.isArray(node)) return node.map(getText).join('');
+ if (isValidElement<{ children?: ReactNode }>(node))
+ return getText(node.props.children);
+ return '';
+}
+const slugify = (s: string) =>
+ s
+ .toLowerCase()
+ .replace(/[^a-z0-9\s-]/g, '')
+ .trim()
+ .replace(/\s+/g, '-');
+function Heading({ children, ...props }: ComponentProps<'h2'>) {
+ const id = slugify(getText(children));
+ return (
+
+ );
+}
+function CodeBlock({ children }: { children?: ReactNode }) {
+ const [copied, setCopied] = useState(false);
+ const [error, setError] = useState(false);
+ const timer = useRef>(undefined);
+ useEffect(() => () => clearTimeout(timer.current), []);
+ const text = getText(children).replace(/\n$/, '');
+ const language = isValidElement<{ className?: string }>(children)
+ ? children.props.className?.replace('language-', '') || 'text'
+ : 'text';
+ async function copy() {
+ try {
+ await navigator.clipboard.writeText(text);
+ setCopied(true);
+ setError(false);
+ clearTimeout(timer.current);
+ timer.current = setTimeout(() => setCopied(false), 2000);
+ } catch {
+ setError(true);
+ }
+ }
+ return (
+
+
+
+
+ {language}
+
+
+ {copied ? : }
+
+ {copied ? 'Copied!' : error ? 'Select code to copy' : 'Copy'}
+
+
+
+
{children}
+
+ );
+}
+function Callout({
+ children,
+ title,
+}: {
+ children?: ReactNode;
+ title?: string;
+}) {
+ return (
+
+
+
+ {title &&
{title} }
+
{children}
+
+
+ );
+}
+function ContentLink({ href = '', children, ...props }: ComponentProps<'a'>) {
+ return href.startsWith('/') ? (
+
+ {children}
+
+ ) : href.startsWith('#') ? (
+
+ {children}
+
+ ) : (
+
+ {children}
+
+ );
+}
+const mdxComponents = {
+ h2: Heading,
+ pre: CodeBlock,
+ Callout,
+ a: ContentLink,
+ table: ({ children, ...props }: ComponentProps<'table'>) => (
+
+ ),
+};
+function DocPage({ doc }: { doc: Doc }) {
+ const Content = contentComponents[doc.slug];
+ const [feedback, setFeedback] = useState(() =>
+ readPreference(`feedback-${doc.slug}`),
+ );
+ const [feedbackSaved, setFeedbackSaved] = useState(true);
+ const [activeHeading, setActiveHeading] = useState('');
+ const raw = rawContent[`./content/${doc.slug}.mdx`] || '';
+ const headings = [...raw.matchAll(/^## (.+)$/gm)].map((m) => ({
+ text: m[1],
+ id: slugify(m[1]),
+ }));
+ useEffect(() => {
+ setActiveHeading('');
+ let observer: IntersectionObserver | undefined;
+ const timer = setTimeout(() => {
+ observer = new IntersectionObserver(
+ (entries) => {
+ entries.forEach((e) => {
+ if (e.isIntersecting) setActiveHeading(e.target.id);
+ });
+ },
+ { rootMargin: '-90px 0px -65% 0px' },
+ );
+ document
+ .querySelectorAll('.prose h2')
+ .forEach((h) => observer!.observe(h));
+ }, 300);
+ return () => {
+ clearTimeout(timer);
+ observer?.disconnect();
+ };
+ }, [doc.slug]);
+ const index = docs.findIndex((d) => d.slug === doc.slug);
+ const next = docs[index + 1];
+ const prev = docs[index - 1];
+ return (
+
+
+
+
+
+
+ {doc.section}
+
+ {doc.title}
+ {doc.description}
+
+
+
+ {doc.time} read
+
+
Reviewed Oct 14, 2026
+
+ View source
+
+
+
+ Loading guide...}
+ >
+
+
+
+
+
+
Was this page helpful?
+
+ {feedback
+ ? feedbackSaved
+ ? 'Thanks! Your feedback is saved on this device.'
+ : 'Thanks for your feedback for this visit.'
+ : 'Help us make the docs a little better.'}
+
+
+
+ {feedback ? (
+
+ Thank you
+
+ ) : (
+ <>
+ {
+ setFeedback('yes');
+ setFeedbackSaved(
+ savePreference(`feedback-${doc.slug}`, 'yes'),
+ );
+ }}
+ >
+
+ Yes
+
+ {
+ setFeedback('no');
+ setFeedbackSaved(
+ savePreference(`feedback-${doc.slug}`, 'no'),
+ );
+ }}
+ >
+
+ Not quite
+
+ >
+ )}
+
+
+ {feedback === 'no' && (
+
+
+ Tell us what could be clearer on GitHub{' '}
+
+
+
+ )}
+
+ {prev && (
+
+
+ Previous
+
+
{prev.title}
+
+ )}
+ {next && (
+
+
+ Up next
+
+
{next.title}
+
+ )}
+
+
+
+
+
On this page
+
+ {headings.map((h) => (
+
+ {h.text}
+
+ ))}
+
+
+
+
+ Edit this page
+
+
+
+ Report an issue
+
+
+
+
+
Keep exploring.
+
Find your next building block in the Gothwad ecosystem.
+
+ Explore products
+
+
+
+
+
+
+
+ );
+}
+function NotFound() {
+ return (
+
+
+
+
404 · A SMALL DETOUR
+
This page is off the map.
+
The link may have moved. Let's get you back to building.
+
+ Back to documentation
+
+
+
+
+ );
+}
+function SearchDialog({ close }: { close: () => void }) {
+ const [query, setQuery] = useState('');
+ const [selected, setSelected] = useState(0);
+ const navigate = useNavigate();
+ const ref = useRef(null);
+ const input = useRef(null);
+ const normalized = query.toLowerCase().trim();
+ const results = normalized
+ ? docs
+ .map((d) => ({
+ doc: d,
+ score: d.title.toLowerCase().includes(normalized)
+ ? 3
+ : d.description.toLowerCase().includes(normalized)
+ ? 2
+ : rawContent[`./content/${d.slug}.mdx`]
+ ?.toLowerCase()
+ .includes(normalized)
+ ? 1
+ : 0,
+ }))
+ .filter((r) => r.score)
+ .sort((a, b) => b.score - a.score)
+ .map((r) => r.doc)
+ .slice(0, 8)
+ : ['quickstart', 'oauth', 'mail-setup', 'cloudflare', 'api'].map((s) =>
+ findDoc(s)!,
+ );
+ const open = (d: Doc) => {
+ navigate(`/docs/${d.slug}`);
+ close();
+ };
+ useEffect(() => {
+ const active = document.activeElement as HTMLElement;
+ input.current?.focus();
+ const old = document.body.style.overflow;
+ document.body.style.overflow = 'hidden';
+ return () => {
+ document.body.style.overflow = old;
+ active?.focus();
+ };
+ }, []);
+ useEffect(() => {
+ setSelected(0);
+ }, [query]);
+ useEffect(() => {
+ ref.current
+ ?.querySelector(`[data-index="${selected}"]`)
+ ?.scrollIntoView({ block: 'nearest' });
+ }, [selected]);
+ return (
+
+
e.stopPropagation()}
+ onKeyDown={(e) => {
+ if (e.key === 'Escape') close();
+ if (e.key === 'ArrowDown') {
+ e.preventDefault();
+ setSelected((s) => Math.min(s + 1, results.length - 1));
+ }
+ if (e.key === 'ArrowUp') {
+ e.preventDefault();
+ setSelected((s) => Math.max(s - 1, 0));
+ }
+ if (
+ e.key === 'Enter' &&
+ e.target === input.current &&
+ results[selected]
+ ) {
+ e.preventDefault();
+ open(results[selected]);
+ }
+ if (e.key === 'Tab') {
+ const elements =
+ ref.current?.querySelectorAll
('input, button, a');
+ if (!elements?.length) return;
+ const first = elements[0],
+ last = elements[elements.length - 1];
+ if (e.shiftKey && document.activeElement === first) {
+ e.preventDefault();
+ last.focus();
+ } else if (!e.shiftKey && document.activeElement === last) {
+ e.preventDefault();
+ first.focus();
+ }
+ }
+ }}
+ >
+
+
+ setQuery(e.target.value)}
+ aria-label="Search all documentation"
+ aria-controls="search-results"
+ aria-activedescendant={
+ results[selected] ? `result-${results[selected].slug}` : undefined
+ }
+ role="combobox"
+ aria-expanded="true"
+ aria-autocomplete="list"
+ />
+
+ Esc
+
+
+
+ {query ? `${results.length} matching guides` : 'POPULAR SEARCHES'}
+ Search all documentation
+
+
+ {results.map((d, i) => (
+
setSelected(i)}
+ onClick={() => open(d)}
+ key={d.slug}
+ className={`search-result ${selected === i ? 'highlighted' : ''}`}
+ >
+
+
+
+
+ {d.section}
+ {d.title}
+ {d.description}
+
+
+
+ ))}
+
+ {!results.length && (
+
+
+
No results for “{query}”
+
Try “Accounts”, “deployment”, or “OAuth”.
+
+ )}
+
+
+ ↑
+ ↓ to navigate ↵ to open
+
+
+ Gothwad Docs
+
+
+
+
+ );
+}
+export default function App() {
+ const [search, setSearch] = useState(false);
+ const [menu, setMenu] = useState(false);
+ const [theme, setTheme] = useState(
+ () => document.documentElement.dataset.theme || 'light',
+ );
+ const location = useLocation();
+ useEffect(() => {
+ function key(e: KeyboardEvent) {
+ if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === 'k') {
+ e.preventDefault();
+ setSearch((v) => !v);
+ }
+ if (e.key === 'Escape') setMenu(false);
+ }
+ window.addEventListener('keydown', key);
+ return () => window.removeEventListener('keydown', key);
+ }, []);
+ useEffect(() => {
+ document.documentElement.dataset.theme = theme;
+ try {
+ localStorage.setItem('gothwad-theme', theme);
+ } catch {}
+ }, [theme]);
+ useEffect(() => {
+ setMenu(false);
+ if (!location.hash) window.scrollTo(0, 0);
+ else
+ setTimeout(
+ () => document.getElementById(location.hash.slice(1))?.scrollIntoView(),
+ 150,
+ );
+ const doc = findDoc(location.pathname.replace('/docs/', ''));
+ const label =
+ doc?.title ||
+ {
+ '/': 'Documentation',
+ '/products': 'All products',
+ '/guides': 'Guides & tutorials',
+ '/repositories': 'Repository directory',
+ }[location.pathname] ||
+ 'Page not found';
+ document.title = `${label} · Gothwad Tech Developers`;
+ document
+ .querySelector('meta[name="description"]')
+ ?.setAttribute(
+ 'content',
+ doc?.description ||
+ 'Documentation, integration guides, and developer resources for the Gothwad Tech ecosystem.',
+ );
+ }, [location.pathname, location.hash]);
+ return (
+ <>
+
+ Skip to content
+
+ setSearch(true)}
+ onMenu={() => setMenu(true)}
+ menuOpen={menu}
+ theme={theme}
+ toggleTheme={() => setTheme(theme === 'light' ? 'dark' : 'light')}
+ />
+ setMenu(false)} />
+
+
+ } />
+ } />
+ } />
+ } />
+ {docs.map((doc) => (
+ }
+ />
+ ))}
+ } />
+
+
+ {search && setSearch(false)} />}
+ >
+ );
+}
diff --git a/src/content/accounts-setup.mdx b/src/content/accounts-setup.mdx
new file mode 100644
index 0000000..a8e01f7
--- /dev/null
+++ b/src/content/accounts-setup.mdx
@@ -0,0 +1,71 @@
+## Before you begin
+
+You need the Accounts repository, a Cloudflare account with your domain, and a Supabase project dedicated to Accounts. Use a development deployment to verify the flow before production. Keep all credentials out of Git and issue reports.
+
+## 1. Create the database
+
+Create a Supabase project. In its SQL Editor, review and run the repository's SQL files in order:
+
+1. `sql/01_core_schema.sql` — core tables, policies, triggers, and seeds.
+2. `sql/02_account_activity.sql` — account activity.
+3. `sql/03_avatars_storage.sql` — profile image storage.
+
+Read `sql/README.md` before running migrations. Save the project URL, anon key, and service-role key in your own secure configuration workflow.
+
+The upstream setup uses an Accounts-managed confirmation model and instructs disabling Supabase email confirmation. Review that model before changing a live project's authentication settings; this is not a general recommendation for other Supabase applications.
+
+## 2. Configure the Worker
+
+Work inside `cloudflare-worker/`. Keep the Worker name `accounts` aligned with the Cloudflare dashboard. Review `wrangler.toml` and the example environment file for all current settings, including your app domain and Supabase URL.
+
+```bash
+cd cloudflare-worker
+npm install
+npx wrangler login
+npx wrangler secret put SUPABASE_ANON_KEY
+npx wrangler secret put SUPABASE_SERVICE_ROLE_KEY
+npx wrangler secret put JWT_SECRET
+npx wrangler deploy
+```
+
+Wrangler prompts for secret values. Never paste them into a command committed to a file. Set a strong, independently generated signing secret. Follow the source setup guide for optional password-reset email configuration.
+
+## 3. Connect the API route
+
+For same-origin browser requests, configure the Accounts Worker route at `accounts.YOUR_DOMAIN/api/*`. The DNS record must be proxied through Cloudflare.
+
+Verify `/api/health` reaches the Worker and returns JSON. If Mail will call Accounts, also configure a Worker **Custom Domain**, such as `api.YOUR_DOMAIN`, for server-to-server requests.
+
+Mail's setup specifically requires the Accounts Worker Custom Domain for `AUTH_HUB_URL`. A same-zone request through the Pages hostname can return HTML rather than invoking the Worker.
+
+## 4. Publish the frontend
+
+Create a Cloudflare Pages project connected to `GothwadTech/accounts`.
+
+| Setting | Value |
+| --- | --- |
+| Framework preset | None |
+| Build command | Leave empty |
+| Build output directory | `web` |
+
+Add your Accounts custom domain to Pages. With the same-origin `/api/*` Worker route, keep `API_URL: ''` in `web/js/config.js`.
+
+## 5. Verify the deployment
+
+1. Request `/api/health`; confirm JSON, not an HTML page.
+2. Open `/signup` and create a test account.
+3. Sign in through `/signin` and verify `/me` loads the right profile.
+4. Test sign-out and sign-in again in the same browser.
+5. Review session cookie attributes without copying their values.
+6. If integrating Mail, verify its required username-check contract before enabling inbound mail.
+
+## Troubleshooting
+
+| Symptom | Check |
+| --- | --- |
+| Missing build script | Set Pages framework to None and clear the build command |
+| API returns HTML | Check the Worker route, Custom Domain, and URL prefix |
+| Worker cannot connect to Supabase | Check the project URL and Worker secret names |
+| Mail does not recognize a session | Check parent-domain cookie configuration and `AUTH_HUB_URL` |
+
+Continue with [OAuth integration](/docs/oauth) or [Mail deployment](/docs/mail-setup).
diff --git a/src/content/accounts.mdx b/src/content/accounts.mdx
new file mode 100644
index 0000000..df88091
--- /dev/null
+++ b/src/content/accounts.mdx
@@ -0,0 +1,49 @@
+## Overview
+
+Gothwad Accounts is the central authentication service for the Gothwad ecosystem. The repository documents account creation, sign-in, password reset, JWT sessions, remember-me behavior, device management, and an OAuth 2.0 provider.
+
+The browser UI exposes `/signin`, `/signup`, and `/me`. The Worker renders the OAuth consent screen; it is not a separate frontend route.
+
+## How it works
+
+The frontend is HTML, CSS, and JavaScript in `web/`. It calls a Cloudflare Worker in `cloudflare-worker/`, which connects to Supabase Auth and PostgreSQL. The frontend does not receive the Supabase service-role key.
+
+| Location | Responsibility |
+| --- | --- |
+| `web/js/config.js` | Frontend API configuration |
+| `cloudflare-worker/src/index.ts` | Authentication and OAuth handlers |
+| `cloudflare-worker/wrangler.toml` | Worker deployment and public variables |
+| `sql/` | Numbered database migrations |
+| `tools/dev-server.js` | Local frontend server with API proxy |
+
+## Run locally
+
+Clone the repository and configure the Worker's local secrets using its example file.
+
+```bash
+git clone https://github.com/GothwadTech/accounts.git
+cd accounts/cloudflare-worker
+cp .dev.vars.example .dev.vars
+npm install
+npx wrangler dev
+```
+
+In another terminal, from the repository root:
+
+```bash
+node tools/dev-server.js
+```
+
+Open `http://localhost:3000`. Test `/signup`, `/signin`, and `/me`. Use your own development Supabase project and do not commit `.dev.vars`.
+
+## Integrate sign-in
+
+Use the [OAuth integration guide](/docs/oauth) for external applications. Public clients use an authorization code with PKCE S256. Register the exact callback URL before testing.
+
+The documented OAuth endpoints are `/oauth/authorize`, `/oauth/token`, `/oauth/userinfo`, and `/oauth/app-info`. On the Accounts frontend's `/api/*` route, use the `/api` prefix in your base URL.
+
+## Deploy and verify
+
+Follow [Set up Gothwad Accounts](/docs/accounts-setup) for the database, Worker, and Pages configuration. Unlike the other React applications, the Accounts frontend has **no build step**: publish `web/`.
+
+Verify the health endpoint returns JSON, then sign in and open the account dashboard. An HTML response from an API URL normally means routing is reaching Pages instead of the Worker.
diff --git a/src/content/ai.mdx b/src/content/ai.mdx
new file mode 100644
index 0000000..cc03794
--- /dev/null
+++ b/src/content/ai.mdx
@@ -0,0 +1,35 @@
+## Current source coverage
+
+The Gothwad AI repository describes an AI Studio application. Its README currently provides a short local-development setup, not a complete public API contract.
+
+This page documents only the setup available in the source README. Hosted API routes, rate limits, and integration guarantees are not yet verified.
+
+## Local development
+
+Use a supported Node.js installation and your own development credentials.
+
+```bash
+git clone https://github.com/GothwadTech/ai.git
+cd ai
+npm install
+```
+
+The upstream README instructs setting `GEMINI_API_KEY` in `.env.local`, then running:
+
+```bash
+npm run dev
+```
+
+Do not commit `.env.local`. Before deployment, inspect how the current implementation uses the key. A local environment file does not guarantee a value remains server-side when bundled by a frontend build tool.
+
+## Before a public deployment
+
+1. Review the Vite and server configuration for environment-variable exposure.
+2. Ensure provider credentials stay on a protected server or Worker.
+3. Apply appropriate authentication, request limits, and usage controls.
+4. Test with a separate development key.
+5. Document the verified deployment architecture before publishing integration examples.
+
+## Contribute verified detail
+
+When the repository's implementation and deployment contract are confirmed, add architecture, configuration, testing, and troubleshooting guides here. Link each claim to the relevant source file rather than inferring behavior from the product name.
diff --git a/src/content/api.mdx b/src/content/api.mdx
new file mode 100644
index 0000000..dedb8a8
--- /dev/null
+++ b/src/content/api.mdx
@@ -0,0 +1,65 @@
+These endpoints are documented in the Accounts and Mail repositories. Requests require your own configured deployment and, except where noted, valid authorization. This site never asks for or sends your credentials.
+
+## Accounts OAuth endpoints
+
+Use `https://accounts.gothwadtech.com/api` for an Accounts `/api/*` route, or your Accounts Worker Custom Domain without that prefix. See the [OAuth guide](/docs/oauth) for a complete PKCE flow.
+
+| Method | Path | Purpose |
+| --- | --- | --- |
+| GET | `/oauth/authorize` | Browser authorization and consent |
+| POST | `/oauth/token` | Code exchange or refresh-token rotation |
+| GET | `/oauth/userinfo` | Profile fields allowed by granted scopes |
+| GET | `/oauth/app-info?client_id=...` | Public app information |
+
+The token endpoint accepts JSON or form-encoded bodies. An authorization-code request includes `grant_type`, `code`, `client_id`, `redirect_uri`, and `code_verifier` for a public client. Do not send requests with placeholder credentials and expect them to authenticate.
+
+```bash
+# Replace the base and token locally. Do not put tokens into issue reports.
+curl "$AUTH_BASE/oauth/userinfo" \
+ -H "Authorization: Bearer $ACCESS_TOKEN"
+```
+
+## Mail endpoints
+
+Mail serves JSON under `/api/*` on its configured origin. All routes except health require a verified session.
+
+| Method | Path | Purpose |
+| --- | --- | --- |
+| GET | `/api/health` | Public liveness and configuration booleans |
+| GET | `/api/session` | Current identity, address, and daily send allowance |
+| GET | `/api/mail/messages` | Paginated message listing |
+| GET | `/api/mail/messages/:id` | Message body and details |
+| PATCH | `/api/mail/messages/:id` | Set read, starred, or trash state |
+| DELETE | `/api/mail/messages/:id` | Permanently delete an item already in Trash |
+| POST | `/api/mail/drafts` | Create or update a draft |
+| DELETE | `/api/mail/drafts/:id` | Delete a draft |
+| POST | `/api/mail/send` | Send a message |
+
+### List messages
+
+Query parameters are `folder`, `limit`, and `before`. Supported folder filters are `inbox`, `starred`, `sent`, `drafts`, and `trash`. The maximum page size is 100. Use the returned `nextBefore` value for the next page.
+
+### Send a message
+
+The JSON body includes `to`, `subject`, and `body`, with optional `cc`, `bcc`, and `draftId`. A successful response uses status 201 and contains `id`, `saved`, and `remainingToday`. If `saved` is false, delivery succeeded but the Sent copy could not be stored; do not blindly retry and send a duplicate.
+
+### Write request protection
+
+Cookie-authenticated POST, PATCH, and DELETE requests must come from an allowed origin and use `Content-Type: application/json`. Disallowed origins return 403; the wrong content type returns 415. Bearer-token requests skip the cookie-origin check.
+
+## Mail error handling
+
+Errors use an `error` code and a `message` field. Do not log whole authenticated response bodies.
+
+| Status | Meaning / next step |
+| --- | --- |
+| 400 | Invalid request or malformed ID |
+| 401 | Session unavailable; inspect the documented sign-in URL behavior |
+| 403 | Origin not allowed for a cookie-authenticated write |
+| 404 | Message unavailable to this user |
+| 415 | Send JSON for a write request |
+| 429 | Daily or provider rate limit |
+| 502 | Outbound provider unreachable |
+| 503 | Missing configuration or Accounts integration failure |
+
+Sources: [Accounts OAuth](https://github.com/GothwadTech/accounts/blob/main/docs/OAUTH.md) and [Mail API](https://github.com/GothwadTech/mail/blob/main/docs/MAIL.md). Not every internal Accounts route is cataloged in this initial central reference.
diff --git a/src/content/architecture.mdx b/src/content/architecture.mdx
new file mode 100644
index 0000000..9b718cc
--- /dev/null
+++ b/src/content/architecture.mdx
@@ -0,0 +1,49 @@
+## An ecosystem, not a monolith
+
+Gothwad Tech maintains multiple independently deployable products. Some share an identity service; others have their own authentication and infrastructure. Do not assume every product already uses Gothwad Accounts.
+
+## Identity and email
+
+```text
+Browser → Accounts frontend (Cloudflare Pages)
+ → Accounts Worker → Supabase Auth + PostgreSQL
+
+Browser → Mail frontend (Cloudflare Pages)
+ → Mail Worker → separate Mail Supabase project
+ → Accounts Worker (session / username checks)
+ → Resend (outbound mail)
+Email Routing → Mail Worker's email handler → Mail database
+```
+
+Accounts owns authentication, profile data, sessions, and OAuth authorization. Mail derives an address from the verified username and `APP_DOMAIN`; it does not directly query the Accounts database.
+
+Mail's server-to-server `AUTH_HUB_URL` must reach the Accounts Worker Custom Domain. `AUTH_SIGNIN_URL` is the browser-facing sign-in site. Mixing them can return the Pages HTML page instead of the expected JSON API response.
+
+## Independent web applications
+
+- **GrixChat:** Supabase-backed real-time data, Pages Functions API adapters, WebRTC calls, and Firebase background notifications.
+- **Meet:** static React application using PeerJS and WebRTC for peer-to-peer meetings. Signaling and browser connectivity are still required; “no app backend” does not mean no network dependencies.
+- **PlusTube web:** static marketing, download, legal, and changelog pages. GitHub Actions refresh release-related JSON files.
+- **Clash Drive:** browser-side Telegram MTProto connections, with an optional Worker for public sharing. This is not the Accounts OAuth Drive API.
+- **Education:** role-based web UI with local persistence and optional Supabase integration.
+
+## Native Android products
+
+Launcher and Manager are Android applications built with Gradle. They are not deployed to Pages. Browser has separate product-specific installation and usage terms. Review each repository's license before reusing source code.
+
+## Configuration boundaries
+
+| Boundary | What belongs there |
+| --- | --- |
+| Browser | Public URLs and explicitly public configuration |
+| Worker / server | Service-role keys, signing secrets, outbound email credentials |
+| Database | Product data, schema, row-level security policies |
+| CI secrets | Build and release credentials; never source files |
+
+Read [Security & configuration](/docs/security) before deploying an authenticated product.
+
+## Documentation coverage
+
+The central portal currently provides setup and integration detail for Accounts, Mail, PlusTube web, Meet, and the docs site; other products have source-based orientation guides. The [repository directory](/repositories) lists additional projects without inventing undocumented APIs or production guarantees.
+
+Source references: [Accounts architecture](https://github.com/GothwadTech/accounts/blob/main/docs/ARCHITECTURE.md), [Mail behavior](https://github.com/GothwadTech/mail/blob/main/docs/MAIL.md), and the product READMEs linked from their guides.
diff --git a/src/content/browser.mdx b/src/content/browser.mdx
new file mode 100644
index 0000000..5de9258
--- /dev/null
+++ b/src/content/browser.mdx
@@ -0,0 +1,29 @@
+## Overview
+
+Gothwad Browser focuses on desktop-style browsing across Android phones, tablets, and TVs. The source README also describes desktop installation packages. This guide summarizes the product; it does not verify the availability of every release artifact.
+
+The documented Android experience includes remote and keyboard navigation, a file manager, notes, clipboard tools, and ad and tracker protection.
+
+## Installation workflow
+
+1. Open the product's [repository README](https://github.com/GothwadTech/browser#readme).
+2. Follow the official store or download link appropriate to your device.
+3. Verify the publisher and platform before installing a package.
+4. On Android, prefer the official store path. Only enable sideloading for an installer you trust, and turn it off afterward.
+5. Test navigation with the actual remote, keyboard, or touch input used on your device.
+
+Do not assume a desktop package exists just because its format is listed in a README; check the release assets linked by the maintainer.
+
+## Input and device testing
+
+For a TV deployment, verify D-pad focus, back-button behavior, scrolling, text input, and tab navigation. For phones and tablets, verify touch targets, orientation changes, and download handling. Browser capability depends on the target platform and rendering engine.
+
+## Source availability is not an open-source license
+
+The repository README explicitly marks this product as source-available and proprietary, with restrictions on copying, modification, and redistribution. Public GitHub visibility does not grant an open-source license.
+
+This portal does not provide cloning or redistribution instructions for Browser. Obtain the appropriate permission before working with its source.
+
+## Reporting an issue
+
+Use the repository's issue tracker. Include the device model, Android or desktop OS version, app version, input method, reproduction steps, and the expected result. Redact browsing history, account details, and private URLs.
diff --git a/src/content/clashdrive.mdx b/src/content/clashdrive.mdx
new file mode 100644
index 0000000..a675f4f
--- /dev/null
+++ b/src/content/clashdrive.mdx
@@ -0,0 +1,40 @@
+## Overview
+
+Clash Drive maps Telegram supergroup forum topics to folders in a browser-based storage workspace. It uses React, TypeScript, Vite, Bun, and `@mtcute` for MTProto connections.
+
+This product connects to Telegram identities. It should not be confused with a fully deployed Gothwad Accounts Drive service merely because Accounts lists Drive-related OAuth scopes.
+
+## Start locally
+
+Install Bun, then:
+
+```bash
+git clone https://github.com/GothwadTech/Clashdrive.git
+cd Clashdrive
+bun install
+bun dev
+```
+
+The source documents port 5173 by default. Use the URL printed by your development server.
+
+## Storage and streaming model
+
+Root folders map to Telegram forum topics. The browser communicates with Telegram datacenters, and a custom service worker handles media range requests for progressive playback.
+
+The README describes batch operations, previews, multiple Telegram identities, and local session management. Review Telegram's terms and limits before depending on it for storage. Keep independent backups of important files.
+
+## Public sharing
+
+Optional public download sharing uses a Cloudflare Worker and bot integration. This is separate from the local client setup. Review `worker.js` and the repository's current instructions before configuring any bot token or publicly exposing a file.
+
+## Production build
+
+```bash
+bun run build
+```
+
+Verify service-worker behavior on an HTTPS origin and confirm that cache updates work after a new deployment. Test logout and local-session cleanup on shared devices.
+
+## Security considerations
+
+Treat Telegram session data and bot credentials as sensitive. Do not include them in logs, screenshots, or Git. Public sharing intentionally makes content accessible outside the signed-in workspace; test permissions using non-sensitive sample files first.
diff --git a/src/content/cloudflare.mdx b/src/content/cloudflare.mdx
new file mode 100644
index 0000000..52bc388
--- /dev/null
+++ b/src/content/cloudflare.mdx
@@ -0,0 +1,64 @@
+## What this guide deploys
+
+This guide is for **GothwadTech/docs**: a static React, Vite, TypeScript, and MDX documentation site. It needs no database, runtime API, or production secrets. Other products have different deployment requirements.
+
+## 1. Validate locally
+
+Use Node.js 22 LTS and the committed lockfile.
+
+```bash
+npm ci
+npm test
+npm run build
+npm run preview
+```
+
+Confirm the home page, product filters, search, and a direct guide URL work in the production preview. The output directory is `dist/`.
+
+## 2. Create a Pages project
+
+In Cloudflare, open **Workers & Pages**, create a **Pages** project, and connect the GitHub repository `GothwadTech/docs`. Choose the branch containing your finished site. If it has not been merged into your production branch yet, deploy that working branch as a preview first.
+
+| Setting | Value |
+| --- | --- |
+| Framework preset | Vite |
+| Build command | `npm run build` |
+| Build output directory | `dist` |
+| Root directory | Repository root |
+| Environment variable | `NODE_VERSION=22` |
+
+Save and deploy. No API keys are required by this site.
+
+## 3. Verify direct navigation
+
+The repository includes `public/_redirects`:
+
+```text
+/* /index.html 200
+```
+
+Vite copies this into `dist/`. Pages can then serve the application for deep links such as `/docs/oauth` and `/products` instead of returning a static-file 404.
+
+Open a guide in a new tab and reload it directly on the deployed Pages URL. Verify that an unknown route displays the site's not-found screen.
+
+## 4. Add a custom domain
+
+In the Pages project's **Custom domains** section, add the domain you own and want to use for documentation. Follow the DNS instructions shown for your zone. Wait for domain verification and HTTPS provisioning, then test the same direct routes on that domain.
+
+Do not add production links in other products until this domain is verified and serving the correct project.
+
+## 5. Review headers and updates
+
+`public/_headers` includes content-type protection, a referrer policy, and long-lived caching for hashed assets. HTML is not given immutable caching, so new deployments can load the latest asset references.
+
+Push reviewed changes to the branch connected to Pages. Check the deployment log and verify the live pages after each content or dependency update.
+
+## Troubleshooting
+
+| Problem | What to check |
+| --- | --- |
+| Build cannot find dependencies | Commit `package-lock.json` and check Node version |
+| No output directory | Use `npm run build` and `dist`, not `web` |
+| Deep links return 404 | Confirm `_redirects` exists in the build output |
+| Old content after deploy | Confirm the deployed branch and clear any custom HTML cache rules |
+| Custom domain fails | Check Pages verification and the domain's DNS records |
diff --git a/src/content/contributing.mdx b/src/content/contributing.mdx
new file mode 100644
index 0000000..243def2
--- /dev/null
+++ b/src/content/contributing.mdx
@@ -0,0 +1,47 @@
+## Documentation structure
+
+This site uses React, Vite, TypeScript, CSS, and MDX. Content lives in `src/content/`. Metadata in `src/data.ts` powers navigation, product cards, guide indexes, and search.
+
+```text
+src/
+ content/ MDX product and integration guides
+ data.ts Product and document metadata
+ repositories.json GitHub repository inventory snapshot
+ App.tsx Layout, routes, search, and content rendering
+ styles.css Responsive light and dark themes
+public/
+ _redirects Cloudflare Pages SPA fallback
+ _headers Static response headers
+```
+
+## Add or update a guide
+
+1. Read the relevant product's source files and confirm the current implementation.
+2. Add a kebab-case MDX file in `src/content/`.
+3. Add matching metadata to `docs` in `src/data.ts`; the slug must match the filename.
+4. Use level-two headings for major sections so the page outline can be generated.
+5. Include prerequisites, ordered steps, validation, and troubleshooting where supported by the source.
+6. Link to exact source paths and record changes in the coverage record.
+7. Test the guide through navigation, direct URL loading, and search.
+
+Use fenced code blocks with a language. Copy controls are added automatically. Use the `Callout` component for important boundaries or warnings.
+
+## Source standards
+
+Do not invent endpoint URLs, SDK packages, performance statistics, or completed features. Distinguish implemented behavior from a roadmap. Publicly visible source is not necessarily open-source; retain credits and respect each repository's license.
+
+Current central guides were reviewed on October 14, 2026. `SOURCES.md` records the source revision used for each product. Content is a curated snapshot, not an automatic mirror of GitHub.
+
+## Run validation
+
+```bash
+npm ci
+npm test
+npm run build
+```
+
+The tests check metadata-to-content coverage and internal document links. The build type-checks the frontend and compiles every MDX page. Also test search, keyboard navigation, the mobile menu, dark mode, and a fresh load of a deep link.
+
+## Propose a change
+
+Open an issue or pull request in [GothwadTech/docs](https://github.com/GothwadTech/docs). Describe what changed, link the product source, and include only redacted screenshots. Never attach a session token or production environment file.
diff --git a/src/content/education.mdx b/src/content/education.mdx
new file mode 100644
index 0000000..c24c4b5
--- /dev/null
+++ b/src/content/education.mdx
@@ -0,0 +1,40 @@
+## Overview
+
+Gothwad Education is a K–12 school-management and learning platform. The repository describes role-specific experiences for administrators, teachers, students, and parents.
+
+| Role | Documented workflows |
+| --- | --- |
+| Administrator | Student and staff registry, fees, notices, overview analytics |
+| Teacher | Attendance, assignments, submission review, report cards |
+| Student | Timetable, homework, grades, notices |
+| Parent | Child progress, fee information, teacher notes |
+
+## Run locally
+
+```bash
+git clone https://github.com/GothwadTech/education.git
+cd education
+npm install
+cp .env.example .env
+npm run dev
+```
+
+Review the environment example before adding optional credentials. The source describes local persistence and optional Supabase synchronization; demo personas are not production authentication.
+
+## Repository map
+
+Role-specific views live in `src/features/`, authentication and theme state in `src/context/`, and data stores in `src/lib/`. The SQL schema is in `sql/schema.sql`.
+
+Read `docs/README.md` before configuring a real database. Use anonymized sample data for development, especially for student records, attendance, and payment information.
+
+## Build and validate
+
+```bash
+npm run build
+```
+
+Before a live school deployment, independently validate role authorization, database policies, data retention, and backup requirements. A payment-related interface is not proof of a configured payment processor.
+
+## Documentation boundary
+
+This overview is based on the README. Production security, deployment, and payment integration require further verification against the current implementation and operational requirements.
diff --git a/src/content/gothwadtech.mdx b/src/content/gothwadtech.mdx
new file mode 100644
index 0000000..2e06626
--- /dev/null
+++ b/src/content/gothwadtech.mdx
@@ -0,0 +1,32 @@
+## Overview
+
+The `gothwadtech` repository contains the Gothwad Tech corporate web platform. The source tree uses React and TypeScript with Vite and includes reusable sections for services, products, company information, and developer entry points.
+
+This is separate from `GothwadTech/docs`, the documentation portal you are reading.
+
+## Find the relevant code
+
+| Location | Purpose |
+| --- | --- |
+| `src/App.tsx` | Application composition |
+| `src/components/` | Page sections and shared interface components |
+| `src/components/DeveloperDocsSection.tsx` | Developer documentation entry point |
+| `src/data/gothwadApps.ts` | App directory data |
+| `src/context/` | Language and theme state |
+| `public/_redirects` | Static deployment routing |
+
+## Development workflow
+
+1. Review the repository's README and contribution instructions.
+2. Check `package.json` for the current install, development, and build scripts.
+3. Install dependencies using the committed lockfile.
+4. Run the configured development command and test the section you are editing.
+5. Validate production output and direct routes before publishing.
+
+This orientation does not turn marketing claims in the corporate README into measured uptime, security, or performance guarantees.
+
+## Connect the docs portal
+
+Update the website's developer entry point to your actual docs deployment URL after Pages is configured. Do not publish a guessed production URL before the domain is working.
+
+Keep navigation labels and product names consistent across the corporate site and this portal. Product implementation details should link to their specific guides instead of being duplicated in marketing components.
diff --git a/src/content/grixchat.mdx b/src/content/grixchat.mdx
new file mode 100644
index 0000000..0d00ab8
--- /dev/null
+++ b/src/content/grixchat.mdx
@@ -0,0 +1,48 @@
+## Overview
+
+GrixChat is a messaging and private-calling application with Chats, Stories, Search, Calls, and Profile sections. The documented architecture combines Supabase persistence and realtime events with WebRTC calling. Firebase Cloud Messaging is used for background notifications.
+
+## Start in mock mode
+
+Mock mode is the documented way to explore the app without production credentials.
+
+```bash
+git clone https://github.com/GothwadTech/grixchat.git
+cd grixchat
+npm install
+npm run dev:mock
+```
+
+The upstream README lists `demo@grixchat.app` and `grixchat` as **local mock credentials only**. The mock uses an in-memory seeded graph; do not treat it as durable or production storage.
+
+## Configure real Supabase
+
+Copy `.env.example` to `.env` and set the documented public Supabase URL and anon key. Read `docs/DEV_SETUP.md` and `sql/00_master_instructions.md` before applying SQL.
+
+```bash
+cp .env.example .env
+npm run dev
+```
+
+The source identifies `sql/01_schema.sql` and `sql/02_functions_realtime_storage.sql` as the current schema files. Do not run files from `sql/legacy`.
+
+## Understand the server boundary
+
+`server/api.ts` uses Web Request and Response APIs. Cloudflare Pages Functions in `functions/` forward `/api/*` and `/auth/*` requests to it. The same API implementation is used by the local development server.
+
+Realtime subscriptions should be filtered to the relevant records; high-frequency transient events use Broadcast and Presence. Do not add global table listeners without reviewing the data and egress impact.
+
+## Test and deploy
+
+```bash
+npm test
+npm run lint
+npm run build
+npx wrangler pages functions build
+```
+
+Deploy to Pages with `npm run build`, output `dist`, and the environment variables documented in `.env.example`. Unlike a purely static site, the `functions/` directory is part of this deployment. Verify sign-in, API routing, calls, and message delivery in a test environment before production.
+
+## Further reading
+
+Start with [docs/CONTEXT.md](https://github.com/GothwadTech/grixchat/blob/main/docs/CONTEXT.md), then the repository's setup and testing guides. This portal does not claim unverified user-capacity or free-tier guarantees.
diff --git a/src/content/launcher.mdx b/src/content/launcher.mdx
new file mode 100644
index 0000000..7a9dc77
--- /dev/null
+++ b/src/content/launcher.mdx
@@ -0,0 +1,33 @@
+## Overview
+
+Gothwad Launcher is a Kotlin Android TV home screen. The source uses native Android Views, ViewBinding, and RecyclerView, with D-pad navigation, wallpaper customization, voice search, and a quick dashboard.
+
+## Prepare Android tooling
+
+The README specifies Android Studio Ladybug 2024.2 or later, JDK 17, and Android SDK Platform 34. Confirm current versions in the Gradle files before installing dependencies.
+
+```bash
+git clone https://github.com/GothwadTech/launcher.git
+cd launcher
+./gradlew assembleDebug
+```
+
+On Windows, use `gradlew.bat` instead. The documented debug output is `app/build/outputs/apk/debug/app-debug.apk`.
+
+## Test on a TV device
+
+Install a debug build on your own emulator or test device. Test D-pad navigation, focus visibility, app launch, the home button, voice input, and wallpaper readability. Keep another launcher installed while evaluating home-screen behavior.
+
+## Release builds
+
+```bash
+./gradlew assembleRelease bundleRelease
+```
+
+Release signing requires the appropriate maintainer-managed secrets. Never commit a keystore or signing password. A debug build has a different signing identity and is not interchangeable with a signed release update.
+
+The README describes CI for builds, tests, and lint; a tag-triggered release workflow publishes signed APK and AAB artifacts. Read [docs/CI_RELEASE.md](https://github.com/GothwadTech/launcher/blob/main/docs/CI_RELEASE.md) before releasing.
+
+## Architecture and license
+
+The README identifies Apache-2.0 licensing. Check the repository license at your selected revision. Read [docs/ARCHITECTURE.md](https://github.com/GothwadTech/launcher/blob/main/docs/ARCHITECTURE.md) for the process model and startup paths.
diff --git a/src/content/mail-setup.mdx b/src/content/mail-setup.mdx
new file mode 100644
index 0000000..4952df4
--- /dev/null
+++ b/src/content/mail-setup.mdx
@@ -0,0 +1,80 @@
+## Prerequisites
+
+Deploy and verify Gothwad Accounts first. You also need a separate Supabase project for Mail, a Cloudflare-managed email domain, and a Resend credential with send permissions. Review upstream `docs/SETUP.md` before changing DNS or a production database.
+
+## 1. Create the Mail database
+
+Create a **new** Supabase project; do not reuse Accounts. Review and run `supabase/mail.sql` in the new project's SQL Editor. Verify `public.mail_messages` exists and row-level security is enabled.
+
+Keep the Mail project's URL and service-role key for the Mail Worker. The browser must not receive this key.
+
+## 2. Configure the two Accounts URLs
+
+Edit public values in `worker/wrangler.toml`. This file is reapplied on deployment and is the source of truth for public settings.
+
+| Variable | Purpose |
+| --- | --- |
+| `APP_DOMAIN` | Email address domain, such as `gothwadtech.com` |
+| `AUTH_HUB_URL` | Accounts Worker Custom Domain, such as `https://api.gothwadtech.com` |
+| `AUTH_SIGNIN_URL` | Browser sign-in site, such as `https://accounts.gothwadtech.com` |
+| `MAIL_URL` | Mail frontend origin |
+| `SUPABASE_URL` | Separate Mail project's URL |
+| `DAILY_SEND_LIMIT` | Per-user daily send cap |
+| `MAX_INBOUND_BYTES` | Inbound message size limit |
+
+Do not route server-to-server auth calls through the Accounts Pages hostname. A successful HTML response is not a valid authenticated session.
+
+## 3. Set Worker secrets
+
+Keep the Worker name `mail` consistent in the dashboard and Wrangler configuration. From the repository root:
+
+```bash
+npm install
+npx wrangler login
+npm run worker:secrets
+npm run worker:secrets:list
+```
+
+The script prompts for `SUPABASE_SERVICE_ROLE_KEY`, `RESEND_API_KEY`, and `ACCOUNTS_INTERNAL_TOKEN`. Set Accounts' `MAIL_INTERNAL_TOKEN` to the **same value** as Mail's `ACCOUNTS_INTERNAL_TOKEN` through a secure secret-setting workflow.
+
+Use Worker Secrets for keys and shared tokens. Never commit them in `wrangler.toml`, place them in `VITE_*` variables, or paste them in a support ticket.
+
+## 4. Deploy the Worker and frontend
+
+```bash
+npm run worker:deploy
+npm run build
+```
+
+Publish the web app to Cloudflare Pages with build command `npm run build` and output `dist`. Add the Mail custom domain, and route `mail.YOUR_DOMAIN/api/*` to the Mail Worker. Verify the routing against the repository setup instructions for your domain.
+
+Visit `/api/health`. The `configured` response should show the required settings as booleans, without exposing their values.
+
+## 5. Verify Accounts SSO
+
+1. Sign in to Accounts in the same browser profile.
+2. Open Mail and inspect the status of `/api/session`.
+3. A 200 response should load the mailbox.
+4. A 401 means Mail could not verify a shared session. Check cookie Domain, Path, and Secure attributes without sharing cookie values.
+5. A 503 `accounts_unexpected_response` can indicate that the Accounts URL returned HTML or a redirect instead of JSON.
+6. A 503 `accounts_user_invalid` means the session profile lacks a usable username.
+
+The current Mail flow uses shared-cookie SSO. Optional OAuth callback registration described upstream is not required for this current flow.
+
+## 6. Enable inbound and outbound mail
+
+Verify your sending domain in Resend using the records supplied for your own deployment. Before enabling Cloudflare Email Routing, confirm the deployed Accounts endpoint `/api/internal/usernames/:username` accepts the internal token and returns the documented existence response.
+
+Then configure Email Routing to deliver inbound mail to the `mail` Worker. Use a test account to send and receive a message. Confirm Inbox and Sent copies appear. Unknown recipients must be rejected; failed upstream validation must not silently accept mail.
+
+## Troubleshooting
+
+| Symptom | Action |
+| --- | --- |
+| Sign-in chooser repeats | Inspect `/api/session` error; check the shared cookie configuration |
+| API returns `200 text/html` | Fix `AUTH_HUB_URL` to the Accounts Worker Custom Domain |
+| Sending returns 503 | Check the Resend secret and health configuration |
+| Sending returns 429 | Check the user's daily cap or provider rate limit |
+| Inbound validation fails | Verify the shared internal token and Accounts endpoint before routing mail |
+
+For detailed message behavior and limits, see [Gothwad Mail](/docs/mail).
diff --git a/src/content/mail.mdx b/src/content/mail.mdx
new file mode 100644
index 0000000..45794f1
--- /dev/null
+++ b/src/content/mail.mdx
@@ -0,0 +1,59 @@
+## Overview
+
+Gothwad Mail is a React and Vite webmail application with a Cloudflare Worker API. Users sign in with Gothwad Accounts; their address is derived as `username@APP_DOMAIN`.
+
+Messages live in a separate Mail Supabase project. Resend handles outbound messages, and Cloudflare Email Routing invokes the Worker's inbound email handler.
+
+## Run locally
+
+```bash
+git clone https://github.com/GothwadTech/mail.git
+cd mail
+npm install
+cp .env.example .env.local
+cp worker/.dev.vars.example worker/.dev.vars
+```
+
+Fill in the example settings locally. `.env.local` contains public frontend configuration, not Worker secrets.
+
+```bash
+# Terminal 1
+npm run worker:dev
+```
+
+```bash
+# Terminal 2
+npm run dev
+```
+
+The frontend runs on port 3000 and proxies `/api` to the local Worker. Without a valid Accounts session, it sends the user to Accounts. The source supports `DEV_AUTH_USERNAME` for local development only; never configure it in production.
+
+## Mailbox behavior
+
+The UI exposes Inbox, Starred, Sent, Drafts, and Trash. Starred is a filter on `is_starred`, not a database folder. Every message query is scoped to the verified username.
+
+Drafts autosave after a short typing pause. Sent messages are copied into the sender's mailbox. Permanent deletion is allowed only for messages already in Trash.
+
+## Limits and attachments
+
+| Limit | Documented default |
+| --- | --- |
+| Sends per user per UTC day | 30, configured by `DAILY_SEND_LIMIT` |
+| Inbound message size | 10 MB, configured by `MAX_INBOUND_BYTES` |
+| Recipients per message | 25 |
+| API list page size | Maximum 100 |
+| Attachments | Metadata only; file bytes are not stored |
+
+The documented inbound implementation retains attachment names, types, and sizes only. Full attachment storage is not part of this documented flow.
+
+## Test before deployment
+
+```bash
+npm run lint
+npm run test:worker
+npm run test:auth
+npm run test:config
+npm run build
+```
+
+The optional `test:ui` smoke test requires the Worker to be running. Follow [Deploy Gothwad Mail](/docs/mail-setup) for production configuration and [API reference](/docs/api) for REST endpoints.
diff --git a/src/content/manager.mdx b/src/content/manager.mdx
new file mode 100644
index 0000000..1f61be0
--- /dev/null
+++ b/src/content/manager.mdx
@@ -0,0 +1,37 @@
+## Overview
+
+Gothwad Manager is an Android file-management application. Its source describes file browsing and archive-related tools across Android devices, with package identity `com.gothwad.manager`.
+
+## Build prerequisites
+
+The source README specifies **JDK 17**, **Android SDK 36**, Build Tools 36.0.0, and minimum SDK 24. Verify these against the checked-out Gradle configuration.
+
+```bash
+git clone https://github.com/GothwadTech/manager.git
+cd manager
+./gradlew assembleDebug
+```
+
+On Windows, run `gradlew.bat assembleDebug`. Import the repository into Android Studio to inspect device targets and build errors.
+
+## Verify file access safely
+
+1. Install the debug build on a test device.
+2. Grant only the permissions required for the workflow being tested.
+3. Start with disposable sample files in a test folder.
+4. Verify listing, opening, copying, moving, and deletion behavior.
+5. Check archive operations using copies rather than your only copy of important data.
+6. Test storage permission denial and revocation as well as the happy path.
+
+## Build release artifacts
+
+```bash
+./gradlew assembleRelease
+./gradlew bundleRelease
+```
+
+The repository documents build and release GitHub Actions. Release signing and publishing need the maintainer's secure configuration; no signing material belongs in source control or this documentation.
+
+## Scope of this guide
+
+This is a source-based development orientation. Review the current repository for detailed file-operation contracts and platform behavior. No public HTTP API is documented here.
diff --git a/src/content/meet.mdx b/src/content/meet.mdx
new file mode 100644
index 0000000..82025d3
--- /dev/null
+++ b/src/content/meet.mdx
@@ -0,0 +1,50 @@
+## Overview
+
+Gothwad Meet is a React and TypeScript meeting application using PeerJS and WebRTC. Its source describes a preview lobby, camera and microphone controls, screen sharing, in-meeting chat, a whiteboard, and multiple meeting layouts.
+
+Basic meetings do not require an application database. Peer discovery, signaling, network traversal, and browser permissions are still required.
+
+## Run locally
+
+Use the `meet` repository. Its README also mentions an older repository name; these instructions consistently use the current product repository.
+
+```bash
+git clone https://github.com/GothwadTech/meet.git
+cd meet
+npm install
+npm run dev
+```
+
+Use the local URL printed by Vite. The documented dev server uses port 3000. The source uses Vite 8; choose a Node release supported by its current package requirements.
+
+## Test a meeting
+
+1. Open the app and create a meeting.
+2. Allow camera and microphone access in the preview lobby.
+3. Copy the meeting link to a second browser or device.
+4. Join and check audio, video, participant state, and chat.
+5. Test screen sharing using the browser's chooser.
+6. Leave the call and verify camera and microphone activity stops.
+
+Use HTTPS on deployed origins. Browser localhost is suitable for local permission testing, but an insecure LAN URL can block media APIs.
+
+## Build and publish
+
+```bash
+npm run lint
+npm run build
+npm run preview
+```
+
+For Pages, use Vite as the framework, `npm run build` as the build command, and `dist` as the output directory. The repository includes a SPA redirect file. Test a direct meeting link after deployment.
+
+## Troubleshooting
+
+| Symptom | Check |
+| --- | --- |
+| No camera or microphone | Browser permission, OS permission, and secure origin |
+| Participants cannot connect | Network restrictions and PeerJS / WebRTC configuration |
+| Screen sharing unavailable | Browser capability and permission; test desktop first |
+| Captions do not appear | Browser speech-recognition support and permissions |
+
+A peer-to-peer mesh is not a guarantee of large-meeting scalability. Validate your intended device and participant count before promising a production service level.
diff --git a/src/content/oauth.mdx b/src/content/oauth.mdx
new file mode 100644
index 0000000..0c293a6
--- /dev/null
+++ b/src/content/oauth.mdx
@@ -0,0 +1,112 @@
+A browser or mobile application must not contain a client secret. Use the authorization-code flow with S256 PKCE and validate the returned state before exchanging the code.
+
+## 1. Register your application
+
+Have an Accounts administrator register your app in `public.ecosystem_apps`. The `client_id` must exist and your callback must exactly match a registered `redirect_uris` entry. Scheme, hostname, port, path, and trailing slash matter.
+
+Request only the scopes you need. `profile` provides basic profile data, `email` provides the derived Gothwad email address, and `offline_access` requests a refresh token. A registered scope does not by itself guarantee a downstream product API is deployed.
+
+## 2. Set the correct base URL
+
+Choose the base for your actual deployment:
+
+| Routing model | Base URL example |
+| --- | --- |
+| Accounts frontend with `/api/*` Worker route | `https://accounts.gothwadtech.com/api` |
+| Accounts Worker Custom Domain | `https://api.gothwadtech.com` |
+
+Keep the `/api` prefix when building URLs. A leading slash passed to `new URL()` would discard that path prefix, so the example below appends to the base explicitly.
+
+## 3. Generate PKCE and redirect
+
+Replace the example client and callback with your registered values. This code runs in a secure browser context.
+
+```typescript
+const AUTH = 'https://accounts.gothwadtech.com/api';
+const CLIENT_ID = 'YOUR_REGISTERED_CLIENT_ID';
+const REDIRECT_URI = `${location.origin}/auth/gothwad/callback`;
+const base64url = (bytes: Uint8Array) =>
+ btoa(String.fromCharCode(...bytes))
+ .replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
+
+const verifier = base64url(crypto.getRandomValues(new Uint8Array(32)));
+const state = base64url(crypto.getRandomValues(new Uint8Array(16)));
+const digest = await crypto.subtle.digest(
+ 'SHA-256', new TextEncoder().encode(verifier)
+);
+const challenge = base64url(new Uint8Array(digest));
+
+sessionStorage.setItem('gothwad_pkce', verifier);
+sessionStorage.setItem('gothwad_state', state);
+
+const url = new URL(`${AUTH}/oauth/authorize`);
+url.search = new URLSearchParams({
+ client_id: CLIENT_ID,
+ redirect_uri: REDIRECT_URI,
+ response_type: 'code',
+ scope: 'profile email',
+ state,
+ code_challenge: challenge,
+ code_challenge_method: 'S256',
+}).toString();
+location.assign(url);
+```
+
+## 4. Validate the callback
+
+On the registered callback page, define `AUTH`, `CLIENT_ID`, and `REDIRECT_URI` with the **same values as above**. Validate the callback before any network request. This example keeps the token only in memory.
+
+```typescript
+const params = new URLSearchParams(location.search);
+const expectedState = sessionStorage.getItem('gothwad_state');
+const verifier = sessionStorage.getItem('gothwad_pkce');
+sessionStorage.removeItem('gothwad_state');
+sessionStorage.removeItem('gothwad_pkce');
+history.replaceState(null, '', location.pathname);
+
+if (!expectedState || params.get('state') !== expectedState) {
+ throw new Error('Invalid OAuth state. Restart sign-in.');
+}
+if (params.has('error')) throw new Error('Sign-in was not approved.');
+const code = params.get('code');
+if (!code || !verifier) throw new Error('Missing code or PKCE verifier.');
+
+const response = await fetch(`${AUTH}/oauth/token`, {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({
+ grant_type: 'authorization_code',
+ client_id: CLIENT_ID,
+ redirect_uri: REDIRECT_URI,
+ code,
+ code_verifier: verifier,
+ }),
+});
+if (!response.ok) throw new Error('Token exchange failed. Restart sign-in.');
+const tokens = await response.json();
+
+const profileResponse = await fetch(`${AUTH}/oauth/userinfo`, {
+ headers: { Authorization: `Bearer ${tokens.access_token}` },
+});
+if (!profileResponse.ok) throw new Error('Could not load your profile.');
+const profile = await profileResponse.json();
+// Use profile in your app. Do not log tokens or session credentials.
+```
+
+## 5. Handle expiry safely
+
+The source guide documents one-hour access tokens, five-minute authorization codes, and rotating refresh tokens when `offline_access` is granted. Treat server responses as authoritative; do not hardcode a session lifetime into authorization decisions.
+
+A server-side application should exchange codes on its server and use secure, HttpOnly session cookies for the browser. Do not distribute the Accounts signing secret to other applications; obtain user information from the provider endpoint.
+
+## Troubleshooting
+
+| Error | Resolution |
+| --- | --- |
+| Unknown client ID | Register the app in `ecosystem_apps` |
+| Redirect URI not registered | Match the entire callback URL exactly |
+| PKCE verification failed | Use the same verifier that created the challenge |
+| State mismatch | Reject the callback and restart sign-in |
+| API request returns HTML | Correct the Worker base URL and preserve `/api` |
+
+See [API reference](/docs/api) for the endpoint summary. These are integration examples, not a published Gothwad SDK.
diff --git a/src/content/quickstart.mdx b/src/content/quickstart.mdx
new file mode 100644
index 0000000..8436a83
--- /dev/null
+++ b/src/content/quickstart.mdx
@@ -0,0 +1,59 @@
+These guides are based on the GothwadTech repositories reviewed on October 14, 2026. A repository's documented features are not a guarantee that its live deployment is configured. Check the linked source before a production rollout.
+
+## Choose your starting point
+
+Gothwad is a collection of web and native products, not a single installable SDK. Start with the repository for the product you want to build or extend.
+
+| Your goal | Start here | Repository |
+| --- | --- | --- |
+| Add sign-in to an application | [Accounts OAuth](/docs/oauth) | `accounts` |
+| Run a webmail application | [Mail setup](/docs/mail-setup) | `mail` |
+| Work on the PlusTube website | [Gothwad Tube](/docs/tube) | `tubeweb` |
+| Build a messaging experience | [GrixChat](/docs/grixchat) | `grixchat` |
+| Run video meetings | [Gothwad Meet](/docs/meet) | `meet` |
+| Contribute to this documentation | [Contributing](/docs/contributing) | `docs` |
+
+## Prepare your environment
+
+For this docs project, install **Node.js 22 LTS** and Git. Other repositories have their own runtime requirements: Clash Drive uses Bun, while Android projects use the Gradle wrapper and Android SDK.
+
+```bash
+node --version
+npm --version
+git --version
+```
+
+Use a separate working directory for each repository. Do not copy credentials or environment files from one product into another.
+
+## Run your first project
+
+The documentation website is a straightforward place to start. It has no backend, database, or required secrets.
+
+```bash
+git clone https://github.com/GothwadTech/docs.git
+cd docs
+npm ci
+npm run dev
+```
+
+Open the local URL printed by Vite. Change a guide in `src/content/` to see the page update.
+
+```bash
+npm test
+npm run build
+npm run preview
+```
+
+The build command type-checks TypeScript and compiles MDX into the production `dist/` directory.
+
+## Connect an application
+
+If you are adding Gothwad sign-in, follow the [OAuth guide](/docs/oauth). You need a registered client ID, an exact allowed redirect URI, and an Accounts deployment. A public SPA uses PKCE, **not a client secret in frontend code**.
+
+Mail has an additional dependency: its Worker verifies sessions through Accounts and stores messages in a separate Supabase project. Deploy and verify Accounts before following the [Mail deployment guide](/docs/mail-setup).
+
+## Go to production
+
+Follow the deployment instructions for the specific repository. Do not apply a generic Vite build to Accounts: its frontend is static HTML and the Pages output folder is `web`, not `dist`.
+
+For this site, use [Deploy to Cloudflare Pages](/docs/cloudflare). For any product, verify the build, deep links, environment variables, and authentication before adding your production domain.
diff --git a/src/content/security.mdx b/src/content/security.mdx
new file mode 100644
index 0000000..3d400b5
--- /dev/null
+++ b/src/content/security.mdx
@@ -0,0 +1,44 @@
+## Keep public and private configuration separate
+
+A variable prefixed with `VITE_` is available to browser code when used in the bundle. It is not an appropriate place for a service-role key, provider secret, internal token, or signing key.
+
+| Configuration | Location |
+| --- | --- |
+| Public API URL | Public frontend or Worker configuration |
+| Supabase service-role key | Worker / server secret |
+| JWT signing secret | Accounts Worker secret |
+| Resend API key | Mail Worker secret |
+| Local development secret | Ignored `.dev.vars` or server environment |
+| Release signing material | Maintainer-controlled secret store |
+
+## Manage secrets safely
+
+Use Wrangler prompts or the Cloudflare dashboard's Secret type. Avoid putting secret values into command arguments that persist in shell history. Do not include keys in screenshots, tickets, logs, or documentation examples.
+
+If a credential is exposed, revoke or rotate it in the owning provider. Deleting the line from the latest Git revision is not sufficient to invalidate a leaked key.
+
+## Protect authentication flows
+
+- Require PKCE S256 for public OAuth clients.
+- Validate `state` before code exchange.
+- Register exact redirect URIs; avoid broad wildcards.
+- Keep confidential-client exchanges on your backend.
+- Never share the Accounts JWT signing secret with a frontend.
+- Inspect cookie attributes, not cookie values, when debugging SSO.
+
+## Respect product boundaries
+
+Accounts and Mail use separate database projects. Mail verifies identity through Accounts' HTTP interface, not direct database access. Service-role credentials bypass database row-level protections and must remain on the Worker.
+
+Mail's reader treats email HTML as untrusted and renders it in a restrictive sandboxed iframe. Do not remove the sandbox or render an arbitrary email body into the main application DOM.
+
+## Before production
+
+1. Remove development-only auth overrides.
+2. Review allowed origins, cookie domain, HTTPS, and callback URLs.
+3. Verify database policies and least-privilege access.
+4. Run each repository's tests and configuration checks.
+5. Test error paths without exposing private response data.
+6. Review current dependency security and licensing obligations.
+
+These are implementation and operational safeguards, not a certification or an independent security audit.
diff --git a/src/content/tube.mdx b/src/content/tube.mdx
new file mode 100644
index 0000000..4a295e8
--- /dev/null
+++ b/src/content/tube.mdx
@@ -0,0 +1,50 @@
+## Two repositories, two roles
+
+**PlusTube**, also known as Gothwad Tube, is a privacy-respecting YouTube and YouTube Music client for Android. `tubeweb` is the website; `tubeapp` is the application repository. Do not treat the website build as an Android APK build.
+
+The website includes product information, downloads, changelogs, a Neuro explainer, and privacy, terms, and DMCA pages. Its stack is Vite, React, TypeScript, and Tailwind CSS.
+
+## Run the website locally
+
+```bash
+git clone https://github.com/GothwadTech/tubeweb.git
+cd tubeweb
+npm install
+npm run dev
+```
+
+## Build and deploy
+
+```bash
+npm run build
+npm run preview
+```
+
+The upstream build type-checks the project and writes `dist/`. For Cloudflare Pages, set the build command to `npm run build` and the output directory to `dist`. Use a Node version supported by the repository's current dependencies.
+
+The source includes `public/_redirects` for SPA routes and `public/_headers` for caching. Test a direct visit to `/download`, `/privacy`, and `/terms` after deployment.
+
+## Release data pipeline
+
+The GitHub Action `.github/workflows/update-stats.yml` refreshes website data hourly according to the source README.
+
+| File | Contents |
+| --- | --- |
+| `public/downloads.json` | Latest and nightly APK release links |
+| `public/changelogs.json` | Release notes from the app repository |
+| `public/contributors.json` | Project and upstream contributors |
+| `public/stats.json` | Repository and download statistics |
+
+To refresh download data manually with the authenticated GitHub CLI:
+
+```bash
+bash .github/scripts/fetch-downloads.sh public/downloads.json
+```
+
+Inspect the generated JSON before committing. If downloads are missing, check the app releases and the workflow logs instead of adding a fabricated APK URL.
+
+## Credits and licensing
+
+PlusTube is based on [Flow](https://github.com/A-EDev/Flow) by A-EDev and contributors. The website README specifies GPL-3.0. Preserve upstream attribution and review the license before redistributing changes.
+
+Visit the [app repository](https://github.com/GothwadTech/tubeapp) for Android-specific build and release instructions.
diff --git a/src/data.ts b/src/data.ts
new file mode 100644
index 0000000..5a0eb80
--- /dev/null
+++ b/src/data.ts
@@ -0,0 +1,288 @@
+import {
+ Fingerprint,
+ Mail,
+ Play,
+ Globe2,
+ MessageCircle,
+ Video,
+ Monitor,
+ FolderOpen,
+ GraduationCap,
+ HardDrive,
+ Braces,
+ Building2,
+ BookOpen,
+ Layers,
+ Rocket,
+ ShieldCheck,
+ Cloud,
+ Code2,
+ KeyRound,
+} from 'lucide-react';
+import type { LucideIcon } from 'lucide-react';
+export type Category =
+ | 'All products'
+ | 'Identity & security'
+ | 'Communication'
+ | 'Media & apps'
+ | 'Developer tools';
+export const categories: Category[] = [
+ 'All products',
+ 'Identity & security',
+ 'Communication',
+ 'Media & apps',
+ 'Developer tools',
+];
+export type Product = {
+ id: string;
+ name: string;
+ description: string;
+ icon: LucideIcon;
+ color: string;
+ category: Category;
+ repo: string;
+ tag: string;
+};
+export const products: Product[] = [
+ {
+ id: 'accounts',
+ name: 'Gothwad Accounts',
+ description:
+ 'One identity for your ecosystem. Authentication, sessions, and OAuth 2.0.',
+ icon: Fingerprint,
+ color: 'orange',
+ category: 'Identity & security',
+ repo: 'accounts',
+ tag: 'Identity',
+ },
+ {
+ id: 'mail',
+ name: 'Gothwad Mail',
+ description:
+ 'Your inbox, connected. Send, receive, and manage email on the edge.',
+ icon: Mail,
+ color: 'blue',
+ category: 'Communication',
+ repo: 'mail',
+ tag: 'Email',
+ },
+ {
+ id: 'tube',
+ name: 'Gothwad Tube',
+ description:
+ 'A better way to watch. Explore the PlusTube app and its web platform.',
+ icon: Play,
+ color: 'red',
+ category: 'Media & apps',
+ repo: 'tubeweb',
+ tag: 'Video & music',
+ },
+ {
+ id: 'browser',
+ name: 'Gothwad Browser',
+ description:
+ 'Built for the bigger screen. Browsing for Android TVs, tablets, and more.',
+ icon: Globe2,
+ color: 'teal',
+ category: 'Media & apps',
+ repo: 'browser',
+ tag: 'Browser',
+ },
+ {
+ id: 'grixchat',
+ name: 'GrixChat',
+ description:
+ 'Bring conversations together with real-time messaging and private calls.',
+ icon: MessageCircle,
+ color: 'violet',
+ category: 'Communication',
+ repo: 'grixchat',
+ tag: 'Messaging',
+ },
+ {
+ id: 'meet',
+ name: 'Gothwad Meet',
+ description:
+ 'Connect face to face. Peer-to-peer video meetings, powered by WebRTC.',
+ icon: Video,
+ color: 'green',
+ category: 'Communication',
+ repo: 'meet',
+ tag: 'Video conferencing',
+ },
+ {
+ id: 'launcher',
+ name: 'Gothwad Launcher',
+ description:
+ 'A native Android TV home screen with remote-first navigation.',
+ icon: Monitor,
+ color: 'blue',
+ category: 'Media & apps',
+ repo: 'launcher',
+ tag: 'Android TV',
+ },
+ {
+ id: 'manager',
+ name: 'Gothwad Manager',
+ description: 'File management and archive tools for Android devices.',
+ icon: FolderOpen,
+ color: 'orange',
+ category: 'Media & apps',
+ repo: 'manager',
+ tag: 'File management',
+ },
+ {
+ id: 'education',
+ name: 'Gothwad Education',
+ description:
+ 'School administration and learning for teachers, students, and parents.',
+ icon: GraduationCap,
+ color: 'violet',
+ category: 'Media & apps',
+ repo: 'education',
+ tag: 'Education',
+ },
+ {
+ id: 'clashdrive',
+ name: 'Clash Drive',
+ description:
+ 'Turn Telegram forum topics into a browser-based storage workspace.',
+ icon: HardDrive,
+ color: 'teal',
+ category: 'Media & apps',
+ repo: 'Clashdrive',
+ tag: 'Storage',
+ },
+ {
+ id: 'ai',
+ name: 'Gothwad AI',
+ description:
+ 'Get oriented with the AI Studio application and local development setup.',
+ icon: Braces,
+ color: 'orange',
+ category: 'Developer tools',
+ repo: 'ai',
+ tag: 'AI tools',
+ },
+ {
+ id: 'gothwadtech',
+ name: 'Gothwad Tech website',
+ description:
+ 'Explore the corporate web platform, components, and developer entry points.',
+ icon: Building2,
+ color: 'blue',
+ category: 'Developer tools',
+ repo: 'gothwadtech',
+ tag: 'Web platform',
+ },
+];
+export type Doc = {
+ slug: string;
+ title: string;
+ description: string;
+ section: string;
+ icon: LucideIcon;
+ repo?: string;
+ source?: string;
+ time: string;
+};
+export const docs: Doc[] = [
+ {
+ slug: 'quickstart',
+ title: 'Start building with Gothwad',
+ description:
+ 'Choose a product, prepare your environment, and run your first project.',
+ section: 'Getting started',
+ icon: Rocket,
+ time: '5 min',
+ },
+ {
+ slug: 'architecture',
+ title: 'The Gothwad ecosystem',
+ description:
+ 'Understand how identity, Workers, web apps, and native products fit together.',
+ section: 'Getting started',
+ icon: Layers,
+ time: '6 min',
+ },
+ ...products.map((p) => ({
+ slug: p.id,
+ title: p.name,
+ description: p.description,
+ section: 'Products',
+ icon: p.icon,
+ repo: p.repo,
+ source: 'README.md',
+ time: ['accounts', 'mail'].includes(p.id) ? '8 min' : '5 min',
+ })),
+ {
+ slug: 'accounts-setup',
+ title: 'Set up Gothwad Accounts',
+ description:
+ 'Configure Supabase, deploy the auth Worker, and publish the Accounts frontend.',
+ section: 'Guides',
+ icon: Fingerprint,
+ repo: 'accounts',
+ source: 'docs/SETUP.md',
+ time: '12 min',
+ },
+ {
+ slug: 'oauth',
+ title: 'Integrate Sign in with Gothwad',
+ description:
+ 'Implement the authorization-code flow with PKCE, state validation, and user info.',
+ section: 'Guides',
+ icon: KeyRound,
+ repo: 'accounts',
+ source: 'docs/OAUTH.md',
+ time: '10 min',
+ },
+ {
+ slug: 'mail-setup',
+ title: 'Deploy Gothwad Mail',
+ description:
+ 'Connect Accounts, configure the Mail database and Worker, and enable email routing.',
+ section: 'Guides',
+ icon: Mail,
+ repo: 'mail',
+ source: 'docs/SETUP.md',
+ time: '12 min',
+ },
+ {
+ slug: 'cloudflare',
+ title: 'Deploy to Cloudflare Pages',
+ description:
+ 'Build and publish this documentation site, with working deep links and a custom domain.',
+ section: 'Guides',
+ icon: Cloud,
+ time: '6 min',
+ },
+ {
+ slug: 'api',
+ title: 'API reference',
+ description:
+ 'Explore the documented Accounts OAuth and Mail REST endpoints.',
+ section: 'Resources',
+ icon: Code2,
+ time: '8 min',
+ },
+ {
+ slug: 'security',
+ title: 'Security & configuration',
+ description:
+ 'Handle secrets, sessions, public variables, and production configuration safely.',
+ section: 'Resources',
+ icon: ShieldCheck,
+ time: '5 min',
+ },
+ {
+ slug: 'contributing',
+ title: 'Contribute to the docs',
+ description:
+ 'Add an MDX guide, cite its source, and validate changes locally.',
+ section: 'Resources',
+ icon: BookOpen,
+ time: '4 min',
+ },
+];
+export const findDoc = (slug: string) => docs.find((d) => d.slug === slug);
diff --git a/src/main.tsx b/src/main.tsx
new file mode 100644
index 0000000..d23f1b0
--- /dev/null
+++ b/src/main.tsx
@@ -0,0 +1,13 @@
+import React from 'react';
+import ReactDOM from 'react-dom/client';
+import { BrowserRouter } from 'react-router-dom';
+import '@fontsource-variable/inter';
+import App from './App';
+import './styles.css';
+ReactDOM.createRoot(document.getElementById('root')!).render(
+
+
+
+
+ ,
+);
diff --git a/src/repositories.json b/src/repositories.json
new file mode 100644
index 0000000..d7da9e8
--- /dev/null
+++ b/src/repositories.json
@@ -0,0 +1,275 @@
+[
+ {
+ "description": "",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "docs",
+ "url": "https://github.com/GothwadTech/docs"
+ },
+ {
+ "description": "",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "tubeweb",
+ "url": "https://github.com/GothwadTech/tubeweb"
+ },
+ {
+ "description": "Gothwad TV Launcher is made for Android TVs and Tablets SImple looking but advance feature luncher notification recents apps ads free suitable for all types of devices ",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "launcher",
+ "url": "https://github.com/GothwadTech/launcher"
+ },
+ {
+ "description": "",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "gothwadtech",
+ "url": "https://github.com/GothwadTech/gothwadtech"
+ },
+ {
+ "description": "Gothwad Tube",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "tubeapp",
+ "url": "https://github.com/GothwadTech/tubeapp"
+ },
+ {
+ "description": "",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "storeapp",
+ "url": "https://github.com/GothwadTech/storeapp"
+ },
+ {
+ "description": "Gothwad Accounts for Web & Cloudflare Workers ",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "accounts",
+ "url": "https://github.com/GothwadTech/accounts"
+ },
+ {
+ "description": "Gothwad Mail",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "mail",
+ "url": "https://github.com/GothwadTech/mail"
+ },
+ {
+ "description": "GrixChat is a comprehensive, high-performance social media and real-time messaging application. It combines the features of popular platforms like Instagram and WhatsApp into a single, mobile-first experience.",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "grixchat",
+ "url": "https://github.com/GothwadTech/grixchat"
+ },
+ {
+ "description": "Gothwad Meet",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "meet",
+ "url": "https://github.com/GothwadTech/meet"
+ },
+ {
+ "description": "B",
+ "isFork": true,
+ "isPrivate": false,
+ "name": "Mm",
+ "url": "https://github.com/GothwadTech/Mm"
+ },
+ {
+ "description": "H",
+ "isFork": true,
+ "isPrivate": false,
+ "name": "G",
+ "url": "https://github.com/GothwadTech/G"
+ },
+ {
+ "description": "Gothwad Manager is an all-in-one file management tool for Android. It is Simple, Small, Fast and Efficient File Explorer. Supports RTL and shows size of folders across storages. Designed for all Android devices including Phones, Tablets and Android TV.",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "manager",
+ "url": "https://github.com/GothwadTech/manager"
+ },
+ {
+ "description": "",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "indogramapp",
+ "url": "https://github.com/GothwadTech/indogramapp"
+ },
+ {
+ "description": "Telegram Web A, GPL v3",
+ "isFork": true,
+ "isPrivate": false,
+ "name": "telegram-tt",
+ "url": "https://github.com/GothwadTech/telegram-tt"
+ },
+ {
+ "description": "Cromite a Bromite fork with ad blocking and privacy enhancements; take back your browser!",
+ "isFork": true,
+ "isPrivate": false,
+ "name": "cromite",
+ "url": "https://github.com/GothwadTech/cromite"
+ },
+ {
+ "description": "Gothwad Browser Is a Fastest Securest Lightwight Browser For Android Phones & TVs You Ever See. Advance features Specifically For Physical Keyboard and Mouse in Android TVs with Best Support of TV Remote. Made for Multitasking With Inbuilt File manager, Notepad & Clipboard Manager etc. Try First Then Belive. Made In India With Love By Gothwad Tech.",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "browser",
+ "url": "https://github.com/GothwadTech/browser"
+ },
+ {
+ "description": "",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "prepmate",
+ "url": "https://github.com/GothwadTech/prepmate"
+ },
+ {
+ "description": "Gothwad Internet is a Lightweight Browser For Android Phones",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "internet",
+ "url": "https://github.com/GothwadTech/internet"
+ },
+ {
+ "description": "Gothwad Apps Store",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "store",
+ "url": "https://github.com/GothwadTech/store"
+ },
+ {
+ "description": "Gothwad Computer is an android app",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "computer",
+ "url": "https://github.com/GothwadTech/computer"
+ },
+ {
+ "description": "",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "pwparentapp",
+ "url": "https://github.com/GothwadTech/pwparentapp"
+ },
+ {
+ "description": "",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "prepmateapp",
+ "url": "https://github.com/GothwadTech/prepmateapp"
+ },
+ {
+ "description": "WebView Android Apps Template ",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "webview",
+ "url": "https://github.com/GothwadTech/webview"
+ },
+ {
+ "description": "",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "educationapp",
+ "url": "https://github.com/GothwadTech/educationapp"
+ },
+ {
+ "description": "GrixChat is an open-source Android messaging and communication app designed for fluid performance, offline reliability, and clean aesthetics. It integrates native Jetpack Compose interfaces with advanced WebView caching mechanisms, local Room database persistence, and Firebase Push Notifications.",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "grixchatapp",
+ "url": "https://github.com/GothwadTech/grixchatapp"
+ },
+ {
+ "description": "",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "pwparent",
+ "url": "https://github.com/GothwadTech/pwparent"
+ },
+ {
+ "description": "Gothwad Browsing",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "browsing",
+ "url": "https://github.com/GothwadTech/browsing"
+ },
+ {
+ "description": "",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "iconmaker",
+ "url": "https://github.com/GothwadTech/iconmaker"
+ },
+ {
+ "description": "",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "linux",
+ "url": "https://github.com/GothwadTech/linux"
+ },
+ {
+ "description": "",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "keystore",
+ "url": "https://github.com/GothwadTech/keystore"
+ },
+ {
+ "description": "A serverless, client-side web application that transforms Telegram supergroup forum topics into a personal cloud storage workspace. Run entirely in your browser with direct Telegram Datacenter connection via MTProto.",
+ "isFork": true,
+ "isPrivate": false,
+ "name": "Clashdrive",
+ "url": "https://github.com/GothwadTech/Clashdrive"
+ },
+ {
+ "description": "",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "browser-terms",
+ "url": "https://github.com/GothwadTech/browser-terms"
+ },
+ {
+ "description": "",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "browser-privacy",
+ "url": "https://github.com/GothwadTech/browser-privacy"
+ },
+ {
+ "description": "Gothwad Education is a School Management & Learning Platform. Welcome to Gothwad Education, a mobile-first, high-performance School Management System and Digital Learning Ecosystem designed for Admins, Teachers, Students, and Parents.",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "education",
+ "url": "https://github.com/GothwadTech/education"
+ },
+ {
+ "description": "Demo 1",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "demo1",
+ "url": "https://github.com/GothwadTech/demo1"
+ },
+ {
+ "description": "Gothwad AI Gothwad AI Studio is a fluid, mobile-first developer workspace that integrates with GitHub to manage repositories, branches, files, and perform direct ZIP payload unpack & sync merges.",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "ai",
+ "url": "https://github.com/GothwadTech/ai"
+ },
+ {
+ "description": "",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "website",
+ "url": "https://github.com/GothwadTech/website"
+ },
+ {
+ "description": "GxChat India - A comprehensive, high-performance social media and real-time messaging application - Gothwad Technologies",
+ "isFork": false,
+ "isPrivate": false,
+ "name": "gxchatindia",
+ "url": "https://github.com/GothwadTech/gxchatindia"
+ }
+]
diff --git a/src/styles.css b/src/styles.css
new file mode 100644
index 0000000..e30f418
--- /dev/null
+++ b/src/styles.css
@@ -0,0 +1,2600 @@
+:root {
+ font-family: 'Inter Variable', Inter, ui-sans-serif, system-ui, sans-serif;
+ color: #24262b;
+ background: #fff;
+ font-synthesis: none;
+ font-weight: 400;
+ font-size: 14px;
+ --bg: #fff;
+ --surface: #fafafa;
+ --surface-hover: #f5f5f5;
+ --text: #24262b;
+ --muted: #696d77;
+ --subtle: #6c707a;
+ --border: #e9e9ed;
+ --orange: #ee6b2d;
+ --orange-dark: #b7420d;
+ --orange-soft: #fff2e9;
+ --orange-border: #f6ddca;
+ --diagram-line: #edb893;
+ --sidebar: #fcfcfd;
+ --shadow: 0 8px 28px #24242406;
+ color-scheme: light;
+}
+:root[data-theme='dark'] {
+ --bg: #15171a;
+ --surface: #1c1e22;
+ --surface-hover: #24262b;
+ --text: #e9e9ec;
+ --muted: #a0a2ac;
+ --subtle: #90939d;
+ --border: #2e3037;
+ --orange: #fb9253;
+ --orange-dark: #ffab78;
+ --orange-soft: #35251e;
+ --orange-border: #563827;
+ --diagram-line: #71472f;
+ --sidebar: #191b1f;
+ --shadow: 0 8px 28px #00000020;
+ color-scheme: dark;
+ background: var(--bg);
+ color: var(--text);
+}
+* {
+ box-sizing: border-box;
+}
+body {
+ margin: 0;
+}
+button,
+input {
+ font: inherit;
+}
+button,
+a {
+ -webkit-tap-highlight-color: transparent;
+}
+button {
+ cursor: pointer;
+}
+a {
+ color: inherit;
+ text-decoration: none;
+}
+button {
+ color: inherit;
+}
+svg {
+ flex-shrink: 0;
+ vertical-align: middle;
+}
+button:disabled {
+ cursor: default;
+}
+button {
+ border: 0;
+ background: none;
+}
+a,
+button {
+ touch-action: manipulation;
+}
+a:focus-visible,
+button:focus-visible,
+input:focus-visible {
+ outline: 2px solid var(--orange);
+ outline-offset: 4px;
+}
+::selection {
+ background: #f8bb9170;
+}
+p {
+ line-height: 1.65;
+}
+h1,
+h2,
+h3,
+h4,
+p {
+ margin: 0;
+}
+button {
+ padding: 0;
+}
+html {
+ scroll-behavior: smooth;
+ scroll-padding-top: 96px;
+}
+.skip-link {
+ position: fixed;
+ top: -60px;
+ left: 20px;
+ z-index: 200;
+ background: var(--orange);
+ padding: 12px;
+ color: #fff;
+}
+.skip-link:focus {
+ top: 8px;
+}
+.topbar {
+ height: 72px;
+ border-bottom: 1px solid var(--border);
+ background: var(--bg);
+ display: flex;
+ align-items: center;
+ gap: 32px;
+ padding: 0 30px 0 24px;
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ z-index: 40;
+}
+.brand-area {
+ display: flex;
+ align-items: center;
+ gap: 18px;
+ flex-shrink: 0;
+}
+.brand {
+ display: flex;
+ align-items: center;
+ gap: 9px;
+ font-size: 19px;
+ letter-spacing: -0.65px;
+ font-weight: 730;
+ white-space: nowrap;
+}
+.brand-mark {
+ height: 33px;
+ width: 33px;
+ border-radius: 9px;
+ background: var(--orange);
+ color: white;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ box-shadow: inset 0 1px 1px #ffffff30;
+}
+.brand-mark svg {
+ width: 100%;
+ height: 100%;
+}
+.brand-divider {
+ height: 23px;
+ background: var(--border);
+ width: 1px;
+ transform: rotate(17deg);
+}
+.developer-label {
+ font-size: 13px;
+ color: var(--muted);
+}
+.search-trigger {
+ max-width: 370px;
+ width: 32%;
+ height: 36px;
+ border: 1px solid var(--border);
+ border-radius: 7px;
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 0 11px;
+ color: var(--muted);
+ background: var(--surface);
+ margin-left: auto;
+ font-size: 12px;
+}
+.search-trigger:hover {
+ border-color: var(--subtle);
+}
+kbd {
+ font-family: inherit;
+ font-size: 10px;
+ border: 1px solid var(--border);
+ border-radius: 4px;
+ padding: 2px 5px;
+ line-height: 1.3;
+ white-space: nowrap;
+ background: var(--bg);
+ color: var(--muted);
+}
+.search-trigger kbd {
+ margin-left: auto;
+}
+.header-actions {
+ display: flex;
+ gap: 18px;
+ align-items: center;
+}
+.icon-button {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 30px;
+ height: 32px;
+ border-radius: 6px;
+ color: var(--muted);
+}
+.icon-button:hover {
+ background: var(--surface-hover);
+ color: var(--text);
+}
+.header-separator {
+ width: 1px;
+ height: 20px;
+ background: var(--border);
+ margin-left: -5px;
+ margin-right: -5px;
+}
+.website-link {
+ font-size: 12px;
+ font-weight: 550;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ white-space: nowrap;
+ margin-left: 3px;
+}
+.website-link:hover {
+ color: var(--orange);
+}
+.mobile-menu {
+ display: none;
+}
+.sidebar {
+ position: fixed;
+ top: 72px;
+ bottom: 0;
+ left: 0;
+ width: 239px;
+ border-right: 1px solid var(--border);
+ background: var(--sidebar);
+ z-index: 30;
+ display: flex;
+ flex-direction: column;
+}
+.sidebar-scroll {
+ padding: 29px 17px 22px;
+ overflow-y: auto;
+ flex: 1;
+ scrollbar-width: thin;
+}
+.sidebar-heading {
+ font-size: 10px;
+ font-weight: 650;
+ letter-spacing: 1.35px;
+ color: var(--subtle);
+ padding: 0 12px 18px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+}
+.nav-group {
+ display: flex;
+ flex-direction: column;
+ gap: 3px;
+}
+.nav-item {
+ display: flex;
+ align-items: center;
+ gap: 11px;
+ border-radius: 6px;
+ padding: 9px 11px;
+ font-size: 12px;
+ min-height: 36px;
+ color: #626670;
+ transition:
+ background 0.15s,
+ color 0.15s;
+}
+.nav-item svg {
+ color: #81858f;
+ stroke-width: 1.65;
+}
+.nav-item:hover {
+ background: var(--surface-hover);
+ color: var(--text);
+}
+.nav-item.active {
+ color: var(--orange-dark);
+ background: var(--orange-soft);
+ font-weight: 560;
+}
+.nav-item.active svg {
+ color: var(--orange);
+}
+.nav-heading {
+ font-size: 11px;
+ font-weight: 650;
+ display: flex;
+ align-items: center;
+ padding: 28px 11px 11px;
+ color: var(--text);
+ width: 100%;
+ text-align: left;
+}
+.nav-heading svg {
+ margin-left: auto;
+ color: var(--subtle);
+ transition: transform 0.2s;
+}
+.nav-heading .rotated {
+ transform: rotate(-90deg);
+}
+.nav-item .nav-chevron {
+ margin-left: auto;
+ color: #b1b4bc;
+}
+.count-badge {
+ font-size: 9px;
+ line-height: 15px;
+ min-width: 21px;
+ text-align: center;
+ background: var(--bg);
+ color: var(--subtle);
+ border: 1px solid var(--border);
+ border-radius: 4px;
+ margin-left: auto;
+}
+.sidebar-help {
+ margin: 37px 7px 0;
+ padding: 16px 12px 14px;
+ border: 1px solid var(--border);
+ border-radius: 8px;
+ background: var(--bg);
+}
+.help-icon {
+ color: var(--muted);
+}
+.sidebar-help h4 {
+ font-weight: 600;
+ font-size: 12px;
+ margin: 10px 0 5px;
+}
+.sidebar-help p {
+ font-size: 10px;
+ line-height: 1.8;
+ color: var(--muted);
+}
+.sidebar-help a {
+ font-size: 10px;
+ font-weight: 550;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ margin-top: 13px;
+ color: var(--orange-dark);
+}
+.sidebar-bottom {
+ min-height: 43px;
+ border-top: 1px solid var(--border);
+ display: flex;
+ align-items: center;
+ gap: 7px;
+ padding: 12px 20px;
+ font-size: 9px;
+ color: var(--muted);
+}
+.sidebar-bottom a {
+ margin-left: auto;
+}
+.source-dot,
+.open-badge > span {
+ width: 5px;
+ height: 5px;
+ display: inline-block;
+ border-radius: 50%;
+ background: #41a477;
+}
+.source-dot {
+ background: var(--orange);
+}
+[data-theme='dark'] .nav-item {
+ color: #acaeb8;
+}
+[data-theme='dark'] .nav-item.active {
+ color: var(--orange);
+}
+main {
+ margin-left: 239px;
+ padding-top: 72px;
+ min-height: 100vh;
+}
+.page {
+ max-width: 1350px;
+ margin: 0 auto;
+ padding: 25px 48px 0;
+}
+.breadcrumb-row {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ min-height: 23px;
+ gap: 20px;
+}
+.breadcrumbs {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ font-size: 10px;
+ color: var(--muted);
+}
+.breadcrumbs > a {
+ color: var(--subtle);
+}
+.breadcrumbs > svg {
+ color: #b5b6bc;
+}
+.open-badge {
+ display: flex;
+ align-items: center;
+ gap: 7px;
+ font-size: 10px;
+ color: var(--muted);
+}
+.open-badge > span {
+ width: 4px;
+ height: 4px;
+}
+.hero {
+ position: relative;
+ display: flex;
+ align-items: center;
+ min-height: 359px;
+ margin: 12px -4px 20px;
+ overflow: hidden;
+}
+.hero-content {
+ position: relative;
+ z-index: 2;
+ flex: 1;
+ padding: 25px 0 14px 4px;
+}
+.eyebrow {
+ font-size: 9px;
+ letter-spacing: 1.65px;
+ font-weight: 650;
+ color: var(--orange-dark);
+ display: flex;
+ align-items: center;
+ gap: 7px;
+ line-height: 1.7;
+}
+.eyebrow > span {
+ display: inline-block;
+ width: 5px;
+ height: 5px;
+ background: var(--orange);
+ border-radius: 50%;
+}
+.hero h1 {
+ font-size: 52px;
+ font-weight: 660;
+ line-height: 1.12;
+ letter-spacing: -2.6px;
+ margin: 16px 0;
+}
+.hero h1 > span {
+ color: var(--orange);
+}
+.hero-content > p {
+ font-size: 13px;
+ line-height: 1.85;
+ color: var(--muted);
+}
+.hero-actions {
+ display: flex;
+ align-items: center;
+ gap: 11px;
+ margin-top: 23px;
+}
+.button {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ gap: 15px;
+ font-size: 11px;
+ font-weight: 570;
+ border-radius: 6px;
+ min-height: 37px;
+ padding: 0 15px;
+ transition:
+ background 0.2s,
+ transform 0.2s,
+ border-color 0.2s;
+ white-space: nowrap;
+}
+.button:hover {
+ transform: translateY(-1px);
+}
+.button.primary {
+ background: #c64b16;
+ color: white;
+ border: 1px solid var(--orange);
+ box-shadow: 0 2px 3px #ee6b2d13;
+}
+.button.primary:hover {
+ background: var(--orange-dark);
+}
+[data-theme='dark'] .button.primary {
+ background: var(--orange);
+ color: #20150e;
+}
+[data-theme='dark'] .button.primary:hover {
+ background: var(--orange-dark);
+}
+.button.secondary {
+ border: 1px solid #dddfe3;
+ background: var(--bg);
+ color: var(--text);
+}
+.button.secondary:hover {
+ background: var(--surface-hover);
+ border-color: var(--subtle);
+}
+[data-theme='dark'] .button.secondary {
+ border-color: var(--border);
+}
+.hero-footnote {
+ display: flex;
+ align-items: center;
+ gap: 7px;
+ font-size: 10px;
+ color: var(--subtle);
+ margin-top: 17px;
+}
+.hero-footnote svg {
+ color: #9b9fa8;
+}
+.ecosystem-art {
+ width: 46%;
+ max-width: 470px;
+ height: 315px;
+ position: relative;
+ margin: 3px 0 0;
+ background-image: radial-gradient(var(--border) 0.8px, transparent 0.8px);
+ background-size: 16px 16px;
+ isolation: isolate;
+ flex-shrink: 0;
+ mask-image: linear-gradient(
+ to right,
+ transparent,
+ #000 7%,
+ #000 94%,
+ transparent
+ );
+}
+.art-glow {
+ position: absolute;
+ width: 260px;
+ height: 240px;
+ left: calc(50% - 130px);
+ top: 35px;
+ background: radial-gradient(
+ ellipse,
+ #fee9d9ae 0%,
+ #fff4e644 55%,
+ transparent 73%
+ );
+ z-index: -1;
+}
+[data-theme='dark'] .art-glow {
+ background: radial-gradient(ellipse, #9f4a1530, transparent 73%);
+}
+.art-orbit {
+ position: absolute;
+ border: 1px solid var(--orange-border);
+ border-radius: 50%;
+ z-index: -1;
+ left: 50%;
+ top: 48%;
+ transform: translate(-50%, -50%);
+ opacity: 0.55;
+}
+.orbit-one {
+ width: 198px;
+ height: 198px;
+}
+.orbit-two {
+ width: 280px;
+ height: 280px;
+ border-style: dashed;
+ opacity: 0.65;
+}
+.connector-lines {
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ inset: 0;
+}
+.art-center {
+ position: absolute;
+ left: 50%;
+ top: 48%;
+ transform: translate(-50%, -50%);
+ height: 95px;
+ width: 111px;
+ background: var(--bg);
+ border: 1px solid var(--orange-border);
+ border-radius: 17px;
+ box-shadow:
+ 0 0 0 7px #f6b5810a,
+ 0 12px 26px #dc86501c;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-direction: column;
+ gap: 8px;
+}
+.art-center .brand-mark {
+ width: 43px;
+ height: 43px;
+ border-radius: 12px;
+}
+.art-center > span:last-child {
+ font-size: 7px;
+ font-weight: 750;
+ letter-spacing: 1px;
+}
+.art-node {
+ position: absolute;
+ width: 64px;
+ height: 61px;
+ border: 1px solid var(--border);
+ border-radius: 11px;
+ box-shadow: 0 5px 12px #30303005;
+ background: var(--bg);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-direction: column;
+ gap: 5px;
+}
+.art-node > svg {
+ height: 21px;
+ width: 21px;
+ stroke-width: 1.6;
+}
+.art-node > span {
+ font-size: 8px;
+ color: var(--muted);
+}
+.node-accounts {
+ left: 18%;
+ top: 8%;
+ color: var(--orange);
+}
+.node-mail {
+ right: 18%;
+ top: 8%;
+ color: #6d95d2;
+}
+.node-tube {
+ left: 3%;
+ top: 38%;
+ color: #e1787c;
+}
+.node-browser {
+ right: 2%;
+ top: 38%;
+ color: #629f99;
+}
+.node-chat {
+ left: 20%;
+ bottom: 11%;
+ color: #9680c5;
+}
+.node-meet {
+ right: 18%;
+ bottom: 11%;
+ color: #6da28e;
+}
+.art-plus {
+ position: absolute;
+ color: #d8bca8;
+ font-size: 13px;
+ font-weight: 300;
+}
+.plus-one {
+ top: 5%;
+ left: 48%;
+}
+.plus-two {
+ left: 2%;
+ bottom: 17%;
+}
+.plus-three {
+ right: 6%;
+ top: 20%;
+}
+.art-caption {
+ position: absolute;
+ bottom: 2px;
+ left: 0;
+ width: 100%;
+ text-align: center;
+ font-size: 6.5px;
+ letter-spacing: 1.45px;
+ color: var(--subtle);
+}
+.art-caption > span {
+ display: inline-block;
+ width: 3px;
+ height: 3px;
+ border-radius: 50%;
+ background: var(--orange);
+ margin: 0 5px 1px 0;
+}
+.welcome-banner {
+ border: 1px solid var(--orange-border);
+ border-radius: 7px;
+ background: linear-gradient(110deg, var(--orange-soft), var(--bg));
+ display: flex;
+ align-items: center;
+ gap: 14px;
+ padding: 17px 20px;
+ transition: border-color 0.2s;
+ margin-bottom: 37px;
+}
+.welcome-banner:hover {
+ border-color: var(--orange);
+}
+.welcome-icon {
+ height: 38px;
+ width: 38px;
+ border: 1px solid var(--orange-border);
+ border-radius: 9px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: var(--bg);
+ color: var(--orange);
+}
+.welcome-text {
+ display: flex;
+ flex-direction: column;
+ gap: 5px;
+}
+.welcome-text strong {
+ font-size: 12px;
+ font-weight: 610;
+}
+.welcome-text > span {
+ font-size: 11px;
+ color: var(--muted);
+}
+.welcome-action {
+ display: flex;
+ align-items: center;
+ gap: 11px;
+ font-weight: 550;
+ font-size: 10px;
+ margin-left: auto;
+ color: var(--orange-dark);
+ white-space: nowrap;
+}
+.section-heading {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 15px;
+ margin-bottom: 20px;
+}
+.section-heading h2 {
+ font-size: 21px;
+ font-weight: 630;
+ letter-spacing: -0.55px;
+ display: flex;
+ align-items: center;
+ gap: 10px;
+}
+.section-heading p {
+ color: var(--muted);
+ font-size: 12px;
+ margin-top: 7px;
+}
+.number-pill {
+ background: var(--surface);
+ border: 1px solid var(--border);
+ border-radius: 5px;
+ color: var(--muted);
+ font-size: 10px;
+ padding: 2px 6px;
+ font-weight: 500;
+ letter-spacing: 0;
+}
+.text-link {
+ font-size: 10px;
+ color: var(--orange-dark);
+ font-weight: 550;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ white-space: nowrap;
+}
+.text-link:hover {
+ gap: 12px;
+}
+.category-tabs {
+ display: flex;
+ align-items: center;
+ gap: 18px;
+ border-bottom: 1px solid var(--border);
+ margin-bottom: 20px;
+ overflow-x: auto;
+ scrollbar-width: none;
+}
+.category-tabs button {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ padding: 0 0 11px;
+ font-size: 11px;
+ white-space: nowrap;
+ color: var(--muted);
+ border-bottom: 2px solid transparent;
+ position: relative;
+ top: 1px;
+}
+.category-tabs button:hover {
+ color: var(--text);
+}
+.category-tabs button.selected {
+ border-bottom-color: var(--orange);
+ color: var(--orange-dark);
+ font-weight: 550;
+}
+.product-grid {
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: 15px;
+}
+.product-card {
+ display: flex;
+ flex-direction: column;
+ border: 1px solid var(--border);
+ padding: 19px 20px 0;
+ border-radius: 8px;
+ background: var(--bg);
+ transition:
+ transform 0.2s,
+ border-color 0.2s,
+ box-shadow 0.2s;
+ min-height: 196px;
+}
+.product-card:hover {
+ transform: translateY(-3px);
+ border-color: var(--orange-border);
+ box-shadow: var(--shadow);
+}
+.product-card-top {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-bottom: 14px;
+}
+.product-icon {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 36px;
+ height: 36px;
+ background: var(--surface);
+ border-radius: 8px;
+}
+.orange {
+ background: #fff0e4;
+ color: #ec812f;
+}
+.blue {
+ background: #eaf3ff;
+ color: #6792d7;
+}
+.red {
+ background: #ffeded;
+ color: #e87378;
+}
+.teal {
+ background: #e5f4f1;
+ color: #54a798;
+}
+.violet {
+ background: #f1edfc;
+ color: #9b7cd5;
+}
+.green {
+ background: #ecf6ee;
+ color: #6b9d7e;
+}
+.product-arrow {
+ color: var(--subtle);
+ width: 15px;
+ align-self: flex-start;
+ margin-top: 3px;
+}
+.product-card:hover .product-arrow {
+ color: var(--orange);
+}
+.product-card h3 {
+ font-size: 14px;
+ letter-spacing: -0.1px;
+ font-weight: 620;
+ margin-bottom: 8px;
+}
+.product-card > p {
+ font-size: 12px;
+ line-height: 1.8;
+ color: var(--muted);
+ max-width: 285px;
+ flex: 1;
+ padding-bottom: 15px;
+}
+.product-card-bottom {
+ border-top: 1px solid var(--border);
+ padding: 11px 0;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ font-size: 10px;
+ color: var(--subtle);
+ gap: 5px;
+}
+.product-card-bottom > span:last-child {
+ display: flex;
+ align-items: center;
+ gap: 7px;
+ color: var(--muted);
+ font-weight: 500;
+}
+.product-card:hover .product-card-bottom > span:last-child {
+ color: var(--orange-dark);
+}
+[data-theme='dark'] .product-icon {
+ background: var(--surface-hover);
+}
+.popular-section {
+ margin-top: 41px;
+}
+.guide-grid {
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: 15px;
+}
+.guide-card {
+ padding: 19px 20px;
+ border: 1px solid var(--border);
+ border-radius: 8px;
+ display: flex;
+ flex-direction: column;
+ transition:
+ border-color 0.2s,
+ background 0.2s;
+}
+.guide-card:hover {
+ border-color: var(--orange-border);
+ background: var(--surface);
+}
+.guide-card-top {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ color: var(--muted);
+ margin-bottom: 17px;
+}
+.guide-card-top > span {
+ font-size: 9px;
+ color: var(--subtle);
+}
+.guide-card h3 {
+ font-size: 13px;
+ font-weight: 610;
+ line-height: 1.6;
+}
+.guide-card p {
+ font-size: 11px;
+ line-height: 1.8;
+ color: var(--muted);
+ margin-top: 7px;
+ flex: 1;
+}
+.guide-link {
+ font-size: 10px;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ margin-top: 19px;
+ color: var(--orange-dark);
+}
+.community-strip {
+ border: 1px solid var(--border);
+ border-radius: 8px;
+ display: flex;
+ align-items: center;
+ gap: 17px;
+ background: var(--surface);
+ padding: 22px 25px;
+ margin-top: 30px;
+}
+.community-symbol {
+ color: var(--text);
+}
+.community-strip h3 {
+ font-size: 12px;
+ font-weight: 600;
+}
+.community-strip p {
+ font-size: 11px;
+ color: var(--muted);
+ margin-top: 5px;
+}
+.community-strip > .button {
+ margin-left: auto;
+}
+.footer {
+ border-top: 1px solid var(--border);
+ margin-top: 35px;
+ padding: 23px 0;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 15px;
+ font-size: 9px;
+ color: var(--subtle);
+}
+.footer > div {
+ display: flex;
+ align-items: center;
+ gap: 18px;
+}
+.footer a:hover {
+ color: var(--orange-dark);
+}
+.footer a {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+}
+.page-intro {
+ margin: 47px 0 36px;
+}
+.page-intro h1 {
+ font-size: 39px;
+ font-weight: 620;
+ letter-spacing: -1.5px;
+ line-height: 1.25;
+ margin: 13px 0;
+}
+.page-intro > p {
+ font-size: 13px;
+ color: var(--muted);
+}
+.directory-search {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ border: 1px solid var(--border);
+ background: var(--surface);
+ border-radius: 7px;
+ padding: 13px 15px;
+ color: var(--muted);
+ margin: 20px 0 24px;
+}
+.directory-search input {
+ outline: none;
+ min-width: 0;
+ flex: 1;
+ border: 0;
+ background: transparent;
+ font-size: 12px;
+ color: var(--text);
+}
+.directory-search:focus-within {
+ border-color: var(--orange);
+}
+.directory-search > span {
+ font-size: 10px;
+ white-space: nowrap;
+}
+.catalog-note {
+ display: flex;
+ align-items: flex-start;
+ gap: 12px;
+ padding: 18px 20px;
+ background: var(--surface);
+ border: 1px solid var(--border);
+ border-radius: 7px;
+ margin-top: 25px;
+ color: var(--muted);
+}
+.catalog-note svg {
+ margin-top: 2px;
+}
+.catalog-note p {
+ font-size: 12px;
+}
+.catalog-note a {
+ color: var(--orange-dark);
+ text-decoration: underline;
+ text-underline-offset: 3px;
+}
+.guide-index {
+ row-gap: 20px;
+}
+.guide-index .guide-card {
+ min-height: 205px;
+}
+.guide-index .guide-card h3 {
+ font-size: 14px;
+}
+.guide-index .guide-card p {
+ font-size: 12px;
+}
+.repository-row {
+ display: flex;
+ align-items: center;
+ gap: 20px;
+ padding: 20px 4px;
+ border-bottom: 1px solid var(--border);
+}
+.repository-row > svg {
+ color: var(--muted);
+}
+.repository-row > div {
+ flex: 1;
+ min-width: 0;
+}
+.repository-row h3 {
+ font-size: 13px;
+ font-weight: 600;
+ display: flex;
+ align-items: center;
+ gap: 10px;
+}
+.repository-row h3 a {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+}
+.repository-row h3 a:hover {
+ color: var(--orange);
+}
+.repository-row p {
+ font-size: 11px;
+ color: var(--muted);
+ margin-top: 5px;
+ max-width: 660px;
+}
+.tag {
+ font-size: 9px;
+ border: 1px solid var(--border);
+ border-radius: 4px;
+ padding: 2px 5px;
+ color: var(--muted);
+}
+.coverage-label {
+ font-size: 10px;
+ color: var(--subtle);
+ min-width: 94px;
+ text-align: right;
+}
+.empty-state {
+ padding: 50px 15px;
+ text-align: center;
+ color: var(--muted);
+}
+.empty-state > svg {
+ margin-bottom: 14px;
+ color: var(--subtle);
+}
+.empty-state h3 {
+ font-size: 16px;
+ color: var(--text);
+ margin-bottom: 8px;
+}
+.empty-state p {
+ font-size: 12px;
+}
+.empty-state .button {
+ margin-top: 15px;
+}
+.document-layout {
+ display: grid;
+ grid-template-columns: minmax(0, 1fr) 175px;
+ gap: 45px;
+ padding-top: 37px;
+}
+.document h1 {
+ font-size: 35px;
+ line-height: 1.25;
+ font-weight: 640;
+ letter-spacing: -1.2px;
+ margin: 12px 0 14px;
+}
+.doc-eyebrow {
+ display: flex;
+ align-items: center;
+ gap: 7px;
+ color: var(--orange-dark);
+ font-size: 11px;
+}
+.doc-description {
+ font-size: 14px;
+ color: var(--muted);
+ line-height: 1.8;
+}
+.doc-meta {
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 14px;
+ margin: 18px 0 30px;
+ padding-bottom: 24px;
+ border-bottom: 1px solid var(--border);
+ font-size: 9px;
+ color: var(--subtle);
+}
+.doc-meta > span,
+.doc-meta > a {
+ display: flex;
+ align-items: center;
+ gap: 5px;
+}
+.doc-meta > a {
+ margin-left: auto;
+ color: var(--muted);
+}
+.prose {
+ font-size: 14px;
+ line-height: 1.85;
+ overflow-wrap: anywhere;
+ color: var(--muted);
+}
+.prose h2 {
+ font-size: 21px;
+ line-height: 1.5;
+ letter-spacing: -0.4px;
+ font-weight: 620;
+ color: var(--text);
+ margin: 33px 0 13px;
+ scroll-margin-top: 94px;
+}
+.prose h2:first-child {
+ margin-top: 0;
+}
+.prose h2 a {
+ color: inherit !important;
+ text-decoration: none !important;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+}
+.prose h2 svg {
+ opacity: 0;
+ color: var(--orange);
+}
+.prose h2:hover svg {
+ opacity: 1;
+}
+.prose h3 {
+ font-size: 16px;
+ font-weight: 600;
+ color: var(--text);
+ margin: 26px 0 10px;
+}
+.prose p {
+ line-height: 1.85;
+ margin: 13px 0;
+}
+.prose strong {
+ color: var(--text);
+ font-weight: 600;
+}
+.prose a:not(h2 a) {
+ color: var(--orange-dark);
+ text-decoration: underline;
+ text-underline-offset: 3px;
+}
+.prose ul,
+.prose ol {
+ padding-left: 23px;
+ margin: 15px 0;
+}
+.prose li {
+ margin: 7px 0;
+ padding-left: 3px;
+}
+.prose li::marker {
+ color: var(--orange);
+}
+.prose :not(pre) > code {
+ background: var(--surface-hover);
+ border: 1px solid var(--border);
+ border-radius: 4px;
+ padding: 2px 4px;
+ color: var(--text);
+ font-size: 10.5px;
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
+ overflow-wrap: anywhere;
+}
+.code-block {
+ border: 1px solid var(--border);
+ border-radius: 8px;
+ overflow: hidden;
+ margin: 20px 0;
+ background: var(--surface);
+}
+.code-toolbar {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ border-bottom: 1px solid var(--border);
+ padding: 8px 12px;
+ background: var(--surface-hover);
+ font-size: 10px;
+ color: var(--muted);
+}
+.code-toolbar > span {
+ display: flex;
+ gap: 7px;
+ align-items: center;
+}
+.code-toolbar button {
+ display: flex;
+ align-items: center;
+ gap: 5px;
+ font-size: 10px;
+ color: var(--muted);
+ padding: 3px 5px;
+ border-radius: 3px;
+}
+.code-toolbar button:hover {
+ background: var(--bg);
+ color: var(--orange-dark);
+}
+.code-block pre {
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
+ padding: 16px;
+ margin: 0;
+ font-size: 11px;
+ line-height: 1.8;
+ overflow-x: auto;
+ color: var(--text);
+ tab-size: 2;
+}
+.code-block code {
+ font-family: inherit;
+}
+.callout {
+ display: flex;
+ align-items: flex-start;
+ gap: 12px;
+ padding: 17px 18px;
+ background: var(--orange-soft);
+ border: 1px solid var(--orange-border);
+ border-radius: 7px;
+ margin: 22px 0;
+ color: var(--muted);
+ font-size: 12px;
+}
+.callout > svg {
+ color: var(--orange);
+ margin-top: 1px;
+}
+.callout strong {
+ display: block;
+ font-size: 12px;
+ margin-bottom: 5px;
+}
+.callout p {
+ margin: 0;
+}
+.table-scroll {
+ overflow-x: auto;
+ margin: 20px 0;
+ border: 1px solid var(--border);
+ border-radius: 7px;
+}
+.prose table {
+ border-collapse: collapse;
+ width: 100%;
+ font-size: 12px;
+ text-align: left;
+ line-height: 1.7;
+}
+.prose th {
+ background: var(--surface);
+ color: var(--text);
+ font-weight: 600;
+}
+.prose th,
+.prose td {
+ padding: 11px 12px;
+ border-bottom: 1px solid var(--border);
+ min-width: 115px;
+}
+.prose tr:last-child td {
+ border-bottom: none;
+}
+.prose td code {
+ font-size: 10px;
+}
+.page-outline {
+ position: relative;
+}
+.outline-sticky {
+ position: sticky;
+ top: 107px;
+ max-height: calc(100vh - 128px);
+ overflow-y: auto;
+ scrollbar-width: thin;
+}
+.page-outline h4 {
+ font-size: 10px;
+ font-weight: 600;
+ margin: 6px 0 16px;
+}
+.page-outline nav {
+ display: flex;
+ flex-direction: column;
+ border-left: 1px solid var(--border);
+}
+.page-outline nav a {
+ font-size: 11px;
+ color: var(--muted);
+ padding: 6px 0 6px 13px;
+ border-left: 1px solid transparent;
+ position: relative;
+ left: -1px;
+ line-height: 1.65;
+}
+.page-outline nav a:hover,
+.page-outline nav a.current {
+ color: var(--orange-dark);
+ border-left-color: var(--orange);
+}
+.outline-links {
+ border-top: 1px solid var(--border);
+ padding-top: 18px;
+ margin-top: 22px;
+ display: flex;
+ flex-direction: column;
+ gap: 13px;
+}
+.outline-links a {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ font-size: 9px;
+ color: var(--muted);
+}
+.outline-links a:hover {
+ color: var(--orange);
+}
+.outline-links a svg:last-child {
+ margin-left: auto;
+}
+.outline-tip {
+ padding: 17px 13px;
+ border: 1px solid var(--border);
+ border-radius: 7px;
+ margin-top: 25px;
+ background: var(--surface);
+}
+.outline-tip > svg {
+ color: var(--orange);
+ margin-bottom: 12px;
+}
+.outline-tip strong {
+ display: block;
+ font-size: 11px;
+ font-weight: 600;
+}
+.outline-tip p {
+ font-size: 10px;
+ color: var(--muted);
+ margin-top: 6px;
+}
+.outline-tip a {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ font-size: 9px;
+ color: var(--orange-dark);
+ margin-top: 12px;
+}
+.doc-feedback {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 12px;
+ border-top: 1px solid var(--border);
+ margin-top: 36px;
+ padding-top: 25px;
+}
+.doc-feedback strong {
+ font-size: 12px;
+ font-weight: 600;
+}
+.doc-feedback p {
+ font-size: 10px;
+ color: var(--muted);
+ margin-top: 5px;
+}
+.doc-feedback > div:last-child {
+ display: flex;
+ gap: 7px;
+}
+.feedback-button {
+ border: 1px solid var(--border);
+ border-radius: 6px;
+ padding: 8px 10px;
+ font-size: 10px;
+ display: flex;
+ align-items: center;
+ gap: 5px;
+}
+.feedback-button:hover {
+ border-color: var(--orange);
+ color: var(--orange);
+}
+.feedback-saved {
+ color: var(--orange-dark);
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ font-size: 11px;
+}
+.feedback-followup {
+ font-size: 11px;
+ color: var(--orange-dark);
+ margin-top: 15px;
+}
+.doc-pagination {
+ display: flex;
+ gap: 15px;
+ margin-top: 28px;
+}
+.doc-pagination a {
+ border: 1px solid var(--border);
+ border-radius: 7px;
+ padding: 13px 16px;
+ width: 50%;
+ display: flex;
+ flex-direction: column;
+ gap: 9px;
+}
+.doc-pagination a:hover {
+ border-color: var(--orange-border);
+}
+.doc-pagination span {
+ color: var(--muted);
+ font-size: 10px;
+ display: flex;
+ align-items: center;
+ gap: 7px;
+}
+.doc-pagination strong {
+ font-size: 11px;
+ font-weight: 550;
+ color: var(--orange-dark);
+}
+.doc-pagination .next {
+ margin-left: auto;
+ align-items: flex-end;
+ text-align: right;
+}
+.not-found {
+ padding: 130px 0 160px;
+}
+.not-found h1 {
+ font-size: 44px;
+ letter-spacing: -1.6px;
+ margin: 15px 0;
+}
+.not-found p {
+ color: var(--muted);
+ margin-bottom: 25px;
+}
+.loading-content {
+ padding: 30px;
+ color: var(--muted);
+}
+.search-backdrop {
+ position: fixed;
+ inset: 0;
+ background: #11131c66;
+ backdrop-filter: blur(5px);
+ z-index: 100;
+ display: flex;
+ align-items: flex-start;
+ justify-content: center;
+ padding: 115px 20px 30px;
+}
+.search-dialog {
+ width: 620px;
+ max-height: calc(100dvh - 145px);
+ background: var(--bg);
+ border: 1px solid var(--border);
+ border-radius: 13px;
+ box-shadow: 0 30px 100px #0003;
+ overflow: hidden;
+ display: flex;
+ flex-direction: column;
+}
+.search-input-row {
+ display: flex;
+ align-items: center;
+ gap: 14px;
+ padding: 21px 23px;
+ border-bottom: 1px solid var(--border);
+ color: var(--orange);
+}
+.search-input-row input {
+ border: 0;
+ background: none;
+ outline: none !important;
+ color: var(--text);
+ font-size: 15px;
+ min-width: 0;
+ flex: 1;
+}
+.search-input-row button {
+ color: var(--muted);
+}
+.search-results-heading {
+ font-size: 9px;
+ letter-spacing: 0.8px;
+ color: var(--subtle);
+ display: flex;
+ justify-content: space-between;
+ gap: 10px;
+ padding: 19px 22px 10px;
+}
+.search-results-heading > span {
+ letter-spacing: 0;
+}
+.search-results {
+ padding: 0 10px 13px;
+ overflow-y: auto;
+}
+.search-result {
+ display: flex;
+ gap: 13px;
+ padding: 12px;
+ width: 100%;
+ text-align: left;
+ align-items: center;
+ border-radius: 7px;
+ border: 1px solid transparent;
+}
+.search-result.highlighted {
+ background: var(--orange-soft);
+ border-color: var(--orange-border);
+}
+.search-result .result-icon {
+ color: var(--muted);
+ background: var(--bg);
+ border: 1px solid var(--border);
+ width: 39px;
+ height: 39px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: 7px;
+}
+.search-result.highlighted .result-icon {
+ color: var(--orange);
+}
+.search-result > span:nth-child(2) {
+ flex: 1;
+ min-width: 0;
+}
+.search-result small {
+ display: block;
+ color: var(--muted);
+ font-size: 9px;
+ margin-bottom: 5px;
+}
+.search-result strong {
+ display: block;
+ font-size: 12px;
+ font-weight: 600;
+}
+.search-result p {
+ font-size: 10px;
+ color: var(--muted);
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ margin-top: 4px;
+}
+.search-result > svg {
+ color: var(--orange);
+ opacity: 0;
+}
+.search-result.highlighted > svg {
+ opacity: 1;
+}
+.search-dialog-footer {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 13px 20px;
+ border-top: 1px solid var(--border);
+ font-size: 9px;
+ color: var(--muted);
+ background: var(--surface);
+}
+.search-dialog-footer > span {
+ display: flex;
+ align-items: center;
+ gap: 5px;
+}
+.search-dialog-footer kbd {
+ font-size: 9px;
+}
+.brand-mark.small {
+ height: 19px;
+ width: 19px;
+ border-radius: 5px;
+ margin-right: 2px;
+}
+@media (min-width: 1500px) {
+ .page {
+ padding-left: 62px;
+ padding-right: 62px;
+ }
+ .hero {
+ min-height: 390px;
+ }
+ .hero h1 {
+ font-size: 59px;
+ }
+ .hero-content > p {
+ font-size: 14px;
+ }
+ .hero-content {
+ padding-top: 35px;
+ }
+ .hero-footnote {
+ font-size: 10px;
+ }
+ .ecosystem-art {
+ height: 335px;
+ }
+ .product-card {
+ min-height: 215px;
+ }
+ .product-card > p {
+ font-size: 12px;
+ }
+ .product-card h3 {
+ font-size: 15px;
+ }
+ .section-heading h2 {
+ font-size: 24px;
+ }
+ .section-heading p {
+ font-size: 12px;
+ }
+ .category-tabs button {
+ font-size: 11px;
+ }
+ .welcome-banner {
+ padding: 20px;
+ }
+ .welcome-text strong {
+ font-size: 13px;
+ }
+ .welcome-text > span {
+ font-size: 11px;
+ }
+ .document-layout {
+ grid-template-columns: minmax(0, 1fr) 205px;
+ gap: 60px;
+ }
+ .prose {
+ font-size: 14px;
+ }
+ .prose table {
+ font-size: 12px;
+ }
+ .guide-card h3 {
+ font-size: 14px;
+ }
+ .guide-card p {
+ font-size: 11px;
+ }
+}
+@media (max-width: 1200px) {
+ .topbar {
+ gap: 20px;
+ padding-right: 22px;
+ }
+ .developer-label {
+ display: none;
+ }
+ .brand-divider {
+ display: none;
+ }
+ .brand-area {
+ min-width: 194px;
+ }
+ .sidebar {
+ width: 217px;
+ }
+ .sidebar-scroll {
+ padding-left: 11px;
+ padding-right: 11px;
+ }
+ main {
+ margin-left: 217px;
+ }
+ .page {
+ padding-left: 33px;
+ padding-right: 33px;
+ }
+ .hero h1 {
+ font-size: 48px;
+ }
+ .ecosystem-art {
+ width: 44%;
+ transform: scale(0.96);
+ transform-origin: right center;
+ }
+ .hero-content > p {
+ font-size: 11px;
+ }
+ .product-card {
+ padding: 16px 16px 0;
+ }
+ .product-grid,
+ .guide-grid {
+ gap: 12px;
+ }
+ .welcome-banner {
+ padding: 15px;
+ }
+ .welcome-text > span {
+ max-width: 350px;
+ font-size: 9px;
+ }
+ .welcome-action {
+ font-size: 9px;
+ }
+ .category-tabs {
+ gap: 17px;
+ }
+ .category-tabs button {
+ font-size: 9px;
+ }
+ .footer-made {
+ display: none;
+ }
+ .document-layout {
+ grid-template-columns: minmax(0, 1fr) 145px;
+ gap: 25px;
+ }
+ .document h1 {
+ font-size: 31px;
+ }
+ .page-outline nav a {
+ font-size: 9px;
+ }
+ .community-strip {
+ padding: 20px;
+ }
+ .community-strip p {
+ font-size: 9px;
+ }
+ .header-actions {
+ gap: 14px;
+ }
+ .search-trigger {
+ width: 35%;
+ }
+}
+@media (max-width: 1000px) {
+ .website-link {
+ display: none;
+ }
+ .topbar {
+ gap: 14px;
+ }
+ .brand-area {
+ min-width: 185px;
+ }
+ .search-trigger {
+ max-width: 380px;
+ width: 44%;
+ }
+ .page {
+ padding-left: 27px;
+ padding-right: 27px;
+ }
+ .hero {
+ min-height: 335px;
+ margin-bottom: 15px;
+ }
+ .hero h1 {
+ font-size: 44px;
+ }
+ .ecosystem-art {
+ width: 40%;
+ height: 280px;
+ }
+ .art-node {
+ width: 52px;
+ height: 52px;
+ }
+ .art-node > svg {
+ height: 18px;
+ }
+ .art-node > span {
+ font-size: 7px;
+ }
+ .node-tube {
+ left: 0;
+ }
+ .node-browser {
+ right: 0;
+ }
+ .node-accounts {
+ left: 5%;
+ }
+ .node-mail {
+ right: 5%;
+ }
+ .node-chat {
+ left: 9%;
+ }
+ .node-meet {
+ right: 8%;
+ }
+ .art-center {
+ width: 85px;
+ height: 80px;
+ }
+ .art-center .brand-mark {
+ width: 34px;
+ height: 34px;
+ }
+ .art-center > span:last-child {
+ font-size: 5px;
+ }
+ .art-caption {
+ font-size: 5px;
+ letter-spacing: 0.8px;
+ }
+ .orbit-two {
+ width: 226px;
+ height: 226px;
+ }
+ .orbit-one {
+ width: 163px;
+ height: 163px;
+ }
+ .hero-actions {
+ gap: 7px;
+ }
+ .hero-actions .button {
+ font-size: 10px;
+ padding: 0 12px;
+ gap: 10px;
+ }
+ .welcome-text > span {
+ max-width: 300px;
+ }
+ .welcome-action {
+ font-size: 0;
+ gap: 0;
+ }
+ .product-grid {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+ .product-card {
+ min-height: 192px;
+ }
+ .product-card h3 {
+ font-size: 14px;
+ }
+ .product-card > p {
+ font-size: 11px;
+ }
+ .category-tabs {
+ gap: 17px;
+ }
+ .category-tabs button {
+ font-size: 10px;
+ }
+ .guide-grid {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+ .home-page .guide-grid .guide-card:last-child {
+ grid-column: span 2;
+ }
+ .community-strip {
+ flex-wrap: wrap;
+ }
+ .community-strip .button {
+ margin-left: 45px;
+ }
+ .section-heading h2 {
+ font-size: 19px;
+ }
+ .document-layout {
+ grid-template-columns: minmax(0, 1fr);
+ }
+ .page-outline {
+ display: none;
+ }
+ .document h1 {
+ font-size: 34px;
+ }
+ .prose {
+ font-size: 13px;
+ }
+ .page-intro h1 {
+ font-size: 35px;
+ }
+ .repository-row {
+ gap: 13px;
+ }
+ .coverage-label {
+ font-size: 9px;
+ }
+ .hero-footnote {
+ font-size: 8px;
+ }
+ .hero-footnote svg {
+ width: 11px;
+ }
+ .hero .eyebrow {
+ font-size: 8px;
+ }
+}
+@media (max-width: 760px) {
+ .topbar {
+ height: 61px;
+ padding: 0 18px;
+ gap: 14px;
+ }
+ .brand-area {
+ min-width: 0;
+ gap: 9px;
+ }
+ .brand {
+ font-size: 17px;
+ gap: 7px;
+ }
+ .brand-mark {
+ width: 29px;
+ height: 29px;
+ border-radius: 8px;
+ }
+ .mobile-menu {
+ display: inline-flex;
+ }
+ .sidebar {
+ top: 61px;
+ transform: translateX(-100%);
+ transition: transform 0.2s;
+ width: 250px;
+ z-index: 60;
+ }
+ .sidebar.is-open {
+ transform: translateX(0);
+ }
+ .sidebar-heading {
+ padding-bottom: 9px;
+ }
+ .sidebar-backdrop.visible {
+ position: fixed;
+ inset: 61px 0 0;
+ background: #0005;
+ z-index: 55;
+ backdrop-filter: blur(2px);
+ }
+ .sidebar-scroll {
+ padding: 20px 15px;
+ }
+ .nav-item {
+ font-size: 13px;
+ padding: 11px;
+ }
+ .sidebar-help h4 {
+ font-size: 13px;
+ }
+ .sidebar-help p {
+ font-size: 11px;
+ }
+ .sidebar-help a {
+ font-size: 11px;
+ }
+ .sidebar-bottom {
+ font-size: 10px;
+ }
+ .search-trigger {
+ margin-left: auto;
+ width: 34px;
+ height: 33px;
+ border: 0;
+ background: none;
+ justify-content: center;
+ padding: 0;
+ }
+ .search-trigger span,
+ .search-trigger kbd {
+ display: none;
+ }
+ .header-actions {
+ gap: 7px;
+ }
+ .header-separator,
+ .github-button {
+ display: none;
+ }
+ main {
+ margin-left: 0;
+ padding-top: 61px;
+ }
+ .page {
+ padding: 21px 25px 0;
+ }
+ .hero {
+ min-height: 350px;
+ }
+ .hero h1 {
+ font-size: 49px;
+ }
+ .hero-content > p {
+ font-size: 12px;
+ }
+ .hero .eyebrow {
+ font-size: 9px;
+ }
+ .hero-footnote {
+ font-size: 9px;
+ }
+ .ecosystem-art {
+ width: 43%;
+ }
+ .hero-content {
+ padding-top: 23px;
+ }
+ .hero-actions .button {
+ font-size: 11px;
+ }
+ .section-heading h2 {
+ font-size: 21px;
+ }
+ .category-tabs button {
+ font-size: 11px;
+ }
+ .product-card {
+ padding: 20px 20px 0;
+ min-height: 202px;
+ }
+ .product-card h3 {
+ font-size: 15px;
+ }
+ .product-card > p {
+ font-size: 12px;
+ max-width: none;
+ }
+ .product-card-bottom {
+ font-size: 10px;
+ }
+ .welcome-text strong {
+ font-size: 12px;
+ }
+ .welcome-text > span {
+ font-size: 11px;
+ max-width: 400px;
+ }
+ .welcome-action {
+ font-size: 10px;
+ gap: 9px;
+ }
+ .guide-card h3 {
+ font-size: 13px;
+ }
+ .guide-card p {
+ font-size: 11px;
+ }
+ .community-strip p {
+ font-size: 10px;
+ }
+ .community-strip .button {
+ margin-left: auto;
+ }
+ .document-layout {
+ padding-top: 28px;
+ }
+ .prose {
+ font-size: 14px;
+ }
+ .prose table {
+ font-size: 12px;
+ }
+ .prose th,
+ .prose td {
+ padding: 11px;
+ }
+ .doc-meta {
+ font-size: 10px;
+ }
+ .search-backdrop {
+ padding-top: 80px;
+ }
+ .search-dialog {
+ max-height: calc(100dvh - 110px);
+ }
+ .breadcrumbs {
+ font-size: 10px;
+ }
+ .open-badge {
+ font-size: 9px;
+ }
+ .footer {
+ font-size: 10px;
+ }
+ .doc-pagination strong {
+ font-size: 12px;
+ }
+ .outline-tip {
+ display: none;
+ }
+}
+@media (max-width: 540px) {
+ .brand-tech {
+ display: none;
+ }
+ .topbar {
+ padding: 0 16px;
+ }
+ .page {
+ padding-left: 20px;
+ padding-right: 20px;
+ }
+ .breadcrumb-row {
+ margin-bottom: 3px;
+ }
+ .open-badge {
+ font-size: 8px;
+ gap: 5px;
+ }
+ .hero {
+ min-height: 0;
+ margin-top: 27px;
+ display: block;
+ overflow: visible;
+ }
+ .hero-content {
+ padding: 0 4px 17px;
+ }
+ .hero h1 {
+ font-size: 51px;
+ margin-top: 17px;
+ margin-bottom: 16px;
+ }
+ .hero-content > p {
+ font-size: 13px;
+ line-height: 1.8;
+ }
+ .hero-actions {
+ margin-top: 23px;
+ gap: 10px;
+ }
+ .hero-actions .button {
+ min-height: 40px;
+ font-size: 11px;
+ padding: 0 16px;
+ }
+ .hero-footnote {
+ margin-top: 17px;
+ }
+ .ecosystem-art {
+ display: none;
+ }
+ .welcome-banner {
+ margin-top: 13px;
+ margin-bottom: 31px;
+ padding: 14px 13px;
+ gap: 12px;
+ }
+ .welcome-icon {
+ width: 34px;
+ height: 34px;
+ flex-shrink: 0;
+ }
+ .welcome-text {
+ gap: 4px;
+ }
+ .welcome-text strong {
+ font-size: 11px;
+ }
+ .welcome-text > span {
+ font-size: 9px;
+ line-height: 1.65;
+ max-width: 230px;
+ }
+ .welcome-action {
+ font-size: 0;
+ gap: 0;
+ }
+ .section-heading {
+ gap: 10px;
+ align-items: flex-start;
+ }
+ .section-heading h2 {
+ font-size: 19px;
+ line-height: 1.5;
+ gap: 8px;
+ }
+ .section-heading p {
+ font-size: 11px;
+ max-width: 255px;
+ margin-top: 5px;
+ }
+ .text-link {
+ font-size: 9px;
+ gap: 5px;
+ margin-top: 6px;
+ }
+ .section-heading > .text-link {
+ font-size: 0;
+ gap: 0;
+ }
+ .section-heading > .text-link svg {
+ width: 19px;
+ height: 19px;
+ }
+ .category-tabs {
+ gap: 23px;
+ margin-bottom: 18px;
+ }
+ .category-tabs button {
+ font-size: 10px;
+ padding-bottom: 12px;
+ }
+ .product-grid {
+ grid-template-columns: 1fr;
+ gap: 13px;
+ }
+ .product-card {
+ min-height: 177px;
+ padding: 17px 19px 0;
+ position: relative;
+ }
+ .product-card-top {
+ margin-bottom: 11px;
+ }
+ .product-icon {
+ width: 35px;
+ height: 35px;
+ }
+ .product-card h3 {
+ position: absolute;
+ top: 25px;
+ left: 67px;
+ font-size: 14px;
+ }
+ .product-card > p {
+ font-size: 12px;
+ line-height: 1.75;
+ padding-bottom: 16px;
+ }
+ .product-card-bottom {
+ padding: 10px 0;
+ font-size: 10px;
+ }
+ .guide-grid {
+ grid-template-columns: 1fr;
+ }
+ .home-page .guide-grid .guide-card:last-child {
+ grid-column: auto;
+ }
+ .popular-section {
+ margin-top: 31px;
+ }
+ .guide-card {
+ padding: 19px;
+ }
+ .guide-card h3 {
+ font-size: 14px;
+ }
+ .guide-card p {
+ font-size: 12px;
+ }
+ .guide-link {
+ font-size: 11px;
+ margin-top: 16px;
+ }
+ .guide-card-top {
+ margin-bottom: 12px;
+ }
+ .guide-card-top > span {
+ font-size: 10px;
+ }
+ .community-strip {
+ padding: 20px;
+ gap: 15px;
+ }
+ .community-strip > div:nth-child(2) {
+ flex: 1;
+ }
+ .community-strip h3 {
+ font-size: 12px;
+ line-height: 1.6;
+ }
+ .community-strip p {
+ font-size: 10px;
+ }
+ .community-strip .button {
+ margin-left: 0;
+ width: 100%;
+ margin-top: 3px;
+ }
+ .footer {
+ align-items: flex-start;
+ flex-direction: column;
+ gap: 14px;
+ padding: 23px 0;
+ font-size: 10px;
+ }
+ .footer > div {
+ gap: 20px;
+ }
+ .page-intro {
+ margin-top: 35px;
+ margin-bottom: 29px;
+ }
+ .page-intro h1 {
+ font-size: 34px;
+ letter-spacing: -1.3px;
+ }
+ .page-intro > p {
+ font-size: 12px;
+ }
+ .page-intro br {
+ display: none;
+ }
+ .repository-row {
+ align-items: flex-start;
+ flex-wrap: wrap;
+ padding: 18px 2px;
+ gap: 13px;
+ }
+ .repository-row > svg {
+ width: 18px;
+ margin-top: 2px;
+ }
+ .repository-row > div {
+ min-width: calc(100% - 35px);
+ }
+ .repository-row > .text-link,
+ .repository-row > .coverage-label {
+ margin-left: 31px;
+ }
+ .repository-row p {
+ font-size: 11px;
+ }
+ .catalog-note {
+ padding: 16px 14px;
+ }
+ .catalog-note p {
+ font-size: 11px;
+ }
+ .document-page .open-badge {
+ display: none;
+ }
+ .document-page .breadcrumbs {
+ font-size: 9px;
+ gap: 7px;
+ flex-wrap: wrap;
+ }
+ .document h1 {
+ font-size: 31px;
+ line-height: 1.3;
+ }
+ .doc-description {
+ font-size: 13px;
+ }
+ .doc-meta {
+ font-size: 9px;
+ gap: 12px;
+ }
+ .prose h2 {
+ font-size: 21px;
+ }
+ .prose :not(pre) > code {
+ font-size: 11px;
+ }
+ .code-block pre {
+ font-size: 10px;
+ padding: 13px;
+ }
+ .callout {
+ padding: 15px 13px;
+ gap: 10px;
+ font-size: 12px;
+ }
+ .doc-feedback {
+ flex-wrap: wrap;
+ }
+ .doc-feedback > div:last-child {
+ margin-top: 5px;
+ }
+ .doc-pagination {
+ gap: 10px;
+ }
+ .doc-pagination a {
+ padding: 13px 11px;
+ }
+ .doc-pagination strong {
+ font-size: 11px;
+ line-height: 1.6;
+ }
+ .not-found {
+ padding: 100px 0 130px;
+ }
+ .not-found h1 {
+ font-size: 34px;
+ }
+ .search-backdrop {
+ padding: 72px 10px 20px;
+ }
+ .search-dialog {
+ border-radius: 10px;
+ max-height: calc(100dvh - 92px);
+ }
+ .search-input-row {
+ padding: 17px 15px;
+ gap: 10px;
+ }
+ .search-input-row input {
+ font-size: 12px;
+ }
+ .search-results-heading {
+ padding: 16px 17px 10px;
+ font-size: 8px;
+ }
+ .search-results-heading > span {
+ display: none;
+ }
+ .search-result {
+ padding: 10px;
+ gap: 10px;
+ }
+ .search-result strong {
+ font-size: 11px;
+ }
+ .search-result p {
+ font-size: 9px;
+ }
+ .search-result small {
+ font-size: 8px;
+ }
+ .search-dialog-footer {
+ padding: 13px;
+ font-size: 8px;
+ }
+ .search-dialog-footer > span {
+ gap: 4px;
+ }
+ .search-dialog-footer .brand-mark {
+ display: none;
+ }
+}
+@media (prefers-reduced-motion: reduce) {
+ *,
+ *::before,
+ *::after {
+ animation: none !important;
+ transition: none !important;
+ scroll-behavior: auto !important;
+ }
+}
diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts
new file mode 100644
index 0000000..1eb9880
--- /dev/null
+++ b/src/vite-env.d.ts
@@ -0,0 +1,6 @@
+///
+declare module '*.mdx' {
+ import type { ComponentType } from 'react';
+ const component: ComponentType<{ components?: Record }>;
+ export default component;
+}
diff --git a/tests/content.test.mjs b/tests/content.test.mjs
new file mode 100644
index 0000000..4cf02bf
--- /dev/null
+++ b/tests/content.test.mjs
@@ -0,0 +1,90 @@
+import test from 'node:test';
+import assert from 'node:assert/strict';
+import { readFileSync, readdirSync } from 'node:fs';
+import { docs, products } from '../src/data.ts';
+
+const content = new Map(
+ readdirSync(new URL('../src/content/', import.meta.url))
+ .filter((name) => name.endsWith('.mdx'))
+ .map((name) => [
+ name.slice(0, -4),
+ readFileSync(new URL(`../src/content/${name}`, import.meta.url), 'utf8'),
+ ]),
+);
+const slugify = (text) =>
+ text
+ .toLowerCase()
+ .replace(/[^a-z0-9\s-]/g, '')
+ .trim()
+ .replace(/\s+/g, '-');
+
+test('every registered page has MDX content, with no duplicate or orphan slugs', () => {
+ assert.equal(new Set(docs.map((doc) => doc.slug)).size, docs.length);
+ assert.deepEqual(
+ [...content.keys()].sort(),
+ docs.map((doc) => doc.slug).sort(),
+ );
+ for (const doc of docs) {
+ assert.ok(doc.title && doc.description && doc.time);
+ assert.ok(
+ content.get(doc.slug).length > 500,
+ `${doc.slug} should be a real guide`,
+ );
+ }
+});
+
+test('each product card points to an existing product guide', () => {
+ for (const product of products) {
+ assert.ok(
+ docs.find((doc) => doc.slug === product.id && doc.repo === product.repo),
+ );
+ }
+});
+
+test('internal MDX links resolve and generated heading anchors are unique', () => {
+ const routes = new Set([
+ '/',
+ '/products',
+ '/guides',
+ '/repositories',
+ ...docs.map((doc) => `/docs/${doc.slug}`),
+ ]);
+ for (const [slug, text] of content) {
+ const headings = [...text.matchAll(/^## (.+)$/gm)].map((match) =>
+ slugify(match[1]),
+ );
+ assert.equal(
+ new Set(headings).size,
+ headings.length,
+ `Duplicate heading in ${slug}`,
+ );
+ for (const [, link] of text.matchAll(/\]\((\/[^)\s]+)\)/g)) {
+ assert.ok(
+ routes.has(link.split('#')[0]),
+ `Broken link ${link} in ${slug}`,
+ );
+ }
+ }
+});
+
+test('OAuth sample preserves the API prefix and validates state before exchanging the code', () => {
+ const oauth = content.get('oauth');
+ assert.ok(oauth.includes('new URL(`${AUTH}/oauth/authorize`)'));
+ assert.ok(
+ oauth.indexOf("params.get('state') !== expectedState") <
+ oauth.indexOf('fetch(`${AUTH}/oauth/token`'),
+ );
+});
+
+test('Cloudflare Pages receives a SPA fallback and safe static headers', () => {
+ assert.match(
+ readFileSync(new URL('../public/_redirects', import.meta.url), 'utf8'),
+ /\/\* \/index\.html 200/,
+ );
+ const headers = readFileSync(
+ new URL('../public/_headers', import.meta.url),
+ 'utf8',
+ );
+ assert.ok(headers.includes('X-Content-Type-Options: nosniff'));
+ assert.ok(headers.includes('/assets/*'));
+});
diff --git a/tests/e2e/site.spec.ts b/tests/e2e/site.spec.ts
new file mode 100644
index 0000000..8865687
--- /dev/null
+++ b/tests/e2e/site.spec.ts
@@ -0,0 +1,134 @@
+import { test, expect } from '@playwright/test';
+import { docs } from '../../src/data';
+
+test('home, category filters, product directory and reset', async ({
+ page,
+}) => {
+ await page.goto('/');
+ await expect(
+ page.getByRole('heading', { name: 'Big ideas. Build them here.' }),
+ ).toBeVisible();
+ await expect(page.locator('.product-card')).toHaveCount(6);
+ await page.getByRole('tab', { name: 'Communication', exact: true }).click();
+ await expect(page.locator('.product-card')).toHaveCount(3);
+ await page.getByRole('tab', { name: 'Developer tools', exact: true }).click();
+ await expect(page.locator('.product-card')).toHaveCount(2);
+ await page.getByRole('link', { name: 'View all products' }).click();
+ await expect(page.locator('.product-card')).toHaveCount(12);
+ await page.getByRole('textbox', { name: 'Filter products' }).fill('launcher');
+ await expect(page.locator('.product-card')).toHaveCount(1);
+ await page
+ .getByRole('textbox', { name: 'Filter products' })
+ .fill('does-not-exist');
+ await expect(page.getByText('No products found')).toBeVisible();
+ await page.getByRole('button', { name: 'Clear filters' }).click();
+ await expect(page.locator('.product-card')).toHaveCount(12);
+});
+
+test('full-text search, keyboard selection, empty state and dismissal', async ({
+ page,
+}) => {
+ await page.goto('/');
+ await expect(page.locator('h1')).toBeVisible();
+ await page.keyboard.press('Control+k');
+ await expect(page.getByRole('dialog')).toBeVisible();
+ const input = page.getByRole('combobox');
+ await input.fill('PKCE');
+ await expect(page.getByRole('option').first()).toContainText(
+ 'Integrate Sign in with Gothwad',
+ );
+ await input.press('Enter');
+ await expect(page).toHaveURL(/\/docs\/oauth$/);
+ await expect(
+ page.getByRole('heading', {
+ name: '1. Register your application',
+ exact: true,
+ }),
+ ).toBeVisible();
+ await page.keyboard.press('Control+k');
+ await page.getByRole('combobox').fill('zxqvnonexistent');
+ await expect(page.getByText('No results for')).toBeVisible();
+ await page.keyboard.press('Escape');
+ await expect(page.getByRole('dialog')).toHaveCount(0);
+});
+
+test('every MDX guide renders directly without runtime errors or missing content', async ({
+ page,
+}) => {
+ const errors: string[] = [];
+ page.on('pageerror', (error) => errors.push(error.message));
+ for (const doc of docs) {
+ await page.goto(`/docs/${doc.slug}`);
+ await expect(page.locator('article h1')).toHaveText(doc.title);
+ await expect(page.locator('.prose h2').first()).toBeVisible();
+ await expect(page.locator('.prose')).not.toContainText('Loading guide...');
+ }
+ expect(errors).toEqual([]);
+});
+
+test('anchors, copy controls, feedback and theme persistence', async ({
+ page,
+ context,
+}) => {
+ await context.grantPermissions(['clipboard-read', 'clipboard-write']);
+ await page.goto('/docs/oauth');
+ await page
+ .locator('.page-outline')
+ .getByRole('link', { name: '3. Generate PKCE and redirect' })
+ .click();
+ await expect(page).toHaveURL(/#3-generate-pkce-and-redirect$/);
+ await page.getByRole('button', { name: 'Copy code' }).first().click();
+ await expect(page.getByText('Copied!', { exact: true })).toBeVisible();
+ expect(await page.evaluate(() => navigator.clipboard.readText())).toContain(
+ 'code_challenge_method',
+ );
+ await page.getByRole('button', { name: 'Not quite', exact: true }).click();
+ await expect(
+ page.getByText('Your feedback is saved', { exact: false }),
+ ).toBeVisible();
+ await expect(
+ page.getByRole('link', { name: /Tell us what could be clearer/ }),
+ ).toBeVisible();
+ await page.getByRole('button', { name: 'Switch to dark mode' }).click();
+ await expect(page.locator('html')).toHaveAttribute('data-theme', 'dark');
+ await page.reload();
+ await expect(page.locator('html')).toHaveAttribute('data-theme', 'dark');
+});
+
+test('repository search and unknown routes', async ({ page }) => {
+ await page.goto('/repositories');
+ await page
+ .getByRole('textbox', { name: 'Search repositories' })
+ .fill('tubeweb');
+ await expect(page.locator('.repository-row')).toHaveCount(1);
+ await page
+ .locator('.repository-row')
+ .getByRole('link', { name: 'Read docs' })
+ .click();
+ await expect(page).toHaveURL(/\/docs\/tube$/);
+ await page.goto('/missing-page');
+ await expect(
+ page.getByRole('heading', { name: 'This page is off the map.' }),
+ ).toBeVisible();
+ await page.getByRole('link', { name: 'Back to documentation' }).click();
+ await expect(page).toHaveURL('/');
+});
+
+test('mobile navigation, guides and no viewport overflow', async ({ page }) => {
+ await page.setViewportSize({ width: 390, height: 844 });
+ await page.goto('/');
+ await page.getByRole('button', { name: 'Open navigation' }).click();
+ await page.getByRole('link', { name: 'Quickstart', exact: true }).click();
+ await expect(page).toHaveURL(/\/docs\/quickstart$/);
+ await expect(page.locator('.sidebar')).not.toHaveClass(/is-open/);
+ await expect(page.locator('.prose h2').first()).toBeVisible();
+ for (const path of ['/', '/products', '/docs/oauth', '/repositories']) {
+ await page.goto(path);
+ await expect(page.locator('h1')).toBeVisible();
+ expect(
+ await page.evaluate(
+ () => document.documentElement.scrollWidth <= window.innerWidth,
+ ),
+ ).toBe(true);
+ }
+});
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..cd17fb2
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ "compilerOptions": {
+ "target": "ES2022",
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
+ "module": "ESNext",
+ "skipLibCheck": true,
+ "moduleResolution": "Bundler",
+ "allowImportingTsExtensions": true,
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "verbatimModuleSyntax": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+ "jsx": "react-jsx",
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true
+ },
+ "include": ["src"]
+}
diff --git a/vite.config.ts b/vite.config.ts
new file mode 100644
index 0000000..989c4e4
--- /dev/null
+++ b/vite.config.ts
@@ -0,0 +1,23 @@
+import { defineConfig } from 'vite';
+import react from '@vitejs/plugin-react';
+import mdx from '@mdx-js/rollup';
+import remarkGfm from 'remark-gfm';
+
+const mdxPlugin = mdx({ remarkPlugins: [remarkGfm] });
+export default defineConfig({
+ plugins: [
+ {
+ ...mdxPlugin,
+ enforce: 'pre',
+ // The MDX plugin strips query strings before filtering. Preserve Vite's
+ // ?raw imports for full-text search and the on-page heading index.
+ transform(value, id) {
+ if (/[?&]raw\b/.test(id)) return;
+ return mdxPlugin.transform(value, id);
+ },
+ },
+ react(),
+ ],
+ server: { host: '0.0.0.0', allowedHosts: ['.e2b.app'] },
+ preview: { host: '0.0.0.0', allowedHosts: ['.e2b.app'] },
+});