diff --git a/.changeset/npm-cli.md b/.changeset/npm-cli.md
new file mode 100644
index 000000000..a18ee8e82
--- /dev/null
+++ b/.changeset/npm-cli.md
@@ -0,0 +1,12 @@
+---
+'@pmndrs/docs': minor
+---
+
+Publish the generator to npm, as `npx @pmndrs/docs build`.
+
+`--format website` statically exports the documentation site, as the Docker image does.
+`--format fragment` — the default — compiles MDX to plain HTML with no layout, stylesheet or
+script, either from a folder or from stdin, and needs nothing but node.
+
+`bin/build.mjs` is gone: it predated the Docker image, was never published, and built a server
+bundle rather than a static export.
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 8d9040247..54abb85ff 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -57,12 +57,17 @@ jobs:
# ██████ ██ ██ ██ ██ ██ ████ ██████ ███████ ███████ ███████ ██
#
+ # npm auth is trusted publishing (OIDC), so there is no `NPM_TOKEN` — the `id-token:
+ # write` permission above is what signs the publish. The trusted publisher declared on
+ # npmjs.com names *this* workflow file, so renaming or moving it breaks publishing with
+ # ENEEDAUTH. Setting an `NPM_TOKEN` secret would break it too: `changesets/action` then
+ # writes an `.npmrc` and skips OIDC entirely.
- name: Create Release Pull Request or Publish
id: changesets
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
uses: changesets/action@v1
with:
- publish: pnpm run release # dummy release
+ publish: pnpm run release
createGithubReleases: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.gitignore b/.gitignore
index 755c45b7b..557262a06 100644
--- a/.gitignore
+++ b/.gitignore
@@ -39,4 +39,7 @@ chromatic-archives/
*storybook.log
*archive.log
storybook-static
-src/stories
\ No newline at end of file
+src/stories
+
+# the CLI's scratch copy of the app, removed after a build unless one crashes
+.pmndrs-docs/
diff --git a/README.md b/README.md
index 93f00704d..77d7591de 100644
--- a/README.md
+++ b/README.md
@@ -7,6 +7,23 @@
# Usage
+```sh
+$ cat foo.mdx | npx @pmndrs/docs build # one HTML fragment, on stdout
+$ npx @pmndrs/docs build docs out # one .html per .mdx, assets alongside
+$ npx @pmndrs/docs build docs out --format website # the whole website, statically exported
+```
+
+`--format fragment` (the default) needs nothing but node — no Docker, no `next build`. A
+fragment is the compiled MDX and nothing else: no layout, no stylesheet, no script. Mermaid
+diagrams stay fenced blocks, and Sandpack shows its code without the editor.
+
+`build --help` lists every website option — `--libname`, `--base-path`, `--icon`, `--theme-*`… Each
+one falls back to the environment variable it maps to, the same ones
+[configuration](docs/getting-started/introduction.mdx#Configuration) documents.
+
+
+Docker
+
```sh
$ curl -sL https://raw.githubusercontent.com/pmndrs/docs/refs/heads/main/preview.sh | \
MDX="docs" \
@@ -18,6 +35,8 @@ $ curl -sL https://raw.githubusercontent.com/pmndrs/docs/refs/heads/main/preview
- you can pass any option from [configuration](docs/getting-started/introduction.mdx#Configuration)
- in `DOCKER_IMAGE`, you can specify any `:tag` value from [docs packages](https://github.com/pmndrs/docs/pkgs/container/docs) container registry
+
+
# Releasing
Every push to `main` redeploys [docs.pmnd.rs](https://docs.pmnd.rs) via [ci.yml](.github/workflows/ci.yml) — no [changeset](.changeset/) needed for that.
diff --git a/bin/build.mjs b/bin/build.mjs
deleted file mode 100755
index 18ece92aa..000000000
--- a/bin/build.mjs
+++ /dev/null
@@ -1,91 +0,0 @@
-#!/usr/bin/env node
-
-// $ node bin/build.mjs ~/code/pmndrs/react-three-fiber/docs
-
-import minimist from 'minimist'
-import { exec as execCb, spawn } from 'node:child_process'
-import { dirname, resolve } from 'node:path'
-import { fileURLToPath } from 'node:url'
-import { promisify } from 'node:util'
-const exec = promisify(execCb)
-
-console.log('argv=', process.argv)
-var argv = minimist(process.argv.slice(2))
-console.log('argv2=', argv)
-
-const help = argv.help || argv.h
-const man = `
-Usage: npm exec -y --package=@pmndrs/docs build -- MDX [ OUTDIR ] [ --libname=LIBNAME --basePath=BASE_PATH --help|-h ]
-
-Generate static, pmndrs-standardized documentation website from *.mdx folder.
-
-Example: npx @pmndrs/docs build ./docs
- npx @pmndrs/docs build ~code/pmndrs/react-three-fiber/docs --libname="React Three Fiber" --basePath="/react-three-fiber" static-out
-
-Arguments:
-
- MDX: Path to the folder containing the MDX files (absolute or relative to process.cwd())
- OUT_DIR: Path to the output directory (absolute or relative to process.cwd()), default: "out"
-
-Options:
-
- libname: Name of the library that documentation is for, eg: "React Three Fiber"
- basePath: base path for the final URL, eg: "/react-three-fiber"
- help, h: Show this help message
-`
-if (help) {
- console.log(man)
- process.exit(0)
-}
-
-const __filename = fileURLToPath(import.meta.url) // Converts the URL to a file path
-const __dirname = dirname(__filename) // Gets the directory name
-
-// Positional arguments
-const mdx = argv._[0]
-const outdir = argv._[1] || 'out'
-if (!mdx) {
- console.error('Please provide the mdx folder as the first argument.')
- console.log(man)
- process.exit(1)
-}
-
-const MDX = resolve(process.cwd(), mdx)
-const NEXT_PUBLIC_LIBNAME = argv.libname || process.env.LIBNAME
-const BASE_PATH = argv.basePath || process.env.BASE_PATH || ''
-const DIST_DIR = `out${BASE_PATH}`
-
-const outHostDirAbsolute = resolve(process.cwd(), outdir)
-const outLocalDirAbsolute = resolve(__dirname, '..', 'out')
-
-const env = {
- MDX,
- NEXT_PUBLIC_LIBNAME,
- BASE_PATH,
- DIST_DIR,
-}
-console.log('env=', env)
-
-await exec(`rm -rf ${outLocalDirAbsolute}`)
-
-const cmd = await spawn('npx', ['next', 'build'], {
- stdio: 'inherit',
- cwd: resolve(__dirname, '..'),
- env: {
- ...process.env,
- ...env,
- },
-})
-
-cmd.on('exit', async (code) => {
- if (code !== 0) {
- console.error('Build failed with error')
- process.exit(1)
- }
- console.log('Build completed successfully.')
-
- await exec(
- `mkdir -p ${outHostDirAbsolute}; cp -rf ${outLocalDirAbsolute}/* ${outHostDirAbsolute}`,
- )
- console.log(`Preview: \`npx -y serve ${outHostDirAbsolute}\``)
-})
diff --git a/bin/pmndrs-docs.mjs b/bin/pmndrs-docs.mjs
new file mode 100755
index 000000000..fca13b37a
--- /dev/null
+++ b/bin/pmndrs-docs.mjs
@@ -0,0 +1,8 @@
+#!/usr/bin/env node
+
+import { main } from '../dist/cli.mjs'
+
+main(process.argv.slice(2)).catch((error) => {
+ console.error(error instanceof Error ? error.message : error)
+ process.exit(1)
+})
diff --git a/components.json b/components.json
index f826c543e..edcaef267 100644
--- a/components.json
+++ b/components.json
@@ -4,7 +4,7 @@
"rsc": true,
"tsx": true,
"tailwind": {
- "config": "tailwind.config.ts",
+ "config": "",
"css": "src/app/globals.css",
"baseColor": "neutral",
"cssVariables": true,
diff --git a/eslint.config.mjs b/eslint.config.mjs
index 0f94de10d..cb740e345 100644
--- a/eslint.config.mjs
+++ b/eslint.config.mjs
@@ -10,6 +10,9 @@ const eslintConfig = [
'react/jsx-no-target-blank': 0,
'import/no-anonymous-default-export': 0,
'react-hooks/set-state-in-effect': 0,
+ // `next/image` buys nothing here: `images.unoptimized` is set in next.config.mjs,
+ // and the CLI renders these components outside Next, where next/image throws.
+ '@next/next/no-img-element': 0,
},
},
...storybook.configs['flat/recommended'],
diff --git a/package.json b/package.json
index c5db147f9..7078e3a7a 100644
--- a/package.json
+++ b/package.json
@@ -1,10 +1,9 @@
{
"name": "@pmndrs/docs",
- "private": true,
"version": "3.5.0",
"type": "module",
"bin": {
- "build": "bin/build.mjs"
+ "pmndrs-docs": "bin/pmndrs-docs.mjs"
},
"devDependencies": {
"@changesets/changelog-github": "^0.5.2",
@@ -15,35 +14,21 @@
"@storybook/addon-docs": "^10.2.0",
"@storybook/addon-themes": "^10.2.0",
"@storybook/nextjs-vite": "^10.2.0",
- "@tailwindcss/postcss": "^4.1.18",
- "@tailwindcss/typography": "^0.5.19",
- "@types/hast": "^3.0.4",
- "@types/lodash-es": "^4.17.12",
- "@types/minimist": "^1.2.5",
- "@types/node": "^25.0.9",
- "@types/react": "^19.0.0",
- "@types/react-dom": "^19.0.0",
- "@types/sanitize-html": "^2.16.0",
"autoprefixer": "^10.4.23",
"chromatic": "^13.3.5",
+ "esbuild": "^0.28.2",
"eslint": "^9.0.0",
"eslint-config-next": "^16.0.0",
"eslint-plugin-storybook": "^10.2.0",
"husky": "^9.1.7",
"lint-staged": "^15.2.10",
- "minimist": "^1.2.8",
"msw": "^2.12.8",
- "postcss": "^8.4.45",
"prettier": "^3.3.3",
"prettier-plugin-organize-imports": "^4.0.0",
"prettier-plugin-tailwindcss": "^0.7.2",
"rehype-parse": "^9.0.1",
"rehype-stringify": "^10.0.1",
"storybook": "^10.2.0",
- "tailwindcss": "^4.1.18",
- "tailwindcss-animate": "^1.0.7",
- "tw-animate-css": "^1.4.0",
- "typescript": "^5.6.2",
"unified": "^11.0.5",
"vite": "^7.3.1",
"vitest": "^4.0.18"
@@ -57,11 +42,18 @@
"@radix-ui/react-collapsible": "^1.1.0",
"@radix-ui/react-dialog": "^1.1.1",
"@radix-ui/react-visually-hidden": "^1.2.4",
- "@tailwindcss/aspect-ratio": "^0.4.2",
+ "@tailwindcss/postcss": "^4.1.18",
+ "@types/hast": "^3.0.4",
+ "@types/lodash-es": "^4.17.12",
+ "@types/node": "^25.0.9",
+ "@types/react": "^19.0.0",
+ "@types/react-dom": "^19.0.0",
+ "@types/sanitize-html": "^2.16.0",
"cheerio": "^1.0.0",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"cmdk": "^1.1.1",
+ "commander": "^15.0.0",
"gray-matter": "^4.0.3",
"image-size": "^1.1.1",
"lodash-es": "^4.17.21",
@@ -73,6 +65,7 @@
"next": "^16.1.3",
"next-mdx-remote": "^6.0.0",
"next-themes": "^0.4.6",
+ "postcss": "^8.4.45",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"react-icons": "^5.5.0",
@@ -81,6 +74,10 @@
"remark-gfm": "^4.0.1",
"sanitize-html": "^2.17.0",
"tailwind-merge": "^3.4.0",
+ "tailwindcss": "^4.1.18",
+ "tailwindcss-animate": "^1.0.7",
+ "tw-animate-css": "^1.4.0",
+ "typescript": "^5.6.2",
"unist-util-visit": "^5.0.0",
"xmlbuilder2": "^3.1.1",
"zod": "^3.24.1"
@@ -97,10 +94,40 @@
"test": "vitest && playwright test",
"chromatic": "chromatic --project-token $CHROMATIC_PROJECT_TOKEN",
"storybook": "storybook dev -p 6006",
- "build-storybook": "storybook build"
+ "build-storybook": "storybook build",
+ "build:cli": "node scripts/build-cli.mjs",
+ "prepack": "node scripts/build-cli.mjs"
},
"engines": {
"node": ">=20.9.0"
},
- "packageManager": "pnpm@10.28.1"
+ "packageManager": "pnpm@10.28.1",
+ "description": "Generate pmndrs-standardized documentation — HTML fragments, or the whole website — from a folder of MDX.",
+ "homepage": "https://docs.pmnd.rs",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/pmndrs/docs.git"
+ },
+ "license": "MIT",
+ "keywords": [
+ "pmndrs",
+ "documentation",
+ "mdx",
+ "docs",
+ "static-site"
+ ],
+ "files": [
+ "bin",
+ "dist",
+ "public",
+ "registry",
+ "src",
+ "next.config.mjs",
+ "next-env.d.ts",
+ "postcss.config.mjs",
+ "tsconfig.json",
+ "!src/stories",
+ "!**/*.test.*",
+ "!**/*.stories.*"
+ ]
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index f512c7442..69f86c6bf 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -32,9 +32,27 @@ importers:
'@radix-ui/react-visually-hidden':
specifier: ^1.2.4
version: 1.2.4(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@tailwindcss/aspect-ratio':
- specifier: ^0.4.2
- version: 0.4.2(tailwindcss@4.1.18)
+ '@tailwindcss/postcss':
+ specifier: ^4.1.18
+ version: 4.1.18
+ '@types/hast':
+ specifier: ^3.0.4
+ version: 3.0.4
+ '@types/lodash-es':
+ specifier: ^4.17.12
+ version: 4.17.12
+ '@types/node':
+ specifier: ^25.0.9
+ version: 25.0.9
+ '@types/react':
+ specifier: ^19.0.0
+ version: 19.2.8
+ '@types/react-dom':
+ specifier: ^19.0.0
+ version: 19.2.3(@types/react@19.2.8)
+ '@types/sanitize-html':
+ specifier: ^2.16.0
+ version: 2.16.0
cheerio:
specifier: ^1.0.0
version: 1.2.0
@@ -47,6 +65,9 @@ importers:
cmdk:
specifier: ^1.1.1
version: 1.1.1(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ commander:
+ specifier: ^15.0.0
+ version: 15.0.0
gray-matter:
specifier: ^4.0.3
version: 4.0.3
@@ -80,6 +101,9 @@ importers:
next-themes:
specifier: ^0.4.6
version: 0.4.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ postcss:
+ specifier: ^8.4.45
+ version: 8.5.6
react:
specifier: ^19.0.0
version: 19.2.3
@@ -104,6 +128,18 @@ importers:
tailwind-merge:
specifier: ^3.4.0
version: 3.4.0
+ tailwindcss:
+ specifier: ^4.1.18
+ version: 4.1.18
+ tailwindcss-animate:
+ specifier: ^1.0.7
+ version: 1.0.7(tailwindcss@4.1.18)
+ tw-animate-css:
+ specifier: ^1.4.0
+ version: 1.4.0
+ typescript:
+ specifier: ^5.6.2
+ version: 5.9.3
unist-util-visit:
specifier: ^5.0.0
version: 5.0.0
@@ -122,7 +158,7 @@ importers:
version: 2.29.8(@types/node@25.0.9)
'@chromatic-com/playwright':
specifier: ^0.12.8
- version: 0.12.8(@playwright/test@1.57.0)(@types/react@19.2.8)(esbuild@0.25.12)(prettier@3.8.0)(typescript@5.9.3)
+ version: 0.12.8(@playwright/test@1.57.0)(@types/react@19.2.8)(esbuild@0.28.2)(prettier@3.8.0)(typescript@5.9.3)
'@eslint/eslintrc':
specifier: ^3.3.3
version: 3.3.3
@@ -131,46 +167,22 @@ importers:
version: 1.57.0
'@storybook/addon-docs':
specifier: ^10.2.0
- version: 10.2.0(@types/react@19.2.8)(esbuild@0.25.12)(rollup@4.57.0)(storybook@10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.25.12))
+ version: 10.2.0(@types/react@19.2.8)(esbuild@0.28.2)(rollup@4.57.0)(storybook@10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.28.2))
'@storybook/addon-themes':
specifier: ^10.2.0
version: 10.2.0(storybook@10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))
'@storybook/nextjs-vite':
specifier: ^10.2.0
- version: 10.2.0(@babel/core@7.28.6)(esbuild@0.25.12)(msw@2.12.8(@types/node@25.0.9)(typescript@5.9.3))(next@16.1.3(@babel/core@7.28.6)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rollup@4.57.0)(storybook@10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(typescript@5.9.3)(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.25.12))
- '@tailwindcss/postcss':
- specifier: ^4.1.18
- version: 4.1.18
- '@tailwindcss/typography':
- specifier: ^0.5.19
- version: 0.5.19(tailwindcss@4.1.18)
- '@types/hast':
- specifier: ^3.0.4
- version: 3.0.4
- '@types/lodash-es':
- specifier: ^4.17.12
- version: 4.17.12
- '@types/minimist':
- specifier: ^1.2.5
- version: 1.2.5
- '@types/node':
- specifier: ^25.0.9
- version: 25.0.9
- '@types/react':
- specifier: ^19.0.0
- version: 19.2.8
- '@types/react-dom':
- specifier: ^19.0.0
- version: 19.2.3(@types/react@19.2.8)
- '@types/sanitize-html':
- specifier: ^2.16.0
- version: 2.16.0
+ version: 10.2.0(@babel/core@7.28.6)(esbuild@0.28.2)(msw@2.12.8(@types/node@25.0.9)(typescript@5.9.3))(next@16.1.3(@babel/core@7.28.6)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rollup@4.57.0)(storybook@10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(typescript@5.9.3)(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.28.2))
autoprefixer:
specifier: ^10.4.23
version: 10.4.23(postcss@8.5.6)
chromatic:
specifier: ^13.3.5
- version: 13.3.5(@chromatic-com/playwright@0.12.8(@playwright/test@1.57.0)(@types/react@19.2.8)(esbuild@0.25.12)(prettier@3.8.0)(typescript@5.9.3))
+ version: 13.3.5(@chromatic-com/playwright@0.12.8(@playwright/test@1.57.0)(@types/react@19.2.8)(esbuild@0.28.2)(prettier@3.8.0)(typescript@5.9.3))
+ esbuild:
+ specifier: ^0.28.2
+ version: 0.28.2
eslint:
specifier: ^9.0.0
version: 9.39.2(jiti@2.6.1)
@@ -186,15 +198,9 @@ importers:
lint-staged:
specifier: ^15.2.10
version: 15.5.2
- minimist:
- specifier: ^1.2.8
- version: 1.2.8
msw:
specifier: ^2.12.8
version: 2.12.8(@types/node@25.0.9)(typescript@5.9.3)
- postcss:
- specifier: ^8.4.45
- version: 8.5.6
prettier:
specifier: ^3.3.3
version: 3.8.0
@@ -213,18 +219,6 @@ importers:
storybook:
specifier: ^10.2.0
version: 10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- tailwindcss:
- specifier: ^4.1.18
- version: 4.1.18
- tailwindcss-animate:
- specifier: ^1.0.7
- version: 1.0.7(tailwindcss@4.1.18)
- tw-animate-css:
- specifier: ^1.4.0
- version: 1.4.0
- typescript:
- specifier: ^5.6.2
- version: 5.9.3
unified:
specifier: ^11.0.5
version: 11.0.5
@@ -466,6 +460,12 @@ packages:
cpu: [ppc64]
os: [aix]
+ '@esbuild/aix-ppc64@0.28.2':
+ resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
'@esbuild/android-arm64@0.25.12':
resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==}
engines: {node: '>=18'}
@@ -478,6 +478,12 @@ packages:
cpu: [arm64]
os: [android]
+ '@esbuild/android-arm64@0.28.2':
+ resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
'@esbuild/android-arm@0.25.12':
resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==}
engines: {node: '>=18'}
@@ -490,6 +496,12 @@ packages:
cpu: [arm]
os: [android]
+ '@esbuild/android-arm@0.28.2':
+ resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
'@esbuild/android-x64@0.25.12':
resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==}
engines: {node: '>=18'}
@@ -502,6 +514,12 @@ packages:
cpu: [x64]
os: [android]
+ '@esbuild/android-x64@0.28.2':
+ resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
'@esbuild/darwin-arm64@0.25.12':
resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==}
engines: {node: '>=18'}
@@ -514,6 +532,12 @@ packages:
cpu: [arm64]
os: [darwin]
+ '@esbuild/darwin-arm64@0.28.2':
+ resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
'@esbuild/darwin-x64@0.25.12':
resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==}
engines: {node: '>=18'}
@@ -526,6 +550,12 @@ packages:
cpu: [x64]
os: [darwin]
+ '@esbuild/darwin-x64@0.28.2':
+ resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
'@esbuild/freebsd-arm64@0.25.12':
resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==}
engines: {node: '>=18'}
@@ -538,6 +568,12 @@ packages:
cpu: [arm64]
os: [freebsd]
+ '@esbuild/freebsd-arm64@0.28.2':
+ resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
'@esbuild/freebsd-x64@0.25.12':
resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==}
engines: {node: '>=18'}
@@ -550,6 +586,12 @@ packages:
cpu: [x64]
os: [freebsd]
+ '@esbuild/freebsd-x64@0.28.2':
+ resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
'@esbuild/linux-arm64@0.25.12':
resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==}
engines: {node: '>=18'}
@@ -562,6 +604,12 @@ packages:
cpu: [arm64]
os: [linux]
+ '@esbuild/linux-arm64@0.28.2':
+ resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
'@esbuild/linux-arm@0.25.12':
resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==}
engines: {node: '>=18'}
@@ -574,6 +622,12 @@ packages:
cpu: [arm]
os: [linux]
+ '@esbuild/linux-arm@0.28.2':
+ resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
'@esbuild/linux-ia32@0.25.12':
resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==}
engines: {node: '>=18'}
@@ -586,6 +640,12 @@ packages:
cpu: [ia32]
os: [linux]
+ '@esbuild/linux-ia32@0.28.2':
+ resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
'@esbuild/linux-loong64@0.25.12':
resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==}
engines: {node: '>=18'}
@@ -598,6 +658,12 @@ packages:
cpu: [loong64]
os: [linux]
+ '@esbuild/linux-loong64@0.28.2':
+ resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
'@esbuild/linux-mips64el@0.25.12':
resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==}
engines: {node: '>=18'}
@@ -610,6 +676,12 @@ packages:
cpu: [mips64el]
os: [linux]
+ '@esbuild/linux-mips64el@0.28.2':
+ resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
'@esbuild/linux-ppc64@0.25.12':
resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==}
engines: {node: '>=18'}
@@ -622,6 +694,12 @@ packages:
cpu: [ppc64]
os: [linux]
+ '@esbuild/linux-ppc64@0.28.2':
+ resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
'@esbuild/linux-riscv64@0.25.12':
resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==}
engines: {node: '>=18'}
@@ -634,6 +712,12 @@ packages:
cpu: [riscv64]
os: [linux]
+ '@esbuild/linux-riscv64@0.28.2':
+ resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
'@esbuild/linux-s390x@0.25.12':
resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==}
engines: {node: '>=18'}
@@ -646,6 +730,12 @@ packages:
cpu: [s390x]
os: [linux]
+ '@esbuild/linux-s390x@0.28.2':
+ resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
'@esbuild/linux-x64@0.25.12':
resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==}
engines: {node: '>=18'}
@@ -658,6 +748,12 @@ packages:
cpu: [x64]
os: [linux]
+ '@esbuild/linux-x64@0.28.2':
+ resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
'@esbuild/netbsd-arm64@0.25.12':
resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==}
engines: {node: '>=18'}
@@ -670,6 +766,12 @@ packages:
cpu: [arm64]
os: [netbsd]
+ '@esbuild/netbsd-arm64@0.28.2':
+ resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
'@esbuild/netbsd-x64@0.25.12':
resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==}
engines: {node: '>=18'}
@@ -682,6 +784,12 @@ packages:
cpu: [x64]
os: [netbsd]
+ '@esbuild/netbsd-x64@0.28.2':
+ resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
'@esbuild/openbsd-arm64@0.25.12':
resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==}
engines: {node: '>=18'}
@@ -694,6 +802,12 @@ packages:
cpu: [arm64]
os: [openbsd]
+ '@esbuild/openbsd-arm64@0.28.2':
+ resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
'@esbuild/openbsd-x64@0.25.12':
resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==}
engines: {node: '>=18'}
@@ -706,6 +820,12 @@ packages:
cpu: [x64]
os: [openbsd]
+ '@esbuild/openbsd-x64@0.28.2':
+ resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
'@esbuild/openharmony-arm64@0.25.12':
resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==}
engines: {node: '>=18'}
@@ -718,6 +838,12 @@ packages:
cpu: [arm64]
os: [openharmony]
+ '@esbuild/openharmony-arm64@0.28.2':
+ resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openharmony]
+
'@esbuild/sunos-x64@0.25.12':
resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==}
engines: {node: '>=18'}
@@ -730,6 +856,12 @@ packages:
cpu: [x64]
os: [sunos]
+ '@esbuild/sunos-x64@0.28.2':
+ resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
'@esbuild/win32-arm64@0.25.12':
resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==}
engines: {node: '>=18'}
@@ -742,6 +874,12 @@ packages:
cpu: [arm64]
os: [win32]
+ '@esbuild/win32-arm64@0.28.2':
+ resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
'@esbuild/win32-ia32@0.25.12':
resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==}
engines: {node: '>=18'}
@@ -754,6 +892,12 @@ packages:
cpu: [ia32]
os: [win32]
+ '@esbuild/win32-ia32@0.28.2':
+ resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
'@esbuild/win32-x64@0.25.12':
resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==}
engines: {node: '>=18'}
@@ -766,6 +910,12 @@ packages:
cpu: [x64]
os: [win32]
+ '@esbuild/win32-x64@0.28.2':
+ resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
'@eslint-community/eslint-utils@4.9.1':
resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -1905,11 +2055,6 @@ packages:
'@swc/helpers@0.5.15':
resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
- '@tailwindcss/aspect-ratio@0.4.2':
- resolution: {integrity: sha512-8QPrypskfBa7QIMuKHg2TA7BqES6vhBrDLOv8Unb6FcFyd3TjKbc6lcmb9UPQHxfl24sXoJ41ux/H7qQQvfaSQ==}
- peerDependencies:
- tailwindcss: '>=2.0.0 || >=3.0.0 || >=3.0.0-alpha.1'
-
'@tailwindcss/node@4.1.18':
resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==}
@@ -1998,11 +2143,6 @@ packages:
'@tailwindcss/postcss@4.1.18':
resolution: {integrity: sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==}
- '@tailwindcss/typography@0.5.19':
- resolution: {integrity: sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==}
- peerDependencies:
- tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1'
-
'@testing-library/dom@10.4.1':
resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==}
engines: {node: '>=18'}
@@ -2182,9 +2322,6 @@ packages:
'@types/mdx@2.0.13':
resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==}
- '@types/minimist@1.2.5':
- resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==}
-
'@types/ms@2.1.0':
resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
@@ -2927,6 +3064,10 @@ packages:
resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==}
engines: {node: '>=20'}
+ commander@15.0.0:
+ resolution: {integrity: sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==}
+ engines: {node: '>=22.12.0'}
+
commander@2.20.3:
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
@@ -3484,6 +3625,11 @@ packages:
engines: {node: '>=18'}
hasBin: true
+ esbuild@0.28.2:
+ resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==}
+ engines: {node: '>=18'}
+ hasBin: true
+
escalade@3.2.0:
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
engines: {node: '>=6'}
@@ -5265,10 +5411,6 @@ packages:
peerDependencies:
postcss: ^8.1.0
- postcss-selector-parser@6.0.10:
- resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==}
- engines: {node: '>=4'}
-
postcss-selector-parser@7.1.1:
resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==}
engines: {node: '>=4'}
@@ -6849,7 +6991,7 @@ snapshots:
'@chevrotain/utils@11.0.3': {}
- '@chromatic-com/playwright@0.12.8(@playwright/test@1.57.0)(@types/react@19.2.8)(esbuild@0.25.12)(prettier@3.8.0)(typescript@5.9.3)':
+ '@chromatic-com/playwright@0.12.8(@playwright/test@1.57.0)(@types/react@19.2.8)(esbuild@0.28.2)(prettier@3.8.0)(typescript@5.9.3)':
dependencies:
'@chromaui/rrweb-snapshot': 2.0.0-alpha.18-noAbsolute
'@playwright/test': 1.57.0
@@ -6857,7 +6999,7 @@ snapshots:
'@storybook/addon-essentials': 8.5.8(@types/react@19.2.8)(storybook@8.5.8(prettier@3.8.0))
'@storybook/csf': 0.1.13
'@storybook/manager-api': 8.5.8(storybook@8.5.8(prettier@3.8.0))
- '@storybook/server-webpack5': 8.5.8(esbuild@0.25.12)(storybook@8.5.8(prettier@3.8.0))(typescript@5.9.3)
+ '@storybook/server-webpack5': 8.5.8(esbuild@0.28.2)(storybook@8.5.8(prettier@3.8.0))(typescript@5.9.3)
storybook: 8.5.8(prettier@3.8.0)
ts-dedent: 2.2.0
transitivePeerDependencies:
@@ -7008,156 +7150,234 @@ snapshots:
'@esbuild/aix-ppc64@0.27.2':
optional: true
+ '@esbuild/aix-ppc64@0.28.2':
+ optional: true
+
'@esbuild/android-arm64@0.25.12':
optional: true
'@esbuild/android-arm64@0.27.2':
optional: true
+ '@esbuild/android-arm64@0.28.2':
+ optional: true
+
'@esbuild/android-arm@0.25.12':
optional: true
'@esbuild/android-arm@0.27.2':
optional: true
+ '@esbuild/android-arm@0.28.2':
+ optional: true
+
'@esbuild/android-x64@0.25.12':
optional: true
'@esbuild/android-x64@0.27.2':
optional: true
+ '@esbuild/android-x64@0.28.2':
+ optional: true
+
'@esbuild/darwin-arm64@0.25.12':
optional: true
'@esbuild/darwin-arm64@0.27.2':
optional: true
+ '@esbuild/darwin-arm64@0.28.2':
+ optional: true
+
'@esbuild/darwin-x64@0.25.12':
optional: true
'@esbuild/darwin-x64@0.27.2':
optional: true
+ '@esbuild/darwin-x64@0.28.2':
+ optional: true
+
'@esbuild/freebsd-arm64@0.25.12':
optional: true
'@esbuild/freebsd-arm64@0.27.2':
optional: true
+ '@esbuild/freebsd-arm64@0.28.2':
+ optional: true
+
'@esbuild/freebsd-x64@0.25.12':
optional: true
'@esbuild/freebsd-x64@0.27.2':
optional: true
+ '@esbuild/freebsd-x64@0.28.2':
+ optional: true
+
'@esbuild/linux-arm64@0.25.12':
optional: true
'@esbuild/linux-arm64@0.27.2':
optional: true
+ '@esbuild/linux-arm64@0.28.2':
+ optional: true
+
'@esbuild/linux-arm@0.25.12':
optional: true
'@esbuild/linux-arm@0.27.2':
optional: true
+ '@esbuild/linux-arm@0.28.2':
+ optional: true
+
'@esbuild/linux-ia32@0.25.12':
optional: true
'@esbuild/linux-ia32@0.27.2':
optional: true
+ '@esbuild/linux-ia32@0.28.2':
+ optional: true
+
'@esbuild/linux-loong64@0.25.12':
optional: true
'@esbuild/linux-loong64@0.27.2':
optional: true
+ '@esbuild/linux-loong64@0.28.2':
+ optional: true
+
'@esbuild/linux-mips64el@0.25.12':
optional: true
'@esbuild/linux-mips64el@0.27.2':
optional: true
+ '@esbuild/linux-mips64el@0.28.2':
+ optional: true
+
'@esbuild/linux-ppc64@0.25.12':
optional: true
'@esbuild/linux-ppc64@0.27.2':
optional: true
+ '@esbuild/linux-ppc64@0.28.2':
+ optional: true
+
'@esbuild/linux-riscv64@0.25.12':
optional: true
'@esbuild/linux-riscv64@0.27.2':
optional: true
+ '@esbuild/linux-riscv64@0.28.2':
+ optional: true
+
'@esbuild/linux-s390x@0.25.12':
optional: true
'@esbuild/linux-s390x@0.27.2':
optional: true
+ '@esbuild/linux-s390x@0.28.2':
+ optional: true
+
'@esbuild/linux-x64@0.25.12':
optional: true
'@esbuild/linux-x64@0.27.2':
optional: true
+ '@esbuild/linux-x64@0.28.2':
+ optional: true
+
'@esbuild/netbsd-arm64@0.25.12':
optional: true
'@esbuild/netbsd-arm64@0.27.2':
optional: true
+ '@esbuild/netbsd-arm64@0.28.2':
+ optional: true
+
'@esbuild/netbsd-x64@0.25.12':
optional: true
'@esbuild/netbsd-x64@0.27.2':
optional: true
+ '@esbuild/netbsd-x64@0.28.2':
+ optional: true
+
'@esbuild/openbsd-arm64@0.25.12':
optional: true
'@esbuild/openbsd-arm64@0.27.2':
optional: true
+ '@esbuild/openbsd-arm64@0.28.2':
+ optional: true
+
'@esbuild/openbsd-x64@0.25.12':
optional: true
'@esbuild/openbsd-x64@0.27.2':
optional: true
+ '@esbuild/openbsd-x64@0.28.2':
+ optional: true
+
'@esbuild/openharmony-arm64@0.25.12':
optional: true
'@esbuild/openharmony-arm64@0.27.2':
optional: true
+ '@esbuild/openharmony-arm64@0.28.2':
+ optional: true
+
'@esbuild/sunos-x64@0.25.12':
optional: true
'@esbuild/sunos-x64@0.27.2':
optional: true
+ '@esbuild/sunos-x64@0.28.2':
+ optional: true
+
'@esbuild/win32-arm64@0.25.12':
optional: true
'@esbuild/win32-arm64@0.27.2':
optional: true
+ '@esbuild/win32-arm64@0.28.2':
+ optional: true
+
'@esbuild/win32-ia32@0.25.12':
optional: true
'@esbuild/win32-ia32@0.27.2':
optional: true
+ '@esbuild/win32-ia32@0.28.2':
+ optional: true
+
'@esbuild/win32-x64@0.25.12':
optional: true
'@esbuild/win32-x64@0.27.2':
optional: true
+ '@esbuild/win32-x64@0.28.2':
+ optional: true
+
'@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@2.6.1))':
dependencies:
eslint: 9.39.2(jiti@2.6.1)
@@ -8017,10 +8237,10 @@ snapshots:
storybook: 8.5.8(prettier@3.8.0)
ts-dedent: 2.2.0
- '@storybook/addon-docs@10.2.0(@types/react@19.2.8)(esbuild@0.25.12)(rollup@4.57.0)(storybook@10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.25.12))':
+ '@storybook/addon-docs@10.2.0(@types/react@19.2.8)(esbuild@0.28.2)(rollup@4.57.0)(storybook@10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.28.2))':
dependencies:
'@mdx-js/react': 3.1.1(@types/react@19.2.8)(react@19.2.3)
- '@storybook/csf-plugin': 10.2.0(esbuild@0.25.12)(rollup@4.57.0)(storybook@10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.25.12))
+ '@storybook/csf-plugin': 10.2.0(esbuild@0.28.2)(rollup@4.57.0)(storybook@10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.28.2))
'@storybook/icons': 2.0.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
'@storybook/react-dom-shim': 10.2.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(storybook@10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))
react: 19.2.3
@@ -8104,9 +8324,9 @@ snapshots:
react: 19.2.3
react-dom: 19.2.3(react@19.2.3)
- '@storybook/builder-vite@10.2.0(esbuild@0.25.12)(msw@2.12.8(@types/node@25.0.9)(typescript@5.9.3))(rollup@4.57.0)(storybook@10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.25.12))':
+ '@storybook/builder-vite@10.2.0(esbuild@0.28.2)(msw@2.12.8(@types/node@25.0.9)(typescript@5.9.3))(rollup@4.57.0)(storybook@10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.28.2))':
dependencies:
- '@storybook/csf-plugin': 10.2.0(esbuild@0.25.12)(rollup@4.57.0)(storybook@10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.25.12))
+ '@storybook/csf-plugin': 10.2.0(esbuild@0.28.2)(rollup@4.57.0)(storybook@10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.28.2))
'@vitest/mocker': 3.2.4(msw@2.12.8(@types/node@25.0.9)(typescript@5.9.3))(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))
storybook: 10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
ts-dedent: 2.2.0
@@ -8117,7 +8337,7 @@ snapshots:
- rollup
- webpack
- '@storybook/builder-webpack5@8.5.8(esbuild@0.25.12)(storybook@8.5.8(prettier@3.8.0))(typescript@5.9.3)':
+ '@storybook/builder-webpack5@8.5.8(esbuild@0.28.2)(storybook@8.5.8(prettier@3.8.0))(typescript@5.9.3)':
dependencies:
'@storybook/core-webpack': 8.5.8(storybook@8.5.8(prettier@3.8.0))
'@types/semver': 7.7.1
@@ -8125,23 +8345,23 @@ snapshots:
case-sensitive-paths-webpack-plugin: 2.4.0
cjs-module-lexer: 1.4.3
constants-browserify: 1.0.0
- css-loader: 6.11.0(webpack@5.104.1(esbuild@0.25.12))
+ css-loader: 6.11.0(webpack@5.104.1(esbuild@0.28.2))
es-module-lexer: 1.7.0
- fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.9.3)(webpack@5.104.1(esbuild@0.25.12))
- html-webpack-plugin: 5.6.6(webpack@5.104.1(esbuild@0.25.12))
+ fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.9.3)(webpack@5.104.1(esbuild@0.28.2))
+ html-webpack-plugin: 5.6.6(webpack@5.104.1(esbuild@0.28.2))
magic-string: 0.30.21
path-browserify: 1.0.1
process: 0.11.10
semver: 7.7.3
storybook: 8.5.8(prettier@3.8.0)
- style-loader: 3.3.4(webpack@5.104.1(esbuild@0.25.12))
- terser-webpack-plugin: 5.3.16(esbuild@0.25.12)(webpack@5.104.1(esbuild@0.25.12))
+ style-loader: 3.3.4(webpack@5.104.1(esbuild@0.28.2))
+ terser-webpack-plugin: 5.3.16(esbuild@0.28.2)(webpack@5.104.1(esbuild@0.28.2))
ts-dedent: 2.2.0
url: 0.11.4
util: 0.12.5
util-deprecate: 1.0.2
- webpack: 5.104.1(esbuild@0.25.12)
- webpack-dev-middleware: 6.1.3(webpack@5.104.1(esbuild@0.25.12))
+ webpack: 5.104.1(esbuild@0.28.2)
+ webpack-dev-middleware: 6.1.3(webpack@5.104.1(esbuild@0.28.2))
webpack-hot-middleware: 2.26.1
webpack-virtual-modules: 0.6.2
optionalDependencies:
@@ -8182,15 +8402,15 @@ snapshots:
- supports-color
- utf-8-validate
- '@storybook/csf-plugin@10.2.0(esbuild@0.25.12)(rollup@4.57.0)(storybook@10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.25.12))':
+ '@storybook/csf-plugin@10.2.0(esbuild@0.28.2)(rollup@4.57.0)(storybook@10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.28.2))':
dependencies:
storybook: 10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
unplugin: 2.3.11
optionalDependencies:
- esbuild: 0.25.12
+ esbuild: 0.28.2
rollup: 4.57.0
vite: 7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)
- webpack: 5.104.1(esbuild@0.25.12)
+ webpack: 5.104.1(esbuild@0.28.2)
'@storybook/csf-plugin@8.5.8(storybook@8.5.8(prettier@3.8.0))':
dependencies:
@@ -8221,11 +8441,11 @@ snapshots:
dependencies:
storybook: 8.5.8(prettier@3.8.0)
- '@storybook/nextjs-vite@10.2.0(@babel/core@7.28.6)(esbuild@0.25.12)(msw@2.12.8(@types/node@25.0.9)(typescript@5.9.3))(next@16.1.3(@babel/core@7.28.6)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rollup@4.57.0)(storybook@10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(typescript@5.9.3)(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.25.12))':
+ '@storybook/nextjs-vite@10.2.0(@babel/core@7.28.6)(esbuild@0.28.2)(msw@2.12.8(@types/node@25.0.9)(typescript@5.9.3))(next@16.1.3(@babel/core@7.28.6)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rollup@4.57.0)(storybook@10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(typescript@5.9.3)(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.28.2))':
dependencies:
- '@storybook/builder-vite': 10.2.0(esbuild@0.25.12)(msw@2.12.8(@types/node@25.0.9)(typescript@5.9.3))(rollup@4.57.0)(storybook@10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.25.12))
+ '@storybook/builder-vite': 10.2.0(esbuild@0.28.2)(msw@2.12.8(@types/node@25.0.9)(typescript@5.9.3))(rollup@4.57.0)(storybook@10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.28.2))
'@storybook/react': 10.2.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(storybook@10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(typescript@5.9.3)
- '@storybook/react-vite': 10.2.0(esbuild@0.25.12)(msw@2.12.8(@types/node@25.0.9)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rollup@4.57.0)(storybook@10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(typescript@5.9.3)(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.25.12))
+ '@storybook/react-vite': 10.2.0(esbuild@0.28.2)(msw@2.12.8(@types/node@25.0.9)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rollup@4.57.0)(storybook@10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(typescript@5.9.3)(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.28.2))
next: 16.1.3(@babel/core@7.28.6)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
react: 19.2.3
react-dom: 19.2.3(react@19.2.3)
@@ -8270,11 +8490,11 @@ snapshots:
react-dom: 19.2.3(react@19.2.3)
storybook: 8.5.8(prettier@3.8.0)
- '@storybook/react-vite@10.2.0(esbuild@0.25.12)(msw@2.12.8(@types/node@25.0.9)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rollup@4.57.0)(storybook@10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(typescript@5.9.3)(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.25.12))':
+ '@storybook/react-vite@10.2.0(esbuild@0.28.2)(msw@2.12.8(@types/node@25.0.9)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rollup@4.57.0)(storybook@10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(typescript@5.9.3)(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.28.2))':
dependencies:
'@joshwooding/vite-plugin-react-docgen-typescript': 0.6.3(typescript@5.9.3)(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))
'@rollup/pluginutils': 5.3.0(rollup@4.57.0)
- '@storybook/builder-vite': 10.2.0(esbuild@0.25.12)(msw@2.12.8(@types/node@25.0.9)(typescript@5.9.3))(rollup@4.57.0)(storybook@10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.25.12))
+ '@storybook/builder-vite': 10.2.0(esbuild@0.28.2)(msw@2.12.8(@types/node@25.0.9)(typescript@5.9.3))(rollup@4.57.0)(storybook@10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.28.2))
'@storybook/react': 10.2.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(storybook@10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(typescript@5.9.3)
empathic: 2.0.0
magic-string: 0.30.21
@@ -8306,9 +8526,9 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@storybook/server-webpack5@8.5.8(esbuild@0.25.12)(storybook@8.5.8(prettier@3.8.0))(typescript@5.9.3)':
+ '@storybook/server-webpack5@8.5.8(esbuild@0.28.2)(storybook@8.5.8(prettier@3.8.0))(typescript@5.9.3)':
dependencies:
- '@storybook/builder-webpack5': 8.5.8(esbuild@0.25.12)(storybook@8.5.8(prettier@3.8.0))(typescript@5.9.3)
+ '@storybook/builder-webpack5': 8.5.8(esbuild@0.28.2)(storybook@8.5.8(prettier@3.8.0))(typescript@5.9.3)
'@storybook/preset-server-webpack': 8.5.8(storybook@8.5.8(prettier@3.8.0))
'@storybook/server': 8.5.8(storybook@8.5.8(prettier@3.8.0))
storybook: 8.5.8(prettier@3.8.0)
@@ -8340,10 +8560,6 @@ snapshots:
dependencies:
tslib: 2.8.1
- '@tailwindcss/aspect-ratio@0.4.2(tailwindcss@4.1.18)':
- dependencies:
- tailwindcss: 4.1.18
-
'@tailwindcss/node@4.1.18':
dependencies:
'@jridgewell/remapping': 2.3.5
@@ -8413,11 +8629,6 @@ snapshots:
postcss: 8.5.6
tailwindcss: 4.1.18
- '@tailwindcss/typography@0.5.19(tailwindcss@4.1.18)':
- dependencies:
- postcss-selector-parser: 6.0.10
- tailwindcss: 4.1.18
-
'@testing-library/dom@10.4.1':
dependencies:
'@babel/code-frame': 7.28.6
@@ -8644,8 +8855,6 @@ snapshots:
'@types/mdx@2.0.13': {}
- '@types/minimist@1.2.5': {}
-
'@types/ms@2.1.0': {}
'@types/node@12.20.55': {}
@@ -9369,9 +9578,9 @@ snapshots:
optionalDependencies:
fsevents: 2.3.3
- chromatic@13.3.5(@chromatic-com/playwright@0.12.8(@playwright/test@1.57.0)(@types/react@19.2.8)(esbuild@0.25.12)(prettier@3.8.0)(typescript@5.9.3)):
+ chromatic@13.3.5(@chromatic-com/playwright@0.12.8(@playwright/test@1.57.0)(@types/react@19.2.8)(esbuild@0.28.2)(prettier@3.8.0)(typescript@5.9.3)):
optionalDependencies:
- '@chromatic-com/playwright': 0.12.8(@playwright/test@1.57.0)(@types/react@19.2.8)(esbuild@0.25.12)(prettier@3.8.0)(typescript@5.9.3)
+ '@chromatic-com/playwright': 0.12.8(@playwright/test@1.57.0)(@types/react@19.2.8)(esbuild@0.28.2)(prettier@3.8.0)(typescript@5.9.3)
chrome-trace-event@1.0.4: {}
@@ -9442,6 +9651,8 @@ snapshots:
commander@14.0.3: {}
+ commander@15.0.0: {}
+
commander@2.20.3: {}
commander@7.2.0: {}
@@ -9495,7 +9706,7 @@ snapshots:
shebang-command: 2.0.0
which: 2.0.2
- css-loader@6.11.0(webpack@5.104.1(esbuild@0.25.12)):
+ css-loader@6.11.0(webpack@5.104.1(esbuild@0.28.2)):
dependencies:
icss-utils: 5.1.0(postcss@8.5.6)
postcss: 8.5.6
@@ -9506,7 +9717,7 @@ snapshots:
postcss-value-parser: 4.2.0
semver: 7.7.3
optionalDependencies:
- webpack: 5.104.1(esbuild@0.25.12)
+ webpack: 5.104.1(esbuild@0.28.2)
css-select@4.3.0:
dependencies:
@@ -10128,6 +10339,35 @@ snapshots:
'@esbuild/win32-ia32': 0.27.2
'@esbuild/win32-x64': 0.27.2
+ esbuild@0.28.2:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.28.2
+ '@esbuild/android-arm': 0.28.2
+ '@esbuild/android-arm64': 0.28.2
+ '@esbuild/android-x64': 0.28.2
+ '@esbuild/darwin-arm64': 0.28.2
+ '@esbuild/darwin-x64': 0.28.2
+ '@esbuild/freebsd-arm64': 0.28.2
+ '@esbuild/freebsd-x64': 0.28.2
+ '@esbuild/linux-arm': 0.28.2
+ '@esbuild/linux-arm64': 0.28.2
+ '@esbuild/linux-ia32': 0.28.2
+ '@esbuild/linux-loong64': 0.28.2
+ '@esbuild/linux-mips64el': 0.28.2
+ '@esbuild/linux-ppc64': 0.28.2
+ '@esbuild/linux-riscv64': 0.28.2
+ '@esbuild/linux-s390x': 0.28.2
+ '@esbuild/linux-x64': 0.28.2
+ '@esbuild/netbsd-arm64': 0.28.2
+ '@esbuild/netbsd-x64': 0.28.2
+ '@esbuild/openbsd-arm64': 0.28.2
+ '@esbuild/openbsd-x64': 0.28.2
+ '@esbuild/openharmony-arm64': 0.28.2
+ '@esbuild/sunos-x64': 0.28.2
+ '@esbuild/win32-arm64': 0.28.2
+ '@esbuild/win32-ia32': 0.28.2
+ '@esbuild/win32-x64': 0.28.2
+
escalade@3.2.0: {}
escape-carriage@1.3.1: {}
@@ -10563,7 +10803,7 @@ snapshots:
cross-spawn: 7.0.6
signal-exit: 4.1.0
- fork-ts-checker-webpack-plugin@8.0.0(typescript@5.9.3)(webpack@5.104.1(esbuild@0.25.12)):
+ fork-ts-checker-webpack-plugin@8.0.0(typescript@5.9.3)(webpack@5.104.1(esbuild@0.28.2)):
dependencies:
'@babel/code-frame': 7.28.6
chalk: 4.1.2
@@ -10578,7 +10818,7 @@ snapshots:
semver: 7.7.3
tapable: 2.3.0
typescript: 5.9.3
- webpack: 5.104.1(esbuild@0.25.12)
+ webpack: 5.104.1(esbuild@0.28.2)
forwarded@0.2.0: {}
@@ -10880,7 +11120,7 @@ snapshots:
html-void-elements@3.0.0: {}
- html-webpack-plugin@5.6.6(webpack@5.104.1(esbuild@0.25.12)):
+ html-webpack-plugin@5.6.6(webpack@5.104.1(esbuild@0.28.2)):
dependencies:
'@types/html-minifier-terser': 6.1.0
html-minifier-terser: 6.1.0
@@ -10888,7 +11128,7 @@ snapshots:
pretty-error: 4.0.0
tapable: 2.3.0
optionalDependencies:
- webpack: 5.104.1(esbuild@0.25.12)
+ webpack: 5.104.1(esbuild@0.28.2)
htmlparser2@10.1.0:
dependencies:
@@ -12337,11 +12577,6 @@ snapshots:
icss-utils: 5.1.0(postcss@8.5.6)
postcss: 8.5.6
- postcss-selector-parser@6.0.10:
- dependencies:
- cssesc: 3.0.0
- util-deprecate: 1.0.2
-
postcss-selector-parser@7.1.1:
dependencies:
cssesc: 3.0.0
@@ -13016,7 +13251,7 @@ snapshots:
'@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1)
'@vitest/expect': 3.2.4
'@vitest/spy': 3.2.4
- esbuild: 0.25.12
+ esbuild: 0.27.2
open: 10.2.0
recast: 0.23.11
semver: 7.7.3
@@ -13142,9 +13377,9 @@ snapshots:
strip-json-comments@3.1.1: {}
- style-loader@3.3.4(webpack@5.104.1(esbuild@0.25.12)):
+ style-loader@3.3.4(webpack@5.104.1(esbuild@0.28.2)):
dependencies:
- webpack: 5.104.1(esbuild@0.25.12)
+ webpack: 5.104.1(esbuild@0.28.2)
style-mod@4.1.3: {}
@@ -13189,16 +13424,16 @@ snapshots:
term-size@2.2.1: {}
- terser-webpack-plugin@5.3.16(esbuild@0.25.12)(webpack@5.104.1(esbuild@0.25.12)):
+ terser-webpack-plugin@5.3.16(esbuild@0.28.2)(webpack@5.104.1(esbuild@0.28.2)):
dependencies:
'@jridgewell/trace-mapping': 0.3.31
jest-worker: 27.5.1
schema-utils: 4.3.3
serialize-javascript: 6.0.2
terser: 5.46.0
- webpack: 5.104.1(esbuild@0.25.12)
+ webpack: 5.104.1(esbuild@0.28.2)
optionalDependencies:
- esbuild: 0.25.12
+ esbuild: 0.28.2
terser@5.46.0:
dependencies:
@@ -13634,7 +13869,7 @@ snapshots:
webidl-conversions@3.0.1: {}
- webpack-dev-middleware@6.1.3(webpack@5.104.1(esbuild@0.25.12)):
+ webpack-dev-middleware@6.1.3(webpack@5.104.1(esbuild@0.28.2)):
dependencies:
colorette: 2.0.20
memfs: 3.5.3
@@ -13642,7 +13877,7 @@ snapshots:
range-parser: 1.2.1
schema-utils: 4.3.3
optionalDependencies:
- webpack: 5.104.1(esbuild@0.25.12)
+ webpack: 5.104.1(esbuild@0.28.2)
webpack-hot-middleware@2.26.1:
dependencies:
@@ -13654,7 +13889,7 @@ snapshots:
webpack-virtual-modules@0.6.2: {}
- webpack@5.104.1(esbuild@0.25.12):
+ webpack@5.104.1(esbuild@0.28.2):
dependencies:
'@types/eslint-scope': 3.7.7
'@types/estree': 1.0.8
@@ -13678,7 +13913,7 @@ snapshots:
neo-async: 2.6.2
schema-utils: 4.3.3
tapable: 2.3.0
- terser-webpack-plugin: 5.3.16(esbuild@0.25.12)(webpack@5.104.1(esbuild@0.25.12))
+ terser-webpack-plugin: 5.3.16(esbuild@0.28.2)(webpack@5.104.1(esbuild@0.28.2))
watchpack: 2.5.1
webpack-sources: 3.3.3
transitivePeerDependencies:
diff --git a/scripts/build-cli.mjs b/scripts/build-cli.mjs
new file mode 100644
index 000000000..c898634c3
--- /dev/null
+++ b/scripts/build-cli.mjs
@@ -0,0 +1,81 @@
+// Bundles the CLI so that `node` can run what only Next could run: TSX, the `@/` paths of
+// tsconfig, and the CSS and image imports our components make.
+
+import * as esbuild from 'esbuild'
+import sizeOf from 'image-size'
+import { readFile } from 'node:fs/promises'
+import { dirname, extname, resolve } from 'node:path'
+import { fileURLToPath } from 'node:url'
+
+const root = resolve(dirname(fileURLToPath(import.meta.url)), '..')
+
+/**
+ * The `paths` of tsconfig.json: `@/*` resolves under `src/`, and `@/registry/*` at the repo
+ * root, where `shadcn` looks for registry items.
+ */
+const tsconfigPaths = {
+ name: 'tsconfig-paths',
+ setup(build) {
+ build.onResolve({ filter: /^@\// }, async (args) => {
+ const path = args.path.slice('@/'.length)
+ const absolute =
+ path === 'package.json' || path.startsWith('registry/')
+ ? resolve(root, path)
+ : resolve(root, 'src', path)
+
+ return build.resolve(absolute, { kind: args.kind, resolveDir: dirname(absolute) })
+ })
+ },
+}
+
+/** Stylesheets are the website's business; a fragment carries none. */
+const stylesheets = {
+ name: 'stylesheets',
+ setup(build) {
+ build.onLoad({ filter: /\.css$/ }, () => ({ contents: '', loader: 'js' }))
+ },
+}
+
+const MIME = {
+ '.svg': 'image/svg+xml',
+ '.png': 'image/png',
+ '.jpg': 'image/jpeg',
+ '.jpeg': 'image/jpeg',
+ '.gif': 'image/gif',
+ '.webp': 'image/webp',
+ '.avif': 'image/avif',
+}
+
+/**
+ * Static image imports, in the shape Next gives them — `{ src, width, height }` — so that
+ * components need not know which of the two compiled them. `src` is a data URI, since a
+ * fragment travels alone.
+ */
+const staticImages = {
+ name: 'static-images',
+ setup(build) {
+ build.onLoad({ filter: /\.(svg|png|jpe?g|gif|webp|avif)$/ }, async (args) => {
+ const data = await readFile(args.path)
+ const { width, height } = sizeOf(data)
+ const src = `data:${MIME[extname(args.path)]};base64,${data.toString('base64')}`
+
+ return {
+ contents: `export default ${JSON.stringify({ src, width, height })}`,
+ loader: 'js',
+ }
+ })
+ },
+}
+
+await esbuild.build({
+ entryPoints: [resolve(root, 'src/cli/main.ts')],
+ outfile: resolve(root, 'dist/cli.mjs'),
+ bundle: true,
+ platform: 'node',
+ format: 'esm',
+ target: 'node20.9',
+ packages: 'external',
+ jsx: 'automatic',
+ plugins: [tsconfigPaths, stylesheets, staticImages],
+ logLevel: 'info',
+})
diff --git a/src/app/globals.css b/src/app/globals.css
index 15909b771..880e49dd9 100644
--- a/src/app/globals.css
+++ b/src/app/globals.css
@@ -4,6 +4,12 @@
* outranks the `:root` and `.dark` blocks below wherever it lands. */
@import 'material-theme-builder/shadcn.css';
+/* The docs are scanned for utility classes too: `className=` in an `.mdx` file is ordinary
+ * authoring. Tailwind would otherwise only find them when the folder happens to sit inside
+ * the project root — true of a build run from this repo, not of one run from the CLI, which
+ * is handed a folder from anywhere and stages it here. */
+@source '../../docs/**/*.{md,mdx}';
+
/* The M3 utilities: `bg-surface-dim`, `text-on-surface-variant`, and the four
* roles of each custom colour named here. */
@plugin 'material-theme-builder/tailwind' {
diff --git a/src/cli/main.ts b/src/cli/main.ts
new file mode 100644
index 000000000..852460ea1
--- /dev/null
+++ b/src/cli/main.ts
@@ -0,0 +1,210 @@
+import { version } from '@/package.json'
+import { MARKDOWN_REGEX, crawl, getDocs } from '@/utils/docs'
+import { Command, Option, type OptionValues } from 'commander'
+import { copyFile, mkdir, readFile, stat, writeFile } from 'node:fs/promises'
+import { dirname, join, relative, resolve } from 'node:path'
+import { fragmentComponents, renderFragment, renderToHtml } from './render'
+import { buildWebsite } from './website'
+
+/**
+ * The website options — the ones that describe *a site* rather than what to compile.
+ *
+ * Each carries the environment variable the app reads it as, so that a flag and its variable
+ * are declared in one place, and `--help` says which is which. `Option.env()` then does the
+ * fallback itself, which is what keeps the Docker image and the reusable workflow working
+ * with no flags at all.
+ */
+const websiteOptions = [
+ new Option('--libname ', 'Library name, e.g. "React Three Fiber"').env(
+ 'NEXT_PUBLIC_LIBNAME',
+ ),
+ new Option('--libname-short ', 'Short library name, for narrow screens').env(
+ 'NEXT_PUBLIC_LIBNAME_SHORT',
+ ),
+ new Option('--libname-dotsuffix-label
@@ -142,7 +146,7 @@ function Avatar({
{...props}
>
{imageUrl ? (
-
+
) : (
initials(name)
)}
diff --git a/src/components/mdx/Sandpack/rehypeSandpack.ts b/src/components/mdx/Sandpack/rehypeSandpack.ts
index 2187f127f..27e5f585b 100644
--- a/src/components/mdx/Sandpack/rehypeSandpack.ts
+++ b/src/components/mdx/Sandpack/rehypeSandpack.ts
@@ -1,5 +1,5 @@
import type { Root } from 'hast'
-import { resolve } from 'path'
+import { resolve } from 'node:path'
import { visit } from 'unist-util-visit'
//
diff --git a/src/utils/compileMdxContent.test.ts b/src/utils/compileMdxContent.test.ts
index 80e7f42e2..2f9cdf1a7 100644
--- a/src/utils/compileMdxContent.test.ts
+++ b/src/utils/compileMdxContent.test.ts
@@ -45,8 +45,7 @@ describe('compileMdxContent', () => {
const entries: any[] = []
it('compiles full MDX content with text', async () => {
- const result = await compileMdxContent(
- 'This is **bold** text with *italic* formatting.',
+ const result = await compileMdxContent('This is **bold** text with *italic* formatting.', {
relFilePath,
absoluteFilePath,
baseUrl,
@@ -54,7 +53,7 @@ describe('compileMdxContent', () => {
url,
tableOfContents,
entries,
- )
+ })
expect(result.content).toBeDefined()
const html = renderToString(result.content)
expect(html).toMatch(
@@ -63,8 +62,7 @@ describe('compileMdxContent', () => {
})
it('compiles MDX with code blocks', async () => {
- const result = await compileMdxContent(
- '```js\nconst x = 1;\n```',
+ const result = await compileMdxContent('```js\nconst x = 1;\n```', {
relFilePath,
absoluteFilePath,
baseUrl,
@@ -72,7 +70,7 @@ describe('compileMdxContent', () => {
url,
tableOfContents,
entries,
- )
+ })
expect(result.content).toBeDefined()
const html = renderToString(result.content)
// Code blocks have complex HTML structure with syntax highlighting
@@ -85,8 +83,7 @@ describe('compileMdxContent', () => {
})
it('compiles MDX with links', async () => {
- const result = await compileMdxContent(
- 'Check [this link](#section)',
+ const result = await compileMdxContent('Check [this link](#section)', {
relFilePath,
absoluteFilePath,
baseUrl,
@@ -94,7 +91,7 @@ describe('compileMdxContent', () => {
url,
tableOfContents,
entries,
- )
+ })
expect(result.content).toBeDefined()
const html = renderToString(result.content)
expect(html).toMatch(/]*>Check ]*href="#section"[^>]*>this link<\/a><\/p>/)
diff --git a/src/utils/compileMdxContent.tsx b/src/utils/compileMdxContent.tsx
index 4ff5c3ac5..197a01195 100644
--- a/src/utils/compileMdxContent.tsx
+++ b/src/utils/compileMdxContent.tsx
@@ -41,10 +41,10 @@ import { Sandpack } from '@/components/mdx/Sandpack'
import { rehypeSandpack } from '@/components/mdx/Sandpack/rehypeSandpack'
import { Summary } from '@/components/mdx/Summary'
import { rehypeSummary } from '@/components/mdx/Summary/rehypeSummary'
-import { Toc } from '@/components/mdx/Toc'
import { rehypeToc } from '@/components/mdx/Toc/rehypeToc'
import type { DocToC } from '@/app/[...slug]/DocsContext'
import { compileMDX } from 'next-mdx-remote/rsc'
+import type { ComponentType } from 'react'
import { dirname } from 'node:path'
import rehypePrismPlus from 'rehype-prism-plus'
import remarkGFM from 'remark-gfm'
@@ -54,29 +54,42 @@ import remarkGFM from 'remark-gfm'
* This ensures consistent MDX rendering everywhere.
*/
+export type CompileMdxContentOptions = {
+ /** Relative file path, e.g. "/getting-started/tutorials/store.mdx" */
+ relFilePath: string
+ /** Absolute file path, against which `Sandpack folder=` is resolved */
+ absoluteFilePath: string
+ /** Base URL for resolving MDX URLs */
+ baseUrl?: string
+ /** Document title, for the ToC */
+ title: string
+ /** Document URL, for the ToC */
+ url: string
+ /** Populated with the ToC entries found while compiling */
+ tableOfContents: DocToC[]
+ /** All doc entries, for the `Entries` component */
+ entries: Entry[]
+ /** Components overriding the defaults, e.g. a visible `h1` outside the website */
+ components?: Record>
+}
+
/**
* Compiles MDX content with full options (2nd pass).
*
- * @param source - The MDX source content to compile
- * @param relFilePath - Relative file path (e.g., "/getting-started/tutorials/store.mdx")
- * @param absoluteFilePath - Absolute file path for Sandpack resolution
- * @param baseUrl - Base URL for resolving MDX URLs
- * @param title - Document title for ToC
- * @param url - Document URL for ToC
- * @param tableOfContents - Array to populate with ToC entries
- * @param entries - All doc entries for the Entries component
* @returns Compiled MDX result with content JSX
*/
-export async function compileMdxContent(
- source: string,
- relFilePath: string,
- absoluteFilePath: string,
- baseUrl: string | undefined,
- title: string,
- url: string,
- tableOfContents: DocToC[],
- entries: Entry[],
-) {
+export async function compileMdxContent(source: string, options: CompileMdxContentOptions) {
+ const {
+ relFilePath,
+ absoluteFilePath,
+ baseUrl,
+ title,
+ url,
+ tableOfContents,
+ entries,
+ components,
+ } = options
+
return await compileMDX({
source,
options: {
@@ -113,7 +126,6 @@ export async function compileMdxContent(
Mermaid,
Sandpack,
Summary,
- Toc,
h1,
h2,
h3,
@@ -137,6 +149,7 @@ export async function compileMdxContent(
},
Codesandbox: (props) => ,
Entries: () => ,
+ ...components,
},
})
}
diff --git a/src/utils/docs.tsx b/src/utils/docs.tsx
index 6c0b72bd2..5ede306d9 100644
--- a/src/utils/docs.tsx
+++ b/src/utils/docs.tsx
@@ -5,7 +5,7 @@ import resolveMdxUrl from '@/utils/resolveMdxUrl'
import matter from 'gray-matter'
import { compileMDX } from 'next-mdx-remote/rsc'
import fs from 'node:fs'
-import { cache } from 'react'
+import { cache, type ComponentType } from 'react'
/**
* Checks for .md(x) file extension
@@ -77,14 +77,17 @@ export async function parseDocsMetadata(root: string) {
* @param root - absolute or relative (to cwd) path to docs folder
*/
-const MDX_BASEURL = process.env.MDX_BASEURL
-// console.log('MDX_BASEURL', MDX_BASEURL)
-
async function _getDocs(
root: string,
slugOfInterest: string[] | null,
slugOnly = false,
+ /** Components overriding the defaults, for consumers rendering docs outside the website */
+ components?: Record>,
): Promise {
+ // Read at call time, not at module scope: consumers embedding this (the CLI) set their
+ // environment after the module is loaded.
+ const MDX_BASEURL = process.env.MDX_BASEURL
+
//
// 1st pass for `entries` - using shared parseDocsMetadata
//
@@ -215,16 +218,16 @@ async function _getDocs(
const tableOfContents: DocToC[] = []
- const compiledContent = await compileMdxContent(
- `# ${titleRaw}\n ${content}`,
+ const compiledContent = await compileMdxContent(`# ${titleRaw}\n ${content}`, {
relFilePath,
- file,
- MDX_BASEURL,
- titleRaw,
+ absoluteFilePath: file,
+ baseUrl: MDX_BASEURL,
+ title: titleRaw,
url,
tableOfContents,
entries,
- )
+ components,
+ })
const contentJsx = compiledContent.content
return {
diff --git a/tailwind.config.ts b/tailwind.config.ts
deleted file mode 100644
index 0d3c8e0c1..000000000
--- a/tailwind.config.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import type { Config } from 'tailwindcss'
-
-const config: Config = {
- content: ['./src/components/**/*.{js,ts,jsx,tsx,mdx}', './src/app/**/*.{js,ts,jsx,tsx,mdx}'],
- plugins: [require('@tailwindcss/typography'), require('@tailwindcss/aspect-ratio')],
-}
-
-export default config