diff --git a/.changeset/25685-one-react-line.md b/.changeset/25685-one-react-line.md new file mode 100644 index 0000000000..0bf22290f3 --- /dev/null +++ b/.changeset/25685-one-react-line.md @@ -0,0 +1,37 @@ +--- +"@object-ui/app-shell": patch +"@object-ui/auth": patch +"@object-ui/cli": patch +"@object-ui/collaboration": patch +"@object-ui/components": patch +"@object-ui/console": patch +"@object-ui/fields": patch +"@object-ui/i18n": patch +"@object-ui/layout": patch +"@object-ui/mobile": patch +"@object-ui/permissions": patch +"@object-ui/plugin-ai": patch +"@object-ui/plugin-calendar": patch +"@object-ui/plugin-charts": patch +"@object-ui/plugin-chatbot": patch +"@object-ui/plugin-dashboard": patch +"@object-ui/plugin-designer": patch +"@object-ui/plugin-detail": patch +"@object-ui/plugin-editor": patch +"@object-ui/plugin-gantt": patch +"@object-ui/plugin-kanban": patch +"@object-ui/plugin-list": patch +"@object-ui/plugin-map": patch +"@object-ui/plugin-markdown": patch +"@object-ui/plugin-report": patch +"@object-ui/plugin-timeline": patch +"@object-ui/plugin-tree": patch +"@object-ui/providers": patch +"@object-ui/react": patch +"@object-ui/runner": patch +--- + +Clause-②: no +Metadata-protocol: none + +One react line: every manifest that pins `react` / `react-dom` now pins 19.3.0, and every `@types/react` / `@types/react-dom` pin is 19.3.0, matching the root `pnpm.overrides`. The objectstack monorepo's `@objectstack/client-react` requires react `^19.3.0`, and a second `@types/react` copy broke `@object-ui/plugin-view`'s declaration build in the merged tree. The CLI's scaffold (`REACT_RANGE` and the shared dev-dependency map in `scaffold-dependencies.ts`) quotes the same pins, as its anchor test requires. diff --git a/.changeset/25685-one-zod-range.md b/.changeset/25685-one-zod-range.md new file mode 100644 index 0000000000..40945ec5f1 --- /dev/null +++ b/.changeset/25685-one-zod-range.md @@ -0,0 +1,11 @@ +--- +"@object-ui/app-shell": patch +"@object-ui/components": patch +"@object-ui/plugin-timeline": patch +"@object-ui/types": patch +--- + +Clause-②: no +Metadata-protocol: none + +One zod range: `@object-ui/app-shell`, `@object-ui/components`, `@object-ui/types` and `@object-ui/plugin-timeline` declare `zod` as `^4.6.5`, the range the objectstack monorepo declares, so the merged lockfile resolves one zod rather than two. The console bundle already carried a single copy; what changes is the declared floor. diff --git a/apps/console/package.json b/apps/console/package.json index 723e5dc8ed..b530396447 100644 --- a/apps/console/package.json +++ b/apps/console/package.json @@ -45,8 +45,8 @@ "dev": "vite", "build:plugin": "tsc -p tsconfig.plugin.json", "build:sdui-manifest": "tsx scripts/build-sdui-manifest.ts", - "build": "tsc && vite build && pnpm build:sdui-manifest && pnpm build:plugin", - "type-check": "tsc --noEmit && tsc -b tsconfig.node.json --force", + "build": "NODE_OPTIONS=--max-old-space-size=4096 tsc && vite build && pnpm build:sdui-manifest && pnpm build:plugin", + "type-check": "NODE_OPTIONS=--max-old-space-size=4096 tsc --noEmit && tsc -b tsconfig.node.json --force", "lint": "eslint .", "build:analyze": "pnpm build && echo 'Bundle analysis available at dist/stats.html'", "preview": "vite preview", @@ -100,16 +100,16 @@ "@testing-library/react": "^16.3.2", "@testing-library/user-event": "^14.6.4", "@types/node": "^26.2.0", - "@types/react": "19.2.18", - "@types/react-dom": "19.2.4", + "@types/react": "19.3.0", + "@types/react-dom": "19.3.0", "@vitejs/plugin-react": "^6.0.5", "@vitest/ui": "^4.1.10", "autoprefixer": "^10.5.4", "happy-dom": "^20.11.2", "lucide-react": "^1.43.0", "postcss": "^8.5.26", - "react": "19.2.8", - "react-dom": "19.2.8", + "react": "19.3.0", + "react-dom": "19.3.0", "react-map-gl": "^8.1.2", "react-router-dom": "^7.18.2", "sonner": "^2.0.8", diff --git a/apps/console/vite.config.ts b/apps/console/vite.config.ts index e9b35f75ce..6800efa897 100644 --- a/apps/console/vite.config.ts +++ b/apps/console/vite.config.ts @@ -24,6 +24,7 @@ import { resolveSpecDistInjection, } from '../../scripts/vite-objectstack-spec-dist.ts'; import { viteIneffectiveDynamicImports } from '../../scripts/vite-ineffective-dynamic-imports.ts'; +import { frameworkPackagesDir, workspaceChunkTests } from '../../scripts/vite-objectstack-workspace.ts'; import { viteDeclaredLazyViews } from '../../scripts/vite-declared-lazy-views.ts'; import { viteTypesZodLazy } from '../../scripts/vite-types-zod-lazy.ts'; import { compression } from 'vite-plugin-compression2'; @@ -106,7 +107,7 @@ function preloadCriticalChunks(): Plugin { * instead of quietly ceasing to guard anything. */ function assertLazyLinterStaysLazy(specTest: RegExp): Plugin { - const LINT = /@objectstack[\\/+]lint/; + const LINT = WORKSPACE_CHUNK_TESTS.lint; return { name: 'assert-lazy-linter-stays-lazy', @@ -739,8 +740,17 @@ const OPTIMIZE_DEPS_INCLUDE = [ // The lookaheads are deliberately tight: `lint[\\/]` and `lint@` match the // `lint` package only, so a future `@objectstack/lint-*` sibling still groups // here rather than silently scattering into its importers' chunks. -const VENDOR_OBJECTSTACK_TEST = - /([\\/]node_modules[\\/]@objectstack[\\/](?!lint[\\/])|[\\/]@objectstack\+(?!lint@))/; +// +// objectstack ruling D1: inside the objectstack monorepo (objectui as `ui/`) +// the framework packages are workspace links, so Vite sees their REAL paths +// (`/packages//dist/...`), never a node_modules spelling. +// The monorepo's own `packages/` directory therefore joins this test, the +// spec counter-probe and the lazy-linter guard below as one more alternative; +// standalone that directory does not exist and the alternative matches +// nothing. The three tests are built in `scripts/vite-objectstack-workspace.ts` +// so a unit test can read them -- its header carries the measurement. +const WORKSPACE_CHUNK_TESTS = workspaceChunkTests(frameworkPackagesDir(import.meta.dirname)); +const VENDOR_OBJECTSTACK_TEST = WORKSPACE_CHUNK_TESTS.vendor; // "This module id IS `@objectstack/spec`" — the subject of the counter-probe in // `assertLazyLinterStaysLazy` above, kept separate from the group test on @@ -749,8 +759,9 @@ const VENDOR_OBJECTSTACK_TEST = // can see the SPEC chunk the counter-probe exists to find — reusing it there // would keep the build green by lowering the bar, which is the one outcome // objectui#5388 must not produce. Both spellings are covered: a plain install -// (`/node_modules/@objectstack/spec/…`) and pnpm's store (`/@objectstack+spec@…`). -const SPEC_MODULE_TEST = /@objectstack[\\/+]spec/; +// (`/node_modules/@objectstack/spec/…`) and pnpm's store (`/@objectstack+spec@…`), +// plus the monorepo's workspace path (see `WORKSPACE_CHUNK_TESTS` above). +const SPEC_MODULE_TEST = WORKSPACE_CHUNK_TESTS.spec; // Opt-in override of the installed `@objectstack/spec` — the spec twin of // OBJECTSTACK_CLIENT_DIST above, so a framework build can bundle the console diff --git a/apps/site/package.json b/apps/site/package.json index 89c304bcb2..b49915acf6 100644 --- a/apps/site/package.json +++ b/apps/site/package.json @@ -38,16 +38,16 @@ "fumadocs-ui": "16.15.4", "lucide-react": "^1.43.0", "next": "16.3.8", - "react": "19.2.8", - "react-dom": "19.2.8", + "react": "19.3.0", + "react-dom": "19.3.0", "tailwind-merge": "^3.6.0" }, "devDependencies": { "@tailwindcss/postcss": "^4.3.3", "@types/mdx": "^2.0.14", "@types/node": "^26.2.0", - "@types/react": "19.2.18", - "@types/react-dom": "19.2.4", + "@types/react": "19.3.0", + "@types/react-dom": "19.3.0", "postcss": "^8.5.26", "tailwindcss": "^4.3.3", "tailwindcss-animate": "^1.0.7", diff --git a/examples/byo-backend-console/package.json b/examples/byo-backend-console/package.json index f9b9cb14f2..86c77da0fb 100644 --- a/examples/byo-backend-console/package.json +++ b/examples/byo-backend-console/package.json @@ -19,14 +19,14 @@ "@object-ui/providers": "workspace:*", "@object-ui/react": "workspace:*", "@object-ui/types": "workspace:*", - "react": "19.2.8", - "react-dom": "19.2.8", + "react": "19.3.0", + "react-dom": "19.3.0", "react-router-dom": "^7.18.2" }, "devDependencies": { "@tailwindcss/postcss": "^4.3.3", - "@types/react": "19.2.18", - "@types/react-dom": "19.2.4", + "@types/react": "19.3.0", + "@types/react-dom": "19.3.0", "@vitejs/plugin-react": "^6.0.5", "autoprefixer": "^10.5.4", "postcss": "^8.5.26", diff --git a/examples/console-starter/package.json b/examples/console-starter/package.json index 74aa71934e..9c6c2626d6 100644 --- a/examples/console-starter/package.json +++ b/examples/console-starter/package.json @@ -34,15 +34,15 @@ "@object-ui/providers": "workspace:*", "@object-ui/react-runtime": "workspace:*", "@object-ui/sdui-parser": "workspace:*", - "react": "19.2.8", - "react-dom": "19.2.8", + "react": "19.3.0", + "react-dom": "19.3.0", "react-router-dom": "^7.18.2", "sonner": "^2.0.8" }, "devDependencies": { "@tailwindcss/postcss": "^4.3.3", - "@types/react": "19.2.18", - "@types/react-dom": "19.2.4", + "@types/react": "19.3.0", + "@types/react-dom": "19.3.0", "@vitejs/plugin-react": "^6.0.5", "tailwindcss": "^4.3.3", "typescript": "^6.0.3", diff --git a/examples/hello-world/package.json b/examples/hello-world/package.json index 869019ba75..0e8acbaa0f 100644 --- a/examples/hello-world/package.json +++ b/examples/hello-world/package.json @@ -7,8 +7,8 @@ "@object-ui/components": "workspace:*", "@object-ui/core": "workspace:*", "@object-ui/react": "workspace:*", - "react": "19.2.8", - "react-dom": "19.2.8" + "react": "19.3.0", + "react-dom": "19.3.0" }, "scripts": { "lint": "eslint ." diff --git a/package.json b/package.json index fe60a3c67b..e1c7cb5ae5 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "lint:coverage": "node scripts/check-lint-coverage.mjs", "check:lint-rule-coverage": "node scripts/check-lint-rule-coverage.mjs", "type-check": "turbo run type-check", + "typecheck": "turbo run type-check", "type-check:coverage": "node scripts/check-type-check-coverage.mjs", "type-check:e2e": "tsc -p tsconfig.e2e.json", "type-check:scripts": "tsc -p tsconfig.scripts.json", @@ -102,6 +103,7 @@ "merge-queue-head": "node scripts/check-merge-queue-head.mjs", "check:pre-install-import-graph": "node scripts/check-pre-install-import-graph.mjs", "check:test-path-roots": "node scripts/check-test-path-roots.mjs", + "check:ui-root-lookups": "node scripts/check-ui-root-lookups.mjs", "check:vi-mock-specifiers": "node scripts/check-vi-mock-specifiers.mjs", "check:vi-mock-inherit": "node scripts/check-vi-mock-inherit.mjs", "check:vi-mock-override-shape": "node scripts/check-vi-mock-override-shape.mjs", @@ -154,8 +156,8 @@ "@testing-library/react": "^16.3.2", "@testing-library/user-event": "^14.6.4", "@types/node": "^26.2.0", - "@types/react": "19.2.18", - "@types/react-dom": "19.2.4", + "@types/react": "19.3.0", + "@types/react-dom": "19.3.0", "@vitest/coverage-v8": "^4.1.10", "@vitest/ui": "^4.1.10", "autoprefixer": "^10.5.4", @@ -169,8 +171,8 @@ "jsdom": "^29.1.1", "msw": "^2.15.0", "playwright": "^1.62.1", - "react": "19.2.8", - "react-dom": "19.2.8", + "react": "19.3.0", + "react-dom": "19.3.0", "react-i18next": "^17.0.11", "react-router-dom": "^7.18.2", "remark-mdx": "^3.1.1", @@ -192,10 +194,10 @@ }, "pnpm": { "overrides": { - "react": "19.2.8", - "react-dom": "19.2.8", - "@types/react": "19.2.18", - "@types/react-dom": "19.2.4", + "react": "19.3.0", + "react-dom": "19.3.0", + "@types/react": "19.3.0", + "@types/react-dom": "19.3.0", "dompurify": "^3.4.5", "qs@<6.15.2": "^6.15.2", "shell-quote@<1.8.4": "^1.8.4", diff --git a/packages/app-shell/package.json b/packages/app-shell/package.json index 3670820175..4615e69833 100644 --- a/packages/app-shell/package.json +++ b/packages/app-shell/package.json @@ -64,9 +64,9 @@ "./styles.css": "./src/styles.css" }, "scripts": { - "build": "tsc && node ../../scripts/check-dist-completeness.mjs", + "build": "NODE_OPTIONS=--max-old-space-size=4096 tsc && node ../../scripts/check-dist-completeness.mjs", "test": "vitest run --root ../.. packages/app-shell/", - "type-check": "tsc --noEmit && tsc -p tsconfig.test.json", + "type-check": "NODE_OPTIONS=--max-old-space-size=4096 tsc --noEmit && NODE_OPTIONS=--max-old-space-size=4096 tsc -p tsconfig.test.json", "lint": "eslint ." }, "dependencies": { @@ -95,7 +95,7 @@ "lucide-react": "^1.43.0", "qrcode": "^1.5.4", "sonner": "^2.0.8", - "zod": "^4.6.1" + "zod": "^4.6.5" }, "peerDependencies": { "@object-ui/plugin-calendar": "workspace:^", @@ -130,10 +130,10 @@ "@object-ui/test-support": "workspace:*", "@types/node": "^26.2.0", "@types/qrcode": "^1.5.6", - "@types/react": "19.2.18", - "@types/react-dom": "19.2.4", - "react": "19.2.8", - "react-dom": "19.2.8", + "@types/react": "19.3.0", + "@types/react-dom": "19.3.0", + "react": "19.3.0", + "react-dom": "19.3.0", "react-router-dom": "^7.18.2", "sonner": "^2.0.8", "typescript": "^6.0.3", diff --git a/packages/app-shell/src/views/metadata-admin/previews/__tests__/block-config-i18n.test.ts b/packages/app-shell/src/views/metadata-admin/previews/__tests__/block-config-i18n.test.ts index 9c89241a35..d6a789cca3 100644 --- a/packages/app-shell/src/views/metadata-admin/previews/__tests__/block-config-i18n.test.ts +++ b/packages/app-shell/src/views/metadata-admin/previews/__tests__/block-config-i18n.test.ts @@ -75,11 +75,11 @@ */ import { describe, it, expect } from 'vitest'; -import { existsSync, readFileSync, readdirSync } from 'node:fs'; +import { readFileSync, readdirSync } from 'node:fs'; import path from 'node:path'; -import { fileURLToPath } from 'node:url'; import { BLOCK_CONFIG, type BlockPropField, type PlaceholderSpec } from '../block-config'; import { t } from '../../i18n'; +import { uiRoot } from '../../../../../../../scripts/ui-root.mjs'; const PREFIX = 'engine.inspector.pageBlock'; @@ -535,18 +535,7 @@ describe('placeholders that must NOT be translated (#3979)', () => { * doc line) must not resurrect one. */ const POSITIONAL_FAMILIES = new Set(['field', 'add', 'option', 'placeholder']); -/** Repo root, found by walking UP to the workspace manifest rather than by - * counting `..` segments, so moving this file retargets nothing silently. */ -function repoRoot(): string { - let dir = path.dirname(fileURLToPath(import.meta.url)); - for (let i = 0; i < 12; i += 1) { - if (existsSync(path.join(dir, 'pnpm-workspace.yaml'))) return dir; - dir = path.dirname(dir); - } - throw new Error('could not locate the repo root (no pnpm-workspace.yaml above this file)'); -} - -const ROOT = repoRoot(); +const ROOT = uiRoot(); const I18N_SOURCE_PATH = path.join( ROOT, 'packages/app-shell/src/views/metadata-admin/i18n.ts', diff --git a/packages/app-shell/src/views/metadata-admin/previews/readme-flow-canvas-draft.test.ts b/packages/app-shell/src/views/metadata-admin/previews/readme-flow-canvas-draft.test.ts index 60816b0080..1c192128c7 100644 --- a/packages/app-shell/src/views/metadata-admin/previews/readme-flow-canvas-draft.test.ts +++ b/packages/app-shell/src/views/metadata-admin/previews/readme-flow-canvas-draft.test.ts @@ -54,32 +54,15 @@ */ import { describe, it, expect } from 'vitest'; -import { readFileSync, existsSync } from 'node:fs'; -import { dirname, join, resolve } from 'node:path'; -import { fileURLToPath } from 'node:url'; +import { readFileSync } from 'node:fs'; +import { join } from 'node:path'; import { stripComments } from 'jsonc-parser'; import { FlowSchema } from '@objectstack/spec/automation'; +import { uiRoot } from '../../../../../../scripts/ui-root.mjs'; -/** - * Walk up to the workspace root, so the README is found by repo layout. - * - * Anchored on this file's own naked `import.meta.url`, never on - * `process.cwd()`: the cwd differs between a repo-root vitest invocation and a - * package-level one, and an assertion that reads the filesystem would otherwise - * grade a different tree depending on how it was started. - */ -function repoRoot(): string { - let dir = dirname(fileURLToPath(import.meta.url)); - for (let i = 0; i < 12; i += 1) { - if (existsSync(join(dir, 'pnpm-workspace.yaml'))) return dir; - dir = resolve(dir, '..'); - } - throw new Error('repo root (pnpm-workspace.yaml) not found from this test file'); -} - -const README = join(repoRoot(), 'packages/app-shell/README.md'); +const README = join(uiRoot(), 'packages/app-shell/README.md'); const SECTION_HEADING = '\n### Visual flow canvas\n'; const ANCHOR = '**JSON shape** (a `flow` draft):'; diff --git a/packages/auth/package.json b/packages/auth/package.json index f35250f4cc..5b76ccd6a1 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -41,8 +41,8 @@ "better-auth": "^1.7.2" }, "devDependencies": { - "@types/react": "19.2.18", - "react": "19.2.8", + "@types/react": "19.3.0", + "react": "19.3.0", "typescript": "^6.0.3", "vitest": "^4.1.10" }, diff --git a/packages/cli/src/utils/scaffold-dependencies.ts b/packages/cli/src/utils/scaffold-dependencies.ts index 5546da9bd0..61c0be268a 100644 --- a/packages/cli/src/utils/scaffold-dependencies.ts +++ b/packages/cli/src/utils/scaffold-dependencies.ts @@ -111,7 +111,7 @@ export function platformPackageRange(): string { * tests: the second is not even wrong about the major, which is exactly how it * survived unnoticed. */ -export const REACT_RANGE = '19.2.8'; +export const REACT_RANGE = '19.3.0'; /** * `devDependencies` shared by every generated manifest (identical in all three). @@ -136,8 +136,8 @@ export const REACT_RANGE = '19.2.8'; */ export const SCAFFOLD_DEV_DEPENDENCIES: Record = { '@tailwindcss/postcss': '^4.3.3', - '@types/react': '19.2.18', - '@types/react-dom': '19.2.4', + '@types/react': '19.3.0', + '@types/react-dom': '19.3.0', '@vitejs/plugin-react': '^6.0.5', autoprefixer: '^10.5.4', postcss: '^8.5.26', diff --git a/packages/collaboration/package.json b/packages/collaboration/package.json index b76929f22a..3f244be52e 100644 --- a/packages/collaboration/package.json +++ b/packages/collaboration/package.json @@ -42,8 +42,8 @@ }, "devDependencies": { "@objectstack/spec": "^18.0.0-next.1", - "@types/react": "19.2.18", - "react": "19.2.8", + "@types/react": "19.3.0", + "react": "19.3.0", "typescript": "^6.0.3", "vitest": "^4.1.10" }, diff --git a/packages/components/package.json b/packages/components/package.json index 798c589de9..fee5d57b1a 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -91,8 +91,8 @@ "@object-ui/test-support": "workspace:*", "@radix-ui/react-focus-scope": "^1.1.16", "@tailwindcss/postcss": "^4.3.3", - "@types/react": "19.2.18", - "@types/react-dom": "19.2.4", + "@types/react": "19.3.0", + "@types/react-dom": "19.3.0", "@vitejs/plugin-react": "^6.0.5", "autoprefixer": "^10.5.4", "jsonc-parser": "^3.3.1", @@ -102,7 +102,7 @@ "typescript": "^6.0.3", "vite": "^8.2.1", "vite-plugin-dts": "^5.0.3", - "zod": "^4.4.3" + "zod": "^4.6.5" }, "keywords": [ "objectui", diff --git a/packages/components/src/__tests__/browser-process-shim-scope.test.ts b/packages/components/src/__tests__/browser-process-shim-scope.test.ts index f3887a64e8..37cc688576 100644 --- a/packages/components/src/__tests__/browser-process-shim-scope.test.ts +++ b/packages/components/src/__tests__/browser-process-shim-scope.test.ts @@ -67,6 +67,7 @@ import { describe, expect, it } from 'vitest'; import { existsSync, readFileSync } from 'node:fs'; import { isAbsolute, join } from 'node:path'; +import { uiRoot } from '../../../../scripts/ui-root.mjs'; /** * The repo root, derived from THIS FILE's own location — never from @@ -124,7 +125,7 @@ describe('browser `process` shim scope (objectui#6809)', () => { // still made and still checked. expect(isAbsolute(cwd)).toBe(true); expect(existsSync(cwd)).toBe(true); - expect(existsSync(join(REPO_ROOT, 'pnpm-workspace.yaml'))).toBe(true); + expect(REPO_ROOT).toBe(uiRoot()); }); it('sees node\'s process surface, not the two-property browser shim', () => { diff --git a/packages/components/src/__tests__/guide-schema-rendering-data-context-8021.test.tsx b/packages/components/src/__tests__/guide-schema-rendering-data-context-8021.test.tsx index 9f42b6bbdd..9d572b3ef9 100644 --- a/packages/components/src/__tests__/guide-schema-rendering-data-context-8021.test.tsx +++ b/packages/components/src/__tests__/guide-schema-rendering-data-context-8021.test.tsx @@ -73,29 +73,14 @@ */ import { describe, it, expect, afterEach } from 'vitest'; import { render, cleanup } from '@testing-library/react'; -import { existsSync, readFileSync } from 'node:fs'; -import { dirname, join, resolve } from 'node:path'; -import { fileURLToPath } from 'node:url'; +import { readFileSync } from 'node:fs'; +import { join } from 'node:path'; import '../renderers'; import { SchemaRenderer, SchemaRendererProvider, PredicateScopeProvider } from '@object-ui/react'; import type { DataSource, TextSchema } from '@object-ui/types'; +import { uiRoot } from '../../../../scripts/ui-root.mjs'; -/** - * Anchored on this file's own naked `import.meta.url`, never on - * `process.cwd()`: the cwd differs between a repo-root vitest invocation and a - * package-level one, and an assertion that reads the filesystem would otherwise - * grade a different tree depending on how it was started (AGENTS.md). - */ -function repoRoot(): string { - let dir = dirname(fileURLToPath(import.meta.url)); - for (let i = 0; i < 12; i += 1) { - if (existsSync(join(dir, 'pnpm-workspace.yaml'))) return dir; - dir = resolve(dir, '..'); - } - throw new Error('repo root (pnpm-workspace.yaml) not found from this test file'); -} - -const ROOT = repoRoot(); +const ROOT = uiRoot(); const GUIDE = 'content/docs/guide/schema-rendering.md'; const readDoc = (rel: string): string => readFileSync(join(ROOT, rel), 'utf8'); diff --git a/packages/core/src/utils/__tests__/filter-icontains-alignment-8976.test.ts b/packages/core/src/utils/__tests__/filter-icontains-alignment-8976.test.ts index 6134576042..2784d3597c 100644 --- a/packages/core/src/utils/__tests__/filter-icontains-alignment-8976.test.ts +++ b/packages/core/src/utils/__tests__/filter-icontains-alignment-8976.test.ts @@ -58,24 +58,15 @@ */ import { describe, it, expect, vi, afterEach } from 'vitest'; -import { existsSync, readFileSync } from 'node:fs'; -import { dirname, join, resolve } from 'node:path'; -import { fileURLToPath } from 'node:url'; +import { readFileSync } from 'node:fs'; +import { join } from 'node:path'; import { FILTER_OPERATORS, VALID_AST_OPERATORS } from '@objectstack/spec/data'; import { convertFiltersToAST, convertOperatorToAST } from '../filter-converter'; import { ValueDataSource } from '../../adapters/ValueDataSource'; - -function repoRoot(): string { - let dir = dirname(fileURLToPath(import.meta.url)); - for (let i = 0; i < 10; i += 1) { - if (existsSync(join(dir, 'pnpm-workspace.yaml'))) return dir; - dir = resolve(dir, '..'); - } - throw new Error('repo root (pnpm-workspace.yaml) not found from this test file'); -} +import { uiRoot } from '../../../../../scripts/ui-root.mjs'; const ADAPTERS_README_PATH = 'packages/core/src/adapters/README.md'; -const ADAPTERS_README = readFileSync(join(repoRoot(), ADAPTERS_README_PATH), 'utf8'); +const ADAPTERS_README = readFileSync(join(uiRoot(), ADAPTERS_README_PATH), 'utf8'); /** * The `$`-spellings `packages/core/src/adapters/README.md` tells an author to diff --git a/packages/core/src/utils/__tests__/normalize-list-view.declaredSpecFloor-9012.test.ts b/packages/core/src/utils/__tests__/normalize-list-view.declaredSpecFloor-9012.test.ts index 4c2e904794..a813091a03 100644 --- a/packages/core/src/utils/__tests__/normalize-list-view.declaredSpecFloor-9012.test.ts +++ b/packages/core/src/utils/__tests__/normalize-list-view.declaredSpecFloor-9012.test.ts @@ -60,6 +60,7 @@ */ import { readFileSync } from 'node:fs'; +import { createRequire } from 'node:module'; import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; import { ListViewSchema as SpecListViewSchema, UserActionsConfigSchema } from '@objectstack/spec/ui'; @@ -87,8 +88,26 @@ const parseVersion = (v: string): [number, number, number] | null => { const isPrerelease = (v: string): boolean => /^\d+\.\d+\.\d+-/.test(v.trim()); -/** The minimum version a `^X.Y.Z` range admits. */ -const floorOf = (range: string): string => range.trim().replace(/^[\^~>=\s]+/, ''); +/** + * The `@objectstack/spec` this package resolves, read from the installed + * manifest: the pinned build standalone, the workspace link to `packages/spec` + * inside the objectstack monorepo (objectstack ruling D1). A `workspace:` range + * publishes as `^`, so this is that range's floor. + */ +const installedSpecVersion = (): string => + (createRequire(import.meta.url)('@objectstack/spec/package.json') as { version: string }).version; + +/** + * The minimum version a range admits: the bare version of a `^X.Y.Z` range, + * and the installed spec's own version for `workspace:*` / `^` / `~` / bare + * (a `workspace:` tail reads as that range). + */ +const floorOf = (range: string): string => { + const workspace = /^workspace:(.*)$/.exec(range.trim()); + if (!workspace) return range.trim().replace(/^[\^~>=\s]+/, ''); + const tail = workspace[1].trim(); + return ['', '*', '^', '~'].includes(tail) ? installedSpecVersion() : floorOf(tail); +}; /** Whether every version `range` admits is at or above `required`. */ const admitsOnlyAtOrAbove = (range: string, required: string): boolean => { @@ -155,7 +174,23 @@ describe('the DECLARED spec floor admits only specs that accept the fold (object // A range it cannot reason about must not read as satisfied. expect(admitsOnlyAtOrAbove('*', REQUIRED_FLOOR)).toBe(false); - expect(admitsOnlyAtOrAbove('workspace:*', REQUIRED_FLOOR)).toBe(false); + }); + + it('reads a workspace: range as the installed spec\'s own version (objectstack ruling D1)', () => { + // Inside the objectstack monorepo this package declares `workspace:^`, + // which publishes as `^`: that version is the floor. + const installed = installedSpecVersion(); + expect(installed).toMatch(/^\d+\.\d+\.\d+/); + for (const range of ['workspace:*', 'workspace:^', 'workspace:~', 'workspace:']) { + expect(floorOf(range), range).toBe(installed); + } + expect(floorOf('workspace:^17.3.0')).toBe('17.3.0'); + // The comparator still fires on it: the installed spec is at or above the + // measured floor (or this package could not build), and below a floor no + // spec has reached. + expect(admitsOnlyAtOrAbove('workspace:^', REQUIRED_FLOOR)).toBe(true); + expect(admitsOnlyAtOrAbove('workspace:^', '9999.0.0')).toBe(false); + expect(admitsOnlyAtOrAbove('workspace:^17.2.0', REQUIRED_FLOOR)).toBe(false); }); }); diff --git a/packages/data-objectstack/src/readme-filter-operator-table.test.ts b/packages/data-objectstack/src/readme-filter-operator-table.test.ts index d94d678145..190c7bd9d5 100644 --- a/packages/data-objectstack/src/readme-filter-operator-table.test.ts +++ b/packages/data-objectstack/src/readme-filter-operator-table.test.ts @@ -117,23 +117,13 @@ */ import { describe, it, expect } from 'vitest'; -import { existsSync, readFileSync } from 'node:fs'; -import { dirname, join, resolve } from 'node:path'; -import { fileURLToPath } from 'node:url'; +import { readFileSync } from 'node:fs'; +import { join } from 'node:path'; import { convertFiltersToAST, convertOperatorToAST } from '@object-ui/core'; import { FILTER_OPERATORS } from '@objectstack/spec/data'; +import { uiRoot } from '../../../scripts/ui-root.mjs'; -/** Walk up to the workspace root, so both files are found by repo layout. */ -function repoRoot(): string { - let dir = dirname(fileURLToPath(import.meta.url)); - for (let i = 0; i < 10; i += 1) { - if (existsSync(join(dir, 'pnpm-workspace.yaml'))) return dir; - dir = resolve(dir, '..'); - } - throw new Error('repo root (pnpm-workspace.yaml) not found from this test file'); -} - -const ROOT = repoRoot(); +const ROOT = uiRoot(); const README_PATH = 'packages/data-objectstack/README.md'; const CONVERTER_PATH = 'packages/core/src/utils/filter-converter.ts'; const README = readFileSync(join(ROOT, README_PATH), 'utf8'); diff --git a/packages/fields/package.json b/packages/fields/package.json index 33da48b9d1..0233ae6b52 100644 --- a/packages/fields/package.json +++ b/packages/fields/package.json @@ -52,8 +52,8 @@ "devDependencies": { "@object-ui/test-support": "workspace:*", "@tailwindcss/postcss": "^4.3.3", - "@types/react": "19.2.18", - "@types/react-dom": "19.2.4", + "@types/react": "19.3.0", + "@types/react-dom": "19.3.0", "@vitejs/plugin-react": "^6.0.5", "postcss": "^8.5.26", "tailwindcss": "^4.3.3", diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 2cd6ac057e..7ca94dfd8d 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -50,8 +50,8 @@ }, "devDependencies": { "@object-ui/test-support": "workspace:*", - "@types/react": "19.2.18", - "react": "19.2.8", + "@types/react": "19.3.0", + "react": "19.3.0", "typescript": "^6.0.3", "vitest": "^4.1.10" }, diff --git a/packages/layout/package.json b/packages/layout/package.json index 9b4700d971..6deebe1b9e 100644 --- a/packages/layout/package.json +++ b/packages/layout/package.json @@ -43,7 +43,7 @@ "@object-ui/sdui-parser": "workspace:*", "@object-ui/test-support": "workspace:*", "@vitejs/plugin-react": "^6.0.5", - "react": "19.2.8", + "react": "19.3.0", "react-router-dom": "^7.18.2", "vite": "^8.2.1", "vite-plugin-dts": "^5.0.3", diff --git a/packages/mobile/package.json b/packages/mobile/package.json index eaedef1861..8836ad3d4e 100644 --- a/packages/mobile/package.json +++ b/packages/mobile/package.json @@ -41,8 +41,8 @@ }, "devDependencies": { "@objectstack/spec": "^18.0.0-next.1", - "@types/react": "19.2.18", - "react": "19.2.8", + "@types/react": "19.3.0", + "react": "19.3.0", "typescript": "^6.0.3", "vitest": "^4.1.10" }, diff --git a/packages/permissions/package.json b/packages/permissions/package.json index 982665ccf2..00a09eb2d1 100644 --- a/packages/permissions/package.json +++ b/packages/permissions/package.json @@ -41,8 +41,8 @@ "@objectstack/spec": "^18.0.0-next.1" }, "devDependencies": { - "@types/react": "19.2.18", - "react": "19.2.8", + "@types/react": "19.3.0", + "react": "19.3.0", "typescript": "^6.0.3", "vitest": "^4.1.10" }, diff --git a/packages/plugin-ai/package.json b/packages/plugin-ai/package.json index 0441d6ca27..d4e7aba220 100644 --- a/packages/plugin-ai/package.json +++ b/packages/plugin-ai/package.json @@ -39,8 +39,8 @@ "devDependencies": { "@object-ui/test-support": "workspace:*", "@types/node": "^26.2.0", - "@types/react": "19.2.18", - "@types/react-dom": "19.2.4", + "@types/react": "19.3.0", + "@types/react-dom": "19.3.0", "@vitejs/plugin-react": "^6.0.5", "vite": "^8.2.1", "vite-plugin-dts": "^5.0.3", diff --git a/packages/plugin-calendar/package.json b/packages/plugin-calendar/package.json index e5381a1d64..b7626ce877 100644 --- a/packages/plugin-calendar/package.json +++ b/packages/plugin-calendar/package.json @@ -49,8 +49,8 @@ "@object-ui/test-support": "workspace:*", "@object-ui/data-objectstack": "workspace:*", "@object-ui/sdui-parser": "workspace:*", - "@types/react": "19.2.18", - "@types/react-dom": "19.2.4", + "@types/react": "19.3.0", + "@types/react-dom": "19.3.0", "@vitejs/plugin-react": "^6.0.5", "typescript": "^6.0.3", "vite": "^8.2.1", diff --git a/packages/plugin-calendar/src/__tests__/name-collision-5044.test.ts b/packages/plugin-calendar/src/__tests__/name-collision-5044.test.ts index 85f275e21a..5708e18d9b 100644 --- a/packages/plugin-calendar/src/__tests__/name-collision-5044.test.ts +++ b/packages/plugin-calendar/src/__tests__/name-collision-5044.test.ts @@ -74,6 +74,7 @@ import type { CalendarEvent as AuthoringCalendarEvent } from '@object-ui/types'; // the old name still compiles" leg: if the alias stopped being a working // export, this file would not compile. import type { CalendarViewEvent, CalendarEvent as DeprecatedRuntimeAlias } from '../index'; +import { uiRoot } from '../../../../scripts/ui-root.mjs'; type Assert = T; type IsAny = 0 extends 1 & T ? true : false; @@ -167,23 +168,9 @@ describe('the CalendarEvent name collision stays resolved', () => { // `CalendarEvent` and this would fail — the compile-time pins above would // not, because they read whatever that name resolves to. const typesSrc = readFileSync( - join(repoRoot(), 'packages/types/src/complex.ts'), + join(uiRoot(), 'packages/types/src/complex.ts'), 'utf8', ); expect(typesSrc).toContain('export interface CalendarEvent {'); }); }); - -/** Walk up to the workspace root, so the type source is found by repo layout. */ -function repoRoot(): string { - let dir = dirname(fileURLToPath(import.meta.url)); - for (let i = 0; i < 10; i += 1) { - try { - readFileSync(join(dir, 'pnpm-workspace.yaml')); - return dir; - } catch { - dir = resolve(dir, '..'); - } - } - throw new Error('repo root (pnpm-workspace.yaml) not found from this test file'); -} diff --git a/packages/plugin-calendar/src/readme-calendar-view-schema.test.ts b/packages/plugin-calendar/src/readme-calendar-view-schema.test.ts index 48432fb493..cb7a33a834 100644 --- a/packages/plugin-calendar/src/readme-calendar-view-schema.test.ts +++ b/packages/plugin-calendar/src/readme-calendar-view-schema.test.ts @@ -51,26 +51,16 @@ */ import { describe, it, expect } from 'vitest'; -import { readFileSync, existsSync } from 'node:fs'; -import { dirname, join, resolve } from 'node:path'; -import { fileURLToPath } from 'node:url'; +import { readFileSync } from 'node:fs'; +import { join } from 'node:path'; // @ts-expect-error — plain-JS shared helper, intentionally untyped (`allowJs: false`) import { maskComments } from '../../../scripts/js-comment-mask.mjs'; +import { uiRoot } from '../../../scripts/ui-root.mjs'; /** Local annotation, since the import above is untyped — the call site stays checked. */ const mask: (source: string) => string = maskComments; -/** Walk up to the workspace root, so the type source is found by repo layout. */ -function repoRoot(): string { - let dir = dirname(fileURLToPath(import.meta.url)); - for (let i = 0; i < 10; i += 1) { - if (existsSync(join(dir, 'pnpm-workspace.yaml'))) return dir; - dir = resolve(dir, '..'); - } - throw new Error('repo root (pnpm-workspace.yaml) not found from this test file'); -} - -const ROOT = repoRoot(); +const ROOT = uiRoot(); const README = join(ROOT, 'packages/plugin-calendar/README.md'); interface Key { diff --git a/packages/plugin-charts/package.json b/packages/plugin-charts/package.json index 825b639b71..93618c9754 100644 --- a/packages/plugin-charts/package.json +++ b/packages/plugin-charts/package.json @@ -46,8 +46,8 @@ "devDependencies": { "@object-ui/test-support": "workspace:*", "@objectstack/spec": "^18.0.0-next.1", - "@types/react": "19.2.18", - "@types/react-dom": "19.2.4", + "@types/react": "19.3.0", + "@types/react-dom": "19.3.0", "@vitejs/plugin-react": "^6.0.5", "typescript": "^6.0.3", "vite": "^8.2.1", diff --git a/packages/plugin-chatbot/package.json b/packages/plugin-chatbot/package.json index 4bfae09345..db8db64cb9 100644 --- a/packages/plugin-chatbot/package.json +++ b/packages/plugin-chatbot/package.json @@ -58,8 +58,8 @@ "react-dom": "^18.0.0 || ^19.0.0" }, "devDependencies": { - "@types/react": "19.2.18", - "@types/react-dom": "19.2.4", + "@types/react": "19.3.0", + "@types/react-dom": "19.3.0", "@vitejs/plugin-react": "^6.0.5", "typescript": "^6.0.3", "vite": "^8.2.1", diff --git a/packages/plugin-dashboard/package.json b/packages/plugin-dashboard/package.json index 4c2fda9f89..a5c2a8ec4e 100644 --- a/packages/plugin-dashboard/package.json +++ b/packages/plugin-dashboard/package.json @@ -45,7 +45,7 @@ "@object-ui/test-support": "workspace:*", "@types/react-grid-layout": "^2.1.0", "@vitejs/plugin-react": "^6.0.5", - "react": "19.2.8", + "react": "19.3.0", "react-grid-layout": "^2.2.4", "typescript": "^6.0.3", "vite": "^8.2.1", diff --git a/packages/plugin-designer/package.json b/packages/plugin-designer/package.json index c1bc16dce5..5ef64db164 100644 --- a/packages/plugin-designer/package.json +++ b/packages/plugin-designer/package.json @@ -50,8 +50,8 @@ }, "devDependencies": { "@types/node": "^26.2.0", - "@types/react": "19.2.18", - "@types/react-dom": "19.2.4", + "@types/react": "19.3.0", + "@types/react-dom": "19.3.0", "@vitejs/plugin-react": "^6.0.5", "vite": "^8.2.1", "vite-plugin-dts": "^5.0.3", diff --git a/packages/plugin-detail/package.json b/packages/plugin-detail/package.json index f888dfcb09..227fc45e2f 100644 --- a/packages/plugin-detail/package.json +++ b/packages/plugin-detail/package.json @@ -55,8 +55,8 @@ "@object-ui/react": "workspace:*", "@object-ui/sdui-parser": "workspace:*", "@object-ui/types": "workspace:*", - "@types/react": "19.2.18", - "@types/react-dom": "19.2.4", + "@types/react": "19.3.0", + "@types/react-dom": "19.3.0", "@vitejs/plugin-react": "^6.0.5", "typescript": "^6.0.3", "vite": "^8.2.1", diff --git a/packages/plugin-detail/src/renderers/__tests__/feedTypeProducerCensus-5877.test.ts b/packages/plugin-detail/src/renderers/__tests__/feedTypeProducerCensus-5877.test.ts index 0120206480..b8bc607491 100644 --- a/packages/plugin-detail/src/renderers/__tests__/feedTypeProducerCensus-5877.test.ts +++ b/packages/plugin-detail/src/renderers/__tests__/feedTypeProducerCensus-5877.test.ts @@ -50,6 +50,7 @@ import { } from '../recordActivityFeed'; // @ts-expect-error — plain-JS shared helper, intentionally untyped (`allowJs: false`) import { maskComments } from '../../../../../scripts/js-comment-mask.mjs'; +import { uiRoot } from '../../../../../scripts/ui-root.mjs'; /** Local annotation, since the import above is untyped — the call site stays checked. */ const mask: (source: string) => string = maskComments; @@ -130,7 +131,7 @@ describe('the producer census the unproduced-kind diagnostic reads (objectui#587 // Every assertion below is of the form "the scan found no producer the // census missed", which a broken walk satisfies trivially. These are the // guards that make a silent narrowing loud instead. - expect(existsSync(path.join(repoRoot, 'pnpm-workspace.yaml'))).toBe(true); + expect(repoRoot).toBe(uiRoot()); expect(sourceFiles.length).toBeGreaterThan(1000); for (const top of ['packages', 'apps', 'examples', 'scripts']) { expect( diff --git a/packages/plugin-editor/package.json b/packages/plugin-editor/package.json index a8b493318e..55b0e3cb5e 100644 --- a/packages/plugin-editor/package.json +++ b/packages/plugin-editor/package.json @@ -41,8 +41,8 @@ "react-dom": "^18.0.0 || ^19.0.0" }, "devDependencies": { - "@types/react": "19.2.18", - "@types/react-dom": "19.2.4", + "@types/react": "19.3.0", + "@types/react-dom": "19.3.0", "@vitejs/plugin-react": "^6.0.5", "typescript": "^6.0.3", "vite": "^8.2.1", diff --git a/packages/plugin-gantt/package.json b/packages/plugin-gantt/package.json index f4c8c760ee..66c7f6f170 100644 --- a/packages/plugin-gantt/package.json +++ b/packages/plugin-gantt/package.json @@ -50,8 +50,8 @@ "devDependencies": { "@object-ui/test-support": "workspace:*", "@object-ui/sdui-parser": "workspace:*", - "@types/react": "19.2.18", - "@types/react-dom": "19.2.4", + "@types/react": "19.3.0", + "@types/react-dom": "19.3.0", "@vitejs/plugin-react": "^6.0.5", "typescript": "^6.0.3", "vite": "^8.2.1", diff --git a/packages/plugin-gantt/src/readme-navigation-example.test.ts b/packages/plugin-gantt/src/readme-navigation-example.test.ts index 12856a067c..c3ee814aea 100644 --- a/packages/plugin-gantt/src/readme-navigation-example.test.ts +++ b/packages/plugin-gantt/src/readme-navigation-example.test.ts @@ -92,23 +92,13 @@ */ import { describe, it, expect } from 'vitest'; -import { readFileSync, existsSync } from 'node:fs'; -import { dirname, join, resolve } from 'node:path'; -import { fileURLToPath } from 'node:url'; +import { readFileSync } from 'node:fs'; +import { join } from 'node:path'; import { NavigationConfigSchema } from '@objectstack/spec/ui'; +import { uiRoot } from '../../../scripts/ui-root.mjs'; -/** Walk up to the workspace root, so the README is found by repo layout. */ -function repoRoot(): string { - let dir = dirname(fileURLToPath(import.meta.url)); - for (let i = 0; i < 10; i += 1) { - if (existsSync(join(dir, 'pnpm-workspace.yaml'))) return dir; - dir = resolve(dir, '..'); - } - throw new Error('repo root (pnpm-workspace.yaml) not found from this test file'); -} - -const README = join(repoRoot(), 'packages/plugin-gantt/README.md'); +const README = join(uiRoot(), 'packages/plugin-gantt/README.md'); /** The bullet that documents the override, and the sentence that introduces it. */ const SECTION_HEADING = '\n### Create / Edit / Delete / View\n'; diff --git a/packages/plugin-kanban/package.json b/packages/plugin-kanban/package.json index 9d4cf8ae1d..59c9bc6045 100644 --- a/packages/plugin-kanban/package.json +++ b/packages/plugin-kanban/package.json @@ -54,8 +54,8 @@ "@object-ui/sdui-parser": "workspace:*", "@object-ui/test-support": "workspace:*", "@tailwindcss/postcss": "^4.3.3", - "@types/react": "19.2.18", - "@types/react-dom": "19.2.4", + "@types/react": "19.3.0", + "@types/react-dom": "19.3.0", "@vitejs/plugin-react": "^6.0.5", "postcss": "^8.5.26", "tailwindcss": "^4.3.3", diff --git a/packages/plugin-list/package.json b/packages/plugin-list/package.json index 51693fc344..05a273589b 100644 --- a/packages/plugin-list/package.json +++ b/packages/plugin-list/package.json @@ -57,8 +57,8 @@ "@object-ui/test-support": "workspace:*", "@object-ui/types": "workspace:*", "@objectstack/spec": "^18.0.0-next.1", - "@types/react": "19.2.18", - "@types/react-dom": "19.2.4", + "@types/react": "19.3.0", + "@types/react-dom": "19.3.0", "@vitejs/plugin-react": "^6.0.5", "typescript": "^6.0.3", "vite": "^8.2.1", diff --git a/packages/plugin-map/package.json b/packages/plugin-map/package.json index 4cfc2f29c5..e454a39a71 100644 --- a/packages/plugin-map/package.json +++ b/packages/plugin-map/package.json @@ -46,8 +46,8 @@ "devDependencies": { "@object-ui/plugin-list": "workspace:*", "@object-ui/sdui-parser": "workspace:*", - "@types/react": "19.2.18", - "@types/react-dom": "19.2.4", + "@types/react": "19.3.0", + "@types/react-dom": "19.3.0", "@vitejs/plugin-react": "^6.0.5", "typescript": "^6.0.3", "vite": "^8.2.1", diff --git a/packages/plugin-markdown/package.json b/packages/plugin-markdown/package.json index 4ff89d17fc..bc8a058b00 100644 --- a/packages/plugin-markdown/package.json +++ b/packages/plugin-markdown/package.json @@ -49,8 +49,8 @@ "react-dom": "^18.0.0 || ^19.0.0" }, "devDependencies": { - "@types/react": "19.2.18", - "@types/react-dom": "19.2.4", + "@types/react": "19.3.0", + "@types/react-dom": "19.3.0", "@vitejs/plugin-react": "^6.0.5", "typescript": "^6.0.3", "vite": "^8.2.1", diff --git a/packages/plugin-report/package.json b/packages/plugin-report/package.json index 179e3d4802..79e79214d6 100644 --- a/packages/plugin-report/package.json +++ b/packages/plugin-report/package.json @@ -42,8 +42,8 @@ "@object-ui/test-support": "workspace:*", "@objectstack/spec": "^18.0.0-next.1", "@types/node": "^26.2.0", - "@types/react": "19.2.18", - "@types/react-dom": "19.2.4", + "@types/react": "19.3.0", + "@types/react-dom": "19.3.0", "@vitejs/plugin-react": "^6.0.5", "vite": "^8.2.1", "vite-plugin-dts": "^5.0.3", diff --git a/packages/plugin-timeline/package.json b/packages/plugin-timeline/package.json index 2e1dd69d7c..c25d75d70d 100644 --- a/packages/plugin-timeline/package.json +++ b/packages/plugin-timeline/package.json @@ -40,7 +40,7 @@ "@object-ui/types": "workspace:*", "@objectstack/spec": "^18.0.0-next.1", "class-variance-authority": "^0.7.1", - "zod": "^4.4.3" + "zod": "^4.6.5" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", @@ -50,8 +50,8 @@ "@object-ui/data-objectstack": "workspace:*", "@object-ui/sdui-parser": "workspace:*", "@object-ui/test-support": "workspace:*", - "@types/react": "19.2.18", - "@types/react-dom": "19.2.4", + "@types/react": "19.3.0", + "@types/react-dom": "19.3.0", "@vitejs/plugin-react": "^6.0.5", "typescript": "^6.0.3", "vite": "^8.2.1", diff --git a/packages/plugin-tree/package.json b/packages/plugin-tree/package.json index eed5b095a2..39d680e9e7 100644 --- a/packages/plugin-tree/package.json +++ b/packages/plugin-tree/package.json @@ -49,8 +49,8 @@ "devDependencies": { "@object-ui/sdui-parser": "workspace:*", "@object-ui/test-support": "workspace:*", - "@types/react": "19.2.18", - "@types/react-dom": "19.2.4", + "@types/react": "19.3.0", + "@types/react-dom": "19.3.0", "@vitejs/plugin-react": "^6.0.5", "typescript": "^6.0.3", "vite": "^8.2.1", diff --git a/packages/providers/package.json b/packages/providers/package.json index 4e061c9b6c..a7e844912a 100644 --- a/packages/providers/package.json +++ b/packages/providers/package.json @@ -37,8 +37,8 @@ "react-dom": "^18.0.0 || ^19.0.0" }, "devDependencies": { - "@types/react": "19.2.18", - "@types/react-dom": "19.2.4", + "@types/react": "19.3.0", + "@types/react-dom": "19.3.0", "typescript": "^6.0.3" }, "keywords": [ diff --git a/packages/react/package.json b/packages/react/package.json index 728eca422f..423392a55d 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -42,8 +42,8 @@ }, "devDependencies": { "@object-ui/test-support": "workspace:*", - "@types/react": "19.2.18", - "@types/react-dom": "19.2.4", + "@types/react": "19.3.0", + "@types/react-dom": "19.3.0", "typescript": "^6.0.3" }, "keywords": [ diff --git a/packages/react/src/context/__tests__/useRecordContext.bindingCast.pin.test.ts b/packages/react/src/context/__tests__/useRecordContext.bindingCast.pin.test.ts index 16b64ac884..1a1d5d77d4 100644 --- a/packages/react/src/context/__tests__/useRecordContext.bindingCast.pin.test.ts +++ b/packages/react/src/context/__tests__/useRecordContext.bindingCast.pin.test.ts @@ -57,6 +57,7 @@ import path from 'node:path'; import { fileURLToPath } from 'node:url'; import type { DataSource } from '@object-ui/types'; import type { useRecordContext, RecordContextValue } from '../RecordContext'; +import { uiRoot } from '../../../../../scripts/ui-root.mjs'; /* ------------------------------------------------------------------ * * Compile-time half — erased at runtime; `tsc -p tsconfig.test.json` @@ -254,7 +255,7 @@ const KNOWN_CONSUMERS = [ describe('the instrument can fire (controls)', () => { it('anchors on this file, not on the cwd', () => { - expect(existsSync(path.join(repoRoot, 'pnpm-workspace.yaml'))).toBe(true); + expect(repoRoot).toBe(uiRoot()); expect(existsSync(path.join(repoRoot, 'packages/react/src/context/RecordContext.tsx'))).toBe( true, ); diff --git a/packages/react/src/hooks/__tests__/useNavigationOverlay.onRowClickArity-9357.test.tsx b/packages/react/src/hooks/__tests__/useNavigationOverlay.onRowClickArity-9357.test.tsx index f7ceec87e8..876087afce 100644 --- a/packages/react/src/hooks/__tests__/useNavigationOverlay.onRowClickArity-9357.test.tsx +++ b/packages/react/src/hooks/__tests__/useNavigationOverlay.onRowClickArity-9357.test.tsx @@ -67,6 +67,7 @@ import type { NavigationOverlayState, UseNavigationOverlayOptions, } from '../useNavigationOverlay'; +import { uiRoot } from '../../../../../scripts/ui-root.mjs'; /* ------------------------------------------------------------------ * * COMPILE-TIME half — erased at runtime. `tsc -p tsconfig.test.json` @@ -260,7 +261,7 @@ const DIRECT_TWO_ARGUMENT_CALL = /\bonRowClick\(\s*record\s*,\s*event\s*\)/; describe('the instrument can fire (controls)', () => { it('anchors on this file, not on the cwd', () => { - expect(existsSync(path.join(repoRoot, 'pnpm-workspace.yaml'))).toBe(true); + expect(repoRoot).toBe(uiRoot()); expect(existsSync(HOOK_ABS)).toBe(true); }); diff --git a/packages/runner/package.json b/packages/runner/package.json index e651e262ba..65e3c1c82c 100644 --- a/packages/runner/package.json +++ b/packages/runner/package.json @@ -29,15 +29,15 @@ "@object-ui/react": "workspace:*", "@object-ui/types": "workspace:*", "lucide-react": "^1.43.0", - "react": "19.2.8", - "react-dom": "19.2.8", + "react": "19.3.0", + "react-dom": "19.3.0", "tailwindcss-animate": "^1.0.7" }, "devDependencies": { "@objectstack/spec": "^18.0.0-next.1", "@tailwindcss/postcss": "^4.3.3", - "@types/react": "19.2.18", - "@types/react-dom": "19.2.4", + "@types/react": "19.3.0", + "@types/react-dom": "19.3.0", "@vitejs/plugin-react": "^6.0.5", "autoprefixer": "^10.5.4", "postcss": "^8.5.26", diff --git a/packages/sdui-parser/src/__tests__/dashboard-widget-options-census.test.ts b/packages/sdui-parser/src/__tests__/dashboard-widget-options-census.test.ts index 2ddb613f93..79ae3d6540 100644 --- a/packages/sdui-parser/src/__tests__/dashboard-widget-options-census.test.ts +++ b/packages/sdui-parser/src/__tests__/dashboard-widget-options-census.test.ts @@ -49,8 +49,7 @@ * files. */ import { readFileSync, readdirSync, existsSync } from 'node:fs'; -import { dirname, join, relative } from 'node:path'; -import { fileURLToPath } from 'node:url'; +import { join, relative } from 'node:path'; import { describe, expect, it } from 'vitest'; import { DashboardWidgetOptionsSchema, DashboardWidgetSchema } from '@objectstack/spec/ui'; // @ts-expect-error — plain-JS shared helper, intentionally untyped (`allowJs: false`) @@ -59,6 +58,7 @@ import { CONSUMED_WIDGET_OPTION_KEYS, UNCONSUMED_WIDGET_OPTION, } from '../dashboard-widget-options.js'; +import { uiRoot } from '../../../../scripts/ui-root.mjs'; /** * The RETIRED metric sub-caption key (objectui#4032 item 4, objectui#7293; @@ -69,16 +69,8 @@ import { */ const SUBCAPTION_KEY = 'description'; -/** Repo root, located by marker file — never by counting `..` segments. */ -const repoRoot = (() => { - let dir = dirname(fileURLToPath(import.meta.url)); - while (!existsSync(join(dir, 'pnpm-workspace.yaml'))) { - const parent = dirname(dir); - if (parent === dir) throw new Error('pnpm-workspace.yaml not found above test file'); - dir = parent; - } - return dir; -})(); +/** Repo root, resolved by the shared helper so the same file reads the same tree standalone and under `ui/`. */ +const repoRoot = uiRoot(); const DATASET_WIDGET = join(repoRoot, 'packages/plugin-dashboard/src/DatasetWidget.tsx'); const DASHBOARD_RENDERER = join(repoRoot, 'packages/plugin-dashboard/src/DashboardRenderer.tsx'); diff --git a/packages/test-support/package.json b/packages/test-support/package.json index b9197e46ac..bd2a9b30c1 100644 --- a/packages/test-support/package.json +++ b/packages/test-support/package.json @@ -25,7 +25,7 @@ "@objectstack/spec": "^18.0.0-next.1", "@types/node": "^26.2.0", "typescript": "^6.0.3", - "zod": "^4.4.3" + "zod": "^4.6.5" }, "repository": { "type": "git", diff --git a/packages/types/package.json b/packages/types/package.json index fffdf7e1f5..eaaaa376d5 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -94,7 +94,7 @@ }, "dependencies": { "@objectstack/spec": "^18.0.0-next.5", - "zod": "^4.6.1" + "zod": "^4.6.5" }, "devDependencies": { "@object-ui/test-support": "workspace:*", diff --git a/packages/types/src/__tests__/calendar-doc-key-set-8830.test.ts b/packages/types/src/__tests__/calendar-doc-key-set-8830.test.ts index 2d2522c416..cfa992eab9 100644 --- a/packages/types/src/__tests__/calendar-doc-key-set-8830.test.ts +++ b/packages/types/src/__tests__/calendar-doc-key-set-8830.test.ts @@ -54,28 +54,18 @@ */ import { describe, it, expect } from 'vitest'; -import { readFileSync, existsSync } from 'node:fs'; -import { dirname, join, resolve } from 'node:path'; -import { fileURLToPath } from 'node:url'; +import { readFileSync } from 'node:fs'; +import { join } from 'node:path'; import { CalendarConfigSchema } from '@objectstack/spec/ui'; // @ts-expect-error — plain-JS shared helper, intentionally untyped (`allowJs: false`) import { maskComments } from '../../../../scripts/js-comment-mask.mjs'; +import { uiRoot } from '../../../../scripts/ui-root.mjs'; /** Local annotation, since the import above is untyped — the call site stays checked. */ const mask: (source: string) => string = maskComments; -/** Walk up to the workspace root, so both sources are found by repo layout. */ -function repoRoot(): string { - let dir = dirname(fileURLToPath(import.meta.url)); - for (let i = 0; i < 10; i += 1) { - if (existsSync(join(dir, 'pnpm-workspace.yaml'))) return dir; - dir = resolve(dir, '..'); - } - throw new Error('repo root (pnpm-workspace.yaml) not found from this test file'); -} - -const ROOT = repoRoot(); +const ROOT = uiRoot(); const RENDERER = join(ROOT, 'packages/plugin-calendar/src/ObjectCalendar.tsx'); const DOC_PAGE = join(ROOT, 'content/docs/plugins/plugin-calendar.mdx'); const SECTION = '### CalendarConfig'; diff --git a/packages/types/src/__tests__/chart-type-doc-row-11521.test.ts b/packages/types/src/__tests__/chart-type-doc-row-11521.test.ts index 6b879d0e23..cc3d1bab4d 100644 --- a/packages/types/src/__tests__/chart-type-doc-row-11521.test.ts +++ b/packages/types/src/__tests__/chart-type-doc-row-11521.test.ts @@ -54,15 +54,15 @@ */ import { describe, it, expect } from 'vitest'; -import { existsSync, readFileSync } from 'node:fs'; -import { dirname, join, resolve } from 'node:path'; -import { fileURLToPath } from 'node:url'; +import { readFileSync } from 'node:fs'; +import { join } from 'node:path'; import type { z } from 'zod'; import { ChartTypeSchema as SpecChartTypeSchema, type ChartType as SpecChartType } from '@objectstack/spec/ui'; import { enumOptions, shapeEnumOptions } from '@object-ui/test-support'; import { ChartSchema } from '../zod/data-display.zod.js'; import { safeValidateSchema, StrictAnyComponentSchema } from '../zod/index.zod.js'; import type { ChartSchema as ChartSchemaType, ChartType } from '../data-display.js'; +import { uiRoot } from '../../../../scripts/ui-root.mjs'; interface Issue { code: string; @@ -73,23 +73,13 @@ interface Issue { const issuesOf = (r: { success: boolean; error?: { issues: unknown[] } }): Issue[] => r.success ? [] : (r.error!.issues as Issue[]); -/** Walk up to the workspace root from this file, so the page is found by repo layout. */ -function repoRoot(): string { - let dir = dirname(fileURLToPath(import.meta.url)); - for (let i = 0; i < 10; i += 1) { - if (existsSync(join(dir, 'pnpm-workspace.yaml'))) return dir; - dir = resolve(dir, '..'); - } - throw new Error('repo root (pnpm-workspace.yaml) not found from this test file'); -} - const DOC = 'content/docs/api/schema-reference.md'; const HEADING = '\n### ChartSchema\n'; const ROW_PREFIX = '| `chartType` |'; /** The `chartType` row of the `ChartSchema` table, split into its cells. */ function chartTypeRow(): string[] { - const src = readFileSync(join(repoRoot(), DOC), 'utf8'); + const src = readFileSync(join(uiRoot(), DOC), 'utf8'); const start = src.indexOf(HEADING); if (start < 0) throw new Error(`"${HEADING.trim()}" heading not found in ${DOC}: the section moved`); const end = src.indexOf('\n### ', start + HEADING.length); diff --git a/packages/types/src/__tests__/object-calendar-container-by-reference-6152.test.ts b/packages/types/src/__tests__/object-calendar-container-by-reference-6152.test.ts index 5ef30ea78c..1dc9e7b20b 100644 --- a/packages/types/src/__tests__/object-calendar-container-by-reference-6152.test.ts +++ b/packages/types/src/__tests__/object-calendar-container-by-reference-6152.test.ts @@ -32,8 +32,7 @@ */ import { describe, it, expect } from 'vitest'; import { existsSync, readFileSync, readdirSync } from 'node:fs'; -import { dirname, join, relative, resolve } from 'node:path'; -import { fileURLToPath } from 'node:url'; +import { join, relative } from 'node:path'; import ts from 'typescript'; @@ -45,6 +44,7 @@ import type { ObjectCalendarProps as SpecObjectCalendarProps } from '@objectstac import type { ObjectCalendarBlockConfig, ObjectCalendarSchema as TsObjectCalendarSchema } from '../objectql'; import { ObjectCalendarSchema } from '../zod/objectql.zod.js'; import { AnyComponentSchema, StrictAnyComponentSchema, safeValidateSchema } from '../zod/index.zod.js'; +import { uiRoot } from '../../../../scripts/ui-root.mjs'; /* ── Instruments ─────────────────────────────────────────────────────────────── */ @@ -277,17 +277,7 @@ describe('objectui#6152 round 9 — the TypeScript face is closed the same way', /* ── 6. The corpus census ───────────────────────────────────────────────────── */ -/** Walk up to the workspace root, so the corpus is found by repo layout, never by `process.cwd()`. */ -function repoRoot(): string { - let dir = dirname(fileURLToPath(import.meta.url)); - for (let i = 0; i < 10; i += 1) { - if (existsSync(join(dir, 'pnpm-workspace.yaml'))) return dir; - dir = resolve(dir, '..'); - } - throw new Error('repo root (pnpm-workspace.yaml) not found from this test file'); -} - -const ROOT = repoRoot(); +const ROOT = uiRoot(); /** * The AUTHORED corpus: the examples and the schema catalog, the docs site, the published * skills, the docs tree, the apps (the console's fixtures among them), and every package diff --git a/packages/types/src/__tests__/readme-kanban-example-8256.test.ts b/packages/types/src/__tests__/readme-kanban-example-8256.test.ts index fff59bb18b..ed744166d3 100644 --- a/packages/types/src/__tests__/readme-kanban-example-8256.test.ts +++ b/packages/types/src/__tests__/readme-kanban-example-8256.test.ts @@ -44,23 +44,13 @@ */ import { describe, expect, it } from 'vitest'; -import { existsSync, readFileSync } from 'node:fs'; -import { dirname, join, resolve } from 'node:path'; -import { fileURLToPath } from 'node:url'; +import { readFileSync } from 'node:fs'; +import { join } from 'node:path'; import { safeValidateSchema } from '../zod/index.zod'; +import { uiRoot } from '../../../../scripts/ui-root.mjs'; -/** Walk up to the workspace root, so the README is found by repo layout. */ -function repoRoot(): string { - let dir = dirname(fileURLToPath(import.meta.url)); - for (let i = 0; i < 10; i += 1) { - if (existsSync(join(dir, 'pnpm-workspace.yaml'))) return dir; - dir = resolve(dir, '..'); - } - throw new Error('repo root (pnpm-workspace.yaml) not found from this test file'); -} - -const README = join(repoRoot(), 'README.md'); +const README = join(uiRoot(), 'README.md'); const HEADING = 'Kanban Board'; /** The README section this example lives in, bounded to its own heading. */ diff --git a/packages/types/src/__tests__/schema-reference-named-list-view-keys-7923.test.ts b/packages/types/src/__tests__/schema-reference-named-list-view-keys-7923.test.ts index 744aa531cb..9d2f8c6fe4 100644 --- a/packages/types/src/__tests__/schema-reference-named-list-view-keys-7923.test.ts +++ b/packages/types/src/__tests__/schema-reference-named-list-view-keys-7923.test.ts @@ -60,26 +60,16 @@ */ import { describe, it, expect } from 'vitest'; -import { readFileSync, existsSync } from 'node:fs'; -import { dirname, join, resolve } from 'node:path'; -import { fileURLToPath } from 'node:url'; +import { readFileSync } from 'node:fs'; +import { join } from 'node:path'; // @ts-expect-error — plain-JS shared helper, intentionally untyped (`allowJs: false`) import { maskComments } from '../../../../scripts/js-comment-mask.mjs'; +import { uiRoot } from '../../../../scripts/ui-root.mjs'; /** Local annotation, since the import above is untyped — the call site stays checked. */ const mask: (source: string) => string = maskComments; -/** Walk up to the workspace root, so both sources are found by repo layout. */ -function repoRoot(): string { - let dir = dirname(fileURLToPath(import.meta.url)); - for (let i = 0; i < 10; i += 1) { - if (existsSync(join(dir, 'pnpm-workspace.yaml'))) return dir; - dir = resolve(dir, '..'); - } - throw new Error('repo root (pnpm-workspace.yaml) not found from this test file'); -} - -const ROOT = repoRoot(); +const ROOT = uiRoot(); const DOC = 'content/docs/api/schema-reference.md'; const DECLARATION = 'packages/types/src/objectql.ts'; const HEADING = '\n### ObjectViewSchema\n'; diff --git a/packages/types/src/__tests__/sidebar-declared-surface-11465.test.ts b/packages/types/src/__tests__/sidebar-declared-surface-11465.test.ts index 240e05adae..c345d1aab0 100644 --- a/packages/types/src/__tests__/sidebar-declared-surface-11465.test.ts +++ b/packages/types/src/__tests__/sidebar-declared-surface-11465.test.ts @@ -45,13 +45,13 @@ */ import { describe, expect, it } from 'vitest'; -import { existsSync, readFileSync } from 'node:fs'; -import { dirname, join, resolve } from 'node:path'; -import { fileURLToPath } from 'node:url'; +import { readFileSync } from 'node:fs'; +import { join } from 'node:path'; import type { z } from 'zod'; import { SidebarSchema, StrictAnyComponentSchema, safeValidateSchema } from '../zod/index.zod.js'; import type { SidebarSchema as Ts_SidebarSchema } from '../navigation'; +import { uiRoot } from '../../../../scripts/ui-root.mjs'; /* ── Type-level pins: the `tsc` channel ────────────────────────────────────── */ @@ -242,17 +242,7 @@ describe('`variant` takes the renderer\'s enum (objectui#11465)', () => { /* ── The README leg ───────────────────────────────────────────────────────── */ -/** Walk up to the workspace root, so the README is found by repo layout. */ -function repoRoot(): string { - let dir = dirname(fileURLToPath(import.meta.url)); - for (let i = 0; i < 10; i += 1) { - if (existsSync(join(dir, 'pnpm-workspace.yaml'))) return dir; - dir = resolve(dir, '..'); - } - throw new Error('repo root (pnpm-workspace.yaml) not found from this test file'); -} - -const README = join(repoRoot(), 'packages/types/README.md'); +const README = join(uiRoot(), 'packages/types/README.md'); const HEADING = '### 4. Composable'; const OPENER = 'const sidebar: SidebarSchema = {'; diff --git a/packages/types/src/__tests__/zod-readme-examples-9522.test.ts b/packages/types/src/__tests__/zod-readme-examples-9522.test.ts index 1a63746a10..ab20965441 100644 --- a/packages/types/src/__tests__/zod-readme-examples-9522.test.ts +++ b/packages/types/src/__tests__/zod-readme-examples-9522.test.ts @@ -51,24 +51,14 @@ */ import { describe, expect, it } from 'vitest'; -import { existsSync, readFileSync } from 'node:fs'; -import { dirname, join, resolve } from 'node:path'; -import { fileURLToPath } from 'node:url'; +import { readFileSync } from 'node:fs'; +import { join } from 'node:path'; import ts from 'typescript'; import * as zod from '../zod/index.zod'; +import { uiRoot } from '../../../../scripts/ui-root.mjs'; -/** Walk up to the workspace root, so the README is found by repo layout. */ -function repoRoot(): string { - let dir = dirname(fileURLToPath(import.meta.url)); - for (let i = 0; i < 10; i += 1) { - if (existsSync(join(dir, 'pnpm-workspace.yaml'))) return dir; - dir = resolve(dir, '..'); - } - throw new Error('repo root (pnpm-workspace.yaml) not found from this test file'); -} - -const README = join(repoRoot(), 'packages/types/src/zod/README.md'); +const README = join(uiRoot(), 'packages/types/src/zod/README.md'); /** * What an initialiser evaluates to when it is not a literal. Kept as a PRESENT diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8e7c9fa15b..f56de5cb1b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,10 +5,10 @@ settings: excludeLinksFromLockfile: false overrides: - react: 19.2.8 - react-dom: 19.2.8 - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 + react: 19.3.0 + react-dom: 19.3.0 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 dompurify: ^3.4.5 qs@<6.15.2: ^6.15.2 shell-quote@<1.8.4: ^1.8.4 @@ -54,7 +54,7 @@ importers: version: 7.0.1(@testing-library/dom@10.4.1)(vitest@4.1.10) '@testing-library/react': specifier: ^16.3.2 - version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@testing-library/user-event': specifier: ^14.6.4 version: 14.6.4(@testing-library/dom@10.4.1) @@ -62,11 +62,11 @@ importers: specifier: ^26.2.0 version: 26.2.0 '@types/react': - specifier: 19.2.18 - version: 19.2.18 + specifier: 19.3.0 + version: 19.3.0 '@types/react-dom': - specifier: 19.2.4 - version: 19.2.4(@types/react@19.2.18) + specifier: 19.3.0 + version: 19.3.0(@types/react@19.3.0) '@vitest/coverage-v8': specifier: ^4.1.10 version: 4.1.10(vitest@4.1.10) @@ -107,17 +107,17 @@ importers: specifier: ^1.62.1 version: 1.62.1 react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) react-i18next: specifier: ^17.0.11 - version: 17.0.11(i18next@26.4.0(typescript@6.0.3))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + version: 17.0.11(i18next@26.4.0(typescript@6.0.3))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(typescript@6.0.3) react-router-dom: specifier: ^7.18.2 - version: 7.18.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 7.18.2(react-dom@19.3.0(react@19.3.0))(react@19.3.0) remark-mdx: specifier: ^3.1.1 version: 3.1.1 @@ -175,13 +175,13 @@ importers: devDependencies: '@dnd-kit/core': specifier: ^6.3.1 - version: 6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 6.3.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@dnd-kit/sortable': specifier: ^10.0.0 - version: 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8) + version: 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0) '@dnd-kit/utilities': specifier: ^3.2.2 - version: 3.2.2(react@19.2.8) + version: 3.2.2(react@19.3.0) '@object-ui/app-shell': specifier: workspace:* version: link:../../packages/app-shell @@ -298,7 +298,7 @@ importers: version: 7.0.1(@testing-library/dom@10.4.1)(vitest@4.1.10) '@testing-library/react': specifier: ^16.3.2 - version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@testing-library/user-event': specifier: ^14.6.4 version: 14.6.4(@testing-library/dom@10.4.1) @@ -306,11 +306,11 @@ importers: specifier: ^26.2.0 version: 26.2.0 '@types/react': - specifier: 19.2.18 - version: 19.2.18 + specifier: 19.3.0 + version: 19.3.0 '@types/react-dom': - specifier: 19.2.4 - version: 19.2.4(@types/react@19.2.18) + specifier: 19.3.0 + version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': specifier: ^6.0.5 version: 6.0.5(vite@8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) @@ -325,25 +325,25 @@ importers: version: 20.11.2 lucide-react: specifier: ^1.43.0 - version: 1.43.0(react@19.2.8) + version: 1.43.0(react@19.3.0) postcss: specifier: ^8.5.26 version: 8.5.31 react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) react-map-gl: specifier: ^8.1.2 - version: 8.1.2(maplibre-gl@6.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 8.1.2(maplibre-gl@6.4.1)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) react-router-dom: specifier: ^7.18.2 - version: 7.18.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 7.18.2(react-dom@19.3.0(react@19.3.0))(react@19.3.0) sonner: specifier: ^2.0.8 - version: 2.0.8(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 2.0.8(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) tailwindcss: specifier: ^4.3.3 version: 4.3.3 @@ -361,7 +361,7 @@ importers: dependencies: '@monaco-editor/react': specifier: ^4.7.0 - version: 4.7.0(monaco-editor@0.55.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 4.7.0(monaco-editor@0.55.1)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@object-ui/components': specifier: workspace:* version: link:../../packages/components @@ -427,25 +427,25 @@ importers: version: file:.objectstack-pin/spec(ai@7.0.65(zod@4.6.7)) fumadocs-core: specifier: 16.15.4 - version: 16.15.4(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.43.0(react@19.2.8))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react-router@7.18.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)(zod@4.6.7) + version: 16.15.4(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.8(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.43.0(react@19.3.0))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react-router@7.18.2(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)(zod@4.6.7) fumadocs-mdx: specifier: 15.2.3 - version: 15.2.3(@types/mdast@4.0.4)(@types/mdx@2.0.14)(@types/react@19.2.18)(fumadocs-core@16.15.4(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.43.0(react@19.2.8))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react-router@7.18.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)(zod@4.6.7))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)(rolldown@1.2.15)(vite@8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + version: 15.2.3(@types/mdast@4.0.4)(@types/mdx@2.0.14)(@types/react@19.3.0)(fumadocs-core@16.15.4(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.8(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.43.0(react@19.3.0))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react-router@7.18.2(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)(zod@4.6.7))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)(rolldown@1.2.15)(vite@8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) fumadocs-ui: specifier: 16.15.4 - version: 16.15.4(@types/mdx@2.0.14)(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(fumadocs-core@16.15.4(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.43.0(react@19.2.8))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react-router@7.18.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)(zod@4.6.7))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(tailwindcss@4.3.3) + version: 16.15.4(@types/mdx@2.0.14)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(fumadocs-core@16.15.4(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.8(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.43.0(react@19.3.0))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react-router@7.18.2(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)(zod@4.6.7))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(tailwindcss@4.3.3) lucide-react: specifier: ^1.43.0 - version: 1.43.0(react@19.2.8) + version: 1.43.0(react@19.3.0) next: specifier: 16.3.8 - version: 16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) tailwind-merge: specifier: ^3.6.0 version: 3.6.0 @@ -460,11 +460,11 @@ importers: specifier: ^26.2.0 version: 26.2.0 '@types/react': - specifier: 19.2.18 - version: 19.2.18 + specifier: 19.3.0 + version: 19.3.0 '@types/react-dom': - specifier: 19.2.4 - version: 19.2.4(@types/react@19.2.18) + specifier: 19.3.0 + version: 19.3.0(@types/react@19.3.0) postcss: specifier: ^8.5.26 version: 8.5.31 @@ -502,24 +502,24 @@ importers: specifier: workspace:* version: link:../../packages/types react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) react-router-dom: specifier: ^7.18.2 - version: 7.18.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 7.18.2(react-dom@19.3.0(react@19.3.0))(react@19.3.0) devDependencies: '@tailwindcss/postcss': specifier: ^4.3.3 version: 4.3.3 '@types/react': - specifier: 19.2.18 - version: 19.2.18 + specifier: 19.3.0 + version: 19.3.0 '@types/react-dom': - specifier: 19.2.4 - version: 19.2.4(@types/react@19.2.18) + specifier: 19.3.0 + version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': specifier: ^6.0.5 version: 6.0.5(vite@8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) @@ -605,27 +605,27 @@ importers: specifier: workspace:* version: link:../../packages/sdui-parser react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) react-router-dom: specifier: ^7.18.2 - version: 7.18.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 7.18.2(react-dom@19.3.0(react@19.3.0))(react@19.3.0) sonner: specifier: ^2.0.8 - version: 2.0.8(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 2.0.8(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) devDependencies: '@tailwindcss/postcss': specifier: ^4.3.3 version: 4.3.3 '@types/react': - specifier: 19.2.18 - version: 19.2.18 + specifier: 19.3.0 + version: 19.3.0 '@types/react-dom': - specifier: 19.2.4 - version: 19.2.4(@types/react@19.2.18) + specifier: 19.3.0 + version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': specifier: ^6.0.5 version: 6.0.5(vite@8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) @@ -651,11 +651,11 @@ importers: specifier: workspace:* version: link:../../packages/react react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) examples/schema-catalog: dependencies: @@ -731,16 +731,16 @@ importers: dependencies: '@dnd-kit/core': specifier: ^6.3.1 - version: 6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 6.3.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@dnd-kit/sortable': specifier: ^10.0.0 - version: 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8) + version: 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0) '@dnd-kit/utilities': specifier: ^3.2.2 - version: 3.2.2(react@19.2.8) + version: 3.2.2(react@19.3.0) '@monaco-editor/react': specifier: ^4.7.0 - version: 4.7.0(monaco-editor@0.55.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 4.7.0(monaco-editor@0.55.1)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@object-ui/auth': specifier: workspace:* version: link:../auth @@ -791,21 +791,21 @@ importers: version: file:.objectstack-pin/spec(ai@7.0.65(zod@4.6.7)) '@sentry/react': specifier: ^10.70.0 - version: 10.70.0(react@19.2.8) + version: 10.70.0(react@19.3.0) jsonc-parser: specifier: ^3.3.1 version: 3.3.1 lucide-react: specifier: ^1.43.0 - version: 1.43.0(react@19.2.8) + version: 1.43.0(react@19.3.0) qrcode: specifier: ^1.5.4 version: 1.5.4 sonner: specifier: ^2.0.8 - version: 2.0.8(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 2.0.8(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) zod: - specifier: ^4.6.1 + specifier: ^4.6.5 version: 4.6.7 devDependencies: '@object-ui/plugin-calendar': @@ -854,20 +854,20 @@ importers: specifier: ^1.5.6 version: 1.5.6 '@types/react': - specifier: 19.2.18 - version: 19.2.18 + specifier: 19.3.0 + version: 19.3.0 '@types/react-dom': - specifier: 19.2.4 - version: 19.2.4(@types/react@19.2.18) + specifier: 19.3.0 + version: 19.3.0(@types/react@19.3.0) react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) react-router-dom: specifier: ^7.18.2 - version: 7.18.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 7.18.2(react-dom@19.3.0(react@19.3.0))(react@19.3.0) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -882,14 +882,14 @@ importers: version: file:.objectstack-pin/spec(ai@7.0.65(zod@4.6.7)) better-auth: specifier: ^1.7.2 - version: 1.7.2(@opentelemetry/api@1.9.1)(better-sqlite3@12.9.0)(mongodb@7.2.0(socks@2.8.9))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(vitest@4.1.10) + version: 1.7.2(@opentelemetry/api@1.9.1)(better-sqlite3@12.9.0)(mongodb@7.2.0(socks@2.8.9))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(vitest@4.1.10) devDependencies: '@types/react': - specifier: 19.2.18 - version: 19.2.18 + specifier: 19.3.0 + version: 19.3.0 react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 typescript: specifier: ^6.0.3 version: 6.0.3 @@ -980,11 +980,11 @@ importers: specifier: file:../../.objectstack-pin/spec version: file:.objectstack-pin/spec(ai@7.0.65(zod@4.6.7)) '@types/react': - specifier: 19.2.18 - version: 19.2.18 + specifier: 19.3.0 + version: 19.3.0 react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 typescript: specifier: ^6.0.3 version: 6.0.3 @@ -1017,82 +1017,82 @@ importers: version: file:.objectstack-pin/spec(ai@7.0.65(zod@4.6.7)) '@radix-ui/react-accordion': specifier: ^1.2.20 - version: 1.2.20(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 1.2.20(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@radix-ui/react-alert-dialog': specifier: ^1.1.23 - version: 1.1.23(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 1.1.23(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@radix-ui/react-aspect-ratio': specifier: ^1.1.15 - version: 1.1.15(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 1.1.15(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@radix-ui/react-avatar': specifier: ^1.2.6 - version: 1.2.6(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 1.2.6(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@radix-ui/react-checkbox': specifier: ^1.3.11 - version: 1.3.11(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 1.3.11(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@radix-ui/react-collapsible': specifier: ^1.1.20 - version: 1.1.20(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 1.1.20(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@radix-ui/react-context-menu': specifier: ^2.3.7 - version: 2.3.7(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 2.3.7(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@radix-ui/react-dialog': specifier: ^1.1.23 - version: 1.1.23(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 1.1.23(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@radix-ui/react-dropdown-menu': specifier: ^2.1.24 - version: 2.1.24(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 2.1.24(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@radix-ui/react-hover-card': specifier: ^1.1.23 - version: 1.1.23(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 1.1.23(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@radix-ui/react-label': specifier: ^2.1.15 - version: 2.1.15(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 2.1.15(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@radix-ui/react-menubar': specifier: ^1.1.24 - version: 1.1.24(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 1.1.24(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@radix-ui/react-navigation-menu': specifier: ^1.2.22 - version: 1.2.22(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 1.2.22(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@radix-ui/react-popover': specifier: ^1.1.23 - version: 1.1.23(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 1.1.23(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@radix-ui/react-progress': specifier: ^1.1.16 - version: 1.1.16(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 1.1.16(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@radix-ui/react-radio-group': specifier: ^1.4.7 - version: 1.4.7(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 1.4.7(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@radix-ui/react-scroll-area': specifier: ^1.2.18 - version: 1.2.18(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 1.2.18(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@radix-ui/react-select': specifier: ^2.3.7 - version: 2.3.7(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 2.3.7(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@radix-ui/react-separator': specifier: ^1.1.15 - version: 1.1.15(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 1.1.15(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@radix-ui/react-slider': specifier: ^1.4.7 - version: 1.4.7(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 1.4.7(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@radix-ui/react-slot': specifier: ^1.3.3 - version: 1.3.3(@types/react@19.2.18)(react@19.2.8) + version: 1.3.3(@types/react@19.3.0)(react@19.3.0) '@radix-ui/react-switch': specifier: ^1.3.7 - version: 1.3.7(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 1.3.7(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@radix-ui/react-tabs': specifier: ^1.1.21 - version: 1.1.21(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 1.1.21(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@radix-ui/react-toggle': specifier: ^1.1.18 - version: 1.1.18(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 1.1.18(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@radix-ui/react-toggle-group': specifier: ^1.1.19 - version: 1.1.19(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 1.1.19(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@radix-ui/react-tooltip': specifier: ^1.2.16 - version: 1.2.16(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 1.2.16(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -1101,40 +1101,40 @@ importers: version: 2.1.1 cmdk: specifier: ^1.1.1 - version: 1.1.1(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 1.1.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) date-fns: specifier: ^4.4.0 version: 4.4.0 embla-carousel-react: specifier: ^8.6.0 - version: 8.6.0(react@19.2.8) + version: 8.6.0(react@19.3.0) input-otp: specifier: ^1.4.2 - version: 1.4.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 1.4.2(react-dom@19.3.0(react@19.3.0))(react@19.3.0) lucide-react: specifier: ^1.43.0 - version: 1.43.0(react@19.2.8) + version: 1.43.0(react@19.3.0) next-themes: specifier: ^0.4.6 - version: 0.4.6(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 0.4.6(react-dom@19.3.0(react@19.3.0))(react@19.3.0) react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-day-picker: specifier: ^10.0.1 - version: 10.0.1(@types/react@19.2.18)(react@19.2.8) + version: 10.0.1(@types/react@19.3.0)(react@19.3.0) react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) react-hook-form: specifier: ^7.85.0 - version: 7.85.0(react@19.2.8) + version: 7.85.0(react@19.3.0) react-resizable-panels: specifier: ^4.12.2 - version: 4.12.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 4.12.2(react-dom@19.3.0(react@19.3.0))(react@19.3.0) sonner: specifier: ^2.0.8 - version: 2.0.8(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 2.0.8(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) tailwind-merge: specifier: ^3.6.0 version: 3.6.0 @@ -1143,23 +1143,23 @@ importers: version: 1.0.7(tailwindcss@4.3.3) vaul: specifier: ^1.1.2 - version: 1.1.2(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 1.1.2(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) devDependencies: '@object-ui/test-support': specifier: workspace:* version: link:../test-support '@radix-ui/react-focus-scope': specifier: ^1.1.16 - version: 1.1.16(patch_hash=41d44316f54bd1c52774d12640dfe9062604489561eee39886b1912c4197e822)(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 1.1.16(patch_hash=41d44316f54bd1c52774d12640dfe9062604489561eee39886b1912c4197e822)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@tailwindcss/postcss': specifier: ^4.3.3 version: 4.3.3 '@types/react': - specifier: 19.2.18 - version: 19.2.18 + specifier: 19.3.0 + version: 19.3.0 '@types/react-dom': - specifier: 19.2.4 - version: 19.2.4(@types/react@19.2.18) + specifier: 19.3.0 + version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': specifier: ^6.0.5 version: 6.0.5(vite@8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) @@ -1188,7 +1188,7 @@ importers: specifier: ^5.0.3 version: 5.0.3(@microsoft/api-extractor@7.58.2(@types/node@26.2.0))(esbuild@0.28.2)(rolldown@1.2.15)(rollup@4.62.2)(typescript@6.0.3)(vite@8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) zod: - specifier: ^4.4.3 + specifier: ^4.6.5 version: 4.6.7 packages/core: @@ -1309,16 +1309,16 @@ importers: version: 9.0.1 lucide-react: specifier: ^1.43.0 - version: 1.43.0(react@19.2.8) + version: 1.43.0(react@19.3.0) react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) react-markdown: specifier: ^10.1.0 - version: 10.1.0(@types/react@19.2.18)(react@19.2.8) + version: 10.1.0(@types/react@19.3.0)(react@19.3.0) rehype-sanitize: specifier: ^6.0.0 version: 6.0.0 @@ -1333,11 +1333,11 @@ importers: specifier: ^4.3.3 version: 4.3.3 '@types/react': - specifier: 19.2.18 - version: 19.2.18 + specifier: 19.3.0 + version: 19.3.0 '@types/react-dom': - specifier: 19.2.4 - version: 19.2.4(@types/react@19.2.18) + specifier: 19.3.0 + version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': specifier: ^6.0.5 version: 6.0.5(vite@8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) @@ -1367,17 +1367,17 @@ importers: version: 26.4.0(typescript@6.0.3) react-i18next: specifier: ^17.0.11 - version: 17.0.11(i18next@26.4.0(typescript@6.0.3))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + version: 17.0.11(i18next@26.4.0(typescript@6.0.3))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(typescript@6.0.3) devDependencies: '@object-ui/test-support': specifier: workspace:* version: link:../test-support '@types/react': - specifier: 19.2.18 - version: 19.2.18 + specifier: 19.3.0 + version: 19.3.0 react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 typescript: specifier: ^6.0.3 version: 6.0.3 @@ -1389,13 +1389,13 @@ importers: dependencies: '@dnd-kit/core': specifier: ^6.3.1 - version: 6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 6.3.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@dnd-kit/sortable': specifier: ^10.0.0 - version: 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8) + version: 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0) '@dnd-kit/utilities': specifier: ^3.2.2 - version: 3.2.2(react@19.2.8) + version: 3.2.2(react@19.3.0) '@object-ui/components': specifier: workspace:* version: link:../components @@ -1413,10 +1413,10 @@ importers: version: file:.objectstack-pin/spec(ai@7.0.65(zod@4.6.7)) lucide-react: specifier: ^1.43.0 - version: 1.43.0(react@19.2.8) + version: 1.43.0(react@19.3.0) react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) devDependencies: '@object-ui/sdui-parser': specifier: workspace:* @@ -1428,11 +1428,11 @@ importers: specifier: ^6.0.5 version: 6.0.5(vite@8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-router-dom: specifier: ^7.18.2 - version: 7.18.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 7.18.2(react-dom@19.3.0(react@19.3.0))(react@19.3.0) vite: specifier: ^8.2.1 version: 8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) @@ -1453,11 +1453,11 @@ importers: specifier: file:../../.objectstack-pin/spec version: file:.objectstack-pin/spec(ai@7.0.65(zod@4.6.7)) '@types/react': - specifier: 19.2.18 - version: 19.2.18 + specifier: 19.3.0 + version: 19.3.0 react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 typescript: specifier: ^6.0.3 version: 6.0.3 @@ -1475,11 +1475,11 @@ importers: version: file:.objectstack-pin/spec(ai@7.0.65(zod@4.6.7)) devDependencies: '@types/react': - specifier: 19.2.18 - version: 19.2.18 + specifier: 19.3.0 + version: 19.3.0 react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 typescript: specifier: ^6.0.3 version: 6.0.3 @@ -1503,13 +1503,13 @@ importers: version: link:../types lucide-react: specifier: ^1.43.0 - version: 1.43.0(react@19.2.8) + version: 1.43.0(react@19.3.0) react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) devDependencies: '@object-ui/test-support': specifier: workspace:* @@ -1518,11 +1518,11 @@ importers: specifier: ^26.2.0 version: 26.2.0 '@types/react': - specifier: 19.2.18 - version: 19.2.18 + specifier: 19.3.0 + version: 19.3.0 '@types/react-dom': - specifier: 19.2.4 - version: 19.2.4(@types/react@19.2.18) + specifier: 19.3.0 + version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': specifier: ^6.0.5 version: 6.0.5(vite@8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) @@ -1564,13 +1564,13 @@ importers: version: link:../types lucide-react: specifier: ^1.43.0 - version: 1.43.0(react@19.2.8) + version: 1.43.0(react@19.3.0) react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) devDependencies: '@object-ui/data-objectstack': specifier: workspace:* @@ -1582,11 +1582,11 @@ importers: specifier: workspace:* version: link:../test-support '@types/react': - specifier: 19.2.18 - version: 19.2.18 + specifier: 19.3.0 + version: 19.3.0 '@types/react-dom': - specifier: 19.2.4 - version: 19.2.4(@types/react@19.2.18) + specifier: 19.3.0 + version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': specifier: ^6.0.5 version: 6.0.5(vite@8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) @@ -1619,16 +1619,16 @@ importers: version: link:../types lucide-react: specifier: ^1.43.0 - version: 1.43.0(react@19.2.8) + version: 1.43.0(react@19.3.0) react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) recharts: specifier: ^3.10.1 - version: 3.10.1(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react-is@19.2.6)(react@19.2.8)(redux@5.0.1) + version: 3.10.1(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react-is@19.2.6)(react@19.3.0)(redux@5.0.1) devDependencies: '@object-ui/test-support': specifier: workspace:* @@ -1637,11 +1637,11 @@ importers: specifier: file:../../.objectstack-pin/spec version: file:.objectstack-pin/spec(ai@7.0.65(zod@4.6.7)) '@types/react': - specifier: 19.2.18 - version: 19.2.18 + specifier: 19.3.0 + version: 19.3.0 '@types/react-dom': - specifier: 19.2.4 - version: 19.2.4(@types/react@19.2.18) + specifier: 19.3.0 + version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': specifier: ^6.0.5 version: 6.0.5(vite@8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) @@ -1659,7 +1659,7 @@ importers: dependencies: '@ai-sdk/react': specifier: ^4.0.68 - version: 4.0.68(react@19.2.8)(zod@4.6.7) + version: 4.0.68(react@19.3.0)(zod@4.6.7) '@object-ui/components': specifier: workspace:* version: link:../components @@ -1680,10 +1680,10 @@ importers: version: file:.objectstack-pin/spec(ai@7.0.65(zod@4.6.7)) '@radix-ui/react-slot': specifier: ^1.3.3 - version: 1.3.3(@types/react@19.2.18)(react@19.2.8) + version: 1.3.3(@types/react@19.3.0)(react@19.3.0) '@radix-ui/react-use-controllable-state': specifier: ^1.2.6 - version: 1.2.6(@types/react@19.2.18)(react@19.2.8) + version: 1.2.6(@types/react@19.3.0)(react@19.3.0) ai: specifier: ^7.0.65 version: 7.0.65(zod@4.6.7) @@ -1692,35 +1692,35 @@ importers: version: 0.7.1 lucide-react: specifier: ^1.43.0 - version: 1.43.0(react@19.2.8) + version: 1.43.0(react@19.3.0) motion: specifier: ^13.2.0 - version: 13.2.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 13.2.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) nanoid: specifier: ^6.0.1 version: 6.0.1 react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) shiki: specifier: ^4.4.2 version: 4.4.3 streamdown: specifier: ^2.5.0 - version: 2.5.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 2.5.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) use-stick-to-bottom: specifier: ^1.1.6 - version: 1.1.6(react@19.2.8) + version: 1.1.6(react@19.3.0) devDependencies: '@types/react': - specifier: 19.2.18 - version: 19.2.18 + specifier: 19.3.0 + version: 19.3.0 '@types/react-dom': - specifier: 19.2.4 - version: 19.2.4(@types/react@19.2.18) + specifier: 19.3.0 + version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': specifier: ^6.0.5 version: 6.0.5(vite@8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) @@ -1738,13 +1738,13 @@ importers: dependencies: '@dnd-kit/core': specifier: ^6.3.1 - version: 6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 6.3.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@dnd-kit/sortable': specifier: ^10.0.0 - version: 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8) + version: 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0) '@dnd-kit/utilities': specifier: ^3.2.2 - version: 3.2.2(react@19.2.8) + version: 3.2.2(react@19.3.0) '@object-ui/components': specifier: workspace:* version: link:../components @@ -1771,10 +1771,10 @@ importers: version: file:.objectstack-pin/spec(ai@7.0.65(zod@4.6.7)) lucide-react: specifier: ^1.43.0 - version: 1.43.0(react@19.2.8) + version: 1.43.0(react@19.3.0) react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) devDependencies: '@object-ui/plugin-charts': specifier: workspace:* @@ -1787,16 +1787,16 @@ importers: version: link:../test-support '@types/react-grid-layout': specifier: ^2.1.0 - version: 2.1.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 2.1.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@vitejs/plugin-react': specifier: ^6.0.5 version: 6.0.5(vite@8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-grid-layout: specifier: ^2.2.4 - version: 2.2.4(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 2.2.4(react-dom@19.3.0(react@19.3.0))(react@19.3.0) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -1844,19 +1844,19 @@ importers: version: 2.1.1 lucide-react: specifier: ^1.43.0 - version: 1.43.0(react@19.2.8) + version: 1.43.0(react@19.3.0) react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) react-router-dom: specifier: ^6.0.0 || ^7.0.0 - version: 7.18.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 7.18.2(react-dom@19.3.0(react@19.3.0))(react@19.3.0) sonner: specifier: ^2.0.8 - version: 2.0.8(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 2.0.8(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) tailwind-merge: specifier: ^3.6.0 version: 3.6.0 @@ -1865,11 +1865,11 @@ importers: specifier: ^26.2.0 version: 26.2.0 '@types/react': - specifier: 19.2.18 - version: 19.2.18 + specifier: 19.3.0 + version: 19.3.0 '@types/react-dom': - specifier: 19.2.4 - version: 19.2.4(@types/react@19.2.18) + specifier: 19.3.0 + version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': specifier: ^6.0.5 version: 6.0.5(vite@8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) @@ -1893,16 +1893,16 @@ importers: version: file:.objectstack-pin/spec(ai@7.0.65(zod@4.6.7)) lucide-react: specifier: ^1.43.0 - version: 1.43.0(react@19.2.8) + version: 1.43.0(react@19.3.0) react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) react-router-dom: specifier: ^6.0.0 || ^7.0.0 - version: 7.18.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 7.18.2(react-dom@19.3.0(react@19.3.0))(react@19.3.0) devDependencies: '@object-ui/components': specifier: workspace:* @@ -1929,11 +1929,11 @@ importers: specifier: workspace:* version: link:../types '@types/react': - specifier: 19.2.18 - version: 19.2.18 + specifier: 19.3.0 + version: 19.3.0 '@types/react-dom': - specifier: 19.2.4 - version: 19.2.4(@types/react@19.2.18) + specifier: 19.3.0 + version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': specifier: ^6.0.5 version: 6.0.5(vite@8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) @@ -1954,7 +1954,7 @@ importers: dependencies: '@monaco-editor/react': specifier: ^4.7.0 - version: 4.7.0(monaco-editor@0.55.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 4.7.0(monaco-editor@0.55.1)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@object-ui/components': specifier: workspace:* version: link:../components @@ -1965,18 +1965,18 @@ importers: specifier: workspace:* version: link:../types react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) devDependencies: '@types/react': - specifier: 19.2.18 - version: 19.2.18 + specifier: 19.3.0 + version: 19.3.0 '@types/react-dom': - specifier: 19.2.4 - version: 19.2.4(@types/react@19.2.18) + specifier: 19.3.0 + version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': specifier: ^6.0.5 version: 6.0.5(vite@8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) @@ -2018,13 +2018,13 @@ importers: version: file:.objectstack-pin/spec(ai@7.0.65(zod@4.6.7)) lucide-react: specifier: ^1.43.0 - version: 1.43.0(react@19.2.8) + version: 1.43.0(react@19.3.0) react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) devDependencies: '@object-ui/data-objectstack': specifier: workspace:* @@ -2079,16 +2079,16 @@ importers: version: file:.objectstack-pin/spec(ai@7.0.65(zod@4.6.7)) lucide-react: specifier: ^1.43.0 - version: 1.43.0(react@19.2.8) + version: 1.43.0(react@19.3.0) react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) sonner: specifier: ^2.0.8 - version: 2.0.8(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 2.0.8(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) devDependencies: '@object-ui/sdui-parser': specifier: workspace:* @@ -2097,11 +2097,11 @@ importers: specifier: workspace:* version: link:../test-support '@types/react': - specifier: 19.2.18 - version: 19.2.18 + specifier: 19.3.0 + version: 19.3.0 '@types/react-dom': - specifier: 19.2.4 - version: 19.2.4(@types/react@19.2.18) + specifier: 19.3.0 + version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': specifier: ^6.0.5 version: 6.0.5(vite@8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) @@ -2149,19 +2149,19 @@ importers: version: file:.objectstack-pin/spec(ai@7.0.65(zod@4.6.7)) '@tanstack/react-virtual': specifier: ^3.14.9 - version: 3.14.9(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 3.14.9(react-dom@19.3.0(react@19.3.0))(react@19.3.0) exceljs: specifier: ^4.4.0 version: 4.4.0 lucide-react: specifier: ^1.43.0 - version: 1.43.0(react@19.2.8) + version: 1.43.0(react@19.3.0) react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) devDependencies: '@object-ui/data-objectstack': specifier: workspace:* @@ -2201,13 +2201,13 @@ importers: dependencies: '@dnd-kit/core': specifier: ^6.3.1 - version: 6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 6.3.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@dnd-kit/sortable': specifier: ^10.0.0 - version: 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8) + version: 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0) '@dnd-kit/utilities': specifier: ^3.2.2 - version: 3.2.2(react@19.2.8) + version: 3.2.2(react@19.3.0) '@object-ui/components': specifier: workspace:* version: link:../components @@ -2234,13 +2234,13 @@ importers: version: link:../types lucide-react: specifier: ^1.43.0 - version: 1.43.0(react@19.2.8) + version: 1.43.0(react@19.3.0) react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) devDependencies: '@object-ui/data-objectstack': specifier: workspace:* @@ -2255,11 +2255,11 @@ importers: specifier: ^4.3.3 version: 4.3.3 '@types/react': - specifier: 19.2.18 - version: 19.2.18 + specifier: 19.3.0 + version: 19.3.0 '@types/react-dom': - specifier: 19.2.4 - version: 19.2.4(@types/react@19.2.18) + specifier: 19.3.0 + version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': specifier: ^6.0.5 version: 6.0.5(vite@8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) @@ -2286,13 +2286,13 @@ importers: version: file:.objectstack-pin/spec(ai@7.0.65(zod@4.6.7)) lucide-react: specifier: ^1.43.0 - version: 1.43.0(react@19.2.8) + version: 1.43.0(react@19.3.0) react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) devDependencies: '@object-ui/components': specifier: workspace:* @@ -2322,11 +2322,11 @@ importers: specifier: workspace:* version: link:../types '@types/react': - specifier: 19.2.18 - version: 19.2.18 + specifier: 19.3.0 + version: 19.3.0 '@types/react-dom': - specifier: 19.2.4 - version: 19.2.4(@types/react@19.2.18) + specifier: 19.3.0 + version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': specifier: ^6.0.5 version: 6.0.5(vite@8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) @@ -2364,14 +2364,14 @@ importers: specifier: ^6.4.1 version: 6.4.1 react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) react-map-gl: specifier: ^8.1.2 - version: 8.1.2(maplibre-gl@6.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 8.1.2(maplibre-gl@6.4.1)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) devDependencies: '@object-ui/plugin-list': specifier: workspace:* @@ -2380,11 +2380,11 @@ importers: specifier: workspace:* version: link:../sdui-parser '@types/react': - specifier: 19.2.18 - version: 19.2.18 + specifier: 19.3.0 + version: 19.3.0 '@types/react-dom': - specifier: 19.2.4 - version: 19.2.4(@types/react@19.2.18) + specifier: 19.3.0 + version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': specifier: ^6.0.5 version: 6.0.5(vite@8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) @@ -2416,14 +2416,14 @@ importers: specifier: ^11.17.2 version: 11.17.2 react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) react-markdown: specifier: ^10.1.0 - version: 10.1.0(@types/react@19.2.18)(react@19.2.8) + version: 10.1.0(@types/react@19.3.0)(react@19.3.0) rehype-autolink-headings: specifier: ^7.1.0 version: 7.1.0 @@ -2444,11 +2444,11 @@ importers: version: 2.1.0 devDependencies: '@types/react': - specifier: 19.2.18 - version: 19.2.18 + specifier: 19.3.0 + version: 19.3.0 '@types/react-dom': - specifier: 19.2.4 - version: 19.2.4(@types/react@19.2.18) + specifier: 19.3.0 + version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': specifier: ^6.0.5 version: 6.0.5(vite@8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) @@ -2484,13 +2484,13 @@ importers: version: link:../types lucide-react: specifier: ^1.43.0 - version: 1.43.0(react@19.2.8) + version: 1.43.0(react@19.3.0) react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) devDependencies: '@object-ui/test-support': specifier: workspace:* @@ -2502,11 +2502,11 @@ importers: specifier: ^26.2.0 version: 26.2.0 '@types/react': - specifier: 19.2.18 - version: 19.2.18 + specifier: 19.3.0 + version: 19.3.0 '@types/react-dom': - specifier: 19.2.4 - version: 19.2.4(@types/react@19.2.18) + specifier: 19.3.0 + version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': specifier: ^6.0.5 version: 6.0.5(vite@8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) @@ -2550,13 +2550,13 @@ importers: specifier: ^0.7.1 version: 0.7.1 react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) zod: - specifier: ^4.4.3 + specifier: ^4.6.5 version: 4.6.7 devDependencies: '@object-ui/data-objectstack': @@ -2569,11 +2569,11 @@ importers: specifier: workspace:* version: link:../test-support '@types/react': - specifier: 19.2.18 - version: 19.2.18 + specifier: 19.3.0 + version: 19.3.0 '@types/react-dom': - specifier: 19.2.4 - version: 19.2.4(@types/react@19.2.18) + specifier: 19.3.0 + version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': specifier: ^6.0.5 version: 6.0.5(vite@8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) @@ -2618,13 +2618,13 @@ importers: version: file:.objectstack-pin/spec(ai@7.0.65(zod@4.6.7)) lucide-react: specifier: ^1.43.0 - version: 1.43.0(react@19.2.8) + version: 1.43.0(react@19.3.0) react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) devDependencies: '@object-ui/sdui-parser': specifier: workspace:* @@ -2633,11 +2633,11 @@ importers: specifier: workspace:* version: link:../test-support '@types/react': - specifier: 19.2.18 - version: 19.2.18 + specifier: 19.3.0 + version: 19.3.0 '@types/react-dom': - specifier: 19.2.4 - version: 19.2.4(@types/react@19.2.18) + specifier: 19.3.0 + version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': specifier: ^6.0.5 version: 6.0.5(vite@8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) @@ -2655,13 +2655,13 @@ importers: dependencies: '@dnd-kit/core': specifier: ^6.3.1 - version: 6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 6.3.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@dnd-kit/sortable': specifier: ^10.0.0 - version: 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8) + version: 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0) '@dnd-kit/utilities': specifier: ^3.2.2 - version: 3.2.2(react@19.2.8) + version: 3.2.2(react@19.3.0) '@object-ui/components': specifier: workspace:* version: link:../components @@ -2694,13 +2694,13 @@ importers: version: 0.7.1 lucide-react: specifier: ^1.43.0 - version: 1.43.0(react@19.2.8) + version: 1.43.0(react@19.3.0) react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) devDependencies: '@vitejs/plugin-react': specifier: ^6.0.5 @@ -2721,18 +2721,18 @@ importers: specifier: workspace:* version: link:../types react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) devDependencies: '@types/react': - specifier: 19.2.18 - version: 19.2.18 + specifier: 19.3.0 + version: 19.3.0 '@types/react-dom': - specifier: 19.2.4 - version: 19.2.4(@types/react@19.2.18) + specifier: 19.3.0 + version: 19.3.0(@types/react@19.3.0) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -2755,21 +2755,21 @@ importers: specifier: file:../../.objectstack-pin/spec version: file:.objectstack-pin/spec(ai@7.0.65(zod@4.6.7)) react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) devDependencies: '@object-ui/test-support': specifier: workspace:* version: link:../test-support '@types/react': - specifier: 19.2.18 - version: 19.2.18 + specifier: 19.3.0 + version: 19.3.0 '@types/react-dom': - specifier: 19.2.4 - version: 19.2.4(@types/react@19.2.18) + specifier: 19.3.0 + version: 19.3.0(@types/react@19.3.0) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -2777,8 +2777,8 @@ importers: packages/react-runtime: dependencies: react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 sucrase: specifier: ^3.35.0 version: 3.35.1 @@ -2805,13 +2805,13 @@ importers: version: link:../types lucide-react: specifier: ^1.43.0 - version: 1.43.0(react@19.2.8) + version: 1.43.0(react@19.3.0) react: - specifier: 19.2.8 - version: 19.2.8 + specifier: 19.3.0 + version: 19.3.0 react-dom: - specifier: 19.2.8 - version: 19.2.8(react@19.2.8) + specifier: 19.3.0 + version: 19.3.0(react@19.3.0) tailwindcss-animate: specifier: ^1.0.7 version: 1.0.7(tailwindcss@4.3.3) @@ -2823,11 +2823,11 @@ importers: specifier: ^4.3.3 version: 4.3.3 '@types/react': - specifier: 19.2.18 - version: 19.2.18 + specifier: 19.3.0 + version: 19.3.0 '@types/react-dom': - specifier: 19.2.4 - version: 19.2.4(@types/react@19.2.18) + specifier: 19.3.0 + version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': specifier: ^6.0.5 version: 6.0.5(vite@8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) @@ -2874,7 +2874,7 @@ importers: specifier: ^6.0.3 version: 6.0.3 zod: - specifier: ^4.4.3 + specifier: ^4.6.5 version: 4.6.7 packages/types: @@ -2883,7 +2883,7 @@ importers: specifier: file:../../.objectstack-pin/spec version: file:.objectstack-pin/spec(ai@7.0.65(zod@4.6.7)) zod: - specifier: ^4.6.1 + specifier: ^4.6.5 version: 4.6.7 devDependencies: '@object-ui/test-support': @@ -2955,7 +2955,7 @@ packages: resolution: {integrity: sha512-zz/CtHN6Wu9i3Fmv/1pZOVRQ8de03t5o7XDVn1KXPVEbIrc5KsV+B+d3tbsBB/d4+Q2yUtZ/BhkP7ubLH6LhUg==} engines: {node: '>=22'} peerDependencies: - react: 19.2.8 + react: 19.3.0 '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} @@ -3369,24 +3369,24 @@ packages: '@dnd-kit/accessibility@3.1.1': resolution: {integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==} peerDependencies: - react: 19.2.8 + react: 19.3.0 '@dnd-kit/core@6.3.1': resolution: {integrity: sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==} peerDependencies: - react: 19.2.8 - react-dom: 19.2.8 + react: 19.3.0 + react-dom: 19.3.0 '@dnd-kit/sortable@10.0.0': resolution: {integrity: sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg==} peerDependencies: '@dnd-kit/core': ^6.3.0 - react: 19.2.8 + react: 19.3.0 '@dnd-kit/utilities@3.2.2': resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==} peerDependencies: - react: 19.2.8 + react: 19.3.0 '@dotenvx/dotenvx@1.75.1': resolution: {integrity: sha512-/BITOC9dmS/edY2zQwZNicQ059O6RKabtQfyEafV0nGtfYRNHYy1DIPiYVcov40+tob9hfmBnbR963dS+EQ1DQ==} @@ -3773,8 +3773,8 @@ packages: '@floating-ui/react-dom@2.1.9': resolution: {integrity: sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==} peerDependencies: - react: 19.2.8 - react-dom: 19.2.8 + react: 19.3.0 + react-dom: 19.3.0 '@floating-ui/utils@0.2.12': resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==} @@ -3782,9 +3782,9 @@ packages: '@fuma-translate/react@1.0.2': resolution: {integrity: sha512-uOiOtBx3nRXR8Nu1GzBf1tApgF1FErDBTHxRIAQeyQdyOoZbrNRN6H4kDCWObY4qyGeGbHydG0DHzgeUgFDMIw==} peerDependencies: - '@types/react': 19.2.18 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4160,8 +4160,8 @@ packages: resolution: {integrity: sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==} peerDependencies: monaco-editor: '>= 0.25.0 < 1' - react: 19.2.8 - react-dom: 19.2.8 + react: 19.3.0 + react-dom: 19.3.0 '@mongodb-js/saslprep@1.6.1': resolution: {integrity: sha512-D4CQtk9IwjCLAvCf1xvHEod3960q8XMUzfmdRU9qjUNlHnesGuTOvJcOTaPm9koZ1caUKA2aTbszZiAkcmSgmg==} @@ -4320,10 +4320,10 @@ packages: '@radix-ui/react-accordion@1.2.20': resolution: {integrity: sha512-jDhG9FvAEnlhnjrsINbNXcUa4G+L1KqSkJSunkbKEzFRcAb52jvM0PjPxPRvhe1HNc5F5yc0yzzWeeqlH4yBIg==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4333,10 +4333,10 @@ packages: '@radix-ui/react-alert-dialog@1.1.23': resolution: {integrity: sha512-VAYOiQRqj3GPpYJE0I9J+X8Ip05cyVlNdKOFeiGS2Ou1HHGfpl0BxOyZm6nmVDyU+W+NF3/XLzmjHmVGydhwgA==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4346,10 +4346,10 @@ packages: '@radix-ui/react-arrow@1.1.15': resolution: {integrity: sha512-v4zggRcjadnI+ClKDuijlQEW4tw3NoaeHc/PwpKnLoLLKNUG4InLegkstooLcRIUWCs+8L22dGURCVuFfOKfnA==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4359,10 +4359,10 @@ packages: '@radix-ui/react-aspect-ratio@1.1.15': resolution: {integrity: sha512-fy+dyVR+90nelK8rqIznFlxzx7uPcGbhxH8Nfr2bHb4UfSe+e3hklOC0luK0hDwVwnRX7xTRySpsrQVeW+/oNQ==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4372,10 +4372,10 @@ packages: '@radix-ui/react-avatar@1.2.6': resolution: {integrity: sha512-4ULOTJ/mqy2hT9GlWa/MFHxHSvH3nJzHnZM1waNsc5Bonv7i70aNenghXmD97S6OJ81ekXONGGt4nT1r0PfEdA==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4385,10 +4385,10 @@ packages: '@radix-ui/react-checkbox@1.3.11': resolution: {integrity: sha512-Gnptr9pDDQxD3hgq2dtPbtrp/c2qH1mBwIzw3X/ivrMb2e1t0jMTi606fVEqFPaQR1ggXIVQWKj3P2WW9v7zGQ==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4398,10 +4398,10 @@ packages: '@radix-ui/react-collapsible@1.1.20': resolution: {integrity: sha512-mcGesGplBnzN2sbvJETzpCNfSMyPnb29q1GRLU+Ib7bJrpIG2ywmRoh2V5VbA2uNvKikKUlVbAPks7JDjz4A8Q==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4411,10 +4411,10 @@ packages: '@radix-ui/react-collection@1.1.15': resolution: {integrity: sha512-9W+B9NPF0NaaPh/1NJd3+KqsnlLqU9H7T2rvww+fp+T/evVXdNAyYcnfRQZFOjkR1ajQp3yORlqnI8soawLvNA==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4424,8 +4424,8 @@ packages: '@radix-ui/react-compose-refs@1.1.5': resolution: {integrity: sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==} peerDependencies: - '@types/react': 19.2.18 - react: 19.2.8 + '@types/react': 19.3.0 + react: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4433,10 +4433,10 @@ packages: '@radix-ui/react-context-menu@2.3.7': resolution: {integrity: sha512-CtXP35dxaB5T3zXSd+E3uHe/QpXcpYnZmxp6OaIbfthtfW4wyb77M23BG+bwIJDtsMwEP/YssdsmNyZu7jhWew==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4446,8 +4446,8 @@ packages: '@radix-ui/react-context@1.2.2': resolution: {integrity: sha512-RHCUGwKHDr0hDGg4X7ma4JG4/+12qxw8rkh5QKdDldlCvtja6nUx1Ef/8HVrJze81lEsgLQlqjzjGNHantgnQA==} peerDependencies: - '@types/react': 19.2.18 - react: 19.2.8 + '@types/react': 19.3.0 + react: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4455,10 +4455,10 @@ packages: '@radix-ui/react-dialog@1.1.23': resolution: {integrity: sha512-Ksw4WeROkO4rC9k/onilX/Ao2Cr1ku1unMNH+XSCcP4jSXYu7HDsg9n4ojMjVb22XpYjAQ9qfrFlVbru1vXDUA==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4468,8 +4468,8 @@ packages: '@radix-ui/react-direction@1.1.4': resolution: {integrity: sha512-5pzg4FGQNpExhnhT2zlrP1wZFaYCd1K0nYWoFAdcYoYK868IEigqMX3B3f8yIoRlAhAeDWciLI6ZdCKHF9P4Vg==} peerDependencies: - '@types/react': 19.2.18 - react: 19.2.8 + '@types/react': 19.3.0 + react: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4477,10 +4477,10 @@ packages: '@radix-ui/react-dismissable-layer@1.1.19': resolution: {integrity: sha512-8g4pfOL9HoKKLWGiypT+dphVqjFfmcXO5GBnhsG6zI+lxAx/8feQpr+1LSN8Re3hiZ+XkLNS4O9ztK11/LzQ6w==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4490,10 +4490,10 @@ packages: '@radix-ui/react-dropdown-menu@2.1.24': resolution: {integrity: sha512-geq8l2rJkxvkXsT9RMgtUE3P8pITFpTsvYpbySi1IH4fZEABD/Gp85myayFgxk0ktljGMJnCbeFkyTusvSvv7g==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4503,8 +4503,8 @@ packages: '@radix-ui/react-focus-guards@1.1.6': resolution: {integrity: sha512-RNOJjfZMTyBM6xYmV3IVGXkPjIhcBAuv48POevAXwrGJhkWZ9p1rFoIS1JFooPuT193AZmRsCPhpoVJxx6OPoQ==} peerDependencies: - '@types/react': 19.2.18 - react: 19.2.8 + '@types/react': 19.3.0 + react: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4512,10 +4512,10 @@ packages: '@radix-ui/react-focus-scope@1.1.16': resolution: {integrity: sha512-wmRZ2WWLvmt6KHy2rNPOdPUjwq5xOHY02+m+udwJTn0aNIox/rkskAvJTyTLGhPK6KgrUjlJUJpgmx/+wFiFIQ==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4525,10 +4525,10 @@ packages: '@radix-ui/react-hover-card@1.1.23': resolution: {integrity: sha512-H8qONfZd3ltrU3+jHCIgITbWo6e1iTKvP9DHdrvYbX48ooRM5FjEDTn16AMwdfuOGkWdZEhpl3PLL/Wk/AnHDQ==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4538,8 +4538,8 @@ packages: '@radix-ui/react-id@1.1.4': resolution: {integrity: sha512-TMQp2llA+RYn7JcjnrMnz7wN4pcVttPZnRZo52PLQsoLVKzNlVwUeHmfePgTgRluXFvlD3GD5g5MOVVTJCO0qA==} peerDependencies: - '@types/react': 19.2.18 - react: 19.2.8 + '@types/react': 19.3.0 + react: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4547,10 +4547,10 @@ packages: '@radix-ui/react-label@2.1.15': resolution: {integrity: sha512-o/rdYEwZTTo5tjknnPeyQFU45kUC4i/XyeDPP+HGyi6XqpOP6Zf5Ya5vh/Yfe9Id5JiuWnnAx2XqIeD3UYZt0g==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4560,10 +4560,10 @@ packages: '@radix-ui/react-menu@2.1.24': resolution: {integrity: sha512-uW7RVuU6Lp/ZtfeY4b3kL32zccgEWvPv1+cf17ubYzHa9cL8AHokmk36cG/XEiH/smbQvumnieXX9j/e9RqJWA==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4573,10 +4573,10 @@ packages: '@radix-ui/react-menubar@1.1.24': resolution: {integrity: sha512-eeVs0vf7cuqXaM0qLQCPcufImiJNVBXdJDLu7ZGYl2732UH23Qat/foNGrr6vYV3/DdTsBqASoggUFgH14OcZA==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4586,10 +4586,10 @@ packages: '@radix-ui/react-navigation-menu@1.2.22': resolution: {integrity: sha512-ou7iLEJ+yrhQndkkA4U21XIdS/CS45F4iXIkTZcb6/Ne9EMsOuDudVmCwmDnfFZZ+y1FZqXRNSIgBy+YMvZVZg==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4599,10 +4599,10 @@ packages: '@radix-ui/react-popover@1.1.23': resolution: {integrity: sha512-mw58MrBlyHWFisTOYignD0vf/3gdcgAR+9of1s9G/38CbFiUwH1nCDkc0AUM9IrXFgN5Ue8n45j9WCgyM1sbiQ==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4612,10 +4612,10 @@ packages: '@radix-ui/react-popper@1.3.7': resolution: {integrity: sha512-UsJrrd7w4wuKKTdvd/DNERVlwSlUcyXzjhyDwBk+3aPOsCjOY6ZSbxuw8E6lZTjjfP8Cpd0J8VVkrYUWyGYXyg==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4625,10 +4625,10 @@ packages: '@radix-ui/react-portal@1.1.17': resolution: {integrity: sha512-vKQLcWypUnwZVvfV7UkGahH2g6ySe8M8R+zYBwPrv5byZ9QAW6cQVvNKo7GgmD+p8aYb6D9JBuvy8/WhOno2wQ==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4638,10 +4638,10 @@ packages: '@radix-ui/react-presence@1.1.10': resolution: {integrity: sha512-3wyzCQ6+ubRA+D4uv9m95JYLXxmOHp05qjrkjeA7uKHHtjpPggQzc6DAb0URl7j67oR0K2foO4ip27TiX037Bw==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4651,10 +4651,10 @@ packages: '@radix-ui/react-primitive@2.1.10': resolution: {integrity: sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4664,10 +4664,10 @@ packages: '@radix-ui/react-progress@1.1.16': resolution: {integrity: sha512-5XnomAsoZZCY+KNTxbIghpGqPruZvKFNlvcAljVAOdDRDsH4/OZQxhtwo5wdtoDM5R6MhJBb2sPnDuRFep3lzg==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4677,10 +4677,10 @@ packages: '@radix-ui/react-radio-group@1.4.7': resolution: {integrity: sha512-cgYFEkntCxppHZgtSZ+7vh0wbZQ+IC7PPMw8DSnRG27B6kDd32/Zw0OJt7dGDigCoprMuWHjg2PvUn3PYvPFoQ==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4690,10 +4690,10 @@ packages: '@radix-ui/react-roving-focus@1.1.19': resolution: {integrity: sha512-V9jI6hDjT7l3jsCQD9bLNvDLM3tH/gdbOTp7Tefp3hbbgCGQoK7tUvrWiRlcoBHIZ809ElXwNQwVo0B98LuTXQ==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4703,10 +4703,10 @@ packages: '@radix-ui/react-scroll-area@1.2.18': resolution: {integrity: sha512-Zn5Cd171wxsO3Dfg8HaW6RifTb9CYTKQJHs/G4+LN1GfmJpaQMZQyQxMprVPHpaz7QY4l9BxK2JwQuzHsXC8nA==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4716,10 +4716,10 @@ packages: '@radix-ui/react-select@2.3.7': resolution: {integrity: sha512-WFGImkmbzcfxeIwq/+4HvRN0pizBwbwQUED4I13ezQsDdfl38ZntN6TmR8XaSzPBqoCToe8rF75j6NPNDSzhbg==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4729,10 +4729,10 @@ packages: '@radix-ui/react-separator@1.1.15': resolution: {integrity: sha512-jOLO4lssEzWpoDu7G+Ze4VjwMRUBt291pnZD0gmalREZipnTX3wadQo7Fy48GCTfe14/YRN6rw/rOJqrE85Wxw==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4742,10 +4742,10 @@ packages: '@radix-ui/react-slider@1.4.7': resolution: {integrity: sha512-mTSLf1GC/C0moWjTbvCM6Qn/gBjvlFt1azuWF2v7MN5C3Zq2U2J2lN3ZEYkpujuOU5Ro7A28wkviSxaKnG0BYg==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4755,8 +4755,8 @@ packages: '@radix-ui/react-slot@1.3.3': resolution: {integrity: sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==} peerDependencies: - '@types/react': 19.2.18 - react: 19.2.8 + '@types/react': 19.3.0 + react: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4764,10 +4764,10 @@ packages: '@radix-ui/react-switch@1.3.7': resolution: {integrity: sha512-48tB/4dn2UVLBCYhTu9AuR63IHl73l/qLbLgxd86noTUor4/K4LFDAcYjK+isP5313qxaFpjPVogE7+Y0/V3Kw==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4777,10 +4777,10 @@ packages: '@radix-ui/react-tabs@1.1.21': resolution: {integrity: sha512-UKxJlZid7FVtsk/WTxj4i4uSEgj2Au+KBbS7SQyTlzMhhn+86Cz3tISZdTa87bfEfcuvZezf2ZsxD4xuEKtkog==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4790,10 +4790,10 @@ packages: '@radix-ui/react-toggle-group@1.1.19': resolution: {integrity: sha512-OtnwuSVjd1Ofi+AdnvhsjQdyuhCDwYs1w9RyB5BN/OavXOVQo42SYqQjwUnbPnaiPFBpQ9aX70dWeee+v2oBLA==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4803,10 +4803,10 @@ packages: '@radix-ui/react-toggle@1.1.18': resolution: {integrity: sha512-7lonPlKfSacd20GlOBx2ltuVKz9oqWYZz+oMQyOltw6t1y2nyftj2ZmwwUHYn49kqfDWcp8dNZm5NgV+5Z+mug==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4816,10 +4816,10 @@ packages: '@radix-ui/react-tooltip@1.2.16': resolution: {integrity: sha512-6EamKFRRnlpdadndbZ6LMwycfwkwPte1B42hs6QA0gYhjaOKqW4PZ4pjaW9UrlDX5eVt/OjncE7BFTPL5nmZhg==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4829,8 +4829,8 @@ packages: '@radix-ui/react-use-callback-ref@1.1.4': resolution: {integrity: sha512-R6OUY2e2fA6Yn6s+VSx5KBV6Nx8LQEhu+cz7LCej18rQ1HLyg9PSC9jP/ZNx0o6FAIK9c0F1kHylzSxKsdlkrQ==} peerDependencies: - '@types/react': 19.2.18 - react: 19.2.8 + '@types/react': 19.3.0 + react: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4838,8 +4838,8 @@ packages: '@radix-ui/react-use-controllable-state@1.2.6': resolution: {integrity: sha512-uEQJGT97ZA/TgP/Hydw47lHu+/vQj6z/0jA+WeTbK1o9Rx45GImjpD0tc3W5ad3D6XTSR6e1yEO0FvGq6WQfVQ==} peerDependencies: - '@types/react': 19.2.18 - react: 19.2.8 + '@types/react': 19.3.0 + react: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4847,8 +4847,8 @@ packages: '@radix-ui/react-use-effect-event@0.0.5': resolution: {integrity: sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYqFMTdG1Jgg==} peerDependencies: - '@types/react': 19.2.18 - react: 19.2.8 + '@types/react': 19.3.0 + react: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4856,8 +4856,8 @@ packages: '@radix-ui/react-use-is-hydrated@0.1.3': resolution: {integrity: sha512-umO/aJ+82CpOnhDZUTbILCQf7kU/g0iv+oGs/Q8jw7IkhWBzaEP4sA268PhFAJTFetbwp3ICc6ktpI4TqtxcIw==} peerDependencies: - '@types/react': 19.2.18 - react: 19.2.8 + '@types/react': 19.3.0 + react: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4865,8 +4865,8 @@ packages: '@radix-ui/react-use-layout-effect@1.1.4': resolution: {integrity: sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==} peerDependencies: - '@types/react': 19.2.18 - react: 19.2.8 + '@types/react': 19.3.0 + react: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4874,8 +4874,8 @@ packages: '@radix-ui/react-use-previous@1.1.4': resolution: {integrity: sha512-XoSLhbRbqxFtgJoi2fNHA3C6pDlY34x508vUpUGoFZfvePfHXHbE1lC4FYFMnJWgiCRroSTw6fOsXQoVS9RwZg==} peerDependencies: - '@types/react': 19.2.18 - react: 19.2.8 + '@types/react': 19.3.0 + react: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4883,8 +4883,8 @@ packages: '@radix-ui/react-use-rect@1.1.4': resolution: {integrity: sha512-cSOCh6JlkmfjLyNcLiu2nB4v+nm+dkZ+Q5KHWk/soo4U7ZLiEQFKHK9/YmtBHjfCEaU43IBKQOc4/uJmCaiCTQ==} peerDependencies: - '@types/react': 19.2.18 - react: 19.2.8 + '@types/react': 19.3.0 + react: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4892,8 +4892,8 @@ packages: '@radix-ui/react-use-size@1.1.4': resolution: {integrity: sha512-D3anSY15EJoxrihpsXI6SMrmmonnQtR2ni7arO+Lfdg3O95b9hNXxONk8jA5C8ANdF/h5HMAxejgs8PWJ6rlhw==} peerDependencies: - '@types/react': 19.2.18 - react: 19.2.8 + '@types/react': 19.3.0 + react: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4901,10 +4901,10 @@ packages: '@radix-ui/react-visually-hidden@1.2.11': resolution: {integrity: sha512-NFS86RYYZb4/exihaESBGOpMJFz8MGLAfu3mOBSGByVnVPC9JPASfYubxd/8KbkQK0sYAv8lVQDEQukDX/qXvQ==} peerDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -4917,7 +4917,7 @@ packages: '@reduxjs/toolkit@2.12.0': resolution: {integrity: sha512-KiT+RzZbp6mQET+Mg+h2c97+9j1sNflUxQkIHI7Yuzf6Peu+OYpmkn6nbHWmLLWj+1ZODUJFwGZ7gx3L9R9EOw==} peerDependencies: - react: 19.2.8 + react: 19.3.0 react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0 peerDependenciesMeta: react: @@ -5273,7 +5273,7 @@ packages: resolution: {integrity: sha512-j1d/4hvoaUVKs5GRrfmwUCkiEmkfaeHsk+xgausZlzg5YvmwpF+gyevBLNP26GFEH7nyHXW4l8dbbo0eNieJmw==} engines: {node: '>=18'} peerDependencies: - react: 19.2.8 + react: 19.3.0 '@sentry/replay-canvas@10.70.0': resolution: {integrity: sha512-irzpw22bK5CF3jbecDa0gBUcfjv7tgeUoLAvtIfeHOP5ajmf3o4Cp99a9RQqkfgvkcMeRZBUwE91SQhp6Ank+w==} @@ -5541,20 +5541,20 @@ packages: resolution: {integrity: sha512-Qw2ju6jjnIsMpuW+VrnHZWHuugqs592PWsnI56sG28qNhg14CgRLahOcNajfuJR9P4MxKGP94WVzmFKSYUz/ig==} engines: {node: '>=20.19'} peerDependencies: - react: 19.2.8 - react-dom: 19.2.8 + react: 19.3.0 + react-dom: 19.3.0 '@tanstack/react-store@0.9.3': resolution: {integrity: sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg==} peerDependencies: - react: 19.2.8 - react-dom: 19.2.8 + react: 19.3.0 + react-dom: 19.3.0 '@tanstack/react-virtual@3.14.9': resolution: {integrity: sha512-qZyr0FZDP8rDC4WBhsryIZmAd9bveJvFGUJJtskWaew6/0dTRS6wZxnR6VQ5bY2KwL3LjerrHqQLk3a0GKcPXQ==} peerDependencies: - react: 19.2.8 - react-dom: 19.2.8 + react: 19.3.0 + react-dom: 19.3.0 '@tanstack/router-core@1.171.6': resolution: {integrity: sha512-Ol6DQ+j6rf/rPVELIzo8LHwOQV2KL+zry3b+39kL/GKrt7YId52WJRAFMzuseY4XceSW+PU7sG/Cc1QkwJr0hg==} @@ -5585,10 +5585,10 @@ packages: engines: {node: '>=18'} peerDependencies: '@testing-library/dom': ^10.0.0 - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -5836,17 +5836,17 @@ packages: '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - '@types/react-dom@19.2.4': - resolution: {integrity: sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==} + '@types/react-dom@19.3.0': + resolution: {integrity: sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==} peerDependencies: - '@types/react': 19.2.18 + '@types/react': 19.3.0 '@types/react-grid-layout@2.1.0': resolution: {integrity: sha512-pHEjVg9ert6BDFHFQ1IEdLUkd2gasJvyti5lV2kE46N/R07ZiaSZpAXeXJAA1MXy/Qby23fZmiuEgZkITxPXug==} deprecated: This is a stub types definition. react-grid-layout provides its own type definitions, so you do not need this installed. - '@types/react@19.2.18': - resolution: {integrity: sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==} + '@types/react@19.3.0': + resolution: {integrity: sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==} '@types/sarif@2.1.7': resolution: {integrity: sha512-kRz0VEkJqWLf1LLVN4pT1cg1Z9wAuvI6L97V3m2f5B76Tg8d413ddvLBPTEHAZJlnn4XSvu0FkZtViCQGVyrXQ==} @@ -5973,8 +5973,8 @@ packages: resolution: {integrity: sha512-g/TbFYympMg+TMS+ctASbcgIxEJRnYL7+VyCo2rI6dpG7dUP4wNOOAUxO8og6OH6QwavaQVYSHcY4mfQL7Ixbw==} peerDependencies: mapbox-gl: '>=3.5.0' - react: 19.2.8 - react-dom: 19.2.8 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: mapbox-gl: optional: true @@ -5983,8 +5983,8 @@ packages: resolution: {integrity: sha512-cjghAMHSJLO3sJ7N6iHJRG+n0l30LtiZ0TNND+HYhHgZDd8UMdNHwcnqQ7Ku0guY3lZ4Rw4LvMqpJYKcqbX39A==} peerDependencies: maplibre-gl: '>=4.0.0' - react: 19.2.8 - react-dom: 19.2.8 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: maplibre-gl: optional: true @@ -6407,8 +6407,8 @@ packages: next: ^14.0.0 || ^15.0.0 || ^16.0.0 pg: ^8.0.0 prisma: ^5.0.0 || ^6.0.0 || ^7.0.0 - react: 19.2.8 - react-dom: 19.2.8 + react: 19.3.0 + react-dom: 19.3.0 solid-js: ^1.0.0 svelte: ^4.0.0 || ^5.0.0 vitest: ^2.0.0 || ^3.0.0 || ^4.0.0 @@ -6681,8 +6681,8 @@ packages: cmdk@1.1.1: resolution: {integrity: sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==} peerDependencies: - react: 19.2.8 - react-dom: 19.2.8 + react: 19.3.0 + react-dom: 19.3.0 cnfast@0.1.0: resolution: {integrity: sha512-rH0jBKeLkVrK7NsZ5Ba2l7WdMBmm1k0FMpABeXUU1PgTUxbz3261gEuCSsrYuXo4BwAe3yCcIbQ93YyS52lOGQ==} @@ -7200,7 +7200,7 @@ packages: embla-carousel-react@8.6.0: resolution: {integrity: sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA==} peerDependencies: - react: 19.2.8 + react: 19.3.0 embla-carousel-reactive-utils@8.6.0: resolution: {integrity: sha512-fMVUDUEx0/uIEDM0Mz3dHznDhfX+znCCDCeIophYb1QGVM7YThSWX+wz11zlYwWFOr74b4QLGg0hrGPJeG2s4A==} @@ -7580,8 +7580,8 @@ packages: framer-motion@13.2.0: resolution: {integrity: sha512-9E33ebgMaO33w1nN/jEdW8z3/GO483fMi4rqbMG9rt83XgW9QLKRe4NcmJ8s+fQ3O34++UHrIQwlIWGIWTITjA==} peerDependencies: - react: 19.2.8 - react-dom: 19.2.8 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: react: optional: true @@ -7636,13 +7636,13 @@ packages: '@types/estree-jsx': '*' '@types/hast': '*' '@types/mdast': '*' - '@types/react': 19.2.18 + '@types/react': 19.3.0 algoliasearch: 5.x.x flexsearch: '*' lucide-react: '*' next: 16.x.x - react: 19.2.8 - react-dom: 19.2.8 + react: 19.3.0 + react-dom: 19.3.0 react-router: 7.x.x || 8.x.x waku: '*' zod: 4.x.x @@ -7691,11 +7691,11 @@ packages: '@fumadocs/satteri': 0.x.x '@types/mdast': '*' '@types/mdx': '*' - '@types/react': 19.2.18 + '@types/react': 19.3.0 fumadocs-core: ^16.7.0 mdast-util-directive: '*' next: ^15.3.0 || ^16.0.0 - react: 19.2.8 + react: 19.3.0 rolldown: '*' satteri: ^0.9.4 vite: 7.x.x || 8.x.x @@ -7725,11 +7725,11 @@ packages: resolution: {integrity: sha512-MWtQyrTEEaxop7z8TPKTuBs3xMqxW32Sr9wBlbiPAm+MxmeOSU+bfRThrOJSAgvpXo99bbx3hxhNij0441pH8g==} peerDependencies: '@types/mdx': '*' - '@types/react': 19.2.18 + '@types/react': 19.3.0 fumadocs-core: 16.15.4 next: 16.x.x - react: 19.2.8 - react-dom: 19.2.8 + react: 19.3.0 + react-dom: 19.3.0 takumi-js: '*' peerDependenciesMeta: '@types/mdx': @@ -8044,8 +8044,8 @@ packages: input-otp@1.4.2: resolution: {integrity: sha512-l3jWwYNvrEa6NTCt7BECfCm48GvwuZzkoeG3gBL2w4CHeOXW3eKFmf9UNYkNfYc3mxMrthMnxjIE07MT0zLBQA==} peerDependencies: - react: 19.2.8 - react-dom: 19.2.8 + react: 19.3.0 + react-dom: 19.3.0 internmap@1.0.1: resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} @@ -8646,7 +8646,7 @@ packages: lucide-react@1.43.0: resolution: {integrity: sha512-ubtnda1fVK5ky0PNEpOmB0wiwhpZUyJiol4K14KCm+QKvuCkfUu54Et/rIjyupJpwiJ5Hg+BLQE86/GEsS+IgQ==} peerDependencies: - react: 19.2.8 + react: 19.3.0 lunr@2.3.9: resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} @@ -9013,8 +9013,8 @@ packages: motion@13.2.0: resolution: {integrity: sha512-4Hrb5vD6HhjFstLUiCmWvtpsw+WTpP4R+QXfSDYZBz7+uxE/LrRg3aV0ReJxHrTRffHhbIE6svEqnotngXvesQ==} peerDependencies: - react: 19.2.8 - react-dom: 19.2.8 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: react: optional: true @@ -9085,8 +9085,8 @@ packages: next-themes@0.4.6: resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} peerDependencies: - react: 19.2.8 - react-dom: 19.2.8 + react: 19.3.0 + react-dom: 19.3.0 next@16.3.8: resolution: {integrity: sha512-U7QEZaTini6wKrb8A8hqLLqYQyCetegKjCpJOyxk642vWoMoU1x5PyZCJFvgYgiptA8xc5j/9xYlZFO7w9Sjmw==} @@ -9096,8 +9096,8 @@ packages: '@opentelemetry/api': ^1.1.0 '@playwright/test': ^1.51.1 babel-plugin-react-compiler: '*' - react: 19.2.8 - react-dom: 19.2.8 + react: 19.3.0 + react-dom: 19.3.0 sass: ^1.3.0 peerDependenciesMeta: '@opentelemetry/api': @@ -9540,40 +9540,40 @@ packages: resolution: {integrity: sha512-eNh6BlwcYInWaJtRv18mXQ06Ys/H6rdTZAnTaSdOYJuTpwP1JMCHNd1FDRadA+gbeinq+psdULN5Xnowy9mV8w==} engines: {node: '>=18'} peerDependencies: - '@types/react': 19.2.18 - react: 19.2.8 + '@types/react': 19.3.0 + react: 19.3.0 peerDependenciesMeta: '@types/react': optional: true - react-dom@19.2.8: - resolution: {integrity: sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==} + react-dom@19.3.0: + resolution: {integrity: sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q==} peerDependencies: - react: 19.2.8 + react: 19.3.0 react-draggable@4.7.1: resolution: {integrity: sha512-wa3tzfFnYt3yaZLuyU58fl1TNunfWfBekDgWhZA1+gb2jnp42wZ0ymuopR6M5kqDYmm4hKmzGlcKWjZf3Zb6RQ==} peerDependencies: - react: 19.2.8 - react-dom: 19.2.8 + react: 19.3.0 + react-dom: 19.3.0 react-grid-layout@2.2.4: resolution: {integrity: sha512-Eb57FsgOMYOfsUGrMI1ku/FFR+dPNPrE8qo+3hwZubpqVSy4GO9v52DeX50Tl3JDYAlCypP4rmw7Vrqk/zOIvA==} peerDependencies: - react: 19.2.8 - react-dom: 19.2.8 + react: 19.3.0 + react-dom: 19.3.0 react-hook-form@7.85.0: resolution: {integrity: sha512-U2MTriFXnclmV4rOE20p2DcRFv5WEg3FIcBFOKcOLFHDVvGIMPvLTkTWefUsonmlaVy23khVDxDWym6uJVGOzw==} engines: {node: '>=18.0.0'} peerDependencies: - react: 19.2.8 + react: 19.3.0 react-i18next@17.0.11: resolution: {integrity: sha512-cDtkXgxjuFTWUH6V+aQn1Ve5vDiUztCNPWW5GtSHDccsgRXO1nE6QFWCEmc1KAutrb3OUv87wFShJL5RhUwPXg==} peerDependencies: i18next: '>= 26.2.0' - react: 19.2.8 + react: 19.3.0 react-dom: '*' react-native: '*' typescript: ^5 || ^6 || ^7 @@ -9599,8 +9599,8 @@ packages: peerDependencies: mapbox-gl: '>=1.13.0' maplibre-gl: '>=1.13.0' - react: 19.2.8 - react-dom: 19.2.8 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: mapbox-gl: optional: true @@ -9610,14 +9610,14 @@ packages: react-markdown@10.1.0: resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==} peerDependencies: - '@types/react': 19.2.18 - react: 19.2.8 + '@types/react': 19.3.0 + react: 19.3.0 react-redux@9.3.0: resolution: {integrity: sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g==} peerDependencies: - '@types/react': 19.2.18 - react: 19.2.8 + '@types/react': 19.3.0 + react: 19.3.0 redux: ^5.0.0 peerDependenciesMeta: '@types/react': @@ -9629,8 +9629,8 @@ packages: resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} engines: {node: '>=10'} peerDependencies: - '@types/react': 19.2.18 - react: 19.2.8 + '@types/react': 19.3.0 + react: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -9639,8 +9639,8 @@ packages: resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} engines: {node: '>=10'} peerDependencies: - '@types/react': 19.2.18 - react: 19.2.8 + '@types/react': 19.3.0 + react: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -9648,28 +9648,28 @@ packages: react-resizable-panels@4.12.2: resolution: {integrity: sha512-NwY5LCo4WrxVvDh0xoMML6EMLPONP/8ckKcIdpnojxexoatZdjLiRqLJQjQK5CPkd4SYiB/2M5BVrjZBQtOO7Q==} peerDependencies: - react: 19.2.8 - react-dom: 19.2.8 + react: 19.3.0 + react-dom: 19.3.0 react-resizable@3.2.0: resolution: {integrity: sha512-3NKQ0SLZV7rs3LQHeXlOzDSRQfFrkX6TVet77/Qk03zqiZyee37b7N8/gwDJAA8UUjRz7PdWCCy49hcso45SMQ==} peerDependencies: - react: 19.2.8 - react-dom: 19.2.8 + react: 19.3.0 + react-dom: 19.3.0 react-router-dom@7.18.2: resolution: {integrity: sha512-AIKJ/jgGlFb3EbfCXk5Gzshiwt+l3mqbCrNjmEWMMjqQxNJ3svBa6bgzFyCC2Sw3RA0VWF1kg3uQf2OFhxb8hw==} engines: {node: '>=20.0.0'} peerDependencies: - react: 19.2.8 - react-dom: 19.2.8 + react: 19.3.0 + react-dom: 19.3.0 react-router@7.18.2: resolution: {integrity: sha512-aUVMjFm3GAPTTZL7oYr5E7ETiqfQCHRLH+B+5afnICvf0r7kkK4eR6SMuwbSTJw/7t+12khT/Kahij49fqOCIg==} engines: {node: '>=20.0.0'} peerDependencies: - react: 19.2.8 - react-dom: 19.2.8 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: react-dom: optional: true @@ -9678,14 +9678,14 @@ packages: resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} engines: {node: '>=10'} peerDependencies: - '@types/react': 19.2.18 - react: 19.2.8 + '@types/react': 19.3.0 + react: 19.3.0 peerDependenciesMeta: '@types/react': optional: true - react@19.2.8: - resolution: {integrity: sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==} + react@19.3.0: + resolution: {integrity: sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==} engines: {node: '>=0.10.0'} read-pkg@9.0.1: @@ -9722,8 +9722,8 @@ packages: resolution: {integrity: sha512-QXFrvt6IVcw7eeZCoyXTwkIJAX3Dv1nyVhMicXJ47GsGDDpcN8z6o644DibE9XjpBTThtsomLKnTV6lc+cVFUA==} engines: {node: '>=18'} peerDependencies: - react: 19.2.8 - react-dom: 19.2.8 + react: 19.3.0 + react-dom: 19.3.0 react-is: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 recma-build-jsx@1.0.0: @@ -9926,8 +9926,8 @@ packages: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} - scheduler@0.27.0: - resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + scheduler@0.28.0: + resolution: {integrity: sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==} scroll-into-view-if-needed@3.1.0: resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} @@ -10088,9 +10088,9 @@ packages: sonner@2.0.8: resolution: {integrity: sha512-UM/ByIoFra8yzV75n1o0Puu0bw5U/9UNnDacrJNspekBewIfsQ3D6ez1nvlWpt7aTsO6rujQtifBpycwIivqlg==} peerDependencies: - '@types/react': 19.2.18 - react: 19.2.8 - react-dom: 19.2.8 + '@types/react': 19.3.0 + react: 19.3.0 + react-dom: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -10168,8 +10168,8 @@ packages: streamdown@2.5.0: resolution: {integrity: sha512-/tTnURfIOxZK/pqJAxsfCvETG/XCJHoWnk3jq9xLcuz6CSpnjjuxSRBTTL4PKGhxiZQf0lqPxGhImdpwcZ2XwA==} peerDependencies: - react: 19.2.8 - react-dom: 19.2.8 + react: 19.3.0 + react-dom: 19.3.0 strict-event-emitter@0.5.1: resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} @@ -10253,7 +10253,7 @@ packages: peerDependencies: '@babel/core': '*' babel-plugin-macros: '*' - react: 19.2.8 + react: 19.3.0 peerDependenciesMeta: '@babel/core': optional: true @@ -10291,7 +10291,7 @@ packages: swr@2.5.1: resolution: {integrity: sha512-BRw55e8r0B7SpDN20CAzoQAHl7y1yP7/Zt7oqUjMv0vSt2u2Xnkm88Ws+VypbV9BXHQVuSuyVq7zMjO16wSExw==} peerDependencies: - react: 19.2.8 + react: 19.3.0 symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} @@ -10665,8 +10665,8 @@ packages: resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} engines: {node: '>=10'} peerDependencies: - '@types/react': 19.2.18 - react: 19.2.8 + '@types/react': 19.3.0 + react: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -10675,8 +10675,8 @@ packages: resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} engines: {node: '>=10'} peerDependencies: - '@types/react': 19.2.18 - react: 19.2.8 + '@types/react': 19.3.0 + react: 19.3.0 peerDependenciesMeta: '@types/react': optional: true @@ -10684,12 +10684,12 @@ packages: use-stick-to-bottom@1.1.6: resolution: {integrity: sha512-z3Up8jYQGTkUCsGBnwg6/wj70KgXoW5Kz1AAc1j8MtQuYMBo6ZsdhrIXoegxa7gaMMilgQYyTohTrt3p94jHog==} peerDependencies: - react: 19.2.8 + react: 19.3.0 use-sync-external-store@1.7.0: resolution: {integrity: sha512-6L+EeigHMQhdaIPNIFUKwfWJSwWFQ8gJbJ2DLOs5sDIegTwR9fRxvnM3uciHKjIZhFz+KAv2emhWMRvDmMcY8A==} peerDependencies: - react: 19.2.8 + react: 19.3.0 util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -10716,8 +10716,8 @@ packages: vaul@1.1.2: resolution: {integrity: sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==} peerDependencies: - react: 19.2.8 - react-dom: 19.2.8 + react: 19.3.0 + react-dom: 19.3.0 version-range@4.15.0: resolution: {integrity: sha512-Ck0EJbAGxHwprkzFO966t4/5QkRuzh+/I1RxhLgUKKwEn+Cd8NwM60mE3AqBZg5gYODoXW0EFsQvbZjRlvdqbg==} @@ -11094,14 +11094,14 @@ snapshots: dependencies: json-schema: 0.4.0 - '@ai-sdk/react@4.0.68(react@19.2.8)(zod@4.6.7)': + '@ai-sdk/react@4.0.68(react@19.3.0)(zod@4.6.7)': dependencies: '@ai-sdk/mcp': 2.0.31(zod@4.6.7) '@ai-sdk/provider': 4.0.7 '@ai-sdk/provider-utils': 5.0.27(zod@4.6.7) ai: 7.0.65(zod@4.6.7) - react: 19.2.8 - swr: 2.5.1(react@19.2.8) + react: 19.3.0 + swr: 2.5.1(react@19.3.0) throttleit: 2.1.0 transitivePeerDependencies: - zod @@ -11620,29 +11620,29 @@ snapshots: '@date-fns/tz@1.5.0': {} - '@dnd-kit/accessibility@3.1.1(react@19.2.8)': + '@dnd-kit/accessibility@3.1.1(react@19.3.0)': dependencies: - react: 19.2.8 + react: 19.3.0 tslib: 2.8.1 - '@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@dnd-kit/core@6.3.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: - '@dnd-kit/accessibility': 3.1.1(react@19.2.8) - '@dnd-kit/utilities': 3.2.2(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@dnd-kit/accessibility': 3.1.1(react@19.3.0) + '@dnd-kit/utilities': 3.2.2(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) tslib: 2.8.1 - '@dnd-kit/sortable@10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)': + '@dnd-kit/sortable@10.0.0(@dnd-kit/core@6.3.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)': dependencies: - '@dnd-kit/core': 6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@dnd-kit/utilities': 3.2.2(react@19.2.8) - react: 19.2.8 + '@dnd-kit/core': 6.3.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@dnd-kit/utilities': 3.2.2(react@19.3.0) + react: 19.3.0 tslib: 2.8.1 - '@dnd-kit/utilities@3.2.2(react@19.2.8)': + '@dnd-kit/utilities@3.2.2(react@19.3.0)': dependencies: - react: 19.2.8 + react: 19.3.0 tslib: 2.8.1 '@dotenvx/dotenvx@1.75.1': @@ -11893,20 +11893,20 @@ snapshots: '@floating-ui/core': 1.8.0 '@floating-ui/utils': 0.2.12 - '@floating-ui/react-dom@2.1.9(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@floating-ui/react-dom@2.1.9(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@floating-ui/dom': 1.8.0 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) '@floating-ui/utils@0.2.12': {} - '@fuma-translate/react@1.0.2(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@fuma-translate/react@1.0.2(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 + '@types/react': 19.3.0 '@fumadocs/tailwind@0.1.1(tailwindcss@4.3.3)': optionalDependencies: @@ -12287,12 +12287,12 @@ snapshots: dependencies: state-local: 1.0.7 - '@monaco-editor/react@4.7.0(monaco-editor@0.55.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@monaco-editor/react@4.7.0(monaco-editor@0.55.1)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@monaco-editor/loader': 1.7.0 monaco-editor: 0.55.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) '@mongodb-js/saslprep@1.6.1': dependencies: @@ -12429,649 +12429,649 @@ snapshots: '@radix-ui/primitive@1.1.7': {} - '@radix-ui/react-accordion@1.2.20(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-accordion@1.2.20(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-collapsible': 1.1.20(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-direction': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-id': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-collapsible': 1.1.20(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-direction': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.3.0)(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-alert-dialog@1.1.23(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-alert-dialog@1.1.23(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-dialog': 1.1.23(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-dialog': 1.1.23(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-arrow@1.1.15(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-arrow@1.1.15(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-aspect-ratio@1.1.15(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-aspect-ratio@1.1.15(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-avatar@1.2.6(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-avatar@1.2.6(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-use-is-hydrated': 0.1.3(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-is-hydrated': 0.1.3(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.3.0)(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-checkbox@1.3.11(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-checkbox@1.3.11(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-use-size': 1.1.4(@types/react@19.2.18)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-size': 1.1.4(@types/react@19.3.0)(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-collapsible@1.1.20(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-collapsible@1.1.20(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-id': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.3.0)(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-collection@1.1.15(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-collection@1.1.15(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-slot': 1.3.3(@types/react@19.2.18)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-slot': 1.3.3(@types/react@19.3.0)(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-compose-refs@1.1.5(@types/react@19.2.18)(react@19.2.8)': + '@radix-ui/react-compose-refs@1.1.5(@types/react@19.3.0)(react@19.3.0)': dependencies: - react: 19.2.8 + react: 19.3.0 optionalDependencies: - '@types/react': 19.2.18 + '@types/react': 19.3.0 - '@radix-ui/react-context-menu@2.3.7(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-context-menu@2.3.7(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-menu': 2.1.24(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-menu': 2.1.24(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.3.0)(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-context@1.2.2(@types/react@19.2.18)(react@19.2.8)': + '@radix-ui/react-context@1.2.2(@types/react@19.3.0)(react@19.3.0)': dependencies: - react: 19.2.8 + react: 19.3.0 optionalDependencies: - '@types/react': 19.2.18 + '@types/react': 19.3.0 - '@radix-ui/react-dialog@1.1.23(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-dialog@1.1.23(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-focus-guards': 1.1.6(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-focus-scope': 1.1.16(patch_hash=41d44316f54bd1c52774d12640dfe9062604489561eee39886b1912c4197e822)(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-id': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-slot': 1.3.3(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-focus-guards': 1.1.6(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-focus-scope': 1.1.16(patch_hash=41d44316f54bd1c52774d12640dfe9062604489561eee39886b1912c4197e822)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-slot': 1.3.3(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.3.0)(react@19.3.0) aria-hidden: 1.2.6 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - react-remove-scroll: 2.7.2(@types/react@19.2.18)(react@19.2.8) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) + react-remove-scroll: 2.7.2(@types/react@19.3.0)(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-direction@1.1.4(@types/react@19.2.18)(react@19.2.8)': + '@radix-ui/react-direction@1.1.4(@types/react@19.3.0)(react@19.3.0)': dependencies: - react: 19.2.8 + react: 19.3.0 optionalDependencies: - '@types/react': 19.2.18 + '@types/react': 19.3.0 - '@radix-ui/react-dismissable-layer@1.1.19(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-dismissable-layer@1.1.19(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-use-effect-event': 0.0.5(@types/react@19.2.18)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-effect-event': 0.0.5(@types/react@19.3.0)(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-dropdown-menu@2.1.24(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-dropdown-menu@2.1.24(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-id': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-menu': 2.1.24(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-menu': 2.1.24(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.3.0)(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-focus-guards@1.1.6(@types/react@19.2.18)(react@19.2.8)': + '@radix-ui/react-focus-guards@1.1.6(@types/react@19.3.0)(react@19.3.0)': dependencies: - react: 19.2.8 + react: 19.3.0 optionalDependencies: - '@types/react': 19.2.18 + '@types/react': 19.3.0 - '@radix-ui/react-focus-scope@1.1.16(patch_hash=41d44316f54bd1c52774d12640dfe9062604489561eee39886b1912c4197e822)(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-focus-scope@1.1.16(patch_hash=41d44316f54bd1c52774d12640dfe9062604489561eee39886b1912c4197e822)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.18)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.3.0)(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-hover-card@1.1.23(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-hover-card@1.1.23(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-popper': 1.3.7(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-popper': 1.3.7(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.3.0)(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-id@1.1.4(@types/react@19.2.18)(react@19.2.8)': + '@radix-ui/react-id@1.1.4(@types/react@19.3.0)(react@19.3.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.8) - react: 19.2.8 + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.3.0)(react@19.3.0) + react: 19.3.0 optionalDependencies: - '@types/react': 19.2.18 + '@types/react': 19.3.0 - '@radix-ui/react-label@2.1.15(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-label@2.1.15(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-menu@2.1.24(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-menu@2.1.24(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-direction': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-focus-guards': 1.1.6(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-focus-scope': 1.1.16(patch_hash=41d44316f54bd1c52774d12640dfe9062604489561eee39886b1912c4197e822)(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-id': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-popper': 1.3.7(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-roving-focus': 1.1.19(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-slot': 1.3.3(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-direction': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-focus-guards': 1.1.6(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-focus-scope': 1.1.16(patch_hash=41d44316f54bd1c52774d12640dfe9062604489561eee39886b1912c4197e822)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-popper': 1.3.7(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-roving-focus': 1.1.19(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-slot': 1.3.3(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.3.0)(react@19.3.0) aria-hidden: 1.2.6 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - react-remove-scroll: 2.7.2(@types/react@19.2.18)(react@19.2.8) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) + react-remove-scroll: 2.7.2(@types/react@19.3.0)(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-menubar@1.1.24(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-menubar@1.1.24(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-direction': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-id': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-menu': 2.1.24(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-roving-focus': 1.1.19(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-direction': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-menu': 2.1.24(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-roving-focus': 1.1.19(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.3.0)(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-navigation-menu@1.2.22(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-navigation-menu@1.2.22(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-direction': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-id': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-use-previous': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-visually-hidden': 1.2.11(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-direction': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-previous': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-visually-hidden': 1.2.11(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-popover@1.1.23(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-popover@1.1.23(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-focus-guards': 1.1.6(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-focus-scope': 1.1.16(patch_hash=41d44316f54bd1c52774d12640dfe9062604489561eee39886b1912c4197e822)(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-id': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-popper': 1.3.7(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-slot': 1.3.3(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-focus-guards': 1.1.6(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-focus-scope': 1.1.16(patch_hash=41d44316f54bd1c52774d12640dfe9062604489561eee39886b1912c4197e822)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-popper': 1.3.7(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-slot': 1.3.3(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.3.0)(react@19.3.0) aria-hidden: 1.2.6 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - react-remove-scroll: 2.7.2(@types/react@19.2.18)(react@19.2.8) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) + react-remove-scroll: 2.7.2(@types/react@19.3.0)(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) - - '@radix-ui/react-popper@1.3.7(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@floating-ui/react-dom': 2.1.9(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-arrow': 1.1.15(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-use-rect': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-use-size': 1.1.4(@types/react@19.2.18)(react@19.2.8) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) + + '@radix-ui/react-popper@1.3.7(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': + dependencies: + '@floating-ui/react-dom': 2.1.9(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-arrow': 1.1.15(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-rect': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-size': 1.1.4(@types/react@19.3.0)(react@19.3.0) '@radix-ui/rect': 1.1.3 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-portal@1.1.17(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-portal@1.1.17(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.3.0)(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-presence@1.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-presence@1.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.3.0)(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-primitive@2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-primitive@2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: - '@radix-ui/react-slot': 1.3.3(@types/react@19.2.18)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-slot': 1.3.3(@types/react@19.3.0)(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-progress@1.1.16(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-progress@1.1.16(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: - '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-radio-group@1.4.7(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-radio-group@1.4.7(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-direction': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-roving-focus': 1.1.19(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-use-size': 1.1.4(@types/react@19.2.18)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-direction': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-roving-focus': 1.1.19(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-size': 1.1.4(@types/react@19.3.0)(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-roving-focus@1.1.19(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-roving-focus@1.1.19(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-direction': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-id': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-use-is-hydrated': 0.1.3(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-direction': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-is-hydrated': 0.1.3(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.3.0)(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-scroll-area@1.2.18(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-scroll-area@1.2.18(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@radix-ui/number': 1.1.3 '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-direction': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-direction': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.3.0)(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-select@2.3.7(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-select@2.3.7(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': 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.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-direction': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-focus-guards': 1.1.6(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-focus-scope': 1.1.16(patch_hash=41d44316f54bd1c52774d12640dfe9062604489561eee39886b1912c4197e822)(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-id': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-popper': 1.3.7(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-slot': 1.3.3(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-use-previous': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-visually-hidden': 1.2.11(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-direction': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-focus-guards': 1.1.6(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-focus-scope': 1.1.16(patch_hash=41d44316f54bd1c52774d12640dfe9062604489561eee39886b1912c4197e822)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-popper': 1.3.7(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-slot': 1.3.3(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-previous': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-visually-hidden': 1.2.11(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) aria-hidden: 1.2.6 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - react-remove-scroll: 2.7.2(@types/react@19.2.18)(react@19.2.8) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) + react-remove-scroll: 2.7.2(@types/react@19.3.0)(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-separator@1.1.15(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-separator@1.1.15(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-slider@1.4.7(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-slider@1.4.7(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': 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.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-direction': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-use-previous': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-use-size': 1.1.4(@types/react@19.2.18)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-direction': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-previous': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-size': 1.1.4(@types/react@19.3.0)(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-slot@1.3.3(@types/react@19.2.18)(react@19.2.8)': + '@radix-ui/react-slot@1.3.3(@types/react@19.3.0)(react@19.3.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) - react: 19.2.8 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0) + react: 19.3.0 optionalDependencies: - '@types/react': 19.2.18 + '@types/react': 19.3.0 - '@radix-ui/react-switch@1.3.7(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-switch@1.3.7(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-use-size': 1.1.4(@types/react@19.2.18)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-size': 1.1.4(@types/react@19.3.0)(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-tabs@1.1.21(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-tabs@1.1.21(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-direction': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-id': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-roving-focus': 1.1.19(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-direction': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-roving-focus': 1.1.19(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.3.0)(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-toggle-group@1.1.19(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-toggle-group@1.1.19(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-direction': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-roving-focus': 1.1.19(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-toggle': 1.1.18(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-direction': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-roving-focus': 1.1.19(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-toggle': 1.1.18(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.3.0)(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-toggle@1.1.18(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-toggle@1.1.18(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.3.0)(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-tooltip@1.2.16(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-tooltip@1.2.16(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-id': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-popper': 1.3.7(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-slot': 1.3.3(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-visually-hidden': 1.2.11(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-popper': 1.3.7(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-slot': 1.3.3(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-visually-hidden': 1.2.11(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-use-callback-ref@1.1.4(@types/react@19.2.18)(react@19.2.8)': + '@radix-ui/react-use-callback-ref@1.1.4(@types/react@19.3.0)(react@19.3.0)': dependencies: - react: 19.2.8 + react: 19.3.0 optionalDependencies: - '@types/react': 19.2.18 + '@types/react': 19.3.0 - '@radix-ui/react-use-controllable-state@1.2.6(@types/react@19.2.18)(react@19.2.8)': + '@radix-ui/react-use-controllable-state@1.2.6(@types/react@19.3.0)(react@19.3.0)': dependencies: '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-use-effect-event': 0.0.5(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.8) - react: 19.2.8 + '@radix-ui/react-use-effect-event': 0.0.5(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.3.0)(react@19.3.0) + react: 19.3.0 optionalDependencies: - '@types/react': 19.2.18 + '@types/react': 19.3.0 - '@radix-ui/react-use-effect-event@0.0.5(@types/react@19.2.18)(react@19.2.8)': + '@radix-ui/react-use-effect-event@0.0.5(@types/react@19.3.0)(react@19.3.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.8) - react: 19.2.8 + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.3.0)(react@19.3.0) + react: 19.3.0 optionalDependencies: - '@types/react': 19.2.18 + '@types/react': 19.3.0 - '@radix-ui/react-use-is-hydrated@0.1.3(@types/react@19.2.18)(react@19.2.8)': + '@radix-ui/react-use-is-hydrated@0.1.3(@types/react@19.3.0)(react@19.3.0)': dependencies: - react: 19.2.8 + react: 19.3.0 optionalDependencies: - '@types/react': 19.2.18 + '@types/react': 19.3.0 - '@radix-ui/react-use-layout-effect@1.1.4(@types/react@19.2.18)(react@19.2.8)': + '@radix-ui/react-use-layout-effect@1.1.4(@types/react@19.3.0)(react@19.3.0)': dependencies: - react: 19.2.8 + react: 19.3.0 optionalDependencies: - '@types/react': 19.2.18 + '@types/react': 19.3.0 - '@radix-ui/react-use-previous@1.1.4(@types/react@19.2.18)(react@19.2.8)': + '@radix-ui/react-use-previous@1.1.4(@types/react@19.3.0)(react@19.3.0)': dependencies: - react: 19.2.8 + react: 19.3.0 optionalDependencies: - '@types/react': 19.2.18 + '@types/react': 19.3.0 - '@radix-ui/react-use-rect@1.1.4(@types/react@19.2.18)(react@19.2.8)': + '@radix-ui/react-use-rect@1.1.4(@types/react@19.3.0)(react@19.3.0)': dependencies: '@radix-ui/rect': 1.1.3 - react: 19.2.8 + react: 19.3.0 optionalDependencies: - '@types/react': 19.2.18 + '@types/react': 19.3.0 - '@radix-ui/react-use-size@1.1.4(@types/react@19.2.18)(react@19.2.8)': + '@radix-ui/react-use-size@1.1.4(@types/react@19.3.0)(react@19.3.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.8) - react: 19.2.8 + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.3.0)(react@19.3.0) + react: 19.3.0 optionalDependencies: - '@types/react': 19.2.18 + '@types/react': 19.3.0 - '@radix-ui/react-visually-hidden@1.2.11(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-visually-hidden@1.2.11(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) '@radix-ui/rect@1.1.3': {} - '@reduxjs/toolkit@2.12.0(react-redux@9.3.0(@types/react@19.2.18)(react@19.2.8)(redux@5.0.1))(react@19.2.8)': + '@reduxjs/toolkit@2.12.0(react-redux@9.3.0(@types/react@19.3.0)(react@19.3.0)(redux@5.0.1))(react@19.3.0)': dependencies: '@standard-schema/spec': 1.1.0 '@standard-schema/utils': 0.3.0 @@ -13080,8 +13080,8 @@ snapshots: redux-thunk: 3.1.0(redux@5.0.1) reselect: 5.2.0 optionalDependencies: - react: 19.2.8 - react-redux: 9.3.0(@types/react@19.2.18)(react@19.2.8)(redux@5.0.1) + react: 19.3.0 + react-redux: 9.3.0(@types/react@19.3.0)(react@19.3.0)(redux@5.0.1) '@rolldown/binding-android-arm-eabi@1.2.15': optional: true @@ -13357,12 +13357,12 @@ snapshots: dependencies: '@sentry/core': 10.70.0 - '@sentry/react@10.70.0(react@19.2.8)': + '@sentry/react@10.70.0(react@19.3.0)': dependencies: '@sentry/browser': 10.70.0 '@sentry/conventions': 0.16.0 '@sentry/core': 10.70.0 - react: 19.2.8 + react: 19.3.0 '@sentry/replay-canvas@10.70.0': dependencies: @@ -13585,29 +13585,29 @@ snapshots: '@tanstack/history@1.162.0': optional: true - '@tanstack/react-router@1.170.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@tanstack/react-router@1.170.8(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@tanstack/history': 1.162.0 - '@tanstack/react-store': 0.9.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@tanstack/react-store': 0.9.3(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@tanstack/router-core': 1.171.6 isbot: 5.2.2 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optional: true - '@tanstack/react-store@0.9.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@tanstack/react-store@0.9.3(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@tanstack/store': 0.9.3 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - use-sync-external-store: 1.7.0(react@19.2.8) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) + use-sync-external-store: 1.7.0(react@19.3.0) optional: true - '@tanstack/react-virtual@3.14.9(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@tanstack/react-virtual@3.14.9(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@tanstack/virtual-core': 3.17.7 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) '@tanstack/router-core@1.171.6': dependencies: @@ -13645,15 +13645,15 @@ snapshots: optionalDependencies: vitest: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@26.2.0)(@vitest/coverage-v8@4.1.10)(@vitest/ui@4.1.10)(happy-dom@20.11.2)(jsdom@29.1.1(@noble/hashes@2.3.0))(msw@2.15.0(@types/node@26.2.0)(typescript@6.0.3))(vite@8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) - '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@babel/runtime': 7.29.7 '@testing-library/dom': 10.4.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) '@testing-library/user-event@14.6.4(@testing-library/dom@10.4.1)': dependencies: @@ -13932,18 +13932,18 @@ snapshots: '@types/range-parser@1.2.7': {} - '@types/react-dom@19.2.4(@types/react@19.2.18)': + '@types/react-dom@19.3.0(@types/react@19.3.0)': dependencies: - '@types/react': 19.2.18 + '@types/react': 19.3.0 - '@types/react-grid-layout@2.1.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@types/react-grid-layout@2.1.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: - react-grid-layout: 2.2.4(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + react-grid-layout: 2.2.4(react-dom@19.3.0(react@19.3.0))(react@19.3.0) transitivePeerDependencies: - react - react-dom - '@types/react@19.2.18': + '@types/react@19.3.0': dependencies: csstype: 3.2.3 @@ -14105,16 +14105,16 @@ snapshots: '@vercel/oidc@3.2.0': {} - '@vis.gl/react-mapbox@8.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@vis.gl/react-mapbox@8.1.2(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) - '@vis.gl/react-maplibre@8.1.2(maplibre-gl@6.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@vis.gl/react-maplibre@8.1.2(maplibre-gl@6.4.1)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@maplibre/maplibre-gl-style-spec': 19.3.3 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: maplibre-gl: 6.4.1 @@ -14539,7 +14539,7 @@ snapshots: baseline-browser-mapping@2.11.21: {} - better-auth@1.7.2(@opentelemetry/api@1.9.1)(better-sqlite3@12.9.0)(mongodb@7.2.0(socks@2.8.9))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(vitest@4.1.10): + better-auth@1.7.2(@opentelemetry/api@1.9.1)(better-sqlite3@12.9.0)(mongodb@7.2.0(socks@2.8.9))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(vitest@4.1.10): dependencies: '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.0) '@better-auth/drizzle-adapter': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.0))(@better-auth/utils@0.4.2) @@ -14561,9 +14561,9 @@ snapshots: optionalDependencies: better-sqlite3: 12.9.0 mongodb: 7.2.0(socks@2.8.9) - next: 16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + next: 16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) vitest: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@26.2.0)(@vitest/coverage-v8@4.1.10)(@vitest/ui@4.1.10)(happy-dom@20.11.2)(jsdom@29.1.1(@noble/hashes@2.3.0))(msw@2.15.0(@types/node@26.2.0)(typescript@6.0.3))(vite@8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) transitivePeerDependencies: - '@cloudflare/workers-types' @@ -14825,14 +14825,14 @@ snapshots: clsx@2.1.1: {} - cmdk@1.1.1(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + cmdk@1.1.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0): dependencies: - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-dialog': 1.1.23(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-id': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-dialog': 1.1.23(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) transitivePeerDependencies: - '@types/react' - '@types/react-dom' @@ -15317,11 +15317,11 @@ snapshots: electron-to-chromium@1.5.408: {} - embla-carousel-react@8.6.0(react@19.2.8): + embla-carousel-react@8.6.0(react@19.3.0): dependencies: embla-carousel: 8.6.0 embla-carousel-reactive-utils: 8.6.0(embla-carousel@8.6.0) - react: 19.2.8 + react: 19.3.0 embla-carousel-reactive-utils@8.6.0(embla-carousel@8.6.0): dependencies: @@ -15869,14 +15869,14 @@ snapshots: fraction.js@5.3.4: {} - framer-motion@13.2.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + framer-motion@13.2.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0): dependencies: motion-dom: 13.2.0 motion-utils: 13.0.0 tslib: 2.8.1 optionalDependencies: - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) fresh@0.5.2: {} @@ -15912,7 +15912,7 @@ snapshots: mkdirp: 0.5.6 rimraf: 2.7.1 - fumadocs-core@16.15.4(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.43.0(react@19.2.8))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react-router@7.18.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)(zod@4.6.7): + fumadocs-core@16.15.4(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.8(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.43.0(react@19.3.0))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react-router@7.18.2(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)(zod@4.6.7): dependencies: '@fumari/image-size': 0.1.0 estree-util-value-to-estree: 3.5.0 @@ -15935,28 +15935,28 @@ snapshots: zbsearch: 4.0.0 optionalDependencies: '@mdx-js/mdx': 3.1.1 - '@tanstack/react-router': 1.170.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@tanstack/react-router': 1.170.8(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.5 '@types/mdast': 4.0.4 - '@types/react': 19.2.18 - lucide-react: 1.43.0(react@19.2.8) - next: 16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - react-router: 7.18.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@types/react': 19.3.0 + lucide-react: 1.43.0(react@19.3.0) + next: 16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) + react-router: 7.18.2(react-dom@19.3.0(react@19.3.0))(react@19.3.0) zod: 4.6.7 transitivePeerDependencies: - supports-color - fumadocs-mdx@15.2.3(@types/mdast@4.0.4)(@types/mdx@2.0.14)(@types/react@19.2.18)(fumadocs-core@16.15.4(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.43.0(react@19.2.8))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react-router@7.18.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)(zod@4.6.7))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)(rolldown@1.2.15)(vite@8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)): + fumadocs-mdx@15.2.3(@types/mdast@4.0.4)(@types/mdx@2.0.14)(@types/react@19.3.0)(fumadocs-core@16.15.4(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.8(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.43.0(react@19.3.0))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react-router@7.18.2(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)(zod@4.6.7))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)(rolldown@1.2.15)(vite@8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)): dependencies: '@mdx-js/mdx': 3.1.1 '@standard-schema/spec': 1.1.0 chokidar: 5.0.0 esbuild: 0.28.2 estree-util-value-to-estree: 3.5.0 - fumadocs-core: 16.15.4(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.43.0(react@19.2.8))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react-router@7.18.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)(zod@4.6.7) + fumadocs-core: 16.15.4(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.8(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.43.0(react@19.3.0))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react-router@7.18.2(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)(zod@4.6.7) github-slugger: 2.0.0 magic-string: 1.2.0 mdast-util-mdx: 3.0.0 @@ -15974,45 +15974,45 @@ snapshots: optionalDependencies: '@types/mdast': 4.0.4 '@types/mdx': 2.0.14 - '@types/react': 19.2.18 - next: 16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - react: 19.2.8 + '@types/react': 19.3.0 + next: 16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + react: 19.3.0 rolldown: 1.2.15 vite: 8.3.5(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) transitivePeerDependencies: - supports-color - fumadocs-ui@16.15.4(@types/mdx@2.0.14)(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(fumadocs-core@16.15.4(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.43.0(react@19.2.8))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react-router@7.18.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)(zod@4.6.7))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(tailwindcss@4.3.3): + fumadocs-ui@16.15.4(@types/mdx@2.0.14)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(fumadocs-core@16.15.4(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.8(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.43.0(react@19.3.0))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react-router@7.18.2(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)(zod@4.6.7))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(tailwindcss@4.3.3): dependencies: - '@fuma-translate/react': 1.0.2(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@fuma-translate/react': 1.0.2(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@fumadocs/tailwind': 0.1.1(tailwindcss@4.3.3) - '@radix-ui/react-accordion': 1.2.20(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-collapsible': 1.1.20(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-dialog': 1.1.23(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-direction': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-navigation-menu': 1.2.22(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-popover': 1.1.23(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-scroll-area': 1.2.18(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-slot': 1.3.3(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-tabs': 1.1.21(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-accordion': 1.2.20(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-collapsible': 1.1.20(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-dialog': 1.1.23(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-direction': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-navigation-menu': 1.2.22(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-popover': 1.1.23(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-scroll-area': 1.2.18(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-slot': 1.3.3(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-tabs': 1.1.21(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) class-variance-authority: 0.7.1 cnfast: 0.1.0 - fumadocs-core: 16.15.4(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.43.0(react@19.2.8))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react-router@7.18.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)(zod@4.6.7) - lucide-react: 1.43.0(react@19.2.8) - motion: 13.2.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - next-themes: 0.4.6(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - react-remove-scroll: 2.7.2(@types/react@19.2.18)(react@19.2.8) + fumadocs-core: 16.15.4(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.8(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.43.0(react@19.3.0))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react-router@7.18.2(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)(zod@4.6.7) + lucide-react: 1.43.0(react@19.3.0) + motion: 13.2.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + next-themes: 0.4.6(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) + react-remove-scroll: 2.7.2(@types/react@19.3.0)(react@19.3.0) rehype-raw: 7.0.0 scroll-into-view-if-needed: 3.1.0 shiki: 4.4.3 unist-util-visit: 5.1.0 optionalDependencies: '@types/mdx': 2.0.14 - '@types/react': 19.2.18 - next: 16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@types/react': 19.3.0 + next: 16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) transitivePeerDependencies: - '@types/react-dom' - tailwindcss @@ -16398,10 +16398,10 @@ snapshots: inline-style-parser@0.2.7: {} - input-otp@1.4.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + input-otp@1.4.2(react-dom@19.3.0(react@19.3.0))(react@19.3.0): dependencies: - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) internmap@1.0.1: {} @@ -16890,9 +16890,9 @@ snapshots: dependencies: yallist: 4.0.0 - lucide-react@1.43.0(react@19.2.8): + lucide-react@1.43.0(react@19.3.0): dependencies: - react: 19.2.8 + react: 19.3.0 lunr@2.3.9: {} @@ -17521,13 +17521,13 @@ snapshots: motion-utils@13.0.0: {} - motion@13.2.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + motion@13.2.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0): dependencies: - framer-motion: 13.2.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + framer-motion: 13.2.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) tslib: 2.8.1 optionalDependencies: - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) mrmime@2.0.1: {} @@ -17587,21 +17587,21 @@ snapshots: negotiator@1.0.0: {} - next-themes@0.4.6(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + next-themes@0.4.6(react-dom@19.3.0(react@19.3.0))(react@19.3.0): dependencies: - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) - next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0): dependencies: '@next/env': 16.3.8 '@swc/helpers': 0.5.23 baseline-browser-mapping: 2.11.21 caniuse-lite: 1.0.30001810 postcss: 8.5.23 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - styled-jsx: 5.1.6(@babel/core@7.29.7)(react@19.2.8) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) + styled-jsx: 5.1.6(@babel/core@7.29.7)(react@19.3.0) optionalDependencies: '@next/swc-darwin-arm64': 16.3.8 '@next/swc-darwin-x64': 16.3.8 @@ -18054,50 +18054,50 @@ snapshots: strip-json-comments: 2.0.1 optional: true - react-day-picker@10.0.1(@types/react@19.2.18)(react@19.2.8): + react-day-picker@10.0.1(@types/react@19.3.0)(react@19.3.0): dependencies: '@date-fns/tz': 1.5.0 date-fns: 4.4.0 - react: 19.2.8 + react: 19.3.0 optionalDependencies: - '@types/react': 19.2.18 + '@types/react': 19.3.0 - react-dom@19.2.8(react@19.2.8): + react-dom@19.3.0(react@19.3.0): dependencies: - react: 19.2.8 - scheduler: 0.27.0 + react: 19.3.0 + scheduler: 0.28.0 - react-draggable@4.7.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + react-draggable@4.7.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0): dependencies: clsx: 2.1.1 prop-types: 15.8.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) - react-grid-layout@2.2.4(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + react-grid-layout@2.2.4(react-dom@19.3.0(react@19.3.0))(react@19.3.0): dependencies: clsx: 2.1.1 fast-equals: 4.0.3 prop-types: 15.8.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - react-draggable: 4.7.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - react-resizable: 3.2.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) + react-draggable: 4.7.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + react-resizable: 3.2.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) resize-observer-polyfill: 1.5.1 - react-hook-form@7.85.0(react@19.2.8): + react-hook-form@7.85.0(react@19.3.0): dependencies: - react: 19.2.8 + react: 19.3.0 - react-i18next@17.0.11(i18next@26.4.0(typescript@6.0.3))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3): + react-i18next@17.0.11(i18next@26.4.0(typescript@6.0.3))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(typescript@6.0.3): dependencies: '@babel/runtime': 7.29.7 html-parse-stringify: 4.0.1 i18next: 26.4.0(typescript@6.0.3) - react: 19.2.8 - use-sync-external-store: 1.7.0(react@19.2.8) + react: 19.3.0 + use-sync-external-store: 1.7.0(react@19.3.0) optionalDependencies: - react-dom: 19.2.8(react@19.2.8) + react-dom: 19.3.0(react@19.3.0) typescript: 6.0.3 react-is@16.13.1: {} @@ -18106,25 +18106,25 @@ snapshots: react-is@19.2.6: {} - react-map-gl@8.1.2(maplibre-gl@6.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + react-map-gl@8.1.2(maplibre-gl@6.4.1)(react-dom@19.3.0(react@19.3.0))(react@19.3.0): dependencies: - '@vis.gl/react-mapbox': 8.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@vis.gl/react-maplibre': 8.1.2(maplibre-gl@6.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@vis.gl/react-mapbox': 8.1.2(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@vis.gl/react-maplibre': 8.1.2(maplibre-gl@6.4.1)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: maplibre-gl: 6.4.1 - react-markdown@10.1.0(@types/react@19.2.18)(react@19.2.8): + react-markdown@10.1.0(@types/react@19.3.0)(react@19.3.0): dependencies: '@types/hast': 3.0.5 '@types/mdast': 4.0.4 - '@types/react': 19.2.18 + '@types/react': 19.3.0 devlop: 1.1.0 hast-util-to-jsx-runtime: 2.3.6 html-url-attributes: 3.0.1 mdast-util-to-hast: 13.2.1 - react: 19.2.8 + react: 19.3.0 remark-parse: 11.0.0 remark-rehype: 11.1.2 unified: 11.0.5 @@ -18133,69 +18133,69 @@ snapshots: transitivePeerDependencies: - supports-color - react-redux@9.3.0(@types/react@19.2.18)(react@19.2.8)(redux@5.0.1): + react-redux@9.3.0(@types/react@19.3.0)(react@19.3.0)(redux@5.0.1): dependencies: '@types/use-sync-external-store': 0.0.6 - react: 19.2.8 - use-sync-external-store: 1.7.0(react@19.2.8) + react: 19.3.0 + use-sync-external-store: 1.7.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 + '@types/react': 19.3.0 redux: 5.0.1 - react-remove-scroll-bar@2.3.8(@types/react@19.2.18)(react@19.2.8): + react-remove-scroll-bar@2.3.8(@types/react@19.3.0)(react@19.3.0): dependencies: - react: 19.2.8 - react-style-singleton: 2.2.3(@types/react@19.2.18)(react@19.2.8) + react: 19.3.0 + react-style-singleton: 2.2.3(@types/react@19.3.0)(react@19.3.0) tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.18 + '@types/react': 19.3.0 - react-remove-scroll@2.7.2(@types/react@19.2.18)(react@19.2.8): + react-remove-scroll@2.7.2(@types/react@19.3.0)(react@19.3.0): dependencies: - react: 19.2.8 - react-remove-scroll-bar: 2.3.8(@types/react@19.2.18)(react@19.2.8) - react-style-singleton: 2.2.3(@types/react@19.2.18)(react@19.2.8) + react: 19.3.0 + react-remove-scroll-bar: 2.3.8(@types/react@19.3.0)(react@19.3.0) + react-style-singleton: 2.2.3(@types/react@19.3.0)(react@19.3.0) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.2.18)(react@19.2.8) - use-sidecar: 1.1.3(@types/react@19.2.18)(react@19.2.8) + use-callback-ref: 1.3.3(@types/react@19.3.0)(react@19.3.0) + use-sidecar: 1.1.3(@types/react@19.3.0)(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 + '@types/react': 19.3.0 - react-resizable-panels@4.12.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + react-resizable-panels@4.12.2(react-dom@19.3.0(react@19.3.0))(react@19.3.0): dependencies: - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) - react-resizable@3.2.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + react-resizable@3.2.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0): dependencies: prop-types: 15.8.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - react-draggable: 4.7.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) + react-draggable: 4.7.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - react-router-dom@7.18.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + react-router-dom@7.18.2(react-dom@19.3.0(react@19.3.0))(react@19.3.0): dependencies: - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - react-router: 7.18.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) + react-router: 7.18.2(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - react-router@7.18.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + react-router@7.18.2(react-dom@19.3.0(react@19.3.0))(react@19.3.0): dependencies: cookie: 1.1.1 - react: 19.2.8 + react: 19.3.0 set-cookie-parser: 2.7.2 optionalDependencies: - react-dom: 19.2.8(react@19.2.8) + react-dom: 19.3.0(react@19.3.0) - react-style-singleton@2.2.3(@types/react@19.2.18)(react@19.2.8): + react-style-singleton@2.2.3(@types/react@19.3.0)(react@19.3.0): dependencies: get-nonce: 1.0.1 - react: 19.2.8 + react: 19.3.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.18 + '@types/react': 19.3.0 - react@19.2.8: {} + react@19.3.0: {} read-pkg@9.0.1: dependencies: @@ -18241,21 +18241,21 @@ snapshots: tiny-invariant: 1.3.3 tslib: 2.8.1 - recharts@3.10.1(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react-is@19.2.6)(react@19.2.8)(redux@5.0.1): + recharts@3.10.1(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react-is@19.2.6)(react@19.3.0)(redux@5.0.1): dependencies: - '@reduxjs/toolkit': 2.12.0(react-redux@9.3.0(@types/react@19.2.18)(react@19.2.8)(redux@5.0.1))(react@19.2.8) + '@reduxjs/toolkit': 2.12.0(react-redux@9.3.0(@types/react@19.3.0)(react@19.3.0)(redux@5.0.1))(react@19.3.0) clsx: 2.1.1 decimal.js-light: 2.5.1 es-toolkit: 1.52.0 eventemitter3: 5.0.4 immer: 11.1.15 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) react-is: 19.2.6 - react-redux: 9.3.0(@types/react@19.2.18)(react@19.2.8)(redux@5.0.1) + react-redux: 9.3.0(@types/react@19.3.0)(react@19.3.0)(redux@5.0.1) reselect: 5.2.0 tiny-invariant: 1.3.3 - use-sync-external-store: 1.7.0(react@19.2.8) + use-sync-external-store: 1.7.0(react@19.3.0) victory-vendor: 37.3.6 transitivePeerDependencies: - '@types/react' @@ -18565,7 +18565,7 @@ snapshots: dependencies: xmlchars: 2.2.0 - scheduler@0.27.0: {} + scheduler@0.28.0: {} scroll-into-view-if-needed@3.1.0: dependencies: @@ -18832,12 +18832,12 @@ snapshots: ip-address: 10.5.0 smart-buffer: 4.2.0 - sonner@2.0.8(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + sonner@2.0.8(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0): dependencies: - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@types/react': 19.2.18 + '@types/react': 19.3.0 sort-asc@0.2.0: {} @@ -18898,15 +18898,15 @@ snapshots: stdin-discarder@0.2.2: {} - streamdown@2.5.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + streamdown@2.5.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0): dependencies: clsx: 2.1.1 hast-util-to-jsx-runtime: 2.3.6 html-url-attributes: 3.0.1 marked: 17.0.6 mermaid: 11.17.2 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) rehype-harden: 1.1.8 rehype-raw: 7.0.0 rehype-sanitize: 6.0.0 @@ -19000,10 +19000,10 @@ snapshots: dependencies: inline-style-parser: 0.2.7 - styled-jsx@5.1.6(@babel/core@7.29.7)(react@19.2.8): + styled-jsx@5.1.6(@babel/core@7.29.7)(react@19.3.0): dependencies: client-only: 0.0.1 - react: 19.2.8 + react: 19.3.0 optionalDependencies: '@babel/core': 7.29.7 @@ -19038,11 +19038,11 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: optional: true - swr@2.5.1(react@19.2.8): + swr@2.5.1(react@19.3.0): dependencies: dequal: 2.0.3 - react: 19.2.8 - use-sync-external-store: 1.7.0(react@19.2.8) + react: 19.3.0 + use-sync-external-store: 1.7.0(react@19.3.0) symbol-tree@3.2.4: {} @@ -19422,28 +19422,28 @@ snapshots: url-join@4.0.1: {} - use-callback-ref@1.3.3(@types/react@19.2.18)(react@19.2.8): + use-callback-ref@1.3.3(@types/react@19.3.0)(react@19.3.0): dependencies: - react: 19.2.8 + react: 19.3.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.18 + '@types/react': 19.3.0 - use-sidecar@1.1.3(@types/react@19.2.18)(react@19.2.8): + use-sidecar@1.1.3(@types/react@19.3.0)(react@19.3.0): dependencies: detect-node-es: 1.1.0 - react: 19.2.8 + react: 19.3.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.18 + '@types/react': 19.3.0 - use-stick-to-bottom@1.1.6(react@19.2.8): + use-stick-to-bottom@1.1.6(react@19.3.0): dependencies: - react: 19.2.8 + react: 19.3.0 - use-sync-external-store@1.7.0(react@19.2.8): + use-sync-external-store@1.7.0(react@19.3.0): dependencies: - react: 19.2.8 + react: 19.3.0 util-deprecate@1.0.2: {} @@ -19460,11 +19460,11 @@ snapshots: vary@1.1.2: {} - vaul@1.1.2(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + vaul@1.1.2(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0): dependencies: - '@radix-ui/react-dialog': 1.1.23(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-dialog': 1.1.23(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) transitivePeerDependencies: - '@types/react' - '@types/react-dom' diff --git a/scripts/__tests__/check-lint-rule-coverage.test.ts b/scripts/__tests__/check-lint-rule-coverage.test.ts index 16ee7c1a93..21fe3a5e34 100644 --- a/scripts/__tests__/check-lint-rule-coverage.test.ts +++ b/scripts/__tests__/check-lint-rule-coverage.test.ts @@ -586,10 +586,13 @@ describe('this repository', () => { expect(row.vacuousMatches.length, `ledger row '${row.glob}' declares nothing any more`).toBeGreaterThan(0); expect(row.ruleBearingMatches, `ledger row '${row.glob}' over-claims`).toEqual([]); } - // Predicate 2, same two properties. Its population is one file today, and a - // green here means that file is DECLARED rather than invisible. + // Predicate 2, same two properties. Its population is two files today -- + // the vitest config objectui#8337 was filed about, and the declaration twin + // `scripts/ui-root.d.mts` that package tests (compiled with `allowJs: false`) + // need to import `scripts/ui-root.mjs` typed (objectstack#25685, objectui#13472) + // -- and a green here means both are DECLARED rather than invisible. expect(extensionProbeCollapse(result.reach)).toBeNull(); - expect(result.unreached).toEqual(['vitest.config.mts']); + expect(result.unreached).toEqual(['scripts/ui-root.d.mts', 'vitest.config.mts']); // objectui#8369: this run is only a reading of the tree git tracks if the // filter was there and could answer both ways. expect(result.git.available).toBe(true); diff --git a/scripts/__tests__/check-spec-range-floors.test.ts b/scripts/__tests__/check-spec-range-floors.test.ts index e04956fa5e..6fe6aaaf8e 100644 --- a/scripts/__tests__/check-spec-range-floors.test.ts +++ b/scripts/__tests__/check-spec-range-floors.test.ts @@ -22,6 +22,7 @@ import { specSubpathOf, specSubpathsFromLiterals, specSymbols, + workspaceSpecVersion, } from '../check-spec-range-floors.mjs'; // Plain-JS CI helper; its types are INFERRED from the .mjs source by @@ -157,6 +158,49 @@ describe('the declared floor', () => { } }); + it('reads a workspace: range as the workspace spec\'s own version, and only when told it (objectstack ruling D1)', () => { + // Inside the objectstack monorepo the ranges are `workspace:^`, which publishes as + // `^`: that version is the floor. Without the version the + // spelling stays UNREADABLE (the loop above keeps `workspace:*` in its list), + // because a workspace range read without its workspace has no floor at all. + for (const range of ['workspace:*', 'workspace:^', 'workspace:~', 'workspace:']) { + expect(minVersionOf(range, { workspaceVersion: '18.1.0' }), range).toBe('18.1.0'); + expect(() => minVersionOf(range), range).toThrow(/workspace package's own version/); + expect(() => minVersionOf(range, { workspaceVersion: 'latest' }), range).toThrow(/is not one/); + } + // A range tail is that range, with or without the workspace version. + expect(minVersionOf('workspace:^18.0.0-next.1')).toBe('18.0.0-next.1'); + expect(minVersionOf('workspace:~17.2.0', { workspaceVersion: '18.1.0' })).toBe('17.2.0'); + // Every non-workspace spelling reads exactly as before, version told or not. + expect(minVersionOf('^17.0.0', { workspaceVersion: '18.1.0' })).toBe('17.0.0'); + expect(() => minVersionOf('latest', { workspaceVersion: '18.1.0' })).toThrow(); + // Through the declared floor: the workspace version takes part in "highest wins". + const floor = effectiveFloor( + { dependencies: { [SPEC_PACKAGE]: 'workspace:^' }, peerDependencies: { [SPEC_PACKAGE]: '^17.1.0' } }, + undefined, + { workspaceVersion: '18.1.0' }, + ); + expect(floor?.version).toBe('18.1.0'); + expect(() => effectiveFloor({ dependencies: { [SPEC_PACKAGE]: 'workspace:^' } })).toThrow(/dependencies/); + }); + + it('finds the workspace spec\'s version in the nearest node_modules above the root, and null when none is installed', () => { + const tree = fs.mkdtempSync(path.join(os.tmpdir(), 'spec-range-floors-ws-')); + try { + expect(workspaceSpecVersion(tree)).toBeNull(); + fs.mkdirSync(path.join(tree, 'node_modules', SPEC_PACKAGE), { recursive: true }); + fs.writeFileSync(path.join(tree, 'node_modules', SPEC_PACKAGE, 'package.json'), JSON.stringify({ name: SPEC_PACKAGE, version: '18.1.0' })); + expect(workspaceSpecVersion(tree)).toBe('18.1.0'); + // A nested tree (`ui/`) with no install of its own reads the one above it. + fs.mkdirSync(path.join(tree, 'ui/packages'), { recursive: true }); + expect(workspaceSpecVersion(path.join(tree, 'ui'))).toBe('18.1.0'); + // This checkout resolves the installed spec, which is what a run reads by default. + expect(workspaceSpecVersion(repoRoot)).toMatch(/^\d+\.\d+\.\d+/); + } finally { + fs.rmSync(tree, { recursive: true, force: true }); + } + }); + it('is the HIGHEST minimum when several consumer-facing fields declare it', () => { const floor = effectiveFloor({ dependencies: { [SPEC_PACKAGE]: '^17.0.0' }, diff --git a/scripts/__tests__/check-ui-root-lookups.test.ts b/scripts/__tests__/check-ui-root-lookups.test.ts new file mode 100644 index 0000000000..cca7ed1207 --- /dev/null +++ b/scripts/__tests__/check-ui-root-lookups.test.ts @@ -0,0 +1,72 @@ +/** + * `scripts/check-ui-root-lookups.mjs` -- no marker-based repo-root lookup + * outside `scripts/ui-root.mjs` (objectstack ruling D1: under `ui/` such a + * lookup finds the objectstack root). The detector's own cases live in its + * `--self-test`; this file pins that they hold, that the live tree is clean, + * that the allowlist is a ledger (stale entries red), and that the gate is + * reachable as a root script. + */ +import { describe, expect, it } from 'vitest'; +import { spawnSync } from 'node:child_process'; +import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs'; +import os from 'node:os'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +import { ALLOWLIST, HELPER, SELF, lookupsIn, scan, selfTest } from '../check-ui-root-lookups.mjs'; + +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../..'); + +describe('check-ui-root-lookups (objectstack ruling D1)', () => { + it('passes its own self-test, and the self-test is not empty in either direction', () => { + const cases = selfTest(); + expect(cases.filter((c) => !c.ok).map((c) => `${c.name}: ${c.detail}`)).toEqual([]); + expect(cases.length).toBeGreaterThanOrEqual(10); + }); + + it('reads the call target, not the spelling', () => { + const fires = lookupsIn('x.ts', "import { existsSync } from 'node:fs';\nlet d = __dirname;\nwhile (!existsSync(`${d}/pnpm-workspace.yaml`)) d = d.slice(0, -1);"); + expect(fires.map((h) => h.shape)).toEqual(['marker-probe']); + const silent = lookupsIn('x.ts', "import { readFileSync } from 'node:fs';\nconst globs = readFileSync(`${root}/pnpm-workspace.yaml`, 'utf8');"); + expect(silent).toEqual([]); + }); + + it('finds no lookup outside the helper in this tree, and every allowlist entry is live', () => { + const result = scan(repoRoot); + expect(result.scanned).toBeGreaterThan(100); + expect(result.hits.filter((h) => h.allowed === null).map((h) => `${h.file}:${h.line} ${h.text}`)).toEqual([]); + expect(result.stale).toEqual([]); + // The two files the scan skips exist and are the only ones it skips. + expect([HELPER, SELF]).toEqual(['scripts/ui-root.mjs', 'scripts/check-ui-root-lookups.mjs']); + }); + + it('reds on a planted lookup and on a stale allowlist entry, from a fixture tree', () => { + const root = mkdtempSync(path.join(os.tmpdir(), 'ui-root-lookups-')); + try { + mkdirSync(path.join(root, 'scripts'), { recursive: true }); + writeFileSync(path.join(root, 'scripts/ok.mjs'), "import { uiRoot } from './ui-root.mjs';\nexport const x = uiRoot();\n"); + const clean = scan(root); + expect(clean.scanned).toBe(1); + expect(clean.hits).toEqual([]); + // Every allowlist path is absent from this tree, so every entry reads stale here. + expect(clean.stale.sort()).toEqual([...ALLOWLIST.keys()].sort()); + + writeFileSync( + path.join(root, 'scripts/walk.mjs'), + "import { existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nlet dir = process.cwd();\nwhile (!existsSync(join(dir, '.git'))) dir = dirname(dir);\n", + ); + const planted = scan(root); + expect(planted.hits.map((h) => [h.file, h.shape, h.allowed])).toEqual([['scripts/walk.mjs', 'marker-probe', null]]); + } finally { + rmSync(root, { recursive: true, force: true }); + } + }); + + it('exits 0 on this tree through the CLI and is wired as `check:ui-root-lookups`', () => { + const scripts = (JSON.parse(readFileSync(path.join(repoRoot, 'package.json'), 'utf8')) as { scripts: Record }).scripts; + expect(scripts['check:ui-root-lookups']).toBe('node scripts/check-ui-root-lookups.mjs'); + const run = spawnSync(process.execPath, [path.join(repoRoot, SELF)], { cwd: repoRoot, encoding: 'utf8' }); + expect(run.stdout).toContain('check-ui-root-lookups: OK'); + expect(run.status).toBe(0); + }); +}); diff --git a/scripts/__tests__/helpers/build-program.ts b/scripts/__tests__/helpers/build-program.ts index dbda2f5bff..f0cef8a2b3 100644 --- a/scripts/__tests__/helpers/build-program.ts +++ b/scripts/__tests__/helpers/build-program.ts @@ -229,9 +229,27 @@ interface Accumulator { } /** Classify one `&&` segment of a build script and record what it reads. */ +/** + * `NAME=value` words at the head of a command are the shell's environment + * assignments for the program that follows, not the program: + * `NODE_OPTIONS=--max-old-space-size=4096 tsc` is a tsc run under a larger V8 + * heap (the spelling `packages/spec` in objectstack uses), so the classification + * below starts at the first word that is not an assignment. A value may itself + * contain `=`; only the first `=` splits the name, and a name is a shell + * identifier (objectstack#25685 item 4). + */ +export function stripEnvAssignments(tokens: readonly string[]): string[] { + let i = 0; + while (i < tokens.length && /^[A-Za-z_][A-Za-z0-9_]*=/.test(tokens[i])) i += 1; + return tokens.slice(i); +} + function collectSegment(pkg: WorkspacePackage, command: string, acc: Accumulator): void { - const tokens = tokenize(command); + const tokens = stripEnvAssignments(tokenize(command)); const tool = tokens[0]; + if (tool === undefined) { + throw new Error(`${rel(pkg.dir)}: \`${command}\` sets environment variables and runs nothing.`); + } if (tool === 'tsc') { acc.tscInvocations.push(invocationForCommand(pkg.dir, command)); diff --git a/scripts/__tests__/objectstack-floor.test.ts b/scripts/__tests__/objectstack-floor.test.ts index f6912d057d..afb56c1950 100644 --- a/scripts/__tests__/objectstack-floor.test.ts +++ b/scripts/__tests__/objectstack-floor.test.ts @@ -10,7 +10,7 @@ import os from 'node:os'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; -import { compareVersions, computeFloor, main, releaseTags } from '../objectstack-floor.mjs'; +import { compareVersions, computeFloor, floorOfRange, installedVersion, main, planRanges, releaseTags } from '../objectstack-floor.mjs'; const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../..'); const scratch = fs.mkdtempSync(path.join(os.tmpdir(), 'objectstack-floor-test-')); @@ -108,6 +108,48 @@ describe('the step, end to end', () => { expect(dry.read()).toEqual(pristine); }); + it('reads a workspace: range as the workspace package\'s own version (objectstack ruling D1)', () => { + // Inside the objectstack monorepo the ranges are `workspace:^`, which publishes as + // `^`; the floor is that version, resolved per name. + const own = (name: string) => (name === '@objectstack/spec' ? '1.0.0-next.1' : null); + expect(floorOfRange('workspace:^', '@objectstack/spec', own)).toBe('1.0.0-next.1'); + expect(floorOfRange('workspace:*', '@objectstack/spec', own)).toBe('1.0.0-next.1'); + expect(floorOfRange('workspace:~', '@objectstack/spec', own)).toBe('1.0.0-next.1'); + expect(floorOfRange('workspace:^1.0.0-next.0', '@objectstack/spec', own)).toBe('1.0.0-next.0'); + // A workspace package this tree does not resolve, or a resolver that answers nothing, is UNREADABLE, never 0.0.0. + expect(floorOfRange('workspace:^', '@objectstack/lint', own)).toBeNull(); + expect(floorOfRange('workspace:^', '@objectstack/spec', () => 'latest')).toBeNull(); + // Every semver spelling reads as before. + expect(floorOfRange('^1.0.0-next.0', '@objectstack/spec', own)).toBe('1.0.0-next.0'); + expect(floorOfRange('latest', '@objectstack/spec', own)).toBeNull(); + + const pkg = { name: '@x/a', dir: 'packages/a', manifest: { dependencies: { '@objectstack/spec': 'workspace:^', '@objectstack/lint': '^1.0.0-next.2' } } }; + const kept = planRanges([pkg], '1.0.0-next.1', { workspaceVersionOf: own }); + expect(kept.map((r) => [r.name, r.action, r.to])).toEqual([['@objectstack/spec', 'kept', 'workspace:^'], ['@objectstack/lint', 'kept', '^1.0.0-next.2']]); + const below = planRanges([pkg], '1.0.0-next.2', { workspaceVersionOf: own }); + expect(below.map((r) => [r.name, r.action, r.to])).toEqual([['@objectstack/spec', 'moved', '^1.0.0-next.2'], ['@objectstack/lint', 'kept', '^1.0.0-next.2']]); + // The default resolver knows no workspace: the range is unreadable, as before this change. + expect(planRanges([pkg], '1.0.0-next.1').map((r) => r.action)).toEqual(['unreadable', 'kept']); + }); + + it('resolves a workspace package\'s version from the nearest node_modules, end to end', () => { + const { root, read } = fixture(sha.c3, 'workspace:^'); + // Nothing installed: the range cannot be read, nothing is written. + const before = read(); + expect(run(root).code).toBe(1); + expect(read()).toEqual(before); + expect(installedVersion(root, '@objectstack/spec')).toBeNull(); + // The workspace spec at the floor: kept. + fs.mkdirSync(path.join(root, 'node_modules/@objectstack/spec'), { recursive: true }); + fs.writeFileSync(path.join(root, 'node_modules/@objectstack/spec/package.json'), JSON.stringify({ name: '@objectstack/spec', version: '1.0.0-next.1' })); + expect(installedVersion(root, '@objectstack/spec')).toBe('1.0.0-next.1'); + expect(installedVersion(path.join(root, 'packages/a'), '@objectstack/spec')).toBe('1.0.0-next.1'); + const { code, out } = run(root); + expect(code).toBe(0); + expect(out).toContain('kept'); + expect(JSON.parse(read()[0]).dependencies['@objectstack/spec']).toBe('workspace:^'); + }); + it('runs first in `pnpm changeset:publish`, and between the build and the scan nightly', () => { const publish = JSON.parse(fs.readFileSync(path.join(repoRoot, 'package.json'), 'utf8')).scripts['changeset:publish']; expect(publish).toMatch(/^node scripts\/objectstack-floor\.mjs && .*check-spec-range-floors\.mjs && changeset publish$/); diff --git a/scripts/__tests__/ui-root.test.ts b/scripts/__tests__/ui-root.test.ts new file mode 100644 index 0000000000..1804fc4b3b --- /dev/null +++ b/scripts/__tests__/ui-root.test.ts @@ -0,0 +1,52 @@ +/** + * `scripts/ui-root.mjs` -- the objectui tree root, resolved from the helper's + * own location so the same answer holds standalone and under the objectstack + * monorepo's `ui/` (objectstack ruling D1). Its declaration twin + * `ui-root.d.mts` is pinned to the module's real export surface, since a + * hand-written declaration is the one thing here free to drift. + */ +import { describe, expect, it } from 'vitest'; +import { existsSync, readFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +import { stripComments } from '../js-comment-mask.mjs'; +import { UI_ROOT, uiRoot } from '../ui-root.mjs'; + +const here = path.dirname(fileURLToPath(import.meta.url)); + +describe('uiRoot() (objectstack ruling D1: the objectui tree as `ui/`)', () => { + it('is the directory two levels above this test file, absolute, with no trailing separator', () => { + expect(uiRoot()).toBe(path.resolve(here, '../..')); + expect(path.isAbsolute(uiRoot())).toBe(true); + expect(uiRoot().endsWith(path.sep)).toBe(false); + expect(UI_ROOT).toBe(uiRoot()); + }); + + it('names the tree that holds this repository\'s own layout, not a marker it searched for', () => { + // The helper reads nothing: the directory it names must simply BE the + // objectui tree, which these three entries identify in both layouts. + for (const entry of ['scripts/ui-root.mjs', 'packages/types/package.json', 'apps/console/package.json']) { + expect(existsSync(path.join(uiRoot(), entry)), entry).toBe(true); + } + const manifest = JSON.parse(readFileSync(path.join(uiRoot(), 'package.json'), 'utf8')) as { name?: string }; + expect(manifest.name).toBe('object-ui-monorepo'); + }); + + it('consults no marker, no git and no cwd -- the source is one path.resolve from import.meta.url', () => { + const source = readFileSync(path.join(here, '..', 'ui-root.mjs'), 'utf8'); + const code = stripComments(source); + expect(code).toContain("path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..')"); + for (const forbidden of ['process.cwd', 'existsSync', 'rev-parse', 'pnpm-workspace.yaml', 'find-up']) { + expect(code, `the helper must not spell ${forbidden}`).not.toContain(forbidden); + } + }); + + it('declares in ui-root.d.mts exactly the names ui-root.mjs exports', async () => { + const declared = readFileSync(path.join(here, '..', 'ui-root.d.mts'), 'utf8'); + const declaredNames = [...declared.matchAll(/^export declare (?:const|function) (\w+)/gm)].map((m) => m[1]).sort(); + const exported = Object.keys(await import('../ui-root.mjs')).sort(); + expect(declaredNames).toEqual(exported); + expect(exported).toEqual(['UI_ROOT', 'uiRoot']); + }); +}); diff --git a/scripts/__tests__/vite-objectstack-workspace.test.ts b/scripts/__tests__/vite-objectstack-workspace.test.ts new file mode 100644 index 0000000000..5b49e025ac --- /dev/null +++ b/scripts/__tests__/vite-objectstack-workspace.test.ts @@ -0,0 +1,145 @@ +/** + * `scripts/vite-objectstack-workspace.ts` -- the console's `@objectstack/*` + * module-id tests, with the objectstack monorepo's `packages/` directory as + * one more alternative (objectstack ruling D1: objectui becomes `ui/`). + * + * Two directions are pinned. STANDALONE, the directory the alternative names + * does not exist beside this checkout and the three tests ARE the baseline + * literals, byte for byte -- `vite-objectstack-spec-dist.test.ts` pins the + * vendor literal as a flagged surface (objectui#4854), so "matches nothing" + * is not enough; the alternative must not be there at all. + * MERGED, an id under `/packages//dist/` is the vendor group + * (spec in, lint out) and the two probes find their subjects; measured on the + * spike, the baseline missed all three and the console build failed on its own + * lazy-linter guard. + */ +import { describe, expect, it } from 'vitest'; +import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs'; +import os from 'node:os'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +import { + BASELINE_CHUNK_TESTS, + candidateFrameworkPackagesDir, + escapeRegExp, + frameworkPackagesDir, + workspaceChunkTests, +} from '../vite-objectstack-workspace.ts'; + +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../..'); +const consoleDir = path.join(repoRoot, 'apps/console'); + +/** A monorepo laid out as the spike wired it: `/ui/apps/console`, `/packages/`. */ +const MONOREPO = '/srv/objectstack'; +const merged = workspaceChunkTests(candidateFrameworkPackagesDir(path.join(MONOREPO, 'ui/apps/console'))); +const standalone = workspaceChunkTests(frameworkPackagesDir(consoleDir)); + +const PLAIN_SPEC = '/w/node_modules/@objectstack/spec/dist/index.mjs'; +const STORE_SPEC = '/w/node_modules/.pnpm/@objectstack+spec@18.1.0/node_modules/@objectstack/spec/dist/index.mjs'; +const PLAIN_LINT = '/w/node_modules/@objectstack/lint/dist/index.js'; +const STORE_LINT = '/w/node_modules/.pnpm/@objectstack+lint@18.1.0/node_modules/@objectstack/lint/dist/index.js'; +const PLAIN_CLIENT = '/w/node_modules/@objectstack/client/dist/index.js'; + +describe('workspaceChunkTests (objectstack ruling D1)', () => { + it('locates the monorepo packages dir three levels above the console, and names it only when it exists', () => { + expect(candidateFrameworkPackagesDir(path.join(MONOREPO, 'ui/apps/console'))).toBe(path.join(MONOREPO, 'packages')); + expect(candidateFrameworkPackagesDir(consoleDir)).toBe(path.resolve(repoRoot, '../packages')); + // The standing fact the standalone pin rests on, checked rather than assumed. + expect(existsSync(candidateFrameworkPackagesDir(consoleDir))).toBe(false); + expect(frameworkPackagesDir(consoleDir)).toBeNull(); + expect(frameworkPackagesDir(path.join(MONOREPO, 'ui/apps/console'))).toBeNull(); + // A real monorepo-shaped tree: the directory exists, so it is named. + const root = mkdtempSync(path.join(os.tmpdir(), 'objectstack-workspace-')); + try { + const console = path.join(root, 'ui/apps/console'); + mkdirSync(console, { recursive: true }); + expect(frameworkPackagesDir(console)).toBeNull(); + mkdirSync(path.join(root, 'packages')); + expect(frameworkPackagesDir(console)).toBe(path.join(root, 'packages')); + // A FILE of that name is not the directory. + rmSync(path.join(root, 'packages'), { recursive: true }); + writeFileSync(path.join(root, 'packages'), ''); + expect(frameworkPackagesDir(console)).toBeNull(); + } finally { + rmSync(root, { recursive: true, force: true }); + } + }); + + it('standalone: the three tests are the baseline literals, byte for byte', () => { + expect(standalone).toBe(BASELINE_CHUNK_TESTS); + expect(standalone.vendor.source).toBe( + '([\\\\/]node_modules[\\\\/]@objectstack[\\\\/](?!lint[\\\\/])|[\\\\/]@objectstack\\+(?!lint@))', + ); + expect(standalone.spec.source).toBe('@objectstack[\\\\/+]spec'); + expect(standalone.lint.source).toBe('@objectstack[\\\\/+]lint'); + // And merged is a widening of them: every baseline arm is still there. + for (const key of ['vendor', 'spec', 'lint'] as const) { + expect(merged[key].source).toContain(BASELINE_CHUNK_TESTS[key].source.replace(/^\(|\)$/g, '')); + } + }); + + it('keeps every baseline spelling: plain install and pnpm store, spec in, lint out', () => { + for (const tests of [standalone, merged]) { + expect(tests.vendor.test(PLAIN_SPEC)).toBe(true); + expect(tests.vendor.test(STORE_SPEC)).toBe(true); + expect(tests.vendor.test(PLAIN_CLIENT)).toBe(true); + expect(tests.vendor.test(PLAIN_LINT)).toBe(false); + expect(tests.vendor.test(STORE_LINT)).toBe(false); + expect(tests.spec.test(PLAIN_SPEC)).toBe(true); + expect(tests.spec.test(STORE_SPEC)).toBe(true); + expect(tests.spec.test(PLAIN_LINT)).toBe(false); + expect(tests.lint.test(PLAIN_LINT)).toBe(true); + expect(tests.lint.test(STORE_LINT)).toBe(true); + expect(tests.lint.test(PLAIN_SPEC)).toBe(false); + // A `lint-*` sibling is not the linter and still groups. + expect(tests.vendor.test('/w/node_modules/@objectstack/lint-extra/dist/index.js')).toBe(true); + } + }); + + it('merged: an id under the monorepo packages dir is the vendor group, with the linter excluded and both probes live', () => { + const spec = `${MONOREPO}/packages/spec/dist/index.mjs`; + const client = `${MONOREPO}/packages/client/dist/index.js`; + const lint = `${MONOREPO}/packages/lint/dist/index.js`; + expect(merged.vendor.test(spec)).toBe(true); + expect(merged.vendor.test(client)).toBe(true); + expect(merged.vendor.test(lint)).toBe(false); + expect(merged.vendor.test(`${MONOREPO}/packages/lint-extra/dist/index.js`)).toBe(true); + expect(merged.spec.test(spec)).toBe(true); + expect(merged.spec.test(client)).toBe(false); + expect(merged.lint.test(lint)).toBe(true); + expect(merged.lint.test(spec)).toBe(false); + // The prefix is anchored: a path that merely CONTAINS the packages dir is not it, + // and objectui's own `ui/packages/` is not the framework. + expect(merged.vendor.test(`/elsewhere${MONOREPO}/packages/spec/dist/index.mjs`)).toBe(false); + expect(merged.vendor.test(`${MONOREPO}/ui/packages/core/dist/index.js`)).toBe(false); + expect(merged.vendor.test(`${MONOREPO}/packages-extra/spec/dist/index.mjs`)).toBe(false); + }); + + it('standalone: a workspace-shaped id under the sibling dir matches nothing, and the spike id is unmatched', () => { + // The merge-tree id, judged by the STANDALONE tests: no alternative claims it, + // which is the baseline's reading too (the id carries no node_modules spelling). + const spikeId = `${MONOREPO}/packages/spec/dist/index.mjs`; + expect(standalone.vendor.test(spikeId)).toBe(false); + expect(standalone.spec.test(spikeId)).toBe(false); + expect(standalone.lint.test(`${MONOREPO}/packages/lint/dist/index.js`)).toBe(false); + // objectui's own packages, which the standalone alternative must never claim. + expect(standalone.vendor.test(path.join(repoRoot, 'packages/core/dist/index.js'))).toBe(false); + }); + + it('escapes a directory with regex metacharacters so the prefix is matched literally', () => { + expect(escapeRegExp('/a.b/c+d (e)')).toBe('/a\\.b/c\\+d \\(e\\)'); + const odd = workspaceChunkTests('/w/pkgs (v1.0)/packages'); + expect(odd.spec.test('/w/pkgs (v1.0)/packages/spec/dist/index.mjs')).toBe(true); + expect(odd.spec.test('/w/pkgsX(v1A0)/packages/spec/dist/index.mjs')).toBe(false); + }); + + it('is what the console config builds its three tests from', () => { + const config = readFileSync(path.join(consoleDir, 'vite.config.ts'), 'utf8'); + expect(config).toContain("from '../../scripts/vite-objectstack-workspace.ts'"); + expect(config).toContain('const WORKSPACE_CHUNK_TESTS = workspaceChunkTests(frameworkPackagesDir(import.meta.dirname));'); + expect(config).toContain('const VENDOR_OBJECTSTACK_TEST = WORKSPACE_CHUNK_TESTS.vendor;'); + expect(config).toContain('const SPEC_MODULE_TEST = WORKSPACE_CHUNK_TESTS.spec;'); + expect(config).toContain('const LINT = WORKSPACE_CHUNK_TESTS.lint;'); + }); +}); diff --git a/scripts/check-cross-repo-closer-outcome.mjs b/scripts/check-cross-repo-closer-outcome.mjs index 50e844647b..b2f52f3940 100644 --- a/scripts/check-cross-repo-closer-outcome.mjs +++ b/scripts/check-cross-repo-closer-outcome.mjs @@ -131,6 +131,7 @@ import { existsSync, readFileSync } from 'node:fs'; import { join } from 'node:path'; import { isMap, isSeq, parseDocument } from 'yaml'; import { isEntrypoint } from './invoked-as.mjs'; +import { uiRoot } from './ui-root.mjs'; const WORKFLOW = '.github/workflows/cross-repo-issue-closer.yml'; const JOB = 'close-foreign-issues'; @@ -140,7 +141,7 @@ const THIS_REPO = { owner: 'objectstack-ai', repo: 'objectui' }; const AsyncFunction = Object.getPrototypeOf(async function () {}).constructor; function repoRoot() { - return execFileSync('git', ['rev-parse', '--show-toplevel'], { encoding: 'utf8' }).trim(); + return uiRoot(); } // ── Extraction ────────────────────────────────────────────────────────────── diff --git a/scripts/check-lint-rule-coverage.mjs b/scripts/check-lint-rule-coverage.mjs index 845d82e758..6d4b7abb0a 100644 --- a/scripts/check-lint-rule-coverage.mjs +++ b/scripts/check-lint-rule-coverage.mjs @@ -608,6 +608,17 @@ export const UNREACHED_GROUPS = [ 'STRENGTH decision that objectui#8337 triage deliberately kept out of the gate that reports it.', card: 'objectui#8337', }, + { + glob: 'scripts/ui-root.d.mts', + reason: + 'The hand-written declaration twin of `scripts/ui-root.mjs`, the one helper that package tests ' + + '(compiled with `allowJs: false`) import from `scripts/`: without it every such import is TS7016. ' + + 'It holds two `export declare` lines and no executable code, and `scripts/__tests__/ui-root.test.ts` ' + + 'pins its names to the module\'s real exports. Declared rather than repaired for the same reason as ' + + 'the row above: reaching a `.d.mts` means widening a rule-bearing `files` glob to `.mts`, a rule ' + + 'STRENGTH decision this gate reports and does not take (objectstack ruling D1: objectui as `ui/`).', + card: 'objectui#13472', + }, ]; /** diff --git a/scripts/check-new-cross-file-line-citations.mjs b/scripts/check-new-cross-file-line-citations.mjs index ee0a0fbdb7..0f6218e3c7 100644 --- a/scripts/check-new-cross-file-line-citations.mjs +++ b/scripts/check-new-cross-file-line-citations.mjs @@ -136,7 +136,7 @@ import { execFileSync } from 'node:child_process'; import { existsSync, readFileSync } from 'node:fs'; -import { basename, join } from 'node:path'; +import { basename, isAbsolute, join, relative } from 'node:path'; import { FALSE_VERDICTS, @@ -147,6 +147,7 @@ import { scanFile, } from './cross-file-line-citation-census.mjs'; import { isEntrypoint } from './invoked-as.mjs'; +import { uiRoot } from './ui-root.mjs'; /** * `report-only` | `blocking`. THE flip, and the only one. @@ -410,11 +411,17 @@ export function resolveBase(root, argv, env) { * useful before a commit exists, and a reading that ignored uncommitted edits * would tell an author their new citation is fine right up until CI disagrees. * Untracked files are collected separately for the same reason. + * + * `--relative`: paths come back relative to `root` (the objectui tree, from + * `scripts/ui-root.mjs`), not to the git toplevel. Standalone the two are the + * same directory and the flag changes nothing; inside the objectstack monorepo + * (objectui as `ui/`) it confines the reading to this tree and keeps every + * path joinable with `root`, which is also why `blobAt` spells `rev:./path`. */ export function changedPaths(root, mergeBase) { const status = execFileSync( 'git', - ['diff', '--name-status', '-M', '--diff-filter=ACMRT', mergeBase, '--'], + ['diff', '--name-status', '-M', '--relative', '--diff-filter=ACMRT', mergeBase, '--'], { cwd: root, encoding: 'utf8', maxBuffer: 64 * 1024 * 1024 }, ); const map = new Map(); @@ -437,11 +444,11 @@ export function changedPaths(root, mergeBase) { return map; } -/** The blob at `rev:path`, or `null` when the path did not exist there. */ +/** The blob at `rev:./path` (`path` relative to `root`, the cwd), or `null` when the path did not exist there. */ function blobAt(root, rev, path) { if (path === null) return null; try { - return execFileSync('git', ['show', `${rev}:${path}`], { + return execFileSync('git', ['show', `${rev}:./${path}`], { cwd: root, encoding: 'utf8', maxBuffer: 64 * 1024 * 1024, @@ -460,8 +467,26 @@ function scannable(relPath) { return true; } +/** + * The tree this gate reads. Its subject is the REPOSITORY AT THE CWD -- `git + * rev-parse --show-toplevel`, so a run from any subdirectory works and the + * self-test can drive the gate against a scratch repository -- narrowed to the + * objectui tree (`scripts/ui-root.mjs`) when that tree lies inside it. + * Standalone the two coincide. Under the objectstack monorepo (objectui as + * `ui/`) the toplevel is the objectstack root and the narrowing is what + * `--relative` in `changedPaths` and `rev:./path` in `blobAt` rest on. In a + * scratch repository the objectui tree is OUTSIDE it, so the toplevel is read. + */ +export function gateRoot(cwd = process.cwd()) { + const top = execFileSync('git', ['rev-parse', '--show-toplevel'], { cwd, encoding: 'utf8' }).trim(); + const ui = uiRoot(); + const below = relative(top, ui); + const inside = below === '' || (!below.startsWith('..') && !isAbsolute(below)); + return inside ? ui : top; +} + function main(argv, env = process.env) { - const root = execFileSync('git', ['rev-parse', '--show-toplevel'], { encoding: 'utf8' }).trim(); + const root = gateRoot(); const head = execFileSync('git', ['rev-parse', '--short', 'HEAD'], { cwd: root, encoding: 'utf8', diff --git a/scripts/check-spec-range-floors.mjs b/scripts/check-spec-range-floors.mjs index ce972e9def..ec5af1deb3 100644 --- a/scripts/check-spec-range-floors.mjs +++ b/scripts/check-spec-range-floors.mjs @@ -215,6 +215,16 @@ export const FLOOR_VERSION = new RegExp(`^${FLOOR_SPELLING}$`); /** One lower-bound comparator: an optional operator, then a FLOOR_VERSION. */ const LOWER_BOUND = new RegExp(String.raw`^(\^|~|>=|=)?(${FLOOR_SPELLING})$`); +/** + * pnpm's workspace protocol (objectstack ruling D1: inside the objectstack + * monorepo objectui declares `@objectstack/spec` as `workspace:^`). The tail is + * `*`, `^`, `~`, empty, or a range: the first four say "the workspace package + * at whatever version it has", and publish as `^`, so their floor + * IS the workspace package's own version; a range tail is read as that range. + */ +export const WORKSPACE_PROTOCOL = /^workspace:(.*)$/; +const WORKSPACE_OWN_VERSION = new Set(['', '*', '^', '~']); + /** `[major, minor, patch]`, or `null` when `version` is not a plain release. */ export function parseVersion(version) { const match = RELEASE_VERSION.exec(String(version).trim()); @@ -263,13 +273,35 @@ export function majorOf(version) { * takes the LOWEST branch: a consumer may satisfy the range through any * alternative, so the lowest is what the range admits — and since finding the * lowest is an ordering, a union with a prerelease branch still throws. + * + * A `workspace:` range (WORKSPACE_PROTOCOL above) reads as the workspace + * package's own version, which the caller passes as `workspaceVersion`; with + * none passed it THROWS like any other unreadable spelling, so a tree where the + * workspace package cannot be found never reads as "floor 0.0.0". + * + * @param {string} range + * @param {{ workspaceVersion?: string | null }} [options] */ -export function minVersionOf(range) { +export function minVersionOf(range, { workspaceVersion = null } = {}) { const text = String(range).trim(); if (text.length === 0) throw new Error('an empty range names no floor.'); + const workspace = WORKSPACE_PROTOCOL.exec(text); + if (workspace) { + const tail = workspace[1].trim(); + if (!WORKSPACE_OWN_VERSION.has(tail)) return minVersionOf(tail, { workspaceVersion }); + if (typeof workspaceVersion !== 'string' || !FLOOR_VERSION.test(workspaceVersion)) { + throw new Error( + `range "${text}" names the workspace package's own version as its floor, and this run was not told that ` + + `version${workspaceVersion ? ` ("${workspaceVersion}" is not one)` : ''}. Reported as a failure rather than guessed: ` + + 'a workspace range read without its workspace is a range with no floor at all.', + ); + } + return workspaceVersion; + } + if (text.includes('||')) { - const branches = text.split('||').map((branch) => minVersionOf(branch)); + const branches = text.split('||').map((branch) => minVersionOf(branch, { workspaceVersion })); return branches.reduce((lowest, candidate) => (compareVersions(candidate, lowest) < 0 ? candidate : lowest)); } @@ -300,10 +332,12 @@ export function minVersionOf(range) { * The lowest `@objectstack/spec` a consumer install of this package may land. * * @param {object} manifest + * @param {readonly string[]} [fields] + * @param {{ workspaceVersion?: string | null }} [options] the workspace spec's own version, for a `workspace:` range * @returns {{ version: string, ranges: {field: string, range: string}[] } | null} * `null` when no consumer-facing field declares the spec at all. */ -export function effectiveFloor(manifest, fields = RUNTIME_FIELDS) { +export function effectiveFloor(manifest, fields = RUNTIME_FIELDS, { workspaceVersion = null } = {}) { const ranges = []; for (const field of fields) { const range = manifest?.[field]?.[SPEC_PACKAGE]; @@ -315,7 +349,7 @@ export function effectiveFloor(manifest, fields = RUNTIME_FIELDS) { for (const { field, range } of ranges) { let min; try { - min = minVersionOf(range); + min = minVersionOf(range, { workspaceVersion }); } catch (error) { throw new Error( `${field}["${SPEC_PACKAGE}"] = "${range}": ${error.message} A range whose floor cannot be named ` + @@ -342,6 +376,35 @@ export function effectiveFloor(manifest, fields = RUNTIME_FIELDS) { return { version: floor, ranges }; } +/** + * The version of `@objectstack/spec` the workspace resolves, read from the + * installed package's manifest -- the nearest `node_modules/@objectstack/spec` + * walking up from `root`. Standalone that is the pinned build linked into + * `node_modules`; inside the objectstack monorepo it is the workspace link to + * `packages/spec`. `null` when nothing is installed, which a `workspace:` range + * then turns into an unreadable-range finding rather than a floor. + * + * @param {string} root + * @returns {string | null} + */ +export function workspaceSpecVersion(root) { + let dir = root; + for (;;) { + const manifest = join(dir, 'node_modules', SPEC_PACKAGE, 'package.json'); + if (existsSync(manifest)) { + try { + const version = JSON.parse(readFileSync(manifest, 'utf8')).version; + return typeof version === 'string' ? version : null; + } catch { + return null; + } + } + const parent = join(dir, '..'); + if (parent === dir) return null; + dir = parent; + } +} + // ── what the artifact references ───────────────────────────────────────────── /** @@ -856,10 +919,12 @@ export function publishedVersions(run = () => execFileSync('npm', ['view', SPEC_ * load?: (version: string) => { entryFor: (subpath: string) => any }, * log?: (line: string) => void, * packages?: {name: string, dir: string, manifest: object}[], - * }} [options] + * workspaceVersion?: string | null, + * }} [options] `workspaceVersion` replaces the installed spec's version a `workspace:` range reads as its floor */ -export function analyze(root, { cacheRoot, load, log = () => {}, packages } = {}) { +export function analyze(root, { cacheRoot, load, log = () => {}, packages, workspaceVersion } = {}) { const resolvedCache = cacheRoot ?? join(root, 'node_modules/.cache/spec-range-floors'); + const specVersion = workspaceVersion === undefined ? workspaceSpecVersion(root) : workspaceVersion; const loadSpec = load ?? ((version) => loadPublishedSpec(version, resolvedCache, { log })); const all = packages ?? discoverPublishedPackages(root); @@ -870,7 +935,7 @@ export function analyze(root, { cacheRoot, load, log = () => {}, packages } = {} for (const pkg of all) { let floor; try { - floor = effectiveFloor(pkg.manifest); + floor = effectiveFloor(pkg.manifest, RUNTIME_FIELDS, { workspaceVersion: specVersion }); } catch (error) { findings.push({ reason: 'unreadable-range', pkg: pkg.name, detail: error.message }); continue; diff --git a/scripts/check-test-path-roots.mjs b/scripts/check-test-path-roots.mjs index 5a9922d875..f1dda19f1a 100644 --- a/scripts/check-test-path-roots.mjs +++ b/scripts/check-test-path-roots.mjs @@ -341,10 +341,11 @@ function fsSinkName(node, src, fsBindings) { */ export function rootOf(node, ctx) { const { src, binds } = ctx; + const uiRootNames = ctx.uiRootNames ?? new Set(); const depth = ctx.depth ?? 0; const appended = ctx.appended ?? false; const done = (root) => ({ ...root, appended }); - const recur = (n, extra = {}) => rootOf(n, { src, binds, depth: depth + 1, appended, ...extra }); + const recur = (n, extra = {}) => rootOf(n, { src, binds, uiRootNames, depth: depth + 1, appended, ...extra }); if (!node) return done(UNKNOWN('no path argument')); // 12 hops is far past anything this tree writes; the bound exists so a @@ -360,6 +361,8 @@ export function rootOf(node, ctx) { // `(globalThis as unknown as {…}).process.cwd()` and any alias of them are // one node shape here, which is the point. if (name === 'cwd') return done(AMBIENT(`\`${node.expression.getText(src).replace(/\s+/g, ' ')}()\``)); + // `uiRoot()` from scripts/ui-root.mjs: rooted on that helper's own file. + if (name !== null && uiRootNames.has(name) && ts.isIdentifier(node.expression)) return done(SELF(`\`${name}()\` (scripts/ui-root.mjs, rooted on its own file)`)); if (isModuleResolve(node, src, binds)) return done(MODULE(`${node.expression.getText(src)}(…)`)); if (ABSOLUTE_PRODUCERS.has(name)) return done(ABSOLUTE(`${name}()`)); if (PATH_COMBINERS.has(name)) { @@ -376,7 +379,7 @@ export function rootOf(node, ctx) { if (node.expression.getText(src) === 'URL') { const args = node.arguments ?? []; // `new URL(rel, base)` is rooted at `base` with `rel` appended. - if (args.length >= 2) return rootOf(args[1], { src, binds, depth: depth + 1, appended: true }); + if (args.length >= 2) return rootOf(args[1], { src, binds, uiRootNames, depth: depth + 1, appended: true }); return recur(args[0]); } return done(UNKNOWN(`\`new ${node.expression.getText(src).slice(0, 40)}\``)); @@ -393,6 +396,7 @@ export function rootOf(node, ctx) { if (ts.isIdentifier(node)) { if (node.text === '__dirname' || node.text === '__filename') return done(SELF(`\`${node.text}\``)); + if (uiRootNames.has(node.text)) return done(SELF(`\`${node.text}\` (scripts/ui-root.mjs, rooted on its own file)`)); const bound = binds.get(node.text); if (bound) { const r = recur(bound); @@ -438,6 +442,25 @@ export function rootOf(node, ctx) { return done(UNKNOWN(ts.SyntaxKind[node.kind])); } +/** + * The local names a file imports from `scripts/ui-root.mjs` (objectstack + * ruling D1). `uiRoot()` is resolved from THAT module's own location, so a + * read rooted on it is self-rooted in the sense this gate means -- anchored on + * a file, never on the cwd -- and is classified `self` rather than left blind. + * Matched on the specifier's basename, so the relative prefix a test spells + * from its own depth does not matter. + */ +export function uiRootBindingsOf(src) { + const names = new Set(); + for (const statement of src.statements) { + if (!ts.isImportDeclaration(statement) || !ts.isStringLiteral(statement.moduleSpecifier)) continue; + if (!/(^|\/)ui-root(\.mjs|\.d\.mts|\.mts)?$/.test(statement.moduleSpecifier.text)) continue; + const named = statement.importClause?.namedBindings; + if (named && ts.isNamedImports(named)) for (const el of named.elements) names.add(el.name.text); + } + return names; +} + /** * Every `const`/`let` binding in the file, name → initializer. First * declaration wins, and a later assignment to a `let` is deliberately NOT @@ -472,6 +495,7 @@ export function sitesIn(file, text) { ); const binds = bindingsOf(src); const fsBindings = fsBindingsOf(src); + const uiRootNames = uiRootBindingsOf(src); /** @type {Array<{ file: string, line: number, sink: string, kind: string, appended: boolean, why: string, text: string }>} */ const sites = []; @@ -480,7 +504,7 @@ export function sitesIn(file, text) { const name = fsSinkName(node, src, fsBindings); if (name) { const arg = node.arguments[0]; - const root = rootOf(arg, { src, binds }); + const root = rootOf(arg, { src, binds, uiRootNames }); sites.push({ file, line: src.getLineAndCharacterOfPosition(node.getStart(src)).line + 1, @@ -633,6 +657,16 @@ export function selfTest() { run('a promise-API sink', `${head}import { readFile } from 'node:fs/promises';\nawait readFile(join(process.cwd(), 'a/b.ts'));`, 'fires'); // ── SILENT ─────────────────────────────────────────────────────────────── + run( + 'a read rooted on `uiRoot()` from scripts/ui-root.mjs (objectstack ruling D1)', + `${head}import { uiRoot } from '../../../../scripts/ui-root.mjs';\nreadFileSync(join(uiRoot(), 'packages/x/y.ts'), 'utf8');`, + 'silent', + ); + run( + 'a read rooted on the imported `UI_ROOT` constant', + `${head}import { UI_ROOT } from '../../scripts/ui-root.mjs';\nconst DOC = join(UI_ROOT, 'content/docs/x.mdx');\nreadFileSync(DOC, 'utf8');`, + 'silent', + ); run( 'the landed repair: bare `import.meta.url` taken apart by hand', `${head}const REPO_ROOT = decodeURIComponent(new URL(import.meta.url).pathname).split('/').slice(0, -5).join('/');\nreadFileSync(join(REPO_ROOT, 'packages/x/y.ts'));`, diff --git a/scripts/check-ui-root-lookups.mjs b/scripts/check-ui-root-lookups.mjs new file mode 100644 index 0000000000..b75aea319e --- /dev/null +++ b/scripts/check-ui-root-lookups.mjs @@ -0,0 +1,283 @@ +#!/usr/bin/env node +// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. + +/** + * check-ui-root-lookups -- a repo-root lookup by MARKER belongs to + * `scripts/ui-root.mjs` alone. + * + * node scripts/check-ui-root-lookups.mjs # scan the tree (`pnpm check:ui-root-lookups`) + * node scripts/check-ui-root-lookups.mjs --list # every hit, allowed or not, with its shape + * node scripts/check-ui-root-lookups.mjs --json + * node scripts/check-ui-root-lookups.mjs --self-test # the detector's own cases, no tree scan + * + * Exit: 0 = no lookup outside the helper and the allowlist is live + * 1 = a lookup outside the helper, or an allowlist entry that matches + * nothing any more (stale), or the scan found no files at all + * + * ## The class (objectstack ruling D1: objectui becomes `ui/` of the monorepo) + * + * Standalone, "the directory that holds `.git`" and "the directory that holds + * `pnpm-workspace.yaml`" and "`git rev-parse --show-toplevel`" all name the + * objectui root. Inside the monorepo every one of them names the OBJECTSTACK + * root, one level up, and the nested `pnpm-workspace.yaml` is gone because a + * nested workspace root is ignored. A test that joins that answer with + * `packages/core/...` then reads a path that does not exist. Measured on the + * merge spike: one such test already failed, and 71 files carried one of the + * spellings. `scripts/ui-root.mjs` resolves the root from its own location, + * which is true in both layouts; this gate keeps the marker lookups from + * growing back once they are migrated. + * + * ## What is a LOOKUP, and what is not + * + * The gate judges the call target, not the spelling, so the marker's name in a + * string is not by itself a finding: + * + * - FIRES an existence probe (`existsSync`, `statSync`, `lstatSync`, + * `accessSync`) whose path names `.git` or `pnpm-workspace.yaml`, + * directly or through a `const` bound earlier in the file; + * - FIRES a `git rev-parse --show-toplevel` / `--git-common-dir` argument; + * - FIRES an import of `find-up` or a call of `findUp(...)`; + * - SILENT a `readFileSync` of `pnpm-workspace.yaml`: that reads the + * workspace's package globs as DATA from a root already known, and + * whether the file exists after the merge is the workspace card's + * question, not this one's; + * - SILENT a `.git` entry in a directory skip-list, a fixture that WRITES a + * `pnpm-workspace.yaml`, and any mention inside a comment. + * + * ## The allowlist is a ledger, not a bypass + * + * Every entry names a file and the reason its probe is not a repo-root lookup + * (a CLI asking whether the USER's cwd is a workspace; the pin script, which + * the merge deletes). An entry whose file no longer carries a hit is STALE and + * reds the run, so the list can only shrink without being tended. + */ + +import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs'; +import { basename, extname, join, relative, resolve } from 'node:path'; +import ts from 'typescript'; + +import { isEntrypoint } from './invoked-as.mjs'; +import { uiRoot } from './ui-root.mjs'; + +/** The one file that may look the root up -- it does not, but it is where a lookup would belong. */ +export const HELPER = 'scripts/ui-root.mjs'; +/** This gate names every spelling it hunts, so it is the one other file the scan skips. */ +export const SELF = 'scripts/check-ui-root-lookups.mjs'; + +/** Directories scanned, relative to the objectui root. */ +export const SCAN_ROOTS = ['scripts', 'packages', 'apps']; + +const SKIP_DIRS = new Set(['node_modules', 'dist', 'build', 'coverage', '.next', '.turbo', '.vite', '.cache']); +const EXTENSIONS = new Set(['.ts', '.tsx', '.mts', '.cts', '.mjs', '.cjs', '.js']); + +/** Markers whose EXISTENCE is what a root walk probes for -- as a whole literal or as a path's last segment. */ +export const MARKERS = new Set(['.git', 'pnpm-workspace.yaml']); +const MARKER_SEGMENT = /(^|[\\/])(\.git|pnpm-workspace\.yaml)$/; +const namesMarkerText = (text) => MARKERS.has(text) || MARKER_SEGMENT.test(text); +const PROBES = new Set(['existsSync', 'statSync', 'lstatSync', 'accessSync']); +const GIT_ROOT_FLAGS = new Set(['--show-toplevel', '--git-common-dir']); + +/** + * Files that carry a probe this gate recognises and that is NOT a repo-root + * lookup. Path → reason. A path listed here that carries no hit is stale. + */ +export const ALLOWLIST = new Map([ + [ + 'scripts/objectstack-pin.mjs', + 'packs the pin from an objectstack tree and refuses one with no pnpm-workspace.yaml -- a probe of THAT tree, not of this root; the file itself is deleted at cutover', + ], + [ + 'scripts/check-new-cross-file-line-citations.mjs', + "the gate's subject is the REPOSITORY AT THE CWD (its self-test drives it against a scratch repository), so `gateRoot()` reads the toplevel and narrows to `uiRoot()` only when the objectui tree lies inside it -- a probe of THAT repository, not a lookup of this root", + ], + ['packages/cli/src/utils/app-generator.ts', "asks whether the USER's cwd is a pnpm workspace to choose the scaffold shape -- product behaviour, not a repo-root lookup"], + ['packages/cli/src/utils/workspace-vite.ts', "asks whether the USER's cwd is a pnpm workspace before reading its globs -- product behaviour, not a repo-root lookup"], + ['packages/cli/src/__tests__/app-generator.test.ts', 'mirrors the generator\'s own cwd predicate to compute the expected scaffold shape'], +]); + +// Cheap pre-filter: a file that spells none of these cannot carry a hit. It is +// a SPEED filter only; every file that mentions one is parsed in full. +const PREFILTER = /\.git['"`]|pnpm-workspace\.yaml|--show-toplevel|--git-common-dir|find-up|findUp/; + +function calleeName(node) { + const e = node.expression; + if (ts.isIdentifier(e)) return e.text; + if (ts.isPropertyAccessExpression(e)) return e.name.text; + return null; +} + +/** Every `const`/`let` initializer in the file, by name (first declaration wins). */ +function bindingsOf(src) { + const binds = new Map(); + const walk = (node) => { + if (ts.isVariableDeclaration(node) && ts.isIdentifier(node.name) && node.initializer && !binds.has(node.name.text)) { + binds.set(node.name.text, node.initializer); + } + ts.forEachChild(node, walk); + }; + ts.forEachChild(src, walk); + return binds; +} + +/** Whether `node` (followed one hop through a binding) holds a marker literal. */ +function namesMarker(node, binds, depth = 0) { + if (!node || depth > 4) return false; + let found = false; + const walk = (n) => { + if (found) return; + if ((ts.isStringLiteral(n) || ts.isNoSubstitutionTemplateLiteral(n)) && namesMarkerText(n.text)) { found = true; return; } + // A template's literal parts: `${dir}/.git` names the marker in its tail. + if (ts.isTemplateHead(n) || ts.isTemplateMiddle(n) || ts.isTemplateTail(n)) { + if (namesMarkerText(n.text)) { found = true; return; } + } + if (ts.isIdentifier(n) && binds.has(n.text) && n !== node) { + if (namesMarker(binds.get(n.text), binds, depth + 1)) { found = true; return; } + } + ts.forEachChild(n, walk); + }; + if (ts.isIdentifier(node) && binds.has(node.text)) return namesMarker(binds.get(node.text), binds, depth + 1); + walk(node); + return found; +} + +/** + * Every root lookup in one source text. + * + * @param {string} file Path used for reporting and for the script kind. + * @param {string} text + * @returns {{ line: number, shape: 'marker-probe' | 'git-toplevel' | 'find-up', text: string }[]} + */ +export function lookupsIn(file, text) { + const kind = /\.tsx$/.test(file) ? ts.ScriptKind.TSX : /\.[cm]?js$/.test(file) ? ts.ScriptKind.JS : ts.ScriptKind.TS; + const src = ts.createSourceFile(file, text, ts.ScriptTarget.Latest, true, kind); + const binds = bindingsOf(src); + const hits = []; + const record = (node, shape) => { + hits.push({ + line: src.getLineAndCharacterOfPosition(node.getStart(src)).line + 1, + shape, + text: node.getText(src).replace(/\s+/g, ' ').slice(0, 120), + }); + }; + const walk = (node) => { + if (ts.isImportDeclaration(node) && ts.isStringLiteral(node.moduleSpecifier) && node.moduleSpecifier.text === 'find-up') { + record(node, 'find-up'); + } else if (ts.isCallExpression(node)) { + const name = calleeName(node); + if (name === 'require' && node.arguments[0] && ts.isStringLiteral(node.arguments[0]) && node.arguments[0].text === 'find-up') record(node, 'find-up'); + else if (name === 'findUp' || name === 'findUpSync') record(node, 'find-up'); + else if (PROBES.has(name) && namesMarker(node.arguments[0], binds)) record(node, 'marker-probe'); + } else if ((ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node)) && GIT_ROOT_FLAGS.has(node.text)) { + record(node, 'git-toplevel'); + } + ts.forEachChild(node, walk); + }; + walk(src); + return hits; +} + +function* walkFiles(dir) { + for (const entry of readdirSync(dir, { withFileTypes: true })) { + if (entry.isDirectory()) { + if (SKIP_DIRS.has(entry.name) || entry.name.startsWith('.')) continue; + yield* walkFiles(join(dir, entry.name)); + } else if (entry.isFile() && EXTENSIONS.has(extname(entry.name))) { + yield join(dir, entry.name); + } + } +} + +/** + * @param {string} root the objectui tree + * @returns {{ scanned: number, parsed: number, hits: {file: string, line: number, shape: string, text: string, allowed: string | null}[], stale: string[] }} + */ +export function scan(root = uiRoot()) { + const hits = []; + let scanned = 0; + let parsed = 0; + for (const scanRoot of SCAN_ROOTS) { + const dir = join(root, scanRoot); + if (!existsSync(dir) || !statSync(dir).isDirectory()) continue; + for (const abs of walkFiles(dir)) { + const rel = relative(root, abs).split('\\').join('/'); + if (rel === HELPER || rel === SELF) continue; + scanned += 1; + const text = readFileSync(abs, 'utf8'); + if (!PREFILTER.test(text)) continue; + parsed += 1; + for (const hit of lookupsIn(rel, text)) hits.push({ file: rel, ...hit, allowed: ALLOWLIST.get(rel) ?? null }); + } + } + const live = new Set(hits.map((h) => h.file)); + const stale = [...ALLOWLIST.keys()].filter((file) => !live.has(file)); + return { scanned, parsed, hits, stale }; +} + +export function selfTest() { + const cases = []; + const run = (name, source, want, file = 'fixture/x.test.ts') => { + const hits = lookupsIn(file, source); + const ok = want === 'fires' ? hits.length > 0 : hits.length === 0; + cases.push({ name, ok, detail: ok ? '' : `${hits.length} hit(s): ${hits.map((h) => `${h.shape} \`${h.text}\``).join('; ')}` }); + }; + const head = "import { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { execFileSync } from 'node:child_process';\n"; + // ── FIRES ──────────────────────────────────────────────────────────────── + run('a walk up to pnpm-workspace.yaml', `${head}let dir = __dirname;\nwhile (!existsSync(join(dir, 'pnpm-workspace.yaml'))) dir = dirname(dir);`, 'fires'); + run('a walk up to .git through a namespace import', `import fs from 'node:fs';\nimport path from 'node:path';\nif (fs.existsSync(path.join(dir, '.git'))) return dir;`, 'fires'); + run('the marker laundered through a const', `${head}const marker = join(dir, '.git');\nif (existsSync(marker)) return dir;`, 'fires'); + run('`git rev-parse --show-toplevel`', `${head}const root = execFileSync('git', ['rev-parse', '--show-toplevel'], { encoding: 'utf8' }).trim();`, 'fires'); + run('`--git-common-dir`', `${head}const common = execFileSync('git', ['rev-parse', '--git-common-dir']);`, 'fires'); + run('an import of find-up', `import { findUp } from 'find-up';\nconst root = await findUp('pnpm-workspace.yaml');`, 'fires'); + run('a statSync probe in a .mjs file', `import { statSync } from 'node:fs';\ntry { statSync(\`\${dir}/.git\`); } catch {}`, 'fires', 'scripts/x.mjs'); + // ── SILENT ─────────────────────────────────────────────────────────────── + run('reading the workspace globs as data from a known root', `${head}const yaml = readFileSync(join(repoRoot, 'pnpm-workspace.yaml'), 'utf8');`, 'silent'); + run('a directory skip-list naming .git', `const SKIP_DIRS = new Set(['node_modules', 'dist', '.git', '.turbo']);`, 'silent'); + run('a fixture that writes a pnpm-workspace.yaml', `${head}writeFileSync(join(dir, 'pnpm-workspace.yaml'), "packages:\\n - 'packages/*'\\n");`, 'silent'); + run('a comment that mentions every spelling', `// walks up to .git or pnpm-workspace.yaml, like git rev-parse --show-toplevel or find-up\nexport const x = 1;`, 'silent'); + run('the helper itself', `import { uiRoot } from '../../../../scripts/ui-root.mjs';\nconst README = join(uiRoot(), 'packages/core/README.md');\nif (existsSync(README)) {}`, 'silent'); + run('an existsSync of something else', `${head}if (existsSync(join(root, 'packages/types/package.json'))) {}`, 'silent'); + return cases; +} + +function main(argv) { + if (argv.includes('--self-test')) { + const cases = selfTest(); + for (const c of cases) console.log(`${c.ok ? '✓' : '✗'} ${c.name}${c.detail ? ` -- ${c.detail}` : ''}`); + const failed = cases.filter((c) => !c.ok); + console.log(failed.length ? `✗ ${failed.length} of ${cases.length} self-test case(s) failed` : `✓ ${cases.length} self-test case(s) passed`); + return failed.length ? 1 : 0; + } + const result = scan(); + const offending = result.hits.filter((h) => h.allowed === null); + if (argv.includes('--json')) { + console.log(JSON.stringify({ ...result, offending }, null, 2)); + return offending.length || result.stale.length || result.scanned === 0 ? 1 : 0; + } + if (argv.includes('--list')) { + for (const h of result.hits) console.log(`${h.allowed ? 'allowed ' : 'LOOKUP '} ${h.file}:${h.line} ${h.shape} ${h.text}${h.allowed ? ` -- ${h.allowed}` : ''}`); + } + if (result.scanned === 0) { + console.error(`✗ check-ui-root-lookups: scanned no files under ${SCAN_ROOTS.join(', ')} -- a scan of nothing is not a reading.`); + return 1; + } + for (const h of offending) { + console.error(`✗ ${h.file}:${h.line} ${h.shape} ${h.text}`); + } + for (const file of result.stale) console.error(`✗ stale allowlist entry: ${file} carries no lookup any more -- delete its line from ALLOWLIST.`); + if (offending.length || result.stale.length) { + console.error( + `\n✗ check-ui-root-lookups: ${offending.length} repo-root lookup(s) outside ${HELPER}` + + `${result.stale.length ? ` and ${result.stale.length} stale allowlist entr${result.stale.length === 1 ? 'y' : 'ies'}` : ''}.\n` + + ` Standalone these find the objectui root; inside the objectstack monorepo (\`ui/\`) they find the OBJECTSTACK root.\n` + + ` Import { uiRoot } from scripts/ui-root.mjs instead -- it resolves the tree from its own location in both layouts.`, + ); + return 1; + } + console.log( + `✅ check-ui-root-lookups: OK (${result.scanned} file(s) scanned, ${result.parsed} parsed, ` + + `${result.hits.length} probe(s) all on the allowlist, ${ALLOWLIST.size} allowlist entr${ALLOWLIST.size === 1 ? 'y' : 'ies'} live).`, + ); + return 0; +} + +if (isEntrypoint(import.meta.url)) process.exit(main(process.argv.slice(2))); diff --git a/scripts/cross-file-line-citation-census.mjs b/scripts/cross-file-line-citation-census.mjs index 4afb48d594..ce6ba39d9e 100644 --- a/scripts/cross-file-line-citation-census.mjs +++ b/scripts/cross-file-line-citation-census.mjs @@ -274,6 +274,7 @@ import { readFileSync, statSync } from 'node:fs'; import { basename, dirname, join } from 'node:path'; import { isEntrypoint } from './invoked-as.mjs'; +import { uiRoot } from './ui-root.mjs'; /** * Extensions that make `NAME.ext:NNN` a source address. Kept in step with @@ -1095,7 +1096,7 @@ export function finalVerdict({ controls, classifier, declaration = [], populatio } function main(argv) { - const root = execFileSync('git', ['rev-parse', '--show-toplevel'], { encoding: 'utf8' }).trim(); + const root = uiRoot(); const head = execFileSync('git', ['rev-parse', '--short', 'HEAD'], { cwd: root, encoding: 'utf8' }).trim(); const asJson = argv.includes('--json'); const listAll = argv.includes('--list-all'); diff --git a/scripts/dollar-dialect-alias-census.mjs b/scripts/dollar-dialect-alias-census.mjs index 5d8b0020fc..6fcf536fb5 100644 --- a/scripts/dollar-dialect-alias-census.mjs +++ b/scripts/dollar-dialect-alias-census.mjs @@ -132,6 +132,7 @@ import { readFileSync, statSync } from 'node:fs'; import { join } from 'node:path'; import { isEntrypoint } from './invoked-as.mjs'; +import { uiRoot } from './ui-root.mjs'; /** The file whose `operatorMap` defines the accepted `$`-dialect. */ export const CONVERTER_PATH = 'packages/core/src/utils/filter-converter.ts'; @@ -546,7 +547,7 @@ export async function runCensus(root) { } async function main(argv) { - const root = execFileSync('git', ['rev-parse', '--show-toplevel'], { encoding: 'utf8' }).trim(); + const root = uiRoot(); const head = execFileSync('git', ['rev-parse', '--short', 'HEAD'], { cwd: root, encoding: 'utf8' }).trim(); const asJson = argv.includes('--json'); const listAll = argv.includes('--list-all'); diff --git a/scripts/objectstack-floor.mjs b/scripts/objectstack-floor.mjs index 4214bdad6b..af31dfc0fe 100644 --- a/scripts/objectstack-floor.mjs +++ b/scripts/objectstack-floor.mjs @@ -45,6 +45,46 @@ export const SPEC = '@objectstack/spec'; export const TAG_PREFIX = `${SPEC}@`; const VERSION = /^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/; const RANGE = /^(?:\^|~|>=|=)?(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?)$/; +// pnpm's workspace protocol (objectstack ruling D1: inside the objectstack monorepo the +// `@objectstack/*` ranges are `workspace:^`). `workspace:*` / `^` / `~` / bare publish as +// `^`, so that version is the range's floor; a range +// tail (`workspace:^1.2.3`) is read as the range. +const WORKSPACE = /^workspace:(.*)$/; +const WORKSPACE_OWN_VERSION = new Set(['', '*', '^', '~']); + +/** + * The version of `name` the workspace resolves: the nearest `node_modules//package.json` + * walking up from `root` -- the pinned build standalone, the workspace link in the monorepo. + * `null` when nothing is installed, which a `workspace:` range then reports as unreadable. + */ +export function installedVersion(root, name) { + let dir = root; + for (;;) { + const manifest = path.join(dir, 'node_modules', name, 'package.json'); + if (fs.existsSync(manifest)) { + try { + const version = JSON.parse(fs.readFileSync(manifest, 'utf8')).version; + return typeof version === 'string' ? version : null; + } catch { + return null; + } + } + const parent = path.dirname(dir); + if (parent === dir) return null; + dir = parent; + } +} + +/** The lowest version `from` admits, or `null` when this step cannot read it. */ +export function floorOfRange(from, name, workspaceVersionOf) { + const text = String(from).trim(); + const workspace = WORKSPACE.exec(text); + if (!workspace) return RANGE.exec(text)?.[1] ?? null; + const tail = workspace[1].trim(); + if (!WORKSPACE_OWN_VERSION.has(tail)) return RANGE.exec(tail)?.[1] ?? null; + const own = workspaceVersionOf(name); + return typeof own === 'string' && VERSION.test(own) ? own : null; +} /** Semver precedence of two `X.Y.Z[-prerelease]` versions: negative, 0 or positive. */ export function compareVersions(a, b) { @@ -96,14 +136,21 @@ export function releaseTags(dir, url, pin) { return { tagged, contains }; } -/** Every `@objectstack/*` range of every published manifest, judged against the floor. */ -export function planRanges(packages, floor) { +/** + * Every `@objectstack/*` range of every published manifest, judged against the floor. + * + * @param {{ name: string, dir: string, manifest: object }[]} packages + * @param {string} floor + * @param {{ workspaceVersionOf?: (name: string) => string | null }} [options] + * what a `workspace:` range of `name` reads as its floor (default: nothing is a workspace) + */ +export function planRanges(packages, floor, { workspaceVersionOf = () => null } = {}) { const rows = []; for (const pkg of packages) { for (const field of ALL_FIELDS) { for (const [name, from] of Object.entries(pkg.manifest[field] ?? {})) { if (!name.startsWith('@objectstack/')) continue; - const min = RANGE.exec(String(from).trim())?.[1]; + const min = floorOfRange(from, name, workspaceVersionOf); const action = !min ? 'unreadable' : compareVersions(min, floor) < 0 ? 'moved' : 'kept'; rows.push({ pkg, field, name, from, to: action === 'moved' ? `^${floor}` : from, action }); } @@ -151,7 +198,7 @@ export function main({ root = REPO_ROOT, argv = process.argv.slice(2), env = pro return 2; } console.log(`Floor ${floor}: the earliest published ${SPEC} whose tag ${TAG_PREFIX}${floor} contains the pin ${pin}.`); - const rows = planRanges(discoverPublishedPackages(root), floor); + const rows = planRanges(discoverPublishedPackages(root), floor, { workspaceVersionOf: (name) => installedVersion(root, name) }); for (const r of rows) console.log(` ${r.action.padEnd(10)} ${r.pkg.name} ${r.field} ${r.name} ${r.from}${r.action === 'moved' ? ` → ${r.to}` : ''}`); const unreadable = rows.filter((r) => r.action === 'unreadable'); if (unreadable.length) throw new Error(`${unreadable.length} range(s) above name no minimum this step can read; nothing was written.`); diff --git a/scripts/ui-root.d.mts b/scripts/ui-root.d.mts new file mode 100644 index 0000000000..514d31fee2 --- /dev/null +++ b/scripts/ui-root.d.mts @@ -0,0 +1,12 @@ +// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. +// +// Declaration twin of `ui-root.mjs`, so a TypeScript test under a package +// (compiled with `allowJs: false`) imports the helper typed, with no +// `@ts-expect-error` and no local annotation. `scripts/__tests__/ui-root.test.ts` +// pins that the names declared here are exactly the names the module exports. + +/** Absolute path of the objectui tree: the directory that holds `scripts/`, `packages/` and `apps/`. */ +export declare const UI_ROOT: string; + +/** The objectui tree root, as an absolute path with no trailing separator. */ +export declare function uiRoot(): string; diff --git a/scripts/ui-root.mjs b/scripts/ui-root.mjs new file mode 100644 index 0000000000..49f9803ed1 --- /dev/null +++ b/scripts/ui-root.mjs @@ -0,0 +1,53 @@ +// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. + +/** + * ui-root -- the ONE answer to "where is the objectui tree?" + * + * import { uiRoot } from '../scripts/ui-root.mjs'; + * const README = path.join(uiRoot(), 'packages/core/README.md'); + * + * ## Why a helper, and why it is anchored on THIS file + * + * objectui is being merged into the objectstack monorepo as `ui/` (objectstack + * ruling D1, the parent epic of this change). Every script and test that found + * "the repo root" by walking up to a marker -- `.git`, `pnpm-workspace.yaml`, + * `git rev-parse --show-toplevel`, a find-up -- stops at the OBJECTSTACK root + * there, not at the objectui tree: `.git` and `pnpm-workspace.yaml` live one + * level up, and the nested `pnpm-workspace.yaml` is removed because a nested + * workspace root is ignored. Measured on the merge spike: a test that joined + * that root with `packages/core/...` read a directory that does not exist and + * failed, and 71 files carried one of those lookups. + * + * This module's own location is the one fact that is true in both layouts: it + * sits at `/scripts/ui-root.mjs`, standalone or under `ui/`. So + * the root is RESOLVED FROM THIS FILE, by one `..`, and never searched for. + * Nothing here reads the filesystem, consults git, or looks at the cwd. + * + * ## The rule this backs + * + * `pnpm check:ui-root-lookups` (`scripts/check-ui-root-lookups.mjs`) refuses a + * new marker-based root lookup outside this file; its header names the shapes. + * Root `AGENTS.md`'s rule that a test roots a filesystem read on its OWN file, + * never on `process.cwd()`, is unchanged -- this helper is rooted on a file + * too, and `scripts/check-test-path-roots.mjs` classifies a read rooted on + * `uiRoot()` as self-rooted for that reason. + * + * ⛔ Node builtins only: scripts that run BEFORE `pnpm install` may import this + * (`scripts/check-pre-install-import-graph.mjs` holds that property). + */ + +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +/** Absolute path of the objectui tree: the directory that holds `scripts/`, `packages/` and `apps/`. */ +export const UI_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); + +/** + * The objectui tree root, as an absolute path with no trailing separator. + * + * A function rather than only a constant so a call site reads as a lookup + * (`uiRoot()`) and so a future need to validate the answer has one place to go. + */ +export function uiRoot() { + return UI_ROOT; +} diff --git a/scripts/vite-objectstack-workspace.ts b/scripts/vite-objectstack-workspace.ts new file mode 100644 index 0000000000..f2b53fe34a --- /dev/null +++ b/scripts/vite-objectstack-workspace.ts @@ -0,0 +1,96 @@ +// The `@objectstack/*` module-id tests the console's Vite config groups and +// guards on, made aware of the objectstack MONOREPO layout (objectstack ruling +// D1: objectui lands there as `ui/`). +// +// Standalone, every `@objectstack/*` module resolves out of `node_modules`, so +// a module id carries one of two spellings — `/node_modules/@objectstack//` +// for a plain install, `/@objectstack+@/` for pnpm's store — and the +// baseline tests in `apps/console/vite.config.ts` match those. Inside the +// monorepo the same packages are WORKSPACE LINKS, and Vite resolves a link to +// its real path: `/packages//dist/...`, which carries +// neither spelling. Measured on the merge spike: the vendor group test, the +// spec counter-probe and the lazy-linter guard all missed, and the console +// build failed on its own guard. +// +// So each test takes ONE more alternative: an id that starts with the +// monorepo's `packages/` directory, located relative to the console +// (`apps/console` → `../../../packages`, i.e. `/../packages`) — and takes +// it ONLY where that directory exists. Standalone it does not exist beside the +// objectui checkout, and the three tests are then the baseline literals, byte +// for byte: `scripts/__tests__/vite-objectstack-spec-dist.test.ts` pins the +// vendor literal as one of the four flagged surfaces of objectui#4854, and an +// alternative that merely "matches nothing" would still move that surface. +// `scripts/__tests__/vite-objectstack-workspace.test.ts` pins both directions, +// which is why these live in a module rather than inline in the config: a +// config file's constants are not importable by a test. +// +// `@objectstack/lint` stays OUT of the vendor group in the workspace spelling +// too (`(?!lint[\\/])`), for the reason the config states on +// `VENDOR_OBJECTSTACK_TEST`: the linter is reached only through a deliberate +// dynamic import, and grouping it would make every console page load parse it. + +import { existsSync, statSync } from 'node:fs'; +import path from 'node:path'; + +/** `s` as a regular-expression literal. */ +export const escapeRegExp = (s: string): string => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + +/** + * Where the monorepo's `packages/` directory WOULD be, seen from a console + * directory — `/packages` when the console sits at + * `ui/apps/console`, `/packages` when it sits standalone. + * Pure: a path computation, no filesystem. + */ +export function candidateFrameworkPackagesDir(consoleDir: string): string { + return path.resolve(consoleDir, '../../../packages'); +} + +/** + * The monorepo's `packages/` directory when it exists beside this console, + * `null` when it does not — standalone, so the config keeps the baseline tests. + */ +export function frameworkPackagesDir(consoleDir: string): string | null { + const dir = candidateFrameworkPackagesDir(consoleDir); + if (!existsSync(dir)) return null; + return statSync(dir).isDirectory() ? dir : null; +} + +/** The three module-id tests, each widened with the workspace spelling. */ +export interface WorkspaceChunkTests { + /** The `vendor-objectstack` group: every framework package but the linter. */ + vendor: RegExp; + /** "This module id IS `@objectstack/spec`" — the counter-probe's subject. */ + spec: RegExp; + /** "This module id IS `@objectstack/lint`" — what the lazy-linter guard looks for. */ + lint: RegExp; +} + +/** + * The baseline literals, exactly as `apps/console/vite.config.ts` spelled them + * before the workspace alternative existed; `workspaceChunkTests(null)` returns + * these and nothing else. + */ +export const BASELINE_CHUNK_TESTS: WorkspaceChunkTests = { + vendor: /([\\/]node_modules[\\/]@objectstack[\\/](?!lint[\\/])|[\\/]@objectstack\+(?!lint@))/, + spec: /@objectstack[\\/+]spec/, + lint: /@objectstack[\\/+]lint/, +}; + +/** + * @param frameworkPackagesDir the monorepo `packages/` directory from + * `frameworkPackagesDir()`, or `null` standalone — then the baseline literals. + */ +export function workspaceChunkTests(frameworkPackagesDir: string | null): WorkspaceChunkTests { + if (frameworkPackagesDir === null) return BASELINE_CHUNK_TESTS; + // Vite hands out POSIX-style ids on every platform; the config's baseline + // alternatives accept either separator and so does the prefix here. + const prefix = escapeRegExp(frameworkPackagesDir.split(path.sep).join('/')) + '[\\\\/]'; + return { + vendor: new RegExp( + '(^' + prefix + '(?!lint[\\\\/])' + + '|[\\\\/]node_modules[\\\\/]@objectstack[\\\\/](?!lint[\\\\/])|[\\\\/]@objectstack\\+(?!lint@))', + ), + spec: new RegExp('(@objectstack[\\\\/+]spec|^' + prefix + 'spec[\\\\/])'), + lint: new RegExp('(@objectstack[\\\\/+]lint|^' + prefix + 'lint[\\\\/])'), + }; +}