diff --git a/examples/svelte-chat/.env.example b/examples/svelte-chat/.env.example new file mode 100644 index 000000000..3ca71aa13 --- /dev/null +++ b/examples/svelte-chat/.env.example @@ -0,0 +1,2 @@ +# OpenAI API Key +OPENAI_API_KEY=your_api_key_here diff --git a/examples/svelte-chat/.gitignore b/examples/svelte-chat/.gitignore new file mode 100644 index 000000000..6635cf554 --- /dev/null +++ b/examples/svelte-chat/.gitignore @@ -0,0 +1,10 @@ +.DS_Store +node_modules +/build +/.svelte-kit +/package +.env +.env.* +!.env.example +vite.config.js.timestamp-* +vite.config.ts.timestamp-* diff --git a/examples/svelte-chat/README.md b/examples/svelte-chat/README.md new file mode 100644 index 000000000..f05047e52 --- /dev/null +++ b/examples/svelte-chat/README.md @@ -0,0 +1,96 @@ +# Svelte OpenUI Chat Example + +A SvelteKit chat application demonstrating `@openuidev/svelte-lang` with streaming OpenAI responses rendered as interactive UI components. + +## Setup + +```bash +# From the repo root +pnpm install +pnpm --filter @openuidev/react-lang build +pnpm --filter @openuidev/svelte-lang build +``` + +Create a `.env` file in this directory: + +``` +OPENAI_API_KEY=sk-... +``` + +Run the dev server: + +```bash +pnpm --filter svelte-chat dev +``` + +## Features + +- Streaming chat with OpenAI (GPT-4) +- Real-time progressive rendering of OpenUI Lang output +- **shadcn-svelte** UI components (built on Bits UI + Tailwind CSS v4) +- 14 components: Stack, Card, Table, Chart, Form, Input, Button, TextContent, CodeBlock, Callout, Separator, Tabs, Accordion, Steps +- Form state management with field isolation +- Action events (e.g., form submission continues the conversation) +- Prompt examples and rules for reliable LLM output + +## UI Framework + +This example uses [shadcn-svelte](https://www.shadcn-svelte.com/) for the component renderers. The installed shadcn components are in `src/lib/components/ui/` and include: accordion, alert, badge, button, card, input, separator, and tabs. + +To add more shadcn-svelte components: + +```bash +cd examples/svelte-chat +npx shadcn-svelte@next add +``` + +## Architecture + +``` +src/ +├── routes/ +│ ├── +page.svelte # Chat UI with message list and input +│ └── api/chat/+server.ts # OpenAI streaming endpoint +├── lib/ +│ ├── library.ts # Component library definition (Zod schemas) +│ └── components/ +│ ├── ui/ # shadcn-svelte base components +│ │ ├── accordion/ +│ │ ├── alert/ +│ │ ├── badge/ +│ │ ├── button/ +│ │ ├── card/ +│ │ ├── input/ +│ │ ├── separator/ +│ │ └── tabs/ +│ ├── library/ # OpenUI Lang component renderers +│ │ ├── Stack.svelte +│ │ ├── Card.svelte +│ │ ├── Table.svelte +│ │ ├── Chart.svelte +│ │ ├── Form.svelte +│ │ ├── Input.svelte +│ │ ├── Button.svelte +│ │ ├── TextContent.svelte +│ │ ├── CodeBlock.svelte +│ │ ├── Callout.svelte +│ │ ├── Separator.svelte +│ │ ├── Tabs.svelte +│ │ ├── Accordion.svelte +│ │ └── Steps.svelte +│ ├── ChatMessage.svelte # Message bubble with Renderer +│ └── ChatInput.svelte # Text input with send button +└── app.css # Tailwind v4 + shadcn theme +``` + +### How it works + +1. `library.ts` defines components with Zod schemas and Svelte renderers using `defineComponent` and `createLibrary` +2. The chat API endpoint generates a system prompt from the library via `library.prompt()`, then streams OpenAI completions +3. `ChatMessage.svelte` passes the streaming text to `` from `@openuidev/svelte-lang` +4. The Renderer parses OpenUI Lang syntax, resolves component references, and renders the matching Svelte components +5. Interactive components (Form, Input, Button) use the context API for state management and action events + +## License + +MIT diff --git a/examples/svelte-chat/components.json b/examples/svelte-chat/components.json new file mode 100644 index 000000000..c5d91b458 --- /dev/null +++ b/examples/svelte-chat/components.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://shadcn-svelte.com/schema.json", + "tailwind": { + "css": "src/app.css", + "baseColor": "slate" + }, + "aliases": { + "components": "$lib/components", + "utils": "$lib/utils", + "ui": "$lib/components/ui", + "hooks": "$lib/hooks", + "lib": "$lib" + }, + "typescript": true, + "registry": "https://shadcn-svelte.com/registry" +} diff --git a/examples/svelte-chat/package.json b/examples/svelte-chat/package.json new file mode 100644 index 000000000..c63072c76 --- /dev/null +++ b/examples/svelte-chat/package.json @@ -0,0 +1,36 @@ +{ + "name": "svelte-chat", + "version": "0.1.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch" + }, + "devDependencies": { + "@internationalized/date": "^3.12.0", + "@lucide/svelte": "^0.561.0", + "@sveltejs/adapter-auto": "^3.0.0", + "@sveltejs/kit": "^2.0.0", + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "@tailwindcss/vite": "^4.2.1", + "bits-ui": "^2.16.3", + "clsx": "^2.1.1", + "svelte": "^5.0.0", + "svelte-check": "^4.0.0", + "tailwind-merge": "^3.5.0", + "tailwind-variants": "^3.2.2", + "tailwindcss": "^4.2.1", + "tw-animate-css": "^1.4.0", + "typescript": "^5.0.0", + "vite": "^6.0.0" + }, + "dependencies": { + "@openuidev/svelte-lang": "workspace:*", + "openai": "^4.0.0", + "zod": "^4.0.0" + } +} diff --git a/examples/svelte-chat/src/app.css b/examples/svelte-chat/src/app.css new file mode 100644 index 000000000..e48f5f09f --- /dev/null +++ b/examples/svelte-chat/src/app.css @@ -0,0 +1,121 @@ +@import "tailwindcss"; + +@import "tw-animate-css"; + +@custom-variant dark (&:is(.dark *)); + +:root { + --radius: 0.625rem; + --background: oklch(1 0 0); + --foreground: oklch(0.129 0.042 264.695); + --card: oklch(1 0 0); + --card-foreground: oklch(0.129 0.042 264.695); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.129 0.042 264.695); + --primary: oklch(0.208 0.042 265.755); + --primary-foreground: oklch(0.984 0.003 247.858); + --secondary: oklch(0.968 0.007 247.896); + --secondary-foreground: oklch(0.208 0.042 265.755); + --muted: oklch(0.968 0.007 247.896); + --muted-foreground: oklch(0.554 0.046 257.417); + --accent: oklch(0.968 0.007 247.896); + --accent-foreground: oklch(0.208 0.042 265.755); + --destructive: oklch(0.577 0.245 27.325); + --border: oklch(0.929 0.013 255.508); + --input: oklch(0.929 0.013 255.508); + --ring: oklch(0.704 0.04 256.788); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --sidebar: oklch(0.984 0.003 247.858); + --sidebar-foreground: oklch(0.129 0.042 264.695); + --sidebar-primary: oklch(0.208 0.042 265.755); + --sidebar-primary-foreground: oklch(0.984 0.003 247.858); + --sidebar-accent: oklch(0.968 0.007 247.896); + --sidebar-accent-foreground: oklch(0.208 0.042 265.755); + --sidebar-border: oklch(0.929 0.013 255.508); + --sidebar-ring: oklch(0.704 0.04 256.788); +} + +.dark { + --background: oklch(0.129 0.042 264.695); + --foreground: oklch(0.984 0.003 247.858); + --card: oklch(0.208 0.042 265.755); + --card-foreground: oklch(0.984 0.003 247.858); + --popover: oklch(0.208 0.042 265.755); + --popover-foreground: oklch(0.984 0.003 247.858); + --primary: oklch(0.929 0.013 255.508); + --primary-foreground: oklch(0.208 0.042 265.755); + --secondary: oklch(0.279 0.041 260.031); + --secondary-foreground: oklch(0.984 0.003 247.858); + --muted: oklch(0.279 0.041 260.031); + --muted-foreground: oklch(0.704 0.04 256.788); + --accent: oklch(0.279 0.041 260.031); + --accent-foreground: oklch(0.984 0.003 247.858); + --destructive: oklch(0.704 0.191 22.216); + --border: oklch(1 0 0 / 10%); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.551 0.027 264.364); + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.208 0.042 265.755); + --sidebar-foreground: oklch(0.984 0.003 247.858); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.984 0.003 247.858); + --sidebar-accent: oklch(0.279 0.041 260.031); + --sidebar-accent-foreground: oklch(0.984 0.003 247.858); + --sidebar-border: oklch(1 0 0 / 10%); + --sidebar-ring: oklch(0.551 0.027 264.364); +} + +@theme inline { + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + } +} \ No newline at end of file diff --git a/examples/svelte-chat/src/app.html b/examples/svelte-chat/src/app.html new file mode 100644 index 000000000..77a5ff52c --- /dev/null +++ b/examples/svelte-chat/src/app.html @@ -0,0 +1,12 @@ + + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/examples/svelte-chat/src/lib/components/ChatInput.svelte b/examples/svelte-chat/src/lib/components/ChatInput.svelte new file mode 100644 index 000000000..43876a060 --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ChatInput.svelte @@ -0,0 +1,50 @@ + + +
+
+ + +
+
diff --git a/examples/svelte-chat/src/lib/components/ChatMessage.svelte b/examples/svelte-chat/src/lib/components/ChatMessage.svelte new file mode 100644 index 000000000..df79cdc7c --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ChatMessage.svelte @@ -0,0 +1,31 @@ + + +
+
+ {role === "user" ? "You" : "Assistant"} +
+
+ {#if role === "assistant" && library} + + {:else} +

{content}

+ {/if} +
+
diff --git a/examples/svelte-chat/src/lib/components/library/Accordion.svelte b/examples/svelte-chat/src/lib/components/library/Accordion.svelte new file mode 100644 index 000000000..ad124f078 --- /dev/null +++ b/examples/svelte-chat/src/lib/components/library/Accordion.svelte @@ -0,0 +1,31 @@ + + + + {#each props.items ?? [] as item} + + {item.props.trigger} + + {@render renderNode(item.props.content)} + + + {/each} + diff --git a/examples/svelte-chat/src/lib/components/library/Button.svelte b/examples/svelte-chat/src/lib/components/library/Button.svelte new file mode 100644 index 000000000..3b01f3c29 --- /dev/null +++ b/examples/svelte-chat/src/lib/components/library/Button.svelte @@ -0,0 +1,25 @@ + + + diff --git a/examples/svelte-chat/src/lib/components/library/Callout.svelte b/examples/svelte-chat/src/lib/components/library/Callout.svelte new file mode 100644 index 000000000..752122ace --- /dev/null +++ b/examples/svelte-chat/src/lib/components/library/Callout.svelte @@ -0,0 +1,38 @@ + + + + {icons[props.variant] ?? "\u2022"} + {props.title} + {props.description} + diff --git a/examples/svelte-chat/src/lib/components/library/Card.svelte b/examples/svelte-chat/src/lib/components/library/Card.svelte new file mode 100644 index 000000000..97b3f7b39 --- /dev/null +++ b/examples/svelte-chat/src/lib/components/library/Card.svelte @@ -0,0 +1,17 @@ + + + + + {@render renderNode(props.children)} + + diff --git a/examples/svelte-chat/src/lib/components/library/Chart.svelte b/examples/svelte-chat/src/lib/components/library/Chart.svelte new file mode 100644 index 000000000..84e897bbb --- /dev/null +++ b/examples/svelte-chat/src/lib/components/library/Chart.svelte @@ -0,0 +1,40 @@ + + + + + {props.title} + {props.type} chart + + +
+ {#each props.data as item} +
+
+ {item.label} + {item.value} +
+
+
+
+
+ {/each} +
+
+
diff --git a/examples/svelte-chat/src/lib/components/library/CodeBlock.svelte b/examples/svelte-chat/src/lib/components/library/CodeBlock.svelte new file mode 100644 index 000000000..a2902e095 --- /dev/null +++ b/examples/svelte-chat/src/lib/components/library/CodeBlock.svelte @@ -0,0 +1,22 @@ + + +
+
+ + {props.language} + +
+
{props.codeString}
+
diff --git a/examples/svelte-chat/src/lib/components/library/Form.svelte b/examples/svelte-chat/src/lib/components/library/Form.svelte new file mode 100644 index 000000000..fa24d2335 --- /dev/null +++ b/examples/svelte-chat/src/lib/components/library/Form.svelte @@ -0,0 +1,34 @@ + + + + + {props.name} + + +
e.preventDefault()}> +
+ {@render renderNode(props.fields)} +
+
+ {@render renderNode(props.submitButton)} +
+
+
+
diff --git a/examples/svelte-chat/src/lib/components/library/Input.svelte b/examples/svelte-chat/src/lib/components/library/Input.svelte new file mode 100644 index 000000000..176be88a7 --- /dev/null +++ b/examples/svelte-chat/src/lib/components/library/Input.svelte @@ -0,0 +1,55 @@ + + +
+ {#if props.label} + + {/if} + +
diff --git a/examples/svelte-chat/src/lib/components/library/Separator.svelte b/examples/svelte-chat/src/lib/components/library/Separator.svelte new file mode 100644 index 000000000..d58c0e806 --- /dev/null +++ b/examples/svelte-chat/src/lib/components/library/Separator.svelte @@ -0,0 +1,13 @@ + + + diff --git a/examples/svelte-chat/src/lib/components/library/Stack.svelte b/examples/svelte-chat/src/lib/components/library/Stack.svelte new file mode 100644 index 000000000..2ed8b516a --- /dev/null +++ b/examples/svelte-chat/src/lib/components/library/Stack.svelte @@ -0,0 +1,58 @@ + + +
+ {@render renderNode(props.children)} +
diff --git a/examples/svelte-chat/src/lib/components/library/Steps.svelte b/examples/svelte-chat/src/lib/components/library/Steps.svelte new file mode 100644 index 000000000..b1155a38d --- /dev/null +++ b/examples/svelte-chat/src/lib/components/library/Steps.svelte @@ -0,0 +1,39 @@ + + +
+ {#each props.items ?? [] as item, i} +
+
+ + {i + 1} + + {#if i < (props.items?.length ?? 0) - 1} +
+ {/if} +
+
+ {item.props.title} +

{item.props.details}

+
+
+ {/each} +
diff --git a/examples/svelte-chat/src/lib/components/library/Table.svelte b/examples/svelte-chat/src/lib/components/library/Table.svelte new file mode 100644 index 000000000..612590241 --- /dev/null +++ b/examples/svelte-chat/src/lib/components/library/Table.svelte @@ -0,0 +1,34 @@ + + +
+ + + + {#each props.headers as header} + + {/each} + + + + {#each props.rows as row} + + {#each row as cell} + + {/each} + + {/each} + +
+ {header} +
{cell}
+
diff --git a/examples/svelte-chat/src/lib/components/library/Tabs.svelte b/examples/svelte-chat/src/lib/components/library/Tabs.svelte new file mode 100644 index 000000000..678384e55 --- /dev/null +++ b/examples/svelte-chat/src/lib/components/library/Tabs.svelte @@ -0,0 +1,35 @@ + + + + + {#each props.items ?? [] as item} + {item.props.trigger} + {/each} + + {#each props.items ?? [] as item} + + {@render renderNode(item.props.content)} + + {/each} + diff --git a/examples/svelte-chat/src/lib/components/library/TextContent.svelte b/examples/svelte-chat/src/lib/components/library/TextContent.svelte new file mode 100644 index 000000000..dc47f4e93 --- /dev/null +++ b/examples/svelte-chat/src/lib/components/library/TextContent.svelte @@ -0,0 +1,23 @@ + + +

{props.text}

diff --git a/examples/svelte-chat/src/lib/components/ui/accordion/accordion-content.svelte b/examples/svelte-chat/src/lib/components/ui/accordion/accordion-content.svelte new file mode 100644 index 000000000..559db3d50 --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ui/accordion/accordion-content.svelte @@ -0,0 +1,22 @@ + + + +
+ {@render children?.()} +
+
diff --git a/examples/svelte-chat/src/lib/components/ui/accordion/accordion-item.svelte b/examples/svelte-chat/src/lib/components/ui/accordion/accordion-item.svelte new file mode 100644 index 000000000..780545c6a --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ui/accordion/accordion-item.svelte @@ -0,0 +1,17 @@ + + + diff --git a/examples/svelte-chat/src/lib/components/ui/accordion/accordion-trigger.svelte b/examples/svelte-chat/src/lib/components/ui/accordion/accordion-trigger.svelte new file mode 100644 index 000000000..c46c24681 --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ui/accordion/accordion-trigger.svelte @@ -0,0 +1,32 @@ + + + + svg]:rotate-180", + className + )} + {...restProps} + > + {@render children?.()} + + + diff --git a/examples/svelte-chat/src/lib/components/ui/accordion/accordion.svelte b/examples/svelte-chat/src/lib/components/ui/accordion/accordion.svelte new file mode 100644 index 000000000..117ee37f2 --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ui/accordion/accordion.svelte @@ -0,0 +1,16 @@ + + + diff --git a/examples/svelte-chat/src/lib/components/ui/accordion/index.ts b/examples/svelte-chat/src/lib/components/ui/accordion/index.ts new file mode 100644 index 000000000..ac343a10b --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ui/accordion/index.ts @@ -0,0 +1,16 @@ +import Root from "./accordion.svelte"; +import Content from "./accordion-content.svelte"; +import Item from "./accordion-item.svelte"; +import Trigger from "./accordion-trigger.svelte"; + +export { + Root, + Content, + Item, + Trigger, + // + Root as Accordion, + Content as AccordionContent, + Item as AccordionItem, + Trigger as AccordionTrigger, +}; diff --git a/examples/svelte-chat/src/lib/components/ui/alert/alert-description.svelte b/examples/svelte-chat/src/lib/components/ui/alert/alert-description.svelte new file mode 100644 index 000000000..8b56aed2f --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ui/alert/alert-description.svelte @@ -0,0 +1,23 @@ + + +
+ {@render children?.()} +
diff --git a/examples/svelte-chat/src/lib/components/ui/alert/alert-title.svelte b/examples/svelte-chat/src/lib/components/ui/alert/alert-title.svelte new file mode 100644 index 000000000..77e45ad5c --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ui/alert/alert-title.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/examples/svelte-chat/src/lib/components/ui/alert/alert.svelte b/examples/svelte-chat/src/lib/components/ui/alert/alert.svelte new file mode 100644 index 000000000..80f7858b1 --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ui/alert/alert.svelte @@ -0,0 +1,44 @@ + + + + + diff --git a/examples/svelte-chat/src/lib/components/ui/alert/index.ts b/examples/svelte-chat/src/lib/components/ui/alert/index.ts new file mode 100644 index 000000000..97e21b4ea --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ui/alert/index.ts @@ -0,0 +1,14 @@ +import Root from "./alert.svelte"; +import Description from "./alert-description.svelte"; +import Title from "./alert-title.svelte"; +export { alertVariants, type AlertVariant } from "./alert.svelte"; + +export { + Root, + Description, + Title, + // + Root as Alert, + Description as AlertDescription, + Title as AlertTitle, +}; diff --git a/examples/svelte-chat/src/lib/components/ui/badge/badge.svelte b/examples/svelte-chat/src/lib/components/ui/badge/badge.svelte new file mode 100644 index 000000000..e3164ba7f --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ui/badge/badge.svelte @@ -0,0 +1,50 @@ + + + + + + {@render children?.()} + diff --git a/examples/svelte-chat/src/lib/components/ui/badge/index.ts b/examples/svelte-chat/src/lib/components/ui/badge/index.ts new file mode 100644 index 000000000..64e0aa9b0 --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ui/badge/index.ts @@ -0,0 +1,2 @@ +export { default as Badge } from "./badge.svelte"; +export { badgeVariants, type BadgeVariant } from "./badge.svelte"; diff --git a/examples/svelte-chat/src/lib/components/ui/button/button.svelte b/examples/svelte-chat/src/lib/components/ui/button/button.svelte new file mode 100644 index 000000000..a8296aed1 --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ui/button/button.svelte @@ -0,0 +1,82 @@ + + + + +{#if href} + + {@render children?.()} + +{:else} + +{/if} diff --git a/examples/svelte-chat/src/lib/components/ui/button/index.ts b/examples/svelte-chat/src/lib/components/ui/button/index.ts new file mode 100644 index 000000000..fb585d768 --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ui/button/index.ts @@ -0,0 +1,17 @@ +import Root, { + type ButtonProps, + type ButtonSize, + type ButtonVariant, + buttonVariants, +} from "./button.svelte"; + +export { + Root, + type ButtonProps as Props, + // + Root as Button, + buttonVariants, + type ButtonProps, + type ButtonSize, + type ButtonVariant, +}; diff --git a/examples/svelte-chat/src/lib/components/ui/card/card-action.svelte b/examples/svelte-chat/src/lib/components/ui/card/card-action.svelte new file mode 100644 index 000000000..cc36c5665 --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ui/card/card-action.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/examples/svelte-chat/src/lib/components/ui/card/card-content.svelte b/examples/svelte-chat/src/lib/components/ui/card/card-content.svelte new file mode 100644 index 000000000..bc90b8371 --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ui/card/card-content.svelte @@ -0,0 +1,15 @@ + + +
+ {@render children?.()} +
diff --git a/examples/svelte-chat/src/lib/components/ui/card/card-description.svelte b/examples/svelte-chat/src/lib/components/ui/card/card-description.svelte new file mode 100644 index 000000000..9b20ac701 --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ui/card/card-description.svelte @@ -0,0 +1,20 @@ + + +

+ {@render children?.()} +

diff --git a/examples/svelte-chat/src/lib/components/ui/card/card-footer.svelte b/examples/svelte-chat/src/lib/components/ui/card/card-footer.svelte new file mode 100644 index 000000000..2d4d0f24a --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ui/card/card-footer.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/examples/svelte-chat/src/lib/components/ui/card/card-header.svelte b/examples/svelte-chat/src/lib/components/ui/card/card-header.svelte new file mode 100644 index 000000000..25017884e --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ui/card/card-header.svelte @@ -0,0 +1,23 @@ + + +
+ {@render children?.()} +
diff --git a/examples/svelte-chat/src/lib/components/ui/card/card-title.svelte b/examples/svelte-chat/src/lib/components/ui/card/card-title.svelte new file mode 100644 index 000000000..744723117 --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ui/card/card-title.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/examples/svelte-chat/src/lib/components/ui/card/card.svelte b/examples/svelte-chat/src/lib/components/ui/card/card.svelte new file mode 100644 index 000000000..99448cc9a --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ui/card/card.svelte @@ -0,0 +1,23 @@ + + +
+ {@render children?.()} +
diff --git a/examples/svelte-chat/src/lib/components/ui/card/index.ts b/examples/svelte-chat/src/lib/components/ui/card/index.ts new file mode 100644 index 000000000..4d3fce489 --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ui/card/index.ts @@ -0,0 +1,25 @@ +import Root from "./card.svelte"; +import Content from "./card-content.svelte"; +import Description from "./card-description.svelte"; +import Footer from "./card-footer.svelte"; +import Header from "./card-header.svelte"; +import Title from "./card-title.svelte"; +import Action from "./card-action.svelte"; + +export { + Root, + Content, + Description, + Footer, + Header, + Title, + Action, + // + Root as Card, + Content as CardContent, + Description as CardDescription, + Footer as CardFooter, + Header as CardHeader, + Title as CardTitle, + Action as CardAction, +}; diff --git a/examples/svelte-chat/src/lib/components/ui/input/index.ts b/examples/svelte-chat/src/lib/components/ui/input/index.ts new file mode 100644 index 000000000..f47b6d3fb --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ui/input/index.ts @@ -0,0 +1,7 @@ +import Root from "./input.svelte"; + +export { + Root, + // + Root as Input, +}; diff --git a/examples/svelte-chat/src/lib/components/ui/input/input.svelte b/examples/svelte-chat/src/lib/components/ui/input/input.svelte new file mode 100644 index 000000000..ff1a4c875 --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ui/input/input.svelte @@ -0,0 +1,52 @@ + + +{#if type === "file"} + +{:else} + +{/if} diff --git a/examples/svelte-chat/src/lib/components/ui/separator/index.ts b/examples/svelte-chat/src/lib/components/ui/separator/index.ts new file mode 100644 index 000000000..82442d2cd --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ui/separator/index.ts @@ -0,0 +1,7 @@ +import Root from "./separator.svelte"; + +export { + Root, + // + Root as Separator, +}; diff --git a/examples/svelte-chat/src/lib/components/ui/separator/separator.svelte b/examples/svelte-chat/src/lib/components/ui/separator/separator.svelte new file mode 100644 index 000000000..f40999fa7 --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ui/separator/separator.svelte @@ -0,0 +1,21 @@ + + + diff --git a/examples/svelte-chat/src/lib/components/ui/tabs/index.ts b/examples/svelte-chat/src/lib/components/ui/tabs/index.ts new file mode 100644 index 000000000..12d4327aa --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ui/tabs/index.ts @@ -0,0 +1,16 @@ +import Root from "./tabs.svelte"; +import Content from "./tabs-content.svelte"; +import List from "./tabs-list.svelte"; +import Trigger from "./tabs-trigger.svelte"; + +export { + Root, + Content, + List, + Trigger, + // + Root as Tabs, + Content as TabsContent, + List as TabsList, + Trigger as TabsTrigger, +}; diff --git a/examples/svelte-chat/src/lib/components/ui/tabs/tabs-content.svelte b/examples/svelte-chat/src/lib/components/ui/tabs/tabs-content.svelte new file mode 100644 index 000000000..340d65cf2 --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ui/tabs/tabs-content.svelte @@ -0,0 +1,17 @@ + + + diff --git a/examples/svelte-chat/src/lib/components/ui/tabs/tabs-list.svelte b/examples/svelte-chat/src/lib/components/ui/tabs/tabs-list.svelte new file mode 100644 index 000000000..08932b60e --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ui/tabs/tabs-list.svelte @@ -0,0 +1,20 @@ + + + diff --git a/examples/svelte-chat/src/lib/components/ui/tabs/tabs-trigger.svelte b/examples/svelte-chat/src/lib/components/ui/tabs/tabs-trigger.svelte new file mode 100644 index 000000000..e623b366b --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ui/tabs/tabs-trigger.svelte @@ -0,0 +1,20 @@ + + + diff --git a/examples/svelte-chat/src/lib/components/ui/tabs/tabs.svelte b/examples/svelte-chat/src/lib/components/ui/tabs/tabs.svelte new file mode 100644 index 000000000..ef6cada5e --- /dev/null +++ b/examples/svelte-chat/src/lib/components/ui/tabs/tabs.svelte @@ -0,0 +1,19 @@ + + + diff --git a/examples/svelte-chat/src/lib/library.ts b/examples/svelte-chat/src/lib/library.ts new file mode 100644 index 000000000..a94679f2a --- /dev/null +++ b/examples/svelte-chat/src/lib/library.ts @@ -0,0 +1,368 @@ +import { defineComponent, createLibrary, type PromptOptions } from "@openuidev/svelte-lang"; +import { z } from "zod"; +import Card from "./components/library/Card.svelte"; +import Table from "./components/library/Table.svelte"; +import Input from "./components/library/Input.svelte"; +import Button from "./components/library/Button.svelte"; +import Form from "./components/library/Form.svelte"; +import Chart from "./components/library/Chart.svelte"; +import Stack from "./components/library/Stack.svelte"; +import TextContent from "./components/library/TextContent.svelte"; +import CodeBlock from "./components/library/CodeBlock.svelte"; +import Callout from "./components/library/Callout.svelte"; +import Separator from "./components/library/Separator.svelte"; +import Tabs from "./components/library/Tabs.svelte"; +import Accordion from "./components/library/Accordion.svelte"; +import Steps from "./components/library/Steps.svelte"; + +// ─── Shared Schemas ────────────────────────────────────────────────────────── + +const FlexPropsSchema = z.object({ + direction: z.enum(["row", "column"]).optional(), + gap: z.enum(["none", "xs", "s", "m", "l", "xl"]).optional(), + align: z + .enum(["start", "center", "end", "stretch", "baseline"]) + .optional(), + justify: z + .enum(["start", "center", "end", "between", "around", "evenly"]) + .optional(), + wrap: z.boolean().optional(), +}); + +// ─── Component Definitions ─────────────────────────────────────────────────── + +// Layout + +// children FIRST so Stack([...]) works positionally (matching react-ui's .merge() order) +const StackComponent = defineComponent({ + name: "Stack", + props: z + .object({ + children: z.array(z.any()), + }) + .merge(FlexPropsSchema), + description: + 'Flex container. direction: "row"|"column" (default "column"). gap: "none"|"xs"|"s"|"m"|"l"|"xl" (default "m"). align: "start"|"center"|"end"|"stretch"|"baseline". justify: "start"|"center"|"end"|"between"|"around"|"evenly".', + component: Stack, +}); + +const CardComponent = defineComponent({ + name: "Card", + props: z.object({ + children: z + .array(z.any()) + .describe("Card content — text, nested components, or a mix"), + }), + description: + "Vertical container for content. Children stack top to bottom automatically.", + component: Card, +}); + +const SeparatorComponent = defineComponent({ + name: "Separator", + props: z.object({ + orientation: z + .enum(["horizontal", "vertical"]) + .optional() + .describe("Separator orientation (default horizontal)"), + }), + description: "A visual separator between content sections.", + component: Separator, +}); + +// Content + +const TextContentComponent = defineComponent({ + name: "TextContent", + props: z.object({ + text: z.string().describe("Text content"), + size: z + .enum(["small", "default", "large", "small-heavy", "large-heavy"]) + .optional() + .describe("Text size and weight"), + }), + description: + "Text block. Use size variants for headings: large-heavy for titles, default for body text.", + component: TextContent, +}); + +const CodeBlockComponent = defineComponent({ + name: "CodeBlock", + props: z.object({ + language: z.string().describe("Programming language for syntax highlighting"), + codeString: z.string().describe("The code to display"), + }), + description: "Displays a code snippet with language label.", + component: CodeBlock, +}); + +const CalloutComponent = defineComponent({ + name: "Callout", + props: z.object({ + variant: z + .enum(["info", "warning", "error", "success", "neutral"]) + .describe("Callout style variant"), + title: z.string().describe("Callout heading"), + description: z.string().describe("Callout body text"), + }), + description: "Highlighted callout box for notices, tips, warnings, or errors.", + component: Callout, +}); + +// Interactive Layout + +const TabItemComponent = defineComponent({ + name: "TabItem", + props: z.object({ + value: z.string().describe("Unique tab identifier"), + trigger: z.string().describe("Tab label text"), + content: z.array(z.any()).describe("Tab panel content"), + }), + description: "A single tab with a label and content panel.", + component: {} as any, // rendered by Tabs parent +}); + +const TabsComponent = defineComponent({ + name: "Tabs", + props: z.object({ + items: z.array(TabItemComponent.ref).describe("Tab items"), + }), + description: "Tabbed interface — use TabItem for each tab.", + component: Tabs, +}); + +const AccordionItemComponent = defineComponent({ + name: "AccordionItem", + props: z.object({ + value: z.string().describe("Unique accordion item identifier"), + trigger: z.string().describe("Accordion item header text"), + content: z.array(z.any()).describe("Accordion item content"), + }), + description: "A single collapsible accordion section.", + component: {} as any, // rendered by Accordion parent +}); + +const AccordionComponent = defineComponent({ + name: "Accordion", + props: z.object({ + items: z + .array(AccordionItemComponent.ref) + .describe("Accordion items"), + }), + description: "Collapsible accordion — use AccordionItem for each section.", + component: Accordion, +}); + +const StepsItemComponent = defineComponent({ + name: "StepsItem", + props: z.object({ + title: z.string().describe("Step title"), + details: z.string().describe("Step description"), + }), + description: "A single step in a Steps list.", + component: {} as any, // rendered by Steps parent +}); + +const StepsComponent = defineComponent({ + name: "Steps", + props: z.object({ + items: z.array(StepsItemComponent.ref).describe("Step items"), + }), + description: "Numbered step-by-step guide.", + component: Steps, +}); + +// Data Display + +const TableComponent = defineComponent({ + name: "Table", + props: z.object({ + headers: z.array(z.string()).describe("Table column headers"), + rows: z + .array(z.array(z.string())) + .describe("Table rows, each row is an array of cell values"), + }), + description: "A data table with headers and rows", + component: Table, +}); + +const ChartComponent = defineComponent({ + name: "Chart", + props: z.object({ + type: z + .enum(["bar", "line", "pie"]) + .describe("Chart type (bar, line, or pie)"), + title: z.string().describe("Chart title"), + data: z + .array( + z.object({ + label: z.string().describe("Data point label"), + value: z.number().describe("Data point value"), + }), + ) + .describe("Chart data points"), + }), + description: "A chart for visualizing data", + component: Chart, +}); + +// Forms + +const InputComponent = defineComponent({ + name: "Input", + props: z.object({ + name: z.string().describe("Input field name"), + label: z.string().optional().describe("Input field label"), + placeholder: z.string().optional().describe("Input placeholder text"), + defaultValue: z.string().optional().describe("Default input value"), + }), + description: "A text input field for forms", + component: Input, +}); + +const ButtonComponent = defineComponent({ + name: "Button", + props: z.object({ + label: z.string().describe("Button text"), + action: z + .object({ + type: z.string().describe("Action type"), + params: z + .record(z.string(), z.unknown()) + .optional() + .describe("Action parameters"), + }) + .optional() + .describe("Action to trigger when clicked"), + }), + description: "A clickable button that can trigger actions", + component: Button, +}); + +const FormComponent = defineComponent({ + name: "Form", + props: z.object({ + name: z.string().describe("Form name for state isolation"), + fields: z.array(InputComponent.ref).describe("Form input fields"), + submitButton: ButtonComponent.ref.describe("Form submit button"), + }), + description: "A form container with input fields and a submit button", + component: Form, +}); + +// ─── Library ────────────────────────────────────────────────────────────────── + +export const library = createLibrary({ + components: [ + // Layout + StackComponent, + CardComponent, + SeparatorComponent, + // Content + TextContentComponent, + CodeBlockComponent, + CalloutComponent, + // Interactive Layout + TabsComponent, + TabItemComponent, + AccordionComponent, + AccordionItemComponent, + StepsComponent, + StepsItemComponent, + // Data Display + TableComponent, + ChartComponent, + // Forms + InputComponent, + ButtonComponent, + FormComponent, + ], + componentGroups: [ + { + name: "Layout", + components: ["Stack", "Card", "Separator", "Tabs", "TabItem", "Accordion", "AccordionItem", "Steps", "StepsItem"], + notes: [ + 'Use Stack with direction "row" for side-by-side layouts', + "Use Card as a container for content sections", + "Nest Cards inside Stack for dashboard-style layouts", + "Use Tabs for tabbed interfaces, Accordion for collapsible sections", + "Use Steps for numbered step-by-step guides", + ], + }, + { + name: "Content", + components: ["TextContent", "CodeBlock", "Callout"], + notes: [ + 'Use TextContent with size "large-heavy" for headings', + "Use CodeBlock for code snippets with syntax highlighting", + "Use Callout for notices, tips, warnings, or error messages", + ], + }, + { + name: "Data Display", + components: ["Table", "Chart"], + notes: [ + "Use Table for tabular data", + "Use Chart for data visualization (bar, line, pie)", + ], + }, + { + name: "Forms", + components: ["Form", "Input", "Button"], + notes: [ + "Use Form to group inputs with state isolation", + "Input fields automatically sync with form state", + "Button can trigger actions with form data", + ], + }, + ], + root: "Stack", +}); + +// ─── Prompt Options ────────────────────────────────────────────────────────── + +export const promptExamples: string[] = [ + `Example 1 — Table: +root = Stack([title, tbl]) +title = TextContent("Top Languages", "large-heavy") +tbl = Table(cols, rows) +cols = ["Language", "Users (M)", "Year"] +rows = [["Python", "15.7", "1991"], ["JavaScript", "14.2", "1995"], ["Go", "5.2", "2009"]]`, + + `Example 2 — Side-by-side cards with chart: +root = Stack([title, row]) +title = TextContent("Q4 Revenue", "large-heavy") +row = Stack([card1, card2], "row") +card1 = Card([chart]) +chart = Chart("bar", "Monthly", [{label: "Oct", value: 120}, {label: "Nov", value: 150}, {label: "Dec", value: 180}]) +card2 = Card([TextContent("Revenue grew 15% in Q4."), Callout("success", "Target Met", "Exceeded goal by $20k.")])`, + + `Example 3 — Form: +root = Stack([title, form]) +title = TextContent("Contact Us", "large-heavy") +form = Form("contact", [nameField, emailField], submitBtn) +nameField = Input("name", "Name", "Your name") +emailField = Input("email", "Email", "you@example.com") +submitBtn = Button("Submit", {type: "continue_conversation"})`, + + `Example 4 — Tabs with mixed content: +root = Stack([title, tabs]) +title = TextContent("React vs Vue", "large-heavy") +tabs = Tabs([tabReact, tabVue]) +tabReact = TabItem("react", "React", reactContent) +tabVue = TabItem("vue", "Vue", vueContent) +reactContent = [TextContent("React is a library by Meta for building UIs."), Callout("info", "Note", "React uses JSX syntax.")] +vueContent = [TextContent("Vue is a progressive framework by Evan You."), Callout("success", "Tip", "Vue has a gentle learning curve.")]`, +]; + +export const promptAdditionalRules: string[] = [ + 'For grid-like layouts, use Stack with direction "row".', + "For forms, define one Input reference per field so controls can stream progressively.", + "Never nest Form inside Form.", + "Use TextContent for all text — use size variants for headings.", +]; + +export const promptOptions: PromptOptions = { + examples: promptExamples, + additionalRules: promptAdditionalRules, +}; diff --git a/examples/svelte-chat/src/lib/utils.ts b/examples/svelte-chat/src/lib/utils.ts new file mode 100644 index 000000000..55b3a918e --- /dev/null +++ b/examples/svelte-chat/src/lib/utils.ts @@ -0,0 +1,13 @@ +import { clsx, type ClassValue } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type WithoutChild = T extends { child?: any } ? Omit : T; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type WithoutChildren = T extends { children?: any } ? Omit : T; +export type WithoutChildrenOrChild = WithoutChildren>; +export type WithElementRef = T & { ref?: U | null }; diff --git a/examples/svelte-chat/src/routes/+page.svelte b/examples/svelte-chat/src/routes/+page.svelte new file mode 100644 index 000000000..1be76f00f --- /dev/null +++ b/examples/svelte-chat/src/routes/+page.svelte @@ -0,0 +1,130 @@ + + +
+
+

Svelte OpenUI Chat

+

Chat with an AI assistant using OpenUI Lang components

+
+ +
+
+ {#each messages as message (message.id)} + + {/each} + + {#if isStreaming && currentStreamingMessage} + + {/if} +
+ +
+ (inputValue = value)} + /> +
+
+
diff --git a/examples/svelte-chat/src/routes/api/chat/+server.ts b/examples/svelte-chat/src/routes/api/chat/+server.ts new file mode 100644 index 000000000..d6a3b3c45 --- /dev/null +++ b/examples/svelte-chat/src/routes/api/chat/+server.ts @@ -0,0 +1,69 @@ +import { env } from "$env/dynamic/private"; +import { library, promptOptions } from "$lib/library"; +import OpenAI from "openai"; +import type { RequestHandler } from "./$types"; + +function getOpenAIClient() { + return new OpenAI({ + apiKey: env.OPENAI_API_KEY, + }); +} + +export const POST: RequestHandler = async ({ request }) => { + try { + const { messages } = await request.json(); + + // Generate system prompt from library (auto-generates syntax rules, + // component signatures, and streaming guidance from the Zod schemas) + const systemPrompt = library.prompt({ + preamble: + "You are a helpful assistant that generates UI components using OpenUI Lang.", + ...promptOptions, + }); + + // Create streaming response + const stream = await getOpenAIClient().chat.completions.create({ + model: "gpt-4", + messages: [ + { role: "system", content: systemPrompt }, + ...messages, + ], + stream: true, + }); + + // Create a readable stream + const encoder = new TextEncoder(); + const readableStream = new ReadableStream({ + async start(controller) { + try { + for await (const chunk of stream) { + const content = chunk.choices[0]?.delta?.content || ""; + if (content) { + controller.enqueue(encoder.encode(content)); + } + } + controller.close(); + } catch (error) { + controller.error(error); + } + }, + }); + + return new Response(readableStream, { + headers: { + "Content-Type": "text/plain; charset=utf-8", + "Cache-Control": "no-cache", + Connection: "keep-alive", + }, + }); + } catch (error) { + console.error("Error in chat API:", error); + return new Response( + JSON.stringify({ error: "Failed to process request" }), + { + status: 500, + headers: { "Content-Type": "application/json" }, + }, + ); + } +}; diff --git a/examples/svelte-chat/svelte.config.js b/examples/svelte-chat/svelte.config.js new file mode 100644 index 000000000..b8bcc6cc4 --- /dev/null +++ b/examples/svelte-chat/svelte.config.js @@ -0,0 +1,15 @@ +import adapter from "@sveltejs/adapter-auto"; +import { vitePreprocess } from "@sveltejs/vite-plugin-svelte"; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + preprocess: vitePreprocess(), + compilerOptions: { + runes: true, + }, + kit: { + adapter: adapter(), + }, +}; + +export default config; diff --git a/examples/svelte-chat/tsconfig.json b/examples/svelte-chat/tsconfig.json new file mode 100644 index 000000000..a8f10c8e3 --- /dev/null +++ b/examples/svelte-chat/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + } +} diff --git a/examples/svelte-chat/vite.config.ts b/examples/svelte-chat/vite.config.ts new file mode 100644 index 000000000..0fdb702c3 --- /dev/null +++ b/examples/svelte-chat/vite.config.ts @@ -0,0 +1,13 @@ +import { sveltekit } from "@sveltejs/kit/vite"; +import tailwindcss from "@tailwindcss/vite"; +import { defineConfig } from "vite"; + +export default defineConfig({ + plugins: [sveltekit(), tailwindcss()], + ssr: { + // react-lang uses "moduleResolution": "bundler" and emits imports without + // .js extensions — Node's native ESM resolver can't handle that, so we + // tell Vite to bundle it instead of externalizing it during SSR. + noExternal: ["@openuidev/react-lang"], + }, +}); diff --git a/packages/react-lang/src/index.ts b/packages/react-lang/src/index.ts index 662d02475..c6dedc10f 100644 --- a/packages/react-lang/src/index.ts +++ b/packages/react-lang/src/index.ts @@ -17,10 +17,10 @@ export type { RendererProps } from "./Renderer"; // openui-lang action types export { BuiltinActionType } from "./parser/types"; -export type { ActionEvent, ElementNode, ParseResult } from "./parser/types"; +export type { ActionEvent, ElementNode, ParseResult, ValidationError } from "./parser/types"; // openui-lang parser (server-side use) -export { createParser, createStreamingParser, type LibraryJSONSchema } from "./parser"; +export { createParser, createStreamingParser, generatePrompt, type LibraryJSONSchema } from "./parser"; // openui-lang context hooks (for use inside component renderers) export { diff --git a/packages/svelte-lang/.gitignore b/packages/svelte-lang/.gitignore new file mode 100644 index 000000000..238a7567a --- /dev/null +++ b/packages/svelte-lang/.gitignore @@ -0,0 +1,37 @@ +# Dependencies +node_modules/ + +# Build output +dist/ +.svelte-kit/ + +# Environment +.env +.env.local +.env.*.local + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS +.DS_Store +Thumbs.db + +# Testing +coverage/ +.vitest/ + +# Logs +*.log +npm-debug.log* +pnpm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Temporary files +*.tmp +*.temp diff --git a/packages/svelte-lang/.npmignore b/packages/svelte-lang/.npmignore new file mode 100644 index 000000000..0ab0fa8a7 --- /dev/null +++ b/packages/svelte-lang/.npmignore @@ -0,0 +1,46 @@ +# Source files +src/ + +# Tests +**/__tests__/ +**/*.test.ts +**/*.test.js +**/*.spec.ts +**/*.spec.js + +# Configuration +tsconfig.json +vite.config.ts +svelte.config.js +.eslintrc.* +.prettierrc.* + +# Development +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# Build artifacts +*.tsbuildinfo +.svelte-kit/ + +# Environment +.env +.env.* + +# Documentation (keep README.md) +docs/ + +# CI/CD +.github/ +.gitlab-ci.yml +.travis.yml + +# Logs +*.log + +# Coverage +coverage/ +.vitest/ diff --git a/packages/svelte-lang/README.md b/packages/svelte-lang/README.md new file mode 100644 index 000000000..269443b2b --- /dev/null +++ b/packages/svelte-lang/README.md @@ -0,0 +1,208 @@ +# @openuidev/svelte-lang + +Svelte renderer for [OpenUI Lang](https://openui.com) — define component libraries, generate LLM system prompts, and render streaming OpenUI Lang output in Svelte 5. + +## Installation + +```bash +pnpm add @openuidev/svelte-lang +``` + +Peer dependencies: + +```bash +pnpm add svelte@^5.0.0 zod@^4.0.0 +``` + +## Quick Start + +### 1. Define Components + +```ts +// lib/library.ts +import { defineComponent, createLibrary } from "@openuidev/svelte-lang"; +import { z } from "zod"; +import Card from "./components/Card.svelte"; + +const CardComponent = defineComponent({ + name: "Card", + props: z.object({ + title: z.string().describe("Card title"), + content: z.any().describe("Card content"), + }), + description: "A card container with title and content", + component: Card, +}); + +export const library = createLibrary({ + components: [CardComponent], + root: "Card", +}); +``` + +### 2. Create a Svelte Component + +```svelte + + + +
+

{props.title}

+
{@render renderNode(props.content)}
+
+``` + +### 3. Render OpenUI Lang Output + +```svelte + + + +``` + +### 4. Generate LLM System Prompts + +```ts +const systemPrompt = library.prompt({ + preamble: "You are a helpful assistant that generates UI.", + additionalRules: ["Use Card for organizing content"], +}); +``` + +## API Reference + +### `defineComponent(config)` + +Define a component with a Zod schema, description, and Svelte renderer. + +```ts +const comp = defineComponent({ + name: "Button", + props: z.object({ label: z.string() }), + description: "A clickable button", + component: ButtonComponent, +}); + +// Use .ref in parent schemas for cross-references +const form = defineComponent({ + name: "Form", + props: z.object({ submitButton: comp.ref }), + description: "A form", + component: FormComponent, +}); +``` + +### `createLibrary(definition)` + +Create a component library from defined components. + +```ts +const library = createLibrary({ + components: [card, table, form], + componentGroups: [{ name: "Layout", components: ["Card"] }], + root: "Card", +}); +``` + +### `` Component + +| Prop | Type | Description | +|------|------|-------------| +| `response` | `string \| null` | Raw OpenUI Lang text | +| `library` | `Library` | Component library | +| `isStreaming` | `boolean` | Whether LLM is still streaming | +| `onAction` | `(event: ActionEvent) => void` | Action callback | +| `onStateUpdate` | `(state) => void` | Form state change callback | +| `initialState` | `Record` | Initial form state | +| `onParseResult` | `(result) => void` | Parse result callback | + +### Context API + +Access renderer state from within components: + +```ts +import { + getOpenUIContext, // Full context + getTriggerAction, // Fire action events + getIsStreaming, // Check streaming status + getGetFieldValue, // Read form field values + getSetFieldValue, // Update form field values + getFormName, // Current form name + useSetDefaultValue, // Set defaults after streaming + setFormNameContext, // Set form name (for Form components) +} from "@openuidev/svelte-lang"; +``` + +### Form Handling + +```svelte + +``` + +### Action Events + +```svelte + +``` + +## Differences from React Implementation + +| React (`@openuidev/react-lang`) | Svelte (`@openuidev/svelte-lang`) | +|------|------| +| `useRenderNode()` hook | `renderNode` snippet prop | +| `useIsStreaming()` hook | `getIsStreaming()` context getter | +| `useSetFieldValue()` hook | `getSetFieldValue()` context getter | +| `useFormName()` hook | `getFormName()` context getter | +| React Context.Provider | Svelte `setContext` / `getContext` | +| React.FC component | Svelte 5 component with runes | +| JSX `{renderNode(value)}` | `{@render renderNode(value)}` | + +## Shared with React + +The following are reused directly from `@openuidev/react-lang` (no duplication): + +- Parser (`createParser`, `createStreamingParser`) +- Prompt generation (`library.prompt()`) +- Types (`ElementNode`, `ParseResult`, `ActionEvent`, `ValidationError`) +- Validation utilities (`builtInValidators`, `parseRules`, `validate`) + +## License + +MIT diff --git a/packages/svelte-lang/package.json b/packages/svelte-lang/package.json new file mode 100644 index 000000000..d7af84987 --- /dev/null +++ b/packages/svelte-lang/package.json @@ -0,0 +1,83 @@ +{ + "name": "@openuidev/svelte-lang", + "version": "0.1.0", + "description": "Svelte renderer for OpenUI Lang — define component libraries, generate LLM system prompts, and render streaming OpenUI Lang output in Svelte", + "license": "MIT", + "type": "module", + "svelte": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "svelte": "./dist/index.js", + "import": "./dist/index.js", + "default": "./dist/index.js" + } + }, + "files": [ + "dist", + "README.md" + ], + "scripts": { + "build": "svelte-package -o dist", + "watch": "svelte-package -o dist --watch", + "lint:check": "eslint ./src", + "lint:fix": "eslint ./src --fix", + "format:fix": "prettier --write ./src", + "format:check": "prettier --check ./src", + "test": "vitest run", + "test:watch": "vitest", + "test:ui": "vitest --ui", + "prepare": "pnpm run build", + "ci": "pnpm run lint:check && pnpm run format:check && pnpm run test" + }, + "keywords": [ + "openui", + "generative-ui", + "svelte", + "llm", + "streaming", + "renderer", + "parser", + "ai", + "components", + "prompt-generation", + "zod", + "ui-generation", + "model-driven-ui", + "openui-lang", + "svelte5", + "runes" + ], + "homepage": "https://openui.com", + "repository": { + "type": "git", + "url": "https://github.com/thesysdev/openui.git", + "directory": "packages/svelte-lang" + }, + "bugs": { + "url": "https://github.com/thesysdev/openui/issues" + }, + "author": "engineering@thesys.dev", + "peerDependencies": { + "svelte": "^5.0.0" + }, + "dependencies": { + "@openuidev/react-lang": "workspace:*", + "zod": "^4.0.0" + }, + "devDependencies": { + "@sveltejs/package": "^2.0.0", + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/svelte": "^5.0.0", + "@types/node": "^20.0.0", + "fast-check": "^3.15.0", + "jsdom": "^25.0.0", + "prettier-plugin-svelte": "^3.0.0", + "svelte": "^5.0.0", + "svelte-check": "^4.0.0", + "vite": "^6.0.0", + "vitest": "^2.0.0" + } +} diff --git a/packages/svelte-lang/src/lib/.gitkeep b/packages/svelte-lang/src/lib/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/packages/svelte-lang/src/lib/RenderNode.svelte b/packages/svelte-lang/src/lib/RenderNode.svelte new file mode 100644 index 000000000..4fae6b782 --- /dev/null +++ b/packages/svelte-lang/src/lib/RenderNode.svelte @@ -0,0 +1,42 @@ + + +{#if node && Comp} + +{:else if node} + +{/if} diff --git a/packages/svelte-lang/src/lib/Renderer.svelte b/packages/svelte-lang/src/lib/Renderer.svelte new file mode 100644 index 000000000..6ebbe7345 --- /dev/null +++ b/packages/svelte-lang/src/lib/Renderer.svelte @@ -0,0 +1,168 @@ + + + +{#snippet renderNode(value: unknown)} + {#if value == null} + + {:else if typeof value === 'string'} + {value} + {:else if typeof value === 'number' || typeof value === 'boolean'} + {String(value)} + {:else if Array.isArray(value)} + {#each value as item} + {@render renderNode(item)} + {/each} + {:else if typeof value === 'object' && (value as any).type === 'element'} + + {/if} +{/snippet} + +{#if result?.root} + +{/if} diff --git a/packages/svelte-lang/src/lib/__tests__/Renderer.test.ts b/packages/svelte-lang/src/lib/__tests__/Renderer.test.ts new file mode 100644 index 000000000..1e619d747 --- /dev/null +++ b/packages/svelte-lang/src/lib/__tests__/Renderer.test.ts @@ -0,0 +1,94 @@ +import { describe, it, expect } from 'vitest'; +import { render, screen } from '@testing-library/svelte'; +import { z } from 'zod'; +import { createParser } from '@openuidev/react-lang'; +import { defineComponent, createLibrary } from '../library.js'; +import RendererTest from './RendererTest.svelte'; +import TestCard from './TestCard.svelte'; + +function createTestLibrary() { + const card = defineComponent({ + name: 'Card', + props: z.object({ + title: z.string(), + content: z.any(), + }), + description: 'A card component', + component: TestCard, + }); + + return createLibrary({ + components: [card], + root: 'Card', + }); +} + +describe('Renderer', () => { + it('renders null when response is null', () => { + const library = createTestLibrary(); + render(RendererTest, { + props: { response: null, library }, + }); + + const wrapper = screen.getByTestId('renderer-wrapper'); + expect(wrapper.children).toHaveLength(0); + }); + + it('renders a simple Card component from OpenUI Lang', () => { + const library = createTestLibrary(); + const response = 'root = Card("Hello World", "Some content")'; + + render(RendererTest, { + props: { response, library }, + }); + + expect(screen.getByTestId('test-card')).toBeInTheDocument(); + expect(screen.getByTestId('card-title')).toHaveTextContent('Hello World'); + expect(screen.getByTestId('card-content')).toHaveTextContent('Some content'); + }); + + it('renders with reference variables', () => { + const library = createTestLibrary(); + const response = `root = Card("My Title", content)\ncontent = "Referenced content"`; + + render(RendererTest, { + props: { response, library }, + }); + + expect(screen.getByTestId('card-title')).toHaveTextContent('My Title'); + expect(screen.getByTestId('card-content')).toHaveTextContent('Referenced content'); + }); + + it('renders nothing for empty response', () => { + const library = createTestLibrary(); + render(RendererTest, { + props: { response: '', library }, + }); + + const wrapper = screen.getByTestId('renderer-wrapper'); + expect(wrapper.children).toHaveLength(0); + }); + + it('debug: parse array root', () => { + const library = createTestLibrary(); + const parser = createParser(library.toJSONSchema()); + const response = 'root = Card([Card("a","b"), Card("c","d")])'; + const result = parser.parse(response); + console.log('SCHEMA:', JSON.stringify(library.toJSONSchema(), null, 2)); + console.log('ROOT:', JSON.stringify(result.root, null, 2)); + console.log('ERRORS:', JSON.stringify(result.errors, null, 2)); + }); + + it('handles incomplete/streaming input gracefully', () => { + const library = createTestLibrary(); + // Incomplete input — parser auto-closes + const response = 'root = Card("Streaming", "partial'; + + render(RendererTest, { + props: { response, library, isStreaming: true }, + }); + + expect(screen.getByTestId('test-card')).toBeInTheDocument(); + expect(screen.getByTestId('card-title')).toHaveTextContent('Streaming'); + }); +}); diff --git a/packages/svelte-lang/src/lib/__tests__/RendererTest.svelte b/packages/svelte-lang/src/lib/__tests__/RendererTest.svelte new file mode 100644 index 000000000..9e0f136ab --- /dev/null +++ b/packages/svelte-lang/src/lib/__tests__/RendererTest.svelte @@ -0,0 +1,18 @@ + + +
+ +
diff --git a/packages/svelte-lang/src/lib/__tests__/TestCard.svelte b/packages/svelte-lang/src/lib/__tests__/TestCard.svelte new file mode 100644 index 000000000..f2d44f68c --- /dev/null +++ b/packages/svelte-lang/src/lib/__tests__/TestCard.svelte @@ -0,0 +1,17 @@ + + +
+

{props.title}

+
+ {@render renderNode(props.content)} +
+
diff --git a/packages/svelte-lang/src/lib/__tests__/library.test.ts b/packages/svelte-lang/src/lib/__tests__/library.test.ts new file mode 100644 index 000000000..196332d1c --- /dev/null +++ b/packages/svelte-lang/src/lib/__tests__/library.test.ts @@ -0,0 +1,133 @@ +import { describe, it, expect } from 'vitest'; +import { z } from 'zod'; + +// We test the library utilities directly — they don't depend on Svelte rendering. +// Import from the built source. +import { defineComponent, createLibrary } from '../library.js'; + +// Minimal stub component for testing (never actually rendered in these tests) +const StubComponent = {} as any; + +describe('defineComponent', () => { + it('returns a DefinedComponent with name, props, description, component, and ref', () => { + const comp = defineComponent({ + name: 'TestCard', + props: z.object({ title: z.string() }), + description: 'A test card', + component: StubComponent, + }); + + expect(comp.name).toBe('TestCard'); + expect(comp.description).toBe('A test card'); + expect(comp.component).toBe(StubComponent); + expect(comp.ref).toBeDefined(); + }); + + it('registers the schema in Zod global registry', () => { + const schema = z.object({ label: z.string() }); + defineComponent({ + name: 'RegisteredComp', + props: schema, + description: 'test', + component: StubComponent, + }); + + const meta = z.globalRegistry.get(schema); + expect(meta).toBeDefined(); + expect(meta?.id).toBe('RegisteredComp'); + }); + + it('provides a .ref for cross-referencing in parent schemas', () => { + const child = defineComponent({ + name: 'ChildComp', + props: z.object({ value: z.string() }), + description: 'child', + component: StubComponent, + }); + + // .ref can be used in a parent schema + const parentSchema = z.object({ + items: z.array(child.ref), + }); + + expect(parentSchema).toBeDefined(); + }); +}); + +describe('createLibrary', () => { + const card = defineComponent({ + name: 'Card', + props: z.object({ title: z.string(), content: z.any() }), + description: 'A card', + component: StubComponent, + }); + + const table = defineComponent({ + name: 'Table', + props: z.object({ headers: z.array(z.string()), rows: z.array(z.array(z.string())) }), + description: 'A table', + component: StubComponent, + }); + + it('creates a library with components record', () => { + const lib = createLibrary({ components: [card, table] }); + + expect(lib.components['Card']).toBe(card); + expect(lib.components['Table']).toBe(table); + expect(Object.keys(lib.components)).toHaveLength(2); + }); + + it('sets root component when specified', () => { + const lib = createLibrary({ components: [card, table], root: 'Card' }); + expect(lib.root).toBe('Card'); + }); + + it('throws if root component does not exist', () => { + expect(() => + createLibrary({ components: [card], root: 'NonExistent' }) + ).toThrow(/Root component "NonExistent" was not found/); + }); + + it('stores componentGroups', () => { + const lib = createLibrary({ + components: [card, table], + componentGroups: [ + { name: 'Layout', components: ['Card'] }, + { name: 'Data', components: ['Table'] }, + ], + }); + + expect(lib.componentGroups).toHaveLength(2); + expect(lib.componentGroups![0].name).toBe('Layout'); + }); + + it('generates a prompt string', () => { + const lib = createLibrary({ components: [card, table], root: 'Card' }); + const prompt = lib.prompt(); + + expect(prompt).toContain('Card'); + expect(prompt).toContain('Table'); + expect(prompt).toContain('root'); + }); + + it('generates a prompt with custom options', () => { + const lib = createLibrary({ components: [card], root: 'Card' }); + const prompt = lib.prompt({ + preamble: 'Custom preamble here', + additionalRules: ['Rule one', 'Rule two'], + }); + + expect(prompt).toContain('Custom preamble here'); + expect(prompt).toContain('Rule one'); + expect(prompt).toContain('Rule two'); + }); + + it('generates JSON Schema with $defs for all components', () => { + const lib = createLibrary({ components: [card, table], root: 'Card' }); + const schema = lib.toJSONSchema() as any; + + expect(schema.$defs).toBeDefined(); + expect(schema.$defs['Card']).toBeDefined(); + expect(schema.$defs['Table']).toBeDefined(); + }); +}); diff --git a/packages/svelte-lang/src/lib/__tests__/setup.ts b/packages/svelte-lang/src/lib/__tests__/setup.ts new file mode 100644 index 000000000..9c9eccc44 --- /dev/null +++ b/packages/svelte-lang/src/lib/__tests__/setup.ts @@ -0,0 +1,9 @@ +// Vitest setup file for Svelte tests +import { afterEach } from 'vitest'; +import { cleanup } from '@testing-library/svelte'; +import '@testing-library/jest-dom/vitest'; + +// Cleanup after each test +afterEach(() => { + cleanup(); +}); diff --git a/packages/svelte-lang/src/lib/__tests__/validation.test.ts b/packages/svelte-lang/src/lib/__tests__/validation.test.ts new file mode 100644 index 000000000..b4603a58e --- /dev/null +++ b/packages/svelte-lang/src/lib/__tests__/validation.test.ts @@ -0,0 +1,67 @@ +import { describe, it, expect } from 'vitest'; +import { builtInValidators, parseRules, validate } from '../validation.js'; + +describe('parseRules', () => { + it('parses an array of string rules', () => { + const rules = parseRules(['required']); + expect(rules).toEqual([{ type: 'required' }]); + }); + + it('parses multiple rules with arguments', () => { + const rules = parseRules(['required', 'email', 'minLength:5']); + expect(rules).toHaveLength(3); + expect(rules[0]).toEqual({ type: 'required' }); + expect(rules[1]).toEqual({ type: 'email' }); + expect(rules[2]).toEqual({ type: 'minLength', arg: 5 }); + }); + + it('returns empty array for non-array input', () => { + expect(parseRules('required')).toEqual([]); + expect(parseRules(undefined)).toEqual([]); + expect(parseRules(null)).toEqual([]); + }); +}); + +describe('validate', () => { + it('returns undefined for valid required field', () => { + const rules = parseRules(['required']); + const error = validate('hello', rules, builtInValidators); + expect(error).toBeUndefined(); + }); + + it('returns error message for empty required field', () => { + const rules = parseRules(['required']); + const error = validate('', rules, builtInValidators); + expect(error).toBe('This field is required'); + }); + + it('validates email format', () => { + const rules = parseRules(['email']); + expect(validate('user@example.com', rules, builtInValidators)).toBeUndefined(); + expect(validate('invalid', rules, builtInValidators)).toBe('Please enter a valid email'); + }); + + it('validates minLength', () => { + const rules = parseRules(['minLength:3']); + expect(validate('ab', rules, builtInValidators)).toBe('Must be at least 3 characters'); + expect(validate('abc', rules, builtInValidators)).toBeUndefined(); + }); +}); + +describe('builtInValidators', () => { + it('has required validator', () => { + expect(builtInValidators['required']).toBeDefined(); + }); + + it('has email validator', () => { + expect(builtInValidators['email']).toBeDefined(); + }); + + it('has minLength validator', () => { + expect(builtInValidators['minLength']).toBeDefined(); + }); + + it('has url validator', () => { + expect(builtInValidators['url']).toBeDefined(); + }); +}); diff --git a/packages/svelte-lang/src/lib/context.svelte.ts b/packages/svelte-lang/src/lib/context.svelte.ts new file mode 100644 index 000000000..9950a0b56 --- /dev/null +++ b/packages/svelte-lang/src/lib/context.svelte.ts @@ -0,0 +1,165 @@ +import { getContext, setContext } from "svelte"; +import type { Library } from "./library.js"; + +// ─── Action Config ──────────────────────────────────────────────────────────── + +/** + * Configuration for an action triggered by a component (e.g. button click). + */ +export interface ActionConfig { + type?: string; + params?: Record; +} + +// ─── Context Keys ───────────────────────────────────────────────────────────── + +export const OPENUI_CONTEXT_KEY = Symbol("openui"); +export const FORM_NAME_CONTEXT_KEY = Symbol("openui-form-name"); + +// ─── Context Value ──────────────────────────────────────────────────────────── + +export interface OpenUIContextValue { + library: Library; + triggerAction: ( + userMessage: string, + formName?: string, + action?: ActionConfig, + ) => void; + /** Reactive — use as a getter in the context object so reads track changes. */ + isStreaming: boolean; + getFieldValue: (formName: string | undefined, name: string) => any; + setFieldValue: ( + formName: string | undefined, + componentType: string | undefined, + name: string, + value: any, + shouldTriggerSaveCallback?: boolean, + ) => void; +} + +// ─── Context Getters ────────────────────────────────────────────────────────── + +/** + * Get the full OpenUI context value. + * Must be called from within a Renderer component. + */ +export function getOpenUIContext(): OpenUIContextValue { + const ctx = getContext(OPENUI_CONTEXT_KEY); + if (!ctx) { + throw new Error( + "getOpenUIContext must be used within a Renderer component", + ); + } + return ctx; +} + +/** + * Get the triggerAction function for firing action events. + * Must be called from within a Renderer component. + */ +export function getTriggerAction(): ( + userMessage: string, + formName?: string, + action?: ActionConfig, +) => void { + return getOpenUIContext().triggerAction; +} + +/** + * Get the streaming status. + * Must be called from within a Renderer component. + * Note: returns the current value; for reactive tracking in $effect/$derived, + * read ctx.isStreaming directly from the context object. + */ +export function getIsStreaming(): boolean { + return getOpenUIContext().isStreaming; +} + +/** + * Get the getFieldValue function for reading form field values. + * Must be called from within a Renderer component. + */ +export function getGetFieldValue(): ( + formName: string | undefined, + name: string, +) => any { + return getOpenUIContext().getFieldValue; +} + +/** + * Get the setFieldValue function for updating form field values. + * Must be called from within a Renderer component. + */ +export function getSetFieldValue(): ( + formName: string | undefined, + componentType: string | undefined, + name: string, + value: any, + shouldTriggerSaveCallback?: boolean, +) => void { + return getOpenUIContext().setFieldValue; +} + +/** + * Get the current form name from context. + * Returns undefined if not within a form. + */ +export function getFormName(): string | undefined { + return getContext(FORM_NAME_CONTEXT_KEY); +} + +/** + * Set the OpenUI context value. + * Should only be called by the Renderer component. + */ +export function setOpenUIContext(value: OpenUIContextValue): void { + setContext(OPENUI_CONTEXT_KEY, value); +} + +/** + * Set the form name context. + * Should be called by Form components. + */ +export function setFormNameContext(formName: string): void { + setContext(FORM_NAME_CONTEXT_KEY, formName); +} + +// ─── Default Value Helper ───────────────────────────────────────────────────── + +interface SetDefaultValueOptions { + formName?: string; + componentType: string; + name: string; + existingValue: any; + defaultValue: any; + shouldTriggerSaveCallback?: boolean; +} + +/** + * Helper for setting default values after streaming completes. + * Only sets the value if the field doesn't already have a value. + * + * Accepts either a plain options object or a getter function that returns options. + * Use a getter when options contain reactive values (e.g. from $props or $derived). + */ +export function useSetDefaultValue(optionsOrGetter: SetDefaultValueOptions | (() => SetDefaultValueOptions)): void { + const ctx = getOpenUIContext(); + const setFieldValue = ctx.setFieldValue; + + $effect(() => { + const options = typeof optionsOrGetter === 'function' ? optionsOrGetter() : optionsOrGetter; + if ( + !ctx.isStreaming && + options.existingValue === undefined && + options.defaultValue !== undefined + ) { + setFieldValue( + options.formName, + options.componentType, + options.name, + options.defaultValue, + options.shouldTriggerSaveCallback ?? false, + ); + } + }); +} diff --git a/packages/svelte-lang/src/lib/index.ts b/packages/svelte-lang/src/lib/index.ts new file mode 100644 index 000000000..e939030a3 --- /dev/null +++ b/packages/svelte-lang/src/lib/index.ts @@ -0,0 +1,65 @@ +// ─── Component Definition ───────────────────────────────────────────────────── + +export { defineComponent, createLibrary } from "./library.js"; +export type { + ComponentRenderProps, + ComponentRenderer, + DefinedComponent, + Library, + LibraryDefinition, + ComponentGroup, + PromptOptions, + SubComponentOf, +} from "./library.js"; + +// ─── Renderer Component ─────────────────────────────────────────────────────── + +export { default as Renderer } from "./Renderer.svelte"; + +// ─── Context API ────────────────────────────────────────────────────────────── + +export { + getOpenUIContext, + getTriggerAction, + getIsStreaming, + getGetFieldValue, + getSetFieldValue, + getFormName, + useSetDefaultValue, + setFormNameContext, +} from "./context.svelte.js"; +export type { OpenUIContextValue, ActionConfig } from "./context.svelte.js"; + +// ─── Form Validation ────────────────────────────────────────────────────────── + +export { + createFormValidation, + getFormValidation, + setFormValidationContext, + builtInValidators, + parseRules, + validate, +} from "./validation.js"; +export type { + FormValidationContextValue, + ParsedRule, + ValidatorFn, +} from "./validation.js"; + +// ─── Re-export Shared Types from react-lang ────────────────────────────────── + +export type { + ElementNode, + ParseResult, + ActionEvent, + ValidationError, +} from "@openuidev/react-lang"; +export { BuiltinActionType } from "@openuidev/react-lang"; + +// ─── Re-export Parser for Server-Side Use ──────────────────────────────────── + +export { + createParser, + createStreamingParser, + type LibraryJSONSchema, +} from "@openuidev/react-lang"; diff --git a/packages/svelte-lang/src/lib/library.ts b/packages/svelte-lang/src/lib/library.ts new file mode 100644 index 000000000..2d9bfc400 --- /dev/null +++ b/packages/svelte-lang/src/lib/library.ts @@ -0,0 +1,171 @@ +import type { Component, Snippet } from "svelte"; +import { z } from "zod"; +import { generatePrompt } from "@openuidev/react-lang"; + +// ─── Sub-component type ────────────────────────────────────────────────────── + +/** + * Runtime shape of a parsed sub-component element as seen by parent renderers. + */ +export type SubComponentOf

= { + type: "element"; + typeName: string; + props: P; + partial: boolean; +}; + +// ─── Renderer types ─────────────────────────────────────────────────────────── + +export interface ComponentRenderProps

> { + props: P; + renderNode: Snippet<[unknown]>; +} + +export type ComponentRenderer

> = Component< + ComponentRenderProps

+>; + +// ─── DefinedComponent ───────────────────────────────────────────────────────── + +/** + * A fully defined component with name, schema, description, renderer, + * and a `.ref` for type-safe cross-referencing in parent schemas. + */ +export interface DefinedComponent = z.ZodObject> { + name: string; + props: T; + description: string; + component: ComponentRenderer>; + /** Use in parent schemas: `z.array(ChildComponent.ref)` */ + ref: z.ZodType>>; +} + +/** + * Define a component with name, schema, description, and renderer. + * Registers the Zod schema globally and returns a `.ref` for parent schemas. + * + * @example + * ```ts + * const TabItem = defineComponent({ + * name: "TabItem", + * props: z.object({ value: z.string(), trigger: z.string(), content: z.array(ContentChildUnion) }), + * description: "Tab panel", + * component: TabItemComponent, + * }); + * + * const Tabs = defineComponent({ + * name: "Tabs", + * props: z.object({ items: z.array(TabItem.ref) }), + * description: "Tabbed container", + * component: TabsComponent, + * }); + * ``` + */ +export function defineComponent>(config: { + name: string; + props: T; + description: string; + component: ComponentRenderer>; +}): DefinedComponent { + (config.props as any).register(z.globalRegistry, { id: config.name }); + return { + ...config, + ref: config.props as unknown as z.ZodType>>, + }; +} + +// ─── Groups & Prompt ────────────────────────────────────────────────────────── + +export interface ComponentGroup { + name: string; + components: string[]; + notes?: string[]; +} + +export interface PromptOptions { + preamble?: string; + additionalRules?: string[]; + examples?: string[]; +} + +// ─── Library ────────────────────────────────────────────────────────────────── + +export interface Library { + readonly components: Record; + readonly componentGroups: ComponentGroup[] | undefined; + readonly root: string | undefined; + + prompt(options?: PromptOptions): string; + /** + * Returns a single, valid JSON Schema document for the entire library. + * All component schemas are in `$defs`, keyed by component name. + * Sub-schemas shared across components (e.g. `Series`, `CardHeader`) are + * emitted once and referenced via `$ref` — no repetition. + * + * @example + * ```ts + * const schema = library.toJSONSchema(); + * // schema.$defs["Card"] → { properties: {...}, required: [...] } + * // schema.$defs["Series"] → { properties: {...}, required: [...] } + * ``` + */ + toJSONSchema(): object; +} + +export interface LibraryDefinition { + components: DefinedComponent[]; + componentGroups?: ComponentGroup[]; + root?: string; +} + +/** + * Create a component library from an array of defined components. + * + * @example + * ```ts + * const library = createLibrary({ + * components: [TabItem, Tabs, Card], + * root: "Card", + * }); + * ``` + */ +export function createLibrary(input: LibraryDefinition): Library { + const componentsRecord: Record = {}; + for (const comp of input.components) { + if (!z.globalRegistry.has(comp.props)) { + comp.props.register(z.globalRegistry, { id: comp.name }); + } + componentsRecord[comp.name] = comp; + } + + if (input.root && !componentsRecord[input.root]) { + const available = Object.keys(componentsRecord).join(", "); + throw new Error( + `[createLibrary] Root component "${input.root}" was not found in components. Available components: ${available}`, + ); + } + + const library: Library = { + components: componentsRecord, + componentGroups: input.componentGroups, + root: input.root, + + prompt(options?: PromptOptions): string { + return generatePrompt(library, options); + }, + + toJSONSchema(): object { + // Build one combined z.object so z.toJSONSchema emits all component + // schemas into a shared $defs block — sub-schemas like CardHeader or + // Series are defined once and referenced via $ref everywhere else. + const combinedSchema = z.object( + Object.fromEntries( + Object.entries(componentsRecord).map(([k, v]) => [k, v.props]), + ) as any, + ); + return z.toJSONSchema(combinedSchema); + }, + }; + + return library; +} diff --git a/packages/svelte-lang/src/lib/validation.ts b/packages/svelte-lang/src/lib/validation.ts new file mode 100644 index 000000000..36b5121c8 --- /dev/null +++ b/packages/svelte-lang/src/lib/validation.ts @@ -0,0 +1,107 @@ +import { getContext, setContext } from "svelte"; +import { + builtInValidators, + parseRules, + validate, + type ParsedRule, + type ValidatorFn, +} from "@openuidev/react-lang"; + +// ─── Context Key ────────────────────────────────────────────────────────────── + +export const FORM_VALIDATION_CONTEXT_KEY = Symbol("openui-form-validation"); + +// ─── Types ──────────────────────────────────────────────────────────────────── + +export interface FormValidationContextValue { + /** + * Validate a field value against validation rules. + * Returns an error message if validation fails, or null if valid. + */ + validateField: (fieldName: string, value: any, rules?: string) => string | null; + + /** + * Get the current validation state for a field. + */ + getFieldValidation: (fieldName: string) => { + isValid: boolean; + error: string | null; + }; + + /** + * Set validation state for a field. + */ + setFieldValidation: ( + fieldName: string, + isValid: boolean, + error: string | null, + ) => void; +} + +// ─── Form Validation ────────────────────────────────────────────────────────── + +/** + * Create a form validation context value. + * This should be called by Form components to provide validation state. + */ +export function createFormValidation(): FormValidationContextValue { + // Validation state: fieldName -> { isValid, error } + let validationState = $state< + Record + >({}); + + return { + validateField(fieldName: string, value: any, rules?: string): string | null { + if (!rules) return null; + + const parsedRules = parseRules(rules); + const error = validate(value, parsedRules, builtInValidators); + + // Update validation state + validationState[fieldName] = { + isValid: error === null, + error, + }; + + return error; + }, + + getFieldValidation(fieldName: string) { + return ( + validationState[fieldName] ?? { + isValid: true, + error: null, + } + ); + }, + + setFieldValidation( + fieldName: string, + isValid: boolean, + error: string | null, + ) { + validationState[fieldName] = { isValid, error }; + }, + }; +} + +/** + * Get the form validation context. + * Must be called from within a component that has a Form ancestor. + */ +export function getFormValidation(): FormValidationContextValue | undefined { + return getContext( + FORM_VALIDATION_CONTEXT_KEY, + ); +} + +/** + * Set the form validation context. + * Should be called by Form components. + */ +export function setFormValidationContext(value: FormValidationContextValue): void { + setContext(FORM_VALIDATION_CONTEXT_KEY, value); +} + +// Re-export validation utilities for convenience +export { builtInValidators, parseRules, validate, type ParsedRule, type ValidatorFn }; diff --git a/packages/svelte-lang/svelte.config.js b/packages/svelte-lang/svelte.config.js new file mode 100644 index 000000000..34c3bcf87 --- /dev/null +++ b/packages/svelte-lang/svelte.config.js @@ -0,0 +1,10 @@ +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; + +const config = { + preprocess: vitePreprocess(), + compilerOptions: { + runes: true + } +}; + +export default config; diff --git a/packages/svelte-lang/tsconfig.json b/packages/svelte-lang/tsconfig.json new file mode 100644 index 000000000..78e2e3ac6 --- /dev/null +++ b/packages/svelte-lang/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ES2022", + "moduleResolution": "bundler", + "lib": ["ES2022", "DOM"], + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "allowJs": true, + "checkJs": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "types": ["vite/client", "vitest/globals"] + }, + "include": ["src/**/*.ts", "src/**/*.svelte"], + "exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.spec.ts"] +} diff --git a/packages/svelte-lang/vite.config.ts b/packages/svelte-lang/vite.config.ts new file mode 100644 index 000000000..e82ed043e --- /dev/null +++ b/packages/svelte-lang/vite.config.ts @@ -0,0 +1,21 @@ +import { defineConfig } from 'vite'; +import { svelte } from '@sveltejs/vite-plugin-svelte'; + +export default defineConfig({ + plugins: [ + svelte({ + compilerOptions: { + runes: true + } + }) + ], + test: { + globals: true, + environment: 'jsdom', + setupFiles: ['./src/lib/__tests__/setup.ts'], + exclude: ['**/node_modules/**', '**/dist/**', '**/.svelte-kit/**'] + }, + resolve: { + conditions: ['browser'] + } +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 19085f6f6..c87956ecc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -64,7 +64,7 @@ importers: version: 16.6.5(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.570.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.89.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) fumadocs-mdx: specifier: 14.2.8 - version: 14.2.8(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.6.5(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.570.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.89.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.89.2))(react@19.2.4)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(sass@1.89.2)) + version: 14.2.8(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.6.5(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.570.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.89.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.89.2))(react@19.2.4)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)) fumadocs-ui: specifier: 16.6.5 version: 16.6.5(@takumi-rs/image-response@0.68.17)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(fumadocs-core@16.6.5(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.570.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.89.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.89.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.1) @@ -122,7 +122,7 @@ importers: version: 19.2.3(@types/react@19.2.14) eslint-config-next: specifier: 16.1.6 - version: 16.1.6(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) + version: 16.1.6(@typescript-eslint/parser@8.56.1(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3) postcss: specifier: ^8.5.6 version: 8.5.6 @@ -185,6 +185,67 @@ importers: specifier: ^5 version: 5.9.3 + examples/svelte-chat: + dependencies: + '@openuidev/svelte-lang': + specifier: workspace:* + version: link:../../packages/svelte-lang + openai: + specifier: ^4.0.0 + version: 4.104.0(ws@8.18.2)(zod@4.3.6) + zod: + specifier: ^4.0.0 + version: 4.3.6 + devDependencies: + '@internationalized/date': + specifier: ^3.12.0 + version: 3.12.0 + '@lucide/svelte': + specifier: ^0.561.0 + version: 0.561.0(svelte@5.53.10) + '@sveltejs/adapter-auto': + specifier: ^3.0.0 + version: 3.3.1(@sveltejs/kit@2.54.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0))) + '@sveltejs/kit': + specifier: ^2.0.0 + version: 2.54.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)) + '@sveltejs/vite-plugin-svelte': + specifier: ^5.0.0 + version: 5.1.1(svelte@5.53.10)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)) + '@tailwindcss/vite': + specifier: ^4.2.1 + version: 4.2.1(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)) + bits-ui: + specifier: ^2.16.3 + version: 2.16.3(@internationalized/date@3.12.0)(@sveltejs/kit@2.54.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)))(svelte@5.53.10) + clsx: + specifier: ^2.1.1 + version: 2.1.1 + svelte: + specifier: ^5.0.0 + version: 5.53.10 + svelte-check: + specifier: ^4.0.0 + version: 4.4.5(picomatch@4.0.3)(svelte@5.53.10)(typescript@5.9.3) + tailwind-merge: + specifier: ^3.5.0 + version: 3.5.0 + tailwind-variants: + specifier: ^3.2.2 + version: 3.2.2(tailwind-merge@3.5.0)(tailwindcss@4.2.1) + tailwindcss: + specifier: ^4.2.1 + version: 4.2.1 + tw-animate-css: + specifier: ^1.4.0 + version: 1.4.0 + typescript: + specifier: ^5.0.0 + version: 5.9.3 + vite: + specifier: ^6.0.0 + version: 6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0) + packages/openui-cli: dependencies: '@inquirer/core': @@ -462,6 +523,52 @@ importers: specifier: ^5.0.0 version: 5.4.19(@types/node@22.15.32)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0) + packages/svelte-lang: + dependencies: + '@openuidev/react-lang': + specifier: workspace:* + version: link:../react-lang + zod: + specifier: ^4.0.0 + version: 4.3.6 + devDependencies: + '@sveltejs/package': + specifier: ^2.0.0 + version: 2.5.7(svelte@5.53.10)(typescript@5.9.3) + '@sveltejs/vite-plugin-svelte': + specifier: ^5.0.0 + version: 5.1.1(svelte@5.53.10)(vite@6.4.1(@types/node@20.19.35)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)) + '@testing-library/jest-dom': + specifier: ^6.9.1 + version: 6.9.1 + '@testing-library/svelte': + specifier: ^5.0.0 + version: 5.3.1(svelte@5.53.10)(vite@6.4.1(@types/node@20.19.35)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0))(vitest@2.1.9(@types/node@20.19.35)(jsdom@25.0.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)) + '@types/node': + specifier: ^20.0.0 + version: 20.19.35 + fast-check: + specifier: ^3.15.0 + version: 3.23.2 + jsdom: + specifier: ^25.0.0 + version: 25.0.1 + prettier-plugin-svelte: + specifier: ^3.0.0 + version: 3.5.1(prettier@3.5.3)(svelte@5.53.10) + svelte: + specifier: ^5.0.0 + version: 5.53.10 + svelte-check: + specifier: ^4.0.0 + version: 4.4.5(picomatch@4.0.3)(svelte@5.53.10)(typescript@5.9.3) + vite: + specifier: ^6.0.0 + version: 6.4.1(@types/node@20.19.35)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0) + vitest: + specifier: ^2.0.0 + version: 2.1.9(@types/node@20.19.35)(jsdom@25.0.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0) + packages: '@acemir/cssom@0.9.31': @@ -481,6 +588,9 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} + '@asamuzakjp/css-color@3.2.0': + resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} + '@asamuzakjp/css-color@5.0.1': resolution: {integrity: sha512-2SZFvqMyvboVV1d15lMf7XiI3m7SDqXUuKaTymJYLN6dSGadqp+fVojqJlVoMlbZnlTmu3S0TLwLTJpvBMO1Aw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -627,10 +737,21 @@ packages: peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + '@csstools/color-helpers@5.1.0': + resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} + engines: {node: '>=18'} + '@csstools/color-helpers@6.0.2': resolution: {integrity: sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==} engines: {node: '>=20.19.0'} + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + '@csstools/css-calc@3.1.1': resolution: {integrity: sha512-HJ26Z/vmsZQqs/o3a6bgKslXGFAungXGbinULZO3eMsOyNJHeBBZfup5FiZInOghgoM4Hwnmw+OgbJCNg1wwUQ==} engines: {node: '>=20.19.0'} @@ -638,6 +759,13 @@ packages: '@csstools/css-parser-algorithms': ^4.0.0 '@csstools/css-tokenizer': ^4.0.0 + '@csstools/css-color-parser@3.1.0': + resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + '@csstools/css-color-parser@4.0.2': resolution: {integrity: sha512-0GEfbBLmTFf0dJlpsNU7zwxRIH0/BGEMuXLTCvFYxuL1tNhqzTbtnFICyJLTNK4a+RechKP75e7w42ClXSnJQw==} engines: {node: '>=20.19.0'} @@ -645,6 +773,12 @@ packages: '@csstools/css-parser-algorithms': ^4.0.0 '@csstools/css-tokenizer': ^4.0.0 + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.4 + '@csstools/css-parser-algorithms@4.0.0': resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} engines: {node: '>=20.19.0'} @@ -654,6 +788,10 @@ packages: '@csstools/css-syntax-patches-for-csstree@1.1.0': resolution: {integrity: sha512-H4tuz2nhWgNKLt1inYpoVCfbJbMwX/lQKp3g69rrrIMIYlFD9+zTykOKhNR8uGrAmbS/kT9n6hTFkmDkxLgeTA==} + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} + '@csstools/css-tokenizer@4.0.0': resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} engines: {node: '>=20.19.0'} @@ -1144,18 +1282,10 @@ packages: resolution: {integrity: sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-array@0.23.2': - resolution: {integrity: sha512-YF+fE6LV4v5MGWRGj7G404/OZzGNepVF8fxk7jqmqo3lrza7a0uUcDnROGRBG1WFC1omYUS/Wp1f42i0M+3Q3A==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/config-helpers@0.2.3': resolution: {integrity: sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.5.2': - resolution: {integrity: sha512-a5MxrdDXEvqnIq+LisyCX6tQMPF/dSJpCfBgBauY+pNZ28yCtSsTvyTYrMhaI+LK26bVyCJfJkT0u8KIj2i1dQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/core@0.14.0': resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1164,10 +1294,6 @@ packages: resolution: {integrity: sha512-b7ePw78tEWWkpgZCDYkbqDOP8dmM6qe+AOC6iuJqlq1R/0ahMAeH3qynpnqKFGkMltrp44ohV4ubGyvLX28tzw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@1.1.0': - resolution: {integrity: sha512-/nr9K9wkr3P1EzFTdFdMoLuo1PmIxjmwvPozwoSodjNBdefGujXQUF93u1DDZpEaTuDvMsIQddsd35BwtrW9Xw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/eslintrc@3.3.1': resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1180,18 +1306,10 @@ packages: resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@3.0.2': - resolution: {integrity: sha512-HOy56KJt48Bx8KmJ+XGQNSUMT/6dZee/M54XyUyuvTvPXJmsERRvBchsUVx1UMe1WwIH49XLAczNC7V2INsuUw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/plugin-kit@0.3.2': resolution: {integrity: sha512-4SaFZCNfJqvk/kenHpI8xvN42DMaoycy4PzKc5otHxRswww1kAt82OlBuwRVLofCACCTZEcla2Ydxv8scMXaTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.6.0': - resolution: {integrity: sha512-bIZEUzOI1jkhviX2cp5vNyXQc6olzb2ohewQubuYlMXZ2Q/XjBO0x0XhGPvc9fjSIiUN0vw+0hq53BJ4eQSJKQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@exodus/bytes@1.15.0': resolution: {integrity: sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -1521,6 +1639,9 @@ packages: '@types/node': optional: true + '@internationalized/date@3.12.0': + resolution: {integrity: sha512-/PyIMzK29jtXaGU23qTvNZxvBXRtKbNnGDFD+PY6CZw/Y8Ex8pFUzkuCJCG9aOqmShjqhS9mPqP6Dk5onQY8rQ==} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -1567,6 +1688,11 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@lucide/svelte@0.561.0': + resolution: {integrity: sha512-vofKV2UFVrKE6I4ewKJ3dfCXSV6iP6nWVmiM83MLjsU91EeJcEg7LoWUABLp/aOTxj1HQNbJD1f3g3L0JQgH9A==} + peerDependencies: + svelte: ^5 + '@mdx-js/mdx@3.1.1': resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} @@ -1815,6 +1941,9 @@ packages: resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + '@posthog/core@1.23.2': resolution: {integrity: sha512-zTDdda9NuSHrnwSOfFMxX/pyXiycF4jtU1kTr8DL61dHhV+7LF6XF1ndRZZTuaGGbfbb/GJYkEsjEX9SXfNZeQ==} @@ -2815,6 +2944,54 @@ packages: peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + '@sveltejs/acorn-typescript@1.0.9': + resolution: {integrity: sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==} + peerDependencies: + acorn: ^8.9.0 + + '@sveltejs/adapter-auto@3.3.1': + resolution: {integrity: sha512-5Sc7WAxYdL6q9j/+D0jJKjGREGlfIevDyHSQ2eNETHcB1TKlQWHcAo8AS8H1QdjNvSXpvOwNjykDUHPEAyGgdQ==} + peerDependencies: + '@sveltejs/kit': ^2.0.0 + + '@sveltejs/kit@2.54.0': + resolution: {integrity: sha512-WDJApQ1ipZLbaC4YjqJjwYR9y7QQgTqVwEObgNZ8Mu/eVQJqn4Qzw9a+n7mr5xnBYiAYz9UdJOOl+aqVbfGXcA==} + engines: {node: '>=18.13'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.0.0 + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0 + svelte: ^4.0.0 || ^5.0.0-next.0 + typescript: ^5.3.3 + vite: ^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + typescript: + optional: true + + '@sveltejs/package@2.5.7': + resolution: {integrity: sha512-qqD9xa9H7TDiGFrF6rz7AirOR8k15qDK/9i4MIE8te4vWsv5GEogPks61rrZcLy+yWph+aI6pIj2MdoK3YI8AQ==} + engines: {node: ^16.14 || >=18} + hasBin: true + peerDependencies: + svelte: ^3.44.0 || ^4.0.0 || ^5.0.0-next.1 + + '@sveltejs/vite-plugin-svelte-inspector@4.0.1': + resolution: {integrity: sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^5.0.0 + svelte: ^5.0.0 + vite: ^6.0.0 + + '@sveltejs/vite-plugin-svelte@5.1.1': + resolution: {integrity: sha512-Y1Cs7hhTc+a5E9Va/xwKlAJoariQyHY+5zBgCZg4PFWNYQ1nMN9sjK1zhw1gK69DuqVP++sht/1GZg1aRwmAXQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} + peerDependencies: + svelte: ^5.0.0 + vite: ^6.0.0 + '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} @@ -2906,6 +3083,11 @@ packages: '@tailwindcss/postcss@4.2.1': resolution: {integrity: sha512-OEwGIBnXnj7zJeonOh6ZG9woofIjGrd2BORfvE5p9USYKDCZoQmfqLcfNiRWoJlRWLdNPn2IgVZuWAOM4iTYMw==} + '@tailwindcss/vite@4.2.1': + resolution: {integrity: sha512-TBf2sJjYeb28jD2U/OhwdW0bbOsxkWPwQ7SrqGf9sVcoYwZj7rkXljroBO9wKBut9XnmQLXanuDUeqQK0lGg/w==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 + '@takumi-rs/core-darwin-arm64@0.68.17': resolution: {integrity: sha512-toMlVnB19J+eUVDOV3mhVOqFn+fMazycMZoeQSJQR/GXtog2peRp2dKqSE8w6gi7nGUOrZzX4u4L+eX+vwnfww==} engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'} @@ -2975,6 +3157,29 @@ packages: resolution: {integrity: sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + '@testing-library/jest-dom@6.9.1': + resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + + '@testing-library/svelte-core@1.0.0': + resolution: {integrity: sha512-VkUePoLV6oOYwSUvX6ShA8KLnJqZiYMIbP2JW2t0GLWLkJxKGvuH5qrrZBV/X7cXFnLGuFQEC7RheYiZOW68KQ==} + engines: {node: '>=16'} + peerDependencies: + svelte: ^3 || ^4 || ^5 || ^5.0.0-next.0 + + '@testing-library/svelte@5.3.1': + resolution: {integrity: sha512-8Ez7ZOqW5geRf9PF5rkuopODe5RGy3I9XR+kc7zHh26gBiktLaxTfKmhlGaSHYUOTQE7wFsLMN9xCJVCszw47w==} + engines: {node: '>= 10'} + peerDependencies: + svelte: ^3 || ^4 || ^5 || ^5.0.0-next.0 + vite: '*' + vitest: '*' + peerDependenciesMeta: + vite: + optional: true + vitest: + optional: true + '@testing-library/user-event@14.5.2': resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} engines: {node: '>=12', npm: '>=6'} @@ -3002,6 +3207,9 @@ packages: '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + '@types/d3-array@3.2.1': resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} @@ -3044,9 +3252,6 @@ packages: '@types/eslint@9.6.1': resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - '@types/esrecurse@4.3.1': - resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} - '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} @@ -3089,6 +3294,9 @@ packages: '@types/node-fetch@2.6.11': resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} + '@types/node@18.19.130': + resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} + '@types/node@20.19.35': resolution: {integrity: sha512-Uarfe6J91b9HAUXxjvSOdiO2UPOKLm07Q1oh0JHxoZ1y8HoqxDAu3gVrsrOHeiio0kSsoVBt4wFrKOm0dKxVPQ==} @@ -3287,9 +3495,23 @@ packages: '@vitest/expect@2.0.5': resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} + '@vitest/expect@2.1.9': + resolution: {integrity: sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==} + '@vitest/expect@4.0.18': resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==} + '@vitest/mocker@2.1.9': + resolution: {integrity: sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + '@vitest/mocker@4.0.18': resolution: {integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==} peerDependencies: @@ -3310,15 +3532,24 @@ packages: '@vitest/pretty-format@4.0.18': resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==} + '@vitest/runner@2.1.9': + resolution: {integrity: sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==} + '@vitest/runner@4.0.18': resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==} + '@vitest/snapshot@2.1.9': + resolution: {integrity: sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==} + '@vitest/snapshot@4.0.18': resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==} '@vitest/spy@2.0.5': resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==} + '@vitest/spy@2.1.9': + resolution: {integrity: sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==} + '@vitest/spy@4.0.18': resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==} @@ -3382,6 +3613,10 @@ packages: '@xtuc/long@4.2.2': resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -3401,6 +3636,10 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} + agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} + ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -3417,9 +3656,6 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ajv@6.14.0: - resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} - ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} @@ -3463,6 +3699,10 @@ packages: aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + aria-query@5.3.1: + resolution: {integrity: sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==} + engines: {node: '>= 0.4'} + aria-query@5.3.2: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} @@ -3562,6 +3802,13 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + bits-ui@2.16.3: + resolution: {integrity: sha512-5hJ5dEhf5yPzkRFcxzgQHScGodeo0gK0MUUXrdLlRHWaBOBGZiacWLG96j/wwFatKwZvouw7q+sn14i0fx3RIg==} + engines: {node: '>=20'} + peerDependencies: + '@internationalized/date': ^3.8.1 + svelte: ^5.33.0 + brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} @@ -3587,6 +3834,10 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -3756,6 +4007,10 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + core-js@3.48.0: resolution: {integrity: sha512-zpEHTy1fjTMZCKLHUZoVeylt9XrzaIN2rbPXEt0k+q7JE5CkCZdo6bNq55bn24a69CH7ErAVLKijxJja4fw+UQ==} @@ -3775,6 +4030,10 @@ packages: engines: {node: '>=4'} hasBin: true + cssstyle@4.6.0: + resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} + engines: {node: '>=18'} + cssstyle@6.2.0: resolution: {integrity: sha512-Fm5NvhYathRnXNVndkUsCCuR63DCLVVwGOOwQw782coXFi5HhkXdu289l59HlXZBawsyNccXfWRYvLzcDCdDig==} engines: {node: '>=20'} @@ -3829,6 +4088,10 @@ packages: damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + data-urls@7.0.0: resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -3886,6 +4149,9 @@ packages: decode-named-character-reference@1.2.0: resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + dedent-js@1.0.1: + resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==} + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -3893,6 +4159,10 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -3925,6 +4195,9 @@ packages: detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + devalue@5.6.4: + resolution: {integrity: sha512-Gp6rDldRsFh/7XuouDbxMH3Mx8GMCcgzIb1pDTvNyn8pZGQ22u+Wa+lGV9dQCltFQ7uVw0MhRyb8XDskNFOReA==} + devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -4179,10 +4452,6 @@ packages: resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint-scope@9.1.1: - resolution: {integrity: sha512-GaUN0sWim5qc8KVErfPBWmc31LEsOkrUJbvJZV+xuL3u2phMUK4HIvXlWAakfC8W4nzlK+chPEAkYOYb5ZScIw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4195,16 +4464,6 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.0.2: - resolution: {integrity: sha512-uYixubwmqJZH+KLVYIVKY1JQt7tysXhtj21WSvjcSmU5SVNzMus1bgLe+pAt816yQ8opKfheVVoPLqvVMGejYw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - hasBin: true - peerDependencies: - jiti: '*' - peerDependenciesMeta: - jiti: - optional: true - eslint@9.29.0: resolution: {integrity: sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4215,14 +4474,13 @@ packages: jiti: optional: true + esm-env@1.2.2: + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + espree@10.4.0: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - espree@11.1.1: - resolution: {integrity: sha512-AVHPqQoZYc+RUM4/3Ly5udlZY/U4LS8pIG05jEjWM2lQMU/oaZ7qshzAl2YP1tfNmXfftH3ohurfwNAug+MnsQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -4232,9 +4490,8 @@ packages: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} - esquery@1.7.0: - resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} - engines: {node: '>=0.10'} + esrap@2.2.3: + resolution: {integrity: sha512-8fOS+GIGCQZl/ZIlhl59htOlms6U8NvX6ZYgYHpRU/b6tVSh3uHkOHZikl3D4cMbYM0JlpBe+p/BkZEi8J9XIQ==} esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} @@ -4279,6 +4536,10 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} @@ -4293,6 +4554,10 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + fast-check@3.23.2: + resolution: {integrity: sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==} + engines: {node: '>=8.0.0'} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -4378,6 +4643,9 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} + form-data-encoder@1.7.2: + resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} + form-data@4.0.3: resolution: {integrity: sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==} engines: {node: '>= 6'} @@ -4386,6 +4654,10 @@ packages: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} + formdata-node@4.4.1: + resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} + engines: {node: '>= 12.20'} + framer-motion@12.34.3: resolution: {integrity: sha512-v81ecyZKYO/DfpTwHivqkxSUBzvceOpoI+wLfgCgoUIKxlFKEXdg0oR9imxwXumT4SFy8vRk9xzJ5l3/Du/55Q==} peerDependencies: @@ -4681,6 +4953,10 @@ packages: highlightjs-vue@1.0.0: resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==} + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + html-encoding-sniffer@6.0.0: resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -4699,6 +4975,13 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + iconv-lite@0.7.2: resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} @@ -4723,6 +5006,9 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -4860,6 +5146,9 @@ packages: is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -4940,6 +5229,15 @@ packages: resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==} engines: {node: '>=12.0.0'} + jsdom@25.0.1: + resolution: {integrity: sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^2.11.2 + peerDependenciesMeta: + canvas: + optional: true + jsdom@28.1.0: resolution: {integrity: sha512-0+MoQNYyr2rBHqO1xilltfDjV9G7ymYGlAUazgcDLQaUf8JDHbuGwsxN6U9qWaElZ4w1B2r7yEGIL3GdeW3Rug==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -4992,6 +5290,10 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + language-subtag-registry@0.3.23: resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} @@ -5084,6 +5386,9 @@ packages: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -5395,6 +5700,14 @@ packages: react-dom: optional: true + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -5455,6 +5768,11 @@ packages: node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + node-emoji@2.2.0: resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} engines: {node: '>=18'} @@ -5463,6 +5781,15 @@ packages: resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} engines: {node: '>= 0.4'} + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} @@ -5474,6 +5801,9 @@ packages: resolution: {integrity: sha512-tt6PvKu4WyzPwWUzy/hvPFqn+uwXO0K1ZHka8az3NnrhWJDmSqI8ncWq0fkL0k/lmmi5tAC11FXwXuh0rFbt1A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + nwsapi@2.2.23: + resolution: {integrity: sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -5523,6 +5853,18 @@ packages: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} + openai@4.104.0: + resolution: {integrity: sha512-p99EFNsA/yX6UhVO93f5kJsDRLAg+CTA2RBqdHK4RtK8u5IJw32Hyb2dTGKbnnFmnuoBv5r7Z2CURI9sGZpSuA==} + hasBin: true + peerDependencies: + ws: ^8.18.0 + zod: ^3.23.8 + peerDependenciesMeta: + ws: + optional: true + zod: + optional: true + openai@6.22.0: resolution: {integrity: sha512-7Yvy17F33Bi9RutWbsaYt5hJEEJ/krRPOrwan+f9aCPuMat1WVsb2VNSII5W1EksKT6fF69TG/xj4XzodK3JZw==} hasBin: true @@ -5588,6 +5930,9 @@ packages: path-to-regexp@8.3.0: resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -5707,6 +6052,12 @@ packages: '@volar/vue-typescript': optional: true + prettier-plugin-svelte@3.5.1: + resolution: {integrity: sha512-65+fr5+cgIKWKiqM1Doum4uX6bY8iFCdztvvp2RcF+AJoieaw9kJOFMNcJo/bkmKYsxFaM9OsVZK/gWauG/5mg==} + peerDependencies: + prettier: ^3.0.0 + svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 + prettier@3.5.3: resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} engines: {node: '>=14'} @@ -5750,6 +6101,9 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + query-selector-shadow-dom@1.0.1: resolution: {integrity: sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==} @@ -6014,15 +6368,34 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rrweb-cssom@0.7.1: + resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} + + rrweb-cssom@0.8.0: + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + runed@0.35.1: + resolution: {integrity: sha512-2F4Q/FZzbeJTFdIS/PuOoPRSm92sA2LhzTnv6FXhCoENb3huf5+fDuNOg1LNvGOouy3u/225qxmuJvcV3IZK5Q==} + peerDependencies: + '@sveltejs/kit': ^2.21.0 + svelte: ^5.7.0 + peerDependenciesMeta: + '@sveltejs/kit': + optional: true + rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + safe-array-concat@1.1.3: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} @@ -6060,15 +6433,13 @@ packages: scroll-into-view-if-needed@3.1.0: resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} + scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} - engines: {node: '>=10'} - hasBin: true - semver@7.7.4: resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} engines: {node: '>=10'} @@ -6077,6 +6448,9 @@ packages: serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + set-cookie-parser@3.0.1: + resolution: {integrity: sha512-n7Z7dXZhJbwuAHhNzkTti6Aw9QDDjZtm3JTpTGATIdNzdQz5GuFs22w90BcvF4INfnrL5xrX3oGsuqO5Dx3A1Q==} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -6131,6 +6505,10 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} + engines: {node: '>=18'} + skin-tone@2.0.0: resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} engines: {node: '>=8'} @@ -6272,6 +6650,30 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + svelte-check@4.4.5: + resolution: {integrity: sha512-1bSwIRCvvmSHrlK52fOlZmVtUZgil43jNL/2H18pRpa+eQjzGt6e3zayxhp1S7GajPFKNM/2PMCG+DZFHlG9fw==} + engines: {node: '>= 18.0.0'} + hasBin: true + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.0 + typescript: '>=5.0.0' + + svelte-toolbelt@0.10.6: + resolution: {integrity: sha512-YWuX+RE+CnWYx09yseAe4ZVMM7e7GRFZM6OYWpBKOb++s+SQ8RBIMMe+Bs/CznBMc0QPLjr+vDBxTAkozXsFXQ==} + engines: {node: '>=18', pnpm: '>=8.7.0'} + peerDependencies: + svelte: ^5.30.2 + + svelte2tsx@0.7.52: + resolution: {integrity: sha512-svdT1FTrCLpvlU62evO5YdJt/kQ7nxgQxII/9BpQUvKr+GJRVdAXNVw8UWOt0fhoe5uWKyU0WsUTMRVAtRbMQg==} + peerDependencies: + svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 + typescript: ^4.9.4 || ^5.0.0 + + svelte@5.53.10: + resolution: {integrity: sha512-UcNfWzbrjvYXYSk+U2hME25kpb87oq6/WVLeBF4khyQrb3Ob/URVlN23khal+RbdCUTMfg4qWjI9KZjCNFtYMQ==} + engines: {node: '>=18'} + symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} @@ -6279,9 +6681,22 @@ packages: resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} engines: {node: ^14.18.0 || >=16.0.0} + tabbable@6.4.0: + resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} + tailwind-merge@3.5.0: resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==} + tailwind-variants@3.2.2: + resolution: {integrity: sha512-Mi4kHeMTLvKlM98XPnK+7HoBPmf4gygdFmqQPaDivc3DpYS6aIY6KiG/PgThrGvii5YZJqRsPz0aPyhoFzmZgg==} + engines: {node: '>=16.x', pnpm: '>=7.x'} + peerDependencies: + tailwind-merge: '>=3.0.0' + tailwindcss: '*' + peerDependenciesMeta: + tailwind-merge: + optional: true + tailwindcss@3.4.17: resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} engines: {node: '>=14.0.0'} @@ -6328,6 +6743,9 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyexec@1.0.2: resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} engines: {node: '>=18'} @@ -6336,6 +6754,10 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + tinyrainbow@1.2.0: resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} engines: {node: '>=14.0.0'} @@ -6348,9 +6770,16 @@ packages: resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} + tldts-core@6.1.86: + resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} + tldts-core@7.0.25: resolution: {integrity: sha512-ZjCZK0rppSBu7rjHYDYsEaMOIbbT+nWF57hKkv4IUmZWBNrBWBOjIElc0mKRgLM8bm7x/BBlof6t2gi/Oq/Asw==} + tldts@6.1.86: + resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} + hasBin: true + tldts@7.0.25: resolution: {integrity: sha512-keinCnPbwXEUG3ilrWQZU+CqcTTzHq9m2HhoUP2l7Xmi8l1LuijAXLpAJ5zRW+ifKTNscs4NdCkfkDCBYm352w==} hasBin: true @@ -6359,10 +6788,25 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + tough-cookie@5.1.2: + resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} + engines: {node: '>=16'} + tough-cookie@6.0.0: resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} engines: {node: '>=16'} + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + tr46@6.0.0: resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} engines: {node: '>=20'} @@ -6405,6 +6849,9 @@ packages: engines: {node: '>=18.0.0'} hasBin: true + tw-animate-css@1.4.0: + resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} + tween-functions@1.2.0: resolution: {integrity: sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==} @@ -6444,6 +6891,9 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} @@ -6555,6 +7005,11 @@ packages: victory-vendor@36.9.2: resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==} + vite-node@2.1.9: + resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + vite@5.4.19: resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -6586,17 +7041,57 @@ packages: terser: optional: true - vite@7.3.1: - resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} - engines: {node: ^20.19.0 || >=22.12.0} + vite@6.4.1: + resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 jiti: '>=1.21.0' - less: ^4.0.0 + less: '*' lightningcss: ^1.21.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vite@7.3.1: + resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 stylus: '>=0.54.8' sugarss: ^5.0.0 terser: ^5.16.0 @@ -6626,6 +7121,39 @@ packages: yaml: optional: true + vitefu@1.1.2: + resolution: {integrity: sha512-zpKATdUbzbsycPFBN71nS2uzBUQiVnFoOrr2rvqv34S1lcAgMKKkjWleLGeiJlZ8lwCXvtWaRn7R3ZC16SYRuw==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-beta.0 + peerDependenciesMeta: + vite: + optional: true + + vitest@2.1.9: + resolution: {integrity: sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.1.9 + '@vitest/ui': 2.1.9 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + vitest@4.0.18: resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -6671,9 +7199,20 @@ packages: web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + web-streams-polyfill@4.0.0-beta.3: + resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} + engines: {node: '>= 14'} + web-vitals@5.1.0: resolution: {integrity: sha512-ArI3kx5jI0atlTtmV0fWU3fjpLmq/nD3Zr1iFFlJLaqa5wLBkUSzINwBPySCX/8jRyjlmy1Volw1kz1g9XE4Jg==} + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + webidl-conversions@8.0.1: resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} engines: {node: '>=20'} @@ -6695,14 +7234,30 @@ packages: webpack-cli: optional: true + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + whatwg-mimetype@5.0.0: resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} engines: {node: '>=20'} + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} + whatwg-url@16.0.1: resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -6788,6 +7343,9 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + zimmerframe@1.1.4: + resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} + zod-validation-error@4.0.2: resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} engines: {node: '>=18.0.0'} @@ -6835,7 +7393,15 @@ snapshots: '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.31 + + '@asamuzakjp/css-color@3.2.0': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 10.4.3 '@asamuzakjp/css-color@5.0.1': dependencies: @@ -6919,7 +7485,7 @@ snapshots: '@babel/parser': 7.27.5 '@babel/types': 7.27.6 '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 '@babel/generator@7.29.1': @@ -7072,15 +7638,29 @@ snapshots: - '@chromatic-com/playwright' - react + '@csstools/color-helpers@5.1.0': {} + '@csstools/color-helpers@6.0.2': optional: true + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/css-calc@3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 optional: true + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/css-color-parser@4.0.2(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: '@csstools/color-helpers': 6.0.2 @@ -7089,6 +7669,10 @@ snapshots: '@csstools/css-tokenizer': 4.0.0 optional: true + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': dependencies: '@csstools/css-tokenizer': 4.0.0 @@ -7097,6 +7681,8 @@ snapshots: '@csstools/css-syntax-patches-for-csstree@1.1.0': optional: true + '@csstools/css-tokenizer@3.0.4': {} + '@csstools/css-tokenizer@4.0.0': optional: true @@ -7348,11 +7934,6 @@ snapshots: eslint: 9.29.0(jiti@2.6.1) eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.9.1(eslint@10.0.2(jiti@2.6.1))': - dependencies: - eslint: 10.0.2(jiti@2.6.1) - eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.9.1(eslint@9.29.0(jiti@2.6.1))': dependencies: eslint: 9.29.0(jiti@2.6.1) @@ -7370,20 +7951,8 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/config-array@0.23.2': - dependencies: - '@eslint/object-schema': 3.0.2 - debug: 4.4.3 - minimatch: 10.2.2 - transitivePeerDependencies: - - supports-color - '@eslint/config-helpers@0.2.3': {} - '@eslint/config-helpers@0.5.2': - dependencies: - '@eslint/core': 1.1.0 - '@eslint/core@0.14.0': dependencies: '@types/json-schema': 7.0.15 @@ -7392,10 +7961,6 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/core@1.1.0': - dependencies: - '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 @@ -7414,18 +7979,11 @@ snapshots: '@eslint/object-schema@2.1.6': {} - '@eslint/object-schema@3.0.2': {} - '@eslint/plugin-kit@0.3.2': dependencies: '@eslint/core': 0.15.0 levn: 0.4.1 - '@eslint/plugin-kit@0.6.0': - dependencies: - '@eslint/core': 1.1.0 - levn: 0.4.1 - '@exodus/bytes@1.15.0': optional: true @@ -7690,6 +8248,10 @@ snapshots: optionalDependencies: '@types/node': 22.15.32 + '@internationalized/date@3.12.0': + dependencies: + '@swc/helpers': 0.5.15 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -7747,6 +8309,10 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@lucide/svelte@0.561.0(svelte@5.53.10)': + dependencies: + svelte: 5.53.10 + '@mdx-js/mdx@3.1.1': dependencies: '@types/estree': 1.0.8 @@ -7978,6 +8544,8 @@ snapshots: '@pkgr/core@0.2.9': {} + '@polka/url@1.0.0-next.29': {} + '@posthog/core@1.23.2': dependencies: cross-spawn: 7.0.6 @@ -8944,7 +9512,7 @@ snapshots: jsdoc-type-pratt-parser: 4.1.0 process: 0.11.10 recast: 0.23.11 - semver: 7.7.2 + semver: 7.7.4 util: 0.12.5 ws: 8.18.2 optionalDependencies: @@ -9043,6 +9611,91 @@ snapshots: dependencies: storybook: 8.6.14(prettier@3.5.3) + '@sveltejs/acorn-typescript@1.0.9(acorn@8.16.0)': + dependencies: + acorn: 8.16.0 + + '@sveltejs/adapter-auto@3.3.1(@sveltejs/kit@2.54.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)))': + dependencies: + '@sveltejs/kit': 2.54.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)) + import-meta-resolve: 4.2.0 + + '@sveltejs/kit@2.54.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0))': + dependencies: + '@standard-schema/spec': 1.1.0 + '@sveltejs/acorn-typescript': 1.0.9(acorn@8.16.0) + '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.53.10)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)) + '@types/cookie': 0.6.0 + acorn: 8.16.0 + cookie: 0.6.0 + devalue: 5.6.4 + esm-env: 1.2.2 + kleur: 4.1.5 + magic-string: 0.30.21 + mrmime: 2.0.1 + set-cookie-parser: 3.0.1 + sirv: 3.0.2 + svelte: 5.53.10 + vite: 6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0) + optionalDependencies: + '@opentelemetry/api': 1.9.0 + typescript: 5.9.3 + + '@sveltejs/package@2.5.7(svelte@5.53.10)(typescript@5.9.3)': + dependencies: + chokidar: 5.0.0 + kleur: 4.1.5 + sade: 1.8.1 + semver: 7.7.4 + svelte: 5.53.10 + svelte2tsx: 0.7.52(svelte@5.53.10)(typescript@5.9.3) + transitivePeerDependencies: + - typescript + + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.1(@types/node@20.19.35)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)))(svelte@5.53.10)(vite@6.4.1(@types/node@20.19.35)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0))': + dependencies: + '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.53.10)(vite@6.4.1(@types/node@20.19.35)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)) + debug: 4.4.3 + svelte: 5.53.10 + vite: 6.4.1(@types/node@20.19.35)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)))(svelte@5.53.10)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0))': + dependencies: + '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.53.10)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)) + debug: 4.4.3 + svelte: 5.53.10 + vite: 6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.1(@types/node@20.19.35)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.1(@types/node@20.19.35)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)))(svelte@5.53.10)(vite@6.4.1(@types/node@20.19.35)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)) + debug: 4.4.3 + deepmerge: 4.3.1 + kleur: 4.1.5 + magic-string: 0.30.21 + svelte: 5.53.10 + vite: 6.4.1(@types/node@20.19.35)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0) + vitefu: 1.1.2(vite@6.4.1(@types/node@20.19.35)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)))(svelte@5.53.10)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)) + debug: 4.4.3 + deepmerge: 4.3.1 + kleur: 4.1.5 + magic-string: 0.30.21 + svelte: 5.53.10 + vite: 6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0) + vitefu: 1.1.2(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)) + transitivePeerDependencies: + - supports-color + '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 @@ -9116,6 +9769,13 @@ snapshots: postcss: 8.5.6 tailwindcss: 4.2.1 + '@tailwindcss/vite@4.2.1(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0))': + dependencies: + '@tailwindcss/node': 4.2.1 + '@tailwindcss/oxide': 4.2.1 + tailwindcss: 4.2.1 + vite: 6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0) + '@takumi-rs/core-darwin-arm64@0.68.17': optional: true @@ -9182,6 +9842,28 @@ snapshots: lodash: 4.17.21 redent: 3.0.0 + '@testing-library/jest-dom@6.9.1': + dependencies: + '@adobe/css-tools': 4.4.3 + aria-query: 5.3.2 + css.escape: 1.5.1 + dom-accessibility-api: 0.6.3 + picocolors: 1.1.1 + redent: 3.0.0 + + '@testing-library/svelte-core@1.0.0(svelte@5.53.10)': + dependencies: + svelte: 5.53.10 + + '@testing-library/svelte@5.3.1(svelte@5.53.10)(vite@6.4.1(@types/node@20.19.35)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0))(vitest@2.1.9(@types/node@20.19.35)(jsdom@25.0.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0))': + dependencies: + '@testing-library/dom': 10.4.0 + '@testing-library/svelte-core': 1.0.0(svelte@5.53.10) + svelte: 5.53.10 + optionalDependencies: + vite: 6.4.1(@types/node@20.19.35)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0) + vitest: 2.1.9(@types/node@20.19.35)(jsdom@25.0.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0) + '@testing-library/user-event@14.5.2(@testing-library/dom@10.4.0)': dependencies: '@testing-library/dom': 10.4.0 @@ -9219,6 +9901,8 @@ snapshots: '@types/deep-eql': 4.0.2 assertion-error: 2.0.1 + '@types/cookie@0.6.0': {} + '@types/d3-array@3.2.1': {} '@types/d3-color@3.1.3': {} @@ -9261,8 +9945,6 @@ snapshots: '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 - '@types/esrecurse@4.3.1': {} - '@types/estree-jsx@1.0.5': dependencies: '@types/estree': 1.0.8 @@ -9304,6 +9986,10 @@ snapshots: '@types/node': 22.15.32 form-data: 4.0.3 + '@types/node@18.19.130': + dependencies: + undici-types: 5.26.5 + '@types/node@20.19.35': dependencies: undici-types: 6.21.0 @@ -9332,8 +10018,7 @@ snapshots: '@types/resolve@1.20.6': {} - '@types/trusted-types@2.0.7': - optional: true + '@types/trusted-types@2.0.7': {} '@types/unist@2.0.11': {} @@ -9341,22 +10026,6 @@ snapshots: '@types/uuid@9.0.8': {} - '@typescript-eslint/eslint-plugin@8.56.1(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.56.1 - '@typescript-eslint/type-utils': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.56.1 - eslint: 10.0.2(jiti@2.6.1) - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.4.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/eslint-plugin@8.56.1(@typescript-eslint/parser@8.56.1(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -9373,18 +10042,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.56.1 - '@typescript-eslint/types': 8.56.1 - '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.56.1 - debug: 4.4.3 - eslint: 10.0.2(jiti@2.6.1) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/parser@8.56.1(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.56.1 @@ -9415,18 +10072,6 @@ snapshots: dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@typescript-eslint/types': 8.56.1 - '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) - debug: 4.4.3 - eslint: 10.0.2(jiti@2.6.1) - ts-api-utils: 2.4.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/type-utils@8.56.1(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.56.1 @@ -9456,17 +10101,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.2(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.56.1 - '@typescript-eslint/types': 8.56.1 - '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) - eslint: 10.0.2(jiti@2.6.1) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/utils@8.56.1(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.29.0(jiti@2.6.1)) @@ -9551,6 +10185,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 1.2.0 + '@vitest/expect@2.1.9': + dependencies: + '@vitest/spy': 2.1.9 + '@vitest/utils': 2.1.9 + chai: 5.2.0 + tinyrainbow: 1.2.0 + '@vitest/expect@4.0.18': dependencies: '@standard-schema/spec': 1.1.0 @@ -9560,13 +10201,21 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0))': + '@vitest/mocker@2.1.9(vite@5.4.19(@types/node@20.19.35)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0))': + dependencies: + '@vitest/spy': 2.1.9 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 5.4.19(@types/node@20.19.35)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0) + + '@vitest/mocker@4.0.18(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0) + vite: 6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0) '@vitest/pretty-format@2.0.5': dependencies: @@ -9580,11 +10229,22 @@ snapshots: dependencies: tinyrainbow: 3.0.3 + '@vitest/runner@2.1.9': + dependencies: + '@vitest/utils': 2.1.9 + pathe: 1.1.2 + '@vitest/runner@4.0.18': dependencies: '@vitest/utils': 4.0.18 pathe: 2.0.3 + '@vitest/snapshot@2.1.9': + dependencies: + '@vitest/pretty-format': 2.1.9 + magic-string: 0.30.21 + pathe: 1.1.2 + '@vitest/snapshot@4.0.18': dependencies: '@vitest/pretty-format': 4.0.18 @@ -9595,6 +10255,10 @@ snapshots: dependencies: tinyspy: 3.0.2 + '@vitest/spy@2.1.9': + dependencies: + tinyspy: 3.0.2 + '@vitest/spy@4.0.18': {} '@vitest/utils@2.0.5': @@ -9695,9 +10359,9 @@ snapshots: '@xtuc/long@4.2.2': {} - acorn-jsx@5.3.2(acorn@8.15.0): + abort-controller@3.0.0: dependencies: - acorn: 8.15.0 + event-target-shim: 5.0.1 acorn-jsx@5.3.2(acorn@8.16.0): dependencies: @@ -9707,8 +10371,11 @@ snapshots: acorn@8.16.0: {} - agent-base@7.1.4: - optional: true + agent-base@7.1.4: {} + + agentkeepalive@4.6.0: + dependencies: + humanize-ms: 1.2.1 ajv-formats@2.1.1(ajv@8.17.1): optionalDependencies: @@ -9726,13 +10393,6 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@6.14.0: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 @@ -9771,6 +10431,8 @@ snapshots: dependencies: dequal: 2.0.3 + aria-query@5.3.1: {} + aria-query@5.3.2: {} array-buffer-byte-length@1.0.2: @@ -9886,6 +10548,19 @@ snapshots: binary-extensions@2.3.0: {} + bits-ui@2.16.3(@internationalized/date@3.12.0)(@sveltejs/kit@2.54.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)))(svelte@5.53.10): + dependencies: + '@floating-ui/core': 1.7.1 + '@floating-ui/dom': 1.7.1 + '@internationalized/date': 3.12.0 + esm-env: 1.2.2 + runed: 0.35.1(@sveltejs/kit@2.54.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)))(svelte@5.53.10) + svelte: 5.53.10 + svelte-toolbelt: 0.10.6(@sveltejs/kit@2.54.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)))(svelte@5.53.10) + tabbable: 6.4.0 + transitivePeerDependencies: + - '@sveltejs/kit' + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 @@ -9914,6 +10589,8 @@ snapshots: buffer-from@1.1.2: {} + cac@6.7.14: {} + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -10059,6 +10736,8 @@ snapshots: convert-source-map@2.0.0: {} + cookie@0.6.0: {} + core-js@3.48.0: {} cross-spawn@7.0.6: @@ -10077,6 +10756,11 @@ snapshots: cssesc@3.0.0: {} + cssstyle@4.6.0: + dependencies: + '@asamuzakjp/css-color': 3.2.0 + rrweb-cssom: 0.8.0 + cssstyle@6.2.0: dependencies: '@asamuzakjp/css-color': 5.0.1 @@ -10127,6 +10811,11 @@ snapshots: damerau-levenshtein@1.0.8: {} + data-urls@5.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + data-urls@7.0.0: dependencies: whatwg-mimetype: 5.0.0 @@ -10171,17 +10860,20 @@ snapshots: decimal.js-light@2.5.1: {} - decimal.js@10.6.0: - optional: true + decimal.js@10.6.0: {} decode-named-character-reference@1.2.0: dependencies: character-entities: 2.0.2 + dedent-js@1.0.1: {} + deep-eql@5.0.2: {} deep-is@0.1.4: {} + deepmerge@4.3.1: {} + define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 @@ -10207,6 +10899,8 @@ snapshots: detect-node-es@1.1.0: {} + devalue@5.6.4: {} + devlop@1.1.0: dependencies: dequal: 2.0.3 @@ -10475,26 +11169,6 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-config-next@16.1.6(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3): - dependencies: - '@next/eslint-plugin-next': 16.1.6 - eslint: 10.0.2(jiti@2.6.1) - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@10.0.2(jiti@2.6.1)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@10.0.2(jiti@2.6.1)) - eslint-plugin-jsx-a11y: 6.10.2(eslint@10.0.2(jiti@2.6.1)) - eslint-plugin-react: 7.37.5(eslint@10.0.2(jiti@2.6.1)) - eslint-plugin-react-hooks: 7.0.1(eslint@10.0.2(jiti@2.6.1)) - globals: 16.4.0 - typescript-eslint: 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-webpack - - eslint-plugin-import-x - - supports-color - eslint-config-next@16.1.6(@typescript-eslint/parser@8.56.1(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3): dependencies: '@next/eslint-plugin-next': 16.1.6 @@ -10527,21 +11201,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@10.0.2(jiti@2.6.1)): - dependencies: - '@nolyfill/is-core-module': 1.0.39 - debug: 4.4.3 - eslint: 10.0.2(jiti@2.6.1) - get-tsconfig: 4.10.1 - is-bun-module: 2.0.0 - stable-hash: 0.0.5 - tinyglobby: 0.2.15 - unrs-resolver: 1.11.1 - optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@10.0.2(jiti@2.6.1)) - transitivePeerDependencies: - - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.29.0(jiti@2.6.1)): dependencies: '@nolyfill/is-core-module': 1.0.39 @@ -10557,18 +11216,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@10.0.2(jiti@2.6.1)))(eslint@10.0.2(jiti@2.6.1)): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) - eslint: 10.0.2(jiti@2.6.1) - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@10.0.2(jiti@2.6.1)) - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.56.1(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.29.0(jiti@2.6.1)))(eslint@9.29.0(jiti@2.6.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.56.1(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.29.0(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: @@ -10579,35 +11227,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@10.0.2(jiti@2.6.1)): - dependencies: - '@rtsao/scc': 1.1.0 - array-includes: 3.1.9 - array.prototype.findlastindex: 1.2.6 - array.prototype.flat: 1.3.3 - array.prototype.flatmap: 1.3.3 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 10.0.2(jiti@2.6.1) - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@10.0.2(jiti@2.6.1)))(eslint@10.0.2(jiti@2.6.1)) - hasown: 2.0.2 - is-core-module: 2.16.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.1 - semver: 6.3.1 - string.prototype.trimend: 1.0.9 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.1(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.29.0(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 @@ -10619,7 +11238,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.29.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.56.1(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.29.0(jiti@2.6.1)))(eslint@9.29.0(jiti@2.6.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.56.1(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.29.0(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -10637,25 +11256,6 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@10.0.2(jiti@2.6.1)): - dependencies: - aria-query: 5.3.2 - array-includes: 3.1.9 - array.prototype.flatmap: 1.3.3 - ast-types-flow: 0.0.8 - axe-core: 4.11.1 - axobject-query: 4.1.0 - damerau-levenshtein: 1.0.8 - emoji-regex: 9.2.2 - eslint: 10.0.2(jiti@2.6.1) - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - language-tags: 1.0.9 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - safe-regex-test: 1.1.0 - string.prototype.includes: 2.0.1 - eslint-plugin-jsx-a11y@6.10.2(eslint@9.29.0(jiti@2.6.1)): dependencies: aria-query: 5.3.2 @@ -10685,17 +11285,6 @@ snapshots: '@types/eslint': 9.6.1 eslint-config-prettier: 10.1.8(eslint@9.29.0(jiti@2.6.1)) - eslint-plugin-react-hooks@7.0.1(eslint@10.0.2(jiti@2.6.1)): - dependencies: - '@babel/core': 7.29.0 - '@babel/parser': 7.29.0 - eslint: 10.0.2(jiti@2.6.1) - hermes-parser: 0.25.1 - zod: 4.3.6 - zod-validation-error: 4.0.2(zod@4.3.6) - transitivePeerDependencies: - - supports-color - eslint-plugin-react-hooks@7.0.1(eslint@9.29.0(jiti@2.6.1)): dependencies: '@babel/core': 7.29.0 @@ -10711,28 +11300,6 @@ snapshots: dependencies: eslint: 9.29.0(jiti@2.6.1) - eslint-plugin-react@7.37.5(eslint@10.0.2(jiti@2.6.1)): - dependencies: - array-includes: 3.1.9 - array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.3 - array.prototype.tosorted: 1.1.4 - doctrine: 2.1.0 - es-iterator-helpers: 1.2.2 - eslint: 10.0.2(jiti@2.6.1) - estraverse: 5.3.0 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.2 - object.entries: 1.1.9 - object.fromentries: 2.0.8 - object.values: 1.2.1 - prop-types: 15.8.1 - resolve: 2.0.0-next.6 - semver: 6.3.1 - string.prototype.matchall: 4.0.12 - string.prototype.repeat: 1.0.0 - eslint-plugin-react@7.37.5(eslint@9.29.0(jiti@2.6.1)): dependencies: array-includes: 3.1.9 @@ -10766,69 +11333,25 @@ snapshots: eslint-plugin-unused-imports@4.4.1(@typescript-eslint/eslint-plugin@8.56.1(@typescript-eslint/parser@8.56.1(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.29.0(jiti@2.6.1)): dependencies: - eslint: 9.29.0(jiti@2.6.1) - optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.56.1(@typescript-eslint/parser@8.56.1(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3) - - eslint-scope@5.1.1: - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - - eslint-scope@8.4.0: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-scope@9.1.1: - dependencies: - '@types/esrecurse': 4.3.1 - '@types/estree': 1.0.8 - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-visitor-keys@3.4.3: {} - - eslint-visitor-keys@4.2.1: {} - - eslint-visitor-keys@5.0.1: {} - - eslint@10.0.2(jiti@2.6.1): - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.2(jiti@2.6.1)) - '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.23.2 - '@eslint/config-helpers': 0.5.2 - '@eslint/core': 1.1.0 - '@eslint/plugin-kit': 0.6.0 - '@humanfs/node': 0.16.6 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 - ajv: 6.14.0 - cross-spawn: 7.0.6 - debug: 4.4.3 - escape-string-regexp: 4.0.0 - eslint-scope: 9.1.1 - eslint-visitor-keys: 5.0.1 - espree: 11.1.1 - esquery: 1.7.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 - find-up: 5.0.0 - glob-parent: 6.0.2 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - json-stable-stringify-without-jsonify: 1.0.1 - minimatch: 10.2.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - optionalDependencies: - jiti: 2.6.1 - transitivePeerDependencies: - - supports-color + eslint: 9.29.0(jiti@2.6.1) + optionalDependencies: + '@typescript-eslint/eslint-plugin': 8.56.1(@typescript-eslint/parser@8.56.1(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3) + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint-visitor-keys@5.0.1: {} eslint@9.29.0(jiti@2.6.1): dependencies: @@ -10872,17 +11395,13 @@ snapshots: transitivePeerDependencies: - supports-color - espree@10.4.0: - dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) - eslint-visitor-keys: 4.2.1 + esm-env@1.2.2: {} - espree@11.1.1: + espree@10.4.0: dependencies: acorn: 8.16.0 acorn-jsx: 5.3.2(acorn@8.16.0) - eslint-visitor-keys: 5.0.1 + eslint-visitor-keys: 4.2.1 esprima@4.0.1: {} @@ -10890,9 +11409,9 @@ snapshots: dependencies: estraverse: 5.3.0 - esquery@1.7.0: + esrap@2.2.3: dependencies: - estraverse: 5.3.0 + '@jridgewell/sourcemap-codec': 1.5.5 esrecurse@4.3.0: dependencies: @@ -10943,6 +11462,8 @@ snapshots: esutils@2.0.3: {} + event-target-shim@5.0.1: {} + eventemitter3@4.0.7: {} events@3.3.0: {} @@ -10951,6 +11472,10 @@ snapshots: extend@3.0.2: {} + fast-check@3.23.2: + dependencies: + pure-rand: 6.1.0 + fast-deep-equal@3.1.3: {} fast-diff@1.3.0: {} @@ -11034,6 +11559,8 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 + form-data-encoder@1.7.2: {} + form-data@4.0.3: dependencies: asynckit: 0.4.0 @@ -11044,6 +11571,11 @@ snapshots: format@0.2.2: {} + formdata-node@4.4.1: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 4.0.0-beta.3 + framer-motion@12.34.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: motion-dom: 12.34.3 @@ -11095,7 +11627,7 @@ snapshots: transitivePeerDependencies: - supports-color - fumadocs-mdx@14.2.8(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.6.5(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.570.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.89.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.89.2))(react@19.2.4)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(sass@1.89.2)): + fumadocs-mdx@14.2.8(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.6.5(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.570.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.89.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.89.2))(react@19.2.4)(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)): dependencies: '@mdx-js/mdx': 3.1.1 '@standard-schema/spec': 1.1.0 @@ -11432,6 +11964,10 @@ snapshots: highlightjs-vue@1.0.0: {} + html-encoding-sniffer@4.0.0: + dependencies: + whatwg-encoding: 3.1.1 + html-encoding-sniffer@6.0.0: dependencies: '@exodus/bytes': 1.15.0 @@ -11449,7 +11985,6 @@ snapshots: debug: 4.4.3 transitivePeerDependencies: - supports-color - optional: true https-proxy-agent@7.0.6: dependencies: @@ -11457,7 +11992,14 @@ snapshots: debug: 4.4.3 transitivePeerDependencies: - supports-color - optional: true + + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 iconv-lite@0.7.2: dependencies: @@ -11476,6 +12018,8 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-meta-resolve@4.2.0: {} + imurmurhash@0.1.4: {} indent-string@4.0.0: {} @@ -11601,8 +12145,11 @@ snapshots: is-plain-obj@4.1.0: {} - is-potential-custom-element-name@1.0.1: - optional: true + is-potential-custom-element-name@1.0.1: {} + + is-reference@3.0.3: + dependencies: + '@types/estree': 1.0.8 is-regex@1.2.1: dependencies: @@ -11688,6 +12235,34 @@ snapshots: jsdoc-type-pratt-parser@4.1.0: {} + jsdom@25.0.1: + dependencies: + cssstyle: 4.6.0 + data-urls: 5.0.0 + decimal.js: 10.6.0 + form-data: 4.0.3 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.23 + parse5: 7.3.0 + rrweb-cssom: 0.7.1 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 5.1.2 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + ws: 8.18.2 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + jsdom@28.1.0: dependencies: '@acemir/cssom': 0.9.31 @@ -11755,6 +12330,8 @@ snapshots: dependencies: json-buffer: 3.0.1 + kleur@4.1.5: {} + language-subtag-registry@0.3.23: {} language-tags@1.0.9: @@ -11821,6 +12398,8 @@ snapshots: loader-runner@4.3.0: {} + locate-character@3.0.0: {} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -12397,6 +12976,10 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) + mri@1.2.0: {} + + mrmime@2.0.1: {} + ms@2.1.3: {} mute-stream@3.0.0: {} @@ -12479,6 +13062,8 @@ snapshots: node-addon-api@7.1.1: optional: true + node-domexception@1.0.0: {} + node-emoji@2.2.0: dependencies: '@sindresorhus/is': 4.6.0 @@ -12493,12 +13078,18 @@ snapshots: object.entries: 1.1.9 semver: 6.3.1 + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + node-releases@2.0.19: {} normalize-path@3.0.0: {} npm-to-yarn@3.0.1: {} + nwsapi@2.2.23: {} + object-assign@4.1.1: {} object-hash@3.0.0: {} @@ -12559,6 +13150,21 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 + openai@4.104.0(ws@8.18.2)(zod@4.3.6): + dependencies: + '@types/node': 18.19.130 + '@types/node-fetch': 2.6.11 + abort-controller: 3.0.0 + agentkeepalive: 4.6.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + optionalDependencies: + ws: 8.18.2 + zod: 4.3.6 + transitivePeerDependencies: + - encoding + openai@6.22.0(ws@8.18.2)(zod@4.3.6): optionalDependencies: ws: 8.18.2 @@ -12634,6 +13240,8 @@ snapshots: path-to-regexp@8.3.0: {} + pathe@1.1.2: {} + pathe@2.0.3: {} pathval@2.0.0: {} @@ -12737,6 +13345,11 @@ snapshots: prettier: 3.5.3 typescript: 5.9.3 + prettier-plugin-svelte@3.5.1(prettier@3.5.3)(svelte@5.53.10): + dependencies: + prettier: 3.5.3 + svelte: 5.53.10 + prettier@3.5.3: {} pretty-format@27.5.1: @@ -12786,6 +13399,8 @@ snapshots: punycode@2.3.1: {} + pure-rand@6.1.0: {} + query-selector-shadow-dom@1.0.1: {} queue-microtask@1.2.3: {} @@ -13188,10 +13803,23 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.43.0 fsevents: 2.3.3 + rrweb-cssom@0.7.1: {} + + rrweb-cssom@0.8.0: {} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 + runed@0.35.1(@sveltejs/kit@2.54.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)))(svelte@5.53.10): + dependencies: + dequal: 2.0.3 + esm-env: 1.2.2 + lz-string: 1.5.0 + svelte: 5.53.10 + optionalDependencies: + '@sveltejs/kit': 2.54.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)) + rxjs@7.8.1: dependencies: tslib: 2.8.1 @@ -13200,6 +13828,10 @@ snapshots: dependencies: tslib: 2.8.1 + sade@1.8.1: + dependencies: + mri: 1.2.0 + safe-array-concat@1.1.3: dependencies: call-bind: 1.0.8 @@ -13234,7 +13866,6 @@ snapshots: saxes@6.0.0: dependencies: xmlchars: 2.2.0 - optional: true scheduler@0.27.0: {} @@ -13249,9 +13880,9 @@ snapshots: dependencies: compute-scroll-into-view: 3.1.1 - semver@6.3.1: {} + scule@1.3.0: {} - semver@7.7.2: {} + semver@6.3.1: {} semver@7.7.4: {} @@ -13259,6 +13890,8 @@ snapshots: dependencies: randombytes: 2.1.0 + set-cookie-parser@3.0.1: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -13364,6 +13997,12 @@ snapshots: signal-exit@4.1.0: {} + sirv@3.0.2: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + skin-tone@2.0.0: dependencies: unicode-emoji-modifier-base: 1.0.0 @@ -13533,15 +14172,69 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - symbol-tree@3.2.4: - optional: true + svelte-check@4.4.5(picomatch@4.0.3)(svelte@5.53.10)(typescript@5.9.3): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + chokidar: 4.0.3 + fdir: 6.5.0(picomatch@4.0.3) + picocolors: 1.1.1 + sade: 1.8.1 + svelte: 5.53.10 + typescript: 5.9.3 + transitivePeerDependencies: + - picomatch + + svelte-toolbelt@0.10.6(@sveltejs/kit@2.54.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)))(svelte@5.53.10): + dependencies: + clsx: 2.1.1 + runed: 0.35.1(@sveltejs/kit@2.54.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)))(svelte@5.53.10) + style-to-object: 1.0.9 + svelte: 5.53.10 + transitivePeerDependencies: + - '@sveltejs/kit' + + svelte2tsx@0.7.52(svelte@5.53.10)(typescript@5.9.3): + dependencies: + dedent-js: 1.0.1 + scule: 1.3.0 + svelte: 5.53.10 + typescript: 5.9.3 + + svelte@5.53.10: + dependencies: + '@jridgewell/remapping': 2.3.5 + '@jridgewell/sourcemap-codec': 1.5.5 + '@sveltejs/acorn-typescript': 1.0.9(acorn@8.16.0) + '@types/estree': 1.0.8 + '@types/trusted-types': 2.0.7 + acorn: 8.16.0 + aria-query: 5.3.1 + axobject-query: 4.1.0 + clsx: 2.1.1 + devalue: 5.6.4 + esm-env: 1.2.2 + esrap: 2.2.3 + is-reference: 3.0.3 + locate-character: 3.0.0 + magic-string: 0.30.21 + zimmerframe: 1.1.4 + + symbol-tree@3.2.4: {} synckit@0.11.12: dependencies: '@pkgr/core': 0.2.9 + tabbable@6.4.0: {} + tailwind-merge@3.5.0: {} + tailwind-variants@3.2.2(tailwind-merge@3.5.0)(tailwindcss@4.2.1): + dependencies: + tailwindcss: 4.2.1 + optionalDependencies: + tailwind-merge: 3.5.0 + tailwindcss@3.4.17: dependencies: '@alloc/quick-lru': 5.2.0 @@ -13603,6 +14296,8 @@ snapshots: tinybench@2.9.0: {} + tinyexec@0.3.2: {} + tinyexec@1.0.2: {} tinyglobby@0.2.15: @@ -13610,15 +14305,23 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + tinypool@1.1.1: {} + tinyrainbow@1.2.0: {} tinyrainbow@3.0.3: {} tinyspy@3.0.2: {} + tldts-core@6.1.86: {} + tldts-core@7.0.25: optional: true + tldts@6.1.86: + dependencies: + tldts-core: 6.1.86 + tldts@7.0.25: dependencies: tldts-core: 7.0.25 @@ -13628,11 +14331,23 @@ snapshots: dependencies: is-number: 7.0.0 + totalist@3.0.1: {} + + tough-cookie@5.1.2: + dependencies: + tldts: 6.1.86 + tough-cookie@6.0.0: dependencies: tldts: 7.0.25 optional: true + tr46@0.0.3: {} + + tr46@5.1.1: + dependencies: + punycode: 2.3.1 + tr46@6.0.0: dependencies: punycode: 2.3.1 @@ -13674,6 +14389,8 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + tw-animate-css@1.4.0: {} + tween-functions@1.2.0: {} type-check@0.4.0: @@ -13713,17 +14430,6 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3): - dependencies: - '@typescript-eslint/eslint-plugin': 8.56.1(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) - eslint: 10.0.2(jiti@2.6.1) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - typescript-eslint@8.56.1(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3): dependencies: '@typescript-eslint/eslint-plugin': 8.56.1(@typescript-eslint/parser@8.56.1(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3) @@ -13744,6 +14450,8 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 + undici-types@5.26.5: {} + undici-types@6.21.0: {} undici-types@7.18.2: {} @@ -13910,6 +14618,36 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 + vite-node@2.1.9(@types/node@20.19.35)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0): + dependencies: + cac: 6.7.14 + debug: 4.4.3 + es-module-lexer: 1.7.0 + pathe: 1.1.2 + vite: 5.4.19(@types/node@20.19.35)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite@5.4.19(@types/node@20.19.35)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.6 + rollup: 4.43.0 + optionalDependencies: + '@types/node': 20.19.35 + fsevents: 2.3.3 + lightningcss: 1.31.1 + sass: 1.89.2 + terser: 5.43.0 + vite@5.4.19(@types/node@22.15.32)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0): dependencies: esbuild: 0.21.5 @@ -13922,6 +14660,42 @@ snapshots: sass: 1.89.2 terser: 5.43.0 + vite@6.4.1(@types/node@20.19.35)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0): + dependencies: + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.43.0 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 20.19.35 + fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.31.1 + sass: 1.89.2 + terser: 5.43.0 + tsx: 4.20.3 + yaml: 2.8.0 + + vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0): + dependencies: + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.43.0 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 25.3.2 + fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.31.1 + sass: 1.89.2 + terser: 5.43.0 + tsx: 4.20.3 + yaml: 2.8.0 + vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0): dependencies: esbuild: 0.27.3 @@ -13939,11 +14713,56 @@ snapshots: terser: 5.43.0 tsx: 4.20.3 yaml: 2.8.0 + optional: true + + vitefu@1.1.2(vite@6.4.1(@types/node@20.19.35)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)): + optionalDependencies: + vite: 6.4.1(@types/node@20.19.35)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0) + + vitefu@1.1.2(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)): + optionalDependencies: + vite: 6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0) + + vitest@2.1.9(@types/node@20.19.35)(jsdom@25.0.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0): + dependencies: + '@vitest/expect': 2.1.9 + '@vitest/mocker': 2.1.9(vite@5.4.19(@types/node@20.19.35)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)) + '@vitest/pretty-format': 2.1.9 + '@vitest/runner': 2.1.9 + '@vitest/snapshot': 2.1.9 + '@vitest/spy': 2.1.9 + '@vitest/utils': 2.1.9 + chai: 5.2.0 + debug: 4.4.3 + expect-type: 1.3.0 + magic-string: 0.30.21 + pathe: 1.1.2 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinypool: 1.1.1 + tinyrainbow: 1.2.0 + vite: 5.4.19(@types/node@20.19.35)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0) + vite-node: 2.1.9(@types/node@20.19.35)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 20.19.35 + jsdom: 25.0.1 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.2)(jiti@2.6.1)(jsdom@28.1.0)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0): dependencies: '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)) + '@vitest/mocker': 4.0.18(vite@6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0)) '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.18 '@vitest/snapshot': 4.0.18 @@ -13960,7 +14779,7 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.3.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0) + vite: 6.4.1(@types/node@25.3.2)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.89.2)(terser@5.43.0)(tsx@4.20.3)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 @@ -13982,7 +14801,6 @@ snapshots: w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0 - optional: true watchpack@2.4.4: dependencies: @@ -13991,8 +14809,14 @@ snapshots: web-namespaces@2.0.1: {} + web-streams-polyfill@4.0.0-beta.3: {} + web-vitals@5.1.0: {} + webidl-conversions@3.0.1: {} + + webidl-conversions@7.0.0: {} + webidl-conversions@8.0.1: optional: true @@ -14031,9 +14855,20 @@ snapshots: - esbuild - uglify-js + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + whatwg-mimetype@5.0.0: optional: true + whatwg-url@14.2.0: + dependencies: + tr46: 5.1.1 + webidl-conversions: 7.0.0 + whatwg-url@16.0.1: dependencies: '@exodus/bytes': 1.15.0 @@ -14043,6 +14878,11 @@ snapshots: - '@noble/hashes' optional: true + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -14109,11 +14949,9 @@ snapshots: ws@8.18.2: {} - xml-name-validator@5.0.0: - optional: true + xml-name-validator@5.0.0: {} - xmlchars@2.2.0: - optional: true + xmlchars@2.2.0: {} xtend@4.0.2: {} @@ -14137,6 +14975,8 @@ snapshots: yocto-queue@0.1.0: {} + zimmerframe@1.1.4: {} + zod-validation-error@4.0.2(zod@4.3.6): dependencies: zod: 4.3.6