diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000..6240da8 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,21 @@ +# build output +dist/ +# generated types +.astro/ + +# dependencies +node_modules/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + + +# environment variables +.env +.env.production + +# macOS-specific files +.DS_Store diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..19e33b2 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,47 @@ +# KiLM Documentation + +[![Built with Starlight](https://astro.badg.es/v2/built-with-starlight/tiny.svg)](https://starlight.astro.build) +[![Documentation](https://img.shields.io/badge/docs-website-brightgreen.svg)](https://kilm.aristovnik.me) + +This repository contains the documentation for [KiLM (KiCad Library Manager)](https://github.com/barisgit/KiLM), a command-line tool for managing KiCad libraries across projects and workstations. + +## 📚 Documentation Structure + +The documentation is organized into the following sections: + +- **Guides**: Step-by-step tutorials and how-to guides +- **Reference**: Detailed command and API references +- **Community**: Information about contributing and development + +## 🧞 Commands + +All commands are run from the root of the project, from a terminal: + +| Command | Action | +| :------------- | :------------------------------------------- | +| `pnpm install` | Installs dependencies | +| `pnpm dev` | Starts local dev server at `localhost:4321` | +| `pnpm build` | Build your production site to `./dist/` | +| `pnpm preview` | Preview your build locally, before deploying | + +## 🛠️ Project Structure + +``` +. +├── public/ # Static assets +├── src/ +│ ├── assets/ # Images and other assets +│ ├── content/ +│ │ ├── docs/ # Documentation content +│ │ │ ├── guides/ # User guides and tutorials +│ │ │ ├── reference/ # Command reference and API docs +│ │ │ └── community/ # Contributing guidelines +│ └── content.config.ts # Content collection config +├── astro.config.mjs # Astro configuration +└── package.json +``` + +## 🔗 Links + +- [KiLM Documentation Website](https://kilm.aristovnik.me) +- [Starlight Documentation](https://starlight.astro.build/) diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs new file mode 100644 index 0000000..f963ef4 --- /dev/null +++ b/docs/astro.config.mjs @@ -0,0 +1,79 @@ +// @ts-check +import { defineConfig, passthroughImageService } from "astro/config"; +import starlight from "@astrojs/starlight"; + +import tailwindcss from "@tailwindcss/vite"; + +// https://astro.build/config +export default defineConfig({ + image: { + service: passthroughImageService(), + }, + + site: "https://kilm.aristovnik.me", + + integrations: [ + starlight({ + title: "KiLM", + customCss: [ + // Path to your custom CSS file (relative to src) + "./src/styles/global.css", + ], + components: { + // Override the default Footer component with our custom one + Footer: "./src/components/Footer.astro", + }, + social: [ + { + icon: "github", + label: "GitHub", + href: "https://github.com/barisgit/kilm", + }, + ], + sidebar: [ + { + label: "Guides", + items: [ + { label: "Getting Started", link: "/guides/getting-started/" }, + { label: "Installation", link: "/guides/installation/" }, + { label: "Configuration", link: "/guides/configuration/" }, + { + label: "Custom Descriptions", + link: "/guides/custom-descriptions/", + }, + { label: "Automatic Updates", link: "/guides/automatic-updates/" }, + { label: "Troubleshooting", link: "/guides/troubleshooting/" }, + ], + }, + { + label: "Command Reference", + items: [ + { label: "Overview", link: "/reference/cli/" }, // Optional: Add an overview page + { label: "init", link: "/reference/cli/init/" }, + { label: "add-3d", link: "/reference/cli/add-3d/" }, + { label: "config", link: "/reference/cli/config/" }, + { label: "setup", link: "/reference/cli/setup/" }, + { label: "pin", link: "/reference/cli/pin/" }, + { label: "unpin", link: "/reference/cli/unpin/" }, + { label: "template", link: "/reference/cli/template/" }, + { label: "list", link: "/reference/cli/list/" }, + { label: "status", link: "/reference/cli/status/" }, + { label: "update", link: "/reference/cli/update/" }, + { label: "add-hook", link: "/reference/cli/add-hook/" }, + ], + }, + { + label: "Community", + items: [ + { label: "Development Setup", link: "/community/development/" }, + { label: "Contributing", link: "/community/contributing/" }, + { label: "License", link: "/community/license/" }, + ], + }, + ], + }), + ], + vite: { + plugins: [tailwindcss()], + }, +}); diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 0000000..dc8c720 --- /dev/null +++ b/docs/package.json @@ -0,0 +1,23 @@ +{ + "name": "kilm-docs", + "type": "module", + "version": "0.0.1", + "scripts": { + "dev": "astro dev", + "start": "astro dev", + "build": "astro build", + "preview": "astro preview", + "astro": "astro" + }, + "dependencies": { + "@astrojs/starlight": "^0.33.2", + "@astrojs/starlight-tailwind": "^4.0.0", + "@tailwindcss/vite": "^4.1.4", + "astro": "^5.6.1", + "prettier": "^3.6.2", + "tailwindcss": "^4.1.4" + }, + "devDependencies": { + "sharp": "^0.32.6" + } +} diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml new file mode 100644 index 0000000..c6362ba --- /dev/null +++ b/docs/pnpm-lock.yaml @@ -0,0 +1,6259 @@ +lockfileVersion: "9.0" + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + .: + dependencies: + "@astrojs/starlight": + specifier: ^0.33.2 + version: 0.33.2(astro@5.7.0(jiti@2.4.2)(lightningcss@1.29.2)(rollup@4.40.0)(typescript@5.8.3)) + "@astrojs/starlight-tailwind": + specifier: ^4.0.0 + version: 4.0.0(@astrojs/starlight@0.33.2(astro@5.7.0(jiti@2.4.2)(lightningcss@1.29.2)(rollup@4.40.0)(typescript@5.8.3)))(tailwindcss@4.1.4) + "@tailwindcss/vite": + specifier: ^4.1.4 + version: 4.1.4(vite@6.2.6(jiti@2.4.2)(lightningcss@1.29.2)) + astro: + specifier: ^5.6.1 + version: 5.7.0(jiti@2.4.2)(lightningcss@1.29.2)(rollup@4.40.0)(typescript@5.8.3) + prettier: + specifier: ^3.6.2 + version: 3.6.2 + tailwindcss: + specifier: ^4.1.4 + version: 4.1.4 + devDependencies: + sharp: + specifier: ^0.32.6 + version: 0.32.6 + +packages: + "@astrojs/compiler@2.11.0": + resolution: + { + integrity: sha512-zZOO7i+JhojO8qmlyR/URui6LyfHJY6m+L9nwyX5GiKD78YoRaZ5tzz6X0fkl+5bD3uwlDHayf6Oe8Fu36RKNg==, + } + + "@astrojs/internal-helpers@0.6.1": + resolution: + { + integrity: sha512-l5Pqf6uZu31aG+3Lv8nl/3s4DbUzdlxTWDof4pEpto6GUJNhhCbelVi9dEyurOVyqaelwmS9oSyOWOENSfgo9A==, + } + + "@astrojs/markdown-remark@6.3.1": + resolution: + { + integrity: sha512-c5F5gGrkczUaTVgmMW9g1YMJGzOtRvjjhw6IfGuxarM6ct09MpwysP10US729dy07gg8y+ofVifezvP3BNsWZg==, + } + + "@astrojs/mdx@4.2.4": + resolution: + { + integrity: sha512-c832AWpiMCcuPY8j+yr5T+hOf8n5RlKLFHlNTt15xxkOk3zjFJP81TIYKrMrbhD5rMzJ09Ixi+xM0m68w2Q0DQ==, + } + engines: { node: ^18.17.1 || ^20.3.0 || >=22.0.0 } + peerDependencies: + astro: ^5.0.0 + + "@astrojs/prism@3.2.0": + resolution: + { + integrity: sha512-GilTHKGCW6HMq7y3BUv9Ac7GMe/MO9gi9GW62GzKtth0SwukCu/qp2wLiGpEujhY+VVhaG9v7kv/5vFzvf4NYw==, + } + engines: { node: ^18.17.1 || ^20.3.0 || >=22.0.0 } + + "@astrojs/sitemap@3.3.0": + resolution: + { + integrity: sha512-nYE4lKQtk+Kbrw/w0G0TTgT724co0jUsU4tPlHY9au5HmTBKbwiCLwO/15b1/y13aZ4Kr9ZbMeMHlXuwn0ty4Q==, + } + + "@astrojs/starlight-tailwind@4.0.0": + resolution: + { + integrity: sha512-x1hPSg9FzayOg25fTlcbMtp3YAdA2KZC2G2ee2yk+JLD2j1v1ZpWXeg5QgRjeUU5V9d9Tx3HWuIrWvSC5clB2A==, + } + peerDependencies: + "@astrojs/starlight": ">=0.34.0" + tailwindcss: ^4.0.0 + + "@astrojs/starlight@0.33.2": + resolution: + { + integrity: sha512-UpvPBMtZrP/x17uQmdOxm8lUTtmEJ0csTprQT8fd8HSHDn/pSK69fOsSjl6tk83ROMOARC5/DivExSxxJADNSA==, + } + peerDependencies: + astro: ^5.1.5 + + "@astrojs/telemetry@3.2.0": + resolution: + { + integrity: sha512-wxhSKRfKugLwLlr4OFfcqovk+LIFtKwLyGPqMsv+9/ibqqnW3Gv7tBhtKEb0gAyUAC4G9BTVQeQahqnQAhd6IQ==, + } + engines: { node: ^18.17.1 || ^20.3.0 || >=22.0.0 } + + "@babel/helper-string-parser@7.25.9": + resolution: + { + integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-validator-identifier@7.25.9": + resolution: + { + integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==, + } + engines: { node: ">=6.9.0" } + + "@babel/parser@7.27.0": + resolution: + { + integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==, + } + engines: { node: ">=6.0.0" } + hasBin: true + + "@babel/runtime@7.27.0": + resolution: + { + integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==, + } + engines: { node: ">=6.9.0" } + + "@babel/types@7.27.0": + resolution: + { + integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==, + } + engines: { node: ">=6.9.0" } + + "@capsizecss/metrics@3.5.0": + resolution: + { + integrity: sha512-Ju2I/Qn3c1OaU8FgeW4Tc22D4C9NwyVfKzNmzst59bvxBjPoLYNZMqFYn+HvCtn4MpXwiaDtCE8fNuQLpdi9yA==, + } + + "@capsizecss/unpack@2.4.0": + resolution: + { + integrity: sha512-GrSU71meACqcmIUxPYOJvGKF0yryjN/L1aCuE9DViCTJI7bfkjgYDPD1zbNDcINJwSSP6UaBZY9GAbYDO7re0Q==, + } + + "@ctrl/tinycolor@4.1.0": + resolution: + { + integrity: sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==, + } + engines: { node: ">=14" } + + "@emnapi/runtime@1.4.3": + resolution: + { + integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==, + } + + "@esbuild/aix-ppc64@0.25.2": + resolution: + { + integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==, + } + engines: { node: ">=18" } + cpu: [ppc64] + os: [aix] + + "@esbuild/android-arm64@0.25.2": + resolution: + { + integrity: sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [android] + + "@esbuild/android-arm@0.25.2": + resolution: + { + integrity: sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==, + } + engines: { node: ">=18" } + cpu: [arm] + os: [android] + + "@esbuild/android-x64@0.25.2": + resolution: + { + integrity: sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [android] + + "@esbuild/darwin-arm64@0.25.2": + resolution: + { + integrity: sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [darwin] + + "@esbuild/darwin-x64@0.25.2": + resolution: + { + integrity: sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [darwin] + + "@esbuild/freebsd-arm64@0.25.2": + resolution: + { + integrity: sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [freebsd] + + "@esbuild/freebsd-x64@0.25.2": + resolution: + { + integrity: sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [freebsd] + + "@esbuild/linux-arm64@0.25.2": + resolution: + { + integrity: sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [linux] + + "@esbuild/linux-arm@0.25.2": + resolution: + { + integrity: sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==, + } + engines: { node: ">=18" } + cpu: [arm] + os: [linux] + + "@esbuild/linux-ia32@0.25.2": + resolution: + { + integrity: sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==, + } + engines: { node: ">=18" } + cpu: [ia32] + os: [linux] + + "@esbuild/linux-loong64@0.25.2": + resolution: + { + integrity: sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==, + } + engines: { node: ">=18" } + cpu: [loong64] + os: [linux] + + "@esbuild/linux-mips64el@0.25.2": + resolution: + { + integrity: sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==, + } + engines: { node: ">=18" } + cpu: [mips64el] + os: [linux] + + "@esbuild/linux-ppc64@0.25.2": + resolution: + { + integrity: sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==, + } + engines: { node: ">=18" } + cpu: [ppc64] + os: [linux] + + "@esbuild/linux-riscv64@0.25.2": + resolution: + { + integrity: sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==, + } + engines: { node: ">=18" } + cpu: [riscv64] + os: [linux] + + "@esbuild/linux-s390x@0.25.2": + resolution: + { + integrity: sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==, + } + engines: { node: ">=18" } + cpu: [s390x] + os: [linux] + + "@esbuild/linux-x64@0.25.2": + resolution: + { + integrity: sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [linux] + + "@esbuild/netbsd-arm64@0.25.2": + resolution: + { + integrity: sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [netbsd] + + "@esbuild/netbsd-x64@0.25.2": + resolution: + { + integrity: sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [netbsd] + + "@esbuild/openbsd-arm64@0.25.2": + resolution: + { + integrity: sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [openbsd] + + "@esbuild/openbsd-x64@0.25.2": + resolution: + { + integrity: sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [openbsd] + + "@esbuild/sunos-x64@0.25.2": + resolution: + { + integrity: sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [sunos] + + "@esbuild/win32-arm64@0.25.2": + resolution: + { + integrity: sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [win32] + + "@esbuild/win32-ia32@0.25.2": + resolution: + { + integrity: sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==, + } + engines: { node: ">=18" } + cpu: [ia32] + os: [win32] + + "@esbuild/win32-x64@0.25.2": + resolution: + { + integrity: sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [win32] + + "@expressive-code/core@0.41.1": + resolution: + { + integrity: sha512-mG2IrN4t/NGPmEeeswmttsW7W7c96sz3ASjo1psQnOqU5QWAF61HpnBu3lPxHI8iQJyZI8wfAroo9FFpwlkvAQ==, + } + + "@expressive-code/plugin-frames@0.41.1": + resolution: + { + integrity: sha512-cwUUWMr2jNpKpgiepEzM9BGnU60WepE5/Ar3H2aOn8IzcDa4Eeuk0JqQB1Vvpo0bu+VRIxaTA2njoAIeQuMN5w==, + } + + "@expressive-code/plugin-shiki@0.41.1": + resolution: + { + integrity: sha512-xJHk89ECxQpvf7ftTmtEfAKoApYYr5Um7d6fiE6GuY7+WuXN02+ZHH8r5pSJpxlQMfAmavqbNPd3dEJ9v/zHnQ==, + } + + "@expressive-code/plugin-text-markers@0.41.1": + resolution: + { + integrity: sha512-PFvk91yY+H8KVEcyZSrktLoWzBgLVpowvMxOJooFn74roGxnU4TEBJpWcRnJFtMEwTLzWNnk10MSOApOccvSKg==, + } + + "@img/sharp-darwin-arm64@0.33.5": + resolution: + { + integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [arm64] + os: [darwin] + + "@img/sharp-darwin-x64@0.33.5": + resolution: + { + integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [x64] + os: [darwin] + + "@img/sharp-libvips-darwin-arm64@1.0.4": + resolution: + { + integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==, + } + cpu: [arm64] + os: [darwin] + + "@img/sharp-libvips-darwin-x64@1.0.4": + resolution: + { + integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==, + } + cpu: [x64] + os: [darwin] + + "@img/sharp-libvips-linux-arm64@1.0.4": + resolution: + { + integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==, + } + cpu: [arm64] + os: [linux] + + "@img/sharp-libvips-linux-arm@1.0.5": + resolution: + { + integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==, + } + cpu: [arm] + os: [linux] + + "@img/sharp-libvips-linux-s390x@1.0.4": + resolution: + { + integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==, + } + cpu: [s390x] + os: [linux] + + "@img/sharp-libvips-linux-x64@1.0.4": + resolution: + { + integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==, + } + cpu: [x64] + os: [linux] + + "@img/sharp-libvips-linuxmusl-arm64@1.0.4": + resolution: + { + integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==, + } + cpu: [arm64] + os: [linux] + + "@img/sharp-libvips-linuxmusl-x64@1.0.4": + resolution: + { + integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==, + } + cpu: [x64] + os: [linux] + + "@img/sharp-linux-arm64@0.33.5": + resolution: + { + integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [arm64] + os: [linux] + + "@img/sharp-linux-arm@0.33.5": + resolution: + { + integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [arm] + os: [linux] + + "@img/sharp-linux-s390x@0.33.5": + resolution: + { + integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [s390x] + os: [linux] + + "@img/sharp-linux-x64@0.33.5": + resolution: + { + integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [x64] + os: [linux] + + "@img/sharp-linuxmusl-arm64@0.33.5": + resolution: + { + integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [arm64] + os: [linux] + + "@img/sharp-linuxmusl-x64@0.33.5": + resolution: + { + integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [x64] + os: [linux] + + "@img/sharp-wasm32@0.33.5": + resolution: + { + integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [wasm32] + + "@img/sharp-win32-ia32@0.33.5": + resolution: + { + integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [ia32] + os: [win32] + + "@img/sharp-win32-x64@0.33.5": + resolution: + { + integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [x64] + os: [win32] + + "@jridgewell/sourcemap-codec@1.5.0": + resolution: + { + integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==, + } + + "@mdx-js/mdx@3.1.0": + resolution: + { + integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==, + } + + "@oslojs/encoding@1.1.0": + resolution: + { + integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==, + } + + "@pagefind/darwin-arm64@1.3.0": + resolution: + { + integrity: sha512-365BEGl6ChOsauRjyVpBjXybflXAOvoMROw3TucAROHIcdBvXk9/2AmEvGFU0r75+vdQI4LJdJdpH4Y6Yqaj4A==, + } + cpu: [arm64] + os: [darwin] + + "@pagefind/darwin-x64@1.3.0": + resolution: + { + integrity: sha512-zlGHA23uuXmS8z3XxEGmbHpWDxXfPZ47QS06tGUq0HDcZjXjXHeLG+cboOy828QIV5FXsm9MjfkP5e4ZNbOkow==, + } + cpu: [x64] + os: [darwin] + + "@pagefind/default-ui@1.3.0": + resolution: + { + integrity: sha512-CGKT9ccd3+oRK6STXGgfH+m0DbOKayX6QGlq38TfE1ZfUcPc5+ulTuzDbZUnMo+bubsEOIypm4Pl2iEyzZ1cNg==, + } + + "@pagefind/linux-arm64@1.3.0": + resolution: + { + integrity: sha512-8lsxNAiBRUk72JvetSBXs4WRpYrQrVJXjlRRnOL6UCdBN9Nlsz0t7hWstRk36+JqHpGWOKYiuHLzGYqYAqoOnQ==, + } + cpu: [arm64] + os: [linux] + + "@pagefind/linux-x64@1.3.0": + resolution: + { + integrity: sha512-hAvqdPJv7A20Ucb6FQGE6jhjqy+vZ6pf+s2tFMNtMBG+fzcdc91uTw7aP/1Vo5plD0dAOHwdxfkyw0ugal4kcQ==, + } + cpu: [x64] + os: [linux] + + "@pagefind/windows-x64@1.3.0": + resolution: + { + integrity: sha512-BR1bIRWOMqkf8IoU576YDhij1Wd/Zf2kX/kCI0b2qzCKC8wcc2GQJaaRMCpzvCCrmliO4vtJ6RITp/AnoYUUmQ==, + } + cpu: [x64] + os: [win32] + + "@rollup/pluginutils@5.1.4": + resolution: + { + integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==, + } + engines: { node: ">=14.0.0" } + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + "@rollup/rollup-android-arm-eabi@4.40.0": + resolution: + { + integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==, + } + cpu: [arm] + os: [android] + + "@rollup/rollup-android-arm64@4.40.0": + resolution: + { + integrity: sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==, + } + cpu: [arm64] + os: [android] + + "@rollup/rollup-darwin-arm64@4.40.0": + resolution: + { + integrity: sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==, + } + cpu: [arm64] + os: [darwin] + + "@rollup/rollup-darwin-x64@4.40.0": + resolution: + { + integrity: sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==, + } + cpu: [x64] + os: [darwin] + + "@rollup/rollup-freebsd-arm64@4.40.0": + resolution: + { + integrity: sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==, + } + cpu: [arm64] + os: [freebsd] + + "@rollup/rollup-freebsd-x64@4.40.0": + resolution: + { + integrity: sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==, + } + cpu: [x64] + os: [freebsd] + + "@rollup/rollup-linux-arm-gnueabihf@4.40.0": + resolution: + { + integrity: sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==, + } + cpu: [arm] + os: [linux] + + "@rollup/rollup-linux-arm-musleabihf@4.40.0": + resolution: + { + integrity: sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==, + } + cpu: [arm] + os: [linux] + + "@rollup/rollup-linux-arm64-gnu@4.40.0": + resolution: + { + integrity: sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==, + } + cpu: [arm64] + os: [linux] + + "@rollup/rollup-linux-arm64-musl@4.40.0": + resolution: + { + integrity: sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==, + } + cpu: [arm64] + os: [linux] + + "@rollup/rollup-linux-loongarch64-gnu@4.40.0": + resolution: + { + integrity: sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==, + } + cpu: [loong64] + os: [linux] + + "@rollup/rollup-linux-powerpc64le-gnu@4.40.0": + resolution: + { + integrity: sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==, + } + cpu: [ppc64] + os: [linux] + + "@rollup/rollup-linux-riscv64-gnu@4.40.0": + resolution: + { + integrity: sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==, + } + cpu: [riscv64] + os: [linux] + + "@rollup/rollup-linux-riscv64-musl@4.40.0": + resolution: + { + integrity: sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==, + } + cpu: [riscv64] + os: [linux] + + "@rollup/rollup-linux-s390x-gnu@4.40.0": + resolution: + { + integrity: sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==, + } + cpu: [s390x] + os: [linux] + + "@rollup/rollup-linux-x64-gnu@4.40.0": + resolution: + { + integrity: sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==, + } + cpu: [x64] + os: [linux] + + "@rollup/rollup-linux-x64-musl@4.40.0": + resolution: + { + integrity: sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==, + } + cpu: [x64] + os: [linux] + + "@rollup/rollup-win32-arm64-msvc@4.40.0": + resolution: + { + integrity: sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==, + } + cpu: [arm64] + os: [win32] + + "@rollup/rollup-win32-ia32-msvc@4.40.0": + resolution: + { + integrity: sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==, + } + cpu: [ia32] + os: [win32] + + "@rollup/rollup-win32-x64-msvc@4.40.0": + resolution: + { + integrity: sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==, + } + cpu: [x64] + os: [win32] + + "@shikijs/core@3.2.2": + resolution: + { + integrity: sha512-yvlSKVMLjddAGBa2Yu+vUZxuu3sClOWW1AG+UtJkvejYuGM5BVL35s6Ijiwb75O9QdEx6IkMxinHZSi8ZyrBaA==, + } + + "@shikijs/engine-javascript@3.2.2": + resolution: + { + integrity: sha512-tlDKfhWpF4jKLUyVAnmL+ggIC+0VyteNsUpBzh1iwWLZu4i+PelIRr0TNur6pRRo5UZIv3ss/PLMuwahg9S2hg==, + } + + "@shikijs/engine-oniguruma@3.2.2": + resolution: + { + integrity: sha512-vyXRnWVCSvokwbaUD/8uPn6Gqsf5Hv7XwcW4AgiU4Z2qwy19sdr6VGzMdheKKN58tJOOe5MIKiNb901bgcUXYQ==, + } + + "@shikijs/langs@3.2.2": + resolution: + { + integrity: sha512-NY0Urg2dV9ETt3JIOWoMPuoDNwte3geLZ4M1nrPHbkDS8dWMpKcEwlqiEIGqtwZNmt5gKyWpR26ln2Bg2ecPgw==, + } + + "@shikijs/themes@3.2.2": + resolution: + { + integrity: sha512-Zuq4lgAxVKkb0FFdhHSdDkALuRpsj1so1JdihjKNQfgM78EHxV2JhO10qPsMrm01FkE3mDRTdF68wfmsqjt6HA==, + } + + "@shikijs/types@3.2.2": + resolution: + { + integrity: sha512-a5TiHk7EH5Lso8sHcLHbVNNhWKP0Wi3yVnXnu73g86n3WoDgEra7n3KszyeCGuyoagspQ2fzvy4cpSc8pKhb0A==, + } + + "@shikijs/vscode-textmate@10.0.2": + resolution: + { + integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==, + } + + "@swc/helpers@0.5.17": + resolution: + { + integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==, + } + + "@tailwindcss/node@4.1.4": + resolution: + { + integrity: sha512-MT5118zaiO6x6hNA04OWInuAiP1YISXql8Z+/Y8iisV5nuhM8VXlyhRuqc2PEviPszcXI66W44bCIk500Oolhw==, + } + + "@tailwindcss/oxide-android-arm64@4.1.4": + resolution: + { + integrity: sha512-xMMAe/SaCN/vHfQYui3fqaBDEXMu22BVwQ33veLc8ep+DNy7CWN52L+TTG9y1K397w9nkzv+Mw+mZWISiqhmlA==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [android] + + "@tailwindcss/oxide-darwin-arm64@4.1.4": + resolution: + { + integrity: sha512-JGRj0SYFuDuAGilWFBlshcexev2hOKfNkoX+0QTksKYq2zgF9VY/vVMq9m8IObYnLna0Xlg+ytCi2FN2rOL0Sg==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [darwin] + + "@tailwindcss/oxide-darwin-x64@4.1.4": + resolution: + { + integrity: sha512-sdDeLNvs3cYeWsEJ4H1DvjOzaGios4QbBTNLVLVs0XQ0V95bffT3+scptzYGPMjm7xv4+qMhCDrkHwhnUySEzA==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [darwin] + + "@tailwindcss/oxide-freebsd-x64@4.1.4": + resolution: + { + integrity: sha512-VHxAqxqdghM83HslPhRsNhHo91McsxRJaEnShJOMu8mHmEj9Ig7ToHJtDukkuLWLzLboh2XSjq/0zO6wgvykNA==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [freebsd] + + "@tailwindcss/oxide-linux-arm-gnueabihf@4.1.4": + resolution: + { + integrity: sha512-OTU/m/eV4gQKxy9r5acuesqaymyeSCnsx1cFto/I1WhPmi5HDxX1nkzb8KYBiwkHIGg7CTfo/AcGzoXAJBxLfg==, + } + engines: { node: ">= 10" } + cpu: [arm] + os: [linux] + + "@tailwindcss/oxide-linux-arm64-gnu@4.1.4": + resolution: + { + integrity: sha512-hKlLNvbmUC6z5g/J4H+Zx7f7w15whSVImokLPmP6ff1QqTVE+TxUM9PGuNsjHvkvlHUtGTdDnOvGNSEUiXI1Ww==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + + "@tailwindcss/oxide-linux-arm64-musl@4.1.4": + resolution: + { + integrity: sha512-X3As2xhtgPTY/m5edUtddmZ8rCruvBvtxYLMw9OsZdH01L2gS2icsHRwxdU0dMItNfVmrBezueXZCHxVeeb7Aw==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + + "@tailwindcss/oxide-linux-x64-gnu@4.1.4": + resolution: + { + integrity: sha512-2VG4DqhGaDSmYIu6C4ua2vSLXnJsb/C9liej7TuSO04NK+JJJgJucDUgmX6sn7Gw3Cs5ZJ9ZLrnI0QRDOjLfNQ==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + + "@tailwindcss/oxide-linux-x64-musl@4.1.4": + resolution: + { + integrity: sha512-v+mxVgH2kmur/X5Mdrz9m7TsoVjbdYQT0b4Z+dr+I4RvreCNXyCFELZL/DO0M1RsidZTrm6O1eMnV6zlgEzTMQ==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + + "@tailwindcss/oxide-wasm32-wasi@4.1.4": + resolution: + { + integrity: sha512-2TLe9ir+9esCf6Wm+lLWTMbgklIjiF0pbmDnwmhR9MksVOq+e8aP3TSsXySnBDDvTTVd/vKu1aNttEGj3P6l8Q==, + } + engines: { node: ">=14.0.0" } + cpu: [wasm32] + bundledDependencies: + - "@napi-rs/wasm-runtime" + - "@emnapi/core" + - "@emnapi/runtime" + - "@tybys/wasm-util" + - "@emnapi/wasi-threads" + - tslib + + "@tailwindcss/oxide-win32-arm64-msvc@4.1.4": + resolution: + { + integrity: sha512-VlnhfilPlO0ltxW9/BgfLI5547PYzqBMPIzRrk4W7uupgCt8z6Trw/tAj6QUtF2om+1MH281Pg+HHUJoLesmng==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [win32] + + "@tailwindcss/oxide-win32-x64-msvc@4.1.4": + resolution: + { + integrity: sha512-+7S63t5zhYjslUGb8NcgLpFXD+Kq1F/zt5Xv5qTv7HaFTG/DHyHD9GA6ieNAxhgyA4IcKa/zy7Xx4Oad2/wuhw==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [win32] + + "@tailwindcss/oxide@4.1.4": + resolution: + { + integrity: sha512-p5wOpXyOJx7mKh5MXh5oKk+kqcz8T+bA3z/5VWWeQwFrmuBItGwz8Y2CHk/sJ+dNb9B0nYFfn0rj/cKHZyjahQ==, + } + engines: { node: ">= 10" } + + "@tailwindcss/vite@4.1.4": + resolution: + { + integrity: sha512-4UQeMrONbvrsXKXXp/uxmdEN5JIJ9RkH7YVzs6AMxC/KC1+Np7WZBaNIco7TEjlkthqxZbt8pU/ipD+hKjm80A==, + } + peerDependencies: + vite: ^5.2.0 || ^6 + + "@types/debug@4.1.12": + resolution: + { + integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==, + } + + "@types/estree-jsx@1.0.5": + resolution: + { + integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==, + } + + "@types/estree@1.0.7": + resolution: + { + integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==, + } + + "@types/hast@3.0.4": + resolution: + { + integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==, + } + + "@types/js-yaml@4.0.9": + resolution: + { + integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==, + } + + "@types/mdast@4.0.4": + resolution: + { + integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==, + } + + "@types/mdx@2.0.13": + resolution: + { + integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==, + } + + "@types/ms@2.1.0": + resolution: + { + integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==, + } + + "@types/nlcst@2.0.3": + resolution: + { + integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==, + } + + "@types/node@17.0.45": + resolution: + { + integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==, + } + + "@types/sax@1.2.7": + resolution: + { + integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==, + } + + "@types/unist@2.0.11": + resolution: + { + integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==, + } + + "@types/unist@3.0.3": + resolution: + { + integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==, + } + + "@ungap/structured-clone@1.3.0": + resolution: + { + integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==, + } + + acorn-jsx@5.3.2: + resolution: + { + integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, + } + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.14.1: + resolution: + { + integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==, + } + engines: { node: ">=0.4.0" } + hasBin: true + + ansi-align@3.0.1: + resolution: + { + integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==, + } + + ansi-regex@5.0.1: + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: ">=8" } + + ansi-regex@6.1.0: + resolution: + { + integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==, + } + engines: { node: ">=12" } + + ansi-styles@6.2.1: + resolution: + { + integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, + } + engines: { node: ">=12" } + + anymatch@3.1.3: + resolution: + { + integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, + } + engines: { node: ">= 8" } + + arg@5.0.2: + resolution: + { + integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==, + } + + argparse@2.0.1: + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } + + aria-query@5.3.2: + resolution: + { + integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==, + } + engines: { node: ">= 0.4" } + + array-iterate@2.0.1: + resolution: + { + integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==, + } + + astring@1.9.0: + resolution: + { + integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==, + } + hasBin: true + + astro-expressive-code@0.41.1: + resolution: + { + integrity: sha512-za6HlekMOczwlkuYuQQTd6LkKFwsnfAjwjIprCzOqsjp9vkYrAcriXM5cIG7V1Zxx88sVXF6iGnyNl4J0DL2Mg==, + } + peerDependencies: + astro: ^4.0.0-beta || ^5.0.0-beta || ^3.3.0 + + astro@5.7.0: + resolution: + { + integrity: sha512-LxvWFlCQSxRLqvtCfZ/LFzlaHcvX++qtq0NrRmwtDmrZhAyHOoVfLkxEE0STKgn0wjLTuETyBrgCBWe2eb68/A==, + } + engines: + { node: ^18.17.1 || ^20.3.0 || >=22.0.0, npm: ">=9.6.5", pnpm: ">=7.1.0" } + hasBin: true + + axobject-query@4.1.0: + resolution: + { + integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==, + } + engines: { node: ">= 0.4" } + + b4a@1.6.7: + resolution: + { + integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==, + } + + bail@2.0.2: + resolution: + { + integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==, + } + + bare-events@2.5.4: + resolution: + { + integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==, + } + + bare-fs@4.1.2: + resolution: + { + integrity: sha512-8wSeOia5B7LwD4+h465y73KOdj5QHsbbuoUfPBi+pXgFJIPuG7SsiOdJuijWMyfid49eD+WivpfY7KT8gbAzBA==, + } + engines: { bare: ">=1.16.0" } + peerDependencies: + bare-buffer: "*" + peerDependenciesMeta: + bare-buffer: + optional: true + + bare-os@3.6.1: + resolution: + { + integrity: sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==, + } + engines: { bare: ">=1.14.0" } + + bare-path@3.0.0: + resolution: + { + integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==, + } + + bare-stream@2.6.5: + resolution: + { + integrity: sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==, + } + peerDependencies: + bare-buffer: "*" + bare-events: "*" + peerDependenciesMeta: + bare-buffer: + optional: true + bare-events: + optional: true + + base-64@1.0.0: + resolution: + { + integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==, + } + + base64-js@1.5.1: + resolution: + { + integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, + } + + bcp-47-match@2.0.3: + resolution: + { + integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==, + } + + bcp-47@2.1.0: + resolution: + { + integrity: sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==, + } + + bl@4.1.0: + resolution: + { + integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==, + } + + blob-to-buffer@1.2.9: + resolution: + { + integrity: sha512-BF033y5fN6OCofD3vgHmNtwZWRcq9NLyyxyILx9hfMy1sXYy4ojFl765hJ2lP0YaN2fuxPaLO2Vzzoxy0FLFFA==, + } + + boolbase@1.0.0: + resolution: + { + integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==, + } + + boxen@8.0.1: + resolution: + { + integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==, + } + engines: { node: ">=18" } + + brotli@1.3.3: + resolution: + { + integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==, + } + + buffer@5.7.1: + resolution: + { + integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, + } + + camelcase@8.0.0: + resolution: + { + integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==, + } + engines: { node: ">=16" } + + ccount@2.0.1: + resolution: + { + integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==, + } + + chalk@5.4.1: + resolution: + { + integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==, + } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } + + character-entities-html4@2.1.0: + resolution: + { + integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==, + } + + character-entities-legacy@3.0.0: + resolution: + { + integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==, + } + + character-entities@2.0.2: + resolution: + { + integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==, + } + + character-reference-invalid@2.0.1: + resolution: + { + integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==, + } + + chokidar@4.0.3: + resolution: + { + integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==, + } + engines: { node: ">= 14.16.0" } + + chownr@1.1.4: + resolution: + { + integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, + } + + ci-info@4.2.0: + resolution: + { + integrity: sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==, + } + engines: { node: ">=8" } + + cli-boxes@3.0.0: + resolution: + { + integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==, + } + engines: { node: ">=10" } + + clone@2.1.2: + resolution: + { + integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==, + } + engines: { node: ">=0.8" } + + clsx@2.1.1: + resolution: + { + integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==, + } + engines: { node: ">=6" } + + collapse-white-space@2.1.0: + resolution: + { + integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==, + } + + color-convert@2.0.1: + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: ">=7.0.0" } + + color-name@1.1.4: + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } + + color-string@1.9.1: + resolution: + { + integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==, + } + + color@4.2.3: + resolution: + { + integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==, + } + engines: { node: ">=12.5.0" } + + comma-separated-tokens@2.0.3: + resolution: + { + integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==, + } + + common-ancestor-path@1.0.1: + resolution: + { + integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==, + } + + cookie-es@1.2.2: + resolution: + { + integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==, + } + + cookie@1.0.2: + resolution: + { + integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==, + } + engines: { node: ">=18" } + + cross-fetch@3.2.0: + resolution: + { + integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==, + } + + crossws@0.3.4: + resolution: + { + integrity: sha512-uj0O1ETYX1Bh6uSgktfPvwDiPYGQ3aI4qVsaC/LWpkIzGj1nUYm5FK3K+t11oOlpN01lGbprFCH4wBlKdJjVgw==, + } + + css-selector-parser@3.1.2: + resolution: + { + integrity: sha512-WfUcL99xWDs7b3eZPoRszWVfbNo8ErCF15PTvVROjkShGlAfjIkG6hlfj/sl6/rfo5Q9x9ryJ3VqVnAZDA+gcw==, + } + + css-tree@3.1.0: + resolution: + { + integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==, + } + engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0 } + + cssesc@3.0.0: + resolution: + { + integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, + } + engines: { node: ">=4" } + hasBin: true + + debug@4.4.0: + resolution: + { + integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==, + } + engines: { node: ">=6.0" } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.1.0: + resolution: + { + integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==, + } + + decompress-response@6.0.0: + resolution: + { + integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==, + } + engines: { node: ">=10" } + + deep-extend@0.6.0: + resolution: + { + integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==, + } + engines: { node: ">=4.0.0" } + + defu@6.1.4: + resolution: + { + integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==, + } + + dequal@2.0.3: + resolution: + { + integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==, + } + engines: { node: ">=6" } + + destr@2.0.5: + resolution: + { + integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==, + } + + detect-libc@2.0.3: + resolution: + { + integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==, + } + engines: { node: ">=8" } + + deterministic-object-hash@2.0.2: + resolution: + { + integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==, + } + engines: { node: ">=18" } + + devalue@5.1.1: + resolution: + { + integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==, + } + + devlop@1.1.0: + resolution: + { + integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==, + } + + dfa@1.2.0: + resolution: + { + integrity: sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==, + } + + diff@5.2.0: + resolution: + { + integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==, + } + engines: { node: ">=0.3.1" } + + direction@2.0.1: + resolution: + { + integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==, + } + hasBin: true + + dlv@1.1.3: + resolution: + { + integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==, + } + + dset@3.1.4: + resolution: + { + integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==, + } + engines: { node: ">=4" } + + emoji-regex-xs@1.0.0: + resolution: + { + integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==, + } + + emoji-regex@10.4.0: + resolution: + { + integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==, + } + + emoji-regex@8.0.0: + resolution: + { + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, + } + + end-of-stream@1.4.4: + resolution: + { + integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, + } + + enhanced-resolve@5.18.1: + resolution: + { + integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==, + } + engines: { node: ">=10.13.0" } + + entities@4.5.0: + resolution: + { + integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, + } + engines: { node: ">=0.12" } + + es-module-lexer@1.6.0: + resolution: + { + integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==, + } + + esast-util-from-estree@2.0.0: + resolution: + { + integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==, + } + + esast-util-from-js@2.0.1: + resolution: + { + integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==, + } + + esbuild@0.25.2: + resolution: + { + integrity: sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==, + } + engines: { node: ">=18" } + hasBin: true + + escape-string-regexp@5.0.0: + resolution: + { + integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==, + } + engines: { node: ">=12" } + + estree-util-attach-comments@3.0.0: + resolution: + { + integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==, + } + + estree-util-build-jsx@3.0.1: + resolution: + { + integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==, + } + + estree-util-is-identifier-name@3.0.0: + resolution: + { + integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==, + } + + estree-util-scope@1.0.0: + resolution: + { + integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==, + } + + estree-util-to-js@2.0.0: + resolution: + { + integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==, + } + + estree-util-visit@2.0.0: + resolution: + { + integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==, + } + + estree-walker@2.0.2: + resolution: + { + integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==, + } + + estree-walker@3.0.3: + resolution: + { + integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==, + } + + eventemitter3@5.0.1: + resolution: + { + integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==, + } + + expand-template@2.0.3: + resolution: + { + integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==, + } + engines: { node: ">=6" } + + expressive-code@0.41.1: + resolution: + { + integrity: sha512-O3+bDWGw+y7b0L3Y3xc7LbPgRTvFy2tqXzYY24TBbDwnHbIwb0OFdS4v+1PpX6NEsF7XsVv9sqY5xo22yWe7Hw==, + } + + extend@3.0.2: + resolution: + { + integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==, + } + + fast-deep-equal@3.1.3: + resolution: + { + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, + } + + fast-fifo@1.3.2: + resolution: + { + integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==, + } + + fdir@6.4.3: + resolution: + { + integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==, + } + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + flattie@1.1.1: + resolution: + { + integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==, + } + engines: { node: ">=8" } + + fontkit@2.0.4: + resolution: + { + integrity: sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==, + } + + fs-constants@1.0.0: + resolution: + { + integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, + } + + fsevents@2.3.3: + resolution: + { + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] + + get-east-asian-width@1.3.0: + resolution: + { + integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==, + } + engines: { node: ">=18" } + + github-from-package@0.0.0: + resolution: + { + integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==, + } + + github-slugger@2.0.0: + resolution: + { + integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==, + } + + graceful-fs@4.2.11: + resolution: + { + integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, + } + + h3@1.15.1: + resolution: + { + integrity: sha512-+ORaOBttdUm1E2Uu/obAyCguiI7MbBvsLTndc3gyK3zU+SYLoZXlyCP9Xgy0gikkGufFLTZXCXD6+4BsufnmHA==, + } + + hast-util-embedded@3.0.0: + resolution: + { + integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==, + } + + hast-util-format@1.1.0: + resolution: + { + integrity: sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==, + } + + hast-util-from-html@2.0.3: + resolution: + { + integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==, + } + + hast-util-from-parse5@8.0.3: + resolution: + { + integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==, + } + + hast-util-has-property@3.0.0: + resolution: + { + integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==, + } + + hast-util-is-body-ok-link@3.0.1: + resolution: + { + integrity: sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==, + } + + hast-util-is-element@3.0.0: + resolution: + { + integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==, + } + + hast-util-minify-whitespace@1.0.1: + resolution: + { + integrity: sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==, + } + + hast-util-parse-selector@4.0.0: + resolution: + { + integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==, + } + + hast-util-phrasing@3.0.1: + resolution: + { + integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==, + } + + hast-util-raw@9.1.0: + resolution: + { + integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==, + } + + hast-util-select@6.0.4: + resolution: + { + integrity: sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==, + } + + hast-util-to-estree@3.1.3: + resolution: + { + integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==, + } + + hast-util-to-html@9.0.5: + resolution: + { + integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==, + } + + hast-util-to-jsx-runtime@2.3.6: + resolution: + { + integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==, + } + + hast-util-to-parse5@8.0.0: + resolution: + { + integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==, + } + + hast-util-to-string@3.0.1: + resolution: + { + integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==, + } + + hast-util-to-text@4.0.2: + resolution: + { + integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==, + } + + hast-util-whitespace@3.0.0: + resolution: + { + integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==, + } + + hastscript@9.0.1: + resolution: + { + integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==, + } + + html-escaper@3.0.3: + resolution: + { + integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==, + } + + html-void-elements@3.0.0: + resolution: + { + integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==, + } + + html-whitespace-sensitive-tag-names@3.0.1: + resolution: + { + integrity: sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==, + } + + http-cache-semantics@4.1.1: + resolution: + { + integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==, + } + + i18next@23.16.8: + resolution: + { + integrity: sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==, + } + + ieee754@1.2.1: + resolution: + { + integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, + } + + import-meta-resolve@4.1.0: + resolution: + { + integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==, + } + + inherits@2.0.4: + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } + + ini@1.3.8: + resolution: + { + integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, + } + + inline-style-parser@0.2.4: + resolution: + { + integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==, + } + + iron-webcrypto@1.2.1: + resolution: + { + integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==, + } + + is-alphabetical@2.0.1: + resolution: + { + integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==, + } + + is-alphanumerical@2.0.1: + resolution: + { + integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==, + } + + is-arrayish@0.3.2: + resolution: + { + integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==, + } + + is-decimal@2.0.1: + resolution: + { + integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==, + } + + is-docker@3.0.0: + resolution: + { + integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + hasBin: true + + is-fullwidth-code-point@3.0.0: + resolution: + { + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, + } + engines: { node: ">=8" } + + is-hexadecimal@2.0.1: + resolution: + { + integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==, + } + + is-inside-container@1.0.0: + resolution: + { + integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==, + } + engines: { node: ">=14.16" } + hasBin: true + + is-plain-obj@4.1.0: + resolution: + { + integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==, + } + engines: { node: ">=12" } + + is-wsl@3.1.0: + resolution: + { + integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==, + } + engines: { node: ">=16" } + + jiti@2.4.2: + resolution: + { + integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==, + } + hasBin: true + + js-yaml@4.1.0: + resolution: + { + integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, + } + hasBin: true + + kleur@3.0.3: + resolution: + { + integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==, + } + engines: { node: ">=6" } + + kleur@4.1.5: + resolution: + { + integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==, + } + engines: { node: ">=6" } + + klona@2.0.6: + resolution: + { + integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==, + } + engines: { node: ">= 8" } + + lightningcss-darwin-arm64@1.29.2: + resolution: + { + integrity: sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==, + } + engines: { node: ">= 12.0.0" } + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.29.2: + resolution: + { + integrity: sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==, + } + engines: { node: ">= 12.0.0" } + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.29.2: + resolution: + { + integrity: sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==, + } + engines: { node: ">= 12.0.0" } + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.29.2: + resolution: + { + integrity: sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==, + } + engines: { node: ">= 12.0.0" } + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.29.2: + resolution: + { + integrity: sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==, + } + engines: { node: ">= 12.0.0" } + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.29.2: + resolution: + { + integrity: sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==, + } + engines: { node: ">= 12.0.0" } + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.29.2: + resolution: + { + integrity: sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==, + } + engines: { node: ">= 12.0.0" } + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.29.2: + resolution: + { + integrity: sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==, + } + engines: { node: ">= 12.0.0" } + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.29.2: + resolution: + { + integrity: sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==, + } + engines: { node: ">= 12.0.0" } + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.29.2: + resolution: + { + integrity: sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==, + } + engines: { node: ">= 12.0.0" } + cpu: [x64] + os: [win32] + + lightningcss@1.29.2: + resolution: + { + integrity: sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==, + } + engines: { node: ">= 12.0.0" } + + longest-streak@3.1.0: + resolution: + { + integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==, + } + + lru-cache@10.4.3: + resolution: + { + integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==, + } + + magic-string@0.30.17: + resolution: + { + integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==, + } + + magicast@0.3.5: + resolution: + { + integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==, + } + + markdown-extensions@2.0.0: + resolution: + { + integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==, + } + engines: { node: ">=16" } + + markdown-table@3.0.4: + resolution: + { + integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==, + } + + mdast-util-definitions@6.0.0: + resolution: + { + integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==, + } + + mdast-util-directive@3.1.0: + resolution: + { + integrity: sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==, + } + + mdast-util-find-and-replace@3.0.2: + resolution: + { + integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==, + } + + mdast-util-from-markdown@2.0.2: + resolution: + { + integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==, + } + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: + { + integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==, + } + + mdast-util-gfm-footnote@2.1.0: + resolution: + { + integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==, + } + + mdast-util-gfm-strikethrough@2.0.0: + resolution: + { + integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==, + } + + mdast-util-gfm-table@2.0.0: + resolution: + { + integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==, + } + + mdast-util-gfm-task-list-item@2.0.0: + resolution: + { + integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==, + } + + mdast-util-gfm@3.1.0: + resolution: + { + integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==, + } + + mdast-util-mdx-expression@2.0.1: + resolution: + { + integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==, + } + + mdast-util-mdx-jsx@3.2.0: + resolution: + { + integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==, + } + + mdast-util-mdx@3.0.0: + resolution: + { + integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==, + } + + mdast-util-mdxjs-esm@2.0.1: + resolution: + { + integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==, + } + + mdast-util-phrasing@4.1.0: + resolution: + { + integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==, + } + + mdast-util-to-hast@13.2.0: + resolution: + { + integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==, + } + + mdast-util-to-markdown@2.1.2: + resolution: + { + integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==, + } + + mdast-util-to-string@4.0.0: + resolution: + { + integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==, + } + + mdn-data@2.12.2: + resolution: + { + integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==, + } + + micromark-core-commonmark@2.0.3: + resolution: + { + integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==, + } + + micromark-extension-directive@3.0.2: + resolution: + { + integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==, + } + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: + { + integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==, + } + + micromark-extension-gfm-footnote@2.1.0: + resolution: + { + integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==, + } + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: + { + integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==, + } + + micromark-extension-gfm-table@2.1.1: + resolution: + { + integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==, + } + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: + { + integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==, + } + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: + { + integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==, + } + + micromark-extension-gfm@3.0.0: + resolution: + { + integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==, + } + + micromark-extension-mdx-expression@3.0.1: + resolution: + { + integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==, + } + + micromark-extension-mdx-jsx@3.0.2: + resolution: + { + integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==, + } + + micromark-extension-mdx-md@2.0.0: + resolution: + { + integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==, + } + + micromark-extension-mdxjs-esm@3.0.0: + resolution: + { + integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==, + } + + micromark-extension-mdxjs@3.0.0: + resolution: + { + integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==, + } + + micromark-factory-destination@2.0.1: + resolution: + { + integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==, + } + + micromark-factory-label@2.0.1: + resolution: + { + integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==, + } + + micromark-factory-mdx-expression@2.0.3: + resolution: + { + integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==, + } + + micromark-factory-space@2.0.1: + resolution: + { + integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==, + } + + micromark-factory-title@2.0.1: + resolution: + { + integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==, + } + + micromark-factory-whitespace@2.0.1: + resolution: + { + integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==, + } + + micromark-util-character@2.1.1: + resolution: + { + integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==, + } + + micromark-util-chunked@2.0.1: + resolution: + { + integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==, + } + + micromark-util-classify-character@2.0.1: + resolution: + { + integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==, + } + + micromark-util-combine-extensions@2.0.1: + resolution: + { + integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==, + } + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: + { + integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==, + } + + micromark-util-decode-string@2.0.1: + resolution: + { + integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==, + } + + micromark-util-encode@2.0.1: + resolution: + { + integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==, + } + + micromark-util-events-to-acorn@2.0.3: + resolution: + { + integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==, + } + + micromark-util-html-tag-name@2.0.1: + resolution: + { + integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==, + } + + micromark-util-normalize-identifier@2.0.1: + resolution: + { + integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==, + } + + micromark-util-resolve-all@2.0.1: + resolution: + { + integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==, + } + + micromark-util-sanitize-uri@2.0.1: + resolution: + { + integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==, + } + + micromark-util-subtokenize@2.1.0: + resolution: + { + integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==, + } + + micromark-util-symbol@2.0.1: + resolution: + { + integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==, + } + + micromark-util-types@2.0.2: + resolution: + { + integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==, + } + + micromark@4.0.2: + resolution: + { + integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==, + } + + mimic-response@3.1.0: + resolution: + { + integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, + } + engines: { node: ">=10" } + + minimist@1.2.8: + resolution: + { + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, + } + + mkdirp-classic@0.5.3: + resolution: + { + integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, + } + + mrmime@2.0.1: + resolution: + { + integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==, + } + engines: { node: ">=10" } + + ms@2.1.3: + resolution: + { + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, + } + + nanoid@3.3.11: + resolution: + { + integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==, + } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + hasBin: true + + napi-build-utils@2.0.0: + resolution: + { + integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==, + } + + neotraverse@0.6.18: + resolution: + { + integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==, + } + engines: { node: ">= 10" } + + nlcst-to-string@4.0.0: + resolution: + { + integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==, + } + + node-abi@3.74.0: + resolution: + { + integrity: sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==, + } + engines: { node: ">=10" } + + node-addon-api@6.1.0: + resolution: + { + integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==, + } + + node-fetch-native@1.6.6: + resolution: + { + integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==, + } + + node-fetch@2.7.0: + resolution: + { + integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==, + } + engines: { node: 4.x || >=6.0.0 } + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-mock-http@1.0.0: + resolution: + { + integrity: sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ==, + } + + normalize-path@3.0.0: + resolution: + { + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, + } + engines: { node: ">=0.10.0" } + + nth-check@2.1.1: + resolution: + { + integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==, + } + + ofetch@1.4.1: + resolution: + { + integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==, + } + + ohash@1.1.6: + resolution: + { + integrity: sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg==, + } + + once@1.4.0: + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } + + oniguruma-parser@0.11.1: + resolution: + { + integrity: sha512-fX6SirDOsTUNqSUOnL3fDtD3R7PCXNWGA3WWPvv9egEfTWkNXzRLO/9CC1WkDusP6HyWRZig06kHeYPcw3mlqQ==, + } + + oniguruma-to-es@4.2.0: + resolution: + { + integrity: sha512-MDPs6KSOLS0tKQ7joqg44dRIRZUyotfTy0r+7oEEs6VwWWP0+E2PPDYWMFN0aqOjRyWHBYq7RfKw9GQk2S2z5g==, + } + + p-limit@6.2.0: + resolution: + { + integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==, + } + engines: { node: ">=18" } + + p-queue@8.1.0: + resolution: + { + integrity: sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw==, + } + engines: { node: ">=18" } + + p-timeout@6.1.4: + resolution: + { + integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==, + } + engines: { node: ">=14.16" } + + package-manager-detector@1.2.0: + resolution: + { + integrity: sha512-PutJepsOtsqVfUsxCzgTTpyXmiAgvKptIgY4th5eq5UXXFhj5PxfQ9hnGkypMeovpAvVshFRItoFHYO18TCOqA==, + } + + pagefind@1.3.0: + resolution: + { + integrity: sha512-8KPLGT5g9s+olKMRTU9LFekLizkVIu9tes90O1/aigJ0T5LmyPqTzGJrETnSw3meSYg58YH7JTzhTTW/3z6VAw==, + } + hasBin: true + + pako@0.2.9: + resolution: + { + integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==, + } + + parse-entities@4.0.2: + resolution: + { + integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==, + } + + parse-latin@7.0.0: + resolution: + { + integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==, + } + + parse5@7.2.1: + resolution: + { + integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==, + } + + picocolors@1.1.1: + resolution: + { + integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, + } + + picomatch@2.3.1: + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: ">=8.6" } + + picomatch@4.0.2: + resolution: + { + integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==, + } + engines: { node: ">=12" } + + postcss-nested@6.2.0: + resolution: + { + integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==, + } + engines: { node: ">=12.0" } + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.1.2: + resolution: + { + integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==, + } + engines: { node: ">=4" } + + postcss@8.5.3: + resolution: + { + integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==, + } + engines: { node: ^10 || ^12 || >=14 } + + prebuild-install@7.1.3: + resolution: + { + integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==, + } + engines: { node: ">=10" } + hasBin: true + + prettier@3.6.2: + resolution: + { + integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==, + } + engines: { node: ">=14" } + hasBin: true + + prismjs@1.30.0: + resolution: + { + integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==, + } + engines: { node: ">=6" } + + prompts@2.4.2: + resolution: + { + integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==, + } + engines: { node: ">= 6" } + + property-information@6.5.0: + resolution: + { + integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==, + } + + property-information@7.0.0: + resolution: + { + integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==, + } + + pump@3.0.2: + resolution: + { + integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==, + } + + radix3@1.1.2: + resolution: + { + integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==, + } + + rc@1.2.8: + resolution: + { + integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, + } + hasBin: true + + readable-stream@3.6.2: + resolution: + { + integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, + } + engines: { node: ">= 6" } + + readdirp@4.1.2: + resolution: + { + integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==, + } + engines: { node: ">= 14.18.0" } + + recma-build-jsx@1.0.0: + resolution: + { + integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==, + } + + recma-jsx@1.0.0: + resolution: + { + integrity: sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==, + } + + recma-parse@1.0.0: + resolution: + { + integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==, + } + + recma-stringify@1.0.0: + resolution: + { + integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==, + } + + regenerator-runtime@0.14.1: + resolution: + { + integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==, + } + + regex-recursion@6.0.2: + resolution: + { + integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==, + } + + regex-utilities@2.3.0: + resolution: + { + integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==, + } + + regex@6.0.1: + resolution: + { + integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==, + } + + rehype-expressive-code@0.41.1: + resolution: + { + integrity: sha512-QApC3js5/AwrF6VqWfGsNY9Y1qLC0LQDWcqOHEAhbl3CB4e5GMor2SpWaGOWBW+mmrkVCEymayLPCPIbx0tcQQ==, + } + + rehype-format@5.0.1: + resolution: + { + integrity: sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==, + } + + rehype-parse@9.0.1: + resolution: + { + integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==, + } + + rehype-raw@7.0.0: + resolution: + { + integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==, + } + + rehype-recma@1.0.0: + resolution: + { + integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==, + } + + rehype-stringify@10.0.1: + resolution: + { + integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==, + } + + rehype@13.0.2: + resolution: + { + integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==, + } + + remark-directive@3.0.1: + resolution: + { + integrity: sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==, + } + + remark-gfm@4.0.1: + resolution: + { + integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==, + } + + remark-mdx@3.1.0: + resolution: + { + integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==, + } + + remark-parse@11.0.0: + resolution: + { + integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==, + } + + remark-rehype@11.1.2: + resolution: + { + integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==, + } + + remark-smartypants@3.0.2: + resolution: + { + integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==, + } + engines: { node: ">=16.0.0" } + + remark-stringify@11.0.0: + resolution: + { + integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==, + } + + restructure@3.0.2: + resolution: + { + integrity: sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==, + } + + retext-latin@4.0.0: + resolution: + { + integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==, + } + + retext-smartypants@6.2.0: + resolution: + { + integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==, + } + + retext-stringify@4.0.0: + resolution: + { + integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==, + } + + retext@9.0.0: + resolution: + { + integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==, + } + + rollup@4.40.0: + resolution: + { + integrity: sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==, + } + engines: { node: ">=18.0.0", npm: ">=8.0.0" } + hasBin: true + + safe-buffer@5.2.1: + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } + + sax@1.4.1: + resolution: + { + integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==, + } + + semver@7.7.1: + resolution: + { + integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==, + } + engines: { node: ">=10" } + hasBin: true + + sharp@0.32.6: + resolution: + { + integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==, + } + engines: { node: ">=14.15.0" } + + sharp@0.33.5: + resolution: + { + integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + + shiki@3.2.2: + resolution: + { + integrity: sha512-0qWBkM2t/0NXPRcVgtLhtHv6Ak3Q5yI4K/ggMqcgLRKm4+pCs3namgZlhlat/7u2CuqNtlShNs9lENOG6n7UaQ==, + } + + simple-concat@1.0.1: + resolution: + { + integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==, + } + + simple-get@4.0.1: + resolution: + { + integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==, + } + + simple-swizzle@0.2.2: + resolution: + { + integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==, + } + + sisteransi@1.0.5: + resolution: + { + integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, + } + + sitemap@8.0.0: + resolution: + { + integrity: sha512-+AbdxhM9kJsHtruUF39bwS/B0Fytw6Fr1o4ZAIAEqA6cke2xcoO2GleBw9Zw7nRzILVEgz7zBM5GiTJjie1G9A==, + } + engines: { node: ">=14.0.0", npm: ">=6.0.0" } + hasBin: true + + smol-toml@1.3.1: + resolution: + { + integrity: sha512-tEYNll18pPKHroYSmLLrksq233j021G0giwW7P3D24jC54pQ5W5BXMsQ/Mvw1OJCmEYDgY+lrzT+3nNUtoNfXQ==, + } + engines: { node: ">= 18" } + + source-map-js@1.2.1: + resolution: + { + integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==, + } + engines: { node: ">=0.10.0" } + + source-map@0.7.4: + resolution: + { + integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==, + } + engines: { node: ">= 8" } + + space-separated-tokens@2.0.2: + resolution: + { + integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==, + } + + stream-replace-string@2.0.0: + resolution: + { + integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==, + } + + streamx@2.22.0: + resolution: + { + integrity: sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==, + } + + string-width@4.2.3: + resolution: + { + integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, + } + engines: { node: ">=8" } + + string-width@7.2.0: + resolution: + { + integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==, + } + engines: { node: ">=18" } + + string_decoder@1.3.0: + resolution: + { + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, + } + + stringify-entities@4.0.4: + resolution: + { + integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==, + } + + strip-ansi@6.0.1: + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: ">=8" } + + strip-ansi@7.1.0: + resolution: + { + integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, + } + engines: { node: ">=12" } + + strip-json-comments@2.0.1: + resolution: + { + integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==, + } + engines: { node: ">=0.10.0" } + + style-to-js@1.1.16: + resolution: + { + integrity: sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==, + } + + style-to-object@1.0.8: + resolution: + { + integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==, + } + + tailwindcss@4.1.4: + resolution: + { + integrity: sha512-1ZIUqtPITFbv/DxRmDr5/agPqJwF69d24m9qmM1939TJehgY539CtzeZRjbLt5G6fSy/7YqqYsfvoTEw9xUI2A==, + } + + tapable@2.2.1: + resolution: + { + integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==, + } + engines: { node: ">=6" } + + tar-fs@2.1.2: + resolution: + { + integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==, + } + + tar-fs@3.0.8: + resolution: + { + integrity: sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==, + } + + tar-stream@2.2.0: + resolution: + { + integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==, + } + engines: { node: ">=6" } + + tar-stream@3.1.7: + resolution: + { + integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==, + } + + text-decoder@1.2.3: + resolution: + { + integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==, + } + + tiny-inflate@1.0.3: + resolution: + { + integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==, + } + + tinyexec@0.3.2: + resolution: + { + integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==, + } + + tinyglobby@0.2.12: + resolution: + { + integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==, + } + engines: { node: ">=12.0.0" } + + tr46@0.0.3: + resolution: + { + integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, + } + + trim-lines@3.0.1: + resolution: + { + integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==, + } + + trough@2.2.0: + resolution: + { + integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==, + } + + tsconfck@3.1.5: + resolution: + { + integrity: sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==, + } + engines: { node: ^18 || >=20 } + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + tslib@2.8.1: + resolution: + { + integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, + } + + tunnel-agent@0.6.0: + resolution: + { + integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, + } + + type-fest@4.40.0: + resolution: + { + integrity: sha512-ABHZ2/tS2JkvH1PEjxFDTUWC8dB5OsIGZP4IFLhR293GqT5Y5qB1WwL2kMPYhQW9DVgVD8Hd7I8gjwPIf5GFkw==, + } + engines: { node: ">=16" } + + typescript@5.8.3: + resolution: + { + integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==, + } + engines: { node: ">=14.17" } + hasBin: true + + ufo@1.6.1: + resolution: + { + integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==, + } + + ultrahtml@1.6.0: + resolution: + { + integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==, + } + + uncrypto@0.1.3: + resolution: + { + integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==, + } + + unicode-properties@1.4.1: + resolution: + { + integrity: sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==, + } + + unicode-trie@2.0.0: + resolution: + { + integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==, + } + + unified@11.0.5: + resolution: + { + integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==, + } + + unifont@0.1.7: + resolution: + { + integrity: sha512-UyN6r/TUyl69iW/jhXaCtuwA6bP9ZSLhVViwgP8LH9EHRGk5FyIMDxvClqD5z2BV6MI9GMATzd0dyLqFxKkUmQ==, + } + + unist-util-find-after@5.0.0: + resolution: + { + integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==, + } + + unist-util-is@6.0.0: + resolution: + { + integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==, + } + + unist-util-modify-children@4.0.0: + resolution: + { + integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==, + } + + unist-util-position-from-estree@2.0.0: + resolution: + { + integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==, + } + + unist-util-position@5.0.0: + resolution: + { + integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==, + } + + unist-util-remove-position@5.0.0: + resolution: + { + integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==, + } + + unist-util-stringify-position@4.0.0: + resolution: + { + integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==, + } + + unist-util-visit-children@3.0.0: + resolution: + { + integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==, + } + + unist-util-visit-parents@6.0.1: + resolution: + { + integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==, + } + + unist-util-visit@5.0.0: + resolution: + { + integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==, + } + + unstorage@1.15.0: + resolution: + { + integrity: sha512-m40eHdGY/gA6xAPqo8eaxqXgBuzQTlAKfmB1iF7oCKXE1HfwHwzDJBywK+qQGn52dta+bPlZluPF7++yR3p/bg==, + } + 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.0.3 + "@deno/kv": ">=0.9.0" + "@netlify/blobs": ^6.5.0 || ^7.0.0 || ^8.1.0 + "@planetscale/database": ^1.19.0 + "@upstash/redis": ^1.34.3 + "@vercel/blob": ">=0.27.1" + "@vercel/kv": ^1.0.1 + aws4fetch: ^1.0.20 + db0: ">=0.2.1" + idb-keyval: ^6.2.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.4 + peerDependenciesMeta: + "@azure/app-configuration": + optional: true + "@azure/cosmos": + optional: true + "@azure/data-tables": + optional: true + "@azure/identity": + optional: true + "@azure/keyvault-secrets": + optional: true + "@azure/storage-blob": + optional: true + "@capacitor/preferences": + optional: true + "@deno/kv": + optional: true + "@netlify/blobs": + optional: true + "@planetscale/database": + optional: true + "@upstash/redis": + optional: true + "@vercel/blob": + optional: true + "@vercel/kv": + optional: true + aws4fetch: + optional: true + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + uploadthing: + optional: true + + util-deprecate@1.0.2: + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + } + + vfile-location@5.0.3: + resolution: + { + integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==, + } + + vfile-message@4.0.2: + resolution: + { + integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==, + } + + vfile@6.0.3: + resolution: + { + integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==, + } + + vite@6.2.6: + resolution: + { + integrity: sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==, + } + engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } + hasBin: true + peerDependencies: + "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: ">=1.21.0" + less: "*" + lightningcss: ^1.21.0 + sass: "*" + sass-embedded: "*" + stylus: "*" + sugarss: "*" + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + "@types/node": + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitefu@1.0.6: + resolution: + { + integrity: sha512-+Rex1GlappUyNN6UfwbVZne/9cYC4+R2XDk9xkNXBKMw6HQagdX9PgZ8V2v1WUSK1wfBLp7qbI1+XSNIlB1xmA==, + } + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + vite: + optional: true + + web-namespaces@2.0.1: + resolution: + { + integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==, + } + + webidl-conversions@3.0.1: + resolution: + { + integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, + } + + whatwg-url@5.0.0: + resolution: + { + integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, + } + + which-pm-runs@1.1.0: + resolution: + { + integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==, + } + engines: { node: ">=4" } + + widest-line@5.0.0: + resolution: + { + integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==, + } + engines: { node: ">=18" } + + wrap-ansi@9.0.0: + resolution: + { + integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==, + } + engines: { node: ">=18" } + + wrappy@1.0.2: + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } + + xxhash-wasm@1.1.0: + resolution: + { + integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==, + } + + yargs-parser@21.1.1: + resolution: + { + integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, + } + engines: { node: ">=12" } + + yocto-queue@1.2.1: + resolution: + { + integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==, + } + engines: { node: ">=12.20" } + + yocto-spinner@0.2.1: + resolution: + { + integrity: sha512-lHHxjh0bXaLgdJy3cNnVb/F9myx3CkhrvSOEVTkaUgNMXnYFa2xYPVhtGnqhh3jErY2gParBOHallCbc7NrlZQ==, + } + engines: { node: ">=18.19" } + + yoctocolors@2.1.1: + resolution: + { + integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==, + } + engines: { node: ">=18" } + + zod-to-json-schema@3.24.5: + resolution: + { + integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==, + } + peerDependencies: + zod: ^3.24.1 + + zod-to-ts@1.2.0: + resolution: + { + integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==, + } + peerDependencies: + typescript: ^4.9.4 || ^5.0.2 + zod: ^3 + + zod@3.24.2: + resolution: + { + integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==, + } + + zwitch@2.0.4: + resolution: + { + integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==, + } + +snapshots: + "@astrojs/compiler@2.11.0": {} + + "@astrojs/internal-helpers@0.6.1": {} + + "@astrojs/markdown-remark@6.3.1": + dependencies: + "@astrojs/internal-helpers": 0.6.1 + "@astrojs/prism": 3.2.0 + github-slugger: 2.0.0 + hast-util-from-html: 2.0.3 + hast-util-to-text: 4.0.2 + import-meta-resolve: 4.1.0 + js-yaml: 4.1.0 + 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 + shiki: 3.2.2 + smol-toml: 1.3.1 + unified: 11.0.5 + unist-util-remove-position: 5.0.0 + unist-util-visit: 5.0.0 + unist-util-visit-parents: 6.0.1 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + "@astrojs/mdx@4.2.4(astro@5.7.0(jiti@2.4.2)(lightningcss@1.29.2)(rollup@4.40.0)(typescript@5.8.3))": + dependencies: + "@astrojs/markdown-remark": 6.3.1 + "@mdx-js/mdx": 3.1.0(acorn@8.14.1) + acorn: 8.14.1 + astro: 5.7.0(jiti@2.4.2)(lightningcss@1.29.2)(rollup@4.40.0)(typescript@5.8.3) + es-module-lexer: 1.6.0 + estree-util-visit: 2.0.0 + hast-util-to-html: 9.0.5 + kleur: 4.1.5 + rehype-raw: 7.0.0 + remark-gfm: 4.0.1 + remark-smartypants: 3.0.2 + source-map: 0.7.4 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + "@astrojs/prism@3.2.0": + dependencies: + prismjs: 1.30.0 + + "@astrojs/sitemap@3.3.0": + dependencies: + sitemap: 8.0.0 + stream-replace-string: 2.0.0 + zod: 3.24.2 + + "@astrojs/starlight-tailwind@4.0.0(@astrojs/starlight@0.33.2(astro@5.7.0(jiti@2.4.2)(lightningcss@1.29.2)(rollup@4.40.0)(typescript@5.8.3)))(tailwindcss@4.1.4)": + dependencies: + "@astrojs/starlight": 0.33.2(astro@5.7.0(jiti@2.4.2)(lightningcss@1.29.2)(rollup@4.40.0)(typescript@5.8.3)) + tailwindcss: 4.1.4 + + "@astrojs/starlight@0.33.2(astro@5.7.0(jiti@2.4.2)(lightningcss@1.29.2)(rollup@4.40.0)(typescript@5.8.3))": + dependencies: + "@astrojs/mdx": 4.2.4(astro@5.7.0(jiti@2.4.2)(lightningcss@1.29.2)(rollup@4.40.0)(typescript@5.8.3)) + "@astrojs/sitemap": 3.3.0 + "@pagefind/default-ui": 1.3.0 + "@types/hast": 3.0.4 + "@types/js-yaml": 4.0.9 + "@types/mdast": 4.0.4 + astro: 5.7.0(jiti@2.4.2)(lightningcss@1.29.2)(rollup@4.40.0)(typescript@5.8.3) + astro-expressive-code: 0.41.1(astro@5.7.0(jiti@2.4.2)(lightningcss@1.29.2)(rollup@4.40.0)(typescript@5.8.3)) + bcp-47: 2.1.0 + hast-util-from-html: 2.0.3 + hast-util-select: 6.0.4 + hast-util-to-string: 3.0.1 + hastscript: 9.0.1 + i18next: 23.16.8 + js-yaml: 4.1.0 + klona: 2.0.6 + mdast-util-directive: 3.1.0 + mdast-util-to-markdown: 2.1.2 + mdast-util-to-string: 4.0.0 + pagefind: 1.3.0 + rehype: 13.0.2 + rehype-format: 5.0.1 + remark-directive: 3.0.1 + unified: 11.0.5 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + "@astrojs/telemetry@3.2.0": + dependencies: + ci-info: 4.2.0 + debug: 4.4.0 + dlv: 1.1.3 + dset: 3.1.4 + is-docker: 3.0.0 + is-wsl: 3.1.0 + which-pm-runs: 1.1.0 + transitivePeerDependencies: + - supports-color + + "@babel/helper-string-parser@7.25.9": {} + + "@babel/helper-validator-identifier@7.25.9": {} + + "@babel/parser@7.27.0": + dependencies: + "@babel/types": 7.27.0 + + "@babel/runtime@7.27.0": + dependencies: + regenerator-runtime: 0.14.1 + + "@babel/types@7.27.0": + dependencies: + "@babel/helper-string-parser": 7.25.9 + "@babel/helper-validator-identifier": 7.25.9 + + "@capsizecss/metrics@3.5.0": {} + + "@capsizecss/unpack@2.4.0": + dependencies: + blob-to-buffer: 1.2.9 + cross-fetch: 3.2.0 + fontkit: 2.0.4 + transitivePeerDependencies: + - encoding + + "@ctrl/tinycolor@4.1.0": {} + + "@emnapi/runtime@1.4.3": + dependencies: + tslib: 2.8.1 + optional: true + + "@esbuild/aix-ppc64@0.25.2": + optional: true + + "@esbuild/android-arm64@0.25.2": + optional: true + + "@esbuild/android-arm@0.25.2": + optional: true + + "@esbuild/android-x64@0.25.2": + optional: true + + "@esbuild/darwin-arm64@0.25.2": + optional: true + + "@esbuild/darwin-x64@0.25.2": + optional: true + + "@esbuild/freebsd-arm64@0.25.2": + optional: true + + "@esbuild/freebsd-x64@0.25.2": + optional: true + + "@esbuild/linux-arm64@0.25.2": + optional: true + + "@esbuild/linux-arm@0.25.2": + optional: true + + "@esbuild/linux-ia32@0.25.2": + optional: true + + "@esbuild/linux-loong64@0.25.2": + optional: true + + "@esbuild/linux-mips64el@0.25.2": + optional: true + + "@esbuild/linux-ppc64@0.25.2": + optional: true + + "@esbuild/linux-riscv64@0.25.2": + optional: true + + "@esbuild/linux-s390x@0.25.2": + optional: true + + "@esbuild/linux-x64@0.25.2": + optional: true + + "@esbuild/netbsd-arm64@0.25.2": + optional: true + + "@esbuild/netbsd-x64@0.25.2": + optional: true + + "@esbuild/openbsd-arm64@0.25.2": + optional: true + + "@esbuild/openbsd-x64@0.25.2": + optional: true + + "@esbuild/sunos-x64@0.25.2": + optional: true + + "@esbuild/win32-arm64@0.25.2": + optional: true + + "@esbuild/win32-ia32@0.25.2": + optional: true + + "@esbuild/win32-x64@0.25.2": + optional: true + + "@expressive-code/core@0.41.1": + dependencies: + "@ctrl/tinycolor": 4.1.0 + hast-util-select: 6.0.4 + hast-util-to-html: 9.0.5 + hast-util-to-text: 4.0.2 + hastscript: 9.0.1 + postcss: 8.5.3 + postcss-nested: 6.2.0(postcss@8.5.3) + unist-util-visit: 5.0.0 + unist-util-visit-parents: 6.0.1 + + "@expressive-code/plugin-frames@0.41.1": + dependencies: + "@expressive-code/core": 0.41.1 + + "@expressive-code/plugin-shiki@0.41.1": + dependencies: + "@expressive-code/core": 0.41.1 + shiki: 3.2.2 + + "@expressive-code/plugin-text-markers@0.41.1": + dependencies: + "@expressive-code/core": 0.41.1 + + "@img/sharp-darwin-arm64@0.33.5": + optionalDependencies: + "@img/sharp-libvips-darwin-arm64": 1.0.4 + optional: true + + "@img/sharp-darwin-x64@0.33.5": + optionalDependencies: + "@img/sharp-libvips-darwin-x64": 1.0.4 + optional: true + + "@img/sharp-libvips-darwin-arm64@1.0.4": + optional: true + + "@img/sharp-libvips-darwin-x64@1.0.4": + optional: true + + "@img/sharp-libvips-linux-arm64@1.0.4": + optional: true + + "@img/sharp-libvips-linux-arm@1.0.5": + optional: true + + "@img/sharp-libvips-linux-s390x@1.0.4": + optional: true + + "@img/sharp-libvips-linux-x64@1.0.4": + optional: true + + "@img/sharp-libvips-linuxmusl-arm64@1.0.4": + optional: true + + "@img/sharp-libvips-linuxmusl-x64@1.0.4": + optional: true + + "@img/sharp-linux-arm64@0.33.5": + optionalDependencies: + "@img/sharp-libvips-linux-arm64": 1.0.4 + optional: true + + "@img/sharp-linux-arm@0.33.5": + optionalDependencies: + "@img/sharp-libvips-linux-arm": 1.0.5 + optional: true + + "@img/sharp-linux-s390x@0.33.5": + optionalDependencies: + "@img/sharp-libvips-linux-s390x": 1.0.4 + optional: true + + "@img/sharp-linux-x64@0.33.5": + optionalDependencies: + "@img/sharp-libvips-linux-x64": 1.0.4 + optional: true + + "@img/sharp-linuxmusl-arm64@0.33.5": + optionalDependencies: + "@img/sharp-libvips-linuxmusl-arm64": 1.0.4 + optional: true + + "@img/sharp-linuxmusl-x64@0.33.5": + optionalDependencies: + "@img/sharp-libvips-linuxmusl-x64": 1.0.4 + optional: true + + "@img/sharp-wasm32@0.33.5": + dependencies: + "@emnapi/runtime": 1.4.3 + optional: true + + "@img/sharp-win32-ia32@0.33.5": + optional: true + + "@img/sharp-win32-x64@0.33.5": + optional: true + + "@jridgewell/sourcemap-codec@1.5.0": {} + + "@mdx-js/mdx@3.1.0(acorn@8.14.1)": + dependencies: + "@types/estree": 1.0.7 + "@types/estree-jsx": 1.0.5 + "@types/hast": 3.0.4 + "@types/mdx": 2.0.13 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-util-scope: 1.0.0 + estree-walker: 3.0.3 + hast-util-to-jsx-runtime: 2.3.6 + markdown-extensions: 2.0.0 + recma-build-jsx: 1.0.0 + recma-jsx: 1.0.0(acorn@8.14.1) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 + remark-mdx: 3.1.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + source-map: 0.7.4 + unified: 11.0.5 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - acorn + - supports-color + + "@oslojs/encoding@1.1.0": {} + + "@pagefind/darwin-arm64@1.3.0": + optional: true + + "@pagefind/darwin-x64@1.3.0": + optional: true + + "@pagefind/default-ui@1.3.0": {} + + "@pagefind/linux-arm64@1.3.0": + optional: true + + "@pagefind/linux-x64@1.3.0": + optional: true + + "@pagefind/windows-x64@1.3.0": + optional: true + + "@rollup/pluginutils@5.1.4(rollup@4.40.0)": + dependencies: + "@types/estree": 1.0.7 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.40.0 + + "@rollup/rollup-android-arm-eabi@4.40.0": + optional: true + + "@rollup/rollup-android-arm64@4.40.0": + optional: true + + "@rollup/rollup-darwin-arm64@4.40.0": + optional: true + + "@rollup/rollup-darwin-x64@4.40.0": + optional: true + + "@rollup/rollup-freebsd-arm64@4.40.0": + optional: true + + "@rollup/rollup-freebsd-x64@4.40.0": + optional: true + + "@rollup/rollup-linux-arm-gnueabihf@4.40.0": + optional: true + + "@rollup/rollup-linux-arm-musleabihf@4.40.0": + optional: true + + "@rollup/rollup-linux-arm64-gnu@4.40.0": + optional: true + + "@rollup/rollup-linux-arm64-musl@4.40.0": + optional: true + + "@rollup/rollup-linux-loongarch64-gnu@4.40.0": + optional: true + + "@rollup/rollup-linux-powerpc64le-gnu@4.40.0": + optional: true + + "@rollup/rollup-linux-riscv64-gnu@4.40.0": + optional: true + + "@rollup/rollup-linux-riscv64-musl@4.40.0": + optional: true + + "@rollup/rollup-linux-s390x-gnu@4.40.0": + optional: true + + "@rollup/rollup-linux-x64-gnu@4.40.0": + optional: true + + "@rollup/rollup-linux-x64-musl@4.40.0": + optional: true + + "@rollup/rollup-win32-arm64-msvc@4.40.0": + optional: true + + "@rollup/rollup-win32-ia32-msvc@4.40.0": + optional: true + + "@rollup/rollup-win32-x64-msvc@4.40.0": + optional: true + + "@shikijs/core@3.2.2": + dependencies: + "@shikijs/types": 3.2.2 + "@shikijs/vscode-textmate": 10.0.2 + "@types/hast": 3.0.4 + hast-util-to-html: 9.0.5 + + "@shikijs/engine-javascript@3.2.2": + dependencies: + "@shikijs/types": 3.2.2 + "@shikijs/vscode-textmate": 10.0.2 + oniguruma-to-es: 4.2.0 + + "@shikijs/engine-oniguruma@3.2.2": + dependencies: + "@shikijs/types": 3.2.2 + "@shikijs/vscode-textmate": 10.0.2 + + "@shikijs/langs@3.2.2": + dependencies: + "@shikijs/types": 3.2.2 + + "@shikijs/themes@3.2.2": + dependencies: + "@shikijs/types": 3.2.2 + + "@shikijs/types@3.2.2": + dependencies: + "@shikijs/vscode-textmate": 10.0.2 + "@types/hast": 3.0.4 + + "@shikijs/vscode-textmate@10.0.2": {} + + "@swc/helpers@0.5.17": + dependencies: + tslib: 2.8.1 + + "@tailwindcss/node@4.1.4": + dependencies: + enhanced-resolve: 5.18.1 + jiti: 2.4.2 + lightningcss: 1.29.2 + tailwindcss: 4.1.4 + + "@tailwindcss/oxide-android-arm64@4.1.4": + optional: true + + "@tailwindcss/oxide-darwin-arm64@4.1.4": + optional: true + + "@tailwindcss/oxide-darwin-x64@4.1.4": + optional: true + + "@tailwindcss/oxide-freebsd-x64@4.1.4": + optional: true + + "@tailwindcss/oxide-linux-arm-gnueabihf@4.1.4": + optional: true + + "@tailwindcss/oxide-linux-arm64-gnu@4.1.4": + optional: true + + "@tailwindcss/oxide-linux-arm64-musl@4.1.4": + optional: true + + "@tailwindcss/oxide-linux-x64-gnu@4.1.4": + optional: true + + "@tailwindcss/oxide-linux-x64-musl@4.1.4": + optional: true + + "@tailwindcss/oxide-wasm32-wasi@4.1.4": + optional: true + + "@tailwindcss/oxide-win32-arm64-msvc@4.1.4": + optional: true + + "@tailwindcss/oxide-win32-x64-msvc@4.1.4": + optional: true + + "@tailwindcss/oxide@4.1.4": + optionalDependencies: + "@tailwindcss/oxide-android-arm64": 4.1.4 + "@tailwindcss/oxide-darwin-arm64": 4.1.4 + "@tailwindcss/oxide-darwin-x64": 4.1.4 + "@tailwindcss/oxide-freebsd-x64": 4.1.4 + "@tailwindcss/oxide-linux-arm-gnueabihf": 4.1.4 + "@tailwindcss/oxide-linux-arm64-gnu": 4.1.4 + "@tailwindcss/oxide-linux-arm64-musl": 4.1.4 + "@tailwindcss/oxide-linux-x64-gnu": 4.1.4 + "@tailwindcss/oxide-linux-x64-musl": 4.1.4 + "@tailwindcss/oxide-wasm32-wasi": 4.1.4 + "@tailwindcss/oxide-win32-arm64-msvc": 4.1.4 + "@tailwindcss/oxide-win32-x64-msvc": 4.1.4 + + "@tailwindcss/vite@4.1.4(vite@6.2.6(jiti@2.4.2)(lightningcss@1.29.2))": + dependencies: + "@tailwindcss/node": 4.1.4 + "@tailwindcss/oxide": 4.1.4 + tailwindcss: 4.1.4 + vite: 6.2.6(jiti@2.4.2)(lightningcss@1.29.2) + + "@types/debug@4.1.12": + dependencies: + "@types/ms": 2.1.0 + + "@types/estree-jsx@1.0.5": + dependencies: + "@types/estree": 1.0.7 + + "@types/estree@1.0.7": {} + + "@types/hast@3.0.4": + dependencies: + "@types/unist": 3.0.3 + + "@types/js-yaml@4.0.9": {} + + "@types/mdast@4.0.4": + dependencies: + "@types/unist": 3.0.3 + + "@types/mdx@2.0.13": {} + + "@types/ms@2.1.0": {} + + "@types/nlcst@2.0.3": + dependencies: + "@types/unist": 3.0.3 + + "@types/node@17.0.45": {} + + "@types/sax@1.2.7": + dependencies: + "@types/node": 17.0.45 + + "@types/unist@2.0.11": {} + + "@types/unist@3.0.3": {} + + "@ungap/structured-clone@1.3.0": {} + + acorn-jsx@5.3.2(acorn@8.14.1): + dependencies: + acorn: 8.14.1 + + acorn@8.14.1: {} + + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@6.2.1: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@5.0.2: {} + + argparse@2.0.1: {} + + aria-query@5.3.2: {} + + array-iterate@2.0.1: {} + + astring@1.9.0: {} + + astro-expressive-code@0.41.1(astro@5.7.0(jiti@2.4.2)(lightningcss@1.29.2)(rollup@4.40.0)(typescript@5.8.3)): + dependencies: + astro: 5.7.0(jiti@2.4.2)(lightningcss@1.29.2)(rollup@4.40.0)(typescript@5.8.3) + rehype-expressive-code: 0.41.1 + + astro@5.7.0(jiti@2.4.2)(lightningcss@1.29.2)(rollup@4.40.0)(typescript@5.8.3): + dependencies: + "@astrojs/compiler": 2.11.0 + "@astrojs/internal-helpers": 0.6.1 + "@astrojs/markdown-remark": 6.3.1 + "@astrojs/telemetry": 3.2.0 + "@capsizecss/metrics": 3.5.0 + "@capsizecss/unpack": 2.4.0 + "@oslojs/encoding": 1.1.0 + "@rollup/pluginutils": 5.1.4(rollup@4.40.0) + acorn: 8.14.1 + aria-query: 5.3.2 + axobject-query: 4.1.0 + boxen: 8.0.1 + ci-info: 4.2.0 + clsx: 2.1.1 + common-ancestor-path: 1.0.1 + cookie: 1.0.2 + cssesc: 3.0.0 + debug: 4.4.0 + deterministic-object-hash: 2.0.2 + devalue: 5.1.1 + diff: 5.2.0 + dlv: 1.1.3 + dset: 3.1.4 + es-module-lexer: 1.6.0 + esbuild: 0.25.2 + estree-walker: 3.0.3 + flattie: 1.1.1 + github-slugger: 2.0.0 + html-escaper: 3.0.3 + http-cache-semantics: 4.1.1 + js-yaml: 4.1.0 + kleur: 4.1.5 + magic-string: 0.30.17 + magicast: 0.3.5 + mrmime: 2.0.1 + neotraverse: 0.6.18 + p-limit: 6.2.0 + p-queue: 8.1.0 + package-manager-detector: 1.2.0 + picomatch: 4.0.2 + prompts: 2.4.2 + rehype: 13.0.2 + semver: 7.7.1 + shiki: 3.2.2 + tinyexec: 0.3.2 + tinyglobby: 0.2.12 + tsconfck: 3.1.5(typescript@5.8.3) + ultrahtml: 1.6.0 + unifont: 0.1.7 + unist-util-visit: 5.0.0 + unstorage: 1.15.0 + vfile: 6.0.3 + vite: 6.2.6(jiti@2.4.2)(lightningcss@1.29.2) + vitefu: 1.0.6(vite@6.2.6(jiti@2.4.2)(lightningcss@1.29.2)) + xxhash-wasm: 1.1.0 + yargs-parser: 21.1.1 + yocto-spinner: 0.2.1 + zod: 3.24.2 + zod-to-json-schema: 3.24.5(zod@3.24.2) + zod-to-ts: 1.2.0(typescript@5.8.3)(zod@3.24.2) + optionalDependencies: + sharp: 0.33.5 + transitivePeerDependencies: + - "@azure/app-configuration" + - "@azure/cosmos" + - "@azure/data-tables" + - "@azure/identity" + - "@azure/keyvault-secrets" + - "@azure/storage-blob" + - "@capacitor/preferences" + - "@deno/kv" + - "@netlify/blobs" + - "@planetscale/database" + - "@types/node" + - "@upstash/redis" + - "@vercel/blob" + - "@vercel/kv" + - aws4fetch + - db0 + - encoding + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - rollup + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - typescript + - uploadthing + - yaml + + axobject-query@4.1.0: {} + + b4a@1.6.7: {} + + bail@2.0.2: {} + + bare-events@2.5.4: + optional: true + + bare-fs@4.1.2: + dependencies: + bare-events: 2.5.4 + bare-path: 3.0.0 + bare-stream: 2.6.5(bare-events@2.5.4) + optional: true + + bare-os@3.6.1: + optional: true + + bare-path@3.0.0: + dependencies: + bare-os: 3.6.1 + optional: true + + bare-stream@2.6.5(bare-events@2.5.4): + dependencies: + streamx: 2.22.0 + optionalDependencies: + bare-events: 2.5.4 + optional: true + + base-64@1.0.0: {} + + base64-js@1.5.1: {} + + bcp-47-match@2.0.3: {} + + bcp-47@2.1.0: + dependencies: + is-alphabetical: 2.0.1 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + blob-to-buffer@1.2.9: {} + + boolbase@1.0.0: {} + + boxen@8.0.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 8.0.0 + chalk: 5.4.1 + cli-boxes: 3.0.0 + string-width: 7.2.0 + type-fest: 4.40.0 + widest-line: 5.0.0 + wrap-ansi: 9.0.0 + + brotli@1.3.3: + dependencies: + base64-js: 1.5.1 + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + camelcase@8.0.0: {} + + ccount@2.0.1: {} + + chalk@5.4.1: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + chownr@1.1.4: {} + + ci-info@4.2.0: {} + + cli-boxes@3.0.0: {} + + clone@2.1.2: {} + + clsx@2.1.1: {} + + collapse-white-space@2.1.0: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + + comma-separated-tokens@2.0.3: {} + + common-ancestor-path@1.0.1: {} + + cookie-es@1.2.2: {} + + cookie@1.0.2: {} + + cross-fetch@3.2.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + crossws@0.3.4: + dependencies: + uncrypto: 0.1.3 + + css-selector-parser@3.1.2: {} + + css-tree@3.1.0: + dependencies: + mdn-data: 2.12.2 + source-map-js: 1.2.1 + + cssesc@3.0.0: {} + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.1.0: + dependencies: + character-entities: 2.0.2 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + deep-extend@0.6.0: {} + + defu@6.1.4: {} + + dequal@2.0.3: {} + + destr@2.0.5: {} + + detect-libc@2.0.3: {} + + deterministic-object-hash@2.0.2: + dependencies: + base-64: 1.0.0 + + devalue@5.1.1: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + dfa@1.2.0: {} + + diff@5.2.0: {} + + direction@2.0.1: {} + + dlv@1.1.3: {} + + dset@3.1.4: {} + + emoji-regex-xs@1.0.0: {} + + emoji-regex@10.4.0: {} + + emoji-regex@8.0.0: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + enhanced-resolve@5.18.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + entities@4.5.0: {} + + es-module-lexer@1.6.0: {} + + esast-util-from-estree@2.0.0: + dependencies: + "@types/estree-jsx": 1.0.5 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + unist-util-position-from-estree: 2.0.0 + + esast-util-from-js@2.0.1: + dependencies: + "@types/estree-jsx": 1.0.5 + acorn: 8.14.1 + esast-util-from-estree: 2.0.0 + vfile-message: 4.0.2 + + esbuild@0.25.2: + optionalDependencies: + "@esbuild/aix-ppc64": 0.25.2 + "@esbuild/android-arm": 0.25.2 + "@esbuild/android-arm64": 0.25.2 + "@esbuild/android-x64": 0.25.2 + "@esbuild/darwin-arm64": 0.25.2 + "@esbuild/darwin-x64": 0.25.2 + "@esbuild/freebsd-arm64": 0.25.2 + "@esbuild/freebsd-x64": 0.25.2 + "@esbuild/linux-arm": 0.25.2 + "@esbuild/linux-arm64": 0.25.2 + "@esbuild/linux-ia32": 0.25.2 + "@esbuild/linux-loong64": 0.25.2 + "@esbuild/linux-mips64el": 0.25.2 + "@esbuild/linux-ppc64": 0.25.2 + "@esbuild/linux-riscv64": 0.25.2 + "@esbuild/linux-s390x": 0.25.2 + "@esbuild/linux-x64": 0.25.2 + "@esbuild/netbsd-arm64": 0.25.2 + "@esbuild/netbsd-x64": 0.25.2 + "@esbuild/openbsd-arm64": 0.25.2 + "@esbuild/openbsd-x64": 0.25.2 + "@esbuild/sunos-x64": 0.25.2 + "@esbuild/win32-arm64": 0.25.2 + "@esbuild/win32-ia32": 0.25.2 + "@esbuild/win32-x64": 0.25.2 + + escape-string-regexp@5.0.0: {} + + estree-util-attach-comments@3.0.0: + dependencies: + "@types/estree": 1.0.7 + + estree-util-build-jsx@3.0.1: + dependencies: + "@types/estree-jsx": 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + + estree-util-is-identifier-name@3.0.0: {} + + estree-util-scope@1.0.0: + dependencies: + "@types/estree": 1.0.7 + devlop: 1.1.0 + + estree-util-to-js@2.0.0: + dependencies: + "@types/estree-jsx": 1.0.5 + astring: 1.9.0 + source-map: 0.7.4 + + estree-util-visit@2.0.0: + dependencies: + "@types/estree-jsx": 1.0.5 + "@types/unist": 3.0.3 + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + "@types/estree": 1.0.7 + + eventemitter3@5.0.1: {} + + expand-template@2.0.3: {} + + expressive-code@0.41.1: + dependencies: + "@expressive-code/core": 0.41.1 + "@expressive-code/plugin-frames": 0.41.1 + "@expressive-code/plugin-shiki": 0.41.1 + "@expressive-code/plugin-text-markers": 0.41.1 + + extend@3.0.2: {} + + fast-deep-equal@3.1.3: {} + + fast-fifo@1.3.2: {} + + fdir@6.4.3(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + flattie@1.1.1: {} + + fontkit@2.0.4: + dependencies: + "@swc/helpers": 0.5.17 + brotli: 1.3.3 + clone: 2.1.2 + dfa: 1.2.0 + fast-deep-equal: 3.1.3 + restructure: 3.0.2 + tiny-inflate: 1.0.3 + unicode-properties: 1.4.1 + unicode-trie: 2.0.0 + + fs-constants@1.0.0: {} + + fsevents@2.3.3: + optional: true + + get-east-asian-width@1.3.0: {} + + github-from-package@0.0.0: {} + + github-slugger@2.0.0: {} + + graceful-fs@4.2.11: {} + + h3@1.15.1: + dependencies: + cookie-es: 1.2.2 + crossws: 0.3.4 + defu: 6.1.4 + destr: 2.0.5 + iron-webcrypto: 1.2.1 + node-mock-http: 1.0.0 + radix3: 1.1.2 + ufo: 1.6.1 + uncrypto: 0.1.3 + + hast-util-embedded@3.0.0: + dependencies: + "@types/hast": 3.0.4 + hast-util-is-element: 3.0.0 + + hast-util-format@1.1.0: + dependencies: + "@types/hast": 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-minify-whitespace: 1.0.1 + hast-util-phrasing: 3.0.1 + hast-util-whitespace: 3.0.0 + html-whitespace-sensitive-tag-names: 3.0.1 + unist-util-visit-parents: 6.0.1 + + hast-util-from-html@2.0.3: + dependencies: + "@types/hast": 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.3 + parse5: 7.2.1 + vfile: 6.0.3 + vfile-message: 4.0.2 + + hast-util-from-parse5@8.0.3: + dependencies: + "@types/hast": 3.0.4 + "@types/unist": 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.0.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-has-property@3.0.0: + dependencies: + "@types/hast": 3.0.4 + + hast-util-is-body-ok-link@3.0.1: + dependencies: + "@types/hast": 3.0.4 + + hast-util-is-element@3.0.0: + dependencies: + "@types/hast": 3.0.4 + + hast-util-minify-whitespace@1.0.1: + dependencies: + "@types/hast": 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-is-element: 3.0.0 + hast-util-whitespace: 3.0.0 + unist-util-is: 6.0.0 + + hast-util-parse-selector@4.0.0: + dependencies: + "@types/hast": 3.0.4 + + hast-util-phrasing@3.0.1: + dependencies: + "@types/hast": 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-has-property: 3.0.0 + hast-util-is-body-ok-link: 3.0.1 + hast-util-is-element: 3.0.0 + + hast-util-raw@9.1.0: + dependencies: + "@types/hast": 3.0.4 + "@types/unist": 3.0.3 + "@ungap/structured-clone": 1.3.0 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + parse5: 7.2.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-select@6.0.4: + dependencies: + "@types/hast": 3.0.4 + "@types/unist": 3.0.3 + bcp-47-match: 2.0.3 + comma-separated-tokens: 2.0.3 + css-selector-parser: 3.1.2 + devlop: 1.1.0 + direction: 2.0.1 + hast-util-has-property: 3.0.0 + hast-util-to-string: 3.0.1 + hast-util-whitespace: 3.0.0 + nth-check: 2.1.1 + property-information: 7.0.0 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + hast-util-to-estree@3.1.3: + dependencies: + "@types/estree": 1.0.7 + "@types/estree-jsx": 1.0.5 + "@types/hast": 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-attach-comments: 3.0.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.0.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.16 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + + hast-util-to-html@9.0.5: + dependencies: + "@types/hast": 3.0.4 + "@types/unist": 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 7.0.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-jsx-runtime@2.3.6: + dependencies: + "@types/estree": 1.0.7 + "@types/hast": 3.0.4 + "@types/unist": 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.0.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.16 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + hast-util-to-parse5@8.0.0: + dependencies: + "@types/hast": 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-string@3.0.1: + dependencies: + "@types/hast": 3.0.4 + + hast-util-to-text@4.0.2: + dependencies: + "@types/hast": 3.0.4 + "@types/unist": 3.0.3 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + + hast-util-whitespace@3.0.0: + dependencies: + "@types/hast": 3.0.4 + + hastscript@9.0.1: + dependencies: + "@types/hast": 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.0.0 + space-separated-tokens: 2.0.2 + + html-escaper@3.0.3: {} + + html-void-elements@3.0.0: {} + + html-whitespace-sensitive-tag-names@3.0.1: {} + + http-cache-semantics@4.1.1: {} + + i18next@23.16.8: + dependencies: + "@babel/runtime": 7.27.0 + + ieee754@1.2.1: {} + + import-meta-resolve@4.1.0: {} + + inherits@2.0.4: {} + + ini@1.3.8: {} + + inline-style-parser@0.2.4: {} + + iron-webcrypto@1.2.1: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-arrayish@0.3.2: {} + + is-decimal@2.0.1: {} + + is-docker@3.0.0: {} + + is-fullwidth-code-point@3.0.0: {} + + is-hexadecimal@2.0.1: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-plain-obj@4.1.0: {} + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + jiti@2.4.2: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + kleur@3.0.3: {} + + kleur@4.1.5: {} + + klona@2.0.6: {} + + lightningcss-darwin-arm64@1.29.2: + optional: true + + lightningcss-darwin-x64@1.29.2: + optional: true + + lightningcss-freebsd-x64@1.29.2: + optional: true + + lightningcss-linux-arm-gnueabihf@1.29.2: + optional: true + + lightningcss-linux-arm64-gnu@1.29.2: + optional: true + + lightningcss-linux-arm64-musl@1.29.2: + optional: true + + lightningcss-linux-x64-gnu@1.29.2: + optional: true + + lightningcss-linux-x64-musl@1.29.2: + optional: true + + lightningcss-win32-arm64-msvc@1.29.2: + optional: true + + lightningcss-win32-x64-msvc@1.29.2: + optional: true + + lightningcss@1.29.2: + dependencies: + detect-libc: 2.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.29.2 + lightningcss-darwin-x64: 1.29.2 + lightningcss-freebsd-x64: 1.29.2 + lightningcss-linux-arm-gnueabihf: 1.29.2 + lightningcss-linux-arm64-gnu: 1.29.2 + lightningcss-linux-arm64-musl: 1.29.2 + lightningcss-linux-x64-gnu: 1.29.2 + lightningcss-linux-x64-musl: 1.29.2 + lightningcss-win32-arm64-msvc: 1.29.2 + lightningcss-win32-x64-msvc: 1.29.2 + + longest-streak@3.1.0: {} + + lru-cache@10.4.3: {} + + magic-string@0.30.17: + dependencies: + "@jridgewell/sourcemap-codec": 1.5.0 + + magicast@0.3.5: + dependencies: + "@babel/parser": 7.27.0 + "@babel/types": 7.27.0 + source-map-js: 1.2.1 + + markdown-extensions@2.0.0: {} + + markdown-table@3.0.4: {} + + mdast-util-definitions@6.0.0: + dependencies: + "@types/mdast": 4.0.4 + "@types/unist": 3.0.3 + unist-util-visit: 5.0.0 + + mdast-util-directive@3.1.0: + dependencies: + "@types/mdast": 4.0.4 + "@types/unist": 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-visit-parents: 6.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-find-and-replace@3.0.2: + dependencies: + "@types/mdast": 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-from-markdown@2.0.2: + dependencies: + "@types/mdast": 4.0.4 + "@types/unist": 3.0.3 + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + "@types/mdast": 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + "@types/mdast": 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + "@types/mdast": 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + "@types/mdast": 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + "@types/mdast": 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + "@types/estree-jsx": 1.0.5 + "@types/hast": 3.0.4 + "@types/mdast": 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + "@types/estree-jsx": 1.0.5 + "@types/hast": 3.0.4 + "@types/mdast": 4.0.4 + "@types/unist": 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + "@types/estree-jsx": 1.0.5 + "@types/hast": 3.0.4 + "@types/mdast": 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + "@types/mdast": 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.2.0: + dependencies: + "@types/hast": 3.0.4 + "@types/mdast": 4.0.4 + "@ungap/structured-clone": 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + "@types/mdast": 4.0.4 + "@types/unist": 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + "@types/mdast": 4.0.4 + + mdn-data@2.12.2: {} + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-directive@3.0.2: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + parse-entities: 4.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-expression@3.0.1: + dependencies: + "@types/estree": 1.0.7 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-jsx@3.0.2: + dependencies: + "@types/estree": 1.0.7 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.2 + + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + "@types/estree": 1.0.7 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-extension-mdxjs@3.0.0: + dependencies: + acorn: 8.14.1 + acorn-jsx: 5.3.2(acorn@8.14.1) + micromark-extension-mdx-expression: 3.0.1 + micromark-extension-mdx-jsx: 3.0.2 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-mdx-expression@2.0.3: + dependencies: + "@types/estree": 1.0.7 + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-events-to-acorn@2.0.3: + dependencies: + "@types/estree": 1.0.7 + "@types/unist": 3.0.3 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.2 + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + "@types/debug": 4.1.12 + debug: 4.4.0 + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + + mimic-response@3.1.0: {} + + minimist@1.2.8: {} + + mkdirp-classic@0.5.3: {} + + mrmime@2.0.1: {} + + ms@2.1.3: {} + + nanoid@3.3.11: {} + + napi-build-utils@2.0.0: {} + + neotraverse@0.6.18: {} + + nlcst-to-string@4.0.0: + dependencies: + "@types/nlcst": 2.0.3 + + node-abi@3.74.0: + dependencies: + semver: 7.7.1 + + node-addon-api@6.1.0: {} + + node-fetch-native@1.6.6: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-mock-http@1.0.0: {} + + normalize-path@3.0.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + ofetch@1.4.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.6 + ufo: 1.6.1 + + ohash@1.1.6: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + oniguruma-parser@0.11.1: {} + + oniguruma-to-es@4.2.0: + dependencies: + emoji-regex-xs: 1.0.0 + oniguruma-parser: 0.11.1 + regex: 6.0.1 + regex-recursion: 6.0.2 + + p-limit@6.2.0: + dependencies: + yocto-queue: 1.2.1 + + p-queue@8.1.0: + dependencies: + eventemitter3: 5.0.1 + p-timeout: 6.1.4 + + p-timeout@6.1.4: {} + + package-manager-detector@1.2.0: {} + + pagefind@1.3.0: + optionalDependencies: + "@pagefind/darwin-arm64": 1.3.0 + "@pagefind/darwin-x64": 1.3.0 + "@pagefind/linux-arm64": 1.3.0 + "@pagefind/linux-x64": 1.3.0 + "@pagefind/windows-x64": 1.3.0 + + pako@0.2.9: {} + + parse-entities@4.0.2: + dependencies: + "@types/unist": 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.1.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-latin@7.0.0: + dependencies: + "@types/nlcst": 2.0.3 + "@types/unist": 3.0.3 + nlcst-to-string: 4.0.0 + unist-util-modify-children: 4.0.0 + unist-util-visit-children: 3.0.0 + vfile: 6.0.3 + + parse5@7.2.1: + dependencies: + entities: 4.5.0 + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + postcss-nested@6.2.0(postcss@8.5.3): + dependencies: + postcss: 8.5.3 + postcss-selector-parser: 6.1.2 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss@8.5.3: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prebuild-install@7.1.3: + dependencies: + detect-libc: 2.0.3 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 2.0.0 + node-abi: 3.74.0 + pump: 3.0.2 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.2 + tunnel-agent: 0.6.0 + + prettier@3.6.2: {} + + prismjs@1.30.0: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + property-information@6.5.0: {} + + property-information@7.0.0: {} + + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + radix3@1.1.2: {} + + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@4.1.2: {} + + recma-build-jsx@1.0.0: + dependencies: + "@types/estree": 1.0.7 + estree-util-build-jsx: 3.0.1 + vfile: 6.0.3 + + recma-jsx@1.0.0(acorn@8.14.1): + dependencies: + acorn-jsx: 5.3.2(acorn@8.14.1) + estree-util-to-js: 2.0.0 + recma-parse: 1.0.0 + recma-stringify: 1.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - acorn + + recma-parse@1.0.0: + dependencies: + "@types/estree": 1.0.7 + esast-util-from-js: 2.0.1 + unified: 11.0.5 + vfile: 6.0.3 + + recma-stringify@1.0.0: + dependencies: + "@types/estree": 1.0.7 + estree-util-to-js: 2.0.0 + unified: 11.0.5 + vfile: 6.0.3 + + regenerator-runtime@0.14.1: {} + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.0.1: + dependencies: + regex-utilities: 2.3.0 + + rehype-expressive-code@0.41.1: + dependencies: + expressive-code: 0.41.1 + + rehype-format@5.0.1: + dependencies: + "@types/hast": 3.0.4 + hast-util-format: 1.1.0 + + rehype-parse@9.0.1: + dependencies: + "@types/hast": 3.0.4 + hast-util-from-html: 2.0.3 + unified: 11.0.5 + + rehype-raw@7.0.0: + dependencies: + "@types/hast": 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + rehype-recma@1.0.0: + dependencies: + "@types/estree": 1.0.7 + "@types/hast": 3.0.4 + hast-util-to-estree: 3.1.3 + transitivePeerDependencies: + - supports-color + + rehype-stringify@10.0.1: + dependencies: + "@types/hast": 3.0.4 + hast-util-to-html: 9.0.5 + unified: 11.0.5 + + rehype@13.0.2: + dependencies: + "@types/hast": 3.0.4 + rehype-parse: 9.0.1 + rehype-stringify: 10.0.1 + unified: 11.0.5 + + remark-directive@3.0.1: + dependencies: + "@types/mdast": 4.0.4 + mdast-util-directive: 3.1.0 + micromark-extension-directive: 3.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-gfm@4.0.1: + dependencies: + "@types/mdast": 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-mdx@3.1.0: + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + "@types/mdast": 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.2: + dependencies: + "@types/hast": 3.0.4 + "@types/mdast": 4.0.4 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + vfile: 6.0.3 + + remark-smartypants@3.0.2: + dependencies: + retext: 9.0.0 + retext-smartypants: 6.2.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + + remark-stringify@11.0.0: + dependencies: + "@types/mdast": 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + restructure@3.0.2: {} + + retext-latin@4.0.0: + dependencies: + "@types/nlcst": 2.0.3 + parse-latin: 7.0.0 + unified: 11.0.5 + + retext-smartypants@6.2.0: + dependencies: + "@types/nlcst": 2.0.3 + nlcst-to-string: 4.0.0 + unist-util-visit: 5.0.0 + + retext-stringify@4.0.0: + dependencies: + "@types/nlcst": 2.0.3 + nlcst-to-string: 4.0.0 + unified: 11.0.5 + + retext@9.0.0: + dependencies: + "@types/nlcst": 2.0.3 + retext-latin: 4.0.0 + retext-stringify: 4.0.0 + unified: 11.0.5 + + rollup@4.40.0: + dependencies: + "@types/estree": 1.0.7 + optionalDependencies: + "@rollup/rollup-android-arm-eabi": 4.40.0 + "@rollup/rollup-android-arm64": 4.40.0 + "@rollup/rollup-darwin-arm64": 4.40.0 + "@rollup/rollup-darwin-x64": 4.40.0 + "@rollup/rollup-freebsd-arm64": 4.40.0 + "@rollup/rollup-freebsd-x64": 4.40.0 + "@rollup/rollup-linux-arm-gnueabihf": 4.40.0 + "@rollup/rollup-linux-arm-musleabihf": 4.40.0 + "@rollup/rollup-linux-arm64-gnu": 4.40.0 + "@rollup/rollup-linux-arm64-musl": 4.40.0 + "@rollup/rollup-linux-loongarch64-gnu": 4.40.0 + "@rollup/rollup-linux-powerpc64le-gnu": 4.40.0 + "@rollup/rollup-linux-riscv64-gnu": 4.40.0 + "@rollup/rollup-linux-riscv64-musl": 4.40.0 + "@rollup/rollup-linux-s390x-gnu": 4.40.0 + "@rollup/rollup-linux-x64-gnu": 4.40.0 + "@rollup/rollup-linux-x64-musl": 4.40.0 + "@rollup/rollup-win32-arm64-msvc": 4.40.0 + "@rollup/rollup-win32-ia32-msvc": 4.40.0 + "@rollup/rollup-win32-x64-msvc": 4.40.0 + fsevents: 2.3.3 + + safe-buffer@5.2.1: {} + + sax@1.4.1: {} + + semver@7.7.1: {} + + sharp@0.32.6: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + node-addon-api: 6.1.0 + prebuild-install: 7.1.3 + semver: 7.7.1 + simple-get: 4.0.1 + tar-fs: 3.0.8 + tunnel-agent: 0.6.0 + transitivePeerDependencies: + - bare-buffer + + sharp@0.33.5: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.7.1 + optionalDependencies: + "@img/sharp-darwin-arm64": 0.33.5 + "@img/sharp-darwin-x64": 0.33.5 + "@img/sharp-libvips-darwin-arm64": 1.0.4 + "@img/sharp-libvips-darwin-x64": 1.0.4 + "@img/sharp-libvips-linux-arm": 1.0.5 + "@img/sharp-libvips-linux-arm64": 1.0.4 + "@img/sharp-libvips-linux-s390x": 1.0.4 + "@img/sharp-libvips-linux-x64": 1.0.4 + "@img/sharp-libvips-linuxmusl-arm64": 1.0.4 + "@img/sharp-libvips-linuxmusl-x64": 1.0.4 + "@img/sharp-linux-arm": 0.33.5 + "@img/sharp-linux-arm64": 0.33.5 + "@img/sharp-linux-s390x": 0.33.5 + "@img/sharp-linux-x64": 0.33.5 + "@img/sharp-linuxmusl-arm64": 0.33.5 + "@img/sharp-linuxmusl-x64": 0.33.5 + "@img/sharp-wasm32": 0.33.5 + "@img/sharp-win32-ia32": 0.33.5 + "@img/sharp-win32-x64": 0.33.5 + optional: true + + shiki@3.2.2: + dependencies: + "@shikijs/core": 3.2.2 + "@shikijs/engine-javascript": 3.2.2 + "@shikijs/engine-oniguruma": 3.2.2 + "@shikijs/langs": 3.2.2 + "@shikijs/themes": 3.2.2 + "@shikijs/types": 3.2.2 + "@shikijs/vscode-textmate": 10.0.2 + "@types/hast": 3.0.4 + + simple-concat@1.0.1: {} + + simple-get@4.0.1: + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + + sisteransi@1.0.5: {} + + sitemap@8.0.0: + dependencies: + "@types/node": 17.0.45 + "@types/sax": 1.2.7 + arg: 5.0.2 + sax: 1.4.1 + + smol-toml@1.3.1: {} + + source-map-js@1.2.1: {} + + source-map@0.7.4: {} + + space-separated-tokens@2.0.2: {} + + stream-replace-string@2.0.0: {} + + streamx@2.22.0: + dependencies: + fast-fifo: 1.3.2 + text-decoder: 1.2.3 + optionalDependencies: + bare-events: 2.5.4 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.4.0 + get-east-asian-width: 1.3.0 + strip-ansi: 7.1.0 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-json-comments@2.0.1: {} + + style-to-js@1.1.16: + dependencies: + style-to-object: 1.0.8 + + style-to-object@1.0.8: + dependencies: + inline-style-parser: 0.2.4 + + tailwindcss@4.1.4: {} + + tapable@2.2.1: {} + + tar-fs@2.1.2: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.2 + tar-stream: 2.2.0 + + tar-fs@3.0.8: + dependencies: + pump: 3.0.2 + tar-stream: 3.1.7 + optionalDependencies: + bare-fs: 4.1.2 + bare-path: 3.0.0 + transitivePeerDependencies: + - bare-buffer + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + tar-stream@3.1.7: + dependencies: + b4a: 1.6.7 + fast-fifo: 1.3.2 + streamx: 2.22.0 + + text-decoder@1.2.3: + dependencies: + b4a: 1.6.7 + + tiny-inflate@1.0.3: {} + + tinyexec@0.3.2: {} + + tinyglobby@0.2.12: + dependencies: + fdir: 6.4.3(picomatch@4.0.2) + picomatch: 4.0.2 + + tr46@0.0.3: {} + + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + tsconfck@3.1.5(typescript@5.8.3): + optionalDependencies: + typescript: 5.8.3 + + tslib@2.8.1: {} + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + type-fest@4.40.0: {} + + typescript@5.8.3: {} + + ufo@1.6.1: {} + + ultrahtml@1.6.0: {} + + uncrypto@0.1.3: {} + + unicode-properties@1.4.1: + dependencies: + base64-js: 1.5.1 + unicode-trie: 2.0.0 + + unicode-trie@2.0.0: + dependencies: + pako: 0.2.9 + tiny-inflate: 1.0.3 + + unified@11.0.5: + dependencies: + "@types/unist": 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unifont@0.1.7: + dependencies: + css-tree: 3.1.0 + ohash: 1.1.6 + + unist-util-find-after@5.0.0: + dependencies: + "@types/unist": 3.0.3 + unist-util-is: 6.0.0 + + unist-util-is@6.0.0: + dependencies: + "@types/unist": 3.0.3 + + unist-util-modify-children@4.0.0: + dependencies: + "@types/unist": 3.0.3 + array-iterate: 2.0.1 + + unist-util-position-from-estree@2.0.0: + dependencies: + "@types/unist": 3.0.3 + + unist-util-position@5.0.0: + dependencies: + "@types/unist": 3.0.3 + + unist-util-remove-position@5.0.0: + dependencies: + "@types/unist": 3.0.3 + unist-util-visit: 5.0.0 + + unist-util-stringify-position@4.0.0: + dependencies: + "@types/unist": 3.0.3 + + unist-util-visit-children@3.0.0: + dependencies: + "@types/unist": 3.0.3 + + unist-util-visit-parents@6.0.1: + dependencies: + "@types/unist": 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + "@types/unist": 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + unstorage@1.15.0: + dependencies: + anymatch: 3.1.3 + chokidar: 4.0.3 + destr: 2.0.5 + h3: 1.15.1 + lru-cache: 10.4.3 + node-fetch-native: 1.6.6 + ofetch: 1.4.1 + ufo: 1.6.1 + + util-deprecate@1.0.2: {} + + vfile-location@5.0.3: + dependencies: + "@types/unist": 3.0.3 + vfile: 6.0.3 + + vfile-message@4.0.2: + dependencies: + "@types/unist": 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + "@types/unist": 3.0.3 + vfile-message: 4.0.2 + + vite@6.2.6(jiti@2.4.2)(lightningcss@1.29.2): + dependencies: + esbuild: 0.25.2 + postcss: 8.5.3 + rollup: 4.40.0 + optionalDependencies: + fsevents: 2.3.3 + jiti: 2.4.2 + lightningcss: 1.29.2 + + vitefu@1.0.6(vite@6.2.6(jiti@2.4.2)(lightningcss@1.29.2)): + optionalDependencies: + vite: 6.2.6(jiti@2.4.2)(lightningcss@1.29.2) + + web-namespaces@2.0.1: {} + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-pm-runs@1.1.0: {} + + widest-line@5.0.0: + dependencies: + string-width: 7.2.0 + + wrap-ansi@9.0.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + xxhash-wasm@1.1.0: {} + + yargs-parser@21.1.1: {} + + yocto-queue@1.2.1: {} + + yocto-spinner@0.2.1: + dependencies: + yoctocolors: 2.1.1 + + yoctocolors@2.1.1: {} + + zod-to-json-schema@3.24.5(zod@3.24.2): + dependencies: + zod: 3.24.2 + + zod-to-ts@1.2.0(typescript@5.8.3)(zod@3.24.2): + dependencies: + typescript: 5.8.3 + zod: 3.24.2 + + zod@3.24.2: {} + + zwitch@2.0.4: {} diff --git a/docs/pnpm-workspace.yaml b/docs/pnpm-workspace.yaml new file mode 100644 index 0000000..d0b7dbe --- /dev/null +++ b/docs/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +onlyBuiltDependencies: + - esbuild + - sharp diff --git a/docs/public/favicon.svg b/docs/public/favicon.svg new file mode 100644 index 0000000..cba5ac1 --- /dev/null +++ b/docs/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/src/assets/KiCad-Logo.webp b/docs/src/assets/KiCad-Logo.webp new file mode 100644 index 0000000..3c36ae2 Binary files /dev/null and b/docs/src/assets/KiCad-Logo.webp differ diff --git a/docs/src/components/BadgeData.astro b/docs/src/components/BadgeData.astro new file mode 100644 index 0000000..0db7aba --- /dev/null +++ b/docs/src/components/BadgeData.astro @@ -0,0 +1,123 @@ +--- +// BadgeData.astro +--- + + diff --git a/docs/src/components/Footer.astro b/docs/src/components/Footer.astro new file mode 100644 index 0000000..4892f36 --- /dev/null +++ b/docs/src/components/Footer.astro @@ -0,0 +1,37 @@ +--- +import Default from "@astrojs/starlight/components/Footer.astro"; +--- + +
+ + + + +
+ + diff --git a/docs/src/content.config.ts b/docs/src/content.config.ts new file mode 100644 index 0000000..7fbcf2c --- /dev/null +++ b/docs/src/content.config.ts @@ -0,0 +1,7 @@ +import { defineCollection } from "astro:content"; +import { docsLoader } from "@astrojs/starlight/loaders"; +import { docsSchema } from "@astrojs/starlight/schema"; + +export const collections = { + docs: defineCollection({ loader: docsLoader(), schema: docsSchema() }), +}; diff --git a/docs/src/content/docs/community/contributing.md b/docs/src/content/docs/community/contributing.md new file mode 100644 index 0000000..e5029e6 --- /dev/null +++ b/docs/src/content/docs/community/contributing.md @@ -0,0 +1,61 @@ +--- +title: Contributing +description: How to contribute to the KiLM project. +--- + +Contributions to KiLM are welcome! Whether it's reporting bugs, suggesting features, improving documentation, or submitting code changes, your help is appreciated. + +## Reporting Issues + +- **Search Existing Issues:** Before creating a new issue, please check if a similar one already exists on the [GitHub Issues page](https://github.com/barisgit/kilm/issues). +- **Provide Details:** If creating a new issue, please include: + - KiLM version (`kilm --version`) + - KiCad version + - Operating System + - Clear description of the bug or feature request + - Steps to reproduce the issue (for bugs) + - Any relevant error messages or logs (use `--verbose` flag if applicable) + +## Submitting Changes (Pull Requests) + +1. **Fork the Repository:** Create your own fork of the [KiLM repository](https://github.com/barisgit/kilm) on GitHub. +2. **Clone Your Fork:** Clone your forked repository to your local machine. + ```bash + git clone https://github.com/YOUR_USERNAME/kilm.git + cd kilm + ``` +3. **Set up Development Environment:** Follow the [Development Setup guide](/community/development/) to install dependencies in a virtual environment. +4. **Create a Feature Branch:** Create a new branch for your changes. + ```bash + git checkout -b feature/my-amazing-feature # Or fix/issue-number + ``` +5. **Make Your Changes:** Implement your feature or bug fix. +6. **Add Tests:** If adding a new feature or fixing a bug, please add corresponding tests in the `tests/` directory. +7. **Format Code:** Ensure your code is formatted using Black. + ```bash + black . + ``` +8. **Run Tests:** Make sure all tests pass. + ```bash + pytest + ``` +9. **Commit Changes:** Commit your changes with a clear and descriptive commit message. + ```bash + git add . + git commit -m "feat: Add support for XYZ feature" + ``` +10. **Push to Your Fork:** Push your feature branch to your fork on GitHub. + ```bash + git push origin feature/my-amazing-feature + ``` +11. **Open a Pull Request:** Go to the original KiLM repository on GitHub and open a Pull Request (PR) from your feature branch to the `main` branch of the upstream repository. + - Provide a clear description of your changes in the PR. + - Link to any relevant issues (e.g., "Closes #123"). + +## Code Style + +- Follow [PEP 8](https://www.python.org/dev/peps/pep-0008/) guidelines. +- Use [Black](https://github.com/psf/black) for code formatting. +- Write clear and concise code with comments where necessary. + +Thank you for contributing! diff --git a/docs/src/content/docs/community/development.md b/docs/src/content/docs/community/development.md new file mode 100644 index 0000000..417b0e9 --- /dev/null +++ b/docs/src/content/docs/community/development.md @@ -0,0 +1,75 @@ +--- +title: Development Setup +description: How to set up a development environment for KiLM. +--- + +If you want to contribute to KiLM or work with the source code, follow these steps to set up a development environment. + +## 1. Clone the Repository + +First, clone the KiLM repository from GitHub: + +```bash +git clone https://github.com/barisgit/kilm.git +cd kilm +``` + +## 2. Create a Virtual Environment (Recommended) + +It's highly recommended to use a virtual environment to isolate development dependencies. + +```bash +# Using Python's built-in venv +python -m venv .venv +source .venv/bin/activate # On Windows use `.venv\Scripts\activate` +``` + +## 3. Install Dependencies + +Install KiLM in editable mode (`-e`) along with its development dependencies (`[dev]`): + +```bash +pip install -e ".[dev]" +``` + +This installs the package such that changes you make to the source code are immediately reflected when you run the `kilm` command (within the activated virtual environment). +The `[dev]` part installs extra packages needed for testing and formatting, such as `pytest` and `black`. + +## 4. Verify Installation + +You should now be able to run the development version: + +```bash +kilm --version +``` + +## Running Tests + +KiLM uses `pytest` for testing. + +```bash +# Run all tests +pytest + +# Run tests in a specific file +pytest tests/test_config_commands.py + +# Run tests with coverage reporting +pytest --cov=kicad_lib_manager --cov-report=term-missing +``` + +## Code Formatting + +KiLM uses [Black](https://github.com/psf/black) for code formatting. Ensure your code is formatted before committing: + +```bash +# Check formatting +black --check . + +# Apply formatting +black . +``` + +## Next Steps + +Now you're ready to start developing! See the [Contributing guide](/community/contributing/) for how to submit your changes. diff --git a/docs/src/content/docs/community/license.md b/docs/src/content/docs/community/license.md new file mode 100644 index 0000000..1a1fa8f --- /dev/null +++ b/docs/src/content/docs/community/license.md @@ -0,0 +1,8 @@ +--- +title: License +description: KiLM Project License Information +--- + +KiLM is licensed under the MIT License. + +You can find the full license text in the [LICENSE file](https://github.com/barisgit/kilm/blob/main/LICENSE) in the source repository. diff --git a/docs/src/content/docs/guides/automatic-updates.mdx b/docs/src/content/docs/guides/automatic-updates.mdx new file mode 100644 index 0000000..73a7dd1 --- /dev/null +++ b/docs/src/content/docs/guides/automatic-updates.mdx @@ -0,0 +1,111 @@ +--- +title: Automatic Updates +description: Keeping libraries updated automatically using Git hooks. +--- + +import { Aside } from "@astrojs/starlight/components"; + +> **Note:** This guide primarily describes features beneficial for **Consumers** – those using libraries managed by a Creator. The setup of the hook itself might be done by a Creator or an advanced Consumer. + +KiLM provides a helper command [`kilm add-hook`](/reference/cli/add-hook/) to easily create a basic `post-merge` Git hook that runs `kilm update`. + +## Using `kilm add-hook` (Recommended) + +Navigate to the root of your Git repository containing your KiCad libraries and run: + +```bash +kilm add-hook +``` + +This creates a `.git/hooks/post-merge` script that automatically executes `kilm update` every time you successfully run `git pull` or `git merge` in that repository. + + + +## Manual Hook Setup (Alternative) + +If you prefer manual setup or want to customize the hook script further, you can follow these steps: + +1. **Create Hook Directory (if needed):** + Make sure the hooks directory exists in your repository: + + ```bash + mkdir -p .git/hooks + ``` + +2. **Create Hook Script:** + Create a file named `.git/hooks/post-merge`. + +3. **Add Script Content:** + Add the commands you want to run. For basic KiLM integration, use: + + ```bash + #!/bin/sh + # BEGIN KiLM-managed section + # KiCad Library Manager auto-update hook + # Added manually + + echo "Running KiCad Library Manager update..." + kilm update + + # Uncomment to set up libraries automatically (use with caution) + # kilm setup + + echo "KiCad libraries update complete." + # END KiLM-managed section + ``` + +4. **Make Executable:** + Set the execute permission: + ```bash + chmod +x .git/hooks/post-merge + ``` + +## How It Works + +When you run `git pull` or `git merge`: + +1. Git executes the `post-merge` hook automatically +2. The hook runs `kilm update` to check for library updates +3. If new versions are available, they are pulled from remote repositories +4. Your local KiCad libraries stay synchronized with the latest versions + +## Customization Options + +### Automatic Setup + +You can modify the hook to automatically run `kilm setup` after updates by uncommenting the `kilm setup` line. This is useful for automatically updating KiCad's configuration files, but use with caution as it modifies your KiCad setup. + +### Additional Commands + +Add any other commands you want to run after library updates, such as: + +- Notifications or logging +- Additional validation steps +- Integration with other tools + +## Troubleshooting + +### Hook Not Running + +- Ensure the hook file has execute permissions (`chmod +x .git/hooks/post-merge`) +- Check that you're running `git pull` or `git merge` (not `git fetch`) +- Verify the hook is in the correct repository's `.git/hooks` directory + +### Custom Hooks Directory + +If your repository uses `git config core.hooksPath`, KiLM will automatically detect and use that location. You can check your current hooks path with: + +```bash +git config core.hooksPath +``` + +### Git Worktrees + +For repositories using Git worktrees, KiLM correctly identifies the main repository location and installs hooks in the appropriate hooks directory. diff --git a/docs/src/content/docs/guides/configuration.mdx b/docs/src/content/docs/guides/configuration.mdx new file mode 100644 index 0000000..249e230 --- /dev/null +++ b/docs/src/content/docs/guides/configuration.mdx @@ -0,0 +1,63 @@ +--- +title: Configuration +description: Understanding KiLM configuration files. +--- + +import { Aside } from "@astrojs/starlight/components"; + + + +KiLM stores its main configuration file, `config.yaml`, in a standard user configuration directory: + +- **Linux/macOS**: `~/.config/kicad-lib-manager/config.yaml` (following XDG Base Directory specification) +- **Windows**: Typically `C:\Users\\.config\kicad-lib-manager\config.yaml` (derived from `Path.home()`) + +## Main Configuration File (`config.yaml`) + +The primary configuration file, `config.yaml`, is located within the configuration directory mentioned above. This file stores information about: + +- **Registered Libraries (`libraries`):** A list containing details about the libraries managed by KiLM. Each library entry includes: + - `name`: A unique identifier for the library. + - `path`: The absolute path to the library's directory. + - `type`: Specifies the kind of library. Common types include: + - `github`: Typically used for standard symbol and footprint libraries, often managed via Git. + - `cloud`: Used for 3D model libraries. +- **Current Library (`current_library`):** The path to the library currently considered "active" by KiLM. This path is used by commands like `status` and others. It can be set using the `kilm config set-default` command. +- **Maximum Backups (`max_backups`):** An integer defining the maximum number of timestamped backups KiLM should keep when modifying KiCad's native configuration files. + +This file is automatically managed by KiLM when you use commands like `init`, `add-3d`, `config set-default`, etc. Manual editing is usually not required but possible if needed. + +Example structure: + +```yaml +current_library: /path/to/your/main-kicad-library +libraries: + - name: my-company-kicad-library + path: /path/to/your/main-kicad-library + type: github + - name: shared-3d-models + path: /path/to/shared/3d-models + type: cloud + - name: my-company-another-library + path: /path/to/your/other-kicad-library + type: github +max_backups: 5 +``` + +## KiCad Configuration Files + +KiLM interacts directly with KiCad's own configuration files to add libraries, set environment variables, and manage pinned libraries. KiLM automatically detects the location of these files (usually within KiCad's user settings directory). + + diff --git a/docs/src/content/docs/guides/custom-descriptions.mdx b/docs/src/content/docs/guides/custom-descriptions.mdx new file mode 100644 index 0000000..680997d --- /dev/null +++ b/docs/src/content/docs/guides/custom-descriptions.mdx @@ -0,0 +1,37 @@ +--- +title: Custom Descriptions & Metadata +description: Adding detailed descriptions and metadata to your libraries. +--- + +> **Note:** This guide is primarily aimed at **Creators** – those setting up and managing the shared KiCad libraries. + +While KiLM manages adding libraries to KiCad, KiCad itself displays a description for each library in its managers. + +KiLM allows you to define these descriptions centrally within your library repository by looking for a specific YAML file. + +## `library_descriptions.yaml` + +If you place a file named `library_descriptions.yaml` in the root of a library directory that you have initialized with `kilm init`, KiLM will read this file when running `kilm setup`. + +The expected format for this file is: + +```yaml +# Symbol library descriptions +symbols: + "KiCad-Connector": "This is the description for the KiCad Connector library that will appear in KiCad." + "KiCad-Analog": "Contains specialized analog components and basic analog parts." + +# Footprint library descriptions +footprints: + "KiCad-Connector": "Description for the KiCad Connector footprint library (can be different from symbol desc)." + "Custom-Breakouts": "Footprints for custom breakout boards and development modules." +``` + +**Key Points:** + +- **Keys are Logical Names:** The keys under `symbols` and `footprints` (`LogicalLibraryName1`, `AnotherSymbolLib`, etc.) must match the actual _logical_ names of the libraries as defined in KiCad's library tables (`sym-lib-table` or `fp-lib-table`). These logical names may differ from the actual filenames. +- **Matching:** KiLM uses these logical names to find the corresponding library entry in KiCad's `sym-lib-table` or `fp-lib-table` and sets the description field. +- **Location:** The `library_descriptions.yaml` file must be in the root of the library directory managed by `kilm init`. +- **Setup Required:** These descriptions are applied only when you run `kilm setup`. + +This provides a way to keep your library descriptions version-controlled alongside your library files. diff --git a/docs/src/content/docs/guides/getting-started.mdx b/docs/src/content/docs/guides/getting-started.mdx new file mode 100644 index 0000000..fc88f02 --- /dev/null +++ b/docs/src/content/docs/guides/getting-started.mdx @@ -0,0 +1,173 @@ +--- +title: Getting Started +description: A quick start guide to setting up and using KiLM for Creators and Consumers. +--- + +import { Steps, Aside } from "@astrojs/starlight/components"; + +This guide provides typical workflows for setting up and using KiLM, focusing on collaboration using Git. + +## Prerequisites + +- **KiCad:** Ensure you have KiCad installed. +- **Git:** Ensure you have Git installed. +- **Python:** Ensure you have Python installed. +- **KiLM:** Ensure you have KiLM installed. [Install KiLM](/guides/installation/) + +## Understanding User Roles (Creator vs. Consumer) + +KiLM is designed for teams or individuals managing KiCad libraries. We can think of two main roles: + +- **Creator:** This person is responsible for setting up the central library structure (often in a Git repository), adding symbol/footprint libraries, configuring 3D models (which might be shared separately), defining custom metadata using KiLM, and potentially creating project templates. They establish the shared standard. +- **Consumer:** This person primarily uses the libraries set up by the Creator. Their main goal is to easily configure their local KiCad installation to use the shared libraries and keep it updated. + +While one person might perform both roles, understanding this distinction helps clarify which commands are most relevant. + +## Typical Creator Workflow (Setting up a Shared Library) + +This workflow assumes the Creator is setting up a new library repository to be shared with Consumers via Git. + + + +1. **Create and Navigate to Library Directory:** + Create a new directory for your shared KiCad library. This will become the Git repository. + + ```bash + mkdir my-shared-kicad-lib + cd my-shared-kicad-lib + git init # Initialize Git repository + ``` + +2. **Initialize KiLM with Metadata:** + Run `kilm init` _inside_ the library directory, providing all relevant metadata. This creates the `kilm.yaml` file which stores the canonical information for this library and gets committed to Git. + + ```bash + # Example: Initialize with name, description, and environment variable + kilm init --name shared-company-lib \ + --description "Main KiCad library for ACME Corp" \ + --env-var ACME_LIB_PATH + ``` + + + +3. **Add Library Content:** + Add your KiCad symbol (`.kicad_sym`), footprint (`.pretty`), and other library files into the appropriate subdirectories within `my-shared-kicad-lib`. + +4. **Register Shared 3D Models (Optional but Recommended):** + If you have 3D models stored in a shared location (e.g., Google Drive, network share), register this location with KiLM using `kilm add-3d`. This adds the 3D library information to the _Creator's_ global KiLM config (`config.yaml`). Consumers will run a similar command later. + + ```bash + # Example: Registering a shared 3D model directory + kilm add-3d --name shared-3d-models \ + --directory /path/to/shared/google-drive/kicad-3d-models \ + --env-var ACME_3D_MODELS + ``` + + + +5. **Create Templates (Optional):** + If you want to provide standardized project starting points, use `kilm template make`. + + ```bash + # Example: Create a template named 'standard-board' from an existing project + kilm template make standard-board /path/to/example/project --description "Standard ACME Board Template" + ``` + + Template files will be stored within the `templates/` directory in your library repository. + +6. **Commit and Push:** + Add all the files (`kilm.yaml`, symbols, footprints, templates) to Git, commit, and push to the shared remote repository (e.g., GitHub, GitLab). + + ```bash + git add . + git commit -m "Initial library setup with KiLM metadata and content" + git push origin main + ``` + +7. **Configure Creator's KiCad (Optional):** + The Creator can run `kilm setup` to configure their _own_ KiCad installation, just like a Consumer would. + ```bash + kilm setup + ``` + + + +## Typical Consumer Workflow (Using a Shared Library) + +This workflow assumes a Creator has already set up a shared library in a Git repository. + + + +1. **Clone the Library Repository:** + Get a local copy of the shared library. + + ```bash + git clone my-shared-kicad-lib + cd my-shared-kicad-lib + ``` + +2. **Register Local Library Path with KiLM:** + Run `kilm init` _inside the cloned repository directory_. This reads the `kilm.yaml` (created by the Creator) and registers _this specific local path_ (`my-shared-kicad-lib`) in _your_ global KiLM configuration (`config.yaml`), linking it to the name and metadata defined by the Creator. + + ```bash + kilm init + ``` + + + +3. **Register Local 3D Model Path:** + Run `kilm add-3d` pointing to the location where _you_ access the shared 3D models (e.g., your local Google Drive sync folder). Use the same `--name` and `--env-var` the Creator used (check documentation or ask the Creator). + + ```bash + # Example: Pointing to your local path for the shared models + kilm add-3d --name shared-3d-models \ + --directory /Users/myuser/GoogleDrive/kicad-3d-models + ``` + + + +4. **Configure KiCad:** + Run `kilm setup` from anywhere in your terminal. This reads _your_ KiLM configuration (which now includes the local paths registered in steps 2 & 3) and updates _your_ KiCad's library tables and environment variables. + + ```bash + kilm setup + ``` + + + +5. **Set Up Automatic Updates (Optional, Recommended):** + Navigate to the directory of a specific KiCad _project_ that uses the shared library (this project might also be a Git repo, potentially using the library repo as a submodule). Run `kilm add-hook` here. + ```bash + cd /path/to/my/kicad-project + kilm add-hook + ``` + This sets up a Git hook _in the project repository_ so that after you run `git pull` _in this project_, it automatically runs `kilm setup` for you, ensuring KiCad stays synced if the library was updated. + + + diff --git a/docs/src/content/docs/guides/installation.md b/docs/src/content/docs/guides/installation.md new file mode 100644 index 0000000..8737e8c --- /dev/null +++ b/docs/src/content/docs/guides/installation.md @@ -0,0 +1,70 @@ +--- +title: Installation +description: How to install KiLM on your system. +--- + +KiLM requires Python 3.7 or newer and KiCad 6.x or newer (must be run at least once). + +## Dependencies + +KiLM relies on the following Python packages: + +- `click >= 8.0` +- `pyyaml >= 6.0` +- `pathlib >= 1.0.1` +- `pathspec >= 0.12.1` +- `jinja2 >= 3.1.6` + +These dependencies are automatically installed when you install KiLM using `pip` or `pipx`. + +## Installation Methods + +You can install KiLM using several methods: + +### From PyPI (Standard Method) + +The most common way to install Python packages: + +```bash +pip install kilm +``` + +### Using pipx (Recommended) + +[`pipx`](https://pypa.github.io/pipx/) installs CLI tools in isolated environments, making them available globally without interfering with other Python projects. This is the recommended method for installing KiLM. + +```bash +# Install pipx if you don't have it +python -m pip install --user pipx +python -m pipx ensurepath + +# Install kilm using pipx +pipx install kilm +``` + +### Using uv (Faster Installer) + +[`uv`](https://github.com/astral-sh/uv) is an extremely fast Python package installer and resolver from the creators of Ruff. + +```bash +# Install uv if you don't have it (example for Linux/macOS) +curl -sSf https://astral.sh/uv/install.sh | sh + +# Install kilm using uv +uv pip install kilm +``` + +### From Source (Development) + +If you want to contribute to KiLM or use the latest development version: + +```bash +# Clone the repository +git clone https://github.com/barisgit/kilm.git +cd kilm + +# Install in editable mode +pip install -e . +``` + +After installation, you should be able to run `kilm --version` to verify it's installed correctly. diff --git a/docs/src/content/docs/guides/troubleshooting.md b/docs/src/content/docs/guides/troubleshooting.md new file mode 100644 index 0000000..e703c26 --- /dev/null +++ b/docs/src/content/docs/guides/troubleshooting.md @@ -0,0 +1,55 @@ +--- +title: Troubleshooting +description: Solutions to common issues with KiLM. +--- + +Here are some common problems you might encounter when using KiLM and how to resolve them. + +## 1. KiCad Configuration Not Found + +- **Symptom:** KiLM commands fail with an error message indicating it cannot find KiCad's configuration directory or files (like `kicad_common.json`, `sym-lib-table`, `fp-lib-table`). +- **Cause:** KiCad needs to create its configuration files the first time it runs. If you installed KiCad but haven't opened it yet, these files won't exist. +- **Solution:** Launch KiCad (the main application) at least once. This will initialize its configuration directory and files in the standard location for your operating system. Afterwards, KiLM should be able to find them. + +## 2. Changes Not Appearing in KiCad + +- **Symptom:** You successfully ran `kilm setup` or `kilm pin`/`unpin`, but the new libraries, environment variables, or pinned status aren't reflected when you use KiCad. +- **Cause:** KiCad typically loads its configuration files only when it starts up. +- **Solution:** **Restart KiCad completely.** Close all KiCad windows (main application, Eeschema, Pcbnew, etc.) and then reopen it. The changes made by KiLM should now be loaded. + +## 3. Environment Variables Not Working (Legacy Method) + +- **Symptom:** You are using the older method of setting environment variables directly in your shell (e.g., `export KICAD_USER_LIB=...` in Bash/Zsh) instead of using `kilm setup`, and KiCad doesn't seem to recognize them. +- **Cause:** Shell environment variables are typically only inherited by processes launched _after_ the variable has been set and exported in that _same_ shell session or its children. System-wide environment variable changes might require a logout/login or restart. +- **Solution:** + - **Shell:** Ensure you have restarted your terminal/shell session after setting the variable. If you added it to a startup file (like `.bashrc`, `.zshrc`, `.profile`), make sure you've sourced the file (`source ~/.bashrc`) or opened a new terminal window. + - **System (Windows):** After using `SetEnvironmentVariable` in PowerShell or editing System Properties, you might need to restart KiCad, or potentially log out and back in, for the changes to take effect globally. + - **Recommendation:** Use `kilm setup` to manage KiCad environment variables, as it modifies KiCad's internal `kicad_common.json` file, which is generally more reliable than relying on shell environment variables. + +## 4. Template Creation Failing (`kilm template make`) + +- **Symptom:** The `kilm template make` command fails or produces an incomplete/incorrect template. +- **Cause:** This can happen if the source project directory contains unexpected or non-standard files/directories that interfere with the template creation logic (e.g., complex build artifacts, temporary files, unusual symlinks). +- **Solution:** + - **Clean Project:** Ensure your source project directory is clean and doesn't contain unnecessary temporary or build files. + - **Use `--exclude`:** Identify the problematic files or directories and use the `--exclude` option (which accepts glob patterns) to prevent KiLM from including them in the template. You can use `--exclude` multiple times. + ```bash + kilm template make my-template --exclude "*.tmp" --exclude "build/*" --exclude ".cache/" + ``` + - **Check Permissions:** Ensure KiLM has read permissions for all files in the source project directory and write permissions in the target library's `templates` directory. + +## 5. Incorrect Library Paths in KiCad + +- **Symptom:** Libraries appear in KiCad but have the wrong path, often showing the absolute path where `kilm setup` was run instead of using an environment variable. +- **Cause:** You might not have specified an `--env-var` when running `kilm init` or `kilm add-3d` for the relevant library. +- **Solution:** + 1. **(Optional) Remove Incorrect Entry:** You might want to manually remove the incorrect library entry from KiCad's `sym-lib-table`/`fp-lib-table` or the incorrect variable from `kicad_common.json` first (remember KiLM creates backups). + 2. **Update KiLM Config:** Manually edit `~/.config/kicad-lib-manager/config.yaml` (or equivalent) and add the desired `env_var: YOUR_VAR_NAME` key/value pair to the library entry. + 3. **Run Setup:** Execute `kilm setup` again. It should now use the environment variable when configuring KiCad. + 4. **Restart KiCad:** Restart KiCad to see the changes. + +## Getting More Help + +- Use the `--verbose` flag with commands like `kilm setup` or `kilm update` to get more detailed output. +- Use `kilm status` to check the current configuration state. +- Check the KiLM issue tracker on GitHub: [https://github.com/barisgit/kilm/issues](https://github.com/barisgit/kilm/issues) or submit a request here: [https://aristovnik.me/contact](https://aristovnik.me/contact) diff --git a/docs/src/content/docs/index.mdx b/docs/src/content/docs/index.mdx new file mode 100644 index 0000000..5b9c37d --- /dev/null +++ b/docs/src/content/docs/index.mdx @@ -0,0 +1,229 @@ +--- +title: KiCad Library Manager (KiLM) +description: A command-line tool for managing KiCad libraries across projects and workstations. +template: splash +hero: + title: KiCad Library Manager + tagline: Streamline your KiCad library management across projects and workstations. + image: + file: ../../assets/KiCad-Logo.webp + actions: + - text: Get Started + link: /guides/getting-started/ + icon: right-arrow + variant: primary + - text: View on GitHub + link: https://github.com/barisgit/kilm + icon: github + variant: minimal +--- + +import { Card, CardGrid } from "@astrojs/starlight/components"; +import BadgeData from "../../components/BadgeData.astro"; + + + +
+
+ +## ✨ What can you do with KiLM? + +**KiLM** centralizes how you handle symbol, footprint, and 3D model libraries across projects and workstations. +It helps maintain consistency in your designs with a standardized approach to library management. + + + +
+ +
+
+ +## 🚀 Take a guided tour + +Follow the [Getting Started tutorial](/guides/getting-started/) to learn the basics and set up your first KiLM configuration. + +
+ +
+
+ +## ⚡ Start a new setup + +
+
+
+ + + +
+
+
+
+ $pip + install kilm +
+
+ Successfully installed kilm-1.0.0 +
+
+ $kilm + init +
+
+ Initializing new KiLM configuration... +
+
+
+ +Our [installation guide](/guides/installation/) has step-by-step instructions for installing KiLM using pip, pipx, or from source, setting up a new project from an existing configuration, and more. + +
+ +## 📖 Learn + +
+
+
+

