From f518e8630ef184ccfb5cde59f4707def587ddacd Mon Sep 17 00:00:00 2001 From: Brad Harris Date: Fri, 10 Jul 2026 10:16:04 -0600 Subject: [PATCH] Add per-agent whiteboard feature using tldraw Implements a per-agent whiteboard as a new center-pane tab alongside Terminal and Changes. Uses tldraw v5 for the canvas (React.lazy code-split) and @tldraw/tlschema for server-side shape construction, enabling agents to draw diagrams via MCP tools without a browser. Backend: DB migration (whiteboards table with optimistic locking), whiteboard builder (~230 LOC translating WhiteboardOps to tldraw records), REST API (GET/PUT/snapshot), MCP tools (whiteboard_get, whiteboard_update), SSE sync (whiteboard.changed events). Frontend: tldraw canvas with debounced save (2s) and snapshot export (4s), pointer-down deferral for mid-gesture updates, theme-aware (colorScheme prop), agent-drew violet dot indicator on tab, lazy-loaded pane with Suspense fallback, full routing integration. Tests: 31 unit tests (builder ops, simplifyElements), 3 E2E tests (tab rendering, API CRUD, deep-link routing). All 181 E2E tests pass. Co-Authored-By: Claude Opus 4.6 --- apps/server/package.json | 2 + .../src/db/migrations/0030_whiteboards.sql | 7 + apps/server/src/routes/mcp.ts | 6 + apps/server/src/routes/whiteboard.ts | 134 + apps/server/src/server.ts | 12 + apps/server/src/server/mcp-handlers.ts | 9 + .../src/server/mcp-whiteboard-handlers.ts | 75 + apps/server/src/server/ui-events.ts | 5 + apps/server/src/shared/mcp/server.ts | 24 + .../server/src/shared/mcp/whiteboard-tools.ts | 133 + apps/server/src/shared/whiteboard-builder.ts | 315 ++ apps/server/src/shared/whiteboard-store.ts | 80 + apps/server/src/shared/whiteboard.ts | 75 + apps/server/test/whiteboard-builder.test.ts | 316 ++ apps/server/test/whiteboard.test.ts | 98 + apps/web/package.json | 3 +- apps/web/src/components/app/agents-view.tsx | 57 +- .../components/app/center-pane-tab-bar.tsx | 19 +- .../src/components/app/whiteboard-pane.tsx | 47 + .../web/src/components/app/whiteboard-tab.tsx | 158 + apps/web/src/hooks/use-agents-view-routing.ts | 9 +- apps/web/src/hooks/use-sse.ts | 19 + apps/web/src/hooks/use-whiteboard.ts | 80 + apps/web/src/lib/agent-routes.ts | 4 + apps/web/src/lib/store.ts | 10 +- e2e/whiteboard.spec.ts | 127 + package.json | 5 + pnpm-lock.yaml | 3319 +++++++++++++++-- 28 files changed, 4759 insertions(+), 389 deletions(-) create mode 100644 apps/server/src/db/migrations/0030_whiteboards.sql create mode 100644 apps/server/src/routes/whiteboard.ts create mode 100644 apps/server/src/server/mcp-whiteboard-handlers.ts create mode 100644 apps/server/src/shared/mcp/whiteboard-tools.ts create mode 100644 apps/server/src/shared/whiteboard-builder.ts create mode 100644 apps/server/src/shared/whiteboard-store.ts create mode 100644 apps/server/src/shared/whiteboard.ts create mode 100644 apps/server/test/whiteboard-builder.test.ts create mode 100644 apps/server/test/whiteboard.test.ts create mode 100644 apps/web/src/components/app/whiteboard-pane.tsx create mode 100644 apps/web/src/components/app/whiteboard-tab.tsx create mode 100644 apps/web/src/hooks/use-whiteboard.ts create mode 100644 e2e/whiteboard.spec.ts diff --git a/apps/server/package.json b/apps/server/package.json index e0272330..95d5734e 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -20,6 +20,8 @@ "@fastify/rate-limit": "^10.3.0", "@fastify/websocket": "^11.2.0", "@modelcontextprotocol/sdk": "^1.27.1", + "@tldraw/store": "5.2.4", + "@tldraw/tlschema": "5.2.4", "bcryptjs": "^3.0.3", "croner": "^10.0.1", "dotenv": "^17.3.1", diff --git a/apps/server/src/db/migrations/0030_whiteboards.sql b/apps/server/src/db/migrations/0030_whiteboards.sql new file mode 100644 index 00000000..637a9540 --- /dev/null +++ b/apps/server/src/db/migrations/0030_whiteboards.sql @@ -0,0 +1,7 @@ +CREATE TABLE IF NOT EXISTS whiteboards ( + agent_id TEXT PRIMARY KEY REFERENCES agents(id) ON DELETE CASCADE, + scene JSONB NOT NULL DEFAULT '{}', + version INTEGER NOT NULL DEFAULT 1, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); diff --git a/apps/server/src/routes/mcp.ts b/apps/server/src/routes/mcp.ts index da6fdfa1..bbd9c4c2 100644 --- a/apps/server/src/routes/mcp.ts +++ b/apps/server/src/routes/mcp.ts @@ -72,6 +72,8 @@ type McpRouteDeps = { mcpJobLog: unknown; mcpSendMessage: unknown; mcpListAgentsForAgent: unknown; + mcpGetWhiteboard: unknown; + mcpUpdateWhiteboard: unknown; mcpMethodNotAllowed: () => unknown; }; @@ -239,6 +241,8 @@ export async function registerMcpRoutes( crudTools: buildCrudCallbacks(deps), brainStore: deps.brainStore, publishBrainChanged: deps.publishBrainChanged, + getWhiteboard: deps.mcpGetWhiteboard, + updateWhiteboard: deps.mcpUpdateWhiteboard, } as Parameters[3]); }); @@ -329,6 +333,8 @@ export async function registerMcpRoutes( crudTools: buildCrudCallbacks(deps), brainStore: deps.brainStore, publishBrainChanged: deps.publishBrainChanged, + getWhiteboard: deps.mcpGetWhiteboard, + updateWhiteboard: deps.mcpUpdateWhiteboard, } as Parameters[3]); }); diff --git a/apps/server/src/routes/whiteboard.ts b/apps/server/src/routes/whiteboard.ts new file mode 100644 index 00000000..47465d68 --- /dev/null +++ b/apps/server/src/routes/whiteboard.ts @@ -0,0 +1,134 @@ +import path from "node:path"; +import { mkdir, readFile, writeFile, unlink } from "node:fs/promises"; + +import type { FastifyInstance } from "fastify"; +import type { Pool } from "pg"; + +import type { AgentManager } from "../agents/manager.js"; +import { applyOps } from "../shared/whiteboard-builder.js"; +import { resolveMediaDir } from "../shared/media.js"; +import { getWhiteboard, saveWhiteboard } from "../shared/whiteboard-store.js"; +import { + simplifyElements, + type WhiteboardOp, + type WhiteboardScene, +} from "../shared/whiteboard.js"; + +type WhiteboardRouteDeps = { + pool: Pool; + mediaRoot: string; + agentManager: AgentManager; + publishUiEvent: (event: unknown) => void; +}; + +export async function registerWhiteboardRoutes( + app: FastifyInstance, + deps: WhiteboardRouteDeps +): Promise { + const { pool, mediaRoot, agentManager, publishUiEvent } = deps; + + app.get("/api/v1/agents/:agentId/whiteboard", async (request, reply) => { + const { agentId } = request.params as { agentId: string }; + const row = await getWhiteboard(pool, agentId); + const scene: WhiteboardScene = row?.scene ?? { records: [] }; + return reply.send({ + scene, + version: row?.version ?? 0, + elements: simplifyElements(scene.records ?? []), + }); + }); + + app.put("/api/v1/agents/:agentId/whiteboard", async (request, reply) => { + const { agentId } = request.params as { agentId: string }; + const body = request.body as { + scene?: WhiteboardScene; + ops?: WhiteboardOp[]; + }; + + if (body.scene) { + const row = await getWhiteboard(pool, agentId); + const { version } = await saveWhiteboard( + pool, + agentId, + body.scene, + row?.version ?? null + ); + publishUiEvent({ + type: "whiteboard.changed", + agentId, + source: "user", + }); + return reply.send({ + version, + elementCount: (body.scene.records ?? []).length, + }); + } + + if (body.ops) { + const row = await getWhiteboard(pool, agentId); + const currentScene: WhiteboardScene = row?.scene ?? { records: [] }; + const updated = applyOps(currentScene, body.ops); + const { version } = await saveWhiteboard( + pool, + agentId, + updated, + row?.version ?? null + ); + publishUiEvent({ + type: "whiteboard.changed", + agentId, + source: "user", + }); + return reply.send({ + version, + elementCount: updated.records.length, + }); + } + + return reply.code(400).send({ error: "scene or ops required" }); + }); + + app.post( + "/api/v1/agents/:agentId/whiteboard/snapshot", + async (request, reply) => { + const { agentId } = request.params as { agentId: string }; + const agent = await agentManager.getAgent(agentId); + if (!agent) { + return reply.code(404).send({ error: "Agent not found" }); + } + + const data = await request.file(); + if (!data) { + return reply.code(400).send({ error: "No file uploaded" }); + } + + const buffer = await data.toBuffer(); + const mediaDir = resolveMediaDir(agentId, agent.mediaDir, mediaRoot); + await mkdir(mediaDir, { recursive: true }); + const snapshotPath = path.join(mediaDir, "whiteboard-snapshot.png"); + await writeFile(snapshotPath, buffer); + + return reply.send({ path: snapshotPath, sizeBytes: buffer.length }); + } + ); + + app.delete( + "/api/v1/agents/:agentId/whiteboard/snapshot", + async (request, reply) => { + const { agentId } = request.params as { agentId: string }; + const agent = await agentManager.getAgent(agentId); + if (!agent) { + return reply.code(404).send({ error: "Agent not found" }); + } + + const mediaDir = resolveMediaDir(agentId, agent.mediaDir, mediaRoot); + const snapshotPath = path.join(mediaDir, "whiteboard-snapshot.png"); + try { + await unlink(snapshotPath); + } catch { + // file doesn't exist, that's fine + } + return reply.send({ deleted: true }); + } + ); +} diff --git a/apps/server/src/server.ts b/apps/server/src/server.ts index 34f75103..77c6f26a 100644 --- a/apps/server/src/server.ts +++ b/apps/server/src/server.ts @@ -110,6 +110,7 @@ import { registerPersonaReviewRoutes } from "./routes/persona-reviews.js"; import { registerPersonalityRoutes } from "./routes/personalities.js"; import { registerReviewRoutes } from "./routes/reviews.js"; import { registerQuickPhraseRoutes } from "./routes/quick-phrases.js"; +import { registerWhiteboardRoutes } from "./routes/whiteboard.js"; import { registerReleaseRoutes } from "./routes/release.js"; import { createAutoCheckRuntime } from "./release-auto-check.js"; import { registerStaticRoutes } from "./routes/static.js"; @@ -499,6 +500,8 @@ async function registerRoutes() { mcpJobFailed: mcpHandlers.jobFailed, mcpJobNeedsInput: mcpHandlers.jobNeedsInput, mcpJobLog: mcpHandlers.jobLog, + mcpGetWhiteboard: mcpHandlers.getWhiteboardForAgent, + mcpUpdateWhiteboard: mcpHandlers.updateWhiteboardForAgent, mcpMethodNotAllowed, }); @@ -643,6 +646,15 @@ async function registerRoutes() { handleAgentError, }); + // --- Whiteboard --- + + await registerWhiteboardRoutes(app, { + pool, + mediaRoot: config.mediaRoot, + agentManager, + publishUiEvent: (event) => uiEventBroker.publish(event as UiEvent), + }); + // --- Feedback --- await registerFeedbackRoutes(app, { diff --git a/apps/server/src/server/mcp-handlers.ts b/apps/server/src/server/mcp-handlers.ts index 7afcfc73..32ce2c5f 100644 --- a/apps/server/src/server/mcp-handlers.ts +++ b/apps/server/src/server/mcp-handlers.ts @@ -28,6 +28,7 @@ import { resolveHeadSha } from "../shared/git/worktree.js"; import { isMediaFile, isTextFile, resolveMediaDir } from "../shared/media.js"; import type { PublishUiEvent, SendAgentPrompt } from "./mcp-handler-types.js"; import { createReviewHandlers } from "./mcp-review-handlers.js"; +import { createWhiteboardHandlers } from "./mcp-whiteboard-handlers.js"; const AGENT_LATEST_EVENT_TYPES = [ "working", @@ -151,8 +152,16 @@ export function createMcpHandlers(deps: CreateMcpHandlersDeps) { sendAgentPrompt, }); + const whiteboardHandlers = createWhiteboardHandlers({ + pool, + mediaRoot, + agentManager, + publishUiEvent, + }); + return { ...reviewHandlers, + ...whiteboardHandlers, async upsertEvent( agentId: string, diff --git a/apps/server/src/server/mcp-whiteboard-handlers.ts b/apps/server/src/server/mcp-whiteboard-handlers.ts new file mode 100644 index 00000000..0755dbf4 --- /dev/null +++ b/apps/server/src/server/mcp-whiteboard-handlers.ts @@ -0,0 +1,75 @@ +import type { Pool } from "pg"; + +import { applyOps } from "../shared/whiteboard-builder.js"; +import { getWhiteboard, saveWhiteboard } from "../shared/whiteboard-store.js"; +import { + simplifyElements, + type WhiteboardOp, + type WhiteboardScene, + type WhiteboardGetResult, + type WhiteboardUpdateResult, +} from "../shared/whiteboard.js"; +import { resolveMediaDir } from "../shared/media.js"; +import type { AgentManager } from "../agents/manager.js"; +import type { PublishUiEvent } from "./mcp-handler-types.js"; + +type CreateWhiteboardHandlersDeps = { + pool: Pool; + mediaRoot: string; + agentManager: AgentManager; + publishUiEvent: PublishUiEvent; +}; + +export function createWhiteboardHandlers(deps: CreateWhiteboardHandlersDeps) { + const { pool, mediaRoot, agentManager, publishUiEvent } = deps; + + return { + async getWhiteboardForAgent(agentId: string): Promise { + const row = await getWhiteboard(pool, agentId); + const scene: WhiteboardScene = row?.scene ?? { records: [] }; + const records = scene.records ?? []; + + const agent = await agentManager.getAgent(agentId); + let snapshotPath: string | null = null; + if (agent) { + const dir = resolveMediaDir(agentId, agent.mediaDir, mediaRoot); + snapshotPath = `${dir}/whiteboard-snapshot.png`; + } + + return { + scene, + version: row?.version ?? 0, + elements: simplifyElements(records), + snapshotPath, + }; + }, + + async updateWhiteboardForAgent( + agentId: string, + ops: WhiteboardOp[] + ): Promise { + const row = await getWhiteboard(pool, agentId); + const currentScene: WhiteboardScene = row?.scene ?? { records: [] }; + const currentVersion = row?.version ?? null; + + const updatedScene = applyOps(currentScene, ops); + const { version } = await saveWhiteboard( + pool, + agentId, + updatedScene, + currentVersion + ); + + publishUiEvent({ + type: "whiteboard.changed", + agentId, + source: "agent", + } as never); + + return { + version, + elementCount: updatedScene.records.length, + }; + }, + }; +} diff --git a/apps/server/src/server/ui-events.ts b/apps/server/src/server/ui-events.ts index f020a79f..f8b47fee 100644 --- a/apps/server/src/server/ui-events.ts +++ b/apps/server/src/server/ui-events.ts @@ -62,6 +62,11 @@ export type UiEvent = | { type: "release.cached_info_changed"; snapshot: ReleaseInfoSnapshot | null; + } + | { + type: "whiteboard.changed"; + agentId: string; + source: "user" | "agent"; }; export class UiEventBroker { diff --git a/apps/server/src/shared/mcp/server.ts b/apps/server/src/shared/mcp/server.ts index 319c6c5d..79bd0e01 100644 --- a/apps/server/src/shared/mcp/server.ts +++ b/apps/server/src/shared/mcp/server.ts @@ -21,6 +21,7 @@ import { registerPersonaTools } from "./persona-tools.js"; import { registerPrTools } from "./pr-tools.js"; import { loadRepoTools, type RepoToolParam } from "./repo-tools.js"; import { toToolError } from "./tool-error.js"; +import { registerWhiteboardTools } from "./whiteboard-tools.js"; export type McpAgent = { id: string; @@ -126,6 +127,8 @@ const AGENT_TOOLS = new Set([ "create_template", "update_template", "delete_template", + "whiteboard_get", + "whiteboard_update", ]); const JOB_TOOLS = new Set([ @@ -470,6 +473,18 @@ export type McpRequestContext = { toolScope?: "agent" | "reviewer" | "job"; brainStore?: BrainStore; publishBrainChanged?: (repoRoot: string) => void; + getWhiteboard?: ( + agentId: string + ) => Promise<{ + scene: unknown; + version: number; + elements: unknown[]; + snapshotPath: string | null; + }>; + updateWhiteboard?: ( + agentId: string, + ops: unknown[] + ) => Promise<{ version: number; elementCount: number }>; }; export async function handleMcpRequest( @@ -605,6 +620,15 @@ async function createDispatchMcpServer( context.getFeedbackSummary ?? context.jobTools?.getFeedbackSummary, }); + // ── Whiteboard tools ────────────────────────────────────────────── + if (context.agent && context.getWhiteboard && context.updateWhiteboard) { + registerWhiteboardTools(server, allowed, { + agentId: context.agent.id, + getWhiteboard: context.getWhiteboard, + updateWhiteboard: context.updateWhiteboard, + }); + } + // ── Job & template CRUD tools ───────────────────────────────────── if (context.crudTools) { registerCrudTools(server, allowed, { diff --git a/apps/server/src/shared/mcp/whiteboard-tools.ts b/apps/server/src/shared/mcp/whiteboard-tools.ts new file mode 100644 index 00000000..64b6f154 --- /dev/null +++ b/apps/server/src/shared/mcp/whiteboard-tools.ts @@ -0,0 +1,133 @@ +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import * as z from "zod/v4"; + +import { toToolError } from "./tool-error.js"; + +type WhiteboardToolDeps = { + agentId: string; + getWhiteboard: ( + agentId: string + ) => Promise<{ + scene: unknown; + version: number; + elements: unknown[]; + snapshotPath: string | null; + }>; + updateWhiteboard: ( + agentId: string, + ops: unknown[] + ) => Promise<{ version: number; elementCount: number }>; +}; + +export function registerWhiteboardTools( + server: McpServer, + allowed: Set, + deps: WhiteboardToolDeps +): void { + if (allowed.has("whiteboard_get")) { + server.registerTool( + "whiteboard_get", + { + description: + "Get the current whiteboard state for this agent. Returns the scene data, a simplified element list, and the path to the latest PNG snapshot (if available).", + inputSchema: {}, + }, + async () => { + try { + const result = await deps.getWhiteboard(deps.agentId); + return { + content: [{ type: "text", text: JSON.stringify(result) }], + structuredContent: result, + }; + } catch (error) { + return toToolError(error); + } + } + ); + } + + if (allowed.has("whiteboard_update")) { + server.registerTool( + "whiteboard_update", + { + description: + "Update the agent's whiteboard by applying operations. Supports adding shapes (rect, ellipse, diamond, arrow, line, text, frame), updating existing shapes, and deleting shapes. Returns the new version and element count.", + inputSchema: { + ops: z + .array( + z.object({ + op: z.enum(["add", "update", "delete"]), + type: z + .enum([ + "rect", + "ellipse", + "diamond", + "arrow", + "line", + "text", + "frame", + ]) + .optional(), + id: z + .string() + .optional() + .describe( + "Shape identifier. Required for update/delete. Optional for add (auto-generated if omitted)." + ), + x: z.number().optional(), + y: z.number().optional(), + w: z.number().optional(), + h: z.number().optional(), + label: z.string().optional(), + from: z + .string() + .optional() + .describe("Arrow binding source shape id."), + to: z + .string() + .optional() + .describe("Arrow binding target shape id."), + color: z + .string() + .optional() + .describe( + "Shape color. Valid: black, grey, light-violet, violet, blue, light-blue, yellow, orange, green, light-green, light-red, red, white." + ), + fill: z + .string() + .optional() + .describe("Fill style: none, semi, solid, pattern."), + style: z + .enum(["solid", "dashed", "dotted"]) + .optional() + .describe("Line style."), + startHead: z + .enum(["none", "arrow", "triangle", "bar", "dot", "diamond"]) + .optional(), + endHead: z + .enum(["none", "arrow", "triangle", "bar", "dot", "diamond"]) + .optional(), + }) + ) + .describe("Array of whiteboard operations to apply."), + }, + }, + async (args) => { + try { + const result = await deps.updateWhiteboard(deps.agentId, args.ops); + return { + content: [ + { + type: "text", + text: `Whiteboard updated: ${result.elementCount} elements, version ${result.version}.`, + }, + ], + structuredContent: result, + }; + } catch (error) { + return toToolError(error); + } + } + ); + } +} diff --git a/apps/server/src/shared/whiteboard-builder.ts b/apps/server/src/shared/whiteboard-builder.ts new file mode 100644 index 00000000..58b47dba --- /dev/null +++ b/apps/server/src/shared/whiteboard-builder.ts @@ -0,0 +1,315 @@ +import { createShapeId } from "@tldraw/tlschema"; + +import type { WhiteboardOp, WhiteboardScene } from "./whiteboard.js"; + +const TLDRAW_COLORS = new Set([ + "black", + "grey", + "light-violet", + "violet", + "blue", + "light-blue", + "yellow", + "orange", + "green", + "light-green", + "light-red", + "red", + "white", +]); + +const TLDRAW_FILLS = new Set(["none", "semi", "solid", "pattern"]); + +const TLDRAW_DASH = new Set(["draw", "solid", "dashed", "dotted"]); + +const TLDRAW_ARROWHEADS = new Set([ + "arrow", + "triangle", + "square", + "dot", + "pipe", + "diamond", + "inverted", + "bar", + "none", +]); + +type GeoType = "rectangle" | "ellipse" | "diamond"; + +const GEO_MAP: Record = { + rect: "rectangle", + ellipse: "ellipse", + diamond: "diamond", +}; + +function resolveColor(color: string | undefined): string { + if (!color) return "black"; + if (TLDRAW_COLORS.has(color)) return color; + const lower = color.toLowerCase(); + if (TLDRAW_COLORS.has(lower)) return lower; + return "black"; +} + +function resolveFill(fill: string | undefined): string { + if (!fill) return "none"; + if (TLDRAW_FILLS.has(fill)) return fill; + return "none"; +} + +function resolveDash(style: string | undefined): string { + if (!style) return "solid"; + if (TLDRAW_DASH.has(style)) return style; + return "solid"; +} + +function resolveArrowhead(head: string | undefined): string { + if (!head) return "none"; + if (TLDRAW_ARROWHEADS.has(head)) return head; + return "none"; +} + +function makeShapeId(userProvidedId?: string): string { + if (userProvidedId) { + if (userProvidedId.startsWith("shape:")) return userProvidedId; + return createShapeId(userProvidedId); + } + return createShapeId(); +} + +function textToRichText(text: string): unknown { + return { + type: "doc", + content: [ + { + type: "paragraph", + content: [{ type: "text", text }], + }, + ], + }; +} + +function buildGeoShape( + op: WhiteboardOp, + geo: GeoType +): Record { + const id = makeShapeId(op.id); + return { + id, + typeName: "shape", + type: "geo", + x: op.x ?? 0, + y: op.y ?? 0, + rotation: 0, + isLocked: false, + opacity: 1, + meta: {}, + parentId: "page:page", + index: "a1", + props: { + geo, + w: op.w ?? 200, + h: op.h ?? 200, + growY: 0, + color: resolveColor(op.color), + fill: resolveFill(op.fill), + dash: resolveDash(op.style), + size: "m", + font: "draw", + align: "middle", + verticalAlign: "middle", + labelColor: "black", + url: "", + scale: 1, + richText: op.label ? textToRichText(op.label) : textToRichText(""), + }, + }; +} + +function buildTextShape(op: WhiteboardOp): Record { + const id = makeShapeId(op.id); + return { + id, + typeName: "shape", + type: "text", + x: op.x ?? 0, + y: op.y ?? 0, + rotation: 0, + isLocked: false, + opacity: 1, + meta: {}, + parentId: "page:page", + index: "a1", + props: { + color: resolveColor(op.color), + size: "m", + font: "draw", + textAlign: "start", + w: op.w ?? 200, + autoSize: !op.w, + scale: 1, + richText: textToRichText(op.label ?? ""), + }, + }; +} + +function buildArrowShape(op: WhiteboardOp): Record { + const id = makeShapeId(op.id); + const startX = op.x ?? 0; + const startY = op.y ?? 0; + const endX = startX + (op.w ?? 200); + const endY = startY + (op.h ?? 0); + + const start = op.from + ? { + type: "binding", + boundShapeId: makeShapeId(op.from), + normalizedAnchor: { x: 0.5, y: 0.5 }, + isExact: false, + isPrecise: false, + } + : { type: "point", x: startX, y: startY }; + + const end = op.to + ? { + type: "binding", + boundShapeId: makeShapeId(op.to), + normalizedAnchor: { x: 0.5, y: 0.5 }, + isExact: false, + isPrecise: false, + } + : { type: "point", x: endX, y: endY }; + + return { + id, + typeName: "shape", + type: "arrow", + x: op.from ? 0 : startX, + y: op.from ? 0 : startY, + rotation: 0, + isLocked: false, + opacity: 1, + meta: {}, + parentId: "page:page", + index: "a1", + props: { + kind: "elbow", + color: resolveColor(op.color), + fill: resolveFill(op.fill), + dash: resolveDash(op.style), + size: "m", + font: "draw", + arrowheadStart: resolveArrowhead(op.startHead), + arrowheadEnd: resolveArrowhead(op.endHead ?? "arrow"), + start, + end, + bend: 0, + labelColor: "black", + richText: op.label ? textToRichText(op.label) : textToRichText(""), + labelPosition: 0.5, + scale: 1, + elbowMidPoint: 0.5, + }, + }; +} + +function buildFrameShape(op: WhiteboardOp): Record { + const id = makeShapeId(op.id); + return { + id, + typeName: "shape", + type: "frame", + x: op.x ?? 0, + y: op.y ?? 0, + rotation: 0, + isLocked: false, + opacity: 1, + meta: {}, + parentId: "page:page", + index: "a1", + props: { + w: op.w ?? 400, + h: op.h ?? 300, + name: op.label ?? "", + color: resolveColor(op.color), + }, + }; +} + +function buildLineShape(op: WhiteboardOp): Record { + return buildArrowShape({ + ...op, + startHead: op.startHead ?? "none", + endHead: op.endHead ?? "none", + }); +} + +function buildShape(op: WhiteboardOp): Record | null { + const shapeType = op.type ?? "rect"; + const geo = GEO_MAP[shapeType]; + if (geo) return buildGeoShape(op, geo); + if (shapeType === "text") return buildTextShape(op); + if (shapeType === "arrow") return buildArrowShape(op); + if (shapeType === "frame") return buildFrameShape(op); + if (shapeType === "line") return buildLineShape(op); + return null; +} + +export function applyOps( + scene: WhiteboardScene, + ops: WhiteboardOp[] +): WhiteboardScene { + const records = [...(scene.records ?? [])]; + const indexById = new Map(); + for (let i = 0; i < records.length; i++) { + const id = records[i].id as string; + if (id) indexById.set(id, i); + } + + let nextIndex = records.length; + + for (const op of ops) { + if (op.op === "add") { + const shape = buildShape(op); + if (!shape) continue; + shape.index = `a${nextIndex++}`; + const existingIdx = indexById.get(shape.id as string); + if (existingIdx !== undefined) { + records[existingIdx] = shape; + } else { + indexById.set(shape.id as string, records.length); + records.push(shape); + } + } else if (op.op === "update") { + const targetId = op.id ? makeShapeId(op.id) : undefined; + if (!targetId) continue; + const idx = indexById.get(targetId); + if (idx === undefined) continue; + const existing = { ...records[idx] }; + const props = { ...((existing.props ?? {}) as Record) }; + if (op.x !== undefined) existing.x = op.x; + if (op.y !== undefined) existing.y = op.y; + if (op.w !== undefined) props.w = op.w; + if (op.h !== undefined) props.h = op.h; + if (op.label !== undefined) props.richText = textToRichText(op.label); + if (op.color !== undefined) props.color = resolveColor(op.color); + if (op.fill !== undefined) props.fill = resolveFill(op.fill); + if (op.style !== undefined) props.dash = resolveDash(op.style); + existing.props = props; + records[idx] = existing; + } else if (op.op === "delete") { + const targetId = op.id ? makeShapeId(op.id) : undefined; + if (!targetId) continue; + const idx = indexById.get(targetId); + if (idx === undefined) continue; + records.splice(idx, 1); + indexById.delete(targetId); + for (const [key, val] of indexById) { + if (val > idx) indexById.set(key, val - 1); + } + } + } + + return { records }; +} + +export { makeShapeId }; diff --git a/apps/server/src/shared/whiteboard-store.ts b/apps/server/src/shared/whiteboard-store.ts new file mode 100644 index 00000000..f0c3274c --- /dev/null +++ b/apps/server/src/shared/whiteboard-store.ts @@ -0,0 +1,80 @@ +import type { Pool } from "pg"; + +import type { WhiteboardScene } from "./whiteboard.js"; + +export type WhiteboardRow = { + agent_id: string; + scene: WhiteboardScene; + version: number; +}; + +const OPTIMISTIC_LOCK_MAX_RETRIES = 3; + +export async function getWhiteboard( + pool: Pool, + agentId: string +): Promise { + const result = await pool.query( + `SELECT agent_id, scene, version FROM whiteboards WHERE agent_id = $1`, + [agentId] + ); + return result.rows[0] ?? null; +} + +export async function saveWhiteboard( + pool: Pool, + agentId: string, + scene: WhiteboardScene, + expectedVersion: number | null +): Promise<{ version: number }> { + for (let attempt = 0; attempt < OPTIMISTIC_LOCK_MAX_RETRIES; attempt++) { + const currentVersion = + expectedVersion ?? (await getCurrentVersion(pool, agentId)); + + if (currentVersion === null) { + const result = await pool.query<{ version: number }>( + `INSERT INTO whiteboards (agent_id, scene, version) + VALUES ($1, $2, 1) + ON CONFLICT (agent_id) DO UPDATE + SET scene = $2, version = whiteboards.version + 1, updated_at = NOW() + WHERE whiteboards.version = 0 + RETURNING version`, + [agentId, JSON.stringify(scene)] + ); + if (result.rows.length > 0) { + return { version: result.rows[0].version }; + } + const inserted = await pool.query<{ version: number }>( + `SELECT version FROM whiteboards WHERE agent_id = $1`, + [agentId] + ); + if (inserted.rows[0]?.version === 1) { + return { version: 1 }; + } + continue; + } + + const result = await pool.query<{ version: number }>( + `UPDATE whiteboards + SET scene = $1, version = version + 1, updated_at = NOW() + WHERE agent_id = $2 AND version = $3 + RETURNING version`, + [JSON.stringify(scene), agentId, currentVersion] + ); + if (result.rows.length > 0) { + return { version: result.rows[0].version }; + } + } + throw new Error("Optimistic lock conflict after retries"); +} + +async function getCurrentVersion( + pool: Pool, + agentId: string +): Promise { + const result = await pool.query<{ version: number }>( + `SELECT version FROM whiteboards WHERE agent_id = $1`, + [agentId] + ); + return result.rows[0]?.version ?? null; +} diff --git a/apps/server/src/shared/whiteboard.ts b/apps/server/src/shared/whiteboard.ts new file mode 100644 index 00000000..be723ce9 --- /dev/null +++ b/apps/server/src/shared/whiteboard.ts @@ -0,0 +1,75 @@ +export type WhiteboardOp = { + op: "add" | "update" | "delete"; + type?: "rect" | "ellipse" | "diamond" | "arrow" | "line" | "text" | "frame"; + id?: string; + x?: number; + y?: number; + w?: number; + h?: number; + label?: string; + from?: string; + to?: string; + color?: string; + fill?: string; + style?: "solid" | "dashed" | "dotted"; + startHead?: "none" | "arrow" | "triangle" | "bar" | "dot" | "diamond"; + endHead?: "none" | "arrow" | "triangle" | "bar" | "dot" | "diamond"; +}; + +export type SimplifiedElement = { + id: string; + type: string; + x: number; + y: number; + w: number; + h: number; + label?: string; + color?: string; + fill?: string; + from?: string; + to?: string; +}; + +export type WhiteboardScene = { + records: Record[]; +}; + +export type WhiteboardGetResult = { + scene: WhiteboardScene; + version: number; + elements: SimplifiedElement[]; + snapshotPath: string | null; +}; + +export type WhiteboardUpdateResult = { + version: number; + elementCount: number; +}; + +export function simplifyElements( + records: Record[] +): SimplifiedElement[] { + return records + .filter( + (r) => + typeof r.typeName === "string" && + r.typeName === "shape" && + typeof r.type === "string" + ) + .map((r) => { + const props = (r.props ?? {}) as Record; + const el: SimplifiedElement = { + id: String(r.id), + type: String(r.type), + x: typeof r.x === "number" ? r.x : 0, + y: typeof r.y === "number" ? r.y : 0, + w: typeof props.w === "number" ? props.w : 0, + h: typeof props.h === "number" ? props.h : 0, + }; + if (props.text && typeof props.text === "string") el.label = props.text; + if (props.color && typeof props.color === "string") + el.color = props.color; + if (props.fill && typeof props.fill === "string") el.fill = props.fill; + return el; + }); +} diff --git a/apps/server/test/whiteboard-builder.test.ts b/apps/server/test/whiteboard-builder.test.ts new file mode 100644 index 00000000..2a5ddb41 --- /dev/null +++ b/apps/server/test/whiteboard-builder.test.ts @@ -0,0 +1,316 @@ +import { describe, it, expect } from "vitest"; + +import { applyOps, makeShapeId } from "../src/shared/whiteboard-builder.js"; +import type { + WhiteboardOp, + WhiteboardScene, +} from "../src/shared/whiteboard.js"; + +function emptyScene(): WhiteboardScene { + return { records: [] }; +} + +describe("applyOps", () => { + describe("add operations", () => { + it("adds a rect shape", () => { + const ops: WhiteboardOp[] = [ + { + op: "add", + type: "rect", + id: "r1", + x: 10, + y: 20, + w: 100, + h: 50, + label: "Box", + }, + ]; + const result = applyOps(emptyScene(), ops); + expect(result.records).toHaveLength(1); + const shape = result.records[0]; + expect(shape.type).toBe("geo"); + expect((shape.props as Record).geo).toBe("rectangle"); + expect(shape.x).toBe(10); + expect(shape.y).toBe(20); + expect((shape.props as Record).w).toBe(100); + expect((shape.props as Record).h).toBe(50); + }); + + it("adds an ellipse shape", () => { + const ops: WhiteboardOp[] = [ + { op: "add", type: "ellipse", id: "e1", x: 0, y: 0 }, + ]; + const result = applyOps(emptyScene(), ops); + expect(result.records).toHaveLength(1); + expect((result.records[0].props as Record).geo).toBe( + "ellipse" + ); + }); + + it("adds a diamond shape", () => { + const ops: WhiteboardOp[] = [{ op: "add", type: "diamond", id: "d1" }]; + const result = applyOps(emptyScene(), ops); + expect(result.records).toHaveLength(1); + expect((result.records[0].props as Record).geo).toBe( + "diamond" + ); + }); + + it("adds a text shape", () => { + const ops: WhiteboardOp[] = [ + { op: "add", type: "text", id: "t1", label: "Hello world" }, + ]; + const result = applyOps(emptyScene(), ops); + expect(result.records).toHaveLength(1); + expect(result.records[0].type).toBe("text"); + const richText = (result.records[0].props as Record) + .richText as { + content: Array<{ content: Array<{ text: string }> }>; + }; + expect(richText.content[0].content[0].text).toBe("Hello world"); + }); + + it("adds an arrow shape with bindings", () => { + const ops: WhiteboardOp[] = [ + { op: "add", type: "rect", id: "a", x: 0, y: 0 }, + { op: "add", type: "rect", id: "b", x: 300, y: 0 }, + { op: "add", type: "arrow", id: "arr1", from: "a", to: "b" }, + ]; + const result = applyOps(emptyScene(), ops); + expect(result.records).toHaveLength(3); + const arrow = result.records[2]; + expect(arrow.type).toBe("arrow"); + const props = arrow.props as Record; + expect((props.start as Record).type).toBe("binding"); + expect((props.end as Record).type).toBe("binding"); + }); + + it("adds an arrow shape with point coordinates", () => { + const ops: WhiteboardOp[] = [ + { op: "add", type: "arrow", id: "arr2", x: 10, y: 20, w: 200, h: 100 }, + ]; + const result = applyOps(emptyScene(), ops); + const props = result.records[0].props as Record; + expect((props.start as Record).type).toBe("point"); + expect((props.end as Record).type).toBe("point"); + }); + + it("adds a frame shape", () => { + const ops: WhiteboardOp[] = [ + { + op: "add", + type: "frame", + id: "f1", + x: 0, + y: 0, + w: 400, + h: 300, + label: "Section", + }, + ]; + const result = applyOps(emptyScene(), ops); + expect(result.records).toHaveLength(1); + expect(result.records[0].type).toBe("frame"); + expect((result.records[0].props as Record).name).toBe( + "Section" + ); + }); + + it("adds a line shape (arrow with no arrowheads)", () => { + const ops: WhiteboardOp[] = [ + { op: "add", type: "line", id: "l1", x: 0, y: 0, w: 100, h: 100 }, + ]; + const result = applyOps(emptyScene(), ops); + expect(result.records).toHaveLength(1); + expect(result.records[0].type).toBe("arrow"); + const props = result.records[0].props as Record; + expect(props.arrowheadStart).toBe("none"); + expect(props.arrowheadEnd).toBe("none"); + }); + + it("uses default dimensions when not specified", () => { + const ops: WhiteboardOp[] = [{ op: "add", type: "rect", id: "def1" }]; + const result = applyOps(emptyScene(), ops); + const props = result.records[0].props as Record; + expect(props.w).toBe(200); + expect(props.h).toBe(200); + }); + }); + + describe("color/fill/style resolution", () => { + it("resolves valid colors", () => { + const ops: WhiteboardOp[] = [ + { op: "add", type: "rect", id: "c1", color: "blue" }, + ]; + const result = applyOps(emptyScene(), ops); + expect((result.records[0].props as Record).color).toBe( + "blue" + ); + }); + + it("defaults invalid colors to black", () => { + const ops: WhiteboardOp[] = [ + { op: "add", type: "rect", id: "c2", color: "neon-pink" }, + ]; + const result = applyOps(emptyScene(), ops); + expect((result.records[0].props as Record).color).toBe( + "black" + ); + }); + + it("resolves valid fills", () => { + const ops: WhiteboardOp[] = [ + { op: "add", type: "rect", id: "f1", fill: "solid" }, + ]; + const result = applyOps(emptyScene(), ops); + expect((result.records[0].props as Record).fill).toBe( + "solid" + ); + }); + + it("defaults invalid fills to none", () => { + const ops: WhiteboardOp[] = [ + { + op: "add", + type: "rect", + id: "f2", + fill: "gradient" as unknown as string, + }, + ]; + const result = applyOps(emptyScene(), ops); + expect((result.records[0].props as Record).fill).toBe( + "none" + ); + }); + + it("resolves valid dash styles", () => { + const ops: WhiteboardOp[] = [ + { op: "add", type: "rect", id: "s1", style: "dashed" }, + ]; + const result = applyOps(emptyScene(), ops); + expect((result.records[0].props as Record).dash).toBe( + "dashed" + ); + }); + + it("defaults undefined style to solid", () => { + const ops: WhiteboardOp[] = [{ op: "add", type: "rect", id: "s2" }]; + const result = applyOps(emptyScene(), ops); + expect((result.records[0].props as Record).dash).toBe( + "solid" + ); + }); + }); + + describe("update operations", () => { + it("updates position and label", () => { + const scene = applyOps(emptyScene(), [ + { op: "add", type: "rect", id: "u1", x: 0, y: 0, label: "Old" }, + ]); + const result = applyOps(scene, [ + { op: "update", id: "u1", x: 50, y: 60, label: "New" }, + ]); + expect(result.records).toHaveLength(1); + expect(result.records[0].x).toBe(50); + expect(result.records[0].y).toBe(60); + const richText = (result.records[0].props as Record) + .richText as { + content: Array<{ content: Array<{ text: string }> }>; + }; + expect(richText.content[0].content[0].text).toBe("New"); + }); + + it("updates color and fill", () => { + const scene = applyOps(emptyScene(), [ + { op: "add", type: "rect", id: "u2", color: "black" }, + ]); + const result = applyOps(scene, [ + { op: "update", id: "u2", color: "red", fill: "solid" }, + ]); + const props = result.records[0].props as Record; + expect(props.color).toBe("red"); + expect(props.fill).toBe("solid"); + }); + + it("skips update when id not found", () => { + const scene = applyOps(emptyScene(), [ + { op: "add", type: "rect", id: "exists" }, + ]); + const result = applyOps(scene, [ + { op: "update", id: "nonexistent", x: 999 }, + ]); + expect(result.records).toHaveLength(1); + expect(result.records[0].x).not.toBe(999); + }); + }); + + describe("delete operations", () => { + it("deletes a shape by id", () => { + const scene = applyOps(emptyScene(), [ + { op: "add", type: "rect", id: "d1", x: 0, y: 0 }, + { op: "add", type: "rect", id: "d2", x: 100, y: 0 }, + ]); + const result = applyOps(scene, [{ op: "delete", id: "d1" }]); + expect(result.records).toHaveLength(1); + expect(result.records[0].id).toContain("d2"); + }); + + it("skips delete when id not found", () => { + const scene = applyOps(emptyScene(), [ + { op: "add", type: "rect", id: "keep" }, + ]); + const result = applyOps(scene, [{ op: "delete", id: "gone" }]); + expect(result.records).toHaveLength(1); + }); + }); + + describe("mixed operations", () => { + it("handles add + update + delete in sequence", () => { + const ops: WhiteboardOp[] = [ + { op: "add", type: "rect", id: "m1", x: 0, y: 0, label: "A" }, + { op: "add", type: "rect", id: "m2", x: 100, y: 0, label: "B" }, + { op: "add", type: "rect", id: "m3", x: 200, y: 0, label: "C" }, + { op: "update", id: "m2", label: "B-updated" }, + { op: "delete", id: "m1" }, + ]; + const result = applyOps(emptyScene(), ops); + expect(result.records).toHaveLength(2); + const ids = result.records.map((r) => r.id as string); + expect(ids.some((id) => id.includes("m1"))).toBe(false); + expect(ids.some((id) => id.includes("m2"))).toBe(true); + }); + + it("replaces existing shape on duplicate add", () => { + const scene = applyOps(emptyScene(), [ + { op: "add", type: "rect", id: "dup", x: 0, y: 0 }, + ]); + const result = applyOps(scene, [ + { op: "add", type: "ellipse", id: "dup", x: 50, y: 50 }, + ]); + expect(result.records).toHaveLength(1); + expect((result.records[0].props as Record).geo).toBe( + "ellipse" + ); + expect(result.records[0].x).toBe(50); + }); + }); +}); + +describe("makeShapeId", () => { + it("returns a shape: prefixed id for plain strings", () => { + const id = makeShapeId("test123"); + expect(id).toMatch(/^shape:/); + }); + + it("passes through already-prefixed ids", () => { + const id = makeShapeId("shape:already"); + expect(id).toBe("shape:already"); + }); + + it("generates a unique id when no argument given", () => { + const a = makeShapeId(); + const b = makeShapeId(); + expect(a).toMatch(/^shape:/); + expect(a).not.toBe(b); + }); +}); diff --git a/apps/server/test/whiteboard.test.ts b/apps/server/test/whiteboard.test.ts new file mode 100644 index 00000000..64f7a0d3 --- /dev/null +++ b/apps/server/test/whiteboard.test.ts @@ -0,0 +1,98 @@ +import { describe, it, expect } from "vitest"; + +import { simplifyElements } from "../src/shared/whiteboard.js"; + +describe("simplifyElements", () => { + it("extracts basic fields from shape records", () => { + const records = [ + { + id: "shape:abc", + typeName: "shape", + type: "geo", + x: 10, + y: 20, + props: { w: 100, h: 50, color: "blue", fill: "solid" }, + }, + ]; + const result = simplifyElements(records); + expect(result).toEqual([ + { + id: "shape:abc", + type: "geo", + x: 10, + y: 20, + w: 100, + h: 50, + color: "blue", + fill: "solid", + }, + ]); + }); + + it("filters out non-shape records", () => { + const records = [ + { id: "page:page", typeName: "page", type: "page", x: 0, y: 0 }, + { + id: "shape:s1", + typeName: "shape", + type: "text", + x: 0, + y: 0, + props: { w: 100, h: 50 }, + }, + ]; + const result = simplifyElements(records); + expect(result).toHaveLength(1); + expect(result[0].id).toBe("shape:s1"); + }); + + it("defaults coordinates and dimensions to 0 when missing", () => { + const records = [ + { + id: "shape:missing", + typeName: "shape", + type: "geo", + props: {}, + }, + ]; + const result = simplifyElements(records); + expect(result[0].x).toBe(0); + expect(result[0].y).toBe(0); + expect(result[0].w).toBe(0); + expect(result[0].h).toBe(0); + }); + + it("omits label when not present", () => { + const records = [ + { + id: "shape:nolabel", + typeName: "shape", + type: "geo", + x: 0, + y: 0, + props: { w: 100, h: 100 }, + }, + ]; + const result = simplifyElements(records); + expect(result[0].label).toBeUndefined(); + }); + + it("includes text label when present in props", () => { + const records = [ + { + id: "shape:withlabel", + typeName: "shape", + type: "text", + x: 0, + y: 0, + props: { w: 100, h: 50, text: "Hello" }, + }, + ]; + const result = simplifyElements(records); + expect(result[0].label).toBe("Hello"); + }); + + it("returns empty array for empty input", () => { + expect(simplifyElements([])).toEqual([]); + }); +}); diff --git a/apps/web/package.json b/apps/web/package.json index 22a2fd3f..bb6eeccf 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -48,7 +48,8 @@ "remark-gfm": "^4.0.1", "simple-icons": "^16.11.0", "sonner": "^2.0.7", - "tailwind-merge": "^2.5.4" + "tailwind-merge": "^2.5.4", + "tldraw": "5.2.4" }, "devDependencies": { "@eslint/js": "^9.39.4", diff --git a/apps/web/src/components/app/agents-view.tsx b/apps/web/src/components/app/agents-view.tsx index b5f9ba8d..b03bb144 100644 --- a/apps/web/src/components/app/agents-view.tsx +++ b/apps/web/src/components/app/agents-view.tsx @@ -71,6 +71,8 @@ import { useMediaSidebarState } from "@/hooks/use-media-sidebar-state"; import { useTerminal } from "@/hooks/use-terminal"; import { useAgentFocus } from "@/hooks/use-agent-focus"; import { useAgentsViewRouting } from "@/hooks/use-agents-view-routing"; +import { useTheme } from "@/hooks/use-theme"; +import { WhiteboardPane } from "@/components/app/whiteboard-pane"; import { LaunchTemplateDialog } from "@/components/app/automations-launch-dialog"; import { CommandPalette } from "@/components/app/command-palette"; import { useAgentHotkeys } from "@/hooks/use-agent-hotkeys"; @@ -134,8 +136,11 @@ export function AgentsView({ routeAgentId ?? null ); + const { theme } = useTheme(); + const { changesMatch, + whiteboardMatch, feedbackDetail, feedbackDetailRendered, handleFeedbackTransitionEnd, @@ -300,11 +305,15 @@ export function AgentsView({ const handleDropOnZone = useCallback( (tab: string, side: "left" | "right") => { - const activeTab: CenterTab = changesMatch ? "changes" : "terminal"; + const activeTab: CenterTab = changesMatch + ? "changes" + : whiteboardMatch + ? "whiteboard" + : "terminal"; handleTabDrop(tab as CenterTab, side, activeTab); setIsDraggingTab(false); }, - [changesMatch, handleTabDrop] + [changesMatch, whiteboardMatch, handleTabDrop] ); const handleSplitLayoutChange = useCallback( @@ -678,7 +687,13 @@ export function AgentsView({ {focusedAgent.name} { if (isSplit) { exitSplit(); @@ -689,6 +704,7 @@ export function AgentsView({ isSplit={isSplit} splitState={splitState} isMobile={isMobile} + agentId={focusedAgentId ?? null} /> ) : null} @@ -747,7 +763,9 @@ export function AgentsView({ {splitState.left === "terminal" ? "Terminal" - : "Changes"} + : splitState.left === "whiteboard" + ? "Whiteboard" + : "Changes"} {splitState.left === "changes" && !isMobile ? ( @@ -759,6 +777,12 @@ export function AgentsView({ ref={splitTerminalSlotRef} className="h-full" /> + ) : splitState.left === "whiteboard" ? ( + ) : ( changesElement )} @@ -776,7 +800,9 @@ export function AgentsView({ {splitState.right === "terminal" ? "Terminal" - : "Changes"} + : splitState.right === "whiteboard" + ? "Whiteboard" + : "Changes"} {splitState.right === "changes" && !isMobile ? ( @@ -788,6 +814,12 @@ export function AgentsView({ ref={splitTerminalSlotRef} className="h-full" /> + ) : splitState.right === "whiteboard" ? ( + ) : ( changesElement )} @@ -811,10 +843,23 @@ export function AgentsView({ <>
+ + } + /> )} diff --git a/apps/web/src/components/app/center-pane-tab-bar.tsx b/apps/web/src/components/app/center-pane-tab-bar.tsx index e8ba9393..c38eb884 100644 --- a/apps/web/src/components/app/center-pane-tab-bar.tsx +++ b/apps/web/src/components/app/center-pane-tab-bar.tsx @@ -1,8 +1,14 @@ import { memo, useCallback } from "react"; +import { useAtomValue } from "jotai"; + import type { DiffStats } from "@/components/app/types"; import { TipSpot } from "@/components/tips/tip-spot"; -import { type CenterTab, type SplitPaneState } from "@/lib/store"; +import { + type CenterTab, + type SplitPaneState, + whiteboardAgentDrewAtomFamily, +} from "@/lib/store"; import { cn } from "@/lib/utils"; export const TAB_DRAG_MIME = "application/x-dispatch-tab"; @@ -15,6 +21,7 @@ type TabDef = { const TABS: TabDef[] = [ { id: "terminal", label: "Terminal" }, { id: "changes", label: "Changes" }, + { id: "whiteboard", label: "Whiteboard" }, ]; type CenterPaneTabBarProps = { @@ -24,6 +31,7 @@ type CenterPaneTabBarProps = { isSplit: boolean; splitState: SplitPaneState; isMobile: boolean; + agentId: string | null; }; export const CenterPaneTabBar = memo(function CenterPaneTabBar({ @@ -33,9 +41,13 @@ export const CenterPaneTabBar = memo(function CenterPaneTabBar({ isSplit, splitState, isMobile, + agentId, }: CenterPaneTabBarProps): JSX.Element { const hasChanges = diffStats && (diffStats.added > 0 || diffStats.deleted > 0); + const whiteboardAgentDrew = useAtomValue( + whiteboardAgentDrewAtomFamily(agentId ?? "") + ); const splitTabs = isSplit ? new Set([splitState.left, splitState.right]) @@ -94,6 +106,11 @@ export const CenterPaneTabBar = memo(function CenterPaneTabBar({ ) : null} + {tab.id === "whiteboard" && + whiteboardAgentDrew && + activeTab !== "whiteboard" ? ( + + ) : null} ); diff --git a/apps/web/src/components/app/whiteboard-pane.tsx b/apps/web/src/components/app/whiteboard-pane.tsx new file mode 100644 index 00000000..12649862 --- /dev/null +++ b/apps/web/src/components/app/whiteboard-pane.tsx @@ -0,0 +1,47 @@ +import { lazy, Suspense, useEffect } from "react"; +import { useSetAtom } from "jotai"; + +import { whiteboardAgentDrewAtomFamily } from "@/lib/store"; +import type { ThemeId } from "@/hooks/use-theme"; + +const WhiteboardTab = lazy(() => + import("@/components/app/whiteboard-tab").then((m) => ({ + default: m.WhiteboardTab, + })) +); + +type WhiteboardPaneProps = { + agentId: string | null; + active: boolean; + theme: ThemeId; +}; + +export function WhiteboardPane({ + agentId, + active, + theme, +}: WhiteboardPaneProps) { + const setAgentDrew = useSetAtom(whiteboardAgentDrewAtomFamily(agentId ?? "")); + + useEffect(() => { + if (active && agentId) { + setAgentDrew(false); + } + }, [active, agentId, setAgentDrew]); + + if (!agentId) return null; + + return ( +
+ + Loading whiteboard… +
+ } + > + + +
+ ); +} diff --git a/apps/web/src/components/app/whiteboard-tab.tsx b/apps/web/src/components/app/whiteboard-tab.tsx new file mode 100644 index 00000000..bb4fa9c4 --- /dev/null +++ b/apps/web/src/components/app/whiteboard-tab.tsx @@ -0,0 +1,158 @@ +import { useCallback, useEffect, useRef, useState } from "react"; +import { Tldraw, type Editor, type TLStoreSnapshot } from "tldraw"; +import "tldraw/tldraw.css"; + +import { THEMES, type ThemeId } from "@/hooks/use-theme"; +import { + useWhiteboard, + useSaveWhiteboard, + useUploadWhiteboardSnapshot, + type WhiteboardScene, +} from "@/hooks/use-whiteboard"; + +type WhiteboardTabProps = { + agentId: string | null; + theme: ThemeId; +}; + +function sceneToSnapshot(scene: WhiteboardScene): TLStoreSnapshot | undefined { + if (!scene.records || scene.records.length === 0) return undefined; + const store: Record = {}; + for (const record of scene.records) { + const id = record.id as string; + if (id) store[id] = record; + } + return { store, schema: undefined } as unknown as TLStoreSnapshot; +} + +const SAVE_DEBOUNCE_MS = 2000; +const SNAPSHOT_DEBOUNCE_MS = 4000; + +export function WhiteboardTab({ agentId, theme }: WhiteboardTabProps) { + const { data } = useWhiteboard(agentId); + const saveMutation = useSaveWhiteboard(agentId); + const snapshotMutation = useUploadWhiteboardSnapshot(agentId); + const editorRef = useRef(null); + const saveTimerRef = useRef | null>(null); + const snapshotTimerRef = useRef | null>(null); + const pointerDownRef = useRef(false); + const pendingSaveRef = useRef(false); + const lastSavedVersionRef = useRef(0); + const [initialSnapshot] = useState(() => + data ? sceneToSnapshot(data.scene) : undefined + ); + + const themeMode = THEMES.find((t) => t.id === theme)?.mode ?? "dark"; + + const debouncedSave = useCallback(() => { + if (saveTimerRef.current) clearTimeout(saveTimerRef.current); + saveTimerRef.current = setTimeout(() => { + const editor = editorRef.current; + if (!editor) return; + const snapshot = editor.getSnapshot(); + const records = Object.values( + snapshot.document.store + ) as unknown as Record[]; + saveMutation.mutate({ records }); + }, SAVE_DEBOUNCE_MS); + }, [saveMutation]); + + const debouncedSnapshot = useCallback(() => { + if (snapshotTimerRef.current) clearTimeout(snapshotTimerRef.current); + snapshotTimerRef.current = setTimeout(async () => { + const editor = editorRef.current; + if (!editor) return; + const shapeIds = editor.getCurrentPageShapeIds(); + if (shapeIds.size === 0) return; + try { + const result = await editor.toImage([...shapeIds], { + format: "png", + background: true, + padding: 16, + }); + if (result.blob) snapshotMutation.mutate(result.blob); + } catch { + // export can fail if shapes aren't renderable yet + } + }, SNAPSHOT_DEBOUNCE_MS); + }, [snapshotMutation]); + + const handleMount = useCallback( + (editor: Editor) => { + editorRef.current = editor; + + if (data && data.scene.records && data.scene.records.length > 0) { + try { + const snapshot = sceneToSnapshot(data.scene); + if (snapshot) { + editor.loadSnapshot(snapshot); + } + } catch { + // failed to load, start fresh + } + } + + const handleChange = () => { + if (pointerDownRef.current) { + pendingSaveRef.current = true; + return; + } + debouncedSave(); + debouncedSnapshot(); + }; + + editor.store.listen(handleChange, { scope: "document", source: "user" }); + + const handlePointerDown = () => { + pointerDownRef.current = true; + }; + const handlePointerUp = () => { + pointerDownRef.current = false; + if (pendingSaveRef.current) { + pendingSaveRef.current = false; + debouncedSave(); + debouncedSnapshot(); + } + }; + + const container = editor.getContainer(); + container.addEventListener("pointerdown", handlePointerDown); + container.addEventListener("pointerup", handlePointerUp); + }, + [data, debouncedSave, debouncedSnapshot] + ); + + useEffect(() => { + if (!data || !editorRef.current) return; + if (data.version <= lastSavedVersionRef.current) return; + lastSavedVersionRef.current = data.version; + }, [data]); + + useEffect(() => { + return () => { + if (saveTimerRef.current) clearTimeout(saveTimerRef.current); + if (snapshotTimerRef.current) clearTimeout(snapshotTimerRef.current); + const editor = editorRef.current; + if (editor && pendingSaveRef.current) { + const snapshot = editor.getSnapshot(); + const records = Object.values( + snapshot.document.store + ) as unknown as Record[]; + saveMutation.mutate({ records }); + } + }; + }, []); // eslint-disable-line react-hooks/exhaustive-deps + + return ( +
+ +
+ ); +} diff --git a/apps/web/src/hooks/use-agents-view-routing.ts b/apps/web/src/hooks/use-agents-view-routing.ts index 6fc17d42..d934e898 100644 --- a/apps/web/src/hooks/use-agents-view-routing.ts +++ b/apps/web/src/hooks/use-agents-view-routing.ts @@ -8,6 +8,7 @@ import { agentFeedbackRoute, agentReviewRoute, agentRoute, + agentWhiteboardRoute, } from "@/lib/agent-routes"; type UseAgentsViewRoutingOptions = { @@ -27,6 +28,7 @@ export function useAgentsViewRouting({ const feedbackMatch = useMatch("/agents/:agentId/feedback/:itemId"); const reviewMatch = useMatch("/agents/:agentId/review/:summaryAgentId"); const changesMatch = useMatch("/agents/:agentId/changes"); + const whiteboardMatch = useMatch("/agents/:agentId/whiteboard"); const itemId = feedbackMatch?.params.itemId; const summaryAgentId = reviewMatch?.params.summaryAgentId; @@ -74,12 +76,14 @@ export function useAgentsViewRouting({ }, [agents, agentsLoaded, navigate, routeAgentId, summaryAgentId]); const onTabChange = useCallback( - (tab: "terminal" | "changes") => { + (tab: "terminal" | "changes" | "whiteboard") => { if (!routeAgentId) return; navigate( tab === "changes" ? agentChangesRoute(routeAgentId) - : agentRoute(routeAgentId), + : tab === "whiteboard" + ? agentWhiteboardRoute(routeAgentId) + : agentRoute(routeAgentId), { replace: true } ); }, @@ -128,6 +132,7 @@ export function useAgentsViewRouting({ return { changesMatch: !!changesMatch, + whiteboardMatch: !!whiteboardMatch, feedbackDetail, feedbackDetailRendered, handleFeedbackTransitionEnd, diff --git a/apps/web/src/hooks/use-sse.ts b/apps/web/src/hooks/use-sse.ts index 1dce706a..c67670ef 100644 --- a/apps/web/src/hooks/use-sse.ts +++ b/apps/web/src/hooks/use-sse.ts @@ -12,6 +12,9 @@ import { diffStatsQueryKey } from "@/hooks/use-agent-diff-stats"; import { sortAgentsByCreatedAtDesc } from "@/lib/agent-sort"; import { recordSSEEvent, recordSSEReconnect } from "@/lib/energy-metrics"; import { showWebNotification } from "@/lib/web-notifications"; +import { whiteboardQueryKey } from "@/hooks/use-whiteboard"; +import { whiteboardAgentDrewAtomFamily } from "@/lib/store"; +import { getDefaultStore } from "jotai"; import { CACHED_RELEASE_INFO_QUERY_KEY, type ReleaseInfoSnapshot, @@ -54,6 +57,11 @@ type UiEvent = | { type: "release.cached_info_changed"; snapshot: ReleaseInfoSnapshot | null; + } + | { + type: "whiteboard.changed"; + agentId: string; + source: "user" | "agent"; }; function patchAgentHasStream( @@ -171,6 +179,17 @@ export function useSSE(authState: AuthState): void { return; } + if (payload.type === "whiteboard.changed") { + void queryClient.invalidateQueries({ + queryKey: whiteboardQueryKey(payload.agentId), + }); + if (payload.source === "agent") { + const store = getDefaultStore(); + store.set(whiteboardAgentDrewAtomFamily(payload.agentId), true); + } + return; + } + if ( payload.type === "feedback.created" || payload.type === "feedback.updated" diff --git a/apps/web/src/hooks/use-whiteboard.ts b/apps/web/src/hooks/use-whiteboard.ts new file mode 100644 index 00000000..40d1eb97 --- /dev/null +++ b/apps/web/src/hooks/use-whiteboard.ts @@ -0,0 +1,80 @@ +import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; + +export type WhiteboardScene = { + records: Record[]; +}; + +export type WhiteboardData = { + scene: WhiteboardScene; + version: number; + elements: Array<{ + id: string; + type: string; + x: number; + y: number; + w: number; + h: number; + label?: string; + color?: string; + }>; +}; + +export function whiteboardQueryKey(agentId: string) { + return ["whiteboard", agentId] as const; +} + +export function useWhiteboard(agentId: string | null) { + return useQuery({ + queryKey: whiteboardQueryKey(agentId ?? ""), + queryFn: async () => { + const res = await fetch(`/api/v1/agents/${agentId}/whiteboard`, { + credentials: "include", + }); + if (!res.ok) throw new Error("Failed to fetch whiteboard"); + return res.json(); + }, + enabled: !!agentId, + staleTime: 30_000, + }); +} + +export function useSaveWhiteboard(agentId: string | null) { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: async (scene: WhiteboardScene) => { + if (!agentId) throw new Error("No agent"); + const res = await fetch(`/api/v1/agents/${agentId}/whiteboard`, { + method: "PUT", + credentials: "include", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ scene }), + }); + if (!res.ok) throw new Error("Failed to save whiteboard"); + return res.json(); + }, + onSuccess: () => { + if (agentId) { + void queryClient.invalidateQueries({ + queryKey: whiteboardQueryKey(agentId), + }); + } + }, + }); +} + +export function useUploadWhiteboardSnapshot(agentId: string | null) { + return useMutation({ + mutationFn: async (blob: Blob) => { + if (!agentId) throw new Error("No agent"); + const form = new FormData(); + form.append("file", blob, "whiteboard-snapshot.png"); + const res = await fetch(`/api/v1/agents/${agentId}/whiteboard/snapshot`, { + method: "POST", + credentials: "include", + body: form, + }); + if (!res.ok) throw new Error("Failed to upload snapshot"); + return res.json(); + }, + }); +} diff --git a/apps/web/src/lib/agent-routes.ts b/apps/web/src/lib/agent-routes.ts index 341813e7..96d07cb3 100644 --- a/apps/web/src/lib/agent-routes.ts +++ b/apps/web/src/lib/agent-routes.ts @@ -10,6 +10,10 @@ export function agentFeedbackRoute(agentId: string, itemId: number): string { return `/agents/${agentId}/feedback/${itemId}`; } +export function agentWhiteboardRoute(agentId: string): string { + return `/agents/${agentId}/whiteboard`; +} + export function agentReviewRoute( agentId: string, reviewAgentId: string diff --git a/apps/web/src/lib/store.ts b/apps/web/src/lib/store.ts index 55020051..32cce224 100644 --- a/apps/web/src/lib/store.ts +++ b/apps/web/src/lib/store.ts @@ -279,7 +279,7 @@ export function reconcileDiffViewStateStorage( // Split pane state — per-agent split/single mode and pane sizes // --------------------------------------------------------------------------- -export type CenterTab = "terminal" | "changes"; +export type CenterTab = "terminal" | "changes" | "whiteboard"; export type SplitPaneState = { mode: "single" | "split"; @@ -327,3 +327,11 @@ export function reconcileSplitPaneStateStorage( keysToDelete.forEach((key) => window.localStorage.removeItem(key)); } + +// --------------------------------------------------------------------------- +// Whiteboard agent-drew indicator +// --------------------------------------------------------------------------- + +export const whiteboardAgentDrewAtomFamily = atomFamily((_agentId: string) => + atom(false) +); diff --git a/e2e/whiteboard.spec.ts b/e2e/whiteboard.spec.ts new file mode 100644 index 00000000..5513c85f --- /dev/null +++ b/e2e/whiteboard.spec.ts @@ -0,0 +1,127 @@ +import { expect, test } from "@playwright/test"; +import { cleanupE2EAgents, createAgentViaAPI } from "./helpers"; + +const AUTH_TOKEN = process.env.AUTH_TOKEN ?? "dev-token"; + +function authHeaders(): Record { + return { Authorization: `Bearer ${AUTH_TOKEN}` }; +} + +async function waitForAppShell( + page: import("@playwright/test").Page, + agentName?: string +): Promise { + await page.getByTestId("agent-sidebar").waitFor({ state: "visible" }); + await page.getByTestId("terminal-pane").waitFor({ state: "visible" }); + if (agentName) { + await page + .getByTestId("agent-sidebar") + .getByText(agentName) + .first() + .waitFor({ state: "visible" }); + } +} + +test.describe("Whiteboard", () => { + test.afterEach(async ({ request }) => { + await cleanupE2EAgents(request); + }); + + test("whiteboard tab renders tldraw canvas", async ({ page, request }) => { + const agent = await createAgentViaAPI(request, { + name: `e2e-agent-${Date.now()}`, + }); + + await page.goto(`/agents/${agent.id}`, { waitUntil: "domcontentloaded" }); + await waitForAppShell(page, agent.name); + + await page.getByTestId("center-tab-whiteboard").click(); + await expect(page).toHaveURL(new RegExp(`/agents/${agent.id}/whiteboard$`)); + + await expect(page.getByTestId("whiteboard-canvas")).toBeVisible(); + // tldraw renders its canvas inside the container + await expect( + page.locator('[data-testid="whiteboard-canvas"] .tl-container') + ).toBeVisible({ timeout: 10_000 }); + }); + + test("whiteboard API: GET returns empty scene, PUT stores data", async ({ + request, + }) => { + const agent = await createAgentViaAPI(request, { + name: `e2e-agent-${Date.now()}`, + }); + + // GET should return empty scene + const getRes = await request.get(`/api/v1/agents/${agent.id}/whiteboard`, { + headers: authHeaders(), + }); + expect(getRes.ok()).toBe(true); + const getData = (await getRes.json()) as { + scene: { records: unknown[] }; + version: number; + }; + expect(getData.version).toBe(0); + expect(getData.scene.records).toEqual([]); + + // PUT with ops + const putRes = await request.put(`/api/v1/agents/${agent.id}/whiteboard`, { + headers: authHeaders(), + data: { + ops: [ + { + op: "add", + type: "rect", + id: "e2e-rect-1", + x: 10, + y: 20, + w: 100, + h: 50, + label: "E2E Box", + }, + ], + }, + }); + expect(putRes.ok()).toBe(true); + const putData = (await putRes.json()) as { + version: number; + elementCount: number; + }; + expect(putData.version).toBe(1); + expect(putData.elementCount).toBe(1); + + // GET again should return the shape + const getRes2 = await request.get(`/api/v1/agents/${agent.id}/whiteboard`, { + headers: authHeaders(), + }); + const getData2 = (await getRes2.json()) as { + scene: { records: unknown[] }; + version: number; + elements: Array<{ id: string; type: string }>; + }; + expect(getData2.version).toBe(1); + expect(getData2.scene.records.length).toBe(1); + expect(getData2.elements.length).toBe(1); + }); + + test("whiteboard deep-link route renders canvas", async ({ + page, + request, + }) => { + const agent = await createAgentViaAPI(request, { + name: `e2e-agent-${Date.now()}`, + }); + + await page.goto(`/agents/${agent.id}/whiteboard`, { + waitUntil: "domcontentloaded", + }); + await page.getByTestId("agent-sidebar").waitFor({ state: "visible" }); + await page + .getByTestId("agent-sidebar") + .getByText(agent.name) + .first() + .waitFor({ state: "visible" }); + + await expect(page.getByTestId("whiteboard-canvas")).toBeVisible(); + }); +}); diff --git a/package.json b/package.json index 35a34730..0d5b19f0 100644 --- a/package.json +++ b/package.json @@ -54,5 +54,10 @@ "prettier": "^3.8.3", "sharp": "^0.34.5", "typescript": "^5.9.3" + }, + "dependencies": { + "@tldraw/store": "5.2.4", + "@tldraw/tlschema": "5.2.4", + "tldraw": "5.2.4" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fc467e22..8bdcf69c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,6 +6,16 @@ settings: importers: .: + dependencies: + "@tldraw/store": + specifier: 5.2.4 + version: 5.2.4(react@18.3.1) + "@tldraw/tlschema": + specifier: 5.2.4 + version: 5.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + tldraw: + specifier: 5.2.4 + version: 5.2.4(@floating-ui/dom@1.7.6)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) devDependencies: "@playwright/test": specifier: ^1.58.2 @@ -46,6 +56,12 @@ importers: "@modelcontextprotocol/sdk": specifier: ^1.27.1 version: 1.28.0(zod@4.3.6) + "@tldraw/store": + specifier: 5.2.4 + version: 5.2.4(react@18.3.1) + "@tldraw/tlschema": + specifier: 5.2.4 + version: 5.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) bcryptjs: specifier: ^3.0.3 version: 3.0.3 @@ -203,6 +219,9 @@ importers: tailwind-merge: specifier: ^2.5.4 version: 2.6.1 + tldraw: + specifier: 5.2.4 + version: 5.2.4(@floating-ui/dom@1.7.6)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) devDependencies: "@eslint/js": specifier: ^9.39.4 @@ -2455,16 +2474,28 @@ packages: integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==, } + "@radix-ui/number@1.1.2": + resolution: + { + integrity: sha512-ceTwaxc4I5IOi97DgCotl3pqiyRGvffcc0oOsE2dQYaJOFIDsDt4VWG6xEbg1QePv9QWausCEIppud/tJ1wNig==, + } + "@radix-ui/primitive@1.1.3": resolution: { integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==, } - "@radix-ui/react-arrow@1.1.7": + "@radix-ui/primitive@1.1.5": resolution: { - integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==, + integrity: sha512-d86WIWFYNtGA0H/d8exstrTRTp7eWJYlYJbtNofxr/3ljupZYn6EFDG/Qgu/0Kc8v7yMUxySagqJsL1+PdYjWg==, + } + + "@radix-ui/react-accessible-icon@1.1.11": + resolution: + { + integrity: sha512-HQDOFTKwSnmUij6l54wYJJtxTAnxI71+YJLOrjm2ladFB8HAV5Jt7hwaZPhWTGBkYoW4+ZAOfNZrLDh/qvxSYA==, } peerDependencies: "@types/react": "*" @@ -2477,10 +2508,10 @@ packages: "@types/react-dom": optional: true - "@radix-ui/react-checkbox@1.3.3": + "@radix-ui/react-accordion@1.2.16": resolution: { - integrity: sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==, + integrity: sha512-BpZJNmetujnGgUI6OX0jEhEmlA46WPqgub8Rv09Kyquwd0cc1ndMKpiPYCjmBU6KSSRPAMtgLpEoZSG/tdNIWQ==, } peerDependencies: "@types/react": "*" @@ -2493,10 +2524,10 @@ packages: "@types/react-dom": optional: true - "@radix-ui/react-collection@1.1.7": + "@radix-ui/react-alert-dialog@1.1.19": resolution: { - integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==, + integrity: sha512-FA7n1f6D/DwGE0+AWxiY5LacNbbExQuEgMubeG06idEaH+mSLuf9dp/qBNqOnvbTQ+4gZ2ue1RATF1Ub91Mg5g==, } peerDependencies: "@types/react": "*" @@ -2509,34 +2540,42 @@ packages: "@types/react-dom": optional: true - "@radix-ui/react-compose-refs@1.1.2": + "@radix-ui/react-arrow@1.1.11": resolution: { - integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==, + integrity: sha512-Kdil9BB1rIFC/khmf4hC35bn8701AJcizTU7G7cUbEbk5XqqbjDuHW60uUfKqO5WojjZcbAW51Q7P0hRmMLw8A==, } peerDependencies: "@types/react": "*" + "@types/react-dom": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true + "@types/react-dom": + optional: true - "@radix-ui/react-context@1.1.2": + "@radix-ui/react-arrow@1.1.7": resolution: { - integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==, + integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==, } peerDependencies: "@types/react": "*" + "@types/react-dom": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true + "@types/react-dom": + optional: true - "@radix-ui/react-dialog@1.1.15": + "@radix-ui/react-aspect-ratio@1.1.11": resolution: { - integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==, + integrity: sha512-IUAhIVpBUvP5NNICjlaB1OFmtRLGqQqTF3ZOSGPoq3XeLXRFtHiWTRxSVEULgOd9GQR2c7tsYqDnhUennapZnw==, } peerDependencies: "@types/react": "*" @@ -2549,22 +2588,26 @@ packages: "@types/react-dom": optional: true - "@radix-ui/react-direction@1.1.1": + "@radix-ui/react-avatar@1.2.2": resolution: { - integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==, + integrity: sha512-sST0qh8GzOB7besQ3tMLWLyngnRuSk0gc/Hm+667KYKQFCt6Y6ZXv25WlqM7dIDK54ULCh5+CHmk4LIolzfz+A==, } peerDependencies: "@types/react": "*" + "@types/react-dom": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true + "@types/react-dom": + optional: true - "@radix-ui/react-dismissable-layer@1.1.11": + "@radix-ui/react-checkbox@1.3.3": resolution: { - integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==, + integrity: sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==, } peerDependencies: "@types/react": "*" @@ -2577,10 +2620,10 @@ packages: "@types/react-dom": optional: true - "@radix-ui/react-dropdown-menu@2.1.16": + "@radix-ui/react-checkbox@1.3.7": resolution: { - integrity: sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==, + integrity: sha512-JroKHfQBfh+fDuzpPsBC+pESkhuq8ql4hljTguz8MWnS35cISr3d/Jhl9kYrB44FlDtxCArYdDvTx+BSsJ64rQ==, } peerDependencies: "@types/react": "*" @@ -2593,22 +2636,26 @@ packages: "@types/react-dom": optional: true - "@radix-ui/react-focus-guards@1.1.3": + "@radix-ui/react-collapsible@1.1.16": resolution: { - integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==, + integrity: sha512-opfXRe6nnzyGmCDPx+l1Aqo/RbqWtQal2FnsBqF9hhePp6j0LsRoBaRxcMOlTv+uYTJVtWYZKg9t9wTe+BA/ZA==, } peerDependencies: "@types/react": "*" + "@types/react-dom": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true + "@types/react-dom": + optional: true - "@radix-ui/react-focus-scope@1.1.7": + "@radix-ui/react-collection@1.1.12": resolution: { - integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==, + integrity: sha512-nb67INpE0IahJKN7EYPp9m9YGwYeKlnzxT3MwXVkgCskaSJia97kG4T0ywpjNUSSnoJk/uvk12V8vbrEHEj+/Q==, } peerDependencies: "@types/react": "*" @@ -2621,38 +2668,50 @@ packages: "@types/react-dom": optional: true - "@radix-ui/react-id@1.1.1": + "@radix-ui/react-collection@1.1.7": resolution: { - integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==, + integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==, } peerDependencies: "@types/react": "*" + "@types/react-dom": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true + "@types/react-dom": + optional: true - "@radix-ui/react-menu@2.1.16": + "@radix-ui/react-compose-refs@1.1.2": resolution: { - integrity: sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==, + integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==, } peerDependencies: "@types/react": "*" - "@types/react-dom": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true - "@types/react-dom": + + "@radix-ui/react-compose-refs@1.1.3": + resolution: + { + integrity: sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": optional: true - "@radix-ui/react-popover@1.1.15": + "@radix-ui/react-context-menu@2.3.3": resolution: { - integrity: sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==, + integrity: sha512-PS+gKE0z2prJ74Y0sM+brAGK4mYOHIR7TlcV5EJgUQ6E0xMvyswkK2X4yRqyganrzsRL+WCSKAPu0NQITICRWg==, } peerDependencies: "@types/react": "*" @@ -2665,26 +2724,34 @@ packages: "@types/react-dom": optional: true - "@radix-ui/react-popper@1.2.8": + "@radix-ui/react-context@1.1.2": resolution: { - integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==, + integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==, } peerDependencies: "@types/react": "*" - "@types/react-dom": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true - "@types/react-dom": + + "@radix-ui/react-context@1.2.0": + resolution: + { + integrity: sha512-fOE+JtN9rygNZkCnHRBEP0TAvLldlhyOxMsbwFvTP4nAs+nBmfnna+o/Zski2wkmY1YMrFC0aSzsHoLY47iLrg==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": optional: true - "@radix-ui/react-portal@1.1.9": + "@radix-ui/react-dialog@1.1.15": resolution: { - integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==, + integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==, } peerDependencies: "@types/react": "*" @@ -2697,10 +2764,10 @@ packages: "@types/react-dom": optional: true - "@radix-ui/react-presence@1.1.5": + "@radix-ui/react-dialog@1.1.19": resolution: { - integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==, + integrity: sha512-+HhbN2+YtkRgVirjZ2afMeutQRuGOrdkWR5+EFC58SJojGmtyNQwYzgi6tHBpOxvFHefMtPeHdgtjz0BOGxFQg==, } peerDependencies: "@types/react": "*" @@ -2713,26 +2780,34 @@ packages: "@types/react-dom": optional: true - "@radix-ui/react-primitive@2.1.3": + "@radix-ui/react-direction@1.1.1": resolution: { - integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==, + integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==, } peerDependencies: "@types/react": "*" - "@types/react-dom": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true - "@types/react-dom": + + "@radix-ui/react-direction@1.1.2": + resolution: + { + integrity: sha512-C3vFhbyi4SW3PmbAi6Awpu4OzJtd0MxGurvSsYtr7p7nM8RNB3VAF3CUmnp2j50knpkrRcB7+ycVXzgLgF6yNA==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": optional: true - "@radix-ui/react-primitive@2.1.4": + "@radix-ui/react-dismissable-layer@1.1.11": resolution: { - integrity: sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==, + integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==, } peerDependencies: "@types/react": "*" @@ -2745,10 +2820,10 @@ packages: "@types/react-dom": optional: true - "@radix-ui/react-roving-focus@1.1.11": + "@radix-ui/react-dismissable-layer@1.1.15": resolution: { - integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==, + integrity: sha512-b0XaRlzn2QKuo10XyNgi2DAJDf5XC9d1nD3FJcuvCjbR7+4Ad28zmZsLsqx+hvDEzMnRuZaZxZm9gYObV6RmRA==, } peerDependencies: "@types/react": "*" @@ -2761,10 +2836,10 @@ packages: "@types/react-dom": optional: true - "@radix-ui/react-scroll-area@1.2.10": + "@radix-ui/react-dropdown-menu@2.1.16": resolution: { - integrity: sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==, + integrity: sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==, } peerDependencies: "@types/react": "*" @@ -2777,10 +2852,10 @@ packages: "@types/react-dom": optional: true - "@radix-ui/react-select@2.2.6": + "@radix-ui/react-dropdown-menu@2.1.20": resolution: { - integrity: sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==, + integrity: sha512-slfm+rRaZRuQBvHq60lXvSVUPhid0IPtjSZzIuUlWZMUs01iYZNlGS3mJgRD3ChLQVBAYlKiL/tFyWGX+dz8Xw==, } peerDependencies: "@types/react": "*" @@ -2793,10 +2868,10 @@ packages: "@types/react-dom": optional: true - "@radix-ui/react-slot@1.2.3": + "@radix-ui/react-focus-guards@1.1.3": resolution: { - integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==, + integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==, } peerDependencies: "@types/react": "*" @@ -2805,10 +2880,10 @@ packages: "@types/react": optional: true - "@radix-ui/react-slot@1.2.4": + "@radix-ui/react-focus-guards@1.1.4": resolution: { - integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==, + integrity: sha512-cot/aB/mOm0IYVYTTmQcEEK1M48lZWi8FlYe5nDPQQ8NYZUlXEFgncJ9p2Kzer3RKSrY7cTTpEMLZKNo9QoP5Q==, } peerDependencies: "@types/react": "*" @@ -2817,10 +2892,10 @@ packages: "@types/react": optional: true - "@radix-ui/react-tooltip@1.2.8": + "@radix-ui/react-focus-scope@1.1.12": resolution: { - integrity: sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==, + integrity: sha512-jjk/lqTeNL0azUx5ZYzVrl4NgaDIrdzTNE4mABV9yBFI7FQqN7pIgzV1bTleUezP2QiTGA1BFTqY8MegDgWX9A==, } peerDependencies: "@types/react": "*" @@ -2833,46 +2908,58 @@ packages: "@types/react-dom": optional: true - "@radix-ui/react-use-callback-ref@1.1.1": + "@radix-ui/react-focus-scope@1.1.7": resolution: { - integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==, + integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==, } peerDependencies: "@types/react": "*" + "@types/react-dom": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true + "@types/react-dom": + optional: true - "@radix-ui/react-use-controllable-state@1.2.2": + "@radix-ui/react-form@0.1.12": resolution: { - integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==, + integrity: sha512-JTX94E4LDL91rzLg7X0mHPdxr0A8JEdVwZEmeOwZJSMDHCGW5DFtSlTSJozUyUs807IQmnvbfzKZFVCK5DmkqQ==, } peerDependencies: "@types/react": "*" + "@types/react-dom": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true + "@types/react-dom": + optional: true - "@radix-ui/react-use-effect-event@0.0.2": + "@radix-ui/react-hover-card@1.1.19": resolution: { - integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==, + integrity: sha512-2KTgMLQtKvicznQgbindEI2RZ3QbDIwU5gabjUPwFJsormjGDz+rUvO4NANmYwzEEpTcTONUt33vBHIfTIVSfw==, } peerDependencies: "@types/react": "*" + "@types/react-dom": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true + "@types/react-dom": + optional: true - "@radix-ui/react-use-escape-keydown@1.1.1": + "@radix-ui/react-id@1.1.1": resolution: { - integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==, + integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==, } peerDependencies: "@types/react": "*" @@ -2881,10 +2968,10 @@ packages: "@types/react": optional: true - "@radix-ui/react-use-layout-effect@1.1.1": + "@radix-ui/react-id@1.1.2": resolution: { - integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==, + integrity: sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA==, } peerDependencies: "@types/react": "*" @@ -2893,46 +2980,58 @@ packages: "@types/react": optional: true - "@radix-ui/react-use-previous@1.1.1": + "@radix-ui/react-label@2.1.11": resolution: { - integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==, + integrity: sha512-3PKvDDxOn62k0oV1n4QtNtD2vpu+zYjXR7ojLBPaO6SPvhy53yg0vAmgNeBQeJW5rV3dffoRG+HYfLBZuzw0CQ==, } peerDependencies: "@types/react": "*" + "@types/react-dom": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true + "@types/react-dom": + optional: true - "@radix-ui/react-use-rect@1.1.1": + "@radix-ui/react-menu@2.1.16": resolution: { - integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==, + integrity: sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==, } peerDependencies: "@types/react": "*" + "@types/react-dom": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true + "@types/react-dom": + optional: true - "@radix-ui/react-use-size@1.1.1": + "@radix-ui/react-menu@2.1.20": resolution: { - integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==, + integrity: sha512-VsUrXxFe9d2ScbZF0fR/oPR1+qjyeLs5p0jzG8h90puMoA9bq4SirYlXbE+USRg9Q2qTeJSFNqjw2nts8jJe4w==, } peerDependencies: "@types/react": "*" + "@types/react-dom": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true + "@types/react-dom": + optional: true - "@radix-ui/react-visually-hidden@1.2.3": + "@radix-ui/react-menubar@1.1.20": resolution: { - integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==, + integrity: sha512-gzFZvybgmwYsFBWDqanycIoEYnhyk8MMnuLamdFVHUZYGp4COM+sqXiwbnn0VMWqGLeeU7GV7jm+dXRa+Wufag==, } peerDependencies: "@types/react": "*" @@ -2945,370 +3044,1468 @@ packages: "@types/react-dom": optional: true - "@radix-ui/rect@1.1.1": + "@radix-ui/react-navigation-menu@1.2.18": resolution: { - integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==, + integrity: sha512-K9HiuxZ6xCwSaHcIuUpxyhy4w5gpwzWjh9dHTSbMN3Ix4qAyVObS9RlU3zMycb0PO3v9Tpk0BXMwWvXOUbVXew==, } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true - "@reduxjs/toolkit@2.11.2": + "@radix-ui/react-one-time-password-field@0.1.12": resolution: { - integrity: sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==, + integrity: sha512-nQLu5OAcORDQp1EHAv6k3mJGV1hjMTw2NTGVAsGE1g/mWeNqAd1R5jyaAs3U+A8ZD/W8XNPY2yKT0ZdQnqo3NA==, } peerDependencies: - react: ^16.9.0 || ^17.0.0 || ^18 || ^19 - react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0 + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - react: + "@types/react": optional: true - react-redux: + "@types/react-dom": optional: true - "@rolldown/pluginutils@1.0.0-beta.27": + "@radix-ui/react-password-toggle-field@0.1.7": resolution: { - integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==, + integrity: sha512-gB1Mr8vzdv1XzDjrtJTXmL0JORRs1B4g7ngUs0F+H2VvMOwXTZMTmLCl0wZZ3m7ylX8TssI7NCvgiSHmLuTm/A==, } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true - "@rollup/plugin-babel@5.3.1": + "@radix-ui/react-popover@1.1.15": resolution: { - integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==, + integrity: sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==, } - engines: { node: ">= 10.0.0" } peerDependencies: - "@babel/core": ^7.0.0 - "@types/babel__core": ^7.1.9 - rollup: ^1.20.0||^2.0.0 + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - "@types/babel__core": + "@types/react": + optional: true + "@types/react-dom": optional: true - "@rollup/plugin-node-resolve@15.3.1": + "@radix-ui/react-popover@1.1.19": resolution: { - integrity: sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==, + integrity: sha512-jkrTdQVxnIB8fpn0NyyxW9CTB5aCXZZelVz5z+Xmii6g5WxMqS3fInNslZ63puP39+Puu4jYohUK31y3dT87gQ==, } - engines: { node: ">=14.0.0" } peerDependencies: - rollup: ^2.78.0||^3.0.0||^4.0.0 + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - rollup: + "@types/react": + optional: true + "@types/react-dom": optional: true - "@rollup/plugin-replace@2.4.2": + "@radix-ui/react-popper@1.2.8": resolution: { - integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==, + integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==, } peerDependencies: - rollup: ^1.20.0 || ^2.0.0 - - "@rollup/plugin-terser@0.4.4": - resolution: - { - integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==, + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-popper@1.3.3": + resolution: + { + integrity: sha512-mS7dGpyjv6b+gsDjLF7e0ia1W4Im1B1hSCy2yuXlHuvnZxHKagfDaobt/KAKt27EpZMit2pss8eJBVyVjEWM+g==, } - engines: { node: ">=14.0.0" } peerDependencies: - rollup: ^2.0.0||^3.0.0||^4.0.0 + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - rollup: + "@types/react": + optional: true + "@types/react-dom": optional: true - "@rollup/pluginutils@3.1.0": + "@radix-ui/react-portal@1.1.13": resolution: { - integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==, + integrity: sha512-z3oXfmaHLJTF1wktbjgD6cn9jiEbq3WSondB10LIuIt2m2Ym4iJlrW04/euMwENDdWDdE7z+OuY7Qyp1YpRSwA==, } - engines: { node: ">= 8.0.0" } peerDependencies: - rollup: ^1.20.0||^2.0.0 + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true - "@rollup/pluginutils@5.3.0": + "@radix-ui/react-portal@1.1.9": resolution: { - integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==, + integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==, } - engines: { node: ">=14.0.0" } peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - rollup: + "@types/react": + optional: true + "@types/react-dom": optional: true - "@rollup/rollup-android-arm-eabi@4.60.1": + "@radix-ui/react-presence@1.1.5": resolution: { - integrity: sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==, + integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==, } - cpu: [arm] - os: [android] + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true - "@rollup/rollup-android-arm64@4.60.1": + "@radix-ui/react-presence@1.1.7": resolution: { - integrity: sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==, + integrity: sha512-zBZ4QM5XG3JRanDmqXYf3MD6th4AFXFmgU6KNMFzUaV6F3uw9I5/zjMUvFriSEn5ewo1nxuibvyxJdmLlDcslA==, } - cpu: [arm64] - os: [android] + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true - "@rollup/rollup-darwin-arm64@4.60.1": + "@radix-ui/react-primitive@2.1.3": resolution: { - integrity: sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==, + integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==, } - cpu: [arm64] - os: [darwin] + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true - "@rollup/rollup-darwin-x64@4.60.1": + "@radix-ui/react-primitive@2.1.4": resolution: { - integrity: sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==, + integrity: sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==, } - cpu: [x64] - os: [darwin] + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true - "@rollup/rollup-freebsd-arm64@4.60.1": + "@radix-ui/react-primitive@2.1.7": resolution: { - integrity: sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==, + integrity: sha512-bC3NiwsprbxKjuon9l7X6BUTw7FPVzEYaL92MPEY5SCd/9hUTPXVFtVwRix7778wtRsVao+zE062gL79FZleeQ==, } - cpu: [arm64] - os: [freebsd] + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true - "@rollup/rollup-freebsd-x64@4.60.1": + "@radix-ui/react-progress@1.1.12": resolution: { - integrity: sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==, + integrity: sha512-ZPHyI0JyzoH/rP0tq2uRaIZTj/4s8+kAbqPz+e2N8+ejHvwPJ889dHhqn+vh7PNvNeq+boAoH9yzqeoShzwF2w==, } - cpu: [x64] - os: [freebsd] + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true - "@rollup/rollup-linux-arm-gnueabihf@4.60.1": + "@radix-ui/react-radio-group@1.4.3": + resolution: + { + integrity: sha512-WwZFjWV4s3aC1QtR3k04R+oANHtX2q6fgKlc7MCEiDNlnTxCZ3H8k3mHtEgVlOejystwk1WQgarQhNOQZ2bK1g==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-roving-focus@1.1.11": + resolution: + { + integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-roving-focus@1.1.15": + resolution: + { + integrity: sha512-40svmmugfM3mUN7VUDGVE1tQGOhyi8enlGD0CNJEcMM36C1f71PKM21DFgNHUfem0XnA+d8H8oN3Z9ZpJjSslg==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-scroll-area@1.2.10": + resolution: + { + integrity: sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-scroll-area@1.2.14": + resolution: + { + integrity: sha512-bBODCWZK7JTbQLHs0uIP4f73wIWatakK4OS33UzkR1x897wu0PuO658a3f+6P2GEGyDzGYMuHRatMVoAk9WZTw==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-select@2.2.6": + resolution: + { + integrity: sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-select@2.3.3": + resolution: + { + integrity: sha512-L5RQTXz6Anxsf9CCv+pTgiAsUpyVj7rJxsGtmhFaEOJ++cVfXucv4qWfsIO0AIB4NAhi3yovWGVMKKS1Xf1Wrg==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-separator@1.1.11": + resolution: + { + integrity: sha512-jRhe86+8PF7VZ1u14eOWVOuh2BuAhALg/FT1VcMC4OHedMTRUazDnDlKTt+yxo5cRNKHMfmvZ4sSQtWDeMV4CQ==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-slider@1.4.3": + resolution: + { + integrity: sha512-CWVVj+XaTom0SKCqw1EUgb0NuiLwS+N3OFG73mVEezKEjgNIvZiu0EevMelSSU+CbX3owbqJweG2gPU31WGC5A==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-slot@1.2.3": + resolution: + { + integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-slot@1.2.4": + resolution: + { + integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-slot@1.3.0": + resolution: + { + integrity: sha512-MojKku4U/miO8Av4Dkb+ctMAQx7JmY96LmtDQlAarCRtd7rN52QCSzBF+XAvr5S6coSVj9HEPBgHAHKEJVk/WA==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-switch@1.3.3": + resolution: + { + integrity: sha512-1+mlB4/lxJfk5tgJ4g+R5mUCbRpPE1T9+UsEyeLYbGgMtwiMgmuTnfKz4Mw1nHALHjuwyxw4MLd4cSHn6pNSlQ==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-tabs@1.1.17": + resolution: + { + integrity: sha512-nRyXnrAVCwjeXcHbvEbLS6ndbTeKHG1RqCP4A8Gw5L4cemDzPXdD8rAmr6wet0v57R69wGvuIIsFjHSVkZiMzQ==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-toast@1.2.19": + resolution: + { + integrity: sha512-SxfVZfVOibWKWdkf0Xx1awW2d09fQu4V4PXDY1j5hi4MVf7MWdJZqTBJMa1KWtOr1S6GGtCk02nniZ0Iia+dHw==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-toggle-group@1.1.15": + resolution: + { + integrity: sha512-gIC5Q+Xljg7lmUdzSuDoy0t97yZn1sZl00Ra37ZvKrYdWnQLU6sWLd09yG8cIB9jUAlQfHgJ2ACAG00MFwsqSQ==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-toggle@1.1.14": + resolution: + { + integrity: sha512-QI/hB65XKWACA66P64A+aHxtLUgHJeJLkaQa+awUNXT6T3swndtY5DojeHA+vldrTspMTtFBd7HfZ9QGbM1Qrw==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-toolbar@1.1.15": + resolution: + { + integrity: sha512-t/iEuVjUnXXtrsGK40AA43uIx37sn3AqZ7oAVnPICK6lFJP6dzMzWR3U9b6eCfFjb6wtSEqkJ9Rn9xDjiOx20g==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-tooltip@1.2.12": + resolution: + { + integrity: sha512-U3HoftgWnmla78vzQbLvKKb7bUYJxoiiqYFzp1wu/TBMyDqMZSuCl3aRICsD6EfVEwcJD2mumGDGUXLFVqQHKA==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-tooltip@1.2.8": + resolution: + { + integrity: sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-use-callback-ref@1.1.1": + resolution: + { + integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-use-callback-ref@1.1.2": + resolution: + { + integrity: sha512-xCso9j1/u8sEgP1RNHjFrXJLApL8LiqOkI1R4ywuN00rxWdYg4oQXuwKLS3i0j5NWLromUD27/4nlxj2UFVvIw==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-use-controllable-state@1.2.2": + resolution: + { + integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-use-controllable-state@1.2.3": + resolution: + { + integrity: sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-use-effect-event@0.0.2": + resolution: + { + integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-use-effect-event@0.0.3": + resolution: + { + integrity: sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-use-escape-keydown@1.1.1": + resolution: + { + integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-use-escape-keydown@1.1.3": + resolution: + { + integrity: sha512-3wEkMiPHXha/2VadZ68rYBcmYnPINVGl4Y3gtcM7fKRjANk0OscK+cdqBgUWdozb7YJxsh0vefM7vgAMHXOjqg==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-use-is-hydrated@0.1.1": + resolution: + { + integrity: sha512-qwOiz4Tjo8CNnrOLAYUMXeZwDzXgXpvK4TKQPmWLECM9XoWvA6+0Z2/7Ag3A4ivjS4ovbLJPbskkxioFyBhr8A==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-use-layout-effect@1.1.1": + resolution: + { + integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-use-layout-effect@1.1.2": + resolution: + { + integrity: sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-use-previous@1.1.1": + resolution: + { + integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-use-previous@1.1.2": + resolution: + { + integrity: sha512-IGBQPtRFdhN6MQ8dbegVmBq1LVZluya3F1jWY+puIcQC3MHctRwTDSBWCkL/3ZcnMJLTMJ++Z+ktmvg0F89iCw==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-use-rect@1.1.1": + resolution: + { + integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-use-rect@1.1.2": + resolution: + { + integrity: sha512-d8a+bBY/FxikNPlgJJoaBHZX+zKVbWHYJGTLnLvveQgFSTntkGdEKv3JDtHrMS0DNYpllz2nRsTLGLKYttbpmw==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-use-size@1.1.1": + resolution: + { + integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-use-size@1.1.2": + resolution: + { + integrity: sha512-giWQp+4mxjBPt4KZ0MmyuykFNWfbDxKt4x+fPkRYmgRFJSbCZFzUglvMb/Kjn38tm10YP4ufiQZDx3zna4LU6w==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-visually-hidden@1.2.3": + resolution: + { + integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-visually-hidden@1.2.7": + resolution: + { + integrity: sha512-1wNZBggTDK3GRuuQ6nP4k2yi7a6l7I5qbMPbZcRsrGsGVead/f/d5FhEzUvqFs0bcrDLx7n1zKQ3JvLR6whaaw==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/rect@1.1.1": + resolution: + { + integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==, + } + + "@radix-ui/rect@1.1.2": + resolution: + { + integrity: sha512-xnXE7wG13PI+cxieVssYXlQJuYVRhH9NBoxt3KNwzghDIA69GMm7d4wXRouHIYjE+KvS6U/MsMO73NdS2MH9ZA==, + } + + "@reduxjs/toolkit@2.11.2": + resolution: + { + integrity: sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==, + } + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18 || ^19 + react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0 + peerDependenciesMeta: + react: + optional: true + react-redux: + optional: true + + "@rolldown/pluginutils@1.0.0-beta.27": + resolution: + { + integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==, + } + + "@rollup/plugin-babel@5.3.1": + resolution: + { + integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==, + } + engines: { node: ">= 10.0.0" } + peerDependencies: + "@babel/core": ^7.0.0 + "@types/babel__core": ^7.1.9 + rollup: ^1.20.0||^2.0.0 + peerDependenciesMeta: + "@types/babel__core": + optional: true + + "@rollup/plugin-node-resolve@15.3.1": + resolution: + { + integrity: sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==, + } + engines: { node: ">=14.0.0" } + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + "@rollup/plugin-replace@2.4.2": + resolution: + { + integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==, + } + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + + "@rollup/plugin-terser@0.4.4": + resolution: + { + integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==, + } + engines: { node: ">=14.0.0" } + peerDependencies: + rollup: ^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + "@rollup/pluginutils@3.1.0": + resolution: + { + integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==, + } + engines: { node: ">= 8.0.0" } + peerDependencies: + rollup: ^1.20.0||^2.0.0 + + "@rollup/pluginutils@5.3.0": + resolution: + { + integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==, + } + engines: { node: ">=14.0.0" } + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + "@rollup/rollup-android-arm-eabi@4.60.1": + resolution: + { + integrity: sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==, + } + cpu: [arm] + os: [android] + + "@rollup/rollup-android-arm64@4.60.1": + resolution: + { + integrity: sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==, + } + cpu: [arm64] + os: [android] + + "@rollup/rollup-darwin-arm64@4.60.1": + resolution: + { + integrity: sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==, + } + cpu: [arm64] + os: [darwin] + + "@rollup/rollup-darwin-x64@4.60.1": + resolution: + { + integrity: sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==, + } + cpu: [x64] + os: [darwin] + + "@rollup/rollup-freebsd-arm64@4.60.1": + resolution: + { + integrity: sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==, + } + cpu: [arm64] + os: [freebsd] + + "@rollup/rollup-freebsd-x64@4.60.1": + resolution: + { + integrity: sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==, + } + cpu: [x64] + os: [freebsd] + + "@rollup/rollup-linux-arm-gnueabihf@4.60.1": + resolution: + { + integrity: sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==, + } + cpu: [arm] + os: [linux] + + "@rollup/rollup-linux-arm-musleabihf@4.60.1": + resolution: + { + integrity: sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==, + } + cpu: [arm] + os: [linux] + + "@rollup/rollup-linux-arm64-gnu@4.60.1": + resolution: + { + integrity: sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==, + } + cpu: [arm64] + os: [linux] + + "@rollup/rollup-linux-arm64-musl@4.60.1": + resolution: + { + integrity: sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==, + } + cpu: [arm64] + os: [linux] + + "@rollup/rollup-linux-loong64-gnu@4.60.1": + resolution: + { + integrity: sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==, + } + cpu: [loong64] + os: [linux] + + "@rollup/rollup-linux-loong64-musl@4.60.1": + resolution: + { + integrity: sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==, + } + cpu: [loong64] + os: [linux] + + "@rollup/rollup-linux-ppc64-gnu@4.60.1": + resolution: + { + integrity: sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==, + } + cpu: [ppc64] + os: [linux] + + "@rollup/rollup-linux-ppc64-musl@4.60.1": + resolution: + { + integrity: sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==, + } + cpu: [ppc64] + os: [linux] + + "@rollup/rollup-linux-riscv64-gnu@4.60.1": + resolution: + { + integrity: sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==, + } + cpu: [riscv64] + os: [linux] + + "@rollup/rollup-linux-riscv64-musl@4.60.1": + resolution: + { + integrity: sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==, + } + cpu: [riscv64] + os: [linux] + + "@rollup/rollup-linux-s390x-gnu@4.60.1": + resolution: + { + integrity: sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==, + } + cpu: [s390x] + os: [linux] + + "@rollup/rollup-linux-x64-gnu@4.60.1": + resolution: + { + integrity: sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==, + } + cpu: [x64] + os: [linux] + + "@rollup/rollup-linux-x64-musl@4.60.1": + resolution: + { + integrity: sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==, + } + cpu: [x64] + os: [linux] + + "@rollup/rollup-openbsd-x64@4.60.1": + resolution: + { + integrity: sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==, + } + cpu: [x64] + os: [openbsd] + + "@rollup/rollup-openharmony-arm64@4.60.1": + resolution: + { + integrity: sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==, + } + cpu: [arm64] + os: [openharmony] + + "@rollup/rollup-win32-arm64-msvc@4.60.1": + resolution: + { + integrity: sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==, + } + cpu: [arm64] + os: [win32] + + "@rollup/rollup-win32-ia32-msvc@4.60.1": + resolution: + { + integrity: sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==, + } + cpu: [ia32] + os: [win32] + + "@rollup/rollup-win32-x64-gnu@4.60.1": + resolution: + { + integrity: sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==, + } + cpu: [x64] + os: [win32] + + "@rollup/rollup-win32-x64-msvc@4.60.1": + resolution: + { + integrity: sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==, + } + cpu: [x64] + os: [win32] + + "@standard-schema/spec@1.1.0": + resolution: + { + integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==, + } + + "@standard-schema/utils@0.3.0": + resolution: + { + integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==, + } + + "@surma/rollup-plugin-off-main-thread@2.2.3": + resolution: + { + integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==, + } + + "@tabby_ai/hijri-converter@1.0.5": + resolution: + { + integrity: sha512-r5bClKrcIusDoo049dSL8CawnHR6mRdDwhlQuIgZRNty68q0x8k3Lf1BtPAMxRf/GgnHBnIO4ujd3+GQdLWzxQ==, + } + engines: { node: ">=16.0.0" } + + "@tailwindcss/typography@0.5.19": + resolution: + { + integrity: sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==, + } + peerDependencies: + tailwindcss: ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" + + "@tanstack/query-core@5.95.2": + resolution: + { + integrity: sha512-o4T8vZHZET4Bib3jZ/tCW9/7080urD4c+0/AUaYVpIqOsr7y0reBc1oX3ttNaSW5mYyvZHctiQ/UOP2PfdmFEQ==, + } + + "@tanstack/react-query@5.95.2": + resolution: + { + integrity: sha512-/wGkvLj/st5Ud1Q76KF1uFxScV7WeqN1slQx5280ycwAyYkIPGaRZAEgHxe3bjirSd5Zpwkj6zNcR4cqYni/ZA==, + } + peerDependencies: + react: ^18 || ^19 + + "@testing-library/dom@10.4.1": + resolution: + { + integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==, + } + engines: { node: ">=18" } + + "@testing-library/react@16.3.2": + resolution: + { + integrity: sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==, + } + engines: { node: ">=18" } + peerDependencies: + "@testing-library/dom": ^10.0.0 + "@types/react": ^18.0.0 || ^19.0.0 + "@types/react-dom": ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@tiptap/core@3.27.3": + resolution: + { + integrity: sha512-TJj5929M96C1KlH796wS8MywfHDh49RhmakOyzyMMc9pFmRj9UXi1gj0TCXgsZtjEOG7B+m/DRvNOvnuvR9kmg==, + } + peerDependencies: + "@tiptap/pm": 3.27.3 + + "@tiptap/extension-blockquote@3.27.3": + resolution: + { + integrity: sha512-VGoVMcqcGkkoduzEqQ70ZK5OOHBDn5iYeHJSgkvNoSHzYHl0CaKoWxoDKJjSWC5DAM4mBU+tXTlsiUp3evRMfA==, + } + peerDependencies: + "@tiptap/core": 3.27.3 + + "@tiptap/extension-bold@3.27.3": + resolution: + { + integrity: sha512-pchbycFppBqBmvk+OxrQLIPZLNd3rNbcm7zOa+OTjluphpAcsJ6AmHBmiRhJUYWitV6/SA+0nujcaWxBp5hNcQ==, + } + peerDependencies: + "@tiptap/core": 3.27.3 + + "@tiptap/extension-bubble-menu@3.27.3": + resolution: + { + integrity: sha512-PKSM9g8BXzO0Lxm2gOin7FAFvxO6T0QvlXTXVke/GJn/sR1tEz7w5ybsvweytUPmSliUc601pfIUOHKEhIVC2Q==, + } + peerDependencies: + "@tiptap/core": 3.27.3 + "@tiptap/pm": 3.27.3 + + "@tiptap/extension-bullet-list@3.27.3": + resolution: + { + integrity: sha512-owQW6mcgnYgQU1z5BqmslcjZFBUm1SGM/Ax++4R6XelIt/7ol6uSTjzjAzum+ASW7UlBbuJHuSgRjl8cA+RGkg==, + } + peerDependencies: + "@tiptap/extension-list": 3.27.3 + + "@tiptap/extension-code-block@3.27.3": + resolution: + { + integrity: sha512-3CVnzkpGoqqI5KaXI9l9PMwLkx34SYY63tpeo0I0QjDk4LU+JTAQDTPJFSwB4zTsHZ7ZFMU0jjasFOZ1kZRVgw==, + } + peerDependencies: + "@tiptap/core": 3.27.3 + "@tiptap/pm": 3.27.3 + + "@tiptap/extension-code@3.27.3": + resolution: + { + integrity: sha512-T7JF10Y3k7fyVujXXLVubdUh7fctgBUoiuxbvjotpltg1U/mPbOcT0UW/uif9j3H8TFvAwNApVw3x8bwwFUakA==, + } + peerDependencies: + "@tiptap/core": 3.27.3 + + "@tiptap/extension-document@3.27.3": + resolution: + { + integrity: sha512-PR25MRv56Nm4ETVLwA8nAh/0RrVdvD4D2nxnAC8kUkxz1WOYDaqTfPqqEeSWDoUUTUp1I1xzDkD4x0gEnAlmZA==, + } + peerDependencies: + "@tiptap/core": 3.27.3 + + "@tiptap/extension-dropcursor@3.27.3": resolution: { - integrity: sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==, + integrity: sha512-XsL0Ziual+ynXyx5JgLb0KIOShlMN3MW7+GQvf9PGRb1vOB7IOTRFDxMPrxDWcFIZ6WWMWSrbkCLOKHStt1BWg==, } - cpu: [arm] - os: [linux] + peerDependencies: + "@tiptap/extensions": 3.27.3 - "@rollup/rollup-linux-arm-musleabihf@4.60.1": + "@tiptap/extension-floating-menu@3.27.3": resolution: { - integrity: sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==, + integrity: sha512-qL+g1Z6MqZvYG4mHTPwub9II2fWZY+2I5VFfV8fzqy1HchBOyY6Df0mRKDNb0bmjBdFabIXnswz3iqLx3mDTbw==, } - cpu: [arm] - os: [linux] + peerDependencies: + "@floating-ui/dom": ^1.0.0 + "@tiptap/core": 3.27.3 + "@tiptap/pm": 3.27.3 - "@rollup/rollup-linux-arm64-gnu@4.60.1": + "@tiptap/extension-gapcursor@3.27.3": resolution: { - integrity: sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==, + integrity: sha512-MVBqzwYrDOttkn2GOrvvKTDCymfSS2VGSKpahcKKhge5mweSDiqko2X1vBDnMF8aVW3WxIFfDMmO4VMmh8HDZA==, } - cpu: [arm64] - os: [linux] + peerDependencies: + "@tiptap/extensions": 3.27.3 - "@rollup/rollup-linux-arm64-musl@4.60.1": + "@tiptap/extension-hard-break@3.27.3": resolution: { - integrity: sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==, + integrity: sha512-cySObJITR2CRrWII87mI2LJ12wEETTnxt2p1vvC6ZtUmKnB50fOu+ux8ZEt6KYNocIOtrEZthNFzTOx7R7UtrQ==, } - cpu: [arm64] - os: [linux] + peerDependencies: + "@tiptap/core": 3.27.3 - "@rollup/rollup-linux-loong64-gnu@4.60.1": + "@tiptap/extension-heading@3.27.3": resolution: { - integrity: sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==, + integrity: sha512-QHXnsNic6iId8pnsFZ8z4PkX5L+HCHa/D7rAi3nNWtPlSIAOxo4nKrALcB5/tHmY+XL8kEXKH3nsNLNEDLCYPg==, } - cpu: [loong64] - os: [linux] + peerDependencies: + "@tiptap/core": 3.27.3 - "@rollup/rollup-linux-loong64-musl@4.60.1": + "@tiptap/extension-highlight@3.27.3": resolution: { - integrity: sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==, + integrity: sha512-99QYxMx8F/NhdvznM8/Zhm4XiCdMU0OEiLwPvLNObJiKV8UBqjdA68cJLX6FRuOi2nqD7xfJq2KuSsFKBldi2A==, } - cpu: [loong64] - os: [linux] + peerDependencies: + "@tiptap/core": 3.27.3 - "@rollup/rollup-linux-ppc64-gnu@4.60.1": + "@tiptap/extension-horizontal-rule@3.27.3": resolution: { - integrity: sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==, + integrity: sha512-sNCuo0+Q001B5XTVWY+ULpWXQqtBNRmAqXxAexZl44bx3rDqHG8OzjwT4EM0LIj2+BYVbdqwaJ1vfQbZVEEbig==, } - cpu: [ppc64] - os: [linux] + peerDependencies: + "@tiptap/core": 3.27.3 + "@tiptap/pm": 3.27.3 - "@rollup/rollup-linux-ppc64-musl@4.60.1": + "@tiptap/extension-italic@3.27.3": resolution: { - integrity: sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==, + integrity: sha512-7VpVi2vn8kGFAc/HLrt96J/E6+LXOGKn8xLhJS863t150yLIG3EPQLA1h+G5O6eo+/w+9YokvJAAJoeDihj1Jg==, } - cpu: [ppc64] - os: [linux] + peerDependencies: + "@tiptap/core": 3.27.3 - "@rollup/rollup-linux-riscv64-gnu@4.60.1": + "@tiptap/extension-link@3.27.3": resolution: { - integrity: sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==, + integrity: sha512-iXmu1tJ/3vP60c9d+zfO3+X64vod2EyBrM1qeufecAtWA6t0bT9tYeka0Zq6qDRGsZK5zViO9F2lsY7eHXiYuA==, } - cpu: [riscv64] - os: [linux] + peerDependencies: + "@tiptap/core": 3.27.3 + "@tiptap/pm": 3.27.3 - "@rollup/rollup-linux-riscv64-musl@4.60.1": + "@tiptap/extension-list-item@3.27.3": resolution: { - integrity: sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==, + integrity: sha512-UddhVaQ7+V9IfQVVE8AJLNzSmyaaNpZPQsoPQxFNlJyOFxD6RwSTT8L4rb/TwbUctxSFWpyd1J7exzf33Ony/g==, } - cpu: [riscv64] - os: [linux] + peerDependencies: + "@tiptap/extension-list": 3.27.3 - "@rollup/rollup-linux-s390x-gnu@4.60.1": + "@tiptap/extension-list-keymap@3.27.3": resolution: { - integrity: sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==, + integrity: sha512-GZPVg4QCFm41yTMPEPeTlH2odNeQwRuWHY/pt3pI5LsfipQ4kDBv6h9we928vJQUnU2Gg9Y3cL5iRbmXIWWTUA==, } - cpu: [s390x] - os: [linux] + peerDependencies: + "@tiptap/extension-list": 3.27.3 - "@rollup/rollup-linux-x64-gnu@4.60.1": + "@tiptap/extension-list@3.27.3": resolution: { - integrity: sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==, + integrity: sha512-52rcaSzYjtVGUrNkdB8k1Bw/rId2lBirrWMvmnBLsieoeFd8zo8ow5zkwV057BYSgWXfnMAV7GOpDyq2IoSD9A==, } - cpu: [x64] - os: [linux] + peerDependencies: + "@tiptap/core": 3.27.3 + "@tiptap/pm": 3.27.3 - "@rollup/rollup-linux-x64-musl@4.60.1": + "@tiptap/extension-ordered-list@3.27.3": resolution: { - integrity: sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==, + integrity: sha512-oHYoE65WfRSM5tCcXi8MtQmzPxz83E2qw0pa2yHBKwr9xCCQUu8vJHJE+EJGduWdaNImv43+6/6kVMeYYbXRKg==, } - cpu: [x64] - os: [linux] + peerDependencies: + "@tiptap/extension-list": 3.27.3 - "@rollup/rollup-openbsd-x64@4.60.1": + "@tiptap/extension-paragraph@3.27.3": resolution: { - integrity: sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==, + integrity: sha512-G5XPCN7lm0nULYPelJC2eUbKbt1q97j67e/HSWxwMYEXhceec5eNAtVfpDCRyXNO9osyBi2kXqLv/IQtxbch9A==, } - cpu: [x64] - os: [openbsd] + peerDependencies: + "@tiptap/core": 3.27.3 - "@rollup/rollup-openharmony-arm64@4.60.1": + "@tiptap/extension-strike@3.27.3": resolution: { - integrity: sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==, + integrity: sha512-dp6Rs3I4zLVJPvAw2Q9yrNuYKcX5LTONH3/oyULvGsrqq5DKz7pqscfwhwnDSzrgm/3aCz6B9r1BVHlYI/DXlA==, } - cpu: [arm64] - os: [openharmony] + peerDependencies: + "@tiptap/core": 3.27.3 - "@rollup/rollup-win32-arm64-msvc@4.60.1": + "@tiptap/extension-text@3.27.3": resolution: { - integrity: sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==, + integrity: sha512-wSatZ/bop0pleeC18nF90zvWWEoRe/ewZncvm8LjcMrXwq41kTEs3j7nZflMYAh7X8fZvu00UIMeEyCNJl+5Yg==, } - cpu: [arm64] - os: [win32] + peerDependencies: + "@tiptap/core": 3.27.3 - "@rollup/rollup-win32-ia32-msvc@4.60.1": + "@tiptap/extension-underline@3.27.3": resolution: { - integrity: sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==, + integrity: sha512-YH7ka/Rp7ZwlzTuQCcs0OZ4CMSx/P/MzbseQKxKebEIZreWaKMZAaED97Fnu0dA66VlreD4/1C7xHJy84ovamg==, } - cpu: [ia32] - os: [win32] + peerDependencies: + "@tiptap/core": 3.27.3 - "@rollup/rollup-win32-x64-gnu@4.60.1": + "@tiptap/extensions@3.27.3": resolution: { - integrity: sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==, + integrity: sha512-IA2QKUVJgzUPEhhkUfr6P5u5GFVfhiApiEaaHXBz07saL2c4HNoVs2RC18QlZDCtLNKrPR1mUScr72u7uYs+YQ==, } - cpu: [x64] - os: [win32] + peerDependencies: + "@tiptap/core": 3.27.3 + "@tiptap/pm": 3.27.3 - "@rollup/rollup-win32-x64-msvc@4.60.1": + "@tiptap/pm@3.27.3": resolution: { - integrity: sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==, + integrity: sha512-ppiG57RxM3HSHHgcHT0hP6Ib4P56Sd5itxdV4w0hIGHKPGyLLKiAkYp+htIHa9T7IvjMdaqxIlsfyV3ZKsS1sw==, } - cpu: [x64] - os: [win32] - "@standard-schema/spec@1.1.0": + "@tiptap/react@3.27.3": resolution: { - integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==, + integrity: sha512-lanXxMScw/LevbRFuFw5MoQJ1grmHUDszwph2VIk4l2U5e/EDIw3rr4CeDME6Z4isVReD6zccMFVShkHqsv+jg==, } + peerDependencies: + "@tiptap/core": 3.27.3 + "@tiptap/pm": 3.27.3 + "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 + "@types/react-dom": ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 - "@standard-schema/utils@0.3.0": + "@tiptap/starter-kit@3.27.3": resolution: { - integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==, + integrity: sha512-xX3baFqiC30skntdhxUUvyJo755ON9c1pE83+2Wiq2g+Qnffg9knUuLCZStHoZZ318yB0aBsKAMvHWLtYDo8AA==, } - "@surma/rollup-plugin-off-main-thread@2.2.3": + "@tldraw/driver@5.2.4": resolution: { - integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==, + integrity: sha512-LqAg733PSA3bF1zR8hqipON98liS8aXkAg004Nq51DKxLzoSB6E2tGh7yJqqmr+P1bqMeSTmvcKOmj3zOxwIyA==, } + engines: { node: ">=22.12.0" } - "@tabby_ai/hijri-converter@1.0.5": + "@tldraw/editor@5.2.4": resolution: { - integrity: sha512-r5bClKrcIusDoo049dSL8CawnHR6mRdDwhlQuIgZRNty68q0x8k3Lf1BtPAMxRf/GgnHBnIO4ujd3+GQdLWzxQ==, + integrity: sha512-mYEa+4dqGPeQkoYpNQTVo0rZ1hehkc6hsza01Z3P6Ztams4klGVF7LGJlQ/UV+iIGh7DhYwMHkhPJl7Nff0Mmg==, } - engines: { node: ">=16.0.0" } + engines: { node: ">=22.12.0" } + peerDependencies: + react: ^18.2.0 || ^19.2.1 + react-dom: ^18.2.0 || ^19.2.1 - "@tailwindcss/typography@0.5.19": + "@tldraw/state-react@5.2.4": resolution: { - integrity: sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==, + integrity: sha512-skTXBKLedoLsNDG7hlBMNfcaBvgsxQ0PJpVFpeEcJRlDIlw7v2QBNfJP6AJ2XJjv7p0dnbhh/ckGsK7hWiQpQA==, } + engines: { node: ">=22.12.0" } peerDependencies: - tailwindcss: ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" + react: ^18.2.0 || ^19.2.1 + react-dom: ^18.2.0 || ^19.2.1 - "@tanstack/query-core@5.95.2": + "@tldraw/state@5.2.4": resolution: { - integrity: sha512-o4T8vZHZET4Bib3jZ/tCW9/7080urD4c+0/AUaYVpIqOsr7y0reBc1oX3ttNaSW5mYyvZHctiQ/UOP2PfdmFEQ==, + integrity: sha512-N+3+w/fQq3KvWvC+IpR0b3Qk4glRApqXlAjOw80B9IsPwlDkUOHQEwEBweq917Ec1+TYG+frXS4ncEBXXNOh+A==, } + engines: { node: ">=22.12.0" } - "@tanstack/react-query@5.95.2": + "@tldraw/store@5.2.4": resolution: { - integrity: sha512-/wGkvLj/st5Ud1Q76KF1uFxScV7WeqN1slQx5280ycwAyYkIPGaRZAEgHxe3bjirSd5Zpwkj6zNcR4cqYni/ZA==, + integrity: sha512-tilVSDjW/LT82dKbxXl6SC5E6rcyTymmehk2h9SdzX1wgAbumbs8oaIpTq7u5BgN5hkDNXCWqqQXhf20/kuzJQ==, } + engines: { node: ">=22.12.0" } peerDependencies: - react: ^18 || ^19 + react: ^18.2.0 || ^19.2.1 - "@testing-library/dom@10.4.1": + "@tldraw/tlschema@5.2.4": resolution: { - integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==, + integrity: sha512-8z6FKU9Lz6BLWbwXBAEDyGxY1qtgzeJINKqSwkBDT/QgMcdyxU6wXyh5BHV8UwAkUFY9CmA52o41BdS7MButew==, } - engines: { node: ">=18" } + engines: { node: ">=22.12.0" } + peerDependencies: + react: ^18.2.0 || ^19.2.1 + react-dom: ^18.2.0 || ^19.2.1 - "@testing-library/react@16.3.2": + "@tldraw/utils@5.2.4": resolution: { - integrity: sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==, + integrity: sha512-eaNWU3A84dqXGSmTo8J+4EBn4TwnkLd/c9hjDwcFZeDq5qY1Ug8chZyhHE1So9dX9yoVtIdSpxRwBpMh1qnGMw==, } - engines: { node: ">=18" } - peerDependencies: - "@testing-library/dom": ^10.0.0 - "@types/react": ^18.0.0 || ^19.0.0 - "@types/react-dom": ^18.0.0 || ^19.0.0 - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true + engines: { node: ">=22.12.0" } + + "@tldraw/validate@5.2.4": + resolution: + { + integrity: sha512-hNuRQISI7NNLmQDa7UNI0+cytwsqCVQkywiw/fXf44aFxEefi/PnLJyAtDywD7Mi2RHZ/Yb9pIlJl1HI0bRC0w==, + } + engines: { node: ">=22.12.0" } "@types/aria-query@5.0.4": resolution: @@ -5468,6 +6665,12 @@ packages: } engines: { node: ">= 0.6" } + eventemitter3@4.0.7: + resolution: + { + integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==, + } + eventemitter3@5.0.4: resolution: { @@ -5529,6 +6732,13 @@ packages: integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, } + fast-equals@5.4.1: + resolution: + { + integrity: sha512-DjlFSM5Pk9cGcL0q5QXl66eGzx0N6szNgaswwc5ZphlBohjTVJSnGgI+rJVOgOi65qUoQnDZN4nDqi33udtydQ==, + } + engines: { node: ">=6.0.0" } + fast-glob@3.3.3: resolution: { @@ -6311,6 +7521,13 @@ packages: } engines: { node: ">=12" } + is-plain-object@5.0.0: + resolution: + { + integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==, + } + engines: { node: ">=0.10.0" } + is-potential-custom-element-name@1.0.1: resolution: { @@ -6675,6 +7892,12 @@ packages: integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, } + linkifyjs@4.3.3: + resolution: + { + integrity: sha512-P8aEP5U/D1/IlTY2OeYsErdwh9bGuLE30NcXtKEjgdHcahveQoQwM2yZNsioQHsWFz0P7KKudisbrzCgR0sDHg==, + } + lint-staged@16.4.0: resolution: { @@ -6709,6 +7932,19 @@ packages: integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==, } + lodash.isequal@4.5.0: + resolution: + { + integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==, + } + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. + + lodash.isequalwith@4.4.0: + resolution: + { + integrity: sha512-dcZON0IalGBpRmJBmMkaoV7d3I80R2O+FrzsZyHdNSFrANq/cgDqKQNmAHE8UEj4+QYWwwhkQOVdLHiAopzlsQ==, + } + lodash.merge@4.6.2: resolution: { @@ -6721,6 +7957,18 @@ packages: integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==, } + lodash.throttle@4.1.1: + resolution: + { + integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==, + } + + lodash.uniq@4.5.0: + resolution: + { + integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==, + } + lodash@4.17.23: resolution: { @@ -7374,6 +8622,12 @@ packages: } engines: { node: ">= 0.8.0" } + orderedmap@2.1.1: + resolution: + { + integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==, + } + own-keys@1.0.1: resolution: { @@ -7814,6 +9068,84 @@ packages: integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==, } + prosemirror-changeset@2.4.1: + resolution: + { + integrity: sha512-96WBLhOaYhJ+kPhLg3uW359Tz6I/MfcrQfL4EGv4SrcqKEMC1gmoGrXHecPE8eOwTVCJ4IwgfzM8fFad25wNfw==, + } + + prosemirror-commands@1.7.1: + resolution: + { + integrity: sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==, + } + + prosemirror-dropcursor@1.8.3: + resolution: + { + integrity: sha512-FoYbsJR8gK+DGlqhNoE29Loa38eIZPzQRIb1VMaDNBoo4OLP6vVof/jR8qFY/6XvUd6Dhug8MDCHl2a/h8RTfQ==, + } + + prosemirror-gapcursor@1.4.1: + resolution: + { + integrity: sha512-pMdYaEnjNMSwl11yjEGtgTmLkR08m/Vl+Jj443167p9eB3HVQKhYCc4gmHVDsLPODfZfjr/MmirsdyZziXbQKw==, + } + + prosemirror-history@1.5.0: + resolution: + { + integrity: sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==, + } + + prosemirror-inputrules@1.5.1: + resolution: + { + integrity: sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==, + } + + prosemirror-keymap@1.2.3: + resolution: + { + integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==, + } + + prosemirror-model@1.25.10: + resolution: + { + integrity: sha512-9n6rH4DbJU1eH4SxLt6Y0HhJIo6cZsb7DJ/30uob1hOKPeO6TAaMWI2tc7kwR92BjfPOU2fFHWbZLovLi3XQfA==, + } + + prosemirror-schema-list@1.5.1: + resolution: + { + integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==, + } + + prosemirror-state@1.4.4: + resolution: + { + integrity: sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==, + } + + prosemirror-tables@1.8.5: + resolution: + { + integrity: sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==, + } + + prosemirror-transform@1.12.0: + resolution: + { + integrity: sha512-GxboyN4AMIsoHNtz5uf2r2Ru551i5hWeCMD6E2Ib4Eogqoub0NflniaBPVQ4MrGE5yZ8JV9tUHg9qcZTTrcN4w==, + } + + prosemirror-view@1.42.0: + resolution: + { + integrity: sha512-N54DF3OXNWDuP81G1kbfCys8ZzIjuL1VnvJ2mk5STSu/fNxWIcX/EutQLA3s9KR/2wVhgDi4hzBB/1fINVxk0A==, + } + proxy-addr@2.0.7: resolution: { @@ -7847,6 +9179,28 @@ packages: integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==, } + quickselect@2.0.0: + resolution: + { + integrity: sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==, + } + + radix-ui@1.6.2: + resolution: + { + integrity: sha512-OwYUjzMwiInCUxgAWpPsavXC3Kh4iyi/49uU1/qZTG3RQDlvegyk1GOMiGvSkjua1RDb3JD3fo3eroL9FV4GQw==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + randombytes@2.1.0: resolution: { @@ -7867,6 +9221,12 @@ packages: } engines: { node: ">= 0.10" } + rbush@3.0.1: + resolution: + { + integrity: sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==, + } + react-day-picker@9.14.0: resolution: { @@ -8250,6 +9610,12 @@ packages: engines: { node: ">=18.0.0", npm: ">=8.0.0" } hasBin: true + rope-sequence@1.3.4: + resolution: + { + integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==, + } + roughjs@4.6.6: resolution: { @@ -8890,6 +10256,16 @@ packages: } engines: { node: ">=14.0.0" } + tldraw@5.2.4: + resolution: + { + integrity: sha512-RI/4GASv62/ChhNAA4SrwYnrI2vlpvtDxp0r67rGOO0qm6vq45NVNQ9DuLcCE4yhUlEBT70zcB4ABAXTVn95yg==, + } + engines: { node: ">=22.12.0" } + peerDependencies: + react: ^18.2.0 || ^19.2.1 + react-dom: ^18.2.0 || ^19.2.1 + tldts-core@7.0.28: resolution: { @@ -9430,6 +10806,12 @@ packages: jsdom: optional: true + w3c-keyname@2.2.8: + resolution: + { + integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==, + } + w3c-xmlserializer@5.0.0: resolution: { @@ -11046,69 +12428,540 @@ snapshots: "@nodelib/fs.scandir": 2.1.5 fastq: 1.20.1 - "@pinojs/redact@0.4.0": {} + "@pinojs/redact@0.4.0": {} + + "@pkgjs/parseargs@0.11.0": + optional: true + + "@playwright/test@1.58.2": + dependencies: + playwright: 1.58.2 + + "@radix-ui/number@1.1.1": {} + + "@radix-ui/number@1.1.2": {} + + "@radix-ui/primitive@1.1.3": {} + + "@radix-ui/primitive@1.1.5": {} + + "@radix-ui/react-accessible-icon@1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/react-visually-hidden": 1.2.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-accordion@1.2.16(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/primitive": 1.1.5 + "@radix-ui/react-collapsible": 1.1.16(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-collection": 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-compose-refs": 1.1.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context": 1.2.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-direction": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-id": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.2.3(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-alert-dialog@1.1.19(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/primitive": 1.1.5 + "@radix-ui/react-compose-refs": 1.1.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context": 1.2.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-dialog": 1.1.19(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-arrow@1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-arrow@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/react-primitive": 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-aspect-ratio@1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-avatar@1.2.2(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/react-context": 1.2.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-callback-ref": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-is-hydrated": 0.1.1(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-layout-effect": 1.1.2(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-checkbox@1.3.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/primitive": 1.1.3 + "@radix-ui/react-compose-refs": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-presence": 1.1.5(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-primitive": 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.2.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-previous": 1.1.1(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-size": 1.1.1(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-checkbox@1.3.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/primitive": 1.1.5 + "@radix-ui/react-compose-refs": 1.1.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context": 1.2.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-presence": 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.2.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-previous": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-size": 1.1.2(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-collapsible@1.1.16(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/primitive": 1.1.5 + "@radix-ui/react-compose-refs": 1.1.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context": 1.2.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-id": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-presence": 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.2.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-layout-effect": 1.1.2(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-collection@1.1.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/react-compose-refs": 1.1.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context": 1.2.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-slot": 1.3.0(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-collection@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/react-compose-refs": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-primitive": 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-slot": 1.2.3(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-compose-refs@1.1.2(@types/react@18.3.28)(react@18.3.1)": + dependencies: + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.28 + + "@radix-ui/react-compose-refs@1.1.3(@types/react@18.3.28)(react@18.3.1)": + dependencies: + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.28 + + "@radix-ui/react-context-menu@2.3.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/primitive": 1.1.5 + "@radix-ui/react-context": 1.2.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-menu": 2.1.20(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.2.3(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-context@1.1.2(@types/react@18.3.28)(react@18.3.1)": + dependencies: + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.28 + + "@radix-ui/react-context@1.2.0(@types/react@18.3.28)(react@18.3.1)": + dependencies: + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.28 + + "@radix-ui/react-dialog@1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/primitive": 1.1.3 + "@radix-ui/react-compose-refs": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-dismissable-layer": 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-focus-guards": 1.1.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-focus-scope": 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-id": 1.1.1(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-portal": 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-presence": 1.1.5(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-primitive": 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-slot": 1.2.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.2.2(@types/react@18.3.28)(react@18.3.1) + aria-hidden: 1.2.6 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.7.2(@types/react@18.3.28)(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-dialog@1.1.19(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/primitive": 1.1.5 + "@radix-ui/react-compose-refs": 1.1.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context": 1.2.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-dismissable-layer": 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-focus-guards": 1.1.4(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-focus-scope": 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-id": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-portal": 1.1.13(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-presence": 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-slot": 1.3.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.2.3(@types/react@18.3.28)(react@18.3.1) + aria-hidden: 1.2.6 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.7.2(@types/react@18.3.28)(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-direction@1.1.1(@types/react@18.3.28)(react@18.3.1)": + dependencies: + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.28 + + "@radix-ui/react-direction@1.1.2(@types/react@18.3.28)(react@18.3.1)": + dependencies: + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.28 + + "@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/primitive": 1.1.3 + "@radix-ui/react-compose-refs": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-primitive": 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-callback-ref": 1.1.1(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-escape-keydown": 1.1.1(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-dismissable-layer@1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/primitive": 1.1.5 + "@radix-ui/react-compose-refs": 1.1.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-callback-ref": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-effect-event": 0.0.3(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/primitive": 1.1.3 + "@radix-ui/react-compose-refs": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-id": 1.1.1(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-menu": 2.1.16(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-primitive": 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.2.2(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-dropdown-menu@2.1.20(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/primitive": 1.1.5 + "@radix-ui/react-compose-refs": 1.1.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context": 1.2.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-id": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-menu": 2.1.20(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.2.3(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-focus-guards@1.1.3(@types/react@18.3.28)(react@18.3.1)": + dependencies: + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.28 + + "@radix-ui/react-focus-guards@1.1.4(@types/react@18.3.28)(react@18.3.1)": + dependencies: + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.28 + + "@radix-ui/react-focus-scope@1.1.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/react-compose-refs": 1.1.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-callback-ref": 1.1.2(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-focus-scope@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/react-compose-refs": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-primitive": 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-callback-ref": 1.1.1(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-form@0.1.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/primitive": 1.1.5 + "@radix-ui/react-compose-refs": 1.1.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context": 1.2.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-id": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-label": 2.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) - "@pkgjs/parseargs@0.11.0": - optional: true + "@radix-ui/react-hover-card@1.1.19(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/primitive": 1.1.5 + "@radix-ui/react-compose-refs": 1.1.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context": 1.2.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-dismissable-layer": 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-popper": 1.3.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-portal": 1.1.13(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-presence": 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.2.3(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) - "@playwright/test@1.58.2": + "@radix-ui/react-id@1.1.1(@types/react@18.3.28)(react@18.3.1)": dependencies: - playwright: 1.58.2 - - "@radix-ui/number@1.1.1": {} + "@radix-ui/react-use-layout-effect": 1.1.1(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.28 - "@radix-ui/primitive@1.1.3": {} + "@radix-ui/react-id@1.1.2(@types/react@18.3.28)(react@18.3.1)": + dependencies: + "@radix-ui/react-use-layout-effect": 1.1.2(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.28 - "@radix-ui/react-arrow@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + "@radix-ui/react-label@2.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": dependencies: - "@radix-ui/react-primitive": 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: "@types/react": 18.3.28 "@types/react-dom": 18.3.7(@types/react@18.3.28) - "@radix-ui/react-checkbox@1.3.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + "@radix-ui/react-menu@2.1.16(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": dependencies: "@radix-ui/primitive": 1.1.3 + "@radix-ui/react-collection": 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) "@radix-ui/react-compose-refs": 1.1.2(@types/react@18.3.28)(react@18.3.1) "@radix-ui/react-context": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-direction": 1.1.1(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-dismissable-layer": 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-focus-guards": 1.1.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-focus-scope": 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-id": 1.1.1(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-popper": 1.2.8(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-portal": 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) "@radix-ui/react-presence": 1.1.5(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) "@radix-ui/react-primitive": 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@radix-ui/react-use-controllable-state": 1.2.2(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-use-previous": 1.1.1(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-use-size": 1.1.1(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-roving-focus": 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-slot": 1.2.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-callback-ref": 1.1.1(@types/react@18.3.28)(react@18.3.1) + aria-hidden: 1.2.6 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.7.2(@types/react@18.3.28)(react@18.3.1) optionalDependencies: "@types/react": 18.3.28 "@types/react-dom": 18.3.7(@types/react@18.3.28) - "@radix-ui/react-collection@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": - dependencies: - "@radix-ui/react-compose-refs": 1.1.2(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-context": 1.1.2(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-primitive": 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@radix-ui/react-slot": 1.2.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-menu@2.1.20(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/primitive": 1.1.5 + "@radix-ui/react-collection": 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-compose-refs": 1.1.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context": 1.2.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-direction": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-dismissable-layer": 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-focus-guards": 1.1.4(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-focus-scope": 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-id": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-popper": 1.3.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-portal": 1.1.13(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-presence": 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-roving-focus": 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-slot": 1.3.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-callback-ref": 1.1.2(@types/react@18.3.28)(react@18.3.1) + aria-hidden: 1.2.6 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.7.2(@types/react@18.3.28)(react@18.3.1) optionalDependencies: "@types/react": 18.3.28 "@types/react-dom": 18.3.7(@types/react@18.3.28) - "@radix-ui/react-compose-refs@1.1.2(@types/react@18.3.28)(react@18.3.1)": - dependencies: + "@radix-ui/react-menubar@1.1.20(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/primitive": 1.1.5 + "@radix-ui/react-collection": 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-compose-refs": 1.1.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context": 1.2.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-direction": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-id": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-menu": 2.1.20(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-roving-focus": 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.2.3(@types/react@18.3.28)(react@18.3.1) react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) - "@radix-ui/react-context@1.1.2(@types/react@18.3.28)(react@18.3.1)": + "@radix-ui/react-navigation-menu@1.2.18(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/primitive": 1.1.5 + "@radix-ui/react-collection": 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-compose-refs": 1.1.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context": 1.2.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-direction": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-dismissable-layer": 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-id": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-presence": 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-callback-ref": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.2.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-layout-effect": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-previous": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-visually-hidden": 1.2.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-one-time-password-field@0.1.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/number": 1.1.2 + "@radix-ui/primitive": 1.1.5 + "@radix-ui/react-collection": 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-compose-refs": 1.1.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context": 1.2.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-direction": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-roving-focus": 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.2.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-effect-event": 0.0.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-is-hydrated": 0.1.1(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-layout-effect": 1.1.2(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-password-toggle-field@0.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": dependencies: + "@radix-ui/primitive": 1.1.5 + "@radix-ui/react-compose-refs": 1.1.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context": 1.2.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-id": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.2.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-effect-event": 0.0.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-is-hydrated": 0.1.1(@types/react@18.3.28)(react@18.3.1) react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) - "@radix-ui/react-dialog@1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + "@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": dependencies: "@radix-ui/primitive": 1.1.3 "@radix-ui/react-compose-refs": 1.1.2(@types/react@18.3.28)(react@18.3.1) @@ -11117,6 +12970,7 @@ snapshots: "@radix-ui/react-focus-guards": 1.1.3(@types/react@18.3.28)(react@18.3.1) "@radix-ui/react-focus-scope": 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) "@radix-ui/react-id": 1.1.1(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-popper": 1.2.8(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) "@radix-ui/react-portal": 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) "@radix-ui/react-presence": 1.1.5(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) "@radix-ui/react-primitive": 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -11130,105 +12984,250 @@ snapshots: "@types/react": 18.3.28 "@types/react-dom": 18.3.7(@types/react@18.3.28) - "@radix-ui/react-direction@1.1.1(@types/react@18.3.28)(react@18.3.1)": - dependencies: + "@radix-ui/react-popover@1.1.19(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/primitive": 1.1.5 + "@radix-ui/react-compose-refs": 1.1.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context": 1.2.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-dismissable-layer": 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-focus-guards": 1.1.4(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-focus-scope": 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-id": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-popper": 1.3.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-portal": 1.1.13(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-presence": 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-slot": 1.3.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.2.3(@types/react@18.3.28)(react@18.3.1) + aria-hidden: 1.2.6 react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.7.2(@types/react@18.3.28)(react@18.3.1) optionalDependencies: "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) - "@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + "@radix-ui/react-popper@1.2.8(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": dependencies: - "@radix-ui/primitive": 1.1.3 + "@floating-ui/react-dom": 2.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-arrow": 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) "@radix-ui/react-compose-refs": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context": 1.1.2(@types/react@18.3.28)(react@18.3.1) "@radix-ui/react-primitive": 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) "@radix-ui/react-use-callback-ref": 1.1.1(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-use-escape-keydown": 1.1.1(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-layout-effect": 1.1.1(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-rect": 1.1.1(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-size": 1.1.1(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/rect": 1.1.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: "@types/react": 18.3.28 "@types/react-dom": 18.3.7(@types/react@18.3.28) - "@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + "@radix-ui/react-popper@1.3.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": dependencies: - "@radix-ui/primitive": 1.1.3 - "@radix-ui/react-compose-refs": 1.1.2(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-context": 1.1.2(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-id": 1.1.1(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-menu": 2.1.16(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@radix-ui/react-primitive": 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@radix-ui/react-use-controllable-state": 1.2.2(@types/react@18.3.28)(react@18.3.1) + "@floating-ui/react-dom": 2.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-arrow": 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-compose-refs": 1.1.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context": 1.2.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-callback-ref": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-layout-effect": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-rect": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-size": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/rect": 1.1.2 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: "@types/react": 18.3.28 "@types/react-dom": 18.3.7(@types/react@18.3.28) - "@radix-ui/react-focus-guards@1.1.3(@types/react@18.3.28)(react@18.3.1)": + "@radix-ui/react-portal@1.1.13(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": dependencies: + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-layout-effect": 1.1.2(@types/react@18.3.28)(react@18.3.1) react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) - "@radix-ui/react-focus-scope@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + "@radix-ui/react-portal@1.1.9(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": dependencies: - "@radix-ui/react-compose-refs": 1.1.2(@types/react@18.3.28)(react@18.3.1) "@radix-ui/react-primitive": 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@radix-ui/react-use-callback-ref": 1.1.1(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-layout-effect": 1.1.1(@types/react@18.3.28)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: "@types/react": 18.3.28 "@types/react-dom": 18.3.7(@types/react@18.3.28) - "@radix-ui/react-id@1.1.1(@types/react@18.3.28)(react@18.3.1)": + "@radix-ui/react-presence@1.1.5(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": dependencies: + "@radix-ui/react-compose-refs": 1.1.2(@types/react@18.3.28)(react@18.3.1) "@radix-ui/react-use-layout-effect": 1.1.1(@types/react@18.3.28)(react@18.3.1) react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) - "@radix-ui/react-menu@2.1.16(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + "@radix-ui/react-presence@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/react-use-layout-effect": 1.1.2(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-primitive@2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/react-slot": 1.2.3(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-primitive@2.1.4(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/react-slot": 1.2.4(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-primitive@2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/react-slot": 1.3.0(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-progress@1.1.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/react-context": 1.2.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-radio-group@1.4.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/primitive": 1.1.5 + "@radix-ui/react-compose-refs": 1.1.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context": 1.2.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-direction": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-presence": 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-roving-focus": 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.2.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-previous": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-size": 1.1.2(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-roving-focus@1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": dependencies: "@radix-ui/primitive": 1.1.3 "@radix-ui/react-collection": 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) "@radix-ui/react-compose-refs": 1.1.2(@types/react@18.3.28)(react@18.3.1) "@radix-ui/react-context": 1.1.2(@types/react@18.3.28)(react@18.3.1) "@radix-ui/react-direction": 1.1.1(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-dismissable-layer": 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@radix-ui/react-focus-guards": 1.1.3(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-focus-scope": 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) "@radix-ui/react-id": 1.1.1(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-popper": 1.2.8(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@radix-ui/react-portal": 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-primitive": 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-callback-ref": 1.1.1(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.2.2(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-roving-focus@1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/primitive": 1.1.5 + "@radix-ui/react-collection": 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-compose-refs": 1.1.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context": 1.2.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-direction": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-id": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-callback-ref": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.2.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-is-hydrated": 0.1.1(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-layout-effect": 1.1.2(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-scroll-area@1.2.10(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/number": 1.1.1 + "@radix-ui/primitive": 1.1.3 + "@radix-ui/react-compose-refs": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-direction": 1.1.1(@types/react@18.3.28)(react@18.3.1) "@radix-ui/react-presence": 1.1.5(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) "@radix-ui/react-primitive": 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@radix-ui/react-roving-focus": 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@radix-ui/react-slot": 1.2.3(@types/react@18.3.28)(react@18.3.1) "@radix-ui/react-use-callback-ref": 1.1.1(@types/react@18.3.28)(react@18.3.1) - aria-hidden: 1.2.6 + "@radix-ui/react-use-layout-effect": 1.1.1(@types/react@18.3.28)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.7.2(@types/react@18.3.28)(react@18.3.1) optionalDependencies: "@types/react": 18.3.28 "@types/react-dom": 18.3.7(@types/react@18.3.28) - "@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + "@radix-ui/react-scroll-area@1.2.14(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/number": 1.1.2 + "@radix-ui/primitive": 1.1.5 + "@radix-ui/react-compose-refs": 1.1.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context": 1.2.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-direction": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-presence": 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-callback-ref": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-layout-effect": 1.1.2(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + + "@radix-ui/react-select@2.2.6(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": dependencies: + "@radix-ui/number": 1.1.1 "@radix-ui/primitive": 1.1.3 + "@radix-ui/react-collection": 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) "@radix-ui/react-compose-refs": 1.1.2(@types/react@18.3.28)(react@18.3.1) "@radix-ui/react-context": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-direction": 1.1.1(@types/react@18.3.28)(react@18.3.1) "@radix-ui/react-dismissable-layer": 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) "@radix-ui/react-focus-guards": 1.1.3(@types/react@18.3.28)(react@18.3.1) "@radix-ui/react-focus-scope": 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) "@radix-ui/react-id": 1.1.1(@types/react@18.3.28)(react@18.3.1) "@radix-ui/react-popper": 1.2.8(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) "@radix-ui/react-portal": 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@radix-ui/react-presence": 1.1.5(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) "@radix-ui/react-primitive": 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) "@radix-ui/react-slot": 1.2.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-callback-ref": 1.1.1(@types/react@18.3.28)(react@18.3.1) "@radix-ui/react-use-controllable-state": 1.2.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-layout-effect": 1.1.1(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-previous": 1.1.1(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-visually-hidden": 1.2.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) aria-hidden: 1.2.6 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -11237,138 +13236,196 @@ snapshots: "@types/react": 18.3.28 "@types/react-dom": 18.3.7(@types/react@18.3.28) - "@radix-ui/react-popper@1.2.8(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": - dependencies: - "@floating-ui/react-dom": 2.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@radix-ui/react-arrow": 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@radix-ui/react-compose-refs": 1.1.2(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-context": 1.1.2(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-primitive": 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@radix-ui/react-use-callback-ref": 1.1.1(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-use-layout-effect": 1.1.1(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-use-rect": 1.1.1(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-use-size": 1.1.1(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/rect": 1.1.1 + "@radix-ui/react-select@2.3.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/number": 1.1.2 + "@radix-ui/primitive": 1.1.5 + "@radix-ui/react-collection": 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-compose-refs": 1.1.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context": 1.2.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-direction": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-dismissable-layer": 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-focus-guards": 1.1.4(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-focus-scope": 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-id": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-popper": 1.3.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-portal": 1.1.13(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-presence": 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-slot": 1.3.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-callback-ref": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.2.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-layout-effect": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-previous": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-visually-hidden": 1.2.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + aria-hidden: 1.2.6 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.7.2(@types/react@18.3.28)(react@18.3.1) optionalDependencies: "@types/react": 18.3.28 "@types/react-dom": 18.3.7(@types/react@18.3.28) - "@radix-ui/react-portal@1.1.9(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + "@radix-ui/react-separator@1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": dependencies: - "@radix-ui/react-primitive": 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@radix-ui/react-use-layout-effect": 1.1.1(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: "@types/react": 18.3.28 "@types/react-dom": 18.3.7(@types/react@18.3.28) - "@radix-ui/react-presence@1.1.5(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": - dependencies: - "@radix-ui/react-compose-refs": 1.1.2(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-use-layout-effect": 1.1.1(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-slider@1.4.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/number": 1.1.2 + "@radix-ui/primitive": 1.1.5 + "@radix-ui/react-collection": 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-compose-refs": 1.1.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context": 1.2.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-direction": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.2.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-layout-effect": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-previous": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-size": 1.1.2(@types/react@18.3.28)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: "@types/react": 18.3.28 "@types/react-dom": 18.3.7(@types/react@18.3.28) - "@radix-ui/react-primitive@2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + "@radix-ui/react-slot@1.2.3(@types/react@18.3.28)(react@18.3.1)": dependencies: - "@radix-ui/react-slot": 1.2.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-compose-refs": 1.1.2(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.28 + + "@radix-ui/react-slot@1.2.4(@types/react@18.3.28)(react@18.3.1)": + dependencies: + "@radix-ui/react-compose-refs": 1.1.2(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.28 + + "@radix-ui/react-slot@1.3.0(@types/react@18.3.28)(react@18.3.1)": + dependencies: + "@radix-ui/react-compose-refs": 1.1.3(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.28 + + "@radix-ui/react-switch@1.3.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/primitive": 1.1.5 + "@radix-ui/react-compose-refs": 1.1.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context": 1.2.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.2.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-previous": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-size": 1.1.2(@types/react@18.3.28)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: "@types/react": 18.3.28 "@types/react-dom": 18.3.7(@types/react@18.3.28) - "@radix-ui/react-primitive@2.1.4(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + "@radix-ui/react-tabs@1.1.17(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": dependencies: - "@radix-ui/react-slot": 1.2.4(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/primitive": 1.1.5 + "@radix-ui/react-context": 1.2.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-direction": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-id": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-presence": 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-roving-focus": 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.2.3(@types/react@18.3.28)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: "@types/react": 18.3.28 "@types/react-dom": 18.3.7(@types/react@18.3.28) - "@radix-ui/react-roving-focus@1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": - dependencies: - "@radix-ui/primitive": 1.1.3 - "@radix-ui/react-collection": 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@radix-ui/react-compose-refs": 1.1.2(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-context": 1.1.2(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-direction": 1.1.1(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-id": 1.1.1(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-primitive": 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@radix-ui/react-use-callback-ref": 1.1.1(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-use-controllable-state": 1.2.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-toast@1.2.19(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/primitive": 1.1.5 + "@radix-ui/react-collection": 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-compose-refs": 1.1.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context": 1.2.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-dismissable-layer": 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-portal": 1.1.13(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-presence": 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-callback-ref": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.2.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-layout-effect": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-visually-hidden": 1.2.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: "@types/react": 18.3.28 "@types/react-dom": 18.3.7(@types/react@18.3.28) - "@radix-ui/react-scroll-area@1.2.10(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + "@radix-ui/react-toggle-group@1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": dependencies: - "@radix-ui/number": 1.1.1 - "@radix-ui/primitive": 1.1.3 - "@radix-ui/react-compose-refs": 1.1.2(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-context": 1.1.2(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-direction": 1.1.1(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-presence": 1.1.5(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@radix-ui/react-primitive": 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@radix-ui/react-use-callback-ref": 1.1.1(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-use-layout-effect": 1.1.1(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/primitive": 1.1.5 + "@radix-ui/react-context": 1.2.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-direction": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-roving-focus": 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-toggle": 1.1.14(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.2.3(@types/react@18.3.28)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: "@types/react": 18.3.28 "@types/react-dom": 18.3.7(@types/react@18.3.28) - "@radix-ui/react-select@2.2.6(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + "@radix-ui/react-toggle@1.1.14(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": dependencies: - "@radix-ui/number": 1.1.1 - "@radix-ui/primitive": 1.1.3 - "@radix-ui/react-collection": 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@radix-ui/react-compose-refs": 1.1.2(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-context": 1.1.2(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-direction": 1.1.1(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-dismissable-layer": 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@radix-ui/react-focus-guards": 1.1.3(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-focus-scope": 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@radix-ui/react-id": 1.1.1(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-popper": 1.2.8(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@radix-ui/react-portal": 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@radix-ui/react-primitive": 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@radix-ui/react-slot": 1.2.3(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-use-callback-ref": 1.1.1(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-use-controllable-state": 1.2.2(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-use-layout-effect": 1.1.1(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-use-previous": 1.1.1(@types/react@18.3.28)(react@18.3.1) - "@radix-ui/react-visually-hidden": 1.2.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - aria-hidden: 1.2.6 + "@radix-ui/primitive": 1.1.5 + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.2.3(@types/react@18.3.28)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.7.2(@types/react@18.3.28)(react@18.3.1) optionalDependencies: "@types/react": 18.3.28 "@types/react-dom": 18.3.7(@types/react@18.3.28) - "@radix-ui/react-slot@1.2.3(@types/react@18.3.28)(react@18.3.1)": + "@radix-ui/react-toolbar@1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": dependencies: - "@radix-ui/react-compose-refs": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/primitive": 1.1.5 + "@radix-ui/react-context": 1.2.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-direction": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-roving-focus": 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-separator": 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-toggle-group": 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) - "@radix-ui/react-slot@1.2.4(@types/react@18.3.28)(react@18.3.1)": - dependencies: - "@radix-ui/react-compose-refs": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-tooltip@1.2.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/primitive": 1.1.5 + "@radix-ui/react-compose-refs": 1.1.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context": 1.2.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-dismissable-layer": 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-id": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-popper": 1.3.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-portal": 1.1.13(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-presence": 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-slot": 1.3.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.2.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-visually-hidden": 1.2.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) "@radix-ui/react-tooltip@1.2.8(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": dependencies: @@ -11396,6 +13453,12 @@ snapshots: optionalDependencies: "@types/react": 18.3.28 + "@radix-ui/react-use-callback-ref@1.1.2(@types/react@18.3.28)(react@18.3.1)": + dependencies: + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.28 + "@radix-ui/react-use-controllable-state@1.2.2(@types/react@18.3.28)(react@18.3.1)": dependencies: "@radix-ui/react-use-effect-event": 0.0.2(@types/react@18.3.28)(react@18.3.1) @@ -11404,6 +13467,14 @@ snapshots: optionalDependencies: "@types/react": 18.3.28 + "@radix-ui/react-use-controllable-state@1.2.3(@types/react@18.3.28)(react@18.3.1)": + dependencies: + "@radix-ui/react-use-effect-event": 0.0.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-layout-effect": 1.1.2(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.28 + "@radix-ui/react-use-effect-event@0.0.2(@types/react@18.3.28)(react@18.3.1)": dependencies: "@radix-ui/react-use-layout-effect": 1.1.1(@types/react@18.3.28)(react@18.3.1) @@ -11411,6 +13482,13 @@ snapshots: optionalDependencies: "@types/react": 18.3.28 + "@radix-ui/react-use-effect-event@0.0.3(@types/react@18.3.28)(react@18.3.1)": + dependencies: + "@radix-ui/react-use-layout-effect": 1.1.2(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.28 + "@radix-ui/react-use-escape-keydown@1.1.1(@types/react@18.3.28)(react@18.3.1)": dependencies: "@radix-ui/react-use-callback-ref": 1.1.1(@types/react@18.3.28)(react@18.3.1) @@ -11418,18 +13496,43 @@ snapshots: optionalDependencies: "@types/react": 18.3.28 + "@radix-ui/react-use-escape-keydown@1.1.3(@types/react@18.3.28)(react@18.3.1)": + dependencies: + "@radix-ui/react-use-callback-ref": 1.1.2(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.28 + + "@radix-ui/react-use-is-hydrated@0.1.1(@types/react@18.3.28)(react@18.3.1)": + dependencies: + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.28 + "@radix-ui/react-use-layout-effect@1.1.1(@types/react@18.3.28)(react@18.3.1)": dependencies: react: 18.3.1 optionalDependencies: "@types/react": 18.3.28 + "@radix-ui/react-use-layout-effect@1.1.2(@types/react@18.3.28)(react@18.3.1)": + dependencies: + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.28 + "@radix-ui/react-use-previous@1.1.1(@types/react@18.3.28)(react@18.3.1)": dependencies: react: 18.3.1 optionalDependencies: "@types/react": 18.3.28 + "@radix-ui/react-use-previous@1.1.2(@types/react@18.3.28)(react@18.3.1)": + dependencies: + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.28 + "@radix-ui/react-use-rect@1.1.1(@types/react@18.3.28)(react@18.3.1)": dependencies: "@radix-ui/rect": 1.1.1 @@ -11437,6 +13540,13 @@ snapshots: optionalDependencies: "@types/react": 18.3.28 + "@radix-ui/react-use-rect@1.1.2(@types/react@18.3.28)(react@18.3.1)": + dependencies: + "@radix-ui/rect": 1.1.2 + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.28 + "@radix-ui/react-use-size@1.1.1(@types/react@18.3.28)(react@18.3.1)": dependencies: "@radix-ui/react-use-layout-effect": 1.1.1(@types/react@18.3.28)(react@18.3.1) @@ -11444,6 +13554,13 @@ snapshots: optionalDependencies: "@types/react": 18.3.28 + "@radix-ui/react-use-size@1.1.2(@types/react@18.3.28)(react@18.3.1)": + dependencies: + "@radix-ui/react-use-layout-effect": 1.1.2(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.28 + "@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": dependencies: "@radix-ui/react-primitive": 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -11453,8 +13570,19 @@ snapshots: "@types/react": 18.3.28 "@types/react-dom": 18.3.7(@types/react@18.3.28) + "@radix-ui/react-visually-hidden@1.2.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + "@radix-ui/rect@1.1.1": {} + "@radix-ui/rect@1.1.2": {} + "@reduxjs/toolkit@2.11.2(react-redux@9.2.0(@types/react@18.3.28)(react@18.3.1)(redux@5.0.1))(react@18.3.1)": dependencies: "@standard-schema/spec": 1.1.0 @@ -11640,6 +13768,253 @@ snapshots: "@types/react": 18.3.28 "@types/react-dom": 18.3.7(@types/react@18.3.28) + "@tiptap/core@3.27.3(@tiptap/pm@3.27.3)": + dependencies: + "@tiptap/pm": 3.27.3 + + "@tiptap/extension-blockquote@3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))": + dependencies: + "@tiptap/core": 3.27.3(@tiptap/pm@3.27.3) + + "@tiptap/extension-bold@3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))": + dependencies: + "@tiptap/core": 3.27.3(@tiptap/pm@3.27.3) + + "@tiptap/extension-bubble-menu@3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3)": + dependencies: + "@floating-ui/dom": 1.7.6 + "@tiptap/core": 3.27.3(@tiptap/pm@3.27.3) + "@tiptap/pm": 3.27.3 + optional: true + + "@tiptap/extension-bullet-list@3.27.3(@tiptap/extension-list@3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3))": + dependencies: + "@tiptap/extension-list": 3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3) + + "@tiptap/extension-code-block@3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3)": + dependencies: + "@tiptap/core": 3.27.3(@tiptap/pm@3.27.3) + "@tiptap/pm": 3.27.3 + + "@tiptap/extension-code@3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))": + dependencies: + "@tiptap/core": 3.27.3(@tiptap/pm@3.27.3) + + "@tiptap/extension-document@3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))": + dependencies: + "@tiptap/core": 3.27.3(@tiptap/pm@3.27.3) + + "@tiptap/extension-dropcursor@3.27.3(@tiptap/extensions@3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3))": + dependencies: + "@tiptap/extensions": 3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3) + + "@tiptap/extension-floating-menu@3.27.3(@floating-ui/dom@1.7.6)(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3)": + dependencies: + "@floating-ui/dom": 1.7.6 + "@tiptap/core": 3.27.3(@tiptap/pm@3.27.3) + "@tiptap/pm": 3.27.3 + optional: true + + "@tiptap/extension-gapcursor@3.27.3(@tiptap/extensions@3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3))": + dependencies: + "@tiptap/extensions": 3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3) + + "@tiptap/extension-hard-break@3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))": + dependencies: + "@tiptap/core": 3.27.3(@tiptap/pm@3.27.3) + + "@tiptap/extension-heading@3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))": + dependencies: + "@tiptap/core": 3.27.3(@tiptap/pm@3.27.3) + + "@tiptap/extension-highlight@3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))": + dependencies: + "@tiptap/core": 3.27.3(@tiptap/pm@3.27.3) + + "@tiptap/extension-horizontal-rule@3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3)": + dependencies: + "@tiptap/core": 3.27.3(@tiptap/pm@3.27.3) + "@tiptap/pm": 3.27.3 + + "@tiptap/extension-italic@3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))": + dependencies: + "@tiptap/core": 3.27.3(@tiptap/pm@3.27.3) + + "@tiptap/extension-link@3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3)": + dependencies: + "@tiptap/core": 3.27.3(@tiptap/pm@3.27.3) + "@tiptap/pm": 3.27.3 + linkifyjs: 4.3.3 + + "@tiptap/extension-list-item@3.27.3(@tiptap/extension-list@3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3))": + dependencies: + "@tiptap/extension-list": 3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3) + + "@tiptap/extension-list-keymap@3.27.3(@tiptap/extension-list@3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3))": + dependencies: + "@tiptap/extension-list": 3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3) + + "@tiptap/extension-list@3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3)": + dependencies: + "@tiptap/core": 3.27.3(@tiptap/pm@3.27.3) + "@tiptap/pm": 3.27.3 + + "@tiptap/extension-ordered-list@3.27.3(@tiptap/extension-list@3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3))": + dependencies: + "@tiptap/extension-list": 3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3) + + "@tiptap/extension-paragraph@3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))": + dependencies: + "@tiptap/core": 3.27.3(@tiptap/pm@3.27.3) + + "@tiptap/extension-strike@3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))": + dependencies: + "@tiptap/core": 3.27.3(@tiptap/pm@3.27.3) + + "@tiptap/extension-text@3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))": + dependencies: + "@tiptap/core": 3.27.3(@tiptap/pm@3.27.3) + + "@tiptap/extension-underline@3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))": + dependencies: + "@tiptap/core": 3.27.3(@tiptap/pm@3.27.3) + + "@tiptap/extensions@3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3)": + dependencies: + "@tiptap/core": 3.27.3(@tiptap/pm@3.27.3) + "@tiptap/pm": 3.27.3 + + "@tiptap/pm@3.27.3": + dependencies: + prosemirror-changeset: 2.4.1 + prosemirror-commands: 1.7.1 + prosemirror-dropcursor: 1.8.3 + prosemirror-gapcursor: 1.4.1 + prosemirror-history: 1.5.0 + prosemirror-inputrules: 1.5.1 + prosemirror-keymap: 1.2.3 + prosemirror-model: 1.25.10 + prosemirror-schema-list: 1.5.1 + prosemirror-state: 1.4.4 + prosemirror-tables: 1.8.5 + prosemirror-transform: 1.12.0 + prosemirror-view: 1.42.0 + + "@tiptap/react@3.27.3(@floating-ui/dom@1.7.6)(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@tiptap/core": 3.27.3(@tiptap/pm@3.27.3) + "@tiptap/pm": 3.27.3 + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + "@types/use-sync-external-store": 0.0.6 + fast-equals: 5.4.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + use-sync-external-store: 1.6.0(react@18.3.1) + optionalDependencies: + "@tiptap/extension-bubble-menu": 3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3) + "@tiptap/extension-floating-menu": 3.27.3(@floating-ui/dom@1.7.6)(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3) + transitivePeerDependencies: + - "@floating-ui/dom" + + "@tiptap/starter-kit@3.27.3": + dependencies: + "@tiptap/core": 3.27.3(@tiptap/pm@3.27.3) + "@tiptap/extension-blockquote": 3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3)) + "@tiptap/extension-bold": 3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3)) + "@tiptap/extension-bullet-list": 3.27.3(@tiptap/extension-list@3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3)) + "@tiptap/extension-code": 3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3)) + "@tiptap/extension-code-block": 3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3) + "@tiptap/extension-document": 3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3)) + "@tiptap/extension-dropcursor": 3.27.3(@tiptap/extensions@3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3)) + "@tiptap/extension-gapcursor": 3.27.3(@tiptap/extensions@3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3)) + "@tiptap/extension-hard-break": 3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3)) + "@tiptap/extension-heading": 3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3)) + "@tiptap/extension-horizontal-rule": 3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3) + "@tiptap/extension-italic": 3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3)) + "@tiptap/extension-link": 3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3) + "@tiptap/extension-list": 3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3) + "@tiptap/extension-list-item": 3.27.3(@tiptap/extension-list@3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3)) + "@tiptap/extension-list-keymap": 3.27.3(@tiptap/extension-list@3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3)) + "@tiptap/extension-ordered-list": 3.27.3(@tiptap/extension-list@3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3)) + "@tiptap/extension-paragraph": 3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3)) + "@tiptap/extension-strike": 3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3)) + "@tiptap/extension-text": 3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3)) + "@tiptap/extension-underline": 3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3)) + "@tiptap/extensions": 3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3) + "@tiptap/pm": 3.27.3 + + "@tldraw/driver@5.2.4(@floating-ui/dom@1.7.6)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@tldraw/editor": 5.2.4(@floating-ui/dom@1.7.6)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@tldraw/utils": 5.2.4 + transitivePeerDependencies: + - "@floating-ui/dom" + - "@types/react" + - "@types/react-dom" + - react + - react-dom + + "@tldraw/editor@5.2.4(@floating-ui/dom@1.7.6)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@tiptap/core": 3.27.3(@tiptap/pm@3.27.3) + "@tiptap/pm": 3.27.3 + "@tiptap/react": 3.27.3(@floating-ui/dom@1.7.6)(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@tldraw/state": 5.2.4 + "@tldraw/state-react": 5.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@tldraw/store": 5.2.4(react@18.3.1) + "@tldraw/tlschema": 5.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@tldraw/utils": 5.2.4 + "@tldraw/validate": 5.2.4 + classnames: 2.5.1 + eventemitter3: 4.0.7 + idb: 7.1.1 + is-plain-object: 5.0.0 + rbush: 3.0.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - "@floating-ui/dom" + - "@types/react" + - "@types/react-dom" + + "@tldraw/state-react@5.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@tldraw/state": 5.2.4 + "@tldraw/utils": 5.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + "@tldraw/state@5.2.4": + dependencies: + "@tldraw/utils": 5.2.4 + + "@tldraw/store@5.2.4(react@18.3.1)": + dependencies: + "@tldraw/state": 5.2.4 + "@tldraw/utils": 5.2.4 + react: 18.3.1 + + "@tldraw/tlschema@5.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@tldraw/state": 5.2.4 + "@tldraw/store": 5.2.4(react@18.3.1) + "@tldraw/utils": 5.2.4 + "@tldraw/validate": 5.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + "@tldraw/utils@5.2.4": + dependencies: + lodash.isequal: 4.5.0 + lodash.isequalwith: 4.4.0 + lodash.throttle: 4.1.1 + lodash.uniq: 4.5.0 + + "@tldraw/validate@5.2.4": + dependencies: + "@tldraw/utils": 5.2.4 + "@types/aria-query@5.0.4": {} "@types/babel__core@7.20.5": @@ -13137,6 +15512,8 @@ snapshots: etag@1.8.1: {} + eventemitter3@4.0.7: {} + eventemitter3@5.0.4: {} eventsource-parser@3.0.6: {} @@ -13191,6 +15568,8 @@ snapshots: fast-deep-equal@3.1.3: {} + fast-equals@5.4.1: {} + fast-glob@3.3.3: dependencies: "@nodelib/fs.stat": 2.0.5 @@ -13653,6 +16032,8 @@ snapshots: is-plain-obj@4.1.0: {} + is-plain-object@5.0.0: {} + is-potential-custom-element-name@1.0.1: {} is-promise@4.0.0: {} @@ -13861,6 +16242,8 @@ snapshots: lines-and-columns@1.2.4: {} + linkifyjs@4.3.3: {} + lint-staged@16.4.0: dependencies: commander: 14.0.3 @@ -13887,10 +16270,18 @@ snapshots: lodash.debounce@4.0.8: {} + lodash.isequal@4.5.0: {} + + lodash.isequalwith@4.4.0: {} + lodash.merge@4.6.2: {} lodash.sortby@4.7.0: {} + lodash.throttle@4.1.1: {} + + lodash.uniq@4.5.0: {} + lodash@4.17.23: {} log-update@6.1.0: @@ -14464,6 +16855,8 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + orderedmap@2.1.1: {} + own-keys@1.0.1: dependencies: get-intrinsic: 1.3.0 @@ -14692,6 +17085,80 @@ snapshots: property-information@7.1.0: {} + prosemirror-changeset@2.4.1: + dependencies: + prosemirror-transform: 1.12.0 + + prosemirror-commands@1.7.1: + dependencies: + prosemirror-model: 1.25.10 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.12.0 + + prosemirror-dropcursor@1.8.3: + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.12.0 + prosemirror-view: 1.42.0 + + prosemirror-gapcursor@1.4.1: + dependencies: + prosemirror-keymap: 1.2.3 + prosemirror-model: 1.25.10 + prosemirror-state: 1.4.4 + prosemirror-view: 1.42.0 + + prosemirror-history@1.5.0: + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.12.0 + prosemirror-view: 1.42.0 + rope-sequence: 1.3.4 + + prosemirror-inputrules@1.5.1: + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.12.0 + + prosemirror-keymap@1.2.3: + dependencies: + prosemirror-state: 1.4.4 + w3c-keyname: 2.2.8 + + prosemirror-model@1.25.10: + dependencies: + orderedmap: 2.1.1 + + prosemirror-schema-list@1.5.1: + dependencies: + prosemirror-model: 1.25.10 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.12.0 + + prosemirror-state@1.4.4: + dependencies: + prosemirror-model: 1.25.10 + prosemirror-transform: 1.12.0 + prosemirror-view: 1.42.0 + + prosemirror-tables@1.8.5: + dependencies: + prosemirror-keymap: 1.2.3 + prosemirror-model: 1.25.10 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.12.0 + prosemirror-view: 1.42.0 + + prosemirror-transform@1.12.0: + dependencies: + prosemirror-model: 1.25.10 + + prosemirror-view@1.42.0: + dependencies: + prosemirror-model: 1.25.10 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.12.0 + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -14707,6 +17174,71 @@ snapshots: quick-format-unescaped@4.0.4: {} + quickselect@2.0.0: {} + + radix-ui@1.6.2(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + "@radix-ui/primitive": 1.1.5 + "@radix-ui/react-accessible-icon": 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-accordion": 1.2.16(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-alert-dialog": 1.1.19(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-arrow": 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-aspect-ratio": 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-avatar": 1.2.2(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-checkbox": 1.3.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-collapsible": 1.1.16(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-collection": 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-compose-refs": 1.1.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context": 1.2.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-context-menu": 2.3.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-dialog": 1.1.19(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-direction": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-dismissable-layer": 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-dropdown-menu": 2.1.20(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-focus-guards": 1.1.4(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-focus-scope": 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-form": 0.1.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-hover-card": 1.1.19(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-label": 2.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-menu": 2.1.20(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-menubar": 1.1.20(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-navigation-menu": 1.2.18(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-one-time-password-field": 0.1.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-password-toggle-field": 0.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-popover": 1.1.19(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-popper": 1.3.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-portal": 1.1.13(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-presence": 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-primitive": 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-progress": 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-radio-group": 1.4.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-roving-focus": 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-scroll-area": 1.2.14(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-select": 2.3.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-separator": 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-slider": 1.4.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-slot": 1.3.0(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-switch": 1.3.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-tabs": 1.1.17(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-toast": 1.2.19(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-toggle": 1.1.14(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-toggle-group": 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-toolbar": 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-tooltip": 1.2.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-callback-ref": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.2.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-effect-event": 0.0.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-escape-keydown": 1.1.3(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-is-hydrated": 0.1.1(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-layout-effect": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-use-size": 1.1.2(@types/react@18.3.28)(react@18.3.1) + "@radix-ui/react-visually-hidden": 1.2.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.28 + "@types/react-dom": 18.3.7(@types/react@18.3.28) + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 @@ -14720,6 +17252,10 @@ snapshots: iconv-lite: 0.7.2 unpipe: 1.0.0 + rbush@3.0.1: + dependencies: + quickselect: 2.0.0 + react-day-picker@9.14.0(react@18.3.1): dependencies: "@date-fns/tz": 1.4.1 @@ -15030,6 +17566,8 @@ snapshots: "@rollup/rollup-win32-x64-msvc": 4.60.1 fsevents: 2.3.3 + rope-sequence@1.3.4: {} + roughjs@4.6.6: dependencies: hachure-fill: 0.5.2 @@ -15488,6 +18026,29 @@ snapshots: tinyspy@3.0.2: {} + tldraw@5.2.4(@floating-ui/dom@1.7.6)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + "@tiptap/core": 3.27.3(@tiptap/pm@3.27.3) + "@tiptap/extension-code": 3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3)) + "@tiptap/extension-highlight": 3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3)) + "@tiptap/extension-list": 3.27.3(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3) + "@tiptap/pm": 3.27.3 + "@tiptap/react": 3.27.3(@floating-ui/dom@1.7.6)(@tiptap/core@3.27.3(@tiptap/pm@3.27.3))(@tiptap/pm@3.27.3)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@tiptap/starter-kit": 3.27.3 + "@tldraw/driver": 5.2.4(@floating-ui/dom@1.7.6)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@tldraw/editor": 5.2.4(@floating-ui/dom@1.7.6)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@tldraw/store": 5.2.4(react@18.3.1) + classnames: 2.5.1 + idb: 7.1.1 + lz-string: 1.5.0 + radix-ui: 1.6.2(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - "@floating-ui/dom" + - "@types/react" + - "@types/react-dom" + tldts-core@7.0.28: {} tldts@7.0.28: @@ -15845,6 +18406,8 @@ snapshots: transitivePeerDependencies: - msw + w3c-keyname@2.2.8: {} + w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0