diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml
new file mode 100644
index 0000000..34dd78d
--- /dev/null
+++ b/.github/workflows/website.yml
@@ -0,0 +1,44 @@
+name: Website
+on:
+ push:
+ branches:
+ - main
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+concurrency:
+ group: pages
+ cancel-in-progress: true
+jobs:
+ deploy:
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ runs-on: ubuntu-latest
+ name: deploy website
+ steps:
+ - name: Checkout the repository
+ uses: actions/checkout@v7
+ - name: Install pnpm
+ uses: pnpm/action-setup@v6
+ with:
+ version: 11
+ - name: Install Node.js
+ uses: actions/setup-node@v7
+ with:
+ node-version: 24
+ cache: 'pnpm'
+ - name: Install dependencies
+ run: pnpm install
+ - name: Build website
+ run: pnpm docs:build
+ - name: Setup Pages
+ uses: actions/configure-pages@v6
+ - name: Upload artifact
+ uses: actions/upload-pages-artifact@v5
+ with:
+ path: './website/dist'
+ - name: Deploy to GitHub Pages
+ id: deployment
+ uses: actions/deploy-pages@v5
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 625fddf..502c0da 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -30,7 +30,7 @@ importers:
version: 21.2.0
'@commitlint/cz-commitlint':
specifier: ^21.0.0
- version: 21.2.0(@types/node@24.13.3)(commitizen@4.3.2(@types/node@24.13.3)(typescript@7.0.2))(typescript@7.0.2)
+ version: 21.2.0(@types/node@24.13.3)(commitizen@4.3.2(@types/node@24.13.3)(typescript@7.0.2))(inquirer@8.2.7(@types/node@24.13.3))(typescript@7.0.2)
'@trigen/oxlint':
specifier: ^10.1.1
version: 10.1.1
@@ -72,10 +72,10 @@ importers:
version: 7.0.2
vite:
specifier: ^8.1.0
- version: 8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)
+ version: 8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0)
vitest:
specifier: ^4.1.9
- version: 4.1.10(@types/node@24.13.3)(@vitest/coverage-v8@4.1.10)(happy-dom@20.11.1)(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0))
+ version: 4.1.10(@types/node@24.13.3)(@vitest/coverage-v8@4.1.10)(happy-dom@20.11.1)(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0))
examples/rspack:
dependencies:
@@ -119,13 +119,13 @@ importers:
version: link:../../packages/vite-plugin
'@sveltejs/vite-plugin-svelte':
specifier: ^6.0.0
- version: 6.2.4(svelte@5.56.8(@typescript-eslint/types@8.64.0))(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0))
+ version: 6.2.4(svelte@5.56.8(@typescript-eslint/types@8.64.0))(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0))
svelte:
specifier: ^5.0.0
version: 5.56.8(@typescript-eslint/types@8.64.0)
vite:
specifier: ^8.1.0
- version: 8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)
+ version: 8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0)
examples/webpack:
dependencies:
@@ -159,7 +159,7 @@ importers:
version: 6.0.1(webpack-dev-server@5.2.6)(webpack@5.108.4)
webpack-dev-server:
specifier: ^5.2.0
- version: 5.2.6(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1)(webpack-cli@6.0.1)(webpack@5.108.4)
+ version: 5.2.6(supports-color@8.1.1)(webpack-cli@6.0.1)(webpack@5.108.4)
packages/bundler-utils:
dependencies:
@@ -291,7 +291,7 @@ importers:
version: 0.35.3(@types/node@24.13.3)
webpack:
specifier: ^5.108.4
- version: 5.108.4(@swc/core@1.16.0)(clean-css@5.3.3)(esbuild@0.28.1)(html-minifier-terser@6.1.0)(lightningcss@1.32.0)(postcss@8.5.20)(webpack-cli@6.0.1)
+ version: 5.108.4(esbuild@0.28.1)
publishDirectory: package
packages/preact:
@@ -347,7 +347,7 @@ importers:
version: 19.2.4(@types/react@19.2.18)
'@vitejs/plugin-react':
specifier: ^6.0.1
- version: 6.0.5(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0))
+ version: 6.0.5(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0))
happy-dom:
specifier: ^20.0.0
version: 20.11.1
@@ -382,7 +382,7 @@ importers:
version: 2.5.8(svelte@5.56.8(@typescript-eslint/types@8.64.0))
'@sveltejs/vite-plugin-svelte':
specifier: ^6.0.0
- version: 6.2.4(svelte@5.56.8(@typescript-eslint/types@8.64.0))(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0))
+ version: 6.2.4(svelte@5.56.8(@typescript-eslint/types@8.64.0))(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0))
'@testing-library/dom':
specifier: ^10.0.0
version: 10.4.1
@@ -391,7 +391,7 @@ importers:
version: 6.10.0(@testing-library/dom@10.4.1)
'@testing-library/svelte':
specifier: ^5.2.0
- version: 5.4.2(svelte@5.56.8(@typescript-eslint/types@8.64.0))(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0))(vitest@4.1.10)
+ version: 5.4.2(svelte@5.56.8(@typescript-eslint/types@8.64.0))(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0))(vitest@4.1.10)
happy-dom:
specifier: ^20.0.0
version: 20.11.1
@@ -429,14 +429,179 @@ importers:
version: 0.35.3(@types/node@24.13.3)
vite:
specifier: ^8.1.0
- version: 8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)
+ version: 8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0)
publishDirectory: package
+ website:
+ dependencies:
+ '@astrojs/check':
+ specifier: ^0.9.9
+ version: 0.9.10(prettier@3.9.6)(typescript@6.0.3)
+ '@astrojs/markdown-remark':
+ specifier: ^7.2.0
+ version: 7.3.0
+ '@astrojs/starlight':
+ specifier: ^0.41.1
+ version: 0.41.11(@astrojs/markdown-remark@7.3.0)(astro@7.2.10(@astrojs/markdown-remark@7.3.0)(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@types/node@24.13.3)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0))(typescript@6.0.3)
+ astro:
+ specifier: ^7.0.4
+ version: 7.2.10(@astrojs/markdown-remark@7.3.0)(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@types/node@24.13.3)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0)
+ astro-vtbot:
+ specifier: ^3.0.0
+ version: 3.1.0
+ starlight-llms-txt:
+ specifier: ^0.11.0
+ version: 0.11.0(@astrojs/markdown-satteri@0.3.8)(@astrojs/starlight@0.41.11(@astrojs/markdown-remark@7.3.0)(astro@7.2.10(@astrojs/markdown-remark@7.3.0)(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@types/node@24.13.3)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0))(typescript@6.0.3))(astro@7.2.10(@astrojs/markdown-remark@7.3.0)(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@types/node@24.13.3)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0))
+ devDependencies:
+ sharp:
+ specifier: ^0.35.0
+ version: 0.35.3(@types/node@24.13.3)
+ typescript:
+ specifier: ^6.0.0
+ version: 6.0.3
+
packages:
'@adobe/css-tools@4.5.0':
resolution: {integrity: sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==}
+ '@astrojs/check@0.9.10':
+ resolution: {integrity: sha512-zgx/UQMozdjOa3bOxjgeCFdtpE3c9rRX6xHwa+2QXvy8z8Akifu2AtubHyv/zzC2znO8dl8fFWL4K+Ba9kS8HQ==}
+ hasBin: true
+ peerDependencies:
+ typescript: ^5.0.0 || ^6.0.0
+
+ '@astrojs/compiler-binding-darwin-arm64@0.4.0':
+ resolution: {integrity: sha512-ZVUwHundaQyFNjE6uoa0usaC0WOCitDCLS/4mdb4rOiJXwVUuKJBMxI5WMzXLWmamsXtK/Z//ifLXvV5Yeh4Hw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@astrojs/compiler-binding-darwin-x64@0.4.0':
+ resolution: {integrity: sha512-FI6G8AY8u6fR1SI/QRR5yGMwtvZwP34CDmZpZ5HwJGa50UM1VISTLhqkhV4a476pmgd25X1Aur2dqw6hUnrlKA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [darwin]
+
+ '@astrojs/compiler-binding-linux-arm64-gnu@0.4.0':
+ resolution: {integrity: sha512-lB9gLFJK7m82EnjaU8nlRBEfcwGNeHidW3sSjODTUjMNaoewVuUz9fwwdY5M4jiSXIqWLH3yl6TX8FTDKA74Sw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@astrojs/compiler-binding-linux-arm64-musl@0.4.0':
+ resolution: {integrity: sha512-HPbvWqbxFxyaoQJhLxCaSjtYBx9KBo7JGVzEFZCmMl968a2PsSH0UfiODYgYPXofTOIsIH2aoCcrHXML0IA3ig==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@astrojs/compiler-binding-linux-x64-gnu@0.4.0':
+ resolution: {integrity: sha512-tQKolMxoJ/+0AmLWm1PmJ/i+z3i10ZU1bNuVjEDulCf48azEMtUNjTZgHJ5MPtpYRNc7dlETr8QujUfduzoC7Q==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@astrojs/compiler-binding-linux-x64-musl@0.4.0':
+ resolution: {integrity: sha512-5v5YymudsxMHp3NBLCS8BUlu5CRqeLtWD9cKS/4nIhIEHCbpz9okmVV6I0HWqmBAPhWYcDa3vw/vltYPrOQCTA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@astrojs/compiler-binding-wasm32-wasi@0.4.0':
+ resolution: {integrity: sha512-m/phuH3x3PREvv1OnkM44NoPh4MatUadix1fB1u5SvMLCyDTUZykDJbKnWf1cjnYmHdlB8HcjTjl6JrCqAIXcw==}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
+
+ '@astrojs/compiler-binding-win32-arm64-msvc@0.4.0':
+ resolution: {integrity: sha512-B9zYf3okEY83kM8gydlpH2BHP00w4ifxPqlYlWrgTwuD6wnkrJDCwBlgy1q31cERjCJRXN1lrE2VmkLvFjv/6g==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [win32]
+
+ '@astrojs/compiler-binding-win32-x64-msvc@0.4.0':
+ resolution: {integrity: sha512-zB0Nrv0dGc0zZWPGDRmmETTPhDRqyZjAjk+gWMlVrJX5U89obpB3VUUE1ZiHxOCN5LQojeLK6O8L/dnoHolvNQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [win32]
+
+ '@astrojs/compiler-binding@0.4.0':
+ resolution: {integrity: sha512-x2RjDUuWfwLNtc3mjAdSRInwqh/rqbLar9cm/5FOMbHvmYZB7yfKewzSclAxWjIZsypJDXv1lhaP2WG+P8TK3g==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+
+ '@astrojs/compiler-rs@0.4.0':
+ resolution: {integrity: sha512-koVikeon1kreEy+/JzLQRy3vzHHQVOjycs4degg4vFufKApZOwMZvSSAEztYNhmcQVfNVsVZZI4cEge3cexAbQ==}
+ engines: {node: '>=22.12.0'}
+
+ '@astrojs/compiler@2.13.1':
+ resolution: {integrity: sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==}
+
+ '@astrojs/internal-helpers@0.10.4':
+ resolution: {integrity: sha512-nozZSy/mKYLqe4YrqbKtdOszedAfXYCtw3wZ0d+CAjz4GqQ4L9rl1ltIL5BlgwmYVinJg/RZ0MgGuWOdlyRZlA==}
+
+ '@astrojs/internal-helpers@0.11.0':
+ resolution: {integrity: sha512-3rzxJ+xbo0+8YyqOzLziIN32wmsHdCjEVz2sGOpRxJ+Ben/KiLph4ItxBy1abEL+E8fkRzqjg0rfXmaHJGw9JA==}
+
+ '@astrojs/language-server@2.16.16':
+ resolution: {integrity: sha512-KuS17AOOqH/M5mHXPmKvtp8L+NNteARC7Xjf395+9R9dtJOBndqdStwU4V+OKzYZpgZ+hliV13knzx/oMtFl7Q==}
+ hasBin: true
+ peerDependencies:
+ prettier: ^3.0.0
+ prettier-plugin-astro: '>=0.11.0'
+ peerDependenciesMeta:
+ prettier:
+ optional: true
+ prettier-plugin-astro:
+ optional: true
+
+ '@astrojs/markdown-remark@7.2.4':
+ resolution: {integrity: sha512-MvspGMynWKAjTe4/lTUdmBPHIFKNVLTCF6UlyWGogTGzNrTvjD+D4n48k7h8swxsEPKHK2TwxkZO7uoaCv1Pow==}
+
+ '@astrojs/markdown-remark@7.3.0':
+ resolution: {integrity: sha512-mRwn2W2PKkOj8XEAiD3b9RIF4qq6FKB6U4c98GxFLkEJH7uA6ZZv8TiqVjJSPMANLb1NtwBTgkY+KO4mTXnT/Q==}
+
+ '@astrojs/markdown-satteri@0.3.8':
+ resolution: {integrity: sha512-n8ItpFTCmlDsVR5+rwDmehSf+jFCYLWmZiisZNGuF7xILqYhsVeBfcha4qgS2Seq3fAc9Tm58ZVrvqFQ6RQgRQ==}
+
+ '@astrojs/markdown-satteri@0.4.0':
+ resolution: {integrity: sha512-wykOOW9KsUVcZweOpY/CeXpdKcCKZy6fQbdcteWFuI75+sQCiqxYM7VKsGa5b+aGl3cYQscFY37rsbbyal5MRw==}
+
+ '@astrojs/mdx@7.0.8':
+ resolution: {integrity: sha512-RNuwq2ccTSi7NX9YqlR0noaWoVdOrZuJvdfWXotAzdhMVB0b0zEMLnNU+xar7le0GwTMlTObD/QAu8jeHA/3nA==}
+ engines: {node: '>=22.12.0'}
+ peerDependencies:
+ '@astrojs/markdown-satteri': ^0.3.1
+ astro: ^7.0.0
+ peerDependenciesMeta:
+ '@astrojs/markdown-satteri':
+ optional: true
+
+ '@astrojs/prism@4.0.2':
+ resolution: {integrity: sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==}
+ engines: {node: '>=22.12.0'}
+
+ '@astrojs/sitemap@3.7.4':
+ resolution: {integrity: sha512-LbKNC24bdUWcQf/pThB6qLlSqHojxGjZDURIzFocY8rlWnAn2t74nnhnK6S5x0NHriHoAduLEpVjRykmeGiVvA==}
+
+ '@astrojs/starlight@0.41.11':
+ resolution: {integrity: sha512-hM95Mbsl4l60SBwaNQA/HTxpOLGfeB5EfR9qY3kr0SsAVKUspCssjO0RVBsLiPAE6EA5xuORcCoz/Q6DTX+MuQ==}
+ peerDependencies:
+ '@astrojs/markdown-remark': ^7.2.0
+ astro: ^7.0.2
+ peerDependenciesMeta:
+ '@astrojs/markdown-remark':
+ optional: true
+
+ '@astrojs/telemetry@3.3.3':
+ resolution: {integrity: sha512-C1TLn5sPJr0x4vk56piHWKbnqlEB8BKyte5Y45V02U+D7BGO5eMqZDH5aPjnkXQWJggvmsTXxH03QMZ9NgWLzQ==}
+ engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0}
+
+ '@astrojs/yaml2ts@0.2.4':
+ resolution: {integrity: sha512-8oddpOae35pJsXPQXhTkM0ypfKPskVsh2bCxRtbf7e+/Epw2nReakFYpLKjZMEr75CsoF203PMnCocpfz0s69A==}
+
'@babel/code-frame@7.29.7':
resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==}
engines: {node: '>=6.9.0'}
@@ -466,6 +631,67 @@ packages:
resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==}
engines: {node: '>=18'}
+ '@bruits/satteri-darwin-arm64@0.9.5':
+ resolution: {integrity: sha512-iw4nZgx9v30lWo/MTngQqi1pI78KI0DnkSm+lVJGYdmPLgAyDNJigVhpG42/Iq55A6c1Ll8q66ljyyRiQUxwow==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@bruits/satteri-darwin-x64@0.9.5':
+ resolution: {integrity: sha512-6T26Z5Kf3cFW2PSlk9p7zT7yVxvuBSiJvYyz9u8KjYwMTqZyIDOj2wDyNpxKV4+6yUVG7rddq2QwvG/8LJA2+Q==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@bruits/satteri-linux-arm64-gnu@0.9.5':
+ resolution: {integrity: sha512-u51id17uJwNEMK9nBlICsq6U31c+XVqQueVBkwRIzZG+gMpS8TOJctt5h5Wz33Z8xnMdTd+adtACVz0yHgGuOA==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@bruits/satteri-linux-arm64-musl@0.9.5':
+ resolution: {integrity: sha512-v39HxiwGC5Rqm01HksP6+5Y+xKLPlsuVFgIgpEAo+SiQ22c+mJVhS3u7Z6ePAKdhL5NJoK1xq70kLz3L13AhpQ==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@bruits/satteri-linux-x64-gnu@0.9.5':
+ resolution: {integrity: sha512-F3uO8uFp3pAP5ZGXttwvh57GS7s0lL953tnNdyI2gRyP4kOOkp6pyGojNJzCjkDvWI2Cvb9iNrKok3aqQPauAw==}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@bruits/satteri-linux-x64-musl@0.9.5':
+ resolution: {integrity: sha512-bicEqglLlz++mWyADaZoP0JY20s4vDfLjaPYgQqC+NI4zZLTOOg1T4GB8aqtc822Pqji8SQBmSrTb7CrP8i08Q==}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@bruits/satteri-wasm32-wasi@0.9.5':
+ resolution: {integrity: sha512-zauAuMwfPnKPUkd4AFixRFpXdgKwP2mKgxrIIo2gJzW0/ZneF9dbHnLkojSpaBnCCp7VUL1hIi5WWZvB1CqmAQ==}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
+
+ '@bruits/satteri-win32-arm64-msvc@0.9.5':
+ resolution: {integrity: sha512-SrfE7NEsgZjBvU3c+RR6oQRu0ToXY5uVJEbieXEF0YTctIV2zAVlbaMjWLts074QCgh3a+XHWkR/lWh2VH2LUg==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@bruits/satteri-win32-x64-msvc@0.9.5':
+ resolution: {integrity: sha512-5Kw9ZAtTGS8WHizyn+CJhjjfIQrw+7jcZodpmpXJjefnO15M8UexIi6JR2E5thyvsmHyhL6ZDDMUNR4bKJPd4g==}
+ cpu: [x64]
+ os: [win32]
+
+ '@capsizecss/unpack@4.0.1':
+ resolution: {integrity: sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ==}
+ engines: {node: '>=18'}
+
+ '@clack/core@1.4.3':
+ resolution: {integrity: sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ==}
+ engines: {node: '>= 20.12.0'}
+
+ '@clack/prompts@1.7.0':
+ resolution: {integrity: sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==}
+ engines: {node: '>= 20.12.0'}
+
'@commitlint/cli@21.2.1':
resolution: {integrity: sha512-blsZGe29hJ72VGEFVl72IVYX+1vsfINpjA9yWQA6i7OKD/McGEOXg08sKIRKjFk4JvzhV/9n0l3i6NooPLTNfg==}
engines: {node: '>=22.12.0'}
@@ -562,10 +788,35 @@ packages:
resolution: {integrity: sha512-TzlTVpKPjaqW6qOYjQcYUDuGsLCNsvFHVBXkYGTAnf5V37jCWrE5haKNXzz0WZUtVHjrpV76L1buANjwXMfT8w==}
engines: {node: '>=22'}
+ '@ctrl/tinycolor@4.2.0':
+ resolution: {integrity: sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==}
+ engines: {node: '>=14'}
+
'@discoveryjs/json-ext@0.6.3':
resolution: {integrity: sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==}
engines: {node: '>=14.17.0'}
+ '@emmetio/abbreviation@2.3.3':
+ resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==}
+
+ '@emmetio/css-abbreviation@2.1.8':
+ resolution: {integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==}
+
+ '@emmetio/css-parser@0.4.1':
+ resolution: {integrity: sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ==}
+
+ '@emmetio/html-matcher@1.3.0':
+ resolution: {integrity: sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==}
+
+ '@emmetio/scanner@1.0.4':
+ resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==}
+
+ '@emmetio/stream-reader-utils@0.1.0':
+ resolution: {integrity: sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==}
+
+ '@emmetio/stream-reader@2.2.0':
+ resolution: {integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==}
+
'@emnapi/core@1.11.1':
resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==}
@@ -743,6 +994,18 @@ packages:
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+ '@expressive-code/core@0.44.2':
+ resolution: {integrity: sha512-Yw5KonQCD1HoOO2P89y4wifqS9qrJcGVY0LkVMUsVZjhi++bhz4WwQ37inenKFNOEVo50P7cjoVsCdaVnUbq8w==}
+
+ '@expressive-code/plugin-frames@0.44.2':
+ resolution: {integrity: sha512-gVLm6TQMNIRWIaM7o+mCtxkGNjLZY5/2faSTLoXeo9wv/Pkj/0QAtZyXPVPrRsPARqiipATNFmfvQFLJudxPHQ==}
+
+ '@expressive-code/plugin-shiki@0.44.2':
+ resolution: {integrity: sha512-ebWIvCDzXvjyD8rH6T6DfytYJw1GoArLR4nusIAE4VxXrCQf3d+owytiv010KU/dUg+SRLZskDn0N+HaFXeuSg==}
+
+ '@expressive-code/plugin-text-markers@0.44.2':
+ resolution: {integrity: sha512-SNI7EgUSiADqbqUzzMbj1ZeC/r2pa5eg3KyFOGAd3a7EsIA4qzjXQLp+ODWQtHVDKFCdGs4J3ovSJUqvKIK96g==}
+
'@gwhitney/detect-indent@7.0.1':
resolution: {integrity: sha512-7bQW+gkKa2kKZPeJf6+c6gFK9ARxQfn+FKy9ScTBppyKRWH2KzsmweXUoklqeEiHiNVWaeP5csIdsNq6w7QhzA==}
engines: {node: '>=12.20'}
@@ -1060,12 +1323,22 @@ packages:
'@leichtgewicht/ip-codec@2.0.5':
resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==}
+ '@mdx-js/mdx@3.1.1':
+ resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==}
+
'@napi-rs/wasm-runtime@1.1.6':
resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==}
peerDependencies:
'@emnapi/core': ^1.7.1
'@emnapi/runtime': ^1.7.1
+ '@napi-rs/wasm-runtime@1.2.3':
+ resolution: {integrity: sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0}
+ peerDependencies:
+ '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4
+ '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.4
+
'@noble/hashes@1.4.0':
resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==}
engines: {node: '>= 16'}
@@ -1082,6 +1355,9 @@ packages:
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
engines: {node: '>= 8'}
+ '@oslojs/encoding@1.1.0':
+ resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==}
+
'@oxc-project/types@0.139.0':
resolution: {integrity: sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==}
@@ -1237,6 +1513,44 @@ packages:
cpu: [x64]
os: [win32]
+ '@pagefind/darwin-arm64@1.5.2':
+ resolution: {integrity: sha512-MXpI+7HsAdPkvJ0gk9xj9g541BCqBZOBbdwj9g6lB5LCj6kSV6nqDSjzcAJwvOsfu0fjwvC8hQU+ecfhp+MpiQ==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@pagefind/darwin-x64@1.5.2':
+ resolution: {integrity: sha512-IojxFWMEJe0RQ7PQ3KXQsPIImNsbpPYpoZ+QUDrL8fAl/O27IX+LVLs74/UzEZy5uA2LD8Nz1AiwKr72vrkZQw==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@pagefind/default-ui@1.5.2':
+ resolution: {integrity: sha512-pm1LMnQg8N2B3n2TnjKlhaFihpz6zTiA4HiGQ6/slKO/+8K9CAU5kcjdSSPgpuk1PMuuN4hxLipUIifnrkl3Sg==}
+
+ '@pagefind/freebsd-x64@1.5.2':
+ resolution: {integrity: sha512-7EVzo9+0w+2cbe671BtMj10UlNo83I+HrLVLfRxO731svHRJKUfJ/mo05gU14pe9PCfpKNQT8FS3Xc/oDN6pOA==}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@pagefind/linux-arm64@1.5.2':
+ resolution: {integrity: sha512-Ovt9+K35sqzn8H3ZMXGwls4TD/wMJuvRtShHIsmUQREmaxjrDEX7gHckRCrwYJ4XE1H1p6HkLz3wukrAnsfXQw==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@pagefind/linux-x64@1.5.2':
+ resolution: {integrity: sha512-V+tFqHKXhQKq/WqPBD67AFy7scn1/aZID00ws4fSDd+1daSi5UHR9VVlRrOUYKxn3VuFQYRD7lYXdZK1WED1YA==}
+ cpu: [x64]
+ os: [linux]
+
+ '@pagefind/windows-arm64@1.5.2':
+ resolution: {integrity: sha512-hN9Nh90fNW61nNRCW9ZyQrAj/mD0eRvmJ8NlTUzkbuW8kIzGJUi3cxjFkEcMZ5h/8FsKWD/VcouZl4yo1F7B6g==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@pagefind/windows-x64@1.5.2':
+ resolution: {integrity: sha512-Fa2Iyw7kaDRzGMfNYNUXNW2zbL5FQVDgSOcbDHdzBrDEdpqOqg8TcZ68F22ol6NJ9IGzvUdmeyZypLW5dyhqsg==}
+ cpu: [x64]
+ os: [win32]
+
'@peculiar/asn1-cms@2.9.0':
resolution: {integrity: sha512-VKQz6sJYgSxtGaK6UdnNBUx7hmSdg0K331qrEWh5qxpQsyZGWBjxbq05AJ2bTWWjd7d+nJIxFzwvsR5T7DWC/A==}
@@ -1509,6 +1823,37 @@ packages:
selfsigned:
optional: true
+ '@shikijs/core@4.4.3':
+ resolution: {integrity: sha512-QCR4q2ZO/ILJEuwiBMel4wdcTDb1JGwfjKTxPDF6x8ixOaluPrVqIn06C99AcRPhmYlBR56d/Fb+GN58GzExpg==}
+ engines: {node: '>=20'}
+
+ '@shikijs/engine-javascript@4.4.3':
+ resolution: {integrity: sha512-FbOjFJp9VLdo1Wevs10BBtVxiTWwNLqZh5Gkhjgda/ioL15YOgeSl9n+6XMa3qRlPQzfhFNe641SrynFHYG0nQ==}
+ engines: {node: '>=20'}
+
+ '@shikijs/engine-oniguruma@4.4.3':
+ resolution: {integrity: sha512-EcOQkxdxGQrc1Row/cC2c96/v1dbZqGnEVu1qTuT/MJmp6+cXCvQussowVmCv5Tqr3KuY3c7IbM6HTW3LJ1k9w==}
+ engines: {node: '>=20'}
+
+ '@shikijs/langs@4.4.3':
+ resolution: {integrity: sha512-ePic0yfAJGOF83D5wBHK/00EjK65oahBYxFk5epgq33WRv7X9UuxLEV8PtR0szC0z8dl7INIpIodB99JRFlR+A==}
+ engines: {node: '>=20'}
+
+ '@shikijs/primitive@4.4.3':
+ resolution: {integrity: sha512-m0wBeLDQDeIxRdUmrCPdQqfuUamDwRL5isCfYbguKD6NiaKpVbsv+3J81DyIKgNW5h4WAIIr8T4EkgQrBBxvaQ==}
+ engines: {node: '>=20'}
+
+ '@shikijs/themes@4.4.3':
+ resolution: {integrity: sha512-w8UHjeUnIR965KMWJHUPXOc2mNJUnK3vpVLYLvw5IYU2mnTTJ89E24OrJDBNiJDQ0qzb0tc4l7mrIXx5cFeIyw==}
+ engines: {node: '>=20'}
+
+ '@shikijs/types@4.4.3':
+ resolution: {integrity: sha512-UEJxmRR++MAGR6hugn0vgVS2W/6lWAts84FFSrnlH9sP0LNol7E5+NQ792pH8liWUhyMyjhTgSUH3k7iD7tc5g==}
+ engines: {node: '>=20'}
+
+ '@shikijs/vscode-textmate@10.0.2':
+ resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
+
'@simple-libs/child-process-utils@2.0.0':
resolution: {integrity: sha512-dvNoRKLijXnD0XoJAz94pbNuB5GQgDr55UhpSPhffDkTT0Cmcqh9jSCOtwfT2d4H6MI9E7c4SgtMuJXZ6F3c6A==}
engines: {node: '>=22'}
@@ -1757,6 +2102,9 @@ packages:
'@types/bonjour@3.5.13':
resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==}
+ '@types/braces@3.0.5':
+ resolution: {integrity: sha512-SQFof9H+LXeWNz8wDe7oN5zu7ket0qwMu5vZubW4GCJ8Kkeh6nBWUz87+KTz/G3Kqsrp0j/W253XJb3KMEeg3w==}
+
'@types/chai@5.2.3':
resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==}
@@ -1769,9 +2117,15 @@ packages:
'@types/css-mediaquery@0.1.4':
resolution: {integrity: sha512-DZyHAz716ZUctpqkUU2COwUoZ4gI6mZK2Q1oIz/fvNS6XHVpKSJgDnE7vRxZUBn9vjJHDVelCVW0dkshKOLFsA==}
+ '@types/debug@4.1.13':
+ resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==}
+
'@types/deep-eql@4.0.2':
resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==}
+ '@types/estree-jsx@1.0.5':
+ resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==}
+
'@types/estree@1.0.9':
resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==}
@@ -1781,6 +2135,9 @@ packages:
'@types/express@4.17.25':
resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==}
+ '@types/hast@3.0.5':
+ resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==}
+
'@types/html-minifier-terser@6.1.0':
resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==}
@@ -1790,12 +2147,30 @@ packages:
'@types/http-proxy@1.17.17':
resolution: {integrity: sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==}
+ '@types/js-yaml@4.0.9':
+ resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==}
+
'@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+ '@types/mdast@4.0.4':
+ resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
+
+ '@types/mdx@2.0.14':
+ resolution: {integrity: sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==}
+
+ '@types/micromatch@4.0.10':
+ resolution: {integrity: sha512-5jOhFDElqr4DKTrTEbnW8DZ4Hz5LRUEmyrGpCMrD/NphYv3nUnaF08xmSLx1rGGnyEs/kFnhiw6dCgcDqMr5PQ==}
+
'@types/mime@1.3.5':
resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==}
+ '@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@22.20.1':
resolution: {integrity: sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==}
@@ -1822,6 +2197,9 @@ packages:
'@types/retry@0.12.2':
resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==}
+ '@types/sax@1.2.7':
+ resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==}
+
'@types/send@0.17.6':
resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==}
@@ -1840,6 +2218,12 @@ packages:
'@types/trusted-types@2.0.7':
resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
+ '@types/unist@2.0.11':
+ resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==}
+
+ '@types/unist@3.0.3':
+ resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
+
'@types/whatwg-mimetype@3.0.2':
resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==}
@@ -1970,6 +2354,9 @@ packages:
cpu: [x64]
os: [win32]
+ '@ungap/structured-clone@1.4.0':
+ resolution: {integrity: sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==}
+
'@vitejs/plugin-react@6.0.5':
resolution: {integrity: sha512-BOVzne/NL162sMdResB25mUv+vWMF5NoAjNf09TeGlE7ZpszZWSD3winycicLJw72yeVsoCn/2kOhEuCvEShMA==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -2021,6 +2408,47 @@ packages:
'@vitest/utils@4.1.10':
resolution: {integrity: sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==}
+ '@volar/kit@2.4.28':
+ resolution: {integrity: sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==}
+ peerDependencies:
+ typescript: '*'
+
+ '@volar/language-core@2.4.28':
+ resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==}
+
+ '@volar/language-server@2.4.28':
+ resolution: {integrity: sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw==}
+
+ '@volar/language-service@2.4.28':
+ resolution: {integrity: sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw==}
+
+ '@volar/source-map@2.4.28':
+ resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==}
+
+ '@volar/typescript@2.4.28':
+ resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==}
+
+ '@vscode/emmet-helper@2.11.0':
+ resolution: {integrity: sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==}
+
+ '@vscode/l10n@0.0.18':
+ resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==}
+
+ '@vtbag/cam-shaft@1.0.6':
+ resolution: {integrity: sha512-Xy1bmJJLXuCqxmY2agwPfhGNv1XZViqh54H0VGK4mouGsItFsh8Mz/wWAP6mZwAOEuu9bEOJ1mJ+oNoaczZ1zw==}
+
+ '@vtbag/element-crossing@1.1.0':
+ resolution: {integrity: sha512-1YL609KPwhHUKRrVNfoogQCVJPfFrE5DubOLcCJZLHVCjWZ2ZAPcaq1wR2OP6nXD0Ok9JLX41YsEtYBYzw6CxQ==}
+
+ '@vtbag/inspection-chamber@1.0.24':
+ resolution: {integrity: sha512-L6CrMbzJ0gdG/P5WnGyVgRxHVeLhlQgXh3mp+OI4JdJjFiwIhh9+sG/FXM2DneBs5HQvaWUq4qf6NiSlgVbyvQ==}
+
+ '@vtbag/turn-signal@1.3.1':
+ resolution: {integrity: sha512-6rWkG+ik3U+KQGI94yNOrOh5QedB9zmP/8H51X5WQwrJz8m2MAU5YwGRRcweO/dJ6wW/Bn7OsgC1vRURnwrvCg==}
+
+ '@vtbag/utensil-drawer@1.2.18':
+ resolution: {integrity: sha512-Veg1J8lviA2g878otiEHoyiGR2f4PZ5Rc40UyIR4YS95QnD+1+oAZsprhUPR+YudgZPrqWx5chyPNwjkHyA0uw==}
+
'@webassemblyjs/ast@1.14.1':
resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==}
@@ -2117,9 +2545,22 @@ packages:
engines: {node: '>=0.4.0'}
hasBin: true
+ ajv-draft-04@1.0.0:
+ resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==}
+ peerDependencies:
+ ajv: ^8.5.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
ajv-formats@2.1.1:
resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==}
+ ajv-i18n@4.2.0:
+ resolution: {integrity: sha512-v/ei2UkCEeuKNXh8RToiFsUclmU+G57LO1Oo22OagNMENIw+Yb8eMwvHu7Vn9fmkjJyv6XclhJ8TbuigSglPkg==}
+ peerDependencies:
+ ajv: ^8.0.0-beta.0
+
ajv-keywords@5.1.0:
resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==}
peerDependencies:
@@ -2128,6 +2569,10 @@ packages:
ajv@8.20.0:
resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==}
+ am-i-vibing@0.4.0:
+ resolution: {integrity: sha512-MxT4XZL7pzLHpuvhDKdMaQHMGGkJDLluKBLsbstn+8wv9sWcFT6h+0ve9qkml95amVTZtZV83gQe2hY+ojgHLg==}
+ hasBin: true
+
ansi-escapes@4.3.2:
resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
engines: {node: '>=8'}
@@ -2165,6 +2610,9 @@ packages:
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==}
@@ -2197,6 +2645,9 @@ packages:
array-flatten@1.1.1:
resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
+ array-iterate@2.0.1:
+ resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==}
+
asn1js@3.0.10:
resolution: {integrity: sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==}
engines: {node: '>=12.0.0'}
@@ -2208,6 +2659,28 @@ packages:
ast-v8-to-istanbul@1.0.5:
resolution: {integrity: sha512-UPAgKJFSEGMWSDr3LX4tqnAb4f7KGT8O40Tyx8wbYmmZ/yn58lNCm8h3svs3eXgiGd5AXxz8NDOvXWvicq+rJA==}
+ astring@1.9.0:
+ resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==}
+ hasBin: true
+
+ astro-expressive-code@0.44.2:
+ resolution: {integrity: sha512-avop7nZcRwC7quvIxVguhwEZ9Tp6IoTzKUCLwP30Fb7+er+pWQgcysP01dcuzRIJo81kLGg30q/YAI2Yb1Sdzg==}
+ peerDependencies:
+ astro: ^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta || ^7.0.0
+
+ astro-vtbot@3.1.0:
+ resolution: {integrity: sha512-YZX+Sv3EHRaAryyEJ28N9ausnAG4JxM9ivY+BeRJEa/neWBHmZaQ3onMcdxBFg/u7e+8+YOepuQC8Bt2lx8fKg==}
+
+ astro@7.2.10:
+ resolution: {integrity: sha512-uPtD+nK6kQXugyq4kiMPwj9OI3Sae6HSerA5X+fuv2CPaDwxmokFPPFlGRKIAXH0QAKu+zot2q6yrLG61wFmqg==}
+ engines: {node: '>=22.12.0', npm: '>=9.6.5', pnpm: '>=7.1.0'}
+ hasBin: true
+ peerDependencies:
+ '@astrojs/markdown-remark': ^7.3.0
+ peerDependenciesMeta:
+ '@astrojs/markdown-remark':
+ optional: true
+
at-least-node@1.0.0:
resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==}
engines: {node: '>= 4.0.0'}
@@ -2220,6 +2693,9 @@ packages:
resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
engines: {node: '>= 0.4'}
+ bail@2.0.2:
+ resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
+
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
@@ -2234,6 +2710,12 @@ packages:
batch@0.6.1:
resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==}
+ bcp-47-match@2.0.3:
+ resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==}
+
+ bcp-47@2.1.1:
+ resolution: {integrity: sha512-KLw+H/gd2p4zly1X7Yh/qziuyae5/w/QFnvTng9eZL5fvszL7Whl3MBoWF8yxL7ksUjBfOD+OxkytiqbBpG+Fw==}
+
binary-extensions@2.3.0:
resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
engines: {node: '>=8'}
@@ -2315,6 +2797,9 @@ packages:
caniuse-lite@1.0.30001806:
resolution: {integrity: sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==}
+ ccount@2.0.1:
+ resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
+
chai@6.2.2:
resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==}
engines: {node: '>=18'}
@@ -2327,6 +2812,18 @@ packages:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'}
+ 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==}
+
chardet@2.2.0:
resolution: {integrity: sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==}
@@ -2346,6 +2843,10 @@ packages:
resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==}
engines: {node: '>=6.0'}
+ ci-info@4.4.0:
+ resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==}
+ engines: {node: '>=8'}
+
clean-css@5.3.3:
resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==}
engines: {node: '>= 10.0'}
@@ -2383,6 +2884,9 @@ packages:
resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
engines: {node: '>=6'}
+ collapse-white-space@2.1.0:
+ resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==}
+
color-convert@1.9.3:
resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
@@ -2399,6 +2903,13 @@ packages:
colorette@2.0.20:
resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
+ comma-separated-tokens@2.0.3:
+ resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
+
+ commander@11.1.0:
+ resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==}
+ engines: {node: '>=16'}
+
commander@12.1.0:
resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==}
engines: {node: '>=18'}
@@ -2415,6 +2926,10 @@ packages:
engines: {node: '>= 18'}
hasBin: true
+ common-ancestor-path@2.0.0:
+ resolution: {integrity: sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==}
+ engines: {node: '>= 18'}
+
compressible@2.0.18:
resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==}
engines: {node: '>= 0.6'}
@@ -2457,6 +2972,9 @@ packages:
convert-source-map@2.0.0:
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+ cookie-es@1.2.3:
+ resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==}
+
cookie-signature@1.0.7:
resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==}
@@ -2464,6 +2982,10 @@ packages:
resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
engines: {node: '>= 0.6'}
+ cookie@2.0.1:
+ resolution: {integrity: sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==}
+ engines: {node: '>=22'}
+
core-util-is@1.0.3:
resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
@@ -2488,19 +3010,49 @@ packages:
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
engines: {node: '>= 8'}
+ crossws@0.3.5:
+ resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==}
+
css-mediaquery@0.1.2:
resolution: {integrity: sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q==}
css-select@4.3.0:
resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==}
+ css-select@6.0.0:
+ resolution: {integrity: sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==}
+
+ css-selector-parser@3.3.0:
+ resolution: {integrity: sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==}
+
+ css-tree@2.2.1:
+ resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
+
+ css-tree@3.2.1:
+ resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
+
css-what@6.2.2:
resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==}
engines: {node: '>= 6'}
+ css-what@7.0.0:
+ resolution: {integrity: sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==}
+ engines: {node: '>= 6'}
+
css.escape@1.5.1:
resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==}
+ cssesc@3.0.0:
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ csso@5.0.5:
+ resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
+
csstype@3.2.3:
resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
@@ -2525,6 +3077,9 @@ packages:
supports-color:
optional: true
+ decode-named-character-reference@1.3.0:
+ resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==}
+
dedent-js@1.0.1:
resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==}
@@ -2562,6 +3117,9 @@ packages:
resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
engines: {node: '>= 0.4'}
+ defu@6.1.7:
+ resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==}
+
del-cli@7.0.0:
resolution: {integrity: sha512-fRl4pWJYu9WFQH8jXdQUYvcD0IMtij9WEc7qmB7xOyJEweNJNuE7iKmqNeoOT1DbBUjtRjxlw8Y63qKBI/NQ1g==}
engines: {node: '>=18'}
@@ -2583,6 +3141,9 @@ packages:
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
engines: {node: '>=6'}
+ destr@2.0.5:
+ resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==}
+
destroy@1.2.0:
resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
@@ -2605,9 +3166,20 @@ packages:
devalue@5.9.0:
resolution: {integrity: sha512-RWrqdArjvPbsATEhOPUo6Wndc/iWnkWKlhIrdlF3zMMYo/c3CVtoaVAyLtWxz5h8nSlkHzxnzV2uLydPXmtF+A==}
- dns-packet@5.6.1:
- resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==}
- engines: {node: '>=6'}
+ devlop@1.1.0:
+ resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
+
+ diff@9.0.0:
+ resolution: {integrity: sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==}
+ engines: {node: '>=0.3.1'}
+
+ direction@2.0.1:
+ resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==}
+ hasBin: true
+
+ dns-packet@5.6.1:
+ resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==}
+ engines: {node: '>=6'}
dom-accessibility-api@0.5.16:
resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
@@ -2621,6 +3193,9 @@ packages:
dom-serializer@1.4.1:
resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==}
+ dom-serializer@2.0.0:
+ resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
+
domelementtype@2.3.0:
resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
@@ -2628,12 +3203,23 @@ packages:
resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==}
engines: {node: '>= 4'}
+ domhandler@5.0.3:
+ resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
+ engines: {node: '>= 4'}
+
domutils@2.8.0:
resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==}
+ domutils@3.2.2:
+ resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==}
+
dot-case@3.0.4:
resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
+ dset@3.1.4:
+ resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==}
+ engines: {node: '>=4'}
+
dunder-proto@1.0.1:
resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
engines: {node: '>= 0.4'}
@@ -2644,6 +3230,9 @@ packages:
electron-to-chromium@1.5.393:
resolution: {integrity: sha512-kiDJdIUawuEIcp9XoICKp1iTYDEbgguIPq526N1Q7jIQDeQ3CqoMx71025PI/7E48Ddtw2HuWsVjY7afEgNxmg==}
+ emmet@2.4.11:
+ resolution: {integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==}
+
emoji-regex@10.6.0:
resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==}
@@ -2661,6 +3250,14 @@ packages:
entities@2.2.0:
resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
+ entities@4.5.0:
+ resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+ engines: {node: '>=0.12'}
+
+ entities@6.0.1:
+ resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==}
+ engines: {node: '>=0.12'}
+
entities@7.0.1:
resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==}
engines: {node: '>=0.12'}
@@ -2698,6 +3295,12 @@ packages:
es-toolkit@1.49.0:
resolution: {integrity: sha512-G5iZ6Pc/FNRY/soKZHC+TxGDD83rHUDXxzaWhGCX44vAv/tMs56WMusnm/KMNK+luUPsgA9U28cGr4RDlSzL2g==}
+ 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.28.1:
resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==}
engines: {node: '>=18'}
@@ -2714,6 +3317,10 @@ packages:
resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
engines: {node: '>=0.8.0'}
+ escape-string-regexp@5.0.0:
+ resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
+ engines: {node: '>=12'}
+
eslint-scope@5.1.1:
resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
engines: {node: '>=8.0.0'}
@@ -2753,6 +3360,24 @@ packages:
resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
engines: {node: '>=4.0'}
+ 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.1:
+ resolution: {integrity: sha512-B0np3dcdxqILX5e9nEi5/Fr4K7gL4oYFVPV1zRa2e9wRCbQoZZNWOZFYyoInvXUPJXBXjss+QXlWLJChDEHDkA==}
+
+ 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@3.0.3:
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
@@ -2763,6 +3388,9 @@ packages:
eventemitter3@4.0.7:
resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
+ eventemitter3@5.0.4:
+ resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==}
+
events@3.3.0:
resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
engines: {node: '>=0.8.x'}
@@ -2779,6 +3407,12 @@ packages:
resolution: {integrity: sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==}
engines: {node: '>= 0.10.0'}
+ expressive-code@0.44.2:
+ resolution: {integrity: sha512-MLNghkvhyFgVW4oCD5DxBuYnnTXIf0PygzGmfT6OZeOOYWh/D4sH1j931biElkA5RG/J9wY/iuSMGAPF5vzHOg==}
+
+ extend@3.0.2:
+ resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+
fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
@@ -2786,9 +3420,18 @@ packages:
resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
engines: {node: '>=8.6.0'}
+ fast-string-truncated-width@3.0.3:
+ resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==}
+
+ fast-string-width@3.0.2:
+ resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==}
+
fast-uri@3.1.4:
resolution: {integrity: sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==}
+ fast-wrap-ansi@0.2.2:
+ resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==}
+
fastest-levenshtein@1.0.16:
resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==}
engines: {node: '>= 4.9.1'}
@@ -2824,6 +3467,10 @@ packages:
find-node-modules@2.1.3:
resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==}
+ find-proc@0.1.0:
+ resolution: {integrity: sha512-OaOpEYv2PiQ7SQ5LIrl+deA1XaWcxEjnpM6VuWXTUvn+teIXxeFTLDmu18/zDQpFmHN4o3oDBX+BT0AGwEhemg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+
find-root@1.1.0:
resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==}
@@ -2839,6 +3486,10 @@ packages:
resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==}
hasBin: true
+ flattie@1.1.1:
+ resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==}
+ engines: {node: '>=8'}
+
follow-redirects@1.16.0:
resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==}
engines: {node: '>=4.0'}
@@ -2848,6 +3499,13 @@ packages:
debug:
optional: true
+ fontace@0.4.1:
+ resolution: {integrity: sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==}
+
+ fontkitten@1.0.3:
+ resolution: {integrity: sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==}
+ engines: {node: '>=20'}
+
for-each@0.3.5:
resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
engines: {node: '>= 0.4'}
@@ -2894,6 +3552,13 @@ packages:
resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
engines: {node: '>= 0.4'}
+ get-tsconfig@5.0.0-beta.4:
+ resolution: {integrity: sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ==}
+ engines: {node: '>=20.20.0'}
+
+ github-slugger@2.0.0:
+ resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==}
+
glob-parent@5.1.2:
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
engines: {node: '>= 6'}
@@ -2931,6 +3596,9 @@ packages:
graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+ h3@1.15.11:
+ resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==}
+
handle-thing@2.0.1:
resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==}
@@ -2965,6 +3633,69 @@ packages:
resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==}
engines: {node: '>= 0.4'}
+ 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-mdast@10.1.2:
+ resolution: {integrity: sha512-FiCRI7NmOvM4y+f5w32jPRzcxDIz+PUqDwEqn1A+1q2cdp3B8Gx7aVrXORdOKjMNDQsD1ogOr896+0jJHW1EFQ==}
+
+ hast-util-to-parse5@8.0.1:
+ resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==}
+
+ hast-util-to-string@3.0.1:
+ resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==}
+
+ hast-util-to-text@4.0.2:
+ resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==}
+
+ hast-util-whitespace@3.0.0:
+ resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
+
+ hastscript@9.0.1:
+ resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==}
+
he@1.2.0:
resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
hasBin: true
@@ -2979,11 +3710,17 @@ packages:
html-escaper@2.0.2:
resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
+ html-escaper@3.0.3:
+ resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==}
+
html-minifier-terser@6.1.0:
resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==}
engines: {node: '>=12'}
hasBin: true
+ html-void-elements@3.0.0:
+ resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
+
html-webpack-plugin@5.6.8:
resolution: {integrity: sha512-MZmKQcTnhEh1SPSyMiEytIeDZDUoBZVorNHivQGXMASHf/BSGGOrKa2xQ5bGx3TCe1n109ecCt+cpww7wwWhKA==}
engines: {node: '>=10.13.0'}
@@ -2996,9 +3733,15 @@ packages:
webpack:
optional: true
+ html-whitespace-sensitive-tag-names@3.0.1:
+ resolution: {integrity: sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==}
+
htmlparser2@6.1.0:
resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==}
+ http-cache-semantics@4.2.0:
+ resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==}
+
http-deceiver@1.2.7:
resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==}
@@ -3030,6 +3773,14 @@ packages:
resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==}
engines: {node: '>=10.18'}
+ i18next@26.4.1:
+ resolution: {integrity: sha512-9YbX5E6gd1H+yaOSX3izCsPj5iWXyH7X4oC+iuHHJJw8AeHglzOK5SJf+1CHxaYKYigcea+8jvzSxqYx46YvyA==}
+ peerDependencies:
+ typescript: ^5 || ^6 || ^7
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
iconv-lite@0.4.24:
resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
engines: {node: '>=0.10.0'}
@@ -3076,6 +3827,9 @@ packages:
resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==}
engines: {node: ^20.17.0 || >=22.9.0}
+ inline-style-parser@0.2.7:
+ resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==}
+
inquirer@8.2.7:
resolution: {integrity: sha512-UjOaSel/iddGZJ5xP/Eixh6dY1XghiBw4XK13rCCIJcJfyhhoul/7KhLLUGtebEj6GDYM6Vnx/mVsjx2L/mFIA==}
engines: {node: '>=12.0.0'}
@@ -3096,6 +3850,15 @@ packages:
resolution: {integrity: sha512-aq+t5NAc+cS6rZQQVWC2x98CPqGtKKTMDd4Gaodv0wShnItdKg/51djkGJ1hqH+Oy0ivDftCbSLCQob8zso01w==}
engines: {node: '>= 10'}
+ 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-arguments@1.2.0:
resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==}
engines: {node: '>= 0.4'}
@@ -3131,11 +3894,19 @@ packages:
resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==}
engines: {node: '>= 0.4'}
+ 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-docker@4.0.0:
+ resolution: {integrity: sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==}
+ engines: {node: '>=20'}
+ hasBin: true
+
is-extglob@2.1.1:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'}
@@ -3148,6 +3919,9 @@ packages:
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
engines: {node: '>=0.10.0'}
+ 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'}
@@ -3297,6 +4071,12 @@ packages:
engines: {node: '>=6'}
hasBin: true
+ jsonc-parser@2.3.1:
+ resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==}
+
+ jsonc-parser@3.3.1:
+ resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==}
+
jsonfile@6.2.1:
resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==}
@@ -3308,6 +4088,10 @@ packages:
resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
engines: {node: '>=6'}
+ klona@2.0.6:
+ resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==}
+ engines: {node: '>= 8'}
+
launch-editor@2.14.1:
resolution: {integrity: sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==}
@@ -3416,6 +4200,9 @@ packages:
resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
engines: {node: '>=10'}
+ longest-streak@3.1.0:
+ resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
+
longest@2.0.1:
resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==}
engines: {node: '>=0.10.0'}
@@ -3423,6 +4210,10 @@ packages:
lower-case@2.0.2:
resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
+ lru-cache@11.5.2:
+ resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==}
+ engines: {node: 20 || >=22}
+
lz-string@1.5.0:
resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
hasBin: true
@@ -3430,6 +4221,9 @@ packages:
magic-string@0.30.21:
resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
+ magic-string@1.2.3:
+ resolution: {integrity: sha512-Bpb0W2TbLKOZ7vJnOUnVRGq3WL2p+ISV29M6hYPL1AFCpyKZpdr5ytiXoTSSxRVhg8YW7f65+6gbG8WG6PCa/g==}
+
magicast@0.5.3:
resolution: {integrity: sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==}
@@ -3437,10 +4231,77 @@ packages:
resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
engines: {node: '>=10'}
+ 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==}
+
math-intrinsics@1.1.0:
resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
engines: {node: '>= 0.4'}
+ mdast-util-definitions@6.0.0:
+ resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==}
+
+ mdast-util-directive@3.1.0:
+ resolution: {integrity: sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==}
+
+ mdast-util-find-and-replace@3.0.2:
+ resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==}
+
+ mdast-util-from-markdown@2.0.3:
+ resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==}
+
+ mdast-util-gfm-autolink-literal@2.0.1:
+ resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==}
+
+ mdast-util-gfm-footnote@2.1.0:
+ resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==}
+
+ mdast-util-gfm-strikethrough@2.0.0:
+ resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==}
+
+ mdast-util-gfm-table@2.0.0:
+ resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==}
+
+ mdast-util-gfm-task-list-item@2.0.0:
+ resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==}
+
+ mdast-util-gfm@3.1.0:
+ resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==}
+
+ mdast-util-mdx-expression@2.0.1:
+ resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==}
+
+ mdast-util-mdx-jsx@3.2.0:
+ resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==}
+
+ mdast-util-mdx@3.0.0:
+ resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==}
+
+ mdast-util-mdxjs-esm@2.0.1:
+ resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==}
+
+ mdast-util-phrasing@4.1.0:
+ resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==}
+
+ mdast-util-to-hast@13.2.1:
+ resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==}
+
+ mdast-util-to-markdown@2.1.2:
+ resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==}
+
+ mdast-util-to-string@4.0.0:
+ resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==}
+
+ mdn-data@2.0.28:
+ resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==}
+
+ mdn-data@2.27.1:
+ resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==}
+
media-typer@0.3.0:
resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
engines: {node: '>= 0.6'}
@@ -3469,6 +4330,114 @@ packages:
resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
engines: {node: '>= 0.6'}
+ micromark-core-commonmark@2.0.3:
+ resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==}
+
+ micromark-extension-directive@4.0.0:
+ resolution: {integrity: sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==}
+
+ micromark-extension-gfm-autolink-literal@2.1.0:
+ resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==}
+
+ micromark-extension-gfm-footnote@2.1.0:
+ resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==}
+
+ micromark-extension-gfm-strikethrough@2.1.0:
+ resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==}
+
+ micromark-extension-gfm-table@2.1.1:
+ resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==}
+
+ micromark-extension-gfm-tagfilter@2.0.0:
+ resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==}
+
+ micromark-extension-gfm-task-list-item@2.1.0:
+ resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==}
+
+ micromark-extension-gfm@3.0.0:
+ resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==}
+
+ micromark-extension-mdx-expression@3.0.1:
+ resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==}
+
+ micromark-extension-mdx-jsx@3.0.2:
+ resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==}
+
+ micromark-extension-mdx-md@2.0.0:
+ resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==}
+
+ micromark-extension-mdxjs-esm@3.0.0:
+ resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==}
+
+ micromark-extension-mdxjs@3.0.0:
+ resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==}
+
+ micromark-factory-destination@2.0.1:
+ resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==}
+
+ micromark-factory-label@2.0.1:
+ resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==}
+
+ micromark-factory-mdx-expression@2.0.3:
+ resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==}
+
+ micromark-factory-space@2.0.1:
+ resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==}
+
+ micromark-factory-title@2.0.1:
+ resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==}
+
+ micromark-factory-whitespace@2.0.1:
+ resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==}
+
+ micromark-util-character@2.1.1:
+ resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==}
+
+ micromark-util-chunked@2.0.1:
+ resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==}
+
+ micromark-util-classify-character@2.0.1:
+ resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==}
+
+ micromark-util-combine-extensions@2.0.1:
+ resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==}
+
+ micromark-util-decode-numeric-character-reference@2.0.2:
+ resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==}
+
+ micromark-util-decode-string@2.0.1:
+ resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==}
+
+ micromark-util-encode@2.0.1:
+ resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==}
+
+ micromark-util-events-to-acorn@2.0.3:
+ resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==}
+
+ micromark-util-html-tag-name@2.0.1:
+ resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==}
+
+ micromark-util-normalize-identifier@2.0.1:
+ resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==}
+
+ micromark-util-resolve-all@2.0.1:
+ resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==}
+
+ micromark-util-sanitize-uri@2.0.1:
+ resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==}
+
+ micromark-util-subtokenize@2.1.0:
+ resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==}
+
+ micromark-util-symbol@2.0.1:
+ resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==}
+
+ micromark-util-types@2.0.2:
+ resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==}
+
+ micromark@4.0.2:
+ resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==}
+
micromatch@4.0.8:
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
engines: {node: '>=8.6'}
@@ -3558,12 +4527,19 @@ packages:
resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
engines: {node: '>=4'}
+ mrmime@2.0.1:
+ resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==}
+ engines: {node: '>=10'}
+
ms@2.0.0:
resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+ muggle-string@0.4.1:
+ resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
+
multicast-dns@7.2.5:
resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==}
hasBin: true
@@ -3600,9 +4576,22 @@ packages:
neo-async@2.6.2:
resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
+ neotraverse@1.0.1:
+ resolution: {integrity: sha512-WmmLty1YWwJl9yZi77v2dVIV6X2kuYV8YYBI/G3LWGKdGHmHUvL1z7FW0iDvEvGAwNEoc5x1tOOOyDnf5jJw/w==}
+ engines: {node: '>= 10'}
+
+ nlcst-to-string@4.0.0:
+ resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==}
+
no-case@3.0.4:
resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
+ node-fetch-native@1.6.7:
+ resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==}
+
+ node-mock-http@1.0.5:
+ resolution: {integrity: sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw==}
+
node-releases@2.0.51:
resolution: {integrity: sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==}
engines: {node: '>=18'}
@@ -3637,6 +4626,12 @@ packages:
resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==}
engines: {node: '>=12.20.0'}
+ ofetch@1.5.1:
+ resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==}
+
+ ohash@2.0.12:
+ resolution: {integrity: sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==}
+
on-finished@2.4.1:
resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
engines: {node: '>= 0.8'}
@@ -3652,6 +4647,12 @@ packages:
resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
engines: {node: '>=6'}
+ oniguruma-parser@0.12.2:
+ resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==}
+
+ oniguruma-to-es@4.3.6:
+ resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==}
+
open@10.2.0:
resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==}
engines: {node: '>=18'}
@@ -3693,14 +4694,29 @@ packages:
resolution: {integrity: sha512-e8vJF4XdVkzqqSHguEMz41mQO1wKwxKm5ENrUJQUu9kLDCtn83cxbyHZcszr4QC5zEA7WffRRC4gsTecC7J9oA==}
engines: {node: '>=18'}
+ p-queue@9.3.3:
+ resolution: {integrity: sha512-NXAOdnEe5FsZJfT4oK84lE1Y5cFFdWlRuOo5tww8DyNMxyRXwn39fIkUtNLKppcPC+UYU/bXujNCUGDv01y7CA==}
+ engines: {node: '>=20'}
+
p-retry@6.2.1:
resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==}
engines: {node: '>=16.17'}
+ p-timeout@7.0.1:
+ resolution: {integrity: sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==}
+ engines: {node: '>=20'}
+
p-try@2.2.0:
resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
engines: {node: '>=6'}
+ package-manager-detector@1.8.0:
+ resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==}
+
+ pagefind@1.5.2:
+ resolution: {integrity: sha512-XTUaK0hXMCu2jszWE584JGQT7y284TmMV9l/HX3rnG5uo3rHI/uHU56XTyyyPFjeWEBxECbAi0CaFDJOONtG0Q==}
+ hasBin: true
+
param-case@3.0.4:
resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==}
@@ -3708,14 +4724,23 @@ packages:
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
engines: {node: '>=6'}
+ parse-entities@4.0.2:
+ resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==}
+
parse-json@5.2.0:
resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
engines: {node: '>=8'}
+ parse-latin@7.0.0:
+ resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==}
+
parse-passwd@1.0.0:
resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==}
engines: {node: '>=0.10.0'}
+ parse5@7.3.0:
+ resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==}
+
parseurl@1.3.3:
resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
engines: {node: '>= 0.8'}
@@ -3723,6 +4748,9 @@ packages:
pascal-case@3.1.2:
resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==}
+ path-browserify@1.0.1:
+ resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
+
path-exists@4.0.0:
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
engines: {node: '>=8'}
@@ -3748,6 +4776,9 @@ packages:
pathe@2.0.3:
resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+ piccolore@0.1.3:
+ resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==}
+
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
@@ -3771,6 +4802,16 @@ packages:
resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
engines: {node: '>= 0.4'}
+ postcss-nested@6.2.0:
+ resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==}
+ engines: {node: '>=12.0'}
+ peerDependencies:
+ postcss: ^8.2.14
+
+ postcss-selector-parser@6.1.4:
+ resolution: {integrity: sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==}
+ engines: {node: '>=4'}
+
postcss@8.5.20:
resolution: {integrity: sha512-lW616l85ucIQL+FocMmL7pQFPqBmwejrCMg+iPxyImlrANNJG9NHq/RkyCZopDhd8C3LA03PHRJDjkbGu8vvug==}
engines: {node: ^10 || ^12 || >=14}
@@ -3787,6 +4828,11 @@ packages:
resolution: {integrity: sha512-E6rsNU1QNJgB3sjj7OANinGncFKuK+164sLXw1/CqBjj/EkXSoSdHCtWQGBNlREIGLnL7IEUEGa08YFVUbrhVg==}
engines: {node: '>=16'}
+ prettier@3.9.6:
+ resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==}
+ engines: {node: '>=14'}
+ hasBin: true
+
pretty-error@4.0.0:
resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==}
@@ -3794,9 +4840,20 @@ packages:
resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+ prismjs@1.30.0:
+ resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==}
+ engines: {node: '>=6'}
+
+ process-ancestry@0.1.0:
+ resolution: {integrity: sha512-tGqJW/UnclpYASFcM6Xh8D8l/BMtaQ9+CSG0vlJSJTcdMM4lDRv4c6H0Pdcsfted+bVczdYSfk2fdukg2gQkZg==}
+ engines: {node: '>=18.0.0'}
+
process-nextick-args@2.0.1:
resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
+ property-information@7.2.0:
+ resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==}
+
proxy-addr@2.0.7:
resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
engines: {node: '>= 0.10'}
@@ -3815,6 +4872,9 @@ packages:
queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+ radix3@1.1.2:
+ resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==}
+
range-parser@1.2.1:
resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
engines: {node: '>= 0.6'}
@@ -3870,6 +4930,20 @@ packages:
resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==}
engines: {node: '>= 10.13.0'}
+ recma-build-jsx@1.0.0:
+ resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==}
+
+ recma-jsx@1.0.1:
+ resolution: {integrity: sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+ recma-parse@1.0.0:
+ resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==}
+
+ recma-stringify@1.0.0:
+ resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==}
+
redent@3.0.0:
resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
engines: {node: '>=8'}
@@ -3877,17 +4951,81 @@ packages:
reflect-metadata@0.2.2:
resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==}
+ regex-recursion@6.0.2:
+ resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==}
+
+ regex-utilities@2.3.0:
+ resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==}
+
+ regex@6.1.0:
+ resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==}
+
regexp.prototype.flags@1.5.4:
resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
engines: {node: '>= 0.4'}
+ rehype-expressive-code@0.44.2:
+ resolution: {integrity: sha512-jvjQpsfWKBquDrEl5YQA3CJybRRIuDOYsui1BJTs5oKDUK8pPkJSSxY8FjxNlIFIdtgrTjC1zuahuY4Cc1j9SQ==}
+
+ rehype-format@5.0.1:
+ resolution: {integrity: sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==}
+
+ rehype-minify-whitespace@6.0.2:
+ resolution: {integrity: sha512-Zk0pyQ06A3Lyxhe9vGtOtzz3Z0+qZ5+7icZ/PL/2x1SHPbKao5oB/g/rlc6BCTajqBb33JcOe71Ye1oFsuYbnw==}
+
+ 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-remark@10.0.1:
+ resolution: {integrity: sha512-EmDndlb5NVwXGfUa4c9GPK+lXeItTilLhE6ADSaQuHr4JUlKw9MidzGzx4HpqZrNCt6vnHmEifXQiiA+CEnjYQ==}
+
+ rehype-stringify@10.0.1:
+ resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==}
+
+ rehype@13.0.2:
+ resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==}
+
relateurl@0.2.7:
resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==}
engines: {node: '>= 0.10'}
+ remark-directive@4.0.0:
+ resolution: {integrity: sha512-7sxn4RfF1o3izevPV1DheyGDD6X4c9hrGpfdUpm7uC++dqrnJxIZVkk7CoKqcLm0VUMAuOol7Mno3m6g8cfMuA==}
+
+ remark-gfm@4.0.1:
+ resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==}
+
+ remark-mdx@3.1.1:
+ resolution: {integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==}
+
+ remark-parse@11.0.0:
+ resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==}
+
+ remark-rehype@11.1.2:
+ resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==}
+
+ remark-smartypants@3.0.3:
+ resolution: {integrity: sha512-gCaK+ndZ0hYezlqFegHFCVh2CQemsi0Npdh1qVM9bxlUFknjkbP6VmojWhddOCrbK0PbbacmYLWfTULRiT1eWA==}
+ engines: {node: '>=16.0.0'}
+
+ remark-stringify@11.0.0:
+ resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==}
+
renderkid@3.0.0:
resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==}
+ request-light@0.5.8:
+ resolution: {integrity: sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==}
+
+ request-light@0.7.0:
+ resolution: {integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==}
+
require-from-string@2.0.2:
resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
engines: {node: '>=0.10.0'}
@@ -3911,6 +5049,9 @@ packages:
resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
engines: {node: '>=8'}
+ resolve-pkg-maps@1.0.0:
+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+
resolve@1.22.12:
resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==}
engines: {node: '>= 0.4'}
@@ -3920,6 +5061,18 @@ packages:
resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
engines: {node: '>=8'}
+ 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==}
+
retry@0.13.1:
resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==}
engines: {node: '>= 4'}
@@ -3964,6 +5117,16 @@ packages:
safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+ satteri@0.10.5:
+ resolution: {integrity: sha512-Ao1LKpAEa9Wdg0otgbVKViZHEq9ebdXe4DMrp3s9vQAU0HNIuHnFEuMuOcm0ZIXyV0Yzxj91NvhLpvXZJO/5ZQ==}
+
+ satteri@0.9.5:
+ resolution: {integrity: sha512-ZuWVl+vnM64y+/TtX8Kosv2c00W+hLQiiwnEL6H0UKVVrxFqMw4D2CJHHQaouVd89OAhtBBfjWLqhKi3TVUV4w==}
+
+ sax@1.6.1:
+ resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==}
+ engines: {node: '>=11.0.0'}
+
scheduler@0.27.0:
resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
@@ -4022,6 +5185,15 @@ packages:
'@types/node':
optional: true
+ sharp@0.35.4:
+ resolution: {integrity: sha512-n++8XWcj+jCOr2IOl7h8LbKnGBDY4aPbmprMONBNFdn0ImXqpGVv5zliDs0V9HbmbCQLpbuo2ej9rAoOQTvMDA==}
+ engines: {node: '>=20.9.0'}
+ peerDependencies:
+ '@types/node': '*'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
shebang-command@2.0.0:
resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
engines: {node: '>=8'}
@@ -4034,6 +5206,10 @@ packages:
resolution: {integrity: sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==}
engines: {node: '>= 0.4'}
+ shiki@4.4.3:
+ resolution: {integrity: sha512-Mb/GvXPHBAXdgGIcnfU5L3ldpn1XcxrGkPHwqgRx17/I2XRfqlFKk2vGkHWINn1kdXvzJZeuO3is6I9KLPFm0g==}
+ engines: {node: '>=20'}
+
side-channel-list@1.0.1:
resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==}
engines: {node: '>= 0.4'}
@@ -4064,6 +5240,14 @@ packages:
resolution: {integrity: sha512-WszCLXwT4h2k1ufIXAgsbiTOazqqevFCIncOuUBZJ91DdvWcC5+OFkluWRQPrcuSYd8fjq+o2y1QfWqYMoAToQ==}
hasBin: true
+ sisteransi@1.0.5:
+ resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
+
+ sitemap@9.0.1:
+ resolution: {integrity: sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ==}
+ engines: {node: '>=20.19.5', npm: '>=10.8.2'}
+ hasBin: true
+
size-limit@13.0.3:
resolution: {integrity: sha512-KVb2aNEU49BwTR21SVjD+2QHP9gBV/nWsTHzNB/heRwXtHyA7lLQiDZDQ1TiNh/B/TZXKAZrHYyTt+cvBUrzYw==}
engines: {node: ^22.18.0 || ^24.0.0 || >=26.0.0}
@@ -4073,6 +5257,10 @@ packages:
resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==}
engines: {node: '>=14.16'}
+ smol-toml@1.8.0:
+ resolution: {integrity: sha512-kCZr2V3ch9i00x8zXRhjUNVcjG9ijES5dDudkXvUVCT5QlJNQWElSJdZqyPemffHoLNUYwOcou0Fy+ojN0uHSQ==}
+ engines: {node: '>= 18'}
+
sockjs@0.3.24:
resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==}
@@ -4091,6 +5279,13 @@ packages:
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
engines: {node: '>=0.10.0'}
+ source-map@0.7.6:
+ resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==}
+ engines: {node: '>= 12'}
+
+ space-separated-tokens@2.0.2:
+ resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
+
spdy-transport@3.0.0:
resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==}
@@ -4101,6 +5296,12 @@ packages:
stackback@0.0.2:
resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
+ starlight-llms-txt@0.11.0:
+ resolution: {integrity: sha512-83TU5zPgJhL9fXIWAOWjQjyQ6EKocshEjJyA4zOJjOqu/oxQsrTpYGYxjHLyfZe4LRD52N9eCuykSkaIYwUyDw==}
+ peerDependencies:
+ '@astrojs/starlight': '>=0.41.0'
+ astro: ^7.0.0
+
statuses@1.5.0:
resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==}
engines: {node: '>= 0.6'}
@@ -4130,6 +5331,9 @@ packages:
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'}
@@ -4157,6 +5361,12 @@ packages:
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
engines: {node: '>=8'}
+ style-to-js@1.1.21:
+ resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==}
+
+ style-to-object@1.0.14:
+ resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==}
+
supports-color@5.5.0:
resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
engines: {node: '>=4'}
@@ -4191,6 +5401,11 @@ packages:
resolution: {integrity: sha512-PY8LOw7xP6c8IOiVqdo0sbbZVYhXRSfklOQLAUyGBKqjTX0wx/z4l/9J+PmBpmlLnxzEb1NqltxQ5/wZme/Cmg==}
engines: {node: '>=18'}
+ svgo@4.1.0:
+ resolution: {integrity: sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q==}
+ engines: {node: '>=16'}
+ hasBin: true
+
swc-loader@0.2.7:
resolution: {integrity: sha512-nwYWw3Fh9ame3Rtm7StS9SBLpHRRnYcK7bnpF3UKZmesAK0gw2/ADvlURFAINmPvKtDLzp+GBiP9yLoEjg6S9w==}
peerDependencies:
@@ -4218,9 +5433,16 @@ packages:
thunky@1.1.0:
resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==}
+ tiny-inflate@1.0.3:
+ resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==}
+
tinybench@2.9.0:
resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
+ tinyclip@0.1.15:
+ resolution: {integrity: sha512-uo33abH+Ays0xYaDysoBt494Hb3hsEczMpcC0MwFl773pazORx4fmvKhclhR1wonUbB6vvpRsvVMwnhfqeMc+A==}
+ engines: {node: ^16.14.0 || >= 17.3.0}
+
tinyexec@1.2.4:
resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==}
engines: {node: '>=18'}
@@ -4247,6 +5469,15 @@ packages:
peerDependencies:
tslib: '2'
+ trim-lines@3.0.1:
+ resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
+
+ trim-trailing-lines@2.1.0:
+ resolution: {integrity: sha512-5UR5Biq4VlVOtzqkm2AZlgvSlDJtME46uV0br0gENbwN4l5+mMKT4b9gJKqWtuL2zAIqajGJGuvbCbcAJUZqBg==}
+
+ trough@2.2.0:
+ resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
+
tslib@1.14.1:
resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
@@ -4265,26 +5496,89 @@ packages:
resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
engines: {node: '>= 0.6'}
+ typesafe-path@0.2.2:
+ resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==}
+
+ typescript-auto-import-cache@0.3.6:
+ resolution: {integrity: sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==}
+
typescript@5.9.3:
resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
engines: {node: '>=14.17'}
hasBin: true
- typescript@7.0.2:
- resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==}
+ typescript@6.0.3:
+ resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ typescript@7.0.2:
+ resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==}
engines: {node: '>=16.20.0'}
hasBin: true
+ ufo@1.6.4:
+ resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==}
+
+ ultrahtml@1.7.0:
+ resolution: {integrity: sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==}
+
+ uncrypto@0.1.3:
+ resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==}
+
undici-types@6.21.0:
resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
undici-types@7.18.2:
resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==}
+ undici@8.10.1:
+ resolution: {integrity: sha512-YQ3WlbqjYMmNpdvDH64jAgLjxuAR9+649calDWhbshYaeQGO2bR4nI94ORJmwI3J9YhoKQnpyGOK+0zlWS5N5Q==}
+ engines: {node: '>=22.19.0'}
+
unicorn-magic@0.3.0:
resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==}
engines: {node: '>=18'}
+ unified@11.0.5:
+ resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
+
+ unifont@0.7.5:
+ resolution: {integrity: sha512-ULe/Cs+ZIsq+dcFofNkhqielCrUJnb5mr+Yc4EBM2VlL+6OZR6+cjtI2mT1bJvRBrVncqHAbLURxmPLcCXzWMg==}
+
+ unist-util-find-after@5.0.0:
+ resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==}
+
+ unist-util-is@6.0.1:
+ resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==}
+
+ unist-util-modify-children@4.0.0:
+ resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==}
+
+ unist-util-position-from-estree@2.0.0:
+ resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==}
+
+ unist-util-position@5.0.0:
+ resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==}
+
+ unist-util-remove-position@5.0.0:
+ resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==}
+
+ unist-util-remove@4.0.0:
+ resolution: {integrity: sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==}
+
+ 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.2:
+ resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==}
+
+ unist-util-visit@5.1.0:
+ resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==}
+
universalify@2.0.1:
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
engines: {node: '>= 10.0.0'}
@@ -4293,12 +5587,78 @@ packages:
resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
engines: {node: '>= 0.8'}
+ unstorage@1.17.5:
+ resolution: {integrity: sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==}
+ peerDependencies:
+ '@azure/app-configuration': ^1.8.0
+ '@azure/cosmos': ^4.2.0
+ '@azure/data-tables': ^13.3.0
+ '@azure/identity': ^4.6.0
+ '@azure/keyvault-secrets': ^4.9.0
+ '@azure/storage-blob': ^12.26.0
+ '@capacitor/preferences': ^6 || ^7 || ^8
+ '@deno/kv': '>=0.9.0'
+ '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0
+ '@planetscale/database': ^1.19.0
+ '@upstash/redis': ^1.34.3
+ '@vercel/blob': '>=0.27.1'
+ '@vercel/functions': ^2.2.12 || ^3.0.0
+ '@vercel/kv': ^1 || ^2 || ^3
+ aws4fetch: ^1.0.20
+ db0: '>=0.2.1'
+ idb-keyval: ^6.2.1
+ ioredis: ^5.4.2
+ uploadthing: ^7.4.4
+ peerDependenciesMeta:
+ '@azure/app-configuration':
+ optional: true
+ '@azure/cosmos':
+ optional: true
+ '@azure/data-tables':
+ optional: true
+ '@azure/identity':
+ optional: true
+ '@azure/keyvault-secrets':
+ optional: true
+ '@azure/storage-blob':
+ optional: true
+ '@capacitor/preferences':
+ optional: true
+ '@deno/kv':
+ optional: true
+ '@netlify/blobs':
+ optional: true
+ '@planetscale/database':
+ optional: true
+ '@upstash/redis':
+ optional: true
+ '@vercel/blob':
+ optional: true
+ '@vercel/functions':
+ optional: true
+ '@vercel/kv':
+ optional: true
+ aws4fetch:
+ optional: true
+ db0:
+ optional: true
+ idb-keyval:
+ optional: true
+ ioredis:
+ optional: true
+ uploadthing:
+ optional: true
+
update-browserslist-db@1.2.3:
resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==}
hasBin: true
peerDependencies:
browserslist: '>= 4.21.0'
+ url-extras@0.1.0:
+ resolution: {integrity: sha512-8tzwTeXFPuX/5PHuCDQE5Dd9Ts4rwoq2t9aIT+HS4iAVpmj5l4Ao7Q+BuuFjvWRqrLswBhQDk8O96ZicgCqQqw==}
+ engines: {node: '>=20'}
+
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
@@ -4318,6 +5678,15 @@ packages:
resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
engines: {node: '>= 0.8'}
+ vfile-location@5.0.3:
+ resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==}
+
+ vfile-message@4.0.3:
+ resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==}
+
+ vfile@6.0.3:
+ resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
+
vite@8.1.5:
resolution: {integrity: sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -4410,6 +5779,108 @@ packages:
jsdom:
optional: true
+ volar-service-css@0.0.71:
+ resolution: {integrity: sha512-wRRFt9BpjMKCazcgOh67MSjUjiWUCAh99DyYSDIOTuxaRjEtDC7PpB0k1Y1wbJIW/pVtMUSVbpPo3UGSm0Byxw==}
+ peerDependencies:
+ '@volar/language-service': ~2.4.0
+ peerDependenciesMeta:
+ '@volar/language-service':
+ optional: true
+
+ volar-service-emmet@0.0.71:
+ resolution: {integrity: sha512-zqjzt6bN95e3CUstBm0PBFAJnrfz0ZAARka87fart46/gNCLLuP3Vujy8V/J8HEziTFLnfkgIASLFYPUhonJcA==}
+ peerDependencies:
+ '@volar/language-service': ~2.4.0
+ peerDependenciesMeta:
+ '@volar/language-service':
+ optional: true
+
+ volar-service-html@0.0.71:
+ resolution: {integrity: sha512-e8tHPhgQ7ooLfudAEIku+kgd9pWkq3SSz8RbnQDI1+Eb8wbenkLGHqoirLqz5ORLV6wIMr2Iv08RWBG5eOcgpw==}
+ peerDependencies:
+ '@volar/language-service': ~2.4.0
+ peerDependenciesMeta:
+ '@volar/language-service':
+ optional: true
+
+ volar-service-prettier@0.0.71:
+ resolution: {integrity: sha512-Rz7JVH3qD108UCdmIEiZvOBNljMt2nLFdbN8AXcDfn7xD9F5I2aCIsDVqBbXw21PsnxG0b7MfwtNF+zPS/NKUg==}
+ peerDependencies:
+ '@volar/language-service': ~2.4.0
+ prettier: ^2.2 || ^3.0
+ peerDependenciesMeta:
+ '@volar/language-service':
+ optional: true
+ prettier:
+ optional: true
+
+ volar-service-typescript-twoslash-queries@0.0.71:
+ resolution: {integrity: sha512-9K2k72s4n7rV9s4bX0MyjbX9iBribvKZbBJKuEmTCZfeWJXs6Yh7bGpY4eoc7UufAjvpheBqwyZCOIPBvxCv0A==}
+ peerDependencies:
+ '@volar/language-service': ~2.4.0
+ peerDependenciesMeta:
+ '@volar/language-service':
+ optional: true
+
+ volar-service-typescript@0.0.71:
+ resolution: {integrity: sha512-yTtM/BVT6hoyEYnDtaCyAtNhdNeS/mhTTABlBOdw3NNiRBUin3IznFJpgfjer4c6RYopiPjjQjc9VFhxVl1mLw==}
+ peerDependencies:
+ '@volar/language-service': ~2.4.0
+ peerDependenciesMeta:
+ '@volar/language-service':
+ optional: true
+
+ volar-service-yaml@0.0.71:
+ resolution: {integrity: sha512-qYGWGuVpUTnZGu5P/CR4KLK4aIR8RrcVnmfZ2eRcj9q/I8VZCoC5yy9FtEvfNvnDp4MU17yhdJcvpQPIqhJS2Q==}
+ peerDependencies:
+ '@volar/language-service': ~2.4.0
+ peerDependenciesMeta:
+ '@volar/language-service':
+ optional: true
+
+ vscode-css-languageservice@6.3.10:
+ resolution: {integrity: sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA==}
+
+ vscode-html-languageservice@5.6.2:
+ resolution: {integrity: sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg==}
+
+ vscode-json-languageservice@4.1.8:
+ resolution: {integrity: sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==}
+ engines: {npm: '>=7.0.0'}
+
+ vscode-jsonrpc@8.2.0:
+ resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==}
+ engines: {node: '>=14.0.0'}
+
+ vscode-jsonrpc@9.0.2:
+ resolution: {integrity: sha512-SbQSV9yRemARxeXw6LU5sS6Zq0e9/DgCCX5yelH263ZQWukbTk8EF8fjTrr1dziasf4GwlJbvTwFnTrnQFWZXQ==}
+ engines: {node: '>=14.0.0'}
+
+ vscode-languageserver-protocol@3.17.5:
+ resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==}
+
+ vscode-languageserver-protocol@3.18.3:
+ resolution: {integrity: sha512-DF49+WeV5py4zO5hhobp60jjsDSK0lAqA0OuKBLBvp423HPWQcCbhZz3JgyfIewsEz2f8U+X75xNIFHdiXZm2w==}
+
+ vscode-languageserver-textdocument@1.0.14:
+ resolution: {integrity: sha512-EQyqJMi552E4ZTf46izQ4Fj6XquqxCySR3J5ZSD1SisMf6RfpeOWHxGBE8Gr6V0/3GHIGdAzDn8F8+1nTGCnoQ==}
+
+ vscode-languageserver-types@3.17.5:
+ resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==}
+
+ vscode-languageserver-types@3.18.3:
+ resolution: {integrity: sha512-XIlzJ7Qp/jzSI1ds7/FwPAWrPeTZA7pAtlW4hdJ1J6xXWJL6dR9QYnDhJOdLzdKhUQ5Mm6mvUMw+3DcOQQasPw==}
+
+ vscode-languageserver@9.0.1:
+ resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==}
+ hasBin: true
+
+ vscode-nls@5.2.0:
+ resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==}
+
+ vscode-uri@3.2.0:
+ resolution: {integrity: sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==}
+
watchpack@2.5.2:
resolution: {integrity: sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==}
engines: {node: '>=10.13.0'}
@@ -4420,6 +5891,9 @@ packages:
wcwidth@1.0.1:
resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
+ web-namespaces@2.0.1:
+ resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
+
webpack-cli@6.0.1:
resolution: {integrity: sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==}
engines: {node: '>=18.12.0'}
@@ -4554,10 +6028,27 @@ packages:
resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==}
engines: {node: '>=18'}
+ xxhash-wasm@1.1.0:
+ resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==}
+
y18n@5.0.8:
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
engines: {node: '>=10'}
+ yaml-language-server@1.23.0:
+ resolution: {integrity: sha512-3qVyCOexLCWw06PQa5kRPwvMWMZ/eZeCRWUvgD6a0OkqL/4iCnxy2WumbWifa937Uo5xhyWJ0uxlU39ljhNh7A==}
+ hasBin: true
+
+ yaml@2.8.3:
+ resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==}
+ engines: {node: '>= 14.6'}
+ hasBin: true
+
+ yaml@2.9.0:
+ resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==}
+ engines: {node: '>= 14.6'}
+ hasBin: true
+
yargs-parser@22.0.0:
resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==}
engines: {node: ^20.19.0 || ^22.12.0 || >=23}
@@ -4573,10 +6064,273 @@ packages:
zimmerframe@1.1.4:
resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==}
+ zod@4.5.4:
+ resolution: {integrity: sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA==}
+
+ zwitch@2.0.4:
+ resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
+
snapshots:
'@adobe/css-tools@4.5.0': {}
+ '@astrojs/check@0.9.10(prettier@3.9.6)(typescript@6.0.3)':
+ dependencies:
+ '@astrojs/language-server': 2.16.16(prettier@3.9.6)(typescript@6.0.3)
+ chokidar: 4.0.3
+ kleur: 4.1.5
+ typescript: 6.0.3
+ yargs: 18.0.0
+ transitivePeerDependencies:
+ - prettier
+ - prettier-plugin-astro
+
+ '@astrojs/compiler-binding-darwin-arm64@0.4.0':
+ optional: true
+
+ '@astrojs/compiler-binding-darwin-x64@0.4.0':
+ optional: true
+
+ '@astrojs/compiler-binding-linux-arm64-gnu@0.4.0':
+ optional: true
+
+ '@astrojs/compiler-binding-linux-arm64-musl@0.4.0':
+ optional: true
+
+ '@astrojs/compiler-binding-linux-x64-gnu@0.4.0':
+ optional: true
+
+ '@astrojs/compiler-binding-linux-x64-musl@0.4.0':
+ optional: true
+
+ '@astrojs/compiler-binding-wasm32-wasi@0.4.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)':
+ dependencies:
+ '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)
+ transitivePeerDependencies:
+ - '@emnapi/core'
+ - '@emnapi/runtime'
+ optional: true
+
+ '@astrojs/compiler-binding-win32-arm64-msvc@0.4.0':
+ optional: true
+
+ '@astrojs/compiler-binding-win32-x64-msvc@0.4.0':
+ optional: true
+
+ '@astrojs/compiler-binding@0.4.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)':
+ optionalDependencies:
+ '@astrojs/compiler-binding-darwin-arm64': 0.4.0
+ '@astrojs/compiler-binding-darwin-x64': 0.4.0
+ '@astrojs/compiler-binding-linux-arm64-gnu': 0.4.0
+ '@astrojs/compiler-binding-linux-arm64-musl': 0.4.0
+ '@astrojs/compiler-binding-linux-x64-gnu': 0.4.0
+ '@astrojs/compiler-binding-linux-x64-musl': 0.4.0
+ '@astrojs/compiler-binding-wasm32-wasi': 0.4.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)
+ '@astrojs/compiler-binding-win32-arm64-msvc': 0.4.0
+ '@astrojs/compiler-binding-win32-x64-msvc': 0.4.0
+ transitivePeerDependencies:
+ - '@emnapi/core'
+ - '@emnapi/runtime'
+
+ '@astrojs/compiler-rs@0.4.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)':
+ dependencies:
+ '@astrojs/compiler-binding': 0.4.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)
+ transitivePeerDependencies:
+ - '@emnapi/core'
+ - '@emnapi/runtime'
+
+ '@astrojs/compiler@2.13.1': {}
+
+ '@astrojs/internal-helpers@0.10.4':
+ dependencies:
+ '@types/hast': 3.0.5
+ '@types/mdast': 4.0.4
+ js-yaml: 4.3.0
+ picomatch: 4.0.5
+ retext-smartypants: 6.2.0
+ shiki: 4.4.3
+ smol-toml: 1.8.0
+ unified: 11.0.5
+
+ '@astrojs/internal-helpers@0.11.0':
+ dependencies:
+ '@types/hast': 3.0.5
+ '@types/mdast': 4.0.4
+ js-yaml: 4.3.0
+ picomatch: 4.0.5
+ retext-smartypants: 6.2.0
+ shiki: 4.4.3
+ smol-toml: 1.8.0
+ unified: 11.0.5
+
+ '@astrojs/language-server@2.16.16(prettier@3.9.6)(typescript@6.0.3)':
+ dependencies:
+ '@astrojs/compiler': 2.13.1
+ '@astrojs/yaml2ts': 0.2.4
+ '@jridgewell/sourcemap-codec': 1.5.5
+ '@volar/kit': 2.4.28(typescript@6.0.3)
+ '@volar/language-core': 2.4.28
+ '@volar/language-server': 2.4.28
+ '@volar/language-service': 2.4.28
+ muggle-string: 0.4.1
+ tinyglobby: 0.2.17
+ volar-service-css: 0.0.71(@volar/language-service@2.4.28)
+ volar-service-emmet: 0.0.71(@volar/language-service@2.4.28)
+ volar-service-html: 0.0.71(@volar/language-service@2.4.28)
+ volar-service-prettier: 0.0.71(@volar/language-service@2.4.28)(prettier@3.9.6)
+ volar-service-typescript: 0.0.71(@volar/language-service@2.4.28)
+ volar-service-typescript-twoslash-queries: 0.0.71(@volar/language-service@2.4.28)
+ volar-service-yaml: 0.0.71(@volar/language-service@2.4.28)
+ vscode-html-languageservice: 5.6.2
+ vscode-uri: 3.2.0
+ optionalDependencies:
+ prettier: 3.9.6
+ transitivePeerDependencies:
+ - typescript
+
+ '@astrojs/markdown-remark@7.2.4':
+ dependencies:
+ '@astrojs/internal-helpers': 0.10.4
+ '@astrojs/prism': 4.0.2
+ github-slugger: 2.0.0
+ hast-util-from-html: 2.0.3
+ hast-util-to-text: 4.0.2
+ mdast-util-definitions: 6.0.0
+ rehype-raw: 7.0.0
+ rehype-stringify: 10.0.1
+ remark-gfm: 4.0.1
+ remark-parse: 11.0.0
+ remark-rehype: 11.1.2
+ remark-smartypants: 3.0.3
+ unified: 11.0.5
+ unist-util-remove-position: 5.0.0
+ unist-util-visit: 5.1.0
+ unist-util-visit-parents: 6.0.2
+ vfile: 6.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@astrojs/markdown-remark@7.3.0':
+ dependencies:
+ '@astrojs/internal-helpers': 0.11.0
+ '@astrojs/prism': 4.0.2
+ '@mdx-js/mdx': 3.1.1
+ acorn: 8.17.0
+ estree-util-visit: 2.0.0
+ github-slugger: 2.0.0
+ hast-util-from-html: 2.0.3
+ hast-util-to-html: 9.0.5
+ hast-util-to-text: 4.0.2
+ mdast-util-definitions: 6.0.0
+ rehype-raw: 7.0.0
+ rehype-stringify: 10.0.1
+ remark-gfm: 4.0.1
+ remark-parse: 11.0.0
+ remark-rehype: 11.1.2
+ remark-smartypants: 3.0.3
+ source-map: 0.7.6
+ unified: 11.0.5
+ unist-util-remove-position: 5.0.0
+ unist-util-visit: 5.1.0
+ unist-util-visit-parents: 6.0.2
+ vfile: 6.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@astrojs/markdown-satteri@0.3.8':
+ dependencies:
+ '@astrojs/internal-helpers': 0.10.4
+ '@astrojs/prism': 4.0.2
+ github-slugger: 2.0.0
+ satteri: 0.10.5
+
+ '@astrojs/markdown-satteri@0.4.0':
+ dependencies:
+ '@astrojs/internal-helpers': 0.11.0
+ '@astrojs/prism': 4.0.2
+ github-slugger: 2.0.0
+ satteri: 0.10.5
+
+ '@astrojs/mdx@7.0.8(@astrojs/markdown-satteri@0.3.8)(astro@7.2.10(@astrojs/markdown-remark@7.3.0)(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@types/node@24.13.3)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0))':
+ dependencies:
+ '@astrojs/internal-helpers': 0.10.4
+ '@astrojs/markdown-remark': 7.2.4
+ '@mdx-js/mdx': 3.1.1
+ acorn: 8.17.0
+ astro: 7.2.10(@astrojs/markdown-remark@7.3.0)(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@types/node@24.13.3)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0)
+ es-module-lexer: 2.3.1
+ estree-util-visit: 2.0.0
+ hast-util-to-html: 9.0.5
+ piccolore: 0.1.3
+ rehype-raw: 7.0.0
+ remark-gfm: 4.0.1
+ remark-smartypants: 3.0.3
+ source-map: 0.7.6
+ unist-util-visit: 5.1.0
+ vfile: 6.0.3
+ optionalDependencies:
+ '@astrojs/markdown-satteri': 0.3.8
+ transitivePeerDependencies:
+ - supports-color
+
+ '@astrojs/prism@4.0.2':
+ dependencies:
+ prismjs: 1.30.0
+
+ '@astrojs/sitemap@3.7.4':
+ dependencies:
+ sitemap: 9.0.1
+ zod: 4.5.4
+
+ '@astrojs/starlight@0.41.11(@astrojs/markdown-remark@7.3.0)(astro@7.2.10(@astrojs/markdown-remark@7.3.0)(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@types/node@24.13.3)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0))(typescript@6.0.3)':
+ dependencies:
+ '@astrojs/markdown-satteri': 0.3.8
+ '@astrojs/mdx': 7.0.8(@astrojs/markdown-satteri@0.3.8)(astro@7.2.10(@astrojs/markdown-remark@7.3.0)(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@types/node@24.13.3)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0))
+ '@astrojs/sitemap': 3.7.4
+ '@pagefind/default-ui': 1.5.2
+ '@types/hast': 3.0.5
+ '@types/js-yaml': 4.0.9
+ '@types/mdast': 4.0.4
+ astro: 7.2.10(@astrojs/markdown-remark@7.3.0)(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@types/node@24.13.3)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0)
+ astro-expressive-code: 0.44.2(astro@7.2.10(@astrojs/markdown-remark@7.3.0)(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@types/node@24.13.3)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0))
+ bcp-47: 2.1.1
+ hast-util-from-html: 2.0.3
+ hast-util-select: 6.0.4
+ hast-util-to-string: 3.0.1
+ hastscript: 9.0.1
+ i18next: 26.4.1(typescript@6.0.3)
+ js-yaml: 4.3.0
+ klona: 2.0.6
+ magic-string: 0.30.21
+ mdast-util-directive: 3.1.0
+ mdast-util-to-markdown: 2.1.2
+ mdast-util-to-string: 4.0.0
+ pagefind: 1.5.2
+ rehype: 13.0.2
+ rehype-format: 5.0.1
+ remark-directive: 4.0.0
+ satteri: 0.9.5
+ ultrahtml: 1.7.0
+ unified: 11.0.5
+ unist-util-visit: 5.1.0
+ vfile: 6.0.3
+ optionalDependencies:
+ '@astrojs/markdown-remark': 7.3.0
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
+ '@astrojs/telemetry@3.3.3':
+ dependencies:
+ ci-info: 4.4.0
+ dset: 3.1.4
+ is-docker: 4.0.0
+ package-manager-detector: 1.8.0
+
+ '@astrojs/yaml2ts@0.2.4':
+ dependencies:
+ yaml: 2.9.0
+
'@babel/code-frame@7.29.7':
dependencies:
'@babel/helper-validator-identifier': 7.29.7
@@ -4600,6 +6354,53 @@ snapshots:
'@bcoe/v8-coverage@1.0.2': {}
+ '@bruits/satteri-darwin-arm64@0.9.5':
+ optional: true
+
+ '@bruits/satteri-darwin-x64@0.9.5':
+ optional: true
+
+ '@bruits/satteri-linux-arm64-gnu@0.9.5':
+ optional: true
+
+ '@bruits/satteri-linux-arm64-musl@0.9.5':
+ optional: true
+
+ '@bruits/satteri-linux-x64-gnu@0.9.5':
+ optional: true
+
+ '@bruits/satteri-linux-x64-musl@0.9.5':
+ optional: true
+
+ '@bruits/satteri-wasm32-wasi@0.9.5':
+ dependencies:
+ '@emnapi/core': 1.11.1
+ '@emnapi/runtime': 1.11.1
+ '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)
+ optional: true
+
+ '@bruits/satteri-win32-arm64-msvc@0.9.5':
+ optional: true
+
+ '@bruits/satteri-win32-x64-msvc@0.9.5':
+ optional: true
+
+ '@capsizecss/unpack@4.0.1':
+ dependencies:
+ fontkitten: 1.0.3
+
+ '@clack/core@1.4.3':
+ dependencies:
+ fast-wrap-ansi: 0.2.2
+ sisteransi: 1.0.5
+
+ '@clack/prompts@1.7.0':
+ dependencies:
+ '@clack/core': 1.4.3
+ fast-string-width: 3.0.2
+ fast-wrap-ansi: 0.2.2
+ sisteransi: 1.0.5
+
'@commitlint/cli@21.2.1(@types/node@24.13.3)(conventional-commits-parser@7.1.0)(typescript@7.0.2)':
dependencies:
'@commitlint/config-conventional': 21.2.0
@@ -4631,12 +6432,13 @@ snapshots:
'@commitlint/types': 21.2.0
ajv: 8.20.0
- '@commitlint/cz-commitlint@21.2.0(@types/node@24.13.3)(commitizen@4.3.2(@types/node@24.13.3)(typescript@7.0.2))(typescript@7.0.2)':
+ '@commitlint/cz-commitlint@21.2.0(@types/node@24.13.3)(commitizen@4.3.2(@types/node@24.13.3)(typescript@7.0.2))(inquirer@8.2.7(@types/node@24.13.3))(typescript@7.0.2)':
dependencies:
'@commitlint/ensure': 21.2.0
'@commitlint/load': 21.2.0(@types/node@24.13.3)(typescript@7.0.2)
'@commitlint/types': 21.2.0
commitizen: 4.3.2(@types/node@24.13.3)(typescript@7.0.2)
+ inquirer: 8.2.7(@types/node@24.13.3)
is-plain-obj: 4.1.0
picocolors: 1.1.1
word-wrap: 1.2.5
@@ -4737,8 +6539,33 @@ snapshots:
'@conventional-changelog/template@1.2.1': {}
+ '@ctrl/tinycolor@4.2.0': {}
+
'@discoveryjs/json-ext@0.6.3': {}
+ '@emmetio/abbreviation@2.3.3':
+ dependencies:
+ '@emmetio/scanner': 1.0.4
+
+ '@emmetio/css-abbreviation@2.1.8':
+ dependencies:
+ '@emmetio/scanner': 1.0.4
+
+ '@emmetio/css-parser@0.4.1':
+ dependencies:
+ '@emmetio/stream-reader': 2.2.0
+ '@emmetio/stream-reader-utils': 0.1.0
+
+ '@emmetio/html-matcher@1.3.0':
+ dependencies:
+ '@emmetio/scanner': 1.0.4
+
+ '@emmetio/scanner@1.0.4': {}
+
+ '@emmetio/stream-reader-utils@0.1.0': {}
+
+ '@emmetio/stream-reader@2.2.0': {}
+
'@emnapi/core@1.11.1':
dependencies:
'@emnapi/wasi-threads': 1.2.2
@@ -4848,6 +6675,31 @@ snapshots:
dependencies:
eslint-visitor-keys: 3.4.3
+ '@expressive-code/core@0.44.2':
+ dependencies:
+ '@ctrl/tinycolor': 4.2.0
+ hast-util-select: 6.0.4
+ hast-util-to-html: 9.0.5
+ hast-util-to-text: 4.0.2
+ hastscript: 9.0.1
+ postcss: 8.5.20
+ postcss-nested: 6.2.0(postcss@8.5.20)
+ unist-util-visit: 5.1.0
+ unist-util-visit-parents: 6.0.2
+
+ '@expressive-code/plugin-frames@0.44.2':
+ dependencies:
+ '@expressive-code/core': 0.44.2
+
+ '@expressive-code/plugin-shiki@0.44.2':
+ dependencies:
+ '@expressive-code/core': 0.44.2
+ shiki: 4.4.3
+
+ '@expressive-code/plugin-text-markers@0.44.2':
+ dependencies:
+ '@expressive-code/core': 0.44.2
+
'@gwhitney/detect-indent@7.0.1': {}
'@img/colour@1.1.0': {}
@@ -5117,6 +6969,36 @@ snapshots:
'@leichtgewicht/ip-codec@2.0.5': {}
+ '@mdx-js/mdx@3.1.1':
+ dependencies:
+ '@types/estree': 1.0.9
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.5
+ '@types/mdx': 2.0.14
+ acorn: 8.17.0
+ collapse-white-space: 2.1.0
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ estree-util-scope: 1.0.1
+ estree-walker: 3.0.3
+ hast-util-to-jsx-runtime: 2.3.6
+ markdown-extensions: 2.0.0
+ recma-build-jsx: 1.0.0
+ recma-jsx: 1.0.1(acorn@8.17.0)
+ recma-stringify: 1.0.0
+ rehype-recma: 1.0.0
+ remark-mdx: 3.1.1
+ remark-parse: 11.0.0
+ remark-rehype: 11.1.2
+ source-map: 0.7.6
+ unified: 11.0.5
+ unist-util-position-from-estree: 2.0.0
+ unist-util-stringify-position: 4.0.0
+ unist-util-visit: 5.1.0
+ vfile: 6.0.3
+ transitivePeerDependencies:
+ - supports-color
+
'@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)':
dependencies:
'@emnapi/core': 1.11.1
@@ -5131,6 +7013,13 @@ snapshots:
'@tybys/wasm-util': 0.10.3
optional: true
+ '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)':
+ dependencies:
+ '@emnapi/core': 1.11.2
+ '@emnapi/runtime': 1.11.2
+ '@tybys/wasm-util': 0.10.3
+ optional: true
+
'@noble/hashes@1.4.0': {}
'@nodelib/fs.scandir@2.1.5':
@@ -5145,6 +7034,8 @@ snapshots:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.20.1
+ '@oslojs/encoding@1.1.0': {}
+
'@oxc-project/types@0.139.0': {}
'@oxlint-tsgolint/darwin-arm64@7.0.2001':
@@ -5222,11 +7113,34 @@ snapshots:
'@oxlint/binding-win32-x64-msvc@1.74.0':
optional: true
- '@peculiar/asn1-cms@2.9.0':
- dependencies:
- '@peculiar/asn1-schema': 2.9.0
- '@peculiar/asn1-x509': 2.9.0
- '@peculiar/asn1-x509-attr': 2.9.0
+ '@pagefind/darwin-arm64@1.5.2':
+ optional: true
+
+ '@pagefind/darwin-x64@1.5.2':
+ optional: true
+
+ '@pagefind/default-ui@1.5.2': {}
+
+ '@pagefind/freebsd-x64@1.5.2':
+ optional: true
+
+ '@pagefind/linux-arm64@1.5.2':
+ optional: true
+
+ '@pagefind/linux-x64@1.5.2':
+ optional: true
+
+ '@pagefind/windows-arm64@1.5.2':
+ optional: true
+
+ '@pagefind/windows-x64@1.5.2':
+ optional: true
+
+ '@peculiar/asn1-cms@2.9.0':
+ dependencies:
+ '@peculiar/asn1-schema': 2.9.0
+ '@peculiar/asn1-x509': 2.9.0
+ '@peculiar/asn1-x509-attr': 2.9.0
asn1js: 3.0.10
tslib: 2.8.1
@@ -5484,6 +7398,46 @@ snapshots:
optionalDependencies:
selfsigned: 5.5.0
+ '@shikijs/core@4.4.3':
+ dependencies:
+ '@shikijs/primitive': 4.4.3
+ '@shikijs/types': 4.4.3
+ '@shikijs/vscode-textmate': 10.0.2
+ '@types/hast': 3.0.5
+ hast-util-to-html: 9.0.5
+
+ '@shikijs/engine-javascript@4.4.3':
+ dependencies:
+ '@shikijs/types': 4.4.3
+ '@shikijs/vscode-textmate': 10.0.2
+ oniguruma-to-es: 4.3.6
+
+ '@shikijs/engine-oniguruma@4.4.3':
+ dependencies:
+ '@shikijs/types': 4.4.3
+ '@shikijs/vscode-textmate': 10.0.2
+
+ '@shikijs/langs@4.4.3':
+ dependencies:
+ '@shikijs/types': 4.4.3
+
+ '@shikijs/primitive@4.4.3':
+ dependencies:
+ '@shikijs/types': 4.4.3
+ '@shikijs/vscode-textmate': 10.0.2
+ '@types/hast': 3.0.5
+
+ '@shikijs/themes@4.4.3':
+ dependencies:
+ '@shikijs/types': 4.4.3
+
+ '@shikijs/types@4.4.3':
+ dependencies:
+ '@shikijs/vscode-textmate': 10.0.2
+ '@types/hast': 3.0.5
+
+ '@shikijs/vscode-textmate@10.0.2': {}
+
'@simple-libs/child-process-utils@2.0.0':
dependencies:
'@simple-libs/stream-utils': 2.0.0
@@ -5535,22 +7489,22 @@ snapshots:
svelte2tsx: 0.7.59(svelte@5.56.8(@typescript-eslint/types@8.64.0))(typescript@5.9.3)
typescript: 5.9.3
- '@sveltejs/vite-plugin-svelte-inspector@5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.56.8(@typescript-eslint/types@8.64.0))(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)))(svelte@5.56.8(@typescript-eslint/types@8.64.0))(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0))':
+ '@sveltejs/vite-plugin-svelte-inspector@5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.56.8(@typescript-eslint/types@8.64.0))(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0)))(svelte@5.56.8(@typescript-eslint/types@8.64.0))(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0))':
dependencies:
- '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.56.8(@typescript-eslint/types@8.64.0))(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0))
+ '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.56.8(@typescript-eslint/types@8.64.0))(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0))
obug: 2.1.4
svelte: 5.56.8(@typescript-eslint/types@8.64.0)
- vite: 8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)
+ vite: 8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0)
- '@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.56.8(@typescript-eslint/types@8.64.0))(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0))':
+ '@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.56.8(@typescript-eslint/types@8.64.0))(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0))':
dependencies:
- '@sveltejs/vite-plugin-svelte-inspector': 5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.56.8(@typescript-eslint/types@8.64.0))(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)))(svelte@5.56.8(@typescript-eslint/types@8.64.0))(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0))
+ '@sveltejs/vite-plugin-svelte-inspector': 5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.56.8(@typescript-eslint/types@8.64.0))(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0)))(svelte@5.56.8(@typescript-eslint/types@8.64.0))(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0))
deepmerge: 4.3.1
magic-string: 0.30.21
obug: 2.1.4
svelte: 5.56.8(@typescript-eslint/types@8.64.0)
- vite: 8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)
- vitefu: 1.1.3(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0))
+ vite: 8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0)
+ vitefu: 1.1.3(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0))
'@swc/core-darwin-arm64@1.16.0':
optional: true
@@ -5663,14 +7617,14 @@ snapshots:
dependencies:
svelte: 5.56.8(@typescript-eslint/types@8.64.0)
- '@testing-library/svelte@5.4.2(svelte@5.56.8(@typescript-eslint/types@8.64.0))(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0))(vitest@4.1.10)':
+ '@testing-library/svelte@5.4.2(svelte@5.56.8(@typescript-eslint/types@8.64.0))(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0))(vitest@4.1.10)':
dependencies:
'@testing-library/dom': 10.4.1
'@testing-library/svelte-core': 1.1.3(svelte@5.56.8(@typescript-eslint/types@8.64.0))
svelte: 5.56.8(@typescript-eslint/types@8.64.0)
optionalDependencies:
- vite: 8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)
- vitest: 4.1.10(@types/node@24.13.3)(@vitest/coverage-v8@4.1.10)(happy-dom@20.11.1)(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0))
+ vite: 8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0)
+ vitest: 4.1.10(@types/node@24.13.3)(@vitest/coverage-v8@4.1.10)(happy-dom@20.11.1)(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0))
'@trigen/oxlint-config@10.1.2(oxlint-tsgolint@7.0.2001)(oxlint@1.74.0(oxlint-tsgolint@7.0.2001))':
dependencies:
@@ -5706,6 +7660,8 @@ snapshots:
dependencies:
'@types/node': 22.20.1
+ '@types/braces@3.0.5': {}
+
'@types/chai@5.2.3':
dependencies:
'@types/deep-eql': 4.0.2
@@ -5722,8 +7678,16 @@ snapshots:
'@types/css-mediaquery@0.1.4': {}
+ '@types/debug@4.1.13':
+ dependencies:
+ '@types/ms': 2.1.0
+
'@types/deep-eql@4.0.2': {}
+ '@types/estree-jsx@1.0.5':
+ dependencies:
+ '@types/estree': 1.0.9
+
'@types/estree@1.0.9': {}
'@types/express-serve-static-core@4.19.9':
@@ -5740,6 +7704,10 @@ snapshots:
'@types/qs': 6.15.1
'@types/serve-static': 1.15.10
+ '@types/hast@3.0.5':
+ dependencies:
+ '@types/unist': 3.0.3
+
'@types/html-minifier-terser@6.1.0': {}
'@types/http-errors@2.0.5': {}
@@ -5748,10 +7716,28 @@ snapshots:
dependencies:
'@types/node': 22.20.1
+ '@types/js-yaml@4.0.9': {}
+
'@types/json-schema@7.0.15': {}
+ '@types/mdast@4.0.4':
+ dependencies:
+ '@types/unist': 3.0.3
+
+ '@types/mdx@2.0.14': {}
+
+ '@types/micromatch@4.0.10':
+ dependencies:
+ '@types/braces': 3.0.5
+
'@types/mime@1.3.5': {}
+ '@types/ms@2.1.0': {}
+
+ '@types/nlcst@2.0.3':
+ dependencies:
+ '@types/unist': 3.0.3
+
'@types/node@22.20.1':
dependencies:
undici-types: 6.21.0
@@ -5776,6 +7762,10 @@ snapshots:
'@types/retry@0.12.2': {}
+ '@types/sax@1.2.7':
+ dependencies:
+ '@types/node': 24.13.3
+
'@types/send@0.17.6':
dependencies:
'@types/mime': 1.3.5
@@ -5801,11 +7791,15 @@ snapshots:
'@types/trusted-types@2.0.7': {}
+ '@types/unist@2.0.11': {}
+
+ '@types/unist@3.0.3': {}
+
'@types/whatwg-mimetype@3.0.2': {}
'@types/ws@8.18.1':
dependencies:
- '@types/node': 22.20.1
+ '@types/node': 24.13.3
'@typescript-eslint/types@8.64.0': {}
@@ -5869,10 +7863,12 @@ snapshots:
'@typescript/typescript-win32-x64@7.0.2':
optional: true
- '@vitejs/plugin-react@6.0.5(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0))':
+ '@ungap/structured-clone@1.4.0': {}
+
+ '@vitejs/plugin-react@6.0.5(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0))':
dependencies:
'@rolldown/pluginutils': 1.0.1
- vite: 8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)
+ vite: 8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0)
'@vitest/coverage-v8@4.1.10(vitest@4.1.10)':
dependencies:
@@ -5886,7 +7882,7 @@ snapshots:
obug: 2.1.4
std-env: 4.2.0
tinyrainbow: 3.1.0
- vitest: 4.1.10(@types/node@24.13.3)(@vitest/coverage-v8@4.1.10)(happy-dom@20.11.1)(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0))
+ vitest: 4.1.10(@types/node@24.13.3)(@vitest/coverage-v8@4.1.10)(happy-dom@20.11.1)(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0))
'@vitest/expect@4.1.10':
dependencies:
@@ -5897,13 +7893,13 @@ snapshots:
chai: 6.2.2
tinyrainbow: 3.1.0
- '@vitest/mocker@4.1.10(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0))':
+ '@vitest/mocker@4.1.10(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0))':
dependencies:
'@vitest/spy': 4.1.10
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
- vite: 8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)
+ vite: 8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0)
'@vitest/pretty-format@4.1.10':
dependencies:
@@ -5929,6 +7925,66 @@ snapshots:
convert-source-map: 2.0.0
tinyrainbow: 3.1.0
+ '@volar/kit@2.4.28(typescript@6.0.3)':
+ dependencies:
+ '@volar/language-service': 2.4.28
+ '@volar/typescript': 2.4.28
+ typesafe-path: 0.2.2
+ typescript: 6.0.3
+ vscode-languageserver-textdocument: 1.0.14
+ vscode-uri: 3.2.0
+
+ '@volar/language-core@2.4.28':
+ dependencies:
+ '@volar/source-map': 2.4.28
+
+ '@volar/language-server@2.4.28':
+ dependencies:
+ '@volar/language-core': 2.4.28
+ '@volar/language-service': 2.4.28
+ '@volar/typescript': 2.4.28
+ path-browserify: 1.0.1
+ request-light: 0.7.0
+ vscode-languageserver: 9.0.1
+ vscode-languageserver-protocol: 3.18.3
+ vscode-languageserver-textdocument: 1.0.14
+ vscode-uri: 3.2.0
+
+ '@volar/language-service@2.4.28':
+ dependencies:
+ '@volar/language-core': 2.4.28
+ vscode-languageserver-protocol: 3.18.3
+ vscode-languageserver-textdocument: 1.0.14
+ vscode-uri: 3.2.0
+
+ '@volar/source-map@2.4.28': {}
+
+ '@volar/typescript@2.4.28':
+ dependencies:
+ '@volar/language-core': 2.4.28
+ path-browserify: 1.0.1
+ vscode-uri: 3.2.0
+
+ '@vscode/emmet-helper@2.11.0':
+ dependencies:
+ emmet: 2.4.11
+ jsonc-parser: 2.3.1
+ vscode-languageserver-textdocument: 1.0.14
+ vscode-languageserver-types: 3.18.3
+ vscode-uri: 3.2.0
+
+ '@vscode/l10n@0.0.18': {}
+
+ '@vtbag/cam-shaft@1.0.6': {}
+
+ '@vtbag/element-crossing@1.1.0': {}
+
+ '@vtbag/inspection-chamber@1.0.24': {}
+
+ '@vtbag/turn-signal@1.3.1': {}
+
+ '@vtbag/utensil-drawer@1.2.18': {}
+
'@webassemblyjs/ast@1.14.1':
dependencies:
'@webassemblyjs/helper-numbers': 1.13.2
@@ -6020,7 +8076,7 @@ snapshots:
webpack: 5.108.4(@swc/core@1.16.0)(clean-css@5.3.3)(esbuild@0.28.1)(html-minifier-terser@6.1.0)(lightningcss@1.32.0)(postcss@8.5.20)(webpack-cli@6.0.1)
webpack-cli: 6.0.1(webpack-dev-server@5.2.6)(webpack@5.108.4)
optionalDependencies:
- webpack-dev-server: 5.2.6(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1)(webpack-cli@6.0.1)(webpack@5.108.4)
+ webpack-dev-server: 5.2.6(supports-color@8.1.1)(webpack-cli@6.0.1)(webpack@5.108.4)
'@xtuc/ieee754@1.2.0': {}
@@ -6041,10 +8097,18 @@ snapshots:
acorn@8.17.0: {}
+ ajv-draft-04@1.0.0(ajv@8.20.0):
+ optionalDependencies:
+ ajv: 8.20.0
+
ajv-formats@2.1.1:
dependencies:
ajv: 8.20.0
+ ajv-i18n@4.2.0(ajv@8.20.0):
+ dependencies:
+ ajv: 8.20.0
+
ajv-keywords@5.1.0(ajv@8.20.0):
dependencies:
ajv: 8.20.0
@@ -6057,6 +8121,10 @@ snapshots:
json-schema-traverse: 1.0.0
require-from-string: 2.0.2
+ am-i-vibing@0.4.0:
+ dependencies:
+ process-ancestry: 0.1.0
+
ansi-escapes@4.3.2:
dependencies:
type-fest: 0.21.3
@@ -6084,6 +8152,8 @@ snapshots:
normalize-path: 3.0.0
picomatch: 2.3.2
+ arg@5.0.2: {}
+
argparse@2.0.1: {}
argue-cli@3.1.0: {}
@@ -6109,6 +8179,8 @@ snapshots:
array-flatten@1.1.1: {}
+ array-iterate@2.0.1: {}
+
asn1js@3.0.10:
dependencies:
pvtsutils: 1.3.6
@@ -6123,6 +8195,114 @@ snapshots:
estree-walker: 3.0.3
js-tokens: 10.0.0
+ astring@1.9.0: {}
+
+ astro-expressive-code@0.44.2(astro@7.2.10(@astrojs/markdown-remark@7.3.0)(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@types/node@24.13.3)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0)):
+ dependencies:
+ astro: 7.2.10(@astrojs/markdown-remark@7.3.0)(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@types/node@24.13.3)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0)
+ rehype-expressive-code: 0.44.2
+ url-extras: 0.1.0
+
+ astro-vtbot@3.1.0:
+ dependencies:
+ '@vtbag/cam-shaft': 1.0.6
+ '@vtbag/element-crossing': 1.1.0
+ '@vtbag/inspection-chamber': 1.0.24
+ '@vtbag/turn-signal': 1.3.1
+ '@vtbag/utensil-drawer': 1.2.18
+
+ astro@7.2.10(@astrojs/markdown-remark@7.3.0)(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@types/node@24.13.3)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0):
+ dependencies:
+ '@astrojs/compiler-rs': 0.4.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)
+ '@astrojs/internal-helpers': 0.11.0
+ '@astrojs/markdown-satteri': 0.4.0
+ '@astrojs/telemetry': 3.3.3
+ '@capsizecss/unpack': 4.0.1
+ '@clack/prompts': 1.7.0
+ '@oslojs/encoding': 1.1.0
+ am-i-vibing: 0.4.0
+ aria-query: 5.3.2
+ axobject-query: 4.1.0
+ ci-info: 4.4.0
+ clsx: 2.1.1
+ common-ancestor-path: 2.0.0
+ cookie: 2.0.1
+ devalue: 5.9.0
+ diff: 9.0.0
+ dset: 3.1.4
+ es-module-lexer: 2.3.1
+ esbuild: 0.28.1
+ find-proc: 0.1.0
+ flattie: 1.1.1
+ fontace: 0.4.1
+ get-tsconfig: 5.0.0-beta.4
+ github-slugger: 2.0.0
+ html-escaper: 3.0.3
+ http-cache-semantics: 4.2.0
+ js-yaml: 4.3.0
+ jsonc-parser: 3.3.1
+ magic-string: 1.2.3
+ magicast: 0.5.3
+ mrmime: 2.0.1
+ neotraverse: 1.0.1
+ obug: 2.1.4
+ p-limit: 7.3.0
+ p-queue: 9.3.3
+ package-manager-detector: 1.8.0
+ piccolore: 0.1.3
+ picomatch: 4.0.5
+ semver: 7.8.5
+ shiki: 4.4.3
+ smol-toml: 1.8.0
+ svgo: 4.1.0
+ tinyclip: 0.1.15
+ tinyexec: 1.2.4
+ tinyglobby: 0.2.17
+ ultrahtml: 1.7.0
+ unifont: 0.7.5
+ unstorage: 1.17.5
+ vite: 8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0)
+ vitefu: 1.1.3(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0))
+ xxhash-wasm: 1.1.0
+ yargs-parser: 22.0.0
+ zod: 4.5.4
+ optionalDependencies:
+ '@astrojs/markdown-remark': 7.3.0
+ sharp: 0.35.4(@types/node@24.13.3)
+ transitivePeerDependencies:
+ - '@azure/app-configuration'
+ - '@azure/cosmos'
+ - '@azure/data-tables'
+ - '@azure/identity'
+ - '@azure/keyvault-secrets'
+ - '@azure/storage-blob'
+ - '@capacitor/preferences'
+ - '@deno/kv'
+ - '@emnapi/core'
+ - '@emnapi/runtime'
+ - '@netlify/blobs'
+ - '@planetscale/database'
+ - '@types/node'
+ - '@upstash/redis'
+ - '@vercel/blob'
+ - '@vercel/functions'
+ - '@vercel/kv'
+ - '@vitejs/devtools'
+ - aws4fetch
+ - db0
+ - idb-keyval
+ - ioredis
+ - jiti
+ - less
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - terser
+ - tsx
+ - uploadthing
+ - yaml
+
at-least-node@1.0.0: {}
available-typed-arrays@1.0.7:
@@ -6131,6 +8311,8 @@ snapshots:
axobject-query@4.1.0: {}
+ bail@2.0.2: {}
+
balanced-match@1.0.2: {}
base64-js@1.5.1: {}
@@ -6139,6 +8321,14 @@ snapshots:
batch@0.6.1: {}
+ bcp-47-match@2.0.3: {}
+
+ bcp-47@2.1.1:
+ dependencies:
+ is-alphabetical: 2.0.1
+ is-alphanumerical: 2.0.1
+ is-decimal: 2.0.1
+
binary-extensions@2.3.0: {}
bl@4.1.0:
@@ -6192,7 +8382,7 @@ snapshots:
buffer-image-size@0.6.4:
dependencies:
- '@types/node': 22.20.1
+ '@types/node': 24.13.3
buffer@5.7.1:
dependencies:
@@ -6237,6 +8427,8 @@ snapshots:
caniuse-lite@1.0.30001806: {}
+ ccount@2.0.1: {}
+
chai@6.2.2: {}
chalk@2.4.2:
@@ -6250,6 +8442,14 @@ snapshots:
ansi-styles: 4.3.0
supports-color: 7.2.0
+ character-entities-html4@2.1.0: {}
+
+ character-entities-legacy@3.0.0: {}
+
+ character-entities@2.0.2: {}
+
+ character-reference-invalid@2.0.1: {}
+
chardet@2.2.0: {}
chokidar@3.6.0:
@@ -6274,6 +8474,8 @@ snapshots:
chrome-trace-event@1.0.4: {}
+ ci-info@4.4.0: {}
+
clean-css@5.3.3:
dependencies:
source-map: 0.6.1
@@ -6309,6 +8511,8 @@ snapshots:
clsx@2.1.1: {}
+ collapse-white-space@2.1.0: {}
+
color-convert@1.9.3:
dependencies:
color-name: 1.1.3
@@ -6323,6 +8527,10 @@ snapshots:
colorette@2.0.20: {}
+ comma-separated-tokens@2.0.3: {}
+
+ commander@11.1.0: {}
+
commander@12.1.0: {}
commander@2.20.3: {}
@@ -6349,6 +8557,8 @@ snapshots:
- '@types/node'
- typescript
+ common-ancestor-path@2.0.0: {}
+
compressible@2.0.18:
dependencies:
mime-db: 1.54.0
@@ -6392,10 +8602,14 @@ snapshots:
convert-source-map@2.0.0: {}
+ cookie-es@1.2.3: {}
+
cookie-signature@1.0.7: {}
cookie@0.7.2: {}
+ cookie@2.0.1: {}
+
core-util-is@1.0.3: {}
cosmiconfig-typescript-loader@6.3.0(@types/node@24.13.3)(cosmiconfig@9.0.2(typescript@7.0.2))(typescript@7.0.2):
@@ -6420,6 +8634,10 @@ snapshots:
shebang-command: 2.0.0
which: 2.0.2
+ crossws@0.3.5:
+ dependencies:
+ uncrypto: 0.1.3
+
css-mediaquery@0.1.2: {}
css-select@4.3.0:
@@ -6430,10 +8648,38 @@ snapshots:
domutils: 2.8.0
nth-check: 2.1.1
+ css-select@6.0.0:
+ dependencies:
+ boolbase: 1.0.0
+ css-what: 7.0.0
+ domhandler: 5.0.3
+ domutils: 3.2.2
+ nth-check: 2.1.1
+
+ css-selector-parser@3.3.0: {}
+
+ css-tree@2.2.1:
+ dependencies:
+ mdn-data: 2.0.28
+ source-map-js: 1.2.1
+
+ css-tree@3.2.1:
+ dependencies:
+ mdn-data: 2.27.1
+ source-map-js: 1.2.1
+
css-what@6.2.2: {}
+ css-what@7.0.0: {}
+
css.escape@1.5.1: {}
+ cssesc@3.0.0: {}
+
+ csso@5.0.5:
+ dependencies:
+ css-tree: 2.2.1
+
csstype@3.2.3: {}
cz-conventional-changelog@3.3.0(@types/node@24.13.3)(typescript@7.0.2):
@@ -6462,6 +8708,10 @@ snapshots:
optionalDependencies:
supports-color: 8.1.1
+ decode-named-character-reference@1.3.0:
+ dependencies:
+ character-entities: 2.0.2
+
dedent-js@1.0.1: {}
dedent@0.7.0: {}
@@ -6514,6 +8764,8 @@ snapshots:
has-property-descriptors: 1.0.2
object-keys: 1.1.1
+ defu@6.1.7: {}
+
del-cli@7.0.0:
dependencies:
del: 8.0.1
@@ -6536,6 +8788,8 @@ snapshots:
dequal@2.0.3: {}
+ destr@2.0.5: {}
+
destroy@1.2.0: {}
detect-file@1.0.0: {}
@@ -6548,6 +8802,14 @@ snapshots:
devalue@5.9.0: {}
+ devlop@1.1.0:
+ dependencies:
+ dequal: 2.0.3
+
+ diff@9.0.0: {}
+
+ direction@2.0.1: {}
+
dns-packet@5.6.1:
dependencies:
'@leichtgewicht/ip-codec': 2.0.5
@@ -6566,23 +8828,41 @@ snapshots:
domhandler: 4.3.1
entities: 2.2.0
+ dom-serializer@2.0.0:
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ entities: 4.5.0
+
domelementtype@2.3.0: {}
domhandler@4.3.1:
dependencies:
domelementtype: 2.3.0
+ domhandler@5.0.3:
+ dependencies:
+ domelementtype: 2.3.0
+
domutils@2.8.0:
dependencies:
dom-serializer: 1.4.1
domelementtype: 2.3.0
domhandler: 4.3.1
+ domutils@3.2.2:
+ dependencies:
+ dom-serializer: 2.0.0
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+
dot-case@3.0.4:
dependencies:
no-case: 3.0.4
tslib: 2.8.1
+ dset@3.1.4: {}
+
dunder-proto@1.0.1:
dependencies:
call-bind-apply-helpers: 1.0.2
@@ -6593,6 +8873,11 @@ snapshots:
electron-to-chromium@1.5.393: {}
+ emmet@2.4.11:
+ dependencies:
+ '@emmetio/abbreviation': 2.3.3
+ '@emmetio/css-abbreviation': 2.1.8
+
emoji-regex@10.6.0: {}
emoji-regex@8.0.0: {}
@@ -6606,6 +8891,10 @@ snapshots:
entities@2.2.0: {}
+ entities@4.5.0: {}
+
+ entities@6.0.1: {}
+
entities@7.0.1: {}
env-paths@2.2.1: {}
@@ -6640,6 +8929,20 @@ snapshots:
es-toolkit@1.49.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.17.0
+ esast-util-from-estree: 2.0.0
+ vfile-message: 4.0.3
+
esbuild@0.28.1:
optionalDependencies:
'@esbuild/aix-ppc64': 0.28.1
@@ -6675,6 +8978,8 @@ snapshots:
escape-string-regexp@1.0.5: {}
+ escape-string-regexp@5.0.0: {}
+
eslint-scope@5.1.1:
dependencies:
esrecurse: 4.3.0
@@ -6706,6 +9011,35 @@ snapshots:
estraverse@5.3.0: {}
+ estree-util-attach-comments@3.0.0:
+ dependencies:
+ '@types/estree': 1.0.9
+
+ estree-util-build-jsx@3.0.1:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ estree-walker: 3.0.3
+
+ estree-util-is-identifier-name@3.0.0: {}
+
+ estree-util-scope@1.0.1:
+ dependencies:
+ '@types/estree': 1.0.9
+ devlop: 1.1.0
+
+ estree-util-to-js@2.0.0:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ astring: 1.9.0
+ source-map: 0.7.6
+
+ estree-util-visit@2.0.0:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/unist': 3.0.3
+
estree-walker@3.0.3:
dependencies:
'@types/estree': 1.0.9
@@ -6714,6 +9048,8 @@ snapshots:
eventemitter3@4.0.7: {}
+ eventemitter3@5.0.4: {}
+
events@3.3.0: {}
expand-tilde@2.0.2:
@@ -6749,7 +9085,7 @@ snapshots:
range-parser: 1.2.1
safe-buffer: 5.2.1
send: 0.19.2(supports-color@8.1.1)
- serve-static: 1.16.3(supports-color@8.1.1)
+ serve-static: 1.16.3
setprototypeof: 1.2.0
statuses: 2.0.2
type-is: 1.6.18
@@ -6758,6 +9094,15 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ expressive-code@0.44.2:
+ dependencies:
+ '@expressive-code/core': 0.44.2
+ '@expressive-code/plugin-frames': 0.44.2
+ '@expressive-code/plugin-shiki': 0.44.2
+ '@expressive-code/plugin-text-markers': 0.44.2
+
+ extend@3.0.2: {}
+
fast-deep-equal@3.1.3: {}
fast-glob@3.3.3:
@@ -6768,8 +9113,18 @@ snapshots:
merge2: 1.4.1
micromatch: 4.0.8
+ fast-string-truncated-width@3.0.3: {}
+
+ fast-string-width@3.0.2:
+ dependencies:
+ fast-string-truncated-width: 3.0.3
+
fast-uri@3.1.4: {}
+ fast-wrap-ansi@0.2.2:
+ dependencies:
+ fast-string-width: 3.0.2
+
fastest-levenshtein@1.0.16: {}
fastq@1.20.1:
@@ -6809,6 +9164,8 @@ snapshots:
findup-sync: 4.0.0
merge: 2.1.1
+ find-proc@0.1.0: {}
+
find-root@1.1.0: {}
find-up@4.1.0:
@@ -6825,9 +9182,17 @@ snapshots:
flat@5.0.2: {}
- follow-redirects@1.16.0(debug@4.4.3(supports-color@8.1.1)):
- optionalDependencies:
- debug: 4.4.3(supports-color@8.1.1)
+ flattie@1.1.1: {}
+
+ follow-redirects@1.16.0: {}
+
+ fontace@0.4.1:
+ dependencies:
+ fontkitten: 1.0.3
+
+ fontkitten@1.0.3:
+ dependencies:
+ tiny-inflate: 1.0.3
for-each@0.3.5:
dependencies:
@@ -6875,6 +9240,12 @@ snapshots:
dunder-proto: 1.0.1
es-object-atoms: 1.1.2
+ get-tsconfig@5.0.0-beta.4:
+ dependencies:
+ resolve-pkg-maps: 1.0.0
+
+ github-slugger@2.0.0: {}
+
glob-parent@5.1.2:
dependencies:
is-glob: 4.0.3
@@ -6923,11 +9294,23 @@ snapshots:
graceful-fs@4.2.11: {}
+ h3@1.15.11:
+ dependencies:
+ cookie-es: 1.2.3
+ crossws: 0.3.5
+ defu: 6.1.7
+ destr: 2.0.5
+ iron-webcrypto: 1.2.1
+ node-mock-http: 1.0.5
+ radix3: 1.1.2
+ ufo: 1.6.4
+ uncrypto: 0.1.3
+
handle-thing@2.0.1: {}
happy-dom@20.11.1:
dependencies:
- '@types/node': 22.20.1
+ '@types/node': 24.13.3
'@types/whatwg-mimetype': 3.0.2
'@types/ws': 8.18.1
buffer-image-size: 0.6.4
@@ -6958,57 +9341,271 @@ snapshots:
dependencies:
function-bind: 1.1.2
- he@1.2.0: {}
+ hast-util-embedded@3.0.0:
+ dependencies:
+ '@types/hast': 3.0.5
+ hast-util-is-element: 3.0.0
- homedir-polyfill@1.0.3:
+ hast-util-format@1.1.0:
dependencies:
- parse-passwd: 1.0.0
+ '@types/hast': 3.0.5
+ hast-util-embedded: 3.0.0
+ hast-util-minify-whitespace: 1.0.1
+ hast-util-phrasing: 3.0.1
+ hast-util-whitespace: 3.0.0
+ html-whitespace-sensitive-tag-names: 3.0.1
+ unist-util-visit-parents: 6.0.2
- hpack.js@2.1.6:
+ hast-util-from-html@2.0.3:
dependencies:
- inherits: 2.0.4
- obuf: 1.1.2
- readable-stream: 2.3.8
- wbuf: 1.7.3
+ '@types/hast': 3.0.5
+ devlop: 1.1.0
+ hast-util-from-parse5: 8.0.3
+ parse5: 7.3.0
+ vfile: 6.0.3
+ vfile-message: 4.0.3
- html-escaper@2.0.2: {}
+ hast-util-from-parse5@8.0.3:
+ dependencies:
+ '@types/hast': 3.0.5
+ '@types/unist': 3.0.3
+ devlop: 1.1.0
+ hastscript: 9.0.1
+ property-information: 7.2.0
+ vfile: 6.0.3
+ vfile-location: 5.0.3
+ web-namespaces: 2.0.1
- html-minifier-terser@6.1.0:
+ hast-util-has-property@3.0.0:
dependencies:
- camel-case: 4.1.2
- clean-css: 5.3.3
- commander: 8.3.0
- he: 1.2.0
- param-case: 3.0.4
- relateurl: 0.2.7
- terser: 5.49.0
+ '@types/hast': 3.0.5
- html-webpack-plugin@5.6.8(@rspack/core@2.1.4)(webpack@5.108.4):
+ hast-util-is-body-ok-link@3.0.1:
dependencies:
- '@types/html-minifier-terser': 6.1.0
- html-minifier-terser: 6.1.0
- lodash: 4.18.1
- pretty-error: 4.0.0
- tapable: 2.3.3
- optionalDependencies:
- '@rspack/core': 2.1.4
- webpack: 5.108.4(@swc/core@1.16.0)(clean-css@5.3.3)(esbuild@0.28.1)(html-minifier-terser@6.1.0)(lightningcss@1.32.0)(postcss@8.5.20)(webpack-cli@6.0.1)
+ '@types/hast': 3.0.5
- htmlparser2@6.1.0:
+ hast-util-is-element@3.0.0:
dependencies:
- domelementtype: 2.3.0
- domhandler: 4.3.1
- domutils: 2.8.0
- entities: 2.2.0
+ '@types/hast': 3.0.5
- http-deceiver@1.2.7: {}
+ hast-util-minify-whitespace@1.0.1:
+ dependencies:
+ '@types/hast': 3.0.5
+ hast-util-embedded: 3.0.0
+ hast-util-is-element: 3.0.0
+ hast-util-whitespace: 3.0.0
+ unist-util-is: 6.0.1
- http-errors@1.8.1:
+ hast-util-parse-selector@4.0.0:
dependencies:
- depd: 1.1.2
- inherits: 2.0.4
- setprototypeof: 1.2.0
- statuses: 1.5.0
+ '@types/hast': 3.0.5
+
+ hast-util-phrasing@3.0.1:
+ dependencies:
+ '@types/hast': 3.0.5
+ hast-util-embedded: 3.0.0
+ hast-util-has-property: 3.0.0
+ hast-util-is-body-ok-link: 3.0.1
+ hast-util-is-element: 3.0.0
+
+ hast-util-raw@9.1.0:
+ dependencies:
+ '@types/hast': 3.0.5
+ '@types/unist': 3.0.3
+ '@ungap/structured-clone': 1.4.0
+ hast-util-from-parse5: 8.0.3
+ hast-util-to-parse5: 8.0.1
+ html-void-elements: 3.0.0
+ mdast-util-to-hast: 13.2.1
+ parse5: 7.3.0
+ unist-util-position: 5.0.0
+ unist-util-visit: 5.1.0
+ vfile: 6.0.3
+ web-namespaces: 2.0.1
+ zwitch: 2.0.4
+
+ hast-util-select@6.0.4:
+ dependencies:
+ '@types/hast': 3.0.5
+ '@types/unist': 3.0.3
+ bcp-47-match: 2.0.3
+ comma-separated-tokens: 2.0.3
+ css-selector-parser: 3.3.0
+ devlop: 1.1.0
+ direction: 2.0.1
+ hast-util-has-property: 3.0.0
+ hast-util-to-string: 3.0.1
+ hast-util-whitespace: 3.0.0
+ nth-check: 2.1.1
+ property-information: 7.2.0
+ space-separated-tokens: 2.0.2
+ unist-util-visit: 5.1.0
+ zwitch: 2.0.4
+
+ hast-util-to-estree@3.1.3:
+ dependencies:
+ '@types/estree': 1.0.9
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.5
+ comma-separated-tokens: 2.0.3
+ devlop: 1.1.0
+ estree-util-attach-comments: 3.0.0
+ estree-util-is-identifier-name: 3.0.0
+ hast-util-whitespace: 3.0.0
+ mdast-util-mdx-expression: 2.0.1
+ mdast-util-mdx-jsx: 3.2.0
+ mdast-util-mdxjs-esm: 2.0.1
+ property-information: 7.2.0
+ space-separated-tokens: 2.0.2
+ style-to-js: 1.1.21
+ unist-util-position: 5.0.0
+ zwitch: 2.0.4
+ transitivePeerDependencies:
+ - supports-color
+
+ hast-util-to-html@9.0.5:
+ dependencies:
+ '@types/hast': 3.0.5
+ '@types/unist': 3.0.3
+ ccount: 2.0.1
+ comma-separated-tokens: 2.0.3
+ hast-util-whitespace: 3.0.0
+ html-void-elements: 3.0.0
+ mdast-util-to-hast: 13.2.1
+ property-information: 7.2.0
+ space-separated-tokens: 2.0.2
+ stringify-entities: 4.0.4
+ zwitch: 2.0.4
+
+ hast-util-to-jsx-runtime@2.3.6:
+ dependencies:
+ '@types/estree': 1.0.9
+ '@types/hast': 3.0.5
+ '@types/unist': 3.0.3
+ comma-separated-tokens: 2.0.3
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ hast-util-whitespace: 3.0.0
+ mdast-util-mdx-expression: 2.0.1
+ mdast-util-mdx-jsx: 3.2.0
+ mdast-util-mdxjs-esm: 2.0.1
+ property-information: 7.2.0
+ space-separated-tokens: 2.0.2
+ style-to-js: 1.1.21
+ unist-util-position: 5.0.0
+ vfile-message: 4.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ hast-util-to-mdast@10.1.2:
+ dependencies:
+ '@types/hast': 3.0.5
+ '@types/mdast': 4.0.4
+ '@ungap/structured-clone': 1.4.0
+ hast-util-phrasing: 3.0.1
+ hast-util-to-html: 9.0.5
+ hast-util-to-text: 4.0.2
+ hast-util-whitespace: 3.0.0
+ mdast-util-phrasing: 4.1.0
+ mdast-util-to-hast: 13.2.1
+ mdast-util-to-string: 4.0.0
+ rehype-minify-whitespace: 6.0.2
+ trim-trailing-lines: 2.1.0
+ unist-util-position: 5.0.0
+ unist-util-visit: 5.1.0
+
+ hast-util-to-parse5@8.0.1:
+ dependencies:
+ '@types/hast': 3.0.5
+ comma-separated-tokens: 2.0.3
+ devlop: 1.1.0
+ property-information: 7.2.0
+ space-separated-tokens: 2.0.2
+ web-namespaces: 2.0.1
+ zwitch: 2.0.4
+
+ hast-util-to-string@3.0.1:
+ dependencies:
+ '@types/hast': 3.0.5
+
+ hast-util-to-text@4.0.2:
+ dependencies:
+ '@types/hast': 3.0.5
+ '@types/unist': 3.0.3
+ hast-util-is-element: 3.0.0
+ unist-util-find-after: 5.0.0
+
+ hast-util-whitespace@3.0.0:
+ dependencies:
+ '@types/hast': 3.0.5
+
+ hastscript@9.0.1:
+ dependencies:
+ '@types/hast': 3.0.5
+ comma-separated-tokens: 2.0.3
+ hast-util-parse-selector: 4.0.0
+ property-information: 7.2.0
+ space-separated-tokens: 2.0.2
+
+ he@1.2.0: {}
+
+ homedir-polyfill@1.0.3:
+ dependencies:
+ parse-passwd: 1.0.0
+
+ hpack.js@2.1.6:
+ dependencies:
+ inherits: 2.0.4
+ obuf: 1.1.2
+ readable-stream: 2.3.8
+ wbuf: 1.7.3
+
+ html-escaper@2.0.2: {}
+
+ html-escaper@3.0.3: {}
+
+ html-minifier-terser@6.1.0:
+ dependencies:
+ camel-case: 4.1.2
+ clean-css: 5.3.3
+ commander: 8.3.0
+ he: 1.2.0
+ param-case: 3.0.4
+ relateurl: 0.2.7
+ terser: 5.49.0
+
+ html-void-elements@3.0.0: {}
+
+ html-webpack-plugin@5.6.8(@rspack/core@2.1.4)(webpack@5.108.4):
+ dependencies:
+ '@types/html-minifier-terser': 6.1.0
+ html-minifier-terser: 6.1.0
+ lodash: 4.18.1
+ pretty-error: 4.0.0
+ tapable: 2.3.3
+ optionalDependencies:
+ '@rspack/core': 2.1.4
+ webpack: 5.108.4(@swc/core@1.16.0)(clean-css@5.3.3)(esbuild@0.28.1)(html-minifier-terser@6.1.0)(lightningcss@1.32.0)(postcss@8.5.20)(webpack-cli@6.0.1)
+
+ html-whitespace-sensitive-tag-names@3.0.1: {}
+
+ htmlparser2@6.1.0:
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 4.3.1
+ domutils: 2.8.0
+ entities: 2.2.0
+
+ http-cache-semantics@4.2.0: {}
+
+ http-deceiver@1.2.7: {}
+
+ http-errors@1.8.1:
+ dependencies:
+ depd: 1.1.2
+ inherits: 2.0.4
+ setprototypeof: 1.2.0
+ statuses: 1.5.0
toidentifier: 1.0.1
http-errors@2.0.1:
@@ -7021,10 +9618,10 @@ snapshots:
http-parser-js@0.5.10: {}
- http-proxy-middleware@2.0.10(@types/express@4.17.25)(debug@4.4.3(supports-color@8.1.1)):
+ http-proxy-middleware@2.0.10(@types/express@4.17.25):
dependencies:
'@types/http-proxy': 1.17.17
- http-proxy: 1.18.1(debug@4.4.3(supports-color@8.1.1))
+ http-proxy: 1.18.1
is-glob: 4.0.3
is-plain-obj: 3.0.0
micromatch: 4.0.8
@@ -7033,16 +9630,20 @@ snapshots:
transitivePeerDependencies:
- debug
- http-proxy@1.18.1(debug@4.4.3(supports-color@8.1.1)):
+ http-proxy@1.18.1:
dependencies:
eventemitter3: 4.0.7
- follow-redirects: 1.16.0(debug@4.4.3(supports-color@8.1.1))
+ follow-redirects: 1.16.0
requires-port: 1.0.0
transitivePeerDependencies:
- debug
hyperdyperid@1.2.0: {}
+ i18next@26.4.1(typescript@6.0.3):
+ optionalDependencies:
+ typescript: 6.0.3
+
iconv-lite@0.4.24:
dependencies:
safer-buffer: 2.1.2
@@ -7080,6 +9681,8 @@ snapshots:
ini@6.0.0: {}
+ inline-style-parser@0.2.7: {}
+
inquirer@8.2.7(@types/node@24.13.3):
dependencies:
'@inquirer/external-editor': 1.0.3(@types/node@24.13.3)
@@ -7112,6 +9715,15 @@ snapshots:
ipaddr.js@2.5.0: {}
+ 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-arguments@1.2.0:
dependencies:
call-bound: 1.0.4
@@ -7149,8 +9761,12 @@ snapshots:
call-bound: 1.0.4
has-tostringtag: 1.0.2
+ is-decimal@2.0.1: {}
+
is-docker@3.0.0: {}
+ is-docker@4.0.0: {}
+
is-extglob@2.1.1: {}
is-fullwidth-code-point@3.0.0: {}
@@ -7159,6 +9775,8 @@ snapshots:
dependencies:
is-extglob: 2.1.1
+ is-hexadecimal@2.0.1: {}
+
is-inside-container@1.0.0:
dependencies:
is-docker: 3.0.0
@@ -7278,6 +9896,10 @@ snapshots:
json5@2.2.3: {}
+ jsonc-parser@2.3.1: {}
+
+ jsonc-parser@3.3.1: {}
+
jsonfile@6.2.1:
dependencies:
universalify: 2.0.1
@@ -7288,6 +9910,8 @@ snapshots:
kleur@4.1.5: {}
+ klona@2.0.6: {}
+
launch-editor@2.14.1:
dependencies:
picocolors: 1.1.1
@@ -7365,18 +9989,26 @@ snapshots:
chalk: 4.1.2
is-unicode-supported: 0.1.0
+ longest-streak@3.1.0: {}
+
longest@2.0.1: {}
lower-case@2.0.2:
dependencies:
tslib: 2.8.1
+ lru-cache@11.5.2: {}
+
lz-string@1.5.0: {}
magic-string@0.30.21:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.5
+ magic-string@1.2.3:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+
magicast@0.5.3:
dependencies:
'@babel/parser': 7.29.7
@@ -7387,8 +10019,199 @@ snapshots:
dependencies:
semver: 7.8.5
+ markdown-extensions@2.0.0: {}
+
+ markdown-table@3.0.4: {}
+
math-intrinsics@1.1.0: {}
+ mdast-util-definitions@6.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ unist-util-visit: 5.1.0
+
+ mdast-util-directive@3.1.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ ccount: 2.0.1
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-to-markdown: 2.1.2
+ parse-entities: 4.0.2
+ stringify-entities: 4.0.4
+ unist-util-visit-parents: 6.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-find-and-replace@3.0.2:
+ dependencies:
+ '@types/mdast': 4.0.4
+ escape-string-regexp: 5.0.0
+ unist-util-is: 6.0.1
+ unist-util-visit-parents: 6.0.2
+
+ mdast-util-from-markdown@2.0.3:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ decode-named-character-reference: 1.3.0
+ devlop: 1.1.0
+ mdast-util-to-string: 4.0.0
+ micromark: 4.0.2
+ micromark-util-decode-numeric-character-reference: 2.0.2
+ micromark-util-decode-string: 2.0.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ unist-util-stringify-position: 4.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-autolink-literal@2.0.1:
+ dependencies:
+ '@types/mdast': 4.0.4
+ ccount: 2.0.1
+ devlop: 1.1.0
+ mdast-util-find-and-replace: 3.0.2
+ micromark-util-character: 2.1.1
+
+ mdast-util-gfm-footnote@2.1.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-to-markdown: 2.1.2
+ micromark-util-normalize-identifier: 2.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-strikethrough@2.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-table@2.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ markdown-table: 3.0.4
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-task-list-item@2.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm@3.1.0:
+ dependencies:
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-gfm-autolink-literal: 2.0.1
+ mdast-util-gfm-footnote: 2.1.0
+ mdast-util-gfm-strikethrough: 2.0.0
+ mdast-util-gfm-table: 2.0.0
+ mdast-util-gfm-task-list-item: 2.0.0
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-mdx-expression@2.0.1:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.5
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-mdx-jsx@3.2.0:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.5
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ ccount: 2.0.1
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-to-markdown: 2.1.2
+ parse-entities: 4.0.2
+ stringify-entities: 4.0.4
+ unist-util-stringify-position: 4.0.0
+ vfile-message: 4.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-mdx@3.0.0:
+ dependencies:
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-mdx-expression: 2.0.1
+ mdast-util-mdx-jsx: 3.2.0
+ mdast-util-mdxjs-esm: 2.0.1
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-mdxjs-esm@2.0.1:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.5
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-phrasing@4.1.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ unist-util-is: 6.0.1
+
+ mdast-util-to-hast@13.2.1:
+ dependencies:
+ '@types/hast': 3.0.5
+ '@types/mdast': 4.0.4
+ '@ungap/structured-clone': 1.4.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.1.0
+ vfile: 6.0.3
+
+ mdast-util-to-markdown@2.1.2:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ longest-streak: 3.1.0
+ mdast-util-phrasing: 4.1.0
+ mdast-util-to-string: 4.0.0
+ micromark-util-classify-character: 2.0.1
+ micromark-util-decode-string: 2.0.1
+ unist-util-visit: 5.1.0
+ zwitch: 2.0.4
+
+ mdast-util-to-string@4.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+
+ mdn-data@2.0.28: {}
+
+ mdn-data@2.27.1: {}
+
media-typer@0.3.0: {}
memfs@4.64.0:
@@ -7420,6 +10243,280 @@ snapshots:
methods@1.1.2: {}
+ micromark-core-commonmark@2.0.3:
+ dependencies:
+ decode-named-character-reference: 1.3.0
+ devlop: 1.1.0
+ micromark-factory-destination: 2.0.1
+ micromark-factory-label: 2.0.1
+ micromark-factory-space: 2.0.1
+ micromark-factory-title: 2.0.1
+ micromark-factory-whitespace: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-chunked: 2.0.1
+ micromark-util-classify-character: 2.0.1
+ micromark-util-html-tag-name: 2.0.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-resolve-all: 2.0.1
+ micromark-util-subtokenize: 2.1.0
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-directive@4.0.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.1
+ micromark-factory-whitespace: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ parse-entities: 4.0.2
+
+ micromark-extension-gfm-autolink-literal@2.1.0:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-sanitize-uri: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-footnote@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.3
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-sanitize-uri: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-strikethrough@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-chunked: 2.0.1
+ micromark-util-classify-character: 2.0.1
+ micromark-util-resolve-all: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-table@2.1.1:
+ dependencies:
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-tagfilter@2.0.0:
+ dependencies:
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-task-list-item@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm@3.0.0:
+ dependencies:
+ micromark-extension-gfm-autolink-literal: 2.1.0
+ micromark-extension-gfm-footnote: 2.1.0
+ micromark-extension-gfm-strikethrough: 2.1.0
+ micromark-extension-gfm-table: 2.1.1
+ micromark-extension-gfm-tagfilter: 2.0.0
+ micromark-extension-gfm-task-list-item: 2.1.0
+ micromark-util-combine-extensions: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-mdx-expression@3.0.1:
+ dependencies:
+ '@types/estree': 1.0.9
+ devlop: 1.1.0
+ micromark-factory-mdx-expression: 2.0.3
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-events-to-acorn: 2.0.3
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-mdx-jsx@3.0.2:
+ dependencies:
+ '@types/estree': 1.0.9
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ micromark-factory-mdx-expression: 2.0.3
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-events-to-acorn: 2.0.3
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ vfile-message: 4.0.3
+
+ micromark-extension-mdx-md@2.0.0:
+ dependencies:
+ micromark-util-types: 2.0.2
+
+ micromark-extension-mdxjs-esm@3.0.0:
+ dependencies:
+ '@types/estree': 1.0.9
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.3
+ micromark-util-character: 2.1.1
+ micromark-util-events-to-acorn: 2.0.3
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ unist-util-position-from-estree: 2.0.0
+ vfile-message: 4.0.3
+
+ micromark-extension-mdxjs@3.0.0:
+ dependencies:
+ acorn: 8.17.0
+ acorn-jsx: 5.3.2(acorn@8.17.0)
+ micromark-extension-mdx-expression: 3.0.1
+ micromark-extension-mdx-jsx: 3.0.2
+ micromark-extension-mdx-md: 2.0.0
+ micromark-extension-mdxjs-esm: 3.0.0
+ micromark-util-combine-extensions: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-factory-destination@2.0.1:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-factory-label@2.0.1:
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-factory-mdx-expression@2.0.3:
+ dependencies:
+ '@types/estree': 1.0.9
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-events-to-acorn: 2.0.3
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ unist-util-position-from-estree: 2.0.0
+ vfile-message: 4.0.3
+
+ micromark-factory-space@2.0.1:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-types: 2.0.2
+
+ micromark-factory-title@2.0.1:
+ dependencies:
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-factory-whitespace@2.0.1:
+ dependencies:
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-util-character@2.1.1:
+ dependencies:
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-util-chunked@2.0.1:
+ dependencies:
+ micromark-util-symbol: 2.0.1
+
+ micromark-util-classify-character@2.0.1:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-util-combine-extensions@2.0.1:
+ dependencies:
+ micromark-util-chunked: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-util-decode-numeric-character-reference@2.0.2:
+ dependencies:
+ micromark-util-symbol: 2.0.1
+
+ micromark-util-decode-string@2.0.1:
+ dependencies:
+ decode-named-character-reference: 1.3.0
+ micromark-util-character: 2.1.1
+ micromark-util-decode-numeric-character-reference: 2.0.2
+ micromark-util-symbol: 2.0.1
+
+ micromark-util-encode@2.0.1: {}
+
+ micromark-util-events-to-acorn@2.0.3:
+ dependencies:
+ '@types/estree': 1.0.9
+ '@types/unist': 3.0.3
+ devlop: 1.1.0
+ estree-util-visit: 2.0.0
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ vfile-message: 4.0.3
+
+ 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.13
+ debug: 4.4.3(supports-color@8.1.1)
+ decode-named-character-reference: 1.3.0
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.3
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-chunked: 2.0.1
+ micromark-util-combine-extensions: 2.0.1
+ micromark-util-decode-numeric-character-reference: 2.0.2
+ micromark-util-encode: 2.0.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-resolve-all: 2.0.1
+ micromark-util-sanitize-uri: 2.0.1
+ micromark-util-subtokenize: 2.1.0
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ transitivePeerDependencies:
+ - supports-color
+
micromatch@4.0.8:
dependencies:
braces: 3.0.3
@@ -7466,12 +10563,26 @@ snapshots:
lightningcss: 1.32.0
postcss: 8.5.20
+ minimizer-webpack-plugin@5.6.1(esbuild@0.28.1)(webpack@5.108.4(esbuild@0.28.1)):
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.31
+ jest-worker: 27.5.1
+ schema-utils: 4.3.3
+ terser: 5.49.0
+ webpack: 5.108.4(esbuild@0.28.1)
+ optionalDependencies:
+ esbuild: 0.28.1
+
mri@1.2.0: {}
+ mrmime@2.0.1: {}
+
ms@2.0.0: {}
ms@2.1.3: {}
+ muggle-string@0.4.1: {}
+
multicast-dns@7.2.5:
dependencies:
dns-packet: 5.6.1
@@ -7495,11 +10606,21 @@ snapshots:
neo-async@2.6.2: {}
+ neotraverse@1.0.1: {}
+
+ nlcst-to-string@4.0.0:
+ dependencies:
+ '@types/nlcst': 2.0.3
+
no-case@3.0.4:
dependencies:
lower-case: 2.0.2
tslib: 2.8.1
+ node-fetch-native@1.6.7: {}
+
+ node-mock-http@1.0.5: {}
+
node-releases@2.0.51: {}
normalize-path@3.0.0: {}
@@ -7530,6 +10651,14 @@ snapshots:
obug@2.1.4: {}
+ ofetch@1.5.1:
+ dependencies:
+ destr: 2.0.5
+ node-fetch-native: 1.6.7
+ ufo: 1.6.4
+
+ ohash@2.0.12: {}
+
on-finished@2.4.1:
dependencies:
ee-first: 1.1.1
@@ -7544,6 +10673,14 @@ snapshots:
dependencies:
mimic-fn: 2.1.0
+ oniguruma-parser@0.12.2: {}
+
+ oniguruma-to-es@4.3.6:
+ dependencies:
+ oniguruma-parser: 0.12.2
+ regex: 6.1.0
+ regex-recursion: 6.0.2
+
open@10.2.0:
dependencies:
default-browser: 5.5.1
@@ -7609,14 +10746,33 @@ snapshots:
p-map@7.0.5: {}
+ p-queue@9.3.3:
+ dependencies:
+ eventemitter3: 5.0.4
+ p-timeout: 7.0.1
+
p-retry@6.2.1:
dependencies:
'@types/retry': 0.12.2
is-network-error: 1.3.2
retry: 0.13.1
+ p-timeout@7.0.1: {}
+
p-try@2.2.0: {}
+ package-manager-detector@1.8.0: {}
+
+ pagefind@1.5.2:
+ optionalDependencies:
+ '@pagefind/darwin-arm64': 1.5.2
+ '@pagefind/darwin-x64': 1.5.2
+ '@pagefind/freebsd-x64': 1.5.2
+ '@pagefind/linux-arm64': 1.5.2
+ '@pagefind/linux-x64': 1.5.2
+ '@pagefind/windows-arm64': 1.5.2
+ '@pagefind/windows-x64': 1.5.2
+
param-case@3.0.4:
dependencies:
dot-case: 3.0.4
@@ -7626,6 +10782,16 @@ snapshots:
dependencies:
callsites: 3.1.0
+ parse-entities@4.0.2:
+ dependencies:
+ '@types/unist': 2.0.11
+ character-entities-legacy: 3.0.0
+ character-reference-invalid: 2.0.1
+ decode-named-character-reference: 1.3.0
+ is-alphanumerical: 2.0.1
+ is-decimal: 2.0.1
+ is-hexadecimal: 2.0.1
+
parse-json@5.2.0:
dependencies:
'@babel/code-frame': 7.29.7
@@ -7633,8 +10799,21 @@ snapshots:
json-parse-even-better-errors: 2.3.1
lines-and-columns: 1.2.4
+ 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
+
parse-passwd@1.0.0: {}
+ parse5@7.3.0:
+ dependencies:
+ entities: 6.0.1
+
parseurl@1.3.3: {}
pascal-case@3.1.2:
@@ -7642,6 +10821,8 @@ snapshots:
no-case: 3.0.4
tslib: 2.8.1
+ path-browserify@1.0.1: {}
+
path-exists@4.0.0: {}
path-is-absolute@1.0.1: {}
@@ -7656,6 +10837,8 @@ snapshots:
pathe@2.0.3: {}
+ piccolore@0.1.3: {}
+
picocolors@1.1.1: {}
picomatch@2.3.2: {}
@@ -7675,7 +10858,17 @@ snapshots:
pvutils: 1.2.0
tslib: 2.8.1
- possible-typed-array-names@1.1.0: {}
+ possible-typed-array-names@1.1.0: {}
+
+ postcss-nested@6.2.0(postcss@8.5.20):
+ dependencies:
+ postcss: 8.5.20
+ postcss-selector-parser: 6.1.4
+
+ postcss-selector-parser@6.1.4:
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
postcss@8.5.20:
dependencies:
@@ -7687,6 +10880,8 @@ snapshots:
presentable-error@0.0.1: {}
+ prettier@3.9.6: {}
+
pretty-error@4.0.0:
dependencies:
lodash: 4.18.1
@@ -7698,8 +10893,14 @@ snapshots:
ansi-styles: 5.2.0
react-is: 17.0.2
+ prismjs@1.30.0: {}
+
+ process-ancestry@0.1.0: {}
+
process-nextick-args@2.0.1: {}
+ property-information@7.2.0: {}
+
proxy-addr@2.0.7:
dependencies:
forwarded: 0.2.0
@@ -7718,6 +10919,8 @@ snapshots:
queue-microtask@1.2.3: {}
+ radix3@1.1.2: {}
+
range-parser@1.2.1: {}
range-parser@1.3.0: {}
@@ -7776,6 +10979,35 @@ snapshots:
dependencies:
resolve: 1.22.12
+ recma-build-jsx@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.9
+ estree-util-build-jsx: 3.0.1
+ vfile: 6.0.3
+
+ recma-jsx@1.0.1(acorn@8.17.0):
+ dependencies:
+ acorn: 8.17.0
+ acorn-jsx: 5.3.2(acorn@8.17.0)
+ estree-util-to-js: 2.0.0
+ recma-parse: 1.0.0
+ recma-stringify: 1.0.0
+ unified: 11.0.5
+
+ recma-parse@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.9
+ esast-util-from-js: 2.0.1
+ unified: 11.0.5
+ vfile: 6.0.3
+
+ recma-stringify@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.9
+ estree-util-to-js: 2.0.0
+ unified: 11.0.5
+ vfile: 6.0.3
+
redent@3.0.0:
dependencies:
indent-string: 4.0.0
@@ -7783,6 +11015,16 @@ snapshots:
reflect-metadata@0.2.2: {}
+ regex-recursion@6.0.2:
+ dependencies:
+ regex-utilities: 2.3.0
+
+ regex-utilities@2.3.0: {}
+
+ regex@6.1.0:
+ dependencies:
+ regex-utilities: 2.3.0
+
regexp.prototype.flags@1.5.4:
dependencies:
call-bind: 1.0.9
@@ -7792,8 +11034,120 @@ snapshots:
gopd: 1.2.0
set-function-name: 2.0.2
+ rehype-expressive-code@0.44.2:
+ dependencies:
+ expressive-code: 0.44.2
+
+ rehype-format@5.0.1:
+ dependencies:
+ '@types/hast': 3.0.5
+ hast-util-format: 1.1.0
+
+ rehype-minify-whitespace@6.0.2:
+ dependencies:
+ '@types/hast': 3.0.5
+ hast-util-minify-whitespace: 1.0.1
+
+ rehype-parse@9.0.1:
+ dependencies:
+ '@types/hast': 3.0.5
+ hast-util-from-html: 2.0.3
+ unified: 11.0.5
+
+ rehype-raw@7.0.0:
+ dependencies:
+ '@types/hast': 3.0.5
+ hast-util-raw: 9.1.0
+ vfile: 6.0.3
+
+ rehype-recma@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.9
+ '@types/hast': 3.0.5
+ hast-util-to-estree: 3.1.3
+ transitivePeerDependencies:
+ - supports-color
+
+ rehype-remark@10.0.1:
+ dependencies:
+ '@types/hast': 3.0.5
+ '@types/mdast': 4.0.4
+ hast-util-to-mdast: 10.1.2
+ unified: 11.0.5
+ vfile: 6.0.3
+
+ rehype-stringify@10.0.1:
+ dependencies:
+ '@types/hast': 3.0.5
+ hast-util-to-html: 9.0.5
+ unified: 11.0.5
+
+ rehype@13.0.2:
+ dependencies:
+ '@types/hast': 3.0.5
+ rehype-parse: 9.0.1
+ rehype-stringify: 10.0.1
+ unified: 11.0.5
+
relateurl@0.2.7: {}
+ remark-directive@4.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-directive: 3.1.0
+ micromark-extension-directive: 4.0.0
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+
+ remark-gfm@4.0.1:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-gfm: 3.1.0
+ micromark-extension-gfm: 3.0.0
+ remark-parse: 11.0.0
+ remark-stringify: 11.0.0
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+
+ remark-mdx@3.1.1:
+ dependencies:
+ mdast-util-mdx: 3.0.0
+ micromark-extension-mdxjs: 3.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ remark-parse@11.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-from-markdown: 2.0.3
+ micromark-util-types: 2.0.2
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+
+ remark-rehype@11.1.2:
+ dependencies:
+ '@types/hast': 3.0.5
+ '@types/mdast': 4.0.4
+ mdast-util-to-hast: 13.2.1
+ unified: 11.0.5
+ vfile: 6.0.3
+
+ remark-smartypants@3.0.3:
+ dependencies:
+ retext: 9.0.0
+ retext-smartypants: 6.2.0
+ unified: 11.0.5
+ unist-util-visit: 5.1.0
+
+ remark-stringify@11.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-to-markdown: 2.1.2
+ unified: 11.0.5
+
renderkid@3.0.0:
dependencies:
css-select: 4.3.0
@@ -7802,6 +11156,10 @@ snapshots:
lodash: 4.18.1
strip-ansi: 6.0.1
+ request-light@0.5.8: {}
+
+ request-light@0.7.0: {}
+
require-from-string@2.0.2: {}
requires-port@1.0.0: {}
@@ -7819,6 +11177,8 @@ snapshots:
resolve-from@5.0.0: {}
+ resolve-pkg-maps@1.0.0: {}
+
resolve@1.22.12:
dependencies:
es-errors: 1.3.0
@@ -7831,6 +11191,31 @@ snapshots:
onetime: 5.1.2
signal-exit: 3.0.7
+ retext-latin@4.0.0:
+ dependencies:
+ '@types/nlcst': 2.0.3
+ parse-latin: 7.0.0
+ unified: 11.0.5
+
+ retext-smartypants@6.2.0:
+ dependencies:
+ '@types/nlcst': 2.0.3
+ nlcst-to-string: 4.0.0
+ unist-util-visit: 5.1.0
+
+ retext-stringify@4.0.0:
+ dependencies:
+ '@types/nlcst': 2.0.3
+ nlcst-to-string: 4.0.0
+ unified: 11.0.5
+
+ retext@9.0.0:
+ dependencies:
+ '@types/nlcst': 2.0.3
+ retext-latin: 4.0.0
+ retext-stringify: 4.0.0
+ unified: 11.0.5
+
retry@0.13.1: {}
reusify@1.1.0: {}
@@ -7884,6 +11269,32 @@ snapshots:
safer-buffer@2.1.2: {}
+ satteri@0.10.5:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.5
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+
+ satteri@0.9.5:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.5
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ optionalDependencies:
+ '@bruits/satteri-darwin-arm64': 0.9.5
+ '@bruits/satteri-darwin-x64': 0.9.5
+ '@bruits/satteri-linux-arm64-gnu': 0.9.5
+ '@bruits/satteri-linux-arm64-musl': 0.9.5
+ '@bruits/satteri-linux-x64-gnu': 0.9.5
+ '@bruits/satteri-linux-x64-musl': 0.9.5
+ '@bruits/satteri-wasm32-wasi': 0.9.5
+ '@bruits/satteri-win32-arm64-msvc': 0.9.5
+ '@bruits/satteri-win32-x64-msvc': 0.9.5
+
+ sax@1.6.1: {}
+
scheduler@0.27.0: {}
schema-utils@4.3.3:
@@ -7934,7 +11345,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- serve-static@1.16.3(supports-color@8.1.1):
+ serve-static@1.16.3:
dependencies:
encodeurl: 2.0.0
escape-html: 1.0.3
@@ -7998,6 +11409,15 @@ snapshots:
'@img/sharp-win32-x64': 0.35.3
'@types/node': 24.13.3
+ sharp@0.35.4(@types/node@24.13.3):
+ dependencies:
+ '@img/colour': 1.1.0
+ detect-libc: 2.1.2
+ semver: 7.8.5
+ optionalDependencies:
+ '@types/node': 24.13.3
+ optional: true
+
shebang-command@2.0.0:
dependencies:
shebang-regex: 3.0.0
@@ -8006,6 +11426,17 @@ snapshots:
shell-quote@1.10.0: {}
+ shiki@4.4.3:
+ dependencies:
+ '@shikijs/core': 4.4.3
+ '@shikijs/engine-javascript': 4.4.3
+ '@shikijs/engine-oniguruma': 4.4.3
+ '@shikijs/langs': 4.4.3
+ '@shikijs/themes': 4.4.3
+ '@shikijs/types': 4.4.3
+ '@shikijs/vscode-textmate': 10.0.2
+ '@types/hast': 3.0.5
+
side-channel-list@1.0.1:
dependencies:
es-errors: 1.3.0
@@ -8042,6 +11473,15 @@ snapshots:
simple-git-hooks@2.13.1: {}
+ sisteransi@1.0.5: {}
+
+ sitemap@9.0.1:
+ dependencies:
+ '@types/node': 24.13.3
+ '@types/sax': 1.2.7
+ arg: 5.0.2
+ sax: 1.6.1
+
size-limit@13.0.3:
dependencies:
bytes-iec: 3.1.1
@@ -8050,6 +11490,8 @@ snapshots:
slash@5.1.0: {}
+ smol-toml@1.8.0: {}
+
sockjs@0.3.24:
dependencies:
faye-websocket: 0.11.4
@@ -8069,6 +11511,10 @@ snapshots:
source-map@0.6.1: {}
+ source-map@0.7.6: {}
+
+ space-separated-tokens@2.0.2: {}
+
spdy-transport@3.0.0(supports-color@8.1.1):
dependencies:
debug: 4.4.3(supports-color@8.1.1)
@@ -8092,6 +11538,26 @@ snapshots:
stackback@0.0.2: {}
+ starlight-llms-txt@0.11.0(@astrojs/markdown-satteri@0.3.8)(@astrojs/starlight@0.41.11(@astrojs/markdown-remark@7.3.0)(astro@7.2.10(@astrojs/markdown-remark@7.3.0)(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@types/node@24.13.3)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0))(typescript@6.0.3))(astro@7.2.10(@astrojs/markdown-remark@7.3.0)(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@types/node@24.13.3)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0)):
+ dependencies:
+ '@astrojs/mdx': 7.0.8(@astrojs/markdown-satteri@0.3.8)(astro@7.2.10(@astrojs/markdown-remark@7.3.0)(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@types/node@24.13.3)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0))
+ '@astrojs/starlight': 0.41.11(@astrojs/markdown-remark@7.3.0)(astro@7.2.10(@astrojs/markdown-remark@7.3.0)(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@types/node@24.13.3)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0))(typescript@6.0.3)
+ '@types/hast': 3.0.5
+ '@types/micromatch': 4.0.10
+ astro: 7.2.10(@astrojs/markdown-remark@7.3.0)(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@types/node@24.13.3)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0)
+ github-slugger: 2.0.0
+ hast-util-select: 6.0.4
+ micromatch: 4.0.8
+ rehype-parse: 9.0.1
+ rehype-remark: 10.0.1
+ remark-gfm: 4.0.1
+ remark-stringify: 11.0.0
+ unified: 11.0.5
+ unist-util-remove: 4.0.0
+ transitivePeerDependencies:
+ - '@astrojs/markdown-satteri'
+ - supports-color
+
statuses@1.5.0: {}
statuses@2.0.2: {}
@@ -8123,6 +11589,11 @@ snapshots:
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
@@ -8143,6 +11614,14 @@ snapshots:
strip-json-comments@3.1.1: {}
+ style-to-js@1.1.21:
+ dependencies:
+ style-to-object: 1.0.14
+
+ style-to-object@1.0.14:
+ dependencies:
+ inline-style-parser: 0.2.7
+
supports-color@5.5.0:
dependencies:
has-flag: 3.0.0
@@ -8198,6 +11677,16 @@ snapshots:
transitivePeerDependencies:
- '@typescript-eslint/types'
+ svgo@4.1.0:
+ dependencies:
+ commander: 11.1.0
+ css-select: 6.0.0
+ css-tree: 3.2.1
+ css-what: 7.0.0
+ csso: 5.0.5
+ picocolors: 1.1.1
+ sax: 1.6.1
+
swc-loader@0.2.7(@swc/core@1.16.0)(webpack@5.108.4):
dependencies:
'@swc/core': 1.16.0
@@ -8221,8 +11710,12 @@ snapshots:
thunky@1.1.0: {}
+ tiny-inflate@1.0.3: {}
+
tinybench@2.9.0: {}
+ tinyclip@0.1.15: {}
+
tinyexec@1.2.4: {}
tinyglobby@0.2.17:
@@ -8242,6 +11735,12 @@ snapshots:
dependencies:
tslib: 2.8.1
+ trim-lines@3.0.1: {}
+
+ trim-trailing-lines@2.1.0: {}
+
+ trough@2.2.0: {}
+
tslib@1.14.1: {}
tslib@2.8.1: {}
@@ -8257,8 +11756,16 @@ snapshots:
media-typer: 0.3.0
mime-types: 2.1.35
+ typesafe-path@0.2.2: {}
+
+ typescript-auto-import-cache@0.3.6:
+ dependencies:
+ semver: 7.8.5
+
typescript@5.9.3: {}
+ typescript@6.0.3: {}
+
typescript@7.0.2:
optionalDependencies:
'@typescript/typescript-aix-ppc64': 7.0.2
@@ -8282,22 +11789,111 @@ snapshots:
'@typescript/typescript-win32-arm64': 7.0.2
'@typescript/typescript-win32-x64': 7.0.2
+ ufo@1.6.4: {}
+
+ ultrahtml@1.7.0: {}
+
+ uncrypto@0.1.3: {}
+
undici-types@6.21.0: {}
undici-types@7.18.2: {}
+ undici@8.10.1: {}
+
unicorn-magic@0.3.0: {}
+ unified@11.0.5:
+ dependencies:
+ '@types/unist': 3.0.3
+ bail: 2.0.2
+ devlop: 1.1.0
+ extend: 3.0.2
+ is-plain-obj: 4.1.0
+ trough: 2.2.0
+ vfile: 6.0.3
+
+ unifont@0.7.5:
+ dependencies:
+ css-tree: 3.2.1
+ ohash: 2.0.12
+ undici: 8.10.1
+
+ unist-util-find-after@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.1
+
+ unist-util-is@6.0.1:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-modify-children@4.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ array-iterate: 2.0.1
+
+ unist-util-position-from-estree@2.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-position@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-remove-position@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-visit: 5.1.0
+
+ unist-util-remove@4.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.1
+ unist-util-visit-parents: 6.0.2
+
+ 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.2:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.1
+
+ unist-util-visit@5.1.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.1
+ unist-util-visit-parents: 6.0.2
+
universalify@2.0.1: {}
unpipe@1.0.0: {}
+ unstorage@1.17.5:
+ dependencies:
+ anymatch: 3.1.3
+ chokidar: 5.0.0
+ destr: 2.0.5
+ h3: 1.15.11
+ lru-cache: 11.5.2
+ node-fetch-native: 1.6.7
+ ofetch: 1.5.1
+ ufo: 1.6.4
+
update-browserslist-db@1.2.3(browserslist@4.28.6):
dependencies:
browserslist: 4.28.6
escalade: 3.2.0
picocolors: 1.1.1
+ url-extras@0.1.0: {}
+
util-deprecate@1.0.2: {}
utila@0.4.0: {}
@@ -8308,7 +11904,22 @@ snapshots:
vary@1.1.2: {}
- vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0):
+ vfile-location@5.0.3:
+ dependencies:
+ '@types/unist': 3.0.3
+ vfile: 6.0.3
+
+ vfile-message@4.0.3:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-stringify-position: 4.0.0
+
+ vfile@6.0.3:
+ dependencies:
+ '@types/unist': 3.0.3
+ vfile-message: 4.0.3
+
+ vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0):
dependencies:
lightningcss: 1.32.0
picomatch: 4.0.5
@@ -8321,15 +11932,16 @@ snapshots:
fsevents: 2.3.3
jiti: 2.6.1
terser: 5.49.0
+ yaml: 2.9.0
- vitefu@1.1.3(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)):
+ vitefu@1.1.3(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0)):
optionalDependencies:
- vite: 8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)
+ vite: 8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0)
- vitest@4.1.10(@types/node@24.13.3)(@vitest/coverage-v8@4.1.10)(happy-dom@20.11.1)(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)):
+ vitest@4.1.10(@types/node@24.13.3)(@vitest/coverage-v8@4.1.10)(happy-dom@20.11.1)(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0)):
dependencies:
'@vitest/expect': 4.1.10
- '@vitest/mocker': 4.1.10(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0))
+ '@vitest/mocker': 4.1.10(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0))
'@vitest/pretty-format': 4.1.10
'@vitest/runner': 4.1.10
'@vitest/snapshot': 4.1.10
@@ -8346,7 +11958,7 @@ snapshots:
tinyexec: 1.2.4
tinyglobby: 0.2.17
tinyrainbow: 3.1.0
- vite: 8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)
+ vite: 8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.49.0)(yaml@2.9.0)
why-is-node-running: 2.3.0
optionalDependencies:
'@types/node': 24.13.3
@@ -8355,6 +11967,112 @@ snapshots:
transitivePeerDependencies:
- msw
+ volar-service-css@0.0.71(@volar/language-service@2.4.28):
+ dependencies:
+ vscode-css-languageservice: 6.3.10
+ vscode-languageserver-textdocument: 1.0.14
+ vscode-uri: 3.2.0
+ optionalDependencies:
+ '@volar/language-service': 2.4.28
+
+ volar-service-emmet@0.0.71(@volar/language-service@2.4.28):
+ dependencies:
+ '@emmetio/css-parser': 0.4.1
+ '@emmetio/html-matcher': 1.3.0
+ '@vscode/emmet-helper': 2.11.0
+ vscode-uri: 3.2.0
+ optionalDependencies:
+ '@volar/language-service': 2.4.28
+
+ volar-service-html@0.0.71(@volar/language-service@2.4.28):
+ dependencies:
+ vscode-html-languageservice: 5.6.2
+ vscode-languageserver-textdocument: 1.0.14
+ vscode-uri: 3.2.0
+ optionalDependencies:
+ '@volar/language-service': 2.4.28
+
+ volar-service-prettier@0.0.71(@volar/language-service@2.4.28)(prettier@3.9.6):
+ dependencies:
+ vscode-uri: 3.2.0
+ optionalDependencies:
+ '@volar/language-service': 2.4.28
+ prettier: 3.9.6
+
+ volar-service-typescript-twoslash-queries@0.0.71(@volar/language-service@2.4.28):
+ dependencies:
+ vscode-uri: 3.2.0
+ optionalDependencies:
+ '@volar/language-service': 2.4.28
+
+ volar-service-typescript@0.0.71(@volar/language-service@2.4.28):
+ dependencies:
+ path-browserify: 1.0.1
+ semver: 7.8.5
+ typescript-auto-import-cache: 0.3.6
+ vscode-languageserver-textdocument: 1.0.14
+ vscode-nls: 5.2.0
+ vscode-uri: 3.2.0
+ optionalDependencies:
+ '@volar/language-service': 2.4.28
+
+ volar-service-yaml@0.0.71(@volar/language-service@2.4.28):
+ dependencies:
+ vscode-uri: 3.2.0
+ yaml-language-server: 1.23.0
+ optionalDependencies:
+ '@volar/language-service': 2.4.28
+
+ vscode-css-languageservice@6.3.10:
+ dependencies:
+ '@vscode/l10n': 0.0.18
+ vscode-languageserver-textdocument: 1.0.14
+ vscode-languageserver-types: 3.17.5
+ vscode-uri: 3.2.0
+
+ vscode-html-languageservice@5.6.2:
+ dependencies:
+ '@vscode/l10n': 0.0.18
+ vscode-languageserver-textdocument: 1.0.14
+ vscode-languageserver-types: 3.18.3
+ vscode-uri: 3.2.0
+
+ vscode-json-languageservice@4.1.8:
+ dependencies:
+ jsonc-parser: 3.3.1
+ vscode-languageserver-textdocument: 1.0.14
+ vscode-languageserver-types: 3.18.3
+ vscode-nls: 5.2.0
+ vscode-uri: 3.2.0
+
+ vscode-jsonrpc@8.2.0: {}
+
+ vscode-jsonrpc@9.0.2: {}
+
+ vscode-languageserver-protocol@3.17.5:
+ dependencies:
+ vscode-jsonrpc: 8.2.0
+ vscode-languageserver-types: 3.17.5
+
+ vscode-languageserver-protocol@3.18.3:
+ dependencies:
+ vscode-jsonrpc: 9.0.2
+ vscode-languageserver-types: 3.18.3
+
+ vscode-languageserver-textdocument@1.0.14: {}
+
+ vscode-languageserver-types@3.17.5: {}
+
+ vscode-languageserver-types@3.18.3: {}
+
+ vscode-languageserver@9.0.1:
+ dependencies:
+ vscode-languageserver-protocol: 3.17.5
+
+ vscode-nls@5.2.0: {}
+
+ vscode-uri@3.2.0: {}
+
watchpack@2.5.2:
dependencies:
graceful-fs: 4.2.11
@@ -8367,6 +12085,8 @@ snapshots:
dependencies:
defaults: 1.0.4
+ web-namespaces@2.0.1: {}
+
webpack-cli@6.0.1(webpack-dev-server@5.2.6)(webpack@5.108.4):
dependencies:
'@discoveryjs/json-ext': 0.6.3
@@ -8384,7 +12104,7 @@ snapshots:
webpack: 5.108.4(@swc/core@1.16.0)(clean-css@5.3.3)(esbuild@0.28.1)(html-minifier-terser@6.1.0)(lightningcss@1.32.0)(postcss@8.5.20)(webpack-cli@6.0.1)
webpack-merge: 6.0.1
optionalDependencies:
- webpack-dev-server: 5.2.6(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1)(webpack-cli@6.0.1)(webpack@5.108.4)
+ webpack-dev-server: 5.2.6(supports-color@8.1.1)(webpack-cli@6.0.1)(webpack@5.108.4)
webpack-dev-middleware@7.4.5(webpack@5.108.4):
dependencies:
@@ -8397,7 +12117,7 @@ snapshots:
optionalDependencies:
webpack: 5.108.4(@swc/core@1.16.0)(clean-css@5.3.3)(esbuild@0.28.1)(html-minifier-terser@6.1.0)(lightningcss@1.32.0)(postcss@8.5.20)(webpack-cli@6.0.1)
- webpack-dev-server@5.2.6(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1)(webpack-cli@6.0.1)(webpack@5.108.4):
+ webpack-dev-server@5.2.6(supports-color@8.1.1)(webpack-cli@6.0.1)(webpack@5.108.4):
dependencies:
'@types/bonjour': 3.5.13
'@types/connect-history-api-fallback': 1.5.4
@@ -8415,7 +12135,7 @@ snapshots:
connect-history-api-fallback: 2.0.0
express: 4.22.2(supports-color@8.1.1)
graceful-fs: 4.2.11
- http-proxy-middleware: 2.0.10(@types/express@4.17.25)(debug@4.4.3(supports-color@8.1.1))
+ http-proxy-middleware: 2.0.10(@types/express@4.17.25)
ipaddr.js: 2.5.0
launch-editor: 2.14.1
open: 10.2.0
@@ -8484,6 +12204,44 @@ snapshots:
- postcss
- uglify-js
+ webpack@5.108.4(esbuild@0.28.1):
+ dependencies:
+ '@types/estree': 1.0.9
+ '@types/json-schema': 7.0.15
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/wasm-edit': 1.14.1
+ '@webassemblyjs/wasm-parser': 1.14.1
+ acorn: 8.17.0
+ acorn-import-phases: 1.0.4(acorn@8.17.0)
+ browserslist: 4.28.6
+ chrome-trace-event: 1.0.4
+ enhanced-resolve: 5.24.3
+ es-module-lexer: 2.3.1
+ eslint-scope: 5.1.1
+ events: 3.3.0
+ graceful-fs: 4.2.11
+ loader-runner: 4.3.2
+ mime-db: 1.54.0
+ minimizer-webpack-plugin: 5.6.1(esbuild@0.28.1)(webpack@5.108.4(esbuild@0.28.1))
+ neo-async: 2.6.2
+ schema-utils: 4.3.3
+ tapable: 2.3.3
+ watchpack: 2.5.2
+ webpack-sources: 3.5.1
+ transitivePeerDependencies:
+ - '@minify-html/node'
+ - '@swc/core'
+ - '@swc/css'
+ - '@swc/html'
+ - clean-css
+ - cssnano
+ - csso
+ - esbuild
+ - html-minifier-terser
+ - lightningcss
+ - postcss
+ - uglify-js
+
websocket-driver@0.7.5:
dependencies:
http-parser-js: 0.5.10
@@ -8566,8 +12324,29 @@ snapshots:
dependencies:
is-wsl: 3.1.1
+ xxhash-wasm@1.1.0: {}
+
y18n@5.0.8: {}
+ yaml-language-server@1.23.0:
+ dependencies:
+ '@vscode/l10n': 0.0.18
+ ajv: 8.20.0
+ ajv-draft-04: 1.0.0(ajv@8.20.0)
+ ajv-i18n: 4.2.0(ajv@8.20.0)
+ prettier: 3.9.6
+ request-light: 0.5.8
+ vscode-json-languageservice: 4.1.8
+ vscode-languageserver: 9.0.1
+ vscode-languageserver-textdocument: 1.0.14
+ vscode-languageserver-types: 3.18.3
+ vscode-uri: 3.2.0
+ yaml: 2.8.3
+
+ yaml@2.8.3: {}
+
+ yaml@2.9.0: {}
+
yargs-parser@22.0.0: {}
yargs@18.0.0:
@@ -8582,3 +12361,7 @@ snapshots:
yocto-queue@1.2.2: {}
zimmerframe@1.1.4: {}
+
+ zod@4.5.4: {}
+
+ zwitch@2.0.4: {}
diff --git a/website/astro.config.js b/website/astro.config.js
new file mode 100644
index 0000000..fdf3b80
--- /dev/null
+++ b/website/astro.config.js
@@ -0,0 +1,145 @@
+import { defineConfig } from 'astro/config'
+import { unified } from '@astrojs/markdown-remark'
+import starlight from '@astrojs/starlight'
+import llmsTxt from 'starlight-llms-txt'
+import { viewTransitions } from 'astro-vtbot/starlight-view-transitions'
+import { rehypeNormalizeContent } from './rehype.js'
+
+export default defineConfig({
+ site: 'https://srcset.js.org',
+ markdown: {
+ processor: unified({
+ rehypePlugins: [rehypeNormalizeContent]
+ })
+ },
+ integrations: [
+ starlight({
+ title: 'srcset',
+ description: 'Highly customizable tools for generating responsive images: build-time generation, image proxy adapters and framework components - without vendor and server lock-in.',
+ favicon: '/favicon.svg',
+ head: [
+ {
+ // GitHub Pages can't set COOP/COEP headers, which StackBlitz
+ // WebContainers embeds require; this service worker injects them
+ tag: 'script',
+ attrs: {
+ src: '/coi-serviceworker.js'
+ }
+ },
+ {
+ tag: 'meta',
+ attrs: {
+ name: 'format-detection',
+ content: 'telephone=no'
+ }
+ },
+ {
+ tag: 'meta',
+ attrs: {
+ property: 'og:image',
+ content: 'https://srcset.js.org/og-image.jpg'
+ }
+ },
+ {
+ tag: 'meta',
+ attrs: {
+ property: 'og:image:width',
+ content: '1200'
+ }
+ },
+ {
+ tag: 'meta',
+ attrs: {
+ property: 'og:image:height',
+ content: '630'
+ }
+ },
+ {
+ tag: 'meta',
+ attrs: {
+ property: 'og:image:type',
+ content: 'image/jpeg'
+ }
+ },
+ {
+ tag: 'meta',
+ attrs: {
+ name: 'twitter:card',
+ content: 'summary_large_image'
+ }
+ },
+ {
+ tag: 'meta',
+ attrs: {
+ name: 'twitter:image',
+ content: 'https://srcset.js.org/og-image.jpg'
+ }
+ }
+ ],
+ social: [
+ {
+ label: 'GitHub',
+ icon: 'github',
+ href: 'https://github.com/TrigenSoftware/srcset'
+ }
+ ],
+ editLink: {
+ baseUrl: 'https://github.com/TrigenSoftware/srcset/edit/main/website/'
+ },
+ plugins: [llmsTxt(), viewTransitions()],
+ sidebar: [
+ {
+ label: 'Getting Started',
+ items: [{
+ autogenerate: {
+ directory: 'getting-started'
+ }
+ }]
+ },
+ {
+ label: 'Integrations',
+ items: [{
+ autogenerate: {
+ directory: 'integrations'
+ }
+ }]
+ },
+ {
+ label: 'Components',
+ link: '/components/'
+ },
+ {
+ label: 'Proxies',
+ items: [{
+ autogenerate: {
+ directory: 'proxies'
+ }
+ }]
+ },
+ {
+ label: 'API',
+ items: [{
+ autogenerate: {
+ directory: 'api'
+ }
+ }]
+ },
+ {
+ label: 'Examples',
+ items: [{
+ autogenerate: {
+ directory: 'examples'
+ }
+ }]
+ }
+ ],
+ customCss: ['./src/styles/global.css'],
+ expressiveCode: {
+ themes: ['github-dark-high-contrast', 'github-light-default'],
+ frames: {
+ extractFileNameFromCode: false
+ }
+ }
+ })
+ ]
+})
diff --git a/website/oxlint.config.ts b/website/oxlint.config.ts
new file mode 100644
index 0000000..0b6fab3
--- /dev/null
+++ b/website/oxlint.config.ts
@@ -0,0 +1,34 @@
+import { defineConfig } from '@trigen/oxlint'
+import moduleConfig from '@trigen/oxlint-config/module'
+import tsTypeCheckedConfig from '@trigen/oxlint-config/typescript-type-checked'
+import rootConfig from '../oxlint.config.ts'
+
+export default defineConfig({
+ ignorePatterns: [
+ '.astro/',
+ 'dist/',
+ 'src/content.config.ts',
+ 'src/env.d.ts'
+ ],
+ extends: [
+ rootConfig,
+ moduleConfig,
+ tsTypeCheckedConfig
+ ],
+ env: {
+ node: true
+ },
+ overrides: [
+ {
+ // Classic script served as a static asset, not a module
+ files: ['public/**'],
+ env: {
+ browser: true,
+ serviceworker: true
+ },
+ rules: {
+ 'import/unambiguous': 'off'
+ }
+ }
+ ]
+})
diff --git a/website/package.json b/website/package.json
new file mode 100644
index 0000000..b8a2718
--- /dev/null
+++ b/website/package.json
@@ -0,0 +1,37 @@
+{
+ "name": "website",
+ "type": "module",
+ "private": true,
+ "version": "0.0.0",
+ "description": "Documentation website for srcset.",
+ "author": "dangreen",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/TrigenSoftware/srcset.git",
+ "directory": "website"
+ },
+ "bugs": {
+ "url": "https://github.com/TrigenSoftware/srcset/issues"
+ },
+ "scripts": {
+ "clear": "del ./.astro ./dist",
+ "dev": "astro dev",
+ "build": "run [ astro check ] [ astro build ]",
+ "preview": "astro preview",
+ "astro": "astro",
+ "lint": "oxlint"
+ },
+ "dependencies": {
+ "@astrojs/check": "^0.9.9",
+ "@astrojs/markdown-remark": "^7.2.0",
+ "@astrojs/starlight": "^0.41.1",
+ "astro": "^7.0.4",
+ "astro-vtbot": "^3.0.0",
+ "starlight-llms-txt": "^0.11.0"
+ },
+ "devDependencies": {
+ "sharp": "^0.35.0",
+ "typescript": "^6.0.0"
+ }
+}
diff --git a/website/public/coi-serviceworker.js b/website/public/coi-serviceworker.js
new file mode 100644
index 0000000..8130ffe
--- /dev/null
+++ b/website/public/coi-serviceworker.js
@@ -0,0 +1,47 @@
+const pagesWithEmbeds = /^\/examples(?:\/|$)/
+
+if (typeof window === 'undefined') {
+ self.addEventListener('install', () => self.skipWaiting())
+ self.addEventListener('activate', event => event.waitUntil(self.clients.claim()))
+
+ self.addEventListener('fetch', (event) => {
+ const request = event.request
+
+ if (request.mode !== 'navigate' || !pagesWithEmbeds.test(new URL(request.url).pathname)) {
+ return
+ }
+
+ event.respondWith(
+ fetch(request).then((response) => {
+ if (response.status === 0) {
+ return response
+ }
+
+ const newHeaders = new Headers(response.headers)
+
+ newHeaders.set('Cross-Origin-Embedder-Policy', 'require-corp')
+ newHeaders.set('Cross-Origin-Opener-Policy', 'same-origin')
+
+ return new Response(response.body, {
+ status: response.status,
+ statusText: response.statusText,
+ headers: newHeaders
+ })
+ })
+ )
+ })
+} else if (window.crossOriginIsolated === false && window.isSecureContext && navigator.serviceWorker) {
+ void navigator.serviceWorker.register(window.document.currentScript.src).then((registration) => {
+ if (!pagesWithEmbeds.test(window.location.pathname)) {
+ return
+ }
+
+ if (registration.active && !navigator.serviceWorker.controller) {
+ window.location.reload()
+ } else {
+ navigator.serviceWorker.addEventListener('controllerchange', () => window.location.reload(), {
+ once: true
+ })
+ }
+ })
+}
diff --git a/website/public/favicon.svg b/website/public/favicon.svg
new file mode 100644
index 0000000..45edd36
--- /dev/null
+++ b/website/public/favicon.svg
@@ -0,0 +1 @@
+
diff --git a/website/public/og-image.jpg b/website/public/og-image.jpg
new file mode 100644
index 0000000..9044438
Binary files /dev/null and b/website/public/og-image.jpg differ
diff --git a/website/public/robots.txt b/website/public/robots.txt
new file mode 100644
index 0000000..2763dad
--- /dev/null
+++ b/website/public/robots.txt
@@ -0,0 +1,4 @@
+User-agent: *
+Allow: /
+
+Sitemap: https://srcset.js.org/sitemap-index.xml
diff --git a/website/rehype.js b/website/rehype.js
new file mode 100644
index 0000000..4eed735
--- /dev/null
+++ b/website/rehype.js
@@ -0,0 +1,73 @@
+function visitElements(node, callback) {
+ const children = node.children
+
+ if (!Array.isArray(children)) {
+ return
+ }
+
+ for (let index = 0; index < children.length; index++) {
+ const child = children[index]
+
+ if (child.type === 'element') {
+ callback(child, index, node)
+ }
+
+ visitElements(child, callback)
+ }
+}
+
+function normalizeInternalHref(href) {
+ if (
+ typeof href !== 'string'
+ || !href
+ || href.startsWith('#')
+ || href.startsWith('//')
+ || /^[a-z][a-z\d+.-]*:/i.test(href)
+ ) {
+ return undefined
+ }
+
+ const match = href.match(/^([^?#]*)([?#].*)?$/)
+ const pathname = match?.[1] || ''
+
+ if (
+ !pathname
+ || pathname === '/'
+ || pathname.endsWith('/')
+ || /(?:^|\/)[^/]+\.[^/]+$/.test(pathname)
+ ) {
+ return undefined
+ }
+
+ return `${pathname}/${match?.[2] || ''}`
+}
+
+export function rehypeNormalizeContent() {
+ return (tree) => {
+ visitElements(tree, (node, index, parent) => {
+ if (node.tagName === 'a') {
+ const href = normalizeInternalHref(node.properties?.href)
+
+ if (href) {
+ node.properties.href = href
+ }
+ }
+
+ if (
+ node.tagName !== 'table'
+ || parent?.properties?.className?.includes('sr-table-wrapper')
+ ) {
+ return
+ }
+
+ parent.children[index] = {
+ type: 'element',
+ tagName: 'div',
+ properties: {
+ className: ['sr-table-wrapper']
+ },
+ children: [node]
+ }
+ })
+ }
+}
diff --git a/website/src/assets/srcset-dark.svg b/website/src/assets/srcset-dark.svg
new file mode 100644
index 0000000..5982fdc
--- /dev/null
+++ b/website/src/assets/srcset-dark.svg
@@ -0,0 +1,23 @@
+
diff --git a/website/src/assets/srcset-light.svg b/website/src/assets/srcset-light.svg
new file mode 100644
index 0000000..3dbb389
--- /dev/null
+++ b/website/src/assets/srcset-light.svg
@@ -0,0 +1,23 @@
+
diff --git a/website/src/content.config.ts b/website/src/content.config.ts
new file mode 100644
index 0000000..2818beb
--- /dev/null
+++ b/website/src/content.config.ts
@@ -0,0 +1,10 @@
+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/website/src/content/docs/api/core.mdx b/website/src/content/docs/api/core.mdx
new file mode 100644
index 0000000..e4646a5
--- /dev/null
+++ b/website/src/content/docs/api/core.mdx
@@ -0,0 +1,375 @@
+---
+title: Core
+description: '@srcset/core: the image generator, the disk cache storage, matching, metadata, formats and path helpers behind every build-time integration.'
+sidebar:
+ order: 1
+---
+
+import { Tabs, TabItem, Aside } from '@astrojs/starlight/components'
+
+`@srcset/core` is the image processing engine: it resizes, converts and optimizes images with [sharp](https://sharp.pixelplumbing.com/). The [Vite plugin](/integrations/vite-plugin/), the [loader](/integrations/loader/) and the [cli](/integrations/cli/) are wrappers around it, and those are the normal entry points.
+
+Use the package directly when there is no integration to wrap it for you: a static site generator, an asset script, a plugin for another bundler, a test fixture builder.
+
+
+
+ ```sh frame="none"
+ pnpm add -D @srcset/core
+ ```
+
+
+ ```sh frame="none"
+ yarn add -D @srcset/core
+ ```
+
+
+ ```sh frame="none"
+ npm i -D @srcset/core
+ ```
+
+
+
+The package is ESM-only and needs Node 22 or newer.
+
+## SrcSetGenerator
+
+The generator takes a source file and yields the variants, one object per generated file. Nothing is written to disk: what to do with the contents is up to the caller.
+
+```js title="generate.js"
+import { readFile, writeFile, mkdir } from 'node:fs/promises'
+import { dirname, join } from 'node:path'
+import { SrcSetGenerator } from '@srcset/core'
+
+const generator = new SrcSetGenerator()
+const source = {
+ path: 'images/photo.jpg',
+ contents: await readFile('images/photo.jpg')
+}
+
+for await (const image of generator.generate(source, {
+ width: [1, 0.5, 320],
+ format: ['jpg', 'webp', 'avif']
+})) {
+ const target = join('dist', image.path)
+
+ await mkdir(dirname(target), {
+ recursive: true
+ })
+ await writeFile(target, image.contents)
+}
+```
+
+For a 3120 pixels wide source that writes nine files, every variant path keeping the directory of the source path:
+
+```
+dist/images/photo.jpg 3120w
+dist/images/photo@1560w.jpg 1560w
+dist/images/photo@320w.jpg 320w
+dist/images/photo.webp 3120w
+dist/images/photo@1560w.webp 1560w
+dist/images/photo@320w.webp 320w
+dist/images/photo.avif 3120w
+dist/images/photo@1560w.avif 1560w
+dist/images/photo@320w.avif 320w
+```
+
+### Constructor options
+
+| Option | Type | Description |
+| --- | --- | --- |
+| `processing` | `ProcessingOptions` | [sharp output options](https://sharp.pixelplumbing.com/api-output/) per format. Merged onto [`defaultProcessing`](#defaults) format by format. |
+| `optimization` | `OptimizationOptions` | Custom optimizer functions per format, applied to the encoded contents. The only way to touch svg. |
+| `skipOptimization` | `boolean` | Pass a variant through unchanged when it needs no resize and already has the source format, and skip the custom optimizers. Defaults to `false`. |
+| `scalingUp` | `boolean` | Emit variants requested wider than the source, capped at the source width. Defaults to `true`. Pixels are never upscaled either way. |
+| `postfix` | `string \| PostfixFormatter` | Postfix for the variant file name. Defaults to [`defaultPostfix`](#defaults), which produces `@w`. |
+| `concurrency` | `number` | Number of variants encoded at once. Defaults to `availableParallelism()`. Ignored when `limit` is set. |
+| `limit` | `LimitFunction` | A [p-limit](https://github.com/sindresorhus/p-limit) function, to share one concurrency budget between several generators. |
+| `cache` | `SrcSetCacheStorage` | [Disk cache storage](#srcsetcachestorage): repeated generation reads the stored variants instead of encoding them again. |
+
+### generate
+
+```ts
+generate(source: ImageSource, options?: GenerateOptions): AsyncGenerator
+```
+
+`source` is `{ path, contents }`: a path string and a contents buffer, anything else throws a `TypeError`. The path is only used to name the variants and to match them - the file is never read from disk.
+
+`options` are the constructor options above, minus `concurrency`, `limit` and `cache`, plus the two that say what to generate:
+
+| Option | Type | Description |
+| --- | --- | --- |
+| `format` | `ImageFormat \| ImageFormat[]` | Formats to convert to. Defaults to the source format. |
+| `width` | `number \| number[]` | Widths to resize to. A value less than or equal to 1 is a multiplier of the source width, above 1 it is absolute pixels. Defaults to `1`. |
+
+Every format is paired with every width, so `3` formats and `3` widths yield up to `9` variants. What happens around the edges:
+
+- Format names are normalized before use, so `jpeg` is `jpg` and `heif` is `avif`. An unsupported one throws `Unsupported image format: "tiff"`.
+- Widths must be finite and positive, and an absolute one must be an integer: `600.5` throws `Invalid width: 600.5`.
+- **Pixels are never upscaled.** A width above the source width resolves to the source width, and the postfix is built from the actual width: `5000` on a 3120 pixels wide source produces `photo@3120w.jpg`. With `scalingUp: false` such a variant is dropped instead.
+- Variants that resolve to the same file - same format, same postfix, same target width - are generated once. When both a multiplier and an absolute width land on that file, the multiplier wins, so `originMultiplier` survives.
+- **Svg is passed through, never resized or converted.** An svg source yields a single variant, its own contents with the `optimization.svg` optimizer applied, and only when `format` is unset or includes `svg`. A raster source with `format: 'svg'` yields nothing for it.
+- Animated sources keep their frames in `gif` and `webp` only. Converting to jpg, png or avif flattens them to the first frame.
+- Variants are encoded in parallel under the concurrency limit and yielded in the requested order.
+
+The source is auto-oriented before encoding: browsers honour the EXIF orientation and re-encoding drops the tag, so the pixels are rotated instead and every variant renders the same way.
+
+### generateAll
+
+```ts
+generateAll(source: ImageSource, rules: SrcSetRule[]): AsyncGenerator
+```
+
+The same generation driven by [rules](/getting-started/rules/) - a `match` plus the generate options - which is what the integrations expose:
+
+```js
+for await (const image of generator.generateAll(source, [
+ {
+ match: '**/*.png',
+ width: [1, 0.5],
+ format: ['png', 'webp']
+ },
+ {
+ width: [1, 0.5],
+ format: ['jpg', 'webp', 'avif']
+ }
+])) {
+ // ...
+}
+```
+
+Rules are tried in order and the first matching one is the only one applied, unless it sets `fallthrough: true`. A rule without `match` matches every readable image, so it belongs last. Across fallthrough rules the same variant path is produced once - the first rule to reach it wins.
+
+An image no rule matched yields nothing at all, which is the usual reason an integration produces an empty module.
+
+### SrcSetImage
+
+Every yielded variant:
+
+| Field | Type | Description |
+| --- | --- | --- |
+| `path` | `string` | Variant file path: the source path with the postfix and the format extension applied. |
+| `contents` | `Buffer` | Encoded variant contents. |
+| `format` | `ImageFormat` | Normalized format of the variant. |
+| `width` | `number` | Actual width in pixels. |
+| `height` | `number` | Actual height in pixels. For an animated image, the height of a single frame. |
+| `postfix` | `string` | Postfix applied to the file name, e.g. `@1560w`. |
+| `originMultiplier` | `number \| null` | The multiplier the variant was requested with, or `null` for an absolute width. |
+| `cacheKey` | `string \| undefined` | Manifest key, set when the variant went through the [cache storage](#srcsetcachestorage). |
+
+## SrcSetCacheStorage
+
+A disk storage that memoizes the generation: a variant is written next to a manifest describing it, and a repeated run with the same source, options and variant reads it back instead of encoding it again. This is what makes the second build of a project fast.
+
+```js
+import { SrcSetGenerator, SrcSetCacheStorage } from '@srcset/core'
+
+const cache = new SrcSetCacheStorage({
+ dir: 'node_modules/.cache/srcset'
+})
+const generator = new SrcSetGenerator({
+ cache
+})
+
+// ... generate everything the build needs, then:
+
+await cache.prune()
+```
+
+| Option | Type | Description |
+| --- | --- | --- |
+| `dir` | `string` | Directory to store the variants and their manifests in. Required. |
+| `maxAge` | `number` | Maximum age of an unused entry in milliseconds. Defaults to 30 days. |
+
+### How entries are addressed
+
+`getKey(context, variant)` returns the address of a variant - a manifest key and a stored file path - and it is derived from the inputs alone, so it is known before anything is encoded:
+
+```ts
+const { key, path } = cache.getKey(context, variant)
+```
+
+The key is a sha256 of the source contents, the posix form of the source path, the variant, the processing and optimization options, the postfix, `skipOptimization`, `scalingUp`, and an environment stamp made of the storage version and `sharp.versions`. Upgrading sharp to a version that encodes differently therefore invalidates the storage on its own.
+
+Function options, like custom optimizers and a postfix formatter, are serialized by their source text: editing an optimizer invalidates its entries. The flip side is that a postfix formatter must be pure - it is called repeatedly for the same variant, including for variants that end up skipped, and its output is part of the address.
+
+The storage is flat, so the key prefixes the file name - variant names are not unique across sources and options:
+
+```
+node_modules/.cache/srcset/
+ .json manifest: path, usedAt, contents hash, format, width, height, postfix, originMultiplier
+ -photo@320w.avif the variant contents
+```
+
+`getStoredPath(key, name)` builds that second path, and `SrcSetImage.cacheKey` carries the key, which is how the Vite dev server serves variants straight from the storage instead of holding them in memory.
+
+### Methods
+
+| Method | Description |
+| --- | --- |
+| `getKey(context, variant)` | Address of a variant: `{ key, path }`. `variant` is `null` for the svg passthrough. |
+| `memo(context, variant, fn)` | Read the stored variant, or call `fn`, store the result and return it with `cacheKey` set. |
+| `prune()` | Remove the entries unused for longer than `maxAge`. |
+| `write(path, contents)` | Write a file to the storage, through a temporary file and an atomic rename. |
+| `read(path, encoding?)` | Read a stored file: a `Buffer`, or a string when an encoding is given. |
+| `readStream(path)` | Read stream of a stored file, for serving it without buffering. |
+
+`path` here is always a flat file name from a cache address; anything with a path separator in it throws, so a key cannot escape the storage directory.
+
+A cache hit verifies the stored contents against the hash in its manifest and falls back to generating on a mismatch, so a half-written or damaged file costs a re-encode rather than a broken build. A missing manifest or a missing file does the same.
+
+### Pruning
+
+
+
+`prune()` runs once per storage instance - repeated calls return the same promise - and removes:
+
+- entries whose manifest says they were last used longer than `maxAge` ago, and entries whose manifest cannot be parsed at all - an unusable entry is stale;
+- entries with no manifest, and only when their files are all older than a five minute grace period. The grace tells a leftover of a crashed build from an entry another build is writing right now.
+
+A manifest that fails to read for any other reason - a permission error, a busy disk - says nothing about the entry, so it is kept.
+
+The used-at mark lives in the manifest rather than in the file mtime, because archives and cache restores do not always carry timestamps. It is rewritten at most once per tenth of `maxAge`: a mark only has to separate a used entry from an abandoned one, and a manifest write per hit would cost more than it saves.
+
+Files that do not look like entries of this storage - anything whose name does not start with a 64 character hex key - are left alone. The directory is configurable, and files of other tools are not this storage's to remove.
+
+## Matching
+
+```ts
+matchImage(source: ImageSource, matcher?: Matcher | Matcher[] | null): Promise
+```
+
+`Matcher` is a glob string, a CSS media query string, or a `MatcherFunction`:
+
+```js
+await matchImage(source, '**/*.jpg') // glob, matched against the posix path
+await matchImage(source, '(min-width: 1920px)') // media query, matched against the source size
+await matchImage(source, (path, size) => size.width > size.height)
+```
+
+- A string containing a size feature - `width`, `height`, `min-width`, `max-width`, `min-height`, `max-height` in parentheses - is treated as a media query; every other string is a [picomatch](https://github.com/micromatch/picomatch) glob.
+- Paths are normalized to posix separators first, so one glob works on every platform.
+- An **array of matchers is an and**: every one of them has to match. Use separate rules for "either".
+- A nullish matcher matches any readable image.
+- An image whose metadata cannot be read - an unsupported or broken file - never matches, so it is skipped rather than failing the run.
+
+A `MatcherFunction` receives `(path, size, source)`, where `path` is the original source path, `size` is `{ width, height }` and `source` is the whole `ImageSource`.
+
+## Metadata
+
+```ts
+getImageMetadata(source: ImageSource): Promise
+```
+
+| Field | Type | Description |
+| --- | --- | --- |
+| `format` | `ImageFormat` | Normalized format, read from the contents and falling back to the file extension. |
+| `width` | `number` | Width in pixels. |
+| `height` | `number` | Height in pixels. For an animated image, the height of a single frame. |
+| `animated` | `boolean` | The image has more than one frame. |
+
+The size is the oriented one: sharp reports the stored dimensions, but browsers honour the EXIF orientation and the generator auto-orients, so a portrait shot stored as landscape with an orientation tag reports its portrait size here. An unsupported format, or a file whose dimensions cannot be read, throws.
+
+Results are cached by the contents buffer in a `WeakMap`, so calling it repeatedly for the same buffer - which matching and generation both do - costs one read.
+
+## Formats
+
+```js
+import {
+ supportedFormats,
+ mimeTypes,
+ normalizeFormat,
+ isSupportedFormat,
+ getFormatFromPath
+} from '@srcset/core'
+```
+
+`supportedFormats` is `['avif', 'webp', 'jpg', 'png', 'gif', 'svg']`, and `ImageFormat` is the union of those. `mimeTypes` maps them:
+
+| Format | Mime type |
+| --- | --- |
+| `avif` | `image/avif` |
+| `webp` | `image/webp` |
+| `jpg` | `image/jpeg` |
+| `png` | `image/png` |
+| `gif` | `image/gif` |
+| `svg` | `image/svg+xml` |
+
+- `normalizeFormat(format)` lowercases the name and resolves the aliases `jpeg` to `jpg` and `heif` to `avif`.
+- `isSupportedFormat(format)` is a type guard over a normalized name.
+- `getFormatFromPath(path)` takes the extension and normalizes it: `photo.JPG` is `jpg`.
+
+## Paths
+
+```js
+import {
+ toPosixPath,
+ renameImagePath,
+ formatPostfix,
+ resolveVariant
+} from '@srcset/core'
+```
+
+| Function | Description |
+| --- | --- |
+| `toPosixPath(path)` | Replace backslashes with slashes. Bundlers feed native and posix paths alike; everything downstream expects posix. |
+| `renameImagePath(path, postfix, format)` | Add the postfix to the file name and replace the extension: `renameImagePath('images/photo.jpg', '@600w', 'webp')` is `images/photo@600w.webp`. |
+| `formatPostfix(postfix, width, requestedWidth, format)` | Apply a postfix string or formatter. A string is returned as it is. |
+| `resolveVariant(context, variant)` | Resolve a variant before generating it: `{ requestedWidth, targetWidth, postfix, path }`. `targetWidth` is the requested width capped by the source width; `variant` is `null` for the svg passthrough, which keeps the source path. |
+
+## Defaults
+
+```js
+import {
+ defaultProcessing,
+ defaultPostfix,
+ mergeProcessingOptions
+} from '@srcset/core'
+```
+
+`defaultProcessing` is `{ jpg: { mozjpeg: true }, png: { palette: true } }`. Both were chosen empirically by SSIM and file size: `mozjpeg` gives around 30% smaller jpg files at the same quality, and `palette` enables lossy quantization for png, the way `pngquant` does. The sharp defaults for webp and avif are good as they are.
+
+`mergeProcessingOptions(base, override)` merges per format, which is what the generator does with the options it is given: `processing: { jpg: { quality: 80 } }` keeps the default `mozjpeg: true` instead of replacing the whole `jpg` object.
+
+`defaultPostfix` is a `PostfixFormatter`, `(width, requestedWidth, format) => string`. It returns `@w` built from the actual output width, and an empty string for the original-size variant - the one requested with the multiplier `1`, whose file name stays the source file name.
+
+## Concurrency
+
+```ts
+parallel(items, handler, limit?): AsyncGenerator>>
+```
+
+The helper the generator runs on: it starts every task under the [p-limit](https://github.com/sindresorhus/p-limit) function and yields the results **in the original order**, skipping nullish ones. Without a `limit` it makes its own, sized by `availableParallelism()`.
+
+Encoding is CPU bound, so one budget per process is what you want. Several generators - one per rule set, or one per output directory - should share a single `limit`:
+
+```js
+import { availableParallelism } from 'node:os'
+import pLimit from 'p-limit'
+import { SrcSetGenerator } from '@srcset/core'
+
+const limit = pLimit(availableParallelism())
+const thumbnails = new SrcSetGenerator({ limit })
+const heroes = new SrcSetGenerator({ limit })
+```
+
+## Types
+
+Every type is exported from the package root:
+
+| Type | What it describes |
+| --- | --- |
+| `ImageSource` | The input: `{ path, contents }`. |
+| `ImageMetadata` | Result of `getImageMetadata`. |
+| `SrcSetImage` | A generated variant. |
+| `ImageVariant` | A format plus a width to generate: what `getKey` and `resolveVariant` address. |
+| `SrcSetRule` | A `generateAll` rule: `match`, `fallthrough` and the generate options. |
+| `SrcSetGeneratorOptions`, `GenerateOptions` | Constructor and per-call options. |
+| `GenerateContext` | The resolved inputs of one `generate` call, passed to the cache storage. |
+| `ProcessingOptions`, `OptimizationOptions`, `ImageOptimizer` | Encoder options and custom optimizers. |
+| `Postfix`, `PostfixFormatter` | Variant file name postfix. |
+| `Matcher`, `MatcherFunction`, `ImageSize` | Matching. |
+| `ImageFormat` | Union of the supported formats. |
+| `SrcSetCacheStorageOptions`, `CacheAddress` | Cache storage options and addresses. |
+| `ResolvedVariant` | Result of `resolveVariant`. |
diff --git a/website/src/content/docs/api/runtime.mdx b/website/src/content/docs/api/runtime.mdx
new file mode 100644
index 0000000..7abae84
--- /dev/null
+++ b/website/src/content/docs/api/runtime.mdx
@@ -0,0 +1,174 @@
+---
+title: Runtime
+description: '@srcset/runtime: the SrcSetEntry shape, attribute builders for img and source elements, and the srcset string helpers.'
+sidebar:
+ order: 2
+---
+
+import { Tabs, TabItem, Aside } from '@astrojs/starlight/components'
+
+`@srcset/runtime` is the only part of srcset that reaches the browser: it turns generated variants into DOM attributes. Zero dependencies, tree-shakable, and the whole public surface is tested against a 1 kB budget.
+
+Everything else in the project speaks its language: the [image modules](/getting-started/image-modules/) of the bundler integrations, the [baked modules](/integrations/baking/) of the cli and the [proxy adapters](/proxies/) all produce arrays of `SrcSetEntry`, and the [framework components](/components/) are built on the two functions below.
+
+Install it as a regular dependency, not a dev one - it ships:
+
+
+
+ ```sh frame="none"
+ pnpm add @srcset/runtime
+ ```
+
+
+ ```sh frame="none"
+ yarn add @srcset/runtime
+ ```
+
+
+ ```sh frame="none"
+ npm i @srcset/runtime
+ ```
+
+
+
+## SrcSetEntry
+
+One generated image variant:
+
+| Field | Type | Description |
+| --- | --- | --- |
+| `id` | `string` | Id of the variant: the format plus the width by default, e.g. `webp600`. The key under which the variant sits in [`srcMap`](/getting-started/image-modules/); a build-time integration can change the scheme with `resourceId`. |
+| `format` | `ImageFormat` | `avif`, `webp`, `jpg`, `png`, `gif` or `svg`. |
+| `type` | `string` | Mime type of the variant, e.g. `image/webp`. What the `` grouping runs on. |
+| `width` | `number` | Width in pixels. Becomes the `w` descriptor. |
+| `height` | `number \| undefined` | Height in pixels. **Optional**: a build-time variant knows it, a runtime-built one - an imgproxy or Cloudflare url - does not. |
+| `url` | `string` | Url of the variant. |
+
+```ts
+import type { SrcSetEntry } from '@srcset/runtime'
+```
+
+The `srcSet` export of an [image module](/getting-started/image-modules/) is a `SrcSetEntry[]`, and its `src` export is the one entry the module selected for the `` - by default the variant matching the source format and width, or the first generated one when there is no such variant.
+
+## getImageProps
+
+```ts
+getImageProps(
+ src: SrcSetEntry | undefined,
+ srcSet: SrcSetEntry[] | string | undefined
+): ImageSrcProps
+```
+
+Builds the two attributes of an `` - the exported `ImageSrcProps` is `{ src?: string, srcSet?: string }`, both optional:
+
+```js
+import { getImageProps } from '@srcset/runtime'
+import { src, srcSet } from './photo.jpg'
+
+getImageProps(src, srcSet)
+// {
+// src: '/photo.jpg',
+// srcSet: '/photo.jpg 1200w, /photo@600w.jpg 600w'
+// }
+```
+
+The `srcSet` string holds **only the variants of the `src` format**. A single `` gets one `srcset` attribute, and a browser picks a candidate from it by width alone - mixing formats in there would hand avif to a browser that cannot decode it. Formats belong in `` elements, which is what [`getSourceProps`](#getsourceprops) is for.
+
+The rest of the behaviour:
+
+- **A `srcSet` that would duplicate `src` is omitted.** With one variant of the `src` format there is nothing to choose from, so the result is just `{ src }` and the markup stays clean.
+- **A ready string passes through.** `getImageProps(src, '/photo.jpg 1x, /photo@2x.jpg 2x')` returns it untouched as the `srcSet`, next to the `src` url, which is how a component accepts both an array and a hand-written `srcset`.
+- **Without `src`** the whole set becomes the `srcSet` string, formats included - for a ``-like case where the caller has already narrowed the set.
+- **Without either** the result is an empty object, so nothing is rendered rather than an `src=""` that requests the current page.
+
+
+
+## getSourceProps
+
+```ts
+getSourceProps(srcSet: SrcSetEntry[]): { type: string, srcSet: string }[]
+```
+
+Builds the `` elements of a ``, one per mime type:
+
+```js
+getSourceProps(srcSet)
+// [
+// { type: 'image/avif', srcSet: '/photo.avif 1200w, /photo@600w.avif 600w' },
+// { type: 'image/webp', srcSet: '/photo.webp 1200w, /photo@600w.webp 600w' },
+// { type: 'image/jpeg', srcSet: '/photo.jpg 1200w, /photo@600w.jpg 600w' }
+// ]
+```
+
+Two things happen there, and both matter.
+
+**Grouping by `type`.** A browser picks the first `` whose `type` it can decode, then chooses a candidate from that source's `srcset` by width. So one `` per format, each carrying every width of that format.
+
+**Ordering by format efficiency.** Avif first, then webp, then every other mime type in the order it appeared in the array. The browser takes the *first* source it can decode and never looks further, so the order in the markup is the preference: a browser without avif falls to webp, one without either falls through to the ``. The format order of the generation rule does not carry over here - avif and webp are hoisted to the front wherever they sat in it.
+
+Put together, by hand:
+
+```jsx title="Photo.jsx"
+import { getImageProps, getSourceProps } from '@srcset/runtime'
+import { src, srcSet } from './photo.jpg'
+
+const sizes = '(max-width: 48rem) 100vw, 48rem'
+
+export function Photo() {
+ return (
+
+ {getSourceProps(srcSet).map(source => (
+
+ ))}
+
+
+ )
+}
+```
+
+
+
+## String helpers
+
+```ts
+toSrcSetString(srcSet: SrcSetEntry[]): string
+toDensitySrcSetString(srcSet: SrcSetEntry[]): string
+```
+
+`toSrcSetString` builds the `srcset` value with **width descriptors** - `url 1200w, url 600w` - which is what both functions above use. A set of one returns the bare url with no descriptor: a single candidate is not a choice, and a lone `w` descriptor would drag `sizes` along with it.
+
+`toDensitySrcSetString` builds it with **pixel density descriptors** instead, computed from the variant widths relative to the smallest one and rounded to two decimals:
+
+```js
+import { filterBy, toDensitySrcSetString } from '@srcset/runtime'
+
+toDensitySrcSetString(filterBy(srcSet, 'format', 'jpg'))
+// '/photo.jpg 2x, /photo@600w.jpg 1x'
+```
+
+Use it for images of a fixed display size - a logo, an avatar, an icon - where the layout width is known and width descriptors would need a `sizes` attribute to say what it is. Pass one format at a time, the same way `getImageProps` does.
+
+## Utilities
+
+| Function | Description |
+| --- | --- |
+| `groupBy(srcSet, field)` | Group entries by a field into `[value, entries]` pairs, keeping the original order inside every group and between the groups. |
+| `filterBy(srcSet, field, value)` | Entries whose field equals the value, e.g. one format out of a mixed set. |
+
+Both are typed against `SrcSetEntry`, so `field` autocompletes and `value` is checked against that field's type.
+
+`mimeTypes` maps a format to its mime type - `avif`, `webp`, `jpg`, `png`, `gif`, `svg` to `image/avif`, `image/webp`, `image/jpeg`, `image/png`, `image/gif`, `image/svg+xml` - and `ImageFormat` is the union of those six names. They are the browser-side copies of the ones in [`@srcset/core`](/api/core/#formats), so nothing pulls sharp into a bundle.
diff --git a/website/src/content/docs/components/index.mdx b/website/src/content/docs/components/index.mdx
new file mode 100644
index 0000000..db929f4
--- /dev/null
+++ b/website/src/content/docs/components/index.mdx
@@ -0,0 +1,425 @@
+---
+title: Components
+description: Picture and Image for React, Preact and Svelte - sources ordered by format efficiency, blur-up placeholders, anti-CLS sizing and priority loading.
+sidebar:
+ order: 1
+---
+
+import { Tabs, TabItem, Aside } from '@astrojs/starlight/components'
+
+`@srcset/react`, `@srcset/preact` and `@srcset/svelte` ship the same two components. `Picture` renders a `` with one `` per format, `Image` renders the ``. Both take the exports of an [image module](/getting-started/image-modules/) as they are - and the object a [proxy adapter](/proxies/) builds at runtime has the same shape, so it works too.
+
+The components are thin wrappers around the helpers of [`@srcset/runtime`](/api/runtime/): they add the markup structure, the blur-up placeholder, the intrinsic size and the loading attributes. Pick a framework in the tabs - the choice is remembered down the page - and everything outside the tabs applies to all three packages alike.
+
+## Install
+
+
+
+
+Needs `react` 19 or newer and `@srcset/runtime` - both are peer dependencies.
+
+
+
+ ```sh frame="none"
+ pnpm add @srcset/react @srcset/runtime
+ ```
+
+
+ ```sh frame="none"
+ yarn add @srcset/react @srcset/runtime
+ ```
+
+
+ ```sh frame="none"
+ npm i @srcset/react @srcset/runtime
+ ```
+
+
+
+
+
+
+Needs `preact` 10.28 or newer and `@srcset/runtime` - both are peer dependencies.
+
+
+
+ ```sh frame="none"
+ pnpm add @srcset/preact @srcset/runtime
+ ```
+
+
+ ```sh frame="none"
+ yarn add @srcset/preact @srcset/runtime
+ ```
+
+
+ ```sh frame="none"
+ npm i @srcset/preact @srcset/runtime
+ ```
+
+
+
+
+
+
+Needs `svelte` 5 or newer and `@srcset/runtime` - both are peer dependencies.
+
+
+
+ ```sh frame="none"
+ pnpm add @srcset/svelte @srcset/runtime
+ ```
+
+
+ ```sh frame="none"
+ yarn add @srcset/svelte @srcset/runtime
+ ```
+
+
+ ```sh frame="none"
+ npm i @srcset/svelte @srcset/runtime
+ ```
+
+
+
+
+
+
+What they render comes from an image module, so a build-time [integration](/getting-started/) or a [proxy adapter](/proxies/) has to be in place first.
+
+## Usage
+
+
+
+
+```tsx title="Hero.tsx"
+import { Picture, Image } from '@srcset/react'
+import { src, srcSet, placeholder } from './photo.jpg'
+
+const sizes = '(max-width: 48rem) 100vw, 48rem'
+
+export function Hero() {
+ return (
+
+
+
+ )
+}
+```
+
+
+
+
+```tsx title="Hero.tsx"
+import { Picture, Image } from '@srcset/preact'
+import { src, srcSet, placeholder } from './photo.jpg'
+
+const sizes = '(max-width: 48rem) 100vw, 48rem'
+
+export function Hero() {
+ return (
+
+
+
+ )
+}
+```
+
+
+
+
+```svelte title="Hero.svelte"
+
+
+
+
+
+```
+
+
+
+
+Both components take the same `srcSet` array: `Picture` groups it into `` elements, `Image` narrows it to the format of `src` for the ``. Pass it to both - given only to `Picture`, the fallback `` is left with one fixed url.
+
+`Image` works on its own as well: without a `Picture` around it the `` carries the variants of a single format, which is enough when the rule generates only one.
+
+
+
+## What they render
+
+An image module built with three formats and two widths, rendered as above, produces this:
+
+```html
+
+
+
+
+
+
+```
+
+That is the markup of the first render: `data-loading` sits on the `` until the load event fires, with or without a placeholder, and the attribute order follows the props.
+
+## Why not build the srcset by hand
+
+The two attributes look trivial and are not:
+
+- **One `` per mime type.** A `` carries a single `type`, and the browser takes the **first** one it supports - so the variants have to be grouped by mime type and the groups ordered by format efficiency: avif, webp, then the rest. A jpg group placed first would be picked by every browser and the modern formats would never load.
+- **The `` gets one format.** The `` has no type negotiation, so its `srcset` must hold variants of the fallback format only. `Image` filters the set down to the format of `src`, and drops the attribute entirely when the result would just repeat the `src` url.
+- **Width descriptors need the widths.** Each entry is `url 960w`, and the numbers must be the real widths of the files, not the widths you asked for.
+
+If you render the markup yourself, use `getSourceProps` and `getImageProps` from [`@srcset/runtime`](/api/runtime/) - the components call exactly those.
+
+
+
+## sizes
+
+Set `sizes` on **both** components, with the same value:
+
+```jsx
+const sizes = '(max-width: 48rem) 100vw, 48rem'
+
+
+
+
+```
+
+`Picture` puts its `sizes` on every generated ``, `Image` puts its own on the ``. The `sizes` of an `` does **not** apply to a `` the browser has selected, so the `` elements of a `Picture` without `sizes` keep the default `100vw` - the browser then picks a variant for the full viewport width even when the image sits in a narrow column.
+
+## Placeholder
+
+The `placeholder` export is a tiny image inlined as a data-url. Pass it to `Image` and it becomes the background of the `` until the real file arrives:
+
+```jsx
+
+```
+
+While the image is loading the element carries a `data-loading` attribute, which is the hook for styling the transition:
+
+```css
+img[data-loading] {
+ filter: blur(16px);
+}
+
+img {
+ transition: filter 0.2s;
+}
+```
+
+The background is set with `background-size: cover`, and your own `style` is merged after it, so a background of your own wins. On the server the state is always "loading", so the blurred preview is part of the SSR markup; on mount the components check the element's `complete` and `naturalWidth`, so a cached image skips the placeholder entirely instead of flashing it after hydration.
+
+The placeholder is shown **once per mount**. Swapping `src` on a mounted `Image` keeps the loaded state, so the new image appears without a preview - remount the component instead: a `key` in React and Preact, a `{#key}` block in Svelte. Both are in the reference below.
+
+## Size without layout shift
+
+When neither `width` nor `height` is given, `Image` fills both from `src`, so the browser reserves the right box before the file arrives. Scale it with CSS as usual:
+
+```css
+img {
+ width: 100%;
+ height: auto;
+}
+```
+
+The intrinsic pair applies **only as a whole**. Setting just one of the two disables it: filling the other dimension from the variant would skew the aspect ratio if the explicit value differs from the variant width. So pass both or neither.
+
+
+
+## priority
+
+`Image` is `loading="lazy"` and `decoding="async"` by default. For the image that is the largest contentful paint of the page, that is exactly wrong: `priority` switches it to `loading="eager"` with `fetchpriority="high"`.
+
+```jsx
+
+```
+
+Use it for one image per page. Marking everything as priority is the same as marking nothing.
+
+It behaves the same in all three packages, and none of them preloads: `priority` only sets the two attributes, so it is safe inside a `Picture`. When a hero image needs a head start beyond that, put a `` in the document head yourself - and point it at the format the browser will actually take, which inside a `` is not the fallback.
+
+## Reference
+
+
+
+
+#### Picture props
+
+| Prop | Type | Description |
+| --- | --- | --- |
+| `srcSet` | `SrcSetEntry[]` | Variants to render the `` elements from, grouped by mime type and ordered by format efficiency. Required. |
+| `sizes` | `string` | `sizes` for every generated ``. Should match the `sizes` of the ``. |
+| `children` | `ReactNode` | Content of the ``, required: it must contain an ``. |
+
+Every other prop goes to the `` element - `className`, `style`, `id`, event handlers.
+
+#### Image props
+
+| Prop | Type | Description |
+| --- | --- | --- |
+| `src` | `SrcSetEntry` | Variant for the `src` attribute and the intrinsic size. |
+| `srcSet` | `SrcSetEntry[] \| string` | Variants for the `srcset` attribute, filtered to the format of `src` - or a ready `srcset` string, used as it is. |
+| `placeholder` | `string` | Data-url shown as a background until the image loads. |
+| `priority` | `boolean` | Eager loading and `fetchpriority="high"`. |
+
+Every other prop goes to the ``: `alt`, `sizes`, `className`, `style`, `ref`, `onLoad`, `crossOrigin`, `referrerPolicy` and the rest. `loading` defaults to `lazy` and `decoding` to `async`; both, and an explicit `width` / `height` pair, override the defaults.
+
+#### React specifics
+
+- **`'use client'`.** `Image` holds the loaded state, so it is a client module. The published build keeps client modules in a chunk of their own with the directive on top, so in an RSC application `Picture` still renders on the server and `Image` crosses to the client without a wrapper of yours.
+- **`ref`.** React 19 passes `ref` as a regular prop, so `` points at the ``. Callback refs that return a cleanup function are supported - the cleanup is passed through untouched.
+- Prop names are the React ones: `className`, `fetchPriority`, `onLoad`.
+- To reset the placeholder for a new source, remount with a `key`:
+
+ ```jsx
+
+ ```
+
+
+
+
+#### Picture props
+
+| Prop | Type | Description |
+| --- | --- | --- |
+| `srcSet` | `SrcSetEntry[]` | Variants to render the `` elements from, grouped by mime type and ordered by format efficiency. Required. |
+| `sizes` | `string` | `sizes` for every generated ``. Should match the `sizes` of the ``. |
+| `children` | `ComponentChildren` | Content of the ``, required: it must contain an ``. |
+
+Every other prop goes to the `` element - `class` or `className`, `style`, `id`, event handlers.
+
+#### Image props
+
+| Prop | Type | Description |
+| --- | --- | --- |
+| `src` | `SrcSetEntry` | Variant for the `src` attribute and the intrinsic size. |
+| `srcSet` | `SrcSetEntry[] \| string` | Variants for the `srcset` attribute, filtered to the format of `src` - or a ready `srcset` string, used as it is. |
+| `placeholder` | `string` | Data-url shown as a background until the image loads. |
+| `priority` | `boolean` | Eager loading and `fetchpriority="high"`. |
+| `style` | `CSSProperties` | Inline styles, merged with the placeholder background. An object, not a string. |
+| `imgRef` | `Ref` | Ref to the `` element. |
+
+Every other prop goes to the ``: `alt`, `sizes`, `class`, `onLoad` and the rest. `loading` defaults to `lazy` and `decoding` to `async`; both, and an explicit `width` / `height` pair, override the defaults.
+
+#### Preact specifics
+
+- **`imgRef` instead of `ref`.** Plain Preact does not forward `ref` to function components, so the ref has a prop of its own. It takes an object ref or a callback ref, and a callback returning a cleanup function is supported.
+- **`fetchpriority` is lowercase in the DOM.** The rendered attribute is `fetchpriority`, so style and query it under that name. In JSX pass the camel-case `fetchPriority` - the lowercase alias is removed from the props type to keep the two from clashing.
+- **`style` is an object.** The placeholder background is merged into it, so the string form of Preact's `style` is not accepted.
+- To reset the placeholder for a new source, remount with a `key`:
+
+ ```jsx
+
+ ```
+
+
+
+
+#### Picture props
+
+| Prop | Type | Description |
+| --- | --- | --- |
+| `srcSet` | `SrcSetEntry[]` | Variants to render the `` elements from, grouped by mime type and ordered by format efficiency. Required. |
+| `sizes` | `string` | `sizes` for every generated ``. Should match the `sizes` of the ``. |
+| `children` | `Snippet` | Content of the ``, required: it must contain an ``. |
+
+Every other prop goes to the `` element - `class`, `style`, `id`, event handlers.
+
+#### Image props
+
+| Prop | Type | Description |
+| --- | --- | --- |
+| `src` | `SrcSetEntry` | Variant for the `src` attribute and the intrinsic size. |
+| `srcSet` | `SrcSetEntry[] \| string` | Variants for the `srcset` attribute, filtered to the format of `src` - or a ready `srcset` string, used as it is. |
+| `placeholder` | `string` | Data-url shown as a background until the image loads. |
+| `priority` | `boolean` | Eager loading and `fetchpriority="high"`. |
+| `ref` | `HTMLImageElement \| null` | The `` element, bindable. |
+
+Every other prop goes to the ``: `alt`, `sizes`, `class`, `style`, `onload` and the rest. `loading` defaults to `lazy` and `decoding` to `async`; both, and an explicit `width` / `height` pair, override the defaults.
+
+#### Svelte specifics
+
+- **Runes.** The components are written with `$props`, `$state`, `$derived` and `$bindable`, so they need Svelte 5 in runes mode.
+- **Element-style prop names.** Attributes keep the names they have in Svelte markup: `class`, a `style` string, `onload`, `fetchpriority`.
+- **`bind:ref` for the element.** The `ref` prop is bindable, so the `` comes back through a binding:
+
+ ```svelte
+
+
+
+ ```
+
+- To reset the placeholder for a new source, remount the component with a `{#key}` block:
+
+ ```svelte
+ {#key photo.src.url}
+
+ {/key}
+ ```
+
+
+
diff --git a/website/src/content/docs/examples/index.mdx b/website/src/content/docs/examples/index.mdx
new file mode 100644
index 0000000..fe4cd7a
--- /dev/null
+++ b/website/src/content/docs/examples/index.mdx
@@ -0,0 +1,14 @@
+---
+title: Overview
+description: One runnable app per bundler integration, embedded as a live sandbox with a link to the source.
+sidebar:
+ order: 0
+---
+
+One small app per bundler integration, all three rendering the same four images: a photo at three widths in three formats, a photo with a blur-up placeholder, a png sticker that keeps its transparency, and an animated gif that keeps its frames. Each example is an embedded playground with a link to the source code.
+
+| Example | Focus |
+|---------|-------|
+| [Vite](/examples/vite/) | The Vite plugin with the Svelte components. |
+| [Webpack](/examples/webpack/) | The loader with the Preact components. |
+| [Rspack](/examples/rspack/) | The same loader on Rspack, with the React components. |
diff --git a/website/src/content/docs/examples/rspack.mdx b/website/src/content/docs/examples/rspack.mdx
new file mode 100644
index 0000000..5fe5731
--- /dev/null
+++ b/website/src/content/docs/examples/rspack.mdx
@@ -0,0 +1,21 @@
+---
+title: Rspack
+description: Example of using srcset with the loader on Rspack and the React components.
+sidebar:
+ order: 3
+---
+
+This example shows a React app built with `@srcset/loader` and `@srcset/react`.
+
+It is the webpack example on Rspack: the same loader, the same rules, a different compiler configuration - the two are worth opening side by side.
+
+
+
+[View source on GitHub](https://github.com/TrigenSoftware/srcset/tree/main/examples/rspack)
diff --git a/website/src/content/docs/examples/vite.mdx b/website/src/content/docs/examples/vite.mdx
new file mode 100644
index 0000000..dc1bc61
--- /dev/null
+++ b/website/src/content/docs/examples/vite.mdx
@@ -0,0 +1,21 @@
+---
+title: Vite
+description: Example of using srcset with the Vite plugin and the Svelte components.
+sidebar:
+ order: 1
+---
+
+This example shows a Svelte app built with `@srcset/vite-plugin` and `@srcset/svelte`.
+
+The generation rules live in `vite.config.js`, one per file extension. `src/App.svelte` overrides them per import - a JSON rule in the import query for the first photo, `?placeholder` for the second. Edit a rule and the variants listed under every image change with it.
+
+
+
+[View source on GitHub](https://github.com/TrigenSoftware/srcset/tree/main/examples/vite)
diff --git a/website/src/content/docs/examples/webpack.mdx b/website/src/content/docs/examples/webpack.mdx
new file mode 100644
index 0000000..0fb0889
--- /dev/null
+++ b/website/src/content/docs/examples/webpack.mdx
@@ -0,0 +1,21 @@
+---
+title: Webpack
+description: Example of using srcset with the loader and the Preact components.
+sidebar:
+ order: 2
+---
+
+This example shows a Preact app built with `@srcset/loader` and `@srcset/preact`.
+
+The generation rules live in the loader options in `webpack.config.js`, and `src/App.jsx` overrides them per import the same way the other examples do. Edit a rule and the variants listed under every image change with it.
+
+
+
+[View source on GitHub](https://github.com/TrigenSoftware/srcset/tree/main/examples/webpack)
diff --git a/website/src/content/docs/getting-started/agent-skills.mdx b/website/src/content/docs/getting-started/agent-skills.mdx
new file mode 100644
index 0000000..4a95de1
--- /dev/null
+++ b/website/src/content/docs/getting-started/agent-skills.mdx
@@ -0,0 +1,73 @@
+---
+title: Agent Skills
+description: The two universal agent skills shipped with srcset - setup-srcset wires an integration into a project, srcset writes the code that uses it.
+sidebar:
+ order: 5
+---
+
+import { Aside, Tabs, TabItem } from '@astrojs/starlight/components'
+
+The repository ships two **universal agent skills** - instructions that teach an AI coding agent how to set up and use srcset. They are compatible with Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, Windsurf, Cline and other agents that support the [skills](https://github.com/vercel-labs/skills) format.
+
+They carry the parts of this documentation an agent gets wrong on its own: the rule model, the format specific advice and the pitfalls.
+
+## setup-srcset
+
+The [`setup-srcset`](https://github.com/TrigenSoftware/srcset/tree/main/skills/setup-srcset) skill adds responsive images to a project end to end. Rather than pasting a template, it guides the agent to:
+
+- **Pick the integration from the repository** - `vite.config.*`, `webpack.config.*`, `rspack.config.*` and the `package.json` scripts decide between the [Vite plugin](/integrations/vite-plugin/), the [loader](/integrations/loader/), [cli baking](/integrations/baking/) and the [proxy adapters](/proxies/). Telling it which one to use works too.
+- **Write the [rules](/getting-started/rules/), not just copy them** - the first match wins, a rule without `match` is the catch-all and goes last, a width of 1 or less is a multiplier, the first format is the fallback when the source format is not in the list, and png, gif and svg need rules of their own.
+- **Wire the ambient types** - the `client` reference the chosen integration ships, kept next to the `vite/client` one a Vite project already has.
+- **Render the variants** - the `Picture` and `Image` [components](/components/) for React, Preact or Svelte, or `getImageProps` and `getSourceProps` when the project has no component package.
+- **Finish with the four checks** - the emitted assets, the length of `srcSet`, the rendered markup, and a type-check.
+
+
+
+ ```sh frame="none"
+ pnpx skills add TrigenSoftware/srcset --skill setup-srcset
+ ```
+
+
+ ```sh frame="none"
+ yarn dlx skills add TrigenSoftware/srcset --skill setup-srcset
+ ```
+
+
+ ```sh frame="none"
+ npx skills add TrigenSoftware/srcset --skill setup-srcset
+ ```
+
+
+
+## srcset
+
+The [`srcset`](https://github.com/TrigenSoftware/srcset/tree/main/skills/srcset) skill is for writing the code: the setup exists, and now something has to display an image. It teaches the agent:
+
+- **[The image module](/getting-started/image-modules/)** - what the import gives back, and that a bundler integration and a [baked](/integrations/baking/) module produce exactly the same exports.
+- **[Rendering](/components/)** - `srcSet` and `sizes` on both components while `src` goes to `Image` alone, the per-framework differences in refs and prop casing, and what `getSourceProps` and `getImageProps` return without a framework.
+- **`sizes` and retina** - that a `w` descriptor is a file width rather than a screen, so one list of widths covers both densities and there is no `@2x` rule to write.
+- **[Rules](/getting-started/rules/)** - the first match wins, an array in `match` is an `and`, png, gif and svg need rules of their own.
+- **[The command line](/integrations/cli/)** - the full option table, arguments that replace the config `rules` rather than merging into it, where the files land, and the four `--module` formats with what the project still has to provide.
+- **The pitfalls** - `srcSet` given only to `Picture`, a missing `sizes`, a placeholder that never resets, quoting the globs, and a re-run that never cleans the destination.
+
+
+
+ ```sh frame="none"
+ pnpx skills add TrigenSoftware/srcset --skill srcset
+ ```
+
+
+ ```sh frame="none"
+ yarn dlx skills add TrigenSoftware/srcset --skill srcset
+ ```
+
+
+ ```sh frame="none"
+ npx skills add TrigenSoftware/srcset --skill srcset
+ ```
+
+
+
+
diff --git a/website/src/content/docs/getting-started/complete-guide.mdx b/website/src/content/docs/getting-started/complete-guide.mdx
new file mode 100644
index 0000000..df9a3b4
--- /dev/null
+++ b/website/src/content/docs/getting-started/complete-guide.mdx
@@ -0,0 +1,328 @@
+---
+title: Complete Guide
+description: Set up srcset end to end - install, configure the rules, wire the types, render the variants and check the result.
+sidebar:
+ order: 2
+---
+
+import { Tabs, TabItem, Aside, Steps, CardGrid, LinkCard } from '@astrojs/starlight/components'
+
+One walkthrough, top to bottom, ending with a `` that carries every generated variant. Pick your bundler and your framework in the tabs - the choice is remembered down the page. The [cli](/integrations/cli/) is the third way in: it takes the same rules from a config file and needs no bundler at all.
+
+## 1. Install
+
+
+
+
+
+ ```sh frame="none"
+ pnpm add -D @srcset/vite-plugin
+ pnpm add @srcset/runtime @srcset/react
+ ```
+
+
+ ```sh frame="none"
+ yarn add -D @srcset/vite-plugin
+ yarn add @srcset/runtime @srcset/react
+ ```
+
+
+ ```sh frame="none"
+ npm i -D @srcset/vite-plugin
+ npm i @srcset/runtime @srcset/react
+ ```
+
+
+
+
+
+
+ ```sh frame="none"
+ pnpm add -D @srcset/loader
+ pnpm add @srcset/runtime @srcset/react
+ ```
+
+
+ ```sh frame="none"
+ yarn add -D @srcset/loader
+ yarn add @srcset/runtime @srcset/react
+ ```
+
+
+ ```sh frame="none"
+ npm i -D @srcset/loader
+ npm i @srcset/runtime @srcset/react
+ ```
+
+
+
+
+
+`@srcset/runtime` is a peer dependency of the integrations and of the components: it carries the `SrcSetEntry` type and the helpers that turn variants into DOM attributes. It and the components ship code the app runs, so both belong in the regular dependencies; the integration itself never leaves the build. Swap `@srcset/react` for `@srcset/preact` or `@srcset/svelte`, or skip it and build the markup with the runtime helpers, as shown in step 5.
+
+## 2. Configure the integration
+
+
+
+ ```js title="vite.config.js"
+ import { defineConfig } from 'vite'
+ import { srcset } from '@srcset/vite-plugin'
+
+ export default defineConfig({
+ plugins: [
+ srcset({
+ rules: [
+ // Png keeps its transparency, webp is the smaller twin.
+ {
+ match: '**/*.png',
+ width: [1, 0.5],
+ format: ['png', 'webp']
+ },
+ // Everything else: jpg for the reach, webp and avif for the size.
+ {
+ width: [1, 0.5],
+ format: ['jpg', 'webp', 'avif']
+ }
+ ],
+ placeholder: true
+ })
+ ]
+ })
+ ```
+
+ Every raster image import - jpg, jpeg, png, webp, avif, gif - goes through the plugin from now on. Native Vite queries such as `?url` and `?raw` stay in the asset pipeline, and `.svg` imports are not touched at all.
+
+
+ ```js title="webpack.config.js / rspack.config.js"
+ export default {
+ module: {
+ rules: [
+ {
+ test: /\.(jpe?g|png|gif)$/i,
+ use: {
+ loader: '@srcset/loader',
+ options: {
+ rules: [
+ // Png keeps its transparency, webp is the smaller twin.
+ {
+ match: '**/*.png',
+ width: [1, 0.5],
+ format: ['png', 'webp']
+ },
+ // Everything else: jpg for the reach, webp and avif for the size.
+ {
+ width: [1, 0.5],
+ format: ['jpg', 'webp', 'avif']
+ }
+ ],
+ placeholder: true
+ }
+ }
+ }
+ ]
+ }
+ }
+ ```
+
+ The `test` decides which extensions the loader takes, so keep `.svg` out of it. The loader replaces whatever asset rule the project had for those extensions - remove a competing `type: 'asset/resource'` rule for the same test, or the two will fight over the same files.
+
+
+
+What the two rules say:
+
+- rules are tried in order and **the first match wins**, so the png rule has to come before the general one;
+- the second rule has no `match`, which makes it the **catch-all**, and a catch-all belongs last;
+- `width: [1, 0.5]` is the original width and a half-width copy - a value of 1 or less is a multiplier, anything above it is absolute pixels;
+- `placeholder: true` adds a 16px webp inlined as a data-url, for blur-up placeholders.
+
+
+
+The whole rule model - matchers, widths, formats, encoder options - is on the [Rules](/getting-started/rules/) page.
+
+## 3. Wire the types
+
+The integration ships ambient declarations for image imports. Reference them once, in a `.d.ts` of the project:
+
+
+
+ ```ts title="src/vite-env.d.ts"
+ ///
+ ///
+ ```
+
+ The plugin declares only the named exports; the default url export comes from `vite/client`, so keep that line.
+
+
+ ```ts title="src/env.d.ts"
+ ///
+ ```
+
+ The loader declares the default url export as well, so this one line is enough.
+
+
+
+Without the reference the named imports fail to type-check with `Module '"*.jpg"' has no exported member 'srcSet'`.
+
+## 4. Import an image
+
+```ts
+import url, { src, srcSet, srcMap, placeholder } from './photo.jpg'
+```
+
+| Export | Type | When to use it |
+| --- | --- | --- |
+| `default` | `string` | The url of the selected variant, e.g. `/assets/photo-BsK7yzuP.jpg`. A drop-in replacement for a plain asset import. |
+| `src` | `SrcSetEntry` | The selected variant, with `format`, `type`, `width`, `height` and `url` - the intrinsic size that keeps the layout from shifting. |
+| `srcSet` | `SrcSetEntry[]` | Every generated variant, for the `srcset` attribute and the `` elements. |
+| `srcMap` | `Record` | Id to url, e.g. `srcMap.webp800`. For one specific variant: a css background, an `og:image`, an email template. |
+| `placeholder` | `string \| undefined` | The blur-up data-url, when the `placeholder` option is on. |
+
+The default export points at the variant in the **source format at the source width** when the rules produced one, and at the first generated variant otherwise. Point it elsewhere with the `select` option or the import query - see [Image modules](/getting-started/image-modules/).
+
+## 5. Render it
+
+The components build the `` structure, order the sources by format efficiency and handle the placeholder:
+
+
+
+ ```jsx title="src/Hero.jsx"
+ import { Picture, Image } from '@srcset/react'
+ import { src, srcSet, placeholder } from './photo.jpg'
+
+ const sizes = '(max-width: 48rem) 100vw, 48rem'
+
+ export function Hero() {
+ return (
+
+
+
+ )
+ }
+ ```
+
+
+ ```jsx title="src/Hero.jsx"
+ import { Picture, Image } from '@srcset/preact'
+ import { src, srcSet, placeholder } from './photo.jpg'
+
+ const sizes = '(max-width: 48rem) 100vw, 48rem'
+
+ export function Hero() {
+ return (
+
+
+
+ )
+ }
+ ```
+
+ The element ref has a prop of its own here, `imgRef` - plain Preact does not forward `ref` to function components.
+
+
+ ```svelte title="src/Hero.svelte"
+
+
+
+
+
+ ```
+
+ The element ref is `bind:ref`, and `style` is a string rather than an object.
+
+
+
+Three things this snippet is careful about:
+
+- `srcSet` and `sizes` are set on **both** elements: the `sizes` of the `` does not apply to a `` the browser has picked, and an `` without `srcSet` is left with one fixed url.
+- `Picture` needs an `` child - a `` without one renders nothing.
+- `Image` takes the intrinsic `width` and `height` from `src`, so nothing shifts while the image loads.
+
+Without a components package the same markup comes from two runtime helpers:
+
+```jsx title="src/Hero.jsx"
+import { getImageProps, getSourceProps } from '@srcset/runtime'
+import { src, srcSet } from './photo.jpg'
+
+const sizes = '(max-width: 48rem) 100vw, 48rem'
+
+export function Hero() {
+ return (
+
+ {getSourceProps(srcSet).map(source => (
+
+ ))}
+
+
+ )
+}
+```
+
+`getSourceProps` groups the variants by mime type and orders the groups avif, webp, then the rest, so the browser takes the best format it supports. `getImageProps` builds the `srcset` of the `` from the variants of the `src` format only - the fallback for a browser that skipped every ``.
+
+## 6. Verify
+
+
+
+1. **Build the project** and look at the emitted assets: the extra formats and widths have to be there, not just the originals.
+
+
+
+ They land in `dist/assets`. The second build is much faster - variants are cached on disk in `node_modules/.vite/srcset`, and the cache is on by default.
+
+
+ They land wherever `output.path` points, named by the loader's `name` template. Repeated builds ride the bundler's own persistent cache; the loader's disk cache is off by default and turned on with `cache: true`.
+
+
+
+2. **Log the variants** the module carries:
+
+ ```ts
+ import { srcSet } from './photo.jpg'
+
+ console.log(srcSet.length, srcSet.map(variant => variant.id))
+ // 6 [ 'jpg1600', 'jpg800', 'webp1600', 'webp800', 'avif1600', 'avif800' ]
+ ```
+
+ The count is widths times formats - six for the rule above, here on a 1600px wide source. A `0` means no rule matched the image.
+
+3. **Check the rendered markup**: a `` with one `` per format and an `` with a `srcset` of the fallback format, or - without the components - an `` whose `srcset` lists every width.
+
+4. **Type-check** with `tsc --noEmit`, so a missing ambient reference does not survive until the next build.
+
+
diff --git a/website/src/content/docs/getting-started/image-modules.mdx b/website/src/content/docs/getting-started/image-modules.mdx
new file mode 100644
index 0000000..e4e0d7b
--- /dev/null
+++ b/website/src/content/docs/getting-started/image-modules.mdx
@@ -0,0 +1,183 @@
+---
+title: Image Modules
+description: The module an image import turns into - exports, resource ids, the import query, placeholders, tree-shaking and the TypeScript declarations.
+sidebar:
+ order: 4
+---
+
+import { Aside } from '@astrojs/starlight/components'
+
+Every integration turns an image import into the same ES module, and the cli [bakes](/integrations/baking/) that module to disk. This page is the contract: what the module exports and how to bend it per import.
+
+```ts
+import url, { src, srcSet, srcMap, placeholder } from './photo.jpg'
+```
+
+## Exports
+
+| Export | Type | What it is |
+| --- | --- | --- |
+| `default` | `string` | Url of the selected variant, e.g. `/assets/photo-BsK7yzuP.jpg`. |
+| `src` | `SrcSetEntry` | The selected variant. `null` when no rule matched the image. |
+| `srcSet` | `SrcSetEntry[]` | Every generated variant, in rule order: formats outer, widths inner. |
+| `srcMap` | `Record` | Resource id to url, e.g. `srcMap.webp800`. |
+| `placeholder` | `string \| undefined` | Blur-up data-url, when the `placeholder` option is on. |
+
+A variant is a plain object - the `SrcSetEntry` of `@srcset/runtime`:
+
+```ts
+interface SrcSetEntry {
+ id: string
+ format: 'avif' | 'webp' | 'jpg' | 'png' | 'gif' | 'svg'
+ type: string
+ width: number
+ height?: number
+ url: string
+}
+```
+
+`height` is optional in the type because the [proxy adapters](/proxies/) build variants at runtime and cannot know it. A build-time module always fills it in, which is what makes the anti-CLS sizing of the components work.
+
+The module the integrations generate looks like this, with the urls filled in by the bundler:
+
+```js
+const url = "/assets/photo-BsK7yzuP.jpg";
+const src = {
+ id: "jpg1600",
+ format: "jpg",
+ type: "image/jpeg",
+ width: 1600,
+ height: 1067,
+ url: url
+};
+
+export default url;
+export { src };
+export const srcSet = [src, /* the other variants */];
+export const srcMap = {
+ "jpg1600": url,
+ "webp1600": "/assets/photo-C9tRqAsz.webp"
+};
+export const placeholder = undefined;
+```
+
+## Resource ids
+
+The id of a variant is `` by default, built from the **actual** output width: `jpg1600`, `webp800`. Ids are what `srcMap` is keyed by, so `srcMap.webp800` is the way to reach one specific variant - a css background, an `og:image`, an email template.
+
+The `resourceId` option replaces the formatter:
+
+```js
+srcset({
+ // `jpg100`, `jpg50` - ids that do not move when the source is replaced.
+ resourceId: (width, requestedWidth, format) => (
+ requestedWidth <= 1
+ ? `${format}${requestedWidth * 100}`
+ : `${format}${width}`
+ )
+})
+```
+
+`width` is the actual output width in pixels; `requestedWidth` is the multiplier when the variant was requested with one, and the actual width otherwise. Ids are the keys of `srcMap`, so a formatter that drops the width or the format makes variants overwrite each other in the map.
+
+## Choosing the default export
+
+Without any hint the module picks the variant in the **source format at the source width**, when the rules generated one, and the **first generated variant** otherwise - the first format at the first width.
+
+The `select` option makes the pick explicit:
+
+```js
+srcset({
+ select: {
+ format: 'webp'
+ }
+})
+```
+
+| Field | Matches |
+| --- | --- |
+| `id` | The variant with this resource id. Wins on its own. |
+| `format` | The variant of this format. |
+| `width` | A value above 1 is an absolute width in pixels; a value of 1 or less matches the variant requested with that multiplier. |
+
+An unset field is a wildcard, and `format` plus `width` narrow together. A selection that matches no variant **silently falls back to the first one**, so check the id in the built module rather than assuming.
+
+## Import query
+
+The import query overrides the configuration for one import. Parts combine with `&`:
+
+| Part | Effect |
+| --- | --- |
+| `?{"width":[1,0.5],"format":["webp","jpg"]}` | A JSON [rule](/getting-started/rules/) that **replaces the whole rule set** for this import. |
+| `?id=webp800` | Default export: the variant with this resource id. |
+| `?format=webp` | Default export: the variant of this format. |
+| `?width=800` | Default export: the variant of this width, or of this multiplier when the value is 1 or less. |
+| `?placeholder` / `?placeholder=false` | Switch the `placeholder` export on or off. |
+
+```js
+// One hero image at three widths, avif first, whatever the configured rules say.
+import * as hero from './hero.jpg?{"width":[1,0.5,0.25],"format":["avif","webp","jpg"]}'
+// The configured rules, but the default export points at the webp variant.
+import photo from './photo.jpg?format=webp&width=800'
+// The configured rules plus a blur-up placeholder, for this import only.
+import { src, placeholder } from './cover.jpg?placeholder'
+```
+
+Things worth knowing before reaching for it:
+
+- the query is split on `&`, so the JSON rule has to be a single object without one; a broken one fails the build with `Invalid srcset rule in the import query`, and a part the parser does not know is ignored without a word;
+- `?placeholder` **keeps the configured placeholder options** rather than falling back to the defaults, so a project-wide `placeholder: { width: 24 }` still applies. An explicit `placeholder: false` in the integration options wins over the query, though - leave the option unset instead of disabling it if imports are meant to switch it on;
+- in Vite the native queries - `?url`, `?raw`, `?inline`, `?worker` - hand the import back to the Vite asset pipeline, so they cannot be mixed with these.
+
+## Placeholders
+
+`placeholder: true` adds a tiny variant inlined as a data-url, 16px wide and webp by default:
+
+```js
+srcset({
+ placeholder: {
+ width: 24,
+ format: 'webp'
+ }
+})
+```
+
+`format` is `'webp'` or `'jpg'`; `width` is a positive integer, and a value above the source width is capped rather than upscaled. The placeholder is never emitted as a file: it is a string constant in the module, dropped from the bundle when nothing imports it, so enabling it project-wide adds nothing to the bundle until it is used. It is still encoded at build time, alongside the other variants and through the same disk cache.
+
+The [components](/components/) show it as a background until the image loads. By hand it is a css `background-image`, swapped out in the `load` handler of the image.
+
+## Tree-shaking
+
+The exports are independent, so importing only what a page needs leaves the rest out of the bundle:
+
+```ts
+// `srcMap` and `placeholder` never reach the bundle.
+import { src, srcSet } from './photo.jpg'
+```
+
+The **files** are another matter: the integration emits every variant while it generates the module, long before anything is tree-shaken. A rule that generates six variants writes six files into the build output, whether or not `srcSet` is imported. Trim the rules, not the imports, to trim the output.
+
+## TypeScript
+
+Both integrations ship ambient declarations for `.jpg`, `.jpeg`, `.png`, `.webp`, `.avif` and `.gif` imports. Reference them once, in a `.d.ts` of the project or through the tsconfig `types` array:
+
+| Package | Reference | What it declares |
+| --- | --- | --- |
+| `@srcset/vite-plugin` | `/// ` | The named exports. The default url export comes from `vite/client`, which the file references itself. |
+| `@srcset/loader` | `/// ` | The named exports and the default url export. |
+
+```ts title="src/vite-env.d.ts"
+///
+///
+```
+
+Two symptoms of a missing reference:
+
+- `Module '"*.jpg"' has no exported member 'srcSet'` - the asset types are there, the srcset ones are not;
+- `Cannot find module './photo.jpg'` - nothing declares the extension at all.
+
+`srcMap` is typed as `Record`, so `srcMap.webp800` type-checks whether or not that variant exists. The ids in the built module are the source of truth.
+
+
diff --git a/website/src/content/docs/getting-started/index.mdx b/website/src/content/docs/getting-started/index.mdx
new file mode 100644
index 0000000..6472ae9
--- /dev/null
+++ b/website/src/content/docs/getting-started/index.mdx
@@ -0,0 +1,114 @@
+---
+title: Introduction
+description: Why responsive images need more than one file, and how srcset generates the widths and formats a page should offer.
+sidebar:
+ order: 1
+---
+
+import { CardGrid, LinkCard, Aside } from '@astrojs/starlight/components'
+
+One image file cannot serve every screen. A 2560px hero is a waste on a 400px phone, a jpg is roughly twice the bytes of the same picture as [avif](https://jakearchibald.com/2020/avif-has-landed/), and a retina display asks for twice the pixels of the layout it fills. The markup for all of that already exists - [`srcset`, `sizes` and ``](https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images) - and what is missing is the pile of files it points at.
+
+Srcset generates that pile. You describe the widths and formats once, and the same import that used to give you a url now gives you every variant of the image.
+
+## A rule says what to generate
+
+```js
+srcset({
+ rules: [
+ {
+ width: [1920, 1280, 640],
+ format: ['jpg', 'webp', 'avif']
+ }
+ ]
+})
+```
+
+Three widths in three formats: nine files per image, encoded at build time with [sharp](https://sharp.pixelplumbing.com/). A width of 1 or less is a multiplier instead - `width: [1, 0.5]` means "the original and a half sized copy" - and rules can be scoped to some images and not others. That is the whole model, and the [rules](/getting-started/rules/) page is where it lives.
+
+## The import gives you the set
+
+```ts
+import url, { src, srcSet, srcMap, placeholder } from './photo.jpg'
+```
+
+| Export | What it is |
+| --- | --- |
+| `default` | Url of the selected variant, e.g. `/assets/photo-BsK7yzuP.jpg` |
+| `src` | The selected variant: `{ id, format, type, width, height, url }` |
+| `srcSet` | Every generated variant, as an array |
+| `srcMap` | Id-to-url map, e.g. `srcMap.webp640` |
+| `placeholder` | Blur-up data-url, when the `placeholder` option is on |
+
+The module is tree-shakable, so an import of `url` alone leaves the rest out of the bundle.
+
+## The markup goes to the browser
+
+```tsx
+import { Picture, Image } from '@srcset/react'
+import { src, srcSet } from './photo.jpg'
+
+// The layout width of the image, which the browser needs before it has laid
+// the page out: 800px on wide screens, the full viewport width otherwise.
+const sizes = '(min-width: 900px) 800px, 100vw'
+
+
+
+
+```
+
+Both components take the same `srcSet`: `Picture` splits it into a `` per format. `Image` also gets `src`, the variant that is the primary one - it narrows the set to that format for the fallback ``, and takes its intrinsic size from it. Which comes out as this:
+
+```html
+
+
+
+
+
+```
+
+A `` per format, ordered so a browser takes avif if it can and webp if not, and an `` that carries the jpg as the fallback and its own list of widths. The intrinsic `width` and `height` come from the selected variant and hold the layout still while the image loads. Without a framework the same attributes come from [`getSourceProps` and `getImageProps`](/api/runtime/).
+
+
+
+## Pick an integration
+
+
+
+
+
+
+
+
+The first three are build-time: they need the image files in the project. The proxy adapters are runtime and isomorphic - they build variant urls for images an [imgproxy](https://imgproxy.net/) or [Cloudflare](https://developers.cloudflare.com/images/) server transforms, so they need no sharp and no build step.
+
+A project can use several at once: a bundler integration for the images it ships, an adapter for the ones a CMS serves. Whichever one it is, its own page carries the install command and the options. For a framework, there are components on top: [`@srcset/react`, `@srcset/preact` and `@srcset/svelte`](/components/).
diff --git a/website/src/content/docs/getting-started/rules.mdx b/website/src/content/docs/getting-started/rules.mdx
new file mode 100644
index 0000000..60940b4
--- /dev/null
+++ b/website/src/content/docs/getting-started/rules.mdx
@@ -0,0 +1,203 @@
+---
+title: Rules
+description: The rule model shared by the Vite plugin, the webpack and Rspack loader and the cli - matching, widths, formats and encoder options.
+sidebar:
+ order: 3
+---
+
+import { Aside } from '@astrojs/starlight/components'
+
+A rule is a **matcher plus what to generate** from the images it matches. The same rule objects go into the [Vite plugin](/integrations/vite-plugin/), the [loader](/integrations/loader/), the [cli config](/integrations/cli/) and an [import query](/getting-started/image-modules/#import-query), so this page applies to all of them.
+
+## Anatomy of a rule
+
+```js
+rules: [
+ // Animations: gif for the reach, webp for the size - both keep the frames.
+ {
+ match: '**/*.gif',
+ format: ['gif', 'webp']
+ },
+ // Stickers and screenshots: png keeps the transparency.
+ {
+ match: '**/*.png',
+ width: [1, 0.5],
+ format: ['png', 'webp']
+ },
+ // Everything else.
+ {
+ width: [1920, 1280, 640],
+ format: ['jpg', 'webp', 'avif']
+ }
+]
+```
+
+| Field | Type | Default | What it does |
+| --- | --- | --- | --- |
+| `match` | `Matcher \| Matcher[]` | matches everything | Glob, media query or function to match the image by. |
+| `fallthrough` | `boolean` | `false` | Keep matching the rest of the rules after this one matched. |
+| `width` | `number \| number[]` | source width | Widths to resize to. A value of 1 or less is a multiplier. |
+| `format` | `ImageFormat \| ImageFormat[]` | source format | Formats to convert to: `avif`, `webp`, `jpg`, `png`, `gif`, `svg`. |
+| `processing` | `ProcessingOptions` | `jpg.mozjpeg`, `png.palette` | [sharp](https://sharp.pixelplumbing.com/api-output/) output options per format. |
+| `optimization` | `OptimizationOptions` | none | Custom optimizer function per format. |
+| `skipOptimization` | `boolean` | `false` | Do not re-encode the original variant, and skip the optimizers. |
+| `scalingUp` | `boolean` | `true` | Emit variants requested wider than the source, capped at the source width. |
+| `postfix` | `string \| PostfixFormatter` | `@w` | Postfix added to the variant file name. |
+
+`match`, `fallthrough`, `width` and `format` only exist on a rule. The encoder options below them - `processing`, `optimization`, `skipOptimization`, `scalingUp` and `postfix` - can also be set **once on the integration itself**, where they become the default for every rule, and a rule that sets the same option overrides it - `processing` and `optimization` merge with the integration-level ones per format instead of replacing them. `concurrency` and the disk cache are integration-level only.
+
+## Order and fallthrough
+
+Rules are tried in order and **matching stops at the first hit**: an image is generated by exactly one rule, unless that rule sets `fallthrough: true` and lets the search continue.
+
+```js
+rules: [
+ // Hero images get an extra large variant, and the general rule after it.
+ {
+ match: '**/hero.*',
+ width: [2560],
+ format: ['jpg', 'webp'],
+ fallthrough: true
+ },
+ {
+ width: [1, 0.5],
+ format: ['jpg', 'webp', 'avif']
+ }
+]
+```
+
+Two rules that resolve to one and the same file produce it once - the first rule wins, as it does without `fallthrough`.
+
+A rule **without `match` matches everything**, which makes it the catch-all, and a catch-all belongs last: rules after it are unreachable.
+
+
+
+## Matching
+
+`match` takes a glob, a media query, a function, or an array of them.
+
+### Globs
+
+A [picomatch](https://github.com/micromatch/picomatch) pattern, tested against the **absolute path** of the source file with posix separators:
+
+```js
+{
+ match: '**/*.{jpg,jpeg}'
+}
+```
+
+Anchor patterns with `**/`, always. `'src/images/*.jpg'` matches nothing, because the path it is tested against starts at the root of the file system; `'**/src/images/*.jpg'` is the pattern that works.
+
+### Media queries
+
+A string with a `width` or `height` feature is read as a CSS media query and matched against the **size of the source image**, not against a viewport:
+
+```js
+{
+ match: '(min-width: 1920px)',
+ width: [1, 0.5, 0.25]
+}
+```
+
+A comma separated list is an `or`, exactly as in css: `'(min-width: 1920px), (min-height: 1920px)'` matches an image that is large in either direction. Only `width` and `height` features turn a string into a media query - a parenthesised extglob is still a glob.
+
+### Functions
+
+```js
+{
+ // Panoramas only.
+ match: (path, size) => size.width / size.height > 2,
+ width: [1, 0.5],
+ format: ['jpg', 'webp']
+}
+```
+
+The matcher gets the source file path as the integration feeds it, the size in pixels as `{ width, height }`, and the source file itself as `{ path, contents }`.
+
+### Arrays are an `and`
+
+```js
+{
+ // Big jpgs, and nothing else.
+ match: ['**/*.jpg', '(min-width: 1920px)']
+}
+```
+
+Every matcher in the array has to match. For an `or`, write separate rules, one brace glob, or one comma separated media query list.
+
+## Widths
+
+`width` takes one number or a list of them:
+
+- a value **of 1 or less is a multiplier** of the source width - `[1, 0.5]` is "the original and a half sized copy", and the multiplied width is rounded up;
+- a value **above 1 is absolute pixels**, and has to be an integer - `1.5` fails the build with `Invalid width: 1.5`;
+- with no `width` at all only the source width is generated.
+
+**Pixels are never upscaled.** A width above the source width still produces a variant, capped at the source width and named after the width it actually has: a 1600px source asked for `2400` yields `photo@1600w.jpg`. Set `scalingUp: false` to drop those variants instead of capping them - useful when the same rule set covers sources of very different sizes.
+
+Requested widths that resolve to one and the same file are generated once, so an oversized list costs nothing beyond the encoding it does need.
+
+The multiplier `1` is the one width that gets **no postfix**: it keeps the source file name, `photo.jpg` and `photo.webp`. An absolute width equal to the source width still gets one, `photo@1600w.jpg`.
+
+## Formats
+
+`format` takes one format or a list: `avif`, `webp`, `jpg`, `png`, `gif`, `svg`. `jpeg` and `heif` are accepted as aliases of `jpg` and `avif`; anything else fails the build with `Unsupported image format: "tiff"`. With no `format` the source format is kept.
+
+**Put the widely supported format first and the modern ones after it** - `['jpg', 'webp', 'avif']`. The order only decides which variant is the fallback when the source format is not in the list, and that fallback is what a browser gets when it supports nothing else.
+
+
+
+### Png, gif and svg
+
+Give these their own rules, before the catch-all:
+
+- **png** converted to jpg loses its transparency. Keep png in the list: `format: ['png', 'webp']`.
+- **animated gif** keeps its frames only as `gif` or `webp`. Jpg and avif flatten it to a single frame.
+- **svg** is never resized and never converted. A rule passes it through only when its `format` is unset or includes `svg`, so a raster-only `format` drops it silently. The Vite plugin skips `.svg` imports entirely, and the loader should keep `.svg` out of its `test`; the cli does pass svg files through.
+
+## Encoding options
+
+```js
+{
+ processing: {
+ jpg: {
+ quality: 80
+ },
+ avif: {
+ effort: 6
+ }
+ },
+ optimization: {
+ // `optimize` is svgo's.
+ svg: contents => Buffer.from(optimize(contents.toString()).data)
+ },
+ postfix: (width, requestedWidth, format) => `-${width}`
+}
+```
+
+- **`processing`** - [sharp output options](https://sharp.pixelplumbing.com/api-output/) per format, merged per format over the defaults `jpg: { mozjpeg: true }` and `png: { palette: true }`. Overriding `jpg.quality` therefore keeps `mozjpeg` on. The defaults are chosen by SSIM and file size: mozjpeg gives around 30% smaller jpg files at the same quality, `palette` turns on lossy quantization for png.
+- **`optimization`** - a `(contents, format) => Buffer` function per format, applied to the already encoded bytes. It is the only way to touch svg, e.g. with [svgo](https://github.com/svg/svgo).
+- **`skipOptimization`** - the variant that matches the source format at the source width is passed through byte for byte instead of being re-encoded, and the custom optimizers never run. Resized and converted variants are still encoded.
+- **`postfix`** - a string, or a `(width, requestedWidth, format) => string` formatter. `width` is the actual output width, `requestedWidth` is what the rule asked for - the multiplier, when it was one. The formatter has to be pure: it is called repeatedly, including for variants that end up skipped, and its result is part of the cache key.
+
+## Where rules live
+
+| Where | How |
+| --- | --- |
+| [Vite plugin](/integrations/vite-plugin/) | `rules` in the plugin options. |
+| [Loader](/integrations/loader/) | `rules` in the loader options. |
+| [Cli](/integrations/cli/) | `rules` in `srcset.config.js`. The `-m`, `-w` and `-f` arguments build one rule that **replaces** the whole list. |
+| [Import query](/getting-started/image-modules/#import-query) | A JSON rule in the query replaces the whole rule set for that one import. |
+
+## Pitfalls
+
+- **No catch-all, no image.** A rule set that misses an image leaves an empty module behind, and nothing on the page says so.
+- **An array in `match` is an `and`.** `['**/*.jpg', '**/hero*']` matches only the jpgs whose name starts with `hero`.
+- **Globs are absolute.** Without a leading `**/` a path pattern matches nothing.
+- **The first format is the fallback only when the source format is missing from the list.** `['avif', 'jpg']` on a jpg source still hands out the jpg; on a png source it hands avif to everyone.
+- **Png and gif in the catch-all.** A general `format: ['jpg', 'webp', 'avif']` strips transparency from png files and flattens animated gifs. They need rules of their own.
+- **Svg in a raster rule.** A `format` without `svg` drops svg files without a word.
diff --git a/website/src/content/docs/index.mdx b/website/src/content/docs/index.mdx
new file mode 100644
index 0000000..5b389a7
--- /dev/null
+++ b/website/src/content/docs/index.mdx
@@ -0,0 +1,44 @@
+---
+title: srcset
+description: Highly customizable tools for generating responsive images - build-time generation, image proxy adapters and framework components, without vendor and server lock-in.
+template: splash
+editUrl: false
+hero:
+ tagline: One import, every variant. Resize and convert images at build time, and render a real srcset instead of one fixed file.
+ image:
+ dark: ../../assets/srcset-dark.svg
+ light: ../../assets/srcset-light.svg
+ actions:
+ - text: Get Started
+ link: /getting-started/
+ icon: right-arrow
+ - text: GitHub
+ link: https://github.com/TrigenSoftware/srcset
+ icon: external
+ variant: minimal
+---
+
+import { Card, CardGrid } from '@astrojs/starlight/components'
+
+## Features
+
+
+
+ Resize for screen sizes and densities, convert to [WebP](https://developers.google.com/speed/webp) and [Avif](https://jakearchibald.com/2020/avif-has-landed/), and keep a widely supported fallback. Encoded with [sharp](https://sharp.pixelplumbing.com/).
+
+
+ An image import becomes a module carrying every variant, and only what you use reaches the bundle.
+
+
+ Integrations for the modern bundlers, with a variant cache that keeps repeated builds fast.
+
+
+ The cli [bakes](/integrations/baking/) the variants plus an ES module importing them, so a project can commit the result and build without any bundler plugin.
+
+
+ Ready `Picture` and `Image` components for React, Preact and Svelte.
+
+
+ Images from an API or a CMS never reach your build. The [imgproxy](https://imgproxy.net/) and [Cloudflare](https://developers.cloudflare.com/images/) adapters build the same variant objects at runtime.
+
+
diff --git a/website/src/content/docs/integrations/baking.mdx b/website/src/content/docs/integrations/baking.mdx
new file mode 100644
index 0000000..b0fff23
--- /dev/null
+++ b/website/src/content/docs/integrations/baking.mdx
@@ -0,0 +1,254 @@
+---
+title: Baking modules
+description: 'The --module mode of @srcset/cli: write the variants plus an ES module importing them, commit the result, and ship responsive images without a bundler integration.'
+sidebar:
+ order: 4
+---
+
+import { Aside, LinkCard } from '@astrojs/starlight/components'
+
+**Baking** is [`@srcset/cli`](/integrations/cli/) with `--module`: next to the generated variants it writes an ES module that imports them and exports the same `src`, `srcSet`, `srcMap` and `placeholder` a bundler integration would have produced at build time.
+
+The point is what the project then does *not* need. No plugin in the Vite config, no loader rule, no image encoding on every cold build or in CI - sharp comes with the cli, and never gets near the build of the project. The baked files are committed like any other source, and the bundler only has to do what it already does with a png: copy it and give it a url.
+
+The trade is that the variants are generated when you run the command, not when you build. Change the rules, or add an image, and you run it again.
+
+## Bake it
+
+```sh frame="none"
+pnpm srcset "images/*.jpg" -d src/baked --module ts -w 1,0.5 -f jpg,webp -v
+```
+
+```text frame="none"
+images/photo.jpg -> src/baked/images/photo.jpg
+images/photo.jpg -> src/baked/images/photo@1560w.jpg
+images/photo.jpg -> src/baked/images/photo.webp
+images/photo.jpg -> src/baked/images/photo@1560w.webp
+images/photo.jpg -> src/baked/images/photo.ts
+images/thumb.jpg -> src/baked/images/thumb.jpg
+images/thumb.jpg -> src/baked/images/thumb@320w.jpg
+images/thumb.jpg -> src/baked/images/thumb.webp
+images/thumb.jpg -> src/baked/images/thumb@320w.webp
+images/thumb.jpg -> src/baked/images/thumb.ts
+```
+
+Four variants and one module per source. Everything from the [cli page](/integrations/cli/) still holds: the destination mirrors the source tree relative to the current directory, `-w`/`-f`/`-m` build one rule that replaces the config `rules`, and several rules need `srcset.config.js`.
+
+## The generated module
+
+`thumb.jpg` was 640px wide, so `-w 1,0.5` gave a 640px and a 320px variant in each of the two formats:
+
+```ts title="src/baked/images/thumb.ts"
+import thumb_jpg from "./thumb.jpg"
+import thumb_320w_jpg from "./thumb@320w.jpg"
+import thumb_webp from "./thumb.webp"
+import thumb_320w_webp from "./thumb@320w.webp"
+
+const url = thumb_jpg;
+const src = {
+ id: "jpg640",
+ format: "jpg" as const,
+ type: "image/jpeg",
+ width: 640,
+ height: 480,
+ url: url
+};
+
+export default url;
+export { src };
+export const srcSet = [src, {
+ id: "jpg320",
+ format: "jpg" as const,
+ type: "image/jpeg",
+ width: 320,
+ height: 240,
+ url: thumb_320w_jpg
+}, {
+ id: "webp640",
+ format: "webp" as const,
+ type: "image/webp",
+ width: 640,
+ height: 480,
+ url: thumb_webp
+}, {
+ id: "webp320",
+ format: "webp" as const,
+ type: "image/webp",
+ width: 320,
+ height: 240,
+ url: thumb_320w_webp
+}];
+export const srcMap = {
+ "jpg640": url,
+ "jpg320": thumb_320w_jpg,
+ "webp640": thumb_webp,
+ "webp320": thumb_320w_webp
+};
+export const placeholder = undefined;
+```
+
+Note that the urls are not strings: every variant is an `import` of the file next to the module, so the **bundler of the project resolves it**, hashes it, and puts it where its asset pipeline puts assets. Nothing in the module assumes a public path.
+
+The exports are the [image module contract](/getting-started/image-modules/) the Vite plugin and the loader produce, so app code written against one works against the other unchanged:
+
+```tsx
+import { Picture, Image } from '@srcset/react'
+import { src, srcSet, placeholder } from './baked/images/photo'
+
+
+
+
+```
+
+Without components, `getImageProps` and `getSourceProps` from [`@srcset/runtime`](/api/runtime/) build the attributes.
+
+## The four layouts
+
+| `--module` | Writes |
+| --- | --- |
+| `ts` | The module next to the variants, named after the source: `images/thumb.ts` |
+| `js` | The same, as javascript: `images/thumb.js` |
+| `ts-dir` | A folder named after the source, holding the variants and an `index.ts` |
+| `js-dir` | The same, with an `index.js` |
+
+The flat formats mirror the source tree one to one:
+
+```text frame="none" title="--module ts"
+src/baked/images/
+├── photo.jpg
+├── photo.ts
+├── photo.webp
+├── photo@1560w.jpg
+├── photo@1560w.webp
+├── thumb.jpg
+├── thumb.ts
+├── thumb.webp
+├── thumb@320w.jpg
+└── thumb@320w.webp
+```
+
+The `-dir` formats give each image a folder of its own, which keeps a directory of many images readable and lets the app import the folder instead of a file:
+
+```text frame="none" title="--module ts-dir"
+src/baked/images/
+├── photo/
+│ ├── index.ts
+│ ├── photo.jpg
+│ ├── photo.webp
+│ ├── photo@1560w.jpg
+│ └── photo@1560w.webp
+└── thumb/
+ ├── index.ts
+ ├── thumb.jpg
+ ├── thumb.webp
+ ├── thumb@320w.jpg
+ └── thumb@320w.webp
+```
+
+```ts
+import photo from './baked/images/photo'
+```
+
+Neither layout puts an extension in the import, so the bundler resolver has to find the module on its own. For a `js` module that is the default everywhere; for a `ts` one Vite resolves it out of the box, while webpack and Rspack need `.ts` in `resolve.extensions`.
+
+## Shaping the module
+
+Three options change what the module exports, and all of them are ignored without `--module`:
+
+- `--placeholder`, `--placeholder-width`, `--placeholder-format` - inline a tiny variant as a data-url for a blur-up placeholder. 16px webp by default; it is written into the module itself, so keep it small.
+- `--select-id`, `--select-format`, `--select-width` - which variant the default export and `src` point at. Without them the module points at the variant matching the source format and the source width, falling back to the first one generated.
+- `resourceId` in the config - the id of a variant, `` `${format}${width}` `` by default, which is what the `srcMap` keys are.
+
+```sh frame="none"
+pnpm srcset "images/*.jpg" -d src/baked --module ts -w 1,0.5 -f jpg,webp \
+ --placeholder --placeholder-width 24 --select-format webp
+```
+
+```ts title="src/baked/images/thumb.ts" {6}
+import thumb_jpg from "./thumb.jpg"
+import thumb_320w_jpg from "./thumb@320w.jpg"
+import thumb_webp from "./thumb.webp"
+import thumb_320w_webp from "./thumb@320w.webp"
+
+const url = thumb_webp;
+const src = {
+ id: "webp640",
+ // ...
+};
+// ...
+export const placeholder = "data:image/webp;base64,UklGRkYAAABXRUJQVlA4IDoAAABQAwCdASoYABIAPm00lkekIyIhKAgAgA2JZQB2APwAAIMoIAD...";
+```
+
+
+
+## What the project must provide
+
+The cli deliberately stops at the files. Four things are on the project side.
+
+### A way to import the image files
+
+The module imports `./thumb.jpg`, so the bundler must turn that into a url. Vite does it natively. Webpack and Rspack have no built-in handling for `.jpg` at all - they need an asset rule for the baked extensions:
+
+```js title="webpack.config.js"
+export default {
+ module: {
+ rules: [
+ {
+ test: /\.(jpe?g|png|gif|webp|avif)$/i,
+ type: 'asset/resource'
+ }
+ ]
+ },
+ resolve: {
+ extensions: ['...', '.ts']
+ }
+}
+```
+
+The `.ts` in `resolve.extensions` is what makes the extensionless import of a `ts` module resolve. Webpack still parses the file with the loaders configured for it, so a baked `ts` module also has to be covered by whatever compiles TypeScript in the project - `swc-loader`, `babel-loader`, `ts-loader` - or the build stops at `Module parse failed: Unexpected token` on the `as const`. A `js` module needs neither.
+
+### Ambient types for those imports
+
+Inside a `ts` module, `import thumb_jpg from "./thumb.jpg"` needs a declaration per baked extension. With Vite the `vite/client` types already declare them; otherwise write them once:
+
+```ts title="src/images.d.ts"
+declare module '*.jpg' {
+ const url: string
+ export default url
+}
+
+declare module '*.webp' {
+ const url: string
+ export default url
+}
+```
+
+The `client` types of the Vite plugin and the loader are not needed here - they describe *image imports handled by an integration*, and in a baked project the image files are plain assets.
+
+### `sideEffects: false`, to drop unused variants
+
+A module carrying an import per variant is worth tree-shaking: a page importing only `src` should not ship the other three files. Webpack leaves an unused variant out of the build only when the package says its modules have no side effects:
+
+```json title="package.json"
+{
+ "sideEffects": false
+}
+```
+
+Rollup - and so Vite - drops the unused *code* either way, but emits the asset file of the unused import regardless: only the url disappears, not the file. Webpack with the flag leaves out both.
+
+## Pitfalls
+
+- **File names are never hashed.** `thumb@320w.webp` is written exactly as the rules describe it. Cache busting is the bundler's job here - it hashes the asset when it resolves the import - or set a `postfix` in the config.
+- **An image no rule matched gets no module.** Nothing is written for it, and the run still exits `0`. A rule set without a catch-all silently bakes half a folder.
+- **Re-running never cleans the destination.** Drop a format and the module is rewritten without it, but the files it used to import stay behind. Delete the destination directory when the rules change.
+- **The baked tree is source, not build output.** It goes into version control, and out of `.gitignore` - that is the whole point of baking. Keep it out of the directories a build cleans.
+- **Sources outside the current directory keep only their file name**, so two of them can collide on one output path and stop the run. See [output paths](/integrations/cli/#output-paths).
+
+
diff --git a/website/src/content/docs/integrations/cli.mdx b/website/src/content/docs/integrations/cli.mdx
new file mode 100644
index 0000000..ae07f74
--- /dev/null
+++ b/website/src/content/docs/integrations/cli.mdx
@@ -0,0 +1,255 @@
+---
+title: CLI
+description: '@srcset/cli: generate responsive image variants from the command line - globs, rules, the full option table, the srcset.config.js file and the output path rules.'
+sidebar:
+ order: 3
+---
+
+import { Tabs, TabItem, Aside, LinkCard } from '@astrojs/starlight/components'
+
+`@srcset/cli` resizes, converts and optimizes images with [sharp](https://sharp.pixelplumbing.com/) from the command line. It takes source globs, the same [rules](/getting-started/rules/) the bundler integrations use, and a destination directory - the result is plain files, with nothing left behind in the build.
+
+With `--module` it also **bakes**: alongside the variants it writes an ES module importing them, so a project can commit the result and run without any bundler integration. That mode has [its own page](/integrations/baking/); everything below applies to it as well.
+
+## Install
+
+
+
+ ```sh frame="none"
+ pnpm add -D @srcset/cli
+ ```
+
+
+ ```sh frame="none"
+ yarn add -D @srcset/cli
+ ```
+
+
+ ```sh frame="none"
+ npm i -D @srcset/cli
+ ```
+
+
+
+The package installs a `srcset` binary. Run it through the project's package manager so the local version is used:
+
+
+
+ ```sh frame="none"
+ pnpm srcset "images/*.jpg" -d static -w 1920,1280,640 -f jpg,webp,avif -v
+ ```
+
+
+ ```sh frame="none"
+ yarn srcset "images/*.jpg" -d static -w 1920,1280,640 -f jpg,webp,avif -v
+ ```
+
+
+ ```sh frame="none"
+ npm exec srcset -- "images/*.jpg" -d static -w 1920,1280,640 -f jpg,webp,avif -v
+ ```
+
+
+
+`-v` prints every written file, so the run above says exactly what it did:
+
+```text frame="none"
+images/hero.jpg -> static/images/hero@1920w.jpg
+images/hero.jpg -> static/images/hero@1280w.jpg
+images/hero.jpg -> static/images/hero@640w.jpg
+images/hero.jpg -> static/images/hero@1920w.webp
+images/hero.jpg -> static/images/hero@1280w.webp
+images/hero.jpg -> static/images/hero@640w.webp
+images/hero.jpg -> static/images/hero@1920w.avif
+images/hero.jpg -> static/images/hero@1280w.avif
+images/hero.jpg -> static/images/hero@640w.avif
+images/photo.jpg -> static/images/photo@1920w.jpg
+...
+```
+
+Three widths times three formats per source. Keeping `jpg` in the list is what matters: it is the variant a browser without avif or webp support can load, and the [one a `--module` default export falls back to](/getting-started/rules/#formats) when the source format is not in the list.
+
+## Command
+
+```text frame="none"
+srcset [...sources] [...options]
+```
+
+| Option | Description |
+| --- | --- |
+| `[...sources]` | Glob patterns for the source images. Quote them, or the shell expands them itself. |
+| `--dest`, `-d` | Destination directory. Required, unless the config sets `dest`. |
+| `--width`, `-w` | Widths to resize to. A value of 1 or less is a **multiplier** of the source width, above 1 it is absolute pixels and must be an integer. Defaults to the source width. |
+| `--format`, `-f` | Formats to convert to: `avif`, `webp`, `jpg`, `png` or `gif` - the first one is the [fallback](/getting-started/rules/#formats) when the source format is not among them. Defaults to the source format. `svg` is accepted only as a passthrough for svg sources; nothing is ever converted to it. |
+| `--match`, `-m` | Glob pattern or CSS media query to match images by name or size. Repeat to add more - **all** of them must match. |
+| `--module` | Bake an [image module](/integrations/baking/): `ts`, `js`, `ts-dir` or `js-dir`. Off by default. |
+| `--placeholder` | Add the `placeholder` module export - a tiny variant inlined as a data-url. `--no-placeholder` switches off one enabled in the config. |
+| `--placeholder-width` | Placeholder width in pixels, `16` by default. Implies `--placeholder`. |
+| `--placeholder-format` | Placeholder format: `webp` (default) or `jpg`. Implies `--placeholder`. |
+| `--select-id` | Module default export: the variant with this resource id, e.g. `webp640`. |
+| `--select-format` | Module default export: the variant of this format. |
+| `--select-width` | Module default export: the variant of this width; 1 or less is a multiplier. |
+| `--skip-optimization` | Do not re-encode the variant that is neither resized nor converted - it is copied byte for byte - and skip the custom `optimization` functions. |
+| `--no-scaling-up` | Drop the variants requested wider than the source instead of capping them at the source width. |
+| `--concurrency` | Concurrency limit of the sharp work. Defaults to the number of available CPU cores. |
+| `--config`, `-c` | Config file path. Defaults to looking up `srcset.config.js` in the current directory. |
+| `--verbose`, `-v` | Print every written file as `source -> output`. |
+| `--help`, `-h` | Print the usage and exit. |
+
+Anything the parser did not recognise is reported instead of being taken for a glob:
+
+```text frame="none"
+Unknown option: "--widht".
+```
+
+### Multi-value flags
+
+`-w` and `-f` take several values either comma-separated or as repeated flags - `-w 1920,1280` and `-w 1920 -w 1280` are the same thing.
+
+`-m` is different: its argument is taken as it is, because a comma is a legal character in both a brace glob and a media query list. Pass several patterns as repeated flags, and remember they combine with **and**:
+
+```sh frame="none"
+# only the jpg files whose name starts with "hero"
+pnpm srcset "images/*" -d static -m '**/*.jpg' -m '**/hero*' -w 1
+```
+
+For "either" use one brace glob, `-m '**/*.{jpg,png}'`, or one media query list.
+
+## Output paths
+
+The destination mirrors the source tree **relative to the current directory**, so `images/photo.jpg` with `-d static` lands at `static/images/photo.jpg` - and `src/images/photo.jpg` lands at `static/src/images/photo.jpg`, with the `src/` level and all. To flatten the tree, run the command from the directory holding the images:
+
+```sh frame="none"
+cd images && pnpm srcset "*.jpg" -d ../static/images -w 1280,640 -f jpg,webp
+```
+
+Resized variants get an `@w` postfix built from the **actual** width: `static/images/photo@1280w.jpg`. The variant requested as the multiplier `1` gets no postfix at all, so it keeps the source file name.
+
+Sources outside the current directory keep only their file name, which means two of them can land on one output path. That stops the run rather than losing a file quietly:
+
+```text frame="none"
+Output path collision: "static/photo.jpg". Run from a directory containing every source, or process them separately.
+```
+
+## Config file
+
+Everything the flags cannot express lives in `srcset.config.js`, looked up in the current directory. It is an ES module with the options object as the default export, so the project needs `"type": "module"` in its `package.json` - or an `.mjs` file passed with `--config`.
+
+```js title="srcset.config.js"
+export default {
+ src: 'images/**/*',
+ dest: 'static',
+ rules: [
+ {
+ match: '**/*.png',
+ width: [1, 0.5],
+ format: ['png', 'webp']
+ },
+ {
+ match: '**/*.gif',
+ width: [1, 0.5],
+ format: ['gif', 'webp']
+ },
+ {
+ width: [1, 0.5],
+ format: ['jpg', 'webp', 'avif']
+ }
+ ]
+}
+```
+
+With that file in place the whole run is `pnpm srcset`.
+
+| Key | Description |
+| --- | --- |
+| `src` | Source glob pattern or an array of them. The command line sources win over it. |
+| `dest` | Destination directory. |
+| `rules` | Array of [rules](/getting-started/rules/): a `match` plus what to generate. Defaults to a single empty rule - every image, source width, source format. |
+| `module` | `ts`, `js`, `ts-dir` or `js-dir`. See [Baking modules](/integrations/baking/). |
+| `placeholder` | `true` for the defaults, or `{ width, format }`. |
+| `select` | `{ id, format, width }` - which variant the module's default export points at. |
+| `resourceId` | `(width, requestedWidth, format) => string`, the id of a variant. Defaults to `` `${format}${width}` ``, e.g. `webp640`. |
+| `processing` | [sharp output options](https://sharp.pixelplumbing.com/api-output/) per format. Merged per format over the defaults - `jpg.mozjpeg` and `png.palette`. |
+| `optimization` | Custom optimizer functions per format, `(contents, format) => Buffer`. The only way to touch svg. |
+| `skipOptimization` | Same as `--skip-optimization`. |
+| `scalingUp` | `false` is the same as `--no-scaling-up`. |
+| `postfix` | A string, or a formatter `(width, requestedWidth, format) => string`. Defaults to `@w`, empty for the multiplier `1`. |
+| `concurrency` | Same as `--concurrency`. |
+| `verbose` | Same as `--verbose`. |
+
+`placeholder`, `select` and `resourceId` shape the baked module, so they do nothing without `module`.
+
+`rules`, `placeholder`, `select`, `resourceId`, `processing`, `optimization`, `skipOptimization`, `scalingUp`, `postfix` and `concurrency` are exactly the options of the bundler integrations, so a config can be lifted from a Vite or webpack setup as is.
+
+
+
+### Arguments vs config
+
+An argument wins over the config value it corresponds to. Some of them replace rather than merge:
+
+- **`-m`, `-w` and `-f` build one rule that replaces the whole `rules` list.** With the config above, `pnpm srcset -f webp` does not add webp to the three rules - it generates a single webp variant of every image, png and gif included.
+- **The select flags replace the whole `select` object.** `--select-format webp` drops a `select.width` from the config.
+- **The placeholder flags replace the whole `placeholder` object.** `--placeholder-width 24` against a config `placeholder: { format: 'jpg' }` leaves `{ width: 24 }`, back on the default webp. `--no-placeholder` beats them all and switches the export off.
+
+So only two things actually require the config file, because no flag can express them: **more than one rule**, and the options that are functions or nested objects - `resourceId`, `processing`, `optimization`, a formatter `postfix`, a matcher function. Everything else has a flag.
+
+## Recipes
+
+Convert a folder of photos to modern formats, keeping the original as the fallback (a folder with png or gif in it needs rules of their own - a flat `-f` list would convert them too):
+
+```sh frame="none"
+pnpm srcset "assets/**/*.jpg" -d dist -f jpg,webp,avif
+```
+
+Make one image responsive at several widths:
+
+```sh frame="none"
+pnpm srcset "images/hero.jpg" -d static -w 1920,1280,640 -f jpg,webp
+```
+
+Half-size copies of everything, originals untouched:
+
+```sh frame="none"
+pnpm srcset "images/*" -d thumbs -w 0.5
+```
+
+Re-encode a whole tree with the sharp defaults - no resizing, no conversion:
+
+```sh frame="none"
+pnpm srcset "images/**/*" -d optimized
+```
+
+Make it repeatable: put the sources, the destination and the rules in `srcset.config.js` and add a script.
+
+```json title="package.json"
+{
+ "scripts": {
+ "images": "srcset"
+ }
+}
+```
+
+## Verify
+
+Run with `-v` and read the `source -> output` lines: one per written variant, plus one per module when baking. The count should match the rule that matched - widths times formats. Then check the destination tree.
+
+Nothing is written when nothing matched, and that is a silent, successful run - see the pitfalls below.
+
+## Pitfalls
+
+- **Quote the source globs.** Unquoted, the shell expands them first: `**` silently loses its recursive meaning in shells without `globstar`, and zsh errors out when a pattern matches nothing.
+- **`--width 0.5` is a multiplier, `--width 500` is pixels.** `-w 1` means "the source width", which is how the untouched-size variant is requested. A fractional value above 1 is rejected: `Invalid width: 1.5`.
+- **Widths above the source width are capped, not upscaled.** For a 640px source, `-w 1920,1280,640` resolves all three to the same file, `thumb@640w.jpg`, written once. With `--no-scaling-up` those variants are dropped instead - and a run asking only for oversized widths then writes nothing at all.
+- **Without `-w` and `-f` the run only re-encodes** the originals into the destination. A valid optimize-only pass, but it produces no `srcset`.
+- **A flat `-f` list converts everything it matched.** `-f jpg,webp` over a folder with a png turns the png into a jpg, transparency and all. Per-format rules need the config file - that is what the `**/*.png` and `**/*.gif` rules in the example above are for.
+- **An image no rule matched is skipped silently.** Nothing is written for it, the run exits `0`, and in `--module` mode no module is written either. The same happens to an svg under a raster-only `-f`: svg passes through only when the format list is unset or includes `svg`.
+- **A source sharp cannot decode fails the whole run**: `Cannot read image "images/broken.jpg": Input buffer contains unsupported image format`. That is deliberate - a corrupt file the run was pointed at should not be passed over as an unmatched image.
+- **Re-running never cleans the destination.** Dropping a width or a format leaves the files it used to write in place; delete the destination directory when the rules change.
+
+
diff --git a/website/src/content/docs/integrations/loader.mdx b/website/src/content/docs/integrations/loader.mdx
new file mode 100644
index 0000000..46869b2
--- /dev/null
+++ b/website/src/content/docs/integrations/loader.mdx
@@ -0,0 +1,218 @@
+---
+title: Webpack and Rspack loader
+description: Setup and option reference for @srcset/loader - the module rule, the output name template and its tokens, public paths, SSR builds and caching.
+sidebar:
+ order: 2
+---
+
+import { Tabs, TabItem, Aside } from '@astrojs/starlight/components'
+
+`@srcset/loader` turns an image import into a [module carrying every generated variant](/getting-started/image-modules/). One loader covers both [webpack](https://webpack.js.org/) and [Rspack](https://rspack.rs/) - it only uses the parts of the loader context both compilers implement. Rsbuild and other Rspack-based tools take the same `module.rules` entry through their Rspack config escape hatch.
+
+## Install
+
+
+
+ ```sh frame="none"
+ pnpm add -D @srcset/loader
+ pnpm add @srcset/runtime
+ ```
+
+
+ ```sh frame="none"
+ yarn add -D @srcset/loader
+ yarn add @srcset/runtime
+ ```
+
+
+ ```sh frame="none"
+ npm i -D @srcset/loader
+ npm i @srcset/runtime
+ ```
+
+
+
+`@srcset/runtime` is a peer dependency - it carries the `SrcSetEntry` type and the helpers that turn variants into DOM attributes. It ships to the browser, so it goes into the regular dependencies while the loader stays a dev one. `webpack` and `@rspack/core` are optional peers: install whichever one the project builds with.
+
+## Usage
+
+```js title="webpack.config.js / rspack.config.js"
+export default {
+ module: {
+ rules: [
+ {
+ test: /\.(jpe?g|png|gif)$/i,
+ use: {
+ loader: '@srcset/loader',
+ options: {
+ rules: [
+ // Png keeps its format for the transparency, plus a webp twin.
+ {
+ match: '**/*.png',
+ width: [1, 0.5],
+ format: ['png', 'webp']
+ },
+ // Everything else: jpg for the reach, webp and avif for the size.
+ {
+ width: [1, 0.5],
+ format: ['jpg', 'webp', 'avif']
+ }
+ ],
+ placeholder: true
+ }
+ }
+ }
+ ]
+ }
+}
+```
+
+```ts
+import url, { src, srcSet, srcMap, placeholder } from './photo.jpg'
+```
+
+The rule model - matching, widths, formats, encoding options - is the same for every build-time integration and is documented on the [Rules](/getting-started/rules/) page. What the import gives you back is on the [Image modules](/getting-started/image-modules/) page.
+
+Without `rules` the loader falls back to a single empty rule: every image is re-encoded once, at its own width and in its own format.
+
+
+
+## Options
+
+Loader options, all optional:
+
+| Option | Type | Default | Description |
+| --- | --- | --- | --- |
+| `rules` | `SrcSetRule[]` | one empty rule | Rules to generate the variants. A [rule in the import query](/getting-started/image-modules/) replaces them for that import. |
+| `placeholder` | `boolean \| { width, format }` | off | Adds the `placeholder` export - a tiny variant inlined as a data-url. Defaults to 16px wide webp; `format` is `'webp'` or `'jpg'`. |
+| `select` | `{ id?, format?, width? }` | the source format at the source width | Which variant the default export and `src` point at. `width` may be an absolute value or a multiplier less than or equal to 1. The import query takes precedence. |
+| `resourceId` | `(width, requestedWidth, format) => string` | `` `${format}${width}` `` | Formatter of the `srcMap` keys and of `src.id`. |
+| `cache` | `boolean \| { dir, maxAge }` | `false` | Disk cache of the generated variants - see [Caching](#caching). |
+| `name` | `string` | see [Output naming](#output-naming) | Output file name template. |
+| `context` | `string` | the compiler root context | Base directory the `[path]` token is relative to. |
+| `outputPath` | `string \| (url, resourcePath, context) => string` | the interpolated name as it is | Directory or resolver for the emitted files. |
+| `publicPath` | `string \| (url, resourcePath, context) => string` | the compiler public path | Public url or resolver for the urls in the module. |
+| `emitFile` | `boolean` | `true` | Write the generated files to the build output. |
+
+The generator options below are inherited from the shared generation core. Set them on the loader as the defaults for every image; all of them except `concurrency` can also be set per rule, where they override the loader-level value:
+
+| Option | Type | Default | Description |
+| --- | --- | --- | --- |
+| `processing` | `{ jpg?, png?, webp?, avif?, gif? }` | `{ jpg: { mozjpeg: true }, png: { palette: true } }` | [Sharp output options](https://sharp.pixelplumbing.com/api-output/) per format. Merged per format, so overriding one option keeps the rest of the defaults. |
+| `optimization` | `{ jpg?, png?, webp?, avif?, gif?, svg? }` | none | Custom optimizer function per format, `(contents, format) => Buffer`, applied to the encoded contents. The only way to touch svg, e.g. with `svgo`. |
+| `skipOptimization` | `boolean` | `false` | Do not re-encode the original variant and skip the custom optimizers. |
+| `scalingUp` | `boolean` | `true` | Keep variants requested wider than the source, capped to the source width. `false` drops them instead. Pixels are never upscaled either way. |
+| `postfix` | `string \| (width, requestedWidth, format) => string` | `@w`, empty for the `1` multiplier | Postfix added to the variant file name. A formatter must be pure - it also participates in the cache addressing. |
+| `concurrency` | `number` | `availableParallelism()` | How many variants are encoded in parallel. Loader level only, and shared between the loader runs of the compilation. |
+
+## Output naming
+
+`name` is a template interpolated once per variant. The defaults differ by compiler mode:
+
+| Mode | Default `name` | Example |
+| --- | --- | --- |
+| production and everything else | `[name][postfix].[contenthash:8].[ext]` | `photo@320w.1f4a9c02.webp` |
+| `mode: 'development'` | `[path][name][postfix][sourceext].[ext]` | `images/photo@320w.jpg.webp` |
+
+The development default drops the hash: names stay readable and stable across rebuilds, and cache busting is not needed there. Uniqueness comes from the `[path]` prefix and, for converted images, from `[sourceext]`.
+
+| Token | What it interpolates to |
+| --- | --- |
+| `[name]` | Source file name without the extension. |
+| `[postfix]` | Variant postfix, e.g. `@320w`. Empty for the variant requested with the `1` multiplier. |
+| `[ext]` | Output format of the variant - `jpg`, `webp`, `avif`, `png`, `gif`. |
+| `[path]` | Source directory relative to `context`, with a trailing slash. Empty for a file directly in the context directory, and for a file outside it - emitted names never carry `..` or a drive letter. |
+| `[sourceext]` | Source extension with the dot, e.g. `.jpg`. **Empty when the output format matches the source format.** |
+| `[hash]`, `[contenthash]` | Sha256 of the variant contents, 8 hex characters. Both tokens are the same hash; `[contenthash:12]` sets the length. |
+
+`[sourceext]` exists for one reason: two same-named siblings in different formats produce one name once they are converted. `hero.jpg` and `hero.png` both become `hero.webp` - with `[sourceext]` they become `hero.jpg.webp` and `hero.png.webp` instead. In the production default the content hash already keeps them apart, so the token is only in the development one.
+
+## Paths
+
+```js
+// One entry of module.rules
+{
+ loader: '@srcset/loader',
+ options: {
+ name: '[name][postfix].[contenthash:8].[ext]',
+ outputPath: 'static/images',
+ publicPath: '/static/images'
+ }
+}
+```
+
+- **`outputPath`** - a string is joined in front of the interpolated name, so the file above is emitted to `static/images/photo@320w.1f4a9c02.webp`. A function receives `(url, resourcePath, context)` and returns the whole output path.
+- **`publicPath`** - a string is prefixed to the name, with a slash inserted when it is missing. A function receives the same three arguments. Left unset, the module builds its urls from the compiler's public path at runtime, through `__webpack_public_path__`, so a public path resolved at runtime keeps working.
+- **`context`** - the base directory of the `[path]` token, and the third argument of both resolvers. Defaults to the compiler root context.
+
+## SSR builds
+
+For an SSR or SSG setup the same images are processed by both compilations. Run the server build with `emitFile: false` so the files are written once, by the client build:
+
+```js
+// The same entry in the server config
+{
+ loader: '@srcset/loader',
+ options: {
+ emitFile: false
+ }
+}
+```
+
+The module still carries the full `srcSet` with the same urls - only the file writing is skipped. Everything the urls are built from has to match in both configurations: `name`, `context`, `outputPath`, `publicPath`, and the compiler `mode`, which picks the default `name`. Otherwise the server renders urls the client build never wrote.
+
+## Caching
+
+The disk cache is **off by default**, because the persistent cache of the bundler already covers it - `cache: { type: 'filesystem' }` in webpack, `cache: { type: 'persistent' }` in Rspack. With the bundler cache on, an unchanged image is not sent to the loader at all.
+
+Turn the srcset cache on when the bundler cache is off, or when the same images are processed by more than one compilation:
+
+```js
+// One entry of module.rules
+{
+ loader: '@srcset/loader',
+ options: {
+ cache: true
+ }
+}
+```
+
+- `cache: true` stores the variants in `node_modules/.cache/srcset` under the compiler root context.
+- `{ dir, maxAge }` moves the storage or changes how long an unused entry survives - `maxAge` is in milliseconds and defaults to 30 days.
+
+One storage is shared by every loader run of a compilation, so a variant generated for one module is a hit for the next one; two different configurations of the same directory stay two separate storages. Stale entries are pruned when the compiler is done, never before: pruning first would drop the entries the build is about to hit.
+
+The address of an entry covers the source contents, the variant and every generation option, function options included - they are keyed by their source text. Changing a rule, a sharp option or an optimizer function therefore misses the cache instead of serving a stale file.
+
+## TypeScript
+
+The loader ships ambient declarations for the image imports. Reference them once, in a `.d.ts` of the project or through the tsconfig `types` array:
+
+```ts title="src/images.d.ts"
+///
+```
+
+They declare the default url export and the named ones - `src`, `srcSet`, `srcMap`, `placeholder` - for `.jpg`, `.jpeg`, `.png`, `.webp`, `.avif` and `.gif`. A missing reference shows up as `has no exported member 'srcSet'`.
+
+## Import query
+
+The query of a single import overrides the configured options for that import only:
+
+```ts
+import wide from './photo.jpg?{"width":[1,0.5],"format":["webp","jpg"]}'
+import small from './photo.jpg?format=webp&width=600'
+```
+
+A JSON rule replaces the whole rule set; `id=`, `format=` and `width=` pick the variant behind the default export; `placeholder` and `placeholder=false` switch that export on and off. Parts combine with `&`. The full syntax is on the [Image modules](/getting-started/image-modules/) page.
+
+## Pitfalls
+
+- **A competing asset rule for the same `test`.** Remove it - the loader emits the files itself.
+- **An image extension covered by nothing.** Unlike Vite, webpack and Rspack have no built-in handling for `.jpg`; every extension needs either the loader or an asset rule.
+- **Keep `.svg` out of the `test`.** Svg is never resized or converted, and a raster-only `format` drops it silently. Give it an `asset/resource` rule, or whatever svg handling the project already has.
+- **No catch-all rule.** An image matched by no rule produces an empty module - default export `''`, `src` is `null`, `srcSet` is `[]` - and the page silently renders nothing. Keep a rule without `match` last.
+- **A custom `name` without a hash or `[sourceext]`.** Converted variants of same-named siblings then overwrite each other in the output.
diff --git a/website/src/content/docs/integrations/vite-plugin.mdx b/website/src/content/docs/integrations/vite-plugin.mdx
new file mode 100644
index 0000000..d27382e
--- /dev/null
+++ b/website/src/content/docs/integrations/vite-plugin.mdx
@@ -0,0 +1,190 @@
+---
+title: Vite plugin
+description: Setup and option reference for @srcset/vite-plugin - image imports processed by default, disk cache in the Vite cache directory, and variants served from it in development.
+sidebar:
+ order: 1
+---
+
+import { Tabs, TabItem, Aside } from '@astrojs/starlight/components'
+
+`@srcset/vite-plugin` takes over image imports and turns each of them into a [module carrying every generated variant](/getting-started/image-modules/).
+
+It runs with `enforce: 'pre'`, so it claims the imports before the Vite asset pipeline sees them. Everything the plugin does not claim is left to Vite untouched.
+
+## Install
+
+
+
+ ```sh frame="none"
+ pnpm add -D @srcset/vite-plugin
+ pnpm add @srcset/runtime
+ ```
+
+
+ ```sh frame="none"
+ yarn add -D @srcset/vite-plugin
+ yarn add @srcset/runtime
+ ```
+
+
+ ```sh frame="none"
+ npm i -D @srcset/vite-plugin
+ npm i @srcset/runtime
+ ```
+
+
+
+`@srcset/runtime` is a peer dependency - it carries the `SrcSetEntry` type and the helpers that turn variants into DOM attributes. It ships to the browser, so it goes into the regular dependencies while the plugin stays a dev one. Vite 5 or newer is the other peer.
+
+## Usage
+
+```js title="vite.config.js"
+import { defineConfig } from 'vite'
+import { srcset } from '@srcset/vite-plugin'
+
+export default defineConfig({
+ plugins: [
+ srcset({
+ rules: [
+ // Png keeps its format for the transparency, plus a webp twin.
+ {
+ match: '**/*.png',
+ width: [1, 0.5],
+ format: ['png', 'webp']
+ },
+ // Everything else: jpg for the reach, webp and avif for the size.
+ {
+ width: [1, 0.5],
+ format: ['jpg', 'webp', 'avif']
+ }
+ ],
+ placeholder: true
+ })
+ ]
+})
+```
+
+```ts
+import url, { src, srcSet, srcMap, placeholder } from './photo.jpg'
+```
+
+The rule model - matching, widths, formats, encoding options - is the same for every build-time integration and is documented on the [Rules](/getting-started/rules/) page. What the import gives you back is on the [Image modules](/getting-started/image-modules/) page.
+
+Without `rules` the plugin falls back to a single empty rule: every image is re-encoded once, at its own width and in its own format. That is a useful smoke test, but it generates no responsive variants.
+
+## What gets processed
+
+By default the plugin claims imports whose id ends with a raster image extension, with or without a query:
+
+- `.jpg`, `.jpeg`, `.png`, `.webp`, `.avif`, `.gif`
+
+`.svg` is not in that list, so svg imports stay in the Vite asset pipeline. Svg is never resized or converted anyway, so there is nothing to generate for it.
+
+Two more groups are skipped whatever `include` and `exclude` say:
+
+- **Native Vite queries** - `?url`, `?raw`, `?inline`, `?no-inline`, `?worker`, `?sharedworker`, `?init`. `import iconUrl from './icon.png?url'` still returns a plain url string.
+- **Virtual modules** - ids of other plugins, which start with a null byte.
+
+Assets in `publicDir` are also left alone: a root-absolute import that does not exist on disk but does exist under the public directory goes back to Vite.
+
+## `include` and `exclude`
+
+Both take a picomatch glob, a regexp, or an array of them; string patterns are matched against the **absolute module id**, query included.
+
+```js title="vite.config.js"
+srcset({
+ // Only the images of this directory, and none of the icons.
+ include: ['**/src/images/**/*.{jpg,jpeg,png}'],
+ exclude: [/\/node_modules\//, '**/src/icons/**']
+})
+```
+
+
+
+## Options
+
+Plugin options, all optional:
+
+| Option | Type | Default | Description |
+| --- | --- | --- | --- |
+| `rules` | `SrcSetRule[]` | one empty rule | Rules to generate the variants. A [rule in the import query](/getting-started/image-modules/) replaces them for that import. |
+| `placeholder` | `boolean \| { width, format }` | off | Adds the `placeholder` export - a tiny variant inlined as a data-url. Defaults to 16px wide webp; `format` is `'webp'` or `'jpg'`. |
+| `select` | `{ id?, format?, width? }` | the source format at the source width | Which variant the default export and `src` point at. `width` may be an absolute value or a multiplier less than or equal to 1. The import query takes precedence. |
+| `resourceId` | `(width, requestedWidth, format) => string` | `` `${format}${width}` `` | Formatter of the `srcMap` keys and of `src.id`. |
+| `cache` | `boolean \| { dir, maxAge }` | `true` | Disk cache of the generated variants - see [Caching](#caching). |
+| `include` | `string \| RegExp \| (string \| RegExp)[]` | the image extensions above | Ids to process. |
+| `exclude` | `string \| RegExp \| (string \| RegExp)[]` | `/\/node_modules\//` | Ids to skip. |
+
+The generator options below are inherited from the shared generation core. Set them on the plugin as the defaults for every image; all of them except `concurrency` can also be set per rule, where they override the plugin-level value:
+
+| Option | Type | Default | Description |
+| --- | --- | --- | --- |
+| `processing` | `{ jpg?, png?, webp?, avif?, gif? }` | `{ jpg: { mozjpeg: true }, png: { palette: true } }` | [Sharp output options](https://sharp.pixelplumbing.com/api-output/) per format. Merged per format, so overriding one option keeps the rest of the defaults. |
+| `optimization` | `{ jpg?, png?, webp?, avif?, gif?, svg? }` | none | Custom optimizer function per format, `(contents, format) => Buffer`, applied to the encoded contents. The only way to touch svg, e.g. with `svgo`. |
+| `skipOptimization` | `boolean` | `false` | Do not re-encode the original variant and skip the custom optimizers. |
+| `scalingUp` | `boolean` | `true` | Keep variants requested wider than the source, capped to the source width. `false` drops them instead. Pixels are never upscaled either way. |
+| `postfix` | `string \| (width, requestedWidth, format) => string` | `@w`, empty for the `1` multiplier | Postfix added to the variant file name. A formatter must be pure - it also participates in the cache addressing. |
+| `concurrency` | `number` | `availableParallelism()` | How many variants are encoded in parallel. Plugin level only. |
+
+## Caching
+
+The cache is **on by default** and lives in `srcset/` inside the Vite cache directory - `node_modules/.vite/srcset` in a default setup. A cached variant is read from disk instead of being encoded again, so a repeated build only pays for the images that changed.
+
+```js title="vite.config.js"
+srcset({
+ cache: {
+ dir: '.cache/srcset',
+ maxAge: 7 * 24 * 60 * 60 * 1000
+ }
+})
+```
+
+- `dir` - where to store the variants and their manifests.
+- `maxAge` - how long an unused entry survives, in milliseconds. Defaults to 30 days. Stale entries are pruned after the bundle is written, never before it: pruning first would drop the entries the build is about to hit.
+
+The address of an entry covers the source contents, the variant and every generation option, function options included - they are keyed by their source text. Changing a rule, a sharp option or an optimizer function therefore misses the cache instead of serving a stale file.
+
+
+
+## TypeScript
+
+The plugin ships ambient declarations for the image imports. Reference them once, in a `.d.ts` of the project or through the tsconfig `types` array:
+
+```ts title="src/vite-env.d.ts"
+///
+///
+```
+
+The srcset declarations cover only the named exports - `src`, `srcSet`, `srcMap`, `placeholder`. The default url export comes from the `vite/client` asset types, which `@srcset/vite-plugin/client` references itself, so the default import stays typed either way - **keep the project's own `vite/client` reference** for the rest of the Vite types. A missing srcset reference shows up as `Module '"*.jpg"' has no exported member 'srcSet'`.
+
+## Import query
+
+The query of a single import overrides the configured options for that import only:
+
+```ts
+import wide from './photo.jpg?{"width":[1,0.5],"format":["webp","jpg"]}'
+import small from './photo.jpg?format=webp&width=600'
+```
+
+A JSON rule replaces the whole rule set; `id=`, `format=` and `width=` pick the variant behind the default export; `placeholder` and `placeholder=false` switch that export on and off. Parts combine with `&`. The full syntax is on the [Image modules](/getting-started/image-modules/) page.
+
+## Pitfalls
+
+- **No catch-all rule.** An image matched by no rule produces an empty module - default export `''`, `src` is `null`, `srcSet` is `[]` - and the page silently renders nothing. Keep a rule without `match` last.
+- **`include` is a replacement, not an addition.** See the warning above.
+- **A missing `@srcset/vite-plugin/client` reference.** The image import then carries the default url export from `vite/client` and nothing else, and every named import fails to type-check.
+- **Encoding is not free.** The first build of an image-heavy project spends real time in sharp, and every build after it reads the variants back from the cache. On CI that cache sits in `node_modules/.vite`, so it survives only if the workflow restores that directory.
diff --git a/website/src/content/docs/proxies/cloudflare.mdx b/website/src/content/docs/proxies/cloudflare.mdx
new file mode 100644
index 0000000..61c9634
--- /dev/null
+++ b/website/src/content/docs/proxies/cloudflare.mdx
@@ -0,0 +1,196 @@
+---
+title: Cloudflare
+description: "@srcset/cloudflare: building image transformation urls on a Cloudflare zone - zone setup, forceable formats, format=auto and passthrough."
+sidebar:
+ order: 3
+---
+
+import { Tabs, TabItem, Aside, Steps } from '@astrojs/starlight/components'
+
+[Cloudflare image transformations](https://developers.cloudflare.com/images/transform-images/) resize and convert images at the edge, driven by a url on the zone: `/cdn-cgi/image//`. There is nothing to deploy - the zone in front of the site already serves them - and nothing to sign. `@srcset/cloudflare` builds those urls and returns the [same srcset object](/proxies/) the bundler integrations produce.
+
+## Install
+
+`@srcset/runtime` is a peer dependency: it carries the `SrcSetEntry` type and the helpers that turn variants into DOM attributes. Both packages run in the browser, so both are regular dependencies rather than dev ones.
+
+
+
+ ```sh frame="none"
+ pnpm add @srcset/cloudflare @srcset/runtime
+ ```
+
+
+ ```sh frame="none"
+ yarn add @srcset/cloudflare @srcset/runtime
+ ```
+
+
+ ```sh frame="none"
+ npm i @srcset/cloudflare @srcset/runtime
+ ```
+
+
+
+## Usage
+
+On a zone the builder needs no options at all:
+
+```ts title="cloudflare.ts"
+import { Cloudflare } from '@srcset/cloudflare'
+
+export const cloudflare = new Cloudflare()
+```
+
+```ts
+import { cloudflare } from './cloudflare.ts'
+
+const { url, src, srcSet, srcMap } = cloudflare.image(photo.url, {
+ width: [600, 1200],
+ format: ['jpg', 'webp']
+})
+
+srcMap.webp600 // /cdn-cgi/image/width=600,format=webp/https://cdn.example.com/photo.jpg
+```
+
+Four variants come back, with `src` pointing at `jpg1200` - the source format at the largest width. See [Image proxies](/proxies/) for the object's fields, how to render it, and the rule semantics both adapters share.
+
+## Options
+
+| Option | Description |
+| --- | --- |
+| `endpoint` | Transformations endpoint: an absolute url, or a path on the zone serving the site. Defaults to `/cdn-cgi/image`. A trailing slash is trimmed. |
+| `processing` | Builder of the transformation options segment. Defaults to `width={width},format={format}`. |
+| `quality` | Quality for the default processing builder: adds `,quality={quality}` to the segment. |
+| `passthrough` | Return the source urls untouched instead of building transformation urls. |
+
+The rule passed to `image(sourceUrl, rule)`:
+
+| Field | Description |
+| --- | --- |
+| `width` | Absolute output width(s) in pixels. Integers greater than 1 - a multiplier throws. |
+| `format` | Output format(s). Defaults to the source url file extension, which is also the `src` fallback. |
+
+## How the url is built
+
+```
+{endpoint}/{options}/{source url}
+```
+
+An absolute source url is appended as it is, query string included:
+
+```
+/cdn-cgi/image/width=600,format=webp/https://cdn.example.com/photo.jpg
+```
+
+A source that is a path on the zone loses its leading slash, so that the two do not collide into a double slash:
+
+```ts
+cloudflare.image('/assets/photo.jpg', { width: 600 })
+// /cdn-cgi/image/width=600,format=jpeg/assets/photo.jpg
+```
+
+The default options segment is `width={width},format={format}`, plus `,quality={quality}` when the `quality` option is set. Note the format spelling: the `jpg` of the srcset rule becomes Cloudflare's `format=jpeg`.
+
+## Output formats
+
+Cloudflare can force **jpeg, webp and avif**, and that is the whole list. The adapter validates the rule against it rather than letting the zone return something unexpected:
+
+```ts
+cloudflare.image('https://cdn.example.com/photo.jpg', {
+ width: 600,
+ format: 'png'
+})
+// TypeError: Cloudflare can not force the png output format.
+```
+
+A non-forceable format is still valid when it *is* the source format - then the variant is a plain resize and the url carries no `format` option at all, leaving the output format to Cloudflare:
+
+```ts
+cloudflare.image('https://cdn.example.com/logo.png', {
+ width: 600,
+ format: ['webp', 'png']
+})
+// srcMap.webp600 -> /cdn-cgi/image/width=600,format=webp/https://cdn.example.com/logo.png
+// srcMap.png600 -> /cdn-cgi/image/width=600/https://cdn.example.com/logo.png
+```
+
+Without `format` the output format is read from the **source url extension**: only the path is inspected, so a query string never confuses it, `.jpeg` normalizes to `jpg`, and an unrecognized or missing extension falls back to `jpg`.
+
+An **svg source passes through untouched**, whatever the rule says: Cloudflare returns svg as it is, so building transformation urls for it would only add a hop. `url` and `src` carry the original url, `srcSet` and `srcMap` come back empty, and `src.format` stays `svg` - the markup degrades to a plain ``, which is what a vector file wants anyway.
+
+## Format negotiation
+
+Instead of generating a variant per format, Cloudflare can pick the format itself from the request's `Accept` header. That is a `processing` hook away:
+
+```ts
+export const cloudflare = new Cloudflare({
+ processing: ({ width }) => `width=${width},format=auto`
+})
+```
+
+```ts
+cloudflare.image(photo.url, { width: [600, 1200] })
+// /cdn-cgi/image/width=600,format=auto/https://cdn.example.com/photo.jpg
+// /cdn-cgi/image/width=1200,format=auto/https://cdn.example.com/photo.jpg
+```
+
+Half the urls, half the transformations, and browsers still get webp or avif where they support it. The trade is control: the negotiation happens per request, and the response format is invisible to the markup.
+
+
+
+The hook returns the whole options segment, so any [transformation option](https://developers.cloudflare.com/images/transform-images/transform-via-url/#options) works the same way - `fit`, `gravity`, `sharpen`, `background`. With a hook in place the `quality` option is ignored: it feeds the default builder only.
+
+## Zone setup
+
+This is the part that breaks first, and none of it lives in the code.
+
+
+
+1. **Enable transformations on the zone.**
+
+ In the Cloudflare dashboard open the zone, go to **Images** and then **Transformations**, and turn them on. Until then `/cdn-cgi/image/...` is just a 404 path on the site. The urls also have to reach Cloudflare at all: the hostname serving them must be proxied, the orange cloud in DNS.
+
+2. **Allow the external origins.**
+
+ Out of the box a zone transforms only images from itself. Images on another hostname - a headless CMS, an object storage bucket, a separate asset CDN, which is exactly the case this package exists for - are refused until that hostname is listed among the zone's allowed origins in the same Transformations panel, or the zone is set to accept any origin.
+
+ The alternative is to not have an external origin: serve the images through a path on the zone, with a route or a worker in front of the storage, and hand the adapter a `/media/...` path instead of an absolute url.
+
+3. **Point the endpoint at the zone.**
+
+ The default `/cdn-cgi/image` is relative, so it resolves against whatever host serves the page. That is right when the site is on the zone, and wrong everywhere else - a preview deployment on another host, a native app, an email. Give those an absolute endpoint on the zone:
+
+ ```ts
+ export const cloudflare = new Cloudflare({
+ endpoint: 'https://example.com/cdn-cgi/image'
+ })
+ ```
+
+
+
+## Passthrough
+
+```ts
+export const cloudflare = new Cloudflare({
+ passthrough: import.meta.env.DEV
+})
+```
+
+`url` and `src` carry the untouched source url, `srcSet` and `srcMap` come back empty, and `processing` is never called - so a dev server that is not behind the zone shows the originals instead of 404s. The rule is still validated, so a bad width fails on the first render rather than after deployment. In passthrough the `src` keeps the source format, and its `width` is the largest requested one - a claim about an image nobody resized.
+
+## Widths and scale-down
+
+The default options segment sets no `fit`, so Cloudflare's own default applies: `scale-down`, which only ever shrinks. A width above the source width returns the source unchanged, while the variant keeps the requested width in its `id` and in its `w` descriptor.
+
+That descriptor is what the browser picks candidates by, so an inflated one makes it choose a small image for a large slot and scale it up. Keep the rule widths within the source width, clamping against the dimensions the CMS reports where possible - the [overview page](/proxies/#descriptors-and-upscaling) has the pattern. A `processing` hook that sets another `fit`, such as `cover` or `contain`, changes that: those do enlarge.
+
+## Pitfalls
+
+- **Only jpeg, webp and avif can be forced.** `format: 'png'` for a jpeg source throws; png and gif are valid only as the source format, and then the variant is a resize with no format conversion requested.
+- **Multiplier widths throw.** `width: [1, 0.5]` is valid in a build-time rule and invalid here: nothing knows the source size at runtime. Fractional and non-finite widths throw as well.
+- **The fallback format comes from the url extension.** `src` is the variant of the source format, or of the first format of the list when the source format is not in it - and a url with no usable extension counts as jpg.
+- **An svg source empties `srcSet`** - the whole call passes through. Code that assumes a non-empty `srcSet` needs to handle it.
+- **The source url is appended raw**, query string included. A cache-busting query that changes on every deploy makes every variant a new transformation.
+- **Every distinct url is a transformation of its own**, counted by the zone. A ladder of six widths across three formats is eighteen of them per image; keep the ladder as short as the layout allows.
diff --git a/website/src/content/docs/proxies/imgproxy.mdx b/website/src/content/docs/proxies/imgproxy.mdx
new file mode 100644
index 0000000..790909c
--- /dev/null
+++ b/website/src/content/docs/proxies/imgproxy.mdx
@@ -0,0 +1,231 @@
+---
+title: imgproxy
+description: "@srcset/imgproxy: building variant urls for an imgproxy instance - presets, signing, passthrough and the EXIF and upscaling rules."
+sidebar:
+ order: 2
+---
+
+import { Tabs, TabItem, Aside } from '@astrojs/starlight/components'
+
+[imgproxy](https://imgproxy.net/) is a self-hosted image server: it takes a url describing what to do and the source image to do it to, fetches the source, and returns the processed image. `@srcset/imgproxy` is the url builder for it - it turns a content image and a rule into the [same srcset object](/proxies/) the bundler integrations produce.
+
+The package builds strings and nothing else, so it runs anywhere: a server render, a route handler, the browser. Only the signing entry point is Node-only.
+
+## Install
+
+`@srcset/runtime` is a peer dependency: it carries the `SrcSetEntry` type and the helpers that turn variants into DOM attributes. Both packages run in the browser, so both are regular dependencies rather than dev ones.
+
+
+
+ ```sh frame="none"
+ pnpm add @srcset/imgproxy @srcset/runtime
+ ```
+
+
+ ```sh frame="none"
+ yarn add @srcset/imgproxy @srcset/runtime
+ ```
+
+
+ ```sh frame="none"
+ npm i @srcset/imgproxy @srcset/runtime
+ ```
+
+
+
+## Usage
+
+Create the builder once and export it - it is stateless, so one instance serves the whole app:
+
+```ts title="imgproxy.ts"
+import { Imgproxy } from '@srcset/imgproxy'
+
+export const imgproxy = new Imgproxy({
+ endpoint: 'https://imgproxy.example.com'
+})
+```
+
+Then build an image per render:
+
+```ts
+import { imgproxy } from './imgproxy.ts'
+
+const { url, src, srcSet, srcMap } = imgproxy.image(photo.url, {
+ width: [600, 1200],
+ format: ['jpg', 'webp']
+})
+```
+
+Four variants come back - two widths in each of the two formats - with `src` pointing at `jpg1200`, the source format at the largest width:
+
+```ts
+srcMap.webp600 // https://imgproxy.example.com/insecure/w:600/f:webp/aHR0cHM6Ly9jZG4uZXhhbXBsZS5jb20vcGhvdG8uanBn
+```
+
+See [Image proxies](/proxies/) for the object's fields and how to render it, and for the rule semantics the two adapters share.
+
+## Options
+
+| Option | Description |
+| --- | --- |
+| `endpoint` | imgproxy endpoint url. Required. A trailing slash is trimmed. |
+| `processing` | Builder of the processing path segment. Defaults to `w:{width}/f:{format}`. |
+| `quality` | Quality for the default processing builder: adds `q:{quality}` to the segment. |
+| `signer` | Url path signer, e.g. from [`sign`](#signing). Without one the urls carry the `insecure` signature. |
+| `passthrough` | Return the source urls untouched instead of building imgproxy urls. |
+
+The rule passed to `image(sourceUrl, rule)`:
+
+| Field | Description |
+| --- | --- |
+| `width` | Absolute output width(s) in pixels. Integers greater than 1 - a multiplier throws. |
+| `format` | Output format(s). Defaults to the source url file extension, which is also the `src` fallback. |
+
+## How the url is built
+
+```
+{endpoint}/{signature}/{processing}/{base64url source url}
+```
+
+```
+https://imgproxy.example.com/insecure/w:600/f:webp/aHR0cHM6Ly9jZG4uZXhhbXBsZS5jb20vcGhvdG8uanBn
+```
+
+- **Signature** - the output of `signer`, or the literal `insecure` when there is none.
+- **Processing** - whatever `processing` returned for this variant. The default builder writes `w:{width}/f:{format}`, plus `/q:{quality}` when the `quality` option is set. Options are separated by slashes, so a builder can return several of them.
+- **Source url** - always base64url-encoded: the plain form would need escaping for query strings, `%` and `@` signs and non-ascii characters, and the encoded form has none of those problems. Multi-byte characters survive it - `https://cms.example.com/медиа/фото.jpg` encodes and decodes intact.
+
+The endpoint may be a bare origin or an origin with a path prefix; the builder only trims a trailing slash before joining.
+
+## Output formats
+
+The rule's `format` names go into `f:` as they are, so imgproxy has to be able to save them: `jpg`, `png`, `webp`, `avif`, `gif`.
+
+Without `format`, the output format is read from the **source url extension**: only the path is inspected, so a query string never confuses it, `.jpeg` normalizes to `jpg`, and an unrecognized or missing extension falls back to `jpg`.
+
+Svg is the exception in both directions. A `.svg` source has no raster output format to keep, so the default becomes `jpg` - imgproxy rasterizes it. And `svg` requested as an output format is skipped, because a photo cannot be converted into vector: `format: ['webp', 'svg']` silently builds the webp variants only, and `format: 'svg'` builds nothing and throws.
+
+## Presets
+
+`processing` replaces the default segment builder. Its main use is imgproxy [presets](https://docs.imgproxy.net/usage/presets): named sets of options configured on the server, referenced from the url by name.
+
+```ts
+const imgproxy = new Imgproxy({
+ endpoint: 'https://imgproxy.example.com',
+ processing: ({ format, width }) => `pr:card_${format}_${width}`
+})
+```
+
+```
+https://imgproxy.example.com/insecure/pr:card_webp_600/aHR0cHM6Ly9jZG4uZXhhbXBsZS5jb20vcGhvdG8uanBn
+```
+
+The url now says which preset to apply and nothing about how. The sharpening, the gravity, the background for transparent sources, the quality per format - all of that lives in the imgproxy configuration, and changing it does not require a redeploy of the front end. It also removes the option grammar from the public url, which is what makes [browser-built urls](#building-urls-in-the-browser) safe without a signature.
+
+The hook is not limited to presets - it returns the whole segment, so any imgproxy option grammar works:
+
+```ts
+const imgproxy = new Imgproxy({
+ endpoint: 'https://imgproxy.example.com',
+ processing: ({ format, width }) => `rs:fill:${width}:${Math.round(width * 9 / 16)}/g:sm/f:${format}`
+})
+```
+
+
+
+## Signing
+
+When imgproxy runs with a key and a salt configured, it accepts only signed urls. `@srcset/imgproxy/sign` builds the signer:
+
+```ts title="imgproxy.ts"
+import { Imgproxy } from '@srcset/imgproxy'
+import { sign } from '@srcset/imgproxy/sign'
+
+const {
+ IMGPROXY_KEY,
+ IMGPROXY_SALT
+} = process.env
+
+if (!IMGPROXY_KEY || !IMGPROXY_SALT) {
+ throw new Error('imgproxy key and salt are not configured')
+}
+
+export const imgproxy = new Imgproxy({
+ endpoint: 'https://imgproxy.example.com',
+ signer: sign({
+ key: IMGPROXY_KEY,
+ salt: IMGPROXY_SALT
+ })
+})
+```
+
+The signature is the HMAC-SHA256 of the salt followed by the url path - everything from the slash after the signature to the end - encoded as base64url, exactly what imgproxy expects. The key and the salt are hex strings, as imgproxy takes them; anything that is not a non-empty hex string throws instead of being silently truncated to a weaker key.
+
+
+
+Without a `signer` every url carries the literal `insecure` where the signature goes. imgproxy checks signatures only when `IMGPROXY_KEY` and `IMGPROXY_SALT` are both set: with neither of them that position may hold any string and the url is accepted, with them an unsigned url is rejected.
+
+## Building urls in the browser
+
+Signing needs a secret and a secret cannot ship to the client, so a url built in the browser is always unsigned. That is not unsafe in itself - it is unsafe while the url is a free-form instruction to the server. Take the instruction away and there is nothing left to forge, which is the answer for a static site or an spa with no bff to sign on.
+
+**Presets-only mode.** [`IMGPROXY_ONLY_PRESETS=true`](https://docs.imgproxy.net/configuration/options#IMGPROXY_ONLY_PRESETS) makes imgproxy accept preset names as the processing options and nothing else; the widths, formats and qualities live in `IMGPROXY_PRESETS` on the server. A url can then ask for one of your presets, and not for a fifty megapixel avif at quality 100 in a loop:
+
+```ts
+export const imgproxy = new Imgproxy({
+ endpoint: 'https://imgproxy.example.com',
+ processing: ({ format, width }) => `pr:card_${format}_${width}`
+})
+```
+
+The rule is still a cross product, so every format and width pair of the ladder needs a preset of its own - presets-only mode leaves no room for a `w:` next to the `pr:`.
+
+**A source whitelist.** [`IMGPROXY_ALLOWED_SOURCES`](https://docs.imgproxy.net/configuration/options#IMGPROXY_ALLOWED_SOURCES) is a comma-separated list of allowed source url prefixes, `*` accepted as a wildcard. Set it to your own cdn and the instance stops being an open resizer for the whole internet - bandwidth you pay for, on content you did not choose to serve.
+
+**Ceilings on one request.** [`IMGPROXY_MAX_SRC_RESOLUTION`](https://docs.imgproxy.net/configuration/options#IMGPROXY_MAX_SRC_RESOLUTION) (megapixels, 50 by default) and [`IMGPROXY_MAX_SRC_FILE_SIZE`](https://docs.imgproxy.net/configuration/options#IMGPROXY_MAX_SRC_FILE_SIZE) (bytes, unlimited by default) bound the work for a source that did pass the whitelist.
+
+The three together leave exactly your images by your presets: a finite set of urls, every one of them cacheable, so a cdn in front of the instance absorbs a flood instead of the encoder doing the same work again. That is the property signing buys - a bounded set of accepted urls - reached through configuration instead of a secret.
+
+They are not equivalent. A signature proves your server minted that exact url, so the valid set is precisely what you built; presets-only mode allows any of your presets over any allowed source, which is a larger set. Sign wherever there is a server render or a route handler to sign in, and use this where there is not.
+
+## Passthrough
+
+```ts
+export const imgproxy = new Imgproxy({
+ endpoint: 'https://imgproxy.example.com',
+ passthrough: import.meta.env.DEV
+})
+```
+
+`url` and `src` carry the untouched source url, `srcSet` and `srcMap` come back empty, and neither `processing` nor `signer` is called - so a development build needs no instance running and no keys in the environment. The rule is still validated, so a bad width fails on the first render rather than after deployment.
+
+One detail worth knowing: in passthrough the `src` keeps the *source* format, svg included, since the url is the original file. Its `width` is still the largest requested one, which is now a claim about an image nobody resized.
+
+## EXIF orientation
+
+imgproxy auto-rotates by the EXIF `Orientation` tag before doing anything else - it does that by default, and nothing in this package asks for anything else. Phone cameras use the tag constantly: a portrait shot is stored as a landscape pixel buffer plus "rotate 90°", and the browser applies the tag when it renders the file directly.
+
+Two consequences for the rules here:
+
+- **The widths apply to the rotated image.** For a 4000x3000 buffer tagged as rotated, imgproxy resizes a 3000x4000 image, and `width: 1200` gives a 1200x1600 portrait variant. Check the ladder against the orientation the visitor sees, not against the dimensions stored in the file.
+- **The upscaling limit follows the rotated width too.** A 4000px buffer that is really 3000px wide once rotated tops out at 3000, not 4000 - see below.
+
+The variants come back without the metadata - imgproxy strips it unless the instance is configured to keep it - which is the right outcome: the pixels are already rotated, so a browser must not rotate them a second time. It also means nothing downstream can undo a wrong assumption - if a CMS reports the stored dimensions rather than the displayed ones, swap them when the orientation tag says the image is rotated.
+
+## Widths and enlarging
+
+imgproxy's `enlarge` option is off unless the url asks for it, and neither the default builder nor anything else in this package sets it. A width above the source width therefore returns the source unchanged - while the variant keeps the requested width in its `id` and in its `w` descriptor.
+
+That descriptor is what the browser picks candidates by, so an inflated one makes it choose a small image for a large slot and scale it up. Keep the rule widths within the source width, clamping against the dimensions the CMS reports where possible - the [overview page](/proxies/#descriptors-and-upscaling) has the pattern.
+
+## Pitfalls
+
+- **Multiplier widths throw.** `width: [1, 0.5]` is valid in a build-time rule and invalid here: nothing knows the source size at runtime. Fractional and non-finite widths throw as well.
+- **The fallback format comes from the url extension.** `src` is the variant of the source format, or of the first format of the list when the source format is not in it - and a url with no usable extension counts as jpg.
+- **`svg` as an output format is dropped without a word**, and a rule whose formats are all svg throws `No image variants`.
+- **A `processing` hook disables the `quality` option** - it builds the whole segment itself.
+- **imgproxy must be able to reach the source url.** The adapter encodes whatever url it is given; a CMS behind auth, or a host outside the instance's allowed sources, fails at the proxy, not here.
diff --git a/website/src/content/docs/proxies/index.mdx b/website/src/content/docs/proxies/index.mdx
new file mode 100644
index 0000000..e2e4302
--- /dev/null
+++ b/website/src/content/docs/proxies/index.mdx
@@ -0,0 +1,190 @@
+---
+title: Introduction
+description: Runtime adapters that build srcset variant urls for images the build never sees - the shared object shape, absolute widths and the upscaling rule.
+sidebar:
+ order: 1
+---
+
+import { Aside, LinkCard, CardGrid } from '@astrojs/starlight/components'
+
+The bundler integrations and the cli are build-time tools: they need the image files in the project, open them with [sharp](https://sharp.pixelplumbing.com/) and write the variants next to the bundle. Images that arrive at runtime - from an API, a CMS, a user upload - never reach that build, so there is nothing to generate.
+
+The proxy adapters cover that case. They generate no pixels at all: they build the urls of an image server that resizes and converts on request, and return them in the same object the integrations produce.
+
+- No sharp, no build step - the adapter is a url builder and nothing else.
+- Isomorphic: the same call runs in a server render and in the browser.
+- A regular dependency, not a dev one - the code ships to production.
+
+
+
+
+
+
+A project usually needs both kinds of package: a [bundler integration](/getting-started/) for the images it ships - logos, illustrations, screenshots - and an adapter for the content images it does not own.
+
+The rest of this page is the same for both adapters, and uses `@srcset/imgproxy` in the examples. The install command, the constructor options and the service-specific details are on the page of each.
+
+## The object it returns
+
+Create the adapter once, in a module of its own, and call `image(sourceUrl, rule)` per image:
+
+```ts title="imgproxy.ts"
+import { Imgproxy } from '@srcset/imgproxy'
+
+export const imgproxy = new Imgproxy({
+ endpoint: 'https://imgproxy.example.com'
+})
+```
+
+```ts
+const image = imgproxy.image(photo.url, {
+ width: [600, 1200],
+ format: ['webp', 'jpg']
+})
+```
+
+| Field | What it is |
+| --- | --- |
+| `url` | Url of the `src` variant - the equivalent of the image module's default export |
+| `src` | The fallback variant: `{ id, format, type, width, url }` |
+| `srcSet` | Every built variant, as an array |
+| `srcMap` | Id-to-url map, e.g. `srcMap.webp600` |
+
+That is the shape an image import gives you with the [Vite plugin](/integrations/vite-plugin/) or the [loader](/integrations/loader/), so everything downstream accepts it as is. With the [components](/components/):
+
+```tsx
+import { Picture, Image } from '@srcset/react'
+import { imgproxy } from './imgproxy.ts'
+
+interface PhotoProps {
+ photo: {
+ url: string
+ alt: string
+ }
+}
+
+export function Photo({ photo }: PhotoProps) {
+ const { src, srcSet } = imgproxy.image(photo.url, {
+ width: [600, 1200],
+ format: ['webp', 'jpg']
+ })
+ const sizes = '(min-width: 768px) 50vw, 100vw'
+
+ return (
+
+
+
+ )
+}
+```
+
+Or without them, with the [runtime helpers](/api/runtime/):
+
+```ts
+import { getImageProps, getSourceProps } from '@srcset/runtime'
+
+const { src, srcSet } = imgproxy.image(photo.url, {
+ width: [600, 1200],
+ format: ['webp', 'jpg']
+})
+const imageProps = getImageProps(src, srcSet)
+const sources = getSourceProps(srcSet)
+```
+
+Two things from the build-time module have no counterpart here. There is no `placeholder`: building one means decoding the image, which is exactly what the adapter does not do - render a solid color or a CMS-provided blur hash instead. And the variants carry no `height`, because the source aspect ratio is unknown, so the `Image` component fills in only the intrinsic `width`. If the CMS reports the dimensions, pass `width` and `height` yourself - as a pair, because the component fills the intrinsic size only while neither of them is set.
+
+## One rule, absolute widths
+
+A build-time rule set picks a rule by the file path, so it needs `match`, ordering and `fallthrough`. Here you already know which image you are rendering, so `image()` takes exactly one rule with two fields.
+
+| Field | Description |
+| --- | --- |
+| `width` | Absolute output width(s) in pixels: a number or an array of numbers |
+| `format` | Output format(s): a format or an array. Defaults to the source url file extension |
+
+The variants are the cross product: formats in the given order, widths inside them. `[600, 1200]` by `['webp', 'jpg']` is four variants, and duplicates in either list are collapsed.
+
+**Widths are absolute integers greater than 1.** In the build-time rules a `width` of `0.5` is a multiplier of the source width; the source size is unknown on the client, so there is nothing to multiply and the adapter throws instead of guessing:
+
+```ts
+imgproxy.image(photo.url, { width: [1, 0.5] })
+// TypeError: The imgproxy image builder needs absolute integer widths in the rule.
+```
+
+**The source format is the fallback.** `src`, and with it `url`, is the variant of the source format - the file extension of the url - at the largest width. Write the widely supported format first and the modern ones after it, exactly as in a [generation rule](/getting-started/rules/):
+
+```ts
+imgproxy.image('https://cdn.example.com/photo.jpg', {
+ width: [600, 1200],
+ format: ['jpg', 'webp', 'avif'] // src is jpg1200
+})
+```
+
+The first format of the list takes over when the source format is not in it, so a jpg source with `format: ['webp', 'avif']` hands out the webp. That is the same rule a build-time module follows, with one difference forced by the missing source: a generation rule keeps the source *width* too, and here the source size is unknown, so the largest requested width stands in for it.
+
+
+
+A rule with no `width` builds nothing, and a call that produced no variants at all throws a `TypeError` - the message asks for a `width` and a non-svg `format`.
+
+## Descriptors and upscaling
+
+Neither proxy enlarges an image: imgproxy leaves `enlarge` off unless you ask for it, and Cloudflare's default `fit=scale-down` only ever shrinks. Ask for a width above the source width and you get the source back, unresized.
+
+The variant, however, keeps the width you asked for - it is the `id`, and it is the `w` descriptor in the rendered `srcset`:
+
+```html
+
+```
+
+If the source is 1200px wide, that first candidate is a 1200px image advertised as 2400w. The browser trusts descriptors: on a 2x display with a 1200px slot it needs 2400px of detail, so it picks the candidate that lies and then displays a 1200px image where it had decided 2400px were required - having downloaded exactly the bytes the honest 1200w candidate would have given it. The wide variant is never a win, only a chance to be wrong.
+
+So keep the rule widths within the source width. When the CMS reports the original dimensions, clamp against them:
+
+```ts
+const widths = [400, 800, 1600].filter(width => width <= photo.width)
+
+const image = imgproxy.image(photo.url, {
+ width: widths.length ? widths : [photo.width],
+ format: ['webp', 'jpg']
+})
+```
+
+The fallback keeps the call valid for a source smaller than every step. When the dimensions are not available, pick a ladder the smallest image in the library can still fill.
+
+## Passthrough
+
+Both adapters take `passthrough`, and both do the same thing with it: `url` and `src` carry the untouched source url, and `srcSet` and `srcMap` come back empty, so the markup degrades to a plain `` with no `` elements.
+
+```ts
+const imgproxy = new Imgproxy({
+ endpoint: 'https://imgproxy.example.com',
+ passthrough: import.meta.env.DEV
+})
+```
+
+That is the local development mode: no imgproxy instance running, no Cloudflare zone in front of the dev server. The rule is still validated - a multiplier width throws in passthrough too - so a broken rule does not wait until deployment to show up.
+
+## Choosing between them
+
+| | `@srcset/imgproxy` | `@srcset/cloudflare` |
+| --- | --- | --- |
+| Needs | A running [imgproxy](https://imgproxy.net/) instance | A Cloudflare zone with transformations enabled |
+| `endpoint` | Required, absolute | `/cdn-cgi/image`, relative to the zone |
+| Source url | Base64url-encoded into the path | Appended to the path as it is |
+| Signing | Optional, `sign()` on the server; `insecure` without it | None |
+| Forceable formats | Anything imgproxy can save; `svg` variants are skipped | Only jpeg, webp and avif; the source format passes through unconverted |
+| Svg source | Rasterized - `jpg` unless the rule names a format | Passes through untouched |
+| Upscaling | No, `enlarge` is off | No, `fit=scale-down` |
+| Custom transformations | `processing` builds the whole path segment, so presets work | `processing` builds the whole option segment, `format=auto` included |
+
+The deciding question is usually infrastructure, not features: a site already behind Cloudflare gets transformations without deploying anything, while imgproxy is the answer when the images must not leave your own infrastructure, or when you want the transformations hidden behind server-side presets.
diff --git a/website/src/env.d.ts b/website/src/env.d.ts
new file mode 100644
index 0000000..04a08b4
--- /dev/null
+++ b/website/src/env.d.ts
@@ -0,0 +1 @@
+import '../.astro/types.d.ts'
diff --git a/website/src/styles/global.css b/website/src/styles/global.css
new file mode 100644
index 0000000..172b6ec
--- /dev/null
+++ b/website/src/styles/global.css
@@ -0,0 +1,182 @@
+:root,
+::backdrop {
+ /* Colors (dark mode) — warm charcoal "paper" base */
+ --sl-color-white: hsl(40, 12%, 95%);
+ --sl-color-gray-1: hsl(40, 10%, 90%);
+ --sl-color-gray-2: hsl(38, 8%, 78%);
+ --sl-color-gray-3: hsl(38, 6%, 62%);
+ --sl-color-gray-4: hsl(36, 6%, 42%);
+ --sl-color-gray-5: hsl(35, 6%, 28%);
+ --sl-color-gray-6: hsl(35, 6%, 19%);
+ --sl-color-black: hsl(30, 5%, 9%);
+
+ --sl-hue-orange: 41;
+ --sl-color-orange-low: hsl(var(--sl-hue-orange), 39%, 22%);
+ --sl-color-orange: hsl(var(--sl-hue-orange), 82%, 63%);
+ --sl-color-orange-high: hsl(var(--sl-hue-orange), 82%, 87%);
+ --sl-hue-green: 101;
+ --sl-color-green-low: hsl(var(--sl-hue-green), 39%, 22%);
+ --sl-color-green: hsl(var(--sl-hue-green), 82%, 63%);
+ --sl-color-green-high: hsl(var(--sl-hue-green), 82%, 80%);
+ --sl-hue-blue: 205;
+ --sl-color-blue-low: hsl(var(--sl-hue-blue), 80%, 20%);
+ --sl-color-blue: hsl(var(--sl-hue-blue), 90%, 70%);
+ --sl-color-blue-high: hsl(var(--sl-hue-blue), 90%, 90%);
+ --sl-hue-purple: 120;
+ --sl-color-purple-low: hsl(var(--sl-hue-purple), 39%, 22%);
+ --sl-color-purple: hsl(var(--sl-hue-purple), 82%, 63%);
+ --sl-color-purple-high: hsl(var(--sl-hue-purple), 82%, 89%);
+ --sl-hue-red: 339;
+ --sl-color-red-low: hsl(var(--sl-hue-red), 39%, 22%);
+ --sl-color-red: hsl(var(--sl-hue-red), 82%, 63%);
+ --sl-color-red-high: hsl(var(--sl-hue-red), 82%, 87%);
+
+ --sl-hue-accent: 43;
+ --sl-color-accent-low: hsl(var(--sl-hue-accent), 55%, 20%);
+ --sl-color-accent: hsl(var(--sl-hue-accent), 95%, 62%); /* Gold accent */
+ --sl-color-accent-high: hsl(var(--sl-hue-accent), 95%, 70%);
+
+ --sl-color-text: var(--sl-color-white);
+ /* The gold is a surface, never text: it fills the button and underlines
+ links, while the link token itself stays a readable warm grey. */
+ --sl-color-text-accent: hsl(38, 10%, 76%);
+ --sl-color-link-underline: hsl(var(--sl-hue-accent), 55%, 48%);
+ --sl-color-link-underline-hover: hsl(var(--sl-hue-accent), 95%, 68%);
+ --sl-color-button-text: hsl(38, 45%, 12%);
+ --sl-color-text-invert: var(--sl-color-black);
+ --sl-color-bg: var(--sl-color-black);
+ --sl-color-bg-nav: hsl(30, 5%, 11%);
+ --sl-color-bg-sidebar: var(--sl-color-black);
+ --sl-color-bg-inline-code: var(--sl-color-gray-6);
+ --sl-color-bg-accent: var(--sl-color-accent-high);
+ --sl-color-hairline-light: var(--sl-color-gray-6);
+ --sl-color-hairline: var(--sl-color-gray-6);
+ --sl-color-hairline-shade: var(--sl-color-gray-6);
+
+ --sl-color-backdrop-overlay: hsla(30, 6%, 10%, 0.33);
+
+ & .expressive-code .frame {
+ --code-background: var(--sl-color-bg-nav);
+ /* Retint Expressive Code's frame chrome (tab, title bar) to the warm theme
+ so the title tab blends with the code background instead of the stock
+ near-black GitHub tab. References --code-background so light mode follows. */
+ --ec-frm-edBg: var(--code-background);
+ --ec-frm-edActTabBg: var(--code-background);
+ --ec-frm-trmTtbBg: var(--code-background);
+ --ec-frm-edTabBarBg: var(--sl-color-black);
+ --ec-frm-edTabBarBrdBtmCol: var(--sl-color-gray-6);
+ --ec-frm-edActTabIndTopCol: var(--sl-color-accent);
+ box-shadow: none;
+ }
+
+ & .expressive-code pre {
+ border-color: var(--sl-color-gray-6);
+ }
+}
+
+:root[data-theme='light'],
+[data-theme='light'] ::backdrop {
+ /* Colours (light mode) — cream paper base */
+ --sl-color-white: hsl(40, 10%, 10%);
+ --sl-color-gray-1: hsl(40, 9%, 14%);
+ --sl-color-gray-2: hsl(40, 8%, 22%);
+ --sl-color-gray-3: hsl(40, 7%, 30%);
+ --sl-color-gray-4: hsl(40, 6%, 44%);
+ --sl-color-gray-5: hsl(41, 10%, 64%);
+ --sl-color-gray-6: hsl(42, 15%, 82%);
+ --sl-color-gray-7: hsl(44, 22%, 91%);
+ --sl-color-black: hsl(45, 30%, 98%);
+
+ --sl-color-orange-high: hsl(var(--sl-hue-orange), 80%, 25%);
+ --sl-color-orange: hsl(var(--sl-hue-orange), 90%, 60%);
+ --sl-color-orange-low: hsl(var(--sl-hue-orange), 90%, 88%);
+ --sl-color-green-high: hsl(var(--sl-hue-green), 80%, 22%);
+ --sl-color-green: hsl(var(--sl-hue-green), 90%, 46%);
+ --sl-color-green-low: hsl(var(--sl-hue-green), 85%, 90%);
+ --sl-color-blue-high: hsl(var(--sl-hue-blue), 80%, 30%);
+ --sl-color-blue: hsl(var(--sl-hue-blue), 80%, 60%);
+ --sl-color-blue-low: hsl(var(--sl-hue-blue), 88%, 90%);
+ --sl-color-purple-high: hsl(var(--sl-hue-purple), 90%, 30%);
+ --sl-color-purple: hsl(var(--sl-hue-purple), 90%, 60%);
+ --sl-color-purple-low: hsl(var(--sl-hue-purple), 80%, 90%);
+ --sl-color-red-high: hsl(var(--sl-hue-red), 80%, 30%);
+ --sl-color-red: hsl(var(--sl-hue-red), 90%, 60%);
+ --sl-color-red-low: hsl(var(--sl-hue-red), 80%, 90%);
+
+ --sl-color-accent-high: hsl(var(--sl-hue-accent), 95%, 44%);
+ --sl-color-accent: hsl(var(--sl-hue-accent), 97%, 56%); /* Gold accent */
+ --sl-color-accent-low: hsl(var(--sl-hue-accent), 90%, 88%);
+
+ /* The accent is a surface colour: bright gold under dark text. As text on
+ the paper it would have to drop to ~30% lightness to pass contrast, and
+ gold that dark is brown - so accented text stays ink instead. */
+ --sl-color-text-accent: var(--sl-color-text);
+ --sl-color-link-underline: hsl(38, 100%, 46%);
+ --sl-color-link-underline-hover: hsl(45, 100%, 56%);
+ --sl-color-button-text: hsl(38, 45%, 12%);
+ --sl-color-bg-nav: hsl(45, 25%, 95%);
+ --sl-color-bg-inline-code: var(--sl-color-gray-7);
+ --sl-color-bg-accent: var(--sl-color-accent);
+
+ --sl-color-backdrop-overlay: hsla(40, 10%, 36%, 0.33);
+
+ & .expressive-code .frame {
+ --code-background: var(--sl-color-black);
+ }
+}
+
+.sr-table-wrapper {
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+
+ & > table {
+ display: table;
+ width: 100%;
+ }
+}
+
+/* Option E: the gold is a surface, not a text colour. It fills the primary
+ button under dark text and underlines links, while the link text itself
+ keeps the readable graphite of --sl-color-text-accent. */
+.sl-link-button.primary {
+ background: var(--sl-color-accent);
+ border-color: var(--sl-color-accent);
+ color: var(--sl-color-button-text);
+}
+
+.sl-link-button.primary:hover {
+ color: var(--sl-color-button-text);
+}
+
+.sl-markdown-content a:not(:where(.not-content *)) {
+ /* The gold underline is the accent, so the link text stays the body text:
+ `--sl-color-text-accent` also paints the current sidebar item, and a value
+ dark enough to sit under cream there reads as dimmed grey in a paragraph. */
+ color: var(--sl-color-text);
+ text-decoration-color: var(--sl-color-link-underline);
+ text-decoration-thickness: 2px;
+ text-underline-offset: 3px;
+}
+
+/* Starlight paints the current sidebar item from the link token under
+ `--sl-color-text-invert`. The accent is a surface in this theme, so the
+ item takes the bright accent and dark text, like the primary button. */
+nav [aria-current='page'],
+nav [aria-current='page']:hover,
+nav [aria-current='page']:focus {
+ background-color: var(--sl-color-accent);
+ color: var(--sl-color-button-text);
+}
+
+/* The table of contents marks its current entry with the same token, and
+ there it is text - so it takes weight rather than colour. */
+starlight-toc a[aria-current='true'] {
+ font-weight: 600;
+}
+
+.sl-markdown-content a:not(:where(.not-content *)):hover,
+.sl-markdown-content a:not(:where(.not-content *)):focus-visible {
+ color: var(--sl-color-text);
+ text-decoration-color: var(--sl-color-link-underline-hover);
+}
diff --git a/website/tsconfig.json b/website/tsconfig.json
new file mode 100644
index 0000000..983628a
--- /dev/null
+++ b/website/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "extends": "astro/tsconfigs/strictest",
+ "compilerOptions": {
+ "skipLibCheck": true
+ },
+ "exclude": ["dist", "public"]
+}