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