diff --git a/.changeset/rjsf-6-peer-range-and-theme-prop.md b/.changeset/rjsf-6-peer-range-and-theme-prop.md new file mode 100644 index 0000000..2640a6c --- /dev/null +++ b/.changeset/rjsf-6-peer-range-and-theme-prop.md @@ -0,0 +1,38 @@ +--- +'acture-forms-rjsf': minor +--- + +Accept `@rjsf` 6.x, and make the RJSF theme injectable. + +The `@rjsf/core` / `@rjsf/utils` / `@rjsf/validator-ajv8` peer ranges move from +`^5.20.0` to `^5.20.0 || ^6.0.0`. `@rjsf/shadcn` is published on the 6.x line +only, so the old range made the shadcn theme — the one every frontend in this +ecosystem wants — impossible to install alongside this adapter. The failure was +an npm peer conflict at install time, i.e. before a line of form code got +written. No adapter code was needed to span the two majors: `@rjsf/core`'s +default export and `FormProps`, `@rjsf/validator-ajv8`'s default export, and the +`schema` / `formData` / `validator` / `liveValidate` / `onSubmit` / children +props are shape-identical on both. + +`` gains an optional **`form`** prop taking any RJSF theme's +`
` (`ComponentType` — the type every theme's default export +already has), defaulting to the unstyled `@rjsf/core` form: + +```tsx +import ShadcnForm from '@rjsf/shadcn'; +; +``` + +Before this, the README told you to "pass your own `Form` from the themed +package" and there was no prop that accepted one. acture still bundles no UI kit +(hard-don't #8) — the theme is the host's, injected. + +Both halves of the widened range are checked on every PR: the main CI job +installs and tests 6.x, and a second job installs its own plain 5.x tree and +typechecks + tests the adapter against it. + +The `form` value must be referentially stable (bind a theme at module level) — +React reconciles by element type, so an inline `withTheme(...)` remounts the +form and discards in-progress input. Documented on the prop and in the README. + +Also exported: the `RjsfFormComponent` type. diff --git a/.claude/skills/acture-palette-design/SKILL.md b/.claude/skills/acture-palette-design/SKILL.md index f083841..7306372 100644 --- a/.claude/skills/acture-palette-design/SKILL.md +++ b/.claude/skills/acture-palette-design/SKILL.md @@ -78,6 +78,23 @@ function deriveKind(record: CommandRecord): "atomic" | "handoff" { - **autoform** — Zod-native; lighter; fits the recommended Zod-first authoring path. - **rjsf** — JSON-Schema-native; battle-tested; larger bundle but more themes. +`RjsfForm` takes the theme as an optional **`form`** prop — any RJSF theme's +default export (`ComponentType`), defaulting to the unstyled +`@rjsf/core` one. That is hard-don't #8's slot API, not a bundled UI kit: bind +the theme once at the call site to get a `PaletteFormAdapter`. + +```tsx +import ShadcnForm from '@rjsf/shadcn'; +const ShadcnRjsfForm: PaletteFormAdapter = (p) => ; +``` + +Bind the theme at **module level** — React reconciles by element type, so an +inline `withTheme(...)` remounts the form and wipes what the user typed. + +Peer range is `@rjsf` `^5.20.0 || ^6.0.0`, and CI installs and tests both majors +(the `rjsf5` job runs a second, plain 5.x install). **Prefer 6.x** — +`@rjsf/shadcn` is published on the 6.x line only. + Acture's core does not bundle a form library. Per redesign-takeaways §2.3. ## The don't-do list (research-2 §9.5) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index afa8473..da50999 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -42,3 +42,50 @@ jobs: run: | ls -la /tmp/acture-*.tgz tar -tzf /tmp/acture-*.tgz + + # The published `acture-forms-rjsf` peer range is `^5.20.0 || ^6.0.0`. The job + # above installs and tests the 6.x half; this one installs and tests the 5.x + # half, so both ends of the promise are checked on every PR. + # + # It is a second INSTALL, not a second alias tree in one install — which is the + # only thing pnpm's peers-are-matched-by-name behaviour actually rules out. + # `scripts/pin-rjsf-5x.mjs` rewrites the three `@rjsf` devDependencies to the + # 5.x clause READ OFF the declared peer range, drops the 6.x-only + # `@rjsf/shadcn` and its smoke test, and no-ops if the range ever narrows to + # 6-only. Without this job a value that is legal on 6.x but not on 5.x — e.g. + # `liveValidate="onChange"`, widened in 6.x — ships green. + rjsf5: + name: forms-rjsf against @rjsf 5.x + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v4 + with: + version: 10 + + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: pnpm + + - name: Pin the forms-rjsf dev tree to the 5.x half of its peer range + run: node scripts/pin-rjsf-5x.mjs + + # The lockfile describes the 6.x tree, so this install deliberately + # resolves fresh. Nothing is committed from this job. + - name: Install + run: pnpm install --no-frozen-lockfile + + - name: Assert a real 5.x tree resolved + run: node scripts/pin-rjsf-5x.mjs --verify + + # forms-rjsf consumes `acture` types out of its dist/. + - name: Build acture + run: pnpm --filter acture build + + - name: Typecheck forms-rjsf against 5.x + run: pnpm --filter acture-forms-rjsf typecheck + + - name: Test forms-rjsf against 5.x + run: pnpm --filter acture-forms-rjsf test diff --git a/packages/forms-rjsf/README.md b/packages/forms-rjsf/README.md index 3d36a1a..92a2131 100644 --- a/packages/forms-rjsf/README.md +++ b/packages/forms-rjsf/README.md @@ -17,6 +17,13 @@ For Zod-first authoring with a leaner runtime, prefer [`acture-forms-autoform`]( pnpm add acture-forms-rjsf @rjsf/core @rjsf/utils @rjsf/validator-ajv8 react ``` +Peers on `@rjsf` **`^5.20.0 || ^6.0.0`**. Every API this adapter touches is +shape-identical across the two majors, so the same code serves both, and **both +halves run in CI**: the main job installs and tests 6.x, and a second job +(`rjsf5`) installs its own plain 5.x tree and typechecks + tests the adapter +against it. **Prefer 6.x** — `@rjsf/shadcn`, the theme most hosts want, is +published on the 6.x line only, so the shadcn smoke test is 6.x-only. + ## Use as a palette form adapter ```tsx @@ -28,7 +35,38 @@ import { RjsfForm } from 'acture-forms-rjsf'; ## Theming -The default render is rjsf's bare bones. To use a theme, wrap `RjsfForm` and pass your own `Form` from the themed package (`@rjsf/mui`, `@rjsf/chakra-ui`, etc.). The acture-side bridge is identical. +The default render is rjsf's bare bones. Pass any RJSF theme's `` via the +`form` prop — acture never bundles a UI kit, so the design system is your choice: + +```tsx +import ShadcnForm from '@rjsf/shadcn'; +import { RjsfForm } from 'acture-forms-rjsf'; + +; +``` + +To hand a themed form to the palette, bind the theme once: + +```tsx +import type { PaletteFormAdapter } from 'acture-palette-react'; + +const ShadcnRjsfForm: PaletteFormAdapter = (props) => ( + +); + +; +``` + +Every RJSF theme's default export has the same type (`ComponentType`), +so `@rjsf/mui`, `@rjsf/chakra-ui`, `@rjsf/antd`, … all drop in the same way. The +acture-side bridge is identical. + +> **Keep the `form` value referentially stable.** React reconciles by element +> type, so building the theme inline — `form={withTheme(myTheme)}` in JSX, or an +> un-hoisted adapter arrow — yields a new component type on every render: the +> form remounts and whatever the user had typed is silently reset to `defaults`. +> Both snippets above are safe because `ShadcnForm` and `ShadcnRjsfForm` are +> module-level bindings. Hoist yours the same way. ## See also diff --git a/packages/forms-rjsf/package.json b/packages/forms-rjsf/package.json index bae1ed8..8474774 100644 --- a/packages/forms-rjsf/package.json +++ b/packages/forms-rjsf/package.json @@ -1,7 +1,7 @@ { "name": "acture-forms-rjsf", "version": "1.0.0", - "description": "JSON-Schema-native form adapter for acture-palette-react built on react-jsonschema-form (@rjsf/core).", + "description": "JSON-Schema-native form adapter for acture-palette-react built on react-jsonschema-form (@rjsf/core 5.x or 6.x), with a pluggable theme.", "license": "Apache-2.0", "author": "Thor Whalen", "repository": { @@ -36,16 +36,17 @@ "clean": "rm -rf dist *.tsbuildinfo" }, "peerDependencies": { - "@rjsf/core": "^5.20.0", - "@rjsf/utils": "^5.20.0", - "@rjsf/validator-ajv8": "^5.20.0", + "@rjsf/core": "^5.20.0 || ^6.0.0", + "@rjsf/utils": "^5.20.0 || ^6.0.0", + "@rjsf/validator-ajv8": "^5.20.0 || ^6.0.0", "acture": "^1.0.0", "react": "^18.0.0 || ^19.0.0" }, "devDependencies": { - "@rjsf/core": "^5.24.0", - "@rjsf/utils": "^5.24.0", - "@rjsf/validator-ajv8": "^5.24.0", + "@rjsf/core": "^6.8.0", + "@rjsf/shadcn": "^6.8.0", + "@rjsf/utils": "^6.8.0", + "@rjsf/validator-ajv8": "^6.8.0", "@testing-library/react": "^16.1.0", "@types/react": "^19.0.0", "@vitejs/plugin-react": "^4.3.4", diff --git a/packages/forms-rjsf/src/index.ts b/packages/forms-rjsf/src/index.ts index 8fcc093..ad8a7da 100644 --- a/packages/forms-rjsf/src/index.ts +++ b/packages/forms-rjsf/src/index.ts @@ -10,7 +10,12 @@ * * For Zod-first authoring with a leaner runtime, prefer * [`acture-forms-autoform`](../forms-autoform). + * + * Peers on `@rjsf` `^5.20.0 || ^6.0.0`; prefer **6.x**, which is what CI tests + * and the only line `@rjsf/shadcn` is published on. The `form` prop takes any + * RJSF theme's `` — `@rjsf/shadcn`, `@rjsf/mui`, … — so the host picks + * the UI kit and this package never bundles one. */ export { RjsfForm } from './rjsf-form.js'; -export type { RjsfFormProps } from './rjsf-form.js'; +export type { RjsfFormProps, RjsfFormComponent } from './rjsf-form.js'; diff --git a/packages/forms-rjsf/src/rjsf-form.test.tsx b/packages/forms-rjsf/src/rjsf-form.test.tsx index 1fc68c0..4722722 100644 --- a/packages/forms-rjsf/src/rjsf-form.test.tsx +++ b/packages/forms-rjsf/src/rjsf-form.test.tsx @@ -55,4 +55,18 @@ describe('', () => { fireEvent.keyDown(container.querySelector('[data-acture-rjsf]')!, { key: 'Escape' }); expect(onCancel).toHaveBeenCalled(); }); + + it('falls back to the @rjsf/core form when no theme is injected', () => { + const cmd = defineCommand({ + id: 'app.t.add', + title: 'Add', + params: z.object({ label: z.string() }), + execute: (p) => ok(p), + }); + const { container } = render( + {}} onCancel={() => {}} />, + ); + // `form-control` is the @rjsf/core BaseInputTemplate's class. + expect(container.querySelector('input.form-control')).toBeTruthy(); + }); }); diff --git a/packages/forms-rjsf/src/rjsf-form.tsx b/packages/forms-rjsf/src/rjsf-form.tsx index c70c84e..437fcdc 100644 --- a/packages/forms-rjsf/src/rjsf-form.tsx +++ b/packages/forms-rjsf/src/rjsf-form.tsx @@ -2,30 +2,67 @@ * `` — render a CommandRecord's params schema using * react-jsonschema-form. Matches the `PaletteFormAdapter` shape * expected by `acture-palette-react`. + * + * The `` implementation is injectable (`form` prop) so the host can + * render through any RJSF theme — `@rjsf/shadcn`, `@rjsf/mui`, … — without + * this package ever depending on a UI kit. */ /// import { useMemo } from 'react'; +import type { ComponentType } from 'react'; import Form from '@rjsf/core'; +import type { FormProps } from '@rjsf/core'; import validator from '@rjsf/validator-ajv8'; import type { AnyCommandRecord } from 'acture'; import { toJsonSchema } from 'acture'; +/** + * The shape of an RJSF ``. Every RJSF theme's default export has + * exactly this type (`ComponentType>`), so a + * theme can be handed to {@link RjsfForm} as-is. + */ +export type RjsfFormComponent = ComponentType; + export interface RjsfFormProps { command: AnyCommandRecord; defaults?: Record; onSubmit: (params: unknown) => void; onCancel: () => void; + /** + * The RJSF `` to render with. Defaults to the unstyled form from + * `@rjsf/core`. Pass a theme's default export — e.g. `@rjsf/shadcn` — to + * render through a design system: + * + * ```tsx + * import ShadcnForm from '@rjsf/shadcn'; + * + * ``` + * + * acture never bundles a UI kit; the theme is the host's choice. + * + * **Must be referentially stable.** React reconciles by element *type*, so a + * theme built inline in JSX (`form={withTheme(myTheme)}`) is a new component + * type on every render of the parent: the form unmounts and remounts, and + * RJSF's internal `formData` — whatever the user had typed — is discarded and + * reset to `defaults`. Memoizing inside this component cannot fix that, since + * the changed identity arrives as the prop. Import a theme's default export + * (which is module-level, hence stable), or hoist your `withTheme(...)` call + * to a module-level `const`. + */ + form?: RjsfFormComponent; } export function RjsfForm(props: RjsfFormProps): React.ReactElement { - const { command, defaults, onSubmit, onCancel } = props; + const { command, defaults, onSubmit, onCancel, form } = props; const inputSchema = useMemo(() => { return toJsonSchema(command).inputSchema; }, [command]); + const FormImpl: RjsfFormComponent = form ?? Form; + return (
) : null} -
- +
Esc to cancel
); diff --git a/packages/forms-rjsf/src/shadcn-theme.test.tsx b/packages/forms-rjsf/src/shadcn-theme.test.tsx new file mode 100644 index 0000000..fc0903d --- /dev/null +++ b/packages/forms-rjsf/src/shadcn-theme.test.tsx @@ -0,0 +1,201 @@ +/** + * The `@rjsf` 6.x / `@rjsf/shadcn` pairing — the reason this package's peer + * range moved (thorwhalen/acture#57). `@rjsf/shadcn` is published on the 6.x + * line only, so a consumer on a shadcn design system needs both halves to be + * installable together, and needs a way to hand the theme to ``. + * + * Kept apart from `rjsf-form.test.tsx` on purpose: that file must stay runnable + * against a plain 5.x tree (the `rjsf5` CI job installs one), and importing + * `@rjsf/shadcn` would make it un-collectable there. + */ + +/// +import { describe, it, expect, vi, afterEach } from 'vitest'; +import { readFileSync, readdirSync, existsSync } from 'node:fs'; +import { resolve } from 'node:path'; +import { render, fireEvent, cleanup, act } from '@testing-library/react'; +import { z } from 'zod'; +import { defineCommand, ok } from 'acture'; +import ShadcnForm from '@rjsf/shadcn'; +import { RjsfForm } from './rjsf-form.js'; + +/** The single range every `@rjsf/*` peer is declared at. */ +const SUPPORTED_RJSF_RANGE = '^5.20.0 || ^6.0.0'; + +/** vitest runs each workspace package with its own directory as cwd, and under + * the jsdom environment `import.meta.url` is not a `file:` URL. */ +const readJson = (path: string) => JSON.parse(readFileSync(path, 'utf8')); + +/** An INSTALLED dependency's manifest. The `@rjsf/*` packages do not list + * `./package.json` in their `exports` map, so read it off disk. */ +const installedManifest = ( + name: string, +): { version: string; peerDependencies: Record } => + readJson(resolve(process.cwd(), 'node_modules', name, 'package.json')); + +const majorOf = (versionOrRange: string) => versionOrRange.replace(/^[\^~>=\s]+/, '').split('.')[0]!; + +const ownManifest = () => + readJson(resolve(process.cwd(), 'package.json')) as { + dependencies?: Record; + devDependencies: Record; + peerDependencies: Record; + }; + +/** + * Assert the rendered input came from the INJECTED theme and not from + * `@rjsf/core`'s default. `form-control` is the class `@rjsf/core`'s + * `BaseInputTemplate` emits and no themed template does — a discriminator that + * survives Tailwind class churn, which is why it lives here rather than being + * spelled out per test. + */ +const expectThemedInput = (input: HTMLInputElement) => { + expect(input).toBeTruthy(); + expect(input.className).not.toBe('form-control'); + expect(input.className).not.toContain('form-control'); +}; + +afterEach(() => cleanup()); + +describe('@rjsf/shadcn as an injected theme', () => { + const cmd = () => + defineCommand({ + id: 'app.t.add', + title: 'Add via shadcn', + params: z.object({ label: z.string() }), + execute: (p) => ok(p), + }); + + it('renders the shadcn theme rather than the @rjsf/core default', () => { + const { container } = render( + {}} onCancel={() => {}} />, + ); + const input = container.querySelector('input[type="text"]') as HTMLInputElement; + expectThemedInput(input); + // shadcn's input template emits Tailwind utility classes. + expect(input.className).toContain('rounded-md'); + }); + + it('submits through the theme', async () => { + const onSubmit = vi.fn(); + const { container } = render( + {}} />, + ); + const input = container.querySelector('input[type="text"]') as HTMLInputElement; + // Without this the test passes on an adapter that ignores `form` entirely — + // @rjsf/core's own form submits identically, so submission alone does not + // distinguish the injected theme from the default. + expectThemedInput(input); + await act(async () => { + fireEvent.change(input, { target: { value: 'A' } }); + fireEvent.submit(container.querySelector('form')!); + }); + expect(onSubmit).toHaveBeenCalled(); + expect((onSubmit.mock.calls[0]![0] as { label: string }).label).toBe('A'); + }); +}); + +/** + * The defect behind #57 was a DECLARED peer range that had drifted from what + * the package is actually written and tested against. These pin the two + * together, so moving either is a deliberate act. + * + * Both halves of the range are exercised: 6.x by this dev tree and the `ci` + * job, 5.x by the `rjsf5` job, which runs `scripts/pin-rjsf-5x.mjs` and then + * installs a plain 5.x tree of its own. That is a second *install*; what pnpm's + * peers-are-matched-by-name behaviour rules out is a second *alias tree inside + * one install*, where an `npm:`-aliased 5.x `@rjsf/core` still binds the 6.x + * `@rjsf/utils` and the "5.x matrix" is 6.x wearing a 5.x label. + */ +describe('declared @rjsf peer range', () => { + const pkg = ownManifest(); + const declaredMajors = SUPPORTED_RJSF_RANGE.split('||').map((r) => majorOf(r.trim())); + + it.each(['@rjsf/core', '@rjsf/utils', '@rjsf/validator-ajv8'])( + 'declares %s at the one supported range', + (name) => { + expect(pkg.peerDependencies[name]).toBe(SUPPORTED_RJSF_RANGE); + }, + ); + + it('names the major the dev tree actually installs', () => { + expect(declaredMajors).toContain(majorOf(installedManifest('@rjsf/core').version)); + }); + + it('names the major @rjsf/shadcn peers on — the whole point of the widening', () => { + expect(declaredMajors).toContain( + majorOf(installedManifest('@rjsf/shadcn').peerDependencies['@rjsf/core']!), + ); + }); +}); + +/** + * Hard-don't #8 (AGENTS.md merge checklist): **no bundling a UI kit.** The + * `form` prop is the slot API that keeps that true, and `@rjsf/shadcn` is here + * for the smoke test above and nothing else. Promoting it to `dependencies` or + * `peerDependencies` — the obvious "make the theme just work for consumers" + * edit — would pull radix + lucide-react + tailwind-merge + tailwindcss-animate + * into every consumer's install, and every other test in this package would + * stay green while it happened. + */ +describe('no UI kit reaches consumers', () => { + const pkg = ownManifest(); + + it.each(['dependencies', 'peerDependencies'] as const)( + '@rjsf/shadcn is not in %s', + (field) => { + expect(pkg[field]?.['@rjsf/shadcn']).toBeUndefined(); + }, + ); + + it('@rjsf/shadcn is a devDependency, so the smoke test above is real', () => { + expect(pkg.devDependencies['@rjsf/shadcn']).toBeTruthy(); + }); + + it('declares no runtime dependencies at all — everything is peered or injected', () => { + expect(Object.keys(pkg.dependencies ?? {})).toEqual([]); + }); +}); + +/** + * `pnpm-workspace.yaml` suppresses the missing-`tailwindcss` peer report, which + * `@rjsf/shadcn` forces on us: it pulls `tailwindcss-animate`, whose peer range + * is the malformed `">=3.0.0 || insiders"` — not a semver range, so pnpm calls + * it unmet whatever is installed. pnpm offers no scoped form of the rule + * (`tailwindcss-animate>tailwindcss` and `@rjsf/shadcn>tailwindcss` were both + * tried; neither is honoured), so the suppression is workspace-wide and + * permanent, and the day a workspace package genuinely peers on `tailwindcss` + * its missing peer would go unreported. This is the compensating check. + */ +describe('the workspace-wide tailwindcss ignoreMissing rule', () => { + const repoRoot = resolve(process.cwd(), '../..'); + const workspaceYaml = readFileSync(resolve(repoRoot, 'pnpm-workspace.yaml'), 'utf8'); + const ruleIsInPlace = /ignoreMissing:[\s\S]*?^\s*-\s*tailwindcss\s*$/m.test(workspaceYaml); + + const manifests = () => { + const roots = ['packages', 'examples'].map((d) => resolve(repoRoot, d)); + return roots + .filter((root) => existsSync(root)) + .flatMap((root) => + readdirSync(root, { withFileTypes: true }) + .filter((e) => e.isDirectory()) + .map((e) => resolve(root, e.name, 'package.json')) + .filter((p) => existsSync(p)) + .map((p) => [p, readJson(p)] as const), + ); + }; + + it('is still in pnpm-workspace.yaml (delete this block with the rule)', () => { + expect(ruleIsInPlace).toBe(true); + }); + + it.runIf(ruleIsInPlace)( + 'no workspace package declares a tailwindcss peer while it is suppressed', + () => { + const offenders = manifests() + .filter(([, pkg]) => pkg.peerDependencies?.tailwindcss) + .map(([path]) => path); + expect(offenders).toEqual([]); + }, + ); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5560876..afc7578 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -543,14 +543,17 @@ importers: packages/forms-rjsf: devDependencies: '@rjsf/core': - specifier: ^5.24.0 - version: 5.24.13(@rjsf/utils@5.24.13(react@19.2.6))(react@19.2.6) + specifier: ^6.8.0 + version: 6.8.0(@rjsf/utils@6.8.0(react@19.2.6))(react@19.2.6) + '@rjsf/shadcn': + specifier: ^6.8.0 + version: 6.8.0(@rjsf/core@6.8.0(@rjsf/utils@6.8.0(react@19.2.6))(react@19.2.6))(@rjsf/utils@6.8.0(react@19.2.6))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@rjsf/utils': - specifier: ^5.24.0 - version: 5.24.13(react@19.2.6) + specifier: ^6.8.0 + version: 6.8.0(react@19.2.6) '@rjsf/validator-ajv8': - specifier: ^5.24.0 - version: 5.24.13(@rjsf/utils@5.24.13(react@19.2.6)) + specifier: ^6.8.0 + version: 6.8.0(@rjsf/utils@6.8.0(react@19.2.6)) '@testing-library/react': specifier: ^16.1.0 version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -1516,6 +1519,21 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@floating-ui/core@1.8.0': + resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==} + + '@floating-ui/dom@1.8.0': + resolution: {integrity: sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==} + + '@floating-ui/react-dom@2.1.9': + resolution: {integrity: sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.12': + resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==} + '@hono/node-server@1.19.14': resolution: {integrity: sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==} engines: {node: '>=18.14.1'} @@ -1600,9 +1618,54 @@ packages: engines: {node: '>=18'} hasBin: true + '@radix-ui/number@1.1.3': + resolution: {integrity: sha512-Road2bidD0uu/1BGDOWNdPI06g0lIRy6IF9GZcIrDK2KGItfor8IQwQa+yM2ERgHM1MmHxaxpTzk0/Jp42lNfA==} + '@radix-ui/primitive@1.1.3': resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} + '@radix-ui/primitive@1.1.7': + resolution: {integrity: sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==} + + '@radix-ui/react-arrow@1.1.15': + resolution: {integrity: sha512-v4zggRcjadnI+ClKDuijlQEW4tw3NoaeHc/PwpKnLoLLKNUG4InLegkstooLcRIUWCs+8L22dGURCVuFfOKfnA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-checkbox@1.3.11': + resolution: {integrity: sha512-Gnptr9pDDQxD3hgq2dtPbtrp/c2qH1mBwIzw3X/ivrMb2e1t0jMTi606fVEqFPaQR1ggXIVQWKj3P2WW9v7zGQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.15': + resolution: {integrity: sha512-9W+B9NPF0NaaPh/1NJd3+KqsnlLqU9H7T2rvww+fp+T/evVXdNAyYcnfRQZFOjkR1ajQp3yORlqnI8soawLvNA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-compose-refs@1.1.2': resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} peerDependencies: @@ -1612,6 +1675,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-compose-refs@1.1.5': + resolution: {integrity: sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-context@1.1.2': resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} peerDependencies: @@ -1621,6 +1693,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-context@1.2.2': + resolution: {integrity: sha512-RHCUGwKHDr0hDGg4X7ma4JG4/+12qxw8rkh5QKdDldlCvtja6nUx1Ef/8HVrJze81lEsgLQlqjzjGNHantgnQA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-dialog@1.1.15': resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==} peerDependencies: @@ -1634,6 +1715,15 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-direction@1.1.4': + resolution: {integrity: sha512-5pzg4FGQNpExhnhT2zlrP1wZFaYCd1K0nYWoFAdcYoYK868IEigqMX3B3f8yIoRlAhAeDWciLI6ZdCKHF9P4Vg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-dismissable-layer@1.1.11': resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} peerDependencies: @@ -1647,6 +1737,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-dismissable-layer@1.1.19': + resolution: {integrity: sha512-8g4pfOL9HoKKLWGiypT+dphVqjFfmcXO5GBnhsG6zI+lxAx/8feQpr+1LSN8Re3hiZ+XkLNS4O9ztK11/LzQ6w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-focus-guards@1.1.3': resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} peerDependencies: @@ -1656,6 +1759,28 @@ packages: '@types/react': optional: true + '@radix-ui/react-focus-guards@1.1.6': + resolution: {integrity: sha512-RNOJjfZMTyBM6xYmV3IVGXkPjIhcBAuv48POevAXwrGJhkWZ9p1rFoIS1JFooPuT193AZmRsCPhpoVJxx6OPoQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.16': + resolution: {integrity: sha512-wmRZ2WWLvmt6KHy2rNPOdPUjwq5xOHY02+m+udwJTn0aNIox/rkskAvJTyTLGhPK6KgrUjlJUJpgmx/+wFiFIQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-focus-scope@1.1.7': resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} peerDependencies: @@ -1669,6 +1794,11 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-icons@1.3.2': + resolution: {integrity: sha512-fyQIhGDhzfc9pK2kH6Pl9c4BDJGfMkPqkyIgYDthyNYoNg3wVhoJMMh19WS4Up/1KMPFVpNsT2q3WmXn2N1m6g==} + peerDependencies: + react: ^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc + '@radix-ui/react-id@1.1.1': resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} peerDependencies: @@ -1678,6 +1808,67 @@ packages: '@types/react': optional: true + '@radix-ui/react-id@1.1.4': + resolution: {integrity: sha512-TMQp2llA+RYn7JcjnrMnz7wN4pcVttPZnRZo52PLQsoLVKzNlVwUeHmfePgTgRluXFvlD3GD5g5MOVVTJCO0qA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-label@2.1.15': + resolution: {integrity: sha512-o/rdYEwZTTo5tjknnPeyQFU45kUC4i/XyeDPP+HGyi6XqpOP6Zf5Ya5vh/Yfe9Id5JiuWnnAx2XqIeD3UYZt0g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popover@1.1.23': + resolution: {integrity: sha512-mw58MrBlyHWFisTOYignD0vf/3gdcgAR+9of1s9G/38CbFiUwH1nCDkc0AUM9IrXFgN5Ue8n45j9WCgyM1sbiQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.3.7': + resolution: {integrity: sha512-UsJrrd7w4wuKKTdvd/DNERVlwSlUcyXzjhyDwBk+3aPOsCjOY6ZSbxuw8E6lZTjjfP8Cpd0J8VVkrYUWyGYXyg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.17': + resolution: {integrity: sha512-vKQLcWypUnwZVvfV7UkGahH2g6ySe8M8R+zYBwPrv5byZ9QAW6cQVvNKo7GgmD+p8aYb6D9JBuvy8/WhOno2wQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-portal@1.1.9': resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} peerDependencies: @@ -1691,6 +1882,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-presence@1.1.10': + resolution: {integrity: sha512-3wyzCQ6+ubRA+D4uv9m95JYLXxmOHp05qjrkjeA7uKHHtjpPggQzc6DAb0URl7j67oR0K2foO4ip27TiX037Bw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-presence@1.1.5': resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} peerDependencies: @@ -1704,6 +1908,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-primitive@2.1.10': + resolution: {integrity: sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-primitive@2.1.3': resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} peerDependencies: @@ -1730,6 +1947,71 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-radio-group@1.4.7': + resolution: {integrity: sha512-cgYFEkntCxppHZgtSZ+7vh0wbZQ+IC7PPMw8DSnRG27B6kDd32/Zw0OJt7dGDigCoprMuWHjg2PvUn3PYvPFoQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.19': + resolution: {integrity: sha512-V9jI6hDjT7l3jsCQD9bLNvDLM3tH/gdbOTp7Tefp3hbbgCGQoK7tUvrWiRlcoBHIZ809ElXwNQwVo0B98LuTXQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-select@2.3.7': + resolution: {integrity: sha512-WFGImkmbzcfxeIwq/+4HvRN0pizBwbwQUED4I13ezQsDdfl38ZntN6TmR8XaSzPBqoCToe8rF75j6NPNDSzhbg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-separator@1.1.15': + resolution: {integrity: sha512-jOLO4lssEzWpoDu7G+Ze4VjwMRUBt291pnZD0gmalREZipnTX3wadQo7Fy48GCTfe14/YRN6rw/rOJqrE85Wxw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slider@1.4.7': + resolution: {integrity: sha512-mTSLf1GC/C0moWjTbvCM6Qn/gBjvlFt1azuWF2v7MN5C3Zq2U2J2lN3ZEYkpujuOU5Ro7A28wkviSxaKnG0BYg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-slot@1.2.3': resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} peerDependencies: @@ -1748,6 +2030,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-slot@1.3.3': + resolution: {integrity: sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-callback-ref@1.1.1': resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} peerDependencies: @@ -1757,6 +2048,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-callback-ref@1.1.4': + resolution: {integrity: sha512-R6OUY2e2fA6Yn6s+VSx5KBV6Nx8LQEhu+cz7LCej18rQ1HLyg9PSC9jP/ZNx0o6FAIK9c0F1kHylzSxKsdlkrQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-controllable-state@1.2.2': resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} peerDependencies: @@ -1766,6 +2066,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-controllable-state@1.2.6': + resolution: {integrity: sha512-uEQJGT97ZA/TgP/Hydw47lHu+/vQj6z/0jA+WeTbK1o9Rx45GImjpD0tc3W5ad3D6XTSR6e1yEO0FvGq6WQfVQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-effect-event@0.0.2': resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} peerDependencies: @@ -1775,6 +2084,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-effect-event@0.0.5': + resolution: {integrity: sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYqFMTdG1Jgg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-escape-keydown@1.1.1': resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} peerDependencies: @@ -1784,6 +2102,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-is-hydrated@0.1.3': + resolution: {integrity: sha512-umO/aJ+82CpOnhDZUTbILCQf7kU/g0iv+oGs/Q8jw7IkhWBzaEP4sA268PhFAJTFetbwp3ICc6ktpI4TqtxcIw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-layout-effect@1.1.1': resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} peerDependencies: @@ -1793,6 +2120,63 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-layout-effect@1.1.4': + resolution: {integrity: sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-previous@1.1.4': + resolution: {integrity: sha512-XoSLhbRbqxFtgJoi2fNHA3C6pDlY34x508vUpUGoFZfvePfHXHbE1lC4FYFMnJWgiCRroSTw6fOsXQoVS9RwZg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.4': + resolution: {integrity: sha512-cSOCh6JlkmfjLyNcLiu2nB4v+nm+dkZ+Q5KHWk/soo4U7ZLiEQFKHK9/YmtBHjfCEaU43IBKQOc4/uJmCaiCTQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.4': + resolution: {integrity: sha512-D3anSY15EJoxrihpsXI6SMrmmonnQtR2ni7arO+Lfdg3O95b9hNXxONk8jA5C8ANdF/h5HMAxejgs8PWJ6rlhw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.2.11': + resolution: {integrity: sha512-NFS86RYYZb4/exihaESBGOpMJFz8MGLAfu3mOBSGByVnVPC9JPASfYubxd/8KbkQK0sYAv8lVQDEQukDX/qXvQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/rect@1.1.3': + resolution: {integrity: sha512-JtyZR+mqgBibTo8xea3B6ZRmzZiM/YeVBtUkas6zMuXjAlfIFIW2FgqeM9eLyvEaYX66vr6DJMK+4U6LV0KhNw==} + + '@react-icons/all-files@4.1.0': + resolution: {integrity: sha512-hxBI2UOuVaI3O/BhQfhtb4kcGn9ft12RWAFVMUeNjqqhLsHvFtzIkFaptBJpFDANTKoDfdVoHTKZDlwKCACbMQ==} + peerDependencies: + react: '*' + '@reduxjs/toolkit@2.11.2': resolution: {integrity: sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==} peerDependencies: @@ -1804,24 +2188,32 @@ packages: react-redux: optional: true - '@rjsf/core@5.24.13': - resolution: {integrity: sha512-ONTr14s7LFIjx2VRFLuOpagL76sM/HPy6/OhdBfq6UukINmTIs6+aFN0GgcR0aXQHFDXQ7f/fel0o/SO05Htdg==} - engines: {node: '>=14'} + '@rjsf/core@6.8.0': + resolution: {integrity: sha512-HZ2e/l/QNcz8PTslBXyGWkiycMe3LgIfwgXo0qO3DPgyFKj4G+obJTKBq/W+DaIUmz1HicvH5WtOdXWWqK+gbA==} + engines: {node: '>=20'} peerDependencies: - '@rjsf/utils': ^5.24.x - react: ^16.14.0 || >=17 + '@rjsf/utils': ^6.8.0 + react: '>=18' - '@rjsf/utils@5.24.13': - resolution: {integrity: sha512-rNF8tDxIwTtXzz5O/U23QU73nlhgQNYJ+Sv5BAwQOIyhIE2Z3S5tUiSVMwZHt0julkv/Ryfwi+qsD4FiE5rOuw==} - engines: {node: '>=14'} + '@rjsf/shadcn@6.8.0': + resolution: {integrity: sha512-f6ZRtHBxPwQLRP+yi80K8ddnbBbg76v9IRpFp8hPrPVvo36H2F9nvb0UMOFd1BdX0j97K0KRxbUv+d0wqLbyAA==} + engines: {node: '>=20'} peerDependencies: - react: ^16.14.0 || >=17 + '@rjsf/core': ^6.8.0 + '@rjsf/utils': ^6.8.0 + react: '>=18' - '@rjsf/validator-ajv8@5.24.13': - resolution: {integrity: sha512-oWHP7YK581M8I5cF1t+UXFavnv+bhcqjtL1a7MG/Kaffi0EwhgcYjODrD8SsnrhncsEYMqSECr4ZOEoirnEUWw==} - engines: {node: '>=14'} + '@rjsf/utils@6.8.0': + resolution: {integrity: sha512-gHcqPFSHdOz29tZiLlzDvD+Gfq21zVIFBufprSYTiHpUdcVNJEK6+V5aw++FtQncHdDWnTf2YCky/e1Bol2NEQ==} + engines: {node: '>=20'} peerDependencies: - '@rjsf/utils': ^5.24.x + react: '>=18' + + '@rjsf/validator-ajv8@6.8.0': + resolution: {integrity: sha512-F36I952/miMFZzWSlupwFHbl+j+5bVQ3tR6HtBS+vXV10kY5dT3OwTjbFRo4fQM1KpqrUZC0t3/E5CZRX1o1jA==} + engines: {node: '>=20'} + peerDependencies: + '@rjsf/utils': ^6.8.0 '@rolldown/pluginutils@1.0.0-beta.27': resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} @@ -2072,6 +2464,9 @@ packages: '@workflow/serde@4.1.0': resolution: {integrity: sha512-pav4F2BoirECWR7Nf1TKt+2eETcBj7jj4cBefQ8VXQCA6NPkaKeLfj/zMgi+3zYV5ZIBT4GuUiphsj0/b9hPQQ==} + '@x0k/json-schema-merge@1.0.5': + resolution: {integrity: sha512-bPvwYpTkhBOXkvbC8KMNhkgzv+gWu6Yx6FVho3mL+vMf8Fy3gdn9YrlrBrXphznvOHhB85BudH/ywtVRZ/HG3A==} + accepts@2.0.0: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} engines: {node: '>= 0.6'} @@ -2240,6 +2635,13 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + cmdk@1.1.1: resolution: {integrity: sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==} peerDependencies: @@ -2264,12 +2666,6 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} - compute-gcd@1.2.1: - resolution: {integrity: sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg==} - - compute-lcm@1.1.2: - resolution: {integrity: sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ==} - concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -2516,6 +2912,10 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-equals@6.0.2: + resolution: {integrity: sha512-sAjhj9ZhOxYCGiNMnZLaucOqf5ZeFnHNoKoAZiD9thhJ0N8RP85qJK759/97C/3L7NzzmGVB5uiX9AUpySZmUQ==} + engines: {node: '>=6.0.0'} + fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -2529,6 +2929,9 @@ packages: fast-uri@3.1.2: resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} + fast-uri@4.1.3: + resolution: {integrity: sha512-7+72G6vLt7jjNas8SmSATx2qeyRIjxeqO3i4IkmDTxlqYZRKANhOe1bnovcp4WZmvsYrp60WyqPyHqgRiX0yXw==} + fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} @@ -2784,13 +3187,6 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-schema-compare@0.2.2: - resolution: {integrity: sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ==} - - json-schema-merge-allof@0.8.1: - resolution: {integrity: sha512-CTUKmIlPJbsWfzRRnOXz+0MjIqvnleIXwFTzz+t9T86HnYX/Rozria6ZVGLktAU9e+NygNljveP+yxqtQp/Q4w==} - engines: {node: '>=12.0.0'} - json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -2869,6 +3265,11 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lucide-react@1.34.0: + resolution: {integrity: sha512-vnjGJNI7Htk5+oWW8gXGuaLgwgAb0T6/iZbBrp9JCfRFwdNWZ0YTm3eyxjOLgwN6r8iyAf3UA70zNmBRBNv7yg==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true @@ -2876,14 +3277,23 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - markdown-to-jsx@7.7.17: - resolution: {integrity: sha512-7mG/1feQ0TX5I7YyMZVDgCC/y2I3CiEhIRQIhyov9nGBP5eoVrOXXHuL5ZP8GRfxVZKRiXWJgwXkb9It+nQZfQ==} - engines: {node: '>= 10'} + markdown-to-jsx@9.10.2: + resolution: {integrity: sha512-iR9GadlIox0q1uXnpqdxpF02Vb1WDmZ/QIXWjBR5htzjUEEhyIWbM65LuVKavdwJaVo4q95C/F2OOyNjWe91ig==} + engines: {node: '>= 18'} peerDependencies: - react: '>= 0.14.0' + react: '>= 16.0.0' + react-native: '*' + solid-js: '>=1.0.0' + vue: '>=3.0.0' peerDependenciesMeta: react: optional: true + react-native: + optional: true + solid-js: + optional: true + vue: + optional: true math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} @@ -3375,6 +3785,14 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + tailwind-merge@3.6.0: + resolution: {integrity: sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==} + + tailwindcss-animate@1.0.7: + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} @@ -3527,20 +3945,9 @@ packages: '@types/react': optional: true - validate.io-array@1.0.6: - resolution: {integrity: sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg==} - - validate.io-function@1.0.2: - resolution: {integrity: sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ==} - - validate.io-integer-array@1.0.0: - resolution: {integrity: sha512-mTrMk/1ytQHtCY0oNO3dztafHYyGU88KL+jRxWuzfOmQb+4qqnWmI+gykvGp8usKZOM0H7keJHEbRaFiYA0VrA==} - - validate.io-integer@1.0.5: - resolution: {integrity: sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ==} - - validate.io-number@1.0.3: - resolution: {integrity: sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg==} + uuid@14.0.2: + resolution: {integrity: sha512-xZe/16rV4aa+HGSOCiY2YeLT1OybRLrrkL/Rqaq7p7GMVXjFh+6wN4oMYgjFmnSnhY8t6Xpdl2l9qmnHYuMHwQ==} + hasBin: true vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} @@ -4320,6 +4727,23 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 + '@floating-ui/core@1.8.0': + dependencies: + '@floating-ui/utils': 0.2.12 + + '@floating-ui/dom@1.8.0': + dependencies: + '@floating-ui/core': 1.8.0 + '@floating-ui/utils': 0.2.12 + + '@floating-ui/react-dom@2.1.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@floating-ui/dom': 1.8.0 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + + '@floating-ui/utils@0.2.12': {} + '@hono/node-server@1.19.14(hono@4.12.18)': dependencies: hono: 4.12.18 @@ -4420,20 +4844,72 @@ snapshots: dependencies: playwright: 1.60.0 + '@radix-ui/number@1.1.3': {} + '@radix-ui/primitive@1.1.3': {} + '@radix-ui/primitive@1.1.7': {} + + '@radix-ui/react-arrow@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-checkbox@1.3.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-size': 1.1.4(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-collection@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-slot': 1.3.3(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.14)(react@19.2.6)': dependencies: react: 19.2.6 optionalDependencies: '@types/react': 19.2.14 + '@radix-ui/react-compose-refs@1.1.5(@types/react@19.2.14)(react@19.2.6)': + dependencies: + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.14 + '@radix-ui/react-context@1.1.2(@types/react@19.2.14)(react@19.2.6)': dependencies: react: 19.2.6 optionalDependencies: '@types/react': 19.2.14 + '@radix-ui/react-context@1.2.2(@types/react@19.2.14)(react@19.2.6)': + dependencies: + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.14 + '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/primitive': 1.1.3 @@ -4456,6 +4932,12 @@ snapshots: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@radix-ui/react-direction@1.1.4(@types/react@19.2.14)(react@19.2.6)': + dependencies: + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.14 + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/primitive': 1.1.3 @@ -4469,12 +4951,42 @@ snapshots: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@radix-ui/react-dismissable-layer@1.1.19(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-effect-event': 0.0.5(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.14)(react@19.2.6)': dependencies: react: 19.2.6 optionalDependencies: '@types/react': 19.2.14 + '@radix-ui/react-focus-guards@1.1.6(@types/react@19.2.14)(react@19.2.6)': + dependencies: + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-focus-scope@1.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.6) @@ -4486,6 +4998,10 @@ snapshots: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@radix-ui/react-icons@1.3.2(react@19.2.6)': + dependencies: + react: 19.2.6 + '@radix-ui/react-id@1.1.1(@types/react@19.2.14)(react@19.2.6)': dependencies: '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.6) @@ -4493,6 +5009,73 @@ snapshots: optionalDependencies: '@types/react': 19.2.14 + '@radix-ui/react-id@1.1.4(@types/react@19.2.14)(react@19.2.6)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-label@2.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-popover@1.1.23(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-focus-guards': 1.1.6(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-focus-scope': 1.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-id': 1.1.4(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-popper': 1.3.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-slot': 1.3.3(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.14)(react@19.2.6) + aria-hidden: 1.2.6 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + react-remove-scroll: 2.7.2(@types/react@19.2.14)(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-popper@1.3.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@floating-ui/react-dom': 2.1.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-arrow': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-rect': 1.1.4(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-size': 1.1.4(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/rect': 1.1.3 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-portal@1.1.17(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -4503,6 +5086,15 @@ snapshots: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@radix-ui/react-presence@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.6) @@ -4513,6 +5105,15 @@ snapshots: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@radix-ui/react-primitive@2.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/react-slot': 1.3.3(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.6) @@ -4531,6 +5132,100 @@ snapshots: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@radix-ui/react-radio-group@1.4.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-direction': 1.1.4(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-roving-focus': 1.1.19(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-size': 1.1.4(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-roving-focus@1.1.19(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-direction': 1.1.4(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-id': 1.1.4(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-is-hydrated': 0.1.3(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-select@2.3.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/number': 1.1.3 + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-direction': 1.1.4(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-focus-guards': 1.1.6(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-focus-scope': 1.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-id': 1.1.4(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-popper': 1.3.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-slot': 1.3.3(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-previous': 1.1.4(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-visually-hidden': 1.2.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + aria-hidden: 1.2.6 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + react-remove-scroll: 2.7.2(@types/react@19.2.14)(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-separator@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-slider@1.4.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/number': 1.1.3 + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-direction': 1.1.4(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-previous': 1.1.4(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-size': 1.1.4(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@radix-ui/react-slot@1.2.3(@types/react@19.2.14)(react@19.2.6)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.6) @@ -4545,12 +5240,25 @@ snapshots: optionalDependencies: '@types/react': 19.2.14 + '@radix-ui/react-slot@1.3.3(@types/react@19.2.14)(react@19.2.6)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.14 + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.14)(react@19.2.6)': dependencies: react: 19.2.6 optionalDependencies: '@types/react': 19.2.14 + '@radix-ui/react-use-callback-ref@1.1.4(@types/react@19.2.14)(react@19.2.6)': + dependencies: + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.14 + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.14)(react@19.2.6)': dependencies: '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.14)(react@19.2.6) @@ -4559,6 +5267,15 @@ snapshots: optionalDependencies: '@types/react': 19.2.14 + '@radix-ui/react-use-controllable-state@1.2.6(@types/react@19.2.14)(react@19.2.6)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-use-effect-event': 0.0.5(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.14 + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.14)(react@19.2.6)': dependencies: '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.6) @@ -4566,6 +5283,13 @@ snapshots: optionalDependencies: '@types/react': 19.2.14 + '@radix-ui/react-use-effect-event@0.0.5(@types/react@19.2.14)(react@19.2.6)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.14 + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.14)(react@19.2.6)': dependencies: '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.6) @@ -4573,12 +5297,59 @@ snapshots: optionalDependencies: '@types/react': 19.2.14 + '@radix-ui/react-use-is-hydrated@0.1.3(@types/react@19.2.14)(react@19.2.6)': + dependencies: + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.14 + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.14)(react@19.2.6)': dependencies: react: 19.2.6 optionalDependencies: '@types/react': 19.2.14 + '@radix-ui/react-use-layout-effect@1.1.4(@types/react@19.2.14)(react@19.2.6)': + dependencies: + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-previous@1.1.4(@types/react@19.2.14)(react@19.2.6)': + dependencies: + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-rect@1.1.4(@types/react@19.2.14)(react@19.2.6)': + dependencies: + '@radix-ui/rect': 1.1.3 + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-size@1.1.4(@types/react@19.2.14)(react@19.2.6)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-visually-hidden@1.2.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/rect@1.1.3': {} + + '@react-icons/all-files@4.1.0(react@19.2.6)': + dependencies: + react: 19.2.6 + '@reduxjs/toolkit@2.11.2(react@19.2.6)': dependencies: '@standard-schema/spec': 1.1.0 @@ -4590,27 +5361,64 @@ snapshots: optionalDependencies: react: 19.2.6 - '@rjsf/core@5.24.13(@rjsf/utils@5.24.13(react@19.2.6))(react@19.2.6)': + '@rjsf/core@6.8.0(@rjsf/utils@6.8.0(react@19.2.6))(react@19.2.6)': dependencies: - '@rjsf/utils': 5.24.13(react@19.2.6) + '@rjsf/utils': 6.8.0(react@19.2.6) lodash: 4.18.1 lodash-es: 4.18.1 - markdown-to-jsx: 7.7.17(react@19.2.6) + markdown-to-jsx: 9.10.2(react@19.2.6) prop-types: 15.8.1 react: 19.2.6 + transitivePeerDependencies: + - react-native + - solid-js + - vue + + '@rjsf/shadcn@6.8.0(@rjsf/core@6.8.0(@rjsf/utils@6.8.0(react@19.2.6))(react@19.2.6))(@rjsf/utils@6.8.0(react@19.2.6))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/react-checkbox': 1.3.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-icons': 1.3.2(react@19.2.6) + '@radix-ui/react-label': 2.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-popover': 1.1.23(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-radio-group': 1.4.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-select': 2.3.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-separator': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-slider': 1.4.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-slot': 1.2.4(@types/react@19.2.14)(react@19.2.6) + '@react-icons/all-files': 4.1.0(react@19.2.6) + '@rjsf/core': 6.8.0(@rjsf/utils@6.8.0(react@19.2.6))(react@19.2.6) + '@rjsf/utils': 6.8.0(react@19.2.6) + class-variance-authority: 0.7.1 + clsx: 2.1.1 + cmdk: 1.1.1(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + lodash: 4.18.1 + lodash-es: 4.18.1 + lucide-react: 1.34.0(react@19.2.6) + react: 19.2.6 + tailwind-merge: 3.6.0 + tailwindcss-animate: 1.0.7 + uuid: 14.0.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + - tailwindcss - '@rjsf/utils@5.24.13(react@19.2.6)': + '@rjsf/utils@6.8.0(react@19.2.6)': dependencies: - json-schema-merge-allof: 0.8.1 + '@x0k/json-schema-merge': 1.0.5 + fast-equals: 6.0.2 + fast-uri: 4.1.3 jsonpointer: 5.0.1 lodash: 4.18.1 lodash-es: 4.18.1 react: 19.2.6 react-is: 18.3.1 - '@rjsf/validator-ajv8@5.24.13(@rjsf/utils@5.24.13(react@19.2.6))': + '@rjsf/validator-ajv8@6.8.0(@rjsf/utils@6.8.0(react@19.2.6))': dependencies: - '@rjsf/utils': 5.24.13(react@19.2.6) + '@rjsf/utils': 6.8.0(react@19.2.6) ajv: 8.20.0 ajv-formats: 2.1.1(ajv@8.20.0) lodash: 4.18.1 @@ -4823,6 +5631,10 @@ snapshots: '@workflow/serde@4.1.0': {} + '@x0k/json-schema-merge@1.0.5': + dependencies: + '@types/json-schema': 7.0.15 + accepts@2.0.0: dependencies: mime-types: 3.0.2 @@ -4984,6 +5796,12 @@ snapshots: dependencies: readdirp: 4.1.2 + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + + clsx@2.1.1: {} + cmdk@1.1.1(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6): dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.6) @@ -5010,19 +5828,6 @@ snapshots: commander@4.1.1: {} - compute-gcd@1.2.1: - dependencies: - validate.io-array: 1.0.6 - validate.io-function: 1.0.2 - validate.io-integer-array: 1.0.0 - - compute-lcm@1.1.2: - dependencies: - compute-gcd: 1.2.1 - validate.io-array: 1.0.6 - validate.io-function: 1.0.2 - validate.io-integer-array: 1.0.0 - concat-map@0.0.1: {} confbox@0.1.8: {} @@ -5342,6 +6147,8 @@ snapshots: fast-deep-equal@3.1.3: {} + fast-equals@6.0.2: {} + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -5356,6 +6163,8 @@ snapshots: fast-uri@3.1.2: {} + fast-uri@4.1.3: {} + fastq@1.20.1: dependencies: reusify: 1.1.0 @@ -5621,16 +6430,6 @@ snapshots: json-buffer@3.0.1: {} - json-schema-compare@0.2.2: - dependencies: - lodash: 4.18.1 - - json-schema-merge-allof@0.8.1: - dependencies: - compute-lcm: 1.1.2 - json-schema-compare: 0.2.2 - lodash: 4.18.1 - json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} @@ -5692,13 +6491,17 @@ snapshots: dependencies: yallist: 3.1.1 + lucide-react@1.34.0(react@19.2.6): + dependencies: + react: 19.2.6 + lz-string@1.5.0: {} magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - markdown-to-jsx@7.7.17(react@19.2.6): + markdown-to-jsx@9.10.2(react@19.2.6): optionalDependencies: react: 19.2.6 @@ -6158,6 +6961,10 @@ snapshots: symbol-tree@3.2.4: {} + tailwind-merge@3.6.0: {} + + tailwindcss-animate@1.0.7: {} + term-size@2.2.1: {} thenify-all@1.6.0: @@ -6296,20 +7103,7 @@ snapshots: optionalDependencies: '@types/react': 19.2.14 - validate.io-array@1.0.6: {} - - validate.io-function@1.0.2: {} - - validate.io-integer-array@1.0.0: - dependencies: - validate.io-array: 1.0.6 - validate.io-integer: 1.0.5 - - validate.io-integer@1.0.5: - dependencies: - validate.io-number: 1.0.3 - - validate.io-number@1.0.3: {} + uuid@14.0.2: {} vary@1.1.2: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 5a93fcd..c63f9c6 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -9,3 +9,13 @@ allowBuilds: onlyBuiltDependencies: - esbuild + +peerDependencyRules: + ignoreMissing: + # `@rjsf/shadcn` (a devDependency of packages/forms-rjsf, for the smoke test + # that proves the shadcn theme renders) pulls in `tailwindcss-animate`, whose + # peer range is the malformed `">=3.0.0 || insiders"`. The `insiders` branch + # is not a semver range, so pnpm treats the whole range as unsatisfiable and + # reports the peer unmet no matter which tailwindcss is installed. Nothing in + # this repo compiles CSS, so the peer is genuinely irrelevant here. + - tailwindcss diff --git a/scripts/pin-rjsf-5x.mjs b/scripts/pin-rjsf-5x.mjs new file mode 100644 index 0000000..69b14c5 --- /dev/null +++ b/scripts/pin-rjsf-5x.mjs @@ -0,0 +1,99 @@ +#!/usr/bin/env node +/** + * Repoint `packages/forms-rjsf`'s dev tree at the 5.x half of its DECLARED + * `@rjsf` peer range, so CI can typecheck and test the adapter against the + * older major it promises to support (thorwhalen/acture#57). + * + * This is a second *install*, not a second alias tree. The three `@rjsf` + * devDependencies are rewritten to the 5.x clause of the peer range and + * `@rjsf/shadcn` (published on the 6.x line only) is dropped; a plain + * `pnpm install` then resolves a plain 5.x tree. No `npm:` aliases and no + * `packageExtensions` are involved, so pnpm's peers-are-matched-by-package-name + * behaviour — which is what makes an *aliased* 5.x install useless, since the + * alias still binds the 6.x `@rjsf/utils` — never comes into play. + * + * The 5.x clause is READ from `peerDependencies`, never hardcoded: narrow the + * published range to 6-only and this script no-ops instead of failing, so the + * matrix retires itself together with the promise it exists to check. + * + * node scripts/pin-rjsf-5x.mjs # rewrite the tree (CI only) + * node scripts/pin-rjsf-5x.mjs --verify # after install: assert 5.x resolved + * + * DESTRUCTIVE: rewrites `packages/forms-rjsf/package.json` and deletes + * `src/shadcn-theme.test.tsx` in the working tree. Intended for a throwaway CI + * checkout; refuses to run outside CI unless `--force` is passed. + */ + +import { readFileSync, writeFileSync, rmSync, existsSync } from 'node:fs'; +import { dirname, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..'); +const pkgDir = resolve(repoRoot, 'packages/forms-rjsf'); +const pkgPath = resolve(pkgDir, 'package.json'); + +/** The three `@rjsf` packages this adapter peers on and dev-installs. */ +const RJSF_DEV_DEPS = ['@rjsf/core', '@rjsf/utils', '@rjsf/validator-ajv8']; + +const readJson = (path) => JSON.parse(readFileSync(path, 'utf8')); + +/** The `^5.x` clause of the declared `@rjsf/core` peer range, or `null`. */ +function fiveClause(pkg) { + const declared = pkg.peerDependencies['@rjsf/core']; + return ( + declared + .split('||') + .map((clause) => clause.trim()) + .find((clause) => /^\D*5\./.test(clause)) ?? null + ); +} + +const verify = process.argv.includes('--verify'); +const pkg = readJson(pkgPath); +const clause = fiveClause(pkg); + +if (!clause) { + console.log( + `pin-rjsf-5x: the declared @rjsf/core peer range is ` + + `"${pkg.peerDependencies['@rjsf/core']}", which has no 5.x clause. ` + + 'Nothing to check — skipping.', + ); + process.exit(0); +} + +if (verify) { + // A job that silently tests the wrong major is the failure this whole matrix + // exists to prevent, so the install is checked rather than assumed. + const installed = readJson(resolve(pkgDir, 'node_modules/@rjsf/core/package.json')).version; + const major = installed.split('.')[0]; + if (major !== '5') { + console.error( + `pin-rjsf-5x --verify: declared range promises "${clause}" but the tree ` + + `resolved @rjsf/core@${installed}. This job is not testing 5.x.`, + ); + process.exit(1); + } + console.log(`pin-rjsf-5x --verify: @rjsf/core@${installed} — a real 5.x tree.`); + process.exit(0); +} + +if (!process.env.CI && !process.argv.includes('--force')) { + console.error( + 'pin-rjsf-5x: refusing to rewrite the working tree outside CI. ' + + 'Pass --force if you mean it (and expect to `git checkout` afterwards).', + ); + process.exit(1); +} + +for (const name of RJSF_DEV_DEPS) pkg.devDependencies[name] = clause; +// `@rjsf/shadcn` is 6.x-only; its smoke test is the one thing that cannot run here. +delete pkg.devDependencies['@rjsf/shadcn']; +writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`); + +const shadcnTest = resolve(pkgDir, 'src/shadcn-theme.test.tsx'); +if (existsSync(shadcnTest)) rmSync(shadcnTest); + +console.log( + `pin-rjsf-5x: pinned ${RJSF_DEV_DEPS.join(', ')} to "${clause}", ` + + 'dropped @rjsf/shadcn and its smoke test.', +);