Key Features

+

+ Learn about KiLM's core capabilities and how they can improve your + workflow. +

+ + Explore Features + + → + + +
+
+
+

+ Project Architecture +

+

+ Understand how KiLM organizes and manages your libraries. +

+ + View Architecture + + → + + +
+
+
+

Command Reference

+

+ Explore the complete list of commands and their options. +

+ + View Commands + + → + + +
+
+
+

+ Configuration Options +

+

+ Learn how to customize KiLM to fit your specific needs. +

+ + View Config Options + + → + + +
+
+ +
+
+ +## 🔮 Extend + + + + Integrate third-party symbol, footprint, and 3D model libraries. + + + Standardize designs with reusable project templates. + + + Configure KiCad environment variables directly through KiLM. + + + Keep your favorite libraries readily accessible within KiCad. + + + +
diff --git a/docs/src/content/docs/reference/cli/add-3d.md b/docs/src/content/docs/reference/cli/add-3d.md new file mode 100644 index 0000000..d2dda41 --- /dev/null +++ b/docs/src/content/docs/reference/cli/add-3d.md @@ -0,0 +1,80 @@ +--- +title: add-3d +description: Add a directory containing 3D models (e.g., STEP, WRL). +--- + +The `kilm add-3d` command registers a directory containing 3D models (like `.step` or `.wrl` files) with KiLM. This is typically used for libraries stored outside the main symbol/footprint Git repository, such as in cloud-synced folders. + +It performs the following main actions: + +1. Creates or updates a metadata file named `.kilm_cloud_metadata` within the target directory. This stores the library's name, description, associated environment variable, and a count of detected model files. +2. Adds an entry for this library (with its path and type `cloud`) to the main KiLM configuration file (`~/.config/kicad-lib-manager/config.yaml`). +3. Scans the directory for common 3D model file extensions and warns if none are found. + +## Usage + +```bash +kilm add-3d [OPTIONS] +``` + +## Options + +- `--directory DIRECTORY`: + Specifies the path to the directory containing the 3D models. + _Default:_ Uses the current working directory if not specified. + _Example:_ `kilm add-3d --directory ~/kicad/libraries/3d-models` + +- `--name TEXT`: + Sets a custom name for this 3D library entry. If not provided, a name is generated from the directory name. + _Example:_ `kilm add-3d --directory ... --name standard-3d-lib` + +- `--description TEXT`: + Adds an optional description for this 3D library to the metadata file. + _Example:_ `kilm add-3d --directory ... --name ... --description "My custom collection of STEP models"` + +- `--env-var TEXT`: + Specifies a custom KiCad environment variable name (e.g., `MY_CUSTOM_3D`) to associate with this library's path. If not provided (and `--no-env-var` isn't used), a name is automatically generated (e.g., `KICAD_3D_STANDARD_3D_LIB`). This variable will be set in KiCad when you run `kilm setup`. + _Example:_ `kilm add-3d --directory ... --name ... --env-var KICAD_USER_3DMOD` + +- `--no-env-var`: + Prevents an environment variable from being assigned to this library in the metadata. Default: `False`. + _Example:_ `kilm add-3d --no-env-var` + +- `--force`: + If `.kilm_cloud_metadata` already exists in the target directory, overwrite it with new metadata based on options or defaults. Without `--force`, existing metadata is updated only with explicitly provided options. Default: `False`. + _Example:_ `kilm add-3d --directory ... --force` + +- `--help`: + Show the help message and exit. + +## Behavior + +- **Target Directory:** Uses `--directory` path or current working directory. +- **Creates/Updates Metadata:** Creates or modifies `.kilm_cloud_metadata` in the target directory. +- **Updates Global Config:** Adds library entry (type `cloud`) to main `config.yaml`. +- **Verification:** Checks for the presence of files with extensions like `.step`, `.stp`, `.wrl` in the target directory. + +## Examples + +**Add a 3D library (using defaults where possible):** +Register the directory `/home/user/cad/my_3d_parts`. A name and environment variable will be generated automatically. + +```bash +kilm add-3d --directory /home/user/cad/my_3d_parts --description "Custom 3D mechanical parts" +``` + +**Add a 3D library with specific names:** +Register the directory `/opt/kicad/packages3d`, name it `kicad-official-3d`, and assign the environment variable `KICAD_OFFICIAL_3D`. + +```bash +kilm add-3d --directory /opt/kicad/packages3d --name kicad-official-3d --env-var KICAD_OFFICIAL_3D --description "KiCad Official 3D Models" +``` + +**Add 3D library in current directory without an environment variable:** + +```bash +cd ~/my_project_3d_models +kilm add-3d --name my-project-models --no-env-var +``` + +**Note:** After adding 3D libraries, you usually need to run [`kilm setup`](/reference/cli/setup/) to create or update the associated environment variables (like `KICAD_OFFICIAL_3D` in the example) in KiCad's configuration. diff --git a/docs/src/content/docs/reference/cli/add-hook.md b/docs/src/content/docs/reference/cli/add-hook.md new file mode 100644 index 0000000..1959427 --- /dev/null +++ b/docs/src/content/docs/reference/cli/add-hook.md @@ -0,0 +1,113 @@ +--- +title: add-hook +description: Add a Git post-merge hook to automatically update libraries. +--- + +The `kilm add-hook` command creates or modifies a Git `post-merge` hook script in a specified repository. This hook is designed to automatically run `kilm update` after successful `git pull` or `git merge` operations. + +This helps keep your KiLM-managed libraries that are Git repositories synchronized with their remotes automatically. + +## Usage + +```bash +kilm add-hook [OPTIONS] +``` + +## Options + +- `--directory DIRECTORY`: + Specifies the path to the Git repository where the hook should be added. Defaults to the current directory. + _Example:_ `kilm add-hook --directory ~/my-kicad-libs-repo` + +- `--force / --no-force`: + If a `post-merge` hook already exists, overwrite it with the KiLM hook. Without `--force`, the command might fail if a hook already exists. + _Example:_ `kilm add-hook --force` + +- `--help`: + Show the help message and exit. + +## Behavior + +1. **Detects Active Hooks Directory:** + - Queries `git config core.hooksPath` for custom hooks directory + - Falls back to `.git/hooks` (standard location) + - Handles Git worktrees where hooks live in the linked location +2. **Checks Existing Hook:** Looks for an existing file named `post-merge`. +3. **Creates Safe Backup:** If a hook exists, creates a timestamped backup before modification. +4. **Intelligent Content Management:** + - If KiLM content already exists, updates the managed section + - If other content exists, merges KiLM content with clear markers + - Preserves existing user logic while adding KiLM functionality +5. **Writes Hook Script:** Creates or updates the hook file with content similar to this: + + ```bash + #!/bin/sh + # BEGIN KiLM-managed section + # KiCad Library Manager auto-update hook + # Added by kilm add-hook command + + echo "Running KiCad Library Manager update..." + kilm update + + # Uncomment to set up libraries automatically (use with caution) + # kilm setup + + echo "KiCad libraries update complete." + # END KiLM-managed section + ``` + +6. **Sets Permissions:** Ensures the hook has executable permissions (`chmod +x`). + +## Examples + +**Add hook to the current Git repository:** + +```bash +# Make sure you are in the root of your Git repository +kilm add-hook +``` + +**Add hook to a specific repository, overwriting if necessary:** + +```bash +kilm add-hook --directory /path/to/another/repo --force +``` + +## Advanced Features + +### Custom Hooks Directory + +If your repository uses `git config core.hooksPath` to specify a custom hooks directory, KiLM will automatically detect and use that location. + +### Git Worktree Support + +For repositories using Git worktrees, KiLM correctly identifies the main repository location and installs hooks in the appropriate hooks directory. + +### Safe Updates + +- **First Run:** Creates a new hook with KiLM content +- **Subsequent Runs:** Updates only the KiLM-managed section, preserving other customizations +- **Backup Protection:** Always creates timestamped backups before modifications +- **Idempotent:** Safe to run multiple times without duplicating content + +## Customization + +If you want the hook to do more, such as automatically running `kilm setup` after updating (which is potentially riskier as it modifies KiCad config automatically), you can manually edit the generated hook script. + +**Example (Manual Edit for Auto-Setup):** + +```bash +#!/bin/sh +# BEGIN KiLM-managed section +# KiCad Library Manager auto-update hook +# Added by kilm add-hook command + +echo "Running KiCad Library Manager update..." +kilm update + +# Uncomment to set up libraries automatically (use with caution) +kilm setup + +echo "KiCad libraries update complete." +# END KiLM-managed section +``` diff --git a/docs/src/content/docs/reference/cli/config.mdx b/docs/src/content/docs/reference/cli/config.mdx new file mode 100644 index 0000000..50d9197 --- /dev/null +++ b/docs/src/content/docs/reference/cli/config.mdx @@ -0,0 +1,166 @@ +--- +title: config +description: View and manage KiLM configuration settings and libraries. +--- + +import { Tabs, TabItem } from "@astrojs/starlight/components"; + +The `kilm config` command group allows you to inspect and manage the libraries registered in your KiLM configuration (`config.yaml`) and control settings like the default library. + +## Subcommands + + + + +Lists the configured libraries. + +#### Usage + +```bash +kilm config list [OPTIONS] +``` + +#### Options + +- `--type [github|cloud|all]`: + Filters the libraries shown by type. + - `github`: Shows symbol/footprint/template libraries. + - `cloud`: Shows 3D model libraries. + - `all`: Shows all types (default). + _Example:_ `kilm config list --type github` + +- `-v, --verbose`: + Displays more detailed information about each library, reading from both `config.yaml` and the library's metadata file (`kilm.yaml` or `.kilm_cloud_metadata`). Shows path, description, version, environment variable, capabilities/model count, etc. + _Example:_ `kilm config list --verbose` + +- `--help`: + Show the help message and exit. + +#### Examples + +**List all configured libraries (basic view):** + +```bash +kilm config list +``` + +**List only symbol/footprint libraries:** + +```bash +kilm config list --type github +``` + +**List all libraries with detailed information:** + +```bash +kilm config list --verbose +``` + +**List only 3D model libraries with details:** + +```bash +kilm config list --type cloud --verbose +``` + + + + +Sets a specific registered library as the default ("current") library used by KiLM. + +The `current_library` setting in `config.yaml` determines which library path is used by default in commands like `status` or `setup` (when not using `--all-libraries` or specific library flags). + +#### Usage + +```bash +kilm config set-default [LIBRARY_NAME] [OPTIONS] +``` + +#### Arguments + +- `LIBRARY_NAME`: The name (as shown in `kilm config list`) of the library to set as default. If omitted, you will be prompted to choose from a list. + +#### Options + +- `--type [github|cloud]`: + Specifies the type of library to choose from when prompting (if `LIBRARY_NAME` is omitted) or to disambiguate if names clash. Default: `github`. + _Example:_ `kilm config set-default --type cloud` (prompts for a cloud library) + +- `--help`: + Show the help message and exit. + +#### Examples + +**Set a specific GitHub library as default:** + +```bash +kilm config set-default my-company-library +``` + +**Set a specific Cloud (3D) library as default:** + +```bash +kilm config set-default shared-3d-models --type cloud +``` + +**Interactively select a GitHub library to be default:** + +```bash +kilm config set-default +``` + +**Interactively select a Cloud library to be default:** + +```bash +kilm config set-default --type cloud +``` + + + + +Removes a registered library from the KiLM configuration (`config.yaml`). This does _not_ delete the library files or its metadata file, only the entry in KiLM's central config. + +#### Usage + +```bash +kilm config remove LIBRARY_NAME [OPTIONS] +``` + +#### Arguments + +- `LIBRARY_NAME`: **Required.** The name (as shown in `kilm config list`) of the library to remove from the configuration. + +#### Options + +- `--type [github|cloud|all]`: + Specifies the type of the library entry to remove. If a name exists for both types, this is needed for disambiguation. `all` removes entries with this name regardless of type. Default: `all`. + _Example:_ `kilm config remove obsolete-lib --type github` + +- `--force`: + Remove the library entry without asking for confirmation. Default: `False` (confirmation required). + _Example:_ `kilm config remove old-project-lib --force` + +- `--help`: + Show the help message and exit. + +#### Examples + +**Remove a library (will ask for confirmation):** + +```bash +kilm config remove temp-test-library +``` + +**Remove only the GitHub entry for a library:** + +```bash +kilm config remove shared-lib --type github +``` + +**Force removal without confirmation:** + +```bash +kilm config remove unused-3d-models --type cloud --force +``` + + + diff --git a/docs/src/content/docs/reference/cli/index.md b/docs/src/content/docs/reference/cli/index.md new file mode 100644 index 0000000..dbf712c --- /dev/null +++ b/docs/src/content/docs/reference/cli/index.md @@ -0,0 +1,24 @@ +--- +title: Overview +description: An overview of the KiLM Command-Line Interface (CLI) commands. +--- + +KiLM (KiCad Library Manager) provides a set of commands to help you manage your KiCad libraries, configurations, templates, and environment variables. + +Each command focuses on a specific task. Below is a list of available commands. Click on a command name to view its detailed documentation, including usage, options, and examples. + +## Available Commands + +- [`init`](/reference/cli/init/): Initialize a directory as a KiLM-managed library collection. +- [`add-3d`](/reference/cli/add-3d/): Register a directory containing 3D models. +- [`config`](/reference/cli/config/): View and manage KiLM configuration settings and registered libraries. +- [`setup`](/reference/cli/setup/): Configure KiCad (library tables, environment variables) based on KiLM settings. +- [`pin`](/reference/cli/pin/): Add libraries to KiCad's pinned (favorite) list. +- [`unpin`](/reference/cli/unpin/): Remove libraries from KiCad's pinned list. +- [`template`](/reference/cli/template/): Create and manage KiCad project templates. +- [`list`](/reference/cli/list/): List symbol and footprint libraries found within a specified directory. +- [`status`](/reference/cli/status/): Check the current KiLM and KiCad configuration status. +- [`update`](/reference/cli/update/): Update Git-based libraries using `git pull`. +- [`add-hook`](/reference/cli/add-hook/): Add a Git post-merge hook to automatically run `kilm update`. + +Use the sidebar navigation or the links above to explore each command in detail. diff --git a/docs/src/content/docs/reference/cli/init.md b/docs/src/content/docs/reference/cli/init.md new file mode 100644 index 0000000..de7d32b --- /dev/null +++ b/docs/src/content/docs/reference/cli/init.md @@ -0,0 +1,87 @@ +--- +title: init +description: Initialize the current directory as a KiCad library collection. +--- + +The `kilm init` command prepares the **current working directory** to be managed by KiLM as a library collection, primarily intended for symbol, footprint, and template libraries (often managed via Git, hence the internal type `github`). + +It performs several actions: + +1. Creates standard subdirectories (`symbols/`, `footprints/`, `templates/`) if they don't exist. +2. Creates a template `library_descriptions.yaml` file if it doesn't exist, used for richer descriptions in KiCad. +3. Creates or updates a metadata file named `kilm.yaml` within the current directory. This stores the library's name, description, associated environment variable, and detected capabilities (symbols, footprints, templates). +4. Adds an entry for this library (with its path and type `github`) to the main KiLM configuration file (`~/.config/kicad-lib-manager/config.yaml`). +5. Optionally sets this library as the `current_library` in the main configuration. + +## Usage + +Run this command from _within_ the directory you want to initialize: + +```bash +cd /path/to/your-library +kilm init [OPTIONS] +``` + +## Options + +- `--name TEXT`: + Sets a custom name for the library collection. If not provided, a name is generated from the current directory name. + _Example:_ `kilm init --name my-custom-library` + +- `--description TEXT`: + Adds a description to the library metadata (`kilm.yaml`). + _Example:_ `kilm init --description "My collection of custom components"` + +- `--env-var TEXT`: + Specifies a custom KiCad environment variable name (e.g., `MY_CUSTOM_LIB`) to associate with this library's path. If not provided (and `--no-env-var` isn't used), a name is automatically generated (e.g., `KICAD_LIB_MY_CUSTOM_LIBRARY`). This variable will be set in KiCad when you run `kilm setup`. + _Example:_ `kilm init --env-var MY_LIB_PATH` + +- `--no-env-var`: + Prevents an environment variable from being assigned to this library in the metadata. Default: `False`. + _Example:_ `kilm init --no-env-var` + +- `--set-current / --no-set-current`: + Controls whether this library should be set as the `current_library` in the main `config.yaml`. Default: `--set-current`. + _Example:_ `kilm init --no-set-current` + +- `--force`: + If `kilm.yaml` already exists, overwrite it with new metadata based on options or defaults. Without `--force`, existing metadata is updated only with explicitly provided options. Default: `False`. + _Example:_ `kilm init --force` + +- `--help`: + Show the help message and exit. + +## Behavior Summary + +- **Target:** Current working directory. +- **Creates/Updates:** `symbols/`, `footprints/`, `templates/` dirs, `library_descriptions.yaml`, `kilm.yaml`. +- **Modifies Global Config:** Adds library entry to main `config.yaml`, optionally sets `current_library`. +- **Library Type:** Registers the library with type `github` in `config.yaml`. + +## Examples + +**Basic Initialization:** +Initialize the current directory, creating folders and metadata, using default names/env vars, and setting it as current. + +```bash +cd /path/to/my-kicad-library +kilm init +``` + +**Initialization with Options:** +Initialize with a specific name, description, and environment variable, and _don't_ set it as the current library. + +```bash +cd /path/to/another-kicad-library +kilm init --name project-specific --description "Components for Project X" --env-var PROJECT_X_LIBS --no-set-current +``` + +**Re-initialize with Force:** +Overwrite existing `kilm.yaml` with default settings. + +```bash +cd /path/to/existing-library +kilm init --force +``` + +**Note:** Running `kilm init` registers the library with KiLM and prepares the directory. You still need to run [`kilm setup`](/reference/cli/setup/) afterwards to make KiCad aware of this library by updating KiCad's configuration files. diff --git a/docs/src/content/docs/reference/cli/list.md b/docs/src/content/docs/reference/cli/list.md new file mode 100644 index 0000000..31b4ca8 --- /dev/null +++ b/docs/src/content/docs/reference/cli/list.md @@ -0,0 +1,64 @@ +--- +title: list +description: List symbol and footprint libraries found within a directory. +--- + +The `kilm list` command scans a specified directory (typically your main KiCad library directory) and lists the symbol (`.kicad_sym`) and footprint (`.pretty`) libraries it finds within it. + +This is useful for verifying the contents of a specific library directory, independent of KiLM's own configuration. + +## Usage + +```bash +kilm list [OPTIONS] +``` + +## Options + +- `--kicad-lib-dir TEXT`: + Specify the path to the KiCad library directory you want to scan. + If not provided, KiLM will look for the `KICAD_USER_LIB` environment variable and use its value. + _Default:_ Uses `KICAD_USER_LIB` environment variable. + _Example:_ `kilm list --kicad-lib-dir /path/to/my/libraries` + +- `--help`: + Show this help message and exit. + +## Behavior + +1. **Determines Target Directory:** Uses the path provided via `--kicad-lib-dir` or falls back to the `KICAD_USER_LIB` environment variable. +2. **Scans Directory:** Recursively scans the target directory. +3. **Identifies Libraries:** + - Looks for files ending in `.kicad_sym` to identify symbol libraries. + - Looks for directories ending in `.pretty` to identify footprint libraries. +4. **Prints Lists:** Outputs separate lists of the symbol and footprint library names found. + +## Examples + +**List Libraries in Default Directory:** +Scans the directory specified by the `KICAD_USER_LIB` environment variable. + +```bash +kilm list +``` + +_Expected Output (example):_ + +``` +Available Symbol Libraries: + - 74xx + - Connector + - Device + +Available Footprint Libraries: + - Capacitor_SMD + - Connector_PinHeader_2.54mm + - Resistor_SMD +``` + +**List Libraries in a Specific Directory:** +Scans the specified directory `/home/user/my-kicad-libs`. + +```bash +kilm list --kicad-lib-dir /home/user/my-kicad-libs +``` diff --git a/docs/src/content/docs/reference/cli/pin.md b/docs/src/content/docs/reference/cli/pin.md new file mode 100644 index 0000000..b544438 --- /dev/null +++ b/docs/src/content/docs/reference/cli/pin.md @@ -0,0 +1,100 @@ +--- +title: pin +description: Add libraries to KiCad's pinned (favorite) list. +--- + +The `kilm pin` command adds specified symbol and/or footprint libraries to KiCad's "Pinned Libraries" list, making them easily accessible in the symbol and footprint choosers. + +It operates by modifying the `pinned_symbol_libs` and `pinned_fp_libs` arrays within KiCad's `kicad_common.json` configuration file. + +**Note:** Changes require restarting KiCad. + +## Usage + +```bash +kilm pin [OPTIONS] +``` + +## Options + +- `--kicad-lib-dir TEXT`: + Specify the path to the KiCad library directory containing the libraries you want to pin. + If not provided, KiLM will look for the `KICAD_USER_LIB` environment variable. + This directory is scanned to find available libraries if `--all` is used or to validate specified library names. + _Default:_ Uses `KICAD_USER_LIB` environment variable. + _Example:_ `kilm pin --kicad-lib-dir /path/to/libs -s MyLib` + +- `-s, --symbols TEXT`: + Specify the name of a symbol library (`.kicad_sym` file, without extension) to pin. Use this option multiple times to pin several libraries. + _Example:_ `kilm pin -s Device -s MyCustomSymbols` + +- `-f, --footprints TEXT`: + Specify the name of a footprint library (`.pretty` directory, without extension) to pin. Use this option multiple times to pin several libraries. + _Example:_ `kilm pin -f Package_SO -f MyCustomFootprints` + +- `--all / --selected`: + Determines which libraries to pin. + - `--all` (Default): Pins _all_ symbol and footprint libraries found within the directory specified by `--kicad-lib-dir`. Cannot be used if `-s` or `-f` are specified. + - `--selected`: Pins only the libraries explicitly listed using `-s` or `-f`. This is implicitly active when `-s` or `-f` are used. + _Example (pin all):_ `kilm pin --all` + +- `--dry-run`: + Show which libraries would be added to the pinned list without actually modifying `kicad_common.json`. + _Example:_ `kilm pin --all --dry-run` + +- `--max-backups INTEGER`: + Maximum number of timestamped backups KiLM should keep for `kicad_common.json`. Default: `5`. + _Example:_ `kilm pin --max-backups 3` + +- `-v, --verbose`: + Show detailed output during the pinning process, including listing libraries found and pinned. + _Example:_ `kilm pin -s MyLib --verbose` + +- `--help`: + Show this help message and exit. + +## Behavior + +1. Locates the KiCad configuration directory and `kicad_common.json`. +2. Determines the target library directory using `--kicad-lib-dir` or `KICAD_USER_LIB`. +3. If `--all` is active (default and no `-s`/`-f`), lists all symbol/footprint libraries in the target directory. +4. If specific libraries are provided via `-s`/`-f`, validates they exist in the target directory (issues a warning if not found). +5. Creates a backup of `kicad_common.json` (unless `--dry-run`). +6. Reads the current pinned lists from `kicad_common.json`. +7. Adds the names of the determined libraries (all or selected) to the respective lists. +8. Writes the updated lists back to `kicad_common.json` (unless `--dry-run`). + +## Examples + +**Pin specific libraries:** + +```bash +kilm pin -s MySymbolLib -s AnotherLib -f MyFootprintLib +``` + +**Pin all libraries found in the default directory:** +(Assumes `KICAD_USER_LIB` is set) + +```bash +kilm pin --all +# Or simply: +kilm pin +``` + +**Pin all libraries in a specific directory:** + +```bash +kilm pin --kicad-lib-dir /path/to/company/libs --all +``` + +**Preview pinning all libraries:** + +```bash +kilm pin --all --dry-run +``` + +**Pin specific libraries with verbose output:** + +```bash +kilm pin -s Device -f Resistor_SMD -v +``` diff --git a/docs/src/content/docs/reference/cli/setup.md b/docs/src/content/docs/reference/cli/setup.md new file mode 100644 index 0000000..802f849 --- /dev/null +++ b/docs/src/content/docs/reference/cli/setup.md @@ -0,0 +1,124 @@ +--- +title: setup +description: Configure KiCad to use the registered libraries. +--- + +The `kilm setup` command reads your KiLM configuration and modifies KiCad's configuration files to reflect the registered libraries and environment variables. + +It performs the following main actions: + +1. Finds KiCad configuration files (`sym-lib-table`, `fp-lib-table`, `kicad_common.json`). +2. Creates timestamped backups of these files (number controlled by `--max-backups`). +3. Determines which libraries (symbol/footprint and 3D) to configure based on options. +4. Reads library metadata (if available) to find associated environment variable names (e.g., `KICAD_USER_LIB`). +5. Updates KiCad's environment variables (`kicad_common.json`). +6. Updates KiCad's symbol and footprint library tables (`sym-lib-table`, `fp-lib-table`). +7. Optionally updates KiCad's pinned libraries list (`kicad_common.json`) via `--pin-libraries`. +8. Attempts to fix known invalid URI formats in library tables. + +**Important:** You usually need to restart KiCad after running `kilm setup` for all changes to take effect. + +## Usage + +```bash +kilm setup [OPTIONS] +``` + +## Options + +- `--kicad-lib-dir TEXT`: + Directly specify the path for the primary symbol/footprint library directory. This path might be used to set a default environment variable like `KICAD_USER_LIB` if not otherwise specified by library metadata. Overrides environment variables (`KICAD_USER_LIB`). + _Example:_ `kilm setup --kicad-lib-dir /path/to/my/symbols` + +- `--kicad-3d-dir TEXT`: + Directly specify the path for the primary 3D models directory. This path might be used to set a default environment variable like `KICAD_3D_LIB`. Overrides environment variables (`KICAD_3D_LIB`). + _Example:_ `kilm setup --kicad-3d-dir /path/to/my/3dmodels` + +- `--symbol-lib-dirs TEXT`: + Specify a comma-separated list of library _names_ (as defined in KiLM config) to set up. Only these specific symbol/footprint libraries will be configured. This takes precedence over the default behavior and `--all-libraries`. + _Example:_ `kilm setup --symbol-lib-dirs "main-lib,project-lib"` + +- `--threed-lib-dirs TEXT`: + Specify a comma-separated list of 3D library _names_ (as defined in KiLM config) to set up. Only the environment variables for these specific 3D libraries will be configured. This takes precedence over the default behavior and `--all-libraries`. + _Example:_ `kilm setup --threed-lib-dirs "my-3d-models,official-3d"` + +- `--all-libraries`: + Configure _all_ libraries (both symbol/footprint and 3D) registered in KiLM's `config.yaml`. Without this flag, only the _current_ symbol/footprint library and the _current_ 3D library (as defined in `config.yaml` or derived) are configured by default. + _Example:_ `kilm setup --all-libraries` + +- `--max-backups INTEGER`: + Maximum number of timestamped backups KiLM should keep for each KiCad configuration file it modifies. Default: `5`. + _Example:_ `kilm setup --max-backups 10` + +- `--pin-libraries / --no-pin-libraries`: + Default: `--pin-libraries`. + Controls whether the configured libraries should be added to KiCad's "Pinned Libraries" list for quick access in the managers. + _Example:_ `kilm setup --no-pin-libraries` + +- `--dry-run`: + Show the changes KiLM would make to KiCad's configuration files without actually modifying them. Output is printed to the terminal. + _Example:_ `kilm setup --dry-run` + +- `-v, --verbose`: + Show detailed output during the setup process, useful for debugging. + _Example:_ `kilm setup --verbose` + +- `--help`: + Show this help message and exit. + +## Behavior Details + +- **Library Selection:** By default (without `--all-libraries`), `setup` configures only the _current_ symbol/footprint library and the _current_ 3D model library registered in KiLM. Use `--all-libraries` to configure all registered libraries, or `--symbol-lib-dirs` / `--threed-lib-dirs` to configure specific named libraries. +- **Environment Variables:** KiLM attempts to read metadata (e.g., `kilm.yaml` or `.kilm_cloud_metadata`) to find the correct environment variable name (like `KICAD_COMPANY_LIB`) associated with each library path. If specific `--kicad-lib-dir` or `--kicad-3d-dir` options are given, they might influence default variables like `KICAD_USER_LIB` or `KICAD_3D_LIB`. +- **Backups:** Backups are crucial for recovery if KiCad's configuration gets corrupted. They are stored in the same directory as the KiCad configuration files and are named with a timestamp. + +## Examples + +**Setup Current Libraries (Default):** +Configure only the current symbol/footprint library and current 3D library. + +```bash +kilm setup +``` + +**Setup All Registered Libraries:** +Configure all libraries defined in `config.yaml`. + +```bash +kilm setup --all-libraries +``` + +**Setup Specific Libraries:** +Only configure the symbol/footprint libraries named `main-lib` and `project-lib`, and the 3D library named `my-3d-models`. + +```bash +kilm setup --symbol-lib-dirs "main-lib,project-lib" --threed-lib-dirs "my-3d-models" +``` + +**Setup with Specific Paths and No Pinning:** +Use specific paths for default libs (this might not be relevant if not configuring the default libs) and disable adding them to pinned libraries. + +```bash +kilm setup --kicad-lib-dir /srv/kicad/symbols --kicad-3d-dir /srv/kicad/3d --no-pin-libraries +``` + +**Preview Changes (Default - Current Libs):** +See what changes `kilm setup` would make for the current libraries without applying them. + +```bash +kilm setup --dry-run +``` + +**Preview Changes (All Libs):** +See what changes `kilm setup` would make for all libraries without applying them. + +```bash +kilm setup --all-libraries --dry-run +``` + +**Verbose Dry Run (Current Libs):** +Get detailed output about the planned changes for current libraries. + +```bash +kilm setup --dry-run --verbose +``` diff --git a/docs/src/content/docs/reference/cli/status.md b/docs/src/content/docs/reference/cli/status.md new file mode 100644 index 0000000..4552526 --- /dev/null +++ b/docs/src/content/docs/reference/cli/status.md @@ -0,0 +1,80 @@ +--- +title: status +description: Check the current KiLM and KiCad configuration status. +--- + +The `kilm status` command provides a summary of the current KiLM setup and relevant KiCad configurations. + +## Usage + +```bash +kilm status [OPTIONS] +``` + +## Options + +- `--help`: + Show the help message and exit. + +## Behavior + +The command gathers and displays information about: + +- **KiLM Configuration:** Details from `config.yaml`, such as registered library names and potentially paths. +- **KiCad Configuration Directory:** The location KiLM detected for KiCad's configuration files. +- **KiCad Environment Variables:** Lists the environment variables currently set within KiCad's `kicad_common.json` file. +- **KiCad Pinned Libraries:** Shows the symbol and footprint libraries currently marked as favorites (pinned) in `kicad_common.json`. +- **KiCad Configured Libraries:** Lists the symbol and footprint libraries currently present in KiCad's `sym-lib-table` and `fp-lib-table`. + +## Example + +```bash +kilm status +``` + +_Expected Output (example structure):_ + +```text +KILM Configuration: + Configured Libraries: + GitHub Libraries (symbols/footprints): + - main-lib: /path/to/main-lib (current) + Metadata: Yes + - project-lib: /path/to/project-lib + Metadata: Yes + Cloud Libraries (3D models): + - shared-3d: /path/to/shared-3d (current) + Metadata: Yes + - kicad-official-3d: /path/to/kicad-official-3d + Current Library: /path/to/main-lib + Max Backups: 5 + +--- KiCad Configuration --- +KiCad configuration directory: /home/user/.config/kicad/7.0/ + +Environment Variables in KiCad: + KICAD_USER_LIB = /path/to/main-lib + PROJECT_LIB = /path/to/project-lib + SHARED_3D = /path/to/shared-3d + KICAD7_3DMODEL_DIR = /path/to/kicad-official-3d + +Pinned Libraries in KiCad: + Symbol Libraries: + - Device + - main-lib + Footprint Libraries: + - Package_SO + - main-lib + +Configured Symbol Libraries: + - Device: ${KICAD7_SYMBOL_DIR}/Device.kicad_sym + - main-lib: ${KICAD_USER_LIB}/main-lib.kicad_sym + - project-lib: ${PROJECT_LIB}/project-lib.kicad_sym + +Configured Footprint Libraries: + - Capacitor_SMD: ${KICAD7_FOOTPRINT_DIR}/Capacitor_SMD.pretty + - main-lib: ${KICAD_USER_LIB}/main-lib.pretty + - project-lib: ${PROJECT_LIB}/project-lib.pretty +``` + +This command is useful for verifying that your `kilm setup` commands have applied correctly and for understanding the current state recognised by both KiLM and KiCad. diff --git a/docs/src/content/docs/reference/cli/template.mdx b/docs/src/content/docs/reference/cli/template.mdx new file mode 100644 index 0000000..0f6d314 --- /dev/null +++ b/docs/src/content/docs/reference/cli/template.mdx @@ -0,0 +1,291 @@ +--- +title: template +description: Manage KiCad project templates. +--- + +import { Tabs, TabItem } from "@astrojs/starlight/components"; + +The `kilm template` command group provides tools for creating, managing, and using KiCad project templates. Templates allow you to standardize the starting structure for new projects. + +Templates are stored within a `templates` directory inside a KiLM-managed library. + +## Subcommands + + + + +Creates a new project template from an existing KiCad project directory. + +#### Usage + +```bash +kilm template make [project_path] [OPTIONS] +``` + +- ``: **Required.** The name for the new template. +- `[project_path]`: The path to the KiCad project directory to use as the source. Defaults to the current directory. + +#### Options + +- `--description TEXT`: A description for the template. +- `--use-case TEXT`: Describe the intended use case for this template. +- `--variable TEXT`: Define a variable for the template (key=value pair). Can be used multiple times. These variables can be used within template filenames using `%{variable}` syntax and within file content using Jinja2 `{{variable}}` syntax. +- `--exclude TEXT`: Glob pattern (like `.gitignore`) to exclude specific files or directories from the template. Can be used multiple times. +- `--output-directory DIRECTORY`: + Specifies the directory where the `templates/` structure will be created. Defaults to the `templates` directory within the KiLM library containing the current working directory. + _Example:_ `kilm template make my-tmpl --output-directory /path/to/central/templates/dir` +- `--non-interactive`: + Create the template without interactive prompts for configuration or variable detection. Default: `False` (interactive). +- `--dry-run`: + Preview template creation without actually creating files. +- `--force`: + Overwrite the template directory if it already exists. Default: `False`. +- `--help`: Show help message. + +#### Behavior + +1. **Scans Project:** Analyzes the source project directory. +2. **Determines Output:** Finds the target `templates/` directory (either default or via `--output-directory`). +3. **Creates Template Structure:** Creates `templates//`. +4. **Copies Files:** Copies project files into `templates//template/`, respecting `.gitignore` and `--exclude` patterns. +5. **Filename Templating:** Renames files using Windows-compatible syntax based on detected project names and provided/detected variables (e.g., `MyProject.kicad_pro` becomes `%{project_filename}.kicad_pro.jinja2`). +6. **Creates `metadata.yaml`:** Generates a `metadata.yaml` file containing the template name, description, use case, detected/defined variables, and exclusions. +7. **(Optional) Creates Hooks:** Can set up pre/post-creation hook scripts (e.g., `hooks/post_create.py`). + +#### Examples + +**Create template 'basic-mcu' from current directory (interactive):** + +```bash +cd /path/to/my-base-project +kilm template make basic-mcu +``` + +**Create template from specific path with variables, excluding backups:** + +```bash +kilm template make advanced-fpga path/to/fpga-project \ + --description "Advanced FPGA project setup" \ + --variable "board_rev=1.2" \ + --variable "default_author=Jane Doe" \ + --exclude "*.bak" \ + --exclude "build/" +``` + + + + +Creates a new KiCad project based on an existing template. + +#### Usage + +```bash +kilm template create [output_path] [OPTIONS] +``` + +- ``: **Required.** The name for the new KiCad project. If this contains path separators (e.g., `path/to/MyNewBoard`), the last component is used as the project name, and the preceding path is used as the default `output_path`. +- `[output_path]`: The directory where the new project will be created. If omitted, defaults to a directory named `` in the current location, or the path derived from ``. + +#### Options + +- `--template TEXT`: The name of the template to use. If not specified, KiLM will list available templates and prompt for selection. +- `--set-var TEXT`: Set a value for a template variable (key=value). Can be used multiple times. Overrides default values from `metadata.yaml`. +- `--library TEXT`: Specify the KiLM library containing the template (needed if multiple libraries have templates with the same name). +- `--skip-hooks`: Do not run any post-creation hook scripts defined in the template. Default: `False` (hooks run). +- `--dry-run`: Preview project creation without creating files. +- `--help`: Show help message. + +#### Behavior + +1. **Finds Template:** Locates the specified (or selected) template within the configured KiLM libraries. +2. **Reads Metadata:** Loads `metadata.yaml` to get variables and configuration. +3. **Determines Variables:** + - Combines default variables from `metadata.yaml` with any values provided via `--set-var`. + - **Interactively prompts** for any remaining variables sequentially. + - **Crucially:** When prompting for a variable, its default value is calculated _just-in-time_ using the values of variables already entered in the current session. This allows defaults to depend on previous inputs (e.g., the default `directory_name` can be based on the entered `project_name`). +4. **Copies and Renders:** Copies files from the template's `template/` directory to the output path. +5. **Processes Templates:** + - Renders filenames using Windows-compatible `%{variable}` syntax (with fallback support for legacy `{{variable}}` syntax) + - Renders file content using Jinja2 `{{variable}}` syntax for `.jinja2` files +6. **(Optional) Runs Hooks:** Executes the `hooks/post_create.py` script if it exists and `--skip-hooks` was not used. + +#### Examples + +**Create project 'MyNewBoard' using 'basic-mcu' template (will prompt for template selection if ambiguous):** + +```bash +kilm template create MyNewBoard +``` + +**Create project in specific dir, specifying template, setting variables:** + +```bash +kilm template create SensorModule projects/sensor --template advanced-fpga \ + --set-var board_rev=2.0 \ + --set-var default_author="My Name" +``` + +**Create project using a path:** + +```bash +# Creates project 'MyBoard' inside './new_projects/' +kilm template create new_projects/MyBoard --template basic-mcu +``` + + + + +Lists available project templates found in the configured KiLM libraries. + +#### Usage + +```bash +kilm template list [OPTIONS] +``` + +#### Options + +- `--library TEXT`: List templates only from the specified KiLM library name. +- `-v, --verbose`: Show detailed information, including template description, use case, and variables. +- `--json`: Output the list in JSON format. +- `--help`: Show help message. + +#### Examples + +**List all available templates:** + +```bash +kilm template list +``` + +**List templates with details:** + +```bash +kilm template list --verbose +``` + +**List templates from 'my-main-lib' in JSON:** + +```bash +kilm template list --library my-main-lib --json +``` + + + + +## Template Structure + +Templates reside within a `templates` directory inside a library initialized with `kilm init`: + +```plaintext +your-kilm-library/ +├── kilm.yaml +├── symbols/ +├── footprints/ +└── templates/ + └── template-name/ + ├── metadata.yaml # Template config (name, desc, vars) + ├── hooks/ + │ └── post_create.py # Optional post-creation script + └── template/ # Files to be copied and rendered + ├── %{project_filename}.kicad_pro.jinja2 + ├── %{project_filename}.kicad_sch.jinja2 + ├── %{project_filename}.kicad_pcb.jinja2 + ├── README.md.jinja2 + └── assets/ + └── logo-%{company_name|lower}.png.jinja2 +``` + +- **`metadata.yaml`**: Defines template variables and descriptions. +- **`hooks/`**: Contains optional Python scripts to run after project creation. +- **`template/`**: Holds the project files. + - Files ending in `.jinja2` will have their content processed by Jinja2. + - **Filenames containing `%{...}` will be renamed based on variable values during project creation** (Windows-compatible syntax). + - **Legacy support**: Filenames with `{{ ... }}` are still supported but may cause issues on Windows. + - The special variable `%{project_filename}` is automatically derived from the project name provided to `kilm template create` and should be used for the main KiCad project files (`.kicad_pro`, `.kicad_sch`, `.kicad_pcb`). + +### Filename Templating Syntax + +KiLM supports a Windows-compatible filename templating syntax using `%{variable}` instead of `{{variable}}`: + +**Basic usage:** + +- `%{project_name}.kicad_pro` → `MyProject.kicad_pro` +- `%{author}.md` → `JohnDoe.md` + +**With transformations:** + +- `%{project_name.lower}` → converts to lowercase +- `%{project_name.upper}` → converts to uppercase +- `%{project_name.replace(' ', '-')}` → replaces spaces with dashes +- `%{project_name.replace(' ', '_').lower}` → chain transformations + +**Examples:** + +- `%{project_name.lower}.kicad_sch` → `myproject.kicad_sch` +- `%{project_name.replace(' ', '-')}.kicad_pcb` → `my-project.kicad_pcb` +- `%{author.upper.replace(' ', '_')}.md` → `JOHN_DOE.md` + +:::note[Windows Compatibility] +The new `%{variable}` syntax is recommended for cross-platform compatibility. The old `{{variable}}` syntax still works but may cause filename issues on Windows systems due to character restrictions. +::: + +### Example: `metadata.yaml` + +This file defines the template's properties and the variables users will be prompted for. + +```yaml +description: "Standard 4-layer PCB projects" +name: default-4layer +use_case: "Standard 4-layer PCB projects" +variables: + project_name: + description: Main KiCad project name (with spaces, e.g., Power Supply) + subproject_name: + description: Subproject/Module name (with spaces, e.g., Controller Board) + directory_name_prefix: + default: Hardware + description: Top-level directory name (e.g., Hardware or Hardware_ProjectX) + directory_name: + default: "%{directory_name_prefix}_%{project_name.replace(' ', '')}_%{subproject_name.replace(' ', '')}" + description: Full directory name (e.g., Hardware_PowerSupply_ControllerBoard) + author: + default: YourCompanyName + description: Author/Company name (used in documentation and KiCad files) + author_position: + description: Author position (e.g., Hardware Engineer) + version: + default: V0.1 + description: Initial version number (e.g., V0.1) +version: 1.0.0 # Template version, distinct from project version variable +``` + +### Example: Using Variables in a Template File (`README.md.jinja2`) + +Template files within the `template/` directory can use Jinja2 syntax (`{{ variable_name }}`) to insert values provided by the user during `kilm template create`. + +```markdown +# {{ project_name }} {{ subproject_name }} + +## Overview + +This repository contains the PCB design files for the {{ project_name }} {{ subproject_name }} project. + +Created by: {{ author }} ({{ author_position }}) +Version: {{ version }} + +## Libraries and Footprints (KiLM) + +This project template relies on **KiLM** for managing common, shared KiCad libraries... + +[... rest of README content ...] +``` + +:::tip[Syntax Differences] + +- **File content** (inside `.jinja2` files): Use Jinja2 syntax `{{ variable_name }}` +- **Filenames**: Use Windows-compatible syntax `%{variable_name}` for new templates +- **Legacy filenames**: Old `{{ variable_name }}` syntax in filenames still works but may cause issues on Windows + ::: + +When a user runs `kilm template create MyProject Controller --template default-4layer` and provides values for `author`, `author_position`, and `version`, the resulting `README.md` in their new project directory will have the `{{ ... }}` placeholders replaced with the actual values. diff --git a/docs/src/content/docs/reference/cli/unpin.md b/docs/src/content/docs/reference/cli/unpin.md new file mode 100644 index 0000000..53cc9ae --- /dev/null +++ b/docs/src/content/docs/reference/cli/unpin.md @@ -0,0 +1,82 @@ +--- +title: unpin +description: Remove libraries from KiCad's pinned (favorite) list. +--- + +The `kilm unpin` command removes specified symbol and/or footprint libraries from KiCad's "Pinned Libraries" list. + +It operates by modifying the `pinned_symbol_libs` and `pinned_fp_libs` arrays within KiCad's `kicad_common.json` configuration file. + +**Note:** Changes require restarting KiCad. + +## Usage + +```bash +kilm unpin [OPTIONS] +``` + +## Options + +- `-s, --symbols TEXT`: + Specify the name of a symbol library currently in the pinned list to remove. Use this option multiple times to unpin several libraries. + _Example:_ `kilm unpin -s Device -s MyCustomSymbols` + +- `-f, --footprints TEXT`: + Specify the name of a footprint library currently in the pinned list to remove. Use this option multiple times to unpin several libraries. + _Example:_ `kilm unpin -f Package_SO -f MyCustomFootprints` + +- `--all`: + Unpin _all_ currently pinned symbol and footprint libraries. Cannot be used if `-s` or `-f` are specified. + _Example:_ `kilm unpin --all` + +- `--dry-run`: + Show which libraries would be removed from the pinned list without actually modifying `kicad_common.json`. + _Example:_ `kilm unpin --all --dry-run` + +- `--max-backups INTEGER`: + Maximum number of timestamped backups KiLM should keep for `kicad_common.json`. Default: `5`. + _Example:_ `kilm unpin --max-backups 3` + +- `-v, --verbose`: + Show detailed output during the unpinning process. + _Example:_ `kilm unpin -s MyLib --verbose` + +- `--help`: + Show this help message and exit. + +## Behavior + +1. Locates the KiCad configuration directory and `kicad_common.json`. +2. Creates a backup of `kicad_common.json` (unless `--dry-run`). +3. Reads the current pinned lists (`pinned_symbol_libs`, `pinned_fp_libs`) from `kicad_common.json`. +4. Determines the target libraries: + - If `--all`, targets all libraries found in the lists. + - Otherwise, targets libraries specified via `-s` and `-f`. +5. Removes the target library names from the respective lists. +6. Writes the updated lists back to `kicad_common.json` (unless `--dry-run`). + +## Examples + +**Unpin specific libraries:** + +```bash +kilm unpin -s ObsoleteSymLib -f OldFootprintLib +``` + +**Unpin all libraries:** + +```bash +kilm unpin --all +``` + +**Preview unpinning specific libraries:** + +```bash +kilm unpin -s Device -f Package_SO --dry-run +``` + +**Unpin all libraries with verbose output:** + +```bash +kilm unpin --all -v +``` diff --git a/docs/src/content/docs/reference/cli/update.md b/docs/src/content/docs/reference/cli/update.md new file mode 100644 index 0000000..25a1c23 --- /dev/null +++ b/docs/src/content/docs/reference/cli/update.md @@ -0,0 +1,68 @@ +--- +title: update +description: Update configured Git-based libraries using `git pull`. +--- + +The `kilm update` command attempts to update all configured symbol, footprint, and template libraries (type `github`) that are identified as Git repositories by running `git pull` within their directories. + +This command helps keep your local copies of shared libraries synchronized with their remote Git repositories. + +## Usage + +```bash +kilm update [OPTIONS] +``` + +## Options + +- `--dry-run`: + Show which libraries are detected as Git repositories and would be updated, but do not actually run `git pull`. + _Example:_ `kilm update --dry-run` + +- `--verbose`: + Show detailed output during the update process, including the full output from the `git pull` commands. + _Example:_ `kilm update --verbose` + +- `--auto-setup`: + If the `git pull` operation results in changes that likely require updating KiCad's configuration (e.g., new symbol or footprint libraries detected), automatically run `kilm setup` after the updates are complete. Default: `False`. + _Example:_ `kilm update --auto-setup` + +- `--help`: + Show the help message and exit. + +## Behavior + +1. **Reads KiLM Config:** Loads library information from `config.yaml`. +2. **Identifies `github` Libraries:** Filters for libraries with type `github`. +3. **Checks for `.git`:** For each library path, checks if it exists and contains a `.git` directory. +4. **Runs `git pull`:** If it's a valid Git repository, navigates into the directory and executes `git pull` (unless `--dry-run`). +5. **Checks for Changes:** After a successful pull, analyzes the output and file system to detect if new symbol libraries (`.kicad_sym`), footprint libraries (`.pretty`), or templates (`templates/*/metadata.yaml`) were added. +6. **Reports & Optional Setup:** Summarizes the update results. If changes requiring configuration updates were detected, it recommends running `kilm setup` or runs it automatically if `--auto-setup` was specified. + +## Examples + +**Update all Git-based libraries:** + +```bash +kilm update +``` + +**Preview which libraries would be updated:** + +```bash +kilm update --dry-run +``` + +**Update libraries with detailed output:** + +```bash +kilm update --verbose +``` + +**Update libraries and automatically run setup if needed:** + +```bash +kilm update --auto-setup +``` + +**Note:** If `git pull` fails (e.g., due to local changes or merge conflicts), you will need to resolve the issues manually within the affected repository directory using standard Git commands before `kilm update` can succeed for that library. diff --git a/docs/src/env.d.ts b/docs/src/env.d.ts new file mode 100644 index 0000000..89d1951 --- /dev/null +++ b/docs/src/env.d.ts @@ -0,0 +1,9 @@ +/// +/// + +declare namespace JSX { + interface IntrinsicElements { + // Allow any JSX element + [name: string]: any; + } +} diff --git a/docs/src/styles/global.css b/docs/src/styles/global.css new file mode 100644 index 0000000..f088ada --- /dev/null +++ b/docs/src/styles/global.css @@ -0,0 +1,108 @@ +@layer base, starlight, theme, components, utilities; + +@import "@astrojs/starlight-tailwind"; +@import "tailwindcss/theme.css" layer(theme); +@import "tailwindcss/utilities.css" layer(utilities); + +@theme { + /* Your preferred text font. Starlight uses a system font stack by default. */ + --font-sans: "Atkinson Hyperlegible"; + /* Your preferred code font. Starlight uses system monospace fonts by default. */ + --font-mono: "IBM Plex Mono"; + /* Generated accent color palettes. */ + --color-accent-200: #ddc884; + --color-accent-600: #816900; + --color-accent-900: #3e3100; + --color-accent-950: #2d2300; + /* Generated gray color palettes - darker variants */ + --color-gray-100: #e8eaed; + --color-gray-200: #d4d7dc; + --color-gray-300: #9ca3af; + --color-gray-400: #6b7280; + --color-gray-500: #4b5563; + --color-gray-600: #374151; + --color-gray-700: #1f2937; + --color-gray-800: #111827; + --color-gray-900: #0f172a; + --color-gray-950: #020617; + + /* Dark mode Starlight theme variables - using darker grays */ + --sl-color-accent-low: var(--color-accent-950); + --sl-color-accent: var(--color-accent-600); + --sl-color-accent-high: var(--color-accent-200); + --sl-color-white: #ffffff; + --sl-color-gray-1: var(--color-gray-100); + --sl-color-gray-2: var(--color-gray-200); + --sl-color-gray-3: var(--color-gray-300); + --sl-color-gray-4: var(--color-gray-400); + --sl-color-gray-5: var(--color-gray-500); + --sl-color-gray-6: var(--color-gray-600); + --sl-color-black: var(--color-gray-950); + + /* Light mode Starlight theme variables */ + --sl-color-accent-low-light: var(--color-accent-200); + --sl-color-accent-light: var(--color-accent-600); + --sl-color-accent-high-light: var(--color-accent-900); + --sl-color-white-light: var(--color-gray-900); + --sl-color-gray-1-light: var(--color-gray-800); + --sl-color-gray-2-light: var(--color-gray-700); + --sl-color-gray-3-light: var(--color-gray-500); + --sl-color-gray-4-light: var(--color-gray-400); + --sl-color-gray-5-light: var(--color-gray-300); + --sl-color-gray-6-light: var(--color-gray-200); + --sl-color-gray-7-light: var(--color-gray-100); + --sl-color-black-light: #ffffff; + + /* Custom darker background colors */ + --custom-bg-primary: #0a0e1a; + --custom-bg-secondary: #0f1419; + --custom-bg-tertiary: #151b26; +} + +/* Custom animations for gradients */ +@layer utilities { + @keyframes gradient { + 0% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } + 100% { + background-position: 0% 50%; + } + } + + .animate-gradient { + animation: gradient 15s ease infinite; + } +} + +body { + @apply bg-gray-100 dark:bg-[var(--custom-bg-primary)]; +} + +.header { + @apply bg-gray-100 dark:bg-[var(--custom-bg-secondary)]; +} + +.sidebar-content { + @apply bg-gray-100 dark:bg-[var(--custom-bg-tertiary)]; +} + +/* Additional dark theme enhancements */ +:root[data-theme="dark"] { + --sl-color-bg: var(--custom-bg-primary); + --sl-color-bg-nav: var(--custom-bg-secondary); + --sl-color-bg-sidebar: var(--custom-bg-tertiary); +} + +/* Content area dark background */ +main { + @apply dark:bg-[var(--custom-bg-primary)]; +} + +/* Article content dark background */ +article { + @apply dark:bg-[var(--custom-bg-primary)]; +} diff --git a/docs/tsconfig.json b/docs/tsconfig.json new file mode 100644 index 0000000..8bf91d3 --- /dev/null +++ b/docs/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "astro/tsconfigs/strict", + "include": [".astro/types.d.ts", "**/*"], + "exclude": ["dist"] +} diff --git a/kicad_lib_manager/commands/add_hook.py b/kicad_lib_manager/commands/add_hook.py index eec72af..685c674 100644 --- a/kicad_lib_manager/commands/add_hook.py +++ b/kicad_lib_manager/commands/add_hook.py @@ -7,6 +7,13 @@ import click +from ..utils.git_utils import ( + backup_existing_hook, + create_kilm_hook_content, + get_git_hooks_directory, + merge_hook_content, +) + @click.command() @click.option( @@ -37,44 +44,52 @@ def add_hook(directory, force): click.echo(f"Adding Git hook to repository: {target_dir}") - # Check if this is a git repository - git_dir = target_dir / ".git" - if not git_dir.exists() or not git_dir.is_dir(): - click.echo(f"Error: {target_dir} is not a git repository", err=True) - return + try: + # Get the active hooks directory (handles custom paths, worktrees, etc.) + hooks_dir = get_git_hooks_directory(target_dir) + click.echo(f"Using hooks directory: {hooks_dir}") - # Check if hooks directory exists, create if not - hooks_dir = git_dir / "hooks" - if not hooks_dir.exists(): - hooks_dir.mkdir(parents=True, exist_ok=True) - click.echo(f"Created hooks directory: {hooks_dir}") + except RuntimeError as e: + raise click.ClickException(f"Error: {e}") # Check if post-merge hook already exists post_merge_hook = hooks_dir / "post-merge" - if post_merge_hook.exists() and not force: - click.echo(f"Post-merge hook already exists at {post_merge_hook}") - if not click.confirm("Overwrite existing hook?", default=False): - click.echo("Hook installation cancelled.") - return - - # Create the post-merge hook script - hook_content = """#!/bin/sh -# KiCad Library Manager auto-update hook -# Added by kilm add-hook command - -echo "Running KiCad Library Manager update..." -kilm update - -# Uncomment to set up libraries automatically (use with caution) -# kilm setup - -echo "KiCad libraries update complete." -""" + if post_merge_hook.exists(): + if not force: + click.echo(f"Post-merge hook already exists at {post_merge_hook}") + if not click.confirm("Overwrite existing hook?", default=False): + click.echo("Hook installation cancelled.") + return + + # Create backup of existing hook + backup_path = backup_existing_hook(post_merge_hook) + click.echo(f"Created backup of existing hook: {backup_path}") + + # Read existing content for potential merging + try: + existing_content = post_merge_hook.read_text(encoding="utf-8") + + if force: + # Force overwrite - don't merge, just replace + click.echo("Force overwrite requested, replacing existing hook...") + new_content = create_kilm_hook_content() + else: + # Merge with existing content to preserve user logic + click.echo("Merging KiLM content with existing hook...") + new_content = merge_hook_content(existing_content, create_kilm_hook_content()) + + except (OSError, UnicodeDecodeError): + click.echo("Warning: Could not read existing hook content, overwriting...") + new_content = create_kilm_hook_content() + else: + # No existing hook, create new one + new_content = create_kilm_hook_content() try: + # Write the hook content with post_merge_hook.open("w") as f: - f.write(hook_content) + f.write(new_content) # Make the hook executable post_merge_hook.chmod(0o755) @@ -83,10 +98,17 @@ def add_hook(directory, force): click.echo( "The hook will run 'kilm update' after every 'git pull' or 'git merge' operation." ) + + if post_merge_hook.exists() and "KiLM-managed section" in new_content: + click.echo( + "\nNote: The hook contains clear markers for KiLM-managed sections," + ) + click.echo("making future updates safe and idempotent.") + click.echo( "\nNote: You may need to modify the hook script if you want to customize" ) click.echo("the update behavior or automatically set up libraries.") except Exception as e: - click.echo(f"Error creating hook: {str(e)}", err=True) + raise click.ClickException(f"Error creating hook: {str(e)}") diff --git a/kicad_lib_manager/commands/unpin.py b/kicad_lib_manager/commands/unpin.py index bb4121e..d70bf04 100644 --- a/kicad_lib_manager/commands/unpin.py +++ b/kicad_lib_manager/commands/unpin.py @@ -48,6 +48,10 @@ ) def unpin(symbols, footprints, all, dry_run, max_backups, verbose): """Unpin libraries in KiCad""" + # Enforce mutual exclusivity of --all with --symbols/--footprints + if all and (symbols or footprints): + raise click.UsageError("'--all' cannot be used with '--symbols' or '--footprints'") + # Find KiCad configuration try: kicad_config = find_kicad_config() diff --git a/kicad_lib_manager/utils/git_utils.py b/kicad_lib_manager/utils/git_utils.py new file mode 100644 index 0000000..3ddb80f --- /dev/null +++ b/kicad_lib_manager/utils/git_utils.py @@ -0,0 +1,137 @@ +""" +Git utility functions for KiCad Library Manager. +Handles Git hooks directory detection and safe hook management. +""" + +import subprocess +from datetime import datetime +from pathlib import Path + + +def get_git_hooks_directory(repo_path: Path) -> Path: + """ + Get the active Git hooks directory for a repository. + + This function detects the correct hooks directory by: + 1. Using git rev-parse --git-path hooks (handles core.hooksPath, worktrees, and common dir) + 2. Falling back to git rev-parse --git-common-dir + hooks + + Args: + repo_path: Path to the Git repository + + Returns: + Path to the active hooks directory + + Raises: + RuntimeError: If the repository is not a valid Git repository + """ + if not repo_path.exists(): + raise RuntimeError(f"Repository path does not exist: {repo_path}") + + # Ask Git for the effective hooks directory. Handles core.hooksPath, worktrees, and common dir. + try: + rp = subprocess.run( + ["git", "-C", str(repo_path), "rev-parse", "--git-path", "hooks"], + capture_output=True, text=True, check=True + ) + hooks_dir = Path(rp.stdout.strip()) + if not hooks_dir.is_absolute(): + hooks_dir = (repo_path / hooks_dir).resolve() + hooks_dir.mkdir(parents=True, exist_ok=True) + return hooks_dir + except subprocess.CalledProcessError as e: + # Fallback: resolve common dir then append hooks + try: + cd = subprocess.run( + ["git", "-C", str(repo_path), "rev-parse", "--git-common-dir"], + capture_output=True, text=True, check=True + ) + common_dir = Path(cd.stdout.strip()) + if not common_dir.is_absolute(): + common_dir = (repo_path / common_dir).resolve() + hooks_dir = common_dir / "hooks" + hooks_dir.mkdir(parents=True, exist_ok=True) + return hooks_dir.resolve() + except subprocess.CalledProcessError: + raise RuntimeError(f"Not a Git repository: {repo_path}") from e + + +def backup_existing_hook(hook_path: Path) -> Path: + """ + Create a timestamped backup of an existing hook file. + + Args: + hook_path: Path to the existing hook file + + Returns: + Path to the backup file + """ + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + backup_path = hook_path.with_suffix(f".backup.{timestamp}") + + # Copy the file content + backup_path.write_text(hook_path.read_text(encoding="utf-8")) + + # Preserve executable permissions + if hook_path.stat().st_mode & 0o111: # Check if executable + backup_path.chmod(0o755) + + return backup_path + + +def merge_hook_content(existing_content: str, kilm_content: str) -> str: + """ + Safely merge existing hook content with KiLM content. + + Args: + existing_content: Content of existing hook + kilm_content: KiLM hook content to add + + Returns: + Merged hook content + """ + # Check if KiLM content is already present + if "KiLM-managed section" in existing_content: + # Already has KiLM content, replace the section + lines = existing_content.split('\n') + start_marker = "# BEGIN KiLM-managed section" + end_marker = "# END KiLM-managed section" + + start_idx = None + end_idx = None + + for i, line in enumerate(lines): + if line.strip() == start_marker: + start_idx = i + elif line.strip() == end_marker: + end_idx = i + break + + if start_idx is not None and end_idx is not None: + # Replace existing KiLM section + new_lines = lines[:start_idx] + [kilm_content] + lines[end_idx + 1:] + return '\n'.join(new_lines) + + # Add KiLM content at the end with clear markers + return f"{existing_content.rstrip()}\n\n{kilm_content}" + + +def create_kilm_hook_content() -> str: + """ + Create the standard KiLM hook content with clear markers. + + Returns: + Formatted hook content string + """ + return """# BEGIN KiLM-managed section +# KiCad Library Manager auto-update hook +# Added by kilm add-hook command + +echo "Running KiCad Library Manager update..." +kilm update + +# Uncomment to set up libraries automatically (use with caution) +# kilm setup + +echo "KiCad libraries update complete." +# END KiLM-managed section""" diff --git a/tests/test_git_utils.py b/tests/test_git_utils.py new file mode 100644 index 0000000..02ed0e3 --- /dev/null +++ b/tests/test_git_utils.py @@ -0,0 +1,148 @@ +""" +Tests for Git utility functions. +""" + +from unittest.mock import Mock, patch + +import pytest + +from kicad_lib_manager.utils.git_utils import ( + backup_existing_hook, + create_kilm_hook_content, + get_git_hooks_directory, + merge_hook_content, +) + + +class TestGitUtils: + """Test cases for Git utility functions.""" + + def test_create_kilm_hook_content(self): + """Test that KiLM hook content is created with proper markers.""" + content = create_kilm_hook_content() + + assert "BEGIN KiLM-managed section" in content + assert "END KiLM-managed section" in content + assert "kilm update" in content + assert "kilm setup" in content + assert content.startswith("# BEGIN KiLM-managed section") + assert content.endswith("# END KiLM-managed section") + + def test_backup_existing_hook(self, tmp_path): + """Test backup creation with timestamp.""" + hook_file = tmp_path / "post-merge" + hook_content = "#!/bin/sh\necho 'test hook'" + hook_file.write_text(hook_content) + hook_file.chmod(0o755) + + backup_path = backup_existing_hook(hook_file) + + assert backup_path.exists() + assert backup_path != hook_file + assert backup_path.read_text() == hook_content + assert backup_path.name.startswith("post-merge.backup.") + assert backup_path.stat().st_mode & 0o111 # Check executable bit + + def test_merge_hook_content_new_content(self): + """Test merging when no KiLM content exists.""" + existing = "#!/bin/sh\necho 'existing hook'" + kilm_content = create_kilm_hook_content() + + result = merge_hook_content(existing, kilm_content) + + assert "existing hook" in result + assert "BEGIN KiLM-managed section" in result + assert "END KiLM-managed section" in result + assert result.count("BEGIN KiLM-managed section") == 1 + + def test_merge_hook_content_replace_existing(self): + """Test merging when KiLM content already exists.""" + existing = """#!/bin/sh +echo 'existing hook' +# BEGIN KiLM-managed section +# old kilm content +# END KiLM-managed section +echo 'after kilm'""" + + kilm_content = create_kilm_hook_content() + + result = merge_hook_content(existing, kilm_content) + + assert "existing hook" in result + assert "after kilm" in result + assert result.count("BEGIN KiLM-managed section") == 1 + assert result.count("END KiLM-managed section") == 1 + assert "old kilm content" not in result + assert "kilm update" in result + + @patch('subprocess.run') + def test_get_git_hooks_directory_standard(self, mock_run, tmp_path): + """Test standard hooks directory detection.""" + # Mock the first call to succeed with hooks path + mock_run.return_value = Mock(returncode=0, stdout=".git/hooks") + + repo_path = tmp_path / "test-repo" + repo_path.mkdir() + (repo_path / ".git" / "hooks").mkdir(parents=True, exist_ok=True) + + hooks_dir = get_git_hooks_directory(repo_path) + + assert hooks_dir == repo_path / ".git" / "hooks" + mock_run.assert_called_once() + + @patch('subprocess.run') + def test_get_git_hooks_directory_custom_path(self, mock_run, tmp_path): + """Test custom hooks directory detection.""" + custom_hooks = tmp_path / "custom" / "hooks" + custom_hooks.mkdir(parents=True, exist_ok=True) + + mock_run.return_value = Mock(returncode=0, stdout=str(custom_hooks)) + + repo_path = tmp_path / "test-repo" + repo_path.mkdir() + (repo_path / ".git").mkdir() + + hooks_dir = get_git_hooks_directory(repo_path) + + assert hooks_dir == custom_hooks + mock_run.assert_called_once() + + @patch('subprocess.run') + def test_get_git_hooks_directory_relative_path(self, mock_run, tmp_path): + """Test relative custom hooks path handling.""" + mock_run.return_value = Mock(returncode=0, stdout="custom/hooks") + + repo_path = tmp_path / "test-repo" + repo_path.mkdir() + (repo_path / ".git").mkdir() + (repo_path / "custom" / "hooks").mkdir(parents=True, exist_ok=True) + + hooks_dir = get_git_hooks_directory(repo_path) + + assert hooks_dir == repo_path / "custom" / "hooks" + mock_run.assert_called_once() + + @patch('subprocess.run') + def test_get_git_hooks_directory_worktree(self, mock_run, tmp_path): + """Test Git worktree hooks directory detection.""" + # Mock the Git command to return the worktree hooks path + main_git_dir = tmp_path / "main-repo" / ".git" + worktree_hooks = main_git_dir / "hooks" + worktree_hooks.mkdir(parents=True, exist_ok=True) + + mock_run.return_value = Mock(returncode=0, stdout=str(worktree_hooks)) + + repo_path = tmp_path / "worktree" + repo_path.mkdir() + + hooks_dir = get_git_hooks_directory(repo_path) + + assert hooks_dir == worktree_hooks + mock_run.assert_called_once() + + def test_get_git_hooks_directory_not_repo(self, tmp_path): + """Test error when directory is not a Git repository.""" + with pytest.raises(RuntimeError, match="Not a Git repository"): + get_git_hooks_directory(tmp_path) + + diff --git a/tests/test_library_manager.py b/tests/test_library_manager.py index 9d682c8..cb77c58 100644 --- a/tests/test_library_manager.py +++ b/tests/test_library_manager.py @@ -1,5 +1,5 @@ import os -from pathlib._local import Path +from pathlib import Path import pytest diff --git a/tests/test_unpin_command.py b/tests/test_unpin_command.py new file mode 100644 index 0000000..5c9ba1a --- /dev/null +++ b/tests/test_unpin_command.py @@ -0,0 +1,84 @@ +""" +Tests for the unpin command functionality. +""" + +from pathlib import Path +from unittest.mock import patch + +from click.testing import CliRunner + +from kicad_lib_manager.commands.unpin import unpin + + +class TestUnpinCommand: + """Test cases for the unpin command.""" + + def setup_method(self): + """Set up test fixtures.""" + self.runner = CliRunner() + + def test_mutual_exclusivity_all_with_symbols(self): + """Test that --all cannot be used with --symbols.""" + result = self.runner.invoke(unpin, ['--all', '--symbols', 'lib1']) + assert result.exit_code == 2 # Click usage error exit code + assert "'--all' cannot be used with '--symbols' or '--footprints'" in result.output + + def test_mutual_exclusivity_all_with_footprints(self): + """Test that --all cannot be used with --footprints.""" + result = self.runner.invoke(unpin, ['--all', '--footprints', 'lib1']) + assert result.exit_code == 2 # Click usage error exit code + assert "'--all' cannot be used with '--symbols' or '--footprints'" in result.output + + def test_mutual_exclusivity_all_with_both(self): + """Test that --all cannot be used with both --symbols and --footprints.""" + result = self.runner.invoke(unpin, ['--all', '--symbols', 'lib1', '--footprints', 'lib2']) + assert result.exit_code == 2 # Click usage error exit code + assert "'--all' cannot be used with '--symbols' or '--footprints'" in result.output + + def test_mutual_exclusivity_all_only(self): + """Test that --all can be used without --symbols or --footprints.""" + with patch('kicad_lib_manager.commands.unpin.find_kicad_config') as mock_find_config: + mock_find_config.return_value = Path("/tmp/kicad") + + with patch('pathlib.Path.exists') as mock_exists: + mock_exists.return_value = True + + with patch('builtins.open') as mock_open: + mock_open.return_value.__enter__.return_value.read.return_value = '{"session": {"pinned_symbol_libs": [], "pinned_fp_libs": []}}' + + # Should not raise an error + result = self.runner.invoke(unpin, ['--all']) + # Exit code 0 means success, or 1 if no libraries found (which is expected) + assert result.exit_code in [0, 1] + + def test_mutual_exclusivity_symbols_only(self): + """Test that --symbols can be used without --all.""" + with patch('kicad_lib_manager.commands.unpin.find_kicad_config') as mock_find_config: + mock_find_config.return_value = Path("/tmp/kicad") + + with patch('pathlib.Path.exists') as mock_exists: + mock_exists.return_value = True + + with patch('builtins.open') as mock_open: + mock_open.return_value.__enter__.return_value.read.return_value = '{"session": {"pinned_symbol_libs": ["lib1"], "pinned_fp_libs": []}}' + + # Should not raise an error + result = self.runner.invoke(unpin, ['--symbols', 'lib1']) + # Exit code 0 means success, or 1 if no libraries found (which is expected) + assert result.exit_code in [0, 1] + + def test_mutual_exclusivity_footprints_only(self): + """Test that --footprints can be used without --all.""" + with patch('kicad_lib_manager.commands.unpin.find_kicad_config') as mock_find_config: + mock_find_config.return_value = Path("/tmp/kicad") + + with patch('pathlib.Path.exists') as mock_exists: + mock_exists.return_value = True + + with patch('builtins.open') as mock_open: + mock_open.return_value.__enter__.return_value.read.return_value = '{"session": {"pinned_symbol_libs": [], "pinned_fp_libs": ["lib1"]}}' + + # Should not raise an error + result = self.runner.invoke(unpin, ['--footprints', 'lib1']) + # Exit code 0 means success, or 1 if no libraries found (which is expected) + assert result.exit_code in [0, 1]