From 22fa0245e46c62399dbfcb7c810e3466f27459e7 Mon Sep 17 00:00:00 2001
From: enixCode <58286681+enixCode@users.noreply.github.com>
Date: Sat, 30 May 2026 00:38:56 +0200
Subject: [PATCH 01/10] feat(docs): scaffold Fumadocs static-export site (WIP)
Foundation for migrating docs from VitePress to a Mintlify-style Fumadocs
site (the look identified across the ecosystem).
- Scaffolded under website/ (Next.js 16 + fumadocs-mdx + Tailwind), static
template (output: export), Orama static search.
- Configured for GitHub Pages: basePath /light-runner, trailingSlash,
images.unoptimized, so the export serves under the project sub-path.
- Removed the AI-chat integration the scaffolder forces (openrouter route,
component, layout wiring, deps): a server route is incompatible with static
export and unwanted.
- next build produces a clean static export (12/12 pages).
Remaining (not in this commit): port the landing + 5 guides to MDX, wire the
typedoc API reference, theme to the light-process palette, add the Pages
deploy workflow, and remove the old VitePress docs.
build with cc
---
website/.gitignore | 26 +
website/README.md | 47 +
website/content/docs/index.mdx | 13 +
website/content/docs/test.mdx | 17 +
website/eslint.config.mjs | 15 +
website/next.config.mjs | 16 +
website/package-lock.json | 11909 ++++++++++++++++
website/package.json | 46 +
website/postcss.config.mjs | 7 +
website/source.config.ts | 23 +
website/src/app/(home)/layout.tsx | 6 +
website/src/app/(home)/page.tsx | 16 +
website/src/app/api/search/route.ts | 9 +
website/src/app/docs/[[...slug]]/page.tsx | 63 +
website/src/app/docs/layout.tsx | 11 +
website/src/app/global.css | 12 +
website/src/app/layout.tsx | 17 +
website/src/app/llms-full.txt/route.ts | 10 +
.../app/llms.mdx/docs/[[...slug]]/route.ts | 23 +
website/src/app/llms.txt/route.ts | 8 +
website/src/app/og/docs/[...slug]/route.tsx | 28 +
website/src/components/markdown.tsx | 116 +
website/src/components/mdx.tsx | 15 +
website/src/components/provider.tsx | 8 +
website/src/components/search.tsx | 46 +
website/src/components/ui/button.tsx | 29 +
website/src/lib/cn.ts | 1 +
website/src/lib/layout.shared.tsx | 12 +
website/src/lib/shared.ts | 11 +
website/src/lib/source.ts | 36 +
website/tsconfig.json | 45 +
31 files changed, 12641 insertions(+)
create mode 100644 website/.gitignore
create mode 100644 website/README.md
create mode 100644 website/content/docs/index.mdx
create mode 100644 website/content/docs/test.mdx
create mode 100644 website/eslint.config.mjs
create mode 100644 website/next.config.mjs
create mode 100644 website/package-lock.json
create mode 100644 website/package.json
create mode 100644 website/postcss.config.mjs
create mode 100644 website/source.config.ts
create mode 100644 website/src/app/(home)/layout.tsx
create mode 100644 website/src/app/(home)/page.tsx
create mode 100644 website/src/app/api/search/route.ts
create mode 100644 website/src/app/docs/[[...slug]]/page.tsx
create mode 100644 website/src/app/docs/layout.tsx
create mode 100644 website/src/app/global.css
create mode 100644 website/src/app/layout.tsx
create mode 100644 website/src/app/llms-full.txt/route.ts
create mode 100644 website/src/app/llms.mdx/docs/[[...slug]]/route.ts
create mode 100644 website/src/app/llms.txt/route.ts
create mode 100644 website/src/app/og/docs/[...slug]/route.tsx
create mode 100644 website/src/components/markdown.tsx
create mode 100644 website/src/components/mdx.tsx
create mode 100644 website/src/components/provider.tsx
create mode 100644 website/src/components/search.tsx
create mode 100644 website/src/components/ui/button.tsx
create mode 100644 website/src/lib/cn.ts
create mode 100644 website/src/lib/layout.shared.tsx
create mode 100644 website/src/lib/shared.ts
create mode 100644 website/src/lib/source.ts
create mode 100644 website/tsconfig.json
diff --git a/website/.gitignore b/website/.gitignore
new file mode 100644
index 0000000..9e429e4
--- /dev/null
+++ b/website/.gitignore
@@ -0,0 +1,26 @@
+# deps
+/node_modules
+
+# generated content
+.source
+
+# test & build
+/coverage
+/.next/
+/out/
+/build
+*.tsbuildinfo
+
+# misc
+.DS_Store
+*.pem
+/.pnp
+.pnp.js
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# others
+.env*.local
+.vercel
+next-env.d.ts
\ No newline at end of file
diff --git a/website/README.md b/website/README.md
new file mode 100644
index 0000000..d88119e
--- /dev/null
+++ b/website/README.md
@@ -0,0 +1,47 @@
+# website
+
+This is a Next.js application generated with
+[Create Fumadocs](https://github.com/fuma-nama/fumadocs).
+
+It is a Next.js app with [Static Export](https://nextjs.org/docs/app/guides/static-exports) configured.
+
+Run development server:
+
+```bash
+npm run dev
+# or
+pnpm dev
+# or
+yarn dev
+```
+
+Open http://localhost:3000 with your browser to see the result.
+
+## Explore
+
+In the project, you can see:
+
+- `lib/source.ts`: Code for content source adapter, [`loader()`](https://fumadocs.dev/docs/headless/source-api) provides the interface to access your content.
+- `lib/layout.shared.tsx`: Shared options for layouts, optional but preferred to keep.
+
+| Route | Description |
+| ------------------------- | ------------------------------------------------------ |
+| `app/(home)` | The route group for your landing page and other pages. |
+| `app/docs` | The documentation layout and pages. |
+| `app/api/search/route.ts` | The Route Handler for search. |
+
+### Fumadocs MDX
+
+A `source.config.ts` config file has been included, you can customise different options like frontmatter schema.
+
+Read the [Introduction](https://fumadocs.dev/docs/mdx) for further details.
+
+## Learn More
+
+To learn more about Next.js and Fumadocs, take a look at the following
+resources:
+
+- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js
+ features and API.
+- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
+- [Fumadocs](https://fumadocs.dev) - learn about Fumadocs
diff --git a/website/content/docs/index.mdx b/website/content/docs/index.mdx
new file mode 100644
index 0000000..1ede18e
--- /dev/null
+++ b/website/content/docs/index.mdx
@@ -0,0 +1,13 @@
+---
+title: Hello World
+description: Your first document
+---
+
+Welcome to the docs! You can start writing documents in `/content/docs`.
+
+## What is Next?
+
+
+
+
+
diff --git a/website/content/docs/test.mdx b/website/content/docs/test.mdx
new file mode 100644
index 0000000..f475f4a
--- /dev/null
+++ b/website/content/docs/test.mdx
@@ -0,0 +1,17 @@
+---
+title: Components
+description: Components
+---
+
+## Code Block
+
+```js
+console.log('Hello World');
+```
+
+## Cards
+
+
+
+
+
diff --git a/website/eslint.config.mjs b/website/eslint.config.mjs
new file mode 100644
index 0000000..c1477b5
--- /dev/null
+++ b/website/eslint.config.mjs
@@ -0,0 +1,15 @@
+import { defineConfig, globalIgnores } from 'eslint/config';
+import nextVitals from 'eslint-config-next/core-web-vitals';
+
+const eslintConfig = defineConfig([
+ ...nextVitals,
+ globalIgnores([
+ '.next/**',
+ 'out/**',
+ 'build/**',
+ 'next-env.d.ts',
+ '.source/**',
+ ]),
+]);
+
+export default eslintConfig;
\ No newline at end of file
diff --git a/website/next.config.mjs b/website/next.config.mjs
new file mode 100644
index 0000000..13b7a6b
--- /dev/null
+++ b/website/next.config.mjs
@@ -0,0 +1,16 @@
+import { createMDX } from 'fumadocs-mdx/next';
+
+const withMDX = createMDX();
+
+/** @type {import('next').NextConfig} */
+const config = {
+ output: 'export',
+ // Project site served under https://enixcode.github.io/light-runner/.
+ basePath: '/light-runner',
+ trailingSlash: true,
+ // Static export cannot use the Next image optimizer.
+ images: { unoptimized: true },
+ reactStrictMode: true,
+};
+
+export default withMDX(config);
diff --git a/website/package-lock.json b/website/package-lock.json
new file mode 100644
index 0000000..3a1a357
--- /dev/null
+++ b/website/package-lock.json
@@ -0,0 +1,11909 @@
+{
+ "name": "website",
+ "version": "0.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "website",
+ "version": "0.0.0",
+ "hasInstallScript": true,
+ "dependencies": {
+ "@ai-sdk/react": "^3.0.193",
+ "@openrouter/ai-sdk-provider": "^2.9.0",
+ "@orama/orama": "^3.1.18",
+ "@radix-ui/react-presence": "^1.1.5",
+ "ai": "^6.0.191",
+ "class-variance-authority": "^0.7.1",
+ "flexsearch": "^0.8.212",
+ "fumadocs-core": "16.9.3",
+ "fumadocs-mdx": "15.0.10",
+ "fumadocs-ui": "16.9.3",
+ "hast-util-to-jsx-runtime": "^2.3.6",
+ "lucide-react": "^1.17.0",
+ "next": "16.2.6",
+ "react": "^19.2.6",
+ "react-dom": "^19.2.6",
+ "remark": "^15.0.1",
+ "remark-gfm": "^4.0.1",
+ "remark-rehype": "^11.1.2",
+ "tailwind-merge": "^3.6.0",
+ "unist-util-visit": "^5.1.0",
+ "zod": "^4.4.3"
+ },
+ "devDependencies": {
+ "@tailwindcss/postcss": "^4.3.0",
+ "@types/hast": "^3.0.4",
+ "@types/mdx": "^2.0.13",
+ "@types/node": "^25.9.1",
+ "@types/react": "^19.2.15",
+ "@types/react-dom": "^19.2.3",
+ "eslint": "^9.39.4",
+ "eslint-config-next": "16.2.6",
+ "postcss": "^8.5.15",
+ "serve": "^14.2.6",
+ "tailwindcss": "^4.3.0",
+ "typescript": "^6.0.3"
+ }
+ },
+ "node_modules/@ai-sdk/gateway": {
+ "version": "3.0.121",
+ "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-3.0.121.tgz",
+ "integrity": "sha512-uY248djJRxa5W68MHiyqO8WLdOeKQoRClGg7PVX/VPhVW8SJNM7/l5DcrA5WAM3YfQrLyNkgZa2VOu8T0t8LUw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@ai-sdk/provider": "3.0.10",
+ "@ai-sdk/provider-utils": "4.0.27",
+ "@vercel/oidc": "3.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "zod": "^3.25.76 || ^4.1.8"
+ }
+ },
+ "node_modules/@ai-sdk/provider": {
+ "version": "3.0.10",
+ "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.10.tgz",
+ "integrity": "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "json-schema": "^0.4.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@ai-sdk/provider-utils": {
+ "version": "4.0.27",
+ "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.27.tgz",
+ "integrity": "sha512-ubkAJ+xODouwtmN1tYlvTPphH1hPOBfZaEQe8U7skGvFAnIRs9PPpsq57bC2+Ky/MB4yzhd6YOsxTAx9sGpazw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@ai-sdk/provider": "3.0.10",
+ "@standard-schema/spec": "^1.1.0",
+ "eventsource-parser": "^3.0.8"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "zod": "^3.25.76 || ^4.1.8"
+ }
+ },
+ "node_modules/@ai-sdk/react": {
+ "version": "3.0.195",
+ "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-3.0.195.tgz",
+ "integrity": "sha512-+yIH84d4bBNzLKfaDDf4EocEH0XQKKNwNShxbrz5xAiJMNIPnWVWT9cyrSerYaGH3iNVS/g2io42PE4HNbc4RA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@ai-sdk/provider-utils": "4.0.27",
+ "ai": "6.0.193",
+ "swr": "^2.2.5",
+ "throttleit": "2.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "react": "^18 || ~19.0.1 || ~19.1.2 || ^19.2.1"
+ }
+ },
+ "node_modules/@alloc/quick-lru": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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",
+ "peer": true,
+ "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.7",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz",
+ "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.7",
+ "@babel/types": "^7.29.7",
+ "@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-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.7",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz",
+ "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz",
+ "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.7"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.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.7",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz",
+ "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.7",
+ "@babel/generator": "^7.29.7",
+ "@babel/helper-globals": "^7.29.7",
+ "@babel/parser": "^7.29.7",
+ "@babel/template": "^7.29.7",
+ "@babel/types": "^7.29.7",
+ "debug": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz",
+ "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==",
+ "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/@emnapi/core": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz",
+ "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@emnapi/wasi-threads": "1.2.1",
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/runtime": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz",
+ "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/wasi-threads": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz",
+ "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz",
+ "integrity": "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz",
+ "integrity": "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz",
+ "integrity": "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz",
+ "integrity": "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz",
+ "integrity": "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz",
+ "integrity": "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz",
+ "integrity": "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz",
+ "integrity": "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz",
+ "integrity": "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz",
+ "integrity": "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz",
+ "integrity": "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz",
+ "integrity": "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz",
+ "integrity": "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==",
+ "cpu": [
+ "mips64el"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz",
+ "integrity": "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz",
+ "integrity": "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz",
+ "integrity": "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz",
+ "integrity": "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz",
+ "integrity": "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz",
+ "integrity": "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz",
+ "integrity": "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz",
+ "integrity": "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz",
+ "integrity": "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz",
+ "integrity": "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz",
+ "integrity": "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz",
+ "integrity": "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz",
+ "integrity": "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
+ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/config-array": {
+ "version": "0.21.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz",
+ "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^2.1.7",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.5"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz",
+ "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.17.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
+ "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz",
+ "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.14.0",
+ "debug": "^4.3.2",
+ "espree": "^10.0.1",
+ "globals": "^14.0.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.1",
+ "minimatch": "^3.1.5",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "9.39.4",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz",
+ "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz",
+ "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz",
+ "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.17.0",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@floating-ui/core": {
+ "version": "1.7.5",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz",
+ "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/utils": "^0.2.11"
+ }
+ },
+ "node_modules/@floating-ui/dom": {
+ "version": "1.7.6",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz",
+ "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/core": "^1.7.5",
+ "@floating-ui/utils": "^0.2.11"
+ }
+ },
+ "node_modules/@floating-ui/react-dom": {
+ "version": "2.1.8",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz",
+ "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/dom": "^1.7.6"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0"
+ }
+ },
+ "node_modules/@floating-ui/utils": {
+ "version": "0.2.11",
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz",
+ "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==",
+ "license": "MIT"
+ },
+ "node_modules/@fumadocs/tailwind": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/@fumadocs/tailwind/-/tailwind-0.0.5.tgz",
+ "integrity": "sha512-ENKPWUDRmriccsrUDE4bDBq3FNr/ms3BP2rWlsAEMV1yP23pcCaan+ceGfeBUsAQjw7sj9Q3R4Kl3g/TCStPzQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@tailwindcss/oxide": "^4.0.0",
+ "tailwindcss": "^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@tailwindcss/oxide": {
+ "optional": true
+ },
+ "tailwindcss": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz",
+ "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/types": "^0.15.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.8",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz",
+ "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/core": "^0.19.2",
+ "@humanfs/types": "^0.15.0",
+ "@humanwhocodes/retry": "^0.4.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/types": {
+ "version": "0.15.0",
+ "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz",
+ "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@img/colour": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz",
+ "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@img/sharp-darwin-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz",
+ "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-arm64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-darwin-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz",
+ "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-x64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-libvips-darwin-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz",
+ "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-darwin-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz",
+ "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-arm": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz",
+ "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz",
+ "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-ppc64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz",
+ "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-riscv64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz",
+ "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-s390x": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz",
+ "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz",
+ "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz",
+ "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz",
+ "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz",
+ "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz",
+ "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-ppc64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz",
+ "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-ppc64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-riscv64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz",
+ "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-riscv64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-s390x": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz",
+ "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-s390x": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz",
+ "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-x64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linuxmusl-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz",
+ "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linuxmusl-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz",
+ "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-wasm32": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz",
+ "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==",
+ "cpu": [
+ "wasm32"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/runtime": "^1.7.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz",
+ "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-ia32": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz",
+ "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz",
+ "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "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.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "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==",
+ "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/@napi-rs/wasm-runtime": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz",
+ "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@tybys/wasm-util": "^0.10.1"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ },
+ "peerDependencies": {
+ "@emnapi/core": "^1.7.1",
+ "@emnapi/runtime": "^1.7.1"
+ }
+ },
+ "node_modules/@next/env": {
+ "version": "16.2.6",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.6.tgz",
+ "integrity": "sha512-gd8HoHN4ufj73WmR3JmVolrpJR47ILK6LouP5xElPglaVxir6e1a7VzvTvDWkOoPXT9rkkTzyCxBu4yeZfZwcw==",
+ "license": "MIT"
+ },
+ "node_modules/@next/eslint-plugin-next": {
+ "version": "16.2.6",
+ "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.2.6.tgz",
+ "integrity": "sha512-Z8l6o4JWKUl755x4R+wogD86KPeU+Ckw4K+SYG4kHeOJtRenDeK+OSbGcqZpDtbwn9DsJVdir2UxmwXuinUbUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-glob": "3.3.1"
+ }
+ },
+ "node_modules/@next/swc-darwin-arm64": {
+ "version": "16.2.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.6.tgz",
+ "integrity": "sha512-ZJGkkcNfYgrrMkqOdZ7zoLa1TOy0qpcMfk/z4Mh/FKUz40gVO+HNQWqmLxf67Z5WB64DRp0dhEbyHfel+6sJUg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-darwin-x64": {
+ "version": "16.2.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.6.tgz",
+ "integrity": "sha512-v/YLBHIY132Ced3puBJ7YJKw1lqsCrgcNo2aRJlCEyQrrCeRJlvGlnmxhPxNQI3KE3N1DN5r9TPNPvka3nq5RQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-arm64-gnu": {
+ "version": "16.2.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.6.tgz",
+ "integrity": "sha512-RPOvqlYBbcQjkz9VQQDZ2T2bARIjXZV1KFlt+V2Mr6SW/e4I9fcKsaA0hdyf2FHoTlsV2xnBd5Y912rP/1Ce6w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-arm64-musl": {
+ "version": "16.2.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.6.tgz",
+ "integrity": "sha512-URUTu1+dMkxJsPFgm+OeEvq9wf5sujw0EvgYy80TDGHTSLTnIHeqb0Eu8A3sC95IRgjejQL+kC4mw+4yPxiAXA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-x64-gnu": {
+ "version": "16.2.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.6.tgz",
+ "integrity": "sha512-DOj182mPV8G3UkrayLoREM5YEYI+Dk5wv7Ox9xl1fFibAELEsFD0lDPfHIeILlutMMfdyhlzYPELG3peuKaurw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-x64-musl": {
+ "version": "16.2.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.6.tgz",
+ "integrity": "sha512-HKQ5SP/V/ub73UvF7n/zeJlxk2kLmtL7Wzrg4WfmkjmNos5onJ2tKu7yZOPdL18A6Svfn3max29ym+ry7NkK4g==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-arm64-msvc": {
+ "version": "16.2.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.6.tgz",
+ "integrity": "sha512-LZXpTlPyS5v7HhSmnvsLGP3iIYgYOBnc8r8ArlT55sGHV89bR2HlDdBjWQ+PY6SJMmk8TuVGFuxalnP3k/0Dwg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-x64-msvc": {
+ "version": "16.2.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.6.tgz",
+ "integrity": "sha512-F0+4i0h9J6C4eE3EAPWsoCk7UW/dbzOjyzxY0qnDUOYFu6FFmdZ6l97/XdV3/Nz3VYyO7UWjyEJUXkGqcoXfMA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nolyfill/is-core-module": {
+ "version": "1.0.39",
+ "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz",
+ "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.4.0"
+ }
+ },
+ "node_modules/@openrouter/ai-sdk-provider": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/@openrouter/ai-sdk-provider/-/ai-sdk-provider-2.9.0.tgz",
+ "integrity": "sha512-Seva+NCa0WUQnJIUE5GzHsUv1WTIeyqwz0ELl2VtS6NP+eF+77yCXGFVOMbvoCM7QMjlnhv7931e89R+8pJdcQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "ai": "^6.0.0",
+ "zod": "^3.25.0 || ^4.0.0"
+ }
+ },
+ "node_modules/@opentelemetry/api": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz",
+ "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/@orama/orama": {
+ "version": "3.1.18",
+ "resolved": "https://registry.npmjs.org/@orama/orama/-/orama-3.1.18.tgz",
+ "integrity": "sha512-a61ljmRVVyG5MC/698C8/FfFDw5a8LOIvyOLW5fztgUXqUpc1jOfQzOitSCbge657OgXXThmY3Tk8fpiDb4UcA==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 20.0.0"
+ }
+ },
+ "node_modules/@radix-ui/number": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz",
+ "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==",
+ "license": "MIT"
+ },
+ "node_modules/@radix-ui/primitive": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz",
+ "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==",
+ "license": "MIT"
+ },
+ "node_modules/@radix-ui/react-accordion": {
+ "version": "1.2.12",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz",
+ "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-collapsible": "1.1.12",
+ "@radix-ui/react-collection": "1.1.7",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-direction": "1.1.1",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-controllable-state": "1.2.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-arrow": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz",
+ "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.1.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-collapsible": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz",
+ "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-collection": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz",
+ "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-slot": "1.2.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
+ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-compose-refs": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz",
+ "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-context": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz",
+ "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dialog": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz",
+ "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-dismissable-layer": "1.1.11",
+ "@radix-ui/react-focus-guards": "1.1.3",
+ "@radix-ui/react-focus-scope": "1.1.7",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-portal": "1.1.9",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-slot": "1.2.3",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "aria-hidden": "^1.2.4",
+ "react-remove-scroll": "^2.6.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
+ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-direction": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz",
+ "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dismissable-layer": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz",
+ "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-escape-keydown": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-focus-guards": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz",
+ "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-focus-scope": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz",
+ "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-id": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz",
+ "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-navigation-menu": {
+ "version": "1.2.14",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.14.tgz",
+ "integrity": "sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-collection": "1.1.7",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-direction": "1.1.1",
+ "@radix-ui/react-dismissable-layer": "1.1.11",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1",
+ "@radix-ui/react-use-previous": "1.1.1",
+ "@radix-ui/react-visually-hidden": "1.2.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-popover": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz",
+ "integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-dismissable-layer": "1.1.11",
+ "@radix-ui/react-focus-guards": "1.1.3",
+ "@radix-ui/react-focus-scope": "1.1.7",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-popper": "1.2.8",
+ "@radix-ui/react-portal": "1.1.9",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-slot": "1.2.3",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "aria-hidden": "^1.2.4",
+ "react-remove-scroll": "^2.6.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-slot": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
+ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-popper": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz",
+ "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/react-dom": "^2.0.0",
+ "@radix-ui/react-arrow": "1.1.7",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-layout-effect": "1.1.1",
+ "@radix-ui/react-use-rect": "1.1.1",
+ "@radix-ui/react-use-size": "1.1.1",
+ "@radix-ui/rect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-portal": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz",
+ "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-presence": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz",
+ "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-primitive": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz",
+ "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-slot": "1.2.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
+ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-roving-focus": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz",
+ "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-collection": "1.1.7",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-direction": "1.1.1",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-controllable-state": "1.2.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-scroll-area": {
+ "version": "1.2.10",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz",
+ "integrity": "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/number": "1.1.1",
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-direction": "1.1.1",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-slot": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz",
+ "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-tabs": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz",
+ "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-direction": "1.1.1",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-roving-focus": "1.1.11",
+ "@radix-ui/react-use-controllable-state": "1.2.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-callback-ref": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz",
+ "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-controllable-state": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz",
+ "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-effect-event": "0.0.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-effect-event": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz",
+ "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-escape-keydown": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz",
+ "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-callback-ref": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-layout-effect": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz",
+ "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-previous": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz",
+ "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-rect": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz",
+ "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/rect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-size": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz",
+ "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-visually-hidden": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz",
+ "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.1.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/rect": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz",
+ "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==",
+ "license": "MIT"
+ },
+ "node_modules/@rtsao/scc": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
+ "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@shikijs/core": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.1.0.tgz",
+ "integrity": "sha512-jLJtSJeuFffqX6/inRE1zqU5aFv2hrszvYgq3OjbAgFRZiWv7abKMDdQzYxuSDfmUPQozZvI/kuy6VMTvnvqTQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/primitive": "4.1.0",
+ "@shikijs/types": "4.1.0",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4",
+ "hast-util-to-html": "^9.0.5"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@shikijs/engine-javascript": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.1.0.tgz",
+ "integrity": "sha512-YquhawCUgaBfhsS72e2Y/dI59gCBNPHu3fEO/tvLaXrTssxZrY5ddjtNLTwndrMgPo8b3IscE+xoICDzpTmlFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "4.1.0",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "oniguruma-to-es": "^4.3.6"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@shikijs/engine-oniguruma": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.1.0.tgz",
+ "integrity": "sha512-axLpjVs45YBvvINa+dJF+NPW+KtFkNXsFr4SDw2BMj9GdeMnGxVB9PQb2xXlJYovslt/nz6giedAyOANkfc7hg==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "4.1.0",
+ "@shikijs/vscode-textmate": "^10.0.2"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@shikijs/langs": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.1.0.tgz",
+ "integrity": "sha512-nwOMruEkbgdZfQ/b8CgpNBVOpvG1k0N5tbmgiFeqsan401+x3ILqlzZJowSla4Agmq4hG2Uf2wh5jLTEhR8VSg==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "4.1.0"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@shikijs/primitive": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.1.0.tgz",
+ "integrity": "sha512-zx2/2Uwj2q9X3KSyYREEhXO23xBw5WUhP4orK2lE4r+t9JGITmEe0JH+wPmJhqHpOT2bRRs6lAL945+LDvOAGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "4.1.0",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@shikijs/themes": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.1.0.tgz",
+ "integrity": "sha512-emCcTnUM7yO2wltYbaxm+yLvcCI4+h8XBKc4KmJ7EZUXoSGjcCHifkI//R4OFit9ewpg7H2/9tjOuXrT2v/Knw==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "4.1.0"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@shikijs/types": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.1.0.tgz",
+ "integrity": "sha512-3EQWX54fMpniOrDblzAhiwiJwpiTMW6+B9DWyUd9ska483tbayFYuw47UxwuPknI31bKnySfVQ/QW+jFL4rFdA==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@shikijs/vscode-textmate": {
+ "version": "10.0.2",
+ "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz",
+ "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==",
+ "license": "MIT"
+ },
+ "node_modules/@standard-schema/spec": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
+ "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
+ "license": "MIT"
+ },
+ "node_modules/@swc/helpers": {
+ "version": "0.5.15",
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
+ "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.8.0"
+ }
+ },
+ "node_modules/@tailwindcss/node": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.0.tgz",
+ "integrity": "sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/remapping": "^2.3.5",
+ "enhanced-resolve": "^5.21.0",
+ "jiti": "^2.6.1",
+ "lightningcss": "1.32.0",
+ "magic-string": "^0.30.21",
+ "source-map-js": "^1.2.1",
+ "tailwindcss": "4.3.0"
+ }
+ },
+ "node_modules/@tailwindcss/oxide": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.0.tgz",
+ "integrity": "sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==",
+ "devOptional": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 20"
+ },
+ "optionalDependencies": {
+ "@tailwindcss/oxide-android-arm64": "4.3.0",
+ "@tailwindcss/oxide-darwin-arm64": "4.3.0",
+ "@tailwindcss/oxide-darwin-x64": "4.3.0",
+ "@tailwindcss/oxide-freebsd-x64": "4.3.0",
+ "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.0",
+ "@tailwindcss/oxide-linux-arm64-gnu": "4.3.0",
+ "@tailwindcss/oxide-linux-arm64-musl": "4.3.0",
+ "@tailwindcss/oxide-linux-x64-gnu": "4.3.0",
+ "@tailwindcss/oxide-linux-x64-musl": "4.3.0",
+ "@tailwindcss/oxide-wasm32-wasi": "4.3.0",
+ "@tailwindcss/oxide-win32-arm64-msvc": "4.3.0",
+ "@tailwindcss/oxide-win32-x64-msvc": "4.3.0"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-android-arm64": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.0.tgz",
+ "integrity": "sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-arm64": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.0.tgz",
+ "integrity": "sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-x64": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.0.tgz",
+ "integrity": "sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-freebsd-x64": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.0.tgz",
+ "integrity": "sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.0.tgz",
+ "integrity": "sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.0.tgz",
+ "integrity": "sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-musl": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.0.tgz",
+ "integrity": "sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-gnu": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.0.tgz",
+ "integrity": "sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-musl": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.0.tgz",
+ "integrity": "sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-wasm32-wasi": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.0.tgz",
+ "integrity": "sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==",
+ "bundleDependencies": [
+ "@napi-rs/wasm-runtime",
+ "@emnapi/core",
+ "@emnapi/runtime",
+ "@tybys/wasm-util",
+ "@emnapi/wasi-threads",
+ "tslib"
+ ],
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "^1.10.0",
+ "@emnapi/runtime": "^1.10.0",
+ "@emnapi/wasi-threads": "^1.2.1",
+ "@napi-rs/wasm-runtime": "^1.1.4",
+ "@tybys/wasm-util": "^0.10.1",
+ "tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.0.tgz",
+ "integrity": "sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.0.tgz",
+ "integrity": "sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/postcss": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.3.0.tgz",
+ "integrity": "sha512-Jm05Tjx+9yCLGv5qw1c+84Psds8MnyrEQYCB+FFk2lgGiUjlRqdxke4mVTuYrj2xnVZqKim2Apr5ySuQRYAw/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "@tailwindcss/node": "4.3.0",
+ "@tailwindcss/oxide": "4.3.0",
+ "postcss": "^8.5.10",
+ "tailwindcss": "4.3.0"
+ }
+ },
+ "node_modules/@tybys/wasm-util": {
+ "version": "0.10.2",
+ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz",
+ "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@types/debug": {
+ "version": "4.1.13",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz",
+ "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==",
+ "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==",
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/hast": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
+ "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/json5": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/mdx": {
+ "version": "2.0.13",
+ "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz",
+ "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==",
+ "license": "MIT",
+ "peer": true
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "25.9.1",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz",
+ "integrity": "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": ">=7.24.0 <7.24.7"
+ }
+ },
+ "node_modules/@types/react": {
+ "version": "19.2.15",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.15.tgz",
+ "integrity": "sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q==",
+ "devOptional": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "csstype": "^3.2.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "19.2.3",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz",
+ "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==",
+ "devOptional": true,
+ "license": "MIT",
+ "peer": true,
+ "peerDependencies": {
+ "@types/react": "^19.2.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==",
+ "license": "MIT"
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "8.60.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.60.0.tgz",
+ "integrity": "sha512-QYb/sa74/s7OKMbACMjrYnGspj9Hs5YI5aaffSL65UfeBUzVzBJfVo3oWSpbzPurvm7yaCCo2Lk7lVj610HqKw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.12.2",
+ "@typescript-eslint/scope-manager": "8.60.0",
+ "@typescript-eslint/type-utils": "8.60.0",
+ "@typescript-eslint/utils": "8.60.0",
+ "@typescript-eslint/visitor-keys": "8.60.0",
+ "ignore": "^7.0.5",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^8.60.0",
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.60.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.60.0.tgz",
+ "integrity": "sha512-fcqpj/MyK4sxDPcbe7STNPbpQL4RLZOPWuaTmwZYuc+hJKzRf58yRxfhqGpc6PIq9ZyfSBpfHgmUHmHs0KwHwg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "8.60.0",
+ "@typescript-eslint/types": "8.60.0",
+ "@typescript-eslint/typescript-estree": "8.60.0",
+ "@typescript-eslint/visitor-keys": "8.60.0",
+ "debug": "^4.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/project-service": {
+ "version": "8.60.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.60.0.tgz",
+ "integrity": "sha512-aZu74NNKJeUWqCjDddzdiKaS82dgYgV/vmf+Ui3ZdZejmgfXR/q+pRumgobnQ2cCJTgGTWp4ypiwsuofFubavg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/tsconfig-utils": "^8.60.0",
+ "@typescript-eslint/types": "^8.60.0",
+ "debug": "^4.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.60.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.60.0.tgz",
+ "integrity": "sha512-pFzqhllJMs+jghLQWzV00ds39xLzuyqPSev5pd8f4Ir0rtKR3ZLUB4/4dhjOFighWb9larvtfJvqL+4yKDI3Xw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.60.0",
+ "@typescript-eslint/visitor-keys": "8.60.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.60.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.0.tgz",
+ "integrity": "sha512-BZPR3RGYlAXnly6ymAxfkVn5rCbZzQNou0rxv3GfWZ8cTQp+hhVd73khbGLAd8k1TlAPLISH337M+tAgAnaJDQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.60.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.60.0.tgz",
+ "integrity": "sha512-SX46wEUtitCpq7AN38HkUU/+zvUpdKf7ephtWAFgckH8O7PQIyL5gvrhQgBLuEYgLfuKWOVvWVskMbuFHAz5xg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.60.0",
+ "@typescript-eslint/typescript-estree": "8.60.0",
+ "@typescript-eslint/utils": "8.60.0",
+ "debug": "^4.4.3",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.60.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.60.0.tgz",
+ "integrity": "sha512-AsE7x2XaAK+CVbeih0Fvbn+r1qHxtpLDJ3XUuFcIinT318T90yHMJC+Zgv+jUuDjQQd06HKwxnDu6sz1IcTilA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.60.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.60.0.tgz",
+ "integrity": "sha512-3AcZNBGMClm6CXDyo8kYvVGT/sx29sS0oBsIb9oZI2gunA4Vm2M3YHzRLPvsUBBsl+yB5FPtltq7gGH0iTlp9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/project-service": "8.60.0",
+ "@typescript-eslint/tsconfig-utils": "8.60.0",
+ "@typescript-eslint/types": "8.60.0",
+ "@typescript-eslint/visitor-keys": "8.60.0",
+ "debug": "^4.4.3",
+ "minimatch": "^10.2.2",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz",
+ "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "brace-expansion": "^5.0.5"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
+ "version": "7.8.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz",
+ "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.60.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.60.0.tgz",
+ "integrity": "sha512-HtXuPfrHTyBDkameWpl+vJb1Uevu2tznAyahM1Oc4AENidCLTPiZDWIo4GfcxNdC/RcfGcadzzkqbRG87dUrQA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.60.0",
+ "@typescript-eslint/types": "8.60.0",
+ "@typescript-eslint/typescript-estree": "8.60.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.60.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.60.0.tgz",
+ "integrity": "sha512-9WI52t8ZGLVGrPMBet25yAftqY/n95+zmoUUtJBBQTKDSKUu7OsPTroT2op7U9JatkoRccL0YkWDNMFfC4Sjxg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.60.0",
+ "eslint-visitor-keys": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.1.tgz",
+ "integrity": "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==",
+ "license": "ISC"
+ },
+ "node_modules/@unrs/resolver-binding-android-arm-eabi": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.12.2.tgz",
+ "integrity": "sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-android-arm64": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.12.2.tgz",
+ "integrity": "sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-darwin-arm64": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.12.2.tgz",
+ "integrity": "sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-darwin-x64": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.12.2.tgz",
+ "integrity": "sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-freebsd-x64": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.12.2.tgz",
+ "integrity": "sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.12.2.tgz",
+ "integrity": "sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.12.2.tgz",
+ "integrity": "sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm64-gnu": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.12.2.tgz",
+ "integrity": "sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm64-musl": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.12.2.tgz",
+ "integrity": "sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-loong64-gnu": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-gnu/-/resolver-binding-linux-loong64-gnu-1.12.2.tgz",
+ "integrity": "sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-loong64-musl": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-musl/-/resolver-binding-linux-loong64-musl-1.12.2.tgz",
+ "integrity": "sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.12.2.tgz",
+ "integrity": "sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.12.2.tgz",
+ "integrity": "sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-riscv64-musl": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.12.2.tgz",
+ "integrity": "sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-s390x-gnu": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.12.2.tgz",
+ "integrity": "sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-x64-gnu": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.12.2.tgz",
+ "integrity": "sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-x64-musl": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.12.2.tgz",
+ "integrity": "sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-openharmony-arm64": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-openharmony-arm64/-/resolver-binding-openharmony-arm64-1.12.2.tgz",
+ "integrity": "sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-wasm32-wasi": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.12.2.tgz",
+ "integrity": "sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==",
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "1.10.0",
+ "@emnapi/runtime": "1.10.0",
+ "@napi-rs/wasm-runtime": "^1.1.4"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@unrs/resolver-binding-win32-arm64-msvc": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.12.2.tgz",
+ "integrity": "sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-win32-ia32-msvc": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.12.2.tgz",
+ "integrity": "sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-win32-x64-msvc": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.12.2.tgz",
+ "integrity": "sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@vercel/oidc": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.2.0.tgz",
+ "integrity": "sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@zeit/schemas": {
+ "version": "2.36.0",
+ "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.36.0.tgz",
+ "integrity": "sha512-7kjMwcChYEzMKjeex9ZFXkt1AyNov9R5HZtjBKVsmVpw7pa7ZtlCGvCBC2vnnXctaYN+aRI61HjIqeetZW5ROg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/acorn": {
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
+ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
+ "license": "MIT",
+ "peer": true,
+ "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==",
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ai": {
+ "version": "6.0.193",
+ "resolved": "https://registry.npmjs.org/ai/-/ai-6.0.193.tgz",
+ "integrity": "sha512-VQOTOse8+X8kMtg61DNSXlYJzwOW4NjMLDJNk/qxClWsFe4oiyFJDHGGG1oezfGcFzuYuQe/8Z7r4kwiZWh2YQ==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@ai-sdk/gateway": "3.0.121",
+ "@ai-sdk/provider": "3.0.10",
+ "@ai-sdk/provider-utils": "4.0.27",
+ "@opentelemetry/api": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "zod": "^3.25.76 || ^4.1.8"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
+ "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-align": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
+ "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.1.0"
+ }
+ },
+ "node_modules/ansi-align/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-align/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ansi-align/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-align/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/arch": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
+ "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "license": "Python-2.0"
+ },
+ "node_modules/aria-hidden": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz",
+ "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/aria-query": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
+ "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
+ "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "is-array-buffer": "^3.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-includes": {
+ "version": "3.1.9",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz",
+ "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.24.0",
+ "es-object-atoms": "^1.1.1",
+ "get-intrinsic": "^1.3.0",
+ "is-string": "^1.1.1",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.findlast": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
+ "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.findlastindex": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz",
+ "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.9",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "es-shim-unscopables": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flat": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz",
+ "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flatmap": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz",
+ "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.tosorted": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
+ "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3",
+ "es-errors": "^1.3.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
+ "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "is-array-buffer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ast-types-flow": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
+ "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/astring": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz",
+ "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==",
+ "license": "MIT",
+ "bin": {
+ "astring": "bin/astring"
+ }
+ },
+ "node_modules/async-function": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz",
+ "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/axe-core": {
+ "version": "4.11.4",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.4.tgz",
+ "integrity": "sha512-KunSNx+TVpkAw/6ULfhnx+HWRecjqZGTOyquAoWHYLRSdK1tB5Ihce1ZW+UY3fj33bYAFWPu7W/GRSmmrCGuxA==",
+ "dev": true,
+ "license": "MPL-2.0",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/axobject-query": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
+ "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/bail": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
+ "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.10.32",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.32.tgz",
+ "integrity": "sha512-wbPvpyjJPC0zdfdKXxqEL3Ea+bOMD/87X4lftiJkkaBiuG6ALQy1SLmEd7BSmVCuwCQsBrCamgBoLyfFDD1EPg==",
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/boxen": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz",
+ "integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-align": "^3.0.1",
+ "camelcase": "^7.0.0",
+ "chalk": "^5.0.1",
+ "cli-boxes": "^3.0.0",
+ "string-width": "^5.1.2",
+ "type-fest": "^2.13.0",
+ "widest-line": "^4.0.1",
+ "wrap-ansi": "^8.0.1"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/boxen/node_modules/chalk": {
+ "version": "5.6.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz",
+ "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz",
+ "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.28.2",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz",
+ "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==",
+ "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",
+ "peer": true,
+ "dependencies": {
+ "baseline-browser-mapping": "^2.10.12",
+ "caniuse-lite": "^1.0.30001782",
+ "electron-to-chromium": "^1.5.328",
+ "node-releases": "^2.0.36",
+ "update-browserslist-db": "^1.2.3"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz",
+ "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "get-intrinsic": "^1.3.0",
+ "set-function-length": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz",
+ "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001793",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz",
+ "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==",
+ "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==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chalk-template": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz",
+ "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.1.2"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk-template?sponsor=1"
+ }
+ },
+ "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==",
+ "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==",
+ "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==",
+ "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==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz",
+ "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==",
+ "license": "MIT",
+ "dependencies": {
+ "readdirp": "^5.0.0"
+ },
+ "engines": {
+ "node": ">= 20.19.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/class-variance-authority": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz",
+ "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "clsx": "^2.1.1"
+ },
+ "funding": {
+ "url": "https://polar.sh/cva"
+ }
+ },
+ "node_modules/cli-boxes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz",
+ "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/client-only": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
+ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
+ "license": "MIT"
+ },
+ "node_modules/clipboardy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz",
+ "integrity": "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "arch": "^2.2.0",
+ "execa": "^5.1.1",
+ "is-wsl": "^2.2.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/clsx": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": ">= 1.43.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/compression": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz",
+ "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "compressible": "~2.0.18",
+ "debug": "2.6.9",
+ "negotiator": "~0.6.4",
+ "on-headers": "~1.1.0",
+ "safe-buffer": "5.2.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/compression/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/compression/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/compute-scroll-into-view": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz",
+ "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==",
+ "license": "MIT"
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/content-disposition": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
+ "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "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/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "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==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/damerau-levenshtein": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
+ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
+ "dev": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/data-view-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
+ "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/data-view-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
+ "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/inspect-js"
+ }
+ },
+ "node_modules/data-view-byte-offset": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
+ "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "character-entities": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "devOptional": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/detect-node-es": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
+ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "dequal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.364",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.364.tgz",
+ "integrity": "sha512-G/dYE3+AYhyHwzTwg8UbnXf7zqMERYh7l2jJ3QujhFsH8agSYwtnGAR2aZ7f0AakIKJXd5En/Hre4igIUrdlYw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.22.1",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.22.1.tgz",
+ "integrity": "sha512-6QEuw3zoX1SJQc7b87aBXke/no+mG2bTBgw29gWMQonLmpEkWoCAVkl+M49e48AZlWzxiDzDZzYdp6kobcyLww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.3.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/entities": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
+ "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.24.2",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz",
+ "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.2",
+ "arraybuffer.prototype.slice": "^1.0.4",
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "data-view-buffer": "^1.0.2",
+ "data-view-byte-length": "^1.0.2",
+ "data-view-byte-offset": "^1.0.1",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "es-set-tostringtag": "^2.1.0",
+ "es-to-primitive": "^1.3.0",
+ "function.prototype.name": "^1.1.8",
+ "get-intrinsic": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "get-symbol-description": "^1.1.0",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "internal-slot": "^1.1.0",
+ "is-array-buffer": "^3.0.5",
+ "is-callable": "^1.2.7",
+ "is-data-view": "^1.0.2",
+ "is-negative-zero": "^2.0.3",
+ "is-regex": "^1.2.1",
+ "is-set": "^2.0.3",
+ "is-shared-array-buffer": "^1.0.4",
+ "is-string": "^1.1.1",
+ "is-typed-array": "^1.1.15",
+ "is-weakref": "^1.1.1",
+ "math-intrinsics": "^1.1.0",
+ "object-inspect": "^1.13.4",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.7",
+ "own-keys": "^1.0.1",
+ "regexp.prototype.flags": "^1.5.4",
+ "safe-array-concat": "^1.1.3",
+ "safe-push-apply": "^1.0.0",
+ "safe-regex-test": "^1.1.0",
+ "set-proto": "^1.0.0",
+ "stop-iteration-iterator": "^1.1.0",
+ "string.prototype.trim": "^1.2.10",
+ "string.prototype.trimend": "^1.0.9",
+ "string.prototype.trimstart": "^1.0.8",
+ "typed-array-buffer": "^1.0.3",
+ "typed-array-byte-length": "^1.0.3",
+ "typed-array-byte-offset": "^1.0.4",
+ "typed-array-length": "^1.0.7",
+ "unbox-primitive": "^1.1.0",
+ "which-typed-array": "^1.1.19"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-iterator-helpers": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.2.tgz",
+ "integrity": "sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.9",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.24.2",
+ "es-errors": "^1.3.0",
+ "es-set-tostringtag": "^2.1.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.3.0",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "internal-slot": "^1.1.0",
+ "iterator.prototype": "^1.1.5",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz",
+ "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-shim-unscopables": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz",
+ "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
+ "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.2.7",
+ "is-date-object": "^1.0.5",
+ "is-symbol": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "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==",
+ "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.28.0",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz",
+ "integrity": "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.28.0",
+ "@esbuild/android-arm": "0.28.0",
+ "@esbuild/android-arm64": "0.28.0",
+ "@esbuild/android-x64": "0.28.0",
+ "@esbuild/darwin-arm64": "0.28.0",
+ "@esbuild/darwin-x64": "0.28.0",
+ "@esbuild/freebsd-arm64": "0.28.0",
+ "@esbuild/freebsd-x64": "0.28.0",
+ "@esbuild/linux-arm": "0.28.0",
+ "@esbuild/linux-arm64": "0.28.0",
+ "@esbuild/linux-ia32": "0.28.0",
+ "@esbuild/linux-loong64": "0.28.0",
+ "@esbuild/linux-mips64el": "0.28.0",
+ "@esbuild/linux-ppc64": "0.28.0",
+ "@esbuild/linux-riscv64": "0.28.0",
+ "@esbuild/linux-s390x": "0.28.0",
+ "@esbuild/linux-x64": "0.28.0",
+ "@esbuild/netbsd-arm64": "0.28.0",
+ "@esbuild/netbsd-x64": "0.28.0",
+ "@esbuild/openbsd-arm64": "0.28.0",
+ "@esbuild/openbsd-x64": "0.28.0",
+ "@esbuild/openharmony-arm64": "0.28.0",
+ "@esbuild/sunos-x64": "0.28.0",
+ "@esbuild/win32-arm64": "0.28.0",
+ "@esbuild/win32-ia32": "0.28.0",
+ "@esbuild/win32-x64": "0.28.0"
+ }
+ },
+ "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": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "9.39.4",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz",
+ "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.8.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.21.2",
+ "@eslint/config-helpers": "^0.4.2",
+ "@eslint/core": "^0.17.0",
+ "@eslint/eslintrc": "^3.3.5",
+ "@eslint/js": "9.39.4",
+ "@eslint/plugin-kit": "^0.4.1",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
+ "ajv": "^6.14.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^8.4.0",
+ "eslint-visitor-keys": "^4.2.1",
+ "espree": "^10.4.0",
+ "esquery": "^1.5.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.5",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-config-next": {
+ "version": "16.2.6",
+ "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.2.6.tgz",
+ "integrity": "sha512-z2ELYSkyrrJ6cuunTU8vhsT/RpouPkjaSah06nVW6Rg2Hpg0Vs8s497/e5s8G8qtdp4ccsiovz5P1rv+5VSW2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@next/eslint-plugin-next": "16.2.6",
+ "eslint-import-resolver-node": "^0.3.6",
+ "eslint-import-resolver-typescript": "^3.5.2",
+ "eslint-plugin-import": "^2.32.0",
+ "eslint-plugin-jsx-a11y": "^6.10.0",
+ "eslint-plugin-react": "^7.37.0",
+ "eslint-plugin-react-hooks": "^7.0.0",
+ "globals": "16.4.0",
+ "typescript-eslint": "^8.46.0"
+ },
+ "peerDependencies": {
+ "eslint": ">=9.0.0",
+ "typescript": ">=3.3.1"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-config-next/node_modules/globals": {
+ "version": "16.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz",
+ "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint-import-resolver-node": {
+ "version": "0.3.10",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz",
+ "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^3.2.7",
+ "is-core-module": "^2.16.1",
+ "resolve": "^2.0.0-next.6"
+ }
+ },
+ "node_modules/eslint-import-resolver-node/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-import-resolver-typescript": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz",
+ "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@nolyfill/is-core-module": "1.0.39",
+ "debug": "^4.4.0",
+ "get-tsconfig": "^4.10.0",
+ "is-bun-module": "^2.0.0",
+ "stable-hash": "^0.0.5",
+ "tinyglobby": "^0.2.13",
+ "unrs-resolver": "^1.6.2"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint-import-resolver-typescript"
+ },
+ "peerDependencies": {
+ "eslint": "*",
+ "eslint-plugin-import": "*",
+ "eslint-plugin-import-x": "*"
+ },
+ "peerDependenciesMeta": {
+ "eslint-plugin-import": {
+ "optional": true
+ },
+ "eslint-plugin-import-x": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-module-utils": {
+ "version": "2.13.0",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.13.0.tgz",
+ "integrity": "sha512-bLohSkT6469rRs8czj0tLTD8vaeIS/whvPRJVjDr7IuoTT1k5DYDERlNycjDj/HkOlvQdYurmfZ/g3fG5bgeLQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^3.2.7"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-module-utils/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-import": {
+ "version": "2.32.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz",
+ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@rtsao/scc": "^1.1.0",
+ "array-includes": "^3.1.9",
+ "array.prototype.findlastindex": "^1.2.6",
+ "array.prototype.flat": "^1.3.3",
+ "array.prototype.flatmap": "^1.3.3",
+ "debug": "^3.2.7",
+ "doctrine": "^2.1.0",
+ "eslint-import-resolver-node": "^0.3.9",
+ "eslint-module-utils": "^2.12.1",
+ "hasown": "^2.0.2",
+ "is-core-module": "^2.16.1",
+ "is-glob": "^4.0.3",
+ "minimatch": "^3.1.2",
+ "object.fromentries": "^2.0.8",
+ "object.groupby": "^1.0.3",
+ "object.values": "^1.2.1",
+ "semver": "^6.3.1",
+ "string.prototype.trimend": "^1.0.9",
+ "tsconfig-paths": "^3.15.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-jsx-a11y": {
+ "version": "6.10.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz",
+ "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "aria-query": "^5.3.2",
+ "array-includes": "^3.1.8",
+ "array.prototype.flatmap": "^1.3.2",
+ "ast-types-flow": "^0.0.8",
+ "axe-core": "^4.10.0",
+ "axobject-query": "^4.1.0",
+ "damerau-levenshtein": "^1.0.8",
+ "emoji-regex": "^9.2.2",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^3.3.5",
+ "language-tags": "^1.0.9",
+ "minimatch": "^3.1.2",
+ "object.fromentries": "^2.0.8",
+ "safe-regex-test": "^1.0.3",
+ "string.prototype.includes": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9"
+ }
+ },
+ "node_modules/eslint-plugin-react": {
+ "version": "7.37.5",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz",
+ "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-includes": "^3.1.8",
+ "array.prototype.findlast": "^1.2.5",
+ "array.prototype.flatmap": "^1.3.3",
+ "array.prototype.tosorted": "^1.1.4",
+ "doctrine": "^2.1.0",
+ "es-iterator-helpers": "^1.2.1",
+ "estraverse": "^5.3.0",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.9",
+ "object.fromentries": "^2.0.8",
+ "object.values": "^1.2.1",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.5",
+ "semver": "^6.3.1",
+ "string.prototype.matchall": "^4.0.12",
+ "string.prototype.repeat": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz",
+ "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.24.4",
+ "@babel/parser": "^7.24.4",
+ "hermes-parser": "^0.25.1",
+ "zod": "^3.25.0 || ^4.0.0",
+ "zod-validation-error": "^3.5.0 || ^4.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+ "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.15.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
+ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "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==",
+ "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==",
+ "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==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-scope": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz",
+ "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==",
+ "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==",
+ "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-value-to-estree": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz",
+ "integrity": "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/remcohaszing"
+ }
+ },
+ "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==",
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eventsource-parser": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.0.tgz",
+ "integrity": "sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "license": "MIT"
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
+ "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz",
+ "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/fastq": {
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
+ "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
+ "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/flexsearch": {
+ "version": "0.8.212",
+ "resolved": "https://registry.npmjs.org/flexsearch/-/flexsearch-0.8.212.tgz",
+ "integrity": "sha512-wSyJr1GUWoOOIISRu+X2IXiOcVfg9qqBRyCPRUdLMIGJqPzMo+jMRlvE83t14v1j0dRMEaBbER/adQjp6Du2pw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/ts-thomas"
+ },
+ {
+ "type": "paypal",
+ "url": "https://www.paypal.com/donate/?hosted_button_id=GEVR88FC9BWRW"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/flexsearch"
+ },
+ {
+ "type": "patreon",
+ "url": "https://patreon.com/user?u=96245532"
+ },
+ {
+ "type": "liberapay",
+ "url": "https://liberapay.com/ts-thomas"
+ }
+ ],
+ "license": "Apache-2.0",
+ "peer": true
+ },
+ "node_modules/for-each": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
+ "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/framer-motion": {
+ "version": "12.40.0",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.40.0.tgz",
+ "integrity": "sha512-uaBd3qC1v3KQqBEjwTUd183K6PbS+j0yR9w9VmEOLWA/tnUcSn8Xa3uck7t4dgpDoUss8xQTcj8W2L07lrnLFg==",
+ "license": "MIT",
+ "dependencies": {
+ "motion-dom": "^12.40.0",
+ "motion-utils": "^12.39.0",
+ "tslib": "^2.4.0"
+ },
+ "peerDependencies": {
+ "@emotion/is-prop-valid": "*",
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/is-prop-valid": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/fumadocs-core": {
+ "version": "16.9.3",
+ "resolved": "https://registry.npmjs.org/fumadocs-core/-/fumadocs-core-16.9.3.tgz",
+ "integrity": "sha512-8RVzKnzBJR5o+tJCccY28ntekfMQYBoYiz7alnYb/d9YJc+XpnsINzTl63lQ1eBMZ9gdhm2MqRtgUjh/8rUrbw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@orama/orama": "^3.1.18",
+ "estree-util-value-to-estree": "^3.5.0",
+ "github-slugger": "^2.0.0",
+ "hast-util-to-estree": "^3.1.3",
+ "hast-util-to-jsx-runtime": "^2.3.6",
+ "js-yaml": "^4.1.1",
+ "mdast-util-mdx": "^3.0.0",
+ "mdast-util-to-markdown": "^2.1.2",
+ "remark": "^15.0.1",
+ "remark-gfm": "^4.0.1",
+ "remark-rehype": "^11.1.2",
+ "scroll-into-view-if-needed": "^3.1.0",
+ "shiki": "^4.1.0",
+ "tinyglobby": "^0.2.16",
+ "unified": "^11.0.5",
+ "unist-util-visit": "^5.1.0",
+ "vfile": "^6.0.3"
+ },
+ "peerDependencies": {
+ "@mdx-js/mdx": "*",
+ "@mixedbread/sdk": "0.x.x",
+ "@orama/core": "1.x.x",
+ "@oramacloud/client": "2.x.x",
+ "@tanstack/react-router": "1.x.x",
+ "@types/estree-jsx": "*",
+ "@types/hast": "*",
+ "@types/mdast": "*",
+ "@types/react": "*",
+ "algoliasearch": "5.x.x",
+ "flexsearch": "*",
+ "lucide-react": "*",
+ "next": "16.x.x",
+ "react": "^19.2.0",
+ "react-dom": "^19.2.0",
+ "react-router": "7.x.x",
+ "waku": "*",
+ "zod": "4.x.x"
+ },
+ "peerDependenciesMeta": {
+ "@mdx-js/mdx": {
+ "optional": true
+ },
+ "@mixedbread/sdk": {
+ "optional": true
+ },
+ "@orama/core": {
+ "optional": true
+ },
+ "@oramacloud/client": {
+ "optional": true
+ },
+ "@tanstack/react-router": {
+ "optional": true
+ },
+ "@types/estree-jsx": {
+ "optional": true
+ },
+ "@types/hast": {
+ "optional": true
+ },
+ "@types/mdast": {
+ "optional": true
+ },
+ "@types/react": {
+ "optional": true
+ },
+ "algoliasearch": {
+ "optional": true
+ },
+ "flexsearch": {
+ "optional": true
+ },
+ "lucide-react": {
+ "optional": true
+ },
+ "next": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ },
+ "react-router": {
+ "optional": true
+ },
+ "waku": {
+ "optional": true
+ },
+ "zod": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/fumadocs-mdx": {
+ "version": "15.0.10",
+ "resolved": "https://registry.npmjs.org/fumadocs-mdx/-/fumadocs-mdx-15.0.10.tgz",
+ "integrity": "sha512-kH3S7ESS9yXTAaCkA8dDugsCK/MbnpgyZ5qBEL7cWoavV0O/T4+4YTYFkvNknz7cw+T/r+OG0p2BvlVhkk4fww==",
+ "license": "MIT",
+ "dependencies": {
+ "@mdx-js/mdx": "^3.1.1",
+ "@standard-schema/spec": "^1.1.0",
+ "chokidar": "^5.0.0",
+ "esbuild": "^0.28.0",
+ "estree-util-value-to-estree": "^3.5.0",
+ "js-yaml": "^4.1.1",
+ "mdast-util-mdx": "^3.0.0",
+ "picocolors": "^1.1.1",
+ "picomatch": "^4.0.4",
+ "tinyexec": "^1.2.2",
+ "tinyglobby": "^0.2.16",
+ "unified": "^11.0.5",
+ "unist-util-remove-position": "^5.0.0",
+ "unist-util-visit": "^5.1.0",
+ "vfile": "^6.0.3",
+ "zod": "^4.4.3"
+ },
+ "bin": {
+ "fumadocs-mdx": "bin.js"
+ },
+ "peerDependencies": {
+ "@types/mdast": "*",
+ "@types/mdx": "*",
+ "@types/react": "*",
+ "fumadocs-core": "^16.7.0",
+ "mdast-util-directive": "*",
+ "next": "^15.3.0 || ^16.0.0",
+ "react": "^19.2.0",
+ "rolldown": "*",
+ "vite": "7.x.x || 8.x.x"
+ },
+ "peerDependenciesMeta": {
+ "@types/mdast": {
+ "optional": true
+ },
+ "@types/mdx": {
+ "optional": true
+ },
+ "@types/react": {
+ "optional": true
+ },
+ "mdast-util-directive": {
+ "optional": true
+ },
+ "next": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "rolldown": {
+ "optional": true
+ },
+ "vite": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/fumadocs-ui": {
+ "version": "16.9.3",
+ "resolved": "https://registry.npmjs.org/fumadocs-ui/-/fumadocs-ui-16.9.3.tgz",
+ "integrity": "sha512-eoVKj1H+ATut0su+WIoPWBLRqzPMGD0hekIBr4GopWvUg1lS997HL4kP+Leyf+3CYlZtFgyXb6ylbvRLFtEj6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@fumadocs/tailwind": "0.0.5",
+ "@radix-ui/react-accordion": "^1.2.12",
+ "@radix-ui/react-collapsible": "^1.1.12",
+ "@radix-ui/react-dialog": "^1.1.15",
+ "@radix-ui/react-direction": "^1.1.1",
+ "@radix-ui/react-navigation-menu": "^1.2.14",
+ "@radix-ui/react-popover": "^1.1.15",
+ "@radix-ui/react-presence": "^1.1.5",
+ "@radix-ui/react-scroll-area": "^1.2.10",
+ "@radix-ui/react-slot": "^1.2.4",
+ "@radix-ui/react-tabs": "^1.1.13",
+ "class-variance-authority": "^0.7.1",
+ "lucide-react": "^1.17.0",
+ "motion": "^12.40.0",
+ "next-themes": "^0.4.6",
+ "react-remove-scroll": "^2.7.2",
+ "rehype-raw": "^7.0.0",
+ "scroll-into-view-if-needed": "^3.1.0",
+ "shiki": "^4.1.0",
+ "tailwind-merge": "^3.6.0",
+ "unist-util-visit": "^5.1.0"
+ },
+ "peerDependencies": {
+ "@takumi-rs/image-response": "*",
+ "@types/mdx": "*",
+ "@types/react": "*",
+ "fumadocs-core": "16.9.3",
+ "next": "16.x.x",
+ "react": "^19.2.0",
+ "react-dom": "^19.2.0"
+ },
+ "peerDependenciesMeta": {
+ "@takumi-rs/image-response": {
+ "optional": true
+ },
+ "@types/mdx": {
+ "optional": true
+ },
+ "@types/react": {
+ "optional": true
+ },
+ "next": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/function.prototype.name": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
+ "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "functions-have-names": "^1.2.3",
+ "hasown": "^2.0.2",
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/generator-function": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz",
+ "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "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/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-nonce": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
+ "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-symbol-description": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
+ "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-tsconfig": {
+ "version": "4.14.0",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz",
+ "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "resolve-pkg-maps": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
+ }
+ },
+ "node_modules/github-slugger": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz",
+ "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==",
+ "license": "ISC"
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.2.1",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/has-bigints": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
+ "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
+ "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz",
+ "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/hast-util-from-parse5": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz",
+ "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "devlop": "^1.0.0",
+ "hastscript": "^9.0.0",
+ "property-information": "^7.0.0",
+ "vfile": "^6.0.0",
+ "vfile-location": "^5.0.0",
+ "web-namespaces": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-parse-selector": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz",
+ "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-raw": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz",
+ "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "@ungap/structured-clone": "^1.0.0",
+ "hast-util-from-parse5": "^8.0.0",
+ "hast-util-to-parse5": "^8.0.0",
+ "html-void-elements": "^3.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "parse5": "^7.0.0",
+ "unist-util-position": "^5.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0",
+ "web-namespaces": "^2.0.0",
+ "zwitch": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "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==",
+ "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-html": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz",
+ "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "ccount": "^2.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "html-void-elements": "^3.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "stringify-entities": "^4.0.0",
+ "zwitch": "^2.0.4"
+ },
+ "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==",
+ "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-to-parse5": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz",
+ "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "devlop": "^1.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "web-namespaces": "^2.0.0",
+ "zwitch": "^2.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==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hastscript": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz",
+ "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "hast-util-parse-selector": "^4.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hermes-estree": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz",
+ "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/hermes-parser": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz",
+ "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hermes-estree": "0.25.1"
+ }
+ },
+ "node_modules/html-void-elements": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz",
+ "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/internal-slot": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
+ "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "hasown": "^2.0.2",
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "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==",
+ "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==",
+ "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-array-buffer": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
+ "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-async-function": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
+ "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "async-function": "^1.0.0",
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bigint": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
+ "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-bigints": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
+ "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bun-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz",
+ "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.7.1"
+ }
+ },
+ "node_modules/is-bun-module/node_modules/semver": {
+ "version": "7.8.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz",
+ "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.16.2",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz",
+ "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-data-view": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
+ "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
+ "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-finalizationregistry": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
+ "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz",
+ "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.4",
+ "generator-function": "^2.0.0",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+ "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
+ "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-port-reachable": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-4.0.0.tgz",
+ "integrity": "sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-regex": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
+ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-set": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
+ "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
+ "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
+ "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
+ "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakmap": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakref": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz",
+ "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakset": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
+ "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-docker": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/iterator.prototype": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz",
+ "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.6",
+ "get-proto": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz",
+ "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jiti": "lib/jiti-cli.mjs"
+ }
+ },
+ "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/js-yaml": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "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/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
+ "license": "(AFL-2.1 OR BSD-3-Clause)"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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/jsx-ast-utils": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
+ "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "object.assign": "^4.1.4",
+ "object.values": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/language-subtag-registry": {
+ "version": "0.3.23",
+ "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
+ "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==",
+ "dev": true,
+ "license": "CC0-1.0"
+ },
+ "node_modules/language-tags": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz",
+ "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "language-subtag-registry": "^0.3.20"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lightningcss": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
+ "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "detect-libc": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "lightningcss-android-arm64": "1.32.0",
+ "lightningcss-darwin-arm64": "1.32.0",
+ "lightningcss-darwin-x64": "1.32.0",
+ "lightningcss-freebsd-x64": "1.32.0",
+ "lightningcss-linux-arm-gnueabihf": "1.32.0",
+ "lightningcss-linux-arm64-gnu": "1.32.0",
+ "lightningcss-linux-arm64-musl": "1.32.0",
+ "lightningcss-linux-x64-gnu": "1.32.0",
+ "lightningcss-linux-x64-musl": "1.32.0",
+ "lightningcss-win32-arm64-msvc": "1.32.0",
+ "lightningcss-win32-x64-msvc": "1.32.0"
+ }
+ },
+ "node_modules/lightningcss-android-arm64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz",
+ "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-arm64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz",
+ "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-x64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz",
+ "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-freebsd-x64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz",
+ "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm-gnueabihf": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz",
+ "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-gnu": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz",
+ "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-musl": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz",
+ "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-gnu": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz",
+ "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-musl": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz",
+ "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-arm64-msvc": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz",
+ "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-x64-msvc": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz",
+ "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "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": "1.17.0",
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.17.0.tgz",
+ "integrity": "sha512-9FA9evdox/JQL5PT57fdA1x/yg8T7knJ98+zjTL3UfKza6pflQUUh3XtaQIHKvnsJw1lmsEyHVlt5jchYxOQ5w==",
+ "license": "ISC",
+ "peer": true,
+ "peerDependencies": {
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.21",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "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==",
+ "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==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/mdast-util-find-and-replace": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz",
+ "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==",
+ "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-find-and-replace/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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mdast-util-from-markdown": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz",
+ "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==",
+ "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==",
+ "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==",
+ "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==",
+ "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.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz",
+ "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==",
+ "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==",
+ "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==",
+ "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==",
+ "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==",
+ "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==",
+ "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==",
+ "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==",
+ "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==",
+ "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.1.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz",
+ "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==",
+ "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-classify-character": "^2.0.0",
+ "micromark-util-decode-string": "^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==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromark": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz",
+ "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==",
+ "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-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.3",
+ "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz",
+ "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==",
+ "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.0.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-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.0"
+ }
+ },
+ "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==",
+ "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==",
+ "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==",
+ "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==",
+ "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.1",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz",
+ "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==",
+ "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==",
+ "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==",
+ "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==",
+ "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==",
+ "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==",
+ "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==",
+ "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==",
+ "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==",
+ "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==",
+ "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==",
+ "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.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz",
+ "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==",
+ "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==",
+ "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==",
+ "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==",
+ "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==",
+ "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==",
+ "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==",
+ "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==",
+ "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==",
+ "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-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==",
+ "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==",
+ "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==",
+ "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==",
+ "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==",
+ "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==",
+ "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==",
+ "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==",
+ "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.2",
+ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz",
+ "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/micromatch/node_modules/picomatch": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.54.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.18",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
+ "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "~1.33.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types/node_modules/mime-db": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
+ "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/motion": {
+ "version": "12.40.0",
+ "resolved": "https://registry.npmjs.org/motion/-/motion-12.40.0.tgz",
+ "integrity": "sha512-yjrHUrBFW6kQvjJwRsoiPSAhC5tRwRqNGJWmiJ4CrGnbKp0V88AdzkhBmDoqIsIPfarOe0Uddd37Xq43/gIocA==",
+ "license": "MIT",
+ "dependencies": {
+ "framer-motion": "^12.40.0",
+ "tslib": "^2.4.0"
+ },
+ "peerDependencies": {
+ "@emotion/is-prop-valid": "*",
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/is-prop-valid": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/motion-dom": {
+ "version": "12.40.0",
+ "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.40.0.tgz",
+ "integrity": "sha512-HxU3ZaBwNPVQUBQf1xxgq+7JrPNZvjLVxgbpEZL7RrWJnsxOf0/OM+yrHG9ogLQ31Do/r57Oz2gQWPK+6q62mg==",
+ "license": "MIT",
+ "dependencies": {
+ "motion-utils": "^12.39.0"
+ }
+ },
+ "node_modules/motion-utils": {
+ "version": "12.39.0",
+ "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.39.0.tgz",
+ "integrity": "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==",
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.12",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz",
+ "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==",
+ "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/napi-postinstall": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz",
+ "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "napi-postinstall": "lib/cli.js"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/napi-postinstall"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/negotiator": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
+ "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/next": {
+ "version": "16.2.6",
+ "resolved": "https://registry.npmjs.org/next/-/next-16.2.6.tgz",
+ "integrity": "sha512-qOVgKJg1+At15NpeUP+eJgCHvTCgXsogweq87Ri/Ix7PkqQHg4sdaXmSFqKlgaIXE4kW0g25LE68W87UANlHtw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@next/env": "16.2.6",
+ "@swc/helpers": "0.5.15",
+ "baseline-browser-mapping": "^2.9.19",
+ "caniuse-lite": "^1.0.30001579",
+ "postcss": "8.4.31",
+ "styled-jsx": "5.1.6"
+ },
+ "bin": {
+ "next": "dist/bin/next"
+ },
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "optionalDependencies": {
+ "@next/swc-darwin-arm64": "16.2.6",
+ "@next/swc-darwin-x64": "16.2.6",
+ "@next/swc-linux-arm64-gnu": "16.2.6",
+ "@next/swc-linux-arm64-musl": "16.2.6",
+ "@next/swc-linux-x64-gnu": "16.2.6",
+ "@next/swc-linux-x64-musl": "16.2.6",
+ "@next/swc-win32-arm64-msvc": "16.2.6",
+ "@next/swc-win32-x64-msvc": "16.2.6",
+ "sharp": "^0.34.5"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.1.0",
+ "@playwright/test": "^1.51.1",
+ "babel-plugin-react-compiler": "*",
+ "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
+ "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
+ "sass": "^1.3.0"
+ },
+ "peerDependenciesMeta": {
+ "@opentelemetry/api": {
+ "optional": true
+ },
+ "@playwright/test": {
+ "optional": true
+ },
+ "babel-plugin-react-compiler": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/next-themes": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz",
+ "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc"
+ }
+ },
+ "node_modules/next/node_modules/postcss": {
+ "version": "8.4.31",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
+ "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
+ "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.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/node-exports-info": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz",
+ "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array.prototype.flatmap": "^1.3.3",
+ "es-errors": "^1.3.0",
+ "object.entries": "^1.1.9",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.46",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.46.tgz",
+ "integrity": "sha512-GYVXHE2KnrzAfsAjl4uP++evGFCrAU1jta4ubEjIG7YWt/64Gqv66a30yKwWczVjA6j3bM4nBwH7Pk1JmDHaxQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
+ "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz",
+ "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.fromentries": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
+ "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.groupby": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz",
+ "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.values": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz",
+ "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/on-headers": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz",
+ "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/oniguruma-parser": {
+ "version": "0.12.2",
+ "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz",
+ "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==",
+ "license": "MIT"
+ },
+ "node_modules/oniguruma-to-es": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz",
+ "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==",
+ "license": "MIT",
+ "dependencies": {
+ "oniguruma-parser": "^0.12.2",
+ "regex": "^6.1.0",
+ "regex-recursion": "^6.0.2"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/own-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz",
+ "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "get-intrinsic": "^1.2.6",
+ "object-keys": "^1.1.1",
+ "safe-push-apply": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "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==",
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/parse5": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
+ "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==",
+ "license": "MIT",
+ "dependencies": {
+ "entities": "^6.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==",
+ "dev": true,
+ "license": "(WTFPL OR MIT)"
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/path-to-regexp": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz",
+ "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==",
+ "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==",
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/possible-typed-array-names": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
+ "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.15",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz",
+ "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==",
+ "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.12",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "node_modules/property-information": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz",
+ "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/range-parser": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
+ "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/rc": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+ "dev": true,
+ "license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
+ "dependencies": {
+ "deep-extend": "^0.6.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ },
+ "bin": {
+ "rc": "cli.js"
+ }
+ },
+ "node_modules/rc/node_modules/strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react": {
+ "version": "19.2.6",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.6.tgz",
+ "integrity": "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "19.2.6",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.6.tgz",
+ "integrity": "sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "scheduler": "^0.27.0"
+ },
+ "peerDependencies": {
+ "react": "^19.2.6"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/react-remove-scroll": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz",
+ "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==",
+ "license": "MIT",
+ "dependencies": {
+ "react-remove-scroll-bar": "^2.3.7",
+ "react-style-singleton": "^2.2.3",
+ "tslib": "^2.1.0",
+ "use-callback-ref": "^1.3.3",
+ "use-sidecar": "^1.1.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-remove-scroll-bar": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz",
+ "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==",
+ "license": "MIT",
+ "dependencies": {
+ "react-style-singleton": "^2.2.2",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-style-singleton": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz",
+ "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==",
+ "license": "MIT",
+ "dependencies": {
+ "get-nonce": "^1.0.0",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz",
+ "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 20.19.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "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==",
+ "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==",
+ "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==",
+ "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==",
+ "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/reflect.getprototypeof": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
+ "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.9",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.7",
+ "get-proto": "^1.0.1",
+ "which-builtin-type": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz",
+ "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==",
+ "license": "MIT",
+ "dependencies": {
+ "regex-utilities": "^2.3.0"
+ }
+ },
+ "node_modules/regex-recursion": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz",
+ "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==",
+ "license": "MIT",
+ "dependencies": {
+ "regex-utilities": "^2.3.0"
+ }
+ },
+ "node_modules/regex-utilities": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz",
+ "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==",
+ "license": "MIT"
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
+ "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-errors": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/registry-auth-token": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz",
+ "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "rc": "^1.1.6",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/registry-url": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
+ "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "rc": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rehype-raw": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz",
+ "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hast-util-raw": "^9.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==",
+ "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": {
+ "version": "15.0.1",
+ "resolved": "https://registry.npmjs.org/remark/-/remark-15.0.1.tgz",
+ "integrity": "sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.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-gfm": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz",
+ "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==",
+ "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==",
+ "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==",
+ "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==",
+ "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==",
+ "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/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "2.0.0-next.7",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz",
+ "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "is-core-module": "^2.16.2",
+ "node-exports-info": "^1.6.0",
+ "object-keys": "^1.1.1",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/resolve-pkg-maps": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
+ "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-array-concat": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz",
+ "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.9",
+ "call-bound": "^1.0.4",
+ "get-intrinsic": "^1.3.0",
+ "has-symbols": "^1.1.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safe-push-apply": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
+ "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+ "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-regex": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
+ "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
+ "license": "MIT"
+ },
+ "node_modules/scroll-into-view-if-needed": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz",
+ "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==",
+ "license": "MIT",
+ "dependencies": {
+ "compute-scroll-into-view": "^3.0.2"
+ }
+ },
+ "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/serve": {
+ "version": "14.2.6",
+ "resolved": "https://registry.npmjs.org/serve/-/serve-14.2.6.tgz",
+ "integrity": "sha512-QEjUSA+sD4Rotm1znR8s50YqA3kYpRGPmtd5GlFxbaL9n/FdUNbqMhxClqdditSk0LlZyA/dhud6XNRTOC9x2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@zeit/schemas": "2.36.0",
+ "ajv": "8.18.0",
+ "arg": "5.0.2",
+ "boxen": "7.0.0",
+ "chalk": "5.0.1",
+ "chalk-template": "0.4.0",
+ "clipboardy": "3.0.0",
+ "compression": "1.8.1",
+ "is-port-reachable": "4.0.0",
+ "serve-handler": "6.1.7",
+ "update-check": "1.5.4"
+ },
+ "bin": {
+ "serve": "build/main.js"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/serve-handler": {
+ "version": "6.1.7",
+ "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.7.tgz",
+ "integrity": "sha512-CinAq1xWb0vR3twAv9evEU8cNWkXCb9kd5ePAHUKJBkOsUpR1wt/CvGdeca7vqumL1U5cSaeVQ6zZMxiJ3yWsg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.0.0",
+ "content-disposition": "0.5.2",
+ "mime-types": "2.1.18",
+ "minimatch": "3.1.5",
+ "path-is-inside": "1.0.2",
+ "path-to-regexp": "3.3.0",
+ "range-parser": "1.2.0"
+ }
+ },
+ "node_modules/serve-handler/node_modules/bytes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+ "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/serve/node_modules/ajv": {
+ "version": "8.18.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz",
+ "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/serve/node_modules/chalk": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz",
+ "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/serve/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-function-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+ "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-proto": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz",
+ "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/sharp": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz",
+ "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==",
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@img/colour": "^1.0.0",
+ "detect-libc": "^2.1.2",
+ "semver": "^7.7.3"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-darwin-arm64": "0.34.5",
+ "@img/sharp-darwin-x64": "0.34.5",
+ "@img/sharp-libvips-darwin-arm64": "1.2.4",
+ "@img/sharp-libvips-darwin-x64": "1.2.4",
+ "@img/sharp-libvips-linux-arm": "1.2.4",
+ "@img/sharp-libvips-linux-arm64": "1.2.4",
+ "@img/sharp-libvips-linux-ppc64": "1.2.4",
+ "@img/sharp-libvips-linux-riscv64": "1.2.4",
+ "@img/sharp-libvips-linux-s390x": "1.2.4",
+ "@img/sharp-libvips-linux-x64": "1.2.4",
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.4",
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.4",
+ "@img/sharp-linux-arm": "0.34.5",
+ "@img/sharp-linux-arm64": "0.34.5",
+ "@img/sharp-linux-ppc64": "0.34.5",
+ "@img/sharp-linux-riscv64": "0.34.5",
+ "@img/sharp-linux-s390x": "0.34.5",
+ "@img/sharp-linux-x64": "0.34.5",
+ "@img/sharp-linuxmusl-arm64": "0.34.5",
+ "@img/sharp-linuxmusl-x64": "0.34.5",
+ "@img/sharp-wasm32": "0.34.5",
+ "@img/sharp-win32-arm64": "0.34.5",
+ "@img/sharp-win32-ia32": "0.34.5",
+ "@img/sharp-win32-x64": "0.34.5"
+ }
+ },
+ "node_modules/sharp/node_modules/semver": {
+ "version": "7.8.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz",
+ "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==",
+ "license": "ISC",
+ "optional": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shiki": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.1.0.tgz",
+ "integrity": "sha512-l/ABZPUR5v70jI10EzqfMS/I96vjSGv2y0ihUV+WYFzv0EfvW4s54m0Lg8wCrrL+2IkwBzFTuxkZjPf8b2NX9Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/core": "4.1.0",
+ "@shikijs/engine-javascript": "4.1.0",
+ "@shikijs/engine-oniguruma": "4.1.0",
+ "@shikijs/langs": "4.1.0",
+ "@shikijs/themes": "4.1.0",
+ "@shikijs/types": "4.1.0",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz",
+ "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "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==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "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==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/stable-hash": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz",
+ "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/stop-iteration-iterator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz",
+ "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "internal-slot": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/string.prototype.includes": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz",
+ "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/string.prototype.matchall": {
+ "version": "4.0.12",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz",
+ "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.6",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.6",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "internal-slot": "^1.1.0",
+ "regexp.prototype.flags": "^1.5.3",
+ "set-function-name": "^2.0.2",
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.repeat": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz",
+ "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.10",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
+ "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-data-property": "^1.1.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-object-atoms": "^1.0.0",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz",
+ "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+ "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "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/strip-ansi": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.2.2"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "inline-style-parser": "0.2.7"
+ }
+ },
+ "node_modules/styled-jsx": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz",
+ "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==",
+ "license": "MIT",
+ "dependencies": {
+ "client-only": "0.0.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "peerDependencies": {
+ "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "@babel/core": {
+ "optional": true
+ },
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/swr": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/swr/-/swr-2.4.1.tgz",
+ "integrity": "sha512-2CC6CiKQtEwaEeNiqWTAw9PGykW8SR5zZX8MZk6TeAvEAnVS7Visz8WzphqgtQ8v2xz/4Q5K+j+SeMaKXeeQIA==",
+ "license": "MIT",
+ "dependencies": {
+ "dequal": "^2.0.3",
+ "use-sync-external-store": "^1.6.0"
+ },
+ "peerDependencies": {
+ "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/tailwind-merge": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz",
+ "integrity": "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/dcastil"
+ }
+ },
+ "node_modules/tailwindcss": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.0.tgz",
+ "integrity": "sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==",
+ "devOptional": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/tapable": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz",
+ "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/throttleit": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz",
+ "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/tinyexec": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.3.tgz",
+ "integrity": "sha512-g62dB+w1/OEFnPvmX0yd/HnetYITOL+1nJW7kitOycOeAvmbWC/nu0fwmmQ/kupNojqExzyC/T++pST/jRJ2mQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.16",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
+ "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
+ "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/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "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==",
+ "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==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/ts-api-utils": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
+ "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.12"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4"
+ }
+ },
+ "node_modules/tsconfig-paths": {
+ "version": "3.15.0",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
+ "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.2",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "node_modules/tsconfig-paths/node_modules/json5": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
+ "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typed-array-buffer": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
+ "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/typed-array-byte-length": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
+ "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-byte-offset": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
+ "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.15",
+ "reflect.getprototypeof": "^1.0.9"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz",
+ "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.9",
+ "for-each": "^0.3.5",
+ "gopd": "^1.2.0",
+ "is-typed-array": "^1.1.15",
+ "possible-typed-array-names": "^1.1.0",
+ "reflect.getprototypeof": "^1.0.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz",
+ "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/typescript-eslint": {
+ "version": "8.60.0",
+ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.60.0.tgz",
+ "integrity": "sha512-9f65qWLZdAW9m1JaxBDUHcqRUfL8bkxxXL7XxEfI+F09q56PkBvIfCjLF3yInsDM/BBmwkqmCQdCZe/RYlIWEw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/eslint-plugin": "8.60.0",
+ "@typescript-eslint/parser": "8.60.0",
+ "@typescript-eslint/typescript-estree": "8.60.0",
+ "@typescript-eslint/utils": "8.60.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/unbox-primitive": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
+ "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "which-boxed-primitive": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "7.24.6",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz",
+ "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/unified": {
+ "version": "11.0.5",
+ "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz",
+ "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==",
+ "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==",
+ "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==",
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-remove-position": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz",
+ "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-visit": "^5.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==",
+ "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==",
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unrs-resolver": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.12.2.tgz",
+ "integrity": "sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "napi-postinstall": "^0.3.4"
+ },
+ "funding": {
+ "url": "https://opencollective.com/unrs-resolver"
+ },
+ "optionalDependencies": {
+ "@unrs/resolver-binding-android-arm-eabi": "1.12.2",
+ "@unrs/resolver-binding-android-arm64": "1.12.2",
+ "@unrs/resolver-binding-darwin-arm64": "1.12.2",
+ "@unrs/resolver-binding-darwin-x64": "1.12.2",
+ "@unrs/resolver-binding-freebsd-x64": "1.12.2",
+ "@unrs/resolver-binding-linux-arm-gnueabihf": "1.12.2",
+ "@unrs/resolver-binding-linux-arm-musleabihf": "1.12.2",
+ "@unrs/resolver-binding-linux-arm64-gnu": "1.12.2",
+ "@unrs/resolver-binding-linux-arm64-musl": "1.12.2",
+ "@unrs/resolver-binding-linux-loong64-gnu": "1.12.2",
+ "@unrs/resolver-binding-linux-loong64-musl": "1.12.2",
+ "@unrs/resolver-binding-linux-ppc64-gnu": "1.12.2",
+ "@unrs/resolver-binding-linux-riscv64-gnu": "1.12.2",
+ "@unrs/resolver-binding-linux-riscv64-musl": "1.12.2",
+ "@unrs/resolver-binding-linux-s390x-gnu": "1.12.2",
+ "@unrs/resolver-binding-linux-x64-gnu": "1.12.2",
+ "@unrs/resolver-binding-linux-x64-musl": "1.12.2",
+ "@unrs/resolver-binding-openharmony-arm64": "1.12.2",
+ "@unrs/resolver-binding-wasm32-wasi": "1.12.2",
+ "@unrs/resolver-binding-win32-arm64-msvc": "1.12.2",
+ "@unrs/resolver-binding-win32-ia32-msvc": "1.12.2",
+ "@unrs/resolver-binding-win32-x64-msvc": "1.12.2"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
+ "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/update-check": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.4.tgz",
+ "integrity": "sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "registry-auth-token": "3.3.2",
+ "registry-url": "3.1.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/use-callback-ref": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz",
+ "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/use-sidecar": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz",
+ "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "detect-node-es": "^1.1.0",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/use-sync-external-store": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz",
+ "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile-location": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz",
+ "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "vfile": "^6.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==",
+ "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/web-namespaces": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz",
+ "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/which-boxed-primitive": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
+ "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-bigint": "^1.1.0",
+ "is-boolean-object": "^1.2.1",
+ "is-number-object": "^1.1.1",
+ "is-string": "^1.1.1",
+ "is-symbol": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-builtin-type": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
+ "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "function.prototype.name": "^1.1.6",
+ "has-tostringtag": "^1.0.2",
+ "is-async-function": "^2.0.0",
+ "is-date-object": "^1.1.0",
+ "is-finalizationregistry": "^1.1.0",
+ "is-generator-function": "^1.0.10",
+ "is-regex": "^1.2.1",
+ "is-weakref": "^1.0.2",
+ "isarray": "^2.0.5",
+ "which-boxed-primitive": "^1.1.0",
+ "which-collection": "^1.0.2",
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-collection": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
+ "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-map": "^2.0.3",
+ "is-set": "^2.0.3",
+ "is-weakmap": "^2.0.2",
+ "is-weakset": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.21",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.21.tgz",
+ "integrity": "sha512-zbRA8cVm6io/d5W8uIe2hblzN76/Wm3v/yiythQvr+dpBWeqhPSWIDNj4zOyHi4zKbMK6DN34Xsr9jPHJERAEw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.9",
+ "call-bound": "^1.0.4",
+ "for-each": "^0.3.5",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/widest-line": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz",
+ "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "string-width": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-styles": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "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/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/zod": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz",
+ "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==",
+ "license": "MIT",
+ "peer": true,
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/zod-validation-error": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz",
+ "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "zod": "^3.25.0 || ^4.0.0"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ }
+ }
+}
diff --git a/website/package.json b/website/package.json
new file mode 100644
index 0000000..978a1ec
--- /dev/null
+++ b/website/package.json
@@ -0,0 +1,46 @@
+{
+ "name": "website",
+ "version": "0.0.0",
+ "private": true,
+ "scripts": {
+ "build": "next build",
+ "dev": "next dev",
+ "start": "serve out",
+ "types:check": "fumadocs-mdx && next typegen && tsc --noEmit",
+ "postinstall": "fumadocs-mdx",
+ "lint": "eslint"
+ },
+ "dependencies": {
+ "@orama/orama": "^3.1.18",
+ "fumadocs-core": "16.9.3",
+ "fumadocs-mdx": "15.0.10",
+ "fumadocs-ui": "16.9.3",
+ "lucide-react": "^1.17.0",
+ "next": "16.2.6",
+ "react": "^19.2.6",
+ "react-dom": "^19.2.6",
+ "tailwind-merge": "^3.6.0",
+ "flexsearch": "^0.8.212",
+ "zod": "^4.4.3",
+ "class-variance-authority": "^0.7.1",
+ "remark": "^15.0.1",
+ "remark-gfm": "^4.0.1",
+ "remark-rehype": "^11.1.2",
+ "hast-util-to-jsx-runtime": "^2.3.6",
+ "unist-util-visit": "^5.1.0"
+ },
+ "devDependencies": {
+ "@tailwindcss/postcss": "^4.3.0",
+ "@types/mdx": "^2.0.13",
+ "@types/node": "^25.9.1",
+ "@types/react": "^19.2.15",
+ "@types/react-dom": "^19.2.3",
+ "postcss": "^8.5.15",
+ "serve": "^14.2.6",
+ "tailwindcss": "^4.3.0",
+ "typescript": "^6.0.3",
+ "eslint-config-next": "16.2.6",
+ "eslint": "^9.39.4",
+ "@types/hast": "^3.0.4"
+ }
+}
\ No newline at end of file
diff --git a/website/postcss.config.mjs b/website/postcss.config.mjs
new file mode 100644
index 0000000..297374d
--- /dev/null
+++ b/website/postcss.config.mjs
@@ -0,0 +1,7 @@
+const config = {
+ plugins: {
+ '@tailwindcss/postcss': {},
+ },
+};
+
+export default config;
diff --git a/website/source.config.ts b/website/source.config.ts
new file mode 100644
index 0000000..a35628a
--- /dev/null
+++ b/website/source.config.ts
@@ -0,0 +1,23 @@
+import { defineConfig, defineDocs } from 'fumadocs-mdx/config';
+import { metaSchema, pageSchema } from 'fumadocs-core/source/schema';
+
+// You can customize Zod schemas for frontmatter and `meta.json` here
+// see https://fumadocs.dev/docs/mdx/collections
+export const docs = defineDocs({
+ dir: 'content/docs',
+ docs: {
+ schema: pageSchema,
+ postprocess: {
+ includeProcessedMarkdown: true,
+ },
+ },
+ meta: {
+ schema: metaSchema,
+ },
+});
+
+export default defineConfig({
+ mdxOptions: {
+ // MDX options
+ },
+});
diff --git a/website/src/app/(home)/layout.tsx b/website/src/app/(home)/layout.tsx
new file mode 100644
index 0000000..77379fa
--- /dev/null
+++ b/website/src/app/(home)/layout.tsx
@@ -0,0 +1,6 @@
+import { HomeLayout } from 'fumadocs-ui/layouts/home';
+import { baseOptions } from '@/lib/layout.shared';
+
+export default function Layout({ children }: LayoutProps<'/'>) {
+ return {children} ;
+}
diff --git a/website/src/app/(home)/page.tsx b/website/src/app/(home)/page.tsx
new file mode 100644
index 0000000..c936084
--- /dev/null
+++ b/website/src/app/(home)/page.tsx
@@ -0,0 +1,16 @@
+import Link from 'next/link';
+
+export default function HomePage() {
+ return (
+
+
Hello World
+
+ You can open{' '}
+
+ /docs
+ {' '}
+ and see the documentation.
+
+
+ );
+}
diff --git a/website/src/app/api/search/route.ts b/website/src/app/api/search/route.ts
new file mode 100644
index 0000000..aaaff7f
--- /dev/null
+++ b/website/src/app/api/search/route.ts
@@ -0,0 +1,9 @@
+import { source } from '@/lib/source';
+import { createFromSource } from 'fumadocs-core/search/server';
+
+export const revalidate = false;
+
+export const { staticGET: GET } = createFromSource(source, {
+ // https://docs.orama.com/docs/orama-js/supported-languages
+ language: 'english',
+});
diff --git a/website/src/app/docs/[[...slug]]/page.tsx b/website/src/app/docs/[[...slug]]/page.tsx
new file mode 100644
index 0000000..53ce219
--- /dev/null
+++ b/website/src/app/docs/[[...slug]]/page.tsx
@@ -0,0 +1,63 @@
+import { getPageImage, getPageMarkdownUrl, source } from '@/lib/source';
+import {
+ DocsBody,
+ DocsDescription,
+ DocsPage,
+ DocsTitle,
+ MarkdownCopyButton,
+ ViewOptionsPopover,
+} from 'fumadocs-ui/layouts/docs/page';
+import { notFound } from 'next/navigation';
+import { getMDXComponents } from '@/components/mdx';
+import type { Metadata } from 'next';
+import { createRelativeLink } from 'fumadocs-ui/mdx';
+import { gitConfig } from '@/lib/shared';
+
+export default async function Page(props: PageProps<'/docs/[[...slug]]'>) {
+ const params = await props.params;
+ const page = source.getPage(params.slug);
+ if (!page) notFound();
+
+ const MDX = page.data.body;
+ const markdownUrl = getPageMarkdownUrl(page).url;
+
+ return (
+
+ {page.data.title}
+ {page.data.description}
+
+
+
+
+
+
+
+
+ );
+}
+
+export async function generateStaticParams() {
+ return source.generateParams();
+}
+
+export async function generateMetadata(props: PageProps<'/docs/[[...slug]]'>): Promise {
+ const params = await props.params;
+ const page = source.getPage(params.slug);
+ if (!page) notFound();
+
+ return {
+ title: page.data.title,
+ description: page.data.description,
+ openGraph: {
+ images: getPageImage(page).url,
+ },
+ };
+}
diff --git a/website/src/app/docs/layout.tsx b/website/src/app/docs/layout.tsx
new file mode 100644
index 0000000..a373143
--- /dev/null
+++ b/website/src/app/docs/layout.tsx
@@ -0,0 +1,11 @@
+import { source } from '@/lib/source';
+import { DocsLayout } from 'fumadocs-ui/layouts/docs';
+import { baseOptions } from '@/lib/layout.shared';
+
+export default function Layout({ children }: LayoutProps<'/docs'>) {
+ return (
+
+ {children}
+
+ );
+}
diff --git a/website/src/app/global.css b/website/src/app/global.css
new file mode 100644
index 0000000..f86f3c9
--- /dev/null
+++ b/website/src/app/global.css
@@ -0,0 +1,12 @@
+@import 'tailwindcss';
+@import 'fumadocs-ui/css/neutral.css';
+@import 'fumadocs-ui/css/preset.css';
+
+html {
+ scrollbar-gutter: stable;
+}
+
+html > body[data-scroll-locked] {
+ margin-right: 0px !important;
+ --removed-body-scroll-bar-size: 0px !important;
+}
diff --git a/website/src/app/layout.tsx b/website/src/app/layout.tsx
new file mode 100644
index 0000000..fffc0a5
--- /dev/null
+++ b/website/src/app/layout.tsx
@@ -0,0 +1,17 @@
+import { Inter } from 'next/font/google';
+import { Provider } from '@/components/provider';
+import './global.css';
+
+const inter = Inter({
+ subsets: ['latin'],
+});
+
+export default function Layout({ children }: LayoutProps<'/'>) {
+ return (
+
+
+ {children}
+
+
+ );
+}
diff --git a/website/src/app/llms-full.txt/route.ts b/website/src/app/llms-full.txt/route.ts
new file mode 100644
index 0000000..d494d2c
--- /dev/null
+++ b/website/src/app/llms-full.txt/route.ts
@@ -0,0 +1,10 @@
+import { getLLMText, source } from '@/lib/source';
+
+export const revalidate = false;
+
+export async function GET() {
+ const scan = source.getPages().map(getLLMText);
+ const scanned = await Promise.all(scan);
+
+ return new Response(scanned.join('\n\n'));
+}
diff --git a/website/src/app/llms.mdx/docs/[[...slug]]/route.ts b/website/src/app/llms.mdx/docs/[[...slug]]/route.ts
new file mode 100644
index 0000000..012e877
--- /dev/null
+++ b/website/src/app/llms.mdx/docs/[[...slug]]/route.ts
@@ -0,0 +1,23 @@
+import { getLLMText, getPageMarkdownUrl, source } from '@/lib/source';
+import { notFound } from 'next/navigation';
+
+export const revalidate = false;
+
+export async function GET(_req: Request, { params }: RouteContext<'/llms.mdx/docs/[[...slug]]'>) {
+ const { slug } = await params;
+ // remove the appended "content.md"
+ const page = source.getPage(slug?.slice(0, -1));
+ if (!page) notFound();
+
+ return new Response(await getLLMText(page), {
+ headers: {
+ 'Content-Type': 'text/markdown',
+ },
+ });
+}
+
+export function generateStaticParams() {
+ return source.getPages().map((page) => ({
+ slug: getPageMarkdownUrl(page).segments,
+ }));
+}
diff --git a/website/src/app/llms.txt/route.ts b/website/src/app/llms.txt/route.ts
new file mode 100644
index 0000000..fc80cb6
--- /dev/null
+++ b/website/src/app/llms.txt/route.ts
@@ -0,0 +1,8 @@
+import { source } from '@/lib/source';
+import { llms } from 'fumadocs-core/source';
+
+export const revalidate = false;
+
+export function GET() {
+ return new Response(llms(source).index());
+}
diff --git a/website/src/app/og/docs/[...slug]/route.tsx b/website/src/app/og/docs/[...slug]/route.tsx
new file mode 100644
index 0000000..877166d
--- /dev/null
+++ b/website/src/app/og/docs/[...slug]/route.tsx
@@ -0,0 +1,28 @@
+import { getPageImage, source } from '@/lib/source';
+import { notFound } from 'next/navigation';
+import { ImageResponse } from 'next/og';
+import { generate as DefaultImage } from 'fumadocs-ui/og';
+import { appName } from '@/lib/shared';
+
+export const revalidate = false;
+
+export async function GET(_req: Request, { params }: RouteContext<'/og/docs/[...slug]'>) {
+ const { slug } = await params;
+ const page = source.getPage(slug.slice(0, -1));
+ if (!page) notFound();
+
+ return new ImageResponse(
+ ,
+ {
+ width: 1200,
+ height: 630,
+ },
+ );
+}
+
+export function generateStaticParams() {
+ return source.getPages().map((page) => ({
+ lang: page.locale,
+ slug: getPageImage(page).segments,
+ }));
+}
diff --git a/website/src/components/markdown.tsx b/website/src/components/markdown.tsx
new file mode 100644
index 0000000..67c4902
--- /dev/null
+++ b/website/src/components/markdown.tsx
@@ -0,0 +1,116 @@
+import { remark } from 'remark';
+import remarkGfm from 'remark-gfm';
+import remarkRehype from 'remark-rehype';
+import { toJsxRuntime } from 'hast-util-to-jsx-runtime';
+import {
+ Children,
+ type ComponentProps,
+ type ReactElement,
+ type ReactNode,
+ Suspense,
+ use,
+ useDeferredValue,
+} from 'react';
+import { Fragment, jsx, jsxs } from 'react/jsx-runtime';
+import { DynamicCodeBlock } from 'fumadocs-ui/components/dynamic-codeblock';
+import defaultMdxComponents from 'fumadocs-ui/mdx';
+import { visit } from 'unist-util-visit';
+import type { ElementContent, Root, RootContent } from 'hast';
+
+export interface Processor {
+ process: (content: string) => Promise;
+}
+
+export function rehypeWrapWords() {
+ return (tree: Root) => {
+ visit(tree, ['text', 'element'], (node, index, parent) => {
+ if (node.type === 'element' && node.tagName === 'pre') return 'skip';
+ if (node.type !== 'text' || !parent || index === undefined) return;
+
+ const words = node.value.split(/(?=\s)/);
+
+ // Create new span nodes for each word and whitespace
+ const newNodes: ElementContent[] = words.flatMap((word) => {
+ if (word.length === 0) return [];
+
+ return {
+ type: 'element',
+ tagName: 'span',
+ properties: {
+ class: 'animate-fd-fade-in',
+ },
+ children: [{ type: 'text', value: word }],
+ };
+ });
+
+ Object.assign(node, {
+ type: 'element',
+ tagName: 'span',
+ properties: {},
+ children: newNodes,
+ } satisfies RootContent);
+ return 'skip';
+ });
+ };
+}
+
+function createProcessor(): Processor {
+ const processor = remark().use(remarkGfm).use(remarkRehype).use(rehypeWrapWords);
+
+ return {
+ async process(content) {
+ const nodes = processor.parse({ value: content });
+ const hast = await processor.run(nodes);
+
+ return toJsxRuntime(hast, {
+ development: false,
+ jsx,
+ jsxs,
+ Fragment,
+ components: {
+ ...defaultMdxComponents,
+ pre: Pre,
+ img: undefined, // use JSX
+ },
+ });
+ },
+ };
+}
+
+function Pre(props: ComponentProps<'pre'>) {
+ const code = Children.only(props.children) as ReactElement;
+ const codeProps = code.props as ComponentProps<'code'>;
+ const content = codeProps.children;
+ if (typeof content !== 'string') return null;
+
+ let lang =
+ codeProps.className
+ ?.split(' ')
+ .find((v) => v.startsWith('language-'))
+ ?.slice('language-'.length) ?? 'text';
+
+ if (lang === 'mdx') lang = 'md';
+
+ return ;
+}
+
+const processor = createProcessor();
+
+export function Markdown({ text }: { text: string }) {
+ const deferredText = useDeferredValue(text);
+
+ return (
+ {text}}>
+
+
+ );
+}
+
+const cache = new Map>();
+
+function Renderer({ text }: { text: string }) {
+ const result = cache.get(text) ?? processor.process(text);
+ cache.set(text, result);
+
+ return use(result);
+}
diff --git a/website/src/components/mdx.tsx b/website/src/components/mdx.tsx
new file mode 100644
index 0000000..a640575
--- /dev/null
+++ b/website/src/components/mdx.tsx
@@ -0,0 +1,15 @@
+import defaultMdxComponents from 'fumadocs-ui/mdx';
+import type { MDXComponents } from 'mdx/types';
+
+export function getMDXComponents(components?: MDXComponents) {
+ return {
+ ...defaultMdxComponents,
+ ...components,
+ } satisfies MDXComponents;
+}
+
+export const useMDXComponents = getMDXComponents;
+
+declare global {
+ type MDXProvidedComponents = ReturnType;
+}
diff --git a/website/src/components/provider.tsx b/website/src/components/provider.tsx
new file mode 100644
index 0000000..522282b
--- /dev/null
+++ b/website/src/components/provider.tsx
@@ -0,0 +1,8 @@
+'use client';
+import SearchDialog from '@/components/search';
+import { RootProvider } from 'fumadocs-ui/provider/next';
+import { type ReactNode } from 'react';
+
+export function Provider({ children }: { children: ReactNode }) {
+ return {children} ;
+}
diff --git a/website/src/components/search.tsx b/website/src/components/search.tsx
new file mode 100644
index 0000000..1f70420
--- /dev/null
+++ b/website/src/components/search.tsx
@@ -0,0 +1,46 @@
+'use client';
+import {
+ SearchDialog,
+ SearchDialogClose,
+ SearchDialogContent,
+ SearchDialogHeader,
+ SearchDialogIcon,
+ SearchDialogInput,
+ SearchDialogList,
+ SearchDialogOverlay,
+ type SharedProps,
+} from 'fumadocs-ui/components/dialog/search';
+import { useDocsSearch } from 'fumadocs-core/search/client';
+import { create } from '@orama/orama';
+import { useI18n } from 'fumadocs-ui/contexts/i18n';
+
+function initOrama() {
+ return create({
+ schema: { _: 'string' },
+ // https://docs.orama.com/docs/orama-js/supported-languages
+ language: 'english',
+ });
+}
+
+export default function DefaultSearchDialog(props: SharedProps) {
+ const { locale } = useI18n(); // (optional) for i18n
+ const { search, setSearch, query } = useDocsSearch({
+ type: 'static',
+ initOrama,
+ locale,
+ });
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/website/src/components/ui/button.tsx b/website/src/components/ui/button.tsx
new file mode 100644
index 0000000..7c504c7
--- /dev/null
+++ b/website/src/components/ui/button.tsx
@@ -0,0 +1,29 @@
+import { cva, type VariantProps } from 'class-variance-authority';
+
+const variants = {
+ primary:
+ 'bg-fd-primary text-fd-primary-foreground hover:bg-fd-primary/80 disabled:bg-fd-secondary disabled:text-fd-secondary-foreground',
+ outline: 'border hover:bg-fd-accent hover:text-fd-accent-foreground',
+ ghost: 'hover:bg-fd-accent hover:text-fd-accent-foreground',
+ secondary:
+ 'border bg-fd-secondary text-fd-secondary-foreground hover:bg-fd-accent hover:text-fd-accent-foreground',
+} as const;
+
+export const buttonVariants = cva(
+ 'inline-flex items-center justify-center rounded-md p-2 text-sm font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring',
+ {
+ variants: {
+ variant: variants,
+ // fumadocs use `color` instead of `variant`
+ color: variants,
+ size: {
+ sm: 'gap-1 px-2 py-1.5 text-xs',
+ icon: 'p-1.5 [&_svg]:size-5',
+ 'icon-sm': 'p-1.5 [&_svg]:size-4.5',
+ 'icon-xs': 'p-1 [&_svg]:size-4',
+ },
+ },
+ },
+);
+
+export type ButtonProps = VariantProps;
diff --git a/website/src/lib/cn.ts b/website/src/lib/cn.ts
new file mode 100644
index 0000000..ba66fd2
--- /dev/null
+++ b/website/src/lib/cn.ts
@@ -0,0 +1 @@
+export { twMerge as cn } from 'tailwind-merge';
diff --git a/website/src/lib/layout.shared.tsx b/website/src/lib/layout.shared.tsx
new file mode 100644
index 0000000..88b9ca8
--- /dev/null
+++ b/website/src/lib/layout.shared.tsx
@@ -0,0 +1,12 @@
+import type { BaseLayoutProps } from 'fumadocs-ui/layouts/shared';
+import { appName, gitConfig } from './shared';
+
+export function baseOptions(): BaseLayoutProps {
+ return {
+ nav: {
+ // JSX supported
+ title: appName,
+ },
+ githubUrl: `https://github.com/${gitConfig.user}/${gitConfig.repo}`,
+ };
+}
diff --git a/website/src/lib/shared.ts b/website/src/lib/shared.ts
new file mode 100644
index 0000000..812926e
--- /dev/null
+++ b/website/src/lib/shared.ts
@@ -0,0 +1,11 @@
+export const appName = 'My App';
+export const docsRoute = '/docs';
+export const docsImageRoute = '/og/docs';
+export const docsContentRoute = '/llms.mdx/docs';
+
+// fill this with your actual GitHub info, for example:
+export const gitConfig = {
+ user: 'fuma-nama',
+ repo: 'fumadocs',
+ branch: 'main',
+};
diff --git a/website/src/lib/source.ts b/website/src/lib/source.ts
new file mode 100644
index 0000000..f5d0eae
--- /dev/null
+++ b/website/src/lib/source.ts
@@ -0,0 +1,36 @@
+import { docs } from 'collections/server';
+import { loader } from 'fumadocs-core/source';
+import { docsContentRoute, docsImageRoute, docsRoute } from './shared';
+
+// See https://fumadocs.dev/docs/headless/source-api for more info
+export const source = loader({
+ baseUrl: docsRoute,
+ source: docs.toFumadocsSource(),
+ plugins: [],
+});
+
+export function getPageImage(page: (typeof source)['$inferPage']) {
+ const segments = [...page.slugs, 'image.png'];
+
+ return {
+ segments,
+ url: `${docsImageRoute}/${segments.join('/')}`,
+ };
+}
+
+export function getPageMarkdownUrl(page: (typeof source)['$inferPage']) {
+ const segments = [...page.slugs, 'content.md'];
+
+ return {
+ segments,
+ url: `${docsContentRoute}/${segments.join('/')}`,
+ };
+}
+
+export async function getLLMText(page: (typeof source)['$inferPage']) {
+ const processed = await page.data.getText('processed');
+
+ return `# ${page.data.title} (${page.url})
+
+${processed}`;
+}
diff --git a/website/tsconfig.json b/website/tsconfig.json
new file mode 100644
index 0000000..59c41ba
--- /dev/null
+++ b/website/tsconfig.json
@@ -0,0 +1,45 @@
+{
+ "compilerOptions": {
+ "target": "ESNext",
+ "lib": [
+ "dom",
+ "dom.iterable",
+ "esnext"
+ ],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "module": "esnext",
+ "moduleResolution": "bundler",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "react-jsx",
+ "incremental": true,
+ "paths": {
+ "@/*": [
+ "./src/*"
+ ],
+ "collections/*": [
+ "./.source/*"
+ ]
+ },
+ "plugins": [
+ {
+ "name": "next"
+ }
+ ]
+ },
+ "include": [
+ "next-env.d.ts",
+ "**/*.ts",
+ "**/*.tsx",
+ ".next/types/**/*.ts",
+ ".next/dev/types/**/*.ts"
+ ],
+ "exclude": [
+ "node_modules"
+ ]
+}
\ No newline at end of file
From a43fdb2d2718423c882af4c01b0350ebd091de40 Mon Sep 17 00:00:00 2001
From: enixCode <58286681+enixCode@users.noreply.github.com>
Date: Sat, 30 May 2026 00:58:08 +0200
Subject: [PATCH 02/10] docs(fumadocs): port the 5 guides + intro to MDX
content
- Convert docs/guides/*.md (quickstart, extract, detached, security,
gvisor-kata) into website/content/docs/*.mdx, deriving the frontmatter
title from each H1.
- Replace the scaffold placeholder index.mdx with a real light-runner intro,
drop the default test.mdx.
- Add content/docs/meta.json to order the sidebar.
- next build renders all 6 docs pages as a clean static export.
build with cc
---
website/content/docs/detached.mdx | 142 +++++++++++++++++++++++++++
website/content/docs/extract.mdx | 125 +++++++++++++++++++++++
website/content/docs/gvisor-kata.mdx | 134 +++++++++++++++++++++++++
website/content/docs/index.mdx | 31 ++++--
website/content/docs/meta.json | 3 +
website/content/docs/quickstart.mdx | 58 +++++++++++
website/content/docs/security.mdx | 117 ++++++++++++++++++++++
website/content/docs/test.mdx | 17 ----
8 files changed, 602 insertions(+), 25 deletions(-)
create mode 100644 website/content/docs/detached.mdx
create mode 100644 website/content/docs/extract.mdx
create mode 100644 website/content/docs/gvisor-kata.mdx
create mode 100644 website/content/docs/meta.json
create mode 100644 website/content/docs/quickstart.mdx
create mode 100644 website/content/docs/security.mdx
delete mode 100644 website/content/docs/test.mdx
diff --git a/website/content/docs/detached.mdx b/website/content/docs/detached.mdx
new file mode 100644
index 0000000..fec33e4
--- /dev/null
+++ b/website/content/docs/detached.mdx
@@ -0,0 +1,142 @@
+---
+title: "Detached runs"
+---
+
+A standard `runner.run(...)` ties the container's lifetime to the host Node process: kill the host, the run dies. Detached mode lets the container outlive the host.
+
+Use it when:
+
+- A run can take **hours** (training, batch jobs, CI-like workloads) and you cannot afford to lose it on a host crash or deploy.
+- You want a long-poll architecture where one process **starts** runs and a different process **collects** results.
+- You want to spawn a job, return immediately, and reconnect later from anywhere on the same machine.
+
+## Start a detached run
+
+```ts
+import { DockerRunner } from 'light-runner';
+
+const runner = new DockerRunner();
+
+const execution = runner.run({
+ image: 'python:3.12-alpine',
+ command: 'python long_job.py',
+ dir: './job',
+ timeout: 6 * 60 * 60 * 1000, // 6 hours
+ extract: [{ from: '/app/result.json', to: './out' }],
+ detached: true,
+});
+
+console.log('started, id =', execution.id);
+// you can let this process exit; the container keeps running
+```
+
+## Reconnect to a running detached job
+
+```ts
+const ex = DockerRunner.attach('light-runner-abc123def456');
+if (!ex) {
+ console.error('no state file for that id');
+} else {
+ const result = await ex.result;
+ console.log(result.success, result.exitCode, result.extracted);
+}
+```
+
+`attach(id)` returns `null` when no state file exists for that id (typo'd id, or the run was reaped).
+
+## Listing known runs
+
+```ts
+import { DockerRunner } from 'light-runner';
+
+for (const state of DockerRunner.list()) {
+ console.log(state.id, state.status, state.startedAt, state.image);
+}
+```
+
+## Detached contract differences
+
+| Capability | Attached | Detached |
+|---|---|---|
+| `input` (stdin) | Supported | **Rejected at API boundary** (host process death loses stdin) |
+| `onLog` callback | Streams stdout/stderr lines | **Not called** (stream lost on host death; use `docker logs ` instead) |
+| `cancel()` / signal | Best-effort kill | Best-effort kill, plus state file marked `cancelled` |
+| `extract` | Runs after exit | Runs after exit, requested set persisted in state file |
+
+## State file lifecycle
+
+Every detached run writes one JSON file under `~/.light-runner/state/.json` (or `LIGHT_RUNNER_STATE_DIR`):
+
+```jsonc
+{
+ "id": "light-runner-abc123def456",
+ "container": "light-runner-abc123def456",
+ "volume": "light-runner-abc123def456",
+ "image": "python:3.12-alpine",
+ "workdir": "/app",
+ "command": "python long_job.py",
+ "timeout": 21600000,
+ "extract": [{"from": "/app/result.json", "to": "./out"}],
+ "startedAt": "2026-04-27T10:15:00.000Z",
+ "status": "running"
+}
+```
+
+Status transitions:
+
+```
+running ──┬─> exited (clean exit, exitCode + finishedAt + durationMs added)
+ ├─> cancelled (cancel() / abort, exitCode set, cancelled: true)
+ └─> failed (setup error, container vanished, etc.)
+```
+
+Writes are atomic via temp + rename, so a host crash mid-write does not corrupt the file.
+
+## Cross-host resume
+
+The state dir is just JSON files under a fixed path. Two ways to make it shared:
+
+1. **Same machine, different process trees**: same `LIGHT_RUNNER_STATE_DIR`, no extra setup. Process A starts the run, process B re-attaches by id.
+2. **Different machines**: mount the state dir on a shared filesystem (NFS, EFS, networked volume). The Docker daemon must be the **same one** on both hosts (they share the named volume + container by name).
+
+## Race-safe attach
+
+`attach(id)` is safe to call **immediately after** `runner.run({detached: true})` returns. The runner writes the state file synchronously inside `run()`, before any async setup, so the file always exists by the time the caller has the `Execution` handle. Internally, `attach` polls the docker daemon for ~3 seconds with `containerExists()` to absorb the gap between state-file-written and container-actually-created.
+
+## Reaping
+
+A long-running host eventually accumulates state files for finished runs. Two cleanup helpers:
+
+```ts
+// Reconcile state files with the docker daemon.
+// Mark `running` states as `failed` if their container has vanished.
+await DockerRunner.cleanupOrphanStates();
+
+// Sweep idle/exited containers + volumes tagged with the light-runner label.
+const { containers, volumes } = await DockerRunner.reapOrphans();
+console.log(`reaped ${containers} containers, ${volumes} volumes`);
+```
+
+`reapOrphans` removes resources older than `LIGHT_RUNNER_REAP_AGE_MS` (default 5 minutes). Safe to run on a shared docker host with unrelated workloads since it filters by the `light-runner.run-id` label.
+
+Run both on host startup, before accepting new work.
+
+## Stop, pause, resume
+
+Detached or attached, the same `Execution` API works:
+
+```ts
+await ex.stop({ signal: 'SIGTERM', grace: 10_000 }); // graceful, fall back to SIGKILL
+await ex.pause(); // freezes via cgroup, memory preserved
+await ex.resume(); // unfreezes
+ex.cancel(); // immediate kill, sync, fire-and-forget
+```
+
+`pause()` is intentionally not flagging `cancelled: true` — a paused run is expected to resume and complete normally.
+
+## Gotchas
+
+- **Stdin is gone.** `RunRequest.input` is rejected at the API boundary when `detached: true`. Pipe input through a file in `dir` instead.
+- **`onLog` is silent.** No live stream on host. Inspect `docker logs ` for stdout/stderr while the run is alive.
+- **State file ≠source of truth for liveness.** A `running` status with a vanished container = ghost run; `cleanupOrphanStates` is what reconciles that.
+- **Extract still runs**, but only when the host that holds the resolved promise sees the exit. Re-attached hosts see `extracted` in their `result` too.
diff --git a/website/content/docs/extract.mdx b/website/content/docs/extract.mdx
new file mode 100644
index 0000000..f704280
--- /dev/null
+++ b/website/content/docs/extract.mdx
@@ -0,0 +1,125 @@
+---
+title: "Extract files"
+---
+
+`extract` is the **only output channel** for files. Logs go to `onLog`, exit code goes to `result.exitCode`, structured output goes through stdout / extracted files. The library has no opinion on what your container does inside.
+
+## Basic usage
+
+```ts
+const execution = runner.run({
+ image: 'node:lts-alpine',
+ command: 'node build.js',
+ dir: './project',
+ extract: [
+ { from: '/app/dist', to: './out' }, // folder, recursive
+ { from: '/app/report.pdf', to: './out' }, // single file
+ { from: '/app/maybe-missing', to: './out' }, // missing -> reported, run still succeeds
+ ],
+});
+
+const result = await execution.result;
+console.log(result.extracted);
+// [
+// { from: '/app/dist', to: './out', status: 'ok', bytes: 124583 },
+// { from: '/app/report.pdf', to: './out', status: 'ok', bytes: 9421 },
+// { from: '/app/maybe-missing', to: './out', status: 'missing' },
+// ]
+```
+
+## Folder vs file semantics (rsync-like)
+
+| `from` is a... | Result |
+|---|---|
+| **Folder** | The **contents** of the folder land **directly in `to`** (no basename wrap). Equivalent to `rsync -a from/ to/` or `cp -r from/. to/`. All subdirectories and files are included recursively. |
+| **File** | The file lands as `to/basename(from)`. |
+
+Trailing slash is irrelevant: `'/app/dist'` and `'/app/dist/'` produce identical output.
+
+```ts
+extract: [
+ { from: '/app/dist', to: './out' }, // /app/dist/a.js -> ./out/a.js
+ { from: '/app/dist/', to: './out' }, // same as above
+ { from: '/app/report.pdf', to: './out' }, // -> ./out/report.pdf
+]
+```
+
+`to` is always a **destination directory**. It is auto-created via `fs.mkdirSync(to, { recursive: true })`.
+
+## Result statuses
+
+Each `extract` entry produces one `ExtractResult`:
+
+| `status` | Meaning |
+|-------------|----------------------------------------------------------|
+| `'ok'` | Archived and extracted. `bytes` reports the archive size.|
+| `'missing'` | `from` does not exist in the container. |
+| `'error'` | Cap exceeded, path traversal, mkdir failed, etc. The `error` field carries the reason. |
+
+A missing or errored entry **never fails the run**. The consumer inspects `result.extracted` and decides what to do.
+
+## Hard rules
+
+- **Path traversal rejected**: any segment containing `..` is refused before any container is spawned. `extract: [{ from: '/app/../etc/passwd', ... }]` → `status: 'error'` with `error: 'path traversal rejected (..)'`.
+- **Symlinks skipped**: a malicious container could craft a symlink whose target path exists on the host. The tar reader silently drops them.
+- **1 GiB per-entry cap**: enforced both **pre-flight** (`du -sb` inside the container) and **streamed** (byte counter in the host pipe). Above that, the entry is reported as `error` and the run still succeeds.
+- **Extract only on success**: skipped when `exitCode !== 0` or the run was cancelled. `result.extracted` is undefined in those cases.
+- **Disk-to-disk streaming**: the host never buffers the archive in Node RAM.
+
+## How extraction works internally
+
+1. After your container exits with code `0`, the runner spawns a **throwaway Alpine** sidecar with the same volume mounted read-only (no need to keep your image alive).
+2. A pre-flight script checks that `from` exists, computes its byte size with `du -sb`, refuses if over the cap.
+3. The sidecar runs `tar c` on `from` and pipes the archive to the host through a hijacked Docker stream.
+4. The host pipes that into the [`tar` extract](https://www.npmjs.com/package/tar) reader, which writes files into `to/` and counts bytes for the streamed cap check.
+5. The sidecar exits, AutoRemove tears it down, the runner returns `result.extracted`.
+
+## Common patterns
+
+### Capture structured output
+
+Have the container write a JSON file, extract it, parse it on the host:
+
+```ts
+// Inside the container:
+// import json
+// json.dump({'fib': fib(20)}, open('/app/result.json', 'w'))
+
+const result = await runner.run({
+ image: 'python:3.12-alpine',
+ command: 'python main.py',
+ dir: './solver',
+ extract: [{ from: '/app/result.json', to: './out' }],
+}).result;
+
+const data = JSON.parse(fs.readFileSync('./out/result.json', 'utf8'));
+```
+
+### Pull a build artefact
+
+```ts
+extract: [
+ { from: '/app/dist', to: './public' },
+ { from: '/app/coverage', to: './reports' },
+],
+```
+
+### Tolerate optional outputs
+
+Multiple entries with one missing is fine:
+
+```ts
+extract: [
+ { from: '/app/required.json', to: './out' },
+ { from: '/app/optional-extra', to: './out' }, // may not exist
+]
+
+const result = await execution.result;
+const required = result.extracted!.find(e => e.from === '/app/required.json');
+if (required?.status !== 'ok') throw new Error('required.json missing');
+```
+
+## See also
+
+- [`ExtractSpec`](/api/interfaces/ExtractSpec) and [`ExtractResult`](/api/interfaces/ExtractResult) in the API reference
+- [Security model](./security) — why symlinks and `..` segments are dropped
diff --git a/website/content/docs/gvisor-kata.mdx b/website/content/docs/gvisor-kata.mdx
new file mode 100644
index 0000000..8eea7f0
--- /dev/null
+++ b/website/content/docs/gvisor-kata.mdx
@@ -0,0 +1,134 @@
+---
+title: "gVisor & Kata Containers"
+---
+
+Default `runtime: 'runc'` shares the host kernel with the container. That is fast and convenient, but it means a kernel-level exploit inside the container can compromise the host. For genuinely hostile code, switch the runtime.
+
+## Choose the right tier
+
+| Runtime | Isolation | Performance | Status in light-runner |
+|---|---|---|---|
+| `runc` (default) | Linux namespaces + cgroups, shared kernel | Native | **Tested**, default for trusted/known code |
+| `runsc` (gVisor) | User-space syscall interception, smaller kernel attack surface | ~10-30% I/O overhead | **Tested**, recommended for hostile code |
+| `kata` (Kata Containers) | Lightweight VM per container, separate kernel | ~5-15% boot + I/O cost | **Option exposed but not yet validated in our test matrix** — open an issue if you run it in production |
+
+Switch via `RunnerOptions`:
+
+```ts
+const runner = new DockerRunner({ runtime: 'runsc' }); // or 'kata'
+```
+
+When the option is `runc` (or omitted), the runner does not pass a `Runtime` field to Docker, so you keep whatever the daemon's default is.
+
+## When to use gVisor
+
+Use it when **any** of these is true:
+
+- The code you run is **anonymous** (random user uploads, public CTF entries).
+- The code is **AI-generated** and you do not audit each call (LLM tool execution, agent runtimes).
+- You ship a **multi-tenant playground** and one tenant compromising the host would be a headline.
+- You handle PII or regulated data and the threat model includes "the running code is the adversary".
+
+You do **not** need gVisor when:
+
+- The code comes from your own CI / internal tooling and you trust the toolchain.
+- You build the image yourself from a known Dockerfile.
+- The performance cost is unacceptable (data-intensive batch jobs).
+
+## Install gVisor on Linux / WSL2
+
+gVisor does **not** run natively on macOS or Windows. On Windows, use Docker Desktop with the **WSL2 backend** — the `runsc` install lives inside the WSL2 distro, not the Windows host.
+
+```bash
+(
+ set -e
+ ARCH=$(uname -m)
+ URL=https://storage.googleapis.com/gvisor/releases/release/latest/${ARCH}
+ wget ${URL}/runsc ${URL}/runsc.sha512 \
+ ${URL}/containerd-shim-runsc-v1 ${URL}/containerd-shim-runsc-v1.sha512
+ sha512sum -c runsc.sha512 -c containerd-shim-runsc-v1.sha512
+ rm -f *.sha512
+ chmod a+rx runsc containerd-shim-runsc-v1
+ sudo mv runsc containerd-shim-runsc-v1 /usr/local/bin
+)
+sudo /usr/local/bin/runsc install
+sudo systemctl reload docker
+```
+
+`latest` is a rolling channel — gVisor ships frequent date-stamped releases (`release-YYYYMMDD.N`), no semantic version. Verify with `runsc --version`.
+
+After the daemon reload, test that Docker accepts the new runtime:
+
+```bash
+docker run --rm --runtime=runsc alpine:3.19 dmesg | head
+# Expect: gVisor-style kernel ring buffer, NOT the host's
+```
+
+Then in your code:
+
+```ts
+const runner = new DockerRunner({ runtime: 'runsc' });
+```
+
+## Performance notes
+
+`runsc` intercepts syscalls in user space, so it pays a tax on every syscall:
+
+| Workload | Approx. overhead vs runc |
+|---|---|
+| CPU-bound (no syscalls) | ~0% |
+| Read-heavy I/O | 10-15% |
+| Write-heavy I/O | 20-30% |
+| Network-heavy (small packets) | 25-40% |
+| Workloads spawning many processes | 30-50% |
+
+For agent-style runs (one container, one process tree, one set of files), the overhead is usually **invisible**. For tight inner loops on disk or network, benchmark before committing.
+
+## Kata Containers
+
+Kata runs each container inside a lightweight VM with its own kernel, giving you **VM-level isolation** at container-level UX.
+
+```ts
+const runner = new DockerRunner({ runtime: 'kata' });
+```
+
+We pass `runtime: 'kata'` straight through to Docker's `HostConfig.Runtime`. Docker then dispatches to whichever Kata shim is installed (`containerd-shim-kata-v2` or similar). The library does **not** validate that the runtime is installed; if it is missing, Docker returns a `CONTAINER_START_FAILED` error at run time.
+
+**The disclaimer** (also visible on the security note in the bespoke landing): we expose this option for users who already run Kata, but our CI does **not** install or test against Kata. If you adopt it in production, please open an issue with results — both successes and edge cases.
+
+Useful resources:
+
+- [Kata Containers project](https://github.com/kata-containers/kata-containers)
+- [Docker + Kata setup guide](https://github.com/kata-containers/kata-containers/blob/main/docs/install/docker/ubuntu-docker-install.md)
+
+## Verifying isolation
+
+A quick sanity check that the runtime actually changed:
+
+```ts
+const result = await runner.run({
+ image: 'alpine:3.19',
+ command: 'cat /proc/self/maps | head -5',
+ // gVisor-mapped binaries look very different from runc-mapped ones
+}).result;
+```
+
+Or look for the gVisor signature:
+
+```ts
+const result = await runner.run({
+ image: 'alpine:3.19',
+ command: 'dmesg | grep -i gvisor || echo "not gvisor"',
+}).result;
+```
+
+Under `runsc` you will see `gVisor` strings in `dmesg`. Under `runc`, you will see the host's kernel ring buffer.
+
+## Trade-offs summary
+
+| Want... | Use |
+|---|---|
+| Maximum speed, you trust the code | `runc` (default) |
+| Hard barrier against kernel exploits, willing to pay 10-30% I/O | `runsc` |
+| Full VM isolation, separate kernel | `kata` (un-validated, at your own risk) |
+| Air-gapped network on top of any of the above | `network: 'none'` on the request |
diff --git a/website/content/docs/index.mdx b/website/content/docs/index.mdx
index 1ede18e..4182167 100644
--- a/website/content/docs/index.mdx
+++ b/website/content/docs/index.mdx
@@ -1,13 +1,28 @@
---
-title: Hello World
-description: Your first document
+title: light-runner
+description: Run untrusted code in hardened Docker containers from Node.js.
---
-Welcome to the docs! You can start writing documents in `/content/docs`.
+light-runner is a single-responsibility Node.js library that runs code inside a hardened Docker container and returns the exit code plus any files you ask for. Domain-agnostic: no magic filenames, no forced output schema.
-## What is Next?
+## Install
-
-
-
-
+```bash
+npm install light-runner
+```
+
+## Quick taste
+
+```ts
+import { DockerRunner } from 'light-runner';
+
+const runner = new DockerRunner();
+const exec = runner.run({
+ image: 'node:20-alpine',
+ entrypoint: 'node -e "console.log(1 + 1)"',
+});
+const result = await exec.result;
+console.log(result.exitCode); // 0
+```
+
+Start with the [Quick start](/docs/quickstart), then explore [Extract files](/docs/extract), [Detached runs](/docs/detached), the [Security model](/docs/security), and [gVisor & Kata](/docs/gvisor-kata).
diff --git a/website/content/docs/meta.json b/website/content/docs/meta.json
new file mode 100644
index 0000000..5c4b662
--- /dev/null
+++ b/website/content/docs/meta.json
@@ -0,0 +1,3 @@
+{
+ "pages": ["index", "quickstart", "extract", "detached", "security", "gvisor-kata"]
+}
diff --git a/website/content/docs/quickstart.mdx b/website/content/docs/quickstart.mdx
new file mode 100644
index 0000000..00a5573
--- /dev/null
+++ b/website/content/docs/quickstart.mdx
@@ -0,0 +1,58 @@
+---
+title: "Quick start"
+---
+
+Run untrusted code in a hardened Docker container, get back the exit code, logs, and any files the container produced. That is the whole library.
+
+## Install
+
+```bash
+npm install light-runner
+```
+
+Requirements:
+
+- Node.js >= 22
+- A running Docker daemon (Docker Desktop on macOS / Windows, `dockerd` on Linux)
+- Optional: [gVisor](./gvisor-kata) for kernel-level isolation
+
+## Run something
+
+```ts
+import { DockerRunner } from 'light-runner';
+
+const runner = new DockerRunner({ memory: '512m', cpus: '1' });
+
+const execution = runner.run({
+ image: 'python:3.12-alpine',
+ command: 'python main.py',
+ dir: './my-project',
+ input: { task: 'compute', n: 20 },
+ timeout: 30_000,
+ extract: [{ from: '/app/result.json', to: './out' }],
+});
+
+const result = await execution.result;
+
+result.success // true if exitCode === 0, not cancelled, not timed out
+result.exitCode // container exit code
+result.duration // ms
+result.cancelled // true if cancel() / signal aborted
+result.extracted // [{ from, to, status, bytes? }, ...] if extract was set
+```
+
+## What happens under the hood
+
+1. A named Docker volume is created (`light-runner-`).
+2. The folder at `dir` is streamed into the volume via a throwaway Alpine seeder, skipping `.git`, `node_modules`, `dist`, `build`, `.next`, `.cache`, `.turbo`, `coverage`, and **all symlinks**.
+3. Your image runs with the volume mounted at `workdir` (default `/app`), strict isolation flags, and a PID / memory / CPU cap.
+4. On exit-code 0, each `extract` entry is streamed out via `tar`. On non-zero exit, extract is skipped.
+5. The volume is destroyed, success or not.
+
+## Where to go next
+
+- [Extract files](./extract) — how to pull artefacts out of the container after a run
+- [Detached runs](./detached) — long-running jobs that survive a host restart
+- [Security model](./security) — what the sandbox protects against and what it does not
+- [gVisor & Kata](./gvisor-kata) — adding a stronger runtime for hostile code
+- [API reference](/api/) — full type signatures and class methods
diff --git a/website/content/docs/security.mdx b/website/content/docs/security.mdx
new file mode 100644
index 0000000..2e43694
--- /dev/null
+++ b/website/content/docs/security.mdx
@@ -0,0 +1,117 @@
+---
+title: "Security model"
+---
+
+`light-runner` is the boring, correct, library-grade answer to "how do I run untrusted code in a container from Node.js?". It is **secure by default**, **additive only** (every option makes the sandbox stronger, never weaker), and it has **one job** (no orchestration, no networking, no persistence beyond the run).
+
+This page describes what is in scope, what is not, and how to choose the right hardening tier.
+
+## Threat model
+
+| In scope | Out of scope |
+|---|---|
+| Untrusted **user code** running inside the container | The host kernel itself (use gVisor for hostile code) |
+| **Filesystem isolation** between the run and the host | Side-channel attacks (timing, cache, Spectre) |
+| **Process isolation** between sibling runs on the same host | Hardware-level threats (firmware, BIOS) |
+| **Network containment** between the run and the host network | The Docker socket itself (root-equivalent on host) |
+| **Resource starvation** (memory, CPU, pids, extract size) | DoS at the orchestration layer (caller's job) |
+| Common container-escape patterns: raw sockets, mknod, capability juggling | Multi-tenant isolation **between tenants** sharing one container |
+
+**The one rule**: one run, one container, one tenant. If two pieces of code must not see each other, they each get their own `runner.run(...)` call.
+
+## What is on by default
+
+Every flag in [`src/createOptions.ts`](https://github.com/enixCode/light-runner/blob/main/src/createOptions.ts) is on for every run, with no opt-out path.
+
+### Capabilities dropped
+
+The following Linux capabilities are stripped at startup:
+
+| Capability | Why |
+|----------------|------------------------------------------------------------|
+| `NET_RAW` | Raw / packet sockets (ARP spoofing, packet crafting) |
+| `MKNOD` | Fabricate device nodes |
+| `SYS_CHROOT` | Escape weaker chroot jails |
+| `SETPCAP` | Modify capability sets of other processes |
+| `SETFCAP` | Escalate via setcap on dropped binaries |
+| `AUDIT_WRITE` | Kernel audit log flooding / spoofing |
+
+### `no-new-privileges`
+
+A `setuid` binary inside the container **cannot elevate above the user it starts as**. Even if the image ships a legitimate-looking root-suid helper, it stays at the run user's privilege level.
+
+### Process cap
+
+`PidsLimit: 100` per container. A fork-bomb caps out in milliseconds instead of paging the host. Tunable upward via `RunnerOptions` if you genuinely need more (compilers spawning many processes, orchestrators-of-orchestrators), but the floor is conservative.
+
+### Memory and CPU budget
+
+`512 MiB` and `1` core by default, **cgroup-enforced**. Noisy runs cannot starve their neighbours. Override with `new DockerRunner({ memory: '4g', cpus: '4' })`.
+
+### Network isolation
+
+Default network: a **dedicated isolated bridge** (`light-runner-isolated`) with **inter-container traffic disabled** (`com.docker.network.bridge.enable_icc: false`). Outbound internet works; sibling runs on the same bridge cannot see each other.
+
+For air-gapped runs, set `network: 'none'` in the request — the container has no network interface at all.
+
+### Filesystem protections
+
+- **Symlinks in your input folder are filtered** at seed time, so a stray `.git` link or a deliberate symlink to `/etc/passwd` cannot cross the host -> container boundary.
+- **`DEFAULT_IGNORES`** (`.git`, `node_modules`, `dist`, `build`, `.next`, `.cache`, `.turbo`, `coverage`) are skipped during seeding. They are noise at best and credentials-bearing at worst.
+- **Path traversal in `extract.from`** (segments containing `..`) is rejected **before** any container is spawned. A malicious container cannot tell the host extractor to write to `/etc/cron.d/`.
+- **Extract symlinks are skipped** during streaming. A container cannot craft a tarball with a symlink that resolves to a host path.
+- **Extract cap**: 1 GiB per entry, enforced **twice** — pre-flight via `du -sb` inside the container, and streamed via a byte counter on the host pipe.
+
+## What this does not cover
+
+- **Kernel exploits** (anything that breaks out of namespaces by tickling the host kernel directly).
+- **`runc` CVEs** (rare but real; you eat them if you ship `runtime: 'runc'`).
+- **Side-channel attacks** (timing, cache eviction, Spectre/Meltdown family).
+
+For genuinely hostile code (anonymous user-submitted source, AI-agent-generated tool calls, a CTF playground), combine with a stronger runtime — see [gVisor & Kata](./gvisor-kata).
+
+## Secrets
+
+`env` vars go to `docker run --env`, which makes them visible in `docker inspect` and Docker metadata. That is fine in most setups (a host with Docker socket access is already root-equivalent), but for sensitive material prefer:
+
+- **`input`** (stdin). Ephemeral. Not in metadata, not in `docker inspect`. Your container reads it via `sys.stdin.read()` / `process.stdin`.
+- **A bind mount to `/run/secrets/`**. Docker-native file-based secrets pattern (compose has a `secrets:` block for this). Not managed by light-runner — the consumer wires it via the host config or via a parent compose definition.
+
+Avoid putting API keys in `env`. Avoid putting them in `command`. Avoid putting them in `dir` (they would be tarred into the seed archive and visible to anyone with access to the volume).
+
+## Hardening recipes
+
+### Air-gapped run (no network, untrusted source code)
+
+```ts
+const runner = new DockerRunner();
+runner.run({
+ image: 'python:3.12-alpine',
+ command: 'python untrusted.py',
+ dir: './sandbox',
+ network: 'none',
+ timeout: 30_000,
+ extract: [{ from: '/app/output.json', to: './out' }],
+});
+```
+
+### Tighter resource budget
+
+```ts
+const runner = new DockerRunner({
+ memory: '128m',
+ cpus: '0.5',
+});
+```
+
+### Maximum isolation (gVisor)
+
+```ts
+const runner = new DockerRunner({ runtime: 'runsc' });
+```
+
+See [gVisor & Kata](./gvisor-kata) for installation.
+
+## Reporting a security issue
+
+Email the maintainer (see GitHub profile) with `[security]` in the subject. Public issues are fine for things that need a fix but no one is exploiting; private disclosure is preferred for actively-exploitable bugs.
diff --git a/website/content/docs/test.mdx b/website/content/docs/test.mdx
deleted file mode 100644
index f475f4a..0000000
--- a/website/content/docs/test.mdx
+++ /dev/null
@@ -1,17 +0,0 @@
----
-title: Components
-description: Components
----
-
-## Code Block
-
-```js
-console.log('Hello World');
-```
-
-## Cards
-
-
-
-
-
From c22f394f983bc913ef1160cad0733c218a24f899 Mon Sep 17 00:00:00 2001
From: enixCode <58286681+enixCode@users.noreply.github.com>
Date: Sat, 30 May 2026 01:26:46 +0200
Subject: [PATCH 03/10] docs(fumadocs): theme accent + auto-generated API
reference
- Set the primary accent to Tailwind blue-600 (light) / blue-400 (dark) on the
neutral gray scale, matching the light-process docs palette.
- Generate the typedoc-markdown API reference into content/docs/api and rewrite
it for Fumadocs (frontmatter titles + header stripped) via
scripts/gen-fumadocs-api.mjs; Fumadocs auto-builds the API sidebar.
- Order the api group into the docs nav.
- Enrich the intro example (real fields entrypoint/dir/input/extract, with
detached/networks as commented options).
- next build renders 93 static pages (guides + full API reference).
build with cc
---
scripts/gen-fumadocs-api.mjs | 56 ++++
.../content/docs/api/classes/DockerRunner.md | 201 ++++++++++++
website/content/docs/api/classes/Execution.md | 134 ++++++++
.../docs/api/classes/LightRunnerError.md | 295 ++++++++++++++++++
.../api/functions/cleanupOrphanNetworks.md | 19 ++
.../docs/api/functions/connectNetwork.md | 23 ++
.../docs/api/functions/createNetwork.md | 23 ++
.../docs/api/functions/deleteNetwork.md | 19 ++
.../content/docs/api/functions/listStates.md | 13 +
.../docs/api/functions/networkExists.md | 19 ++
.../content/docs/api/functions/readState.md | 19 ++
website/content/docs/api/index.md | 37 +++
.../api/interfaces/CleanupCacheOptions.md | 15 +
.../api/interfaces/CleanupNetworkOptions.md | 31 ++
.../api/interfaces/CreateNetworkOptions.md | 101 ++++++
.../docs/api/interfaces/ExtractResult.md | 55 ++++
.../docs/api/interfaces/ExtractSpec.md | 25 ++
.../content/docs/api/interfaces/RunRequest.md | 145 +++++++++
.../content/docs/api/interfaces/RunResult.md | 57 ++++
.../content/docs/api/interfaces/RunState.md | 145 +++++++++
.../docs/api/interfaces/RunnerOptions.md | 55 ++++
.../docs/api/interfaces/StopOptions.md | 25 ++
website/content/docs/api/meta.json | 4 +
.../api/type-aliases/LightRunnerErrorCode.md | 17 +
.../content/docs/api/type-aliases/Runtime.md | 9 +
website/content/docs/index.mdx | 18 +-
website/content/docs/meta.json | 2 +-
website/src/app/global.css | 15 +
28 files changed, 1571 insertions(+), 6 deletions(-)
create mode 100644 scripts/gen-fumadocs-api.mjs
create mode 100644 website/content/docs/api/classes/DockerRunner.md
create mode 100644 website/content/docs/api/classes/Execution.md
create mode 100644 website/content/docs/api/classes/LightRunnerError.md
create mode 100644 website/content/docs/api/functions/cleanupOrphanNetworks.md
create mode 100644 website/content/docs/api/functions/connectNetwork.md
create mode 100644 website/content/docs/api/functions/createNetwork.md
create mode 100644 website/content/docs/api/functions/deleteNetwork.md
create mode 100644 website/content/docs/api/functions/listStates.md
create mode 100644 website/content/docs/api/functions/networkExists.md
create mode 100644 website/content/docs/api/functions/readState.md
create mode 100644 website/content/docs/api/index.md
create mode 100644 website/content/docs/api/interfaces/CleanupCacheOptions.md
create mode 100644 website/content/docs/api/interfaces/CleanupNetworkOptions.md
create mode 100644 website/content/docs/api/interfaces/CreateNetworkOptions.md
create mode 100644 website/content/docs/api/interfaces/ExtractResult.md
create mode 100644 website/content/docs/api/interfaces/ExtractSpec.md
create mode 100644 website/content/docs/api/interfaces/RunRequest.md
create mode 100644 website/content/docs/api/interfaces/RunResult.md
create mode 100644 website/content/docs/api/interfaces/RunState.md
create mode 100644 website/content/docs/api/interfaces/RunnerOptions.md
create mode 100644 website/content/docs/api/interfaces/StopOptions.md
create mode 100644 website/content/docs/api/meta.json
create mode 100644 website/content/docs/api/type-aliases/LightRunnerErrorCode.md
create mode 100644 website/content/docs/api/type-aliases/Runtime.md
diff --git a/scripts/gen-fumadocs-api.mjs b/scripts/gen-fumadocs-api.mjs
new file mode 100644
index 0000000..0210d70
--- /dev/null
+++ b/scripts/gen-fumadocs-api.mjs
@@ -0,0 +1,56 @@
+/*
+ * Regenerate the Fumadocs API reference from the TypeScript source.
+ *
+ * Runs typedoc (typedoc-plugin-markdown, configured in typedoc.json) into
+ * website/content/docs/api, then rewrites each page for Fumadocs: adds a
+ * frontmatter `title` derived from the typedoc H1 (stripping the kind prefix
+ * like "Interface: ") and drops the typedoc page header. Fumadocs then
+ * auto-builds the API sidebar from the file tree.
+ *
+ * Run from the repo root: `node scripts/gen-fumadocs-api.mjs`. Wire this into
+ * the docs CI step before `next build` so the API tracks the code.
+ */
+import { execSync } from 'node:child_process';
+import fs from 'node:fs';
+import path from 'node:path';
+
+const OUT = 'website/content/docs/api';
+
+execSync(`npx typedoc --out ${OUT}`, { stdio: 'inherit' });
+
+const ROOT = path.resolve(OUT);
+
+function clean(h1) {
+ return h1
+ .replace(/^#\s+/, '')
+ .replace(/^(Interface|Class|Function|Type Alias|Variable|Enumeration|Enum|Namespace):\s*/, '')
+ .replace(/\(\)$/, '')
+ .trim();
+}
+
+function rewrite(file) {
+ const rel = path.relative(ROOT, file).replace(/\\/g, '/');
+ const lines = fs.readFileSync(file, 'utf8').split(/\r?\n/);
+ const h1Idx = lines.findIndex((l) => /^#\s+/.test(l));
+ let title;
+ if (rel === 'index.md') title = 'API reference';
+ else if (h1Idx >= 0) title = clean(lines[h1Idx]);
+ else title = path.basename(file, '.md');
+
+ let body = h1Idx >= 0 ? lines.slice(h1Idx + 1) : lines;
+ while (body.length && body[0].trim() === '') body.shift();
+
+ const safe = title.replace(/"/g, '\\"');
+ fs.writeFileSync(file, `---\ntitle: "${safe}"\n---\n\n${body.join('\n').trimEnd()}\n`, 'utf8');
+}
+
+function walk(dir) {
+ for (const e of fs.readdirSync(dir, { withFileTypes: true })) {
+ const p = path.join(dir, e.name);
+ if (e.isDirectory()) walk(p);
+ else if (e.name.endsWith('.md')) rewrite(p);
+ }
+}
+
+walk(ROOT);
+console.log('Fumadocs API reference regenerated.');
diff --git a/website/content/docs/api/classes/DockerRunner.md b/website/content/docs/api/classes/DockerRunner.md
new file mode 100644
index 0000000..65db8fd
--- /dev/null
+++ b/website/content/docs/api/classes/DockerRunner.md
@@ -0,0 +1,201 @@
+---
+title: "DockerRunner"
+---
+
+Defined in: [src/DockerRunner.ts:16](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L16)
+
+## Constructors
+
+### Constructor
+
+```ts
+new DockerRunner(options?): DockerRunner;
+```
+
+Defined in: [src/DockerRunner.ts:19](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L19)
+
+#### Parameters
+
+##### options?
+
+[`RunnerOptions`](../interfaces/RunnerOptions.md) = `{}`
+
+#### Returns
+
+`DockerRunner`
+
+## Methods
+
+### run()
+
+```ts
+run(request): Execution;
+```
+
+Defined in: [src/DockerRunner.ts:29](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L29)
+
+#### Parameters
+
+##### request
+
+[`RunRequest`](../interfaces/RunRequest.md)
+
+#### Returns
+
+[`Execution`](Execution.md)
+
+***
+
+### attach()
+
+```ts
+static attach(id): Execution | null;
+```
+
+Defined in: [src/DockerRunner.ts:142](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L142)
+
+#### Parameters
+
+##### id
+
+`string`
+
+#### Returns
+
+[`Execution`](Execution.md) \| `null`
+
+***
+
+### cleanupOldStates()
+
+```ts
+static cleanupOldStates(maxBytes?): number;
+```
+
+Defined in: [src/DockerRunner.ts:157](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L157)
+
+#### Parameters
+
+##### maxBytes?
+
+`number`
+
+#### Returns
+
+`number`
+
+***
+
+### cleanupOrphanCache()
+
+```ts
+static cleanupOrphanCache(opts?): Promise;
+```
+
+Defined in: [src/DockerRunner.ts:122](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L122)
+
+#### Parameters
+
+##### opts?
+
+[`CleanupCacheOptions`](../interfaces/CleanupCacheOptions.md) = `{}`
+
+#### Returns
+
+`Promise`\<`number`\>
+
+***
+
+### cleanupOrphanNetworks()
+
+```ts
+static cleanupOrphanNetworks(opts?): Promise;
+```
+
+Defined in: [src/DockerRunner.ts:133](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L133)
+
+#### Parameters
+
+##### opts?
+
+[`CleanupNetworkOptions`](../interfaces/CleanupNetworkOptions.md) = `{}`
+
+#### Returns
+
+`Promise`\<`number`\>
+
+***
+
+### cleanupOrphanStates()
+
+```ts
+static cleanupOrphanStates(): Promise;
+```
+
+Defined in: [src/DockerRunner.ts:167](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L167)
+
+#### Returns
+
+`Promise`\<`number`\>
+
+***
+
+### cleanupOrphanVolumes()
+
+```ts
+static cleanupOrphanVolumes(): Promise;
+```
+
+Defined in: [src/DockerRunner.ts:113](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L113)
+
+#### Returns
+
+`Promise`\<`number`\>
+
+***
+
+### isAvailable()
+
+```ts
+static isAvailable(): Promise;
+```
+
+Defined in: [src/DockerRunner.ts:109](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L109)
+
+#### Returns
+
+`Promise`\<`boolean`\>
+
+***
+
+### list()
+
+```ts
+static list(): RunState[];
+```
+
+Defined in: [src/DockerRunner.ts:146](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L146)
+
+#### Returns
+
+[`RunState`](../interfaces/RunState.md)[]
+
+***
+
+### reapOrphans()
+
+```ts
+static reapOrphans(): Promise<{
+ containers: number;
+ volumes: number;
+}>;
+```
+
+Defined in: [src/DockerRunner.ts:178](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L178)
+
+#### Returns
+
+`Promise`\<\{
+ `containers`: `number`;
+ `volumes`: `number`;
+\}\>
diff --git a/website/content/docs/api/classes/Execution.md b/website/content/docs/api/classes/Execution.md
new file mode 100644
index 0000000..414f194
--- /dev/null
+++ b/website/content/docs/api/classes/Execution.md
@@ -0,0 +1,134 @@
+---
+title: "Execution"
+---
+
+Defined in: [src/Execution.ts:17](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L17)
+
+## Constructors
+
+### Constructor
+
+```ts
+new Execution(
+ id,
+ result,
+ onCancel): Execution;
+```
+
+Defined in: [src/Execution.ts:22](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L22)
+
+#### Parameters
+
+##### id
+
+`string`
+
+##### result
+
+`Promise`\<[`RunResult`](../interfaces/RunResult.md)\>
+
+##### onCancel
+
+() => `void`
+
+#### Returns
+
+`Execution`
+
+## Properties
+
+### id
+
+```ts
+readonly id: string;
+```
+
+Defined in: [src/Execution.ts:18](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L18)
+
+***
+
+### result
+
+```ts
+readonly result: Promise;
+```
+
+Defined in: [src/Execution.ts:19](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L19)
+
+## Accessors
+
+### cancelled
+
+#### Get Signature
+
+```ts
+get cancelled(): boolean;
+```
+
+Defined in: [src/Execution.ts:45](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L45)
+
+##### Returns
+
+`boolean`
+
+## Methods
+
+### cancel()
+
+```ts
+cancel(): void;
+```
+
+Defined in: [src/Execution.ts:36](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L36)
+
+#### Returns
+
+`void`
+
+***
+
+### pause()
+
+```ts
+pause(): Promise;
+```
+
+Defined in: [src/Execution.ts:92](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L92)
+
+#### Returns
+
+`Promise`\<`void`\>
+
+***
+
+### resume()
+
+```ts
+resume(): Promise;
+```
+
+Defined in: [src/Execution.ts:100](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L100)
+
+#### Returns
+
+`Promise`\<`void`\>
+
+***
+
+### stop()
+
+```ts
+stop(options?): Promise;
+```
+
+Defined in: [src/Execution.ts:54](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L54)
+
+#### Parameters
+
+##### options?
+
+[`StopOptions`](../interfaces/StopOptions.md) = `{}`
+
+#### Returns
+
+`Promise`\<`void`\>
diff --git a/website/content/docs/api/classes/LightRunnerError.md b/website/content/docs/api/classes/LightRunnerError.md
new file mode 100644
index 0000000..d406963
--- /dev/null
+++ b/website/content/docs/api/classes/LightRunnerError.md
@@ -0,0 +1,295 @@
+---
+title: "LightRunnerError"
+---
+
+Defined in: [src/errors.ts:25](https://github.com/enixCode/light-runner/blob/main/src/errors.ts#L25)
+
+## Extends
+
+- `Error`
+
+## Properties
+
+### cause?
+
+```ts
+optional cause?: unknown;
+```
+
+Defined in: node\_modules/typescript/lib/lib.es2022.error.d.ts:24
+
+#### Inherited from
+
+```ts
+Error.cause
+```
+
+***
+
+### code
+
+```ts
+readonly code: LightRunnerErrorCode;
+```
+
+Defined in: [src/errors.ts:26](https://github.com/enixCode/light-runner/blob/main/src/errors.ts#L26)
+
+***
+
+### containerId?
+
+```ts
+readonly optional containerId?: string;
+```
+
+Defined in: [src/errors.ts:28](https://github.com/enixCode/light-runner/blob/main/src/errors.ts#L28)
+
+***
+
+### dockerOp?
+
+```ts
+readonly optional dockerOp?: string;
+```
+
+Defined in: [src/errors.ts:27](https://github.com/enixCode/light-runner/blob/main/src/errors.ts#L27)
+
+***
+
+### message
+
+```ts
+message: string;
+```
+
+Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1075
+
+#### Inherited from
+
+```ts
+Error.message
+```
+
+***
+
+### name
+
+```ts
+name: string;
+```
+
+Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1074
+
+#### Inherited from
+
+```ts
+Error.name
+```
+
+***
+
+### stack?
+
+```ts
+optional stack?: string;
+```
+
+Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1076
+
+#### Inherited from
+
+```ts
+Error.stack
+```
+
+***
+
+### stackTraceLimit
+
+```ts
+static stackTraceLimit: number;
+```
+
+Defined in: node\_modules/@types/node/globals.d.ts:67
+
+The `Error.stackTraceLimit` property specifies the number of stack frames
+collected by a stack trace (whether generated by `new Error().stack` or
+`Error.captureStackTrace(obj)`).
+
+The default value is `10` but may be set to any valid JavaScript number. Changes
+will affect any stack trace captured _after_ the value has been changed.
+
+If set to a non-number value, or set to a negative number, stack traces will
+not capture any frames.
+
+#### Inherited from
+
+```ts
+Error.stackTraceLimit
+```
+
+## Methods
+
+### toJSON()
+
+```ts
+toJSON(): {
+ code: LightRunnerErrorCode;
+ containerId?: string;
+ dockerOp?: string;
+ message: string;
+ name: string;
+};
+```
+
+Defined in: [src/errors.ts:39](https://github.com/enixCode/light-runner/blob/main/src/errors.ts#L39)
+
+#### Returns
+
+```ts
+{
+ code: LightRunnerErrorCode;
+ containerId?: string;
+ dockerOp?: string;
+ message: string;
+ name: string;
+}
+```
+
+##### code
+
+```ts
+code: LightRunnerErrorCode;
+```
+
+##### containerId?
+
+```ts
+optional containerId?: string;
+```
+
+##### dockerOp?
+
+```ts
+optional dockerOp?: string;
+```
+
+##### message
+
+```ts
+message: string;
+```
+
+##### name
+
+```ts
+name: string;
+```
+
+***
+
+### captureStackTrace()
+
+```ts
+static captureStackTrace(targetObject, constructorOpt?): void;
+```
+
+Defined in: node\_modules/@types/node/globals.d.ts:51
+
+Creates a `.stack` property on `targetObject`, which when accessed returns
+a string representing the location in the code at which
+`Error.captureStackTrace()` was called.
+
+```js
+const myObject = {};
+Error.captureStackTrace(myObject);
+myObject.stack; // Similar to `new Error().stack`
+```
+
+The first line of the trace will be prefixed with
+`${myObject.name}: ${myObject.message}`.
+
+The optional `constructorOpt` argument accepts a function. If given, all frames
+above `constructorOpt`, including `constructorOpt`, will be omitted from the
+generated stack trace.
+
+The `constructorOpt` argument is useful for hiding implementation
+details of error generation from the user. For instance:
+
+```js
+function a() {
+ b();
+}
+
+function b() {
+ c();
+}
+
+function c() {
+ // Create an error without stack trace to avoid calculating the stack trace twice.
+ const { stackTraceLimit } = Error;
+ Error.stackTraceLimit = 0;
+ const error = new Error();
+ Error.stackTraceLimit = stackTraceLimit;
+
+ // Capture the stack trace above function b
+ Error.captureStackTrace(error, b); // Neither function c, nor b is included in the stack trace
+ throw error;
+}
+
+a();
+```
+
+#### Parameters
+
+##### targetObject
+
+`object`
+
+##### constructorOpt?
+
+`Function`
+
+#### Returns
+
+`void`
+
+#### Inherited from
+
+```ts
+Error.captureStackTrace
+```
+
+***
+
+### prepareStackTrace()
+
+```ts
+static prepareStackTrace(err, stackTraces): any;
+```
+
+Defined in: node\_modules/@types/node/globals.d.ts:55
+
+#### Parameters
+
+##### err
+
+`Error`
+
+##### stackTraces
+
+`CallSite`[]
+
+#### Returns
+
+`any`
+
+#### See
+
+https://v8.dev/docs/stack-trace-api#customizing-stack-traces
+
+#### Inherited from
+
+```ts
+Error.prepareStackTrace
+```
diff --git a/website/content/docs/api/functions/cleanupOrphanNetworks.md b/website/content/docs/api/functions/cleanupOrphanNetworks.md
new file mode 100644
index 0000000..c6c04a2
--- /dev/null
+++ b/website/content/docs/api/functions/cleanupOrphanNetworks.md
@@ -0,0 +1,19 @@
+---
+title: "cleanupOrphanNetworks"
+---
+
+```ts
+function cleanupOrphanNetworks(opts?): Promise;
+```
+
+Defined in: [src/network.ts:213](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L213)
+
+## Parameters
+
+### opts?
+
+[`CleanupNetworkOptions`](../interfaces/CleanupNetworkOptions.md) = `{}`
+
+## Returns
+
+`Promise`\<`number`\>
diff --git a/website/content/docs/api/functions/connectNetwork.md b/website/content/docs/api/functions/connectNetwork.md
new file mode 100644
index 0000000..87db46a
--- /dev/null
+++ b/website/content/docs/api/functions/connectNetwork.md
@@ -0,0 +1,23 @@
+---
+title: "connectNetwork"
+---
+
+```ts
+function connectNetwork(name, containerId): Promise;
+```
+
+Defined in: [src/network.ts:166](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L166)
+
+## Parameters
+
+### name
+
+`string`
+
+### containerId
+
+`string`
+
+## Returns
+
+`Promise`\<`void`\>
diff --git a/website/content/docs/api/functions/createNetwork.md b/website/content/docs/api/functions/createNetwork.md
new file mode 100644
index 0000000..6d7a4d5
--- /dev/null
+++ b/website/content/docs/api/functions/createNetwork.md
@@ -0,0 +1,23 @@
+---
+title: "createNetwork"
+---
+
+```ts
+function createNetwork(name, opts?): Promise;
+```
+
+Defined in: [src/network.ts:69](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L69)
+
+## Parameters
+
+### name
+
+`string`
+
+### opts?
+
+[`CreateNetworkOptions`](../interfaces/CreateNetworkOptions.md) = `{}`
+
+## Returns
+
+`Promise`\<`boolean`\>
diff --git a/website/content/docs/api/functions/deleteNetwork.md b/website/content/docs/api/functions/deleteNetwork.md
new file mode 100644
index 0000000..ee97f54
--- /dev/null
+++ b/website/content/docs/api/functions/deleteNetwork.md
@@ -0,0 +1,19 @@
+---
+title: "deleteNetwork"
+---
+
+```ts
+function deleteNetwork(name): Promise;
+```
+
+Defined in: [src/network.ts:145](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L145)
+
+## Parameters
+
+### name
+
+`string`
+
+## Returns
+
+`Promise`\<`void`\>
diff --git a/website/content/docs/api/functions/listStates.md b/website/content/docs/api/functions/listStates.md
new file mode 100644
index 0000000..2419885
--- /dev/null
+++ b/website/content/docs/api/functions/listStates.md
@@ -0,0 +1,13 @@
+---
+title: "listStates"
+---
+
+```ts
+function listStates(): RunState[];
+```
+
+Defined in: [src/state.ts:56](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L56)
+
+## Returns
+
+[`RunState`](../interfaces/RunState.md)[]
diff --git a/website/content/docs/api/functions/networkExists.md b/website/content/docs/api/functions/networkExists.md
new file mode 100644
index 0000000..e922810
--- /dev/null
+++ b/website/content/docs/api/functions/networkExists.md
@@ -0,0 +1,19 @@
+---
+title: "networkExists"
+---
+
+```ts
+function networkExists(name): Promise;
+```
+
+Defined in: [src/network.ts:182](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L182)
+
+## Parameters
+
+### name
+
+`string`
+
+## Returns
+
+`Promise`\<`boolean`\>
diff --git a/website/content/docs/api/functions/readState.md b/website/content/docs/api/functions/readState.md
new file mode 100644
index 0000000..428b4bd
--- /dev/null
+++ b/website/content/docs/api/functions/readState.md
@@ -0,0 +1,19 @@
+---
+title: "readState"
+---
+
+```ts
+function readState(id): RunState | null;
+```
+
+Defined in: [src/state.ts:46](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L46)
+
+## Parameters
+
+### id
+
+`string`
+
+## Returns
+
+[`RunState`](../interfaces/RunState.md) \| `null`
diff --git a/website/content/docs/api/index.md b/website/content/docs/api/index.md
new file mode 100644
index 0000000..6cc5fbe
--- /dev/null
+++ b/website/content/docs/api/index.md
@@ -0,0 +1,37 @@
+---
+title: "API reference"
+---
+
+## Classes
+
+- [DockerRunner](classes/DockerRunner.md)
+- [Execution](classes/Execution.md)
+- [LightRunnerError](classes/LightRunnerError.md)
+
+## Interfaces
+
+- [CleanupCacheOptions](interfaces/CleanupCacheOptions.md)
+- [CleanupNetworkOptions](interfaces/CleanupNetworkOptions.md)
+- [CreateNetworkOptions](interfaces/CreateNetworkOptions.md)
+- [ExtractResult](interfaces/ExtractResult.md)
+- [ExtractSpec](interfaces/ExtractSpec.md)
+- [RunnerOptions](interfaces/RunnerOptions.md)
+- [RunRequest](interfaces/RunRequest.md)
+- [RunResult](interfaces/RunResult.md)
+- [RunState](interfaces/RunState.md)
+- [StopOptions](interfaces/StopOptions.md)
+
+## Type Aliases
+
+- [LightRunnerErrorCode](type-aliases/LightRunnerErrorCode.md)
+- [Runtime](type-aliases/Runtime.md)
+
+## Functions
+
+- [cleanupOrphanNetworks](functions/cleanupOrphanNetworks.md)
+- [connectNetwork](functions/connectNetwork.md)
+- [createNetwork](functions/createNetwork.md)
+- [deleteNetwork](functions/deleteNetwork.md)
+- [listStates](functions/listStates.md)
+- [networkExists](functions/networkExists.md)
+- [readState](functions/readState.md)
diff --git a/website/content/docs/api/interfaces/CleanupCacheOptions.md b/website/content/docs/api/interfaces/CleanupCacheOptions.md
new file mode 100644
index 0000000..71d7d5d
--- /dev/null
+++ b/website/content/docs/api/interfaces/CleanupCacheOptions.md
@@ -0,0 +1,15 @@
+---
+title: "CleanupCacheOptions"
+---
+
+Defined in: [src/build.ts:190](https://github.com/enixCode/light-runner/blob/main/src/build.ts#L190)
+
+## Properties
+
+### maxAgeMs?
+
+```ts
+optional maxAgeMs?: number;
+```
+
+Defined in: [src/build.ts:192](https://github.com/enixCode/light-runner/blob/main/src/build.ts#L192)
diff --git a/website/content/docs/api/interfaces/CleanupNetworkOptions.md b/website/content/docs/api/interfaces/CleanupNetworkOptions.md
new file mode 100644
index 0000000..28eaa95
--- /dev/null
+++ b/website/content/docs/api/interfaces/CleanupNetworkOptions.md
@@ -0,0 +1,31 @@
+---
+title: "CleanupNetworkOptions"
+---
+
+Defined in: [src/network.ts:47](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L47)
+
+## Properties
+
+### maxAgeMs?
+
+```ts
+optional maxAgeMs?: number;
+```
+
+Defined in: [src/network.ts:55](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L55)
+
+Skip networks created within this many milliseconds. Default 30 minutes.
+This is the race protection: a network just created by a concurrent run
+whose container has not yet attached is preserved.
+
+***
+
+### prefix?
+
+```ts
+optional prefix?: string;
+```
+
+Defined in: [src/network.ts:49](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L49)
+
+Only consider networks whose name starts with this prefix. Defaults to `light-runner-`.
diff --git a/website/content/docs/api/interfaces/CreateNetworkOptions.md b/website/content/docs/api/interfaces/CreateNetworkOptions.md
new file mode 100644
index 0000000..81765b8
--- /dev/null
+++ b/website/content/docs/api/interfaces/CreateNetworkOptions.md
@@ -0,0 +1,101 @@
+---
+title: "CreateNetworkOptions"
+---
+
+Defined in: [src/network.ts:11](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L11)
+
+## Properties
+
+### driver?
+
+```ts
+optional driver?: "bridge";
+```
+
+Defined in: [src/network.ts:13](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L13)
+
+Docker network driver. Defaults to 'bridge'.
+
+***
+
+### exclusive?
+
+```ts
+optional exclusive?: boolean;
+```
+
+Defined in: [src/network.ts:24](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L24)
+
+When true, fail (return false) if the network already exists. Default
+false = idempotent: returns true whether we created it or it already
+existed.
+
+***
+
+### iccEnabled?
+
+```ts
+optional iccEnabled?: boolean;
+```
+
+Defined in: [src/network.ts:18](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L18)
+
+Inter-container communication. Defaults to false: containers attached
+to the network cannot reach each other. Only honored for bridge driver.
+
+***
+
+### ipam?
+
+```ts
+optional ipam?: {
+ gateway?: string;
+ ipRange?: string;
+ subnet?: string;
+};
+```
+
+Defined in: [src/network.ts:33](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L33)
+
+Explicit IPAM (IP Address Management) config. When omitted, Docker
+auto-assigns a subnet from its default pool. Pass this to let a higher
+layer (typically light-process) allocate a specific subnet per run from
+a CGNAT pool or any other range.
+
+#### gateway?
+
+```ts
+optional gateway?: string;
+```
+
+Gateway IP. Docker picks the first usable address when omitted.
+
+#### ipRange?
+
+```ts
+optional ipRange?: string;
+```
+
+Optional sub-range within `subnet` where Docker is allowed to
+auto-assign IPs. Outside this range stays reserved for static
+assignment. Rare.
+
+#### subnet?
+
+```ts
+optional subnet?: string;
+```
+
+CIDR de la plage IP du réseau, ex: '100.64.42.0/24'.
+
+***
+
+### labels?
+
+```ts
+optional labels?: Record;
+```
+
+Defined in: [src/network.ts:26](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L26)
+
+Optional Docker labels (helpful for downstream tooling / cleanup).
diff --git a/website/content/docs/api/interfaces/ExtractResult.md b/website/content/docs/api/interfaces/ExtractResult.md
new file mode 100644
index 0000000..d9af207
--- /dev/null
+++ b/website/content/docs/api/interfaces/ExtractResult.md
@@ -0,0 +1,55 @@
+---
+title: "ExtractResult"
+---
+
+Defined in: [src/types.ts:28](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L28)
+
+## Properties
+
+### bytes?
+
+```ts
+optional bytes?: number;
+```
+
+Defined in: [src/types.ts:33](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L33)
+
+***
+
+### error?
+
+```ts
+optional error?: string;
+```
+
+Defined in: [src/types.ts:32](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L32)
+
+***
+
+### from
+
+```ts
+from: string;
+```
+
+Defined in: [src/types.ts:29](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L29)
+
+***
+
+### status
+
+```ts
+status: "ok" | "error" | "missing";
+```
+
+Defined in: [src/types.ts:31](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L31)
+
+***
+
+### to
+
+```ts
+to: string;
+```
+
+Defined in: [src/types.ts:30](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L30)
diff --git a/website/content/docs/api/interfaces/ExtractSpec.md b/website/content/docs/api/interfaces/ExtractSpec.md
new file mode 100644
index 0000000..7000a17
--- /dev/null
+++ b/website/content/docs/api/interfaces/ExtractSpec.md
@@ -0,0 +1,25 @@
+---
+title: "ExtractSpec"
+---
+
+Defined in: [src/types.ts:11](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L11)
+
+## Properties
+
+### from
+
+```ts
+from: string;
+```
+
+Defined in: [src/types.ts:16](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L16)
+
+***
+
+### to
+
+```ts
+to: string;
+```
+
+Defined in: [src/types.ts:25](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L25)
diff --git a/website/content/docs/api/interfaces/RunRequest.md b/website/content/docs/api/interfaces/RunRequest.md
new file mode 100644
index 0000000..68379ef
--- /dev/null
+++ b/website/content/docs/api/interfaces/RunRequest.md
@@ -0,0 +1,145 @@
+---
+title: "RunRequest"
+---
+
+Defined in: [src/types.ts:36](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L36)
+
+## Properties
+
+### detached?
+
+```ts
+optional detached?: boolean;
+```
+
+Defined in: [src/types.ts:110](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L110)
+
+***
+
+### dir?
+
+```ts
+optional dir?: string;
+```
+
+Defined in: [src/types.ts:67](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L67)
+
+***
+
+### entrypoint?
+
+```ts
+optional entrypoint?: string;
+```
+
+Defined in: [src/types.ts:39](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L39)
+
+***
+
+### env?
+
+```ts
+optional env?: Record;
+```
+
+Defined in: [src/types.ts:87](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L87)
+
+***
+
+### extract?
+
+```ts
+optional extract?: ExtractSpec[];
+```
+
+Defined in: [src/types.ts:97](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L97)
+
+***
+
+### image
+
+```ts
+image: string;
+```
+
+Defined in: [src/types.ts:37](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L37)
+
+***
+
+### input?
+
+```ts
+optional input?: unknown;
+```
+
+Defined in: [src/types.ts:71](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L71)
+
+***
+
+### networks?
+
+```ts
+optional networks?: string[];
+```
+
+Defined in: [src/types.ts:85](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L85)
+
+***
+
+### onLog?
+
+```ts
+optional onLog?: (line) => void;
+```
+
+Defined in: [src/types.ts:91](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L91)
+
+#### Parameters
+
+##### line
+
+`string`
+
+#### Returns
+
+`void`
+
+***
+
+### run?
+
+```ts
+optional run?: string[];
+```
+
+Defined in: [src/types.ts:60](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L60)
+
+***
+
+### signal?
+
+```ts
+optional signal?: AbortSignal;
+```
+
+Defined in: [src/types.ts:90](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L90)
+
+***
+
+### timeout?
+
+```ts
+optional timeout?: number;
+```
+
+Defined in: [src/types.ts:73](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L73)
+
+***
+
+### workdir?
+
+```ts
+optional workdir?: string;
+```
+
+Defined in: [src/types.ts:89](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L89)
diff --git a/website/content/docs/api/interfaces/RunResult.md b/website/content/docs/api/interfaces/RunResult.md
new file mode 100644
index 0000000..b93bad2
--- /dev/null
+++ b/website/content/docs/api/interfaces/RunResult.md
@@ -0,0 +1,57 @@
+---
+title: "RunResult"
+---
+
+Defined in: [src/types.ts:113](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L113)
+
+## Properties
+
+### cancelled
+
+```ts
+cancelled: boolean;
+```
+
+Defined in: [src/types.ts:117](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L117)
+
+***
+
+### duration
+
+```ts
+duration: number;
+```
+
+Defined in: [src/types.ts:116](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L116)
+
+***
+
+### exitCode
+
+```ts
+exitCode: number;
+```
+
+Defined in: [src/types.ts:115](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L115)
+
+***
+
+### extracted?
+
+```ts
+optional extracted?: ExtractResult[];
+```
+
+Defined in: [src/types.ts:119](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L119)
+
+Status of each requested extract. Present only if `extract` was set.
+
+***
+
+### success
+
+```ts
+success: boolean;
+```
+
+Defined in: [src/types.ts:114](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L114)
diff --git a/website/content/docs/api/interfaces/RunState.md b/website/content/docs/api/interfaces/RunState.md
new file mode 100644
index 0000000..802482e
--- /dev/null
+++ b/website/content/docs/api/interfaces/RunState.md
@@ -0,0 +1,145 @@
+---
+title: "RunState"
+---
+
+Defined in: [src/state.ts:8](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L8)
+
+## Properties
+
+### cancelled?
+
+```ts
+optional cancelled?: boolean;
+```
+
+Defined in: [src/state.ts:27](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L27)
+
+***
+
+### container
+
+```ts
+container: string;
+```
+
+Defined in: [src/state.ts:10](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L10)
+
+***
+
+### durationMs?
+
+```ts
+optional durationMs?: number;
+```
+
+Defined in: [src/state.ts:21](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L21)
+
+***
+
+### entrypoint?
+
+```ts
+optional entrypoint?: string;
+```
+
+Defined in: [src/state.ts:14](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L14)
+
+***
+
+### exitCode?
+
+```ts
+optional exitCode?: number;
+```
+
+Defined in: [src/state.ts:20](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L20)
+
+***
+
+### extract?
+
+```ts
+optional extract?: ExtractSpec[];
+```
+
+Defined in: [src/state.ts:16](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L16)
+
+***
+
+### finishedAt?
+
+```ts
+optional finishedAt?: string;
+```
+
+Defined in: [src/state.ts:18](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L18)
+
+***
+
+### id
+
+```ts
+id: string;
+```
+
+Defined in: [src/state.ts:9](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L9)
+
+***
+
+### image
+
+```ts
+image: string;
+```
+
+Defined in: [src/state.ts:12](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L12)
+
+***
+
+### startedAt
+
+```ts
+startedAt: string;
+```
+
+Defined in: [src/state.ts:17](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L17)
+
+***
+
+### status
+
+```ts
+status: "running" | "exited" | "cancelled" | "failed";
+```
+
+Defined in: [src/state.ts:19](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L19)
+
+***
+
+### timeout?
+
+```ts
+optional timeout?: number;
+```
+
+Defined in: [src/state.ts:15](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L15)
+
+***
+
+### volume
+
+```ts
+volume: string;
+```
+
+Defined in: [src/state.ts:11](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L11)
+
+***
+
+### workdir
+
+```ts
+workdir: string;
+```
+
+Defined in: [src/state.ts:13](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L13)
diff --git a/website/content/docs/api/interfaces/RunnerOptions.md b/website/content/docs/api/interfaces/RunnerOptions.md
new file mode 100644
index 0000000..68cff2e
--- /dev/null
+++ b/website/content/docs/api/interfaces/RunnerOptions.md
@@ -0,0 +1,55 @@
+---
+title: "RunnerOptions"
+---
+
+Defined in: [src/types.ts:3](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L3)
+
+## Properties
+
+### cpus?
+
+```ts
+optional cpus?: string;
+```
+
+Defined in: [src/types.ts:5](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L5)
+
+***
+
+### gpus?
+
+```ts
+optional gpus?: string | number;
+```
+
+Defined in: [src/types.ts:7](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L7)
+
+***
+
+### memory?
+
+```ts
+optional memory?: string;
+```
+
+Defined in: [src/types.ts:4](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L4)
+
+***
+
+### noNewPrivileges?
+
+```ts
+optional noNewPrivileges?: boolean;
+```
+
+Defined in: [src/types.ts:8](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L8)
+
+***
+
+### runtime?
+
+```ts
+optional runtime?: Runtime;
+```
+
+Defined in: [src/types.ts:6](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L6)
diff --git a/website/content/docs/api/interfaces/StopOptions.md b/website/content/docs/api/interfaces/StopOptions.md
new file mode 100644
index 0000000..7c7e8a6
--- /dev/null
+++ b/website/content/docs/api/interfaces/StopOptions.md
@@ -0,0 +1,25 @@
+---
+title: "StopOptions"
+---
+
+Defined in: [src/Execution.ts:4](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L4)
+
+## Properties
+
+### grace?
+
+```ts
+optional grace?: number;
+```
+
+Defined in: [src/Execution.ts:14](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L14)
+
+***
+
+### signal?
+
+```ts
+optional signal?: string;
+```
+
+Defined in: [src/Execution.ts:9](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L9)
diff --git a/website/content/docs/api/meta.json b/website/content/docs/api/meta.json
new file mode 100644
index 0000000..d9d9469
--- /dev/null
+++ b/website/content/docs/api/meta.json
@@ -0,0 +1,4 @@
+{
+ "title": "API reference",
+ "pages": ["index", "classes", "interfaces", "functions", "type-aliases"]
+}
diff --git a/website/content/docs/api/type-aliases/LightRunnerErrorCode.md b/website/content/docs/api/type-aliases/LightRunnerErrorCode.md
new file mode 100644
index 0000000..ab52fbb
--- /dev/null
+++ b/website/content/docs/api/type-aliases/LightRunnerErrorCode.md
@@ -0,0 +1,17 @@
+---
+title: "LightRunnerErrorCode"
+---
+
+```ts
+type LightRunnerErrorCode =
+ | "DOCKER_UNREACHABLE"
+ | "VOLUME_CREATE_FAILED"
+ | "CONTAINER_START_FAILED"
+ | "SEED_FAILED"
+ | "EXTRACT_FAILED"
+ | "BUILD_FAILED"
+ | "INVALID_RUN_STEP"
+ | "NETWORK_CONNECT_FAILED";
+```
+
+Defined in: [src/errors.ts:1](https://github.com/enixCode/light-runner/blob/main/src/errors.ts#L1)
diff --git a/website/content/docs/api/type-aliases/Runtime.md b/website/content/docs/api/type-aliases/Runtime.md
new file mode 100644
index 0000000..f489a92
--- /dev/null
+++ b/website/content/docs/api/type-aliases/Runtime.md
@@ -0,0 +1,9 @@
+---
+title: "Runtime"
+---
+
+```ts
+type Runtime = "runc" | "runsc" | "kata";
+```
+
+Defined in: [src/types.ts:1](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L1)
diff --git a/website/content/docs/index.mdx b/website/content/docs/index.mdx
index 4182167..b3f5374 100644
--- a/website/content/docs/index.mdx
+++ b/website/content/docs/index.mdx
@@ -17,12 +17,20 @@ npm install light-runner
import { DockerRunner } from 'light-runner';
const runner = new DockerRunner();
-const exec = runner.run({
- image: 'node:20-alpine',
- entrypoint: 'node -e "console.log(1 + 1)"',
+
+const execution = runner.run({
+ image: 'python:3.12-alpine',
+ entrypoint: 'python main.py', // shell command, run via `sh -c` (there is no `command` field)
+ dir: './my-project', // host folder copied into the container workdir
+ input: { task: 'compute', n: 20 }, // any JSON value, piped to stdin
+ timeout: 30_000,
+ extract: [{ from: '/app/result.json', to: './out' }],
+ // detached: true, // decouple from the launcher, resume later with DockerRunner.attach(id)
+ // networks: ['my-net'], // attach to one or more existing networks
});
-const result = await exec.result;
-console.log(result.exitCode); // 0
+
+const result = await execution.result;
+console.log(result.exitCode, result.extracted);
```
Start with the [Quick start](/docs/quickstart), then explore [Extract files](/docs/extract), [Detached runs](/docs/detached), the [Security model](/docs/security), and [gVisor & Kata](/docs/gvisor-kata).
diff --git a/website/content/docs/meta.json b/website/content/docs/meta.json
index 5c4b662..6266cb6 100644
--- a/website/content/docs/meta.json
+++ b/website/content/docs/meta.json
@@ -1,3 +1,3 @@
{
- "pages": ["index", "quickstart", "extract", "detached", "security", "gvisor-kata"]
+ "pages": ["index", "quickstart", "extract", "detached", "security", "gvisor-kata", "api"]
}
diff --git a/website/src/app/global.css b/website/src/app/global.css
index f86f3c9..9d6bf67 100644
--- a/website/src/app/global.css
+++ b/website/src/app/global.css
@@ -10,3 +10,18 @@ html > body[data-scroll-locked] {
margin-right: 0px !important;
--removed-body-scroll-bar-size: 0px !important;
}
+
+/*
+ * Accent aligned with the light-process docs palette: Tailwind blue-600 on
+ * the neutral gray scale (the `neutral` preset above). Overrides win because
+ * they come after the preset @imports.
+ */
+:root {
+ --color-fd-primary: hsl(221, 83%, 53%); /* blue-600 */
+ --color-fd-primary-foreground: hsl(0, 0%, 100%);
+}
+
+.dark {
+ --color-fd-primary: hsl(213, 94%, 68%); /* blue-400, lighter for dark contrast */
+ --color-fd-primary-foreground: hsl(222, 47%, 11%);
+}
From c51f51d0b131dfbe0a4940b98df6019af1e0ac12 Mon Sep 17 00:00:00 2001
From: enixCode <58286681+enixCode@users.noreply.github.com>
Date: Sat, 30 May 2026 01:33:21 +0200
Subject: [PATCH 04/10] fix(fumadocs): rewrite typedoc API cross-links to
extensionless routes
typedoc-plugin-markdown emits relative `.md` cross-links (e.g.
`../interfaces/RunRequest.md`); Fumadocs routes have no `.md`, so clicking
them 404s. gen-fumadocs-api.mjs now rewrites internal `.md` links to absolute
Fumadocs routes (`/docs/api/interfaces/RunRequest`), preserving anchors and
leaving external https links untouched. Rebuild stays green (93 pages).
build with cc
---
scripts/gen-fumadocs-api.mjs | 16 ++++++-
.../content/docs/api/classes/DockerRunner.md | 14 +++---
website/content/docs/api/classes/Execution.md | 4 +-
.../api/functions/cleanupOrphanNetworks.md | 2 +-
.../docs/api/functions/createNetwork.md | 2 +-
.../content/docs/api/functions/listStates.md | 2 +-
.../content/docs/api/functions/readState.md | 2 +-
website/content/docs/api/index.md | 44 +++++++++----------
website/content/docs/api/meta.json | 4 --
9 files changed, 50 insertions(+), 40 deletions(-)
delete mode 100644 website/content/docs/api/meta.json
diff --git a/scripts/gen-fumadocs-api.mjs b/scripts/gen-fumadocs-api.mjs
index 0210d70..66816a8 100644
--- a/scripts/gen-fumadocs-api.mjs
+++ b/scripts/gen-fumadocs-api.mjs
@@ -28,6 +28,18 @@ function clean(h1) {
.trim();
}
+function fixLinks(text, currentDir) {
+ // Rewrite typedoc's relative `.md` cross-links to extensionless Fumadocs
+ // routes, e.g. `../interfaces/RunRequest.md#x` -> `/docs/api/interfaces/RunRequest#x`.
+ // Fumadocs routes have no `.md`, so the raw typedoc links 404.
+ return text.replace(/\]\(([^)#\s]+\.md)(#[^)]*)?\)/g, (m, relPath, anchor) => {
+ if (/^https?:\/\//.test(relPath)) return m;
+ const resolved = path.posix.normalize(path.posix.join(currentDir, relPath)).replace(/\.md$/, '');
+ const route = resolved === 'index' ? '/docs/api' : `/docs/api/${resolved}`;
+ return `](${route}${anchor ?? ''})`;
+ });
+}
+
function rewrite(file) {
const rel = path.relative(ROOT, file).replace(/\\/g, '/');
const lines = fs.readFileSync(file, 'utf8').split(/\r?\n/);
@@ -40,8 +52,10 @@ function rewrite(file) {
let body = h1Idx >= 0 ? lines.slice(h1Idx + 1) : lines;
while (body.length && body[0].trim() === '') body.shift();
+ const dir = path.posix.dirname(rel);
+ const fixed = fixLinks(body.join('\n'), dir === '.' ? '' : dir);
const safe = title.replace(/"/g, '\\"');
- fs.writeFileSync(file, `---\ntitle: "${safe}"\n---\n\n${body.join('\n').trimEnd()}\n`, 'utf8');
+ fs.writeFileSync(file, `---\ntitle: "${safe}"\n---\n\n${fixed.trimEnd()}\n`, 'utf8');
}
function walk(dir) {
diff --git a/website/content/docs/api/classes/DockerRunner.md b/website/content/docs/api/classes/DockerRunner.md
index 65db8fd..5d03940 100644
--- a/website/content/docs/api/classes/DockerRunner.md
+++ b/website/content/docs/api/classes/DockerRunner.md
@@ -18,7 +18,7 @@ Defined in: [src/DockerRunner.ts:19](https://github.com/enixCode/light-runner/bl
##### options?
-[`RunnerOptions`](../interfaces/RunnerOptions.md) = `{}`
+[`RunnerOptions`](/docs/api/interfaces/RunnerOptions) = `{}`
#### Returns
@@ -38,11 +38,11 @@ Defined in: [src/DockerRunner.ts:29](https://github.com/enixCode/light-runner/bl
##### request
-[`RunRequest`](../interfaces/RunRequest.md)
+[`RunRequest`](/docs/api/interfaces/RunRequest)
#### Returns
-[`Execution`](Execution.md)
+[`Execution`](/docs/api/classes/Execution)
***
@@ -62,7 +62,7 @@ Defined in: [src/DockerRunner.ts:142](https://github.com/enixCode/light-runner/b
#### Returns
-[`Execution`](Execution.md) \| `null`
+[`Execution`](/docs/api/classes/Execution) \| `null`
***
@@ -98,7 +98,7 @@ Defined in: [src/DockerRunner.ts:122](https://github.com/enixCode/light-runner/b
##### opts?
-[`CleanupCacheOptions`](../interfaces/CleanupCacheOptions.md) = `{}`
+[`CleanupCacheOptions`](/docs/api/interfaces/CleanupCacheOptions) = `{}`
#### Returns
@@ -118,7 +118,7 @@ Defined in: [src/DockerRunner.ts:133](https://github.com/enixCode/light-runner/b
##### opts?
-[`CleanupNetworkOptions`](../interfaces/CleanupNetworkOptions.md) = `{}`
+[`CleanupNetworkOptions`](/docs/api/interfaces/CleanupNetworkOptions) = `{}`
#### Returns
@@ -178,7 +178,7 @@ Defined in: [src/DockerRunner.ts:146](https://github.com/enixCode/light-runner/b
#### Returns
-[`RunState`](../interfaces/RunState.md)[]
+[`RunState`](/docs/api/interfaces/RunState)[]
***
diff --git a/website/content/docs/api/classes/Execution.md b/website/content/docs/api/classes/Execution.md
index 414f194..aae57a0 100644
--- a/website/content/docs/api/classes/Execution.md
+++ b/website/content/docs/api/classes/Execution.md
@@ -25,7 +25,7 @@ Defined in: [src/Execution.ts:22](https://github.com/enixCode/light-runner/blob/
##### result
-`Promise`\<[`RunResult`](../interfaces/RunResult.md)\>
+`Promise`\<[`RunResult`](/docs/api/interfaces/RunResult)\>
##### onCancel
@@ -127,7 +127,7 @@ Defined in: [src/Execution.ts:54](https://github.com/enixCode/light-runner/blob/
##### options?
-[`StopOptions`](../interfaces/StopOptions.md) = `{}`
+[`StopOptions`](/docs/api/interfaces/StopOptions) = `{}`
#### Returns
diff --git a/website/content/docs/api/functions/cleanupOrphanNetworks.md b/website/content/docs/api/functions/cleanupOrphanNetworks.md
index c6c04a2..7104cf8 100644
--- a/website/content/docs/api/functions/cleanupOrphanNetworks.md
+++ b/website/content/docs/api/functions/cleanupOrphanNetworks.md
@@ -12,7 +12,7 @@ Defined in: [src/network.ts:213](https://github.com/enixCode/light-runner/blob/m
### opts?
-[`CleanupNetworkOptions`](../interfaces/CleanupNetworkOptions.md) = `{}`
+[`CleanupNetworkOptions`](/docs/api/interfaces/CleanupNetworkOptions) = `{}`
## Returns
diff --git a/website/content/docs/api/functions/createNetwork.md b/website/content/docs/api/functions/createNetwork.md
index 6d7a4d5..a16ba9b 100644
--- a/website/content/docs/api/functions/createNetwork.md
+++ b/website/content/docs/api/functions/createNetwork.md
@@ -16,7 +16,7 @@ Defined in: [src/network.ts:69](https://github.com/enixCode/light-runner/blob/ma
### opts?
-[`CreateNetworkOptions`](../interfaces/CreateNetworkOptions.md) = `{}`
+[`CreateNetworkOptions`](/docs/api/interfaces/CreateNetworkOptions) = `{}`
## Returns
diff --git a/website/content/docs/api/functions/listStates.md b/website/content/docs/api/functions/listStates.md
index 2419885..cdb2981 100644
--- a/website/content/docs/api/functions/listStates.md
+++ b/website/content/docs/api/functions/listStates.md
@@ -10,4 +10,4 @@ Defined in: [src/state.ts:56](https://github.com/enixCode/light-runner/blob/main
## Returns
-[`RunState`](../interfaces/RunState.md)[]
+[`RunState`](/docs/api/interfaces/RunState)[]
diff --git a/website/content/docs/api/functions/readState.md b/website/content/docs/api/functions/readState.md
index 428b4bd..b3e1dbb 100644
--- a/website/content/docs/api/functions/readState.md
+++ b/website/content/docs/api/functions/readState.md
@@ -16,4 +16,4 @@ Defined in: [src/state.ts:46](https://github.com/enixCode/light-runner/blob/main
## Returns
-[`RunState`](../interfaces/RunState.md) \| `null`
+[`RunState`](/docs/api/interfaces/RunState) \| `null`
diff --git a/website/content/docs/api/index.md b/website/content/docs/api/index.md
index 6cc5fbe..8f56efc 100644
--- a/website/content/docs/api/index.md
+++ b/website/content/docs/api/index.md
@@ -4,34 +4,34 @@ title: "API reference"
## Classes
-- [DockerRunner](classes/DockerRunner.md)
-- [Execution](classes/Execution.md)
-- [LightRunnerError](classes/LightRunnerError.md)
+- [DockerRunner](/docs/api/classes/DockerRunner)
+- [Execution](/docs/api/classes/Execution)
+- [LightRunnerError](/docs/api/classes/LightRunnerError)
## Interfaces
-- [CleanupCacheOptions](interfaces/CleanupCacheOptions.md)
-- [CleanupNetworkOptions](interfaces/CleanupNetworkOptions.md)
-- [CreateNetworkOptions](interfaces/CreateNetworkOptions.md)
-- [ExtractResult](interfaces/ExtractResult.md)
-- [ExtractSpec](interfaces/ExtractSpec.md)
-- [RunnerOptions](interfaces/RunnerOptions.md)
-- [RunRequest](interfaces/RunRequest.md)
-- [RunResult](interfaces/RunResult.md)
-- [RunState](interfaces/RunState.md)
-- [StopOptions](interfaces/StopOptions.md)
+- [CleanupCacheOptions](/docs/api/interfaces/CleanupCacheOptions)
+- [CleanupNetworkOptions](/docs/api/interfaces/CleanupNetworkOptions)
+- [CreateNetworkOptions](/docs/api/interfaces/CreateNetworkOptions)
+- [ExtractResult](/docs/api/interfaces/ExtractResult)
+- [ExtractSpec](/docs/api/interfaces/ExtractSpec)
+- [RunnerOptions](/docs/api/interfaces/RunnerOptions)
+- [RunRequest](/docs/api/interfaces/RunRequest)
+- [RunResult](/docs/api/interfaces/RunResult)
+- [RunState](/docs/api/interfaces/RunState)
+- [StopOptions](/docs/api/interfaces/StopOptions)
## Type Aliases
-- [LightRunnerErrorCode](type-aliases/LightRunnerErrorCode.md)
-- [Runtime](type-aliases/Runtime.md)
+- [LightRunnerErrorCode](/docs/api/type-aliases/LightRunnerErrorCode)
+- [Runtime](/docs/api/type-aliases/Runtime)
## Functions
-- [cleanupOrphanNetworks](functions/cleanupOrphanNetworks.md)
-- [connectNetwork](functions/connectNetwork.md)
-- [createNetwork](functions/createNetwork.md)
-- [deleteNetwork](functions/deleteNetwork.md)
-- [listStates](functions/listStates.md)
-- [networkExists](functions/networkExists.md)
-- [readState](functions/readState.md)
+- [cleanupOrphanNetworks](/docs/api/functions/cleanupOrphanNetworks)
+- [connectNetwork](/docs/api/functions/connectNetwork)
+- [createNetwork](/docs/api/functions/createNetwork)
+- [deleteNetwork](/docs/api/functions/deleteNetwork)
+- [listStates](/docs/api/functions/listStates)
+- [networkExists](/docs/api/functions/networkExists)
+- [readState](/docs/api/functions/readState)
diff --git a/website/content/docs/api/meta.json b/website/content/docs/api/meta.json
deleted file mode 100644
index d9d9469..0000000
--- a/website/content/docs/api/meta.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "title": "API reference",
- "pages": ["index", "classes", "interfaces", "functions", "type-aliases"]
-}
From 48629ad99bb03954d237a75c95d9a58a73b00e17 Mon Sep 17 00:00:00 2001
From: enixCode <58286681+enixCode@users.noreply.github.com>
Date: Sat, 30 May 2026 01:34:58 +0200
Subject: [PATCH 05/10] fix(fumadocs): regenerate API group meta.json in the
gen script
typedoc cleans its output dir on every run, deleting the hand-written
content/docs/api/meta.json. gen-fumadocs-api.mjs now rewrites it after
generation, so the API-reference group title and ordering survive a regen.
build with cc
---
scripts/gen-fumadocs-api.mjs | 13 +++++++++++++
website/content/docs/api/meta.json | 10 ++++++++++
2 files changed, 23 insertions(+)
create mode 100644 website/content/docs/api/meta.json
diff --git a/scripts/gen-fumadocs-api.mjs b/scripts/gen-fumadocs-api.mjs
index 66816a8..b5d8e04 100644
--- a/scripts/gen-fumadocs-api.mjs
+++ b/scripts/gen-fumadocs-api.mjs
@@ -67,4 +67,17 @@ function walk(dir) {
}
walk(ROOT);
+
+// typedoc's cleanOutputDir wipes the folder on every run, so (re)write the
+// Fumadocs group meta here rather than keeping it as a static file.
+fs.writeFileSync(
+ path.join(ROOT, 'meta.json'),
+ `${JSON.stringify(
+ { title: 'API reference', pages: ['index', 'classes', 'interfaces', 'functions', 'type-aliases'] },
+ null,
+ 2,
+ )}\n`,
+ 'utf8',
+);
+
console.log('Fumadocs API reference regenerated.');
diff --git a/website/content/docs/api/meta.json b/website/content/docs/api/meta.json
new file mode 100644
index 0000000..18de2e6
--- /dev/null
+++ b/website/content/docs/api/meta.json
@@ -0,0 +1,10 @@
+{
+ "title": "API reference",
+ "pages": [
+ "index",
+ "classes",
+ "interfaces",
+ "functions",
+ "type-aliases"
+ ]
+}
From dfe34a91a2838cca0a0acc9f8fe758b037e7ac0d Mon Sep 17 00:00:00 2001
From: enixCode <58286681+enixCode@users.noreply.github.com>
Date: Sat, 30 May 2026 07:26:32 +0200
Subject: [PATCH 06/10] docs(fumadocs): landing page and correct app name
- Replace the scaffold placeholder home with a real landing (hero, primitives,
quick start, security model, ecosystem, footer) on the blue/gray theme.
- Set appName to light-runner and gitConfig to enixCode/light-runner (was the
scaffold default My App / fuma-nama-fumadocs).
- Add root metadata (title, description, metadataBase), which also clears the
build metadataBase warning.
build with cc
---
website/src/app/(home)/page.tsx | 216 ++++++++++++++++++++++++++++++--
website/src/app/layout.tsx | 9 ++
website/src/lib/shared.ts | 6 +-
3 files changed, 218 insertions(+), 13 deletions(-)
diff --git a/website/src/app/(home)/page.tsx b/website/src/app/(home)/page.tsx
index c936084..970bd1e 100644
--- a/website/src/app/(home)/page.tsx
+++ b/website/src/app/(home)/page.tsx
@@ -1,16 +1,212 @@
import Link from 'next/link';
-export default function HomePage() {
+const primitives = [
+ {
+ num: '01 / isolated',
+ title: 'Your code runs in its own cell.',
+ body: 'Every run gets a fresh container, its own volume, its own network. Nothing leaks in from the host, nothing leaks out to sibling runs. Torn down on exit, success or not.',
+ },
+ {
+ num: '02 / drop in, pull out',
+ title: 'Send a folder. Get any file back.',
+ body: 'Point at a directory on your disk, it becomes the container workdir. When the run finishes, ask for any path and it lands back on your host.',
+ },
+ {
+ num: '03 / stop on demand',
+ title: 'Cancel, abort, or time out.',
+ body: 'Pass an AbortSignal, call cancel(), or set a deadline. The container dies and its volume goes with it. No zombie processes, no leaked disk.',
+ },
+ {
+ num: '04 / any stack',
+ title: 'Python, Node, Go, Ruby, shell, anything.',
+ body: 'Any Docker image on your registry or anyone else’s. No special runtime inside the container, no SDK to import, no convention to follow.',
+ },
+];
+
+const security: [string, string][] = [
+ ['Kernel permissions', 'Dangerous capabilities stripped at startup: raw sockets, device creation, chroot escapes, capability juggling, audit-log spoofing. Every run, unconditionally.'],
+ ['No privilege escalation', 'A setuid binary inside your container cannot elevate above the user it starts as.'],
+ ['Fork-bomb protection', 'Max 100 processes per container. A runaway loop caps out in milliseconds.'],
+ ['Memory and CPU budget', '512 MiB and one core by default, cgroup-enforced. Tunable per runner.'],
+ ['Network isolation', 'Isolated bridge by default with inter-container traffic blocked. Use networks: [‘none’] to sever it entirely.'],
+ ['Host filesystem', 'Symlinks in your input folder are filtered before seeding, so a stray link cannot reach back into the host.'],
+ ['Safe extraction', 'Paths escaping upward (..) are refused; each extracted entry is capped at 1 GiB.'],
+ ['Kernel-level hardening', 'Swap the runtime to gVisor with one option for user-space syscall interception.'],
+];
+
+const ecosystem = [
+ {
+ name: 'light-runner',
+ tag: 'this library',
+ title: 'Spawn one container, return exit code and files.',
+ body: 'The execution primitive. Domain-agnostic. Zero orchestration. The other two tools call down to this one.',
+ },
+ {
+ name: 'light-run',
+ tag: 'HTTP',
+ title: 'CLI and HTTP surface around light-runner.',
+ body: 'Point a POST endpoint at it, pipe bodies through, get results back. Stateless wrapper, same defaults, same guarantees.',
+ },
+ {
+ name: 'light-process',
+ tag: 'DAG',
+ title: 'DAG orchestration, retries, fan-out.',
+ body: 'Composes runs into pipelines with backoff, concurrency limits, and structured outputs.',
+ },
+];
+
+const code = `import { DockerRunner } from 'light-runner';
+
+const runner = new DockerRunner({ memory: '512m', cpus: '1' });
+
+const execution = runner.run({
+ image: 'python:3.12-alpine',
+ entrypoint: 'python main.py',
+ dir: './my-project',
+ input: { task: 'compute', n: 20 },
+ timeout: 30_000,
+ extract: [{ from: '/app/result.json', to: './out' }],
+});
+
+const result = await execution.result;
+result.success; // true if exit 0 and not cancelled
+result.exitCode; // the container exit code
+result.extracted; // [{ from, to, status, bytes }]`;
+
+function Label({ children }: { children: React.ReactNode }) {
return (
-
-
Hello World
-
- You can open{' '}
-
- /docs
- {' '}
- and see the documentation.
-
+
+ {children}
);
}
+
+export default function HomePage() {
+ return (
+
+ {/* Hero */}
+
+
+ Execution primitive, Node.js
+
+
+ Run untrusted code in hardened containers.
+
+
+ A single-purpose Node.js library that runs your code in a container it tears down
+ afterwards, and hands you back the exit code, logs, and any files you asked for. Nothing
+ else.
+
+
+
+ Quick start
+
+
+ API reference
+
+
+ GitHub
+
+
+
+ npm install light-runner
+
+
+
+ {/* Primitives */}
+
+ what you get
+
+ Give it code. Get back an exit code , logs, and the
+ files you asked for.
+
+
+ {primitives.map((p) => (
+
+
{p.num}
+
{p.title}
+
{p.body}
+
+ ))}
+
+
+
+ {/* Quick start */}
+
+ quick start
+
+ A few lines to run, one to get your artefact.
+
+
+ {code}
+
+
+
+ {/* Security */}
+
+ security model
+
+ Hardened defaults, never opt-out. Add more
+ restrictions, never fewer.
+
+
+ {security.map(([k, v]) => (
+
+ ))}
+
+
+ Does not cover kernel exploits, runc CVEs, or side-channel attacks. For genuinely hostile
+ code, combine with the gVisor (runsc) or Kata runtimes.
+
+
+
+ {/* Ecosystem */}
+
+ ecosystem
+
+ Three tools. Each does one thing.
+
+
+ {ecosystem.map((e) => (
+
+
+ {e.name}
+
+ {e.tag}
+
+
+
{e.title}
+
{e.body}
+
+ ))}
+
+
+
+ {/* Footer */}
+
+
+
light-runner / execution primitive
+
+ Docs
+ API
+ GitHub
+ npm
+ MIT
+
+
+
+
+ );
+}
diff --git a/website/src/app/layout.tsx b/website/src/app/layout.tsx
index fffc0a5..c092ccd 100644
--- a/website/src/app/layout.tsx
+++ b/website/src/app/layout.tsx
@@ -6,6 +6,15 @@ const inter = Inter({
subsets: ['latin'],
});
+export const metadata = {
+ metadataBase: new URL('https://enixcode.github.io/light-runner'),
+ title: {
+ default: 'light-runner',
+ template: '%s | light-runner',
+ },
+ description: 'Run untrusted code in hardened Docker containers from Node.js.',
+};
+
export default function Layout({ children }: LayoutProps<'/'>) {
return (
diff --git a/website/src/lib/shared.ts b/website/src/lib/shared.ts
index 812926e..8d8d18d 100644
--- a/website/src/lib/shared.ts
+++ b/website/src/lib/shared.ts
@@ -1,11 +1,11 @@
-export const appName = 'My App';
+export const appName = 'light-runner';
export const docsRoute = '/docs';
export const docsImageRoute = '/og/docs';
export const docsContentRoute = '/llms.mdx/docs';
// fill this with your actual GitHub info, for example:
export const gitConfig = {
- user: 'fuma-nama',
- repo: 'fumadocs',
+ user: 'enixCode',
+ repo: 'light-runner',
branch: 'main',
};
From 02c38f770f90f0896367bee76583eda5596a8661 Mon Sep 17 00:00:00 2001
From: enixCode <58286681+enixCode@users.noreply.github.com>
Date: Sat, 30 May 2026 07:29:21 +0200
Subject: [PATCH 07/10] docs(fumadocs): make llms.txt spec-compliant
The default Fumadocs llms.txt emits `# Docs` with root-relative links. Per
the llmstxt.org spec, set the H1 to the project name, add a blockquote
summary, and rewrite links to absolute deployed URLs (domain + basePath) so
they are followable.
build with cc
---
website/src/app/llms.txt/route.ts | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/website/src/app/llms.txt/route.ts b/website/src/app/llms.txt/route.ts
index fc80cb6..f1fc274 100644
--- a/website/src/app/llms.txt/route.ts
+++ b/website/src/app/llms.txt/route.ts
@@ -3,6 +3,25 @@ import { llms } from 'fumadocs-core/source';
export const revalidate = false;
+// Deployed site root (domain + basePath). Page urls from the source are
+// root-relative (`/docs/...`), so prefixing with this yields absolute,
+// followable URLs as the llms.txt spec recommends.
+const SITE = 'https://enixcode.github.io/light-runner';
+
+const SUMMARY =
+ 'Run untrusted code in hardened Docker containers from Node.js. A single-purpose ' +
+ 'library: spawn one container, get back the exit code, logs, and any files you ask ' +
+ 'for. Domain-agnostic, secure by default.';
+
export function GET() {
- return new Response(llms(source).index());
+ const body = llms(source)
+ .index()
+ // Spec: the H1 is the project name, followed by an optional blockquote summary.
+ .replace(/^# Docs\n*/, `# light-runner\n\n> ${SUMMARY}\n\n## Docs\n\n`)
+ // Make every internal link an absolute, deployed URL.
+ .replace(/\]\((\/[^)]+)\)/g, `](${SITE}$1)`);
+
+ return new Response(body, {
+ headers: { 'Content-Type': 'text/markdown; charset=utf-8' },
+ });
}
From d7e07aa586392aa482907038f08fdf6a0a6a418b Mon Sep 17 00:00:00 2001
From: enixCode <58286681+enixCode@users.noreply.github.com>
Date: Sat, 30 May 2026 08:30:59 +0200
Subject: [PATCH 08/10] docs(fumadocs): restore the bespoke landing page
Port the original VitePress landing to the Fumadocs home: the dark bespoke
design (hero + banner, primitives, code window, security grid, ecosystem,
footer) with the Fraunces / JetBrains Mono type, live GitHub version badges,
and the copy button.
- landing.css: the original bespoke stylesheet, with the three global
selectors (code/pre, footer, focus rings) scoped to .bespoke-landing so it
cannot leak into the docs pages; Google Fonts imported.
- page.tsx: HTML ported to JSX as a client component; the script (GitHub
release fetch + copy) ported to a useEffect; the code sample uses
dangerouslySetInnerHTML to keep the syntax spans verbatim.
- The home route drops Fumadocs HomeLayout chrome to render full-bleed.
- Copy banner.webp into website/public.
build with cc
---
website/public/banner.webp | Bin 0 -> 26938 bytes
website/src/app/(home)/landing.css | 607 +++++++++++++++++++++++++++++
website/src/app/(home)/layout.tsx | 7 +-
website/src/app/(home)/page.tsx | 594 +++++++++++++++++++---------
4 files changed, 1009 insertions(+), 199 deletions(-)
create mode 100644 website/public/banner.webp
create mode 100644 website/src/app/(home)/landing.css
diff --git a/website/public/banner.webp b/website/public/banner.webp
new file mode 100644
index 0000000000000000000000000000000000000000..a2a08e9d2148c266eabb5f3dea5bb762506ed268
GIT binary patch
literal 26938
zcmV(rK<>X%Nk&F8X#fCMMM6+kP&gnaX#fCl`vRQ-DnJDQ13obribNtIqo$(uIGE4|
z3295H&A)qleTDE
4q%kr<&|IasC%^%zN8TX(5-lqSX|AGET_m};r
zsDF+Aul~RM2jf@Bcj7)v#FTBtGkDyg}
zmrzgppZI-z@H77BI=}uu=KXJeS^n4mSNZ>eU*n(MfARl`2iNA|m&hseEm#)N2q#JY
z^BmVC%y8Kj(z=+RKh~p)4DahlbQcA1()6Vr4F)r+=!WY}#IpF)iOAebdwW_bP@QTx
z3fcg$76QOmCmIm?-CP5{~Wuen?|kXT^Ivat$G+
z&$I_@t+R|el&_5|sR+t*P&PnZ(lgdhWiXoPERKlUOGUvW$^YFNHub|SA}Q(b81O~w
z^UMWtBuZTO8Y*?`1y2h<0t9zhED?1om$FNd=l`p0df37ALTO{hV-B06OpjT@^B;ur
z2RqQ|H4_*0yBd_GX9iN(Z(~4)G3M_Z>)j?9O?kz_eCaA2P4njRCzN>WSA|xCGXixY
z_&0GI%V?8lugAKMLD12Gz>wsIn#gf=YY-L&L-hph1;Mdqn^L1CTmpflX5^g(`3%lmBw_pB|Wj>Jwk-_mr%=%#M$Pzr~_TJ3non<
zi>TgzMF|e>^HwntKkdHy0LM#(ZiqaZR+YeYvsovteSt5P6PgBC25ypU9#cOGobsb4
zyJ(7SLsNLkP2%|db|VbIH&}iX(U%-|kXT8$#a!{o{yGcBactFvavcSd;3x1H1#M6n
zJprP!l&v4dyM!*=)QG@8{qu7SM@&bPOExPdH4K5I-aj7%)fqfX=G-|es3ZbSMuUqr
zFE^)3Qwo@2&&7S%r)i%>d=2hWrFl9qc`?v%wKrd^9jIh?o-v2uq-HWIXNYTgR-3W%
zqQ9<-6R0CZ9f1vqjAwFU0~FaHdW2W&z$4kz)7}+AR23W`fNP4lUDR{1xfp59n_WnL
z3SNhs2ZupF!2V$DtSq#M;(FcLowS-Fo%YE~W~XfI!peLYV|Isk!Ku=G@*xIGTv+oP
zGMz-OB}Y6Y{B8@;3_$FUCYAZS7=GL0Z!}HYp7dK_vBz*ID#(k)3TDTd=Q`Av-5+o-
zQMuN-*SI;W+Z5#aPN_o>FR<7RI|r$bpR33HSb_0yqT#YOa8fJexT47ociYlxI!~?a
zLQEN^pg=RRAqT~>N!c#7HTOm@%OJSY1+ZI2m&1!a+d#tVGzpK5;NijB8_Ek=1J74`
zG)9=K%1>%}xE$*pN64XR_Zdz?yd4@HyXOfXmS-1
zYW^w6bx9-;)VQ5DgZzMDryIBVCmNR%Dr%h6%ii?H0ak3_6_rCXkxvH~pi1)@Do?I;
zMIXfoNj{xjEno}bO?Kf#iog0i(F;PUI+;~^WS^1Jbi98@t$uyM7S!~p5^@CAkk~61
zRq`PHG<1LJP}RFrGk$l1}-R3?+S9S5+K{49NZW{!I~)
z9K`bVt=?RU*adIj?F!GolZ06-Cqes7rK2KOe8*71&?+om(j&Aca8$aHwuhGeF5O%%
zVir#R1E9%SjWN4wxGQ2J=gVIp%}iRdT-KsCI$UyH5t~Vm^)vj>GzMw0g=qV4nFFx=
zjYf7pg}YytRe2))^3I*vAQnFKEvEk1)&AxYDS(&k$^Uw+hKx3cU;2mp(JlQNRa6O2
zLitM}KQK+Bo!TpFx-#^dr{>Knv&P2(U@P)YKIx1fGy)k)ZYZ6$<2^l0!73O%Ot;)H
z8^5eUR>B@Xj+ktfvqkL%q-5t6b=&~yUA;f@0R|3|WpZ44Gt0;~{1?p9#bs(k@uiyM
z>~2ay#_j$~3WY%3!O+Fq7AJvQhx^C+FZV{f63AWnv6aD*h=vgyf6I-Nw{6h{l=%>>
zCqTuH=Q3fa*|wMU-t>&(9>ed>#-tW>w5DnR+}nJ+x3>mgAgI@HrU~DYY%=Y>inWz;
zp2BZPAoxDlndYVoHw?gR0EPeH+j_s)=vHsvKfSid&znYCkWn^GU|#4f!=~&HjSJ8bHV0}UWSwAs?gV?AR2BTKJz=z_VH;P_D-S=`
zFxa8eS;9x)H=fK`RTQmnqdSrmJ%@f}_#;>}QJIoyQV^%SvO!1rowy}Xl?6u*o1?V`
z!lrnCgUaRyU-$$s=s;%^JD4BU;5wSQ*YbV>+aK?6&Rll9X4k=H8XvFyi=3xsEl8L7
zNyEK*o}Qn9vk%scWREK8vJ)E+c|XZeRB+*@gUtGk(QG?s$KgCGJna
z%*kd3%5lc0z(WXhmwDqLNcy>;qh?@ZOqhGK(N)M--3%Xt+YD{A<+7Q!?6k(Ts|Il*
zV?k1oo#j_(3gIBW-Ult(VzS16ncJisZMLD3<5)Dv_9sh^pC8HbHqgs3{5grzu(Ht_
zduoh5(?u=vUo!vFU#FLeyc~h^)Oz*%Ee7+SyPT0LPufevp_hV7KZ+(PB}JOC@*3Oo
zaf?O#GA9@#E+}aHq9R8?fGsQUHef5q(m_+-z*upQ-Kq+X5I%4Peo4wCx5
zTw_pot3_Y27V@J|`i(ujLdr0JSb({yYW!OXBnI3aV_#5mTikPwPDvz&SyJ{^$jXM{
zy{av%yjBr&g@KB*K(FQYW9e7(t@||#rW6eKo-(G@Xo#2zJZqvsnp{hqG(HSGy5p$|
zn)%?}>mPKtv5w=uX(C@BQWL5uj_d&7lYQNav=*@TTmCN(S%k1
zRjGwE4Se@Ahc#tP_s%sBJ-CsZ(SdHKzAy8(-vt&)JAaaK{z`(QhfUGnEm5h*N*Z8M
z4%X+rH;VtT8QCYr`;Fg)KOKT(%YR+opTTx`gSBva`N3wyFdD20LkdXpN|ZY19V}IQwYrps?>2>F8-KL&N+r#`PkRhj1CGrJ$0q)v{5`4H!LRwRw
z57&6}a_+(*>Lsbl$Ut@?e9?2tdr3xU$vSD=-fPL}ZA7j&hcJPp<+N+I^eHoA!%{V=Fh4aVLDVg3}O
zk%LDXR+p+`0*Y1-F2+@ElCW~dFnGCUXsx-?BtgZ`aq9A3H&AH8gL;T6zN5FngdcAt
zgHh$RtIjNhq#2sDJaSHBb|0GHzoWiUaV5Gq@+0hLY$-Fwdz}vHjwzwoDyoWrLEA*Jog=&%F?~`_q
z%1PN3urBx1W-5e;ZX}WK&f*))XXVW8Wox#s7^}tuIuFF
zq46eTzGFbl9fzJn>55jDmIsEix}L!P+0sA!n`-A{>p$l%Y(*J|^lQE9Tm*rsoiZ`5
zo)@g(ym>$WX)gHYhfS7yVi|K~9<4g`EbHB866g2Y+n0wJaOXD7uN@
z|NJk~AU3g9cJ8Mx3&Yb*VwEX>PfMr3ktDLi13eeq`Mor>p6pp_7@zaByA%ZpS|
z^ZGZyp&ATF>BSZBO=KM>*6MQ#D#^VhTuh}_UOA5q{!gYmUl+NCkki;KX8#z#7bxYI
zMF5ay7>^rbg;l+Y)L?O&J=FefbFtg(MXYk11|)E((tP`14jiAgnkh)eh%C&UWsI?U&7a+LH9V+Vh9qG?h)ylq~%+y(jiObloP$R#)ABk6Ig%krcj>{m`07s
zoZ?zaOc~Z&u*Vbp&$DY
zu2C^-_n<41l584ecb+ka;??uHExzN!_Fj{`8@T*4hi?>(xaKV_WhBKU64!E`t@0u3
zk902rk7uLT8*Hr)n42rE!=El8gRh8_%7zM5oSY9ewN~&yT%~J{?B9F5^ZEVwWZs~V
z^;>#>*rp`S>fPpRu2sLMa?IlK78(n)F+J3{=e57;Kv;j{R)e4Npn$Agj(Bd*ywrmG
z8%G*67?E}e^_tIMnV60F9{=@9HH$0C3WRA3(K6AM>FX3Px8fd>)O#qhp(G+)Yv0!=
z`?@dR{0ClwRV&6^*Pac5SB}sl#QB~oC
zCUntG@nh9o0)!tzBZKEDXMCN8>7OCUwEyIAu_~!>V`E=kHkBj;(kXIb8S|e@S@5l6
zi|E!+qz`jPa+fn53nBv&%Tf82KX07uf`EPP$>c1+xO$wd+beh^Y%zTO7b4L2n0HqP
z{ZpIz*#%3UHaagLaH9vxh-AP65|~Yjv8a>*xZPJ(b``tkd71vOD-ptw7Nbt>XS$(P
z1560r!NvME*}K16@j|aKqL-+_^^G!Jp!4KldIA!1ljE)k8&I`}(keX?4TTsSCw8T9
z9Xu2TyTd`uvUbZK|ce(9g!^1u0#Ig^rxmG2z)5vdeF$mm#V}YG+k7!|FBGI4S8)X{ZZ%ElN%>3k
z5)WiOwla>rkEl4P_E*T-NWmfG&gCi{U)nf)%@q}sta8moXY$Wj-nEX+D21om9-<&sJnHCI&F8t+ZRiU_j9n#0;;%Ps#mY7f`h+EoO%@*o_KU0B+KB$pLF*z#h{qQR7|
zX<14g+~@Wg;pm%q-0(bXi>b-oFPiNK>ou|eWpB88=kVe<|EQ2_$g}AbxQ|(esTYL{
z)|F1<-PMzV(!b>YrBg+Ed){v8T$+V4V>y5WD*As)VdAaa^geFb;oNgp2vnV$&_0D_MV*N^CJ8tn1-$}DW&&1Q2JUd@$Oi@>|55TTp
zslXU*UrwV4usPcQF{Czfs^Xlqcfv@rmr&jr4V+@tFJD_{;44bHi`Pk}e~+SYj_IA{
zz!8HTST;gMI~z#dN{sLl4$}Ys>A85K3J}|&Pc=VM2cCkWivb%GUGbA)#Y6GycI750R;0UyO2DPb;9oY*AU((bG9%MS>)`a%?DV&HE
z7l@CX7d>%_{1#6wH%ieFO~gzJeOLmr2$|aOqvoP8n8^4Qhx>qHiEar0Tg8w!y!5SA
za{S~tQPmLKBj0c0w#=GGORa?UVO3y!LNU@ez
z^B=T?efQZNZoLm`FaG2n&t}zVzL!U_-agO`Fk=T8!DjE#GZPFgg
z(*~v{XjH+lo+bY0Wdg$-3!SEKwI#OPO)vx`xxa-SlzzWaon@t)k=f}Y{
zh30J64o`uuolV#bG?GWbKA-T>f8vXeoWUpKrA|tsVDBCjOf%H~5tp`pu_ML?oD_8f
z+KI3|NR+E{tzK~(#1)NMg9M~&J3e4&84x-?=~cA4Z^1WzzJt0Pbo~8i)r~_%?@${O
zJ-Q+CHN_1Zkm(h)a)phI7DTV8G~_YUJiVlIrIZ$i@1%HVW77Sp^kJjMX-plA-IKSC
z`6k;T)3`tY{`nb$$O1JIlxR8_%+}#V56CYBpOp-IsCsd+e-kKcz;dIh0Ibh0qjOqh
zkpbMoNe~2`jdj>@nNuLpdyZ^vV3ow1bdRV%
zGxyZ}%5qr2hM=Fdzb}0R?S*2qPdT-LMT<|jPy$8Pq!C1;dWFzMgjp3n~
z%_NzM0O&(L(uq$KkSD!+h@rZs{u0te&u2&5w#4*u4QaJb@cc5CgW(P`k;1q%h?32+
zN3ONLe$E?5)TrRf_H2`P%LvI28R$*$Y3(+OoNA4{(77TI0}3L-9+PBd+OcDPgKQ_n
zU6mbVO>CrB%0uJUuW)ne13@oAW(_NmdmVhm>Q=gTiVT*!)fINwj4|*o+@d~_?%?6-
zVpIEnoN$vMr#3YVRz8}bG{S>Qt{aoj(T{`M;mI~{@9H%89$nkwB0empSTF*Ag`;Vf
zK!^Qj(*+*i-Gtstu(QJ4eD?!6W@GAC?-Vw@hhvWiuE)1^9Qq
z;1n|@AV^t
zYPr*f#`l2yKslNfxt7i1Nf+IfJdUUZ(EF_C_v42CMAJ|xKbTCnTM7;WYcnV3Dd`e?
z!-i?r?ts>z3mjDi=R&*{_=Q8E)q4j060B2>8use(BIc0+QBL3)<(iige9_-_<8)o9
z`}~w#l1fC*f#`=+pNDH>|YH931YcsLS_
zv{O)QNp#irHZ8x7&`Ka`8P0*VB7XVPTI@fSH==ivuNgph)}0KHg~R9BQHBB8!Ol#h
zb2Kr9`uwOgm)924qcV)4ETv_z<>Z5I+D}fD%||YKtIqVKo2tD~NgmySN5~uy(H^jc
zlEN8Y;3FF4GFSa#uadio>4UR*ZCKyRT$~BI-o@LRi^;A8h{3GD1sFgRwt+<(s2Ci9
z6MEKyu6x=i)D8~1yz5vsZT2-GA>Ta$MkYxKGda4u7NbEv6$xFYohNMN?HeFBiiU9)
z>{L2j+}n6c;a;)UTjdWH_kjboOH<`Z$B8+mu*d_ZyZ;d{g@_mnH4WJ~dc8wqG1-Jb
z)#}V}xCd0S+F2{?)6c~+081PI`5TL0RF=w&-QHUfS`q5RP6O|*tHeaj%v^`VN!&J@
z1W*)jr^2|hEyl(39|C$L46&$?~O?F4gjkyJ3MipO7>
z`KnvA%>7k%SS@)Xs$|!jvVpA(Ge8cs^KsT3am@V}s_##oA(!yj6Ax@LYW}xCA5G
zA@)5l^W9%#4kBA1hj_6V>HAn3q);-G*+!r@H?rcjX_q1sycP7W2Br$k6PkRKZ4Ed;
z_xN&8b`n)$y9p!qrQcFaLI};)^d_$~;oX$fVTmknr4$}?{mG14Q&^&Z;0gLJd6Mj7
zHE1fhNTulQL3sD%ViYg(7oNisb;$&s28}8H)5zGtOF*M7^zHC49`lHQ30HBomR|Df
z4^}eX=fBD`o)3&^CB5Q)#^fJ=-uA|NZZg$>PnwEf{r@KE{
zh;aAWhEl!$%^|N2Zk-=gTGt9W29n&2D>X>XeR5KrSJMkyp^}dpjff4>L+atyszUWbd-EW$w#_2BKDxJ&d1OJvCb$
zpGtz5GCjqC_9TdBFz~%uKjdQ>KrwmUc5$G;R?h`B*_|-2PT4XJt`e3uAJJnWs3WdOE^4@rJ`+
z1P8HSsv!ItW@Egbnzi3SS0vc@tW2R7l6(`u>T@PWe0rt>(-65nNlD;Q(Dj~@9D$3B
zmK@@(5;zAsT9)iH1Cr_M=*LTxx>d$|3C`O>MD6fGcY(G>Q!D=tXr+QP*gLN$&}_8W
z!BcECMU)jZnQwa;RK6hM9YNbM0AaJ-l$0T+`S7Ttu*Bs|L@+_HM>{z?X2=Fmqe7`IR3loy+;I%T*&v}fXBWqeMJHk>CiX>!;_@j}OEUBp6cbhi4>zE01*Wnk
zainvAf3E45DrI#)POOm{ePH&g?=UsEX-wFc7&GNZ)qi4CmHi&ZS9
zKI|(Mv-0vt2nZ+E+q)C;>~-;;MQB;P;y1{47yIgw%YdZ2lTQI#JOqkPbl4
zx;*bVYAU3ab|hxM;~F$0R0|LLw-)g?=QZRZzN#-9QL(j4!}8}FViu@*{fWF^xiF$T
zEP#46MJXQHDgyih2vMpO-%sA_^OB2!mRNEG4h>yBSj;-{J+D-n1bP4h6R0K>^_zYQ
zdxtZ=h%nh`{2J%tI1f;^MyE?|BuG-LVR4;GSJ=77$z8FJ+Ql6kZRyNMBQora6%h16
zrZuOph_8p?IcVX%>wB3}Y9;SHFh+-e0&oka
zX)Td!v`ct;JJdV5SYA`}NERwE)5(Os9a?}x=s;HFjGf~h5a-`sJpf
zq2kZ{H-#dE<1ii!&*M^I6xS``ne~vslf%$<*>tikPyu|L1>o{^81W(Xo!D?q6(PTBe*HK2lR^_McPlKd-5NsGQJ==d6DNpBLZubG4hO+
z*b1oxfe!lUiZ7bU944|EcFyw%8geDn=Bx;E1TT>-=~os~MZ%zLK(TB47QoN@Z080(2NHNN
z{M1~3(;7H%Ts9m#Y1D=oT4^=?jOe}dN>P8JNM6|*ibmrmE@h<`g>--n&(w|giIV4g
zodHmy2UxJ?gu~fV5WLFe8ujqFI#s_8bo#A|XEk+j!V}|nKrccF%%UJ8TsiTn2gn;|w2=BD@FrBYVQYAy7DRR$YYXCXK{-lty3~NaMYZw?t5D_I=OZ^LYm3X;Ou{6uJFSjWF
zAV+xzGtPr;p~q!O9f0G=2=1M`l)D~s2Du(X^zniNf!PZf_hyWbjg(k?R9Q~4VOF!5
zcypg^{w=xv0s;2nbLq?l6rse8G)B|{e{;H7fE|W7uE1P*)*8W6Q`*Je1fk
zIf26!iGbd9hPxujt`iDbkZEe3Dw42*NdAZ;R<2HpQy_
zd$>{#IHbRd3b9gV^*Ao4=4a>JPYgOqjd=QQS8?T!+
z##c@EF^!L*qPDtY>c?xj4+UYJ4et>^PIuogrz7e5zh(J9if%x$_I*)}_k=JIzvK%8
z<(t4kK(Q7kGFvq3C{j5`lSeAU9rQnW#PPe5FhBo
zcf05cqWDG9+^$4RQm`qETnZ-bT!Gcf*f7Dh>WlC&1?Sm^#N*Bp~l)dc^4}*82Uc+hnk9=8
z@0b8|UoMTo^^BXJ%vPyB2|tL;LwPK0wFw+XXCRJvda!X^j$sn^Q#pmc_T0ap)V+Z2
zXgE`9uA3I(Il6KVa@RGKANhy#&|LcW*UO57o=EG8>BOFdPjFNn>>|Z^3rk|-L&KqW
zKUyoYG@wVPA;MZRiN3)Sc)br2P%2=jwVN>T5f7Awv%@PWz+F}d-Xh}7%9`h~m;@7)
zGOWG_mNW1f47ngftfT76hPWho6kr(hz+bEN^M_6!Be1=oxu0vl-Bx|)t+ENRpLA9l
zbqMZw&pvBQxf)w$QtVOvqN7W(zCrCp|4Ip#F5(O0cxDPmd2q!!0r@y#@AfnEQkZLJS`rhC}^@U%JG
zjkE3ai%y{tAkJA5gLLjyY$q5zG6p!Z<|Mt{4I=&_>VoVdP?iHHY)ZV^37ssnUpA5sXqwHYdBfI4$o{dg|_qYVgCK0Gf5a4V@K
zU4wz7;BUKwHcNifbWy*Ft`^G9gu?YG^jaYGV~rSfv7cOGLfSvi_x;-Pb=iz7ThqxW
zZyy%j&lYiTjjVPbNc0q@^MZ+?5KL<2ZA3t8!P45V$zg`Y&o66v(7f!<8ePcK2E9Vd
z5ia!|8Ec4Z1}TVTUuQw3cIZ<}vGX0s~`Q<~>A;kc`7v+VUkU4az`c>Zc$Ry=Z@ZRCgT$k#l
z;n$>jkO+tJc6o>PO~H@84_IJ9F4V*INl6zd!eMJWL#>yEu!HjMB-fADCylUEo(X`h
zAYt0Lm`0Z_*D=v^@4qVIh7M>dR1Uv$A&hYq9u(Qr>(ha5Md_y-H#SOA?dL^ec5fFo
z8M06ac!ibL4Su`Ba3rb6l3P~zv`9B>|fz$hXNzwhluj4Mn?tj0mmlT9wL>
zLK$71Oo?Tg#EdvwT>PD-c5rcph4g2%s+IMtN8@nZ*nCgJaXQbd{R2WT_Iya@6-meH
ze&gvh{!9&M|Ht29^SA)4i;_RG{~~D&O6nu!j*o^|wn6z^oW+L!UdXhke}S|m11}1D
zX{||@Iz?gx8Xj~JnE`Id{$Bqpn}t%I&t#;Xe)&Eh(k+iPY2W6G`$+szzriK7&3`QU
z=sefx&|IT^|9Ck$+V-P95OX|j2J?hE$M|*r;3z4&zbA7_!YZ!~Ih!7>a&&~E&Rxpm
zsZ-XwwVPK9?SqOD8}m&*21Orp07
z`i;ca^Zgx|KD3(;Z~Oiodh>PgoF+`JrR{%
z#}`PQt+fdg3-x<_mg|`DNXHmUgIZx7pk%0(3iT??Ct-pT=WKJRj7S?n)QeTu1&M`$q+Q#HTF9Z
z`5uo-D3zv{Fhlo}>%RP7XX5(M;!Qa(YrJSWMz6iQE`54eaAcs2|834^0vo`Wsa=P(
z%(Afm$W60M1nLc;VtJRHM?M{7s|X!c$GidBhU)L`t}|MVG3(NcJ=p4RACj^G#2K$<
zg`!jdQIn-nf=Y;oei
zA;Imnj#ZWegFGW+y>4}td2i0zDKQDE*7qRG_eCW8f~K8`_i62dS_xXI#r0L^A04P!
zhR$cfhWJGR*0ZXm*wI+8itJ>6X3bk2V@QR@810i~#P&XfIZF4}S#UinJ0)u3cFdaa57g4vDI
zjhEdaE1`1x6UAZCOs7c!l>^tfI6={J0~M!*no)`B!GKW)-cC=QCiD$^oYt60mRh_7
zQ(K{%!ZP%r)Bc*(xyo(zOn%!v{dTpLo>Pw&=6H>?Ez-BAPk~=G**Q%37{*p4gr0F*
z^7rvYIn;xA;(>Lbl0rM-J;q~1msw&D+|~oQP|}mqv=a-^AjwJR)eq(Y!n=i}zI3>6
zG!-dR)%j4hS6)RA8!2{@+d~~DT5))r9)tGZH6{P&3uaefm@NGka80r@p!HI_f}E2>
zD_orSNbW2c7m%lsp4tf$^S*V&jw=%_a?y%;Gk1p5lJNHIIKaCgS09T$nb|Ozc+>kc
zSYew9yQ?0onOQC^hCWqAmtPEQp=KvaO_WR63mIuIe9un5OAEH%Wrg~{dX{T2JP*~Y
zA5$yKr9|N_isE+y-U%2^j#=)s4$9ux{6)7Tg`=*fBmDOAJ-_g_&Hn0b3MsaUd1pXK
zFaz#{TXyBGaKKTZ>=n-*GoVAfEPao#@9A<1vxjhM#C9OBjp#cd)&@K&i=wS12OQ?bib5*4G`fqNI7w{CjOQ$+A+sN`HHk4-sy{sxMBQT=MlKN{NCN*n60
zObB88=WA(DIA{8#&H-bpFRIn>XU$dss1QEm%k$b-mS$H&1V3{qLD~A2mN{imF<{?|?AUo*)dVrS1j}?W_=3?=g^@$$
zq4B2bFnXoHVD1_jCMlt)XwwJE_vgh81TS~M={g6@L<3bf^}I^$a2i1it!tlT25XQI
z@vu1VmtL{5)+cR|Hgl^}FUnj;j5zvQ4oKA9)gma{WgrK&sqmm*#O|TUveLXZJzJJ(E;-&Cm~8rn~!1?kEwix0$GH>;abj4H2Jc}II2Q43?TL@cA=b5^48zu>qAw<
zjHZMc)Q+v$5SKzXz0KeKKy{QGxe4Rp+CjY_4wW~)x1m1{4BJddU21*^An%-NiB@MH
z1qPfCNyXe6AQ}{AEyeHyOs=jKk|TE(H0keJPVm<_)@JY!dp}6YsNj$b@c!A%-;1A!
z=wf%9VPfyWqFZtk;@M7P=6#%S{tnl{9CaIF{EtYFKS?o$bbVZK8{~~8rjl8+^0bkN
zI7J-RyxNsoWs?xSIwaCU={Ytg(7U#QN9zR|50RoI<9@S`+$p}n^@i|WKg-mBqItxnNTjMU?Wd)#`g%Mi(%3@D@>fLNW<
z9hPFlM4*X9C*9-N|J%Tf8i-Avf&sYdVL|g+_Z3>NFVY+9&v-B$ZA6T(5Zna;LoPJq
z&%aFs(nIXx`}O~amx~se(b=$IeoKH6;zVj9TpnkoEN0FGcIm!1Cf9UB
zTd8Z>Fo850jGRo$PKRc4AcSNmE^>BTFfZ;*Ttlw-BNiN9&=I1W4?2=G>TB(p5LKC(
zfftnjgG{e2m8W@z`6XU$aS-!JJu?yN)Tt38$8pE_*58tMqf<
z%w!+3Bdxxq@>^G^5x8(TZ5a${6w%dx7#V>cQ~wnZ4MO<$FFdFnyzVE)=^`{2aD^8J
zCl>sQ>i+(TsiA+kcz0aKS1eC%}Z#|OOlD)TcF_~DEcHV%jTfUW5r56`-L0H+f`xm8mcH_1VK)0j-
zsgD$=w!cVP(RR?<-`ys=4VKUs2o&43aR=h;-!$Mi6uEzfTN!o&UY(e9gv8oXz_Fok
z-p8&Ca{bH|*Tc5eag0e-Rb`X$s~g5o(3&7lWNr%9$OjM@ghhEiUgd+UYYm$8&@cAr
z&K$Ea(@;83nVV1&7sQhGf{O1Qh9}D>^t_dkf`ciwpAZDtoR=7RuKu}zVc@0S-hyaX
zqP=cSzs|Ha@*k_`%1o*wi^ynj$Jf`
z^p{l{c8`z;ey3|!pjKk%rf
zXmFijime+dtoE9pR%>`J6yr@}sSPg$xx+|f>3w|OvU=wvbk*sKmpeQTWJD&dyEE=A
zr;q9@Q6e)gvR;2?sz*Lb7vgH@{>Z?3+9>01ZTG!#L=1<(+P5Zc`U4cUDRcvsAL&@{
zUDcoL3n^L&_mPXb2Q|OxMQ`%`nyGI7C|v}^_=G4ppY#UMBeokL6754cT|}2X*3gam
z`5b_0A)W^I#9ha6ffpWlkAbi69GQ5s$08W|Je(M-3cgdwed}x*SJFVOxgFCy--2*+
z%apO9VqiGza++lV_qu`D_ehy$$^F#NQNlW?%RjCij_F9)e4bN${}!>b?d~;4dw}^w
z!{C*_Gjq3}>AQJ6$$kP~K(&QVb&i|d|$%lwU!hzDO%gif2toEJsOgfP>`xMP)Bu{TB}Y@XDQ*@YqpDLXar$nP0r=U^lmlVOuoTL`yG)
z(x9pRq@QO?=L6gy)FYl*RKto0tR9xMd!w54<6z(cH3!q6p
zD)(HpluW$algeO)l#0v6t9h#2mwO%Z=59@>#8~~I@@ES*i&guIHha=$W+gdVvVz0H
zcK7NK%Y?jmz!9M37(!+e$Svn2YS()W(P61wUdQ_G>NCNXqn#~K_^=@8LI6>gxJbtI
z2uVr+#}};B5L^K%i6$;C;Ni|vzedBOyF4;yz}BuOMyT$LlNuY1}dpvP822QUurCZFrdzr
zy=!K0K~hCf+WQ7^l@+#&Opnh{s}?438SE!)cVeS6oh0}j4Z2c8q9^Z1X9K&CVe79D
z@PaaWVo^J(-&4mi%0s$L9&Wg3L5&td`Z?qFKpWRAkH#J6(vY*B`1|snd6c8&&+^u(
zg+nzW15Q%@dr!$rP)%9JEJcggV694r=NE)2YEY*EmDQ(t$WFa{B{&(#Es@>G
z{2@&!bAQ8zlfac>#@Z01hCQNC)hl95<*04H(DOCdPhc1V>B+W-!oPibHyBL+=C0Jt
ze$1PQIM1FeR&Ers{6tFH?yEg81LH4QZeXcMpkY&`yBeba?k%&
znR>tF1HlUdV-{^VQ1b~+V$ZGtUatkNY1`#=Z%1SE*LM9$m~WNIZ}pgvbo*Bz;qcBI
z6@h3V91g1qG5z%~2TxnM*DhO5M*5hmJ!p&_8yi>~TFP4Y;jug_JOfubasSAAI8^RVGT8`Byq9>aLG3I`5o^e;iR$@V23kvpRE(D;y$Gs>Bsw6S{w-
zh4*#uXdLRx`jd6B=UV2{EsaWR#!AolfRD28{hV8BJZfMl&V?WWt#(x*Fh-qQ;wgmf
z3I;T({D*GX#Y+%~L-)qg;dm+|R?CG(DBH`$@w()ekYBFQ>h;zIdhD}
z19yB#l0Bpvf7A$1U$R)!@1%8vR?_m~--iG7%rw2puu)>D2P?tpd@P~6*hIPO5-|82
z^cmZK@Yrv&(Yr7+2>$+ozK99SGCdixi*ayKPex-E6+_y-6d;WGGy?<1e49u(280ui
zYi~>QFIRm8@)Rxa83gvFTRa2F732>hu9Dg|6FLy&)_dwdi;Ks3&G12t5i&{UUimFR}4%z24J&+%jbKr9gdgW{k~m$
zU1Ih+bd&_wEE+GV`Y0?LvBF6eBzjE6e=kL30Vyfg)*$%LYsInGWS_%Df4TbOc27+g
zchlD6tJSOylsGOIWDagEdV?`f_06-XHmM~y&A~hDRqGcHExw2Qd~$o);BDl
zbRX9QxC?gqju^7&Yyh@B%6`Qvh_adPIz8ir&mKkK84JY>ri3AEepy{#1YlWSzd`l*
zu{VZkRqwl8=~-t-g-Kw)Y}|#?>>#?2jP+lJQ((&Z2Ae;nMJ1aWt185fx}=Ci)41*Q
zE-#q2y@9NE$knp{C_+5r+%85v@~8P*w4Idzz?=1tAa4SZGhdzP;*3N#8fhijW#$Vn
zB!oKS_i%K&V>usIOav~K0#0HdyC{*+*$O_j|tBc
z)hhCekG2DUd@u~6NZ)g*1bnf9BFXw4$LQ)+z#xGLa}YQ=%J)7sPSrFJt?k>=`P9t<
zY*(!7e>t;F?1_)p3aq42qlQNKV|}YLwuvNjc`KQla@BIQKOdic2M1kM8CAGD$XwDH
zPs|12d-rf|6^HQTJ{&$md~}bYJq3M7Ex#kgAEHp7aCs50S_Fr@tHxY>
zXX}lR{ascnXdq31RoeUP78^cw3bYbV>=uYdF!3n|$+d?o_A`j;lTz)OpGtv_TQ3bP|8uc-u7;8vqyZpT7-yhl8ocv|J2vtxv8
ziVnf-um_Ic_nbx^X`M69gKs*)l8~8H{5#gh;Po~!n7Qg~{+
zndz`^Zd$7k9;&7-39H5D6KYLZ*Ifdeu>+M>yF2U1EoKE8C5SSHzL{v8(+|cgVA@Ac
z9Ae+rx+q_lvoH-$>}?ZTB_<`Ml@lt3_N7mfe&6pG9XES3!-XLmhpcOx}+!;kvO`bZ`)iP_<;?5HI;Ppz(=jvXH
zv0exHi~e?HL6wAdrgvXb-pUPtLxKrT8Zrw5`CZ
zTbdvH-U2L{TfOd9yn6>RuS0TL)phhVpD!yJ8CiSK1@dphc8?tG2VP25KQyKgghNt}
zzMjJMinzRYflA+N`jO@^;!2_ukjQr0`np=?;1@&+4*^FoPr2bKy6Jjc1qLB0O3zVPJK(+nLI5zOd><&N
zGv2qkZUa(W^_}v{WWuXTbYZOOfo`22hJD41@fr(AU5ZT<4e=+di$2QtG7jVKn6^t3ju2
z&YtJH;y&G+bh=$`&T2hSF%hhBoAeR=%s_@4Sc1Vsj1I&pCgFwq*r9hYKNy2R!)=0c
zTOjQ0B2V&q6NIX-YHC_;@^k&}gGZ>9^9>TH=neKE5hNUH)69m^{3r2um#xD}k>SD5U>!-H`+73(WwG
z3T8PUF}yN^cv1N$P8<&=0^lDF^q3lD(JF#D+QqBExV;CX-dN0Un@llO`ZT)j0
z9_-hIzbC-z7>TP;;8OJR;xTJBDU@XMF*Mmv;W1fR&qS2jBn>nExE1_VpTEOr@7+E|
z6pV=@R>p9M-X5GRgTZd%FME$4f)XSu?JTxavs^zedSZUOT71$BNIExF5&7^Kh6%~N
z-LcOB<p$9sI4k1q6iu_W{sJ=KBWJ*(#2%?qs{BQy^L~^Gms`Ts`!jq8-Rk@y(%2
zPk_s~BU+{mY#9mux4N%yU>0Tc3D|GlQlW%mO!s~-&XIE?sIG0;x5o(hSM+)zM(rSgpS#;m1QX1iO`sXWx&>_R
zC+sqr9{B-&(D$Y8=hM5n
zvqXfF1wVgCLa?=7L!7MUZ=pn-9T#{lfPKI+bR$Pi!O)DQsR{TL&cCM-zN8U4aj;2S
zyon5|TuPxg+(Vjp;<)(YMZuXuECwWMwv>BPVd*sVtE=VLog|eZ5NA~SsB_)rndz#k
z?3yMr2ZjfB5t!`Zd+mVJC{1?6-1j$L2acj*%pUhdw@c-;4`ZGi<{V0vk0Tkd5%{4x
z(}$B>e2*W=t7FRzN+KZe+{&?xU~4Sas2NQr1WRC>xscxx;gV!4|B{nOV3PNUX?_Mb
zM0EbD)=oL5i=byNP7_TLf6~xByH<^ECkXGK!?b(4TnTiId!)RF86X;=Vh4G61>3o`yz5S38-r9B;W0>!n
zb=88R0d~WsZ|hGcml;vwu5pWEx(BQhV-hB&UQFF_uu8+F@XIkPJ>Dq%c4Kb{sgr3%
zeXXyR36eHAnaZKQ6Q*VQ4`wvA_7T3*8=&`O(WK2BPpGv|nFAM40ZPogM6ufh7C;H>
z5g&namG=isZM(H~ie@ZCrEG^o=q==}d)DG?CO3yW5g6_xw!$Z&V+OW)UfiyHFmCm(
zw`8XDf*O$kI0J^e(VC);FVW$}{1KN1Xi>r-)fC!nF!MmuU9DEc9J_#Mw3k|gPWIb?
zi5du})7?FT$WS?_#|YKD!E_^#0V?6LA0EqQIW+q2*ARnBQ+F1
zqn}()iK9xAlqU=avj;tB{FKchw*v;dDnM8Sct~39RXpxPX|uy!o3nDD748t2Q}U-eH?lyy8Bs1FHia(&mo;Puh
zf8TcNh0>0li8#Fl$CGS)i-DlCDX=d($Q%&cCPAp0Cr{rPX@ZjB`ob*4SWW#cAq0}g
z;A=5r^~;aa`*5EO4Mb9*EB^N*EaW&Mb#^s#Fb&e`7hV_$tfx*U8fi!z`o<|zoCb5g
zuxUJO%?}EGhRQEsL0lFyzXDn9!H@=4t9en~t|Ec;oFi{MljJlHEDSmsjj}&}e>qqH
zt{GD>kw-fxi+IB8)KBCRwv>piOH%t3U3mX78Sm91KTl=ICvG(=EN*hd`T7AU5d5|8
z>xyC;&ikbmj7-t5Y-?)U<1Bt3Y=?76kWrQ5ylg~_6ae>0vWkKR+U6H>N
zbb_WnHAC;)?vNL6BFgH9e?fq)crBcEW1gmdt7y#&CHRvk%NMUguf-hZ10GFF7=GGC
z0W)5|^~(pp8X5uw@KCuTuV0`DA^Pna4niUep;r3UTxjD-7k>aD3Ca0r@
zO>%&jk3D%427WZH`UWZTct{`-M->jiKLTaHCufuQx0zDiX7TngeJEVgFh`!DdXx-2
z&AF%4xHDwRTPyQK$I|u-zGLpl0qomzgIL|Tct=pkg%z!1N1)MDv>DZxmS6ya+ucf_
z1rm`hAC40t%q&iZ-YL8HqTLu#nD@{VSXUA_Q{Wx$fDi{wyg0F(N;{S#)RL!YQ12kmRV{9TY
z2^;Kmu!`W4d-0#;zxAbWM0
z9Q<`nAVbuie;38adM85tCK(M>s>zdk-@LDQYZRIvZ*5Oq&CST!L#2~CNc1($Q6LrB
z_X&Pb!!PtJU!dKStrLoIO8Lo;5#{1fDY$7gj#ditY6uaDOHBII(gd0qfns@VI-2>l
zf&{0pc{`K%5UlAy9MYmk8J5fy&EK-5shc#UZzwcr;H32PI+AB3P>qs)Vrgz-x>opAZ2GI;2r*!Ha@0<^O9P
zaOu|RYi36+S`peL(haqY$G&BFF^|Xw{+E^2
z1xbMAEw}UC7HNNZ`R|h{i#MJ>8XR9rO5S4U9T!HxMuiWkL?(=G@iM-K;oN
zeKD%sbthH9K31Bdo`G#t%RBD0@V3yMj~-SKGn&=Hqfyc!7+RTLcCJq2GpOG11wkJ@y(MV#3RmP+gi*
ziwhl|*DRrI_QM5$^RVEv_hDT;mK)a+Jd(tXU{#X`xK#gP4h{hnM*-b&AZQGYC-b
zM~gFiJ0F$;$K=@P6^o7yEH;7Wcc~SbT9@Rr{$1b7AoJ=P2^DN!ZL}guuOr%kIg?
z!)OeQVTQo0Z3gedyXVt##Wmnxk57t%QpGd&PWyOUCOoSjH-mcJ+Xn;(MP9+)GRvCJ
z$dgu~kU7O#fa?AKZ}q7RNC23((Cc`NaTPCV4xc}q+wdW9+tNO~QVY6FvCdS&Y%5+3
zxMXM-MHCCO`Kna4{^Vg*>2WO#IZkd3AaLBAbnf!rodgnn{CiYCtYtD_Z*IqW=60{DU>B{x6qtD9|X$#L7GaJKXGBOlfoH^&x?9t
z$zKr?HO_=1W2QEXh0gNVouM>1+jLhg@-gX0*_x10gWkc7OcOH7dY1PPgG@#b5Xj&=
zLlF^57HqDiL1L+nYhk%U|68sDl>(W!Si*Ov
zNT8o*Cmr~AdxpLZ<>y$uL>M#_8RtwP!q~`>OrqqC$&LYt(vvm$ve^i9WL;L)V2+hj>Mg
z|8Xejc`bc#-Qz8YqYAX@1ZZ)
zjQLKiSG|hhkooQ`rZ%rqc8@U`(A?nw#2*Ig#u1H5f>^Yx78D2$I{^JEydxm-?1?&7
z8uOZ)0h=(D-kA?z$gJ*htxG>6AMnR6<>z(>{vJ4)ZuZ-~qN?(J@ux4Ew#=mnj@SCXa3g;7?H
zigmKp)^KDylm;DWj_g->Ap_nbz&~w@km#YR{nQ(P{`smH?{lMxk)87(Av|flQv_TB
zUn}%muf}l45nJWEj8b7hy<}cdxYFkmkC)?$6jQoUwZSam8Ce9Csdz1Bf1|~WdM$sy
zi#cAn;9S9COtaAs7^3q?CklhwjT`K#nNafQ^_>I3u+Ixkkz3k1_f4zYCzsvVp8N46
zL!bv$R@vd+o0{l!qNCU}H-v{z_Xft=EqPLsS0
z7kWgl{%DN`Kvsiz^eYITUw)ZX>DYtQ?HSXQ*cQZUKkJU72z3#|&RaIzoQjk#YEl4@
zb3b{biQp%(uSqXU7)3U>aCohtOKpU`=@Hffp?1&
zb$_V0V1QW7ibpenKB-BVQU5T|Lb(oHWmnOP|
ztDe`K_hJI3*zf>*w;PoQsVb^)1jp4Xea%ZJ!(uZok}~~`i+M%WV>SMPU&e^fP8}fu
zk&}khlb9O5t*W(~J+3#@3`RDzW{`1f!n_kE-a&!15}zrx=OZjj(^w3#-y#0idM>{p
ztchufC>>p4EOn;pbF4mzntM3m&g&3Ld=Qp`{wCIvP-pcDKsjW}SIG;aQrOQ9=zVApsIyM53?VVzua--nzE
zwXQ{VF;TgMl2#Fi!w=34h9{&CGjZ@)CS9w$@e|g)p6gSgyKl!gAXWY
z*K#j>D|Bjuea4bBt=@BMwF&Ibwjdm6#bf8wk$EGKH|GTc?n?@_?zoS$>>`(Ut`ZK-S
z)edrWuGF#@K<6*tbnt_B98K6x&W!|1H<=o$%jYU`LE@BfmD10&xQdVUMPN>qiocSA
zH5l<7H=UVmxu{C_f!&~L|5qwBvPhw`a*7IGe#F>9S2LuCh-ybWplN}~ovzDG_+X{D
zb_FU7t9c>7M1soeIO!SwH5%>`moyZe3K(achgNv3f@R&4$C5u9s!v!?b$nf^A?6;O
z@N2sw1DjL}jzK5My!^r~>IybEZ66B6{lI@l#TUL$nwcI{C{
zve~OH0CQ?8!=eL2X;1x*j|VzBNsi(PP-EVj`r@kS5#&`>9BCc_df5ds6tE4~vwzh5
zUgKbskC_m!7w;iZXbbkdzOM_}zGUbgP7`H8mIR}C
z;fBJjg!JtM1v<3nygLETUr{1hD^PF%9wQDPcRV??vZ8BdaoscJX#H?{vQ?pA2ew);-E2vPWcQ0l)u=e_k@;N6TQ?MAA
zUl9wUliZ~Tph6&6O+1FSa;|jAQW#zju)u6+4ux=E8W!t|Vro^V-N(%n-u@dVc;Var
z?%L#5Uxb33ImX7%wbh2@EqaavY@e*PHtZ4X^Y*V?N92mmWWW6FCZL|gh!7nR$0%Zg28}xe9B7n)1&yyn>FRGop`)wIuR-a=zfaa5~01DBDE%H
ztN9T#Vi!m2{sVdq*R5GwNo`c66sr
zuMu-d)2Qwpx7}WgocG&eog;H61!*9}`AH8R9xVxf#0=j^I!to_wxCIQP|{VBEkN%gWYr
zzcl6L`ZB7*x#+^<2GGNfsD~a_+|dh@0^HH_xP;2#{SX`{O(XIA6wZ0xHp+zqr)ll$
z$Ndj6$i{1&`Q7Z3q>i9bl_)}YHy&2(Yg=3{XLRbjD6qz88S+P<8(&>vh=lB^8kfv~Q(06gyhbw#X@wK7yYifN2SqN9&%
z2B>?<8kwm(;1q*-0ZyHL5y5332hofe;1y!#2-5fDUkCxJ(B0)ER><_Y$P0DC$3a<}
zJM?5Q@2rLKQ@SZ?>c8P~)!jAG@HX0&gsf(uPv26yaue>$Jl=_W9r-l1=dZFS@baghh
zfet0!vctO%flgRjtj9>c8Tnam4x7z`^-!3U=LVQ}X@agh!}DNQs0Y2->aq^&5m_(WV*!==y#cu2#5*w}Si$*ou1^Pka8Vmd49F{Jab+?+
z)Qx5FTthe(eV&&>+y0SOC7*o_bCtfWBG2!j3FaC8H%e&7%_7xjcbpHZD_CpZwz8Ts
zkG=|Kl=}cA3fEaM-PWp;$Z}-M$JE;`$e$$
zG;Oh}r4#Z7U-I?3lN5>M0BV8`;$%sMJmd7(?!@GSAy3ya+<~*9LwGzHUwH-4v+i+_9If>(u9vv%xDFZ%SyNq30~b
zJ(V#in&I+X9^&G-3)3_0j|FTDlipV?+ep|XQFtDhG!`ZI4%9$8`yjG)Xn0iXNBgLX
znzRN^g8S7QD&790={q#Cb$#`)(Uf>2ZdP7832@L0JcvK*Fj-1jfqG$ATUSzxGvT@y?cCl!4g8kN9tJMk~#e37Qd^|R{d;72GXMjY~0&5_<
z^uGtTCY3vudl`AkFxvS|koSJX+Q~EaE0<=+c(kJfZkmkKn1uAu&k8}wvPa4P9
zm&o$b5~NLf%(TDEiD|z=+5t0y5UjSe-@M5ZuL3N5$t_A!Dg>
zxsr#b!iB{};cZgMTjv0I`cID;vQiS0OG?2u$Q~Qa>fK;eAY%)W0yQ9F#$`IhCn1f-
zPi{Djq)XbL%{f`L3L&0yEqYsG#_Y14ZCuMD?wp@xiddd
zHR*lR)Sn#ywGY%K;97qB=TdGZ-P(H^VUAO&^3Z*25whxG-MD4W-b34BjFp@JzQLX<
z?SLlkgegTfa!>GKA(?mnqFL!hZRKucdpCF_MOAS0aNy2~k8itjPBO>EXadDj#)`1d
zuO|ad-=bavVyY+nSI-Mfn5?*o(I^cWDGy9+EaA8Z9B`VNe%Xi@taZGD=jtTCin0hw
zTic>YVn#9C?Pt?r9V=fFH%F%%UHG^7W6s|wTPsQu_!kra8813?TN;mAXw?|QRm|9~
z;@N1~&dNeo`~(G1)w0O&Ls*$^G`4)lH`&`$?;iTnBkJSpP3`hfsf+I5Kw@
z9$(kECWEf^@;x_jN*JH0E;JSZv={hCI3PI#g(`D{FKsMkSf@Xq*=M&`BY$Av;vp8d
z1j=P1#6W2H-{~@9JHvHI9@bZs{P||hg9Mi2R
zEL2{wDVR>7jm~0t6O_U0-?OgOR}U&ja2A5}^oUM)svD4|3uvV>#k95#myH1`7$!?^
zir4~7Vv2Pmlg4-^>@r1gn0{nS!gPio#rP?Ob7oQ#AsiQjNt2KQ5ZLLAzFt%I0TL6l
zyx}zyuc!?aSbetE^R4R*W`w+{8)0_C*{to_H^=3UhmnL=v*`rqj|&l8v5BhXuafp!
zBvk(3%Aq$T8=}a@L}$G=cu#)e~>RgJLvVC&McT!
zU{4Kt+0z7Dsg$4Kz5ek7_BFrGo_t&8y!Jg9DhD?oysWfJFu`Z12uw1i{5O=iG7Kvq
zSgBRV__cC*{G?MF`{Kyn&rG*Ry=JoG69DkL541ftLp4l#T^69E##c3;j5KQIJu|@>Uh`@iJlBUufB*!I4$d4>o{Ll5^N*bSsW*T6
z4*wkdm8#1;ji^c}q^%YN({T@w2Ird?rMk&Xg8a7;-ny_DAKL&3;=9X)7KmlS
z5ck8B9{$5X@QxZtOC=6V0c$Gub#nkPY5>uLCy;2eBuJUdh=kw8{>jd4SJl;Z)7|+#
z-{ES%ft_0HC*FPJJ*#X<*+G{Fss_mfIe(f{`5H+hE$e4|_{
znaaX!aNqtOT%Tmgh<|ev8-NhC$#VNYc0h=l=LT}v*i9d>CE9QF%thFg?S)-ss-%fs
zg{>wQd7-B&TvZYSn
z_9#KV&mhE7D)snyv2ukvm3TWy4Z)-mw
zfNQ^F9N(q>TCH3`psbRZJ_t>B`oq%Io?^n3GD_A+;Wh76@YJA
RXEZ!lep7n6@cY3S003FOdYb?M
literal 0
HcmV?d00001
diff --git a/website/src/app/(home)/landing.css b/website/src/app/(home)/landing.css
new file mode 100644
index 0000000..f06c133
--- /dev/null
+++ b/website/src/app/(home)/landing.css
@@ -0,0 +1,607 @@
+@import url('https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300..500;1,9..144,300..500&family=JetBrains+Mono:wght@400;500&display=swap');
+
+.bespoke-landing {
+ background: var(--ink);
+ color: var(--paper);
+ min-height: 100vh;
+ font-family: 'Fraunces', serif;
+}
+
+/* Bespoke landing styles. Loaded by theme/index.ts. Selectors are mostly class-based (.hero, .prim, etc.) so they only match elements present on the landing page; the few that could collide with VitePress chrome (section, main/header/footer) are scoped to .bespoke-landing / .bespoke-landing-wrap. */
+ :root {
+ --ink: #050608;
+ --ink-2: #0a0c10;
+ --ink-3: #12151c;
+ --line: #1a1d24;
+ --line-hot: #242933;
+ --paper: #edeef0;
+ --paper-dim: #8a8f9a;
+ --paper-dimmer: #4d525c;
+ --halo: #c7e8ff;
+ --halo-soft: #7fddff;
+ --amber: #ffb855;
+ --ember: #ff6b35;
+ }
+
+
+
+ .bespoke-landing main, .bespoke-landing header, .bespoke-landing footer { position: relative; z-index: 1; }
+
+ /* ---------- typography ---------- */
+
+ .display {
+ font-family: 'Fraunces', serif;
+ font-variation-settings: "SOFT" 50, "WONK" 1;
+ font-weight: 350;
+ letter-spacing: -0.02em;
+ line-height: 1;
+ }
+ .label {
+ font-family: 'JetBrains Mono', monospace;
+ font-weight: 500;
+ font-size: 11px;
+ letter-spacing: 0.22em;
+ text-transform: uppercase;
+ color: var(--paper-dim);
+ }
+ .label::before {
+ content: "// ";
+ color: var(--halo-soft);
+ }
+ .bespoke-landing code, .bespoke-landing pre, .bespoke-landing .mono {
+ font-family: 'JetBrains Mono', monospace;
+ font-size: 13px;
+ }
+
+ /* ---------- layout ---------- */
+
+ .shell {
+ max-width: 1240px;
+ margin: 0 auto;
+ padding: 0 clamp(24px, 5vw, 64px);
+ }
+
+ /* ---------- top bar ---------- */
+
+ header.top {
+ padding: 28px 0 0;
+ }
+ .top-row {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding-bottom: 20px;
+ border-bottom: 1px solid var(--line);
+ }
+ .mark {
+ display: inline-flex;
+ align-items: center;
+ gap: 10px;
+ font-family: 'Fraunces', serif;
+ font-weight: 400;
+ font-size: 17px;
+ letter-spacing: -0.01em;
+ color: var(--paper);
+ text-decoration: none;
+ }
+ .mark-dot {
+ width: 10px; height: 10px;
+ border-radius: 50%;
+ background: var(--halo);
+ box-shadow: 0 0 14px var(--halo-soft), 0 0 3px #fff inset;
+ }
+ .mark em {
+ font-style: italic;
+ font-weight: 300;
+ color: var(--paper-dim);
+ font-size: 12px;
+ margin-left: 6px;
+ }
+ nav.top-nav {
+ display: flex; gap: 28px;
+ }
+ nav.top-nav a {
+ font-size: 12px;
+ letter-spacing: 0.18em;
+ text-transform: uppercase;
+ font-family: 'JetBrains Mono', monospace;
+ font-weight: 400;
+ color: var(--paper-dim);
+ text-decoration: none;
+ transition: color .2s;
+ }
+ nav.top-nav a:hover { color: var(--paper); }
+ nav.top-nav a:hover::before { content: "› "; color: var(--halo-soft); }
+ @media (max-width: 720px) {
+ nav.top-nav a:not(.primary) { display: none; }
+ }
+ nav.top-nav a.primary {
+ color: var(--ink);
+ background: var(--halo);
+ padding: 8px 14px;
+ border-radius: 2px;
+ }
+ nav.top-nav a.primary::before { display: none !important; }
+
+ /* ---------- hero ---------- */
+
+ .bespoke-landing section.hero {
+ padding: clamp(60px, 10vh, 120px) 0 60px;
+ display: grid;
+ grid-template-columns: 1fr;
+ gap: 60px;
+ align-items: end;
+ }
+
+ .hero-headline { max-width: 860px; }
+ .hero-eyebrow {
+ display: flex; align-items: center; gap: 14px;
+ margin-bottom: 32px;
+ opacity: 0; transform: translateY(8px);
+ animation: rise .9s .1s forwards cubic-bezier(.2,.7,.2,1);
+ }
+ .hero-eyebrow .v { color: var(--halo-soft); font-family: 'JetBrains Mono', monospace; font-size: 11px; letter-spacing: 0.18em; }
+ .hero-eyebrow .divider { width: 36px; height: 1px; background: var(--line-hot); }
+ .hero-eyebrow .tag { font-family: 'JetBrains Mono', monospace; font-size: 11px; letter-spacing: 0.22em; text-transform: uppercase; color: var(--paper-dim); }
+
+ h1.display {
+ font-size: clamp(52px, 9vw, 124px);
+ opacity: 0; transform: translateY(16px);
+ animation: rise 1s .15s forwards cubic-bezier(.2,.7,.2,1);
+ }
+ h1.display .accent {
+ font-style: italic;
+ font-weight: 300;
+ color: var(--halo);
+ }
+ h1.display .shy {
+ font-style: italic;
+ font-weight: 300;
+ color: var(--paper-dim);
+ }
+
+ .hero-lede {
+ font-family: 'Fraunces', serif;
+ font-weight: 300;
+ font-size: clamp(18px, 2vw, 22px);
+ line-height: 1.45;
+ color: var(--paper);
+ max-width: 640px;
+ margin-top: 36px;
+ opacity: 0; transform: translateY(12px);
+ animation: rise 1s .3s forwards cubic-bezier(.2,.7,.2,1);
+ }
+ .hero-lede em {
+ color: var(--paper-dim);
+ font-style: italic;
+ }
+
+ .hero-meta {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
+ gap: 24px 48px;
+ margin-top: 48px;
+ padding-top: 28px;
+ border-top: 1px solid var(--line);
+ opacity: 0; transform: translateY(12px);
+ animation: rise 1s .45s forwards cubic-bezier(.2,.7,.2,1);
+ }
+ .hero-meta .cell { }
+ .hero-meta .k { font-family: 'JetBrains Mono', monospace; font-size: 10px; letter-spacing: 0.22em; text-transform: uppercase; color: var(--paper-dimmer); margin-bottom: 6px; }
+ .hero-meta .v { font-family: 'Fraunces', serif; font-size: 22px; font-weight: 350; letter-spacing: -0.01em; }
+ .hero-meta .v .sub { color: var(--paper-dim); font-size: 13px; margin-left: 6px; font-family: 'JetBrains Mono', monospace; letter-spacing: 0; text-transform: none; }
+
+ .hero-banner {
+ margin-top: clamp(48px, 8vh, 96px);
+ position: relative;
+ overflow: hidden;
+ border: 1px solid var(--line);
+ border-radius: 2px;
+ background: #000;
+ aspect-ratio: 16 / 5;
+ opacity: 0; transform: translateY(20px);
+ animation: rise 1.4s .6s forwards cubic-bezier(.2,.7,.2,1);
+ }
+ .hero-banner img {
+ width: 100%; height: 100%;
+ object-fit: cover;
+ display: block;
+ filter: contrast(1.05);
+ }
+ .hero-banner::before {
+ content: "";
+ position: absolute; inset: 0;
+ background: linear-gradient(180deg, transparent 60%, var(--ink) 100%);
+ pointer-events: none;
+ }
+ .hero-banner .corners {
+ position: absolute; inset: 12px;
+ pointer-events: none;
+ }
+ .hero-banner .corners::before,
+ .hero-banner .corners::after {
+ content: "";
+ position: absolute;
+ width: 14px; height: 14px;
+ border: 1px solid var(--halo-soft);
+ opacity: .6;
+ }
+ .hero-banner .corners::before { top: 0; left: 0; border-right: none; border-bottom: none; }
+ .hero-banner .corners::after { bottom: 0; right: 0; border-left: none; border-top: none; }
+
+ .hero-banner-caption {
+ display: flex; justify-content: space-between;
+ margin-top: 12px;
+ font-family: 'JetBrains Mono', monospace;
+ font-size: 10px;
+ letter-spacing: 0.2em;
+ color: var(--paper-dimmer);
+ text-transform: uppercase;
+ }
+
+ /* ---------- section frame ---------- */
+
+ .bespoke-landing section {
+ padding: clamp(80px, 12vh, 140px) 0;
+ border-top: 1px solid var(--line);
+ position: relative;
+ }
+ .bespoke-landing section .section-head {
+ display: grid;
+ grid-template-columns: 160px 1fr;
+ gap: 48px;
+ margin-bottom: 64px;
+ align-items: baseline;
+ }
+ .bespoke-landing section .section-head .label { padding-top: 10px; }
+ .bespoke-landing section h2 {
+ font-family: 'Fraunces', serif;
+ font-weight: 350;
+ font-style: italic;
+ font-size: clamp(32px, 4.5vw, 56px);
+ letter-spacing: -0.015em;
+ line-height: 1.05;
+ max-width: 820px;
+ }
+ .bespoke-landing section h2 .strong {
+ font-style: normal;
+ color: var(--halo);
+ font-variation-settings: "WONK" 1;
+ }
+ @media (max-width: 720px) {
+ .bespoke-landing section .section-head { grid-template-columns: 1fr; gap: 8px; margin-bottom: 36px; }
+ }
+
+ /* ---------- primitives grid ---------- */
+
+ .prims {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
+ gap: 0;
+ border-top: 1px solid var(--line);
+ }
+ .prim {
+ padding: 36px 32px 40px;
+ border-bottom: 1px solid var(--line);
+ border-right: 1px solid var(--line);
+ position: relative;
+ transition: background .25s;
+ }
+ .prim:hover { background: var(--ink-2); }
+ .prim:last-child { border-right: 1px solid var(--line); }
+ @media (max-width: 720px) { .prim { border-right: none !important; } }
+
+ .prim .num {
+ font-family: 'JetBrains Mono', monospace;
+ font-size: 11px;
+ color: var(--halo-soft);
+ letter-spacing: 0.2em;
+ margin-bottom: 32px;
+ display: flex; align-items: center; gap: 10px;
+ }
+ .prim .num::after {
+ content: ""; flex: 1; height: 1px; background: var(--line-hot);
+ }
+ .prim h3 {
+ font-family: 'Fraunces', serif;
+ font-weight: 400;
+ font-size: 24px;
+ line-height: 1.15;
+ margin-bottom: 14px;
+ letter-spacing: -0.01em;
+ }
+ .prim h3 em { color: var(--halo); font-style: italic; font-weight: 300; }
+ .prim p {
+ font-size: 14px;
+ line-height: 1.6;
+ color: var(--paper-dim);
+ max-width: 34ch;
+ }
+
+ /* ---------- code block ---------- */
+
+ .code-window {
+ border: 1px solid var(--line);
+ background: var(--ink-2);
+ border-radius: 2px;
+ overflow: hidden;
+ margin-top: 8px;
+ }
+ .code-window .bar {
+ display: flex; align-items: center; justify-content: space-between;
+ padding: 10px 16px;
+ border-bottom: 1px solid var(--line);
+ background: var(--ink-3);
+ font-family: 'JetBrains Mono', monospace;
+ font-size: 11px;
+ color: var(--paper-dimmer);
+ letter-spacing: 0.15em;
+ text-transform: uppercase;
+ }
+ .code-window .bar .pills {
+ display: inline-flex; gap: 6px;
+ }
+ .code-window .bar .pills i {
+ width: 8px; height: 8px; border-radius: 50%; display: inline-block;
+ background: #2a2f38;
+ }
+ .code-window .bar .pills i:first-child { background: #ff5f57; opacity: .55; }
+ .code-window .bar .pills i:nth-child(2) { background: #febc2e; opacity: .55; }
+ .code-window .bar .pills i:nth-child(3) { background: #28c840; opacity: .55; }
+ .code-window pre {
+ padding: 28px 32px;
+ overflow-x: auto;
+ font-size: 13px;
+ line-height: 1.75;
+ color: var(--paper);
+ }
+ .code-window pre .k { color: var(--halo-soft); }
+ .code-window pre .s { color: #f5d796; }
+ .code-window pre .c { color: var(--paper-dimmer); font-style: italic; }
+ .code-window pre .f { color: var(--paper); }
+ .code-window pre .p { color: var(--paper-dim); }
+ .code-window pre .n { color: #c8b6ff; }
+ button.copy {
+ background: transparent;
+ border: 1px solid var(--line-hot);
+ color: var(--paper-dim);
+ font-family: 'JetBrains Mono', monospace;
+ font-size: 10px;
+ letter-spacing: 0.18em;
+ text-transform: uppercase;
+ padding: 4px 10px;
+ cursor: pointer;
+ border-radius: 2px;
+ transition: all .2s;
+ }
+ button.copy:hover { color: var(--ink); background: var(--halo); border-color: var(--halo); }
+ button.copy.done { color: var(--ink); background: var(--halo-soft); border-color: var(--halo-soft); }
+
+ /* ---------- quick-start split ---------- */
+
+ .qstart {
+ display: grid;
+ grid-template-columns: 5fr 7fr;
+ gap: 64px;
+ align-items: start;
+ }
+ @media (max-width: 900px) { .qstart { grid-template-columns: 1fr; gap: 36px; } }
+
+ .qstart .side p {
+ font-family: 'Fraunces', serif;
+ font-size: 19px;
+ line-height: 1.55;
+ color: var(--paper);
+ font-weight: 300;
+ }
+ .qstart .side p + p { margin-top: 18px; color: var(--paper-dim); }
+ .qstart .side .install {
+ margin-top: 28px;
+ display: inline-flex;
+ align-items: center;
+ gap: 12px;
+ font-family: 'JetBrains Mono', monospace;
+ font-size: 13px;
+ padding: 12px 18px;
+ border: 1px solid var(--line-hot);
+ background: var(--ink-2);
+ border-radius: 2px;
+ }
+ .qstart .side .install::before {
+ content: "$"; color: var(--halo-soft);
+ }
+
+ /* ---------- security block ---------- */
+
+ .sec-grid {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ border-top: 1px solid var(--line);
+ }
+ .sec-grid .row {
+ display: contents;
+ }
+ .sec-grid .k, .sec-grid .v {
+ padding: 20px 24px;
+ border-bottom: 1px solid var(--line);
+ }
+ .sec-grid .k {
+ font-family: 'JetBrains Mono', monospace;
+ font-size: 12px;
+ letter-spacing: 0.05em;
+ color: var(--halo-soft);
+ border-right: 1px solid var(--line);
+ }
+ .sec-grid .v {
+ font-size: 14px;
+ color: var(--paper-dim);
+ line-height: 1.6;
+ }
+ .sec-grid .v strong { color: var(--paper); font-weight: 400; }
+ @media (max-width: 720px) {
+ .sec-grid { grid-template-columns: 1fr; }
+ .sec-grid .k { border-right: none; padding-bottom: 4px; }
+ .sec-grid .v { padding-top: 4px; }
+ }
+
+ .sec-note {
+ margin-top: 40px;
+ padding: 20px 24px;
+ border-left: 2px solid var(--amber);
+ background: rgba(255, 184, 85, 0.04);
+ font-size: 14px;
+ color: var(--paper-dim);
+ line-height: 1.6;
+ }
+ .sec-note strong { color: var(--amber); font-weight: 500; }
+
+ /* ---------- ecosystem cards ---------- */
+
+ .eco {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 20px;
+ }
+ @media (max-width: 900px) { .eco { grid-template-columns: 1fr; } }
+
+ .eco-card {
+ padding: 32px 28px 28px;
+ border: 1px solid var(--line);
+ background: linear-gradient(180deg, var(--ink-2) 0%, var(--ink) 100%);
+ border-radius: 2px;
+ position: relative;
+ overflow: hidden;
+ transition: border-color .25s, transform .25s;
+ }
+ .eco-card:hover { border-color: var(--line-hot); transform: translateY(-2px); }
+ .eco-card.this {
+ border-color: var(--halo-soft);
+ background: linear-gradient(180deg, rgba(127,221,255,0.06) 0%, var(--ink) 100%);
+ }
+ .eco-card.this::after {
+ content: "this repo";
+ position: absolute;
+ top: 16px; right: 16px;
+ font-family: 'JetBrains Mono', monospace;
+ font-size: 10px;
+ letter-spacing: 0.2em;
+ text-transform: uppercase;
+ color: var(--ink);
+ background: var(--halo);
+ padding: 4px 8px;
+ border-radius: 2px;
+ }
+ .eco-card .mono-name {
+ font-family: 'JetBrains Mono', monospace;
+ font-weight: 500;
+ font-size: 15px;
+ color: var(--paper);
+ margin-bottom: 18px;
+ }
+ .eco-card h3 {
+ font-family: 'Fraunces', serif;
+ font-weight: 400;
+ font-size: 20px;
+ line-height: 1.2;
+ margin-bottom: 10px;
+ letter-spacing: -0.01em;
+ }
+ .eco-card p {
+ font-size: 13px;
+ color: var(--paper-dim);
+ line-height: 1.55;
+ }
+ .eco-card .status {
+ margin-top: 22px;
+ font-family: 'JetBrains Mono', monospace;
+ font-size: 10px;
+ letter-spacing: 0.2em;
+ text-transform: uppercase;
+ color: var(--paper-dimmer);
+ display: flex; align-items: center; gap: 8px;
+ }
+ .eco-card .status::before {
+ content: ""; width: 6px; height: 6px; border-radius: 50%;
+ background: var(--paper-dimmer);
+ }
+ .eco-card.this .status::before { background: var(--halo); box-shadow: 0 0 10px var(--halo-soft); }
+ .eco-card.this .status { color: var(--halo-soft); }
+ /* Eco-card version: hidden by default, surfaced once GitHub API resolves. */
+ .eco-card .status .status-version:not(:empty)::before { content: " - "; }
+
+ /* ---------- footer ---------- */
+
+ .bespoke-landing footer {
+ padding: 56px 0 48px;
+ border-top: 1px solid var(--line);
+ }
+ .foot-row {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+ flex-wrap: wrap;
+ gap: 32px;
+ }
+ .foot-row .sig {
+ font-family: 'Fraunces', serif;
+ font-style: italic;
+ font-weight: 300;
+ font-size: 14px;
+ color: var(--paper-dim);
+ max-width: 320px;
+ line-height: 1.5;
+ }
+ .foot-links {
+ display: flex; gap: 32px;
+ }
+ .foot-links a {
+ color: var(--paper-dim);
+ text-decoration: none;
+ font-family: 'JetBrains Mono', monospace;
+ font-size: 11px;
+ letter-spacing: 0.18em;
+ text-transform: uppercase;
+ transition: color .2s;
+ }
+ .foot-links a:hover { color: var(--halo); }
+ .foot-meta {
+ margin-top: 36px;
+ padding-top: 20px;
+ border-top: 1px solid var(--line);
+ display: flex;
+ justify-content: space-between;
+ font-family: 'JetBrains Mono', monospace;
+ font-size: 10px;
+ letter-spacing: 0.2em;
+ text-transform: uppercase;
+ color: var(--paper-dimmer);
+ }
+
+ /* ---------- motion ---------- */
+
+ @keyframes rise {
+ to { opacity: 1; transform: translateY(0); }
+ }
+
+ /* Fallback for users with prefers-reduced-motion: reduce. The hero elements
+ * start at opacity: 0 and rely on the rise animation to become visible; if
+ * the animation is suppressed by the reduced-motion media query in custom.css,
+ * we must surface them anyway, otherwise the entire hero reads as empty space. */
+ @media (prefers-reduced-motion: reduce) {
+ .bespoke-landing .hero-eyebrow,
+ .bespoke-landing h1.display,
+ .bespoke-landing .hero-lede,
+ .bespoke-landing .hero-meta,
+ .bespoke-landing .hero-banner {
+ opacity: 1 !important;
+ transform: none !important;
+ animation: none !important;
+ }
+ }
+
+
+ /* ---------- focus ---------- */
+ .bespoke-landing a:focus-visible, .bespoke-landing button:focus-visible {
+ outline: 1px solid var(--halo);
+ outline-offset: 3px;
+ }
diff --git a/website/src/app/(home)/layout.tsx b/website/src/app/(home)/layout.tsx
index 77379fa..dc098a0 100644
--- a/website/src/app/(home)/layout.tsx
+++ b/website/src/app/(home)/layout.tsx
@@ -1,6 +1,5 @@
-import { HomeLayout } from 'fumadocs-ui/layouts/home';
-import { baseOptions } from '@/lib/layout.shared';
-
+// The home route is a full-bleed bespoke landing with its own header and
+// footer, so it deliberately does not use Fumadocs' HomeLayout chrome.
export default function Layout({ children }: LayoutProps<'/'>) {
- return {children} ;
+ return <>{children}>;
}
diff --git a/website/src/app/(home)/page.tsx b/website/src/app/(home)/page.tsx
index 970bd1e..110a6d7 100644
--- a/website/src/app/(home)/page.tsx
+++ b/website/src/app/(home)/page.tsx
@@ -1,212 +1,416 @@
-import Link from 'next/link';
+'use client';
-const primitives = [
- {
- num: '01 / isolated',
- title: 'Your code runs in its own cell.',
- body: 'Every run gets a fresh container, its own volume, its own network. Nothing leaks in from the host, nothing leaks out to sibling runs. Torn down on exit, success or not.',
- },
- {
- num: '02 / drop in, pull out',
- title: 'Send a folder. Get any file back.',
- body: 'Point at a directory on your disk, it becomes the container workdir. When the run finishes, ask for any path and it lands back on your host.',
- },
- {
- num: '03 / stop on demand',
- title: 'Cancel, abort, or time out.',
- body: 'Pass an AbortSignal, call cancel(), or set a deadline. The container dies and its volume goes with it. No zombie processes, no leaked disk.',
- },
- {
- num: '04 / any stack',
- title: 'Python, Node, Go, Ruby, shell, anything.',
- body: 'Any Docker image on your registry or anyone else’s. No special runtime inside the container, no SDK to import, no convention to follow.',
- },
-];
+import { useEffect } from 'react';
+import './landing.css';
-const security: [string, string][] = [
- ['Kernel permissions', 'Dangerous capabilities stripped at startup: raw sockets, device creation, chroot escapes, capability juggling, audit-log spoofing. Every run, unconditionally.'],
- ['No privilege escalation', 'A setuid binary inside your container cannot elevate above the user it starts as.'],
- ['Fork-bomb protection', 'Max 100 processes per container. A runaway loop caps out in milliseconds.'],
- ['Memory and CPU budget', '512 MiB and one core by default, cgroup-enforced. Tunable per runner.'],
- ['Network isolation', 'Isolated bridge by default with inter-container traffic blocked. Use networks: [‘none’] to sever it entirely.'],
- ['Host filesystem', 'Symlinks in your input folder are filtered before seeding, so a stray link cannot reach back into the host.'],
- ['Safe extraction', 'Paths escaping upward (..) are refused; each extracted entry is capped at 1 GiB.'],
- ['Kernel-level hardening', 'Swap the runtime to gVisor with one option for user-space syscall interception.'],
-];
+const BASE = '/light-runner';
-const ecosystem = [
- {
- name: 'light-runner',
- tag: 'this library',
- title: 'Spawn one container, return exit code and files.',
- body: 'The execution primitive. Domain-agnostic. Zero orchestration. The other two tools call down to this one.',
- },
- {
- name: 'light-run',
- tag: 'HTTP',
- title: 'CLI and HTTP surface around light-runner.',
- body: 'Point a POST endpoint at it, pipe bodies through, get results back. Stateless wrapper, same defaults, same guarantees.',
- },
- {
- name: 'light-process',
- tag: 'DAG',
- title: 'DAG orchestration, retries, fan-out.',
- body: 'Composes runs into pipelines with backoff, concurrency limits, and structured outputs.',
- },
-];
+const CODE_HTML = `import { DockerRunner } from 'light-runner' ;
+const runner = new DockerRunner ( { memory : '512m' , cpus : '1' } ) ;
+const execution = runner. run ( {
+ image : 'python:3.12-alpine' ,
+ entrypoint : 'python main.py' ,
+ dir : './my-project' ,
+ input : { task : 'compute' , n : 20 } ,
+ timeout : 30_000 ,
+ extract : [ { from : '/app/result.json' , to : './out' } ] ,
+} ) ;
+const result = await execution. result;
+result. success // true if exit 0 and not cancelled
+result. exitCode // the container exit code
+result. extracted // [{ from, to, status, bytes }] `;
-const code = `import { DockerRunner } from 'light-runner';
+export default function HomePage() {
+ useEffect(() => {
+ const btn = document.querySelector('[data-copy]');
+ const src = document.getElementById('code-sample');
+ if (btn && src) {
+ btn.addEventListener('click', async () => {
+ try {
+ await navigator.clipboard.writeText((src as HTMLElement).innerText.trim());
+ btn.textContent = 'Copied';
+ btn.classList.add('done');
+ setTimeout(() => {
+ btn.textContent = 'Copy';
+ btn.classList.remove('done');
+ }, 1600);
+ } catch {
+ btn.textContent = 'Select';
+ }
+ });
+ }
-const runner = new DockerRunner({ memory: '512m', cpus: '1' });
+ const PROJECT = 'enixCode/light-runner';
+ const repos = new Set([PROJECT]);
+ document.querySelectorAll('[data-eco-status][data-gh-repo]').forEach((el) => {
+ const r = el.getAttribute('data-gh-repo');
+ if (r) repos.add(r);
+ });
-const execution = runner.run({
- image: 'python:3.12-alpine',
- entrypoint: 'python main.py',
- dir: './my-project',
- input: { task: 'compute', n: 20 },
- timeout: 30_000,
- extract: [{ from: '/app/result.json', to: './out' }],
-});
+ const fetchLatest = (repo: string): Promise<{ tag_name?: string; prerelease?: boolean } | null> =>
+ fetch(`https://api.github.com/repos/${repo}/releases/latest`)
+ .then((r) => (r.ok ? r.json() : null))
+ .catch(() => null);
-const result = await execution.result;
-result.success; // true if exit 0 and not cancelled
-result.exitCode; // the container exit code
-result.extracted; // [{ from, to, status, bytes }]`;
+ Promise.all([...repos].map((repo) => fetchLatest(repo).then((data) => [repo, data] as const))).then(
+ (entries) => {
+ const releases = new Map(entries);
+ const project = releases.get(PROJECT);
+ if (project?.tag_name) {
+ const tag = project.tag_name;
+ const v = tag.startsWith('v') ? tag : `v${tag}`;
+ document.querySelectorAll('[data-gh-version]').forEach((el) => {
+ el.textContent = v;
+ });
+ }
+ document.querySelectorAll('[data-eco-status][data-gh-repo]').forEach((el) => {
+ const repo = el.getAttribute('data-gh-repo');
+ const fallback = el.getAttribute('data-fallback') || 'In development';
+ const data = repo ? releases.get(repo) : null;
+ const tag = data?.tag_name;
+ if (!tag) {
+ el.textContent = fallback;
+ return;
+ }
+ const v = tag.startsWith('v') ? tag : `v${tag}`;
+ el.textContent = `${data?.prerelease === true ? 'Pre-release - ' : 'Stable - '}${v}`;
+ });
+ },
+ );
+ }, []);
-function Label({ children }: { children: React.ReactNode }) {
return (
-
- {children}
-
- );
-}
-
-export default function HomePage() {
- return (
-
- {/* Hero */}
-
-
- Execution primitive, Node.js
-
-
- Run untrusted code in hardened containers.
-
-
- A single-purpose Node.js library that runs your code in a container it tears down
- afterwards, and hands you back the exit code, logs, and any files you asked for. Nothing
- else.
-
-
-
- Quick start
-
-
- API reference
-
-
- GitHub
-
-
-
-
npm install light-runner
+
+
+
-
-
- {/* Primitives */}
-
- what you get
-
- Give it code. Get back an exit code , logs, and the
- files you asked for.
-
-
- {primitives.map((p) => (
-
-
{p.num}
-
{p.title}
-
{p.body}
+
+
+ {/* HERO */}
+
+
+
+
+
+ Execution primitive - Node.js
- ))}
-
-
-
- {/* Quick start */}
-
- quick start
-
- A few lines to run, one to get your artefact.
-
-
- {code}
-
-
-
- {/* Security */}
-
- security model
-
- Hardened defaults, never opt-out. Add more
- restrictions, never fewer.
-
-
- {security.map(([k, v]) => (
-
-
{k}
-
{v}
+
+
+ Run untrusted code
+
+ in hardened containers.
+
+
+ A single-purpose Node.js library that runs your code in a container it tears down
+ afterwards, and hands you back the exit code, logs, and any files you asked for. {' '}
+ Nothing else.
+
+
+
+
Runtime
+
+ Node >=22
+
+
+
+
Dependencies
+
+ 3 dockerode + tar
+
+
+
+
Transport
+
+ dockerode no CLI
+
+
+
+
License
+
+ MIT permissive
+
+
+
- ))}
-
-
- Does not cover kernel exploits, runc CVEs, or side-channel attacks. For genuinely hostile
- code, combine with the gVisor (runsc) or Kata runtimes.
-
-
-
- {/* Ecosystem */}
-
- ecosystem
-
- Three tools. Each does one thing.
-
-
- {ecosystem.map((e) => (
-
-
- {e.name}
-
- {e.tag}
-
-
-
{e.title}
-
{e.body}
+
+
+ {/* eslint-disable-next-line @next/next/no-img-element */}
+
+
+
+
+ Fig. 01 - One process, one cell, one grid.
+ light-runner / visual
+
+
+
+
+ {/* PRIMITIVES */}
+
+
+
+
what you get
+
+ Give it code. Get back an exit code , logs, and the
+ files you asked for.
+
- ))}
-
-
-
- {/* Footer */}
-
-
-
light-runner / execution primitive
-
- Docs
- API
- GitHub
- npm
- MIT
-
+
+
+
01 / isolated
+
+ Your code runs in its own cell .
+
+
+ Every run gets a fresh container, its own volume, its own network. Nothing leaks in
+ from the host, nothing leaks out to sibling runs. Torn down on exit, success or not.
+
+
+
+
02 / drop in, pull out
+
+ Send a folder. Get any file back.
+
+
+ Point at a directory on your disk, it becomes the container workdir. When the run
+ finishes, ask for any path and it lands back on your host.
+
+
+
+
03 / stop on demand
+
+ Cancel, abort, or time out .
+
+
+ Pass an AbortSignal, call cancel(), or set a deadline. The
+ container dies and its volume goes with it. No zombie processes, no leaked disk.
+
+
+
+
04 / any stack
+
+ Python, Node, Go, Ruby, shell, anything .
+
+
+ Any Docker image on your registry or anyone else's. No special runtime inside the
+ container, no SDK to import, no convention to follow. Your code stays your code.
+
+
+
+
+
+ {/* QUICK START */}
+
+
+
+
quick start
+
+ Five lines to run, one to get your artefact.
+
+
+
+
+
+ Point light-runner at an image and a folder. Pipe input through stdin.
+ Extract whatever your container wrote.
+
+
No HTTP server. No config file. No CLI.
+
npm install light-runner
+
+
+
+
+
+
+
+
+ example.ts
+
+ Copy
+
+
+
+
+
+
+
+ {/* SECURITY */}
+
+
+
+
security model
+
+ Hardened defaults, never opt-out. Add more
+ restrictions, never fewer.
+
+
+
+
+
Kernel permissions
+
+ Dangerous capabilities stripped at startup - raw sockets, device
+ creation, chroot escapes, capability juggling, audit-log spoofing. Every run,
+ unconditionally.
+
+
+
+
No privilege escalation
+
+ A setuid binary inside your container cannot elevate above the user
+ it starts as.
+
+
+
+
Fork-bomb protection
+
+ Max 100 processes per container. A runaway loop caps out in
+ milliseconds instead of paging the host.
+
+
+
+
Memory and CPU budget
+
+ 512 MiB and one core by default, cgroup-enforced.
+ Noisy runs cannot starve their neighbours. Tunable per runner.
+
+
+
+
Network isolation
+
+ Isolated bridge by default with inter-container traffic blocked.
+ Pass networks: ['none'] to sever it entirely.
+
+
+
+
Host filesystem protection
+
+ Symlinks in your input folder are filtered before seeding, so a
+ stray link cannot reach back into the host filesystem.
+
+
+
+
Safe file extraction
+
+ A container cannot write outside the destination folder you chose: paths escaping
+ upward (..) are refused. Each extracted entry is capped at{' '}
+ 1 GiB so a runaway output cannot fill your disk.
+
+
+
+
Kernel-level hardening
+
+ Swap the runtime to gVisor with one option for user-space syscall
+ interception, at ~10-30% I/O cost.
+
+
+
+
+ Does not cover - kernel exploits, runc CVEs, side-channel
+ attacks. For genuinely hostile code, combine with {'{ runtime: \'runsc\' }'}{' '}
+ (gVisor) or {'{ runtime: \'kata\' }'} (Kata Containers, VM-level isolation).
+
+
+
+ {/* ECOSYSTEM */}
+
+
+
+
ecosystem
+
+ Three tools. Each does one thing.
+
+
+
+
+ light-runner
+ Spawn one container, return exit code and files.
+
+ The execution primitive. Domain-agnostic. Zero orchestration. The other two tools in
+ this family both call down to this one.
+
+
+ Loading
+
+
+
+ light-run
+ CLI and HTTP surface around light-runner.
+
+ Point a POST endpoint at it, pipe bodies through, get results back. Stateless
+ wrapper, same defaults, same guarantees.
+
+
+ Loading
+
+
+
+ light-process
+ DAG orchestration, retries, fan-out.
+
+ When one container is not enough. Composes runs into pipelines with backoff,
+ concurrency limits, and structured outputs.
+
+
+ Loading
+
+
+
+
+
+
+
-
+
);
}
From 3c71dedec8401f8ede52155507379135b8a63c4b Mon Sep 17 00:00:00 2001
From: enixCode <58286681+enixCode@users.noreply.github.com>
Date: Sat, 30 May 2026 08:52:19 +0200
Subject: [PATCH 09/10] docs(fumadocs): consume the shared light-landing-page
package
The home now renders LandingPage data={lightRunnerData} from the shared
light-landing-page package (git dependency) instead of an in-repo copy. The
bespoke design, CSS and logic live in the package; only lightRunnerData (brand,
hero, primitives, security, ecosystem, links) is local. The local landing.css
is dropped. A design change now ships to every light-* site from one source.
build with cc
---
website/package-lock.json | 203 +---------
website/package.json | 1 +
website/src/app/(home)/data.tsx | 263 +++++++++++++
website/src/app/(home)/landing.css | 607 -----------------------------
website/src/app/(home)/page.tsx | 417 +-------------------
5 files changed, 279 insertions(+), 1212 deletions(-)
create mode 100644 website/src/app/(home)/data.tsx
delete mode 100644 website/src/app/(home)/landing.css
diff --git a/website/package-lock.json b/website/package-lock.json
index 3a1a357..5a390ab 100644
--- a/website/package-lock.json
+++ b/website/package-lock.json
@@ -9,17 +9,14 @@
"version": "0.0.0",
"hasInstallScript": true,
"dependencies": {
- "@ai-sdk/react": "^3.0.193",
- "@openrouter/ai-sdk-provider": "^2.9.0",
"@orama/orama": "^3.1.18",
- "@radix-ui/react-presence": "^1.1.5",
- "ai": "^6.0.191",
"class-variance-authority": "^0.7.1",
"flexsearch": "^0.8.212",
"fumadocs-core": "16.9.3",
"fumadocs-mdx": "15.0.10",
"fumadocs-ui": "16.9.3",
"hast-util-to-jsx-runtime": "^2.3.6",
+ "light-landing-page": "github:enixCode/light-landing-page",
"lucide-react": "^1.17.0",
"next": "16.2.6",
"react": "^19.2.6",
@@ -46,70 +43,6 @@
"typescript": "^6.0.3"
}
},
- "node_modules/@ai-sdk/gateway": {
- "version": "3.0.121",
- "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-3.0.121.tgz",
- "integrity": "sha512-uY248djJRxa5W68MHiyqO8WLdOeKQoRClGg7PVX/VPhVW8SJNM7/l5DcrA5WAM3YfQrLyNkgZa2VOu8T0t8LUw==",
- "license": "Apache-2.0",
- "dependencies": {
- "@ai-sdk/provider": "3.0.10",
- "@ai-sdk/provider-utils": "4.0.27",
- "@vercel/oidc": "3.2.0"
- },
- "engines": {
- "node": ">=18"
- },
- "peerDependencies": {
- "zod": "^3.25.76 || ^4.1.8"
- }
- },
- "node_modules/@ai-sdk/provider": {
- "version": "3.0.10",
- "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.10.tgz",
- "integrity": "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw==",
- "license": "Apache-2.0",
- "dependencies": {
- "json-schema": "^0.4.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@ai-sdk/provider-utils": {
- "version": "4.0.27",
- "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.27.tgz",
- "integrity": "sha512-ubkAJ+xODouwtmN1tYlvTPphH1hPOBfZaEQe8U7skGvFAnIRs9PPpsq57bC2+Ky/MB4yzhd6YOsxTAx9sGpazw==",
- "license": "Apache-2.0",
- "dependencies": {
- "@ai-sdk/provider": "3.0.10",
- "@standard-schema/spec": "^1.1.0",
- "eventsource-parser": "^3.0.8"
- },
- "engines": {
- "node": ">=18"
- },
- "peerDependencies": {
- "zod": "^3.25.76 || ^4.1.8"
- }
- },
- "node_modules/@ai-sdk/react": {
- "version": "3.0.195",
- "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-3.0.195.tgz",
- "integrity": "sha512-+yIH84d4bBNzLKfaDDf4EocEH0XQKKNwNShxbrz5xAiJMNIPnWVWT9cyrSerYaGH3iNVS/g2io42PE4HNbc4RA==",
- "license": "Apache-2.0",
- "dependencies": {
- "@ai-sdk/provider-utils": "4.0.27",
- "ai": "6.0.193",
- "swr": "^2.2.5",
- "throttleit": "2.1.0"
- },
- "engines": {
- "node": ">=18"
- },
- "peerDependencies": {
- "react": "^18 || ~19.0.1 || ~19.1.2 || ^19.2.1"
- }
- },
"node_modules/@alloc/quick-lru": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
@@ -364,30 +297,6 @@
"node": ">=6.9.0"
}
},
- "node_modules/@emnapi/core": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz",
- "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "peer": true,
- "dependencies": {
- "@emnapi/wasi-threads": "1.2.1",
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@emnapi/runtime": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz",
- "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==",
- "license": "MIT",
- "optional": true,
- "peer": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
"node_modules/@emnapi/wasi-threads": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz",
@@ -1845,29 +1754,6 @@
"node": ">=12.4.0"
}
},
- "node_modules/@openrouter/ai-sdk-provider": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/@openrouter/ai-sdk-provider/-/ai-sdk-provider-2.9.0.tgz",
- "integrity": "sha512-Seva+NCa0WUQnJIUE5GzHsUv1WTIeyqwz0ELl2VtS6NP+eF+77yCXGFVOMbvoCM7QMjlnhv7931e89R+8pJdcQ==",
- "license": "Apache-2.0",
- "engines": {
- "node": ">=18"
- },
- "peerDependencies": {
- "ai": "^6.0.0",
- "zod": "^3.25.0 || ^4.0.0"
- }
- },
- "node_modules/@opentelemetry/api": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz",
- "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==",
- "license": "Apache-2.0",
- "peer": true,
- "engines": {
- "node": ">=8.0.0"
- }
- },
"node_modules/@orama/orama": {
"version": "3.1.18",
"resolved": "https://registry.npmjs.org/@orama/orama/-/orama-3.1.18.tgz",
@@ -3816,15 +3702,6 @@
"win32"
]
},
- "node_modules/@vercel/oidc": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.2.0.tgz",
- "integrity": "sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug==",
- "license": "Apache-2.0",
- "engines": {
- "node": ">= 20"
- }
- },
"node_modules/@zeit/schemas": {
"version": "2.36.0",
"resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.36.0.tgz",
@@ -3854,25 +3731,6 @@
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
},
- "node_modules/ai": {
- "version": "6.0.193",
- "resolved": "https://registry.npmjs.org/ai/-/ai-6.0.193.tgz",
- "integrity": "sha512-VQOTOse8+X8kMtg61DNSXlYJzwOW4NjMLDJNk/qxClWsFe4oiyFJDHGGG1oezfGcFzuYuQe/8Z7r4kwiZWh2YQ==",
- "license": "Apache-2.0",
- "peer": true,
- "dependencies": {
- "@ai-sdk/gateway": "3.0.121",
- "@ai-sdk/provider": "3.0.10",
- "@ai-sdk/provider-utils": "4.0.27",
- "@opentelemetry/api": "^1.9.0"
- },
- "engines": {
- "node": ">=18"
- },
- "peerDependencies": {
- "zod": "^3.25.76 || ^4.1.8"
- }
- },
"node_modules/ajv": {
"version": "6.15.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
@@ -5498,6 +5356,7 @@
"integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"@rtsao/scc": "^1.1.0",
"array-includes": "^3.1.9",
@@ -5816,15 +5675,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/eventsource-parser": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.0.tgz",
- "integrity": "sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==",
- "license": "MIT",
- "engines": {
- "node": ">=18.0.0"
- }
- },
"node_modules/execa": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
@@ -7524,12 +7374,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/json-schema": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
- "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
- "license": "(AFL-2.1 OR BSD-3-Clause)"
- },
"node_modules/json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
@@ -7617,6 +7461,15 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/light-landing-page": {
+ "version": "0.1.0",
+ "resolved": "git+ssh://git@github.com/enixCode/light-landing-page.git#62deeb09f0bb8e28d6f046c7db1bb4b63ed71564",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": ">=18",
+ "react-dom": ">=18"
+ }
+ },
"node_modules/lightningcss": {
"version": "1.32.0",
"resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
@@ -11043,19 +10896,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/swr": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/swr/-/swr-2.4.1.tgz",
- "integrity": "sha512-2CC6CiKQtEwaEeNiqWTAw9PGykW8SR5zZX8MZk6TeAvEAnVS7Visz8WzphqgtQ8v2xz/4Q5K+j+SeMaKXeeQIA==",
- "license": "MIT",
- "dependencies": {
- "dequal": "^2.0.3",
- "use-sync-external-store": "^1.6.0"
- },
- "peerDependencies": {
- "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
- }
- },
"node_modules/tailwind-merge": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz",
@@ -11088,18 +10928,6 @@
"url": "https://opencollective.com/webpack"
}
},
- "node_modules/throttleit": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz",
- "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==",
- "license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/tinyexec": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.3.tgz",
@@ -11619,15 +11447,6 @@
}
}
},
- "node_modules/use-sync-external-store": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz",
- "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==",
- "license": "MIT",
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
- }
- },
"node_modules/vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
diff --git a/website/package.json b/website/package.json
index 978a1ec..9b9c1d0 100644
--- a/website/package.json
+++ b/website/package.json
@@ -15,6 +15,7 @@
"fumadocs-core": "16.9.3",
"fumadocs-mdx": "15.0.10",
"fumadocs-ui": "16.9.3",
+ "light-landing-page": "github:enixCode/light-landing-page",
"lucide-react": "^1.17.0",
"next": "16.2.6",
"react": "^19.2.6",
diff --git a/website/src/app/(home)/data.tsx b/website/src/app/(home)/data.tsx
new file mode 100644
index 0000000..52881a4
--- /dev/null
+++ b/website/src/app/(home)/data.tsx
@@ -0,0 +1,263 @@
+import type { LandingData } from 'light-landing-page';
+
+const BASE = '/light-runner';
+
+const CODE_HTML = `import { DockerRunner } from 'light-runner' ;
+const runner = new DockerRunner ( { memory : '512m' , cpus : '1' } ) ;
+const execution = runner. run ( {
+ image : 'python:3.12-alpine' ,
+ entrypoint : 'python main.py' ,
+ dir : './my-project' ,
+ input : { task : 'compute' , n : 20 } ,
+ timeout : 30_000 ,
+ extract : [ { from : '/app/result.json' , to : './out' } ] ,
+} ) ;
+const result = await execution. result;
+result. success // true if exit 0 and not cancelled
+result. exitCode // the container exit code
+result. extracted // [{ from, to, status, bytes }] `;
+
+export const lightRunnerData: LandingData = {
+ githubRepo: 'enixCode/light-runner',
+ brand: 'light-runner',
+ nav: [
+ { label: 'Primitives', href: '#primitives' },
+ { label: 'Quick start', href: '#quick-start' },
+ { label: 'Security', href: '#security' },
+ { label: 'Ecosystem', href: '#ecosystem' },
+ { label: 'Documentation', href: `${BASE}/docs` },
+ { label: 'GitHub ->', href: 'https://github.com/enixCode/light-runner', primary: true },
+ ],
+ hero: {
+ tag: 'Execution primitive - Node.js',
+ headline: (
+ <>
+ Run untrusted code
+
+ in hardened containers.
+ >
+ ),
+ lede: (
+ <>
+ A single-purpose Node.js library that runs your code in a container it tears down afterwards,
+ and hands you back the exit code, logs, and any files you asked for. Nothing else.
+ >
+ ),
+ meta: [
+ { k: 'Runtime', v: <>Node >=22 > },
+ { k: 'Dependencies', v: <>3 dockerode + tar > },
+ { k: 'Transport', v: <>dockerode no CLI > },
+ { k: 'License', v: <>MIT permissive > },
+ ],
+ banner: {
+ src: `${BASE}/banner.webp`,
+ alt: 'A single glowing sphere floating above a wireframe cube on an isolated dark grid, the visual metaphor for a sandboxed container.',
+ captionLeft: 'Fig. 01 - One process, one cell, one grid.',
+ captionRight: 'light-runner / visual',
+ },
+ },
+ primitives: {
+ label: 'what you get',
+ heading: (
+ <>
+ Give it code. Get back an exit code , logs, and the files you
+ asked for.
+ >
+ ),
+ items: [
+ {
+ num: '01 / isolated',
+ title: (
+ <>
+ Your code runs in its own cell .
+ >
+ ),
+ body: 'Every run gets a fresh container, its own volume, its own network. Nothing leaks in from the host, nothing leaks out to sibling runs. Torn down on exit, success or not.',
+ },
+ {
+ num: '02 / drop in, pull out',
+ title: (
+ <>
+ Send a folder. Get any file back.
+ >
+ ),
+ body: 'Point at a directory on your disk, it becomes the container workdir. When the run finishes, ask for any path and it lands back on your host.',
+ },
+ {
+ num: '03 / stop on demand',
+ title: (
+ <>
+ Cancel, abort, or time out .
+ >
+ ),
+ body: (
+ <>
+ Pass an AbortSignal, call cancel(), or set a deadline. The
+ container dies and its volume goes with it. No zombie processes, no leaked disk.
+ >
+ ),
+ },
+ {
+ num: '04 / any stack',
+ title: (
+ <>
+ Python, Node, Go, Ruby, shell, anything .
+ >
+ ),
+ body: 'Any Docker image on your registry or anyone else’s. No special runtime inside the container, no SDK to import, no convention to follow. Your code stays your code.',
+ },
+ ],
+ },
+ quickstart: {
+ label: 'quick start',
+ heading: (
+ <>
+ Five lines to run, one to get your artefact.
+ >
+ ),
+ side: (
+ <>
+
+ Point light-runner at an image and a folder. Pipe input through stdin. Extract
+ whatever your container wrote.
+
+ No HTTP server. No config file. No CLI.
+ >
+ ),
+ install: 'npm install light-runner',
+ codeHtml: CODE_HTML,
+ },
+ security: {
+ label: 'security model',
+ heading: (
+ <>
+ Hardened defaults, never opt-out. Add more restrictions, never
+ fewer.
+ >
+ ),
+ rows: [
+ {
+ k: 'Kernel permissions',
+ v: (
+ <>
+ Dangerous capabilities stripped at startup - raw sockets, device
+ creation, chroot escapes, capability juggling, audit-log spoofing. Every run,
+ unconditionally.
+ >
+ ),
+ },
+ {
+ k: 'No privilege escalation',
+ v: (
+ <>
+ A setuid binary inside your container cannot elevate above the user it
+ starts as.
+ >
+ ),
+ },
+ {
+ k: 'Fork-bomb protection',
+ v: (
+ <>
+ Max 100 processes per container. A runaway loop caps out in milliseconds
+ instead of paging the host.
+ >
+ ),
+ },
+ {
+ k: 'Memory and CPU budget',
+ v: (
+ <>
+ 512 MiB and one core by default, cgroup-enforced. Noisy
+ runs cannot starve their neighbours. Tunable per runner.
+ >
+ ),
+ },
+ {
+ k: 'Network isolation',
+ v: (
+ <>
+ Isolated bridge by default with inter-container traffic blocked. Pass{' '}
+ networks: ['none'] to sever it entirely.
+ >
+ ),
+ },
+ {
+ k: 'Host filesystem protection',
+ v: (
+ <>
+ Symlinks in your input folder are filtered before seeding, so a stray
+ link cannot reach back into the host filesystem.
+ >
+ ),
+ },
+ {
+ k: 'Safe file extraction',
+ v: (
+ <>
+ A container cannot write outside the destination folder you chose: paths escaping upward
+ (..) are refused. Each extracted entry is capped at 1 GiB so
+ a runaway output cannot fill your disk.
+ >
+ ),
+ },
+ {
+ k: 'Kernel-level hardening',
+ v: (
+ <>
+ Swap the runtime to gVisor with one option for user-space syscall
+ interception, at ~10-30% I/O cost.
+ >
+ ),
+ },
+ ],
+ note: (
+ <>
+ Does not cover - kernel exploits, runc CVEs, side-channel
+ attacks. For genuinely hostile code, combine with {'{ runtime: \'runsc\' }'}{' '}
+ (gVisor) or {'{ runtime: \'kata\' }'} (Kata Containers, VM-level isolation).
+ >
+ ),
+ },
+ ecosystem: {
+ label: 'ecosystem',
+ heading: (
+ <>
+ Three tools. Each does one thing.
+ >
+ ),
+ cards: [
+ {
+ name: 'light-runner',
+ current: true,
+ title: 'Spawn one container, return exit code and files.',
+ body: 'The execution primitive. Domain-agnostic. Zero orchestration. The other two tools in this family both call down to this one.',
+ repo: 'enixCode/light-runner',
+ },
+ {
+ name: 'light-run',
+ title: 'CLI and HTTP surface around light-runner.',
+ body: 'Point a POST endpoint at it, pipe bodies through, get results back. Stateless wrapper, same defaults, same guarantees.',
+ repo: 'enixCode/light-run',
+ },
+ {
+ name: 'light-process',
+ title: 'DAG orchestration, retries, fan-out.',
+ body: 'When one container is not enough. Composes runs into pipelines with backoff, concurrency limits, and structured outputs.',
+ repo: 'enixCode/light-process',
+ },
+ ],
+ },
+ footer: {
+ sig: 'One glowing node. One dark grid. The rest is up to the code inside.',
+ links: [
+ { label: 'API', href: `${BASE}/docs/api` },
+ { label: 'GitHub', href: 'https://github.com/enixCode/light-runner' },
+ { label: 'npm', href: 'https://www.npmjs.com/package/light-runner' },
+ { label: 'Security', href: '#security' },
+ { label: 'MIT', href: 'https://github.com/enixCode/light-runner/blob/main/LICENSE' },
+ ],
+ metaLeft: 'light-runner // execution primitive',
+ metaRight: 'built with cc',
+ },
+};
diff --git a/website/src/app/(home)/landing.css b/website/src/app/(home)/landing.css
deleted file mode 100644
index f06c133..0000000
--- a/website/src/app/(home)/landing.css
+++ /dev/null
@@ -1,607 +0,0 @@
-@import url('https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300..500;1,9..144,300..500&family=JetBrains+Mono:wght@400;500&display=swap');
-
-.bespoke-landing {
- background: var(--ink);
- color: var(--paper);
- min-height: 100vh;
- font-family: 'Fraunces', serif;
-}
-
-/* Bespoke landing styles. Loaded by theme/index.ts. Selectors are mostly class-based (.hero, .prim, etc.) so they only match elements present on the landing page; the few that could collide with VitePress chrome (section, main/header/footer) are scoped to .bespoke-landing / .bespoke-landing-wrap. */
- :root {
- --ink: #050608;
- --ink-2: #0a0c10;
- --ink-3: #12151c;
- --line: #1a1d24;
- --line-hot: #242933;
- --paper: #edeef0;
- --paper-dim: #8a8f9a;
- --paper-dimmer: #4d525c;
- --halo: #c7e8ff;
- --halo-soft: #7fddff;
- --amber: #ffb855;
- --ember: #ff6b35;
- }
-
-
-
- .bespoke-landing main, .bespoke-landing header, .bespoke-landing footer { position: relative; z-index: 1; }
-
- /* ---------- typography ---------- */
-
- .display {
- font-family: 'Fraunces', serif;
- font-variation-settings: "SOFT" 50, "WONK" 1;
- font-weight: 350;
- letter-spacing: -0.02em;
- line-height: 1;
- }
- .label {
- font-family: 'JetBrains Mono', monospace;
- font-weight: 500;
- font-size: 11px;
- letter-spacing: 0.22em;
- text-transform: uppercase;
- color: var(--paper-dim);
- }
- .label::before {
- content: "// ";
- color: var(--halo-soft);
- }
- .bespoke-landing code, .bespoke-landing pre, .bespoke-landing .mono {
- font-family: 'JetBrains Mono', monospace;
- font-size: 13px;
- }
-
- /* ---------- layout ---------- */
-
- .shell {
- max-width: 1240px;
- margin: 0 auto;
- padding: 0 clamp(24px, 5vw, 64px);
- }
-
- /* ---------- top bar ---------- */
-
- header.top {
- padding: 28px 0 0;
- }
- .top-row {
- display: flex;
- align-items: center;
- justify-content: space-between;
- padding-bottom: 20px;
- border-bottom: 1px solid var(--line);
- }
- .mark {
- display: inline-flex;
- align-items: center;
- gap: 10px;
- font-family: 'Fraunces', serif;
- font-weight: 400;
- font-size: 17px;
- letter-spacing: -0.01em;
- color: var(--paper);
- text-decoration: none;
- }
- .mark-dot {
- width: 10px; height: 10px;
- border-radius: 50%;
- background: var(--halo);
- box-shadow: 0 0 14px var(--halo-soft), 0 0 3px #fff inset;
- }
- .mark em {
- font-style: italic;
- font-weight: 300;
- color: var(--paper-dim);
- font-size: 12px;
- margin-left: 6px;
- }
- nav.top-nav {
- display: flex; gap: 28px;
- }
- nav.top-nav a {
- font-size: 12px;
- letter-spacing: 0.18em;
- text-transform: uppercase;
- font-family: 'JetBrains Mono', monospace;
- font-weight: 400;
- color: var(--paper-dim);
- text-decoration: none;
- transition: color .2s;
- }
- nav.top-nav a:hover { color: var(--paper); }
- nav.top-nav a:hover::before { content: "› "; color: var(--halo-soft); }
- @media (max-width: 720px) {
- nav.top-nav a:not(.primary) { display: none; }
- }
- nav.top-nav a.primary {
- color: var(--ink);
- background: var(--halo);
- padding: 8px 14px;
- border-radius: 2px;
- }
- nav.top-nav a.primary::before { display: none !important; }
-
- /* ---------- hero ---------- */
-
- .bespoke-landing section.hero {
- padding: clamp(60px, 10vh, 120px) 0 60px;
- display: grid;
- grid-template-columns: 1fr;
- gap: 60px;
- align-items: end;
- }
-
- .hero-headline { max-width: 860px; }
- .hero-eyebrow {
- display: flex; align-items: center; gap: 14px;
- margin-bottom: 32px;
- opacity: 0; transform: translateY(8px);
- animation: rise .9s .1s forwards cubic-bezier(.2,.7,.2,1);
- }
- .hero-eyebrow .v { color: var(--halo-soft); font-family: 'JetBrains Mono', monospace; font-size: 11px; letter-spacing: 0.18em; }
- .hero-eyebrow .divider { width: 36px; height: 1px; background: var(--line-hot); }
- .hero-eyebrow .tag { font-family: 'JetBrains Mono', monospace; font-size: 11px; letter-spacing: 0.22em; text-transform: uppercase; color: var(--paper-dim); }
-
- h1.display {
- font-size: clamp(52px, 9vw, 124px);
- opacity: 0; transform: translateY(16px);
- animation: rise 1s .15s forwards cubic-bezier(.2,.7,.2,1);
- }
- h1.display .accent {
- font-style: italic;
- font-weight: 300;
- color: var(--halo);
- }
- h1.display .shy {
- font-style: italic;
- font-weight: 300;
- color: var(--paper-dim);
- }
-
- .hero-lede {
- font-family: 'Fraunces', serif;
- font-weight: 300;
- font-size: clamp(18px, 2vw, 22px);
- line-height: 1.45;
- color: var(--paper);
- max-width: 640px;
- margin-top: 36px;
- opacity: 0; transform: translateY(12px);
- animation: rise 1s .3s forwards cubic-bezier(.2,.7,.2,1);
- }
- .hero-lede em {
- color: var(--paper-dim);
- font-style: italic;
- }
-
- .hero-meta {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
- gap: 24px 48px;
- margin-top: 48px;
- padding-top: 28px;
- border-top: 1px solid var(--line);
- opacity: 0; transform: translateY(12px);
- animation: rise 1s .45s forwards cubic-bezier(.2,.7,.2,1);
- }
- .hero-meta .cell { }
- .hero-meta .k { font-family: 'JetBrains Mono', monospace; font-size: 10px; letter-spacing: 0.22em; text-transform: uppercase; color: var(--paper-dimmer); margin-bottom: 6px; }
- .hero-meta .v { font-family: 'Fraunces', serif; font-size: 22px; font-weight: 350; letter-spacing: -0.01em; }
- .hero-meta .v .sub { color: var(--paper-dim); font-size: 13px; margin-left: 6px; font-family: 'JetBrains Mono', monospace; letter-spacing: 0; text-transform: none; }
-
- .hero-banner {
- margin-top: clamp(48px, 8vh, 96px);
- position: relative;
- overflow: hidden;
- border: 1px solid var(--line);
- border-radius: 2px;
- background: #000;
- aspect-ratio: 16 / 5;
- opacity: 0; transform: translateY(20px);
- animation: rise 1.4s .6s forwards cubic-bezier(.2,.7,.2,1);
- }
- .hero-banner img {
- width: 100%; height: 100%;
- object-fit: cover;
- display: block;
- filter: contrast(1.05);
- }
- .hero-banner::before {
- content: "";
- position: absolute; inset: 0;
- background: linear-gradient(180deg, transparent 60%, var(--ink) 100%);
- pointer-events: none;
- }
- .hero-banner .corners {
- position: absolute; inset: 12px;
- pointer-events: none;
- }
- .hero-banner .corners::before,
- .hero-banner .corners::after {
- content: "";
- position: absolute;
- width: 14px; height: 14px;
- border: 1px solid var(--halo-soft);
- opacity: .6;
- }
- .hero-banner .corners::before { top: 0; left: 0; border-right: none; border-bottom: none; }
- .hero-banner .corners::after { bottom: 0; right: 0; border-left: none; border-top: none; }
-
- .hero-banner-caption {
- display: flex; justify-content: space-between;
- margin-top: 12px;
- font-family: 'JetBrains Mono', monospace;
- font-size: 10px;
- letter-spacing: 0.2em;
- color: var(--paper-dimmer);
- text-transform: uppercase;
- }
-
- /* ---------- section frame ---------- */
-
- .bespoke-landing section {
- padding: clamp(80px, 12vh, 140px) 0;
- border-top: 1px solid var(--line);
- position: relative;
- }
- .bespoke-landing section .section-head {
- display: grid;
- grid-template-columns: 160px 1fr;
- gap: 48px;
- margin-bottom: 64px;
- align-items: baseline;
- }
- .bespoke-landing section .section-head .label { padding-top: 10px; }
- .bespoke-landing section h2 {
- font-family: 'Fraunces', serif;
- font-weight: 350;
- font-style: italic;
- font-size: clamp(32px, 4.5vw, 56px);
- letter-spacing: -0.015em;
- line-height: 1.05;
- max-width: 820px;
- }
- .bespoke-landing section h2 .strong {
- font-style: normal;
- color: var(--halo);
- font-variation-settings: "WONK" 1;
- }
- @media (max-width: 720px) {
- .bespoke-landing section .section-head { grid-template-columns: 1fr; gap: 8px; margin-bottom: 36px; }
- }
-
- /* ---------- primitives grid ---------- */
-
- .prims {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
- gap: 0;
- border-top: 1px solid var(--line);
- }
- .prim {
- padding: 36px 32px 40px;
- border-bottom: 1px solid var(--line);
- border-right: 1px solid var(--line);
- position: relative;
- transition: background .25s;
- }
- .prim:hover { background: var(--ink-2); }
- .prim:last-child { border-right: 1px solid var(--line); }
- @media (max-width: 720px) { .prim { border-right: none !important; } }
-
- .prim .num {
- font-family: 'JetBrains Mono', monospace;
- font-size: 11px;
- color: var(--halo-soft);
- letter-spacing: 0.2em;
- margin-bottom: 32px;
- display: flex; align-items: center; gap: 10px;
- }
- .prim .num::after {
- content: ""; flex: 1; height: 1px; background: var(--line-hot);
- }
- .prim h3 {
- font-family: 'Fraunces', serif;
- font-weight: 400;
- font-size: 24px;
- line-height: 1.15;
- margin-bottom: 14px;
- letter-spacing: -0.01em;
- }
- .prim h3 em { color: var(--halo); font-style: italic; font-weight: 300; }
- .prim p {
- font-size: 14px;
- line-height: 1.6;
- color: var(--paper-dim);
- max-width: 34ch;
- }
-
- /* ---------- code block ---------- */
-
- .code-window {
- border: 1px solid var(--line);
- background: var(--ink-2);
- border-radius: 2px;
- overflow: hidden;
- margin-top: 8px;
- }
- .code-window .bar {
- display: flex; align-items: center; justify-content: space-between;
- padding: 10px 16px;
- border-bottom: 1px solid var(--line);
- background: var(--ink-3);
- font-family: 'JetBrains Mono', monospace;
- font-size: 11px;
- color: var(--paper-dimmer);
- letter-spacing: 0.15em;
- text-transform: uppercase;
- }
- .code-window .bar .pills {
- display: inline-flex; gap: 6px;
- }
- .code-window .bar .pills i {
- width: 8px; height: 8px; border-radius: 50%; display: inline-block;
- background: #2a2f38;
- }
- .code-window .bar .pills i:first-child { background: #ff5f57; opacity: .55; }
- .code-window .bar .pills i:nth-child(2) { background: #febc2e; opacity: .55; }
- .code-window .bar .pills i:nth-child(3) { background: #28c840; opacity: .55; }
- .code-window pre {
- padding: 28px 32px;
- overflow-x: auto;
- font-size: 13px;
- line-height: 1.75;
- color: var(--paper);
- }
- .code-window pre .k { color: var(--halo-soft); }
- .code-window pre .s { color: #f5d796; }
- .code-window pre .c { color: var(--paper-dimmer); font-style: italic; }
- .code-window pre .f { color: var(--paper); }
- .code-window pre .p { color: var(--paper-dim); }
- .code-window pre .n { color: #c8b6ff; }
- button.copy {
- background: transparent;
- border: 1px solid var(--line-hot);
- color: var(--paper-dim);
- font-family: 'JetBrains Mono', monospace;
- font-size: 10px;
- letter-spacing: 0.18em;
- text-transform: uppercase;
- padding: 4px 10px;
- cursor: pointer;
- border-radius: 2px;
- transition: all .2s;
- }
- button.copy:hover { color: var(--ink); background: var(--halo); border-color: var(--halo); }
- button.copy.done { color: var(--ink); background: var(--halo-soft); border-color: var(--halo-soft); }
-
- /* ---------- quick-start split ---------- */
-
- .qstart {
- display: grid;
- grid-template-columns: 5fr 7fr;
- gap: 64px;
- align-items: start;
- }
- @media (max-width: 900px) { .qstart { grid-template-columns: 1fr; gap: 36px; } }
-
- .qstart .side p {
- font-family: 'Fraunces', serif;
- font-size: 19px;
- line-height: 1.55;
- color: var(--paper);
- font-weight: 300;
- }
- .qstart .side p + p { margin-top: 18px; color: var(--paper-dim); }
- .qstart .side .install {
- margin-top: 28px;
- display: inline-flex;
- align-items: center;
- gap: 12px;
- font-family: 'JetBrains Mono', monospace;
- font-size: 13px;
- padding: 12px 18px;
- border: 1px solid var(--line-hot);
- background: var(--ink-2);
- border-radius: 2px;
- }
- .qstart .side .install::before {
- content: "$"; color: var(--halo-soft);
- }
-
- /* ---------- security block ---------- */
-
- .sec-grid {
- display: grid;
- grid-template-columns: 1fr 1fr;
- border-top: 1px solid var(--line);
- }
- .sec-grid .row {
- display: contents;
- }
- .sec-grid .k, .sec-grid .v {
- padding: 20px 24px;
- border-bottom: 1px solid var(--line);
- }
- .sec-grid .k {
- font-family: 'JetBrains Mono', monospace;
- font-size: 12px;
- letter-spacing: 0.05em;
- color: var(--halo-soft);
- border-right: 1px solid var(--line);
- }
- .sec-grid .v {
- font-size: 14px;
- color: var(--paper-dim);
- line-height: 1.6;
- }
- .sec-grid .v strong { color: var(--paper); font-weight: 400; }
- @media (max-width: 720px) {
- .sec-grid { grid-template-columns: 1fr; }
- .sec-grid .k { border-right: none; padding-bottom: 4px; }
- .sec-grid .v { padding-top: 4px; }
- }
-
- .sec-note {
- margin-top: 40px;
- padding: 20px 24px;
- border-left: 2px solid var(--amber);
- background: rgba(255, 184, 85, 0.04);
- font-size: 14px;
- color: var(--paper-dim);
- line-height: 1.6;
- }
- .sec-note strong { color: var(--amber); font-weight: 500; }
-
- /* ---------- ecosystem cards ---------- */
-
- .eco {
- display: grid;
- grid-template-columns: repeat(3, 1fr);
- gap: 20px;
- }
- @media (max-width: 900px) { .eco { grid-template-columns: 1fr; } }
-
- .eco-card {
- padding: 32px 28px 28px;
- border: 1px solid var(--line);
- background: linear-gradient(180deg, var(--ink-2) 0%, var(--ink) 100%);
- border-radius: 2px;
- position: relative;
- overflow: hidden;
- transition: border-color .25s, transform .25s;
- }
- .eco-card:hover { border-color: var(--line-hot); transform: translateY(-2px); }
- .eco-card.this {
- border-color: var(--halo-soft);
- background: linear-gradient(180deg, rgba(127,221,255,0.06) 0%, var(--ink) 100%);
- }
- .eco-card.this::after {
- content: "this repo";
- position: absolute;
- top: 16px; right: 16px;
- font-family: 'JetBrains Mono', monospace;
- font-size: 10px;
- letter-spacing: 0.2em;
- text-transform: uppercase;
- color: var(--ink);
- background: var(--halo);
- padding: 4px 8px;
- border-radius: 2px;
- }
- .eco-card .mono-name {
- font-family: 'JetBrains Mono', monospace;
- font-weight: 500;
- font-size: 15px;
- color: var(--paper);
- margin-bottom: 18px;
- }
- .eco-card h3 {
- font-family: 'Fraunces', serif;
- font-weight: 400;
- font-size: 20px;
- line-height: 1.2;
- margin-bottom: 10px;
- letter-spacing: -0.01em;
- }
- .eco-card p {
- font-size: 13px;
- color: var(--paper-dim);
- line-height: 1.55;
- }
- .eco-card .status {
- margin-top: 22px;
- font-family: 'JetBrains Mono', monospace;
- font-size: 10px;
- letter-spacing: 0.2em;
- text-transform: uppercase;
- color: var(--paper-dimmer);
- display: flex; align-items: center; gap: 8px;
- }
- .eco-card .status::before {
- content: ""; width: 6px; height: 6px; border-radius: 50%;
- background: var(--paper-dimmer);
- }
- .eco-card.this .status::before { background: var(--halo); box-shadow: 0 0 10px var(--halo-soft); }
- .eco-card.this .status { color: var(--halo-soft); }
- /* Eco-card version: hidden by default, surfaced once GitHub API resolves. */
- .eco-card .status .status-version:not(:empty)::before { content: " - "; }
-
- /* ---------- footer ---------- */
-
- .bespoke-landing footer {
- padding: 56px 0 48px;
- border-top: 1px solid var(--line);
- }
- .foot-row {
- display: flex;
- justify-content: space-between;
- align-items: flex-end;
- flex-wrap: wrap;
- gap: 32px;
- }
- .foot-row .sig {
- font-family: 'Fraunces', serif;
- font-style: italic;
- font-weight: 300;
- font-size: 14px;
- color: var(--paper-dim);
- max-width: 320px;
- line-height: 1.5;
- }
- .foot-links {
- display: flex; gap: 32px;
- }
- .foot-links a {
- color: var(--paper-dim);
- text-decoration: none;
- font-family: 'JetBrains Mono', monospace;
- font-size: 11px;
- letter-spacing: 0.18em;
- text-transform: uppercase;
- transition: color .2s;
- }
- .foot-links a:hover { color: var(--halo); }
- .foot-meta {
- margin-top: 36px;
- padding-top: 20px;
- border-top: 1px solid var(--line);
- display: flex;
- justify-content: space-between;
- font-family: 'JetBrains Mono', monospace;
- font-size: 10px;
- letter-spacing: 0.2em;
- text-transform: uppercase;
- color: var(--paper-dimmer);
- }
-
- /* ---------- motion ---------- */
-
- @keyframes rise {
- to { opacity: 1; transform: translateY(0); }
- }
-
- /* Fallback for users with prefers-reduced-motion: reduce. The hero elements
- * start at opacity: 0 and rely on the rise animation to become visible; if
- * the animation is suppressed by the reduced-motion media query in custom.css,
- * we must surface them anyway, otherwise the entire hero reads as empty space. */
- @media (prefers-reduced-motion: reduce) {
- .bespoke-landing .hero-eyebrow,
- .bespoke-landing h1.display,
- .bespoke-landing .hero-lede,
- .bespoke-landing .hero-meta,
- .bespoke-landing .hero-banner {
- opacity: 1 !important;
- transform: none !important;
- animation: none !important;
- }
- }
-
-
- /* ---------- focus ---------- */
- .bespoke-landing a:focus-visible, .bespoke-landing button:focus-visible {
- outline: 1px solid var(--halo);
- outline-offset: 3px;
- }
diff --git a/website/src/app/(home)/page.tsx b/website/src/app/(home)/page.tsx
index 110a6d7..edb4a8d 100644
--- a/website/src/app/(home)/page.tsx
+++ b/website/src/app/(home)/page.tsx
@@ -1,416 +1,7 @@
-'use client';
-
-import { useEffect } from 'react';
-import './landing.css';
-
-const BASE = '/light-runner';
-
-const CODE_HTML = `import { DockerRunner } from 'light-runner' ;
-const runner = new DockerRunner ( { memory : '512m' , cpus : '1' } ) ;
-const execution = runner. run ( {
- image : 'python:3.12-alpine' ,
- entrypoint : 'python main.py' ,
- dir : './my-project' ,
- input : { task : 'compute' , n : 20 } ,
- timeout : 30_000 ,
- extract : [ { from : '/app/result.json' , to : './out' } ] ,
-} ) ;
-const result = await execution. result;
-result. success // true if exit 0 and not cancelled
-result. exitCode // the container exit code
-result. extracted // [{ from, to, status, bytes }] `;
+import { LandingPage } from 'light-landing-page';
+import 'light-landing-page/styles.css';
+import { lightRunnerData } from './data';
export default function HomePage() {
- useEffect(() => {
- const btn = document.querySelector('[data-copy]');
- const src = document.getElementById('code-sample');
- if (btn && src) {
- btn.addEventListener('click', async () => {
- try {
- await navigator.clipboard.writeText((src as HTMLElement).innerText.trim());
- btn.textContent = 'Copied';
- btn.classList.add('done');
- setTimeout(() => {
- btn.textContent = 'Copy';
- btn.classList.remove('done');
- }, 1600);
- } catch {
- btn.textContent = 'Select';
- }
- });
- }
-
- const PROJECT = 'enixCode/light-runner';
- const repos = new Set([PROJECT]);
- document.querySelectorAll('[data-eco-status][data-gh-repo]').forEach((el) => {
- const r = el.getAttribute('data-gh-repo');
- if (r) repos.add(r);
- });
-
- const fetchLatest = (repo: string): Promise<{ tag_name?: string; prerelease?: boolean } | null> =>
- fetch(`https://api.github.com/repos/${repo}/releases/latest`)
- .then((r) => (r.ok ? r.json() : null))
- .catch(() => null);
-
- Promise.all([...repos].map((repo) => fetchLatest(repo).then((data) => [repo, data] as const))).then(
- (entries) => {
- const releases = new Map(entries);
- const project = releases.get(PROJECT);
- if (project?.tag_name) {
- const tag = project.tag_name;
- const v = tag.startsWith('v') ? tag : `v${tag}`;
- document.querySelectorAll('[data-gh-version]').forEach((el) => {
- el.textContent = v;
- });
- }
- document.querySelectorAll('[data-eco-status][data-gh-repo]').forEach((el) => {
- const repo = el.getAttribute('data-gh-repo');
- const fallback = el.getAttribute('data-fallback') || 'In development';
- const data = repo ? releases.get(repo) : null;
- const tag = data?.tag_name;
- if (!tag) {
- el.textContent = fallback;
- return;
- }
- const v = tag.startsWith('v') ? tag : `v${tag}`;
- el.textContent = `${data?.prerelease === true ? 'Pre-release - ' : 'Stable - '}${v}`;
- });
- },
- );
- }, []);
-
- return (
-
-
-
- {/* HERO */}
-
-
-
-
-
- Execution primitive - Node.js
-
-
-
- Run untrusted code
-
- in hardened containers.
-
-
- A single-purpose Node.js library that runs your code in a container it tears down
- afterwards, and hands you back the exit code, logs, and any files you asked for. {' '}
- Nothing else.
-
-
-
-
Runtime
-
- Node >=22
-
-
-
-
Dependencies
-
- 3 dockerode + tar
-
-
-
-
Transport
-
- dockerode no CLI
-
-
-
-
License
-
- MIT permissive
-
-
-
-
-
-
- {/* eslint-disable-next-line @next/next/no-img-element */}
-
-
-
-
- Fig. 01 - One process, one cell, one grid.
- light-runner / visual
-
-
-
-
- {/* PRIMITIVES */}
-
-
-
-
what you get
-
- Give it code. Get back an exit code , logs, and the
- files you asked for.
-
-
-
-
-
01 / isolated
-
- Your code runs in its own cell .
-
-
- Every run gets a fresh container, its own volume, its own network. Nothing leaks in
- from the host, nothing leaks out to sibling runs. Torn down on exit, success or not.
-
-
-
-
02 / drop in, pull out
-
- Send a folder. Get any file back.
-
-
- Point at a directory on your disk, it becomes the container workdir. When the run
- finishes, ask for any path and it lands back on your host.
-
-
-
-
03 / stop on demand
-
- Cancel, abort, or time out .
-
-
- Pass an AbortSignal, call cancel(), or set a deadline. The
- container dies and its volume goes with it. No zombie processes, no leaked disk.
-
-
-
-
04 / any stack
-
- Python, Node, Go, Ruby, shell, anything .
-
-
- Any Docker image on your registry or anyone else's. No special runtime inside the
- container, no SDK to import, no convention to follow. Your code stays your code.
-
-
-
-
-
- {/* QUICK START */}
-
-
-
-
quick start
-
- Five lines to run, one to get your artefact.
-
-
-
-
-
- Point light-runner at an image and a folder. Pipe input through stdin.
- Extract whatever your container wrote.
-
-
No HTTP server. No config file. No CLI.
-
npm install light-runner
-
-
-
-
-
-
-
-
- example.ts
-
- Copy
-
-
-
-
-
-
-
- {/* SECURITY */}
-
-
-
-
security model
-
- Hardened defaults, never opt-out. Add more
- restrictions, never fewer.
-
-
-
-
-
Kernel permissions
-
- Dangerous capabilities stripped at startup - raw sockets, device
- creation, chroot escapes, capability juggling, audit-log spoofing. Every run,
- unconditionally.
-
-
-
-
No privilege escalation
-
- A setuid binary inside your container cannot elevate above the user
- it starts as.
-
-
-
-
Fork-bomb protection
-
- Max 100 processes per container. A runaway loop caps out in
- milliseconds instead of paging the host.
-
-
-
-
Memory and CPU budget
-
- 512 MiB and one core by default, cgroup-enforced.
- Noisy runs cannot starve their neighbours. Tunable per runner.
-
-
-
-
Network isolation
-
- Isolated bridge by default with inter-container traffic blocked.
- Pass networks: ['none'] to sever it entirely.
-
-
-
-
Host filesystem protection
-
- Symlinks in your input folder are filtered before seeding, so a
- stray link cannot reach back into the host filesystem.
-
-
-
-
Safe file extraction
-
- A container cannot write outside the destination folder you chose: paths escaping
- upward (..) are refused. Each extracted entry is capped at{' '}
- 1 GiB so a runaway output cannot fill your disk.
-
-
-
-
Kernel-level hardening
-
- Swap the runtime to gVisor with one option for user-space syscall
- interception, at ~10-30% I/O cost.
-
-
-
-
- Does not cover - kernel exploits, runc CVEs, side-channel
- attacks. For genuinely hostile code, combine with {'{ runtime: \'runsc\' }'}{' '}
- (gVisor) or {'{ runtime: \'kata\' }'} (Kata Containers, VM-level isolation).
-
-
-
- {/* ECOSYSTEM */}
-
-
-
-
ecosystem
-
- Three tools. Each does one thing.
-
-
-
-
- light-runner
- Spawn one container, return exit code and files.
-
- The execution primitive. Domain-agnostic. Zero orchestration. The other two tools in
- this family both call down to this one.
-
-
- Loading
-
-
-
- light-run
- CLI and HTTP surface around light-runner.
-
- Point a POST endpoint at it, pipe bodies through, get results back. Stateless
- wrapper, same defaults, same guarantees.
-
-
- Loading
-
-
-
- light-process
- DAG orchestration, retries, fan-out.
-
- When one container is not enough. Composes runs into pipelines with backoff,
- concurrency limits, and structured outputs.
-
-
- Loading
-
-
-
-
-
-
-
-
- );
+ return ;
}
From e10694eb975a554b89a1e2c06001b88647b60ced Mon Sep 17 00:00:00 2001
From: enixCode <58286681+enixCode@users.noreply.github.com>
Date: Sat, 30 May 2026 09:25:33 +0200
Subject: [PATCH 10/10] build(docs): cut over the docs site from VitePress to
Fumadocs
- Replace the VitePress docs with the Fumadocs static site under website/.
- docs.yml now regenerates the API (docs:api), builds the Next.js static
export and deploys website/out to Pages (was: VitePress build + dist).
- package.json: drop vitepress and the vitepress docs scripts. docs:api,
docs:dev and docs:build now drive the Fumadocs site; preversion and the
pre-commit hook regenerate website/content/docs/api.
- Remove the docs/ VitePress tree (landing, guides, api, .vitepress, public);
all of it now lives in website/.
- Update CLAUDE.md docs references.
build with cc
---
.github/workflows/docs.yml | 33 +-
.husky/pre-commit | 12 +-
docs/.vitepress/config.ts | 163 -
docs/.vitepress/theme/custom.css | 546 ----
docs/.vitepress/theme/index.ts | 15 -
docs/.vitepress/theme/landing.css | 598 ----
docs/api/classes/DockerRunner.md | 205 --
docs/api/classes/Execution.md | 138 -
docs/api/classes/LightRunnerError.md | 299 --
docs/api/functions/cleanupOrphanNetworks.md | 23 -
docs/api/functions/connectNetwork.md | 27 -
docs/api/functions/createNetwork.md | 27 -
docs/api/functions/deleteNetwork.md | 23 -
docs/api/functions/listStates.md | 17 -
docs/api/functions/networkExists.md | 23 -
docs/api/functions/readState.md | 23 -
docs/api/index.md | 39 -
docs/api/interfaces/CleanupCacheOptions.md | 19 -
docs/api/interfaces/CleanupNetworkOptions.md | 35 -
docs/api/interfaces/CreateNetworkOptions.md | 105 -
docs/api/interfaces/ExtractResult.md | 59 -
docs/api/interfaces/ExtractSpec.md | 29 -
docs/api/interfaces/RunRequest.md | 149 -
docs/api/interfaces/RunResult.md | 61 -
docs/api/interfaces/RunState.md | 149 -
docs/api/interfaces/RunnerOptions.md | 59 -
docs/api/interfaces/StopOptions.md | 29 -
docs/api/type-aliases/LightRunnerErrorCode.md | 21 -
docs/api/type-aliases/Runtime.md | 13 -
docs/guides/detached.md | 140 -
docs/guides/extract.md | 123 -
docs/guides/gvisor-kata.md | 132 -
docs/guides/quickstart.md | 56 -
docs/guides/security.md | 115 -
docs/index.md | 324 --
docs/public/banner.webp | Bin 26938 -> 0 bytes
package-lock.json | 2758 +----------------
package.json | 14 +-
38 files changed, 154 insertions(+), 6447 deletions(-)
delete mode 100644 docs/.vitepress/config.ts
delete mode 100644 docs/.vitepress/theme/custom.css
delete mode 100644 docs/.vitepress/theme/index.ts
delete mode 100644 docs/.vitepress/theme/landing.css
delete mode 100644 docs/api/classes/DockerRunner.md
delete mode 100644 docs/api/classes/Execution.md
delete mode 100644 docs/api/classes/LightRunnerError.md
delete mode 100644 docs/api/functions/cleanupOrphanNetworks.md
delete mode 100644 docs/api/functions/connectNetwork.md
delete mode 100644 docs/api/functions/createNetwork.md
delete mode 100644 docs/api/functions/deleteNetwork.md
delete mode 100644 docs/api/functions/listStates.md
delete mode 100644 docs/api/functions/networkExists.md
delete mode 100644 docs/api/functions/readState.md
delete mode 100644 docs/api/index.md
delete mode 100644 docs/api/interfaces/CleanupCacheOptions.md
delete mode 100644 docs/api/interfaces/CleanupNetworkOptions.md
delete mode 100644 docs/api/interfaces/CreateNetworkOptions.md
delete mode 100644 docs/api/interfaces/ExtractResult.md
delete mode 100644 docs/api/interfaces/ExtractSpec.md
delete mode 100644 docs/api/interfaces/RunRequest.md
delete mode 100644 docs/api/interfaces/RunResult.md
delete mode 100644 docs/api/interfaces/RunState.md
delete mode 100644 docs/api/interfaces/RunnerOptions.md
delete mode 100644 docs/api/interfaces/StopOptions.md
delete mode 100644 docs/api/type-aliases/LightRunnerErrorCode.md
delete mode 100644 docs/api/type-aliases/Runtime.md
delete mode 100644 docs/guides/detached.md
delete mode 100644 docs/guides/extract.md
delete mode 100644 docs/guides/gvisor-kata.md
delete mode 100644 docs/guides/quickstart.md
delete mode 100644 docs/guides/security.md
delete mode 100644 docs/index.md
delete mode 100644 docs/public/banner.webp
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index a0a4176..7c4bb9a 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -1,18 +1,20 @@
name: Docs
-# Build the VitePress site (bespoke landing in public/, guides, and TypeDoc-generated
-# API reference) and deploy it to GitHub Pages on every push to main that touches
+# Build the Fumadocs site (website/, a Next.js static export with the shared
+# light-landing-page home, the MDX guides, and a TypeDoc-generated API
+# reference) and deploy it to GitHub Pages on every push to main that touches
# the docs sources or the public surface they describe.
on:
push:
branches: [main]
paths:
- - 'docs/**'
+ - 'website/**'
- 'src/**'
+ - 'scripts/gen-fumadocs-api.mjs'
+ - 'typedoc.json'
- 'package.json'
- 'package-lock.json'
- - 'typedoc.json'
- '.github/workflows/docs.yml'
workflow_dispatch:
@@ -29,13 +31,11 @@ permissions:
jobs:
build:
- name: Build VitePress site
+ name: Build Fumadocs site
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- with:
- fetch-depth: 0 # lastUpdated needs the full history
- name: Setup Node.js 24
uses: actions/setup-node@v6
@@ -43,16 +43,27 @@ jobs:
node-version: 24
cache: npm
- - name: Install dependencies
+ # Root deps (typedoc + typedoc-plugin-markdown) power the API generation.
+ - name: Install root dependencies
run: npm ci
- - name: Regenerate TypeDoc markdown + build VitePress
- run: npm run docs
+ # Regenerate the API reference from the current src/ so it can never
+ # drift from the code.
+ - name: Regenerate the API reference
+ run: npm run docs:api
+
+ # The website is its own package; it pulls the shared landing
+ # (light-landing-page) via its lockfile.
+ - name: Install website dependencies
+ run: npm --prefix website ci
+
+ - name: Build the static export
+ run: npm --prefix website run build
- name: Upload Pages artifact
uses: actions/upload-pages-artifact@v3
with:
- path: docs/.vitepress/dist
+ path: website/out
deploy:
name: Deploy to GitHub Pages
diff --git a/.husky/pre-commit b/.husky/pre-commit
index 88e8287..8713d20 100644
--- a/.husky/pre-commit
+++ b/.husky/pre-commit
@@ -1,14 +1,14 @@
-# Regenerates docs/api/ ONLY if files under src/ are staged. Keeps the commit
-# UX snappy for pure-test or pure-config commits.
+# Regenerates the Fumadocs API reference ONLY if files under src/ are staged.
+# Keeps the commit UX snappy for pure-test or pure-config commits.
set -e
staged=$(git diff --cached --name-only --diff-filter=ACMR)
echo "$staged" | grep -qE '^src/' || exit 0
-echo "[pre-commit] src/ changed - regenerating docs/api/ ..."
-npm run --silent docs:typedoc > /dev/null
+echo "[pre-commit] src/ changed - regenerating the API reference ..."
+npm run --silent docs:api > /dev/null
-git add docs/api/
+git add website/content/docs/api/
-echo "[pre-commit] docs/api/ updated and staged."
+echo "[pre-commit] website/content/docs/api/ updated and staged."
diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts
deleted file mode 100644
index 260e4a3..0000000
--- a/docs/.vitepress/config.ts
+++ /dev/null
@@ -1,163 +0,0 @@
-import { defineConfig } from 'vitepress';
-// Derive the nav version label from package.json so it never goes stale on a
-// release. Vite/esbuild inlines the JSON import at config-build time.
-import pkg from '../../package.json';
-
-/*
- * VitePress site config for light-runner.
- *
- * Architecture:
- * - `docs/index.md` is the bespoke landing (layout: home, raw HTML/CSS preserved)
- * - `docs/guides/*.md` are user-facing how-to guides
- * - `docs/api/*.md` is auto-generated by typedoc-plugin-markdown from src/
- * - GitHub Pages deploys docs/.vitepress/dist/ (configured in .github/workflows/docs.yml)
- *
- * Sidebar for /api/ is intentionally a static list of the public re-exports
- * from src/index.ts. typedoc-plugin-markdown also writes its own README.md /
- * modules.md that we link as the entry point. Adding a new public export ->
- * remember to add it to the sidebar entry below.
- */
-
-const GUIDES = [
- { text: 'Quick start', link: '/guides/quickstart' },
- { text: 'Extract files', link: '/guides/extract' },
- { text: 'Detached runs', link: '/guides/detached' },
- { text: 'Security model', link: '/guides/security' },
- { text: 'gVisor & Kata', link: '/guides/gvisor-kata' },
-];
-
-/*
- * API sidebar mirrors the directory tree typedoc-plugin-markdown emits under
- * docs/api/. Adding a new public export -> regenerate the API ref via
- * `npm run docs:typedoc`, then add the corresponding entry here. The list is
- * hand-maintained because VitePress does not auto-generate sidebars from a
- * folder scan.
- */
-const API_SIDEBAR = [
- {
- text: 'Overview',
- items: [{ text: 'Public surface', link: '/api/' }],
- },
- {
- text: 'Classes',
- collapsed: false,
- items: [
- { text: 'DockerRunner', link: '/api/classes/DockerRunner' },
- { text: 'Execution', link: '/api/classes/Execution' },
- { text: 'LightRunnerError', link: '/api/classes/LightRunnerError' },
- ],
- },
- {
- text: 'Interfaces',
- collapsed: false,
- items: [
- { text: 'RunRequest', link: '/api/interfaces/RunRequest' },
- { text: 'RunResult', link: '/api/interfaces/RunResult' },
- { text: 'RunnerOptions', link: '/api/interfaces/RunnerOptions' },
- { text: 'ExtractSpec', link: '/api/interfaces/ExtractSpec' },
- { text: 'ExtractResult', link: '/api/interfaces/ExtractResult' },
- { text: 'StopOptions', link: '/api/interfaces/StopOptions' },
- { text: 'RunState', link: '/api/interfaces/RunState' },
- { text: 'CreateNetworkOptions', link: '/api/interfaces/CreateNetworkOptions' },
- { text: 'CleanupNetworkOptions', link: '/api/interfaces/CleanupNetworkOptions' },
- { text: 'CleanupCacheOptions', link: '/api/interfaces/CleanupCacheOptions' },
- ],
- },
- {
- text: 'Functions',
- collapsed: false,
- items: [
- { text: 'listStates', link: '/api/functions/listStates' },
- { text: 'readState', link: '/api/functions/readState' },
- { text: 'createNetwork', link: '/api/functions/createNetwork' },
- { text: 'deleteNetwork', link: '/api/functions/deleteNetwork' },
- { text: 'networkExists', link: '/api/functions/networkExists' },
- { text: 'cleanupOrphanNetworks', link: '/api/functions/cleanupOrphanNetworks' },
- ],
- },
- {
- text: 'Type aliases',
- collapsed: false,
- items: [
- { text: 'Runtime', link: '/api/type-aliases/Runtime' },
- { text: 'LightRunnerErrorCode', link: '/api/type-aliases/LightRunnerErrorCode' },
- ],
- },
-];
-
-export default defineConfig({
- title: 'light-runner',
- description: 'Run untrusted code in hardened Docker containers from Node.js',
- lang: 'en-US',
- // Project site is served under https://enixcode.github.io/light-runner/, so
- // the base must match the sub-path. Without it VitePress emits asset URLs
- // rooted at / (enixcode.github.io/assets/...) which 404, leaving the live
- // site blank. VitePress auto-prepends this base to absolute (/...) asset
- // and head URLs, so the favicon href stays '/banner.webp'.
- base: '/light-runner/',
- cleanUrls: true,
- lastUpdated: true,
- ignoreDeadLinks: 'localhostLinks',
-
- head: [
- ['link', { rel: 'icon', type: 'image/webp', href: '/banner.webp' }],
- ['meta', { name: 'theme-color', content: '#050608' }],
- ['meta', { property: 'og:title', content: 'light-runner' }],
- [
- 'meta',
- {
- property: 'og:description',
- content: 'Run untrusted code in hardened Docker containers from Node.js.',
- },
- ],
- ['meta', { property: 'og:image', content: 'https://enixcode.github.io/light-runner/banner.webp' }],
- ['meta', { property: 'og:url', content: 'https://enixcode.github.io/light-runner/' }],
- ['meta', { name: 'twitter:card', content: 'summary_large_image' }],
- ['meta', { name: 'twitter:image', content: 'https://enixcode.github.io/light-runner/banner.webp' }],
- ],
-
- // Bespoke landing + custom theme are dark-only by design (deep ink ground,
- // cyan halo accents, noise + grid background). A light mode would have to
- // be redesigned from scratch, so we lock the appearance to dark and hide
- // the toggle entirely.
- appearance: 'force-dark',
-
- themeConfig: {
- nav: [
- { text: 'Guides', link: '/guides/quickstart', activeMatch: '^/guides/' },
- { text: 'API', link: '/api/', activeMatch: '^/api/' },
- {
- text: `v${pkg.version}`,
- items: [
- { text: 'Changelog', link: 'https://github.com/enixCode/light-runner/releases' },
- { text: 'npm', link: 'https://www.npmjs.com/package/light-runner' },
- ],
- },
- ],
-
- sidebar: {
- '/guides/': [
- { text: 'Guides', items: GUIDES },
- ],
- '/api/': API_SIDEBAR,
- },
-
- socialLinks: [{ icon: 'github', link: 'https://github.com/enixCode/light-runner' }],
-
- footer: {
- message: 'Released under the MIT License.',
- copyright: 'light-runner / execution primitive',
- },
-
- search: {
- provider: 'local',
- },
-
- editLink: {
- pattern: 'https://github.com/enixCode/light-runner/edit/main/docs/:path',
- text: 'Edit this page on GitHub',
- },
-
- outline: { level: [2, 3] },
- },
-});
diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css
deleted file mode 100644
index d12a71e..0000000
--- a/docs/.vitepress/theme/custom.css
+++ /dev/null
@@ -1,546 +0,0 @@
-/*
- * light-runner / VitePress theme overrides.
- * Mirrors the bespoke landing's design language onto every guide and API page.
- *
- * Layers:
- * 1. Fonts: Fraunces (display), IBM Plex Sans (body), JetBrains Mono (labels/code)
- * 2. Palette tokens: dark ink, glacial cyan halo, amber/ember accents
- * 3. Background: fixed-position GPU-composited noise + grid (zero scroll cost)
- * 4. Chrome: nav, sidebar, content typography, code blocks, search dialog
- */
-
-@import url('https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght,SOFT,WONK@9..144,300..700,0..100,0..1&family=IBM+Plex+Sans:wght@300;400;500;600&family=JetBrains+Mono:wght@400;500&display=swap');
-
-/* ---------- Palette + token bridge ---------- */
-
-:root {
- --ink: #050608;
- --ink-2: #0a0c10;
- --ink-3: #12151c;
- --line: #1a1d24;
- --line-hot: #242933;
- --paper: #edeef0;
- --paper-dim: #8a8f9a;
- --paper-dimmer: #4d525c;
- --halo: #c7e8ff;
- --halo-soft: #7fddff;
- --amber: #ffb855;
- --ember: #ff6b35;
-}
-
-/* Map our palette onto VitePress' design tokens. */
-:root {
- --vp-c-bg: var(--ink);
- --vp-c-bg-alt: var(--ink-2);
- --vp-c-bg-elv: var(--ink-3);
- --vp-c-bg-soft: var(--ink-2);
-
- --vp-c-default-1: var(--paper);
- --vp-c-default-2: var(--paper-dim);
- --vp-c-default-3: var(--paper-dimmer);
- --vp-c-default-soft: rgba(127, 221, 255, 0.06);
-
- --vp-c-brand-1: var(--halo-soft);
- --vp-c-brand-2: var(--halo);
- --vp-c-brand-3: var(--halo-soft);
- --vp-c-brand-soft: rgba(127, 221, 255, 0.10);
-
- --vp-c-tip-1: var(--halo-soft);
- --vp-c-tip-2: var(--halo);
- --vp-c-tip-soft: rgba(127, 221, 255, 0.08);
-
- --vp-c-warning-1: var(--amber);
- --vp-c-warning-2: var(--amber);
- --vp-c-warning-soft: rgba(255, 184, 85, 0.08);
-
- --vp-c-danger-1: var(--ember);
- --vp-c-danger-2: var(--ember);
- --vp-c-danger-soft: rgba(255, 107, 53, 0.10);
-
- --vp-c-text-1: var(--paper);
- --vp-c-text-2: var(--paper-dim);
- --vp-c-text-3: var(--paper-dimmer);
-
- --vp-c-divider: var(--line);
- --vp-c-gutter: var(--ink);
-
- --vp-font-family-base: 'IBM Plex Sans', system-ui, sans-serif;
- --vp-font-family-mono: 'JetBrains Mono', monospace;
-
- --vp-code-bg: var(--ink-2);
- --vp-code-block-bg: var(--ink-2);
- --vp-code-block-divider-color: var(--line);
- --vp-code-line-highlight-color: rgba(127, 221, 255, 0.06);
-
- --vp-c-shadow-3: 0 0 24px rgba(127, 221, 255, 0.08);
-
- /* Sidebar widths slightly tighter than default for a more editorial feel. */
- --vp-layout-max-width: 1340px;
- --vp-sidebar-width: 252px;
-}
-
-html.dark {
- /* Force dark — light theme would clash with the noise + halo palette. */
- --vp-c-bg: var(--ink);
- --vp-c-bg-alt: var(--ink-2);
-}
-
-/* ---------- Body + persistent grid + noise overlay ---------- */
-
-html, body {
- background-color: var(--ink);
- color: var(--paper);
-}
-
-body {
- font-family: var(--vp-font-family-base);
- font-weight: 300;
- font-size: 16px;
- line-height: 1.65;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
- letter-spacing: 0.005em;
-}
-
-/* Fixed GPU-composited background: noise + grid + radial halo. Same trick as
- * the landing - one composited layer that survives scroll without repaints.
- * Grid opacity intentionally low so the texture reads as atmosphere, not as
- * a foreground element competing with the content. */
-body::before {
- content: "";
- position: fixed;
- inset: 0;
- z-index: 0;
- pointer-events: none;
- background-color: var(--ink);
- background-image:
- url("data:image/svg+xml;utf8, "),
- radial-gradient(ellipse 80% 60% at 50% 0%, rgba(127, 221, 255, 0.03), transparent 70%),
- linear-gradient(rgba(255, 255, 255, 0.018) 1px, transparent 1px),
- linear-gradient(90deg, rgba(255, 255, 255, 0.018) 1px, transparent 1px);
- background-size: 180px 180px, 100% 100%, 96px 96px, 96px 96px;
- background-position: 0 0, 0 0, 0 0, 0 0;
- transform: translateZ(0);
- will-change: transform;
-}
-
-#app, .Layout, .VPContent { position: relative; z-index: 1; background: transparent; }
-.VPDoc, .VPDoc.has-aside .content-container, .VPHome, .VPPage { background: transparent !important; }
-
-/* ---------- Top navbar ---------- */
-
-.VPNav {
- background: rgba(5, 6, 8, 0.78) !important;
- backdrop-filter: blur(14px) saturate(140%);
- -webkit-backdrop-filter: blur(14px) saturate(140%);
- border-bottom: 1px solid var(--line);
-}
-.VPNavBar.has-sidebar .content,
-.VPNavBar .content,
-.VPNavBar .container {
- background: transparent !important;
-}
-.VPNavBar .title {
- font-family: 'Fraunces', serif;
- font-weight: 400;
- letter-spacing: -0.01em;
- font-size: 17px;
- color: var(--paper);
-}
-/* Glowing dot before the site title - mirrors the .mark-dot of the landing. */
-.VPNavBarTitle .title::before {
- content: "";
- display: inline-block;
- width: 9px;
- height: 9px;
- border-radius: 50%;
- background: var(--halo);
- box-shadow: 0 0 14px var(--halo-soft), 0 0 3px #fff inset;
- margin-right: 12px;
- vertical-align: middle;
- transform: translateY(-1px);
-}
-.VPNavBarMenuLink, .VPNavBarMenuGroup .text {
- font-family: 'JetBrains Mono', monospace;
- font-size: 11px !important;
- font-weight: 400 !important;
- letter-spacing: 0.18em;
- text-transform: uppercase;
- color: var(--paper-dim) !important;
- transition: color .2s;
-}
-.VPNavBarMenuLink:hover, .VPNavBarMenuGroup:hover .text { color: var(--paper) !important; }
-.VPNavBarMenuLink.active { color: var(--halo) !important; }
-
-.VPNavBarSocialLinks svg { transition: transform .2s, color .2s; }
-.VPNavBarSocialLinks a:hover svg { color: var(--halo) !important; transform: translateY(-1px); }
-
-/* ---------- Sidebar ---------- */
-
-.VPSidebar {
- background: rgba(10, 12, 16, 0.55) !important;
- backdrop-filter: blur(8px);
- -webkit-backdrop-filter: blur(8px);
- border-right: 1px solid var(--line);
- padding-top: 16px;
-}
-.VPSidebarItem .text {
- font-family: 'IBM Plex Sans', system-ui, sans-serif;
- font-weight: 400;
- font-size: 14px;
- letter-spacing: 0.005em;
- color: var(--paper-dim);
-}
-.VPSidebarItem.is-active > .item .text,
-.VPSidebarItem.has-active > .item .text { color: var(--halo) !important; font-weight: 500; }
-.VPSidebarItem.level-0 > .item .text {
- font-family: 'JetBrains Mono', monospace;
- font-size: 10px;
- font-weight: 500;
- letter-spacing: 0.22em;
- text-transform: uppercase;
- color: var(--paper-dimmer);
-}
-.VPSidebarItem.level-0 > .item .text::before {
- content: "// ";
- color: var(--halo-soft);
-}
-.VPSidebarItem .link:hover .text { color: var(--paper) !important; }
-
-/* ---------- Document layout + typography ---------- */
-
-.VPDoc .container {
- padding-top: 28px;
-}
-.VPDoc h1, .VPDoc h2, .VPDoc h3, .VPDoc h4 {
- font-family: 'Fraunces', serif;
- letter-spacing: -0.018em;
- color: var(--paper);
-}
-.VPDoc h1 {
- font-weight: 350;
- font-style: italic;
- font-size: clamp(40px, 5vw, 64px);
- line-height: 1.05;
- margin-bottom: 28px;
-}
-.VPDoc h1 .strong, .VPDoc h2 .strong { color: var(--halo); font-style: normal; }
-.VPDoc h2 {
- font-weight: 350;
- font-style: italic;
- font-size: clamp(26px, 2.6vw, 34px);
- line-height: 1.15;
- margin-top: 56px;
- padding-top: 16px;
- border-top: 1px solid var(--line);
-}
-.VPDoc h2::before {
- content: "// ";
- font-style: normal;
- font-family: 'JetBrains Mono', monospace;
- font-weight: 500;
- font-size: 10px;
- letter-spacing: 0.22em;
- color: var(--halo-soft);
- vertical-align: middle;
- margin-right: 6px;
- text-transform: uppercase;
- display: inline-block;
- padding: 0 6px 1px 0;
-}
-.VPDoc h3 {
- font-weight: 400;
- font-size: clamp(18px, 1.3vw, 21px);
- line-height: 1.25;
- margin-top: 32px;
- margin-bottom: 8px;
- color: var(--paper);
- letter-spacing: -0.01em;
- font-style: normal;
-}
-.VPDoc h4 {
- font-weight: 500;
- font-size: 14px;
- line-height: 1.3;
- margin-top: 22px;
- margin-bottom: 6px;
- color: var(--paper);
- font-style: normal;
- font-family: 'IBM Plex Sans', system-ui, sans-serif;
- letter-spacing: -0.005em;
-}
-.VPDoc h3 em, .VPDoc h2 em {
- color: var(--halo);
- font-style: italic;
- font-weight: 300;
-}
-.VPDoc p { color: var(--paper); font-weight: 300; margin: 10px 0; }
-.VPDoc p em { color: var(--paper-dim); font-style: italic; }
-.VPDoc strong { color: var(--paper); font-weight: 500; }
-/* TypeDoc-generated "Defined in: src/foo.ts:NN" lines - dim, small, mono. */
-.VPDoc p:has(> a[href*="src/"]) {
- font-family: 'JetBrains Mono', monospace;
- font-size: 11px;
- color: var(--paper-dimmer);
- margin: 4px 0 14px;
- letter-spacing: 0;
-}
-.VPDoc p:has(> a[href*="src/"]) a {
- color: var(--paper-dim);
- border-bottom: none;
-}
-.VPDoc p:has(> a[href*="src/"]) a:hover { color: var(--halo); }
-.VPDoc hr {
- border: none;
- height: 1px;
- margin: 6px 0;
- background: linear-gradient(
- 90deg,
- transparent 0%,
- rgba(127, 221, 255, 0.45) 12%,
- rgba(127, 221, 255, 0.45) 88%,
- transparent 100%
- );
- box-shadow: 0 0 12px rgba(127, 221, 255, 0.25);
-}
-/* When an h3 follows an hr (typedoc property-list pattern), kill its
- * margin-top so the divider sits flush against the next property name. */
-.VPDoc hr + h3,
-.VPDoc hr + h4 {
- margin-top: 14px;
-}
-.VPDoc a {
- color: var(--halo);
- text-decoration: none;
- border-bottom: 1px solid transparent;
- transition: border-color .15s;
-}
-.VPDoc a:hover { border-bottom-color: var(--halo); }
-.VPDoc ul, .VPDoc ol { color: var(--paper); }
-.VPDoc li { margin: 6px 0; }
-.VPDoc hr { border-color: var(--line); margin: 48px 0; }
-
-.VPDoc blockquote {
- border-left: 2px solid var(--halo-soft);
- background: rgba(127, 221, 255, 0.04);
- padding: 18px 22px;
- margin: 24px 0;
- color: var(--paper-dim);
- font-family: 'Fraunces', serif;
- font-style: italic;
- font-weight: 300;
- font-size: 17px;
-}
-.VPDoc blockquote p { margin: 0; }
-.VPDoc blockquote strong { color: var(--paper); font-style: normal; }
-
-/* ---------- Tables ---------- */
-
-.VPDoc table {
- border-collapse: collapse;
- margin: 24px 0;
- display: table;
- width: 100%;
-}
-.VPDoc th, .VPDoc td {
- border: 1px solid var(--line);
- padding: 12px 16px;
- text-align: left;
- background: transparent;
-}
-.VPDoc th {
- font-family: 'JetBrains Mono', monospace;
- font-size: 11px;
- font-weight: 500;
- letter-spacing: 0.14em;
- text-transform: uppercase;
- color: var(--halo-soft);
- background: rgba(127, 221, 255, 0.04);
-}
-.VPDoc tr:nth-child(2n) td { background: rgba(255, 255, 255, 0.012); }
-
-/* ---------- Inline code + code blocks ---------- */
-
-.VPDoc :not(pre) > code {
- font-family: 'JetBrains Mono', monospace;
- font-size: 13px;
- background: var(--ink-2);
- color: var(--halo);
- padding: 2px 7px;
- border-radius: 2px;
- border: 1px solid var(--line);
-}
-.VPDoc div[class*="language-"] {
- background: var(--ink-2);
- border: 1px solid var(--line);
- border-radius: 2px;
- margin: 12px 0 18px;
- position: relative;
- overflow: hidden;
-}
-/* On API pages h3 + code block is the dominant pattern (one per property);
- * pull the code right under the header with no margin between them. */
-.VPDoc h3 + div[class*="language-"],
-.VPDoc h4 + div[class*="language-"] {
- margin-top: 6px;
-}
-.VPDoc div[class*="language-"]::before {
- /* Mac-style traffic-light dots above the code block, mirrors .code-window of landing. */
- content: "";
- display: block;
- height: 32px;
- border-bottom: 1px solid var(--line);
- background: var(--ink-3) url("data:image/svg+xml;utf8, ") 16px 12px no-repeat;
-}
-.VPDoc div[class*="language-"] pre {
- background: transparent !important;
- padding: 18px 24px !important;
- font-size: 13px;
- line-height: 1.65;
- color: var(--paper);
-}
-.VPDoc div[class*="language-"] .lang {
- display: none; /* hide the small lang badge; the dots already mark the block */
-}
-.VPDoc div[class*="language-"] .copy {
- top: 6px !important;
- right: 8px !important;
- background: transparent !important;
- border: 1px solid var(--line-hot) !important;
- color: var(--paper-dim) !important;
- font-family: 'JetBrains Mono', monospace !important;
- font-size: 9px !important;
- letter-spacing: 0.18em;
- text-transform: uppercase;
-}
-.VPDoc div[class*="language-"] .copy:hover {
- background: var(--halo) !important;
- color: var(--ink) !important;
- border-color: var(--halo) !important;
-}
-
-/* ---------- Aside (right outline) ---------- */
-
-.VPDocAside .outline-marker {
- background: var(--halo) !important;
-}
-.VPDocAside .outline-title,
-.VPDocAside .outline-link {
- font-family: 'JetBrains Mono', monospace;
-}
-.VPDocAside .outline-title {
- font-size: 10px;
- font-weight: 500;
- letter-spacing: 0.22em;
- text-transform: uppercase;
- color: var(--paper-dimmer);
-}
-.VPDocAside .outline-title::before {
- content: "// ";
- color: var(--halo-soft);
-}
-.VPDocAside .outline-link {
- font-size: 12px;
- color: var(--paper-dim);
- letter-spacing: 0;
- text-transform: none;
- transition: color .2s;
-}
-.VPDocAside .outline-link:hover,
-.VPDocAside .outline-link.active { color: var(--halo) !important; }
-
-/* ---------- Search dialog ---------- */
-
-.VPLocalSearchBox .shell {
- background: var(--ink-2) !important;
- border: 1px solid var(--line-hot) !important;
-}
-.VPLocalSearchBox .search-bar {
- background: var(--ink-3);
- border-bottom: 1px solid var(--line);
-}
-.VPLocalSearchBox .search-input {
- font-family: 'JetBrains Mono', monospace;
- color: var(--paper);
-}
-.VPNavBarSearch .DocSearch-Button,
-.VPNavBarSearchButton {
- background: transparent !important;
- border: 1px solid var(--line) !important;
- color: var(--paper-dim) !important;
-}
-.VPNavBarSearch .DocSearch-Button:hover { border-color: var(--halo-soft) !important; color: var(--paper) !important; }
-
-/* ---------- Edit-this-page + last-updated + prev/next ---------- */
-
-.VPDocFooter, .edit-info {
- border-top: 1px solid var(--line);
-}
-.edit-link-button {
- font-family: 'JetBrains Mono', monospace;
- font-size: 11px;
- letter-spacing: 0.18em;
- text-transform: uppercase;
- color: var(--paper-dim) !important;
-}
-.edit-link-button:hover { color: var(--halo) !important; }
-.last-updated {
- font-family: 'JetBrains Mono', monospace;
- font-size: 10px;
- letter-spacing: 0.14em;
- color: var(--paper-dimmer);
-}
-.pager-link {
- border: 1px solid var(--line);
- background: var(--ink-2);
- transition: border-color .2s, transform .2s;
-}
-.pager-link:hover { border-color: var(--halo-soft); transform: translateY(-1px); }
-.pager-link .desc {
- font-family: 'JetBrains Mono', monospace;
- font-size: 10px;
- letter-spacing: 0.18em;
- text-transform: uppercase;
- color: var(--paper-dimmer);
-}
-.pager-link .title {
- font-family: 'Fraunces', serif;
- font-style: italic;
- font-weight: 300;
- color: var(--paper);
-}
-
-/* ---------- Footer ---------- */
-
-.VPFooter {
- background: transparent !important;
- border-top: 1px solid var(--line);
- font-family: 'JetBrains Mono', monospace;
- font-size: 10px;
- letter-spacing: 0.18em;
- text-transform: uppercase;
- color: var(--paper-dimmer) !important;
-}
-.VPFooter .message, .VPFooter .copyright { color: var(--paper-dimmer) !important; }
-
-/* ---------- Selection + focus ---------- */
-
-::selection { background: var(--halo); color: var(--ink); }
-a:focus-visible, button:focus-visible {
- outline: 1px solid var(--halo);
- outline-offset: 3px;
- border-radius: 1px;
-}
-
-/* ---------- Reduced motion ---------- */
-
-@media (prefers-reduced-motion: reduce) {
- * { animation: none !important; transition: none !important; }
-}
-
-/* ---------- Mobile tweaks ---------- */
-
-@media (max-width: 720px) {
- .VPDoc h2 { margin-top: 40px; }
- .VPDoc h1 { font-size: 36px; }
-}
diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts
deleted file mode 100644
index e435138..0000000
--- a/docs/.vitepress/theme/index.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import type { Theme } from 'vitepress';
-import DefaultTheme from 'vitepress/theme';
-import './custom.css';
-import './landing.css';
-
-/*
- * Extends VitePress' default theme with the light-runner laboratory aesthetic:
- * Fraunces display, IBM Plex Sans body, JetBrains Mono labels, ink/paper/halo
- * palette, persistent grid + noise background. Defined here, applied to every
- * route under /guides/ and /api/ so the chrome matches the bespoke landing
- * served at /.
- */
-export default {
- extends: DefaultTheme,
-} satisfies Theme;
diff --git a/docs/.vitepress/theme/landing.css b/docs/.vitepress/theme/landing.css
deleted file mode 100644
index cf112d8..0000000
--- a/docs/.vitepress/theme/landing.css
+++ /dev/null
@@ -1,598 +0,0 @@
-/* Bespoke landing styles. Loaded by theme/index.ts. Selectors are mostly class-based (.hero, .prim, etc.) so they only match elements present on the landing page; the few that could collide with VitePress chrome (section, main/header/footer) are scoped to .bespoke-landing / .bespoke-landing-wrap. */
- :root {
- --ink: #050608;
- --ink-2: #0a0c10;
- --ink-3: #12151c;
- --line: #1a1d24;
- --line-hot: #242933;
- --paper: #edeef0;
- --paper-dim: #8a8f9a;
- --paper-dimmer: #4d525c;
- --halo: #c7e8ff;
- --halo-soft: #7fddff;
- --amber: #ffb855;
- --ember: #ff6b35;
- }
-
-
-
- .bespoke-landing main, .bespoke-landing header, .bespoke-landing footer { position: relative; z-index: 1; }
-
- /* ---------- typography ---------- */
-
- .display {
- font-family: 'Fraunces', serif;
- font-variation-settings: "SOFT" 50, "WONK" 1;
- font-weight: 350;
- letter-spacing: -0.02em;
- line-height: 1;
- }
- .label {
- font-family: 'JetBrains Mono', monospace;
- font-weight: 500;
- font-size: 11px;
- letter-spacing: 0.22em;
- text-transform: uppercase;
- color: var(--paper-dim);
- }
- .label::before {
- content: "// ";
- color: var(--halo-soft);
- }
- code, pre, .mono {
- font-family: 'JetBrains Mono', monospace;
- font-size: 13px;
- }
-
- /* ---------- layout ---------- */
-
- .shell {
- max-width: 1240px;
- margin: 0 auto;
- padding: 0 clamp(24px, 5vw, 64px);
- }
-
- /* ---------- top bar ---------- */
-
- header.top {
- padding: 28px 0 0;
- }
- .top-row {
- display: flex;
- align-items: center;
- justify-content: space-between;
- padding-bottom: 20px;
- border-bottom: 1px solid var(--line);
- }
- .mark {
- display: inline-flex;
- align-items: center;
- gap: 10px;
- font-family: 'Fraunces', serif;
- font-weight: 400;
- font-size: 17px;
- letter-spacing: -0.01em;
- color: var(--paper);
- text-decoration: none;
- }
- .mark-dot {
- width: 10px; height: 10px;
- border-radius: 50%;
- background: var(--halo);
- box-shadow: 0 0 14px var(--halo-soft), 0 0 3px #fff inset;
- }
- .mark em {
- font-style: italic;
- font-weight: 300;
- color: var(--paper-dim);
- font-size: 12px;
- margin-left: 6px;
- }
- nav.top-nav {
- display: flex; gap: 28px;
- }
- nav.top-nav a {
- font-size: 12px;
- letter-spacing: 0.18em;
- text-transform: uppercase;
- font-family: 'JetBrains Mono', monospace;
- font-weight: 400;
- color: var(--paper-dim);
- text-decoration: none;
- transition: color .2s;
- }
- nav.top-nav a:hover { color: var(--paper); }
- nav.top-nav a:hover::before { content: "› "; color: var(--halo-soft); }
- @media (max-width: 720px) {
- nav.top-nav a:not(.primary) { display: none; }
- }
- nav.top-nav a.primary {
- color: var(--ink);
- background: var(--halo);
- padding: 8px 14px;
- border-radius: 2px;
- }
- nav.top-nav a.primary::before { display: none !important; }
-
- /* ---------- hero ---------- */
-
- .bespoke-landing section.hero {
- padding: clamp(60px, 10vh, 120px) 0 60px;
- display: grid;
- grid-template-columns: 1fr;
- gap: 60px;
- align-items: end;
- }
-
- .hero-headline { max-width: 860px; }
- .hero-eyebrow {
- display: flex; align-items: center; gap: 14px;
- margin-bottom: 32px;
- opacity: 0; transform: translateY(8px);
- animation: rise .9s .1s forwards cubic-bezier(.2,.7,.2,1);
- }
- .hero-eyebrow .v { color: var(--halo-soft); font-family: 'JetBrains Mono', monospace; font-size: 11px; letter-spacing: 0.18em; }
- .hero-eyebrow .divider { width: 36px; height: 1px; background: var(--line-hot); }
- .hero-eyebrow .tag { font-family: 'JetBrains Mono', monospace; font-size: 11px; letter-spacing: 0.22em; text-transform: uppercase; color: var(--paper-dim); }
-
- h1.display {
- font-size: clamp(52px, 9vw, 124px);
- opacity: 0; transform: translateY(16px);
- animation: rise 1s .15s forwards cubic-bezier(.2,.7,.2,1);
- }
- h1.display .accent {
- font-style: italic;
- font-weight: 300;
- color: var(--halo);
- }
- h1.display .shy {
- font-style: italic;
- font-weight: 300;
- color: var(--paper-dim);
- }
-
- .hero-lede {
- font-family: 'Fraunces', serif;
- font-weight: 300;
- font-size: clamp(18px, 2vw, 22px);
- line-height: 1.45;
- color: var(--paper);
- max-width: 640px;
- margin-top: 36px;
- opacity: 0; transform: translateY(12px);
- animation: rise 1s .3s forwards cubic-bezier(.2,.7,.2,1);
- }
- .hero-lede em {
- color: var(--paper-dim);
- font-style: italic;
- }
-
- .hero-meta {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
- gap: 24px 48px;
- margin-top: 48px;
- padding-top: 28px;
- border-top: 1px solid var(--line);
- opacity: 0; transform: translateY(12px);
- animation: rise 1s .45s forwards cubic-bezier(.2,.7,.2,1);
- }
- .hero-meta .cell { }
- .hero-meta .k { font-family: 'JetBrains Mono', monospace; font-size: 10px; letter-spacing: 0.22em; text-transform: uppercase; color: var(--paper-dimmer); margin-bottom: 6px; }
- .hero-meta .v { font-family: 'Fraunces', serif; font-size: 22px; font-weight: 350; letter-spacing: -0.01em; }
- .hero-meta .v .sub { color: var(--paper-dim); font-size: 13px; margin-left: 6px; font-family: 'JetBrains Mono', monospace; letter-spacing: 0; text-transform: none; }
-
- .hero-banner {
- margin-top: clamp(48px, 8vh, 96px);
- position: relative;
- overflow: hidden;
- border: 1px solid var(--line);
- border-radius: 2px;
- background: #000;
- aspect-ratio: 16 / 5;
- opacity: 0; transform: translateY(20px);
- animation: rise 1.4s .6s forwards cubic-bezier(.2,.7,.2,1);
- }
- .hero-banner img {
- width: 100%; height: 100%;
- object-fit: cover;
- display: block;
- filter: contrast(1.05);
- }
- .hero-banner::before {
- content: "";
- position: absolute; inset: 0;
- background: linear-gradient(180deg, transparent 60%, var(--ink) 100%);
- pointer-events: none;
- }
- .hero-banner .corners {
- position: absolute; inset: 12px;
- pointer-events: none;
- }
- .hero-banner .corners::before,
- .hero-banner .corners::after {
- content: "";
- position: absolute;
- width: 14px; height: 14px;
- border: 1px solid var(--halo-soft);
- opacity: .6;
- }
- .hero-banner .corners::before { top: 0; left: 0; border-right: none; border-bottom: none; }
- .hero-banner .corners::after { bottom: 0; right: 0; border-left: none; border-top: none; }
-
- .hero-banner-caption {
- display: flex; justify-content: space-between;
- margin-top: 12px;
- font-family: 'JetBrains Mono', monospace;
- font-size: 10px;
- letter-spacing: 0.2em;
- color: var(--paper-dimmer);
- text-transform: uppercase;
- }
-
- /* ---------- section frame ---------- */
-
- .bespoke-landing section {
- padding: clamp(80px, 12vh, 140px) 0;
- border-top: 1px solid var(--line);
- position: relative;
- }
- .bespoke-landing section .section-head {
- display: grid;
- grid-template-columns: 160px 1fr;
- gap: 48px;
- margin-bottom: 64px;
- align-items: baseline;
- }
- .bespoke-landing section .section-head .label { padding-top: 10px; }
- .bespoke-landing section h2 {
- font-family: 'Fraunces', serif;
- font-weight: 350;
- font-style: italic;
- font-size: clamp(32px, 4.5vw, 56px);
- letter-spacing: -0.015em;
- line-height: 1.05;
- max-width: 820px;
- }
- .bespoke-landing section h2 .strong {
- font-style: normal;
- color: var(--halo);
- font-variation-settings: "WONK" 1;
- }
- @media (max-width: 720px) {
- .bespoke-landing section .section-head { grid-template-columns: 1fr; gap: 8px; margin-bottom: 36px; }
- }
-
- /* ---------- primitives grid ---------- */
-
- .prims {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
- gap: 0;
- border-top: 1px solid var(--line);
- }
- .prim {
- padding: 36px 32px 40px;
- border-bottom: 1px solid var(--line);
- border-right: 1px solid var(--line);
- position: relative;
- transition: background .25s;
- }
- .prim:hover { background: var(--ink-2); }
- .prim:last-child { border-right: 1px solid var(--line); }
- @media (max-width: 720px) { .prim { border-right: none !important; } }
-
- .prim .num {
- font-family: 'JetBrains Mono', monospace;
- font-size: 11px;
- color: var(--halo-soft);
- letter-spacing: 0.2em;
- margin-bottom: 32px;
- display: flex; align-items: center; gap: 10px;
- }
- .prim .num::after {
- content: ""; flex: 1; height: 1px; background: var(--line-hot);
- }
- .prim h3 {
- font-family: 'Fraunces', serif;
- font-weight: 400;
- font-size: 24px;
- line-height: 1.15;
- margin-bottom: 14px;
- letter-spacing: -0.01em;
- }
- .prim h3 em { color: var(--halo); font-style: italic; font-weight: 300; }
- .prim p {
- font-size: 14px;
- line-height: 1.6;
- color: var(--paper-dim);
- max-width: 34ch;
- }
-
- /* ---------- code block ---------- */
-
- .code-window {
- border: 1px solid var(--line);
- background: var(--ink-2);
- border-radius: 2px;
- overflow: hidden;
- margin-top: 8px;
- }
- .code-window .bar {
- display: flex; align-items: center; justify-content: space-between;
- padding: 10px 16px;
- border-bottom: 1px solid var(--line);
- background: var(--ink-3);
- font-family: 'JetBrains Mono', monospace;
- font-size: 11px;
- color: var(--paper-dimmer);
- letter-spacing: 0.15em;
- text-transform: uppercase;
- }
- .code-window .bar .pills {
- display: inline-flex; gap: 6px;
- }
- .code-window .bar .pills i {
- width: 8px; height: 8px; border-radius: 50%; display: inline-block;
- background: #2a2f38;
- }
- .code-window .bar .pills i:first-child { background: #ff5f57; opacity: .55; }
- .code-window .bar .pills i:nth-child(2) { background: #febc2e; opacity: .55; }
- .code-window .bar .pills i:nth-child(3) { background: #28c840; opacity: .55; }
- .code-window pre {
- padding: 28px 32px;
- overflow-x: auto;
- font-size: 13px;
- line-height: 1.75;
- color: var(--paper);
- }
- .code-window pre .k { color: var(--halo-soft); }
- .code-window pre .s { color: #f5d796; }
- .code-window pre .c { color: var(--paper-dimmer); font-style: italic; }
- .code-window pre .f { color: var(--paper); }
- .code-window pre .p { color: var(--paper-dim); }
- .code-window pre .n { color: #c8b6ff; }
- button.copy {
- background: transparent;
- border: 1px solid var(--line-hot);
- color: var(--paper-dim);
- font-family: 'JetBrains Mono', monospace;
- font-size: 10px;
- letter-spacing: 0.18em;
- text-transform: uppercase;
- padding: 4px 10px;
- cursor: pointer;
- border-radius: 2px;
- transition: all .2s;
- }
- button.copy:hover { color: var(--ink); background: var(--halo); border-color: var(--halo); }
- button.copy.done { color: var(--ink); background: var(--halo-soft); border-color: var(--halo-soft); }
-
- /* ---------- quick-start split ---------- */
-
- .qstart {
- display: grid;
- grid-template-columns: 5fr 7fr;
- gap: 64px;
- align-items: start;
- }
- @media (max-width: 900px) { .qstart { grid-template-columns: 1fr; gap: 36px; } }
-
- .qstart .side p {
- font-family: 'Fraunces', serif;
- font-size: 19px;
- line-height: 1.55;
- color: var(--paper);
- font-weight: 300;
- }
- .qstart .side p + p { margin-top: 18px; color: var(--paper-dim); }
- .qstart .side .install {
- margin-top: 28px;
- display: inline-flex;
- align-items: center;
- gap: 12px;
- font-family: 'JetBrains Mono', monospace;
- font-size: 13px;
- padding: 12px 18px;
- border: 1px solid var(--line-hot);
- background: var(--ink-2);
- border-radius: 2px;
- }
- .qstart .side .install::before {
- content: "$"; color: var(--halo-soft);
- }
-
- /* ---------- security block ---------- */
-
- .sec-grid {
- display: grid;
- grid-template-columns: 1fr 1fr;
- border-top: 1px solid var(--line);
- }
- .sec-grid .row {
- display: contents;
- }
- .sec-grid .k, .sec-grid .v {
- padding: 20px 24px;
- border-bottom: 1px solid var(--line);
- }
- .sec-grid .k {
- font-family: 'JetBrains Mono', monospace;
- font-size: 12px;
- letter-spacing: 0.05em;
- color: var(--halo-soft);
- border-right: 1px solid var(--line);
- }
- .sec-grid .v {
- font-size: 14px;
- color: var(--paper-dim);
- line-height: 1.6;
- }
- .sec-grid .v strong { color: var(--paper); font-weight: 400; }
- @media (max-width: 720px) {
- .sec-grid { grid-template-columns: 1fr; }
- .sec-grid .k { border-right: none; padding-bottom: 4px; }
- .sec-grid .v { padding-top: 4px; }
- }
-
- .sec-note {
- margin-top: 40px;
- padding: 20px 24px;
- border-left: 2px solid var(--amber);
- background: rgba(255, 184, 85, 0.04);
- font-size: 14px;
- color: var(--paper-dim);
- line-height: 1.6;
- }
- .sec-note strong { color: var(--amber); font-weight: 500; }
-
- /* ---------- ecosystem cards ---------- */
-
- .eco {
- display: grid;
- grid-template-columns: repeat(3, 1fr);
- gap: 20px;
- }
- @media (max-width: 900px) { .eco { grid-template-columns: 1fr; } }
-
- .eco-card {
- padding: 32px 28px 28px;
- border: 1px solid var(--line);
- background: linear-gradient(180deg, var(--ink-2) 0%, var(--ink) 100%);
- border-radius: 2px;
- position: relative;
- overflow: hidden;
- transition: border-color .25s, transform .25s;
- }
- .eco-card:hover { border-color: var(--line-hot); transform: translateY(-2px); }
- .eco-card.this {
- border-color: var(--halo-soft);
- background: linear-gradient(180deg, rgba(127,221,255,0.06) 0%, var(--ink) 100%);
- }
- .eco-card.this::after {
- content: "this repo";
- position: absolute;
- top: 16px; right: 16px;
- font-family: 'JetBrains Mono', monospace;
- font-size: 10px;
- letter-spacing: 0.2em;
- text-transform: uppercase;
- color: var(--ink);
- background: var(--halo);
- padding: 4px 8px;
- border-radius: 2px;
- }
- .eco-card .mono-name {
- font-family: 'JetBrains Mono', monospace;
- font-weight: 500;
- font-size: 15px;
- color: var(--paper);
- margin-bottom: 18px;
- }
- .eco-card h3 {
- font-family: 'Fraunces', serif;
- font-weight: 400;
- font-size: 20px;
- line-height: 1.2;
- margin-bottom: 10px;
- letter-spacing: -0.01em;
- }
- .eco-card p {
- font-size: 13px;
- color: var(--paper-dim);
- line-height: 1.55;
- }
- .eco-card .status {
- margin-top: 22px;
- font-family: 'JetBrains Mono', monospace;
- font-size: 10px;
- letter-spacing: 0.2em;
- text-transform: uppercase;
- color: var(--paper-dimmer);
- display: flex; align-items: center; gap: 8px;
- }
- .eco-card .status::before {
- content: ""; width: 6px; height: 6px; border-radius: 50%;
- background: var(--paper-dimmer);
- }
- .eco-card.this .status::before { background: var(--halo); box-shadow: 0 0 10px var(--halo-soft); }
- .eco-card.this .status { color: var(--halo-soft); }
- /* Eco-card version: hidden by default, surfaced once GitHub API resolves. */
- .eco-card .status .status-version:not(:empty)::before { content: " - "; }
-
- /* ---------- footer ---------- */
-
- footer {
- padding: 56px 0 48px;
- border-top: 1px solid var(--line);
- }
- .foot-row {
- display: flex;
- justify-content: space-between;
- align-items: flex-end;
- flex-wrap: wrap;
- gap: 32px;
- }
- .foot-row .sig {
- font-family: 'Fraunces', serif;
- font-style: italic;
- font-weight: 300;
- font-size: 14px;
- color: var(--paper-dim);
- max-width: 320px;
- line-height: 1.5;
- }
- .foot-links {
- display: flex; gap: 32px;
- }
- .foot-links a {
- color: var(--paper-dim);
- text-decoration: none;
- font-family: 'JetBrains Mono', monospace;
- font-size: 11px;
- letter-spacing: 0.18em;
- text-transform: uppercase;
- transition: color .2s;
- }
- .foot-links a:hover { color: var(--halo); }
- .foot-meta {
- margin-top: 36px;
- padding-top: 20px;
- border-top: 1px solid var(--line);
- display: flex;
- justify-content: space-between;
- font-family: 'JetBrains Mono', monospace;
- font-size: 10px;
- letter-spacing: 0.2em;
- text-transform: uppercase;
- color: var(--paper-dimmer);
- }
-
- /* ---------- motion ---------- */
-
- @keyframes rise {
- to { opacity: 1; transform: translateY(0); }
- }
-
- /* Fallback for users with prefers-reduced-motion: reduce. The hero elements
- * start at opacity: 0 and rely on the rise animation to become visible; if
- * the animation is suppressed by the reduced-motion media query in custom.css,
- * we must surface them anyway, otherwise the entire hero reads as empty space. */
- @media (prefers-reduced-motion: reduce) {
- .bespoke-landing .hero-eyebrow,
- .bespoke-landing h1.display,
- .bespoke-landing .hero-lede,
- .bespoke-landing .hero-meta,
- .bespoke-landing .hero-banner {
- opacity: 1 !important;
- transform: none !important;
- animation: none !important;
- }
- }
-
-
- /* ---------- focus ---------- */
- a:focus-visible, button:focus-visible {
- outline: 1px solid var(--halo);
- outline-offset: 3px;
- }
diff --git a/docs/api/classes/DockerRunner.md b/docs/api/classes/DockerRunner.md
deleted file mode 100644
index de59ce2..0000000
--- a/docs/api/classes/DockerRunner.md
+++ /dev/null
@@ -1,205 +0,0 @@
-[**light-runner v0.15.0**](../index.md)
-
-***
-
-[light-runner](../index.md) / DockerRunner
-
-# Class: DockerRunner
-
-Defined in: [src/DockerRunner.ts:16](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L16)
-
-## Constructors
-
-### Constructor
-
-```ts
-new DockerRunner(options?): DockerRunner;
-```
-
-Defined in: [src/DockerRunner.ts:19](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L19)
-
-#### Parameters
-
-##### options?
-
-[`RunnerOptions`](../interfaces/RunnerOptions.md) = `{}`
-
-#### Returns
-
-`DockerRunner`
-
-## Methods
-
-### run()
-
-```ts
-run(request): Execution;
-```
-
-Defined in: [src/DockerRunner.ts:29](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L29)
-
-#### Parameters
-
-##### request
-
-[`RunRequest`](../interfaces/RunRequest.md)
-
-#### Returns
-
-[`Execution`](Execution.md)
-
-***
-
-### attach()
-
-```ts
-static attach(id): Execution | null;
-```
-
-Defined in: [src/DockerRunner.ts:142](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L142)
-
-#### Parameters
-
-##### id
-
-`string`
-
-#### Returns
-
-[`Execution`](Execution.md) \| `null`
-
-***
-
-### cleanupOldStates()
-
-```ts
-static cleanupOldStates(maxBytes?): number;
-```
-
-Defined in: [src/DockerRunner.ts:157](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L157)
-
-#### Parameters
-
-##### maxBytes?
-
-`number`
-
-#### Returns
-
-`number`
-
-***
-
-### cleanupOrphanCache()
-
-```ts
-static cleanupOrphanCache(opts?): Promise;
-```
-
-Defined in: [src/DockerRunner.ts:122](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L122)
-
-#### Parameters
-
-##### opts?
-
-[`CleanupCacheOptions`](../interfaces/CleanupCacheOptions.md) = `{}`
-
-#### Returns
-
-`Promise`\<`number`\>
-
-***
-
-### cleanupOrphanNetworks()
-
-```ts
-static cleanupOrphanNetworks(opts?): Promise;
-```
-
-Defined in: [src/DockerRunner.ts:133](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L133)
-
-#### Parameters
-
-##### opts?
-
-[`CleanupNetworkOptions`](../interfaces/CleanupNetworkOptions.md) = `{}`
-
-#### Returns
-
-`Promise`\<`number`\>
-
-***
-
-### cleanupOrphanStates()
-
-```ts
-static cleanupOrphanStates(): Promise;
-```
-
-Defined in: [src/DockerRunner.ts:167](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L167)
-
-#### Returns
-
-`Promise`\<`number`\>
-
-***
-
-### cleanupOrphanVolumes()
-
-```ts
-static cleanupOrphanVolumes(): Promise;
-```
-
-Defined in: [src/DockerRunner.ts:113](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L113)
-
-#### Returns
-
-`Promise`\<`number`\>
-
-***
-
-### isAvailable()
-
-```ts
-static isAvailable(): Promise;
-```
-
-Defined in: [src/DockerRunner.ts:109](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L109)
-
-#### Returns
-
-`Promise`\<`boolean`\>
-
-***
-
-### list()
-
-```ts
-static list(): RunState[];
-```
-
-Defined in: [src/DockerRunner.ts:146](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L146)
-
-#### Returns
-
-[`RunState`](../interfaces/RunState.md)[]
-
-***
-
-### reapOrphans()
-
-```ts
-static reapOrphans(): Promise<{
- containers: number;
- volumes: number;
-}>;
-```
-
-Defined in: [src/DockerRunner.ts:178](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L178)
-
-#### Returns
-
-`Promise`\<\{
- `containers`: `number`;
- `volumes`: `number`;
-\}\>
diff --git a/docs/api/classes/Execution.md b/docs/api/classes/Execution.md
deleted file mode 100644
index 2dbb376..0000000
--- a/docs/api/classes/Execution.md
+++ /dev/null
@@ -1,138 +0,0 @@
-[**light-runner v0.15.0**](../index.md)
-
-***
-
-[light-runner](../index.md) / Execution
-
-# Class: Execution
-
-Defined in: [src/Execution.ts:17](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L17)
-
-## Constructors
-
-### Constructor
-
-```ts
-new Execution(
- id,
- result,
- onCancel): Execution;
-```
-
-Defined in: [src/Execution.ts:22](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L22)
-
-#### Parameters
-
-##### id
-
-`string`
-
-##### result
-
-`Promise`\<[`RunResult`](../interfaces/RunResult.md)\>
-
-##### onCancel
-
-() => `void`
-
-#### Returns
-
-`Execution`
-
-## Properties
-
-### id
-
-```ts
-readonly id: string;
-```
-
-Defined in: [src/Execution.ts:18](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L18)
-
-***
-
-### result
-
-```ts
-readonly result: Promise;
-```
-
-Defined in: [src/Execution.ts:19](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L19)
-
-## Accessors
-
-### cancelled
-
-#### Get Signature
-
-```ts
-get cancelled(): boolean;
-```
-
-Defined in: [src/Execution.ts:45](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L45)
-
-##### Returns
-
-`boolean`
-
-## Methods
-
-### cancel()
-
-```ts
-cancel(): void;
-```
-
-Defined in: [src/Execution.ts:36](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L36)
-
-#### Returns
-
-`void`
-
-***
-
-### pause()
-
-```ts
-pause(): Promise;
-```
-
-Defined in: [src/Execution.ts:92](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L92)
-
-#### Returns
-
-`Promise`\<`void`\>
-
-***
-
-### resume()
-
-```ts
-resume(): Promise;
-```
-
-Defined in: [src/Execution.ts:100](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L100)
-
-#### Returns
-
-`Promise`\<`void`\>
-
-***
-
-### stop()
-
-```ts
-stop(options?): Promise;
-```
-
-Defined in: [src/Execution.ts:54](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L54)
-
-#### Parameters
-
-##### options?
-
-[`StopOptions`](../interfaces/StopOptions.md) = `{}`
-
-#### Returns
-
-`Promise`\<`void`\>
diff --git a/docs/api/classes/LightRunnerError.md b/docs/api/classes/LightRunnerError.md
deleted file mode 100644
index 011710b..0000000
--- a/docs/api/classes/LightRunnerError.md
+++ /dev/null
@@ -1,299 +0,0 @@
-[**light-runner v0.15.0**](../index.md)
-
-***
-
-[light-runner](../index.md) / LightRunnerError
-
-# Class: LightRunnerError
-
-Defined in: [src/errors.ts:25](https://github.com/enixCode/light-runner/blob/main/src/errors.ts#L25)
-
-## Extends
-
-- `Error`
-
-## Properties
-
-### cause?
-
-```ts
-optional cause?: unknown;
-```
-
-Defined in: node\_modules/typescript/lib/lib.es2022.error.d.ts:24
-
-#### Inherited from
-
-```ts
-Error.cause
-```
-
-***
-
-### code
-
-```ts
-readonly code: LightRunnerErrorCode;
-```
-
-Defined in: [src/errors.ts:26](https://github.com/enixCode/light-runner/blob/main/src/errors.ts#L26)
-
-***
-
-### containerId?
-
-```ts
-readonly optional containerId?: string;
-```
-
-Defined in: [src/errors.ts:28](https://github.com/enixCode/light-runner/blob/main/src/errors.ts#L28)
-
-***
-
-### dockerOp?
-
-```ts
-readonly optional dockerOp?: string;
-```
-
-Defined in: [src/errors.ts:27](https://github.com/enixCode/light-runner/blob/main/src/errors.ts#L27)
-
-***
-
-### message
-
-```ts
-message: string;
-```
-
-Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1075
-
-#### Inherited from
-
-```ts
-Error.message
-```
-
-***
-
-### name
-
-```ts
-name: string;
-```
-
-Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1074
-
-#### Inherited from
-
-```ts
-Error.name
-```
-
-***
-
-### stack?
-
-```ts
-optional stack?: string;
-```
-
-Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1076
-
-#### Inherited from
-
-```ts
-Error.stack
-```
-
-***
-
-### stackTraceLimit
-
-```ts
-static stackTraceLimit: number;
-```
-
-Defined in: node\_modules/@types/node/globals.d.ts:67
-
-The `Error.stackTraceLimit` property specifies the number of stack frames
-collected by a stack trace (whether generated by `new Error().stack` or
-`Error.captureStackTrace(obj)`).
-
-The default value is `10` but may be set to any valid JavaScript number. Changes
-will affect any stack trace captured _after_ the value has been changed.
-
-If set to a non-number value, or set to a negative number, stack traces will
-not capture any frames.
-
-#### Inherited from
-
-```ts
-Error.stackTraceLimit
-```
-
-## Methods
-
-### toJSON()
-
-```ts
-toJSON(): {
- code: LightRunnerErrorCode;
- containerId?: string;
- dockerOp?: string;
- message: string;
- name: string;
-};
-```
-
-Defined in: [src/errors.ts:39](https://github.com/enixCode/light-runner/blob/main/src/errors.ts#L39)
-
-#### Returns
-
-```ts
-{
- code: LightRunnerErrorCode;
- containerId?: string;
- dockerOp?: string;
- message: string;
- name: string;
-}
-```
-
-##### code
-
-```ts
-code: LightRunnerErrorCode;
-```
-
-##### containerId?
-
-```ts
-optional containerId?: string;
-```
-
-##### dockerOp?
-
-```ts
-optional dockerOp?: string;
-```
-
-##### message
-
-```ts
-message: string;
-```
-
-##### name
-
-```ts
-name: string;
-```
-
-***
-
-### captureStackTrace()
-
-```ts
-static captureStackTrace(targetObject, constructorOpt?): void;
-```
-
-Defined in: node\_modules/@types/node/globals.d.ts:51
-
-Creates a `.stack` property on `targetObject`, which when accessed returns
-a string representing the location in the code at which
-`Error.captureStackTrace()` was called.
-
-```js
-const myObject = {};
-Error.captureStackTrace(myObject);
-myObject.stack; // Similar to `new Error().stack`
-```
-
-The first line of the trace will be prefixed with
-`${myObject.name}: ${myObject.message}`.
-
-The optional `constructorOpt` argument accepts a function. If given, all frames
-above `constructorOpt`, including `constructorOpt`, will be omitted from the
-generated stack trace.
-
-The `constructorOpt` argument is useful for hiding implementation
-details of error generation from the user. For instance:
-
-```js
-function a() {
- b();
-}
-
-function b() {
- c();
-}
-
-function c() {
- // Create an error without stack trace to avoid calculating the stack trace twice.
- const { stackTraceLimit } = Error;
- Error.stackTraceLimit = 0;
- const error = new Error();
- Error.stackTraceLimit = stackTraceLimit;
-
- // Capture the stack trace above function b
- Error.captureStackTrace(error, b); // Neither function c, nor b is included in the stack trace
- throw error;
-}
-
-a();
-```
-
-#### Parameters
-
-##### targetObject
-
-`object`
-
-##### constructorOpt?
-
-`Function`
-
-#### Returns
-
-`void`
-
-#### Inherited from
-
-```ts
-Error.captureStackTrace
-```
-
-***
-
-### prepareStackTrace()
-
-```ts
-static prepareStackTrace(err, stackTraces): any;
-```
-
-Defined in: node\_modules/@types/node/globals.d.ts:55
-
-#### Parameters
-
-##### err
-
-`Error`
-
-##### stackTraces
-
-`CallSite`[]
-
-#### Returns
-
-`any`
-
-#### See
-
-https://v8.dev/docs/stack-trace-api#customizing-stack-traces
-
-#### Inherited from
-
-```ts
-Error.prepareStackTrace
-```
diff --git a/docs/api/functions/cleanupOrphanNetworks.md b/docs/api/functions/cleanupOrphanNetworks.md
deleted file mode 100644
index b99793e..0000000
--- a/docs/api/functions/cleanupOrphanNetworks.md
+++ /dev/null
@@ -1,23 +0,0 @@
-[**light-runner v0.15.0**](../index.md)
-
-***
-
-[light-runner](../index.md) / cleanupOrphanNetworks
-
-# Function: cleanupOrphanNetworks()
-
-```ts
-function cleanupOrphanNetworks(opts?): Promise;
-```
-
-Defined in: [src/network.ts:213](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L213)
-
-## Parameters
-
-### opts?
-
-[`CleanupNetworkOptions`](../interfaces/CleanupNetworkOptions.md) = `{}`
-
-## Returns
-
-`Promise`\<`number`\>
diff --git a/docs/api/functions/connectNetwork.md b/docs/api/functions/connectNetwork.md
deleted file mode 100644
index 81b6c6c..0000000
--- a/docs/api/functions/connectNetwork.md
+++ /dev/null
@@ -1,27 +0,0 @@
-[**light-runner v0.15.0**](../index.md)
-
-***
-
-[light-runner](../index.md) / connectNetwork
-
-# Function: connectNetwork()
-
-```ts
-function connectNetwork(name, containerId): Promise;
-```
-
-Defined in: [src/network.ts:166](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L166)
-
-## Parameters
-
-### name
-
-`string`
-
-### containerId
-
-`string`
-
-## Returns
-
-`Promise`\<`void`\>
diff --git a/docs/api/functions/createNetwork.md b/docs/api/functions/createNetwork.md
deleted file mode 100644
index ff0cf8b..0000000
--- a/docs/api/functions/createNetwork.md
+++ /dev/null
@@ -1,27 +0,0 @@
-[**light-runner v0.15.0**](../index.md)
-
-***
-
-[light-runner](../index.md) / createNetwork
-
-# Function: createNetwork()
-
-```ts
-function createNetwork(name, opts?): Promise;
-```
-
-Defined in: [src/network.ts:69](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L69)
-
-## Parameters
-
-### name
-
-`string`
-
-### opts?
-
-[`CreateNetworkOptions`](../interfaces/CreateNetworkOptions.md) = `{}`
-
-## Returns
-
-`Promise`\<`boolean`\>
diff --git a/docs/api/functions/deleteNetwork.md b/docs/api/functions/deleteNetwork.md
deleted file mode 100644
index bf0c114..0000000
--- a/docs/api/functions/deleteNetwork.md
+++ /dev/null
@@ -1,23 +0,0 @@
-[**light-runner v0.15.0**](../index.md)
-
-***
-
-[light-runner](../index.md) / deleteNetwork
-
-# Function: deleteNetwork()
-
-```ts
-function deleteNetwork(name): Promise;
-```
-
-Defined in: [src/network.ts:145](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L145)
-
-## Parameters
-
-### name
-
-`string`
-
-## Returns
-
-`Promise`\<`void`\>
diff --git a/docs/api/functions/listStates.md b/docs/api/functions/listStates.md
deleted file mode 100644
index 168abe9..0000000
--- a/docs/api/functions/listStates.md
+++ /dev/null
@@ -1,17 +0,0 @@
-[**light-runner v0.15.0**](../index.md)
-
-***
-
-[light-runner](../index.md) / listStates
-
-# Function: listStates()
-
-```ts
-function listStates(): RunState[];
-```
-
-Defined in: [src/state.ts:56](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L56)
-
-## Returns
-
-[`RunState`](../interfaces/RunState.md)[]
diff --git a/docs/api/functions/networkExists.md b/docs/api/functions/networkExists.md
deleted file mode 100644
index 81a6dae..0000000
--- a/docs/api/functions/networkExists.md
+++ /dev/null
@@ -1,23 +0,0 @@
-[**light-runner v0.15.0**](../index.md)
-
-***
-
-[light-runner](../index.md) / networkExists
-
-# Function: networkExists()
-
-```ts
-function networkExists(name): Promise;
-```
-
-Defined in: [src/network.ts:182](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L182)
-
-## Parameters
-
-### name
-
-`string`
-
-## Returns
-
-`Promise`\<`boolean`\>
diff --git a/docs/api/functions/readState.md b/docs/api/functions/readState.md
deleted file mode 100644
index 5bab374..0000000
--- a/docs/api/functions/readState.md
+++ /dev/null
@@ -1,23 +0,0 @@
-[**light-runner v0.15.0**](../index.md)
-
-***
-
-[light-runner](../index.md) / readState
-
-# Function: readState()
-
-```ts
-function readState(id): RunState | null;
-```
-
-Defined in: [src/state.ts:46](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L46)
-
-## Parameters
-
-### id
-
-`string`
-
-## Returns
-
-[`RunState`](../interfaces/RunState.md) \| `null`
diff --git a/docs/api/index.md b/docs/api/index.md
deleted file mode 100644
index 2c81b26..0000000
--- a/docs/api/index.md
+++ /dev/null
@@ -1,39 +0,0 @@
-**light-runner v0.15.0**
-
-***
-
-# light-runner v0.15.0
-
-## Classes
-
-- [DockerRunner](classes/DockerRunner.md)
-- [Execution](classes/Execution.md)
-- [LightRunnerError](classes/LightRunnerError.md)
-
-## Interfaces
-
-- [CleanupCacheOptions](interfaces/CleanupCacheOptions.md)
-- [CleanupNetworkOptions](interfaces/CleanupNetworkOptions.md)
-- [CreateNetworkOptions](interfaces/CreateNetworkOptions.md)
-- [ExtractResult](interfaces/ExtractResult.md)
-- [ExtractSpec](interfaces/ExtractSpec.md)
-- [RunnerOptions](interfaces/RunnerOptions.md)
-- [RunRequest](interfaces/RunRequest.md)
-- [RunResult](interfaces/RunResult.md)
-- [RunState](interfaces/RunState.md)
-- [StopOptions](interfaces/StopOptions.md)
-
-## Type Aliases
-
-- [LightRunnerErrorCode](type-aliases/LightRunnerErrorCode.md)
-- [Runtime](type-aliases/Runtime.md)
-
-## Functions
-
-- [cleanupOrphanNetworks](functions/cleanupOrphanNetworks.md)
-- [connectNetwork](functions/connectNetwork.md)
-- [createNetwork](functions/createNetwork.md)
-- [deleteNetwork](functions/deleteNetwork.md)
-- [listStates](functions/listStates.md)
-- [networkExists](functions/networkExists.md)
-- [readState](functions/readState.md)
diff --git a/docs/api/interfaces/CleanupCacheOptions.md b/docs/api/interfaces/CleanupCacheOptions.md
deleted file mode 100644
index f54129c..0000000
--- a/docs/api/interfaces/CleanupCacheOptions.md
+++ /dev/null
@@ -1,19 +0,0 @@
-[**light-runner v0.15.0**](../index.md)
-
-***
-
-[light-runner](../index.md) / CleanupCacheOptions
-
-# Interface: CleanupCacheOptions
-
-Defined in: [src/build.ts:190](https://github.com/enixCode/light-runner/blob/main/src/build.ts#L190)
-
-## Properties
-
-### maxAgeMs?
-
-```ts
-optional maxAgeMs?: number;
-```
-
-Defined in: [src/build.ts:192](https://github.com/enixCode/light-runner/blob/main/src/build.ts#L192)
diff --git a/docs/api/interfaces/CleanupNetworkOptions.md b/docs/api/interfaces/CleanupNetworkOptions.md
deleted file mode 100644
index 2fec63b..0000000
--- a/docs/api/interfaces/CleanupNetworkOptions.md
+++ /dev/null
@@ -1,35 +0,0 @@
-[**light-runner v0.15.0**](../index.md)
-
-***
-
-[light-runner](../index.md) / CleanupNetworkOptions
-
-# Interface: CleanupNetworkOptions
-
-Defined in: [src/network.ts:47](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L47)
-
-## Properties
-
-### maxAgeMs?
-
-```ts
-optional maxAgeMs?: number;
-```
-
-Defined in: [src/network.ts:55](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L55)
-
-Skip networks created within this many milliseconds. Default 30 minutes.
-This is the race protection: a network just created by a concurrent run
-whose container has not yet attached is preserved.
-
-***
-
-### prefix?
-
-```ts
-optional prefix?: string;
-```
-
-Defined in: [src/network.ts:49](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L49)
-
-Only consider networks whose name starts with this prefix. Defaults to `light-runner-`.
diff --git a/docs/api/interfaces/CreateNetworkOptions.md b/docs/api/interfaces/CreateNetworkOptions.md
deleted file mode 100644
index e5c2376..0000000
--- a/docs/api/interfaces/CreateNetworkOptions.md
+++ /dev/null
@@ -1,105 +0,0 @@
-[**light-runner v0.15.0**](../index.md)
-
-***
-
-[light-runner](../index.md) / CreateNetworkOptions
-
-# Interface: CreateNetworkOptions
-
-Defined in: [src/network.ts:11](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L11)
-
-## Properties
-
-### driver?
-
-```ts
-optional driver?: "bridge";
-```
-
-Defined in: [src/network.ts:13](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L13)
-
-Docker network driver. Defaults to 'bridge'.
-
-***
-
-### exclusive?
-
-```ts
-optional exclusive?: boolean;
-```
-
-Defined in: [src/network.ts:24](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L24)
-
-When true, fail (return false) if the network already exists. Default
-false = idempotent: returns true whether we created it or it already
-existed.
-
-***
-
-### iccEnabled?
-
-```ts
-optional iccEnabled?: boolean;
-```
-
-Defined in: [src/network.ts:18](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L18)
-
-Inter-container communication. Defaults to false: containers attached
-to the network cannot reach each other. Only honored for bridge driver.
-
-***
-
-### ipam?
-
-```ts
-optional ipam?: {
- gateway?: string;
- ipRange?: string;
- subnet?: string;
-};
-```
-
-Defined in: [src/network.ts:33](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L33)
-
-Explicit IPAM (IP Address Management) config. When omitted, Docker
-auto-assigns a subnet from its default pool. Pass this to let a higher
-layer (typically light-process) allocate a specific subnet per run from
-a CGNAT pool or any other range.
-
-#### gateway?
-
-```ts
-optional gateway?: string;
-```
-
-Gateway IP. Docker picks the first usable address when omitted.
-
-#### ipRange?
-
-```ts
-optional ipRange?: string;
-```
-
-Optional sub-range within `subnet` where Docker is allowed to
-auto-assign IPs. Outside this range stays reserved for static
-assignment. Rare.
-
-#### subnet?
-
-```ts
-optional subnet?: string;
-```
-
-CIDR de la plage IP du réseau, ex: '100.64.42.0/24'.
-
-***
-
-### labels?
-
-```ts
-optional labels?: Record;
-```
-
-Defined in: [src/network.ts:26](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L26)
-
-Optional Docker labels (helpful for downstream tooling / cleanup).
diff --git a/docs/api/interfaces/ExtractResult.md b/docs/api/interfaces/ExtractResult.md
deleted file mode 100644
index 04eaec1..0000000
--- a/docs/api/interfaces/ExtractResult.md
+++ /dev/null
@@ -1,59 +0,0 @@
-[**light-runner v0.15.0**](../index.md)
-
-***
-
-[light-runner](../index.md) / ExtractResult
-
-# Interface: ExtractResult
-
-Defined in: [src/types.ts:28](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L28)
-
-## Properties
-
-### bytes?
-
-```ts
-optional bytes?: number;
-```
-
-Defined in: [src/types.ts:33](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L33)
-
-***
-
-### error?
-
-```ts
-optional error?: string;
-```
-
-Defined in: [src/types.ts:32](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L32)
-
-***
-
-### from
-
-```ts
-from: string;
-```
-
-Defined in: [src/types.ts:29](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L29)
-
-***
-
-### status
-
-```ts
-status: "ok" | "error" | "missing";
-```
-
-Defined in: [src/types.ts:31](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L31)
-
-***
-
-### to
-
-```ts
-to: string;
-```
-
-Defined in: [src/types.ts:30](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L30)
diff --git a/docs/api/interfaces/ExtractSpec.md b/docs/api/interfaces/ExtractSpec.md
deleted file mode 100644
index 43e18e3..0000000
--- a/docs/api/interfaces/ExtractSpec.md
+++ /dev/null
@@ -1,29 +0,0 @@
-[**light-runner v0.15.0**](../index.md)
-
-***
-
-[light-runner](../index.md) / ExtractSpec
-
-# Interface: ExtractSpec
-
-Defined in: [src/types.ts:11](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L11)
-
-## Properties
-
-### from
-
-```ts
-from: string;
-```
-
-Defined in: [src/types.ts:16](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L16)
-
-***
-
-### to
-
-```ts
-to: string;
-```
-
-Defined in: [src/types.ts:25](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L25)
diff --git a/docs/api/interfaces/RunRequest.md b/docs/api/interfaces/RunRequest.md
deleted file mode 100644
index edda20d..0000000
--- a/docs/api/interfaces/RunRequest.md
+++ /dev/null
@@ -1,149 +0,0 @@
-[**light-runner v0.15.0**](../index.md)
-
-***
-
-[light-runner](../index.md) / RunRequest
-
-# Interface: RunRequest
-
-Defined in: [src/types.ts:36](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L36)
-
-## Properties
-
-### detached?
-
-```ts
-optional detached?: boolean;
-```
-
-Defined in: [src/types.ts:110](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L110)
-
-***
-
-### dir?
-
-```ts
-optional dir?: string;
-```
-
-Defined in: [src/types.ts:67](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L67)
-
-***
-
-### entrypoint?
-
-```ts
-optional entrypoint?: string;
-```
-
-Defined in: [src/types.ts:39](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L39)
-
-***
-
-### env?
-
-```ts
-optional env?: Record;
-```
-
-Defined in: [src/types.ts:87](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L87)
-
-***
-
-### extract?
-
-```ts
-optional extract?: ExtractSpec[];
-```
-
-Defined in: [src/types.ts:97](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L97)
-
-***
-
-### image
-
-```ts
-image: string;
-```
-
-Defined in: [src/types.ts:37](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L37)
-
-***
-
-### input?
-
-```ts
-optional input?: unknown;
-```
-
-Defined in: [src/types.ts:71](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L71)
-
-***
-
-### networks?
-
-```ts
-optional networks?: string[];
-```
-
-Defined in: [src/types.ts:85](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L85)
-
-***
-
-### onLog?
-
-```ts
-optional onLog?: (line) => void;
-```
-
-Defined in: [src/types.ts:91](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L91)
-
-#### Parameters
-
-##### line
-
-`string`
-
-#### Returns
-
-`void`
-
-***
-
-### run?
-
-```ts
-optional run?: string[];
-```
-
-Defined in: [src/types.ts:60](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L60)
-
-***
-
-### signal?
-
-```ts
-optional signal?: AbortSignal;
-```
-
-Defined in: [src/types.ts:90](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L90)
-
-***
-
-### timeout?
-
-```ts
-optional timeout?: number;
-```
-
-Defined in: [src/types.ts:73](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L73)
-
-***
-
-### workdir?
-
-```ts
-optional workdir?: string;
-```
-
-Defined in: [src/types.ts:89](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L89)
diff --git a/docs/api/interfaces/RunResult.md b/docs/api/interfaces/RunResult.md
deleted file mode 100644
index 3908826..0000000
--- a/docs/api/interfaces/RunResult.md
+++ /dev/null
@@ -1,61 +0,0 @@
-[**light-runner v0.15.0**](../index.md)
-
-***
-
-[light-runner](../index.md) / RunResult
-
-# Interface: RunResult
-
-Defined in: [src/types.ts:113](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L113)
-
-## Properties
-
-### cancelled
-
-```ts
-cancelled: boolean;
-```
-
-Defined in: [src/types.ts:117](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L117)
-
-***
-
-### duration
-
-```ts
-duration: number;
-```
-
-Defined in: [src/types.ts:116](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L116)
-
-***
-
-### exitCode
-
-```ts
-exitCode: number;
-```
-
-Defined in: [src/types.ts:115](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L115)
-
-***
-
-### extracted?
-
-```ts
-optional extracted?: ExtractResult[];
-```
-
-Defined in: [src/types.ts:119](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L119)
-
-Status of each requested extract. Present only if `extract` was set.
-
-***
-
-### success
-
-```ts
-success: boolean;
-```
-
-Defined in: [src/types.ts:114](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L114)
diff --git a/docs/api/interfaces/RunState.md b/docs/api/interfaces/RunState.md
deleted file mode 100644
index 14b7a8b..0000000
--- a/docs/api/interfaces/RunState.md
+++ /dev/null
@@ -1,149 +0,0 @@
-[**light-runner v0.15.0**](../index.md)
-
-***
-
-[light-runner](../index.md) / RunState
-
-# Interface: RunState
-
-Defined in: [src/state.ts:8](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L8)
-
-## Properties
-
-### cancelled?
-
-```ts
-optional cancelled?: boolean;
-```
-
-Defined in: [src/state.ts:27](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L27)
-
-***
-
-### container
-
-```ts
-container: string;
-```
-
-Defined in: [src/state.ts:10](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L10)
-
-***
-
-### durationMs?
-
-```ts
-optional durationMs?: number;
-```
-
-Defined in: [src/state.ts:21](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L21)
-
-***
-
-### entrypoint?
-
-```ts
-optional entrypoint?: string;
-```
-
-Defined in: [src/state.ts:14](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L14)
-
-***
-
-### exitCode?
-
-```ts
-optional exitCode?: number;
-```
-
-Defined in: [src/state.ts:20](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L20)
-
-***
-
-### extract?
-
-```ts
-optional extract?: ExtractSpec[];
-```
-
-Defined in: [src/state.ts:16](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L16)
-
-***
-
-### finishedAt?
-
-```ts
-optional finishedAt?: string;
-```
-
-Defined in: [src/state.ts:18](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L18)
-
-***
-
-### id
-
-```ts
-id: string;
-```
-
-Defined in: [src/state.ts:9](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L9)
-
-***
-
-### image
-
-```ts
-image: string;
-```
-
-Defined in: [src/state.ts:12](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L12)
-
-***
-
-### startedAt
-
-```ts
-startedAt: string;
-```
-
-Defined in: [src/state.ts:17](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L17)
-
-***
-
-### status
-
-```ts
-status: "running" | "exited" | "cancelled" | "failed";
-```
-
-Defined in: [src/state.ts:19](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L19)
-
-***
-
-### timeout?
-
-```ts
-optional timeout?: number;
-```
-
-Defined in: [src/state.ts:15](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L15)
-
-***
-
-### volume
-
-```ts
-volume: string;
-```
-
-Defined in: [src/state.ts:11](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L11)
-
-***
-
-### workdir
-
-```ts
-workdir: string;
-```
-
-Defined in: [src/state.ts:13](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L13)
diff --git a/docs/api/interfaces/RunnerOptions.md b/docs/api/interfaces/RunnerOptions.md
deleted file mode 100644
index b53cc81..0000000
--- a/docs/api/interfaces/RunnerOptions.md
+++ /dev/null
@@ -1,59 +0,0 @@
-[**light-runner v0.15.0**](../index.md)
-
-***
-
-[light-runner](../index.md) / RunnerOptions
-
-# Interface: RunnerOptions
-
-Defined in: [src/types.ts:3](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L3)
-
-## Properties
-
-### cpus?
-
-```ts
-optional cpus?: string;
-```
-
-Defined in: [src/types.ts:5](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L5)
-
-***
-
-### gpus?
-
-```ts
-optional gpus?: string | number;
-```
-
-Defined in: [src/types.ts:7](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L7)
-
-***
-
-### memory?
-
-```ts
-optional memory?: string;
-```
-
-Defined in: [src/types.ts:4](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L4)
-
-***
-
-### noNewPrivileges?
-
-```ts
-optional noNewPrivileges?: boolean;
-```
-
-Defined in: [src/types.ts:8](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L8)
-
-***
-
-### runtime?
-
-```ts
-optional runtime?: Runtime;
-```
-
-Defined in: [src/types.ts:6](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L6)
diff --git a/docs/api/interfaces/StopOptions.md b/docs/api/interfaces/StopOptions.md
deleted file mode 100644
index 3ec469b..0000000
--- a/docs/api/interfaces/StopOptions.md
+++ /dev/null
@@ -1,29 +0,0 @@
-[**light-runner v0.15.0**](../index.md)
-
-***
-
-[light-runner](../index.md) / StopOptions
-
-# Interface: StopOptions
-
-Defined in: [src/Execution.ts:4](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L4)
-
-## Properties
-
-### grace?
-
-```ts
-optional grace?: number;
-```
-
-Defined in: [src/Execution.ts:14](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L14)
-
-***
-
-### signal?
-
-```ts
-optional signal?: string;
-```
-
-Defined in: [src/Execution.ts:9](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L9)
diff --git a/docs/api/type-aliases/LightRunnerErrorCode.md b/docs/api/type-aliases/LightRunnerErrorCode.md
deleted file mode 100644
index b993eb8..0000000
--- a/docs/api/type-aliases/LightRunnerErrorCode.md
+++ /dev/null
@@ -1,21 +0,0 @@
-[**light-runner v0.15.0**](../index.md)
-
-***
-
-[light-runner](../index.md) / LightRunnerErrorCode
-
-# Type Alias: LightRunnerErrorCode
-
-```ts
-type LightRunnerErrorCode =
- | "DOCKER_UNREACHABLE"
- | "VOLUME_CREATE_FAILED"
- | "CONTAINER_START_FAILED"
- | "SEED_FAILED"
- | "EXTRACT_FAILED"
- | "BUILD_FAILED"
- | "INVALID_RUN_STEP"
- | "NETWORK_CONNECT_FAILED";
-```
-
-Defined in: [src/errors.ts:1](https://github.com/enixCode/light-runner/blob/main/src/errors.ts#L1)
diff --git a/docs/api/type-aliases/Runtime.md b/docs/api/type-aliases/Runtime.md
deleted file mode 100644
index 216dbdc..0000000
--- a/docs/api/type-aliases/Runtime.md
+++ /dev/null
@@ -1,13 +0,0 @@
-[**light-runner v0.15.0**](../index.md)
-
-***
-
-[light-runner](../index.md) / Runtime
-
-# Type Alias: Runtime
-
-```ts
-type Runtime = "runc" | "runsc" | "kata";
-```
-
-Defined in: [src/types.ts:1](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L1)
diff --git a/docs/guides/detached.md b/docs/guides/detached.md
deleted file mode 100644
index ba05aff..0000000
--- a/docs/guides/detached.md
+++ /dev/null
@@ -1,140 +0,0 @@
-# Detached runs
-
-A standard `runner.run(...)` ties the container's lifetime to the host Node process: kill the host, the run dies. Detached mode lets the container outlive the host.
-
-Use it when:
-
-- A run can take **hours** (training, batch jobs, CI-like workloads) and you cannot afford to lose it on a host crash or deploy.
-- You want a long-poll architecture where one process **starts** runs and a different process **collects** results.
-- You want to spawn a job, return immediately, and reconnect later from anywhere on the same machine.
-
-## Start a detached run
-
-```ts
-import { DockerRunner } from 'light-runner';
-
-const runner = new DockerRunner();
-
-const execution = runner.run({
- image: 'python:3.12-alpine',
- command: 'python long_job.py',
- dir: './job',
- timeout: 6 * 60 * 60 * 1000, // 6 hours
- extract: [{ from: '/app/result.json', to: './out' }],
- detached: true,
-});
-
-console.log('started, id =', execution.id);
-// you can let this process exit; the container keeps running
-```
-
-## Reconnect to a running detached job
-
-```ts
-const ex = DockerRunner.attach('light-runner-abc123def456');
-if (!ex) {
- console.error('no state file for that id');
-} else {
- const result = await ex.result;
- console.log(result.success, result.exitCode, result.extracted);
-}
-```
-
-`attach(id)` returns `null` when no state file exists for that id (typo'd id, or the run was reaped).
-
-## Listing known runs
-
-```ts
-import { DockerRunner } from 'light-runner';
-
-for (const state of DockerRunner.list()) {
- console.log(state.id, state.status, state.startedAt, state.image);
-}
-```
-
-## Detached contract differences
-
-| Capability | Attached | Detached |
-|---|---|---|
-| `input` (stdin) | Supported | **Rejected at API boundary** (host process death loses stdin) |
-| `onLog` callback | Streams stdout/stderr lines | **Not called** (stream lost on host death; use `docker logs ` instead) |
-| `cancel()` / signal | Best-effort kill | Best-effort kill, plus state file marked `cancelled` |
-| `extract` | Runs after exit | Runs after exit, requested set persisted in state file |
-
-## State file lifecycle
-
-Every detached run writes one JSON file under `~/.light-runner/state/.json` (or `LIGHT_RUNNER_STATE_DIR`):
-
-```jsonc
-{
- "id": "light-runner-abc123def456",
- "container": "light-runner-abc123def456",
- "volume": "light-runner-abc123def456",
- "image": "python:3.12-alpine",
- "workdir": "/app",
- "command": "python long_job.py",
- "timeout": 21600000,
- "extract": [{"from": "/app/result.json", "to": "./out"}],
- "startedAt": "2026-04-27T10:15:00.000Z",
- "status": "running"
-}
-```
-
-Status transitions:
-
-```
-running ──┬─> exited (clean exit, exitCode + finishedAt + durationMs added)
- ├─> cancelled (cancel() / abort, exitCode set, cancelled: true)
- └─> failed (setup error, container vanished, etc.)
-```
-
-Writes are atomic via temp + rename, so a host crash mid-write does not corrupt the file.
-
-## Cross-host resume
-
-The state dir is just JSON files under a fixed path. Two ways to make it shared:
-
-1. **Same machine, different process trees**: same `LIGHT_RUNNER_STATE_DIR`, no extra setup. Process A starts the run, process B re-attaches by id.
-2. **Different machines**: mount the state dir on a shared filesystem (NFS, EFS, networked volume). The Docker daemon must be the **same one** on both hosts (they share the named volume + container by name).
-
-## Race-safe attach
-
-`attach(id)` is safe to call **immediately after** `runner.run({detached: true})` returns. The runner writes the state file synchronously inside `run()`, before any async setup, so the file always exists by the time the caller has the `Execution` handle. Internally, `attach` polls the docker daemon for ~3 seconds with `containerExists()` to absorb the gap between state-file-written and container-actually-created.
-
-## Reaping
-
-A long-running host eventually accumulates state files for finished runs. Two cleanup helpers:
-
-```ts
-// Reconcile state files with the docker daemon.
-// Mark `running` states as `failed` if their container has vanished.
-await DockerRunner.cleanupOrphanStates();
-
-// Sweep idle/exited containers + volumes tagged with the light-runner label.
-const { containers, volumes } = await DockerRunner.reapOrphans();
-console.log(`reaped ${containers} containers, ${volumes} volumes`);
-```
-
-`reapOrphans` removes resources older than `LIGHT_RUNNER_REAP_AGE_MS` (default 5 minutes). Safe to run on a shared docker host with unrelated workloads since it filters by the `light-runner.run-id` label.
-
-Run both on host startup, before accepting new work.
-
-## Stop, pause, resume
-
-Detached or attached, the same `Execution` API works:
-
-```ts
-await ex.stop({ signal: 'SIGTERM', grace: 10_000 }); // graceful, fall back to SIGKILL
-await ex.pause(); // freezes via cgroup, memory preserved
-await ex.resume(); // unfreezes
-ex.cancel(); // immediate kill, sync, fire-and-forget
-```
-
-`pause()` is intentionally not flagging `cancelled: true` — a paused run is expected to resume and complete normally.
-
-## Gotchas
-
-- **Stdin is gone.** `RunRequest.input` is rejected at the API boundary when `detached: true`. Pipe input through a file in `dir` instead.
-- **`onLog` is silent.** No live stream on host. Inspect `docker logs ` for stdout/stderr while the run is alive.
-- **State file ≠source of truth for liveness.** A `running` status with a vanished container = ghost run; `cleanupOrphanStates` is what reconciles that.
-- **Extract still runs**, but only when the host that holds the resolved promise sees the exit. Re-attached hosts see `extracted` in their `result` too.
diff --git a/docs/guides/extract.md b/docs/guides/extract.md
deleted file mode 100644
index fda2391..0000000
--- a/docs/guides/extract.md
+++ /dev/null
@@ -1,123 +0,0 @@
-# Extract files
-
-`extract` is the **only output channel** for files. Logs go to `onLog`, exit code goes to `result.exitCode`, structured output goes through stdout / extracted files. The library has no opinion on what your container does inside.
-
-## Basic usage
-
-```ts
-const execution = runner.run({
- image: 'node:lts-alpine',
- command: 'node build.js',
- dir: './project',
- extract: [
- { from: '/app/dist', to: './out' }, // folder, recursive
- { from: '/app/report.pdf', to: './out' }, // single file
- { from: '/app/maybe-missing', to: './out' }, // missing -> reported, run still succeeds
- ],
-});
-
-const result = await execution.result;
-console.log(result.extracted);
-// [
-// { from: '/app/dist', to: './out', status: 'ok', bytes: 124583 },
-// { from: '/app/report.pdf', to: './out', status: 'ok', bytes: 9421 },
-// { from: '/app/maybe-missing', to: './out', status: 'missing' },
-// ]
-```
-
-## Folder vs file semantics (rsync-like)
-
-| `from` is a... | Result |
-|---|---|
-| **Folder** | The **contents** of the folder land **directly in `to`** (no basename wrap). Equivalent to `rsync -a from/ to/` or `cp -r from/. to/`. All subdirectories and files are included recursively. |
-| **File** | The file lands as `to/basename(from)`. |
-
-Trailing slash is irrelevant: `'/app/dist'` and `'/app/dist/'` produce identical output.
-
-```ts
-extract: [
- { from: '/app/dist', to: './out' }, // /app/dist/a.js -> ./out/a.js
- { from: '/app/dist/', to: './out' }, // same as above
- { from: '/app/report.pdf', to: './out' }, // -> ./out/report.pdf
-]
-```
-
-`to` is always a **destination directory**. It is auto-created via `fs.mkdirSync(to, { recursive: true })`.
-
-## Result statuses
-
-Each `extract` entry produces one `ExtractResult`:
-
-| `status` | Meaning |
-|-------------|----------------------------------------------------------|
-| `'ok'` | Archived and extracted. `bytes` reports the archive size.|
-| `'missing'` | `from` does not exist in the container. |
-| `'error'` | Cap exceeded, path traversal, mkdir failed, etc. The `error` field carries the reason. |
-
-A missing or errored entry **never fails the run**. The consumer inspects `result.extracted` and decides what to do.
-
-## Hard rules
-
-- **Path traversal rejected**: any segment containing `..` is refused before any container is spawned. `extract: [{ from: '/app/../etc/passwd', ... }]` → `status: 'error'` with `error: 'path traversal rejected (..)'`.
-- **Symlinks skipped**: a malicious container could craft a symlink whose target path exists on the host. The tar reader silently drops them.
-- **1 GiB per-entry cap**: enforced both **pre-flight** (`du -sb` inside the container) and **streamed** (byte counter in the host pipe). Above that, the entry is reported as `error` and the run still succeeds.
-- **Extract only on success**: skipped when `exitCode !== 0` or the run was cancelled. `result.extracted` is undefined in those cases.
-- **Disk-to-disk streaming**: the host never buffers the archive in Node RAM.
-
-## How extraction works internally
-
-1. After your container exits with code `0`, the runner spawns a **throwaway Alpine** sidecar with the same volume mounted read-only (no need to keep your image alive).
-2. A pre-flight script checks that `from` exists, computes its byte size with `du -sb`, refuses if over the cap.
-3. The sidecar runs `tar c` on `from` and pipes the archive to the host through a hijacked Docker stream.
-4. The host pipes that into the [`tar` extract](https://www.npmjs.com/package/tar) reader, which writes files into `to/` and counts bytes for the streamed cap check.
-5. The sidecar exits, AutoRemove tears it down, the runner returns `result.extracted`.
-
-## Common patterns
-
-### Capture structured output
-
-Have the container write a JSON file, extract it, parse it on the host:
-
-```ts
-// Inside the container:
-// import json
-// json.dump({'fib': fib(20)}, open('/app/result.json', 'w'))
-
-const result = await runner.run({
- image: 'python:3.12-alpine',
- command: 'python main.py',
- dir: './solver',
- extract: [{ from: '/app/result.json', to: './out' }],
-}).result;
-
-const data = JSON.parse(fs.readFileSync('./out/result.json', 'utf8'));
-```
-
-### Pull a build artefact
-
-```ts
-extract: [
- { from: '/app/dist', to: './public' },
- { from: '/app/coverage', to: './reports' },
-],
-```
-
-### Tolerate optional outputs
-
-Multiple entries with one missing is fine:
-
-```ts
-extract: [
- { from: '/app/required.json', to: './out' },
- { from: '/app/optional-extra', to: './out' }, // may not exist
-]
-
-const result = await execution.result;
-const required = result.extracted!.find(e => e.from === '/app/required.json');
-if (required?.status !== 'ok') throw new Error('required.json missing');
-```
-
-## See also
-
-- [`ExtractSpec`](/api/interfaces/ExtractSpec) and [`ExtractResult`](/api/interfaces/ExtractResult) in the API reference
-- [Security model](./security) — why symlinks and `..` segments are dropped
diff --git a/docs/guides/gvisor-kata.md b/docs/guides/gvisor-kata.md
deleted file mode 100644
index 6950849..0000000
--- a/docs/guides/gvisor-kata.md
+++ /dev/null
@@ -1,132 +0,0 @@
-# gVisor & Kata Containers
-
-Default `runtime: 'runc'` shares the host kernel with the container. That is fast and convenient, but it means a kernel-level exploit inside the container can compromise the host. For genuinely hostile code, switch the runtime.
-
-## Choose the right tier
-
-| Runtime | Isolation | Performance | Status in light-runner |
-|---|---|---|---|
-| `runc` (default) | Linux namespaces + cgroups, shared kernel | Native | **Tested**, default for trusted/known code |
-| `runsc` (gVisor) | User-space syscall interception, smaller kernel attack surface | ~10-30% I/O overhead | **Tested**, recommended for hostile code |
-| `kata` (Kata Containers) | Lightweight VM per container, separate kernel | ~5-15% boot + I/O cost | **Option exposed but not yet validated in our test matrix** — open an issue if you run it in production |
-
-Switch via `RunnerOptions`:
-
-```ts
-const runner = new DockerRunner({ runtime: 'runsc' }); // or 'kata'
-```
-
-When the option is `runc` (or omitted), the runner does not pass a `Runtime` field to Docker, so you keep whatever the daemon's default is.
-
-## When to use gVisor
-
-Use it when **any** of these is true:
-
-- The code you run is **anonymous** (random user uploads, public CTF entries).
-- The code is **AI-generated** and you do not audit each call (LLM tool execution, agent runtimes).
-- You ship a **multi-tenant playground** and one tenant compromising the host would be a headline.
-- You handle PII or regulated data and the threat model includes "the running code is the adversary".
-
-You do **not** need gVisor when:
-
-- The code comes from your own CI / internal tooling and you trust the toolchain.
-- You build the image yourself from a known Dockerfile.
-- The performance cost is unacceptable (data-intensive batch jobs).
-
-## Install gVisor on Linux / WSL2
-
-gVisor does **not** run natively on macOS or Windows. On Windows, use Docker Desktop with the **WSL2 backend** — the `runsc` install lives inside the WSL2 distro, not the Windows host.
-
-```bash
-(
- set -e
- ARCH=$(uname -m)
- URL=https://storage.googleapis.com/gvisor/releases/release/latest/${ARCH}
- wget ${URL}/runsc ${URL}/runsc.sha512 \
- ${URL}/containerd-shim-runsc-v1 ${URL}/containerd-shim-runsc-v1.sha512
- sha512sum -c runsc.sha512 -c containerd-shim-runsc-v1.sha512
- rm -f *.sha512
- chmod a+rx runsc containerd-shim-runsc-v1
- sudo mv runsc containerd-shim-runsc-v1 /usr/local/bin
-)
-sudo /usr/local/bin/runsc install
-sudo systemctl reload docker
-```
-
-`latest` is a rolling channel — gVisor ships frequent date-stamped releases (`release-YYYYMMDD.N`), no semantic version. Verify with `runsc --version`.
-
-After the daemon reload, test that Docker accepts the new runtime:
-
-```bash
-docker run --rm --runtime=runsc alpine:3.19 dmesg | head
-# Expect: gVisor-style kernel ring buffer, NOT the host's
-```
-
-Then in your code:
-
-```ts
-const runner = new DockerRunner({ runtime: 'runsc' });
-```
-
-## Performance notes
-
-`runsc` intercepts syscalls in user space, so it pays a tax on every syscall:
-
-| Workload | Approx. overhead vs runc |
-|---|---|
-| CPU-bound (no syscalls) | ~0% |
-| Read-heavy I/O | 10-15% |
-| Write-heavy I/O | 20-30% |
-| Network-heavy (small packets) | 25-40% |
-| Workloads spawning many processes | 30-50% |
-
-For agent-style runs (one container, one process tree, one set of files), the overhead is usually **invisible**. For tight inner loops on disk or network, benchmark before committing.
-
-## Kata Containers
-
-Kata runs each container inside a lightweight VM with its own kernel, giving you **VM-level isolation** at container-level UX.
-
-```ts
-const runner = new DockerRunner({ runtime: 'kata' });
-```
-
-We pass `runtime: 'kata'` straight through to Docker's `HostConfig.Runtime`. Docker then dispatches to whichever Kata shim is installed (`containerd-shim-kata-v2` or similar). The library does **not** validate that the runtime is installed; if it is missing, Docker returns a `CONTAINER_START_FAILED` error at run time.
-
-**The disclaimer** (also visible on the security note in the bespoke landing): we expose this option for users who already run Kata, but our CI does **not** install or test against Kata. If you adopt it in production, please open an issue with results — both successes and edge cases.
-
-Useful resources:
-
-- [Kata Containers project](https://github.com/kata-containers/kata-containers)
-- [Docker + Kata setup guide](https://github.com/kata-containers/kata-containers/blob/main/docs/install/docker/ubuntu-docker-install.md)
-
-## Verifying isolation
-
-A quick sanity check that the runtime actually changed:
-
-```ts
-const result = await runner.run({
- image: 'alpine:3.19',
- command: 'cat /proc/self/maps | head -5',
- // gVisor-mapped binaries look very different from runc-mapped ones
-}).result;
-```
-
-Or look for the gVisor signature:
-
-```ts
-const result = await runner.run({
- image: 'alpine:3.19',
- command: 'dmesg | grep -i gvisor || echo "not gvisor"',
-}).result;
-```
-
-Under `runsc` you will see `gVisor` strings in `dmesg`. Under `runc`, you will see the host's kernel ring buffer.
-
-## Trade-offs summary
-
-| Want... | Use |
-|---|---|
-| Maximum speed, you trust the code | `runc` (default) |
-| Hard barrier against kernel exploits, willing to pay 10-30% I/O | `runsc` |
-| Full VM isolation, separate kernel | `kata` (un-validated, at your own risk) |
-| Air-gapped network on top of any of the above | `network: 'none'` on the request |
diff --git a/docs/guides/quickstart.md b/docs/guides/quickstart.md
deleted file mode 100644
index d97ac23..0000000
--- a/docs/guides/quickstart.md
+++ /dev/null
@@ -1,56 +0,0 @@
-# Quick start
-
-Run untrusted code in a hardened Docker container, get back the exit code, logs, and any files the container produced. That is the whole library.
-
-## Install
-
-```bash
-npm install light-runner
-```
-
-Requirements:
-
-- Node.js >= 22
-- A running Docker daemon (Docker Desktop on macOS / Windows, `dockerd` on Linux)
-- Optional: [gVisor](./gvisor-kata) for kernel-level isolation
-
-## Run something
-
-```ts
-import { DockerRunner } from 'light-runner';
-
-const runner = new DockerRunner({ memory: '512m', cpus: '1' });
-
-const execution = runner.run({
- image: 'python:3.12-alpine',
- command: 'python main.py',
- dir: './my-project',
- input: { task: 'compute', n: 20 },
- timeout: 30_000,
- extract: [{ from: '/app/result.json', to: './out' }],
-});
-
-const result = await execution.result;
-
-result.success // true if exitCode === 0, not cancelled, not timed out
-result.exitCode // container exit code
-result.duration // ms
-result.cancelled // true if cancel() / signal aborted
-result.extracted // [{ from, to, status, bytes? }, ...] if extract was set
-```
-
-## What happens under the hood
-
-1. A named Docker volume is created (`light-runner-`).
-2. The folder at `dir` is streamed into the volume via a throwaway Alpine seeder, skipping `.git`, `node_modules`, `dist`, `build`, `.next`, `.cache`, `.turbo`, `coverage`, and **all symlinks**.
-3. Your image runs with the volume mounted at `workdir` (default `/app`), strict isolation flags, and a PID / memory / CPU cap.
-4. On exit-code 0, each `extract` entry is streamed out via `tar`. On non-zero exit, extract is skipped.
-5. The volume is destroyed, success or not.
-
-## Where to go next
-
-- [Extract files](./extract) — how to pull artefacts out of the container after a run
-- [Detached runs](./detached) — long-running jobs that survive a host restart
-- [Security model](./security) — what the sandbox protects against and what it does not
-- [gVisor & Kata](./gvisor-kata) — adding a stronger runtime for hostile code
-- [API reference](/api/) — full type signatures and class methods
diff --git a/docs/guides/security.md b/docs/guides/security.md
deleted file mode 100644
index bdf5e5d..0000000
--- a/docs/guides/security.md
+++ /dev/null
@@ -1,115 +0,0 @@
-# Security model
-
-`light-runner` is the boring, correct, library-grade answer to "how do I run untrusted code in a container from Node.js?". It is **secure by default**, **additive only** (every option makes the sandbox stronger, never weaker), and it has **one job** (no orchestration, no networking, no persistence beyond the run).
-
-This page describes what is in scope, what is not, and how to choose the right hardening tier.
-
-## Threat model
-
-| In scope | Out of scope |
-|---|---|
-| Untrusted **user code** running inside the container | The host kernel itself (use gVisor for hostile code) |
-| **Filesystem isolation** between the run and the host | Side-channel attacks (timing, cache, Spectre) |
-| **Process isolation** between sibling runs on the same host | Hardware-level threats (firmware, BIOS) |
-| **Network containment** between the run and the host network | The Docker socket itself (root-equivalent on host) |
-| **Resource starvation** (memory, CPU, pids, extract size) | DoS at the orchestration layer (caller's job) |
-| Common container-escape patterns: raw sockets, mknod, capability juggling | Multi-tenant isolation **between tenants** sharing one container |
-
-**The one rule**: one run, one container, one tenant. If two pieces of code must not see each other, they each get their own `runner.run(...)` call.
-
-## What is on by default
-
-Every flag in [`src/createOptions.ts`](https://github.com/enixCode/light-runner/blob/main/src/createOptions.ts) is on for every run, with no opt-out path.
-
-### Capabilities dropped
-
-The following Linux capabilities are stripped at startup:
-
-| Capability | Why |
-|----------------|------------------------------------------------------------|
-| `NET_RAW` | Raw / packet sockets (ARP spoofing, packet crafting) |
-| `MKNOD` | Fabricate device nodes |
-| `SYS_CHROOT` | Escape weaker chroot jails |
-| `SETPCAP` | Modify capability sets of other processes |
-| `SETFCAP` | Escalate via setcap on dropped binaries |
-| `AUDIT_WRITE` | Kernel audit log flooding / spoofing |
-
-### `no-new-privileges`
-
-A `setuid` binary inside the container **cannot elevate above the user it starts as**. Even if the image ships a legitimate-looking root-suid helper, it stays at the run user's privilege level.
-
-### Process cap
-
-`PidsLimit: 100` per container. A fork-bomb caps out in milliseconds instead of paging the host. Tunable upward via `RunnerOptions` if you genuinely need more (compilers spawning many processes, orchestrators-of-orchestrators), but the floor is conservative.
-
-### Memory and CPU budget
-
-`512 MiB` and `1` core by default, **cgroup-enforced**. Noisy runs cannot starve their neighbours. Override with `new DockerRunner({ memory: '4g', cpus: '4' })`.
-
-### Network isolation
-
-Default network: a **dedicated isolated bridge** (`light-runner-isolated`) with **inter-container traffic disabled** (`com.docker.network.bridge.enable_icc: false`). Outbound internet works; sibling runs on the same bridge cannot see each other.
-
-For air-gapped runs, set `network: 'none'` in the request — the container has no network interface at all.
-
-### Filesystem protections
-
-- **Symlinks in your input folder are filtered** at seed time, so a stray `.git` link or a deliberate symlink to `/etc/passwd` cannot cross the host -> container boundary.
-- **`DEFAULT_IGNORES`** (`.git`, `node_modules`, `dist`, `build`, `.next`, `.cache`, `.turbo`, `coverage`) are skipped during seeding. They are noise at best and credentials-bearing at worst.
-- **Path traversal in `extract.from`** (segments containing `..`) is rejected **before** any container is spawned. A malicious container cannot tell the host extractor to write to `/etc/cron.d/`.
-- **Extract symlinks are skipped** during streaming. A container cannot craft a tarball with a symlink that resolves to a host path.
-- **Extract cap**: 1 GiB per entry, enforced **twice** — pre-flight via `du -sb` inside the container, and streamed via a byte counter on the host pipe.
-
-## What this does not cover
-
-- **Kernel exploits** (anything that breaks out of namespaces by tickling the host kernel directly).
-- **`runc` CVEs** (rare but real; you eat them if you ship `runtime: 'runc'`).
-- **Side-channel attacks** (timing, cache eviction, Spectre/Meltdown family).
-
-For genuinely hostile code (anonymous user-submitted source, AI-agent-generated tool calls, a CTF playground), combine with a stronger runtime — see [gVisor & Kata](./gvisor-kata).
-
-## Secrets
-
-`env` vars go to `docker run --env`, which makes them visible in `docker inspect` and Docker metadata. That is fine in most setups (a host with Docker socket access is already root-equivalent), but for sensitive material prefer:
-
-- **`input`** (stdin). Ephemeral. Not in metadata, not in `docker inspect`. Your container reads it via `sys.stdin.read()` / `process.stdin`.
-- **A bind mount to `/run/secrets/`**. Docker-native file-based secrets pattern (compose has a `secrets:` block for this). Not managed by light-runner — the consumer wires it via the host config or via a parent compose definition.
-
-Avoid putting API keys in `env`. Avoid putting them in `command`. Avoid putting them in `dir` (they would be tarred into the seed archive and visible to anyone with access to the volume).
-
-## Hardening recipes
-
-### Air-gapped run (no network, untrusted source code)
-
-```ts
-const runner = new DockerRunner();
-runner.run({
- image: 'python:3.12-alpine',
- command: 'python untrusted.py',
- dir: './sandbox',
- network: 'none',
- timeout: 30_000,
- extract: [{ from: '/app/output.json', to: './out' }],
-});
-```
-
-### Tighter resource budget
-
-```ts
-const runner = new DockerRunner({
- memory: '128m',
- cpus: '0.5',
-});
-```
-
-### Maximum isolation (gVisor)
-
-```ts
-const runner = new DockerRunner({ runtime: 'runsc' });
-```
-
-See [gVisor & Kata](./gvisor-kata) for installation.
-
-## Reporting a security issue
-
-Email the maintainer (see GitHub profile) with `[security]` in the subject. Public issues are fine for things that need a fix but no one is exploiting; private disclosure is preferred for actively-exploitable bugs.
diff --git a/docs/index.md b/docs/index.md
deleted file mode 100644
index 0e91109..0000000
--- a/docs/index.md
+++ /dev/null
@@ -1,324 +0,0 @@
----
-title: light-runner
-layout: page
-sidebar: false
-aside: false
-pageClass: bespoke-landing-page
----
-
-
-
-
-
-
-
-
-
-
-
-
- Execution primitive - Node.js
-
-
-
- Run untrusted code
- in hardened containers.
-
-
- A single-purpose Node.js library that runs your code in a container
- it tears down afterwards, and hands you back the exit code, logs,
- and any files you asked for. Nothing else.
-
-
-
-
-
-
-
-
-
- Fig. 01 - One process, one cell, one grid.
- light-runner / visual
-
-
-
-
-
-
-
-
-
what you get
-
Give it code. Get back an exit code , logs, and the files you asked for.
-
-
-
-
01 / isolated
-
Your code runs in its own cell .
-
Every run gets a fresh container, its own volume, its own network. Nothing leaks in from the host, nothing leaks out to sibling runs. Torn down on exit - success or not.
-
-
-
02 / drop in, pull out
-
Send a folder. Get any file back.
-
Point at a directory on your disk, it becomes the container's workdir. When the run finishes, ask for any path - a report, a binary, a whole build tree - and it lands back on your host.
-
-
-
03 / stop on demand
-
Cancel, abort, or time out .
-
Pass an AbortSignal, call cancel(), or set a deadline. The container dies and its volume goes with it. No zombie processes, no leaked disk.
-
-
-
04 / any stack
-
Python, Node, Go, Ruby, shell - anything .
-
Any Docker image on your registry or someone else's. No special runtime inside the container, no SDK to import, no convention to follow. Your code stays your code.
-
-
-
-
-
-
-
-
-
quick start
-
Five lines to run, one to get your artefact.
-
-
-
-
Point light-runner at an image and a folder. Pipe input through stdin. Extract whatever your container wrote.
-
No HTTP server. No config file. No CLI.
-
npm install light-runner
-
-
-
-
- example.ts
- Copy
-
-
import { DockerRunner } from 'light-runner' ;
-const runner = new DockerRunner ( { memory : '512m' , cpus : '1' } ) ;
-const execution = runner. run ( {
- image : 'python:3.12-alpine' ,
- command : 'python main.py' ,
- dir : './my-project' ,
- input : { task : 'compute' , n : 20 } ,
- timeout : 30_000 ,
- extract : [ { from : '/app/result.json' , to : './out' } ] ,
-} ) ;
-const result = await execution. result;
-result. success // true if exit 0 and not cancelled
-result. exitCode // the container's exit code
-result. extracted // [{ from, to, status, bytes }]
-
-
-
-
-
-
-
-
-
security model
-
Hardened defaults, never opt-out. Add more restrictions, never fewer.
-
-
-
-
Kernel permissions
-
Dangerous capabilities stripped at startup - raw sockets, device creation, chroot escapes, capability juggling, audit-log spoofing. Every run, unconditionally.
-
-
-
No privilege escalation
-
A setuid binary inside your container cannot elevate above the user it starts as.
-
-
-
Fork-bomb protection
-
Max 100 processes per container. A runaway loop caps out in milliseconds instead of paging the host.
-
-
-
Memory and CPU budget
-
512 MiB and one core by default, cgroup-enforced. Noisy runs cannot starve their neighbours. Tunable per runner.
-
-
-
Network isolation
-
Isolated bridge by default with inter-container traffic blocked. Pass network: 'none' to sever it entirely.
-
-
-
Host filesystem protection
-
Symlinks in your input folder are filtered before seeding, so a stray link cannot reach back into the host filesystem.
-
-
-
Safe file extraction
-
A container cannot write outside the destination folder you chose: paths escaping upward (..) are refused. Each extracted entry is capped at 1 GiB so a runaway output cannot fill your disk.
-
-
-
Kernel-level hardening
-
Swap the runtime to gVisor with one option for user-space syscall interception, at ~10-30% I/O cost.
-
-
-
- Does not cover - kernel exploits, runc CVEs, side-channel attacks. For genuinely hostile code, combine with { runtime: 'runsc' } (gVisor) or { runtime: 'kata' } (Kata Containers, VM-level isolation - option exposed but not yet validated in our test matrix ).
-
-
-
-
-
-
-
-
ecosystem
-
Three tools. Each does one thing.
-
-
-
- light-runner
- Spawn one container, return exit code and files.
- The execution primitive. Domain-agnostic. Zero orchestration. The other two tools in this family both call down to this one.
- Loading
-
-
- light-run
- CLI and HTTP surface around light-runner.
- Point a POST endpoint at it, pipe bodies through, get results back. Stateless wrapper, same defaults, same guarantees.
- Loading
-
-
- light-process
- DAG orchestration, retries, fan-out.
- When one container is not enough. Composes runs into pipelines with backoff, concurrency limits, and structured outputs.
- Loading
-
-
-
-
-
-
-
-
-
diff --git a/docs/public/banner.webp b/docs/public/banner.webp
deleted file mode 100644
index a2a08e9d2148c266eabb5f3dea5bb762506ed268..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 26938
zcmV(rK<>X%Nk&F8X#fCMMM6+kP&gnaX#fCl`vRQ-DnJDQ13obribNtIqo$(uIGE4|
z3295H&A)qleTDE4q%kr<&|IasC%^%zN8TX(5-lqSX|AGET_m};r
zsDF+Aul~RM2jf@Bcj7)v#FTBtGkDyg}
zmrzgppZI-z@H77BI=}uu=KXJeS^n4mSNZ>eU*n(MfARl`2iNA|m&hseEm#)N2q#JY
z^BmVC%y8Kj(z=+RKh~p)4DahlbQcA1()6Vr4F)r+=!WY}#IpF)iOAebdwW_bP@QTx
z3fcg$76QOmCmIm?-CP5{~Wuen?|kXT^Ivat$G+
z&$I_@t+R|el&_5|sR+t*P&PnZ(lgdhWiXoPERKlUOGUvW$^YFNHub|SA}Q(b81O~w
z^UMWtBuZTO8Y*?`1y2h<0t9zhED?1om$FNd=l`p0df37ALTO{hV-B06OpjT@^B;ur
z2RqQ|H4_*0yBd_GX9iN(Z(~4)G3M_Z>)j?9O?kz_eCaA2P4njRCzN>WSA|xCGXixY
z_&0GI%V?8lugAKMLD12Gz>wsIn#gf=YY-L&L-hph1;Mdqn^L1CTmpflX5^g(`3%lmBw_pB|Wj>Jwk-_mr%=%#M$Pzr~_TJ3non<
zi>TgzMF|e>^HwntKkdHy0LM#(ZiqaZR+YeYvsovteSt5P6PgBC25ypU9#cOGobsb4
zyJ(7SLsNLkP2%|db|VbIH&}iX(U%-|kXT8$#a!{o{yGcBactFvavcSd;3x1H1#M6n
zJprP!l&v4dyM!*=)QG@8{qu7SM@&bPOExPdH4K5I-aj7%)fqfX=G-|es3ZbSMuUqr
zFE^)3Qwo@2&&7S%r)i%>d=2hWrFl9qc`?v%wKrd^9jIh?o-v2uq-HWIXNYTgR-3W%
zqQ9<-6R0CZ9f1vqjAwFU0~FaHdW2W&z$4kz)7}+AR23W`fNP4lUDR{1xfp59n_WnL
z3SNhs2ZupF!2V$DtSq#M;(FcLowS-Fo%YE~W~XfI!peLYV|Isk!Ku=G@*xIGTv+oP
zGMz-OB}Y6Y{B8@;3_$FUCYAZS7=GL0Z!}HYp7dK_vBz*ID#(k)3TDTd=Q`Av-5+o-
zQMuN-*SI;W+Z5#aPN_o>FR<7RI|r$bpR33HSb_0yqT#YOa8fJexT47ociYlxI!~?a
zLQEN^pg=RRAqT~>N!c#7HTOm@%OJSY1+ZI2m&1!a+d#tVGzpK5;NijB8_Ek=1J74`
zG)9=K%1>%}xE$*pN64XR_Zdz?yd4@HyXOfXmS-1
zYW^w6bx9-;)VQ5DgZzMDryIBVCmNR%Dr%h6%ii?H0ak3_6_rCXkxvH~pi1)@Do?I;
zMIXfoNj{xjEno}bO?Kf#iog0i(F;PUI+;~^WS^1Jbi98@t$uyM7S!~p5^@CAkk~61
zRq`PHG<1LJP}RFrGk$l1}-R3?+S9S5+K{49NZW{!I~)
z9K`bVt=?RU*adIj?F!GolZ06-Cqes7rK2KOe8*71&?+om(j&Aca8$aHwuhGeF5O%%
zVir#R1E9%SjWN4wxGQ2J=gVIp%}iRdT-KsCI$UyH5t~Vm^)vj>GzMw0g=qV4nFFx=
zjYf7pg}YytRe2))^3I*vAQnFKEvEk1)&AxYDS(&k$^Uw+hKx3cU;2mp(JlQNRa6O2
zLitM}KQK+Bo!TpFx-#^dr{>Knv&P2(U@P)YKIx1fGy)k)ZYZ6$<2^l0!73O%Ot;)H
z8^5eUR>B@Xj+ktfvqkL%q-5t6b=&~yUA;f@0R|3|WpZ44Gt0;~{1?p9#bs(k@uiyM
z>~2ay#_j$~3WY%3!O+Fq7AJvQhx^C+FZV{f63AWnv6aD*h=vgyf6I-Nw{6h{l=%>>
zCqTuH=Q3fa*|wMU-t>&(9>ed>#-tW>w5DnR+}nJ+x3>mgAgI@HrU~DYY%=Y>inWz;
zp2BZPAoxDlndYVoHw?gR0EPeH+j_s)=vHsvKfSid&znYCkWn^GU|#4f!=~&HjSJ8bHV0}UWSwAs?gV?AR2BTKJz=z_VH;P_D-S=`
zFxa8eS;9x)H=fK`RTQmnqdSrmJ%@f}_#;>}QJIoyQV^%SvO!1rowy}Xl?6u*o1?V`
z!lrnCgUaRyU-$$s=s;%^JD4BU;5wSQ*YbV>+aK?6&Rll9X4k=H8XvFyi=3xsEl8L7
zNyEK*o}Qn9vk%scWREK8vJ)E+c|XZeRB+*@gUtGk(QG?s$KgCGJna
z%*kd3%5lc0z(WXhmwDqLNcy>;qh?@ZOqhGK(N)M--3%Xt+YD{A<+7Q!?6k(Ts|Il*
zV?k1oo#j_(3gIBW-Ult(VzS16ncJisZMLD3<5)Dv_9sh^pC8HbHqgs3{5grzu(Ht_
zduoh5(?u=vUo!vFU#FLeyc~h^)Oz*%Ee7+SyPT0LPufevp_hV7KZ+(PB}JOC@*3Oo
zaf?O#GA9@#E+}aHq9R8?fGsQUHef5q(m_+-z*upQ-Kq+X5I%4Peo4wCx5
zTw_pot3_Y27V@J|`i(ujLdr0JSb({yYW!OXBnI3aV_#5mTikPwPDvz&SyJ{^$jXM{
zy{av%yjBr&g@KB*K(FQYW9e7(t@||#rW6eKo-(G@Xo#2zJZqvsnp{hqG(HSGy5p$|
zn)%?}>mPKtv5w=uX(C@BQWL5uj_d&7lYQNav=*@TTmCN(S%k1
zRjGwE4Se@Ahc#tP_s%sBJ-CsZ(SdHKzAy8(-vt&)JAaaK{z`(QhfUGnEm5h*N*Z8M
z4%X+rH;VtT8QCYr`;Fg)KOKT(%YR+opTTx`gSBva`N3wyFdD20LkdXpN|ZY19V}IQwYrps?>2>F8-KL&N+r#`PkRhj1CGrJ$0q)v{5`4H!LRwRw
z57&6}a_+(*>Lsbl$Ut@?e9?2tdr3xU$vSD=-fPL}ZA7j&hcJPp<+N+I^eHoA!%{V=Fh4aVLDVg3}O
zk%LDXR+p+`0*Y1-F2+@ElCW~dFnGCUXsx-?BtgZ`aq9A3H&AH8gL;T6zN5FngdcAt
zgHh$RtIjNhq#2sDJaSHBb|0GHzoWiUaV5Gq@+0hLY$-Fwdz}vHjwzwoDyoWrLEA*Jog=&%F?~`_q
z%1PN3urBx1W-5e;ZX}WK&f*))XXVW8Wox#s7^}tuIuFF
zq46eTzGFbl9fzJn>55jDmIsEix}L!P+0sA!n`-A{>p$l%Y(*J|^lQE9Tm*rsoiZ`5
zo)@g(ym>$WX)gHYhfS7yVi|K~9<4g`EbHB866g2Y+n0wJaOXD7uN@
z|NJk~AU3g9cJ8Mx3&Yb*VwEX>PfMr3ktDLi13eeq`Mor>p6pp_7@zaByA%ZpS|
z^ZGZyp&ATF>BSZBO=KM>*6MQ#D#^VhTuh}_UOA5q{!gYmUl+NCkki;KX8#z#7bxYI
zMF5ay7>^rbg;l+Y)L?O&J=FefbFtg(MXYk11|)E((tP`14jiAgnkh)eh%C&UWsI?U&7a+LH9V+Vh9qG?h)ylq~%+y(jiObloP$R#)ABk6Ig%krcj>{m`07s
zoZ?zaOc~Z&u*Vbp&$DY
zu2C^-_n<41l584ecb+ka;??uHExzN!_Fj{`8@T*4hi?>(xaKV_WhBKU64!E`t@0u3
zk902rk7uLT8*Hr)n42rE!=El8gRh8_%7zM5oSY9ewN~&yT%~J{?B9F5^ZEVwWZs~V
z^;>#>*rp`S>fPpRu2sLMa?IlK78(n)F+J3{=e57;Kv;j{R)e4Npn$Agj(Bd*ywrmG
z8%G*67?E}e^_tIMnV60F9{=@9HH$0C3WRA3(K6AM>FX3Px8fd>)O#qhp(G+)Yv0!=
z`?@dR{0ClwRV&6^*Pac5SB}sl#QB~oC
zCUntG@nh9o0)!tzBZKEDXMCN8>7OCUwEyIAu_~!>V`E=kHkBj;(kXIb8S|e@S@5l6
zi|E!+qz`jPa+fn53nBv&%Tf82KX07uf`EPP$>c1+xO$wd+beh^Y%zTO7b4L2n0HqP
z{ZpIz*#%3UHaagLaH9vxh-AP65|~Yjv8a>*xZPJ(b``tkd71vOD-ptw7Nbt>XS$(P
z1560r!NvME*}K16@j|aKqL-+_^^G!Jp!4KldIA!1ljE)k8&I`}(keX?4TTsSCw8T9
z9Xu2TyTd`uvUbZK|ce(9g!^1u0#Ig^rxmG