feat(web): rebuild landing as Astro static site with gitlawb theme and full docs (#1606)

* feat(web): rebuild landing as Astro static site with gitlawb theme and full docs

Replaces the Vite+React SPA in web/ with a fully static Astro 6 site:

- gitlawb-aligned design system: dark-default monochrome surface tokens,
  Geist Mono, hairline grids, [light]/[dark] toggle — keeping the orange
  #ff7a1a openclaude accent (#e85d00 in light mode for AA contrast)
- 9-page docs section: installation, quickstart, providers, slash
  commands (all 69 user-facing commands with argument hints), CLI
  reference (every non-hidden flag), configuration, keybindings, skills —
  rendered from typed data files seeded from the CLI source
- SEO: per-page canonicals/OG/Twitter, JSON-LD (SoftwareApplication,
  TechArticle, BreadcrumbList), @astrojs/sitemap, robots.txt, and
  generated 1200x630 OG cards, all on https://openclaude.gitlawb.com
- zero framework JS: theme toggle, copy buttons, mobile nav, and TOC
  highlighting are small vanilla scripts
- CI-compatible: same typecheck/build script names, bun.lock regenerated

Co-Authored-By: OpenClaude <openclaude@gitlawb.com>

* feat(web): redesign logo as gitlawb-aligned circuit mark

White terminal face (hollow node eyes, >_ prompt mouth) on a black
square with an orange git-fork trace descending to two commit nodes —
same stroke language as the gitlawb mark. Adds the SVG source as the
favicon and regenerates all three OG cards with the new logo.

Co-Authored-By: OpenClaude <openclaude@gitlawb.com>

* fix(web): address review feedback on copy button a11y and css lint

- CopyCommand: generic aria-label (component is reusable, not
  install-specific) and a visually-hidden role="status" live region so
  screen readers announce the copied state
- global.css: lowercase text-rendering keyword, blank line before
  color-scheme, kebab-case fade-up keyframe name

Co-Authored-By: OpenClaude <openclaude@gitlawb.com>

---------

Co-authored-by: OpenClaude <openclaude@gitlawb.com>
This commit is contained in:
Kevin Codex
2026-06-12 23:54:24 +08:00
committed by GitHub
co-authored by OpenClaude
parent 8f92346cf4
commit d08593de92
48 changed files with 3556 additions and 899 deletions
+4 -1
View File
@@ -1 +1,4 @@
.vercel
dist/
node_modules/
.astro/
.vercel/
+8
View File
@@ -0,0 +1,8 @@
import { defineConfig } from 'astro/config'
import sitemap from '@astrojs/sitemap'
export default defineConfig({
site: 'https://openclaude.gitlawb.com',
trailingSlash: 'always',
integrations: [sitemap()],
})
+765 -51
View File
@@ -5,125 +5,839 @@
"": {
"name": "openclaude-web",
"dependencies": {
"@types/react": "19.2.14",
"@types/react-dom": "19.2.3",
"@vitejs/plugin-react": "6.0.1",
"react": "19.2.4",
"react-dom": "19.2.4",
"typescript": "6.0.3",
"vite": "8.0.10",
"@astrojs/check": "0.9.9",
"@astrojs/sitemap": "3.7.3",
"@fontsource-variable/geist-mono": "^5.2.5",
"astro": "6.4.6",
"typescript": "^5.8.3",
},
},
},
"packages": {
"@emnapi/core": ["@emnapi/core@1.10.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="],
"@astrojs/check": ["@astrojs/check@0.9.9", "", { "dependencies": { "@astrojs/language-server": "^2.16.7", "chokidar": "^4.0.3", "kleur": "^4.1.5", "yargs": "^17.7.2" }, "peerDependencies": { "typescript": "^5.0.0 || ^6.0.0" }, "bin": { "astro-check": "bin/astro-check.js" } }, "sha512-A5UW8uIuErLWEoRQvzgXpO1gTjUFtK8r7nU2Z7GewAMxUb7bPvpk11qaKKgxqXlHJWlAvaaxy+Xg28A6bmQ1Tg=="],
"@astrojs/compiler": ["@astrojs/compiler@4.0.0", "", {}, "sha512-eouss7G8ygdZqHuke033VMcVw5HTZUu+PXd/h06DGDUg/jt5btPYPqh66ENWw/mU78rBrf/oeC4oqoBwMtDMNA=="],
"@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.10.0", "", { "dependencies": { "@types/hast": "^3.0.4", "@types/mdast": "^4.0.4", "js-yaml": "^4.1.1", "picomatch": "^4.0.4", "retext-smartypants": "^6.2.0", "shiki": "^4.0.2", "smol-toml": "^1.6.0", "unified": "^11.0.5" } }, "sha512-Ry2R3VPeIN4uPCSA4xQc+e+vsJXkalKpEbDc07hV+a/o5Bs2N/s/uDcPJH/05L19DKh9tAy7e6JM3YZ6Cxfezw=="],
"@astrojs/language-server": ["@astrojs/language-server@2.16.10", "", { "dependencies": { "@astrojs/compiler": "^2.13.1", "@astrojs/yaml2ts": "^0.2.4", "@jridgewell/sourcemap-codec": "^1.5.5", "@volar/kit": "~2.4.28", "@volar/language-core": "~2.4.28", "@volar/language-server": "~2.4.28", "@volar/language-service": "~2.4.28", "muggle-string": "^0.4.1", "tinyglobby": "^0.2.16", "volar-service-css": "0.0.70", "volar-service-emmet": "0.0.70", "volar-service-html": "0.0.70", "volar-service-prettier": "0.0.70", "volar-service-typescript": "0.0.70", "volar-service-typescript-twoslash-queries": "0.0.70", "volar-service-yaml": "0.0.70", "vscode-html-languageservice": "^5.6.2", "vscode-uri": "^3.1.0" }, "peerDependencies": { "prettier": "^3.0.0", "prettier-plugin-astro": ">=0.11.0" }, "optionalPeers": ["prettier", "prettier-plugin-astro"], "bin": { "astro-ls": "./bin/nodeServer.js" } }, "sha512-87VQ/5GSdHlRnUA+hGuerYyIGAj+9RbZmATyuKLEUePinUXhQ5YkRnRrHhOD9sSi5JOErLjrLkHnfZFEvGrV8w=="],
"@astrojs/markdown-remark": ["@astrojs/markdown-remark@7.2.0", "", { "dependencies": { "@astrojs/internal-helpers": "0.10.0", "@astrojs/prism": "4.0.2", "github-slugger": "^2.0.0", "hast-util-from-html": "^2.0.3", "hast-util-to-text": "^4.0.2", "mdast-util-definitions": "^6.0.0", "rehype-raw": "^7.0.0", "rehype-stringify": "^10.0.1", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "remark-smartypants": "^3.0.2", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.1.0", "unist-util-visit-parents": "^6.0.2", "vfile": "^6.0.3" } }, "sha512-+YxmVQu1Bd+MFfSzjq1rOJvD9+nIOJzz5YIIhdIH01RrxRkKbyKoEgyIqP3yv51MhzMDgd79QaPv+kCVPT8vHw=="],
"@astrojs/prism": ["@astrojs/prism@4.0.2", "", { "dependencies": { "prismjs": "^1.30.0" } }, "sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA=="],
"@astrojs/sitemap": ["@astrojs/sitemap@3.7.3", "", { "dependencies": { "sitemap": "^9.0.0", "stream-replace-string": "^2.0.0", "zod": "^4.3.6" } }, "sha512-f8euLVsyeAmAkSm/1M2Kb8sL8byQmfgbvBNaHFItCheTj/IpiJYSEWVcqDHZ/yEHxiS7+w87mQkzwZaPHmk5GA=="],
"@astrojs/telemetry": ["@astrojs/telemetry@3.3.2", "", { "dependencies": { "ci-info": "^4.4.0", "dset": "^3.1.4", "is-docker": "^4.0.0", "is-wsl": "^3.1.1", "which-pm-runs": "^1.1.0" } }, "sha512-j8DNruA8ors99Al39RYZPJK4DC1bKkoNm93mAMuBhY9TCNC4R8n1q7ovFnJ5qhGh5Lsh7pa1gpQVpYpsJPeTHQ=="],
"@astrojs/yaml2ts": ["@astrojs/yaml2ts@0.2.4", "", { "dependencies": { "yaml": "^2.8.3" } }, "sha512-8oddpOae35pJsXPQXhTkM0ypfKPskVsh2bCxRtbf7e+/Epw2nReakFYpLKjZMEr75CsoF203PMnCocpfz0s69A=="],
"@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="],
"@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="],
"@babel/parser": ["@babel/parser@7.29.7", "", { "dependencies": { "@babel/types": "^7.29.7" }, "bin": "./bin/babel-parser.js" }, "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg=="],
"@babel/types": ["@babel/types@7.29.7", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA=="],
"@capsizecss/unpack": ["@capsizecss/unpack@4.0.1", "", { "dependencies": { "fontkitten": "^1.0.3" } }, "sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ=="],
"@clack/core": ["@clack/core@1.4.1", "", { "dependencies": { "fast-wrap-ansi": "^0.2.0", "sisteransi": "^1.0.5" } }, "sha512-FILJa1gGKEFTGZAJE9RpVhrjKz3c3h4ar60dSv6cGuDqufQ84YEIS3GAGvZiN+H6yaLbbvTFNejjCC4tXpZEuw=="],
"@clack/prompts": ["@clack/prompts@1.5.1", "", { "dependencies": { "@clack/core": "1.4.1", "fast-string-width": "^3.0.2", "fast-wrap-ansi": "^0.2.0", "sisteransi": "^1.0.5" } }, "sha512-zccHj2z2oCCO4yrDiRSlFOxWerGqRiysP7a5jPK6uoI9URKAquwY42Dd/iUP8JWHxEzdRe4TlbvZCo8z1/mhrw=="],
"@emmetio/abbreviation": ["@emmetio/abbreviation@2.3.3", "", { "dependencies": { "@emmetio/scanner": "^1.0.4" } }, "sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA=="],
"@emmetio/css-abbreviation": ["@emmetio/css-abbreviation@2.1.8", "", { "dependencies": { "@emmetio/scanner": "^1.0.4" } }, "sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw=="],
"@emmetio/css-parser": ["@emmetio/css-parser@0.4.1", "", { "dependencies": { "@emmetio/stream-reader": "^2.2.0", "@emmetio/stream-reader-utils": "^0.1.0" } }, "sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ=="],
"@emmetio/html-matcher": ["@emmetio/html-matcher@1.3.0", "", { "dependencies": { "@emmetio/scanner": "^1.0.0" } }, "sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ=="],
"@emmetio/scanner": ["@emmetio/scanner@1.0.4", "", {}, "sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA=="],
"@emmetio/stream-reader": ["@emmetio/stream-reader@2.2.0", "", {}, "sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw=="],
"@emmetio/stream-reader-utils": ["@emmetio/stream-reader-utils@0.1.0", "", {}, "sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A=="],
"@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="],
"@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="],
"@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.7", "", { "os": "aix", "cpu": "ppc64" }, "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg=="],
"@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.4", "", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow=="],
"@esbuild/android-arm": ["@esbuild/android-arm@0.27.7", "", { "os": "android", "cpu": "arm" }, "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ=="],
"@oxc-project/types": ["@oxc-project/types@0.127.0", "", {}, "sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ=="],
"@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.7", "", { "os": "android", "cpu": "arm64" }, "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ=="],
"@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-rc.17", "", { "os": "android", "cpu": "arm64" }, "sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ=="],
"@esbuild/android-x64": ["@esbuild/android-x64@0.27.7", "", { "os": "android", "cpu": "x64" }, "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg=="],
"@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-rc.17", "", { "os": "darwin", "cpu": "arm64" }, "sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw=="],
"@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw=="],
"@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-rc.17", "", { "os": "darwin", "cpu": "x64" }, "sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw=="],
"@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ=="],
"@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-rc.17", "", { "os": "freebsd", "cpu": "x64" }, "sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw=="],
"@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.7", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w=="],
"@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17", "", { "os": "linux", "cpu": "arm" }, "sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ=="],
"@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ=="],
"@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17", "", { "os": "linux", "cpu": "arm64" }, "sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q=="],
"@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.7", "", { "os": "linux", "cpu": "arm" }, "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA=="],
"@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-rc.17", "", { "os": "linux", "cpu": "arm64" }, "sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg=="],
"@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A=="],
"@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17", "", { "os": "linux", "cpu": "ppc64" }, "sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA=="],
"@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.7", "", { "os": "linux", "cpu": "ia32" }, "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg=="],
"@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17", "", { "os": "linux", "cpu": "s390x" }, "sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA=="],
"@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q=="],
"@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-rc.17", "", { "os": "linux", "cpu": "x64" }, "sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA=="],
"@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw=="],
"@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-rc.17", "", { "os": "linux", "cpu": "x64" }, "sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw=="],
"@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.7", "", { "os": "linux", "cpu": "ppc64" }, "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ=="],
"@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.0-rc.17", "", { "os": "none", "cpu": "arm64" }, "sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA=="],
"@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ=="],
"@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-rc.17", "", { "dependencies": { "@emnapi/core": "1.10.0", "@emnapi/runtime": "1.10.0", "@napi-rs/wasm-runtime": "^1.1.4" }, "cpu": "none" }, "sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA=="],
"@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.7", "", { "os": "linux", "cpu": "s390x" }, "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw=="],
"@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17", "", { "os": "win32", "cpu": "arm64" }, "sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA=="],
"@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.7", "", { "os": "linux", "cpu": "x64" }, "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA=="],
"@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-rc.17", "", { "os": "win32", "cpu": "x64" }, "sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg=="],
"@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w=="],
"@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.7", "", {}, "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA=="],
"@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.7", "", { "os": "none", "cpu": "x64" }, "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw=="],
"@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],
"@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.7", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A=="],
"@types/react": ["@types/react@19.2.14", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w=="],
"@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.7", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg=="],
"@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="],
"@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw=="],
"@vitejs/plugin-react": ["@vitejs/plugin-react@6.0.1", "", { "dependencies": { "@rolldown/pluginutils": "1.0.0-rc.7" }, "peerDependencies": { "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", "babel-plugin-react-compiler": "^1.0.0", "vite": "^8.0.0" }, "optionalPeers": ["@rolldown/plugin-babel", "babel-plugin-react-compiler"] }, "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ=="],
"@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.7", "", { "os": "sunos", "cpu": "x64" }, "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA=="],
"csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],
"@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA=="],
"@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.7", "", { "os": "win32", "cpu": "ia32" }, "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw=="],
"@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.7", "", { "os": "win32", "cpu": "x64" }, "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg=="],
"@fontsource-variable/geist-mono": ["@fontsource-variable/geist-mono@5.2.8", "", {}, "sha512-KI5bj+hkkRiHttYHmccotUZ80ZuZyai+RwI1d7UId0clkx/jXxlo8qYK8j54WzmpBjtMoEMPyllV7faDcj+6RA=="],
"@img/colour": ["@img/colour@1.1.0", "", {}, "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ=="],
"@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="],
"@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="],
"@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="],
"@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="],
"@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="],
"@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="],
"@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.2.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA=="],
"@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.2.4", "", { "os": "linux", "cpu": "none" }, "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA=="],
"@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="],
"@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="],
"@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="],
"@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="],
"@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" }, "os": "linux", "cpu": "arm" }, "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="],
"@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="],
"@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.2.4" }, "os": "linux", "cpu": "ppc64" }, "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA=="],
"@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.2.4" }, "os": "linux", "cpu": "none" }, "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw=="],
"@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" }, "os": "linux", "cpu": "s390x" }, "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="],
"@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="],
"@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="],
"@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="],
"@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.5", "", { "dependencies": { "@emnapi/runtime": "^1.7.0" }, "cpu": "none" }, "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="],
"@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.34.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g=="],
"@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="],
"@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="],
"@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
"@oslojs/encoding": ["@oslojs/encoding@1.1.0", "", {}, "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ=="],
"@rollup/pluginutils": ["@rollup/pluginutils@5.4.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg=="],
"@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.61.1", "", { "os": "android", "cpu": "arm" }, "sha512-JnBB8MdXj45cajvTuO5FmPlvFVJRQgvrz1uSEl3NwqFnReAPGwb8EanbGi4z2nRaqLzjJSv5/JmycoTKlRZxHA=="],
"@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.61.1", "", { "os": "android", "cpu": "arm64" }, "sha512-Jx2g7iSjw4AOT0HDPHM9RV3GNjRXwybWtSFZiZAYUTjUwjVrYIwq3kBf+LnhqJlzXFAqTAh2F7IGI+O568exPw=="],
"@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.61.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-0F1L/Z3Eqv8mT2n3dCpeO8GcTvHvVqkP5/t6DMsn0KzhYVcg+s7Ncl5DS8qjKYEeio6Az0Gt6nyBORay5qIlCA=="],
"@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.61.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-qLttcH871ujY4YcVfUSShhOw+CsoTatYz8gRbHO7Bb92QH059/P0y5do1KMs41fY0BpD2x4AJH/gID0zFiqVKQ=="],
"@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.61.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-fUI4RapGE0Oh3mb8mgfvC1O2nU1RpDZUKnDQm3xB1Ipg7C2wTs5Kstz7G2uWK99a8S2yTMq8/P4uycwNa0nJyw=="],
"@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.61.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-H5YrdvJaDtI/U9/emrD4b++xkvp3y/JvOe4rizHbxvkyMfRS/CiRYdji+Pl8D0brEaNFWUh1drQxgAGIl6Xudw=="],
"@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.61.1", "", { "os": "linux", "cpu": "arm" }, "sha512-Q8CBCCQtDFrYtXoeUXSrnFXKOnyUhx6bz+SkL6A0E7V8kAiCJ5pamq1WtbfpVGhR5TSpXY6ak3avmDc5fHTyJA=="],
"@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.61.1", "", { "os": "linux", "cpu": "arm" }, "sha512-nwnhk1581l0FBVellGcVCAT0Oi06onEA3WB53sf01VO3I0UPBkMH9sXONYME2K0ovXcNayJfNtHfm6mpJElatQ=="],
"@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.61.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-x5Xr49hwt3hdW75UOZm3395YwwzPyauktslv29KpWL/T+vVAzoT3azLcTWv0eMciBNrx+DYjH4paehHoLpPvpg=="],
"@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.61.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-unMS3H73DpaoPyyEVPjGKleM/s0mkmsauTENpw4INQY8y4+IuLNjkueQ5QCtC0D3N38Y38yhAU8OoZ20S2Tm6w=="],
"@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.61.1", "", { "os": "linux", "cpu": "none" }, "sha512-zNZzGRnAhwjFEYmvphJRV5XaQGjs62cCmeYYHUT//NbvEnHauw+I85nGG+SiVg5ld4GX8D1IbKIX+ozITQnhMQ=="],
"@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.61.1", "", { "os": "linux", "cpu": "none" }, "sha512-LdpWGL8X209B2SIvWjqlc8VZgM6PKfontSerGepuldQmHYrAOtnMCXeJkxXGbC+PPZVOuu5czJo7fNV6aeW8rQ=="],
"@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.61.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-EC5kTtNaNGOmbMGqar8dvJy6y/hg99GAwjfBz++pxZhQATXGcRjd6c5en5wcbru0vkRmiMGsQKdMJOOf6sza4g=="],
"@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.61.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-8hiwp6D4acEcNK78I4rP0/XtS1sknWIAMJBPdR4l6zUtyTm5KiTDr5bXmWt4foY7nAN7AThDHgkLIEZOWKbzWw=="],
"@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.61.1", "", { "os": "linux", "cpu": "none" }, "sha512-10dh/h/BqA7DuMPWSxkR8uks18FRwnwOEqr5zOTEl+NOwP/OMzKX8OFR/Of9xxDA7D5qef1Nzar5WDD2kCCr1g=="],
"@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.61.1", "", { "os": "linux", "cpu": "none" }, "sha512-YKJ5lg35DP17gcAOggnihe+APw9HLyj1Xn7gsmGumBJAUDa6NGXNixJzmkWLhcK9TOuuyQjdamzvJefkO7qHZQ=="],
"@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.61.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-Mlil5G2Jj6a7B3LWGctg+XPL9vdXYuzCtNXfxOQ0nPjc2m6ueUktocPGH9bnAM0bNRKb/bAWTujUU7IJQdQA+g=="],
"@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.61.1", "", { "os": "linux", "cpu": "x64" }, "sha512-bVWIOIk6pV01p4CdUbPP7CJ/434z+OooYjDuFcR+44N35YvKUC66G8MGnvcWx5mWKW3g61J+t74l3Kj15Kwn2Q=="],
"@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.61.1", "", { "os": "linux", "cpu": "x64" }, "sha512-qy5pBvZbqNFheBz61R1rzsezjm0J7O2oNGoWtGoY89SZYLUfxAJTBAqDChqAIdB4rCiIbi9nF7yZ83GnNiLwSw=="],
"@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.61.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-E83TXjI4zm0+5f2qO+UOudaCYIhYwpJ5jq6YCZNIZ+6CbfhKrkAGezeiASBL9ElxAxFsRS9ZhESv8mfnj6TKeg=="],
"@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.61.1", "", { "os": "none", "cpu": "arm64" }, "sha512-fbWnKqVkjrJN38vNe3ahkbk6iejS/3b0Nt7EEtPpE6RBacZcGXNKbzfHN3GUUlXOPghUg0j6XUGrtjX9z1sIvA=="],
"@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.61.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-ArMl38iVAbk0New1ogihQNY6iphLi4ZaRsa037gUzv5yeKPY8TD3Dmy4x2RNC1VztU/uqm+G+/RwFrSka3Oy2g=="],
"@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.61.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-0mYtjHS9ucAbcATycCNK9IGBk/cCe/ma7EmSLGZdsxnOA8cjRIyU04wDpVAD9NiOfLUR9KTxdiO53uOkherqjQ=="],
"@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.61.1", "", { "os": "win32", "cpu": "x64" }, "sha512-gK1iCEPfpoSG9wfBihXxvBMi8ZfcWffYkEsC/Eih+iFENTaewvNcrEQ69lIOWYO5pePHKLHHO7nq5AILGO/HQQ=="],
"@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.61.1", "", { "os": "win32", "cpu": "x64" }, "sha512-X+zaP2x+j4RXGfbp/seSoRHWnPxzApilDszisZxbYH5C/jTxFhCtDNdPGZb9lJyYPs24wGxruPF7Y+sIXt9Gzw=="],
"@shikijs/core": ["@shikijs/core@4.2.0", "", { "dependencies": { "@shikijs/primitive": "4.2.0", "@shikijs/types": "4.2.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-Hc87Ab1Ld/vEbZRCbwx344I5v+4RU8CVToUTRkqXL1+TjbuOp9U5Xa0M23V4GEWHxVn+yO5otb+HkQVm3ptWQQ=="],
"@shikijs/engine-javascript": ["@shikijs/engine-javascript@4.2.0", "", { "dependencies": { "@shikijs/types": "4.2.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.6" } }, "sha512-fjETeq1k5ffyXqRgS6+3hpvqseLalp1kjNfRbXpUgWR8FpZ1CmQfiNHovc5lncYjt/Vg5JK/WJEmLahjwMa0og=="],
"@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@4.2.0", "", { "dependencies": { "@shikijs/types": "4.2.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-hTorK1dffPkpbMUk6Z+828PgRo7d07HbnizoP0hNPFjhxMHctj0Px/qoHeGMYafc6ju+u9iMldN4JbVzNQM++g=="],
"@shikijs/langs": ["@shikijs/langs@4.2.0", "", { "dependencies": { "@shikijs/types": "4.2.0" } }, "sha512-bwrVRlJ0wUhZxAbVdvBbv2TTC9yLsh4C/IO5Ofz0T8MQntgDvyVnkbjw9vi50r1kx7RCIJdnJnjZAwmAsXFLZQ=="],
"@shikijs/primitive": ["@shikijs/primitive@4.2.0", "", { "dependencies": { "@shikijs/types": "4.2.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-NOq+DtUkVBJtZMVXL5A0vI0Xk8nvDYaXetFHSJFlOqjDZIVhIPRYFdGkSoElDqNuegikcc3A76SNUa8dTqtAYA=="],
"@shikijs/themes": ["@shikijs/themes@4.2.0", "", { "dependencies": { "@shikijs/types": "4.2.0" } }, "sha512-RX8IHYeLv8Cu2W6ruc3RxUqWn0IYCqSrMBzi/uRGAmfyDNOnNO5BF/Px7o97n4XTpmFTo5GbRaazuOWj+2ak2w=="],
"@shikijs/types": ["@shikijs/types@4.2.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-VT/MKtlpOhEPZloSH3Pb9WCZEBDoQVMa9jedp5UAwmJOar1DVc9DRODAxmYPW9M93IK4ryuqRejFfmlvlVDemw=="],
"@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="],
"@types/debug": ["@types/debug@4.1.13", "", { "dependencies": { "@types/ms": "*" } }, "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw=="],
"@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="],
"@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="],
"@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="],
"@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="],
"@types/nlcst": ["@types/nlcst@2.0.3", "", { "dependencies": { "@types/unist": "*" } }, "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA=="],
"@types/node": ["@types/node@24.13.2", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA=="],
"@types/sax": ["@types/sax@1.2.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A=="],
"@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
"@ungap/structured-clone": ["@ungap/structured-clone@1.3.1", "", {}, "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ=="],
"@volar/kit": ["@volar/kit@2.4.28", "", { "dependencies": { "@volar/language-service": "2.4.28", "@volar/typescript": "2.4.28", "typesafe-path": "^0.2.2", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" }, "peerDependencies": { "typescript": "*" } }, "sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg=="],
"@volar/language-core": ["@volar/language-core@2.4.28", "", { "dependencies": { "@volar/source-map": "2.4.28" } }, "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ=="],
"@volar/language-server": ["@volar/language-server@2.4.28", "", { "dependencies": { "@volar/language-core": "2.4.28", "@volar/language-service": "2.4.28", "@volar/typescript": "2.4.28", "path-browserify": "^1.0.1", "request-light": "^0.7.0", "vscode-languageserver": "^9.0.1", "vscode-languageserver-protocol": "^3.17.5", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" } }, "sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw=="],
"@volar/language-service": ["@volar/language-service@2.4.28", "", { "dependencies": { "@volar/language-core": "2.4.28", "vscode-languageserver-protocol": "^3.17.5", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" } }, "sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw=="],
"@volar/source-map": ["@volar/source-map@2.4.28", "", {}, "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ=="],
"@volar/typescript": ["@volar/typescript@2.4.28", "", { "dependencies": { "@volar/language-core": "2.4.28", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } }, "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw=="],
"@vscode/emmet-helper": ["@vscode/emmet-helper@2.11.0", "", { "dependencies": { "emmet": "^2.4.3", "jsonc-parser": "^2.3.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-languageserver-types": "^3.15.1", "vscode-uri": "^3.0.8" } }, "sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw=="],
"@vscode/l10n": ["@vscode/l10n@0.0.18", "", {}, "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ=="],
"ajv": ["ajv@8.20.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="],
"ajv-draft-04": ["ajv-draft-04@1.0.0", "", { "peerDependencies": { "ajv": "^8.5.0" }, "optionalPeers": ["ajv"] }, "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw=="],
"ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
"ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
"anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="],
"arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="],
"argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
"aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="],
"array-iterate": ["array-iterate@2.0.1", "", {}, "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg=="],
"astro": ["astro@6.4.6", "", { "dependencies": { "@astrojs/compiler": "^4.0.0", "@astrojs/internal-helpers": "0.10.0", "@astrojs/markdown-remark": "7.2.0", "@astrojs/telemetry": "3.3.2", "@capsizecss/unpack": "^4.0.0", "@clack/prompts": "^1.1.0", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.3.0", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", "ci-info": "^4.4.0", "clsx": "^2.1.1", "common-ancestor-path": "^2.0.0", "cookie": "^1.1.1", "devalue": "^5.8.1", "diff": "^8.0.3", "dset": "^3.1.4", "es-module-lexer": "^2.0.0", "esbuild": "^0.27.3", "flattie": "^1.1.1", "fontace": "~0.4.1", "get-tsconfig": "5.0.0-beta.4", "github-slugger": "^2.0.0", "html-escaper": "3.0.3", "http-cache-semantics": "^4.2.0", "js-yaml": "^4.1.1", "jsonc-parser": "^3.3.1", "magic-string": "^0.30.21", "magicast": "^0.5.2", "mrmime": "^2.0.1", "neotraverse": "^0.6.18", "obug": "^2.1.1", "p-limit": "^7.3.0", "p-queue": "^9.1.0", "package-manager-detector": "^1.6.0", "piccolore": "^0.1.3", "picomatch": "^4.0.4", "rehype": "^13.0.2", "semver": "^7.7.4", "shiki": "^4.0.2", "smol-toml": "^1.6.0", "svgo": "^4.0.1", "tinyclip": "^0.1.12", "tinyexec": "^1.0.4", "tinyglobby": "^0.2.15", "ultrahtml": "^1.6.0", "unifont": "~0.7.4", "unist-util-visit": "^5.1.0", "unstorage": "^1.17.5", "vfile": "^6.0.3", "vite": "^7.3.2", "vitefu": "^1.1.2", "xxhash-wasm": "^1.1.0", "yargs-parser": "^22.0.0", "zod": "^4.3.6" }, "optionalDependencies": { "sharp": "^0.34.0" }, "bin": { "astro": "./bin/astro.mjs" } }, "sha512-48OBTBKR9ctbf+DQxpOuxGl8ebfn59zTuNQMBzptmG/Mi/H8IdfMSbJgGuX1I/4U6g9yazG1p4BHlf4+2hWU4Q=="],
"axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
"bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="],
"boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="],
"ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="],
"character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="],
"character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="],
"character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="],
"chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
"ci-info": ["ci-info@4.4.0", "", {}, "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg=="],
"cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="],
"clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
"color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
"color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
"comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="],
"commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="],
"common-ancestor-path": ["common-ancestor-path@2.0.0", "", {}, "sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng=="],
"cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="],
"cookie-es": ["cookie-es@1.2.3", "", {}, "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw=="],
"crossws": ["crossws@0.3.5", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA=="],
"css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="],
"css-tree": ["css-tree@3.2.1", "", { "dependencies": { "mdn-data": "2.27.1", "source-map-js": "^1.2.1" } }, "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA=="],
"css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="],
"csso": ["csso@5.0.5", "", { "dependencies": { "css-tree": "~2.2.0" } }, "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ=="],
"debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
"decode-named-character-reference": ["decode-named-character-reference@1.3.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q=="],
"defu": ["defu@6.1.7", "", {}, "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ=="],
"dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="],
"destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="],
"detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
"devalue": ["devalue@5.8.1", "", {}, "sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw=="],
"devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="],
"diff": ["diff@8.0.4", "", {}, "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw=="],
"dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="],
"domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="],
"domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="],
"domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="],
"dset": ["dset@3.1.4", "", {}, "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA=="],
"emmet": ["emmet@2.4.11", "", { "dependencies": { "@emmetio/abbreviation": "^2.3.3", "@emmetio/css-abbreviation": "^2.1.8" } }, "sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ=="],
"emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
"entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="],
"es-module-lexer": ["es-module-lexer@2.1.0", "", {}, "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ=="],
"esbuild": ["esbuild@0.27.7", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.7", "@esbuild/android-arm": "0.27.7", "@esbuild/android-arm64": "0.27.7", "@esbuild/android-x64": "0.27.7", "@esbuild/darwin-arm64": "0.27.7", "@esbuild/darwin-x64": "0.27.7", "@esbuild/freebsd-arm64": "0.27.7", "@esbuild/freebsd-x64": "0.27.7", "@esbuild/linux-arm": "0.27.7", "@esbuild/linux-arm64": "0.27.7", "@esbuild/linux-ia32": "0.27.7", "@esbuild/linux-loong64": "0.27.7", "@esbuild/linux-mips64el": "0.27.7", "@esbuild/linux-ppc64": "0.27.7", "@esbuild/linux-riscv64": "0.27.7", "@esbuild/linux-s390x": "0.27.7", "@esbuild/linux-x64": "0.27.7", "@esbuild/netbsd-arm64": "0.27.7", "@esbuild/netbsd-x64": "0.27.7", "@esbuild/openbsd-arm64": "0.27.7", "@esbuild/openbsd-x64": "0.27.7", "@esbuild/openharmony-arm64": "0.27.7", "@esbuild/sunos-x64": "0.27.7", "@esbuild/win32-arm64": "0.27.7", "@esbuild/win32-ia32": "0.27.7", "@esbuild/win32-x64": "0.27.7" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w=="],
"escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
"escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="],
"estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],
"eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="],
"extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="],
"fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
"fast-string-truncated-width": ["fast-string-truncated-width@3.0.3", "", {}, "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g=="],
"fast-string-width": ["fast-string-width@3.0.2", "", { "dependencies": { "fast-string-truncated-width": "^3.0.2" } }, "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg=="],
"fast-uri": ["fast-uri@3.1.2", "", {}, "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ=="],
"fast-wrap-ansi": ["fast-wrap-ansi@0.2.2", "", { "dependencies": { "fast-string-width": "^3.0.2" } }, "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q=="],
"fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
"flattie": ["flattie@1.1.1", "", {}, "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ=="],
"fontace": ["fontace@0.4.1", "", { "dependencies": { "fontkitten": "^1.0.2" } }, "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw=="],
"fontkitten": ["fontkitten@1.0.3", "", { "dependencies": { "tiny-inflate": "^1.0.3" } }, "sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw=="],
"fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
"lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "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" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="],
"get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="],
"lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="],
"get-tsconfig": ["get-tsconfig@5.0.0-beta.4", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ=="],
"lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="],
"github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="],
"lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="],
"h3": ["h3@1.15.11", "", { "dependencies": { "cookie-es": "^1.2.3", "crossws": "^0.3.5", "defu": "^6.1.6", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.4", "radix3": "^1.1.2", "ufo": "^1.6.3", "uncrypto": "^0.1.3" } }, "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg=="],
"lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="],
"hast-util-from-html": ["hast-util-from-html@2.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "devlop": "^1.1.0", "hast-util-from-parse5": "^8.0.0", "parse5": "^7.0.0", "vfile": "^6.0.0", "vfile-message": "^4.0.0" } }, "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw=="],
"lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="],
"hast-util-from-parse5": ["hast-util-from-parse5@8.0.3", "", { "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" } }, "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg=="],
"lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="],
"hast-util-is-element": ["hast-util-is-element@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g=="],
"lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="],
"hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="],
"lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="],
"hast-util-raw": ["hast-util-raw@9.1.0", "", { "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" } }, "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw=="],
"lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="],
"hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "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" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="],
"lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="],
"hast-util-to-parse5": ["hast-util-to-parse5@8.0.1", "", { "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" } }, "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA=="],
"lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="],
"hast-util-to-text": ["hast-util-to-text@4.0.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "hast-util-is-element": "^3.0.0", "unist-util-find-after": "^5.0.0" } }, "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A=="],
"hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="],
"hastscript": ["hastscript@9.0.1", "", { "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" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="],
"html-escaper": ["html-escaper@3.0.3", "", {}, "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ=="],
"html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="],
"http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="],
"iron-webcrypto": ["iron-webcrypto@1.2.1", "", {}, "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="],
"is-docker": ["is-docker@4.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA=="],
"is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
"is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="],
"is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="],
"is-wsl": ["is-wsl@3.1.1", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw=="],
"js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="],
"json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
"jsonc-parser": ["jsonc-parser@3.3.1", "", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="],
"kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="],
"longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="],
"lru-cache": ["lru-cache@11.5.1", "", {}, "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A=="],
"magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
"magicast": ["magicast@0.5.3", "", { "dependencies": { "@babel/parser": "^7.29.3", "@babel/types": "^7.29.0", "source-map-js": "^1.2.1" } }, "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw=="],
"markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="],
"mdast-util-definitions": ["mdast-util-definitions@6.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ=="],
"mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.2", "", { "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" } }, "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg=="],
"mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.3", "", { "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" } }, "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q=="],
"mdast-util-gfm": ["mdast-util-gfm@3.1.0", "", { "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" } }, "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ=="],
"mdast-util-gfm-autolink-literal": ["mdast-util-gfm-autolink-literal@2.0.1", "", { "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" } }, "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ=="],
"mdast-util-gfm-footnote": ["mdast-util-gfm-footnote@2.1.0", "", { "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" } }, "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ=="],
"mdast-util-gfm-strikethrough": ["mdast-util-gfm-strikethrough@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg=="],
"mdast-util-gfm-table": ["mdast-util-gfm-table@2.0.0", "", { "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" } }, "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg=="],
"mdast-util-gfm-task-list-item": ["mdast-util-gfm-task-list-item@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ=="],
"mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="],
"mdast-util-to-hast": ["mdast-util-to-hast@13.2.1", "", { "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" } }, "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA=="],
"mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.2", "", { "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" } }, "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA=="],
"mdast-util-to-string": ["mdast-util-to-string@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="],
"mdn-data": ["mdn-data@2.27.1", "", {}, "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ=="],
"micromark": ["micromark@4.0.2", "", { "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" } }, "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA=="],
"micromark-core-commonmark": ["micromark-core-commonmark@2.0.3", "", { "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" } }, "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg=="],
"micromark-extension-gfm": ["micromark-extension-gfm@3.0.0", "", { "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" } }, "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w=="],
"micromark-extension-gfm-autolink-literal": ["micromark-extension-gfm-autolink-literal@2.1.0", "", { "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" } }, "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw=="],
"micromark-extension-gfm-footnote": ["micromark-extension-gfm-footnote@2.1.0", "", { "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" } }, "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw=="],
"micromark-extension-gfm-strikethrough": ["micromark-extension-gfm-strikethrough@2.1.0", "", { "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" } }, "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw=="],
"micromark-extension-gfm-table": ["micromark-extension-gfm-table@2.1.1", "", { "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" } }, "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg=="],
"micromark-extension-gfm-tagfilter": ["micromark-extension-gfm-tagfilter@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg=="],
"micromark-extension-gfm-task-list-item": ["micromark-extension-gfm-task-list-item@2.1.0", "", { "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" } }, "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw=="],
"micromark-factory-destination": ["micromark-factory-destination@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA=="],
"micromark-factory-label": ["micromark-factory-label@2.0.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg=="],
"micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="],
"micromark-factory-title": ["micromark-factory-title@2.0.1", "", { "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" } }, "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw=="],
"micromark-factory-whitespace": ["micromark-factory-whitespace@2.0.1", "", { "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" } }, "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ=="],
"micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="],
"micromark-util-chunked": ["micromark-util-chunked@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA=="],
"micromark-util-classify-character": ["micromark-util-classify-character@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q=="],
"micromark-util-combine-extensions": ["micromark-util-combine-extensions@2.0.1", "", { "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg=="],
"micromark-util-decode-numeric-character-reference": ["micromark-util-decode-numeric-character-reference@2.0.2", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw=="],
"micromark-util-decode-string": ["micromark-util-decode-string@2.0.1", "", { "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" } }, "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ=="],
"micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="],
"micromark-util-html-tag-name": ["micromark-util-html-tag-name@2.0.1", "", {}, "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA=="],
"micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q=="],
"micromark-util-resolve-all": ["micromark-util-resolve-all@2.0.1", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg=="],
"micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="],
"micromark-util-subtokenize": ["micromark-util-subtokenize@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA=="],
"micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="],
"micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="],
"mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="],
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
"muggle-string": ["muggle-string@0.4.1", "", {}, "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ=="],
"nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
"neotraverse": ["neotraverse@0.6.18", "", {}, "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA=="],
"nlcst-to-string": ["nlcst-to-string@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0" } }, "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA=="],
"node-fetch-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="],
"node-mock-http": ["node-mock-http@1.0.4", "", {}, "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ=="],
"normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="],
"nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="],
"obug": ["obug@2.1.3", "", {}, "sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg=="],
"ofetch": ["ofetch@1.5.1", "", { "dependencies": { "destr": "^2.0.5", "node-fetch-native": "^1.6.7", "ufo": "^1.6.1" } }, "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA=="],
"ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="],
"oniguruma-parser": ["oniguruma-parser@0.12.2", "", {}, "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw=="],
"oniguruma-to-es": ["oniguruma-to-es@4.3.6", "", { "dependencies": { "oniguruma-parser": "^0.12.2", "regex": "^6.1.0", "regex-recursion": "^6.0.2" } }, "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA=="],
"p-limit": ["p-limit@7.3.0", "", { "dependencies": { "yocto-queue": "^1.2.1" } }, "sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw=="],
"p-queue": ["p-queue@9.3.0", "", { "dependencies": { "eventemitter3": "^5.0.4", "p-timeout": "^7.0.0" } }, "sha512-7NED7xhQ74Ngp4JP/2e0VZHp7vSWfJfqeiR92jPgxsz6m0Se4P03YoTKa9dDXyZ3r6P616gUXttrB6nnHYKang=="],
"p-timeout": ["p-timeout@7.0.1", "", {}, "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg=="],
"package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="],
"parse-latin": ["parse-latin@7.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "@types/unist": "^3.0.0", "nlcst-to-string": "^4.0.0", "unist-util-modify-children": "^4.0.0", "unist-util-visit-children": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ=="],
"parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="],
"path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="],
"piccolore": ["piccolore@0.1.3", "", {}, "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw=="],
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
"picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="],
"postcss": ["postcss@8.5.12", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA=="],
"react": ["react@19.2.4", "", {}, "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ=="],
"prettier": ["prettier@3.8.4", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-N2MylSdi48+5N/6S5j+maeHbUSIzzZ5uOcX5Hm4QpV8Dkb1HFjfAKTKX6yNPJQD9AhcT3ifHNB66tWTTJDi11Q=="],
"react-dom": ["react-dom@19.2.4", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.4" } }, "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ=="],
"prismjs": ["prismjs@1.30.0", "", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="],
"rolldown": ["rolldown@1.0.0-rc.17", "", { "dependencies": { "@oxc-project/types": "=0.127.0", "@rolldown/pluginutils": "1.0.0-rc.17" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-rc.17", "@rolldown/binding-darwin-arm64": "1.0.0-rc.17", "@rolldown/binding-darwin-x64": "1.0.0-rc.17", "@rolldown/binding-freebsd-x64": "1.0.0-rc.17", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.17", "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.17", "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.17", "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.17", "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.17", "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.17", "@rolldown/binding-linux-x64-musl": "1.0.0-rc.17", "@rolldown/binding-openharmony-arm64": "1.0.0-rc.17", "@rolldown/binding-wasm32-wasi": "1.0.0-rc.17", "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.17", "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.17" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA=="],
"property-information": ["property-information@7.2.0", "", {}, "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg=="],
"scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="],
"radix3": ["radix3@1.1.2", "", {}, "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="],
"readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="],
"regex": ["regex@6.1.0", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg=="],
"regex-recursion": ["regex-recursion@6.0.2", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="],
"regex-utilities": ["regex-utilities@2.3.0", "", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="],
"rehype": ["rehype@13.0.2", "", { "dependencies": { "@types/hast": "^3.0.0", "rehype-parse": "^9.0.0", "rehype-stringify": "^10.0.0", "unified": "^11.0.0" } }, "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A=="],
"rehype-parse": ["rehype-parse@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-from-html": "^2.0.0", "unified": "^11.0.0" } }, "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag=="],
"rehype-raw": ["rehype-raw@7.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-raw": "^9.0.0", "vfile": "^6.0.0" } }, "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww=="],
"rehype-stringify": ["rehype-stringify@10.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-to-html": "^9.0.0", "unified": "^11.0.0" } }, "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA=="],
"remark-gfm": ["remark-gfm@4.0.1", "", { "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" } }, "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg=="],
"remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="],
"remark-rehype": ["remark-rehype@11.1.2", "", { "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" } }, "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw=="],
"remark-smartypants": ["remark-smartypants@3.0.2", "", { "dependencies": { "retext": "^9.0.0", "retext-smartypants": "^6.0.0", "unified": "^11.0.4", "unist-util-visit": "^5.0.0" } }, "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA=="],
"remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="],
"request-light": ["request-light@0.7.0", "", {}, "sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q=="],
"require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="],
"require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
"resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="],
"retext": ["retext@9.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "retext-latin": "^4.0.0", "retext-stringify": "^4.0.0", "unified": "^11.0.0" } }, "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA=="],
"retext-latin": ["retext-latin@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "parse-latin": "^7.0.0", "unified": "^11.0.0" } }, "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA=="],
"retext-smartypants": ["retext-smartypants@6.2.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "nlcst-to-string": "^4.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ=="],
"retext-stringify": ["retext-stringify@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "nlcst-to-string": "^4.0.0", "unified": "^11.0.0" } }, "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA=="],
"rollup": ["rollup@4.61.1", "", { "dependencies": { "@types/estree": "1.0.9" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.61.1", "@rollup/rollup-android-arm64": "4.61.1", "@rollup/rollup-darwin-arm64": "4.61.1", "@rollup/rollup-darwin-x64": "4.61.1", "@rollup/rollup-freebsd-arm64": "4.61.1", "@rollup/rollup-freebsd-x64": "4.61.1", "@rollup/rollup-linux-arm-gnueabihf": "4.61.1", "@rollup/rollup-linux-arm-musleabihf": "4.61.1", "@rollup/rollup-linux-arm64-gnu": "4.61.1", "@rollup/rollup-linux-arm64-musl": "4.61.1", "@rollup/rollup-linux-loong64-gnu": "4.61.1", "@rollup/rollup-linux-loong64-musl": "4.61.1", "@rollup/rollup-linux-ppc64-gnu": "4.61.1", "@rollup/rollup-linux-ppc64-musl": "4.61.1", "@rollup/rollup-linux-riscv64-gnu": "4.61.1", "@rollup/rollup-linux-riscv64-musl": "4.61.1", "@rollup/rollup-linux-s390x-gnu": "4.61.1", "@rollup/rollup-linux-x64-gnu": "4.61.1", "@rollup/rollup-linux-x64-musl": "4.61.1", "@rollup/rollup-openbsd-x64": "4.61.1", "@rollup/rollup-openharmony-arm64": "4.61.1", "@rollup/rollup-win32-arm64-msvc": "4.61.1", "@rollup/rollup-win32-ia32-msvc": "4.61.1", "@rollup/rollup-win32-x64-gnu": "4.61.1", "@rollup/rollup-win32-x64-msvc": "4.61.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-I4KW6iuRpuu2uHBLraZ1wNZe0DP7lnRha+VJ9tNaYVaVgKhW0aI3h4RYnoRPeql0flHm/Co55b7snEDcOfOJrA=="],
"sax": ["sax@1.6.0", "", {}, "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA=="],
"semver": ["semver@7.8.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA=="],
"sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "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" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="],
"shiki": ["shiki@4.2.0", "", { "dependencies": { "@shikijs/core": "4.2.0", "@shikijs/engine-javascript": "4.2.0", "@shikijs/engine-oniguruma": "4.2.0", "@shikijs/langs": "4.2.0", "@shikijs/themes": "4.2.0", "@shikijs/types": "4.2.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-hjNax6o/ylDy9lefQEaSDtzaT3iVNtZ3WmpQnbuQNoG4xvnSKf2kSKbihZVO4JRG1TTMejs7CmNRYlWgAL66pQ=="],
"sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="],
"sitemap": ["sitemap@9.0.1", "", { "dependencies": { "@types/node": "^24.9.2", "@types/sax": "^1.2.1", "arg": "^5.0.0", "sax": "^1.4.1" }, "bin": { "sitemap": "dist/esm/cli.js" } }, "sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ=="],
"smol-toml": ["smol-toml@1.6.1", "", {}, "sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg=="],
"source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
"space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="],
"stream-replace-string": ["stream-replace-string@2.0.0", "", {}, "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w=="],
"string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
"stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="],
"strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
"svgo": ["svgo@4.0.1", "", { "dependencies": { "commander": "^11.1.0", "css-select": "^5.1.0", "css-tree": "^3.0.1", "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.1.1", "sax": "^1.5.0" }, "bin": "./bin/svgo.js" }, "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w=="],
"tiny-inflate": ["tiny-inflate@1.0.3", "", {}, "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="],
"tinyclip": ["tinyclip@0.1.14", "", {}, "sha512-F1oWdz8tjT17qe1d5JgDK6z03WGOhYYAN0lK3/D/fzNiy93xswLLEw7pk+3g05onhAy6Bsc6PLNUGhdgVjemMQ=="],
"tinyexec": ["tinyexec@1.2.4", "", {}, "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg=="],
"tinyglobby": ["tinyglobby@0.2.16", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg=="],
"trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="],
"trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="],
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
"typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="],
"typesafe-path": ["typesafe-path@0.2.2", "", {}, "sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA=="],
"vite": ["vite@8.0.10", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.10", "rolldown": "1.0.0-rc.17", "tinyglobby": "^0.2.16" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.1.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw=="],
"typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
"rolldown/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.17", "", {}, "sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg=="],
"typescript-auto-import-cache": ["typescript-auto-import-cache@0.3.6", "", { "dependencies": { "semver": "^7.3.8" } }, "sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ=="],
"ufo": ["ufo@1.6.4", "", {}, "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA=="],
"ultrahtml": ["ultrahtml@1.6.0", "", {}, "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw=="],
"uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="],
"undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="],
"unified": ["unified@11.0.5", "", { "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" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="],
"unifont": ["unifont@0.7.4", "", { "dependencies": { "css-tree": "^3.1.0", "ofetch": "^1.5.1", "ohash": "^2.0.11" } }, "sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg=="],
"unist-util-find-after": ["unist-util-find-after@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ=="],
"unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="],
"unist-util-modify-children": ["unist-util-modify-children@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "array-iterate": "^2.0.0" } }, "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw=="],
"unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="],
"unist-util-remove-position": ["unist-util-remove-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q=="],
"unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="],
"unist-util-visit": ["unist-util-visit@5.1.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg=="],
"unist-util-visit-children": ["unist-util-visit-children@3.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA=="],
"unist-util-visit-parents": ["unist-util-visit-parents@6.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ=="],
"unstorage": ["unstorage@1.17.5", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^5.0.0", "destr": "^2.0.5", "h3": "^1.15.10", "lru-cache": "^11.2.7", "node-fetch-native": "^1.6.7", "ofetch": "^1.5.1", "ufo": "^1.6.3" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", "@azure/cosmos": "^4.2.0", "@azure/data-tables": "^13.3.0", "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", "@capacitor/preferences": "^6 || ^7 || ^8", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/functions": "^2.2.12 || ^3.0.0", "@vercel/kv": "^1 || ^2 || ^3", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", "ioredis": "^5.4.2", "uploadthing": "^7.4.4" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/functions", "@vercel/kv", "aws4fetch", "db0", "idb-keyval", "ioredis", "uploadthing"] }, "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg=="],
"vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="],
"vfile-location": ["vfile-location@5.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg=="],
"vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="],
"vite": ["vite@7.3.5", "", { "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-KuOaNhcnGFN2zIPGA7wRmzF+lJA1sea7rHq17aiJ++9lzY1WWG6Jpwqwe1KNbRVPIqHmr8GLYx7jbrQcN/7/ww=="],
"vitefu": ["vitefu@1.1.3", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["vite"] }, "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg=="],
"volar-service-css": ["volar-service-css@0.0.70", "", { "dependencies": { "vscode-css-languageservice": "^6.3.0", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-K1qyOvBpE3rzdAv3e4/6Rv5yizrYPy5R/ne3IWCAzLBuMO4qBMV3kSqWzj6KUVe6S0AnN6wxF7cRkiaKfYMYJw=="],
"volar-service-emmet": ["volar-service-emmet@0.0.70", "", { "dependencies": { "@emmetio/css-parser": "^0.4.1", "@emmetio/html-matcher": "^1.3.0", "@vscode/emmet-helper": "^2.9.3", "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-xi5bC4m/VyE3zy/n2CXspKeDZs3qA41tHLTw275/7dNWM/RqE2z3BnDICQybHIVp/6G1iOQj5c1qXMgQC08TNg=="],
"volar-service-html": ["volar-service-html@0.0.70", "", { "dependencies": { "vscode-html-languageservice": "^5.3.0", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-eR6vCgMdmYAo4n+gcT7DSyBQbwB8S3HZZvSagTf0sxNaD4WppMCFfpqWnkrlGStPKMZvMiejRRVmqsX9dYcTvQ=="],
"volar-service-prettier": ["volar-service-prettier@0.0.70", "", { "dependencies": { "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0", "prettier": "^2.2 || ^3.0" }, "optionalPeers": ["@volar/language-service", "prettier"] }, "sha512-Z6BCFSpGVCd8BPAsZ785Kce1BGlWd5ODqmqZGVuB14MJvrR4+CYz6cDy4F+igmE1gMifqfvMhdgT8Aud4M5ngg=="],
"volar-service-typescript": ["volar-service-typescript@0.0.70", "", { "dependencies": { "path-browserify": "^1.0.1", "semver": "^7.6.2", "typescript-auto-import-cache": "^0.3.5", "vscode-languageserver-textdocument": "^1.0.11", "vscode-nls": "^5.2.0", "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-l46Bx4cokkUedTd74ojO5H/zqHZJ8SUuyZ0IB8JN4jfRqUM3bQFBHoOwlZCyZmOeO0A3RQNkMnFclxO4c++gsg=="],
"volar-service-typescript-twoslash-queries": ["volar-service-typescript-twoslash-queries@0.0.70", "", { "dependencies": { "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-IdD13Z9N2Bu8EM6CM0fDV1E69olEYGHDU25X51YXmq8Y0CmJ2LNj6gOiBJgpS5JGUqFzECVhMNBW7R0sPdRTMQ=="],
"volar-service-yaml": ["volar-service-yaml@0.0.70", "", { "dependencies": { "vscode-uri": "^3.0.8", "yaml-language-server": "~1.20.0" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-0c8bXDBeoATF9F6iPIlOuYTuZAC4c+yi0siQo920u7eiBJk8oQmUmg9cDUbR4+Gl++bvGP4plj3fErbJuPqdcQ=="],
"vscode-css-languageservice": ["vscode-css-languageservice@6.3.10", "", { "dependencies": { "@vscode/l10n": "^0.0.18", "vscode-languageserver-textdocument": "^1.0.12", "vscode-languageserver-types": "3.17.5", "vscode-uri": "^3.1.0" } }, "sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA=="],
"vscode-html-languageservice": ["vscode-html-languageservice@5.6.2", "", { "dependencies": { "@vscode/l10n": "^0.0.18", "vscode-languageserver-textdocument": "^1.0.12", "vscode-languageserver-types": "^3.17.5", "vscode-uri": "^3.1.0" } }, "sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg=="],
"vscode-json-languageservice": ["vscode-json-languageservice@4.1.8", "", { "dependencies": { "jsonc-parser": "^3.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-languageserver-types": "^3.16.0", "vscode-nls": "^5.0.0", "vscode-uri": "^3.0.2" } }, "sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg=="],
"vscode-jsonrpc": ["vscode-jsonrpc@9.0.0", "", {}, "sha512-+VvMmQPJhtvJ+8O+zu2JKIRiLxXF8NW7krWgyMGeOHrp4Cn23T5hc0v2LknNeopDOB70wghHAds7mKtcZ0I4Sg=="],
"vscode-languageserver": ["vscode-languageserver@9.0.1", "", { "dependencies": { "vscode-languageserver-protocol": "3.17.5" }, "bin": { "installServerIntoExtension": "bin/installServerIntoExtension" } }, "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g=="],
"vscode-languageserver-protocol": ["vscode-languageserver-protocol@3.18.0", "", { "dependencies": { "vscode-jsonrpc": "9.0.0", "vscode-languageserver-types": "3.18.0" } }, "sha512-Zdz+kJ12Iz6tc11xfZyEo501bBATHXrCjmMfnaR3pMnf1CoqZBKIynba3P+/bi9VEdrMbNtAVKYpKhbODvqy+Q=="],
"vscode-languageserver-textdocument": ["vscode-languageserver-textdocument@1.0.12", "", {}, "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA=="],
"vscode-languageserver-types": ["vscode-languageserver-types@3.18.0", "", {}, "sha512-8TsGPNMIMiiBdkORgRSvLjuiEIiAFtO+KssmYWxQ+uSVvlf7RjK8YKCOjPzZ+YA04jXEV7+7LvkSmHkhpNS99g=="],
"vscode-nls": ["vscode-nls@5.2.0", "", {}, "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng=="],
"vscode-uri": ["vscode-uri@3.1.0", "", {}, "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ=="],
"web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="],
"which-pm-runs": ["which-pm-runs@1.1.0", "", {}, "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA=="],
"wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
"xxhash-wasm": ["xxhash-wasm@1.1.0", "", {}, "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA=="],
"y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="],
"yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="],
"yaml-language-server": ["yaml-language-server@1.20.0", "", { "dependencies": { "@vscode/l10n": "^0.0.18", "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "prettier": "^3.5.0", "request-light": "^0.5.7", "vscode-json-languageservice": "4.1.8", "vscode-languageserver": "^9.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-languageserver-types": "^3.16.0", "vscode-uri": "^3.0.2", "yaml": "2.7.1" }, "bin": { "yaml-language-server": "bin/yaml-language-server" } }, "sha512-qhjK/bzSRZ6HtTvgeFvjNPJGWdZ0+x5NREV/9XZWFjIGezew2b4r5JPy66IfOhd5OA7KeFwk1JfmEbnTvev0cA=="],
"yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="],
"yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="],
"yocto-queue": ["yocto-queue@1.2.2", "", {}, "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ=="],
"zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="],
"zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="],
"@astrojs/language-server/@astrojs/compiler": ["@astrojs/compiler@2.13.1", "", {}, "sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg=="],
"@vscode/emmet-helper/jsonc-parser": ["jsonc-parser@2.3.1", "", {}, "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg=="],
"anymatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
"csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="],
"dom-serializer/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="],
"is-inside-container/is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="],
"unstorage/chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="],
"vscode-css-languageservice/vscode-languageserver-types": ["vscode-languageserver-types@3.17.5", "", {}, "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg=="],
"vscode-languageserver/vscode-languageserver-protocol": ["vscode-languageserver-protocol@3.17.5", "", { "dependencies": { "vscode-jsonrpc": "8.2.0", "vscode-languageserver-types": "3.17.5" } }, "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg=="],
"yaml-language-server/request-light": ["request-light@0.5.8", "", {}, "sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg=="],
"yaml-language-server/yaml": ["yaml@2.7.1", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ=="],
"yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],
"csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="],
"unstorage/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="],
"vscode-languageserver/vscode-languageserver-protocol/vscode-jsonrpc": ["vscode-jsonrpc@8.2.0", "", {}, "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA=="],
"vscode-languageserver/vscode-languageserver-protocol/vscode-languageserver-types": ["vscode-languageserver-types@3.17.5", "", {}, "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg=="],
}
}
-40
View File
@@ -1,40 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
<meta name="description" content="openclaude — runs anywhere, uses anything. open source, model-neutral, terminal-first. by gitlawb." />
<meta name="theme-color" content="#fafaf7" />
<meta name="color-scheme" content="light dark" />
<meta property="og:title" content="openclaude — runs anywhere, uses anything" />
<meta property="og:description" content="not a chatbot wrapper or another ide plugin. an open coding agent that runs in your terminal, talks to any model, and keeps every change reviewable." />
<meta property="og:type" content="website" />
<meta property="og:site_name" content="openclaude" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="openclaude — runs anywhere, uses anything" />
<meta name="twitter:description" content="not a chatbot wrapper or another ide plugin. open coding agents in your terminal, on any model." />
<title>openclaude — runs anywhere, uses anything</title>
<link rel="icon" type="image/png" href="/openclaude.png" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;500;600;700&display=swap" />
<script>
// Theme bootstrap — runs before paint to prevent flash.
// Default is light; user toggle is honored via localStorage.
(function () {
try {
var stored = localStorage.getItem('openclaude-theme');
var theme = stored === 'dark' || stored === 'light' ? stored : 'light';
document.documentElement.dataset.theme = theme;
document.documentElement.style.colorScheme = theme;
} catch (_) {
document.documentElement.dataset.theme = 'light';
}
})();
</script>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>
+10 -12
View File
@@ -1,21 +1,19 @@
{
"name": "openclaude-web",
"version": "0.1.0",
"version": "0.2.0",
"private": true,
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc --noEmit && vite build",
"preview": "vite preview",
"typecheck": "tsc --noEmit"
"dev": "astro dev",
"build": "astro check && astro build",
"preview": "astro preview",
"typecheck": "astro check"
},
"dependencies": {
"@types/react": "19.2.14",
"@types/react-dom": "19.2.3",
"@vitejs/plugin-react": "6.0.1",
"react": "19.2.4",
"react-dom": "19.2.4",
"typescript": "6.0.3",
"vite": "8.0.10"
"@astrojs/check": "0.9.9",
"@astrojs/sitemap": "3.7.3",
"@fontsource-variable/geist-mono": "^5.2.5",
"astro": "6.4.6",
"typescript": "^5.8.3"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

+21
View File
@@ -0,0 +1,21 @@
<svg width="1024" height="1024" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<!-- black square ground, matching gitlawb's white-on-black mark -->
<rect width="1024" height="1024" fill="#000000"/>
<!-- terminal window: sharp corners, thick uniform stroke -->
<rect x="292" y="180" width="440" height="400" fill="none" stroke="#ffffff" stroke-width="36"/>
<!-- eyes: hollow circuit nodes -->
<circle cx="432" cy="330" r="32" fill="none" stroke="#ffffff" stroke-width="28"/>
<circle cx="592" cy="330" r="32" fill="none" stroke="#ffffff" stroke-width="28"/>
<!-- mouth: >_ prompt -->
<polyline points="424,420 482,460 424,500" fill="none" stroke="#ffffff" stroke-width="30" stroke-linecap="square"/>
<line x1="520" y1="500" x2="600" y2="500" stroke="#ffffff" stroke-width="30" stroke-linecap="square"/>
<!-- git-fork trace descending from the terminal: openclaude on the gitlawb network -->
<polyline points="512,598 512,688 416,784" fill="none" stroke="#ff7a1a" stroke-width="36" stroke-linejoin="miter"/>
<line x1="512" y1="688" x2="608" y2="784" stroke="#ff7a1a" stroke-width="36" stroke-linecap="butt"/>
<circle cx="384" cy="816" r="46" fill="none" stroke="#ff7a1a" stroke-width="36"/>
<circle cx="640" cy="816" r="46" fill="none" stroke="#ff7a1a" stroke-width="36"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 21 KiB

+4
View File
@@ -0,0 +1,4 @@
User-agent: *
Allow: /
Sitemap: https://openclaude.gitlawb.com/sitemap-index.xml
-196
View File
@@ -1,196 +0,0 @@
import { useEffect, useState } from 'react'
import './styles.css'
import { features, installCommand, navLinks } from './content'
type Theme = 'light' | 'dark'
function readInitialTheme(): Theme {
if (typeof document === 'undefined') return 'light'
const attr = document.documentElement.dataset.theme
if (attr === 'light' || attr === 'dark') return attr
return 'light'
}
function App() {
const [theme, setTheme] = useState<Theme>(readInitialTheme)
useEffect(() => {
document.documentElement.dataset.theme = theme
document.documentElement.style.colorScheme = theme
try {
localStorage.setItem('openclaude-theme', theme)
} catch {
/* storage unavailable */
}
}, [theme])
const toggleTheme = () => setTheme(t => (t === 'dark' ? 'light' : 'dark'))
return (
<div className="site-shell">
<header className="site-header">
<nav className="nav" aria-label="primary">
<a className="brand" href="/" aria-label="openclaude home">
<img src="/openclaude.png" alt="" />
<span>openclaude</span>
<span className="ver">v0.7</span>
</a>
<div className="nav-right">
<div className="nav-links">
{navLinks.map(l => (
<a key={l.href} href={l.href}>{l.label}</a>
))}
</div>
<button
type="button"
className="theme-toggle"
onClick={toggleTheme}
aria-label={`switch to ${theme === 'dark' ? 'light' : 'dark'} mode`}
title={`switch to ${theme === 'dark' ? 'light' : 'dark'} mode`}
>
{theme === 'dark' ? '☀' : '☾'}
</button>
</div>
</nav>
<div className="nav-rule" aria-hidden="true" />
</header>
<main className="shell-main">
<Hero />
<section id="features" className="features" aria-labelledby="features-heading">
<div className="section-head">
<p className="eyebrow">// features</p>
<h2 id="features-heading">built for agents that ship code.</h2>
</div>
<ul className="feature-list">
{features.map(f => (
<li key={f.title} className="feature-row">
<h3>{f.title}</h3>
<p> {f.body}</p>
</li>
))}
</ul>
</section>
<section id="install" className="install-block" aria-labelledby="install-heading">
<div className="section-head">
<p className="eyebrow">// install</p>
<h2 id="install-heading">one line. then write a task.</h2>
</div>
<div className="install-grid">
<CopyableCommand command={installCommand} />
<ol className="install-steps">
<li>
<span className="step-num">01</span>
<div>
<strong>install</strong>
<p>requires node 20.</p>
</div>
</li>
<li>
<span className="step-num">02</span>
<div>
<strong>start</strong>
<p>run <code>openclaude</code> in any repo.</p>
</div>
</li>
<li>
<span className="step-num">03</span>
<div>
<strong>pick a provider</strong>
<p>type <code>/provider</code> to wire openai, ollama, gemini, or a gateway.</p>
</div>
</li>
</ol>
</div>
</section>
</main>
<footer className="footer">
<div className="footer-line">
<span className="brand">
<img src="/openclaude.png" alt="" />
<span>openclaude</span>
<span className="ver">v0.7.0</span>
</span>
<span className="sep">|</span>
<a href="https://gitlawb.com">gitlawb </a>
<span className="sep">|</span>
<a href="https://github.com/Gitlawb/openclaude/blob/main/LICENSE">license</a>
<span className="sep">·</span>
<span>{new Date().getFullYear()}</span>
</div>
</footer>
</div>
)
}
function Hero() {
return (
<section className="hero" aria-labelledby="hero-heading">
<div className="hero-eyebrow">
<span className="dot" aria-hidden="true" />
open source · gitlawb-aligned · model-neutral
</div>
<h1 id="hero-heading" className="hero-title">
runs anywhere.<br />
uses anything.
</h1>
<p className="hero-sub">
not a chatbot wrapper or another ide plugin. an open coding agent that runs in your
terminal, talks to any model, and keeps every change reviewable.
</p>
<div className="hero-cta">
<CopyableCommand command={installCommand} variant="hero" />
<a className="button button-ghost" href="https://github.com/Gitlawb/openclaude">
view on github
</a>
</div>
<p className="hero-foot">
works with openai, gemini, codex, ollama, lm studio, litellm, and 200+ models.
</p>
</section>
)
}
function CopyableCommand({
command,
variant,
}: {
command: string
variant?: 'hero'
}) {
const [copied, setCopied] = useState(false)
const onCopy = async () => {
try {
await navigator.clipboard.writeText(command)
setCopied(true)
window.setTimeout(() => setCopied(false), 1400)
} catch {
/* clipboard unavailable */
}
}
return (
<button
type="button"
onClick={onCopy}
className={['copy-cmd', variant === 'hero' ? 'copy-cmd-hero' : ''].filter(Boolean).join(' ')}
aria-label={`copy install command: ${command}`}
>
<span className="copy-prefix">$</span>
<span className="copy-text">{command}</span>
<span className="copy-icon" aria-hidden="true">
{copied ? '✓ copied' : 'copy'}
</span>
</button>
)
}
export default App
+35
View File
@@ -0,0 +1,35 @@
---
import { SITE } from '../data/site'
interface Crumb {
label: string
href: string
}
interface Props {
crumbs: Crumb[]
}
const { crumbs } = Astro.props
const jsonLd = {
'@context': 'https://schema.org',
'@type': 'BreadcrumbList',
itemListElement: crumbs.map((c, i) => ({
'@type': 'ListItem',
position: i + 1,
name: c.label,
item: new URL(c.href, SITE.url).href,
})),
}
---
<nav class="breadcrumbs" aria-label="breadcrumb">
{crumbs.map((c, i) => (
<>
{i > 0 && <span aria-hidden="true">/</span>}
{i < crumbs.length - 1 ? <a href={c.href}>{c.label}</a> : <span aria-current="page">{c.label}</span>}
</>
))}
</nav>
<script is:inline type="application/ld+json" set:html={JSON.stringify(jsonLd)} />
+44
View File
@@ -0,0 +1,44 @@
---
interface Props {
command: string
class?: string
}
const { command, class: className = '' } = Astro.props
---
<button
type="button"
class={`copy-cmd ${className}`.trim()}
data-copy={command}
aria-label={`copy command: ${command}`}
>
<span class="prefix" aria-hidden="true">$</span>
<span class="cmd">{command}</span>
<span class="hint" aria-hidden="true">copy</span>
<span class="visually-hidden" role="status" data-copy-status></span>
</button>
<script>
document.querySelectorAll<HTMLButtonElement>('[data-copy]').forEach(btn => {
btn.addEventListener('click', async () => {
const text = btn.dataset.copy
if (!text) return
try {
await navigator.clipboard.writeText(text)
const hint = btn.querySelector('.hint')
const status = btn.querySelector('[data-copy-status]')
btn.classList.add('copied')
if (hint) hint.textContent = '✓ copied'
if (status) status.textContent = 'copied to clipboard'
window.setTimeout(() => {
btn.classList.remove('copied')
if (hint) hint.textContent = 'copy'
if (status) status.textContent = ''
}, 1400)
} catch {
/* clipboard unavailable */
}
})
})
</script>
+24
View File
@@ -0,0 +1,24 @@
---
import { docsNav } from '../data/docsNav'
const path = Astro.url.pathname
---
<aside class="docs-sidebar">
<nav aria-label="docs">
{docsNav.map(group => (
<div>
<h4>{group.group}</h4>
<ul>
{group.items.map(item => (
<li>
<a href={item.href} aria-current={path === item.href ? 'page' : undefined}>
{item.title}
</a>
</li>
))}
</ul>
</div>
))}
</nav>
</aside>
+60
View File
@@ -0,0 +1,60 @@
---
export interface TocEntry {
id: string
label: string
depth?: 2 | 3
}
interface Props {
toc: TocEntry[]
}
const { toc } = Astro.props
---
{toc.length > 0 && (
<aside class="docs-toc">
<nav aria-label="on this page">
<h4>on this page</h4>
<ul>
{toc.map(entry => (
<li>
<a href={`#${entry.id}`} class={entry.depth === 3 ? 'depth-3' : undefined}>{entry.label}</a>
</li>
))}
</ul>
</nav>
</aside>
)}
<script>
const tocLinks = Array.from(
document.querySelectorAll<HTMLAnchorElement>('.docs-toc a[href^="#"]'),
)
if (tocLinks.length > 0) {
const byId = new Map(tocLinks.map(a => [a.hash.slice(1), a]))
const headings = Array.from(
document.querySelectorAll('.docs-article h2[id], .docs-article h3[id]'),
).filter(h => byId.has(h.id))
let active: HTMLAnchorElement | null = null
const setActive = (link: HTMLAnchorElement | null) => {
if (active === link) return
active?.classList.remove('active')
link?.classList.add('active')
active = link
}
const observer = new IntersectionObserver(
entries => {
for (const entry of entries) {
if (entry.isIntersecting) {
setActive(byId.get(entry.target.id) ?? null)
}
}
},
{ rootMargin: '-56px 0px -70% 0px' },
)
headings.forEach(h => observer.observe(h))
}
</script>
+73
View File
@@ -0,0 +1,73 @@
---
import { SITE } from '../data/site'
const columns = [
{
title: 'get started',
links: [
{ href: '/docs/', label: 'overview' },
{ href: '/docs/installation/', label: 'installation' },
{ href: '/docs/quickstart/', label: 'quickstart' },
{ href: '/docs/providers/', label: 'providers' },
],
},
{
title: 'reference',
links: [
{ href: '/docs/slash-commands/', label: 'slash commands' },
{ href: '/docs/cli-reference/', label: 'cli reference' },
{ href: '/docs/configuration/', label: 'configuration' },
{ href: '/docs/keybindings/', label: 'keybindings' },
{ href: '/docs/skills/', label: 'skills' },
],
},
{
title: 'project',
links: [
{ href: SITE.github, label: 'github' },
{ href: SITE.npmUrl, label: 'npm' },
{ href: `${SITE.github}/blob/main/LICENSE`, label: 'license' },
{ href: `${SITE.github}/issues`, label: 'issues' },
],
},
{
title: 'gitlawb',
links: [
{ href: SITE.gitlawb, label: 'gitlawb.com' },
{ href: SITE.gitlawbRepo, label: 'repo mirror' },
{ href: `${SITE.gitlawb}/architecture`, label: 'architecture' },
{ href: `${SITE.gitlawb}/agents`, label: 'agents' },
],
},
]
---
<footer class="site-footer">
<div class="container">
<div class="footer-grid">
{columns.map(col => (
<div class="footer-col">
<h4>{col.title}</h4>
<ul>
{col.links.map(l => (
<li>
<a href={l.href} rel={l.href.startsWith('http') ? 'noopener' : undefined}>{l.label}</a>
</li>
))}
</ul>
</div>
))}
</div>
<div class="footer-bottom">
<span class="brand">
<img src="/openclaude.png" alt="" width="18" height="18" />
<span>openclaude</span>
<span class="ver">v{SITE.version}</span>
</span>
<span class="sep">·</span>
<span>open source coding agent, aligned with <a href={SITE.gitlawb} rel="noopener">gitlawb</a></span>
<span class="sep">·</span>
<span>runs anywhere. uses anything.</span>
</div>
</div>
</footer>
+46
View File
@@ -0,0 +1,46 @@
---
import { SITE } from '../data/site'
interface Props {
title: string
description: string
ogImage?: string
type?: 'website' | 'article'
jsonLd?: object[]
}
const { title, description, ogImage = SITE.ogDefault, type = 'website', jsonLd = [] } = Astro.props
const canonical = new URL(Astro.url.pathname, SITE.url).href
const ogImageAbs = new URL(ogImage, SITE.url).href
---
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
<title>{title}</title>
<meta name="description" content={description} />
<link rel="canonical" href={canonical} />
<link rel="icon" type="image/svg+xml" href="/openclaude-logo.svg" />
<link rel="icon" type="image/png" href="/openclaude.png" />
<link rel="sitemap" href="/sitemap-index.xml" />
<meta name="theme-color" content="#000000" />
<meta name="color-scheme" content="dark light" />
<meta property="og:title" content={title} />
<meta property="og:description" content={description} />
<meta property="og:type" content={type} />
<meta property="og:url" content={canonical} />
<meta property="og:site_name" content={SITE.name} />
<meta property="og:image" content={ogImageAbs} />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:image:alt" content={`${SITE.name} — open-source coding agent CLI`} />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content={title} />
<meta name="twitter:description" content={description} />
<meta name="twitter:image" content={ogImageAbs} />
{jsonLd.map(block => (
<script is:inline type="application/ld+json" set:html={JSON.stringify(block)} />
))}
+89
View File
@@ -0,0 +1,89 @@
---
import { SITE } from '../data/site'
const links = [
{ href: '/docs/', label: 'docs' },
{ href: '/docs/slash-commands/', label: 'commands' },
{ href: '/docs/providers/', label: 'providers' },
{ href: SITE.github, label: 'github' },
{ href: SITE.gitlawb, label: 'gitlawb' },
]
const path = Astro.url.pathname
---
<header class="site-nav" id="site-nav">
<div class="container">
<a class="brand" href="/" aria-label="openclaude home">
<img src="/openclaude.png" alt="" width="22" height="22" />
<span>openclaude</span>
<span class="ver">v{SITE.version}</span>
</a>
<nav class="nav-links" aria-label="primary">
{links.map(l => (
<a
href={l.href}
aria-current={path === l.href ? 'page' : undefined}
rel={l.href.startsWith('http') ? 'noopener' : undefined}
>{l.label}</a>
))}
<button type="button" class="theme-toggle" data-theme-toggle aria-live="polite">[light]</button>
</nav>
<button type="button" class="nav-burger" data-menu-toggle aria-expanded="false" aria-controls="mobile-menu">
[menu]
</button>
</div>
<div class="mobile-menu" id="mobile-menu">
{links.map(l => (
<a href={l.href} rel={l.href.startsWith('http') ? 'noopener' : undefined}>{l.label}</a>
))}
<a href="#" data-theme-toggle role="button">[light]</a>
</div>
</header>
<script>
const KEY = 'oc-theme'
function currentTheme(): 'dark' | 'light' {
return document.documentElement.dataset.theme === 'light' ? 'light' : 'dark'
}
function renderToggles() {
const next = currentTheme() === 'dark' ? 'light' : 'dark'
document.querySelectorAll('[data-theme-toggle]').forEach(el => {
el.textContent = `[${next}]`
el.setAttribute('aria-label', `switch to ${next} theme`)
})
}
function applyTheme(theme: 'dark' | 'light') {
if (theme === 'dark') {
delete document.documentElement.dataset.theme
} else {
document.documentElement.dataset.theme = 'light'
}
document.documentElement.style.colorScheme = theme
try {
localStorage.setItem(KEY, theme)
} catch {
/* storage unavailable */
}
renderToggles()
}
document.querySelectorAll('[data-theme-toggle]').forEach(el => {
el.addEventListener('click', e => {
e.preventDefault()
applyTheme(currentTheme() === 'dark' ? 'light' : 'dark')
})
})
renderToggles()
const nav = document.getElementById('site-nav')
const burger = document.querySelector('[data-menu-toggle]')
burger?.addEventListener('click', () => {
const open = nav?.classList.toggle('menu-open') ?? false
burger.setAttribute('aria-expanded', String(open))
burger.textContent = open ? '[close]' : '[menu]'
})
</script>
+17
View File
@@ -0,0 +1,17 @@
---
interface Props {
title?: string
}
const { title = '~/your-repo' } = Astro.props
---
<div class="terminal" role="img" aria-label="terminal session showing openclaude editing code">
<div class="terminal-bar">
<span class="dots" aria-hidden="true"><i></i><i></i><i></i></span>
<span>{title}</span>
</div>
<div class="terminal-body">
<slot />
</div>
</div>
-35
View File
@@ -1,35 +0,0 @@
export const installCommand = 'npm install -g @gitlawb/openclaude@latest'
export const features = [
{
title: 'any model, one terminal',
body: 'local ollama, openai-compatible apis, gemini, codex, github models — switch with one command, no rewrites.',
},
{
title: 'real tools, not just chat',
body: 'bash, file edits, grep, glob, mcp servers, slash commands — wired into the agent loop, not bolted on.',
},
{
title: 'profiles per repo',
body: 'save model, base url, auth, and runtime defaults to .openclaude-profile.json so every clone boots the same way.',
},
{
title: 'streaming, not batch',
body: 'watch the agent think, call tools, and produce diffs live. no opaque background jobs.',
},
{
title: 'routes through a gateway',
body: 'plug into litellm, openrouter, or an internal proxy for policy, cost control, and failover.',
},
{
title: 'editor and server modes',
body: 'vs code extension and a grpc server so external systems can drive the same loop.',
},
] as const
export const navLinks = [
{ href: '#features', label: 'features' },
{ href: '#install', label: 'install' },
{ href: 'https://github.com/Gitlawb/openclaude', label: 'github' },
{ href: 'https://gitlawb.com/node/repos/z6MkqDnb/openclaude', label: 'gitlawb' },
] as const
+136
View File
@@ -0,0 +1,136 @@
// Seeded from the commander option definitions in src/main.tsx.
// Hidden/internal flags (hideHelp) are intentionally excluded.
export interface CliFlag {
flag: string
arg?: string
description: string
}
export interface FlagGroup {
id: string
label: string
intro?: string
flags: CliFlag[]
}
export interface Subcommand {
name: string
usage: string
description: string
}
export const flagGroups: FlagGroup[] = [
{
id: 'core',
label: 'core',
flags: [
{ flag: '-v, --version', description: 'Show the installed version and exit.' },
{ flag: '-h, --help', description: 'Display help for the command.' },
{ flag: '-p, --print', description: 'Print the response and exit (useful for pipes and scripts). The workspace trust dialog is skipped — only use in directories you trust.' },
{ flag: '--bare', description: 'Minimal mode: skip hooks, LSP, plugin sync, attribution, auto-memory, keychain reads, and CLAUDE.md auto-discovery. Provide context explicitly via --system-prompt, --add-dir, --mcp-config, --settings, --agents, or --plugin-dir.' },
{ flag: '-d, --debug', arg: '[filter]', description: 'Enable debug mode with optional category filtering (e.g. "api,hooks" or "!file").' },
{ flag: '--debug-file', arg: '<path>', description: 'Write debug logs to a specific file path (implicitly enables debug mode).' },
{ flag: '--verbose', description: 'Override the verbose mode setting from config.' },
],
},
{
id: 'io',
label: 'input & output formats',
intro: 'These flags shape non-interactive runs with --print, e.g. in scripts and CI.',
flags: [
{ flag: '--output-format', arg: '<format>', description: 'Output format (with --print): "text" (default), "json" (single result), or "stream-json" (realtime streaming).' },
{ flag: '--input-format', arg: '<format>', description: 'Input format (with --print): "text" (default) or "stream-json" (realtime streaming input).' },
{ flag: '--json-schema', arg: '<schema>', description: 'JSON Schema for structured output validation of the final result.' },
{ flag: '--include-hook-events', description: 'Include hook lifecycle events in the output stream (stream-json only).' },
{ flag: '--include-partial-messages', description: 'Include partial message chunks as they arrive (stream-json only).' },
{ flag: '--replay-user-messages', description: 'Re-emit user messages from stdin back on stdout for acknowledgment (stream-json in and out).' },
],
},
{
id: 'model',
label: 'model & provider',
flags: [
{ flag: '--model', arg: '<model>', description: "Model for the session: an alias like 'sonnet' or 'opus', or a full model name." },
{ flag: '--provider', arg: '<provider>', description: 'AI provider to use (anthropic, openai, gemini, github, bedrock, vertex, ollama, …).' },
{ flag: '--effort', arg: '<level>', description: 'Effort level for model usage: low, medium, high, xhigh, or max.' },
{ flag: '--fallback-model', arg: '<model>', description: 'Automatic fallback model when the default model is overloaded.' },
{ flag: '--agent', arg: '<agent>', description: "Agent for the current session. Overrides the 'agent' setting." },
{ flag: '--betas', arg: '<betas...>', description: 'Beta headers to include in API requests (API key users only).' },
],
},
{
id: 'session',
label: 'sessions',
flags: [
{ flag: '-c, --continue', description: 'Continue the most recent conversation in the current directory.' },
{ flag: '-r, --resume', arg: '[id]', description: 'Resume a conversation by session ID, or open the interactive picker with an optional search term.' },
{ flag: '--fork-session', description: 'When resuming, create a new session ID instead of reusing the original.' },
{ flag: '--from-pr', arg: '[pr]', description: 'Resume a session linked to a PR by number/URL, or open the interactive picker.' },
{ flag: '--session-id', arg: '<uuid>', description: 'Use a specific session ID for the conversation (must be a valid UUID).' },
{ flag: '-n, --name', arg: '<name>', description: 'Set a display name for this session (shown in /resume and the terminal title).' },
{ flag: '--no-session-persistence', description: 'Disable session persistence — sessions are not saved to disk and cannot be resumed (--print only).' },
{ flag: '-w, --worktree', arg: '[name]', description: 'Run the session in an isolated git worktree, optionally named.' },
],
},
{
id: 'permissions',
label: 'permissions & tools',
flags: [
{ flag: '--permission-mode', arg: '<mode>', description: 'Permission mode for the session (e.g. auto, plan, acceptEdits, bypassPermissions).' },
{ flag: '--allowed-tools', arg: '<tools...>', description: 'Comma or space-separated list of tool rules to allow (e.g. "Bash(git:*) Edit").' },
{ flag: '--disallowed-tools', arg: '<tools...>', description: 'Comma or space-separated list of tool rules to deny.' },
{ flag: '--tools', arg: '<tools...>', description: 'Restrict the built-in tool set: "" disables all tools, "default" enables all, or list names like "Bash,Edit,Read".' },
{ flag: '--dangerously-skip-permissions', description: 'Bypass all permission checks. Recommended only for sandboxes with no internet access.' },
{ flag: '--allow-dangerously-skip-permissions', description: 'Make permission bypass available as an option without enabling it by default.' },
{ flag: '--add-dir', arg: '<dirs...>', description: 'Additional directories to allow tool access to.' },
],
},
{
id: 'prompt',
label: 'system prompt',
flags: [
{ flag: '--system-prompt', arg: '<prompt>', description: 'Replace the default system prompt for the session.' },
{ flag: '--append-system-prompt', arg: '<prompt>', description: 'Append to the default system prompt instead of replacing it.' },
],
},
{
id: 'mcp',
label: 'mcp',
flags: [
{ flag: '--mcp-config', arg: '<configs...>', description: 'Load MCP servers from JSON files or strings (space-separated).' },
{ flag: '--strict-mcp-config', description: 'Only use MCP servers from --mcp-config, ignoring all other MCP configurations.' },
],
},
{
id: 'config',
label: 'configuration',
flags: [
{ flag: '--settings', arg: '<file-or-json>', description: 'Path to a settings JSON file, or a JSON string, with additional settings.' },
{ flag: '--setting-sources', arg: '<sources>', description: 'Comma-separated list of setting sources to load: user, project, local.' },
{ flag: '--agents', arg: '<json>', description: 'JSON object defining custom agents for the session.' },
{ flag: '--plugin-dir', arg: '<path>', description: 'Load plugins from a directory (repeatable).' },
{ flag: '--ide', description: 'Automatically connect to your IDE on startup if exactly one valid IDE is available.' },
],
},
{
id: 'limits',
label: 'limits & budgets',
flags: [
{ flag: '--max-budget-usd', arg: '<amount>', description: 'Maximum dollar amount to spend on API calls (--print only).' },
],
},
]
export const subcommands: Subcommand[] = [
{
name: 'mcp',
usage: 'openclaude mcp [add|remove|list|doctor]',
description: 'Manage MCP server configuration from the command line.',
},
{
name: 'ssh',
usage: 'openclaude ssh <host> [dir]',
description: 'Run OpenClaude on a remote host over SSH. Deploys the binary and tunnels API auth back through your local machine — no remote setup needed.',
},
]
+147
View File
@@ -0,0 +1,147 @@
// Seeded from src/commands.ts, src/i18n/languages/en.ts, and per-command
// argumentHint fields in src/commands/*/index.ts in the CLI source.
// Hidden, ant-only, and feature-gated commands are intentionally excluded.
export type CommandCategory =
| 'session'
| 'context'
| 'models'
| 'workflow'
| 'tools'
| 'customization'
| 'diagnostics'
export interface SlashCommand {
name: string
description: string
category: CommandCategory
/** argument hint, mirrors the CLI's autocomplete hint */
args?: string
}
export const commandCategories: { id: CommandCategory; label: string; blurb: string }[] = [
{
id: 'session',
label: 'sessions & conversations',
blurb: 'Start, resume, branch, and export conversations — and move them between devices.',
},
{
id: 'context',
label: 'context & memory',
blurb: 'Control what the agent sees: working directories, context usage, memory, and project knowledge.',
},
{
id: 'models',
label: 'models & providers',
blurb: 'Pick a model, wire up providers, sign in and out, and track usage limits.',
},
{
id: 'workflow',
label: 'code review & git',
blurb: 'Review diffs and pull requests, run security reviews, and connect GitHub or Slack.',
},
{
id: 'tools',
label: 'tools & integrations',
blurb: 'MCP servers, language servers, IDEs, plugins, skills, agents, and hooks.',
},
{
id: 'customization',
label: 'ui & customization',
blurb: 'Themes, keybindings, vim mode, the status line, and editor ergonomics.',
},
{
id: 'diagnostics',
label: 'help & diagnostics',
blurb: 'Check status, diagnose the installation, and inspect session statistics.',
},
]
export const commands: SlashCommand[] = [
// ── sessions & conversations ─────────────────────────────────────────
{ name: 'clear', description: 'Clear conversation history and free up context', category: 'session' },
{ name: 'compact', description: 'Clear conversation history but keep a summary in context', category: 'session', args: '[instructions]' },
{ name: 'resume', description: 'Resume a previous conversation', category: 'session', args: '[conversation id or search term]' },
{ name: 'rename', description: 'Rename the current conversation', category: 'session', args: '[name]' },
{ name: 'branch', description: 'Create a branch of the current conversation at this point', category: 'session', args: '[name]' },
{ name: 'rewind', description: 'Restore the code and/or conversation to a previous point', category: 'session' },
{ name: 'export', description: 'Export the current conversation to a file or clipboard', category: 'session', args: '[filename]' },
{ name: 'copy', description: "Copy the agent's last response to clipboard (or /copy N for the Nth-latest)", category: 'session', args: '[N]' },
{ name: 'btw', description: 'Ask a quick side question without interrupting the main conversation', category: 'session', args: '<question>' },
{ name: 'goal', description: 'Set and manage a session completion goal', category: 'session', args: '[condition|status|pause|resume|clear]' },
{ name: 'tasks', description: 'List and manage background tasks', category: 'session' },
{ name: 'session', description: 'Show remote session URL and QR code', category: 'session' },
{ name: 'desktop', description: 'Continue the current session in Claude Desktop', category: 'session' },
{ name: 'mobile', description: 'Show QR code to download the Claude mobile app', category: 'session' },
{ name: 'exit', description: 'Exit the REPL', category: 'session' },
// ── context & memory ─────────────────────────────────────────────────
{ name: 'context', description: 'Show current context usage', category: 'context' },
{ name: 'files', description: 'List all files currently in context', category: 'context' },
{ name: 'add-dir', description: 'Add a new working directory', category: 'context', args: '<path>' },
{ name: 'init', description: 'Initialize a new project instruction file with codebase documentation', category: 'context' },
{ name: 'memory', description: 'Edit persistent memory files', category: 'context' },
{ name: 'dream', description: 'Run memory consolidation — synthesize recent sessions into durable memories', category: 'context' },
{ name: 'knowledge', description: 'Manage the native Knowledge Graph', category: 'context', args: 'enable <yes|no> | clear | status | list' },
{ name: 'wiki', description: 'Initialize and inspect the OpenClaude project wiki', category: 'context', args: '[init|status]' },
{ name: 'cost', description: 'Show the total cost and duration of the current session', category: 'context' },
{ name: 'request-size', description: 'Show estimated request context load and top contributors', category: 'context' },
{ name: 'cache-stats', description: 'Show per-turn and session cache hit/miss stats (works across all providers)', category: 'context' },
// ── models & providers ───────────────────────────────────────────────
{ name: 'model', description: 'Set the AI model for the session', category: 'models', args: '[model]' },
{ name: 'provider', description: 'Manage API provider profiles', category: 'models' },
{ name: 'effort', description: 'Set effort level for model usage', category: 'models', args: '[low|medium|high|max|auto]' },
{ name: 'login', description: 'Sign in with your Anthropic account', category: 'models' },
{ name: 'logout', description: 'Sign out from your Anthropic account', category: 'models' },
{ name: 'onboard-github', description: 'Interactive setup for GitHub Copilot: OAuth device login stored in secure storage', category: 'models' },
{ name: 'usage', description: 'Show plan usage limits', category: 'models' },
{ name: 'extra-usage', description: 'Configure extra usage to keep working when limits are hit', category: 'models' },
// ── code review & git ────────────────────────────────────────────────
{ name: 'diff', description: 'View uncommitted changes and per-turn diffs', category: 'workflow' },
{ name: 'review', description: 'Review a pull request', category: 'workflow' },
{ name: 'security-review', description: 'Complete a security review of the pending changes on the current branch', category: 'workflow' },
{ name: 'pr-comments', description: 'Get comments from a GitHub pull request', category: 'workflow' },
{ name: 'auto-fix', description: 'Configure auto-fix: run lint/test after AI edits', category: 'workflow' },
{ name: 'plan', description: 'Enable plan mode or view the current session plan', category: 'workflow', args: '[open|<description>]' },
{ name: 'install-github-app', description: 'Set up GitHub Actions integration for a repository', category: 'workflow' },
{ name: 'install-slack-app', description: 'Install the Slack app integration', category: 'workflow' },
// ── tools & integrations ─────────────────────────────────────────────
{ name: 'mcp', description: 'Manage MCP servers', category: 'tools', args: '[enable|disable [server-name]]' },
{ name: 'lsp', description: 'Inspect and set up Language Server Protocol code intelligence', category: 'tools', args: 'status | recommend [path] | install <plugin-id> | uninstall <plugin-id> | restart' },
{ name: 'ide', description: 'Manage IDE integrations and show status', category: 'tools', args: '[open]' },
{ name: 'plugin', description: 'Manage OpenClaude plugins', category: 'tools' },
{ name: 'reload-plugins', description: 'Activate pending plugin changes in the current session', category: 'tools' },
{ name: 'skills', description: 'List available skills', category: 'tools' },
{ name: 'agents', description: 'Manage agent configurations', category: 'tools' },
{ name: 'hooks', description: 'View hook configurations for tool events', category: 'tools' },
{ name: 'permissions', description: 'Manage allow & deny tool permission rules', category: 'tools' },
// ── ui & customization ───────────────────────────────────────────────
{ name: 'config', description: 'Open the config panel', category: 'customization' },
{ name: 'theme', description: 'Change the theme', category: 'customization' },
{ name: 'logo', description: 'Change the startup logo color scheme', category: 'customization' },
{ name: 'color', description: 'Set the prompt bar color for this session', category: 'customization', args: '<color|default>' },
{ name: 'keybindings', description: 'Open or create your keybindings configuration file', category: 'customization' },
{ name: 'vim', description: 'Toggle between Vim and Normal editing modes', category: 'customization' },
{ name: 'statusline', description: "Set up OpenClaude's status line UI", category: 'customization' },
{ name: 'terminal-setup', description: 'Install the Shift+Enter key binding for newlines', category: 'customization' },
{ name: 'commit-message', description: 'Configure commit attribution text', category: 'customization', args: '[status|off|default|set "text"|co-author <name> <email>]' },
{ name: 'output-style', description: 'Deprecated: use /config to change output style', category: 'customization' },
{ name: 'stickers', description: 'Order OpenClaude stickers', category: 'customization' },
// ── help & diagnostics ───────────────────────────────────────────────
{ name: 'help', description: 'Show help and available commands', category: 'diagnostics' },
{ name: 'status', description: 'Show status including version, model, account, API connectivity, and tool statuses', category: 'diagnostics' },
{ name: 'doctor', description: 'Diagnose and verify your OpenClaude installation and settings', category: 'diagnostics' },
{ name: 'stats', description: 'Show your usage statistics and activity', category: 'diagnostics' },
{ name: 'insights', description: 'Generate a report analyzing your OpenClaude sessions', category: 'diagnostics' },
{ name: 'release-notes', description: 'View release notes', category: 'diagnostics' },
{ name: 'feedback', description: 'Submit feedback about OpenClaude', category: 'diagnostics', args: '[report]' },
]
export function commandsByCategory(category: CommandCategory): SlashCommand[] {
return commands.filter(c => c.category === category)
}
+75
View File
@@ -0,0 +1,75 @@
// Seeded from src/utils/envValidation.ts, src/utils/config.ts, and the README.
export interface SettingsFile {
path: string
scope: string
notes: string
}
export const settingsFiles: SettingsFile[] = [
{
path: '~/.claude/settings.json',
scope: 'user',
notes: 'Global settings for every project on the machine.',
},
{
path: '.claude/settings.json',
scope: 'project',
notes: 'Shared project settings, committed to the repo.',
},
{
path: '.claude/settings.local.json',
scope: 'local',
notes: 'Per-machine overrides for one project; typically gitignored.',
},
{
path: '~/.claude/keybindings.json',
scope: 'user',
notes: 'Keyboard shortcut overrides — see the keybindings page.',
},
{
path: 'CLAUDE.md / .claude/CLAUDE.md',
scope: 'project',
notes: 'Project instructions loaded into context at session start.',
},
]
export interface SettingOption {
key: string
description: string
}
export const settingOptions: SettingOption[] = [
{ key: 'model', description: "Default model (alias like 'sonnet' or a full model name)." },
{ key: 'provider', description: 'Default provider preset for new sessions.' },
{ key: 'effort', description: 'Default effort level: low, medium, high, xhigh, or max.' },
{ key: 'agent', description: 'Default agent for new sessions.' },
{ key: 'permissions', description: 'Allow/deny rules for tools, plus the default permission mode.' },
{ key: 'env', description: 'Environment variables applied to every session.' },
{ key: 'theme', description: 'Terminal color theme.' },
{ key: 'verbose', description: 'Verbose output by default.' },
{ key: 'allowAutoUpdates', description: 'Enable or disable the auto-updater.' },
{ key: 'hooks', description: 'Shell hooks that run on tool events (PreToolUse, PostToolUse, …).' },
]
export interface EnvVar {
name: string
description: string
}
export const envVars: EnvVar[] = [
{ name: 'ANTHROPIC_API_KEY', description: 'Anthropic API key (also the strict auth path in --bare mode).' },
{ name: 'ANTHROPIC_AUTH_TOKEN', description: 'Bearer token alternative to an Anthropic API key.' },
{ name: 'OPENAI_API_KEY', description: 'Key for OpenAI-compatible providers and gateways (incl. Opengateway).' },
{ name: 'OPENAI_BASE_URL', description: 'Base URL of an OpenAI-compatible /v1 endpoint (OpenRouter, LM Studio, LiteLLM, …).' },
{ name: 'OPENAI_MODEL', description: 'Model name to request from the OpenAI-compatible endpoint.' },
{ name: 'GOOGLE_API_KEY', description: 'Google Gemini API key.' },
{ name: 'NEARAI_API_KEY', description: 'NEAR AI unified gateway key.' },
{ name: 'MIMO_API_KEY', description: 'Xiaomi MiMo API key.' },
{ name: 'OPENCODE_API_KEY', description: 'OpenCode Zen / Go gateway key.' },
{ name: 'GITHUB_TOKEN', description: 'GitHub token for GitHub Models and PR workflows.' },
{ name: 'CLAUDE_CONFIG_DIR', description: 'Override the config directory (default ~/.claude).' },
{ name: 'HTTP_PROXY / HTTPS_PROXY', description: 'Route API traffic through a proxy.' },
{ name: 'NODE_EXTRA_CA_CERTS', description: 'Extra CA certificates for corporate TLS interception.' },
{ name: 'CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC', description: 'Disable non-essential network traffic.' },
]
+42
View File
@@ -0,0 +1,42 @@
export interface DocsNavItem {
title: string
href: string
}
export interface DocsNavGroup {
group: string
items: DocsNavItem[]
}
export const docsNav: DocsNavGroup[] = [
{
group: 'getting started',
items: [
{ title: 'Overview', href: '/docs/' },
{ title: 'Installation', href: '/docs/installation/' },
{ title: 'Quickstart', href: '/docs/quickstart/' },
{ title: 'Providers', href: '/docs/providers/' },
],
},
{
group: 'reference',
items: [
{ title: 'Slash commands', href: '/docs/slash-commands/' },
{ title: 'CLI reference', href: '/docs/cli-reference/' },
{ title: 'Configuration', href: '/docs/configuration/' },
{ title: 'Keybindings', href: '/docs/keybindings/' },
{ title: 'Skills', href: '/docs/skills/' },
],
},
]
export const docsPages: DocsNavItem[] = docsNav.flatMap(g => g.items)
export function pagerFor(href: string): { prev?: DocsNavItem; next?: DocsNavItem } {
const i = docsPages.findIndex(p => p.href === href)
if (i === -1) return {}
return {
prev: i > 0 ? docsPages[i - 1] : undefined,
next: i < docsPages.length - 1 ? docsPages[i + 1] : undefined,
}
}
+26
View File
@@ -0,0 +1,26 @@
// Seeded from src/keybindings/defaultBindings.ts. User overrides live in
// ~/.claude/keybindings.json (open it with /keybindings).
export interface Keybinding {
keys: string
action: string
context: string
}
export const keybindings: Keybinding[] = [
{ keys: 'Ctrl+C', action: 'Interrupt the current turn', context: 'global' },
{ keys: 'Ctrl+D', action: 'Exit the REPL', context: 'global' },
{ keys: 'Ctrl+L', action: 'Redraw the screen', context: 'global' },
{ keys: 'Ctrl+T', action: 'Toggle the todo list', context: 'global' },
{ keys: 'Ctrl+O', action: 'Toggle the transcript view', context: 'global' },
{ keys: 'Ctrl+R', action: 'Search prompt history', context: 'global' },
{ keys: 'Shift+Tab', action: 'Cycle permission modes', context: 'prompt' },
{ keys: 'Ctrl+V', action: 'Paste an image from the clipboard (Alt+V on Windows)', context: 'prompt' },
{ keys: 'Ctrl+S', action: 'Stash the current prompt draft', context: 'prompt' },
{ keys: 'Ctrl+G', action: 'Edit the prompt in your external $EDITOR', context: 'prompt' },
{ keys: 'Ctrl+_ / Ctrl+Shift+-', action: 'Undo in the prompt input', context: 'prompt' },
{ keys: 'Ctrl+P / Ctrl+N', action: 'Previous / next item', context: 'menus & pickers' },
{ keys: 'Ctrl+E', action: 'Toggle the explanation panel', context: 'permission dialogs' },
{ keys: 'Esc', action: 'Cancel / close the current dialog', context: 'dialogs' },
{ keys: 'Shift+Enter', action: 'Insert a newline (install via /terminal-setup)', context: 'prompt' },
]
+105
View File
@@ -0,0 +1,105 @@
// Seeded from the Supported Providers table in the repo README.
export interface Provider {
id: string
name: string
setup: string
envVars?: string[]
notes: string
}
export const providers: Provider[] = [
{
id: 'openai-compatible',
name: 'OpenAI-compatible',
setup: '/provider or env vars',
envVars: ['OPENAI_API_KEY', 'OPENAI_BASE_URL', 'OPENAI_MODEL'],
notes: 'Works with OpenAI, OpenRouter, DeepSeek, Groq, Mistral, LM Studio, and any other compatible /v1 server.',
},
{
id: 'opengateway',
name: 'Gitlawb Opengateway',
setup: 'startup default, /provider, or env vars',
envVars: ['OPENAI_API_KEY', 'OPENAI_MODEL'],
notes: 'Smart gateway at https://opengateway.gitlawb.com/v1. Requires an API key from gitlawb.com/opengateway/keys; routes Xiaomi MiMo and GMI Cloud partner models by model name.',
},
{
id: 'gemini',
name: 'Google Gemini',
setup: '/provider or env vars',
envVars: ['GOOGLE_API_KEY'],
notes: 'Supports API-key auth only.',
},
{
id: 'github-models',
name: 'GitHub Models',
setup: '/onboard-github',
envVars: ['GITHUB_TOKEN'],
notes: 'Interactive onboarding with saved credentials.',
},
{
id: 'codex-oauth',
name: 'Codex OAuth',
setup: '/provider',
notes: 'Opens ChatGPT sign-in in your browser and stores Codex credentials securely. Can also reuse existing Codex CLI auth or env credentials.',
},
{
id: 'near-ai',
name: 'NEAR AI',
setup: '/provider or env vars',
envVars: ['NEARAI_API_KEY'],
notes: 'Unified gateway (Claude, GPT, Gemini, plus TEE open models) at https://cloud-api.near.ai/v1.',
},
{
id: 'ollama',
name: 'Ollama',
setup: '/provider or env vars',
notes: 'Local inference with no API key required.',
},
{
id: 'lm-studio',
name: 'LM Studio',
setup: '/provider or env vars',
envVars: ['OPENAI_BASE_URL'],
notes: 'Local OpenAI-compatible server; point the base URL at the LM Studio endpoint.',
},
{
id: 'xiaomi-mimo',
name: 'Xiaomi MiMo',
setup: '/provider or env vars',
envVars: ['MIMO_API_KEY'],
notes: 'OpenAI-compatible API at https://mimo.mi.com; defaults to mimo-v2.5-pro.',
},
{
id: 'opencode-zen',
name: 'OpenCode Zen / Go',
setup: '/provider or env vars',
envVars: ['OPENCODE_API_KEY'],
notes: 'Pay-as-you-go gateway (Zen) and subscription tier for open models (Go); both share one key via opencode.ai.',
},
{
id: 'atomic-chat',
name: 'Atomic Chat',
setup: '/provider or env vars',
notes: 'Local model provider with auto-detection of loaded models.',
},
{
id: 'hicap',
name: 'Hicap',
setup: '/provider or OpenAI-compatible env vars',
notes: 'api-key auth, discovers models from the unauthenticated /models endpoint, supports Responses mode for gpt- models.',
},
{
id: 'anthropic',
name: 'Anthropic',
setup: '/login or env vars',
envVars: ['ANTHROPIC_API_KEY'],
notes: 'Sign in with an Anthropic account or use an API key directly.',
},
{
id: 'cloud-routes',
name: 'Bedrock / Vertex / Foundry',
setup: 'env vars',
notes: 'Anthropic-family cloud routes. Vertex is for Claude on Vertex AI, not arbitrary Model Garden models.',
},
]
+15
View File
@@ -0,0 +1,15 @@
export const SITE = {
url: 'https://openclaude.gitlawb.com',
name: 'openclaude',
title: 'openclaude — open-source coding agent CLI for any model',
description:
'Open-source coding agent that runs in your terminal and talks to any model: OpenAI, Gemini, Ollama, GitHub Models, and 200+ more. One install, every provider.',
installCommand: 'npm install -g @gitlawb/openclaude@latest',
npmUrl: 'https://www.npmjs.com/package/@gitlawb/openclaude',
github: 'https://github.com/Gitlawb/openclaude',
gitlawb: 'https://gitlawb.com',
gitlawbRepo: 'https://gitlawb.com/node/repos/z6MkqDnb/openclaude',
version: '0.18.0',
ogDefault: '/og/default.png',
ogDocs: '/og/docs.png',
} as const
+45
View File
@@ -0,0 +1,45 @@
// Seeded from src/skills/bundledSkills.ts + src/i18n/languages/en.ts.
export interface Skill {
name: string
invocation: string
description: string
}
export const skills: Skill[] = [
{
name: 'batch',
invocation: '/batch',
description:
'Research and plan a large-scale change, then execute it in parallel across 530 isolated worktree agents that each open a PR. Use for sweeping, mechanical changes (migrations, refactors, bulk renames) that decompose into independent units.',
},
{
name: 'loop',
invocation: '/loop',
description:
'Run a prompt on a fixed interval or dynamically reschedule it. Use to poll for status, babysit a workflow, or keep re-running a prompt within the current session.',
},
{
name: 'simplify',
invocation: '/simplify',
description:
'Review changed code for reuse, quality, and efficiency, then fix any issues found.',
},
{
name: 'debug',
invocation: '/debug',
description: 'Enable debug logging for this session and help diagnose issues.',
},
{
name: 'update-config',
invocation: '/update-config',
description:
'Configure the harness via settings.json: permissions, env vars, hooks, and automated behaviors ("from now on when X…").',
},
{
name: 'keybindings-help',
invocation: '/keybindings-help',
description:
'Customize keyboard shortcuts: rebind keys, add chord bindings, or modify ~/.claude/keybindings.json.',
},
]
+44
View File
@@ -0,0 +1,44 @@
---
import '@fontsource-variable/geist-mono'
import '../styles/global.css'
import Head from '../components/Head.astro'
import Nav from '../components/Nav.astro'
import Footer from '../components/Footer.astro'
interface Props {
title: string
description: string
ogImage?: string
type?: 'website' | 'article'
jsonLd?: object[]
}
---
<!doctype html>
<html lang="en">
<head>
<script is:inline>
// Theme bootstrap — runs before paint to prevent flash. Dark is default.
;(function () {
try {
var t = localStorage.getItem('oc-theme')
if (t === 'light') {
document.documentElement.dataset.theme = 'light'
document.documentElement.style.colorScheme = 'light'
}
} catch (e) {
/* storage unavailable — stay dark */
}
})()
</script>
<Head {...Astro.props} />
</head>
<body>
<a class="skip-link" href="#main">skip to content</a>
<Nav />
<main id="main">
<slot />
</main>
<Footer />
</body>
</html>
+78
View File
@@ -0,0 +1,78 @@
---
import BaseLayout from './BaseLayout.astro'
import Breadcrumbs from '../components/Breadcrumbs.astro'
import DocsSidebar from '../components/DocsSidebar.astro'
import DocsToc, { type TocEntry } from '../components/DocsToc.astro'
import { docsPages, pagerFor } from '../data/docsNav'
import { SITE } from '../data/site'
interface Props {
/** Browser tab / SERP title */
title: string
description: string
/** H1 + breadcrumb label (falls back to nav title) */
heading: string
lede?: string
toc?: TocEntry[]
/** override the default docs OG card */
ogImage?: string
}
const { title, description, heading, lede, toc = [], ogImage = SITE.ogDocs } = Astro.props
const path = Astro.url.pathname
const { prev, next } = pagerFor(path)
const navTitle = docsPages.find(p => p.href === path)?.title ?? heading
const crumbs = [
{ label: 'home', href: '/' },
{ label: 'docs', href: '/docs/' },
...(path === '/docs/' ? [] : [{ label: navTitle.toLowerCase(), href: path }]),
]
const jsonLd = [
{
'@context': 'https://schema.org',
'@type': 'TechArticle',
headline: heading,
description,
url: new URL(path, SITE.url).href,
isPartOf: { '@type': 'WebSite', name: SITE.name, url: SITE.url },
about: { '@type': 'SoftwareApplication', name: 'openclaude', url: SITE.url },
author: { '@type': 'Organization', name: 'GitLawb', url: SITE.gitlawb },
},
]
---
<BaseLayout title={title} description={description} ogImage={ogImage} type="article" jsonLd={jsonLd}>
<div class="container">
<div class="docs-shell">
<DocsSidebar />
<article class="docs-article">
<Breadcrumbs crumbs={crumbs} />
<h1>{heading}</h1>
{lede && <p class="lede">{lede}</p>}
<slot />
<nav class="docs-pager" aria-label="docs pagination">
<span>
{prev && (
<a href={prev.href}>
<span class="label">← previous</span>
{prev.title}
</a>
)}
</span>
<span style="text-align: right;">
{next && (
<a href={next.href}>
<span class="label">next →</span>
{next.title}
</a>
)}
</span>
</nav>
</article>
<DocsToc toc={toc} />
</div>
</div>
</BaseLayout>
-9
View File
@@ -1,9 +0,0 @@
import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App'
ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<App />
</React.StrictMode>,
)
+33
View File
@@ -0,0 +1,33 @@
---
import BaseLayout from '../layouts/BaseLayout.astro'
---
<BaseLayout
title="404 — page not found · openclaude"
description="The page you were looking for does not exist."
>
<section class="nf grid-bg">
<div class="container nf-inner">
<p class="eyebrow">// 404</p>
<h1 class="text-hero">not found.</h1>
<p class="text-body-dim">this page doesn't exist — but the agent probably can't fix this one.</p>
<div class="nf-links">
<a class="button button-ghost" href="/">← back home</a>
<a class="button button-ghost" href="/docs/">browse the docs</a>
</div>
</div>
</section>
</BaseLayout>
<style>
.nf { padding: calc(var(--nav-h) + 8rem) 0 8rem; }
.nf-inner {
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
gap: 1rem;
position: relative;
}
.nf-links { display: flex; gap: 0.75rem; flex-wrap: wrap; justify-content: center; }
</style>
+80
View File
@@ -0,0 +1,80 @@
---
import DocsLayout from '../../layouts/DocsLayout.astro'
import { flagGroups, subcommands } from '../../data/cliFlags'
const toc = [
{ id: 'usage', label: 'usage' },
...flagGroups.map(g => ({ id: g.id, label: g.label })),
{ id: 'subcommands', label: 'subcommands' },
]
---
<DocsLayout
title="openclaude CLI reference — flags & subcommands"
description="Full reference for the openclaude command line: every flag (model, I/O formats, sessions, permissions, MCP) and subcommands like mcp and ssh."
heading="CLI reference"
lede="Every documented flag of the openclaude binary, grouped by purpose. Slash commands you type inside a session are documented separately."
toc={toc}
>
<h2 id="usage">usage</h2>
<pre><code>openclaude [options] [prompt]
# interactive session in the current repo
openclaude
# non-interactive: print the result and exit
openclaude -p "explain the build pipeline" --output-format json</code></pre>
<p>
Looking for <code>/commands</code> you type inside the session? See the
<a href="/docs/slash-commands/">slash commands reference</a>.
</p>
{flagGroups.map(group => (
<section>
<h2 id={group.id}>{group.label}</h2>
{group.intro && <p>{group.intro}</p>}
<div class="table-wrap">
<table>
<thead>
<tr>
<th scope="col">flag</th>
<th scope="col">description</th>
</tr>
</thead>
<tbody>
{group.flags.map(f => (
<tr>
<td><code>{f.flag}{f.arg ? ` ${f.arg}` : ''}</code></td>
<td>{f.description}</td>
</tr>
))}
</tbody>
</table>
</div>
</section>
))}
<h2 id="subcommands">subcommands</h2>
<div class="table-wrap">
<table>
<thead>
<tr>
<th scope="col">subcommand</th>
<th scope="col">description</th>
</tr>
</thead>
<tbody>
{subcommands.map(s => (
<tr>
<td><code>{s.usage}</code></td>
<td>{s.description}</td>
</tr>
))}
</tbody>
</table>
</div>
<p>
Defaults for most of these flags can be persisted in settings files — see
<a href="/docs/configuration/">configuration</a>.
</p>
</DocsLayout>
+101
View File
@@ -0,0 +1,101 @@
---
import DocsLayout from '../../layouts/DocsLayout.astro'
import { settingsFiles, settingOptions, envVars } from '../../data/configuration'
const toc = [
{ id: 'settings-files', label: 'settings files' },
{ id: 'common-options', label: 'common options' },
{ id: 'environment-variables', label: 'environment variables' },
{ id: 'project-instructions', label: 'project instructions' },
]
---
<DocsLayout
title="openclaude configuration — settings.json & env vars"
description="Configure openclaude with settings.json files, project profiles, and environment variables like ANTHROPIC_API_KEY and OPENAI_API_KEY. Full options reference."
heading="configuration"
lede="Layered settings files for defaults, environment variables for auth and CI, and project instructions for context."
toc={toc}
>
<h2 id="settings-files">settings files</h2>
<p>
Settings merge in order: user → project → local, with later layers overriding earlier
ones. Open the interactive panel with <code>/config</code>, or edit the files directly.
</p>
<div class="table-wrap">
<table>
<thead>
<tr>
<th scope="col">file</th>
<th scope="col">scope</th>
<th scope="col">notes</th>
</tr>
</thead>
<tbody>
{settingsFiles.map(f => (
<tr>
<td><code>{f.path}</code></td>
<td>{f.scope}</td>
<td>{f.notes}</td>
</tr>
))}
</tbody>
</table>
</div>
<h2 id="common-options">common options</h2>
<p>A few of the most-used keys in <code>settings.json</code>:</p>
<div class="table-wrap">
<table>
<thead>
<tr>
<th scope="col">key</th>
<th scope="col">what it does</th>
</tr>
</thead>
<tbody>
{settingOptions.map(o => (
<tr>
<td><code>{o.key}</code></td>
<td>{o.description}</td>
</tr>
))}
</tbody>
</table>
</div>
<p>
One-off overrides beat files: <code>--settings</code> accepts a path or inline JSON,
and <code>--setting-sources</code> restricts which layers load — see the
<a href="/docs/cli-reference/#config">CLI reference</a>.
</p>
<h2 id="environment-variables">environment variables</h2>
<p>Auth and transport are driven by environment variables, which makes CI and <code>--print</code> scripting straightforward:</p>
<div class="table-wrap">
<table>
<thead>
<tr>
<th scope="col">variable</th>
<th scope="col">purpose</th>
</tr>
</thead>
<tbody>
{envVars.map(v => (
<tr>
<td><code>{v.name}</code></td>
<td>{v.description}</td>
</tr>
))}
</tbody>
</table>
</div>
<p>Provider-specific setup recipes live on the <a href="/docs/providers/">providers page</a>.</p>
<h2 id="project-instructions">project instructions</h2>
<p>
<code>CLAUDE.md</code> (or <code>.claude/CLAUDE.md</code>) is loaded into context at
session start — build commands, conventions, and anything the agent should always
know about the repo. Generate a starting point with <code>/init</code>, and edit
persistent memory with <code>/memory</code>.
</p>
</DocsLayout>
+46
View File
@@ -0,0 +1,46 @@
---
import DocsLayout from '../../layouts/DocsLayout.astro'
import { docsNav } from '../../data/docsNav'
import { SITE } from '../../data/site'
const toc = [
{ id: 'what-is-openclaude', label: 'what is openclaude' },
{ id: 'sections', label: 'documentation sections' },
]
---
<DocsLayout
title="openclaude documentation — CLI guides & reference"
description="Documentation for the openclaude CLI: installation, quickstart, provider setup, slash commands, CLI flags, configuration, and keybindings."
heading="openclaude documentation"
lede="Everything you need to install the agent, wire up a model provider, and drive it from your terminal."
toc={toc}
>
<h2 id="what-is-openclaude">what is openclaude</h2>
<p>
openclaude is an open-source coding agent that runs in your terminal. It reads and edits
files, runs shell commands, searches your codebase, and talks to MCP servers — against
any model backend you choose: OpenAI-compatible APIs, Google Gemini, GitHub Models,
local Ollama, gateways like OpenRouter and LiteLLM, and more.
</p>
<p>
It is maintained by <a href={SITE.gitlawb} rel="noopener">gitlawb</a> and developed in
the open on <a href={SITE.github} rel="noopener">GitHub</a> (with a mirror on the
<a href={SITE.gitlawbRepo} rel="noopener">gitlawb network</a>).
</p>
<pre><code>{SITE.installCommand}</code></pre>
<h2 id="sections">documentation sections</h2>
{docsNav.map(group => (
<>
<h3 id={group.group.replace(/\s+/g, '-')}>{group.group}</h3>
<ul>
{group.items
.filter(item => item.href !== '/docs/')
.map(item => (
<li><a href={item.href}>{item.title}</a></li>
))}
</ul>
</>
))}
</DocsLayout>
+61
View File
@@ -0,0 +1,61 @@
---
import DocsLayout from '../../layouts/DocsLayout.astro'
import { SITE } from '../../data/site'
const toc = [
{ id: 'requirements', label: 'requirements' },
{ id: 'install', label: 'install with npm' },
{ id: 'arch-linux', label: 'arch linux (aur)' },
{ id: 'verify', label: 'verify the install' },
{ id: 'update', label: 'update' },
{ id: 'troubleshooting', label: 'troubleshooting' },
]
---
<DocsLayout
title="Install openclaude — npm, macOS, Linux & Windows"
description="How to install the openclaude CLI with npm on macOS, Linux, and Windows. Requirements, global install, verifying the install, and updating to the latest version."
heading="install openclaude"
lede="One npm command on macOS, Linux, or Windows. An AUR package exists for Arch."
toc={toc}
>
<h2 id="requirements">requirements</h2>
<ul>
<li><strong>Node.js 20 or newer</strong> — grab it from <a href="https://nodejs.org/" rel="noopener">nodejs.org</a> and confirm with <code>node --version</code>.</li>
<li>A terminal: Terminal/iTerm on macOS, any shell on Linux, PowerShell or Windows Terminal on Windows.</li>
<li><code>ripgrep</code> is bundled; if startup reports <code>ripgrep not found</code>, install it system-wide and confirm <code>rg --version</code> works.</li>
</ul>
<h2 id="install">install with npm</h2>
<pre><code>{SITE.installCommand}</code></pre>
<p>
This installs the <code>openclaude</code> binary globally. On macOS/Linux you may need
a Node installation that doesn't require <code>sudo</code> for global installs (nvm,
fnm, or Homebrew node all work).
</p>
<h2 id="arch-linux">arch linux (aur)</h2>
<p>
A community-maintained <a href="https://aur.archlinux.org/packages/openclaude" rel="noopener">AUR package</a> is available:
</p>
<pre><code>paru -S openclaude</code></pre>
<h2 id="verify">verify the install</h2>
<pre><code>openclaude --version</code></pre>
<p>
To check which version is the latest published release:
</p>
<pre><code>npm view @gitlawb/openclaude dist-tags</code></pre>
<h2 id="update">update</h2>
<p>Re-run the install command — <code>@latest</code> always resolves to the newest release:</p>
<pre><code>{SITE.installCommand}</code></pre>
<h2 id="troubleshooting">troubleshooting</h2>
<ul>
<li><strong>Old version after update</strong> — your shell may cache the binary path; run <code>hash -r</code> (bash/zsh) or open a new terminal.</li>
<li><strong>Multiple Node versions</strong> — global installs are per Node version with nvm/fnm; make sure you installed under the version your shell uses.</li>
<li><strong>Anything else</strong> — run <code>/doctor</code> inside openclaude to diagnose the installation, or check the <a href={`${SITE.github}/issues`} rel="noopener">issue tracker</a>.</li>
</ul>
<p>Next: <a href="/docs/quickstart/">run your first session →</a></p>
</DocsLayout>
+62
View File
@@ -0,0 +1,62 @@
---
import DocsLayout from '../../layouts/DocsLayout.astro'
import { keybindings } from '../../data/keybindings'
const toc = [
{ id: 'defaults', label: 'default shortcuts' },
{ id: 'customizing', label: 'customizing' },
]
---
<DocsLayout
title="openclaude keybindings — defaults & customization"
description="Default keyboard shortcuts in the openclaude TUI and how to customize them with ~/.claude/keybindings.json and the /keybindings command."
heading="keybindings"
lede="The defaults match familiar readline/terminal muscle memory — and everything is rebindable."
toc={toc}
>
<h2 id="defaults">default shortcuts</h2>
<div class="table-wrap">
<table>
<thead>
<tr>
<th scope="col">keys</th>
<th scope="col">action</th>
<th scope="col">context</th>
</tr>
</thead>
<tbody>
{keybindings.map(k => (
<tr>
<td><kbd>{k.keys}</kbd></td>
<td>{k.action}</td>
<td>{k.context}</td>
</tr>
))}
</tbody>
</table>
</div>
<p>
Some bindings depend on terminal capabilities (e.g. <kbd>Shift+Enter</kbd> needs the
binding installed by <code>/terminal-setup</code>; some <kbd>Cmd</kbd> combos require a
kitty-protocol terminal).
</p>
<h2 id="customizing">customizing</h2>
<p>
Run <code>/keybindings</code> to open (or create) <code>~/.claude/keybindings.json</code>.
User bindings are loaded on top of the defaults, so you only need to declare what you
change. Chord bindings like <code>ctrl+x ctrl+e</code> are supported.
</p>
<pre><code>{`{
"bindings": {
"ctrl+u": "chat:undo",
"ctrl+x ctrl+k": "chat:killAgents"
}
}`}</code></pre>
<p>
Inside a session you can also ask the agent itself: the bundled
<a href="/docs/skills/">keybindings-help skill</a> knows the schema and can edit the
file for you.
</p>
</DocsLayout>
+71
View File
@@ -0,0 +1,71 @@
---
import DocsLayout from '../../layouts/DocsLayout.astro'
import { providers } from '../../data/providers'
const toc = [
{ id: 'how-it-works', label: 'how provider setup works' },
{ id: 'supported-providers', label: 'supported providers' },
{ id: 'env-setup', label: 'env-var setup' },
]
---
<DocsLayout
title="openclaude providers — OpenAI, Gemini, Ollama & 13+ backends"
description="Connect openclaude to any model provider: Anthropic, OpenAI-compatible APIs, OpenRouter, Gemini, GitHub Models, Codex OAuth, Ollama, LM Studio, Bedrock, Vertex, and more."
heading="model providers"
lede="One agent, every backend. Wire a provider once and switch models mid-session."
toc={toc}
>
<h2 id="how-it-works">how provider setup works</h2>
<p>
Run <code>/provider</code> inside a session for guided setup. It walks you through
auth, lets you pick a model, and saves the result as a profile so future sessions —
and other clones of the repo — boot the same way. You can also configure everything
through <a href="/docs/configuration/">environment variables</a>, which is handy for
CI and scripted <code>--print</code> runs.
</p>
<p>
Switch models any time with <code>/model</code>, or pass
<code>--provider</code> / <code>--model</code> on the command line — see the
<a href="/docs/cli-reference/">CLI reference</a>.
</p>
<h2 id="supported-providers">supported providers</h2>
<div class="table-wrap">
<table>
<thead>
<tr>
<th scope="col">provider</th>
<th scope="col">setup</th>
<th scope="col">notes</th>
</tr>
</thead>
<tbody>
{providers.map(p => (
<tr id={p.id}>
<td>{p.name}</td>
<td>{p.setup}</td>
<td>
{p.notes}
{p.envVars && <span class="env-list"> uses <code>{p.envVars.join(', ')}</code></span>}
</td>
</tr>
))}
</tbody>
</table>
</div>
<h2 id="env-setup">env-var setup</h2>
<p>The fastest OpenAI-compatible setup (works for OpenRouter, DeepSeek, Groq, LM Studio, LiteLLM, and any /v1 server):</p>
<pre><code>export CLAUDE_CODE_USE_OPENAI=1
export OPENAI_API_KEY=sk-your-key-here
export OPENAI_BASE_URL=https://openrouter.ai/api/v1 # optional, defaults to OpenAI
export OPENAI_MODEL=deepseek/deepseek-chat
openclaude</code></pre>
<p>
Local Ollama needs no key at all — point <code>/provider</code> at it and pick a
pulled model. The full environment variable list lives on the
<a href="/docs/configuration/#environment-variables">configuration page</a>.
</p>
</DocsLayout>
+67
View File
@@ -0,0 +1,67 @@
---
import DocsLayout from '../../layouts/DocsLayout.astro'
import { SITE } from '../../data/site'
const toc = [
{ id: 'start', label: 'start the agent' },
{ id: 'pick-a-provider', label: 'pick a provider' },
{ id: 'first-task', label: 'give it a task' },
{ id: 'review', label: 'review the changes' },
{ id: 'next-steps', label: 'next steps' },
]
---
<DocsLayout
title="openclaude quickstart — first session in 5 minutes"
description="Run your first openclaude session: start the agent in a repo, pick a model provider, give it a task, and review the diff. From install to working agent in minutes."
heading="quickstart"
lede="From a fresh install to a reviewed diff in about five minutes."
toc={toc}
>
<h2 id="start">1. start the agent</h2>
<p>Run it inside any repository (or empty directory):</p>
<pre><code>cd your-repo
openclaude</code></pre>
<p>
If you haven't <a href="/docs/installation/">installed it</a> yet:
<code>{SITE.installCommand}</code>
</p>
<h2 id="pick-a-provider">2. pick a provider</h2>
<p>
Inside the session, type <code>/provider</code> for guided setup with saved profiles.
It can wire up OpenAI, OpenRouter, Gemini, local Ollama, and a dozen other backends —
see the <a href="/docs/providers/">provider guide</a> for the full list.
</p>
<p>Prefer environment variables? The fastest OpenAI-compatible setup:</p>
<pre><code>export CLAUDE_CODE_USE_OPENAI=1
export OPENAI_API_KEY=sk-your-key-here
export OPENAI_MODEL=gpt-4o
openclaude</code></pre>
<p>For GitHub Models, run <code>/onboard-github</code> for interactive OAuth onboarding.</p>
<h2 id="first-task">3. give it a task</h2>
<p>Write a task the way you'd brief a teammate:</p>
<pre><code>&gt; add retry with exponential backoff to the fetch client, then run the tests</code></pre>
<p>
The agent streams its plan, tool calls, and edits live: reading files, searching,
editing, and running commands. Tool use is permission-gated — you approve the first
use of anything sensitive, and can manage rules later with <code>/permissions</code>.
</p>
<h2 id="review">4. review the changes</h2>
<ul>
<li><code>/diff</code> — view uncommitted changes and per-turn diffs.</li>
<li><code>/rewind</code> — restore code and/or conversation to a previous point.</li>
<li><code>/cost</code> — see what the session cost so far.</li>
</ul>
<p>Nothing is committed unless you ask for it; every change stays reviewable.</p>
<h2 id="next-steps">next steps</h2>
<ul>
<li>Browse the <a href="/docs/slash-commands/">slash command reference</a> — sessions, context, review, and more.</li>
<li>Script it: <code>openclaude -p "explain this repo"</code> — see the <a href="/docs/cli-reference/">CLI reference</a>.</li>
<li>Make it yours: <a href="/docs/configuration/">configuration</a> and <a href="/docs/keybindings/">keybindings</a>.</li>
</ul>
</DocsLayout>
+46
View File
@@ -0,0 +1,46 @@
---
import DocsLayout from '../../layouts/DocsLayout.astro'
import { skills } from '../../data/skills'
const toc = [
{ id: 'what-are-skills', label: 'what are skills' },
{ id: 'bundled-skills', label: 'bundled skills' },
{ id: 'your-own', label: 'writing your own' },
]
---
<DocsLayout
title="openclaude skills — bundled agent skills reference"
description="Reference for the agent skills bundled with openclaude: what each skill does, when it triggers, and how to invoke it with slash commands."
heading="bundled skills"
lede="Skills are reusable instruction packs the agent can load on demand — invoked like slash commands, extensible with your own."
toc={toc}
>
<h2 id="what-are-skills">what are skills</h2>
<p>
A skill is a markdown instruction pack (plus optional scripts) that teaches the agent
a repeatable workflow. Invoke one by typing its slash form — e.g.
<code>/simplify</code> — or let the agent activate it when a task matches its
description. List everything available in your session with <code>/skills</code>.
</p>
<h2 id="bundled-skills">bundled skills</h2>
{skills.map(s => (
<div class="cmd-entry">
<h3 id={`skill-${s.name}`}>
<code>{s.invocation}</code>
<a class="anchor-link" href={`#skill-${s.name}`} aria-label={`link to ${s.invocation}`}>#</a>
</h3>
<p>{s.description}</p>
</div>
))}
<h2 id="your-own">writing your own</h2>
<p>
Project skills live in <code>.claude/skills/&lt;name&gt;/SKILL.md</code>; user-level
skills in <code>~/.claude/skills/</code>. Each SKILL.md has frontmatter
(<code>name</code>, <code>description</code>) followed by the instructions the agent
loads when the skill is invoked. Plugins can ship skills too — manage them with
<code>/plugin</code>.
</p>
</DocsLayout>
+38
View File
@@ -0,0 +1,38 @@
---
import DocsLayout from '../../layouts/DocsLayout.astro'
import { commandCategories, commands, commandsByCategory } from '../../data/commands'
const toc = commandCategories.map(c => ({ id: c.id, label: c.label }))
---
<DocsLayout
title={`openclaude slash commands reference — all ${commands.length}+ commands`}
description={`Complete reference for every openclaude slash command: /init, /config, /mcp, /review, /compact, /resume and ${commands.length}+ more, grouped by category with descriptions.`}
heading="slash commands reference"
ogImage="/og/commands.png"
lede={`All ${commands.length} built-in slash commands, grouped by what they do. Type / inside a session to autocomplete any of them; plugins and skills can add more.`}
toc={toc}
>
<p>
Commands run inside an interactive session and start with <code>/</code>. For flags
you pass when launching the binary, see the
<a href="/docs/cli-reference/">CLI reference</a> instead. You can also extend this
list with your own <a href="/docs/skills/">skills</a>.
</p>
{commandCategories.map(cat => (
<section>
<h2 id={cat.id}>{cat.label}</h2>
<p>{cat.blurb}</p>
{commandsByCategory(cat.id).map(cmd => (
<div class="cmd-entry">
<h3 id={`cmd-${cmd.name}`}>
<code>/{cmd.name}{cmd.args ? ` ${cmd.args}` : ''}</code>
<a class="anchor-link" href={`#cmd-${cmd.name}`} aria-label={`link to /${cmd.name}`}>#</a>
</h3>
<p>{cmd.description}</p>
</div>
))}
</section>
))}
</DocsLayout>
+283
View File
@@ -0,0 +1,283 @@
---
import BaseLayout from '../layouts/BaseLayout.astro'
import CopyCommand from '../components/CopyCommand.astro'
import Terminal from '../components/Terminal.astro'
import { SITE } from '../data/site'
const features = [
{
title: 'any model, one terminal',
body: 'local ollama, openai-compatible apis, gemini, github models, gateways — switch providers with one command, no rewrites.',
href: '/docs/providers/',
link: 'provider setup →',
},
{
title: 'real tools, not just chat',
body: 'bash, file edits, grep, glob, mcp servers, skills — wired into the agent loop, not bolted on.',
href: '/docs/slash-commands/',
link: 'command reference →',
},
{
title: 'scriptable from day one',
body: 'non-interactive --print mode with json and stream-json output, tool allowlists, budgets, and session control.',
href: '/docs/cli-reference/',
link: 'cli reference →',
},
{
title: 'profiles per repo',
body: 'save model, base url, auth, and runtime defaults so every clone boots the same way.',
href: '/docs/configuration/',
link: 'configuration →',
},
{
title: 'streaming, not batch',
body: 'watch the agent think, call tools, and produce diffs live. every change stays reviewable.',
href: '/docs/quickstart/',
link: 'quickstart →',
},
{
title: 'sessions that persist',
body: 'resume, branch, and rewind conversations. background tasks, worktree isolation, remote control from your phone.',
href: '/docs/slash-commands/#session',
link: 'session commands →',
},
]
const providers = [
'OpenAI', 'Gemini', 'Ollama', 'GitHub Models', 'OpenRouter', 'DeepSeek',
'Groq', 'Mistral', 'LM Studio', 'NEAR AI', 'Xiaomi MiMo', 'LiteLLM',
]
const jsonLd = [
{
'@context': 'https://schema.org',
'@type': 'SoftwareApplication',
name: 'openclaude',
applicationCategory: 'DeveloperApplication',
operatingSystem: 'macOS, Linux, Windows',
softwareVersion: SITE.version,
url: SITE.url,
downloadUrl: SITE.npmUrl,
description: SITE.description,
offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
author: { '@type': 'Organization', name: 'GitLawb', url: SITE.gitlawb },
},
{
'@context': 'https://schema.org',
'@type': 'WebSite',
name: SITE.name,
url: SITE.url,
},
]
---
<BaseLayout title={SITE.title} description={SITE.description} jsonLd={jsonLd}>
<section class="hero grid-bg" aria-labelledby="hero-heading">
<div class="container hero-inner">
<p class="pill fade-up"><span class="dot" aria-hidden="true"></span>open source · gitlawb-aligned · model-neutral</p>
<h1 id="hero-heading" class="text-hero fade-up fade-up-1">
runs anywhere.<br />uses anything.
</h1>
<p class="hero-sub fade-up fade-up-2">
not a chatbot wrapper or another ide plugin. an open coding agent that runs in
your terminal, talks to any model, and keeps every change reviewable.
</p>
<div class="hero-cta fade-up fade-up-3">
<CopyCommand command={SITE.installCommand} />
<a class="button button-ghost" href="/docs/quickstart/">read the docs →</a>
</div>
<p class="hero-foot fade-up fade-up-4">
works with openai, gemini, codex, ollama, lm studio, litellm, and 200+ models.
</p>
</div>
</section>
<section class="section" aria-labelledby="demo-heading">
<div class="container">
<div class="section-head">
<p class="eyebrow">// in action</p>
<h2 id="demo-heading">an agent loop you can watch.</h2>
</div>
<Terminal>
<span class="ln"><span class="t-prompt">$</span> openclaude</span>
<span class="ln t-dim">openclaude v{SITE.version} · provider: ollama · model: qwen3-coder</span>
<span class="ln">&nbsp;</span>
<span class="ln"><span class="t-prompt">&gt;</span> add retry with backoff to the fetch client</span>
<span class="ln">&nbsp;</span>
<span class="ln"><span class="t-info">●</span> Read src/lib/fetchClient.ts</span>
<span class="ln"><span class="t-info">●</span> Grep "fetchWithTimeout" — 3 matches</span>
<span class="ln"><span class="t-ok">●</span> Edit src/lib/fetchClient.ts <span class="t-dim">+18 -2</span></span>
<span class="ln"><span class="t-ok">●</span> Bash bun test fetchClient <span class="t-dim">— 7 pass</span></span>
<span class="ln">&nbsp;</span>
<span class="ln t-dim">added exponential backoff (3 retries, jitter). tests green.</span>
<span class="ln cursor">&nbsp;</span>
</Terminal>
</div>
</section>
<section class="section section-tint" aria-labelledby="features-heading">
<div class="container">
<div class="section-head">
<p class="eyebrow">// features</p>
<h2 id="features-heading">built for agents that ship code.</h2>
</div>
<div class="card-grid">
{features.map(f => (
<a class="card" href={f.href}>
<h3>{f.title}</h3>
<p>{f.body}</p>
<span class="card-link">{f.link}</span>
</a>
))}
</div>
</div>
</section>
<section class="section" aria-labelledby="providers-heading">
<div class="container">
<div class="section-head">
<p class="eyebrow">// providers</p>
<h2 id="providers-heading">bring your own model.</h2>
<p class="lede">
one agent, every backend. wire a provider once with <code>/provider</code> and
switch models mid-session.
</p>
</div>
<ul class="provider-strip" aria-label="supported providers">
{providers.map(p => <li>{p}</li>)}
</ul>
<p class="text-body-dim provider-foot">
plus bedrock, vertex, codex oauth, atomic chat, opengateway, and any
openai-compatible endpoint. <a href="/docs/providers/">see all providers →</a>
</p>
</div>
</section>
<section class="section section-tint" aria-labelledby="install-heading">
<div class="container">
<div class="section-head">
<p class="eyebrow">// install</p>
<h2 id="install-heading">one line. then write a task.</h2>
</div>
<div class="install-grid">
<CopyCommand command={SITE.installCommand} />
<ol class="install-steps">
<li>
<span class="step-num">01</span>
<div>
<strong>install</strong>
<p>requires node ≥ 20. <a href="/docs/installation/">platform guides →</a></p>
</div>
</li>
<li>
<span class="step-num">02</span>
<div>
<strong>start</strong>
<p>run <code>openclaude</code> in any repo.</p>
</div>
</li>
<li>
<span class="step-num">03</span>
<div>
<strong>pick a provider</strong>
<p>type <code>/provider</code> to wire openai, ollama, gemini, or a gateway.</p>
</div>
</li>
</ol>
</div>
</div>
</section>
</BaseLayout>
<style>
.hero {
padding: calc(var(--nav-h) + clamp(4rem, 12vh, 7rem)) 0 clamp(3.5rem, 9vh, 6rem);
}
.hero-inner {
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
gap: 1.4rem;
position: relative;
}
.hero-sub {
max-width: 36rem;
margin: 0;
color: var(--muted);
font-size: clamp(0.9rem, 1.4vw, 1rem);
line-height: 1.7;
}
.hero-cta {
display: flex;
flex-wrap: wrap;
justify-content: center;
align-items: stretch;
gap: 0.75rem;
margin-top: 0.4rem;
}
.hero-foot {
margin: 0.4rem 0 0;
color: var(--faint);
font-size: 0.73rem;
letter-spacing: 0.02em;
}
.provider-strip {
display: flex;
flex-wrap: wrap;
gap: 1px;
margin: 0;
padding: 0;
list-style: none;
border: 1px solid var(--line);
background: var(--line);
}
.provider-strip li {
flex: 1 1 auto;
padding: 0.85rem 1.2rem;
background: var(--background);
color: var(--muted);
font-size: 0.78rem;
text-align: center;
white-space: nowrap;
}
.provider-foot { margin-top: 1.25rem; }
.provider-foot a { color: var(--accent); }
.install-grid {
display: grid;
grid-template-columns: 1fr;
gap: 2rem;
max-width: 36rem;
}
.install-grid :global(.copy-cmd) { width: 100%; justify-content: flex-start; }
.install-steps {
margin: 0;
padding: 0;
list-style: none;
border-top: 1px solid var(--line);
}
.install-steps li {
display: grid;
grid-template-columns: 2.5rem 1fr;
gap: 1rem;
padding: 1rem 0;
border-bottom: 1px solid var(--line);
}
.step-num {
color: var(--accent);
font-size: 0.72rem;
letter-spacing: 0.18em;
padding-top: 0.18rem;
}
.install-steps strong {
display: block;
margin-bottom: 0.25rem;
color: var(--ink);
font-size: 0.88rem;
font-weight: 600;
}
.install-steps p { margin: 0; color: var(--muted); font-size: 0.85rem; line-height: 1.6; }
.install-steps a { color: var(--accent); }
</style>
-530
View File
@@ -1,530 +0,0 @@
/* ── reset + tokens ───────────────────────────────────────────────────── */
* { box-sizing: border-box; }
:root {
--max: 960px;
/* shared brand */
--accent: #ff7a1a;
--accent-2: #ffb15f;
--accent-soft: rgba(255, 122, 26, 0.14);
--accent-line: rgba(255, 122, 26, 0.40);
font-family: 'SF Mono', 'Fira Code', 'Fira Mono', 'Roboto Mono', 'Courier New', monospace;
font-feature-settings: 'ss01', 'ss02', 'cv01', 'cv11';
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* ── light theme (default) ────────────────────────────────────────────── */
:root,
:root[data-theme='light'] {
color-scheme: light;
--bg: #fbfaf7;
--bg-elev: rgba(251, 250, 247, 0.88);
--bg-soft: rgba(255, 122, 26, 0.05);
--ink: #1a1208;
--ink-2: rgba(26, 18, 8, 0.88);
--muted: rgba(26, 18, 8, 0.64);
--quiet: rgba(26, 18, 8, 0.46);
--line: rgba(26, 18, 8, 0.10);
--line-strong: rgba(255, 122, 26, 0.30);
--hero-glow: rgba(255, 122, 26, 0.28);
--hero-wash: rgba(255, 122, 26, 0.18);
--hero-wash-2: rgba(255, 177, 95, 0.10);
--copy-bg: #ffffff;
--selection-fg: #ffffff;
--scroll-thumb: #d8c9bc;
}
/* ── dark theme ───────────────────────────────────────────────────────── */
:root[data-theme='dark'] {
color-scheme: dark;
--bg: #000000;
--bg-elev: rgba(0, 0, 0, 0.85);
--bg-soft: rgba(255, 255, 255, 0.025);
--ink: #ffffff;
--ink-2: rgba(255, 255, 255, 0.82);
--muted: rgba(255, 255, 255, 0.55);
--quiet: rgba(255, 255, 255, 0.38);
--line: rgba(255, 255, 255, 0.10);
--line-strong: rgba(255, 255, 255, 0.20);
--hero-glow: rgba(255, 122, 26, 0.22);
--hero-wash: rgba(255, 122, 26, 0.16);
--hero-wash-2: rgba(255, 122, 26, 0.06);
--copy-bg: rgba(0, 0, 0, 0.5);
--selection-fg: #120804;
--scroll-thumb: #3a2615;
}
html {
scroll-behavior: smooth;
background: var(--bg);
transition: background-color 0.25s ease;
}
body {
min-width: 320px;
margin: 0;
background:
radial-gradient(circle at 78% -4%, var(--hero-wash), transparent 420px),
radial-gradient(circle at 12% 18%, var(--hero-wash-2), transparent 360px),
var(--bg);
color: var(--ink);
overflow-x: hidden;
transition: background-color 0.25s ease, color 0.25s ease;
}
::-webkit-scrollbar { width: 3px; height: 3px; }
::-webkit-scrollbar-track { background: var(--bg); }
::-webkit-scrollbar-thumb { background: var(--scroll-thumb); }
::selection { background: var(--accent); color: var(--selection-fg); }
a {
color: inherit;
text-decoration: none;
transition: color 0.18s ease;
}
a:hover { color: var(--ink); }
button, a { -webkit-tap-highlight-color: transparent; }
button:focus-visible,
a:focus-visible {
outline: 1px solid var(--accent);
outline-offset: 3px;
}
button { font: inherit; }
code, pre { font-family: inherit; }
h1, h2, h3, p { margin-top: 0; }
/* ── shell ────────────────────────────────────────────────────────────── */
.site-shell { overflow: hidden; }
.nav,
.shell-main,
.footer {
width: min(100% - 2.5rem, var(--max));
margin: 0 auto;
}
@media (max-width: 600px) {
.nav, .shell-main, .footer {
width: min(100% - 1.5rem, var(--max));
}
}
/* ── header ───────────────────────────────────────────────────────────── */
.site-header {
position: sticky;
top: 0;
z-index: 30;
background: var(--bg-elev);
backdrop-filter: blur(14px);
transition: background-color 0.25s ease;
}
.nav {
display: flex;
height: 64px;
align-items: center;
justify-content: space-between;
gap: 1.5rem;
}
.nav .brand img {
width: 36px;
height: 36px;
}
.nav .brand {
font-size: 0.95rem;
gap: 0.6rem;
}
@media (max-width: 600px) {
.nav .brand img { width: 30px; height: 30px; }
.nav .brand { font-size: 0.85rem; }
}
.nav-rule {
width: min(100% - 2.5rem, var(--max));
margin: 0 auto;
border-top: 1px dashed var(--line);
}
.brand {
display: inline-flex;
align-items: center;
gap: 0.5rem;
color: var(--ink);
font-size: 0.85rem;
font-weight: 600;
letter-spacing: -0.01em;
}
.brand img {
width: 22px;
height: 22px;
display: block;
}
.brand .ver {
margin-left: 0.4rem;
color: var(--quiet);
font-size: 0.7rem;
font-weight: 400;
}
.nav-right {
display: flex;
align-items: center;
gap: 1.4rem;
}
.nav-links {
display: flex;
align-items: center;
gap: 1.6rem;
}
.nav-links a {
color: var(--muted);
font-size: 0.78rem;
}
.nav-links a:hover { color: var(--ink); }
.theme-toggle {
display: inline-flex;
align-items: center;
justify-content: center;
height: 28px;
width: 28px;
border: 1px solid var(--line);
background: var(--bg-soft);
color: var(--muted);
cursor: pointer;
font-size: 0.85rem;
line-height: 1;
transition: border-color 0.18s ease, color 0.18s ease, background-color 0.18s ease;
}
.theme-toggle:hover {
border-color: var(--accent);
color: var(--accent);
}
@media (max-width: 600px) {
.nav-right { gap: 0.85rem; }
.nav-links { gap: 1rem; }
.nav-links a { font-size: 0.72rem; }
}
/* ── shared atoms ─────────────────────────────────────────────────────── */
.eyebrow {
margin: 0 0 0.85rem;
color: var(--accent);
font-size: 0.72rem;
font-weight: 500;
letter-spacing: 0.04em;
}
.button {
display: inline-flex;
height: 44px;
align-items: center;
justify-content: center;
gap: 0.45rem;
padding: 0 1.05rem;
border: 1px solid transparent;
font-size: 0.8rem;
font-weight: 500;
letter-spacing: 0.01em;
cursor: pointer;
transition: border-color 0.2s ease, background-color 0.2s ease, color 0.2s ease;
}
.button-ghost {
border-color: var(--line-strong);
color: var(--ink);
background: transparent;
}
.button-ghost:hover {
border-color: var(--ink);
background: rgba(255, 255, 255, 0.04);
}
.section-head {
max-width: 38rem;
margin: 0 auto 2.25rem;
text-align: center;
}
.section-head h2 {
margin: 0;
color: var(--ink);
font-size: clamp(1.6rem, 3vw, 2.1rem);
font-weight: 600;
line-height: 1.15;
letter-spacing: -0.025em;
}
/* ── hero ─────────────────────────────────────────────────────────────── */
.hero {
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
padding: clamp(4rem, 12vh, 8rem) 0 clamp(3rem, 8vh, 5.5rem);
gap: 1.4rem;
}
.hero-eyebrow {
display: inline-flex;
align-items: center;
gap: 0.55rem;
padding: 0.4rem 0.85rem;
border: 1px solid var(--accent-line);
background: var(--bg-soft);
color: var(--ink-2);
font-size: 0.7rem;
letter-spacing: 0.02em;
}
.hero-eyebrow .dot {
width: 6px;
height: 6px;
border-radius: 999px;
background: var(--accent);
box-shadow: 0 0 0 3px var(--accent-soft);
}
.hero-title {
margin: 0;
font-size: clamp(2.4rem, 6vw, 4.4rem);
font-weight: 700;
line-height: 1;
letter-spacing: -0.04em;
color: var(--ink);
text-shadow: 0 0 28px var(--hero-glow);
}
.hero-sub {
max-width: 36rem;
margin: 0;
color: var(--muted);
font-size: clamp(0.95rem, 1.4vw, 1.05rem);
line-height: 1.65;
}
.hero-cta {
display: flex;
flex-wrap: wrap;
justify-content: center;
align-items: stretch;
gap: 0.75rem;
margin-top: 0.4rem;
}
.hero-foot {
margin: 0.6rem 0 0;
color: var(--quiet);
font-size: 0.75rem;
letter-spacing: 0.02em;
}
/* ── copyable command ─────────────────────────────────────────────────── */
.copy-cmd {
display: inline-flex;
align-items: center;
gap: 0.7rem;
height: 44px;
padding: 0 0.95rem;
border: 1px solid var(--accent-line);
background: var(--copy-bg);
color: var(--ink);
font-size: 0.82rem;
cursor: pointer;
box-shadow: 0 8px 24px -16px var(--accent-soft);
transition: border-color 0.2s ease, background-color 0.2s ease, box-shadow 0.2s ease;
}
.copy-cmd:hover {
border-color: var(--accent);
box-shadow: 0 10px 28px -14px var(--accent-soft);
}
.copy-cmd-hero {
height: 48px;
padding: 0 1.1rem;
font-size: 0.88rem;
}
.copy-prefix { color: var(--accent); font-weight: 500; }
.copy-text { color: var(--ink-2); }
.copy-icon {
margin-left: 0.4rem;
color: var(--quiet);
font-size: 0.7rem;
letter-spacing: 0.06em;
text-transform: uppercase;
}
/* ── features ─────────────────────────────────────────────────────────── */
.features {
padding: clamp(3rem, 8vh, 5rem) 0;
}
.feature-list {
display: grid;
grid-template-columns: 1fr;
gap: 0;
margin: 0;
padding: 0;
list-style: none;
border-top: 1px solid var(--line);
}
.feature-row {
display: grid;
grid-template-columns: minmax(180px, 0.32fr) 1fr;
gap: 1.5rem;
padding: 1.4rem 0;
border-bottom: 1px solid var(--line);
}
.feature-row h3 {
margin: 0;
color: var(--ink);
font-size: 0.9rem;
font-weight: 600;
letter-spacing: -0.005em;
}
.feature-row p {
margin: 0;
color: var(--muted);
font-size: 0.88rem;
line-height: 1.65;
}
@media (max-width: 600px) {
.feature-row {
grid-template-columns: 1fr;
gap: 0.4rem;
padding: 1.1rem 0;
}
.feature-row p { font-size: 0.85rem; }
}
/* ── install block ────────────────────────────────────────────────────── */
.install-block {
padding: clamp(3rem, 8vh, 5rem) 0 clamp(4rem, 10vh, 6rem);
}
.install-grid {
display: grid;
grid-template-columns: 1fr;
gap: 2rem;
max-width: 36rem;
margin: 0 auto;
}
.install-grid .copy-cmd {
width: 100%;
justify-content: flex-start;
}
.install-steps {
display: grid;
gap: 0;
margin: 0;
padding: 0;
list-style: none;
border-top: 1px solid var(--line);
}
.install-steps li {
display: grid;
grid-template-columns: 2.5rem 1fr;
gap: 1rem;
padding: 1rem 0;
border-bottom: 1px solid var(--line);
}
.step-num {
color: var(--accent);
font-size: 0.72rem;
letter-spacing: 0.18em;
padding-top: 0.18rem;
}
.install-steps strong {
display: block;
margin-bottom: 0.25rem;
color: var(--ink);
font-size: 0.88rem;
font-weight: 600;
letter-spacing: -0.005em;
}
.install-steps p {
margin: 0;
color: var(--muted);
font-size: 0.85rem;
line-height: 1.6;
}
.install-steps code {
padding: 0.05rem 0.35rem;
border: 1px solid var(--line);
background: rgba(255, 122, 26, 0.06);
color: var(--accent-2);
font-size: 0.8rem;
}
/* ── footer ───────────────────────────────────────────────────────────── */
.footer {
padding: 2rem 0 2.5rem;
border-top: 1px dashed var(--line);
}
.footer-line {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.55rem;
color: var(--quiet);
font-size: 0.74rem;
}
.footer-line .brand {
font-size: 0.78rem;
}
.footer-line .sep {
color: var(--line-strong);
}
.footer-line a {
color: var(--muted);
}
.footer-line a:hover { color: var(--ink); }
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
scroll-behavior: auto !important;
animation-duration: 0.001ms !important;
animation-iteration-count: 1 !important;
}
}
+752
View File
@@ -0,0 +1,752 @@
/* ════════════════════════════════════════════════════════════════════════
openclaude — gitlawb-aligned design tokens
Monochrome surface system driven by --surface-rgb (inverts under light
theme) + openclaude orange accent. Dark is the default theme.
════════════════════════════════════════════════════════════════════════ */
* { box-sizing: border-box; }
:root {
--max: 1152px;
--nav-h: 56px;
--background: #000000;
--foreground: #ffffff;
--surface-rgb: 255, 255, 255;
/* openclaude accent */
--accent: #ff7a1a;
--accent-strong: #ff8f3d;
--accent-soft: rgba(255, 122, 26, 0.14);
--accent-line: rgba(255, 122, 26, 0.4);
/* gitlawb semantic colors */
--green: #4ade80;
--red: #f87171;
--yellow: #facc15;
--blue: #60a5fa;
/* derived surfaces */
--ink: var(--foreground);
--ink-2: rgba(var(--surface-rgb), 0.85);
--muted: rgba(var(--surface-rgb), 0.7);
--quiet: rgba(var(--surface-rgb), 0.55);
--faint: rgba(var(--surface-rgb), 0.38);
--line: rgba(var(--surface-rgb), 0.1);
--line-strong: rgba(var(--surface-rgb), 0.2);
--card-bg: rgba(var(--surface-rgb), 0.025);
--card-bg-hover: rgba(var(--surface-rgb), 0.04);
--tile-bg: rgba(var(--surface-rgb), 0.03);
--nav-bg: rgba(0, 0, 0, 0.9);
font-family: 'Geist Mono Variable', ui-monospace, 'SF Mono', 'Fira Code', Menlo, Consolas, monospace;
font-synthesis: none;
text-rendering: optimizelegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
color-scheme: dark;
}
[data-theme='light'] {
--background: #ffffff;
--foreground: #000000;
--surface-rgb: 0, 0, 0;
/* darkened accent for AA contrast on white */
--accent: #e85d00;
--accent-strong: #c24e00;
--accent-soft: rgba(232, 93, 0, 0.1);
--accent-line: rgba(232, 93, 0, 0.35);
--green: #15803d;
--red: #b91c1c;
--yellow: #a16207;
--blue: #2563eb;
--nav-bg: rgba(255, 255, 255, 0.9);
color-scheme: light;
}
html {
scroll-behavior: smooth;
background: var(--background);
}
body {
min-width: 320px;
margin: 0;
background: var(--background);
color: var(--ink);
font-size: 0.875rem;
line-height: 1.55;
overflow-x: hidden;
transition: background-color 0.2s ease, color 0.2s ease;
}
::selection { background: var(--accent); color: #000; }
[data-theme='light'] ::selection { color: #fff; }
::-webkit-scrollbar { width: 4px; height: 4px; }
::-webkit-scrollbar-track { background: var(--background); }
::-webkit-scrollbar-thumb { background: rgba(var(--surface-rgb), 0.25); }
a {
color: inherit;
text-decoration: none;
transition: color 0.18s ease, border-color 0.18s ease;
}
a:hover { color: var(--ink); }
button { font: inherit; cursor: pointer; }
button, a { -webkit-tap-highlight-color: transparent; }
button:focus-visible,
a:focus-visible {
outline: 1px solid var(--accent);
outline-offset: 3px;
}
code, pre, kbd { font-family: inherit; }
h1, h2, h3, h4, p { margin-top: 0; }
img { max-width: 100%; }
h1[id], h2[id], h3[id], h4[id] { scroll-margin-top: calc(var(--nav-h) + 24px); }
.visually-hidden {
position: absolute;
width: 1px;
height: 1px;
margin: -1px;
padding: 0;
overflow: hidden;
clip: rect(0 0 0 0);
white-space: nowrap;
border: 0;
}
.skip-link {
position: absolute;
left: -9999px;
top: 0;
z-index: 100;
padding: 0.5rem 1rem;
background: var(--accent);
color: #000;
}
.skip-link:focus { left: 0; }
/* ── type scale (gitlawb) ─────────────────────────────────────────────── */
.text-hero {
font-size: clamp(2.5rem, 6vw, 3.75rem);
font-weight: 700;
line-height: 1.02;
letter-spacing: -0.02em;
color: var(--ink);
}
.text-heading {
font-size: 1.125rem;
font-weight: 600;
line-height: 1.3;
color: var(--ink);
}
.text-body { font-size: 0.875rem; line-height: 1.55; color: var(--ink-2); }
.text-body-dim { font-size: 0.875rem; line-height: 1.55; color: var(--muted); }
.text-label {
font-size: 0.75rem;
font-weight: 500;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--muted);
}
.eyebrow {
margin: 0 0 0.85rem;
color: var(--accent);
font-size: 0.72rem;
font-weight: 500;
letter-spacing: 0.08em;
text-transform: uppercase;
}
/* ── layout primitives ────────────────────────────────────────────────── */
.container {
width: 100%;
max-width: var(--max);
margin: 0 auto;
padding: 0 1.5rem;
}
.section { padding: 6rem 0; border-top: 1px solid var(--line); }
.section-tint { background: rgba(var(--surface-rgb), 0.015); }
.section-head { max-width: 40rem; margin-bottom: 2.5rem; }
.section-head h2 {
margin: 0;
font-size: clamp(1.5rem, 3vw, 2rem);
font-weight: 600;
line-height: 1.15;
letter-spacing: -0.02em;
color: var(--ink);
}
.section-head .lede { margin: 0.85rem 0 0; color: var(--muted); }
@media (max-width: 640px) {
.section { padding: 4rem 0; }
}
/* ── grid background (hero signature) ─────────────────────────────────── */
.grid-bg {
position: relative;
}
.grid-bg::before {
content: '';
position: absolute;
inset: 0;
background-image:
linear-gradient(rgba(var(--surface-rgb), 0.05) 1px, transparent 1px),
linear-gradient(90deg, rgba(var(--surface-rgb), 0.05) 1px, transparent 1px);
background-size: 80px 80px;
opacity: 0.5;
pointer-events: none;
mask-image: linear-gradient(to bottom, black 60%, transparent);
}
/* ── nav ──────────────────────────────────────────────────────────────── */
.site-nav {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 50;
height: var(--nav-h);
border-bottom: 1px solid var(--line);
background: var(--nav-bg);
backdrop-filter: blur(8px);
-webkit-backdrop-filter: blur(8px);
}
.site-nav .container {
display: flex;
height: 100%;
align-items: center;
justify-content: space-between;
gap: 1.5rem;
}
.brand {
display: inline-flex;
align-items: center;
gap: 0.55rem;
color: var(--ink);
font-size: 0.85rem;
font-weight: 600;
}
.brand img { width: 22px; height: 22px; display: block; }
.brand .ver {
margin-left: 0.25rem;
color: var(--faint);
font-size: 0.7rem;
font-weight: 400;
}
.nav-links {
display: flex;
align-items: center;
gap: 1.5rem;
}
.nav-links a {
color: var(--muted);
font-size: 0.78rem;
}
.nav-links a:hover,
.nav-links a[aria-current='page'] { color: var(--ink); }
.theme-toggle {
border: none;
background: none;
padding: 0.25rem 0;
color: var(--muted);
font-size: 0.78rem;
letter-spacing: 0.02em;
}
.theme-toggle:hover { color: var(--accent); }
.nav-burger {
display: none;
border: none;
background: none;
padding: 0.25rem 0;
color: var(--muted);
font-size: 0.78rem;
}
.nav-burger:hover { color: var(--ink); }
.mobile-menu {
display: none;
border-bottom: 1px solid var(--line);
background: var(--background);
}
.mobile-menu a {
display: block;
padding: 0.8rem 1.5rem;
border-top: 1px solid var(--line);
color: var(--muted);
font-size: 0.82rem;
}
.mobile-menu a:hover { color: var(--ink); }
@media (max-width: 760px) {
.nav-links { display: none; }
.nav-burger { display: inline-flex; }
.site-nav.menu-open ~ * .mobile-menu,
.site-nav.menu-open .mobile-menu {
display: block;
position: absolute;
top: var(--nav-h);
left: 0;
right: 0;
}
}
/* ── buttons / pills ──────────────────────────────────────────────────── */
.button {
display: inline-flex;
height: 44px;
align-items: center;
justify-content: center;
gap: 0.45rem;
padding: 0 1.1rem;
border: 1px solid transparent;
font-size: 0.8rem;
font-weight: 500;
transition: border-color 0.2s ease, background-color 0.2s ease, color 0.2s ease;
}
.button-solid {
background: var(--accent);
color: #000;
border-color: var(--accent);
}
[data-theme='light'] .button-solid { color: #fff; }
.button-solid:hover { background: var(--accent-strong); border-color: var(--accent-strong); color: #000; }
[data-theme='light'] .button-solid:hover { color: #fff; }
.button-ghost {
border-color: var(--line-strong);
color: var(--ink);
background: transparent;
}
.button-ghost:hover {
border-color: rgba(var(--surface-rgb), 0.4);
background: rgba(var(--surface-rgb), 0.04);
color: var(--ink);
}
.pill {
display: inline-flex;
align-items: center;
gap: 0.55rem;
padding: 0.35rem 0.85rem;
border: 1px solid var(--line-strong);
color: var(--ink-2);
font-size: 0.7rem;
letter-spacing: 0.18em;
text-transform: uppercase;
}
.pill .dot {
width: 6px;
height: 6px;
border-radius: 999px;
background: var(--accent);
box-shadow: 0 0 0 3px var(--accent-soft);
}
/* ── copyable command ─────────────────────────────────────────────────── */
.copy-cmd {
display: inline-flex;
align-items: center;
gap: 0.7rem;
height: 44px;
padding: 0 0.95rem;
border: 1px solid var(--accent-line);
background: var(--card-bg);
color: var(--ink);
font-size: 0.82rem;
transition: border-color 0.2s ease, background-color 0.2s ease;
}
.copy-cmd:hover { border-color: var(--accent); background: var(--card-bg-hover); }
.copy-cmd .prefix { color: var(--accent); font-weight: 500; }
.copy-cmd .cmd { color: var(--ink-2); white-space: nowrap; }
.copy-cmd .hint {
margin-left: 0.4rem;
color: var(--faint);
font-size: 0.68rem;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.copy-cmd.copied .hint { color: var(--green); }
@media (max-width: 640px) {
.copy-cmd { font-size: 0.72rem; padding: 0 0.7rem; gap: 0.5rem; }
}
/* ── cards / grids ────────────────────────────────────────────────────── */
.card-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1px;
border: 1px solid var(--line);
background: var(--line);
}
@media (max-width: 900px) { .card-grid { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 600px) { .card-grid { grid-template-columns: 1fr; } }
.card {
display: block;
padding: 1.5rem;
background: var(--background);
transition: background-color 0.18s ease;
}
.card:hover { background: var(--card-bg-hover); }
.card h3 {
margin: 0 0 0.5rem;
font-size: 0.9rem;
font-weight: 600;
color: var(--ink);
}
.card p { margin: 0; font-size: 0.82rem; line-height: 1.6; color: var(--muted); }
.card .card-link {
display: inline-block;
margin-top: 0.85rem;
color: var(--accent);
font-size: 0.75rem;
}
.card:hover .card-link { color: var(--accent-strong); }
/* ── terminal mockup ──────────────────────────────────────────────────── */
.terminal {
border: 1px solid var(--line-strong);
background: rgba(var(--surface-rgb), 0.02);
font-size: 0.78rem;
line-height: 1.7;
}
.terminal-bar {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.55rem 0.9rem;
border-bottom: 1px solid var(--line);
color: var(--faint);
font-size: 0.68rem;
letter-spacing: 0.08em;
}
.terminal-bar .dots { display: inline-flex; gap: 0.3rem; }
.terminal-bar .dots i {
width: 8px;
height: 8px;
border-radius: 999px;
background: rgba(var(--surface-rgb), 0.15);
}
.terminal-body { padding: 1rem 1.1rem; overflow-x: auto; }
.terminal-body .ln { display: block; white-space: pre; }
.t-prompt { color: var(--accent); }
.t-dim { color: var(--quiet); }
.t-ok { color: var(--green); }
.t-info { color: var(--blue); }
.t-warn { color: var(--yellow); }
.cursor::after {
content: '▋';
color: var(--accent);
animation: blink 1s step-end infinite;
}
@keyframes blink { 50% { opacity: 0; } }
/* ── inline code / pre blocks ─────────────────────────────────────────── */
code:not(pre code) {
padding: 0.08rem 0.35rem;
border: 1px solid var(--line);
background: var(--tile-bg);
color: var(--accent);
font-size: 0.8em;
white-space: nowrap;
}
pre {
margin: 1rem 0;
padding: 1rem 1.1rem;
border: 1px solid var(--line);
background: rgba(var(--surface-rgb), 0.02);
font-size: 0.78rem;
line-height: 1.7;
overflow-x: auto;
color: var(--ink-2);
}
kbd {
padding: 0.08rem 0.4rem;
border: 1px solid var(--line-strong);
border-bottom-width: 2px;
background: var(--tile-bg);
color: var(--ink-2);
font-size: 0.78em;
}
/* ── tables (reference docs) ──────────────────────────────────────────── */
.table-wrap { overflow-x: auto; margin: 1rem 0; }
table {
width: 100%;
border-collapse: collapse;
border: 1px solid var(--line);
font-size: 0.8rem;
}
th {
padding: 0.6rem 0.85rem;
border: 1px solid var(--line);
background: var(--tile-bg);
color: var(--muted);
font-size: 0.7rem;
font-weight: 500;
letter-spacing: 0.08em;
text-transform: uppercase;
text-align: left;
}
td {
padding: 0.6rem 0.85rem;
border: 1px solid var(--line);
color: var(--ink-2);
vertical-align: top;
line-height: 1.55;
}
td:first-child { white-space: nowrap; }
@media (max-width: 640px) { td:first-child { white-space: normal; } }
/* ── footer ───────────────────────────────────────────────────────────── */
.site-footer {
border-top: 1px solid var(--line);
padding: 3rem 0;
}
.footer-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 2rem;
}
@media (max-width: 760px) { .footer-grid { grid-template-columns: repeat(2, 1fr); } }
.footer-col h4 {
margin: 0 0 0.9rem;
color: var(--muted);
font-size: 0.7rem;
font-weight: 500;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.footer-col ul { margin: 0; padding: 0; list-style: none; }
.footer-col li { margin-bottom: 0.55rem; }
.footer-col a { color: var(--quiet); font-size: 0.78rem; }
.footer-col a:hover { color: var(--ink); }
.footer-bottom {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.6rem;
margin-top: 2.5rem;
padding-top: 1.5rem;
border-top: 1px solid var(--line);
color: var(--faint);
font-size: 0.72rem;
}
.footer-bottom .sep { color: var(--line-strong); }
.footer-bottom a { color: var(--quiet); }
.footer-bottom a:hover { color: var(--ink); }
/* ── docs layout ──────────────────────────────────────────────────────── */
.docs-shell {
display: grid;
grid-template-columns: 220px minmax(0, 1fr) 200px;
gap: 3rem;
padding: calc(var(--nav-h) + 2.5rem) 0 5rem;
}
@media (max-width: 1024px) {
.docs-shell { grid-template-columns: 220px minmax(0, 1fr); }
.docs-toc { display: none; }
}
@media (max-width: 760px) {
.docs-shell { grid-template-columns: 1fr; gap: 1.5rem; }
.docs-sidebar { order: 2; border-top: 1px solid var(--line); padding-top: 1.5rem; }
.docs-article { order: 1; }
}
.docs-sidebar nav { position: sticky; top: calc(var(--nav-h) + 2rem); }
.docs-sidebar h4 {
margin: 0 0 0.7rem;
color: var(--muted);
font-size: 0.68rem;
font-weight: 500;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.docs-sidebar ul { margin: 0 0 1.8rem; padding: 0; list-style: none; }
.docs-sidebar li { margin-bottom: 0.15rem; }
.docs-sidebar a {
display: block;
padding: 0.3rem 0.7rem;
border-left: 1px solid var(--line);
color: var(--quiet);
font-size: 0.78rem;
}
.docs-sidebar a:hover { color: var(--ink); border-left-color: var(--line-strong); }
.docs-sidebar a[aria-current='page'] {
color: var(--accent);
border-left-color: var(--accent);
}
.docs-article { min-width: 0; }
.docs-article h1 {
margin: 0 0 0.85rem;
font-size: clamp(1.7rem, 3.5vw, 2.25rem);
font-weight: 700;
letter-spacing: -0.02em;
line-height: 1.1;
}
.docs-article .lede {
margin: 0 0 2.25rem;
color: var(--muted);
font-size: 0.92rem;
line-height: 1.65;
}
.docs-article h2 {
margin: 2.75rem 0 0.9rem;
padding-top: 1.5rem;
border-top: 1px solid var(--line);
font-size: 1.15rem;
font-weight: 600;
letter-spacing: -0.01em;
}
.docs-article h3 {
margin: 1.9rem 0 0.5rem;
font-size: 0.95rem;
font-weight: 600;
}
.docs-article p, .docs-article li { color: var(--ink-2); font-size: 0.85rem; line-height: 1.7; }
.docs-article ul, .docs-article ol { padding-left: 1.4rem; }
.docs-article a:not(.button) { color: var(--accent); }
.docs-article a:not(.button):hover { color: var(--accent-strong); }
.anchor-link {
margin-left: 0.45rem;
color: var(--faint);
font-weight: 400;
opacity: 0;
transition: opacity 0.15s ease;
}
h2:hover .anchor-link, h3:hover .anchor-link { opacity: 1; }
.anchor-link:hover { color: var(--accent); }
.breadcrumbs {
display: flex;
flex-wrap: wrap;
gap: 0.45rem;
margin-bottom: 1.5rem;
color: var(--faint);
font-size: 0.72rem;
}
.breadcrumbs a { color: var(--quiet); }
.breadcrumbs a:hover { color: var(--ink); }
.docs-toc nav { position: sticky; top: calc(var(--nav-h) + 2rem); }
.docs-toc h4 {
margin: 0 0 0.7rem;
color: var(--muted);
font-size: 0.68rem;
font-weight: 500;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.docs-toc ul { margin: 0; padding: 0; list-style: none; max-height: calc(100vh - var(--nav-h) - 8rem); overflow-y: auto; }
.docs-toc li { margin-bottom: 0.1rem; }
.docs-toc a {
display: block;
padding: 0.22rem 0.7rem;
border-left: 1px solid var(--line);
color: var(--quiet);
font-size: 0.72rem;
line-height: 1.45;
}
.docs-toc a.depth-3 { padding-left: 1.4rem; }
.docs-toc a:hover { color: var(--ink); }
.docs-toc a.active { color: var(--accent); border-left-color: var(--accent); }
.docs-pager {
display: flex;
justify-content: space-between;
gap: 1rem;
margin-top: 3.5rem;
padding-top: 1.5rem;
border-top: 1px solid var(--line);
}
.docs-pager a {
display: block;
max-width: 48%;
color: var(--muted);
font-size: 0.78rem;
}
.docs-pager a:hover { color: var(--ink); }
.docs-pager .label { display: block; color: var(--faint); font-size: 0.66rem; letter-spacing: 0.08em; text-transform: uppercase; margin-bottom: 0.3rem; }
/* command reference entries */
.cmd-entry h3 {
display: flex;
align-items: baseline;
flex-wrap: wrap;
gap: 0.5rem;
}
.cmd-entry h3 code { font-size: 0.85rem; }
.cmd-entry .aliases { color: var(--faint); font-size: 0.7rem; font-weight: 400; }
.cmd-entry p { margin: 0.35rem 0 0; }
/* ── animations ───────────────────────────────────────────────────────── */
.fade-up {
opacity: 0;
transform: translateY(20px);
animation: fade-up 0.7s ease forwards;
}
.fade-up-1 { animation-delay: 0.1s; }
.fade-up-2 { animation-delay: 0.2s; }
.fade-up-3 { animation-delay: 0.3s; }
.fade-up-4 { animation-delay: 0.4s; }
.fade-up-5 { animation-delay: 0.5s; }
@keyframes fade-up {
to { opacity: 1; transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
scroll-behavior: auto !important;
animation-duration: 0.001ms !important;
animation-delay: 0s !important;
animation-iteration-count: 1 !important;
transition-duration: 0.001ms !important;
}
.fade-up { opacity: 1; transform: none; }
}
-1
View File
@@ -1 +0,0 @@
declare module '*.css'
+3 -18
View File
@@ -1,20 +1,5 @@
{
"compilerOptions": {
"target": "ES2023",
"useDefineForClassFields": true,
"lib": ["DOM", "DOM.Iterable", "ES2023"],
"allowJs": false,
"skipLibCheck": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"module": "ESNext",
"moduleResolution": "Bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx"
},
"include": ["src", "vite.config.ts"]
"extends": "astro/tsconfigs/strict",
"include": [".astro/types.d.ts", "src/**/*"],
"exclude": ["dist"]
}
-6
View File
@@ -1,6 +0,0 @@
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
export default defineConfig({
plugins: [react()],
})