diff --git a/packages/cli/package.json b/packages/cli/package.json index f243c65..94466b4 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -21,6 +21,14 @@ "devDependencies": { "@repo/typescript-config": "workspace:*", "@types/node": "^22.15.3", + "@types/prompts": "^2.4.9", "tsup": "^8.5.0" + }, + "dependencies": { + "commander": "^14.0.3", + "execa": "^9.6.1", + "kleur": "^4.1.5", + "prompts": "^2.4.2", + "zod": "^4.4.3" } } diff --git a/packages/cli/src/commands/add.ts b/packages/cli/src/commands/add.ts new file mode 100644 index 0000000..ba52972 --- /dev/null +++ b/packages/cli/src/commands/add.ts @@ -0,0 +1,79 @@ +import kleur from "kleur"; +import prompts from "prompts"; +import { fetchIndex } from "../registry/fetch.js"; +import { resolveItems } from "../registry/resolve.js"; +import { loadConfig } from "../utils/config.js"; +import { installDependencies } from "../utils/install-deps.js"; +import { writeItemFiles } from "../utils/write-files.js"; + +type AddOptions = { + cwd: string; + overwrite: boolean; + yes: boolean; + skipInstall: boolean; + registry?: string; +}; + +export async function runAdd(names: string[], options: AddOptions) { + const config = await loadConfig(options.cwd); + if (!config) { + console.error( + kleur.red("components.json not found. Run `modui init` first."), + ); + process.exit(1); + } + + const registry = options.registry ?? config.registry; + + let selected = names; + if (selected.length === 0) { + const index = await fetchIndex(registry); + const { picked } = await prompts({ + type: "multiselect", + name: "picked", + message: "Which components would you like to add?", + choices: index.components.map((c) => ({ title: c.name, value: c.name })), + hint: "Space to select. Enter to submit.", + instructions: false, + }); + if (!picked || picked.length === 0) { + console.log(kleur.yellow("No components selected.")); + return; + } + selected = picked; + } + + console.log(kleur.cyan(`\nResolving ${selected.join(", ")}...`)); + const items = await resolveItems(registry, selected); + + const npmDeps = new Set(); + for (const item of items) { + for (const dep of item.dependencies) npmDeps.add(dep); + } + + const resolvedNames = items.map((i) => i.name); + const extra = resolvedNames.filter((n) => !selected.includes(n)); + if (extra.length > 0) { + console.log( + kleur.gray(` including dependencies: ${extra.join(", ")}`), + ); + } + + console.log(kleur.cyan("\nWriting files...")); + await writeItemFiles(options.cwd, config, items, { + overwrite: options.overwrite, + yes: options.yes, + }); + + if (!options.skipInstall && npmDeps.size > 0) { + await installDependencies(options.cwd, [...npmDeps]); + } else if (npmDeps.size > 0) { + console.log( + kleur.yellow( + `\nSkipped install. Run manually: ${[...npmDeps].join(" ")}`, + ), + ); + } + + console.log(kleur.green("\nāœ“ Done.")); +} diff --git a/packages/cli/src/commands/init.ts b/packages/cli/src/commands/init.ts new file mode 100644 index 0000000..b52bf44 --- /dev/null +++ b/packages/cli/src/commands/init.ts @@ -0,0 +1,78 @@ +import { existsSync } from "node:fs"; +import kleur from "kleur"; +import prompts from "prompts"; +import { fetchTheme } from "../registry/fetch.js"; +import { + DEFAULT_CONFIG, + configPath, + loadConfig, + writeConfig, + type Config, +} from "../utils/config.js"; +import { writeItemFiles } from "../utils/write-files.js"; + +type InitOptions = { + cwd: string; + yes: boolean; + theme: string; + registry?: string; +}; + +export async function runInit(options: InitOptions) { + const existing = existsSync(configPath(options.cwd)) + ? await loadConfig(options.cwd) + : null; + + if (existing && !options.yes) { + const { proceed } = await prompts({ + type: "confirm", + name: "proceed", + message: "components.json already exists. Overwrite?", + initial: false, + }); + if (!proceed) { + console.log(kleur.yellow("Aborted.")); + return; + } + } + + let config: Config = existing ?? DEFAULT_CONFIG; + if (!options.yes) { + const answers = await prompts([ + { + type: "text", + name: "ui", + message: "Where should UI components be placed?", + initial: config.paths.ui, + }, + { + type: "text", + name: "themes", + message: "Where should theme files be placed?", + initial: config.paths.themes, + }, + ]); + if (answers.ui && answers.themes) { + config = { + ...config, + paths: { ui: answers.ui, themes: answers.themes }, + }; + } + } + + if (options.registry) { + config = { ...config, registry: options.registry }; + } + + await writeConfig(options.cwd, config); + console.log(kleur.green(`āœ“ Created components.json`)); + + console.log(kleur.cyan(`\nFetching theme "${options.theme}"...`)); + const theme = await fetchTheme(config.registry, options.theme); + await writeItemFiles(options.cwd, config, [theme], { + overwrite: options.yes, + yes: options.yes, + }); + + console.log(kleur.green("\nāœ“ Done. Try `modui add button`.")); +} diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index cce0db8..bb6bea1 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -1,16 +1,58 @@ +import { Command } from "commander"; +import kleur from "kleur"; import pkg from "../package.json" with { type: "json" }; +import { runAdd } from "./commands/add.js"; +import { runInit } from "./commands/init.js"; -const { version } = pkg; +const program = new Command(); -const args = process.argv.slice(2); +program + .name("modui") + .description("CSS Modules UI components for React. Copy, paste, customize.") + .version(pkg.version); -if (args.includes("--version") || args.includes("-v")) { - console.log(version); -} else { - console.log(`modui v${version}`); - console.log("CSS Modules UI components for React.\n"); - console.log("Usage:"); - console.log(" modui init Initialize modui in your project"); - console.log(" modui add Add a component"); - console.log(" modui --version Show version"); -} +program + .command("init") + .description("Initialize modui in your project") + .option("-y, --yes", "Skip prompts and use defaults", false) + .option("--theme ", "Theme to install", "default") + .option("--registry ", "Override registry URL") + .option("--cwd ", "Working directory", process.cwd()) + .action(async (opts) => { + try { + await runInit({ + cwd: opts.cwd, + yes: opts.yes, + theme: opts.theme, + registry: opts.registry, + }); + } catch (err) { + console.error(kleur.red(err instanceof Error ? err.message : String(err))); + process.exit(1); + } + }); + +program + .command("add [components...]") + .description("Add components to your project") + .option("-y, --yes", "Skip prompts", false) + .option("--overwrite", "Overwrite existing files without prompting", false) + .option("--skip-install", "Don't install npm dependencies", false) + .option("--registry ", "Override registry URL") + .option("--cwd ", "Working directory", process.cwd()) + .action(async (components: string[], opts) => { + try { + await runAdd(components, { + cwd: opts.cwd, + yes: opts.yes, + overwrite: opts.overwrite, + skipInstall: opts.skipInstall, + registry: opts.registry, + }); + } catch (err) { + console.error(kleur.red(err instanceof Error ? err.message : String(err))); + process.exit(1); + } + }); + +program.parseAsync(); diff --git a/packages/cli/src/registry/fetch.ts b/packages/cli/src/registry/fetch.ts new file mode 100644 index 0000000..242ebd4 --- /dev/null +++ b/packages/cli/src/registry/fetch.ts @@ -0,0 +1,59 @@ +import { readFile } from "node:fs/promises"; +import { fileURLToPath } from "node:url"; +import { + registryIndexSchema, + registryItemSchema, + type RegistryIndex, + type RegistryItem, +} from "./schema.js"; + +const cache = new Map(); + +async function fetchJson(url: string): Promise { + if (cache.has(url)) return cache.get(url); + + let raw: string; + if (url.startsWith("file://")) { + raw = await readFile(fileURLToPath(url), "utf8"); + } else if (url.startsWith("/") || url.match(/^[A-Za-z]:[\\/]/)) { + raw = await readFile(url, "utf8"); + } else { + const res = await fetch(url); + if (!res.ok) { + throw new Error(`Failed to fetch ${url}: ${res.status} ${res.statusText}`); + } + raw = await res.text(); + } + + const parsed = JSON.parse(raw); + cache.set(url, parsed); + return parsed; +} + +function joinUrl(base: string, path: string): string { + if (base.startsWith("http")) { + return `${base.replace(/\/$/, "")}/${path}`; + } + return `${base.replace(/\/$/, "")}/${path}`; +} + +export async function fetchIndex(registry: string): Promise { + const data = await fetchJson(joinUrl(registry, "index.json")); + return registryIndexSchema.parse(data); +} + +export async function fetchItem( + registry: string, + name: string, +): Promise { + const data = await fetchJson(joinUrl(registry, `${name}.json`)); + return registryItemSchema.parse(data); +} + +export async function fetchTheme( + registry: string, + name: string, +): Promise { + const data = await fetchJson(joinUrl(registry, `themes/${name}.json`)); + return registryItemSchema.parse(data); +} diff --git a/packages/cli/src/registry/resolve.ts b/packages/cli/src/registry/resolve.ts new file mode 100644 index 0000000..a53fed3 --- /dev/null +++ b/packages/cli/src/registry/resolve.ts @@ -0,0 +1,26 @@ +import { fetchItem } from "./fetch.js"; +import type { RegistryItem } from "./schema.js"; + +export async function resolveItems( + registry: string, + names: string[], +): Promise { + const visited = new Set(); + const collected: RegistryItem[] = []; + + async function visit(name: string) { + if (visited.has(name)) return; + visited.add(name); + const item = await fetchItem(registry, name); + for (const dep of item.registryDependencies) { + await visit(dep); + } + collected.push(item); + } + + for (const name of names) { + await visit(name); + } + + return collected; +} diff --git a/packages/cli/src/registry/schema.ts b/packages/cli/src/registry/schema.ts new file mode 100644 index 0000000..42d5b0a --- /dev/null +++ b/packages/cli/src/registry/schema.ts @@ -0,0 +1,33 @@ +import { z } from "zod"; + +export const registryFileSchema = z.object({ + path: z.string(), + content: z.string(), + type: z.enum(["component", "style", "theme"]), +}); + +export const registryItemSchema = z.object({ + name: z.string(), + description: z.string().optional(), + dependencies: z.array(z.string()).default([]), + registryDependencies: z.array(z.string()).default([]), + files: z.array(registryFileSchema), +}); + +export const registryIndexEntrySchema = z.object({ + name: z.string(), + description: z.string().optional(), + dependencies: z.array(z.string()).default([]), + registryDependencies: z.array(z.string()).default([]), +}); + +export const registryIndexSchema = z.object({ + version: z.string(), + components: z.array(registryIndexEntrySchema), + themes: z.array(z.string()), +}); + +export type RegistryFile = z.infer; +export type RegistryItem = z.infer; +export type RegistryIndex = z.infer; +export type RegistryIndexEntry = z.infer; diff --git a/packages/cli/src/utils/config.ts b/packages/cli/src/utils/config.ts new file mode 100644 index 0000000..9f82496 --- /dev/null +++ b/packages/cli/src/utils/config.ts @@ -0,0 +1,46 @@ +import { readFile, writeFile } from "node:fs/promises"; +import { existsSync } from "node:fs"; +import { join } from "node:path"; +import { z } from "zod"; + +export const configSchema = z.object({ + $schema: z.string().optional(), + registry: z.string(), + paths: z.object({ + ui: z.string(), + themes: z.string(), + }), +}); + +export type Config = z.infer; + +export const DEFAULT_CONFIG: Config = { + $schema: "https://modui.dev/schema.json", + registry: "https://mod-ui.github.io/modui/r", + paths: { + ui: "src/components/ui", + themes: "src/styles", + }, +}; + +export const CONFIG_FILENAME = "components.json"; + +export function configPath(cwd: string) { + return join(cwd, CONFIG_FILENAME); +} + +export async function loadConfig(cwd: string): Promise { + const path = configPath(cwd); + if (!existsSync(path)) return null; + const raw = await readFile(path, "utf8"); + const parsed = JSON.parse(raw); + return configSchema.parse(parsed); +} + +export async function writeConfig(cwd: string, config: Config) { + await writeFile( + configPath(cwd), + `${JSON.stringify(config, null, 2)}\n`, + "utf8", + ); +} diff --git a/packages/cli/src/utils/install-deps.ts b/packages/cli/src/utils/install-deps.ts new file mode 100644 index 0000000..0198ac2 --- /dev/null +++ b/packages/cli/src/utils/install-deps.ts @@ -0,0 +1,21 @@ +import { existsSync } from "node:fs"; +import { join } from "node:path"; +import { execa } from "execa"; +import kleur from "kleur"; + +type PackageManager = "pnpm" | "yarn" | "npm" | "bun"; + +function detectPackageManager(cwd: string): PackageManager { + if (existsSync(join(cwd, "pnpm-lock.yaml"))) return "pnpm"; + if (existsSync(join(cwd, "yarn.lock"))) return "yarn"; + if (existsSync(join(cwd, "bun.lockb"))) return "bun"; + return "npm"; +} + +export async function installDependencies(cwd: string, deps: string[]) { + if (deps.length === 0) return; + const pm = detectPackageManager(cwd); + const subcommand = pm === "npm" ? "install" : "add"; + console.log(kleur.cyan(`\nInstalling ${deps.length} dependency(ies) with ${pm}...`)); + await execa(pm, [subcommand, ...deps], { cwd, stdio: "inherit" }); +} diff --git a/packages/cli/src/utils/write-files.ts b/packages/cli/src/utils/write-files.ts new file mode 100644 index 0000000..59e1b76 --- /dev/null +++ b/packages/cli/src/utils/write-files.ts @@ -0,0 +1,64 @@ +import { existsSync } from "node:fs"; +import { mkdir, writeFile } from "node:fs/promises"; +import { dirname, join } from "node:path"; +import kleur from "kleur"; +import prompts from "prompts"; +import type { Config } from "./config.js"; +import type { RegistryFile, RegistryItem } from "../registry/schema.js"; + +function resolveTarget(cwd: string, config: Config, file: RegistryFile): string { + if (file.type === "theme") { + const filename = file.path.replace(/^themes\//, ""); + return join(cwd, config.paths.themes, filename); + } + const relative = file.path.replace(/^ui\//, ""); + return join(cwd, config.paths.ui, relative); +} + +type WriteOptions = { + overwrite: boolean; + yes: boolean; +}; + +export async function writeItemFiles( + cwd: string, + config: Config, + items: RegistryItem[], + options: WriteOptions, +): Promise<{ written: string[]; skipped: string[] }> { + const written: string[] = []; + const skipped: string[] = []; + + for (const item of items) { + for (const file of item.files) { + const target = resolveTarget(cwd, config, file); + const relTarget = target.replace(`${cwd}/`, ""); + + if (existsSync(target) && !options.overwrite) { + if (options.yes) { + skipped.push(relTarget); + console.log(kleur.gray(` skipped ${relTarget} (exists)`)); + continue; + } + const { confirm } = await prompts({ + type: "confirm", + name: "confirm", + message: `${relTarget} already exists. Overwrite?`, + initial: false, + }); + if (!confirm) { + skipped.push(relTarget); + console.log(kleur.gray(` skipped ${relTarget}`)); + continue; + } + } + + await mkdir(dirname(target), { recursive: true }); + await writeFile(target, file.content, "utf8"); + written.push(relTarget); + console.log(kleur.green(` added ${relTarget}`)); + } + } + + return { written, skipped }; +} diff --git a/packages/registry/package.json b/packages/registry/package.json index d33a608..4eeddcf 100644 --- a/packages/registry/package.json +++ b/packages/registry/package.json @@ -4,11 +4,14 @@ "private": true, "type": "module", "scripts": { + "build": "tsx scripts/build.ts", "check-types": "tsc --noEmit" }, "devDependencies": { "@repo/typescript-config": "workspace:*", + "@types/node": "^22.15.3", "@types/react": "^19.2.14", + "tsx": "^4.21.0", "typescript": "~5.9.3" } } diff --git a/packages/registry/scripts/build.ts b/packages/registry/scripts/build.ts new file mode 100644 index 0000000..0c0add0 --- /dev/null +++ b/packages/registry/scripts/build.ts @@ -0,0 +1,157 @@ +import { mkdir, readFile, readdir, rm, writeFile } from "node:fs/promises"; +import { basename, dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const SRC = join(__dirname, "..", "src"); +const OUT = join(__dirname, "..", "dist", "registry"); + +type FileType = "component" | "style" | "theme"; + +type RegistryFile = { + path: string; + content: string; + type: FileType; +}; + +type RegistryItem = { + name: string; + dependencies: string[]; + registryDependencies: string[]; + files: RegistryFile[]; +}; + +const PEER_DEPS = new Set(["react", "react-dom"]); + +const IMPORT_RE = /from\s+["']([^"']+)["']/g; + +function classifyFile(filename: string): FileType { + if (filename.endsWith(".module.css")) return "style"; + if (filename.endsWith(".css")) return "theme"; + return "component"; +} + +function extractDeps(source: string, currentComponent: string) { + const npm = new Set(); + const registry = new Set(); + for (const match of source.matchAll(IMPORT_RE)) { + const spec = match[1]; + if (spec.startsWith(".")) { + const m = spec.match(/^\.\.\/([^/]+)\//); + if (m && m[1] !== currentComponent) registry.add(m[1]); + continue; + } + if (spec.startsWith("@/") || spec.startsWith("~/")) continue; + const pkg = spec.startsWith("@") + ? spec.split("/").slice(0, 2).join("/") + : spec.split("/")[0]; + if (!PEER_DEPS.has(pkg)) npm.add(pkg); + } + return { + dependencies: [...npm].sort(), + registryDependencies: [...registry].sort(), + }; +} + +async function buildComponent(name: string): Promise { + const dir = join(SRC, "ui", name); + const filenames = await readdir(dir); + const files: RegistryFile[] = []; + const depsSet = new Set(); + const regDepsSet = new Set(); + + for (const filename of filenames) { + const filePath = join(dir, filename); + const content = await readFile(filePath, "utf8"); + const type = classifyFile(filename); + files.push({ + path: `ui/${name}/${filename}`, + content, + type, + }); + if (type === "component") { + const { dependencies, registryDependencies } = extractDeps(content, name); + for (const d of dependencies) depsSet.add(d); + for (const d of registryDependencies) regDepsSet.add(d); + } + } + + return { + name, + dependencies: [...depsSet].sort(), + registryDependencies: [...regDepsSet].sort(), + files, + }; +} + +async function buildTheme(filename: string): Promise { + const filePath = join(SRC, "themes", filename); + const content = await readFile(filePath, "utf8"); + const name = basename(filename, ".css"); + return { + name, + dependencies: [], + registryDependencies: [], + files: [ + { + path: `themes/${filename}`, + content, + type: "theme", + }, + ], + }; +} + +async function main() { + await rm(OUT, { recursive: true, force: true }); + await mkdir(join(OUT, "themes"), { recursive: true }); + + const componentNames = ( + await readdir(join(SRC, "ui"), { withFileTypes: true }) + ) + .filter((entry) => entry.isDirectory()) + .map((entry) => entry.name) + .sort(); + + const components: RegistryItem[] = []; + for (const name of componentNames) { + const item = await buildComponent(name); + components.push(item); + await writeFile( + join(OUT, `${name}.json`), + `${JSON.stringify(item, null, 2)}\n`, + ); + } + + const themeFiles = (await readdir(join(SRC, "themes"))).filter((f) => + f.endsWith(".css"), + ); + const themes: RegistryItem[] = []; + for (const filename of themeFiles) { + const theme = await buildTheme(filename); + themes.push(theme); + await writeFile( + join(OUT, "themes", `${theme.name}.json`), + `${JSON.stringify(theme, null, 2)}\n`, + ); + } + + const index = { + version: "0.0.1", + components: components.map(({ files: _files, ...rest }) => rest), + themes: themes.map((t) => t.name), + }; + await writeFile( + join(OUT, "index.json"), + `${JSON.stringify(index, null, 2)}\n`, + ); + + console.log( + `Built ${components.length} component(s) and ${themes.length} theme(s) → ${OUT}`, + ); +} + +main().catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ad20ec7..c34475a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,10 +38,10 @@ importers: version: 10.3.4(storybook@10.3.4(@testing-library/dom@10.4.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) '@storybook/addon-docs': specifier: ^10.3.4 - version: 10.3.4(@types/react@19.2.14)(esbuild@0.27.7)(rollup@4.60.1)(storybook@10.3.4(@testing-library/dom@10.4.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7)) + version: 10.3.4(@types/react@19.2.14)(esbuild@0.27.7)(rollup@4.60.1)(storybook@10.3.4(@testing-library/dom@10.4.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7)(tsx@4.21.0)) '@storybook/react-vite': specifier: ^10.3.4 - version: 10.3.4(esbuild@0.27.7)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.60.1)(storybook@10.3.4(@testing-library/dom@10.4.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7)) + version: 10.3.4(esbuild@0.27.7)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.60.1)(storybook@10.3.4(@testing-library/dom@10.4.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7)(tsx@4.21.0)) '@types/react': specifier: ^19.2.14 version: 19.2.14 @@ -50,7 +50,7 @@ importers: version: 19.2.3(@types/react@19.2.14) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7)) + version: 6.0.1(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7)(tsx@4.21.0)) storybook: specifier: ^10.3.4 version: 10.3.4(@testing-library/dom@10.4.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -59,9 +59,25 @@ importers: version: 5.9.3 vite: specifier: ^8.0.1 - version: 8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7) + version: 8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7)(tsx@4.21.0) packages/cli: + dependencies: + commander: + specifier: ^14.0.3 + version: 14.0.3 + execa: + specifier: ^9.6.1 + version: 9.6.1 + kleur: + specifier: ^4.1.5 + version: 4.1.5 + prompts: + specifier: ^2.4.2 + version: 2.4.2 + zod: + specifier: ^4.4.3 + version: 4.4.3 devDependencies: '@repo/typescript-config': specifier: workspace:* @@ -69,22 +85,27 @@ importers: '@types/node': specifier: ^22.15.3 version: 22.15.3 + '@types/prompts': + specifier: ^2.4.9 + version: 2.4.9 tsup: specifier: ^8.5.0 - version: 8.5.1(postcss@8.5.8)(typescript@5.9.3) + version: 8.5.1(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3) packages/registry: - dependencies: - react: - specifier: ^19.0.0 - version: 19.2.4 devDependencies: '@repo/typescript-config': specifier: workspace:* version: link:../typescript-config + '@types/node': + specifier: ^22.15.3 + version: 22.15.3 '@types/react': specifier: ^19.2.14 version: 19.2.14 + tsx: + specifier: ^4.21.0 + version: 4.21.0 typescript: specifier: ~5.9.3 version: 5.9.3 @@ -654,6 +675,13 @@ packages: cpu: [x64] os: [win32] + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + '@storybook/addon-a11y@10.3.4': resolution: {integrity: sha512-TylBS2+MUPRfgzBKiygL1JoUBnTqEKo5oCEfjHneJZKzYE1UNgdMdk/fiyanaGKTZBKBxWbShxZhT2gLs8kqMA==} peerDependencies: @@ -803,6 +831,9 @@ packages: '@types/node@22.15.3': resolution: {integrity: sha512-lX7HFZeHf4QG/J7tBZqrCAXwz9J5RD56Y6MpP0eJkka8p+K0RY/yBTW7CYFJ4VGCclxqOLKmiGP5juQc6MKgcw==} + '@types/prompts@2.4.9': + resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==} + '@types/react-dom@19.2.3': resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: @@ -924,6 +955,10 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} + engines: {node: '>=20'} + commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -938,6 +973,10 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} @@ -1015,6 +1054,10 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + execa@9.6.1: + resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} + engines: {node: ^18.19.0 || >=20.5.0} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -1024,6 +1067,10 @@ packages: picomatch: optional: true + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + fix-dts-default-cjs-exports@1.0.1: resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} @@ -1039,6 +1086,13 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + + get-tsconfig@4.14.0: + resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} + glob@13.0.6: resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} engines: {node: 18 || 20 || >=22} @@ -1047,6 +1101,10 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} + indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} @@ -1065,10 +1123,25 @@ packages: engines: {node: '>=14.16'} hasBin: true + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + is-wsl@3.1.1: resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} engines: {node: '>=16'} + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} @@ -1086,6 +1159,14 @@ packages: engines: {node: '>=6'} hasBin: true + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + lightningcss-android-arm64@1.32.0: resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} @@ -1216,6 +1297,10 @@ packages: node-releases@2.0.37: resolution: {integrity: sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==} + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -1224,6 +1309,18 @@ packages: resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} engines: {node: '>=18'} + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -1278,6 +1375,14 @@ packages: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} + engines: {node: '>=18'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + react-docgen-typescript@2.4.0: resolution: {integrity: sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg==} peerDependencies: @@ -1315,6 +1420,9 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve@1.22.11: resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} engines: {node: '>= 0.4'} @@ -1346,6 +1454,21 @@ packages: engines: {node: '>=10'} hasBin: true + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -1371,6 +1494,10 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -1450,6 +1577,11 @@ packages: typescript: optional: true + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + turbo@2.9.3: resolution: {integrity: sha512-J/VUvsGRykPb9R8Kh8dHVBOqioDexLk9BhLCU/ZybRR+HN9UR3cURdazFvNgMDt9zPP8TF6K73Z+tplfmi0PqQ==} hasBin: true @@ -1469,6 +1601,10 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + unplugin@2.3.11: resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} engines: {node: '>=18.12.0'} @@ -1530,6 +1666,11 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + ws@8.20.0: resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} engines: {node: '>=10.0.0'} @@ -1549,6 +1690,13 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + snapshots: '@adobe/css-tools@4.4.4': {} @@ -1784,11 +1932,11 @@ snapshots: '@esbuild/win32-x64@0.27.7': optional: true - '@joshwooding/vite-plugin-react-docgen-typescript@0.7.0(typescript@5.9.3)(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.7.0(typescript@5.9.3)(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7)(tsx@4.21.0))': dependencies: glob: 13.0.6 react-docgen-typescript: 2.4.0(typescript@5.9.3) - vite: 8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7) + vite: 8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7)(tsx@4.21.0) optionalDependencies: typescript: 5.9.3 @@ -1963,16 +2111,20 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.60.1': optional: true + '@sec-ant/readable-stream@0.4.1': {} + + '@sindresorhus/merge-streams@4.0.0': {} + '@storybook/addon-a11y@10.3.4(storybook@10.3.4(@testing-library/dom@10.4.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': dependencies: '@storybook/global': 5.0.0 axe-core: 4.11.2 storybook: 10.3.4(@testing-library/dom@10.4.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@storybook/addon-docs@10.3.4(@types/react@19.2.14)(esbuild@0.27.7)(rollup@4.60.1)(storybook@10.3.4(@testing-library/dom@10.4.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7))': + '@storybook/addon-docs@10.3.4(@types/react@19.2.14)(esbuild@0.27.7)(rollup@4.60.1)(storybook@10.3.4(@testing-library/dom@10.4.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7)(tsx@4.21.0))': dependencies: '@mdx-js/react': 3.1.1(@types/react@19.2.14)(react@19.2.4) - '@storybook/csf-plugin': 10.3.4(esbuild@0.27.7)(rollup@4.60.1)(storybook@10.3.4(@testing-library/dom@10.4.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7)) + '@storybook/csf-plugin': 10.3.4(esbuild@0.27.7)(rollup@4.60.1)(storybook@10.3.4(@testing-library/dom@10.4.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7)(tsx@4.21.0)) '@storybook/icons': 2.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@storybook/react-dom-shim': 10.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.3.4(@testing-library/dom@10.4.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) react: 19.2.4 @@ -1986,25 +2138,25 @@ snapshots: - vite - webpack - '@storybook/builder-vite@10.3.4(esbuild@0.27.7)(rollup@4.60.1)(storybook@10.3.4(@testing-library/dom@10.4.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7))': + '@storybook/builder-vite@10.3.4(esbuild@0.27.7)(rollup@4.60.1)(storybook@10.3.4(@testing-library/dom@10.4.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7)(tsx@4.21.0))': dependencies: - '@storybook/csf-plugin': 10.3.4(esbuild@0.27.7)(rollup@4.60.1)(storybook@10.3.4(@testing-library/dom@10.4.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7)) + '@storybook/csf-plugin': 10.3.4(esbuild@0.27.7)(rollup@4.60.1)(storybook@10.3.4(@testing-library/dom@10.4.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7)(tsx@4.21.0)) storybook: 10.3.4(@testing-library/dom@10.4.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) ts-dedent: 2.2.0 - vite: 8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7) + vite: 8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7)(tsx@4.21.0) transitivePeerDependencies: - esbuild - rollup - webpack - '@storybook/csf-plugin@10.3.4(esbuild@0.27.7)(rollup@4.60.1)(storybook@10.3.4(@testing-library/dom@10.4.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7))': + '@storybook/csf-plugin@10.3.4(esbuild@0.27.7)(rollup@4.60.1)(storybook@10.3.4(@testing-library/dom@10.4.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7)(tsx@4.21.0))': dependencies: storybook: 10.3.4(@testing-library/dom@10.4.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) unplugin: 2.3.11 optionalDependencies: esbuild: 0.27.7 rollup: 4.60.1 - vite: 8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7) + vite: 8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7)(tsx@4.21.0) '@storybook/global@5.0.0': {} @@ -2019,11 +2171,11 @@ snapshots: react-dom: 19.2.4(react@19.2.4) storybook: 10.3.4(@testing-library/dom@10.4.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@storybook/react-vite@10.3.4(esbuild@0.27.7)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.60.1)(storybook@10.3.4(@testing-library/dom@10.4.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7))': + '@storybook/react-vite@10.3.4(esbuild@0.27.7)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.60.1)(storybook@10.3.4(@testing-library/dom@10.4.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7)(tsx@4.21.0))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.7.0(typescript@5.9.3)(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.7.0(typescript@5.9.3)(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7)(tsx@4.21.0)) '@rollup/pluginutils': 5.3.0(rollup@4.60.1) - '@storybook/builder-vite': 10.3.4(esbuild@0.27.7)(rollup@4.60.1)(storybook@10.3.4(@testing-library/dom@10.4.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7)) + '@storybook/builder-vite': 10.3.4(esbuild@0.27.7)(rollup@4.60.1)(storybook@10.3.4(@testing-library/dom@10.4.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7)(tsx@4.21.0)) '@storybook/react': 10.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.3.4(@testing-library/dom@10.4.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) empathic: 2.0.0 magic-string: 0.30.21 @@ -2033,7 +2185,7 @@ snapshots: resolve: 1.22.11 storybook: 10.3.4(@testing-library/dom@10.4.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) tsconfig-paths: 4.2.0 - vite: 8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7) + vite: 8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7)(tsx@4.21.0) transitivePeerDependencies: - esbuild - rollup @@ -2142,6 +2294,11 @@ snapshots: dependencies: undici-types: 6.21.0 + '@types/prompts@2.4.9': + dependencies: + '@types/node': 22.15.3 + kleur: 3.0.3 + '@types/react-dom@19.2.3(@types/react@19.2.14)': dependencies: '@types/react': 19.2.14 @@ -2152,10 +2309,10 @@ snapshots: '@types/resolve@1.20.6': {} - '@vitejs/plugin-react@6.0.1(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7))': + '@vitejs/plugin-react@6.0.1(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7)(tsx@4.21.0))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.7 - vite: 8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7) + vite: 8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7)(tsx@4.21.0) '@vitest/expect@3.2.4': dependencies: @@ -2246,6 +2403,8 @@ snapshots: dependencies: readdirp: 4.1.2 + commander@14.0.3: {} + commander@4.1.1: {} confbox@0.1.8: {} @@ -2254,6 +2413,12 @@ snapshots: convert-source-map@2.0.0: {} + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + css.escape@1.5.1: {} csstype@3.2.3: {} @@ -2326,10 +2491,29 @@ snapshots: esutils@2.0.3: {} + execa@9.6.1: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.3.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.2 + fdir@6.5.0(picomatch@4.0.4): optionalDependencies: picomatch: 4.0.4 + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + fix-dts-default-cjs-exports@1.0.1: dependencies: magic-string: 0.30.21 @@ -2343,6 +2527,15 @@ snapshots: gensync@1.0.0-beta.2: {} + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + + get-tsconfig@4.14.0: + dependencies: + resolve-pkg-maps: 1.0.0 + glob@13.0.6: dependencies: minimatch: 10.2.5 @@ -2353,6 +2546,8 @@ snapshots: dependencies: function-bind: 1.1.2 + human-signals@8.0.1: {} + indent-string@4.0.0: {} is-core-module@2.16.1: @@ -2365,10 +2560,18 @@ snapshots: dependencies: is-docker: 3.0.0 + is-plain-obj@4.1.0: {} + + is-stream@4.0.1: {} + + is-unicode-supported@2.1.0: {} + is-wsl@3.1.1: dependencies: is-inside-container: 1.0.0 + isexe@2.0.0: {} + joycon@3.1.1: {} js-tokens@4.0.0: {} @@ -2377,6 +2580,10 @@ snapshots: json5@2.2.3: {} + kleur@3.0.3: {} + + kleur@4.1.5: {} + lightningcss-android-arm64@1.32.0: optional: true @@ -2475,6 +2682,11 @@ snapshots: node-releases@2.0.37: {} + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + object-assign@4.1.1: {} open@10.2.0: @@ -2484,6 +2696,12 @@ snapshots: is-inside-container: 1.0.0 wsl-utils: 0.1.0 + parse-ms@4.0.0: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + path-parse@1.0.7: {} path-scurry@2.0.2: @@ -2507,11 +2725,12 @@ snapshots: mlly: 1.8.2 pathe: 2.0.3 - postcss-load-config@6.0.1(postcss@8.5.8): + postcss-load-config@6.0.1(postcss@8.5.8)(tsx@4.21.0): dependencies: lilconfig: 3.1.3 optionalDependencies: postcss: 8.5.8 + tsx: 4.21.0 postcss@8.5.8: dependencies: @@ -2525,6 +2744,15 @@ snapshots: ansi-styles: 5.2.0 react-is: 17.0.2 + pretty-ms@9.3.0: + dependencies: + parse-ms: 4.0.0 + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + react-docgen-typescript@2.4.0(typescript@5.9.3): dependencies: typescript: 5.9.3 @@ -2570,6 +2798,8 @@ snapshots: resolve-from@5.0.0: {} + resolve-pkg-maps@1.0.0: {} + resolve@1.22.11: dependencies: is-core-module: 2.16.1 @@ -2639,6 +2869,16 @@ snapshots: semver@7.7.4: {} + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + sisteransi@1.0.5: {} + source-map-js@1.2.1: {} source-map@0.6.1: {} @@ -2669,6 +2909,8 @@ snapshots: strip-bom@3.0.0: {} + strip-final-newline@4.0.0: {} + strip-indent@3.0.0: dependencies: min-indent: 1.0.1 @@ -2722,7 +2964,7 @@ snapshots: tslib@2.8.1: {} - tsup@8.5.1(postcss@8.5.8)(typescript@5.9.3): + tsup@8.5.1(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3): dependencies: bundle-require: 5.1.0(esbuild@0.27.7) cac: 6.7.14 @@ -2733,7 +2975,7 @@ snapshots: fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(postcss@8.5.8) + postcss-load-config: 6.0.1(postcss@8.5.8)(tsx@4.21.0) resolve-from: 5.0.0 rollup: 4.60.1 source-map: 0.7.6 @@ -2750,6 +2992,13 @@ snapshots: - tsx - yaml + tsx@4.21.0: + dependencies: + esbuild: 0.27.7 + get-tsconfig: 4.14.0 + optionalDependencies: + fsevents: 2.3.3 + turbo@2.9.3: optionalDependencies: '@turbo/darwin-64': 2.9.3 @@ -2767,6 +3016,8 @@ snapshots: undici-types@6.21.0: {} + unicorn-magic@0.3.0: {} + unplugin@2.3.11: dependencies: '@jridgewell/remapping': 2.3.5 @@ -2784,7 +3035,7 @@ snapshots: dependencies: react: 19.2.4 - vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7): + vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@22.15.3)(esbuild@0.27.7)(tsx@4.21.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -2795,12 +3046,17 @@ snapshots: '@types/node': 22.15.3 esbuild: 0.27.7 fsevents: 2.3.3 + tsx: 4.21.0 transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' webpack-virtual-modules@0.6.2: {} + which@2.0.2: + dependencies: + isexe: 2.0.0 + ws@8.20.0: {} wsl-utils@0.1.0: @@ -2808,3 +3064,7 @@ snapshots: is-wsl: 3.1.1 yallist@3.1.1: {} + + yoctocolors@2.1.2: {} + + zod@4.4.3: {}