,
+) => void;
+
+// =============================================================================
+// Component Types
+// =============================================================================
+
+/**
+ * Handle returned by the `on()` function for a specific event.
+ * Provides metadata about the event binding and a method to fire it.
+ */
+export interface EventHandle {
+ /** Fire the event (resolve action bindings) */
+ emit: () => void;
+ /** Whether any binding requested preventDefault */
+ shouldPreventDefault: boolean;
+ /** Whether any handler is bound to this event */
+ bound: boolean;
+}
+
+/**
+ * Catalog-agnostic base type for component render function arguments.
+ * Use this when building reusable component libraries.
+ */
+export interface BaseComponentProps> {
+ props: P;
+ children?: Snippet;
+ /** Simple event emitter (shorthand). Fires the event and returns void. */
+ emit: (event: string) => void;
+ /** Get an event handle with metadata. Use when you need shouldPreventDefault or bound checks. */
+ on: (event: string) => EventHandle;
+ /**
+ * Two-way binding paths resolved from `$bindState` / `$bindItem` expressions.
+ * Maps prop name → absolute state path for write-back.
+ */
+ bindings?: Record;
+ loading?: boolean;
+}
+
+/**
+ * Context passed to component render functions
+ */
+export interface ComponentContext<
+ C extends Catalog,
+ K extends keyof InferCatalogComponents,
+> extends BaseComponentProps> {}
+
+/**
+ * Component render function type for Svelte
+ */
+export type ComponentFn<
+ C extends Catalog,
+ K extends keyof InferCatalogComponents,
+> = (ctx: ComponentContext) => void;
+
+/**
+ * Registry of all component render functions for a catalog
+ */
+export type Components = {
+ [K in keyof InferCatalogComponents]: ComponentFn;
+};
+
+// =============================================================================
+// Action Types
+// =============================================================================
+
+/**
+ * Action handler function type
+ */
+export type ActionFn<
+ C extends Catalog,
+ K extends keyof InferCatalogActions,
+> = (
+ params: InferActionParams | undefined,
+ setState: SetState,
+ state: StateModel,
+) => Promise;
+
+/**
+ * Registry of all action handlers for a catalog
+ */
+export type Actions = {
+ [K in keyof InferCatalogActions]: ActionFn;
+};
diff --git a/packages/svelte/src/contexts/ActionProvider.svelte b/packages/svelte/src/contexts/ActionProvider.svelte
new file mode 100644
index 00000000..48a4c1cd
--- /dev/null
+++ b/packages/svelte/src/contexts/ActionProvider.svelte
@@ -0,0 +1,344 @@
+
+
+
+
+{@render children?.()}
diff --git a/packages/svelte/src/contexts/FunctionsContextProvider.svelte b/packages/svelte/src/contexts/FunctionsContextProvider.svelte
new file mode 100644
index 00000000..8ab0aeb9
--- /dev/null
+++ b/packages/svelte/src/contexts/FunctionsContextProvider.svelte
@@ -0,0 +1,44 @@
+
+
+
+
+{@render children?.()}
diff --git a/packages/svelte/src/contexts/RepeatScopeProvider.svelte b/packages/svelte/src/contexts/RepeatScopeProvider.svelte
new file mode 100644
index 00000000..da156c72
--- /dev/null
+++ b/packages/svelte/src/contexts/RepeatScopeProvider.svelte
@@ -0,0 +1,49 @@
+
+
+
+
+{@render children()}
diff --git a/packages/svelte/src/contexts/StateProvider.svelte b/packages/svelte/src/contexts/StateProvider.svelte
new file mode 100644
index 00000000..2bc83293
--- /dev/null
+++ b/packages/svelte/src/contexts/StateProvider.svelte
@@ -0,0 +1,182 @@
+
+
+
+
+{@render children?.()}
diff --git a/packages/svelte/src/contexts/ValidationProvider.svelte b/packages/svelte/src/contexts/ValidationProvider.svelte
new file mode 100644
index 00000000..7fc9b1ca
--- /dev/null
+++ b/packages/svelte/src/contexts/ValidationProvider.svelte
@@ -0,0 +1,198 @@
+
+
+
+
+{@render children?.()}
diff --git a/packages/svelte/src/contexts/VisibilityProvider.svelte b/packages/svelte/src/contexts/VisibilityProvider.svelte
new file mode 100644
index 00000000..c7650e44
--- /dev/null
+++ b/packages/svelte/src/contexts/VisibilityProvider.svelte
@@ -0,0 +1,82 @@
+
+
+
+
+{@render children?.()}
diff --git a/packages/svelte/src/contexts/actions.test.ts b/packages/svelte/src/contexts/actions.test.ts
new file mode 100644
index 00000000..d6673be8
--- /dev/null
+++ b/packages/svelte/src/contexts/actions.test.ts
@@ -0,0 +1,278 @@
+import { describe, it, expect, vi } from "vitest";
+import { mount, unmount } from "svelte";
+import StateProvider, { getStateContext } from "./StateProvider.svelte";
+import ActionProvider, { getActionContext } from "./ActionProvider.svelte";
+import ValidationProvider, {
+ getValidationContext,
+} from "./ValidationProvider.svelte";
+
+function component(
+ runTest: () => Promise,
+ options: {
+ initialState?: Record;
+ handlers?: Record<
+ string,
+ (params: Record) => Promise | unknown
+ >;
+ withValidation?: boolean;
+ } = {},
+) {
+ return async () => {
+ let promise: Promise;
+ const c = mount(
+ ((_anchor: any) => {
+ (StateProvider as any)(_anchor, {
+ initialState: options.initialState ?? {},
+ children: ((_inner: any) => {
+ if (options.withValidation) {
+ (ValidationProvider as any)(_inner, {
+ children: ((__inner: any) => {
+ (ActionProvider as any)(__inner, {
+ handlers: options.handlers ?? {},
+ children: (() => {
+ promise = runTest();
+ }) as any,
+ });
+ }) as any,
+ });
+ return;
+ }
+
+ (ActionProvider as any)(_inner, {
+ handlers: options.handlers ?? {},
+ children: (() => {
+ promise = runTest();
+ }) as any,
+ });
+ }) as any,
+ });
+ }) as any,
+ { target: document.body },
+ );
+ await promise!; // eslint-disable-line @typescript-eslint/no-non-null-assertion
+ unmount(c);
+ };
+}
+
+describe("createActionContext", () => {
+ it(
+ "executes built-in setState action",
+ component(
+ async () => {
+ const stateCtx = getStateContext();
+ const actionCtx = getActionContext();
+
+ await actionCtx.execute({
+ action: "setState",
+ params: { statePath: "/count", value: 5 },
+ });
+
+ expect(stateCtx.state.count).toBe(5);
+ },
+ { initialState: { count: 0 } },
+ ),
+ );
+
+ it(
+ "executes built-in pushState action",
+ component(
+ async () => {
+ const stateCtx = getStateContext();
+ const actionCtx = getActionContext();
+
+ await actionCtx.execute({
+ action: "pushState",
+ params: { statePath: "/items", value: "c" },
+ });
+
+ expect(stateCtx.state.items).toEqual(["a", "b", "c"]);
+ },
+ { initialState: { items: ["a", "b"] } },
+ ),
+ );
+
+ it(
+ "pushState creates array if missing",
+ component(async () => {
+ const stateCtx = getStateContext();
+ const actionCtx = getActionContext();
+
+ await actionCtx.execute({
+ action: "pushState",
+ params: { statePath: "/newList", value: "first" },
+ });
+
+ expect(stateCtx.get("/newList")).toEqual(["first"]);
+ }),
+ );
+
+ it(
+ "executes built-in removeState action",
+ component(
+ async () => {
+ const stateCtx = getStateContext();
+ const actionCtx = getActionContext();
+
+ await actionCtx.execute({
+ action: "removeState",
+ params: { statePath: "/items", index: 1 },
+ });
+
+ expect(stateCtx.state.items).toEqual(["a", "c"]);
+ },
+ { initialState: { items: ["a", "b", "c"] } },
+ ),
+ );
+
+ it(
+ "executes push navigation action",
+ component(
+ async () => {
+ const stateCtx = getStateContext();
+ const actionCtx = getActionContext();
+
+ await actionCtx.execute({
+ action: "push",
+ params: { screen: "settings" },
+ });
+
+ expect(stateCtx.get("/currentScreen")).toBe("settings");
+ expect(stateCtx.get("/navStack")).toEqual(["home"]);
+ },
+ { initialState: { currentScreen: "home" } },
+ ),
+ );
+
+ it(
+ "executes pop navigation action",
+ component(
+ async () => {
+ const stateCtx = getStateContext();
+ const actionCtx = getActionContext();
+
+ await actionCtx.execute({ action: "pop" });
+
+ expect(stateCtx.get("/currentScreen")).toBe("home");
+ expect(stateCtx.get("/navStack")).toEqual([]);
+ },
+ { initialState: { currentScreen: "settings", navStack: ["home"] } },
+ ),
+ );
+
+ it(
+ "executes custom handlers",
+ (() => {
+ const customHandler = vi.fn().mockResolvedValue(undefined);
+ return component(
+ async () => {
+ const actionCtx = getActionContext();
+
+ await actionCtx.execute({
+ action: "myAction",
+ params: { foo: "bar" },
+ });
+
+ expect(customHandler).toHaveBeenCalledWith({ foo: "bar" });
+ },
+ { handlers: { myAction: customHandler } },
+ );
+ })(),
+ );
+
+ it(
+ "warns when no handler registered",
+ component(async () => {
+ const actionCtx = getActionContext();
+ const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {});
+
+ await actionCtx.execute({ action: "unknownAction" });
+
+ expect(warnSpy).toHaveBeenCalledWith(
+ expect.stringContaining("unknownAction"),
+ );
+ warnSpy.mockRestore();
+ }),
+ );
+
+ it(
+ "tracks loading state for actions",
+ (() => {
+ let resolveHandler: () => void;
+ const slowHandler = vi.fn(
+ () =>
+ new Promise((resolve) => {
+ resolveHandler = resolve;
+ }),
+ );
+ return component(
+ async () => {
+ const actionCtx = getActionContext();
+ const executePromise = actionCtx.execute({ action: "slowAction" });
+
+ expect(actionCtx.loadingActions.has("slowAction")).toBe(true);
+
+ resolveHandler!();
+ await executePromise;
+
+ expect(actionCtx.loadingActions.has("slowAction")).toBe(false);
+ },
+ {
+ handlers: {
+ slowAction: slowHandler,
+ },
+ },
+ );
+ })(),
+ );
+
+ it(
+ "allows registering handlers dynamically",
+ component(async () => {
+ const actionCtx = getActionContext();
+ const dynamicHandler = vi.fn();
+
+ actionCtx.registerHandler("dynamicAction", dynamicHandler);
+ await actionCtx.execute({ action: "dynamicAction", params: { x: 1 } });
+
+ expect(dynamicHandler).toHaveBeenCalledWith({ x: 1 });
+ }),
+ );
+
+ it(
+ "executes validateForm and writes result to /formValidation",
+ component(
+ async () => {
+ const stateCtx = getStateContext();
+ const actionCtx = getActionContext();
+ const validationCtx = getValidationContext();
+
+ validationCtx.registerField("/form/email", {
+ checks: [{ type: "required", message: "Required" }],
+ });
+
+ await actionCtx.execute({ action: "validateForm" });
+
+ expect(stateCtx.get("/formValidation")).toEqual({
+ valid: false,
+ errors: { "/form/email": ["Required"] },
+ });
+ },
+ { withValidation: true },
+ ),
+ );
+
+ it(
+ "validateForm defaults to warning when validation context is missing",
+ component(async () => {
+ const actionCtx = getActionContext();
+ const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {});
+
+ await actionCtx.execute({ action: "validateForm" });
+
+ expect(warnSpy).toHaveBeenCalledWith(
+ expect.stringContaining("validateForm action was dispatched"),
+ );
+ warnSpy.mockRestore();
+ }),
+ );
+});
diff --git a/packages/svelte/src/contexts/state.test.ts b/packages/svelte/src/contexts/state.test.ts
new file mode 100644
index 00000000..62f5a213
--- /dev/null
+++ b/packages/svelte/src/contexts/state.test.ts
@@ -0,0 +1,207 @@
+import { describe, it, expect, vi } from "vitest";
+import { mount, unmount } from "svelte";
+import { createStateStore } from "@json-render/core";
+import StateProvider, { getStateContext } from "./StateProvider.svelte";
+
+function component(
+ runTest: () => void,
+ props: {
+ initialState?: Record;
+ onStateChange?: (changes: Array<{ path: string; value: unknown }>) => void;
+ store?: ReturnType;
+ } = {},
+) {
+ return () => {
+ const c = mount(
+ ((_anchor: any) => {
+ (StateProvider as any)(_anchor, {
+ ...props,
+ children: (() => {
+ runTest();
+ }) as any,
+ });
+ }) as any,
+ { target: document.body },
+ );
+ unmount(c);
+ };
+}
+
+describe("StateProvider", () => {
+ it(
+ "provides initial state to consumers",
+ component(
+ () => {
+ const ctx = getStateContext();
+ expect(ctx.state).toEqual({ user: { name: "John" } });
+ },
+ { initialState: { user: { name: "John" } } },
+ ),
+ );
+
+ it(
+ "provides empty object when no initial state",
+ component(() => {
+ const ctx = getStateContext();
+ expect(ctx.state).toEqual({});
+ }),
+ );
+});
+
+describe("StateContext.get", () => {
+ it(
+ "retrieves values by path",
+ component(
+ () => {
+ const ctx = getStateContext();
+ expect(ctx.get("/user/name")).toBe("John");
+ expect(ctx.get("/user/age")).toBe(30);
+ },
+ { initialState: { user: { name: "John", age: 30 } } },
+ ),
+ );
+
+ it(
+ "returns undefined for missing path",
+ component(
+ () => {
+ const ctx = getStateContext();
+ expect(ctx.get("/user/email")).toBeUndefined();
+ expect(ctx.get("/nonexistent")).toBeUndefined();
+ },
+ { initialState: { user: { name: "John" } } },
+ ),
+ );
+});
+
+describe("StateContext.set", () => {
+ it(
+ "updates values at path",
+ component(
+ () => {
+ const ctx = getStateContext();
+ ctx.set("/count", 5);
+ expect(ctx.state.count).toBe(5);
+ },
+ { initialState: { count: 0 } },
+ ),
+ );
+
+ it(
+ "creates nested paths",
+ component(() => {
+ const ctx = getStateContext();
+ ctx.set("/user/name", "Jane");
+ expect(ctx.get("/user/name")).toBe("Jane");
+ }),
+ );
+
+ it(
+ "calls onStateChange callback with change entries",
+ component(
+ () => {
+ const ctx = getStateContext();
+ ctx.set("/value", 2);
+ },
+ {
+ initialState: { value: 1 },
+ onStateChange: vi.fn((changes) => {
+ expect(changes).toEqual([{ path: "/value", value: 2 }]);
+ }),
+ },
+ ),
+ );
+});
+
+describe("StateContext.update", () => {
+ it(
+ "handles multiple values at once",
+ component(
+ () => {
+ const ctx = getStateContext();
+ ctx.update({ "/a": 10, "/b": 20 });
+ expect(ctx.state.a).toBe(10);
+ expect(ctx.state.b).toBe(20);
+ },
+ { initialState: { a: 1, b: 2 } },
+ ),
+ );
+
+ it(
+ "calls onStateChange once with all changed updates",
+ component(
+ () => {
+ const ctx = getStateContext();
+ ctx.update({ "/x": 1, "/y": 2 });
+ },
+ {
+ initialState: { x: 0, y: 0 },
+ onStateChange: vi.fn((changes) => {
+ expect(changes).toEqual([
+ { path: "/x", value: 1 },
+ { path: "/y", value: 2 },
+ ]);
+ }),
+ },
+ ),
+ );
+});
+
+describe("StateContext nested paths", () => {
+ it(
+ "handles deeply nested state paths",
+ component(
+ () => {
+ const ctx = getStateContext();
+ expect(ctx.get("/app/settings/theme")).toBe("light");
+ expect(ctx.get("/app/settings/notifications/enabled")).toBe(true);
+ ctx.set("/app/settings/theme", "dark");
+ expect(ctx.get("/app/settings/theme")).toBe("dark");
+ },
+ {
+ initialState: {
+ app: {
+ settings: {
+ theme: "light",
+ notifications: { enabled: true },
+ },
+ },
+ },
+ },
+ ),
+ );
+
+ it(
+ "handles array indices in paths",
+ component(
+ () => {
+ const ctx = getStateContext();
+ expect(ctx.get("/items/0")).toBe("a");
+ expect(ctx.get("/items/1")).toBe("b");
+ ctx.set("/items/1", "B");
+ expect(ctx.get("/items/1")).toBe("B");
+ },
+ { initialState: { items: ["a", "b", "c"] } },
+ ),
+ );
+});
+
+describe("controlled mode", () => {
+ it(
+ "reads and writes through external StateStore",
+ (() => {
+ const store = createStateStore({ count: 1 });
+ const onStateChange = vi.fn();
+ return component(
+ () => {
+ const ctx = getStateContext();
+ expect(ctx.get("/count")).toBe(1);
+ ctx.set("/count", 2);
+ expect(store.get("/count")).toBe(2);
+ expect(onStateChange).not.toHaveBeenCalled();
+ },
+ { store, onStateChange },
+ );
+ })(),
+ );
+});
diff --git a/packages/svelte/src/contexts/visibility.test.ts b/packages/svelte/src/contexts/visibility.test.ts
new file mode 100644
index 00000000..e481d8b0
--- /dev/null
+++ b/packages/svelte/src/contexts/visibility.test.ts
@@ -0,0 +1,161 @@
+import { describe, it, expect } from "vitest";
+import { mount, unmount } from "svelte";
+import StateProvider, { getStateContext } from "./StateProvider.svelte";
+import VisibilityProvider, {
+ getVisibilityContext,
+} from "./VisibilityProvider.svelte";
+
+function component(
+ runTest: () => void,
+ initialState: Record = {},
+) {
+ return () => {
+ const c = mount(
+ ((_anchor: any) => {
+ (StateProvider as any)(_anchor, {
+ initialState,
+ children: ((_inner: any) => {
+ (VisibilityProvider as any)(_inner, {
+ children: (() => {
+ runTest();
+ }) as any,
+ });
+ }) as any,
+ });
+ }) as any,
+ { target: document.body },
+ );
+ unmount(c);
+ };
+}
+
+describe("VisibilityProvider", () => {
+ it(
+ "provides isVisible function",
+ component(() => {
+ const visCtx = getVisibilityContext();
+
+ expect(typeof visCtx.isVisible).toBe("function");
+ }),
+ );
+
+ it(
+ "provides visibility context",
+ component(
+ () => {
+ const visCtx = getVisibilityContext();
+
+ expect(visCtx.ctx).toBeDefined();
+ expect(visCtx.ctx.stateModel).toEqual({ value: true });
+ },
+ { value: true },
+ ),
+ );
+});
+
+describe("isVisible", () => {
+ it(
+ "returns true for undefined condition",
+ component(() => {
+ const visCtx = getVisibilityContext();
+
+ expect(visCtx.isVisible(undefined)).toBe(true);
+ }),
+ );
+
+ it(
+ "returns true for true condition",
+ component(() => {
+ const visCtx = getVisibilityContext();
+
+ expect(visCtx.isVisible(true)).toBe(true);
+ }),
+ );
+
+ it(
+ "returns false for false condition",
+ component(() => {
+ const visCtx = getVisibilityContext();
+
+ expect(visCtx.isVisible(false)).toBe(false);
+ }),
+ );
+
+ it(
+ "evaluates $state conditions against data",
+ component(
+ () => {
+ const stateCtx = getStateContext();
+ const visCtx = getVisibilityContext();
+
+ expect(visCtx.isVisible({ $state: "/isLoggedIn" })).toBe(true);
+
+ stateCtx.set("/isLoggedIn", false);
+
+ expect(visCtx.isVisible({ $state: "/isLoggedIn" })).toBe(false);
+ },
+ { isLoggedIn: true },
+ ),
+ );
+
+ it(
+ "evaluates equality conditions",
+ component(
+ () => {
+ const visCtx = getVisibilityContext();
+
+ expect(visCtx.isVisible({ $state: "/tab", eq: "home" })).toBe(true);
+ expect(visCtx.isVisible({ $state: "/tab", eq: "settings" })).toBe(
+ false,
+ );
+ },
+ { tab: "home" },
+ ),
+ );
+
+ it(
+ "evaluates array conditions (implicit AND)",
+ component(
+ () => {
+ const visCtx = getVisibilityContext();
+
+ expect(visCtx.isVisible([{ $state: "/a" }, { $state: "/b" }])).toBe(
+ true,
+ );
+
+ expect(visCtx.isVisible([{ $state: "/a" }, { $state: "/c" }])).toBe(
+ false,
+ );
+ },
+ { a: true, b: true, c: false },
+ ),
+ );
+
+ it(
+ "evaluates $and conditions",
+ component(
+ () => {
+ const visCtx = getVisibilityContext();
+
+ expect(
+ visCtx.isVisible({ $and: [{ $state: "/x" }, { $state: "/y" }] }),
+ ).toBe(false);
+ },
+ { x: true, y: false },
+ ),
+ );
+
+ it(
+ "evaluates $or conditions",
+ component(
+ () => {
+ const visCtx = getVisibilityContext();
+
+ expect(
+ visCtx.isVisible({ $or: [{ $state: "/x" }, { $state: "/y" }] }),
+ ).toBe(true);
+ },
+ { x: true, y: false },
+ ),
+ );
+});
diff --git a/packages/svelte/src/index.ts b/packages/svelte/src/index.ts
new file mode 100644
index 00000000..a112a13a
--- /dev/null
+++ b/packages/svelte/src/index.ts
@@ -0,0 +1,130 @@
+// =============================================================================
+// Contexts
+// =============================================================================
+
+export {
+ default as StateProvider,
+ getStateContext,
+ getStateValue,
+ getBoundProp,
+ type StateContext,
+} from "./contexts/StateProvider.svelte";
+
+export {
+ default as VisibilityProvider,
+ getVisibilityContext,
+ isVisible,
+ type VisibilityContext,
+} from "./contexts/VisibilityProvider.svelte";
+
+export {
+ default as ActionProvider,
+ getActionContext,
+ getAction,
+ type ActionContext,
+ type PendingConfirmation,
+} from "./contexts/ActionProvider.svelte";
+
+export {
+ default as ValidationProvider,
+ getValidationContext,
+ getOptionalValidationContext,
+ getFieldValidation,
+ type ValidationContext,
+ type FieldValidationState,
+} from "./contexts/ValidationProvider.svelte";
+
+export {
+ default as RepeatScopeProvider,
+ getRepeatScope,
+ type RepeatScopeValue,
+} from "./contexts/RepeatScopeProvider.svelte";
+
+export {
+ default as FunctionsContextProvider,
+ getFunctions,
+ type FunctionsContext,
+} from "./contexts/FunctionsContextProvider.svelte";
+
+// =============================================================================
+// Schema
+// =============================================================================
+
+export { schema, type SvelteSchema, type SvelteSpec } from "./schema.js";
+
+// =============================================================================
+// Catalog Types
+// =============================================================================
+
+export type {
+ EventHandle,
+ BaseComponentProps,
+ SetState,
+ StateModel,
+ ComponentContext,
+ ComponentFn,
+ Components,
+ ActionFn,
+ Actions,
+} from "./catalog-types.js";
+
+// =============================================================================
+// Utilities
+// =============================================================================
+
+export {
+ flatToTree,
+ buildSpecFromParts,
+ getTextFromParts,
+ type DataPart,
+} from "./utils.svelte.js";
+
+// =============================================================================
+// Streaming
+// =============================================================================
+
+export {
+ createUIStream,
+ createChatUI,
+ type UIStreamOptions,
+ type UIStreamReturn,
+ type UIStreamState,
+ type ChatUIOptions,
+ type ChatUIReturn,
+ type ChatMessage,
+ type TokenUsage,
+} from "./streaming.svelte.js";
+
+// =============================================================================
+// Registry
+// =============================================================================
+
+export {
+ defineRegistry,
+ createRenderer,
+ type DefineRegistryResult,
+ type ComponentRenderer,
+ type ComponentRegistry,
+} from "./renderer.js";
+export { default as Renderer, type RendererProps } from "./Renderer.svelte";
+export {
+ default as CatalogRenderer,
+ type CatalogRendererProps,
+} from "./CatalogRenderer.svelte";
+export {
+ default as JsonUIProvider,
+ type JSONUIProviderProps,
+} from "./JsonUIProvider.svelte";
+export { default as ConfirmDialog } from "./ConfirmDialog.svelte";
+export { default as ConfirmDialogManager } from "./ConfirmDialogManager.svelte";
+
+// =============================================================================
+// Re-exports from core
+// =============================================================================
+
+export type {
+ Spec,
+ UIElement,
+ ActionBinding,
+ ActionHandler,
+} from "@json-render/core";
diff --git a/packages/svelte/src/renderer.test.ts b/packages/svelte/src/renderer.test.ts
new file mode 100644
index 00000000..eb1ddbef
--- /dev/null
+++ b/packages/svelte/src/renderer.test.ts
@@ -0,0 +1,194 @@
+import { describe, it, expect, afterEach } from "vitest";
+import { render, cleanup } from "@testing-library/svelte";
+import type { Spec } from "@json-render/core";
+import RendererWithProvider from "./RendererWithProvider.test.svelte";
+import TestContainer from "./TestContainer.svelte";
+import TestText from "./TestText.svelte";
+import TestButton from "./TestButton.svelte";
+import { defineRegistry } from "./renderer.js";
+
+describe("Renderer", () => {
+ afterEach(() => {
+ cleanup();
+ });
+
+ const { registry } = defineRegistry(null as any, {
+ components: {
+ Container: TestContainer,
+ Text: TestText,
+ Button: TestButton,
+ },
+ });
+
+ function mountRenderer(
+ spec: Spec | null,
+ options: { loading?: boolean } = {},
+ ) {
+ return render(RendererWithProvider, {
+ props: {
+ spec,
+ registry,
+ loading: options.loading ?? false,
+ initialState: spec?.state ?? {},
+ },
+ });
+ }
+
+ it("renders nothing for null spec", () => {
+ const { container } = mountRenderer(null);
+
+ // Should have no content rendered from Renderer
+ expect(container.querySelector(".test-container")).toBeNull();
+ expect(container.querySelector(".test-text")).toBeNull();
+ });
+
+ it("renders nothing for spec with empty root", () => {
+ const spec: Spec = { root: "", elements: {} };
+ const { container } = mountRenderer(spec);
+
+ expect(container.querySelector(".test-container")).toBeNull();
+ });
+
+ it("renders a single element", () => {
+ const spec: Spec = {
+ root: "text1",
+ elements: {
+ text1: {
+ type: "Text",
+ props: { text: "Hello World" },
+ children: [],
+ },
+ },
+ };
+ const { container } = mountRenderer(spec);
+
+ const textEl = container.querySelector(".test-text");
+ expect(textEl).not.toBeNull();
+ expect(textEl?.textContent).toBe("Hello World");
+ });
+
+ it("renders nested elements", () => {
+ const spec: Spec = {
+ root: "container",
+ elements: {
+ container: {
+ type: "Container",
+ props: { title: "My Container" },
+ children: ["text1", "text2"],
+ },
+ text1: {
+ type: "Text",
+ props: { text: "First" },
+ children: [],
+ },
+ text2: {
+ type: "Text",
+ props: { text: "Second" },
+ children: [],
+ },
+ },
+ };
+ const { container } = mountRenderer(spec);
+
+ const containerEl = container.querySelector(".test-container");
+ expect(containerEl).not.toBeNull();
+ expect(containerEl?.querySelector("h2")?.textContent).toBe("My Container");
+
+ const texts = container.querySelectorAll(".test-text");
+ expect(texts).toHaveLength(2);
+ expect(texts[0]?.textContent).toBe("First");
+ expect(texts[1]?.textContent).toBe("Second");
+ });
+
+ it("renders deeply nested elements", () => {
+ const spec: Spec = {
+ root: "outer",
+ elements: {
+ outer: {
+ type: "Container",
+ props: { title: "Outer" },
+ children: ["inner"],
+ },
+ inner: {
+ type: "Container",
+ props: { title: "Inner" },
+ children: ["text"],
+ },
+ text: {
+ type: "Text",
+ props: { text: "Deep text" },
+ children: [],
+ },
+ },
+ };
+ const { container } = mountRenderer(spec);
+
+ const containers = container.querySelectorAll(".test-container");
+ expect(containers).toHaveLength(2);
+
+ const text = container.querySelector(".test-text");
+ expect(text?.textContent).toBe("Deep text");
+ });
+
+ it("passes loading prop to components", () => {
+ const spec: Spec = {
+ root: "container",
+ elements: {
+ container: {
+ type: "Container",
+ props: {},
+ children: [],
+ },
+ },
+ };
+ const { container } = mountRenderer(spec, { loading: true });
+
+ const containerEl = container.querySelector(".test-container");
+ expect(containerEl?.getAttribute("data-loading")).toBe("true");
+ });
+
+ it("renders nothing for unknown component types without fallback", () => {
+ const spec: Spec = {
+ root: "unknown",
+ elements: {
+ unknown: {
+ type: "UnknownType",
+ props: {},
+ children: [],
+ },
+ },
+ };
+ const { container } = mountRenderer(spec);
+
+ // No elements should be rendered for unknown type
+ expect(container.querySelector(".test-container")).toBeNull();
+ expect(container.querySelector(".test-text")).toBeNull();
+ });
+
+ it("skips missing child elements gracefully", () => {
+ const spec: Spec = {
+ root: "container",
+ elements: {
+ container: {
+ type: "Container",
+ props: { title: "Parent" },
+ children: ["existing", "missing"],
+ },
+ existing: {
+ type: "Text",
+ props: { text: "I exist" },
+ children: [],
+ },
+ // "missing" element is not defined
+ },
+ };
+ const { container } = mountRenderer(spec);
+
+ const containerEl = container.querySelector(".test-container");
+ expect(containerEl).not.toBeNull();
+
+ const texts = container.querySelectorAll(".test-text");
+ expect(texts).toHaveLength(1);
+ expect(texts[0]?.textContent).toBe("I exist");
+ });
+});
diff --git a/packages/svelte/src/renderer.ts b/packages/svelte/src/renderer.ts
new file mode 100644
index 00000000..1f4d773f
--- /dev/null
+++ b/packages/svelte/src/renderer.ts
@@ -0,0 +1,274 @@
+import type {
+ Catalog,
+ ComputedFunction,
+ SchemaDefinition,
+ Spec,
+ StateStore,
+ UIElement,
+} from "@json-render/core";
+import type { Component, Snippet } from "svelte";
+import type {
+ BaseComponentProps,
+ EventHandle,
+ SetState,
+ StateModel,
+} from "./catalog-types.js";
+import CatalogRenderer from "./CatalogRenderer.svelte";
+
+/**
+ * Props passed to component renderers
+ */
+export interface ComponentRenderProps> {
+ /** The element being rendered */
+ element: UIElement;
+ /** Rendered children snippet */
+ children?: Snippet;
+ /** Emit a named event. The renderer resolves the event to action binding(s) from the element's `on` field. */
+ emit: (event: string) => void;
+ /** Get an event handle with metadata */
+ on: (event: string) => EventHandle;
+ /**
+ * Two-way binding paths resolved from `$bindState` / `$bindItem` expressions.
+ * Maps prop name → absolute state path for write-back.
+ */
+ bindings?: Record;
+ /** Whether the parent is loading */
+ loading?: boolean;
+}
+
+/**
+ * Component renderer type - a Svelte component that receives ComponentRenderProps
+ */
+export type ComponentRenderer> = Component<
+ ComponentRenderProps
+>;
+
+/**
+ * Registry of component renderers.
+ * Maps component type names to Svelte components.
+ */
+export type ComponentRegistry = Record>;
+
+/**
+ * Action handler function for defineRegistry
+ */
+type DefineRegistryActionFn = (
+ params: Record | undefined,
+ setState: SetState,
+ state: StateModel,
+) => Promise;
+
+/**
+ * Result returned by defineRegistry
+ */
+export interface DefineRegistryResult {
+ /** Component registry for Renderer */
+ registry: ComponentRegistry;
+ /**
+ * Create ActionProvider-compatible handlers.
+ */
+ handlers: (
+ getSetState: () => SetState | undefined,
+ getState: () => StateModel,
+ ) => Record) => Promise>;
+ /**
+ * Execute an action by name imperatively
+ */
+ executeAction: (
+ actionName: string,
+ params: Record | undefined,
+ setState: SetState,
+ state?: StateModel,
+ ) => Promise;
+}
+
+/**
+ * Create a registry from a catalog with Svelte components and/or actions.
+ *
+ * Components must accept `BaseComponentProps` as their props interface.
+ *
+ * @example
+ * ```ts
+ * import { defineRegistry } from "@json-render/svelte";
+ * import Card from "./components/Card.svelte";
+ * import Button from "./components/Button.svelte";
+ * import { myCatalog } from "./catalog";
+ *
+ * const { registry, handlers } = defineRegistry(myCatalog, {
+ * components: {
+ * Card,
+ * Button,
+ * },
+ * actions: {
+ * submit: async (params, setState) => {
+ * // handle action
+ * },
+ * },
+ * });
+ * ```
+ */
+export function defineRegistry<
+ C extends Catalog,
+ TComponents extends Record>>,
+>(
+ _catalog: C,
+ options: {
+ /** Svelte components that accept BaseComponentProps */
+ components?: TComponents;
+ /** Action handlers */
+ actions?: Record;
+ },
+): DefineRegistryResult {
+ const registry: ComponentRegistry = {};
+
+ if (options.components) {
+ for (const [name, componentFn] of Object.entries(options.components)) {
+ registry[name] = (_, props) =>
+ (componentFn as Component>)(_, {
+ get props() {
+ return props.element.props;
+ },
+ get children() {
+ return props.children;
+ },
+ get emit() {
+ return props.emit;
+ },
+ get on() {
+ return props.on;
+ },
+ get bindings() {
+ return props.bindings;
+ },
+ get loading() {
+ return props.loading;
+ },
+ });
+ }
+ }
+
+ // Build action helpers
+ const actionMap = options.actions
+ ? (Object.entries(options.actions) as Array<
+ [string, DefineRegistryActionFn]
+ >)
+ : [];
+
+ const handlers = (
+ getSetState: () => SetState | undefined,
+ getState: () => StateModel,
+ ): Record) => Promise> => {
+ const result: Record<
+ string,
+ (params: Record) => Promise
+ > = {};
+ for (const [name, actionFn] of actionMap) {
+ result[name] = async (params) => {
+ const setState = getSetState();
+ const state = getState();
+ if (setState) {
+ await actionFn(params, setState, state);
+ }
+ };
+ }
+ return result;
+ };
+
+ const executeAction = async (
+ actionName: string,
+ params: Record | undefined,
+ setState: SetState,
+ state: StateModel = {},
+ ): Promise => {
+ const entry = actionMap.find(([name]) => name === actionName);
+ if (entry) {
+ await entry[1](params, setState, state);
+ } else {
+ console.warn(`Unknown action: ${actionName}`);
+ }
+ };
+
+ return { registry, handlers, executeAction };
+}
+
+// ============================================================================
+// createRenderer
+// ============================================================================
+
+/**
+ * Props for renderers created with createRenderer
+ */
+export interface CreateRendererProps {
+ spec: Spec | null;
+ store?: StateStore;
+ state?: Record;
+ onAction?: (actionName: string, params?: Record) => void;
+ onStateChange?: (changes: Array<{ path: string; value: unknown }>) => void;
+ /** Named functions for `$computed` expressions in props */
+ functions?: Record;
+ loading?: boolean;
+ fallback?: Component;
+}
+
+/**
+ * Component map type — maps component names to Vue components
+ */
+export type ComponentMap<
+ TComponents extends Record,
+> = {
+ [K in keyof TComponents]: Component;
+};
+
+/**
+ * Create a renderer from a catalog
+ *
+ * @example
+ * ```typescript
+ * const DashboardRenderer = createRenderer(dashboardCatalog, {
+ * Card,
+ * Metric,
+ * });
+ *
+ * // Usage in template
+ *
+ * ```
+ */
+export function createRenderer<
+ TDef extends SchemaDefinition,
+ TCatalog extends { components: Record },
+>(
+ _catalog: Catalog,
+ components: ComponentMap,
+): Component {
+ const registry: ComponentRegistry =
+ components as unknown as ComponentRegistry;
+
+ return (_, props: CreateRendererProps) =>
+ CatalogRenderer(_, {
+ registry,
+ get spec() {
+ return props.spec;
+ },
+ get store() {
+ return props.store;
+ },
+ get state() {
+ return props.state;
+ },
+ get onAction() {
+ return props.onAction;
+ },
+ get onStateChange() {
+ return props.onStateChange;
+ },
+ get functions() {
+ return props.functions;
+ },
+ get loading() {
+ return props.loading;
+ },
+ get fallback() {
+ return props.fallback;
+ },
+ });
+}
diff --git a/packages/svelte/src/schema.ts b/packages/svelte/src/schema.ts
new file mode 100644
index 00000000..fd73e18a
--- /dev/null
+++ b/packages/svelte/src/schema.ts
@@ -0,0 +1,109 @@
+import { defineSchema } from "@json-render/core";
+
+/**
+ * The schema for @json-render/svelte
+ *
+ * Defines:
+ * - Spec: A flat tree of elements with keys, types, props, and children references
+ * - Catalog: Components with props schemas, and optional actions
+ */
+export const schema = defineSchema(
+ (s) => ({
+ // What the AI-generated SPEC looks like
+ spec: s.object({
+ /** Root element key */
+ root: s.string(),
+ /** Flat map of elements by key */
+ elements: s.record(
+ s.object({
+ /** Component type from catalog */
+ type: s.ref("catalog.components"),
+ /** Component props */
+ props: s.propsOf("catalog.components"),
+ /** Child element keys (flat reference) */
+ children: s.array(s.string()),
+ /** Visibility condition */
+ visible: s.any(),
+ }),
+ ),
+ }),
+
+ // What the CATALOG must provide
+ catalog: s.object({
+ /** Component definitions */
+ components: s.map({
+ /** Zod schema for component props */
+ props: s.zod(),
+ /** Slots for this component. Use ['default'] for children, or named slots like ['header', 'footer'] */
+ slots: s.array(s.string()),
+ /** Description for AI generation hints */
+ description: s.string(),
+ /** Example prop values used in prompt examples (auto-generated from Zod schema if omitted) */
+ example: s.any(),
+ }),
+ /** Action definitions (optional) */
+ actions: s.map({
+ /** Zod schema for action params */
+ params: s.zod(),
+ /** Description for AI generation hints */
+ description: s.string(),
+ }),
+ }),
+ }),
+ {
+ builtInActions: [
+ {
+ name: "setState",
+ description:
+ "Update a value in the state model at the given statePath. Params: { statePath: string, value: any }",
+ },
+ {
+ name: "pushState",
+ description:
+ 'Append an item to an array in state. Params: { statePath: string, value: any, clearStatePath?: string }. Value can contain {"$state":"/path"} refs and "$id" for auto IDs.',
+ },
+ {
+ name: "removeState",
+ description:
+ "Remove an item from an array in state by index. Params: { statePath: string, index: number }",
+ },
+ {
+ name: "validateForm",
+ description:
+ "Validate all registered form fields and write the result to state. Params: { statePath?: string }. Defaults to /formValidation. Result: { valid: boolean, errors: Record }.",
+ },
+ ],
+ defaultRules: [
+ // Element integrity
+ "CRITICAL INTEGRITY CHECK: Before outputting ANY element that references children, you MUST have already output (or will output) each child as its own element. If an element has children: ['a', 'b'], then elements 'a' and 'b' MUST exist. A missing child element causes that entire branch of the UI to be invisible.",
+ "SELF-CHECK: After generating all elements, mentally walk the tree from root. Every key in every children array must resolve to a defined element. If you find a gap, output the missing element immediately.",
+
+ // Field placement
+ 'CRITICAL: The "visible" field goes on the ELEMENT object, NOT inside "props". Correct: {"type":"","props":{},"visible":{"$state":"/tab","eq":"home"},"children":[...]}.',
+ 'CRITICAL: The "on" field goes on the ELEMENT object, NOT inside "props". Use on.press, on.change, on.submit etc. NEVER put action/actionParams inside props.',
+
+ // State and data
+ "When the user asks for a UI that displays data (e.g. blog posts, products, users), ALWAYS include a state field with realistic sample data. The state field is a top-level field on the spec (sibling of root/elements).",
+ 'When building repeating content backed by a state array (e.g. posts, products, items), use the "repeat" field on a container element. Example: { "type": "", "props": {}, "repeat": { "statePath": "/posts", "key": "id" }, "children": ["post-card"] }. Replace with an appropriate component from the AVAILABLE COMPONENTS list. Inside repeated children, use { "$item": "field" } to read a field from the current item, and { "$index": true } for the current array index. For two-way binding to an item field use { "$bindItem": "completed" }. Do NOT hardcode individual elements for each array item.',
+
+ // Design quality
+ "Design with visual hierarchy: use container components to group content, heading components for section titles, proper spacing, and status indicators. ONLY use components from the AVAILABLE COMPONENTS list.",
+ "For data-rich UIs, use multi-column layout components if available. For forms and single-column content, use vertical layout components. ONLY use components from the AVAILABLE COMPONENTS list.",
+ "Always include realistic, professional-looking sample data. For blogs include 3-4 posts with varied titles, authors, dates, categories. For products include names, prices, images. Never leave data empty.",
+ ],
+ },
+);
+
+/**
+ * Type for the Svelte schema
+ */
+export type SvelteSchema = typeof schema;
+
+/**
+ * Infer the spec type from a catalog
+ */
+export type SvelteSpec = typeof schema extends {
+ createCatalog: (catalog: TCatalog) => { _specType: infer S };
+}
+ ? S
+ : never;
diff --git a/packages/svelte/src/streaming.svelte.ts b/packages/svelte/src/streaming.svelte.ts
new file mode 100644
index 00000000..cc39016f
--- /dev/null
+++ b/packages/svelte/src/streaming.svelte.ts
@@ -0,0 +1,533 @@
+import type { Spec, JsonPatch } from "@json-render/core";
+import {
+ setByPath,
+ getByPath,
+ removeByPath,
+ createMixedStreamParser,
+ applySpecPatch,
+} from "@json-render/core";
+
+/**
+ * Token usage metadata from AI generation
+ */
+export interface TokenUsage {
+ promptTokens: number;
+ completionTokens: number;
+ totalTokens: number;
+}
+
+/**
+ * UI Stream state
+ */
+export interface UIStreamState {
+ spec: Spec | null;
+ isStreaming: boolean;
+ error: Error | null;
+ usage: TokenUsage | null;
+ rawLines: string[];
+}
+
+/**
+ * UI Stream return type
+ */
+export interface UIStreamReturn {
+ readonly spec: Spec | null;
+ readonly isStreaming: boolean;
+ readonly error: Error | null;
+ readonly usage: TokenUsage | null;
+ readonly rawLines: string[];
+ send: (prompt: string, context?: Record) => Promise;
+ clear: () => void;
+}
+
+/**
+ * Options for createUIStream
+ */
+export interface UIStreamOptions {
+ api: string;
+ onComplete?: (spec: Spec) => void;
+ onError?: (error: Error) => void;
+}
+
+type ParsedLine =
+ | { type: "patch"; patch: JsonPatch }
+ | { type: "usage"; usage: TokenUsage }
+ | null;
+
+function parseLine(line: string): ParsedLine {
+ try {
+ const trimmed = line.trim();
+ if (!trimmed || trimmed.startsWith("//")) {
+ return null;
+ }
+ const parsed = JSON.parse(trimmed);
+
+ if (parsed.__meta === "usage") {
+ return {
+ type: "usage",
+ usage: {
+ promptTokens: parsed.promptTokens ?? 0,
+ completionTokens: parsed.completionTokens ?? 0,
+ totalTokens: parsed.totalTokens ?? 0,
+ },
+ };
+ }
+
+ return { type: "patch", patch: parsed as JsonPatch };
+ } catch {
+ return null;
+ }
+}
+
+function setSpecValue(newSpec: Spec, path: string, value: unknown): void {
+ if (path === "/root") {
+ newSpec.root = value as string;
+ return;
+ }
+
+ if (path === "/state") {
+ newSpec.state = value as Record;
+ return;
+ }
+
+ if (path.startsWith("/state/")) {
+ if (!newSpec.state) newSpec.state = {};
+ const statePath = path.slice("/state".length);
+ setByPath(newSpec.state as Record, statePath, value);
+ return;
+ }
+
+ if (path.startsWith("/elements/")) {
+ const pathParts = path.slice("/elements/".length).split("/");
+ const elementKey = pathParts[0];
+ if (!elementKey) return;
+
+ if (pathParts.length === 1) {
+ newSpec.elements[elementKey] = value as Spec["elements"][string];
+ } else {
+ const element = newSpec.elements[elementKey];
+ if (element) {
+ const propPath = "/" + pathParts.slice(1).join("/");
+ const newElement = { ...element };
+ setByPath(
+ newElement as unknown as Record,
+ propPath,
+ value,
+ );
+ newSpec.elements[elementKey] = newElement;
+ }
+ }
+ }
+}
+
+function removeSpecValue(newSpec: Spec, path: string): void {
+ if (path === "/state") {
+ delete newSpec.state;
+ return;
+ }
+
+ if (path.startsWith("/state/") && newSpec.state) {
+ const statePath = path.slice("/state".length);
+ removeByPath(newSpec.state as Record, statePath);
+ return;
+ }
+
+ if (path.startsWith("/elements/")) {
+ const pathParts = path.slice("/elements/".length).split("/");
+ const elementKey = pathParts[0];
+ if (!elementKey) return;
+
+ if (pathParts.length === 1) {
+ const { [elementKey]: _, ...rest } = newSpec.elements;
+ newSpec.elements = rest;
+ } else {
+ const element = newSpec.elements[elementKey];
+ if (element) {
+ const propPath = "/" + pathParts.slice(1).join("/");
+ const newElement = { ...element };
+ removeByPath(
+ newElement as unknown as Record,
+ propPath,
+ );
+ newSpec.elements[elementKey] = newElement;
+ }
+ }
+ }
+}
+
+function getSpecValue(spec: Spec, path: string): unknown {
+ if (path === "/root") return spec.root;
+ if (path === "/state") return spec.state;
+ if (path.startsWith("/state/") && spec.state) {
+ const statePath = path.slice("/state".length);
+ return getByPath(spec.state as Record, statePath);
+ }
+ return getByPath(spec as unknown as Record, path);
+}
+
+function applyPatch(spec: Spec, patch: JsonPatch): Spec {
+ const newSpec = {
+ ...spec,
+ elements: { ...spec.elements },
+ ...(spec.state ? { state: { ...spec.state } } : {}),
+ };
+
+ switch (patch.op) {
+ case "add":
+ case "replace": {
+ setSpecValue(newSpec, patch.path, patch.value);
+ break;
+ }
+ case "remove": {
+ removeSpecValue(newSpec, patch.path);
+ break;
+ }
+ case "move": {
+ if (!patch.from) break;
+ const moveValue = getSpecValue(newSpec, patch.from);
+ removeSpecValue(newSpec, patch.from);
+ setSpecValue(newSpec, patch.path, moveValue);
+ break;
+ }
+ case "copy": {
+ if (!patch.from) break;
+ const copyValue = getSpecValue(newSpec, patch.from);
+ setSpecValue(newSpec, patch.path, copyValue);
+ break;
+ }
+ case "test": {
+ break;
+ }
+ }
+
+ return newSpec;
+}
+
+/**
+ * Create a streaming UI generator using Svelte 5 $state
+ */
+export function createUIStream({
+ api,
+ onComplete,
+ onError,
+}: UIStreamOptions): UIStreamReturn {
+ let spec = $state(null);
+ let isStreaming = $state(false);
+ let error = $state(null);
+ let usage = $state(null);
+ let rawLines = $state([]);
+ let abortController: AbortController | null = null;
+
+ const clear = () => {
+ spec = null;
+ error = null;
+ usage = null;
+ rawLines = [];
+ };
+
+ const send = async (
+ prompt: string,
+ context?: Record,
+ ): Promise => {
+ abortController?.abort();
+ abortController = new AbortController();
+
+ isStreaming = true;
+ error = null;
+ usage = null;
+ rawLines = [];
+
+ const previousSpec = context?.previousSpec as Spec | undefined;
+ let currentSpec: Spec =
+ previousSpec && previousSpec.root
+ ? { ...previousSpec, elements: { ...previousSpec.elements } }
+ : { root: "", elements: {} };
+ spec = currentSpec;
+
+ try {
+ const response = await fetch(api, {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({ prompt, context, currentSpec }),
+ signal: abortController.signal,
+ });
+
+ if (!response.ok) {
+ let errorMessage = `HTTP error: ${response.status}`;
+ try {
+ const errorData = await response.json();
+ if (errorData.message) errorMessage = errorData.message;
+ else if (errorData.error) errorMessage = errorData.error;
+ } catch {
+ // Ignore
+ }
+ throw new Error(errorMessage);
+ }
+
+ const reader = response.body?.getReader();
+ if (!reader) throw new Error("No response body");
+
+ const decoder = new TextDecoder();
+ let buffer = "";
+
+ while (true) {
+ const { done, value } = await reader.read();
+ if (done) break;
+
+ buffer += decoder.decode(value, { stream: true });
+ const lines = buffer.split("\n");
+ buffer = lines.pop() ?? "";
+
+ for (const line of lines) {
+ const trimmed = line.trim();
+ if (!trimmed) continue;
+ const result = parseLine(trimmed);
+ if (!result) continue;
+ if (result.type === "usage") {
+ usage = result.usage;
+ } else {
+ rawLines = [...rawLines, trimmed];
+ currentSpec = applyPatch(currentSpec, result.patch);
+ spec = { ...currentSpec };
+ }
+ }
+ }
+
+ if (buffer.trim()) {
+ const trimmed = buffer.trim();
+ const result = parseLine(trimmed);
+ if (result) {
+ if (result.type === "usage") {
+ usage = result.usage;
+ } else {
+ rawLines = [...rawLines, trimmed];
+ currentSpec = applyPatch(currentSpec, result.patch);
+ spec = { ...currentSpec };
+ }
+ }
+ }
+
+ onComplete?.(currentSpec);
+ } catch (err) {
+ if ((err as Error).name === "AbortError") return;
+ const e = err instanceof Error ? err : new Error(String(err));
+ error = e;
+ onError?.(e);
+ } finally {
+ isStreaming = false;
+ }
+ };
+
+ return {
+ get spec() {
+ return spec;
+ },
+ get isStreaming() {
+ return isStreaming;
+ },
+ get error() {
+ return error;
+ },
+ get usage() {
+ return usage;
+ },
+ get rawLines() {
+ return rawLines;
+ },
+ send,
+ clear,
+ };
+}
+
+/**
+ * Chat message type
+ */
+export interface ChatMessage {
+ id: string;
+ role: "user" | "assistant";
+ text: string;
+ spec: Spec | null;
+}
+
+/**
+ * Chat UI options
+ */
+export interface ChatUIOptions {
+ api: string;
+ onComplete?: (message: ChatMessage) => void;
+ onError?: (error: Error) => void;
+}
+
+/**
+ * Chat UI return type
+ */
+export interface ChatUIReturn {
+ readonly messages: ChatMessage[];
+ readonly isStreaming: boolean;
+ readonly error: Error | null;
+ send: (text: string) => Promise;
+ clear: () => void;
+}
+
+let chatMessageIdCounter = 0;
+function generateChatId(): string {
+ if (
+ typeof crypto !== "undefined" &&
+ typeof crypto.randomUUID === "function"
+ ) {
+ return crypto.randomUUID();
+ }
+ chatMessageIdCounter += 1;
+ return `msg-${Date.now()}-${chatMessageIdCounter}`;
+}
+
+/**
+ * Create a chat UI with streaming support
+ */
+export function createChatUI({
+ api,
+ onComplete,
+ onError,
+}: ChatUIOptions): ChatUIReturn {
+ let messages = $state([]);
+ let isStreaming = $state(false);
+ let error = $state(null);
+ let abortController: AbortController | null = null;
+
+ const clear = () => {
+ messages = [];
+ error = null;
+ };
+
+ const send = async (text: string): Promise => {
+ if (!text.trim()) return;
+
+ abortController?.abort();
+ abortController = new AbortController();
+
+ const userMessage: ChatMessage = {
+ id: generateChatId(),
+ role: "user",
+ text: text.trim(),
+ spec: null,
+ };
+
+ const assistantId = generateChatId();
+ const assistantMessage: ChatMessage = {
+ id: assistantId,
+ role: "assistant",
+ text: "",
+ spec: null,
+ };
+
+ messages = [...messages, userMessage, assistantMessage];
+ isStreaming = true;
+ error = null;
+
+ const historyForApi = messages
+ .slice(0, -1)
+ .map((m) => ({ role: m.role, content: m.text }));
+
+ let accumulatedText = "";
+ let currentSpec: Spec = { root: "", elements: {} };
+ let hasSpec = false;
+
+ try {
+ const response = await fetch(api, {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({ messages: historyForApi }),
+ signal: abortController.signal,
+ });
+
+ if (!response.ok) {
+ let errorMessage = `HTTP error: ${response.status}`;
+ try {
+ const errorData = await response.json();
+ if (errorData.message) errorMessage = errorData.message;
+ else if (errorData.error) errorMessage = errorData.error;
+ } catch {
+ // Ignore
+ }
+ throw new Error(errorMessage);
+ }
+
+ const reader = response.body?.getReader();
+ if (!reader) throw new Error("No response body");
+
+ const decoder = new TextDecoder();
+
+ const parser = createMixedStreamParser({
+ onPatch(patch) {
+ hasSpec = true;
+ applySpecPatch(currentSpec, patch);
+ messages = messages.map((m) =>
+ m.id === assistantId
+ ? {
+ ...m,
+ spec: {
+ root: currentSpec.root,
+ elements: { ...currentSpec.elements },
+ ...(currentSpec.state
+ ? { state: { ...currentSpec.state } }
+ : {}),
+ },
+ }
+ : m,
+ );
+ },
+ onText(line) {
+ accumulatedText += (accumulatedText ? "\n" : "") + line;
+ messages = messages.map((m) =>
+ m.id === assistantId ? { ...m, text: accumulatedText } : m,
+ );
+ },
+ });
+
+ while (true) {
+ const { done, value } = await reader.read();
+ if (done) break;
+ parser.push(decoder.decode(value, { stream: true }));
+ }
+ parser.flush();
+
+ const finalMessage: ChatMessage = {
+ id: assistantId,
+ role: "assistant",
+ text: accumulatedText,
+ spec: hasSpec
+ ? {
+ root: currentSpec.root,
+ elements: { ...currentSpec.elements },
+ ...(currentSpec.state ? { state: { ...currentSpec.state } } : {}),
+ }
+ : null,
+ };
+ onComplete?.(finalMessage);
+ } catch (err) {
+ if ((err as Error).name === "AbortError") return;
+ const e = err instanceof Error ? err : new Error(String(err));
+ error = e;
+ messages = messages.filter(
+ (m) => m.id !== assistantId || m.text.length > 0,
+ );
+ onError?.(e);
+ } finally {
+ isStreaming = false;
+ }
+ };
+
+ return {
+ get messages() {
+ return messages;
+ },
+ get isStreaming() {
+ return isStreaming;
+ },
+ get error() {
+ return error;
+ },
+ send,
+ clear,
+ };
+}
diff --git a/packages/svelte/src/utils.svelte.ts b/packages/svelte/src/utils.svelte.ts
new file mode 100644
index 00000000..4c3bf801
--- /dev/null
+++ b/packages/svelte/src/utils.svelte.ts
@@ -0,0 +1,124 @@
+import type {
+ Spec,
+ UIElement,
+ FlatElement,
+ SpecDataPart,
+} from "@json-render/core";
+import {
+ applySpecPatch,
+ nestedToFlat,
+ SPEC_DATA_PART_TYPE,
+} from "@json-render/core";
+
+/**
+ * A single part from an AI response. Minimal structural type for library helpers.
+ */
+export interface DataPart {
+ type: string;
+ text?: string;
+ data?: unknown;
+}
+
+/**
+ * Convert a flat element list to a Spec.
+ * Input elements use key/parentKey to establish identity and relationships.
+ * Output spec uses the map-based format where key is the map entry key
+ * and parent-child relationships are expressed through children arrays.
+ */
+export function flatToTree(elements: FlatElement[]): Spec {
+ const elementMap: Record = {};
+ let root = "";
+
+ // First pass: add all elements to map
+ for (const element of elements) {
+ elementMap[element.key] = {
+ type: element.type,
+ props: element.props,
+ children: [],
+ visible: element.visible,
+ };
+ }
+
+ // Second pass: build parent-child relationships
+ for (const element of elements) {
+ if (element.parentKey) {
+ const parent = elementMap[element.parentKey];
+ if (parent) {
+ if (!parent.children) {
+ parent.children = [];
+ }
+ parent.children.push(element.key);
+ }
+ } else {
+ root = element.key;
+ }
+ }
+
+ return { root, elements: elementMap };
+}
+
+/**
+ * Type guard that validates a data part payload looks like a valid SpecDataPart.
+ */
+function isSpecDataPart(data: unknown): data is SpecDataPart {
+ if (typeof data !== "object" || data === null) return false;
+ const obj = data as Record;
+ switch (obj.type) {
+ case "patch":
+ return typeof obj.patch === "object" && obj.patch !== null;
+ case "flat":
+ case "nested":
+ return typeof obj.spec === "object" && obj.spec !== null;
+ default:
+ return false;
+ }
+}
+
+/**
+ * Build a `Spec` by replaying all spec data parts from a message's parts array.
+ * Returns `null` if no spec data parts are present.
+ */
+export function buildSpecFromParts(
+ parts: DataPart[],
+ snapshot = true,
+): Spec | null {
+ const spec: Spec = { root: "", elements: {} };
+ let hasSpec = false;
+
+ for (const part of parts) {
+ if (part.type === SPEC_DATA_PART_TYPE) {
+ if (!isSpecDataPart(part.data)) continue;
+ const payload = part.data;
+ if (payload.type === "patch") {
+ hasSpec = true;
+ applySpecPatch(
+ spec,
+ snapshot ? $state.snapshot(payload.patch) : payload.patch,
+ );
+ } else if (payload.type === "flat") {
+ hasSpec = true;
+ Object.assign(spec, payload.spec);
+ } else if (payload.type === "nested") {
+ hasSpec = true;
+ const flat = nestedToFlat(payload.spec);
+ Object.assign(spec, flat);
+ }
+ }
+ }
+
+ return hasSpec ? spec : null;
+}
+
+/**
+ * Extract and join all text content from a message's parts array.
+ */
+export function getTextFromParts(parts: DataPart[]): string {
+ return parts
+ .filter(
+ (p): p is DataPart & { text: string } =>
+ p.type === "text" && typeof p.text === "string",
+ )
+ .map((p) => p.text.trim())
+ .filter(Boolean)
+ .join("\n\n");
+}
diff --git a/packages/svelte/src/utils.test.ts b/packages/svelte/src/utils.test.ts
new file mode 100644
index 00000000..afe595f8
--- /dev/null
+++ b/packages/svelte/src/utils.test.ts
@@ -0,0 +1,379 @@
+import { describe, it, expect } from "vitest";
+import {
+ flatToTree,
+ buildSpecFromParts,
+ getTextFromParts,
+} from "./utils.svelte.js";
+import type { FlatElement, SpecDataPart } from "@json-render/core";
+import { SPEC_DATA_PART_TYPE } from "@json-render/core";
+
+describe("flatToTree", () => {
+ it("converts array of elements to tree structure", () => {
+ const elements: FlatElement[] = [
+ { key: "root", type: "Container", props: {}, parentKey: undefined },
+ {
+ key: "child1",
+ type: "Text",
+ props: { text: "Hello" },
+ parentKey: "root",
+ },
+ ];
+
+ const spec = flatToTree(elements);
+
+ expect(spec.root).toBe("root");
+ expect(spec.elements["root"]).toBeDefined();
+ expect(spec.elements["child1"]).toBeDefined();
+ });
+
+ it("builds parent-child relationships", () => {
+ const elements: FlatElement[] = [
+ { key: "root", type: "Container", props: {}, parentKey: undefined },
+ { key: "child1", type: "Text", props: {}, parentKey: "root" },
+ { key: "child2", type: "Text", props: {}, parentKey: "root" },
+ ];
+
+ const spec = flatToTree(elements);
+
+ expect(spec.elements["root"]?.children).toEqual(["child1", "child2"]);
+ });
+
+ it("handles single root element", () => {
+ const elements: FlatElement[] = [
+ {
+ key: "only",
+ type: "Text",
+ props: { text: "Solo" },
+ parentKey: undefined,
+ },
+ ];
+
+ const spec = flatToTree(elements);
+
+ expect(spec.root).toBe("only");
+ expect(spec.elements["only"]?.children).toEqual([]);
+ });
+
+ it("handles deeply nested elements", () => {
+ const elements: FlatElement[] = [
+ { key: "root", type: "Container", props: {}, parentKey: undefined },
+ { key: "level1", type: "Container", props: {}, parentKey: "root" },
+ { key: "level2", type: "Container", props: {}, parentKey: "level1" },
+ { key: "level3", type: "Text", props: {}, parentKey: "level2" },
+ ];
+
+ const spec = flatToTree(elements);
+
+ expect(spec.elements["root"]?.children).toEqual(["level1"]);
+ expect(spec.elements["level1"]?.children).toEqual(["level2"]);
+ expect(spec.elements["level2"]?.children).toEqual(["level3"]);
+ expect(spec.elements["level3"]?.children).toEqual([]);
+ });
+
+ it("preserves element props", () => {
+ const elements: FlatElement[] = [
+ {
+ key: "root",
+ type: "Card",
+ props: { title: "Hello", value: 42 },
+ parentKey: undefined,
+ },
+ ];
+
+ const spec = flatToTree(elements);
+
+ expect(spec.elements["root"]?.props).toEqual({ title: "Hello", value: 42 });
+ });
+
+ it("preserves visibility conditions", () => {
+ const elements: FlatElement[] = [
+ {
+ key: "root",
+ type: "Container",
+ props: {},
+ parentKey: undefined,
+ visible: { $state: "/isVisible" },
+ },
+ ];
+
+ const spec = flatToTree(elements);
+
+ expect(spec.elements["root"]?.visible).toEqual({ $state: "/isVisible" });
+ });
+
+ it("handles elements with undefined parentKey as root", () => {
+ const elements: FlatElement[] = [
+ { key: "a", type: "Text", props: {}, parentKey: undefined },
+ ];
+
+ const spec = flatToTree(elements);
+
+ expect(spec.root).toBe("a");
+ });
+
+ it("handles empty elements array", () => {
+ const spec = flatToTree([]);
+
+ expect(spec.root).toBe("");
+ expect(spec.elements).toEqual({});
+ });
+
+ it("handles multiple children correctly", () => {
+ const elements: FlatElement[] = [
+ { key: "root", type: "Container", props: {}, parentKey: undefined },
+ { key: "a", type: "Text", props: {}, parentKey: "root" },
+ { key: "b", type: "Text", props: {}, parentKey: "root" },
+ { key: "c", type: "Text", props: {}, parentKey: "root" },
+ ];
+
+ const spec = flatToTree(elements);
+
+ expect(spec.elements["root"]?.children).toHaveLength(3);
+ expect(spec.elements["root"]?.children).toContain("a");
+ expect(spec.elements["root"]?.children).toContain("b");
+ expect(spec.elements["root"]?.children).toContain("c");
+ });
+});
+
+describe("buildSpecFromParts", () => {
+ it("returns null when no data-spec parts are present", () => {
+ const parts = [
+ { type: "text", text: "Hello world" },
+ { type: "other", data: {} },
+ ];
+
+ const spec = buildSpecFromParts(parts);
+
+ expect(spec).toBeNull();
+ });
+
+ it("builds a spec from patch parts", () => {
+ const parts = [
+ {
+ type: SPEC_DATA_PART_TYPE,
+ data: {
+ type: "patch",
+ patch: { op: "add", path: "/root", value: "main" },
+ } satisfies SpecDataPart,
+ },
+ {
+ type: SPEC_DATA_PART_TYPE,
+ data: {
+ type: "patch",
+ patch: {
+ op: "add",
+ path: "/elements/main",
+ value: { type: "Text", props: { text: "Hi" }, children: [] },
+ },
+ } satisfies SpecDataPart,
+ },
+ ];
+
+ const spec = buildSpecFromParts(parts);
+
+ expect(spec).not.toBeNull();
+ expect(spec?.root).toBe("main");
+ expect(spec?.elements["main"]?.type).toBe("Text");
+ });
+
+ it("handles flat spec parts", () => {
+ const parts = [
+ {
+ type: SPEC_DATA_PART_TYPE,
+ data: {
+ type: "flat",
+ spec: {
+ root: "root",
+ elements: {
+ root: { type: "Container", props: {}, children: [] },
+ },
+ },
+ } satisfies SpecDataPart,
+ },
+ ];
+
+ const spec = buildSpecFromParts(parts);
+
+ expect(spec?.root).toBe("root");
+ expect(spec?.elements["root"]?.type).toBe("Container");
+ });
+
+ it("ignores non-spec parts", () => {
+ const parts = [
+ { type: "text", text: "Some text" },
+ {
+ type: SPEC_DATA_PART_TYPE,
+ data: {
+ type: "flat",
+ spec: {
+ root: "r",
+ elements: { r: { type: "Text", props: {}, children: [] } },
+ },
+ } satisfies SpecDataPart,
+ },
+ { type: "tool-call", data: {} },
+ ];
+
+ const spec = buildSpecFromParts(parts);
+
+ expect(spec?.root).toBe("r");
+ });
+
+ it("applies patches incrementally", () => {
+ const parts = [
+ {
+ type: SPEC_DATA_PART_TYPE,
+ data: {
+ type: "patch",
+ patch: { op: "add", path: "/root", value: "a" },
+ } satisfies SpecDataPart,
+ },
+ {
+ type: SPEC_DATA_PART_TYPE,
+ data: {
+ type: "patch",
+ patch: {
+ op: "add",
+ path: "/elements/a",
+ value: { type: "Text", props: { n: 1 }, children: [] },
+ },
+ } satisfies SpecDataPart,
+ },
+ {
+ type: SPEC_DATA_PART_TYPE,
+ data: {
+ type: "patch",
+ patch: { op: "replace", path: "/elements/a/props/n", value: 2 },
+ } satisfies SpecDataPart,
+ },
+ ];
+
+ const spec = buildSpecFromParts(parts);
+
+ expect((spec?.elements["a"]?.props as { n: number }).n).toBe(2);
+ });
+
+ it("handles nested spec parts via nestedToFlat", () => {
+ const parts = [
+ {
+ type: SPEC_DATA_PART_TYPE,
+ data: {
+ type: "nested",
+ spec: {
+ type: "Container",
+ props: {},
+ children: [{ type: "Text", props: { t: "x" } }],
+ },
+ } satisfies SpecDataPart,
+ },
+ ];
+
+ const spec = buildSpecFromParts(parts);
+
+ expect(spec).not.toBeNull();
+ expect(Object.keys(spec?.elements ?? {}).length).toBeGreaterThan(0);
+ });
+
+ it("handles mixed patch + flat + nested parts in sequence", () => {
+ const parts = [
+ {
+ type: SPEC_DATA_PART_TYPE,
+ data: {
+ type: "patch",
+ patch: { op: "add", path: "/root", value: "initial" },
+ } satisfies SpecDataPart,
+ },
+ {
+ type: SPEC_DATA_PART_TYPE,
+ data: {
+ type: "flat",
+ spec: {
+ root: "replaced",
+ elements: { replaced: { type: "Box", props: {}, children: [] } },
+ },
+ } satisfies SpecDataPart,
+ },
+ ];
+
+ const spec = buildSpecFromParts(parts);
+
+ expect(spec?.root).toBe("replaced");
+ });
+
+ it("returns empty elements map from empty parts list", () => {
+ const spec = buildSpecFromParts([]);
+
+ expect(spec).toBeNull();
+ });
+});
+
+describe("getTextFromParts", () => {
+ it("extracts text from text parts", () => {
+ const parts = [
+ { type: "text", text: "Hello" },
+ { type: "text", text: "World" },
+ ];
+
+ const text = getTextFromParts(parts);
+
+ expect(text).toBe("Hello\n\nWorld");
+ });
+
+ it("returns empty string when no text parts", () => {
+ const parts = [
+ { type: "data", data: {} },
+ { type: "tool-call", data: {} },
+ ];
+
+ const text = getTextFromParts(parts);
+
+ expect(text).toBe("");
+ });
+
+ it("ignores non-text parts", () => {
+ const parts = [
+ { type: "text", text: "Keep" },
+ { type: "data", data: {} },
+ { type: "text", text: "This" },
+ ];
+
+ const text = getTextFromParts(parts);
+
+ expect(text).toBe("Keep\n\nThis");
+ });
+
+ it("trims whitespace from text parts", () => {
+ const parts = [
+ { type: "text", text: " Hello " },
+ { type: "text", text: "\n\nWorld\n\n" },
+ ];
+
+ const text = getTextFromParts(parts);
+
+ expect(text).toBe("Hello\n\nWorld");
+ });
+
+ it("skips empty text parts", () => {
+ const parts = [
+ { type: "text", text: "Hello" },
+ { type: "text", text: " " },
+ { type: "text", text: "World" },
+ ];
+
+ const text = getTextFromParts(parts);
+
+ expect(text).toBe("Hello\n\nWorld");
+ });
+
+ it("ignores text parts with non-string text field", () => {
+ const parts = [
+ { type: "text", text: "Valid" },
+ { type: "text", text: 123 as unknown as string },
+ { type: "text", text: "Also Valid" },
+ ];
+
+ const text = getTextFromParts(parts);
+
+ expect(text).toBe("Valid\n\nAlso Valid");
+ });
+});
diff --git a/packages/svelte/svelte.config.js b/packages/svelte/svelte.config.js
new file mode 100644
index 00000000..4abe94e8
--- /dev/null
+++ b/packages/svelte/svelte.config.js
@@ -0,0 +1,6 @@
+/** @type {import('@sveltejs/package').Config} */
+export default {
+ compilerOptions: {
+ runes: true, // ensure no legacy syntax sneaks into this code base
+ },
+};
diff --git a/packages/svelte/tsconfig.json b/packages/svelte/tsconfig.json
new file mode 100644
index 00000000..9dacbd5c
--- /dev/null
+++ b/packages/svelte/tsconfig.json
@@ -0,0 +1,11 @@
+{
+ "extends": "@internal/typescript-config/base.json",
+ "compilerOptions": {
+ "outDir": "dist",
+ "rootDir": "src",
+ "types": ["svelte"],
+ "verbatimModuleSyntax": true
+ },
+ "include": ["src"],
+ "exclude": ["node_modules", "dist", "./**/*.test.ts"]
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index e3388a2c..37573fa6 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -11,15 +11,21 @@ importers:
'@changesets/cli':
specifier: 2.29.8
version: 2.29.8(@types/node@22.19.6)
+ '@sveltejs/vite-plugin-svelte':
+ specifier: ^6.2.4
+ version: 6.2.4(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
'@testing-library/dom':
specifier: ^10.4.1
version: 10.4.1
'@testing-library/react':
specifier: ^16.3.1
- version: 16.3.1(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@testing-library/svelte':
+ specifier: ^5.2.0
+ version: 5.3.1(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.17(@opentelemetry/api@1.9.0)(@types/node@22.19.6)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.31.1)(msw@2.12.10(@types/node@22.19.6)(typescript@5.9.2))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
'@types/react':
specifier: ^19.2.3
- version: 19.2.3
+ version: 19.2.14
husky:
specifier: ^9.1.7
version: 9.1.7
@@ -38,6 +44,9 @@ importers:
react-dom:
specifier: ^19.2.4
version: 19.2.4(react@19.2.4)
+ svelte:
+ specifier: ^5.0.0
+ version: 5.53.5
turbo:
specifier: ^2.7.4
version: 2.7.4
@@ -46,13 +55,13 @@ importers:
version: 5.9.2
vitest:
specifier: ^4.0.17
- version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@22.19.6)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(msw@2.12.10(@types/node@22.19.6)(typescript@5.9.2))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+ version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@22.19.6)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.31.1)(msw@2.12.10(@types/node@22.19.6)(typescript@5.9.2))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
apps/web:
dependencies:
'@ai-sdk/gateway':
specifier: ^3.0.13
- version: 3.0.13(zod@4.3.5)
+ version: 3.0.55(zod@4.3.5)
'@ai-sdk/react':
specifier: 3.0.79
version: 3.0.79(react@19.2.3)(zod@4.3.5)
@@ -94,19 +103,19 @@ importers:
version: 1.36.1
'@vercel/analytics':
specifier: ^1.6.1
- version: 1.6.1(next@16.1.1(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(vue@3.5.29(typescript@5.9.2))
+ version: 1.6.1(@sveltejs/kit@2.53.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.2)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(next@16.1.1(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(svelte@5.53.5)(vue@3.5.29(typescript@5.9.2))
'@vercel/speed-insights':
specifier: ^1.3.1
- version: 1.3.1(next@16.1.1(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(vue@3.5.29(typescript@5.9.2))
+ version: 1.3.1(@sveltejs/kit@2.53.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.2)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(next@16.1.1(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(svelte@5.53.5)(vue@3.5.29(typescript@5.9.2))
'@visual-json/react':
specifier: 0.1.1
version: 0.1.1(react@19.2.3)
ai:
specifier: ^6.0.33
- version: 6.0.33(zod@4.3.5)
+ version: 6.0.100(zod@4.3.5)
bash-tool:
specifier: 1.3.14
- version: 1.3.14(ai@6.0.33(zod@4.3.5))(just-bash@2.9.6)
+ version: 1.3.14(ai@6.0.100(zod@4.3.5))(just-bash@2.9.6)
class-variance-authority:
specifier: ^0.7.1
version: 0.7.1
@@ -157,7 +166,7 @@ importers:
version: 2.1.0(react@19.2.3)
tailwind-merge:
specifier: ^3.4.0
- version: 3.4.0
+ version: 3.5.0
unist-util-visit:
specifier: 5.1.0
version: 5.1.0
@@ -197,7 +206,7 @@ importers:
version: 8.5.6
tailwindcss:
specifier: ^4.1.18
- version: 4.1.18
+ version: 4.2.1
tw-animate-css:
specifier: ^1.4.0
version: 1.4.0
@@ -209,7 +218,7 @@ importers:
dependencies:
'@ai-sdk/gateway':
specifier: ^3.0.13
- version: 3.0.42(zod@4.3.5)
+ version: 3.0.55(zod@4.3.5)
'@ai-sdk/react':
specifier: ^3.0.84
version: 3.0.84(react@19.2.4)(zod@4.3.5)
@@ -233,7 +242,7 @@ importers:
version: 1.0.2(react@19.2.4)
ai:
specifier: ^6.0.33
- version: 6.0.82(zod@4.3.5)
+ version: 6.0.100(zod@4.3.5)
class-variance-authority:
specifier: ^0.7.1
version: 0.7.1
@@ -269,7 +278,7 @@ importers:
version: 2.2.0(react@19.2.4)
tailwind-merge:
specifier: ^3.4.0
- version: 3.4.0
+ version: 3.5.0
three:
specifier: ^0.182.0
version: 0.182.0
@@ -303,19 +312,19 @@ importers:
version: 8.5.6
tailwindcss:
specifier: ^4.1.18
- version: 4.1.18
+ version: 4.2.1
tw-animate-css:
specifier: ^1.4.0
version: 1.4.0
typescript:
specifier: ^5.7.2
- version: 5.9.2
+ version: 5.9.3
examples/dashboard:
dependencies:
'@ai-sdk/gateway':
specifier: ^3.0.13
- version: 3.0.13(zod@4.3.5)
+ version: 3.0.55(zod@4.3.5)
'@dnd-kit/core':
specifier: 6.3.1
version: 6.3.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
@@ -336,7 +345,7 @@ importers:
version: link:../../packages/react
ai:
specifier: ^6.0.33
- version: 6.0.33(zod@4.3.5)
+ version: 6.0.100(zod@4.3.5)
class-variance-authority:
specifier: ^0.7.1
version: 0.7.1
@@ -378,7 +387,7 @@ importers:
version: 2.0.7(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
tailwind-merge:
specifier: ^3.4.0
- version: 3.4.0
+ version: 3.5.0
vaul:
specifier: ^1.1.2
version: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
@@ -415,7 +424,7 @@ importers:
version: 8.5.6
tailwindcss:
specifier: ^4.1.18
- version: 4.1.18
+ version: 4.2.1
tsx:
specifier: ^4.21.0
version: 4.21.0
@@ -424,7 +433,7 @@ importers:
version: 1.4.0
typescript:
specifier: ^5.7.2
- version: 5.9.2
+ version: 5.9.3
examples/no-ai:
dependencies:
@@ -448,7 +457,7 @@ importers:
version: 0.563.0(react@19.2.4)
next:
specifier: 16.1.6
- version: 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)
+ version: 16.1.6(@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)
radix-ui:
specifier: ^1.4.3
version: 1.4.3(@types/react-dom@19.2.3(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
@@ -463,7 +472,7 @@ importers:
version: 19.2.4(react@19.2.4)
tailwind-merge:
specifier: ^3.4.0
- version: 3.4.1
+ version: 3.5.0
zod:
specifier: 4.3.5
version: 4.3.5
@@ -491,19 +500,19 @@ importers:
version: 8.5.6
tailwindcss:
specifier: ^4.1.18
- version: 4.1.18
+ version: 4.2.1
tw-animate-css:
specifier: ^1.4.0
version: 1.4.0
typescript:
specifier: ^5.7.2
- version: 5.9.2
+ version: 5.9.3
examples/react-native:
dependencies:
'@ai-sdk/gateway':
specifier: ^3.0.39
- version: 3.0.39(zod@4.3.5)
+ version: 3.0.55(zod@4.3.5)
'@expo/vector-icons':
specifier: ^15.0.3
version: 15.0.3(expo-font@14.0.11(expo@54.0.33)(react-native@0.81.4(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
@@ -515,7 +524,7 @@ importers:
version: link:../../packages/react-native
ai:
specifier: ^6.0.77
- version: 6.0.77(zod@4.3.5)
+ version: 6.0.100(zod@4.3.5)
expo:
specifier: ~54.0.33
version: 54.0.33(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.12.0)(react-native@0.81.4(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
@@ -564,7 +573,7 @@ importers:
dependencies:
'@ai-sdk/gateway':
specifier: ^3.0.52
- version: 3.0.52(zod@4.3.5)
+ version: 3.0.55(zod@4.3.5)
'@json-render/core':
specifier: workspace:*
version: link:../../packages/core
@@ -606,7 +615,7 @@ importers:
version: 3.5.0
tailwindcss:
specifier: ^4.1.18
- version: 4.1.18
+ version: 4.2.1
zod:
specifier: 4.3.5
version: 4.3.5
@@ -625,19 +634,19 @@ importers:
version: 19.2.3(@types/react@19.2.3)
shadcn:
specifier: ^3.8.5
- version: 3.8.5(@types/node@22.19.6)(typescript@5.9.2)
+ version: 3.8.5(@types/node@22.19.6)(typescript@5.9.3)
tw-animate-css:
specifier: ^1.4.0
version: 1.4.0
typescript:
specifier: ^5.7.2
- version: 5.9.2
+ version: 5.9.3
examples/remotion:
dependencies:
'@ai-sdk/gateway':
specifier: ^3.0.13
- version: 3.0.13(zod@4.3.5)
+ version: 3.0.55(zod@4.3.5)
'@json-render/core':
specifier: workspace:*
version: link:../../packages/core
@@ -655,7 +664,7 @@ importers:
version: 4.0.418(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
ai:
specifier: ^6.0.70
- version: 6.0.70(zod@4.3.5)
+ version: 6.0.100(zod@4.3.5)
class-variance-authority:
specifier: ^0.7.1
version: 0.7.1
@@ -682,7 +691,7 @@ importers:
version: 3.21.0
tailwind-merge:
specifier: ^3.4.0
- version: 3.4.0
+ version: 3.5.0
zod:
specifier: ^4.0.0
version: 4.3.5
@@ -707,22 +716,22 @@ importers:
version: 8.5.6
tailwindcss:
specifier: ^4.1.18
- version: 4.1.18
+ version: 4.2.1
typescript:
specifier: ^5.7.2
- version: 5.9.2
+ version: 5.9.3
examples/stripe-app/api:
dependencies:
'@ai-sdk/gateway':
specifier: ^3.0.50
- version: 3.0.50(zod@4.3.6)
+ version: 3.0.55(zod@4.3.6)
ai:
specifier: ^6.0.91
- version: 6.0.91(zod@4.3.6)
+ version: 6.0.100(zod@4.3.6)
next:
specifier: ^16.1.6
- version: 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)
+ version: 16.1.6(@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)
react:
specifier: ^19.1.0
version: 19.2.4
@@ -735,10 +744,10 @@ importers:
version: 22.19.6
'@types/react':
specifier: ^19.1.0
- version: 19.2.3
+ version: 19.2.14
typescript:
specifier: ^5.4.5
- version: 5.9.2
+ version: 5.9.3
examples/stripe-app/drawer-app:
dependencies:
@@ -796,6 +805,104 @@ importers:
specifier: ^9.39.0
version: 9.39.2(jiti@2.6.1)
+ examples/svelte:
+ dependencies:
+ '@json-render/core':
+ specifier: workspace:*
+ version: link:../../packages/core
+ '@json-render/svelte':
+ specifier: workspace:*
+ version: link:../../packages/svelte
+ svelte:
+ specifier: ^5.49.2
+ version: 5.53.5
+ zod:
+ specifier: 4.3.5
+ version: 4.3.5
+ devDependencies:
+ '@sveltejs/vite-plugin-svelte':
+ specifier: ^6.2.4
+ version: 6.2.4(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
+ svelte-check:
+ specifier: ^4.3.6
+ version: 4.4.3(picomatch@4.0.3)(svelte@5.53.5)(typescript@5.9.3)
+ typescript:
+ specifier: ^5.9.3
+ version: 5.9.3
+ vite:
+ specifier: ^7.3.1
+ version: 7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+
+ examples/svelte-chat:
+ dependencies:
+ '@ai-sdk/gateway':
+ specifier: ^3.0.46
+ version: 3.0.55(zod@4.3.5)
+ '@ai-sdk/svelte':
+ specifier: ^4.0.96
+ version: 4.0.100(svelte@5.53.5)(zod@4.3.5)
+ '@json-render/core':
+ specifier: workspace:*
+ version: link:../../packages/core
+ '@json-render/svelte':
+ specifier: workspace:*
+ version: link:../../packages/svelte
+ ai:
+ specifier: ^6.0.86
+ version: 6.0.100(zod@4.3.5)
+ clsx:
+ specifier: ^2.1.1
+ version: 2.1.1
+ lucide-svelte:
+ specifier: ^0.500.0
+ version: 0.500.0(svelte@5.53.5)
+ tailwind-merge:
+ specifier: ^3.2.0
+ version: 3.5.0
+ zod:
+ specifier: 4.3.5
+ version: 4.3.5
+ devDependencies:
+ '@internationalized/date':
+ specifier: ^3.10.0
+ version: 3.11.0
+ '@lucide/svelte':
+ specifier: ^0.561.0
+ version: 0.561.0(svelte@5.53.5)
+ '@sveltejs/adapter-auto':
+ specifier: ^7.0.0
+ version: 7.0.1(@sveltejs/kit@2.53.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))
+ '@sveltejs/kit':
+ specifier: ^2.50.2
+ version: 2.53.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
+ '@sveltejs/vite-plugin-svelte':
+ specifier: ^6.2.4
+ version: 6.2.4(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
+ '@tailwindcss/vite':
+ specifier: ^4.0.0
+ version: 4.2.1(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
+ bits-ui:
+ specifier: ^2.14.4
+ version: 2.16.2(@internationalized/date@3.11.0)(@sveltejs/kit@2.53.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)
+ svelte:
+ specifier: ^5.49.2
+ version: 5.53.5
+ svelte-check:
+ specifier: ^4.3.6
+ version: 4.4.3(picomatch@4.0.3)(svelte@5.53.5)(typescript@5.9.3)
+ tailwind-variants:
+ specifier: ^3.2.2
+ version: 3.2.2(tailwind-merge@3.5.0)(tailwindcss@4.2.1)
+ tailwindcss:
+ specifier: ^4.0.0
+ version: 4.2.1
+ typescript:
+ specifier: ^5.9.3
+ version: 5.9.3
+ vite:
+ specifier: ^7.3.1
+ version: 7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+
examples/vite-renderers:
dependencies:
'@json-render/core':
@@ -804,6 +911,9 @@ importers:
'@json-render/react':
specifier: workspace:*
version: link:../../packages/react
+ '@json-render/svelte':
+ specifier: workspace:*
+ version: link:../../packages/svelte
'@json-render/vue':
specifier: workspace:*
version: link:../../packages/vue
@@ -813,13 +923,19 @@ importers:
react-dom:
specifier: ^19.2.4
version: 19.2.4(react@19.2.4)
+ svelte:
+ specifier: ^5.49.2
+ version: 5.53.5
vue:
specifier: ^3.5.29
version: 3.5.29(typescript@5.9.3)
zod:
- specifier: ^4.3.6
- version: 4.3.6
+ specifier: 4.3.5
+ version: 4.3.5
devDependencies:
+ '@sveltejs/vite-plugin-svelte':
+ specifier: ^6.2.4
+ version: 6.2.4(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
'@types/react':
specifier: ^19.2.14
version: 19.2.14
@@ -828,16 +944,16 @@ importers:
version: 19.2.3(@types/react@19.2.14)
'@vitejs/plugin-react':
specifier: ^5.1.4
- version: 5.1.4(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
+ version: 5.1.4(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
'@vitejs/plugin-vue':
specifier: ^6.0.4
- version: 6.0.4(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.29(typescript@5.9.3))
+ version: 6.0.4(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.29(typescript@5.9.3))
typescript:
specifier: ^5.9.3
version: 5.9.3
vite:
specifier: ^7.3.1
- version: 7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+ version: 7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
examples/vue:
dependencies:
@@ -851,18 +967,18 @@ importers:
specifier: ^3.5.0
version: 3.5.29(typescript@5.9.3)
zod:
- specifier: ^4.3.6
- version: 4.3.6
+ specifier: 4.3.5
+ version: 4.3.5
devDependencies:
'@vitejs/plugin-vue':
specifier: ^6.0.4
- version: 6.0.4(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.29(typescript@5.9.3))
+ version: 6.0.4(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.29(typescript@5.9.3))
typescript:
specifier: ^5.9.3
version: 5.9.3
vite:
specifier: ^7.3.1
- version: 7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+ version: 7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
vue-tsc:
specifier: ^3.2.5
version: 3.2.5(typescript@5.9.3)
@@ -878,10 +994,10 @@ importers:
version: link:../typescript-config
tsup:
specifier: ^8.0.2
- version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.2)(yaml@2.8.2)
+ version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2)
typescript:
specifier: ^5.4.5
- version: 5.9.2
+ version: 5.9.3
packages/core:
dependencies:
@@ -894,10 +1010,10 @@ importers:
version: link:../typescript-config
tsup:
specifier: ^8.0.2
- version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.2)(yaml@2.8.2)
+ version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2)
typescript:
specifier: ^5.4.5
- version: 5.9.2
+ version: 5.9.3
packages/eslint-config:
devDependencies:
@@ -930,10 +1046,10 @@ importers:
version: 16.5.0
typescript:
specifier: ^5.9.2
- version: 5.9.2
+ version: 5.9.3
typescript-eslint:
specifier: ^8.50.0
- version: 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.2)
+ version: 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
packages/jotai:
dependencies:
@@ -949,10 +1065,10 @@ importers:
version: 2.18.0(@babel/core@7.29.0)(@babel/template@7.28.6)(@types/react@19.2.14)(react@19.2.4)
tsup:
specifier: ^8.0.2
- version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.2)(yaml@2.8.2)
+ version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2)
typescript:
specifier: ^5.4.5
- version: 5.9.2
+ version: 5.9.3
packages/react:
dependencies:
@@ -961,7 +1077,7 @@ importers:
version: link:../core
react:
specifier: ^19.2.3
- version: 19.2.3
+ version: 19.2.4
devDependencies:
'@internal/react-state':
specifier: workspace:*
@@ -974,10 +1090,10 @@ importers:
version: 19.2.3
tsup:
specifier: ^8.0.2
- version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.2)(yaml@2.8.2)
+ version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2)
typescript:
specifier: ^5.4.5
- version: 5.9.2
+ version: 5.9.3
packages/react-native:
dependencies:
@@ -1002,10 +1118,10 @@ importers:
version: 0.83.1(@babel/core@7.29.0)(@types/react@19.2.3)(react@19.2.4)
tsup:
specifier: ^8.0.2
- version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.2)(yaml@2.8.2)
+ version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2)
typescript:
specifier: ^5.4.5
- version: 5.9.2
+ version: 5.9.3
zod:
specifier: ^4.0.0
version: 4.3.5
@@ -1033,10 +1149,10 @@ importers:
version: 19.2.3
tsup:
specifier: ^8.0.2
- version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.2)(yaml@2.8.2)
+ version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2)
typescript:
specifier: ^5.4.5
- version: 5.9.2
+ version: 5.9.3
zod:
specifier: ^4.0.0
version: 4.3.5
@@ -1064,10 +1180,10 @@ importers:
version: 19.2.4(react@19.2.4)
tsup:
specifier: ^8.0.2
- version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.2)(yaml@2.8.2)
+ version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2)
typescript:
specifier: ^5.4.5
- version: 5.9.2
+ version: 5.9.3
packages/redux:
dependencies:
@@ -1086,10 +1202,10 @@ importers:
version: 5.0.1
tsup:
specifier: ^8.0.2
- version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.2)(yaml@2.8.2)
+ version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2)
typescript:
specifier: ^5.4.5
- version: 5.9.2
+ version: 5.9.3
packages/remotion:
dependencies:
@@ -1098,7 +1214,7 @@ importers:
version: link:../core
react:
specifier: ^19.2.3
- version: 19.2.3
+ version: 19.2.4
devDependencies:
'@internal/typescript-config':
specifier: workspace:*
@@ -1108,13 +1224,13 @@ importers:
version: 19.2.3
remotion:
specifier: 4.0.418
- version: 4.0.418(react-dom@19.2.4(react@19.2.3))(react@19.2.3)
+ version: 4.0.418(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
tsup:
specifier: ^8.0.2
- version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.2)(yaml@2.8.2)
+ version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2)
typescript:
specifier: ^5.4.5
- version: 5.9.2
+ version: 5.9.3
zod:
specifier: ^4.0.0
version: 4.3.5
@@ -1150,10 +1266,10 @@ importers:
version: 19.2.4(react@19.2.4)
tailwind-merge:
specifier: ^3.4.1
- version: 3.4.1
+ version: 3.5.0
tailwindcss:
specifier: ^4.0.0
- version: 4.1.18
+ version: 4.2.1
vaul:
specifier: ^1.1.2
version: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
@@ -1166,14 +1282,39 @@ importers:
version: 19.2.3
tsup:
specifier: ^8.0.2
- version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.2)(yaml@2.8.2)
+ version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2)
typescript:
specifier: ^5.4.5
- version: 5.9.2
+ version: 5.9.3
zod:
specifier: ^4.0.0
version: 4.3.5
+ packages/svelte:
+ dependencies:
+ '@json-render/core':
+ specifier: workspace:*
+ version: link:../core
+ devDependencies:
+ '@internal/typescript-config':
+ specifier: workspace:*
+ version: link:../typescript-config
+ '@sveltejs/package':
+ specifier: ^2.3.0
+ version: 2.5.7(svelte@5.53.5)(typescript@5.9.3)
+ '@sveltejs/vite-plugin-svelte':
+ specifier: ^6.2.4
+ version: 6.2.4(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
+ svelte:
+ specifier: ^5.0.0
+ version: 5.53.5
+ svelte-check:
+ specifier: ^4.0.0
+ version: 4.4.3(picomatch@4.0.3)(svelte@5.53.5)(typescript@5.9.3)
+ typescript:
+ specifier: ^5.4.5
+ version: 5.9.3
+
packages/typescript-config: {}
packages/ui:
@@ -1214,7 +1355,7 @@ importers:
version: link:../core
zod:
specifier: ^4.0.0
- version: 4.3.6
+ version: 4.3.5
devDependencies:
'@internal/typescript-config':
specifier: workspace:*
@@ -1224,13 +1365,13 @@ importers:
version: 2.4.6
tsup:
specifier: ^8.0.2
- version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.2)(yaml@2.8.2)
+ version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2)
typescript:
specifier: ^5.4.5
- version: 5.9.2
+ version: 5.9.3
vue:
specifier: ^3.5.0
- version: 3.5.29(typescript@5.9.2)
+ version: 3.5.29(typescript@5.9.3)
packages/xstate:
dependencies:
@@ -1262,10 +1403,10 @@ importers:
version: link:../typescript-config
tsup:
specifier: ^8.0.2
- version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.2)(yaml@2.8.2)
+ version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2)
typescript:
specifier: ^5.4.5
- version: 5.9.2
+ version: 5.9.3
zustand:
specifier: ^5.0.11
version: 5.0.11(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))
@@ -1274,7 +1415,7 @@ importers:
devDependencies:
'@ai-sdk/gateway':
specifier: ^3.0.53
- version: 3.0.53(zod@4.3.5)
+ version: 3.0.55(zod@4.3.5)
'@json-render/core':
specifier: workspace:*
version: link:../../packages/core
@@ -1295,7 +1436,7 @@ importers:
version: 2.11.2(react@19.2.4)
ai:
specifier: ^6.0.97
- version: 6.0.97(zod@4.3.5)
+ version: 6.0.100(zod@4.3.5)
jotai:
specifier: ^2.18.0
version: 2.18.0(@babel/core@7.29.0)(@babel/template@7.28.6)(@types/react@19.2.14)(react@19.2.4)
@@ -1304,7 +1445,7 @@ importers:
version: 5.0.1
vitest:
specifier: ^4.0.17
- version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@22.19.6)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(msw@2.12.10(@types/node@22.19.6)(typescript@5.9.3))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+ version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@22.19.6)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.31.1)(msw@2.12.10(@types/node@22.19.6)(typescript@5.9.3))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
zod:
specifier: ^4.3.5
version: 4.3.5
@@ -1325,18 +1466,6 @@ packages:
'@acemir/cssom@0.9.31':
resolution: {integrity: sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==}
- '@ai-sdk/gateway@3.0.13':
- resolution: {integrity: sha512-g7nE4PFtngOZNZSy1lOPpkC+FAiHxqBJXqyRMEG7NUrEVZlz5goBdtHg1YgWRJIX776JTXAmbOI5JreAKVAsVA==}
- engines: {node: '>=18'}
- peerDependencies:
- zod: ^3.25.76 || ^4.1.8
-
- '@ai-sdk/gateway@3.0.33':
- resolution: {integrity: sha512-elnzKRxkC8ZL3IvOdklavkYTBgJhjP9l8b5MO6WYz1MBoT/0WdJoG3Jp31Olwpzk4hIac7z27S6a4q7DkhzsZg==}
- engines: {node: '>=18'}
- peerDependencies:
- zod: ^3.25.76 || ^4.1.8
-
'@ai-sdk/gateway@3.0.39':
resolution: {integrity: sha512-SeCZBAdDNbWpVUXiYgOAqis22p5MEYfrjRw0hiBa5hM+7sDGYQpMinUjkM8kbPXMkY+AhKLrHleBl+SuqpzlgA==}
engines: {node: '>=18'}
@@ -1349,26 +1478,14 @@ packages:
peerDependencies:
zod: ^3.25.76 || ^4.1.8
- '@ai-sdk/gateway@3.0.50':
- resolution: {integrity: sha512-Jdd1a8VgbD7l7r+COj0h5SuaYRfPvOJ/AO6l0OrmTPEcI2MUQPr3C4JttfpNkcheEN+gOdy0CtZWuG17bW2fjw==}
- engines: {node: '>=18'}
- peerDependencies:
- zod: ^3.25.76 || ^4.1.8
-
'@ai-sdk/gateway@3.0.52':
resolution: {integrity: sha512-lYCXP8T3YnIDiz8DP7loAMT27wnblc3IAYzQ7igg89RCRyTUjk6ffbxHXXQ5Pmv8jrdLF0ZIJnH54Dsr1OCKHg==}
engines: {node: '>=18'}
peerDependencies:
zod: ^3.25.76 || ^4.1.8
- '@ai-sdk/gateway@3.0.53':
- resolution: {integrity: sha512-QT3FEoNARMRlk8JJVR7L98exiK9C8AGfrEJVbRxBT1yIXKs/N19o/+PsjTRVsARgDJNcy9JbJp1FspKucEat0Q==}
- engines: {node: '>=18'}
- peerDependencies:
- zod: ^3.25.76 || ^4.1.8
-
- '@ai-sdk/provider-utils@4.0.13':
- resolution: {integrity: sha512-HHG72BN4d+OWTcq2NwTxOm/2qvk1duYsnhCDtsbYwn/h/4zeqURu1S0+Cn0nY2Ysq9a9HGKvrYuMn9bgFhR2Og==}
+ '@ai-sdk/gateway@3.0.55':
+ resolution: {integrity: sha512-7xMeTJnCjwRwXKVCiv4Ly4qzWvDuW3+W1WIV0X1EFu6W83d4mEhV9bFArto10MeTw40ewuDjrbrZd21mXKohkw==}
engines: {node: '>=18'}
peerDependencies:
zod: ^3.25.76 || ^4.1.8
@@ -1385,20 +1502,6 @@ packages:
peerDependencies:
zod: ^3.25.76 || ^4.1.8
- '@ai-sdk/provider-utils@4.0.5':
- resolution: {integrity: sha512-Ow/X/SEkeExTTc1x+nYLB9ZHK2WUId8+9TlkamAx7Tl9vxU+cKzWx2dwjgMHeCN6twrgwkLrrtqckQeO4mxgVA==}
- engines: {node: '>=18'}
- peerDependencies:
- zod: ^3.25.76 || ^4.1.8
-
- '@ai-sdk/provider@3.0.2':
- resolution: {integrity: sha512-HrEmNt/BH/hkQ7zpi2o6N3k1ZR1QTb7z85WYhYygiTxOQuaml4CMtHCWRbric5WPU+RNsYI7r1EpyVQMKO1pYw==}
- engines: {node: '>=18'}
-
- '@ai-sdk/provider@3.0.7':
- resolution: {integrity: sha512-VkPLrutM6VdA924/mG8OS+5frbVTcu6e046D2bgDo00tehBANR1QBJ/mPcZ9tXMFOsVcm6SQArOregxePzTFPw==}
- engines: {node: '>=18'}
-
'@ai-sdk/provider@3.0.8':
resolution: {integrity: sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ==}
engines: {node: '>=18'}
@@ -1415,6 +1518,11 @@ packages:
peerDependencies:
react: ^18 || ~19.0.1 || ~19.1.2 || ^19.2.1
+ '@ai-sdk/svelte@4.0.100':
+ resolution: {integrity: sha512-sr9vml3DU/KY+zw8eko8LDbF/PsZHPXbJP/+EjdafNCSa3Wm+oUeKY7hzl7wbuX2/Z/i1/f0tnY5wyfTvy+NuQ==}
+ peerDependencies:
+ svelte: ^5.31.0
+
'@alloc/quick-lru@5.2.0':
resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
engines: {node: '>=10'}
@@ -1435,10 +1543,6 @@ packages:
'@babel/code-frame@7.10.4':
resolution: {integrity: sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==}
- '@babel/code-frame@7.28.6':
- resolution: {integrity: sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==}
- engines: {node: '>=6.9.0'}
-
'@babel/code-frame@7.29.0':
resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==}
engines: {node: '>=6.9.0'}
@@ -3119,6 +3223,9 @@ packages:
'@types/node':
optional: true
+ '@internationalized/date@3.11.0':
+ resolution: {integrity: sha512-BOx5huLAWhicM9/ZFs84CzP+V3gBW6vlpM02yzsdYC7TGlZJX1OJiEEHcSayF00Z+3jLlm4w79amvSt6RqKN3Q==}
+
'@isaacs/balanced-match@4.0.1':
resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==}
engines: {node: 20 || >=22}
@@ -3260,6 +3367,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
+
'@manypkg/find-root@1.1.0':
resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==}
@@ -3480,6 +3592,9 @@ packages:
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'}
+ '@polka/url@1.0.0-next.29':
+ resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==}
+
'@radix-ui/number@1.1.1':
resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==}
@@ -4793,42 +4908,123 @@ packages:
'@stripe/ui-extension-tools@0.0.1':
resolution: {integrity: sha512-0pOgQ3AuEUeypAgAhcJbyC9QxMaMW1OqzzxkCO4a+5ALDyIFEA6M4jDQ3H9KayNwqQ23qq+PQ0rlYY7dRACNgA==}
+ '@sveltejs/acorn-typescript@1.0.9':
+ resolution: {integrity: sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==}
+ peerDependencies:
+ acorn: ^8.9.0
+
+ '@sveltejs/adapter-auto@7.0.1':
+ resolution: {integrity: sha512-dvuPm1E7M9NI/+canIQ6KKQDU2AkEefEZ2Dp7cY6uKoPq9Z/PhOXABe526UdW2mN986gjVkuSLkOYIBnS/M2LQ==}
+ peerDependencies:
+ '@sveltejs/kit': ^2.0.0
+
+ '@sveltejs/kit@2.53.2':
+ resolution: {integrity: sha512-M+MqAvFve12T1HWws/2npP/s3hFtyjw3GB/OXW/8a1jZBk48qnvPJrtgE+VOMc3RnjUMxc4mv/vQ73nvj2uNMg==}
+ 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@5.0.2':
+ resolution: {integrity: sha512-TZzRTcEtZffICSAoZGkPSl6Etsj2torOVrx6Uw0KpXxrec9Gg6jFWQ60Q3+LmNGfZSxHRCZL7vXVZIWmuV50Ig==}
+ engines: {node: ^20.19 || ^22.12 || >=24}
+ peerDependencies:
+ '@sveltejs/vite-plugin-svelte': ^6.0.0-next.0
+ svelte: ^5.0.0
+ vite: ^6.3.0 || ^7.0.0
+
+ '@sveltejs/vite-plugin-svelte@6.2.4':
+ resolution: {integrity: sha512-ou/d51QSdTyN26D7h6dSpusAKaZkAiGM55/AKYi+9AGZw7q85hElbjK3kEyzXHhLSnRISHOYzVge6x0jRZ7DXA==}
+ engines: {node: ^20.19 || ^22.12 || >=24}
+ peerDependencies:
+ svelte: ^5.0.0
+ vite: ^6.3.0 || ^7.0.0
+
'@swc/helpers@0.5.15':
resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
'@tailwindcss/node@4.1.18':
resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==}
+ '@tailwindcss/node@4.2.1':
+ resolution: {integrity: sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==}
+
'@tailwindcss/oxide-android-arm64@4.1.18':
resolution: {integrity: sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [android]
+ '@tailwindcss/oxide-android-arm64@4.2.1':
+ resolution: {integrity: sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [android]
+
'@tailwindcss/oxide-darwin-arm64@4.1.18':
resolution: {integrity: sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
+ '@tailwindcss/oxide-darwin-arm64@4.2.1':
+ resolution: {integrity: sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [darwin]
+
'@tailwindcss/oxide-darwin-x64@4.1.18':
resolution: {integrity: sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
+ '@tailwindcss/oxide-darwin-x64@4.2.1':
+ resolution: {integrity: sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [darwin]
+
'@tailwindcss/oxide-freebsd-x64@4.1.18':
resolution: {integrity: sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [freebsd]
+ '@tailwindcss/oxide-freebsd-x64@4.2.1':
+ resolution: {integrity: sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [freebsd]
+
'@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18':
resolution: {integrity: sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==}
engines: {node: '>= 10'}
cpu: [arm]
os: [linux]
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1':
+ resolution: {integrity: sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw==}
+ engines: {node: '>= 20'}
+ cpu: [arm]
+ os: [linux]
+
'@tailwindcss/oxide-linux-arm64-gnu@4.1.18':
resolution: {integrity: sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==}
engines: {node: '>= 10'}
@@ -4836,6 +5032,13 @@ packages:
os: [linux]
libc: [glibc]
+ '@tailwindcss/oxide-linux-arm64-gnu@4.2.1':
+ resolution: {integrity: sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
'@tailwindcss/oxide-linux-arm64-musl@4.1.18':
resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==}
engines: {node: '>= 10'}
@@ -4843,6 +5046,13 @@ packages:
os: [linux]
libc: [musl]
+ '@tailwindcss/oxide-linux-arm64-musl@4.2.1':
+ resolution: {integrity: sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
'@tailwindcss/oxide-linux-x64-gnu@4.1.18':
resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==}
engines: {node: '>= 10'}
@@ -4850,6 +5060,13 @@ packages:
os: [linux]
libc: [glibc]
+ '@tailwindcss/oxide-linux-x64-gnu@4.2.1':
+ resolution: {integrity: sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
'@tailwindcss/oxide-linux-x64-musl@4.1.18':
resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==}
engines: {node: '>= 10'}
@@ -4857,6 +5074,13 @@ packages:
os: [linux]
libc: [musl]
+ '@tailwindcss/oxide-linux-x64-musl@4.2.1':
+ resolution: {integrity: sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
'@tailwindcss/oxide-wasm32-wasi@4.1.18':
resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==}
engines: {node: '>=14.0.0'}
@@ -4869,31 +5093,64 @@ packages:
- '@emnapi/wasi-threads'
- tslib
+ '@tailwindcss/oxide-wasm32-wasi@4.2.1':
+ resolution: {integrity: sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
+ bundledDependencies:
+ - '@napi-rs/wasm-runtime'
+ - '@emnapi/core'
+ - '@emnapi/runtime'
+ - '@tybys/wasm-util'
+ - '@emnapi/wasi-threads'
+ - tslib
+
'@tailwindcss/oxide-win32-arm64-msvc@4.1.18':
resolution: {integrity: sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
+ '@tailwindcss/oxide-win32-arm64-msvc@4.2.1':
+ resolution: {integrity: sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [win32]
+
'@tailwindcss/oxide-win32-x64-msvc@4.1.18':
resolution: {integrity: sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
+ '@tailwindcss/oxide-win32-x64-msvc@4.2.1':
+ resolution: {integrity: sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [win32]
+
'@tailwindcss/oxide@4.1.18':
resolution: {integrity: sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==}
engines: {node: '>= 10'}
+ '@tailwindcss/oxide@4.2.1':
+ resolution: {integrity: sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==}
+ engines: {node: '>= 20'}
+
'@tailwindcss/postcss@4.1.18':
resolution: {integrity: sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==}
+ '@tailwindcss/vite@4.2.1':
+ resolution: {integrity: sha512-TBf2sJjYeb28jD2U/OhwdW0bbOsxkWPwQ7SrqGf9sVcoYwZj7rkXljroBO9wKBut9XnmQLXanuDUeqQK0lGg/w==}
+ peerDependencies:
+ vite: ^5.2.0 || ^6 || ^7
+
'@testing-library/dom@10.4.1':
resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==}
engines: {node: '>=18'}
- '@testing-library/react@16.3.1':
- resolution: {integrity: sha512-gr4KtAWqIOQoucWYD/f6ki+j5chXfcPc74Col/6poTyqTmn7zRmodWahWRCp8tYd+GMqBonw6hstNzqjbs6gjw==}
+ '@testing-library/react@16.3.2':
+ resolution: {integrity: sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==}
engines: {node: '>=18'}
peerDependencies:
'@testing-library/dom': ^10.0.0
@@ -4907,19 +5164,23 @@ packages:
'@types/react-dom':
optional: true
- '@testing-library/react@16.3.2':
- resolution: {integrity: sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==}
- engines: {node: '>=18'}
+ '@testing-library/svelte-core@1.0.0':
+ resolution: {integrity: sha512-VkUePoLV6oOYwSUvX6ShA8KLnJqZiYMIbP2JW2t0GLWLkJxKGvuH5qrrZBV/X7cXFnLGuFQEC7RheYiZOW68KQ==}
+ engines: {node: '>=16'}
peerDependencies:
- '@testing-library/dom': ^10.0.0
- '@types/react': ^18.0.0 || ^19.0.0
- '@types/react-dom': ^18.0.0 || ^19.0.0
- react: ^18.0.0 || ^19.0.0
- react-dom: ^18.0.0 || ^19.0.0
+ 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:
- '@types/react':
+ vite:
optional: true
- '@types/react-dom':
+ vitest:
optional: true
'@tokenizer/inflate@0.4.1':
@@ -4957,6 +5218,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.2':
resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==}
@@ -5096,6 +5360,9 @@ packages:
'@types/three@0.182.0':
resolution: {integrity: sha512-WByN9V3Sbwbe2OkWuSGyoqQO8Du6yhYaXtXLoA5FkKTUJorZ+yOHBZ35zUUPQXlAKABZmbYp5oAqpA4RBjtJ/Q==}
+ '@types/trusted-types@2.0.7':
+ resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
+
'@types/unist@2.0.11':
resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==}
@@ -5540,14 +5807,8 @@ packages:
resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==}
engines: {node: '>= 14'}
- ai@6.0.33:
- resolution: {integrity: sha512-bVokbmy2E2QF6Efl+5hOJx5MRWoacZ/CZY/y1E+VcewknvGlgaiCzMu8Xgddz6ArFJjiMFNUPHKxAhIePE4rmg==}
- engines: {node: '>=18'}
- peerDependencies:
- zod: ^3.25.76 || ^4.1.8
-
- ai@6.0.70:
- resolution: {integrity: sha512-1Osgqs/HSCqKNQt+u5THWI4sBpHZefiQWZIPv+MRJfIx7tGX34IMtXBDs05tZ6yW2P06fmB03w94UkPXWfdieA==}
+ ai@6.0.100:
+ resolution: {integrity: sha512-BIxhG7M7wvcWCF+IEnZi7WpkRLOM3jR2vJ0mMuohl2UB2i1R/ZUa1cHFel1xI8nWvyUpOoQXKqsM0BAH50EYSQ==}
engines: {node: '>=18'}
peerDependencies:
zod: ^3.25.76 || ^4.1.8
@@ -5564,24 +5825,12 @@ packages:
peerDependencies:
zod: ^3.25.76 || ^4.1.8
- ai@6.0.91:
- resolution: {integrity: sha512-k1/8BusZMhYVxxLZt0BUZzm9HVDCCh117nyWfWUx5xjR2+tWisJbXgysL7EBMq2lgyHwgpA1jDR3tVjWSdWZXw==}
- engines: {node: '>=18'}
- peerDependencies:
- zod: ^3.25.76 || ^4.1.8
-
ai@6.0.94:
resolution: {integrity: sha512-/F9wh262HbK05b/5vILh38JvPiheonT+kBj1L97712E7VPchqmcx7aJuZN3QSk5Pj6knxUJLm2FFpYJI1pHXUA==}
engines: {node: '>=18'}
peerDependencies:
zod: ^3.25.76 || ^4.1.8
- ai@6.0.97:
- resolution: {integrity: sha512-eZIAcBymwGhBwncRH/v9pillZNMeRCDkc4BwcvwXerXd7sxjVxRis3ZNCNCpP02pVH4NLs81ljm4cElC4vbNcQ==}
- engines: {node: '>=18'}
- peerDependencies:
- zod: ^3.25.76 || ^4.1.8
-
ajv-formats@2.1.1:
resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==}
peerDependencies:
@@ -5691,6 +5940,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'}
+
array-buffer-byte-length@1.0.2:
resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==}
engines: {node: '>= 0.4'}
@@ -5752,6 +6005,10 @@ packages:
resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
engines: {node: '>= 0.4'}
+ axobject-query@4.1.0:
+ resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
+ engines: {node: '>= 0.4'}
+
babel-jest@27.5.1:
resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==}
engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
@@ -5883,6 +6140,13 @@ packages:
big.js@5.2.2:
resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==}
+ bits-ui@2.16.2:
+ resolution: {integrity: sha512-bgEpRRF7Ck9nRP1pbuKVxpaSMrz+8Pm0y+dmuvlkrSe+uUwIQECef29y6eslFHM6pCAubUh7STrsTLUUp8fzFQ==}
+ engines: {node: '>=20'}
+ peerDependencies:
+ '@internationalized/date': ^3.8.1
+ svelte: ^5.33.0
+
bl@4.1.0:
resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
@@ -6037,6 +6301,10 @@ packages:
resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
engines: {node: '>= 14.16.0'}
+ chokidar@5.0.0:
+ resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==}
+ engines: {node: '>= 20.19.0'}
+
chownr@1.1.4:
resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
@@ -6232,6 +6500,10 @@ packages:
resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==}
engines: {node: '>=6.6.0'}
+ cookie@0.6.0:
+ resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==}
+ engines: {node: '>= 0.6'}
+
cookie@0.7.2:
resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
engines: {node: '>= 0.6'}
@@ -6414,6 +6686,9 @@ packages:
resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
engines: {node: '>=10'}
+ dedent-js@1.0.1:
+ resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==}
+
dedent@0.7.0:
resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==}
@@ -6497,6 +6772,9 @@ packages:
detect-node-es@1.1.0:
resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
+ devalue@5.6.3:
+ resolution: {integrity: sha512-nc7XjUU/2Lb+SvEFVGcWLiKkzfw8+qHI7zn8WYXKkLMgfGSHbgCEaR6bJpev8Cm6Rmrb19Gfd/tZvGqx9is3wg==}
+
devlop@1.1.0:
resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
@@ -6723,8 +7001,8 @@ packages:
end-of-stream@1.4.5:
resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==}
- enhanced-resolve@5.18.4:
- resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==}
+ enhanced-resolve@5.19.0:
+ resolution: {integrity: sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==}
engines: {node: '>=10.13.0'}
enquirer@2.4.1:
@@ -6921,6 +7199,9 @@ 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}
@@ -6938,6 +7219,9 @@ packages:
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==}
engines: {node: '>=4.0'}
@@ -7899,6 +8183,9 @@ packages:
is-promise@4.0.0:
resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==}
+ 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'}
@@ -8388,30 +8675,60 @@ packages:
cpu: [arm64]
os: [android]
+ lightningcss-android-arm64@1.31.1:
+ resolution: {integrity: sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [android]
+
lightningcss-darwin-arm64@1.30.2:
resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [darwin]
+ lightningcss-darwin-arm64@1.31.1:
+ resolution: {integrity: sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [darwin]
+
lightningcss-darwin-x64@1.30.2:
resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [darwin]
+ lightningcss-darwin-x64@1.31.1:
+ resolution: {integrity: sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [darwin]
+
lightningcss-freebsd-x64@1.30.2:
resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [freebsd]
+ lightningcss-freebsd-x64@1.31.1:
+ resolution: {integrity: sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [freebsd]
+
lightningcss-linux-arm-gnueabihf@1.30.2:
resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==}
engines: {node: '>= 12.0.0'}
cpu: [arm]
os: [linux]
+ lightningcss-linux-arm-gnueabihf@1.31.1:
+ resolution: {integrity: sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm]
+ os: [linux]
+
lightningcss-linux-arm64-gnu@1.30.2:
resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==}
engines: {node: '>= 12.0.0'}
@@ -8419,6 +8736,13 @@ packages:
os: [linux]
libc: [glibc]
+ lightningcss-linux-arm64-gnu@1.31.1:
+ resolution: {integrity: sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
lightningcss-linux-arm64-musl@1.30.2:
resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==}
engines: {node: '>= 12.0.0'}
@@ -8426,6 +8750,13 @@ packages:
os: [linux]
libc: [musl]
+ lightningcss-linux-arm64-musl@1.31.1:
+ resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
lightningcss-linux-x64-gnu@1.30.2:
resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==}
engines: {node: '>= 12.0.0'}
@@ -8433,6 +8764,13 @@ packages:
os: [linux]
libc: [glibc]
+ lightningcss-linux-x64-gnu@1.31.1:
+ resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
lightningcss-linux-x64-musl@1.30.2:
resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==}
engines: {node: '>= 12.0.0'}
@@ -8440,22 +8778,45 @@ packages:
os: [linux]
libc: [musl]
+ lightningcss-linux-x64-musl@1.31.1:
+ resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
lightningcss-win32-arm64-msvc@1.30.2:
resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [win32]
+ lightningcss-win32-arm64-msvc@1.31.1:
+ resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [win32]
+
lightningcss-win32-x64-msvc@1.30.2:
resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [win32]
+ lightningcss-win32-x64-msvc@1.31.1:
+ resolution: {integrity: sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [win32]
+
lightningcss@1.30.2:
resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==}
engines: {node: '>= 12.0.0'}
+ lightningcss@1.31.1:
+ resolution: {integrity: sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==}
+ engines: {node: '>= 12.0.0'}
+
lilconfig@3.1.3:
resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
engines: {node: '>=14'}
@@ -8487,6 +8848,9 @@ packages:
resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==}
engines: {node: '>=8.9.0'}
+ locate-character@3.0.0:
+ resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==}
+
locate-path@5.0.0:
resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
engines: {node: '>=8'}
@@ -8569,6 +8933,11 @@ packages:
peerDependencies:
react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ lucide-svelte@0.500.0:
+ resolution: {integrity: sha512-fdCJ4z9FuMoXk/ZPv4V5JhpMzQuEsoVNARXEPB0/zTX5AXA3l0x6J5sVUy9y6Rxxi3DEFpa5PmMwcXuO/ksOGw==}
+ peerDependencies:
+ svelte: ^3 || ^4 || ^5.0.0-next.42
+
lz-string@1.5.0:
resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
hasBin: true
@@ -8947,6 +9316,10 @@ packages:
resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
engines: {node: '>=4'}
+ mrmime@2.0.1:
+ resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==}
+ engines: {node: '>=10'}
+
ms@2.0.0:
resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
@@ -9482,6 +9855,7 @@ packages:
prebuild-install@7.1.3:
resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==}
engines: {node: '>=10'}
+ deprecated: No longer maintained. Please contact the author of the relevant native addon; alternatives are available.
hasBin: true
prelude-ls@1.2.1:
@@ -9825,6 +10199,10 @@ packages:
resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
engines: {node: '>= 14.18.0'}
+ readdirp@5.0.0:
+ resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==}
+ engines: {node: '>= 20.19.0'}
+
recast@0.23.11:
resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==}
engines: {node: '>= 4'}
@@ -10040,6 +10418,19 @@ packages:
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
+
+ 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'}
@@ -10090,6 +10481,9 @@ packages:
resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==}
engines: {node: '>= 10.13.0'}
+ scule@1.3.0:
+ resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==}
+
section-matter@1.0.0:
resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==}
engines: {node: '>=4'}
@@ -10139,6 +10533,9 @@ packages:
server-only@0.0.1:
resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==}
+ 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'}
@@ -10222,6 +10619,10 @@ packages:
simple-swizzle@0.2.4:
resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==}
+ sirv@3.0.2:
+ resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==}
+ engines: {node: '>=18'}
+
sisteransi@1.0.5:
resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
@@ -10519,6 +10920,30 @@ packages:
peerDependencies:
react: '>=17.0'
+ svelte-check@4.4.3:
+ resolution: {integrity: sha512-4HtdEv2hOoLCEsSXI+RDELk9okP/4sImWa7X02OjMFFOWeSdFF3NFy3vqpw0z+eH9C88J9vxZfUXz/Uv2A1ANw==}
+ 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.51:
+ resolution: {integrity: sha512-YbVMQi5LtQkVGOMdATTY8v3SMtkNjzYtrVDGaN3Bv+0LQ47tGXu/Oc8ryTkcYuEJWTZFJ8G2+2I8ORcQVGt9Ag==}
+ 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.5:
+ resolution: {integrity: sha512-YkqERnF05g8KLdDZwZrF8/i1eSbj6Eoat8Jjr2IfruZz9StLuBqo8sfCSzjosNKd+ZrQ8DkKZDjpO5y3ht1Pow==}
+ engines: {node: '>=18'}
+
svg-arc-to-cubic-bezier@3.2.0:
resolution: {integrity: sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==}
@@ -10530,22 +10955,32 @@ packages:
symbol-tree@3.2.4:
resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
+ tabbable@6.4.0:
+ resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==}
+
tagged-tag@1.0.0:
resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==}
engines: {node: '>=20'}
- tailwind-merge@3.4.0:
- resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==}
-
- tailwind-merge@3.4.1:
- resolution: {integrity: sha512-2OA0rFqWOkITEAOFWSBSApYkDeH9t2B3XSJuI4YztKBzK3mX0737A2qtxDZ7xkw9Zfh0bWl+r34sF3HXV+Ig7Q==}
-
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@4.1.18:
resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==}
+ tailwindcss@4.2.1:
+ resolution: {integrity: sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==}
+
tapable@2.3.0:
resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==}
engines: {node: '>=6'}
@@ -10560,6 +10995,7 @@ packages:
tar@7.5.7:
resolution: {integrity: sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==}
engines: {node: '>=18'}
+ deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
temp-dir@2.0.0:
resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==}
@@ -10677,6 +11113,10 @@ packages:
resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==}
engines: {node: '>=14.16'}
+ totalist@3.0.1:
+ resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
+ engines: {node: '>=6'}
+
tough-cookie@4.1.4:
resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==}
engines: {node: '>=6'}
@@ -11138,6 +11578,14 @@ 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@4.0.17:
resolution: {integrity: sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==}
engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0}
@@ -11485,6 +11933,9 @@ packages:
yoga-layout@3.2.1:
resolution: {integrity: sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==}
+ zimmerframe@1.1.4:
+ resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==}
+
zod-to-json-schema@3.25.1:
resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==}
peerDependencies:
@@ -11546,20 +11997,6 @@ snapshots:
'@acemir/cssom@0.9.31': {}
- '@ai-sdk/gateway@3.0.13(zod@4.3.5)':
- dependencies:
- '@ai-sdk/provider': 3.0.2
- '@ai-sdk/provider-utils': 4.0.5(zod@4.3.5)
- '@vercel/oidc': 3.1.0
- zod: 4.3.5
-
- '@ai-sdk/gateway@3.0.33(zod@4.3.5)':
- dependencies:
- '@ai-sdk/provider': 3.0.7
- '@ai-sdk/provider-utils': 4.0.13(zod@4.3.5)
- '@vercel/oidc': 3.1.0
- zod: 4.3.5
-
'@ai-sdk/gateway@3.0.39(zod@4.3.5)':
dependencies:
'@ai-sdk/provider': 3.0.8
@@ -11574,13 +12011,6 @@ snapshots:
'@vercel/oidc': 3.1.0
zod: 4.3.5
- '@ai-sdk/gateway@3.0.50(zod@4.3.6)':
- dependencies:
- '@ai-sdk/provider': 3.0.8
- '@ai-sdk/provider-utils': 4.0.15(zod@4.3.6)
- '@vercel/oidc': 3.1.0
- zod: 4.3.6
-
'@ai-sdk/gateway@3.0.52(zod@4.3.5)':
dependencies:
'@ai-sdk/provider': 3.0.8
@@ -11588,19 +12018,19 @@ snapshots:
'@vercel/oidc': 3.1.0
zod: 4.3.5
- '@ai-sdk/gateway@3.0.53(zod@4.3.5)':
+ '@ai-sdk/gateway@3.0.55(zod@4.3.5)':
dependencies:
'@ai-sdk/provider': 3.0.8
'@ai-sdk/provider-utils': 4.0.15(zod@4.3.5)
'@vercel/oidc': 3.1.0
zod: 4.3.5
- '@ai-sdk/provider-utils@4.0.13(zod@4.3.5)':
+ '@ai-sdk/gateway@3.0.55(zod@4.3.6)':
dependencies:
- '@ai-sdk/provider': 3.0.7
- '@standard-schema/spec': 1.1.0
- eventsource-parser: 3.0.6
- zod: 4.3.5
+ '@ai-sdk/provider': 3.0.8
+ '@ai-sdk/provider-utils': 4.0.15(zod@4.3.6)
+ '@vercel/oidc': 3.1.0
+ zod: 4.3.6
'@ai-sdk/provider-utils@4.0.14(zod@4.3.5)':
dependencies:
@@ -11623,21 +12053,6 @@ snapshots:
eventsource-parser: 3.0.6
zod: 4.3.6
- '@ai-sdk/provider-utils@4.0.5(zod@4.3.5)':
- dependencies:
- '@ai-sdk/provider': 3.0.2
- '@standard-schema/spec': 1.1.0
- eventsource-parser: 3.0.6
- zod: 4.3.5
-
- '@ai-sdk/provider@3.0.2':
- dependencies:
- json-schema: 0.4.0
-
- '@ai-sdk/provider@3.0.7':
- dependencies:
- json-schema: 0.4.0
-
'@ai-sdk/provider@3.0.8':
dependencies:
json-schema: 0.4.0
@@ -11662,6 +12077,14 @@ snapshots:
transitivePeerDependencies:
- zod
+ '@ai-sdk/svelte@4.0.100(svelte@5.53.5)(zod@4.3.5)':
+ dependencies:
+ '@ai-sdk/provider-utils': 4.0.15(zod@4.3.5)
+ ai: 6.0.100(zod@4.3.5)
+ svelte: 5.53.5
+ transitivePeerDependencies:
+ - zod
+
'@alloc/quick-lru@5.2.0': {}
'@antfu/ni@25.0.0':
@@ -11693,12 +12116,6 @@ snapshots:
dependencies:
'@babel/highlight': 7.25.9
- '@babel/code-frame@7.28.6':
- dependencies:
- '@babel/helper-validator-identifier': 7.28.5
- js-tokens: 4.0.0
- picocolors: 1.1.1
-
'@babel/code-frame@7.29.0':
dependencies:
'@babel/helper-validator-identifier': 7.28.5
@@ -13228,7 +13645,7 @@ snapshots:
glob: 13.0.1
hermes-parser: 0.29.1
jsc-safe-url: 0.2.4
- lightningcss: 1.30.2
+ lightningcss: 1.31.1
minimatch: 9.0.5
postcss: 8.4.49
resolve-from: 5.0.0
@@ -13531,6 +13948,10 @@ snapshots:
optionalDependencies:
'@types/node': 22.19.6
+ '@internationalized/date@3.11.0':
+ dependencies:
+ '@swc/helpers': 0.5.15
+
'@isaacs/balanced-match@4.0.1': {}
'@isaacs/brace-expansion@5.0.1':
@@ -13812,6 +14233,10 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.5
+ '@lucide/svelte@0.561.0(svelte@5.53.5)':
+ dependencies:
+ svelte: 5.53.5
+
'@manypkg/find-root@1.1.0':
dependencies:
'@babel/runtime': 7.28.6
@@ -14018,6 +14443,8 @@ snapshots:
'@pkgjs/parseargs@0.11.0':
optional: true
+ '@polka/url@1.0.0-next.29': {}
+
'@radix-ui/number@1.1.1': {}
'@radix-ui/primitive@1.1.3': {}
@@ -16574,7 +17001,7 @@ snapshots:
'@stripe/ui-extension-tools@0.0.1(@babel/core@7.29.0)(babel-jest@27.5.1(@babel/core@7.29.0))':
dependencies:
'@types/jest': 28.1.8
- '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5)
+ '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@2.6.1))(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5)
'@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@4.9.5)
eslint: 8.57.1
eslint-plugin-react: 7.37.5(eslint@8.57.1)
@@ -16594,56 +17021,181 @@ snapshots:
- ts-node
- utf-8-validate
+ '@sveltejs/acorn-typescript@1.0.9(acorn@8.15.0)':
+ dependencies:
+ acorn: 8.15.0
+
+ '@sveltejs/adapter-auto@7.0.1(@sveltejs/kit@2.53.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))':
+ dependencies:
+ '@sveltejs/kit': 2.53.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
+
+ '@sveltejs/kit@2.53.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.2)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))':
+ dependencies:
+ '@standard-schema/spec': 1.1.0
+ '@sveltejs/acorn-typescript': 1.0.9(acorn@8.15.0)
+ '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
+ '@types/cookie': 0.6.0
+ acorn: 8.15.0
+ cookie: 0.6.0
+ devalue: 5.6.3
+ 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.5
+ vite: 7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+ optionalDependencies:
+ '@opentelemetry/api': 1.9.0
+ typescript: 5.9.2
+ optional: true
+
+ '@sveltejs/kit@2.53.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))':
+ dependencies:
+ '@standard-schema/spec': 1.1.0
+ '@sveltejs/acorn-typescript': 1.0.9(acorn@8.15.0)
+ '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
+ '@types/cookie': 0.6.0
+ acorn: 8.15.0
+ cookie: 0.6.0
+ devalue: 5.6.3
+ 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.5
+ vite: 7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+ optionalDependencies:
+ '@opentelemetry/api': 1.9.0
+ typescript: 5.9.3
+
+ '@sveltejs/package@2.5.7(svelte@5.53.5)(typescript@5.9.3)':
+ dependencies:
+ chokidar: 5.0.0
+ kleur: 4.1.5
+ sade: 1.8.1
+ semver: 7.7.3
+ svelte: 5.53.5
+ svelte2tsx: 0.7.51(svelte@5.53.5)(typescript@5.9.3)
+ transitivePeerDependencies:
+ - typescript
+
+ '@sveltejs/vite-plugin-svelte-inspector@5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))':
+ dependencies:
+ '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
+ obug: 2.1.1
+ svelte: 5.53.5
+ vite: 7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+
+ '@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))':
+ dependencies:
+ '@sveltejs/vite-plugin-svelte-inspector': 5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
+ deepmerge: 4.3.1
+ magic-string: 0.30.21
+ obug: 2.1.1
+ svelte: 5.53.5
+ vite: 7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+ vitefu: 1.1.2(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
+
'@swc/helpers@0.5.15':
dependencies:
tslib: 2.8.1
- '@tailwindcss/node@4.1.18':
+ '@tailwindcss/node@4.1.18':
+ dependencies:
+ '@jridgewell/remapping': 2.3.5
+ enhanced-resolve: 5.19.0
+ jiti: 2.6.1
+ lightningcss: 1.30.2
+ magic-string: 0.30.21
+ source-map-js: 1.2.1
+ tailwindcss: 4.1.18
+
+ '@tailwindcss/node@4.2.1':
dependencies:
'@jridgewell/remapping': 2.3.5
- enhanced-resolve: 5.18.4
+ enhanced-resolve: 5.19.0
jiti: 2.6.1
- lightningcss: 1.30.2
+ lightningcss: 1.31.1
magic-string: 0.30.21
source-map-js: 1.2.1
- tailwindcss: 4.1.18
+ tailwindcss: 4.2.1
'@tailwindcss/oxide-android-arm64@4.1.18':
optional: true
+ '@tailwindcss/oxide-android-arm64@4.2.1':
+ optional: true
+
'@tailwindcss/oxide-darwin-arm64@4.1.18':
optional: true
+ '@tailwindcss/oxide-darwin-arm64@4.2.1':
+ optional: true
+
'@tailwindcss/oxide-darwin-x64@4.1.18':
optional: true
+ '@tailwindcss/oxide-darwin-x64@4.2.1':
+ optional: true
+
'@tailwindcss/oxide-freebsd-x64@4.1.18':
optional: true
+ '@tailwindcss/oxide-freebsd-x64@4.2.1':
+ optional: true
+
'@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18':
optional: true
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1':
+ optional: true
+
'@tailwindcss/oxide-linux-arm64-gnu@4.1.18':
optional: true
+ '@tailwindcss/oxide-linux-arm64-gnu@4.2.1':
+ optional: true
+
'@tailwindcss/oxide-linux-arm64-musl@4.1.18':
optional: true
+ '@tailwindcss/oxide-linux-arm64-musl@4.2.1':
+ optional: true
+
'@tailwindcss/oxide-linux-x64-gnu@4.1.18':
optional: true
+ '@tailwindcss/oxide-linux-x64-gnu@4.2.1':
+ optional: true
+
'@tailwindcss/oxide-linux-x64-musl@4.1.18':
optional: true
+ '@tailwindcss/oxide-linux-x64-musl@4.2.1':
+ optional: true
+
'@tailwindcss/oxide-wasm32-wasi@4.1.18':
optional: true
+ '@tailwindcss/oxide-wasm32-wasi@4.2.1':
+ optional: true
+
'@tailwindcss/oxide-win32-arm64-msvc@4.1.18':
optional: true
+ '@tailwindcss/oxide-win32-arm64-msvc@4.2.1':
+ optional: true
+
'@tailwindcss/oxide-win32-x64-msvc@4.1.18':
optional: true
+ '@tailwindcss/oxide-win32-x64-msvc@4.2.1':
+ optional: true
+
'@tailwindcss/oxide@4.1.18':
optionalDependencies:
'@tailwindcss/oxide-android-arm64': 4.1.18
@@ -16659,6 +17211,21 @@ snapshots:
'@tailwindcss/oxide-win32-arm64-msvc': 4.1.18
'@tailwindcss/oxide-win32-x64-msvc': 4.1.18
+ '@tailwindcss/oxide@4.2.1':
+ optionalDependencies:
+ '@tailwindcss/oxide-android-arm64': 4.2.1
+ '@tailwindcss/oxide-darwin-arm64': 4.2.1
+ '@tailwindcss/oxide-darwin-x64': 4.2.1
+ '@tailwindcss/oxide-freebsd-x64': 4.2.1
+ '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.1
+ '@tailwindcss/oxide-linux-arm64-gnu': 4.2.1
+ '@tailwindcss/oxide-linux-arm64-musl': 4.2.1
+ '@tailwindcss/oxide-linux-x64-gnu': 4.2.1
+ '@tailwindcss/oxide-linux-x64-musl': 4.2.1
+ '@tailwindcss/oxide-wasm32-wasi': 4.2.1
+ '@tailwindcss/oxide-win32-arm64-msvc': 4.2.1
+ '@tailwindcss/oxide-win32-x64-msvc': 4.2.1
+
'@tailwindcss/postcss@4.1.18':
dependencies:
'@alloc/quick-lru': 5.2.0
@@ -16667,9 +17234,16 @@ snapshots:
postcss: 8.5.6
tailwindcss: 4.1.18
+ '@tailwindcss/vite@4.2.1(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))':
+ dependencies:
+ '@tailwindcss/node': 4.2.1
+ '@tailwindcss/oxide': 4.2.1
+ tailwindcss: 4.2.1
+ vite: 7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+
'@testing-library/dom@10.4.1':
dependencies:
- '@babel/code-frame': 7.28.6
+ '@babel/code-frame': 7.29.0
'@babel/runtime': 7.28.6
'@types/aria-query': 5.0.4
aria-query: 5.3.0
@@ -16678,15 +17252,15 @@ snapshots:
picocolors: 1.1.1
pretty-format: 27.5.1
- '@testing-library/react@16.3.1(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
'@babel/runtime': 7.28.6
'@testing-library/dom': 10.4.1
react: 19.2.4
react-dom: 19.2.4(react@19.2.4)
optionalDependencies:
- '@types/react': 19.2.3
- '@types/react-dom': 19.2.3(@types/react@19.2.3)
+ '@types/react': 19.2.14
+ '@types/react-dom': 19.2.3(@types/react@19.2.14)
'@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
@@ -16698,6 +17272,19 @@ snapshots:
'@types/react': 19.2.3
'@types/react-dom': 19.2.3(@types/react@19.2.3)
+ '@testing-library/svelte-core@1.0.0(svelte@5.53.5)':
+ dependencies:
+ svelte: 5.53.5
+
+ '@testing-library/svelte@5.3.1(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.17(@opentelemetry/api@1.9.0)(@types/node@22.19.6)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.31.1)(msw@2.12.10(@types/node@22.19.6)(typescript@5.9.2))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))':
+ dependencies:
+ '@testing-library/dom': 10.4.1
+ '@testing-library/svelte-core': 1.0.0(svelte@5.53.5)
+ svelte: 5.53.5
+ optionalDependencies:
+ vite: 7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+ vitest: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@22.19.6)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.31.1)(msw@2.12.10(@types/node@22.19.6)(typescript@5.9.2))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+
'@tokenizer/inflate@0.4.1':
dependencies:
debug: 4.4.3
@@ -16745,6 +17332,8 @@ snapshots:
'@types/deep-eql': 4.0.2
assertion-error: 2.0.1
+ '@types/cookie@0.6.0': {}
+
'@types/d3-array@3.2.2': {}
'@types/d3-color@3.1.3': {}
@@ -16902,6 +17491,8 @@ snapshots:
fflate: 0.8.2
meshoptimizer: 0.22.0
+ '@types/trusted-types@2.0.7': {}
+
'@types/unist@2.0.11': {}
'@types/unist@3.0.3': {}
@@ -16929,7 +17520,7 @@ snapshots:
'@types/node': 22.19.6
optional: true
- '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5)':
+ '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@2.6.1))(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5)':
dependencies:
'@eslint-community/regexpp': 4.12.2
'@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@4.9.5)
@@ -16948,19 +17539,19 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/eslint-plugin@8.53.0(@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.2))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.2)':
+ '@typescript-eslint/eslint-plugin@8.53.0(@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)':
dependencies:
'@eslint-community/regexpp': 4.12.2
- '@typescript-eslint/parser': 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.2)
+ '@typescript-eslint/parser': 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
'@typescript-eslint/scope-manager': 8.53.0
- '@typescript-eslint/type-utils': 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.2)
- '@typescript-eslint/utils': 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.2)
+ '@typescript-eslint/type-utils': 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
'@typescript-eslint/visitor-keys': 8.53.0
eslint: 9.39.2(jiti@2.6.1)
ignore: 7.0.5
natural-compare: 1.4.0
- ts-api-utils: 2.4.0(typescript@5.9.2)
- typescript: 5.9.2
+ ts-api-utils: 2.4.0(typescript@5.9.3)
+ typescript: 5.9.3
transitivePeerDependencies:
- supports-color
@@ -16976,24 +17567,24 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.2)':
+ '@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)':
dependencies:
'@typescript-eslint/scope-manager': 8.53.0
'@typescript-eslint/types': 8.53.0
- '@typescript-eslint/typescript-estree': 8.53.0(typescript@5.9.2)
+ '@typescript-eslint/typescript-estree': 8.53.0(typescript@5.9.3)
'@typescript-eslint/visitor-keys': 8.53.0
debug: 4.4.3
eslint: 9.39.2(jiti@2.6.1)
- typescript: 5.9.2
+ typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/project-service@8.53.0(typescript@5.9.2)':
+ '@typescript-eslint/project-service@8.53.0(typescript@5.9.3)':
dependencies:
- '@typescript-eslint/tsconfig-utils': 8.53.0(typescript@5.9.2)
+ '@typescript-eslint/tsconfig-utils': 8.53.0(typescript@5.9.3)
'@typescript-eslint/types': 8.53.0
debug: 4.4.3
- typescript: 5.9.2
+ typescript: 5.9.3
transitivePeerDependencies:
- supports-color
@@ -17007,9 +17598,9 @@ snapshots:
'@typescript-eslint/types': 8.53.0
'@typescript-eslint/visitor-keys': 8.53.0
- '@typescript-eslint/tsconfig-utils@8.53.0(typescript@5.9.2)':
+ '@typescript-eslint/tsconfig-utils@8.53.0(typescript@5.9.3)':
dependencies:
- typescript: 5.9.2
+ typescript: 5.9.3
'@typescript-eslint/type-utils@5.62.0(eslint@8.57.1)(typescript@4.9.5)':
dependencies:
@@ -17023,15 +17614,15 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/type-utils@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.2)':
+ '@typescript-eslint/type-utils@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)':
dependencies:
'@typescript-eslint/types': 8.53.0
- '@typescript-eslint/typescript-estree': 8.53.0(typescript@5.9.2)
- '@typescript-eslint/utils': 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.2)
+ '@typescript-eslint/typescript-estree': 8.53.0(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
debug: 4.4.3
eslint: 9.39.2(jiti@2.6.1)
- ts-api-utils: 2.4.0(typescript@5.9.2)
- typescript: 5.9.2
+ ts-api-utils: 2.4.0(typescript@5.9.3)
+ typescript: 5.9.3
transitivePeerDependencies:
- supports-color
@@ -17053,18 +17644,18 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/typescript-estree@8.53.0(typescript@5.9.2)':
+ '@typescript-eslint/typescript-estree@8.53.0(typescript@5.9.3)':
dependencies:
- '@typescript-eslint/project-service': 8.53.0(typescript@5.9.2)
- '@typescript-eslint/tsconfig-utils': 8.53.0(typescript@5.9.2)
+ '@typescript-eslint/project-service': 8.53.0(typescript@5.9.3)
+ '@typescript-eslint/tsconfig-utils': 8.53.0(typescript@5.9.3)
'@typescript-eslint/types': 8.53.0
'@typescript-eslint/visitor-keys': 8.53.0
debug: 4.4.3
minimatch: 9.0.5
semver: 7.7.3
tinyglobby: 0.2.15
- ts-api-utils: 2.4.0(typescript@5.9.2)
- typescript: 5.9.2
+ ts-api-utils: 2.4.0(typescript@5.9.3)
+ typescript: 5.9.3
transitivePeerDependencies:
- supports-color
@@ -17083,14 +17674,14 @@ snapshots:
- supports-color
- typescript
- '@typescript-eslint/utils@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.2)':
+ '@typescript-eslint/utils@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)':
dependencies:
'@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1))
'@typescript-eslint/scope-manager': 8.53.0
'@typescript-eslint/types': 8.53.0
- '@typescript-eslint/typescript-estree': 8.53.0(typescript@5.9.2)
+ '@typescript-eslint/typescript-estree': 8.53.0(typescript@5.9.3)
eslint: 9.39.2(jiti@2.6.1)
- typescript: 5.9.2
+ typescript: 5.9.3
transitivePeerDependencies:
- supports-color
@@ -17138,18 +17729,22 @@ snapshots:
'@use-gesture/core': 10.3.1
react: 19.2.4
- '@vercel/analytics@1.6.1(next@16.1.1(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(vue@3.5.29(typescript@5.9.2))':
+ '@vercel/analytics@1.6.1(@sveltejs/kit@2.53.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.2)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(next@16.1.1(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(svelte@5.53.5)(vue@3.5.29(typescript@5.9.2))':
optionalDependencies:
+ '@sveltejs/kit': 2.53.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.2)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
next: 16.1.1(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
react: 19.2.3
+ svelte: 5.53.5
vue: 3.5.29(typescript@5.9.2)
'@vercel/oidc@3.1.0': {}
- '@vercel/speed-insights@1.3.1(next@16.1.1(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(vue@3.5.29(typescript@5.9.2))':
+ '@vercel/speed-insights@1.3.1(@sveltejs/kit@2.53.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.2)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(next@16.1.1(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(svelte@5.53.5)(vue@3.5.29(typescript@5.9.2))':
optionalDependencies:
+ '@sveltejs/kit': 2.53.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.2)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
next: 16.1.1(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
react: 19.2.3
+ svelte: 5.53.5
vue: 3.5.29(typescript@5.9.2)
'@visual-json/core@0.1.1': {}
@@ -17159,7 +17754,7 @@ snapshots:
'@visual-json/core': 0.1.1
react: 19.2.3
- '@vitejs/plugin-react@5.1.4(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))':
+ '@vitejs/plugin-react@5.1.4(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))':
dependencies:
'@babel/core': 7.29.0
'@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0)
@@ -17167,14 +17762,14 @@ snapshots:
'@rolldown/pluginutils': 1.0.0-rc.3
'@types/babel__core': 7.20.5
react-refresh: 0.18.0
- vite: 7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+ vite: 7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
transitivePeerDependencies:
- supports-color
- '@vitejs/plugin-vue@6.0.4(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.29(typescript@5.9.3))':
+ '@vitejs/plugin-vue@6.0.4(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.29(typescript@5.9.3))':
dependencies:
'@rolldown/pluginutils': 1.0.0-rc.2
- vite: 7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+ vite: 7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
vue: 3.5.29(typescript@5.9.3)
'@vitest/expect@4.0.17':
@@ -17186,23 +17781,23 @@ snapshots:
chai: 6.2.2
tinyrainbow: 3.0.3
- '@vitest/mocker@4.0.17(msw@2.12.10(@types/node@22.19.6)(typescript@5.9.2))(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))':
+ '@vitest/mocker@4.0.17(msw@2.12.10(@types/node@22.19.6)(typescript@5.9.2))(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))':
dependencies:
'@vitest/spy': 4.0.17
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
msw: 2.12.10(@types/node@22.19.6)(typescript@5.9.2)
- vite: 7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+ vite: 7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
- '@vitest/mocker@4.0.17(msw@2.12.10(@types/node@22.19.6)(typescript@5.9.3))(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))':
+ '@vitest/mocker@4.0.17(msw@2.12.10(@types/node@22.19.6)(typescript@5.9.3))(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))':
dependencies:
'@vitest/spy': 4.0.17
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
msw: 2.12.10(@types/node@22.19.6)(typescript@5.9.3)
- vite: 7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+ vite: 7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
'@vitest/pretty-format@4.0.17':
dependencies:
@@ -17299,6 +17894,7 @@ snapshots:
'@vue/compiler-ssr': 3.5.29
'@vue/shared': 3.5.29
vue: 3.5.29(typescript@5.9.2)
+ optional: true
'@vue/server-renderer@3.5.29(vue@3.5.29(typescript@5.9.3))':
dependencies:
@@ -17444,21 +18040,21 @@ snapshots:
agent-base@7.1.4: {}
- ai@6.0.33(zod@4.3.5):
+ ai@6.0.100(zod@4.3.5):
dependencies:
- '@ai-sdk/gateway': 3.0.13(zod@4.3.5)
- '@ai-sdk/provider': 3.0.2
- '@ai-sdk/provider-utils': 4.0.5(zod@4.3.5)
+ '@ai-sdk/gateway': 3.0.55(zod@4.3.5)
+ '@ai-sdk/provider': 3.0.8
+ '@ai-sdk/provider-utils': 4.0.15(zod@4.3.5)
'@opentelemetry/api': 1.9.0
zod: 4.3.5
- ai@6.0.70(zod@4.3.5):
+ ai@6.0.100(zod@4.3.6):
dependencies:
- '@ai-sdk/gateway': 3.0.33(zod@4.3.5)
- '@ai-sdk/provider': 3.0.7
- '@ai-sdk/provider-utils': 4.0.13(zod@4.3.5)
+ '@ai-sdk/gateway': 3.0.55(zod@4.3.6)
+ '@ai-sdk/provider': 3.0.8
+ '@ai-sdk/provider-utils': 4.0.15(zod@4.3.6)
'@opentelemetry/api': 1.9.0
- zod: 4.3.5
+ zod: 4.3.6
ai@6.0.77(zod@4.3.5):
dependencies:
@@ -17476,14 +18072,6 @@ snapshots:
'@opentelemetry/api': 1.9.0
zod: 4.3.5
- ai@6.0.91(zod@4.3.6):
- dependencies:
- '@ai-sdk/gateway': 3.0.50(zod@4.3.6)
- '@ai-sdk/provider': 3.0.8
- '@ai-sdk/provider-utils': 4.0.15(zod@4.3.6)
- '@opentelemetry/api': 1.9.0
- zod: 4.3.6
-
ai@6.0.94(zod@4.3.5):
dependencies:
'@ai-sdk/gateway': 3.0.52(zod@4.3.5)
@@ -17492,14 +18080,6 @@ snapshots:
'@opentelemetry/api': 1.9.0
zod: 4.3.5
- ai@6.0.97(zod@4.3.5):
- dependencies:
- '@ai-sdk/gateway': 3.0.53(zod@4.3.5)
- '@ai-sdk/provider': 3.0.8
- '@ai-sdk/provider-utils': 4.0.15(zod@4.3.5)
- '@opentelemetry/api': 1.9.0
- zod: 4.3.5
-
ajv-formats@2.1.1(ajv@8.17.1):
optionalDependencies:
ajv: 8.17.1
@@ -17590,6 +18170,8 @@ snapshots:
dependencies:
dequal: 2.0.3
+ aria-query@5.3.1: {}
+
array-buffer-byte-length@1.0.2:
dependencies:
call-bound: 1.0.4
@@ -17669,6 +18251,8 @@ snapshots:
dependencies:
possible-typed-array-names: 1.1.0
+ axobject-query@4.1.0: {}
+
babel-jest@27.5.1(@babel/core@7.29.0):
dependencies:
'@babel/core': 7.29.0
@@ -17837,9 +18421,9 @@ snapshots:
baseline-browser-mapping@2.9.14: {}
- bash-tool@1.3.14(ai@6.0.33(zod@4.3.5))(just-bash@2.9.6):
+ bash-tool@1.3.14(ai@6.0.100(zod@4.3.5))(just-bash@2.9.6):
dependencies:
- ai: 6.0.33(zod@4.3.5)
+ ai: 6.0.100(zod@4.3.5)
fast-glob: 3.3.3
gray-matter: 4.0.3
zod: 3.25.76
@@ -17862,6 +18446,19 @@ snapshots:
big.js@5.2.2: {}
+ bits-ui@2.16.2(@internationalized/date@3.11.0)(@sveltejs/kit@2.53.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5):
+ dependencies:
+ '@floating-ui/core': 1.7.4
+ '@floating-ui/dom': 1.7.5
+ '@internationalized/date': 3.11.0
+ esm-env: 1.2.2
+ runed: 0.35.1(@sveltejs/kit@2.53.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)
+ svelte: 5.53.5
+ svelte-toolbelt: 0.10.6(@sveltejs/kit@2.53.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)
+ tabbable: 6.4.0
+ transitivePeerDependencies:
+ - '@sveltejs/kit'
+
bl@4.1.0:
dependencies:
buffer: 5.7.1
@@ -18023,6 +18620,10 @@ snapshots:
dependencies:
readdirp: 4.1.2
+ chokidar@5.0.0:
+ dependencies:
+ readdirp: 5.0.0
+
chownr@1.1.4:
optional: true
@@ -18155,7 +18756,7 @@ snapshots:
compressible@2.0.18:
dependencies:
- mime-db: 1.52.0
+ mime-db: 1.54.0
compression@1.8.1:
dependencies:
@@ -18204,6 +18805,8 @@ snapshots:
cookie-signature@1.2.2: {}
+ cookie@0.6.0: {}
+
cookie@0.7.2: {}
cookie@1.1.1: {}
@@ -18217,14 +18820,14 @@ snapshots:
object-assign: 4.1.1
vary: 1.1.2
- cosmiconfig@9.0.0(typescript@5.9.2):
+ cosmiconfig@9.0.0(typescript@5.9.3):
dependencies:
env-paths: 2.2.1
import-fresh: 3.3.1
js-yaml: 4.1.1
parse-json: 5.2.0
optionalDependencies:
- typescript: 5.9.2
+ typescript: 5.9.3
cross-env@7.0.3:
dependencies:
@@ -18374,6 +18977,8 @@ snapshots:
mimic-response: 3.1.0
optional: true
+ dedent-js@1.0.1: {}
+
dedent@0.7.0: {}
dedent@1.7.1: {}
@@ -18431,6 +19036,8 @@ snapshots:
detect-node-es@1.1.0: {}
+ devalue@5.6.3: {}
+
devlop@1.1.0:
dependencies:
dequal: 2.0.3
@@ -18560,7 +19167,7 @@ snapshots:
dependencies:
once: 1.4.0
- enhanced-resolve@5.18.4:
+ enhanced-resolve@5.19.0:
dependencies:
graceful-fs: 4.2.11
tapable: 2.3.0
@@ -19010,6 +19617,8 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ esm-env@1.2.2: {}
+
espree@10.4.0:
dependencies:
acorn: 8.15.0
@@ -19028,6 +19637,10 @@ snapshots:
dependencies:
estraverse: 5.3.0
+ esrap@2.2.3:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+
esrecurse@4.3.0:
dependencies:
estraverse: 5.3.0
@@ -19822,7 +20435,7 @@ snapshots:
dependencies:
array-union: 2.1.0
dir-glob: 3.0.1
- fast-glob: 3.3.1
+ fast-glob: 3.3.3
ignore: 5.3.2
merge2: 1.4.1
slash: 3.0.0
@@ -20264,6 +20877,10 @@ snapshots:
is-promise@4.0.0: {}
+ is-reference@3.0.3:
+ dependencies:
+ '@types/estree': 1.0.8
+
is-regex@1.2.1:
dependencies:
call-bound: 1.0.4
@@ -21071,36 +21688,69 @@ snapshots:
lightningcss-android-arm64@1.30.2:
optional: true
+ lightningcss-android-arm64@1.31.1:
+ optional: true
+
lightningcss-darwin-arm64@1.30.2:
optional: true
+ lightningcss-darwin-arm64@1.31.1:
+ optional: true
+
lightningcss-darwin-x64@1.30.2:
optional: true
+ lightningcss-darwin-x64@1.31.1:
+ optional: true
+
lightningcss-freebsd-x64@1.30.2:
optional: true
+ lightningcss-freebsd-x64@1.31.1:
+ optional: true
+
lightningcss-linux-arm-gnueabihf@1.30.2:
optional: true
+ lightningcss-linux-arm-gnueabihf@1.31.1:
+ optional: true
+
lightningcss-linux-arm64-gnu@1.30.2:
optional: true
+ lightningcss-linux-arm64-gnu@1.31.1:
+ optional: true
+
lightningcss-linux-arm64-musl@1.30.2:
optional: true
+ lightningcss-linux-arm64-musl@1.31.1:
+ optional: true
+
lightningcss-linux-x64-gnu@1.30.2:
optional: true
+ lightningcss-linux-x64-gnu@1.31.1:
+ optional: true
+
lightningcss-linux-x64-musl@1.30.2:
optional: true
+ lightningcss-linux-x64-musl@1.31.1:
+ optional: true
+
lightningcss-win32-arm64-msvc@1.30.2:
optional: true
+ lightningcss-win32-arm64-msvc@1.31.1:
+ optional: true
+
lightningcss-win32-x64-msvc@1.30.2:
optional: true
+ lightningcss-win32-x64-msvc@1.31.1:
+ optional: true
+
lightningcss@1.30.2:
dependencies:
detect-libc: 2.1.2
@@ -21117,6 +21767,22 @@ snapshots:
lightningcss-win32-arm64-msvc: 1.30.2
lightningcss-win32-x64-msvc: 1.30.2
+ lightningcss@1.31.1:
+ dependencies:
+ detect-libc: 2.1.2
+ optionalDependencies:
+ lightningcss-android-arm64: 1.31.1
+ lightningcss-darwin-arm64: 1.31.1
+ lightningcss-darwin-x64: 1.31.1
+ lightningcss-freebsd-x64: 1.31.1
+ lightningcss-linux-arm-gnueabihf: 1.31.1
+ lightningcss-linux-arm64-gnu: 1.31.1
+ lightningcss-linux-arm64-musl: 1.31.1
+ lightningcss-linux-x64-gnu: 1.31.1
+ lightningcss-linux-x64-musl: 1.31.1
+ lightningcss-win32-arm64-msvc: 1.31.1
+ lightningcss-win32-x64-msvc: 1.31.1
+
lilconfig@3.1.3: {}
linebreak@1.1.0:
@@ -21155,6 +21821,8 @@ snapshots:
emojis-list: 3.0.0
json5: 2.2.3
+ locate-character@3.0.0: {}
+
locate-path@5.0.0:
dependencies:
p-locate: 4.1.0
@@ -21228,6 +21896,10 @@ snapshots:
dependencies:
react: 19.2.4
+ lucide-svelte@0.500.0(svelte@5.53.5):
+ dependencies:
+ svelte: 5.53.5
+
lz-string@1.5.0: {}
maath@0.10.8(@types/three@0.182.0)(three@0.182.0):
@@ -21958,6 +22630,8 @@ snapshots:
mri@1.2.0: {}
+ mrmime@2.0.1: {}
+
ms@2.0.0: {}
ms@2.1.3: {}
@@ -21986,6 +22660,7 @@ snapshots:
typescript: 5.9.2
transitivePeerDependencies:
- '@types/node'
+ optional: true
msw@2.12.10(@types/node@22.19.6)(typescript@5.9.3):
dependencies:
@@ -22011,7 +22686,6 @@ snapshots:
typescript: 5.9.3
transitivePeerDependencies:
- '@types/node'
- optional: true
muggle-string@0.4.1: {}
@@ -22106,6 +22780,32 @@ snapshots:
- '@babel/core'
- babel-plugin-macros
+ next@16.1.6(@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):
+ dependencies:
+ '@next/env': 16.1.6
+ '@swc/helpers': 0.5.15
+ baseline-browser-mapping: 2.9.14
+ caniuse-lite: 1.0.30001764
+ postcss: 8.4.31
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ styled-jsx: 5.1.6(react@19.2.4)
+ optionalDependencies:
+ '@next/swc-darwin-arm64': 16.1.6
+ '@next/swc-darwin-x64': 16.1.6
+ '@next/swc-linux-arm64-gnu': 16.1.6
+ '@next/swc-linux-arm64-musl': 16.1.6
+ '@next/swc-linux-x64-gnu': 16.1.6
+ '@next/swc-linux-x64-musl': 16.1.6
+ '@next/swc-win32-arm64-msvc': 16.1.6
+ '@next/swc-win32-x64-msvc': 16.1.6
+ '@opentelemetry/api': 1.9.0
+ babel-plugin-react-compiler: 1.0.0
+ sharp: 0.34.5
+ transitivePeerDependencies:
+ - '@babel/core'
+ - babel-plugin-macros
+
node-abi@3.87.0:
dependencies:
semver: 7.7.3
@@ -22812,11 +23512,6 @@ snapshots:
react: 19.1.0
scheduler: 0.27.0
- react-dom@19.2.4(react@19.2.3):
- dependencies:
- react: 19.2.3
- scheduler: 0.27.0
-
react-dom@19.2.4(react@19.2.4):
dependencies:
react: 19.2.4
@@ -23207,6 +23902,8 @@ snapshots:
readdirp@4.1.2: {}
+ readdirp@5.0.0: {}
+
recast@0.23.11:
dependencies:
ast-types: 0.16.1
@@ -23406,10 +24103,10 @@ snapshots:
react: 19.2.3
react-dom: 19.2.3(react@19.2.3)
- remotion@4.0.418(react-dom@19.2.4(react@19.2.3))(react@19.2.3):
+ remotion@4.0.418(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
dependencies:
- react: 19.2.3
- react-dom: 19.2.4(react@19.2.3)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
require-directory@2.1.1: {}
@@ -23530,6 +24227,19 @@ snapshots:
dependencies:
queue-microtask: 1.2.3
+ runed@0.35.1(@sveltejs/kit@2.53.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5):
+ dependencies:
+ dequal: 2.0.3
+ esm-env: 1.2.2
+ lz-string: 1.5.0
+ svelte: 5.53.5
+ optionalDependencies:
+ '@sveltejs/kit': 2.53.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
+
+ sade@1.8.1:
+ dependencies:
+ mri: 1.2.0
+
safe-array-concat@1.1.3:
dependencies:
call-bind: 1.0.8
@@ -23586,6 +24296,8 @@ snapshots:
ajv-formats: 2.1.1(ajv@8.17.1)
ajv-keywords: 5.1.0(ajv@8.17.1)
+ scule@1.3.0: {}
+
section-matter@1.0.0:
dependencies:
extend-shallow: 2.0.1
@@ -23661,6 +24373,8 @@ snapshots:
server-only@0.0.1: {}
+ set-cookie-parser@3.0.1: {}
+
set-function-length@1.2.2:
dependencies:
define-data-property: 1.1.4
@@ -23687,7 +24401,7 @@ snapshots:
sf-symbols-typescript@2.2.0: {}
- shadcn@3.8.5(@types/node@22.19.6)(typescript@5.9.2):
+ shadcn@3.8.5(@types/node@22.19.6)(typescript@5.9.3):
dependencies:
'@antfu/ni': 25.0.0
'@babel/core': 7.29.0
@@ -23699,7 +24413,7 @@ snapshots:
'@types/validate-npm-package-name': 4.0.2
browserslist: 4.28.1
commander: 14.0.2
- cosmiconfig: 9.0.0(typescript@5.9.2)
+ cosmiconfig: 9.0.0(typescript@5.9.3)
dedent: 1.7.1
deepmerge: 4.3.1
diff: 8.0.3
@@ -23709,7 +24423,7 @@ snapshots:
fuzzysort: 3.1.0
https-proxy-agent: 7.0.6
kleur: 4.1.5
- msw: 2.12.10(@types/node@22.19.6)(typescript@5.9.2)
+ msw: 2.12.10(@types/node@22.19.6)(typescript@5.9.3)
node-fetch: 3.3.2
open: 11.0.0
ora: 8.2.0
@@ -23838,6 +24552,12 @@ snapshots:
dependencies:
is-arrayish: 0.3.4
+ sirv@3.0.2:
+ dependencies:
+ '@polka/url': 1.0.0-next.29
+ mrmime: 2.0.1
+ totalist: 3.0.1
+
sisteransi@1.0.5: {}
slash@3.0.0: {}
@@ -23943,7 +24663,7 @@ snapshots:
remark-parse: 11.0.0
remark-rehype: 11.1.2
remend: 1.1.0
- tailwind-merge: 3.4.1
+ tailwind-merge: 3.5.0
unified: 11.0.5
unist-util-visit: 5.1.0
transitivePeerDependencies:
@@ -23963,7 +24683,7 @@ snapshots:
remark-parse: 11.0.0
remark-rehype: 11.1.2
remend: 1.2.0
- tailwind-merge: 3.4.1
+ tailwind-merge: 3.5.0
unified: 11.0.5
unist-util-visit: 5.1.0
unist-util-visit-parents: 6.0.2
@@ -24126,6 +24846,11 @@ snapshots:
client-only: 0.0.1
react: 19.2.3
+ styled-jsx@5.1.6(react@19.2.4):
+ dependencies:
+ client-only: 0.0.1
+ react: 19.2.4
+
sucrase@3.35.1:
dependencies:
'@jridgewell/gen-mapping': 0.3.13
@@ -24159,6 +24884,53 @@ snapshots:
dependencies:
react: 19.2.4
+ svelte-check@4.4.3(picomatch@4.0.3)(svelte@5.53.5)(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.5
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - picomatch
+
+ svelte-toolbelt@0.10.6(@sveltejs/kit@2.53.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5):
+ dependencies:
+ clsx: 2.1.1
+ runed: 0.35.1(@sveltejs/kit@2.53.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.5)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.5)
+ style-to-object: 1.0.14
+ svelte: 5.53.5
+ transitivePeerDependencies:
+ - '@sveltejs/kit'
+
+ svelte2tsx@0.7.51(svelte@5.53.5)(typescript@5.9.3):
+ dependencies:
+ dedent-js: 1.0.1
+ scule: 1.3.0
+ svelte: 5.53.5
+ typescript: 5.9.3
+
+ svelte@5.53.5:
+ dependencies:
+ '@jridgewell/remapping': 2.3.5
+ '@jridgewell/sourcemap-codec': 1.5.5
+ '@sveltejs/acorn-typescript': 1.0.9(acorn@8.15.0)
+ '@types/estree': 1.0.8
+ '@types/trusted-types': 2.0.7
+ acorn: 8.15.0
+ aria-query: 5.3.1
+ axobject-query: 4.1.0
+ clsx: 2.1.1
+ devalue: 5.6.3
+ 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
+
svg-arc-to-cubic-bezier@3.2.0: {}
swr@2.4.0(react@19.2.3):
@@ -24175,16 +24947,22 @@ snapshots:
symbol-tree@3.2.4: {}
- tagged-tag@1.0.0: {}
-
- tailwind-merge@3.4.0: {}
+ tabbable@6.4.0: {}
- tailwind-merge@3.4.1: {}
+ tagged-tag@1.0.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@4.1.18: {}
+ tailwindcss@4.2.1: {}
+
tapable@2.3.0: {}
tar-fs@2.1.4:
@@ -24324,6 +25102,8 @@ snapshots:
'@tokenizer/token': 0.3.0
ieee754: 1.2.1
+ totalist@3.0.1: {}
+
tough-cookie@4.1.4:
dependencies:
psl: 1.15.0
@@ -24367,9 +25147,9 @@ snapshots:
trough@2.2.0: {}
- ts-api-utils@2.4.0(typescript@5.9.2):
+ ts-api-utils@2.4.0(typescript@5.9.3):
dependencies:
- typescript: 5.9.2
+ typescript: 5.9.3
ts-interface-checker@0.1.13: {}
@@ -24405,34 +25185,6 @@ snapshots:
tslib@2.8.1: {}
- tsup@8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.2)(yaml@2.8.2):
- dependencies:
- bundle-require: 5.1.0(esbuild@0.27.2)
- cac: 6.7.14
- chokidar: 4.0.3
- consola: 3.4.2
- debug: 4.4.3
- esbuild: 0.27.2
- fix-dts-default-cjs-exports: 1.0.1
- joycon: 3.1.1
- picocolors: 1.1.1
- postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(yaml@2.8.2)
- resolve-from: 5.0.0
- rollup: 4.55.1
- source-map: 0.7.6
- sucrase: 3.35.1
- tinyexec: 0.3.2
- tinyglobby: 0.2.15
- tree-kill: 1.2.2
- optionalDependencies:
- postcss: 8.5.6
- typescript: 5.9.2
- transitivePeerDependencies:
- - jiti
- - supports-color
- - tsx
- - yaml
-
tsup@8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2):
dependencies:
bundle-require: 5.1.0(esbuild@0.27.2)
@@ -24578,14 +25330,14 @@ snapshots:
dependencies:
is-typedarray: 1.0.0
- typescript-eslint@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.2):
+ typescript-eslint@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3):
dependencies:
- '@typescript-eslint/eslint-plugin': 8.53.0(@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.2))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.2)
- '@typescript-eslint/parser': 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.2)
- '@typescript-eslint/typescript-estree': 8.53.0(typescript@5.9.2)
- '@typescript-eslint/utils': 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.2)
+ '@typescript-eslint/eslint-plugin': 8.53.0(@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/parser': 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/typescript-estree': 8.53.0(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
eslint: 9.39.2(jiti@2.6.1)
- typescript: 5.9.2
+ typescript: 5.9.3
transitivePeerDependencies:
- supports-color
@@ -24854,7 +25606,7 @@ snapshots:
string_decoder: 1.3.0
util-deprecate: 1.0.2
- vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2):
+ vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2):
dependencies:
esbuild: 0.27.2
fdir: 6.5.0(picomatch@4.0.3)
@@ -24866,15 +25618,19 @@ snapshots:
'@types/node': 22.19.6
fsevents: 2.3.3
jiti: 2.6.1
- lightningcss: 1.30.2
+ lightningcss: 1.31.1
terser: 5.46.0
tsx: 4.21.0
yaml: 2.8.2
- vitest@4.0.17(@opentelemetry/api@1.9.0)(@types/node@22.19.6)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(msw@2.12.10(@types/node@22.19.6)(typescript@5.9.2))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2):
+ vitefu@1.1.2(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)):
+ optionalDependencies:
+ vite: 7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+
+ vitest@4.0.17(@opentelemetry/api@1.9.0)(@types/node@22.19.6)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.31.1)(msw@2.12.10(@types/node@22.19.6)(typescript@5.9.2))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2):
dependencies:
'@vitest/expect': 4.0.17
- '@vitest/mocker': 4.0.17(msw@2.12.10(@types/node@22.19.6)(typescript@5.9.2))(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
+ '@vitest/mocker': 4.0.17(msw@2.12.10(@types/node@22.19.6)(typescript@5.9.2))(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
'@vitest/pretty-format': 4.0.17
'@vitest/runner': 4.0.17
'@vitest/snapshot': 4.0.17
@@ -24891,7 +25647,7 @@ snapshots:
tinyexec: 1.0.2
tinyglobby: 0.2.15
tinyrainbow: 3.0.3
- vite: 7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+ vite: 7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
why-is-node-running: 2.3.0
optionalDependencies:
'@opentelemetry/api': 1.9.0
@@ -24910,10 +25666,10 @@ snapshots:
- tsx
- yaml
- vitest@4.0.17(@opentelemetry/api@1.9.0)(@types/node@22.19.6)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(msw@2.12.10(@types/node@22.19.6)(typescript@5.9.3))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2):
+ vitest@4.0.17(@opentelemetry/api@1.9.0)(@types/node@22.19.6)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.31.1)(msw@2.12.10(@types/node@22.19.6)(typescript@5.9.3))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2):
dependencies:
'@vitest/expect': 4.0.17
- '@vitest/mocker': 4.0.17(msw@2.12.10(@types/node@22.19.6)(typescript@5.9.3))(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
+ '@vitest/mocker': 4.0.17(msw@2.12.10(@types/node@22.19.6)(typescript@5.9.3))(vite@7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
'@vitest/pretty-format': 4.0.17
'@vitest/runner': 4.0.17
'@vitest/snapshot': 4.0.17
@@ -24930,7 +25686,7 @@ snapshots:
tinyexec: 1.0.2
tinyglobby: 0.2.15
tinyrainbow: 3.0.3
- vite: 7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+ vite: 7.3.1(@types/node@22.19.6)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
why-is-node-running: 2.3.0
optionalDependencies:
'@opentelemetry/api': 1.9.0
@@ -24970,6 +25726,7 @@ snapshots:
'@vue/shared': 3.5.29
optionalDependencies:
typescript: 5.9.2
+ optional: true
vue@3.5.29(typescript@5.9.3):
dependencies:
@@ -25036,7 +25793,7 @@ snapshots:
acorn: 8.15.0
browserslist: 4.28.1
chrome-trace-event: 1.0.4
- enhanced-resolve: 5.18.4
+ enhanced-resolve: 5.19.0
es-module-lexer: 1.7.0
eslint-scope: 5.1.1
events: 3.3.0
@@ -25067,7 +25824,7 @@ snapshots:
acorn: 8.15.0
browserslist: 4.28.1
chrome-trace-event: 1.0.4
- enhanced-resolve: 5.18.4
+ enhanced-resolve: 5.19.0
es-module-lexer: 1.7.0
eslint-scope: 5.1.1
events: 3.3.0
@@ -25298,6 +26055,8 @@ snapshots:
yoga-layout@3.2.1: {}
+ zimmerframe@1.1.4: {}
+
zod-to-json-schema@3.25.1(zod@3.25.76):
dependencies:
zod: 3.25.76
diff --git a/skills/json-render-svelte/SKILL.md b/skills/json-render-svelte/SKILL.md
new file mode 100644
index 00000000..a95ab874
--- /dev/null
+++ b/skills/json-render-svelte/SKILL.md
@@ -0,0 +1,284 @@
+---
+name: json-render-svelte
+description: Svelte 5 renderer for json-render that turns JSON specs into Svelte component trees. Use when working with @json-render/svelte, building Svelte UIs from JSON, creating component catalogs, or rendering AI-generated specs.
+---
+
+# @json-render/svelte
+
+Svelte 5 renderer that converts json-render specs into Svelte component trees.
+
+## Quick Start
+
+```svelte
+
+
+
+
+
+```
+
+## Creating a Catalog
+
+```typescript
+import { defineCatalog } from "@json-render/core";
+import { schema } from "@json-render/svelte";
+import { z } from "zod";
+
+export const catalog = defineCatalog(schema, {
+ components: {
+ Button: {
+ props: z.object({
+ label: z.string(),
+ variant: z.enum(["primary", "secondary"]).nullable(),
+ }),
+ description: "Clickable button",
+ },
+ Card: {
+ props: z.object({ title: z.string() }),
+ description: "Card container with title",
+ },
+ },
+});
+```
+
+## Defining Components
+
+Components should accept `BaseComponentProps`:
+
+```typescript
+interface BaseComponentProps {
+ props: TProps; // Resolved props for this component
+ children?: Snippet; // Child elements (use {@render children()})
+ emit: (event: string) => void; // Fire a named event
+ bindings?: Record; // Map of prop names to state paths (for $bindState)
+ loading?: boolean; // True while spec is streaming
+}
+```
+
+```svelte
+
+
+
+ emit("press")}>
+ {props.label}
+
+```
+
+```svelte
+
+
+
+
+
{props.title}
+ {#if children}
+ {@render children()}
+ {/if}
+
+```
+
+## Creating a Registry
+
+```typescript
+import { defineRegistry } from "@json-render/svelte";
+import { catalog } from "./catalog";
+import Card from "./components/Card.svelte";
+import Button from "./components/Button.svelte";
+
+const { registry, handlers, executeAction } = defineRegistry(catalog, {
+ components: {
+ Card,
+ Button,
+ },
+ actions: {
+ submit: async (params, setState, state) => {
+ // handle action
+ },
+ },
+});
+```
+
+## Spec Structure (Element Tree)
+
+The Svelte schema uses the element tree format:
+
+```json
+{
+ "root": "card1",
+ "elements": {
+ "card1": {
+ "type": "Card",
+ "props": { "title": "Hello" },
+ "children": ["btn1"]
+ },
+ "btn1": {
+ "type": "Button",
+ "props": { "label": "Click me" }
+ }
+ }
+}
+```
+
+## Visibility Conditions
+
+Use `visible` on elements to show/hide based on state:
+
+- `{ "$state": "/path" }` - truthy check
+- `{ "$state": "/path", "eq": value }` - equality check
+- `{ "$state": "/path", "not": true }` - falsy check
+- `{ "$and": [cond1, cond2] }` - AND conditions
+- `{ "$or": [cond1, cond2] }` - OR conditions
+
+## Providers (via JsonUIProvider)
+
+`JsonUIProvider` composes all contexts. Individual contexts:
+
+| Context | Purpose |
+| ------------------- | -------------------------------------------------- |
+| `StateContext` | Share state across components (JSON Pointer paths) |
+| `ActionContext` | Handle actions dispatched via the event system |
+| `VisibilityContext` | Enable conditional rendering based on state |
+| `ValidationContext` | Form field validation |
+
+## Event System
+
+Components use `emit` to fire named events. The element's `on` field maps events to action bindings:
+
+```svelte
+
+
+
+ emit("press")}>{props.label}
+```
+
+```json
+{
+ "type": "Button",
+ "props": { "label": "Submit" },
+ "on": { "press": { "action": "submit" } }
+}
+```
+
+## Built-in Actions
+
+The `setState` action is handled automatically and updates the state model:
+
+```json
+{
+ "action": "setState",
+ "actionParams": { "statePath": "/activeTab", "value": "home" }
+}
+```
+
+Other built-in actions: `pushState`, `removeState`, `push`, `pop`.
+
+## Dynamic Props and Two-Way Binding
+
+Expression forms resolved before your component receives props:
+
+- `{"$state": "/state/key"}` - read from state
+- `{"$bindState": "/form/email"}` - read + write-back to state
+- `{"$bindItem": "field"}` - read + write-back for repeat items
+- `{"$cond": , "$then": , "$else": }` - conditional value
+
+For writable bindings inside components, use `getBoundProp`:
+
+```svelte
+
+
+
+```
+
+## Context Helpers
+
+Preferred helpers:
+
+- `getStateValue(path)` - returns `{ current }` (read/write)
+- `getBoundProp(() => value, () => bindingPath)` - returns `{ current }` (read/write when bound)
+- `isVisible(condition)` - returns `{ current }` (boolean)
+- `getAction(name)` - returns `{ current }` (registered handler)
+
+Advanced context access:
+
+- `getStateContext()`
+- `getActionContext()`
+- `getVisibilityContext()`
+- `getValidationContext()`
+- `getOptionalValidationContext()`
+- `getFieldValidation(ctx, path, config?)`
+
+## Streaming UI
+
+Use `createUIStream` for spec streaming:
+
+```svelte
+
+
+
+ {stream.isStreaming ? "Generating..." : "Generate UI"}
+
+
+{#if stream.spec}
+
+{/if}
+```
+
+Use `createChatUI` for chat + UI responses:
+
+```typescript
+const chat = createChatUI({ api: "/api/chat-ui" });
+await chat.send("Build a settings panel");
+```
diff --git a/vitest.config.ts b/vitest.config.mts
similarity index 68%
rename from vitest.config.ts
rename to vitest.config.mts
index b797e2a1..54cf731e 100644
--- a/vitest.config.ts
+++ b/vitest.config.mts
@@ -1,8 +1,15 @@
import { defineConfig } from "vitest/config";
import path from "path";
+import { fileURLToPath } from "url";
+import { svelte } from "@sveltejs/vite-plugin-svelte";
+
+const __dirname = path.dirname(fileURLToPath(import.meta.url));
export default defineConfig({
+ plugins: [svelte({ hot: false })],
resolve: {
+ // Ensure Svelte resolves to browser bundle, not server
+ conditions: ["browser"],
// Deduplicate React and Vue so tests don't get two copies
// (pnpm strict resolution can cause packages to resolve different copies)
alias: {
@@ -18,7 +25,7 @@ export default defineConfig({
coverage: {
provider: "v8",
reporter: ["text", "json", "html"],
- include: ["packages/*/src/**/*.{ts,tsx}"],
+ include: ["packages/*/src/**/*.{ts,tsx,svelte}"],
exclude: ["**/*.test.{ts,tsx}", "**/index.ts"],
},
},