@json-render/solid 0.18.0 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +5 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.js +34 -12
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +35 -13
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/contexts/state.tsx","../src/contexts/visibility.tsx","../src/contexts/actions.tsx","../src/contexts/validation.tsx","../src/contexts/repeat-scope.tsx","../src/schema.ts","../src/renderer.tsx","../src/hooks.ts"],"sourcesContent":["// Contexts\nexport {\n StateProvider,\n useStateStore,\n useStateValue,\n useStateBinding,\n type StateContextValue,\n type StateProviderProps,\n} from \"./contexts/state\";\n\nexport {\n VisibilityProvider,\n useVisibility,\n useIsVisible,\n type VisibilityContextValue,\n type VisibilityProviderProps,\n} from \"./contexts/visibility\";\n\nexport {\n ActionProvider,\n useActions,\n useAction,\n ConfirmDialog,\n type ActionContextValue,\n type ActionProviderProps,\n type PendingConfirmation,\n type ConfirmDialogProps,\n} from \"./contexts/actions\";\n\nexport {\n ValidationProvider,\n useValidation,\n useOptionalValidation,\n useFieldValidation,\n type ValidationContextValue,\n type ValidationProviderProps,\n type FieldValidationState,\n} from \"./contexts/validation\";\n\nexport {\n RepeatScopeProvider,\n useRepeatScope,\n type RepeatScopeValue,\n} from \"./contexts/repeat-scope\";\n\n// Schema (Solid's spec format)\nexport {\n schema,\n type SolidSchema,\n type SolidSpec,\n // Backward compatibility\n elementTreeSchema,\n type ElementTreeSchema,\n type ElementTreeSpec,\n} from \"./schema\";\n\n// Core types (re-exported for convenience)\nexport type { Spec, StateStore } from \"@json-render/core\";\nexport { createStateStore } from \"@json-render/core\";\n\n// Catalog-aware types for Solid\nexport type {\n EventHandle,\n BaseComponentProps,\n SetState,\n StateModel,\n ComponentContext,\n ComponentFn,\n Components,\n ActionFn,\n Actions,\n} from \"./catalog-types\";\n\n// Renderer\nexport {\n // Registry\n defineRegistry,\n type DefineRegistryResult,\n // createRenderer (higher-level, includes providers)\n createRenderer,\n type CreateRendererProps,\n type ComponentMap,\n // Low-level\n Renderer,\n JSONUIProvider,\n type ComponentRenderProps,\n type ComponentRenderer,\n type ComponentRegistry,\n type RendererProps,\n type JSONUIProviderProps,\n} from \"./renderer\";\n\n// Hooks\nexport {\n useUIStream,\n useChatUI,\n useBoundProp,\n flatToTree,\n buildSpecFromParts,\n getTextFromParts,\n useJsonRenderMessage,\n type UseUIStreamOptions,\n type UseUIStreamReturn,\n type UseChatUIOptions,\n type UseChatUIReturn,\n type ChatMessage,\n type DataPart,\n type TokenUsage,\n} from \"./hooks\";\n","import {\n createContext,\n useContext,\n createSignal,\n createEffect,\n createMemo,\n onCleanup,\n type Accessor,\n type ParentProps,\n} from \"solid-js\";\nimport {\n getByPath,\n createStateStore,\n type StateModel,\n type StateStore,\n} from \"@json-render/core\";\nimport { flattenToPointers } from \"@json-render/core/store-utils\";\n\nexport interface StateContextValue {\n state: StateModel;\n get: (path: string) => unknown;\n set: (path: string, value: unknown) => void;\n update: (updates: Record<string, unknown>) => void;\n getSnapshot: () => StateModel;\n subscribeChanges: (\n listener: (changes: Array<{ path: string; value: unknown }>) => void,\n ) => () => void;\n}\n\nconst StateContext = createContext<StateContextValue | null>(null);\n\nexport interface StateProviderProps {\n store?: StateStore;\n initialState?: StateModel;\n onStateChange?: (changes: Array<{ path: string; value: unknown }>) => void;\n}\n\nfunction computeInitialFlat(\n isControlled: boolean,\n initialState: StateModel,\n): Record<string, unknown> | null {\n if (isControlled) return null;\n if (Object.keys(initialState).length === 0) return {};\n return flattenToPointers(initialState);\n}\n\nexport function StateProvider(props: ParentProps<StateProviderProps>) {\n let internalStore: StateStore | undefined;\n if (!props.store) {\n internalStore = createStateStore(props.initialState ?? {});\n }\n\n const store = () => props.store ?? internalStore!;\n\n const initialMode = props.store ? \"controlled\" : \"uncontrolled\";\n let modeWarned = false;\n\n if (\n typeof globalThis !== \"undefined\" &&\n (globalThis as any).process?.env?.NODE_ENV !== \"production\"\n ) {\n createEffect(() => {\n const currentMode = props.store ? \"controlled\" : \"uncontrolled\";\n if (currentMode !== initialMode && !modeWarned) {\n modeWarned = true;\n console.warn(\n `StateProvider: switching from ${initialMode} to ${currentMode} mode is not supported.`,\n );\n }\n });\n }\n\n let prevInitialState = props.initialState;\n let prevFlat: Record<string, unknown> | null = computeInitialFlat(\n !!props.store,\n props.initialState ?? {},\n );\n\n createEffect(() => {\n if (props.store) return;\n const initialState = props.initialState ?? {};\n if (initialState === prevInitialState) return;\n prevInitialState = initialState;\n const nextFlat =\n initialState && Object.keys(initialState).length > 0\n ? flattenToPointers(initialState)\n : {};\n const prevFlatObj = prevFlat ?? {};\n const allKeys = new Set([\n ...Object.keys(prevFlatObj),\n ...Object.keys(nextFlat),\n ]);\n const updates: Record<string, unknown> = {};\n for (const key of allKeys) {\n if (prevFlatObj[key] !== nextFlat[key]) {\n updates[key] = key in nextFlat ? nextFlat[key] : undefined;\n }\n }\n prevFlat = nextFlat;\n if (Object.keys(updates).length > 0) {\n store().update(updates);\n }\n });\n\n const [state, setState] = createSignal<StateModel>(store().getSnapshot(), {\n equals: false,\n });\n const changeListeners = new Set<\n (changes: Array<{ path: string; value: unknown }>) => void\n >();\n\n const subscribeChanges = (\n listener: (changes: Array<{ path: string; value: unknown }>) => void,\n ) => {\n changeListeners.add(listener);\n return () => {\n changeListeners.delete(listener);\n };\n };\n\n const notifyChanges = (changes: Array<{ path: string; value: unknown }>) => {\n for (const listener of changeListeners) {\n listener(changes);\n }\n };\n\n createEffect(() => {\n const s = store();\n setState(s.getSnapshot());\n const unsubscribe = s.subscribe(() => {\n setState(s.getSnapshot());\n });\n onCleanup(unsubscribe);\n });\n\n const set = (path: string, value: unknown) => {\n const s = store();\n const prev = s.getSnapshot();\n const prevValue = getByPath(prev, path);\n s.set(path, value);\n if (prevValue !== value) {\n const changes = [{ path, value }];\n notifyChanges(changes);\n if (!props.store && s.getSnapshot() !== prev) {\n props.onStateChange?.(changes);\n }\n }\n };\n\n const update = (updates: Record<string, unknown>) => {\n const s = store();\n const prev = s.getSnapshot();\n s.update(updates);\n const changes: Array<{ path: string; value: unknown }> = [];\n for (const [path, value] of Object.entries(updates)) {\n if (getByPath(prev, path) !== value) {\n changes.push({ path, value });\n }\n }\n if (changes.length > 0) {\n notifyChanges(changes);\n if (!props.store && s.getSnapshot() !== prev) {\n props.onStateChange?.(changes);\n }\n }\n };\n\n const get = (path: string) => store().get(path);\n\n const getSnapshot = () => store().getSnapshot();\n\n const ctx: StateContextValue = {\n get state() {\n return state();\n },\n get,\n set,\n update,\n getSnapshot,\n subscribeChanges,\n };\n\n return (\n <StateContext.Provider value={ctx}>{props.children}</StateContext.Provider>\n );\n}\n\nexport function useStateStore(): StateContextValue {\n const ctx = useContext(StateContext);\n if (!ctx) {\n throw new Error(\"useStateStore must be used within a StateProvider\");\n }\n return ctx;\n}\n\nexport function useStateValue<T>(path: string): Accessor<T | undefined> {\n const store = useStateStore();\n return createMemo(() => getByPath(store.state, path) as T | undefined);\n}\n\nexport function useStateBinding<T>(\n path: string,\n): [Accessor<T | undefined>, (value: T) => void] {\n const store = useStateStore();\n const value = createMemo(() => getByPath(store.state, path) as T | undefined);\n const setValue = (newValue: T) => store.set(path, newValue);\n return [value, setValue];\n}\n","import { createContext, useContext, type ParentProps } from \"solid-js\";\nimport {\n evaluateVisibility,\n type VisibilityCondition,\n type VisibilityContext as CoreVisibilityContext,\n} from \"@json-render/core\";\nimport { useStateStore } from \"./state\";\n\nexport interface VisibilityContextValue {\n isVisible: (condition: VisibilityCondition | undefined) => boolean;\n ctx: CoreVisibilityContext;\n}\n\nconst VisibilityContext = createContext<VisibilityContextValue | null>(null);\n\nexport type VisibilityProviderProps = ParentProps;\n\nexport function VisibilityProvider(props: VisibilityProviderProps) {\n const stateStore = useStateStore();\n\n const visibilityCtx: CoreVisibilityContext = {\n get stateModel() {\n return stateStore.state;\n },\n };\n\n const value: VisibilityContextValue = {\n isVisible: (condition: VisibilityCondition | undefined) =>\n evaluateVisibility(condition, visibilityCtx),\n ctx: visibilityCtx,\n };\n\n return (\n <VisibilityContext.Provider value={value}>\n {props.children}\n </VisibilityContext.Provider>\n );\n}\n\nexport function useVisibility(): VisibilityContextValue {\n const ctx = useContext(VisibilityContext);\n if (!ctx) {\n throw new Error(\"useVisibility must be used within a VisibilityProvider\");\n }\n return ctx;\n}\n\nexport function useIsVisible(\n condition: VisibilityCondition | undefined,\n): boolean {\n const { isVisible } = useVisibility();\n return isVisible(condition);\n}\n","import {\n createContext,\n useContext,\n createSignal,\n type ParentProps,\n type JSX,\n} from \"solid-js\";\nimport {\n resolveAction,\n executeAction,\n nextActionDispatchId,\n notifyActionDispatch,\n notifyActionSettle,\n type ActionBinding,\n type ActionHandler,\n type ActionConfirm,\n type ResolvedAction,\n} from \"@json-render/core\";\nimport { useStateStore } from \"./state\";\nimport { useOptionalValidation } from \"./validation\";\n\nlet idCounter = 0;\nfunction generateUniqueId(): string {\n idCounter += 1;\n return `${Date.now()}-${idCounter}`;\n}\n\nfunction deepResolveValue(\n value: unknown,\n get: (path: string) => unknown,\n): unknown {\n if (value === null || value === undefined) return value;\n\n if (value === \"$id\") {\n return generateUniqueId();\n }\n\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj);\n\n if (keys.length === 1 && typeof obj.$state === \"string\") {\n return get(obj.$state as string);\n }\n\n if (keys.length === 1 && \"$id\" in obj) {\n return generateUniqueId();\n }\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => deepResolveValue(item, get));\n }\n\n if (typeof value === \"object\") {\n const resolved: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value as Record<string, unknown>)) {\n resolved[key] = deepResolveValue(val, get);\n }\n return resolved;\n }\n\n return value;\n}\n\nexport interface PendingConfirmation {\n action: ResolvedAction;\n handler: ActionHandler;\n resolve: () => void;\n reject: () => void;\n}\n\nexport interface ActionContextValue {\n handlers: Record<string, ActionHandler>;\n loadingActions: Set<string>;\n pendingConfirmation: PendingConfirmation | null;\n execute: (binding: ActionBinding) => Promise<void>;\n confirm: () => void;\n cancel: () => void;\n registerHandler: (name: string, handler: ActionHandler) => void;\n}\n\nconst ActionContext = createContext<ActionContextValue | null>(null);\n\nexport interface ActionProviderProps {\n handlers?: Record<string, ActionHandler>;\n navigate?: (path: string) => void;\n}\n\nexport function ActionProvider(props: ParentProps<ActionProviderProps>) {\n const { get, set, getSnapshot } = useStateStore();\n const validation = useOptionalValidation();\n\n const [handlers, setHandlers] = createSignal<Record<string, ActionHandler>>(\n props.handlers ?? {},\n );\n const [loadingActions, setLoadingActions] = createSignal<Set<string>>(\n new Set(),\n );\n const [pendingConfirmation, setPendingConfirmation] =\n createSignal<PendingConfirmation | null>(null);\n\n const registerHandler = (name: string, handler: ActionHandler) => {\n setHandlers((prev) => ({ ...prev, [name]: handler }));\n };\n\n const execute = async (binding: ActionBinding) => {\n const resolved = resolveAction(binding, getSnapshot());\n\n // --- devtools / observer hooks ---\n const dispatchId = nextActionDispatchId();\n const dispatchedAt = Date.now();\n notifyActionDispatch({\n id: dispatchId,\n name: resolved.action,\n params: resolved.params,\n at: dispatchedAt,\n });\n let __ok = true;\n let __error: unknown = undefined;\n\n try {\n if (resolved.action === \"setState\" && resolved.params) {\n const statePath = resolved.params.statePath as string;\n const value = resolved.params.value;\n if (statePath) {\n set(statePath, value);\n }\n return;\n }\n\n if (resolved.action === \"pushState\" && resolved.params) {\n const statePath = resolved.params.statePath as string;\n const rawValue = resolved.params.value;\n if (statePath) {\n const resolvedValue = deepResolveValue(rawValue, get);\n const arr = (get(statePath) as unknown[] | undefined) ?? [];\n set(statePath, [...arr, resolvedValue]);\n const clearStatePath = resolved.params.clearStatePath as\n | string\n | undefined;\n if (clearStatePath) {\n set(clearStatePath, \"\");\n }\n }\n return;\n }\n\n if (resolved.action === \"removeState\" && resolved.params) {\n const statePath = resolved.params.statePath as string;\n const index = resolved.params.index as number;\n if (statePath !== undefined && index !== undefined) {\n const arr = (get(statePath) as unknown[] | undefined) ?? [];\n set(\n statePath,\n arr.filter((_, i) => i !== index),\n );\n }\n return;\n }\n\n if (resolved.action === \"push\" && resolved.params) {\n const screen = resolved.params.screen as string;\n if (screen) {\n const currentScreen = get(\"/currentScreen\") as string | undefined;\n const navStack = (get(\"/navStack\") as string[] | undefined) ?? [];\n if (currentScreen) {\n set(\"/navStack\", [...navStack, currentScreen]);\n } else {\n set(\"/navStack\", [...navStack, \"\"]);\n }\n set(\"/currentScreen\", screen);\n }\n return;\n }\n\n if (resolved.action === \"pop\") {\n const navStack = (get(\"/navStack\") as string[] | undefined) ?? [];\n if (navStack.length > 0) {\n const previousScreen = navStack[navStack.length - 1];\n set(\"/navStack\", navStack.slice(0, -1));\n if (previousScreen) {\n set(\"/currentScreen\", previousScreen);\n } else {\n set(\"/currentScreen\", undefined);\n }\n }\n return;\n }\n\n if (resolved.action === \"validateForm\") {\n const validateAll = validation?.validateAll;\n if (!validateAll) {\n console.warn(\n \"validateForm action was dispatched but no ValidationProvider is connected. \" +\n \"Ensure ValidationProvider is rendered inside the provider tree.\",\n );\n return;\n }\n const valid = validateAll();\n const errors: Record<string, string[]> = {};\n for (const [path, fs] of Object.entries(validation.fieldStates)) {\n if (fs.result && !fs.result.valid) {\n errors[path] = fs.result.errors;\n }\n }\n const statePath =\n (resolved.params?.statePath as string) || \"/formValidation\";\n set(statePath, { valid, errors });\n return;\n }\n\n const handler = handlers()[resolved.action];\n\n if (!handler) {\n console.warn(`No handler registered for action: ${resolved.action}`);\n return;\n }\n\n if (resolved.confirm) {\n return new Promise<void>((resolve, reject) => {\n setPendingConfirmation({\n action: resolved,\n handler,\n resolve: () => {\n setPendingConfirmation(null);\n resolve();\n },\n reject: () => {\n setPendingConfirmation(null);\n reject(new Error(\"Action cancelled\"));\n },\n });\n }).then(async () => {\n setLoadingActions((prev) => new Set(prev).add(resolved.action));\n try {\n await executeAction({\n action: resolved,\n handler,\n setState: set,\n navigate: props.navigate,\n executeAction: async (name: string) => {\n const subBinding: ActionBinding = { action: name };\n await execute(subBinding);\n },\n });\n } finally {\n setLoadingActions((prev) => {\n const next = new Set(prev);\n next.delete(resolved.action);\n return next;\n });\n }\n });\n }\n\n setLoadingActions((prev) => new Set(prev).add(resolved.action));\n try {\n await executeAction({\n action: resolved,\n handler,\n setState: set,\n navigate: props.navigate,\n executeAction: async (name: string) => {\n const subBinding: ActionBinding = { action: name };\n await execute(subBinding);\n },\n });\n } finally {\n setLoadingActions((prev) => {\n const next = new Set(prev);\n next.delete(resolved.action);\n return next;\n });\n }\n } catch (err) {\n __ok = false;\n __error = err;\n throw err;\n } finally {\n const now = Date.now();\n notifyActionSettle({\n id: dispatchId,\n name: resolved.action,\n ok: __ok,\n at: now,\n durationMs: now - dispatchedAt,\n error: __error,\n });\n }\n };\n\n const confirm = () => {\n pendingConfirmation()?.resolve();\n };\n\n const cancel = () => {\n pendingConfirmation()?.reject();\n };\n\n const ctx: ActionContextValue = {\n get handlers() {\n return handlers();\n },\n get loadingActions() {\n return loadingActions();\n },\n get pendingConfirmation() {\n return pendingConfirmation();\n },\n execute,\n confirm,\n cancel,\n registerHandler,\n };\n\n return (\n <ActionContext.Provider value={ctx}>\n {props.children}\n </ActionContext.Provider>\n );\n}\n\nexport function useActions(): ActionContextValue {\n const ctx = useContext(ActionContext);\n if (!ctx) {\n throw new Error(\"useActions must be used within an ActionProvider\");\n }\n return ctx;\n}\n\nexport function useAction(binding: ActionBinding): {\n execute: () => Promise<void>;\n isLoading: boolean;\n} {\n const actions = useActions();\n return {\n execute: () => actions.execute(binding),\n get isLoading() {\n return actions.loadingActions.has(binding.action);\n },\n };\n}\n\nexport interface ConfirmDialogProps {\n confirm: ActionConfirm;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nexport function ConfirmDialog(props: ConfirmDialogProps): JSX.Element {\n const isDanger = () => props.confirm.variant === \"danger\";\n\n return (\n <div\n style={{\n position: \"fixed\",\n inset: \"0\",\n \"background-color\": \"rgba(0, 0, 0, 0.5)\",\n display: \"flex\",\n \"align-items\": \"center\",\n \"justify-content\": \"center\",\n \"z-index\": 50,\n }}\n onClick={props.onCancel}\n >\n <div\n style={{\n \"background-color\": \"white\",\n \"border-radius\": \"8px\",\n padding: \"24px\",\n \"max-width\": \"400px\",\n width: \"100%\",\n \"box-shadow\": \"0 20px 25px -5px rgba(0, 0, 0, 0.1)\",\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <h3\n style={{\n margin: \"0 0 8px 0\",\n \"font-size\": \"18px\",\n \"font-weight\": \"600\",\n }}\n >\n {props.confirm.title}\n </h3>\n <p\n style={{\n margin: \"0 0 24px 0\",\n color: \"#6b7280\",\n }}\n >\n {props.confirm.message}\n </p>\n <div\n style={{\n display: \"flex\",\n gap: \"12px\",\n \"justify-content\": \"flex-end\",\n }}\n >\n <button\n onClick={props.onCancel}\n style={{\n padding: \"8px 16px\",\n \"border-radius\": \"6px\",\n border: \"1px solid #d1d5db\",\n \"background-color\": \"white\",\n cursor: \"pointer\",\n }}\n >\n {props.confirm.cancelLabel ?? \"Cancel\"}\n </button>\n <button\n onClick={props.onConfirm}\n style={{\n padding: \"8px 16px\",\n \"border-radius\": \"6px\",\n border: \"none\",\n \"background-color\": isDanger() ? \"#dc2626\" : \"#3b82f6\",\n color: \"white\",\n cursor: \"pointer\",\n }}\n >\n {props.confirm.confirmLabel ?? \"Confirm\"}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import {\n createContext,\n useContext,\n createSignal,\n createEffect,\n createMemo,\n type Accessor,\n type ParentProps,\n} from \"solid-js\";\nimport {\n runValidation,\n type ValidationConfig,\n type ValidationFunction,\n type ValidationResult,\n} from \"@json-render/core\";\nimport { useStateStore } from \"./state\";\n\nexport interface FieldValidationState {\n touched: boolean;\n validated: boolean;\n result: ValidationResult | null;\n}\n\nexport interface ValidationContextValue {\n customFunctions: Record<string, ValidationFunction>;\n fieldStates: Record<string, FieldValidationState>;\n validate: (path: string, config: ValidationConfig) => ValidationResult;\n touch: (path: string) => void;\n clear: (path: string) => void;\n validateAll: () => boolean;\n registerField: (path: string, config: ValidationConfig) => void;\n}\n\nconst ValidationContext = createContext<ValidationContextValue | null>(null);\n\nexport interface ValidationProviderProps {\n customFunctions?: Record<string, ValidationFunction>;\n}\n\nfunction dynamicArgsEqual(\n a: Record<string, unknown> | undefined,\n b: Record<string, unknown> | undefined,\n): boolean {\n if (a === b) return true;\n if (!a || !b) return false;\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n const va = a[key];\n const vb = b[key];\n if (va === vb) continue;\n if (\n typeof va === \"object\" &&\n va !== null &&\n typeof vb === \"object\" &&\n vb !== null\n ) {\n const sa = (va as Record<string, unknown>).$state;\n const sb = (vb as Record<string, unknown>).$state;\n if (typeof sa === \"string\" && sa === sb) continue;\n }\n return false;\n }\n return true;\n}\n\nfunction validationConfigEqual(\n a: ValidationConfig,\n b: ValidationConfig,\n): boolean {\n if (a === b) return true;\n\n if (a.validateOn !== b.validateOn) return false;\n\n const ac = a.checks ?? [];\n const bc = b.checks ?? [];\n if (ac.length !== bc.length) return false;\n\n for (let i = 0; i < ac.length; i++) {\n const ca = ac[i]!;\n const cb = bc[i]!;\n if (ca.type !== cb.type) return false;\n if (ca.message !== cb.message) return false;\n if (!dynamicArgsEqual(ca.args, cb.args)) return false;\n }\n\n return true;\n}\n\nexport function ValidationProvider(\n props: ParentProps<ValidationProviderProps>,\n) {\n const { getSnapshot } = useStateStore();\n const customFunctions = () => props.customFunctions ?? {};\n\n const [fieldStates, setFieldStates] = createSignal<\n Record<string, FieldValidationState>\n >({});\n let fieldStatesRef: Record<string, FieldValidationState> = {};\n\n const [fieldConfigs, setFieldConfigs] = createSignal<\n Record<string, ValidationConfig>\n >({});\n\n const registerField = (path: string, config: ValidationConfig) => {\n setFieldConfigs((prev) => {\n const existing = prev[path];\n if (existing && validationConfigEqual(existing, config)) {\n return prev;\n }\n return { ...prev, [path]: config };\n });\n };\n\n const validate = (\n path: string,\n config: ValidationConfig,\n ): ValidationResult => {\n const currentState = getSnapshot();\n const segments = path.split(\"/\").filter(Boolean);\n let value: unknown = currentState;\n for (const seg of segments) {\n if (value != null && typeof value === \"object\") {\n value = (value as Record<string, unknown>)[seg];\n } else {\n value = undefined;\n break;\n }\n }\n const result = runValidation(config, {\n value,\n stateModel: currentState,\n customFunctions: customFunctions(),\n });\n\n const newFieldState: FieldValidationState = {\n touched: fieldStatesRef[path]?.touched ?? true,\n validated: true,\n result,\n };\n fieldStatesRef = {\n ...fieldStatesRef,\n [path]: newFieldState,\n };\n setFieldStates(fieldStatesRef);\n\n return result;\n };\n\n const touch = (path: string) => {\n fieldStatesRef = {\n ...fieldStatesRef,\n [path]: {\n ...fieldStatesRef[path],\n touched: true,\n validated: fieldStatesRef[path]?.validated ?? false,\n result: fieldStatesRef[path]?.result ?? null,\n },\n };\n setFieldStates(fieldStatesRef);\n };\n\n const clear = (path: string) => {\n const { [path]: _, ...rest } = fieldStatesRef;\n fieldStatesRef = rest;\n setFieldStates(rest);\n };\n\n const validateAll = () => {\n let allValid = true;\n\n for (const [path, config] of Object.entries(fieldConfigs())) {\n const result = validate(path, config);\n if (!result.valid) {\n allValid = false;\n }\n }\n\n return allValid;\n };\n\n const value: ValidationContextValue = {\n get customFunctions() {\n return customFunctions();\n },\n get fieldStates() {\n fieldStates();\n return fieldStatesRef;\n },\n validate,\n touch,\n clear,\n validateAll,\n registerField,\n };\n\n return (\n <ValidationContext.Provider value={value}>\n {props.children}\n </ValidationContext.Provider>\n );\n}\n\nexport function useValidation(): ValidationContextValue {\n const ctx = useContext(ValidationContext);\n if (!ctx) {\n throw new Error(\"useValidation must be used within a ValidationProvider\");\n }\n return ctx;\n}\n\nexport function useOptionalValidation(): ValidationContextValue | null {\n return useContext(ValidationContext);\n}\n\nexport function useFieldValidation(\n path: string,\n config?: ValidationConfig,\n): {\n state: Accessor<FieldValidationState>;\n validate: () => ValidationResult;\n touch: () => void;\n clear: () => void;\n errors: Accessor<string[]>;\n isValid: Accessor<boolean>;\n} {\n const validation = useValidation();\n\n createEffect(() => {\n if (path && config) {\n validation.registerField(path, config);\n }\n });\n\n const state = createMemo<FieldValidationState>(() => {\n const current = validation.fieldStates[path];\n return (\n current ?? {\n touched: false,\n validated: false,\n result: null,\n }\n );\n });\n\n const validate = () => validation.validate(path, config ?? { checks: [] });\n const touch = () => validation.touch(path);\n const clear = () => validation.clear(path);\n const errors = createMemo(() => state().result?.errors ?? []);\n const isValid = createMemo(() => state().result?.valid ?? true);\n\n return {\n state,\n validate,\n touch,\n clear,\n errors,\n isValid,\n };\n}\n","import { createContext, useContext, type ParentProps } from \"solid-js\";\n\nexport interface RepeatScopeValue {\n item: unknown;\n index: number;\n basePath: string;\n}\n\nconst RepeatScopeContext = createContext<RepeatScopeValue | null>(null);\n\nexport function RepeatScopeProvider(props: ParentProps<RepeatScopeValue>) {\n return (\n <RepeatScopeContext.Provider\n value={{ item: props.item, index: props.index, basePath: props.basePath }}\n >\n {props.children}\n </RepeatScopeContext.Provider>\n );\n}\n\nexport function useRepeatScope(): RepeatScopeValue | null {\n return useContext(RepeatScopeContext);\n}\n","import { defineSchema } from \"@json-render/core\";\n\n/**\n * The schema for @json-render/solid\n *\n * Defines:\n * - Spec: A flat tree of elements with keys, types, props, and children references\n * - Catalog: Components with props schemas, and optional actions\n */\nexport const schema = defineSchema(\n (s) => ({\n // What the AI-generated SPEC looks like\n spec: s.object({\n /** Root element key */\n root: s.string(),\n /** Flat map of elements by key */\n elements: s.record(\n s.object({\n /** Component type from catalog */\n type: s.ref(\"catalog.components\"),\n /** Component props */\n props: s.propsOf(\"catalog.components\"),\n /** Child element keys (flat reference) */\n children: s.array(s.string()),\n /** Visibility condition */\n visible: s.any(),\n }),\n ),\n }),\n\n // What the CATALOG must provide\n catalog: s.object({\n /** Component definitions */\n components: s.map({\n /** Zod schema for component props */\n props: s.zod(),\n /** Slots for this component. Use ['default'] for children, or named slots like ['header', 'footer'] */\n slots: s.array(s.string()),\n /** Description for AI generation hints */\n description: s.string(),\n /** Example prop values used in prompt examples (auto-generated from Zod schema if omitted) */\n example: s.any(),\n }),\n /** Action definitions (optional) */\n actions: s.map({\n /** Zod schema for action params */\n params: s.zod(),\n /** Description for AI generation hints */\n description: s.string(),\n }),\n }),\n }),\n {\n builtInActions: [\n {\n name: \"setState\",\n description:\n \"Update a value in the state model at the given statePath. Params: { statePath: string, value: any }\",\n },\n {\n name: \"pushState\",\n description:\n '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.',\n },\n {\n name: \"removeState\",\n description:\n \"Remove an item from an array in state by index. Params: { statePath: string, index: number }\",\n },\n {\n name: \"validateForm\",\n description:\n \"Validate all registered form fields and write the result to state. Params: { statePath?: string }. Defaults to /formValidation. Result: { valid: boolean, errors: Record<string, string[]> }.\",\n },\n ],\n defaultRules: [\n // Element integrity\n \"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.\",\n \"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.\",\n\n // Field placement\n 'CRITICAL: The \"visible\" field goes on the ELEMENT object, NOT inside \"props\". Correct: {\"type\":\"<ComponentName>\",\"props\":{},\"visible\":{\"$state\":\"/tab\",\"eq\":\"home\"},\"children\":[...]}.',\n '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.',\n\n // State and data\n \"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).\",\n 'When building repeating content backed by a state array (e.g. posts, products, items), use the \"repeat\" field on a container element. Example: { \"type\": \"<ContainerComponent>\", \"props\": {}, \"repeat\": { \"statePath\": \"/posts\", \"key\": \"id\" }, \"children\": [\"post-card\"] }. Replace <ContainerComponent> 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.',\n\n // Design quality\n \"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.\",\n \"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.\",\n \"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.\",\n ],\n },\n);\n\n/**\n * Type for the Solid schema\n */\nexport type SolidSchema = typeof schema;\n\n/**\n * Infer the spec type from a catalog\n */\nexport type SolidSpec<TCatalog> = typeof schema extends {\n createCatalog: (catalog: TCatalog) => { _specType: infer S };\n}\n ? S\n : never;\n\n// Backward compatibility aliases\n/** @deprecated Use `schema` instead */\nexport const elementTreeSchema = schema;\n/** @deprecated Use `SolidSchema` instead */\nexport type ElementTreeSchema = SolidSchema;\n/** @deprecated Use `SolidSpec` instead */\nexport type ElementTreeSpec<T> = SolidSpec<T>;\n","import {\n createContext,\n useContext,\n createMemo,\n createEffect,\n createSignal,\n onCleanup,\n ErrorBoundary,\n Show,\n For,\n type JSX,\n type Component,\n} from \"solid-js\";\nimport type {\n UIElement,\n Spec,\n ActionBinding,\n Catalog,\n SchemaDefinition,\n StateStore,\n ComputedFunction,\n} from \"@json-render/core\";\nimport {\n resolveElementProps,\n resolveBindings,\n resolveActionParam,\n evaluateVisibility,\n getByPath,\n isDevtoolsActive,\n subscribeDevtoolsActive,\n type PropResolutionContext,\n type VisibilityContext as CoreVisibilityContext,\n} from \"@json-render/core\";\nimport type {\n Components,\n Actions,\n ActionFn,\n SetState,\n StateModel,\n CatalogHasActions,\n EventHandle,\n} from \"./catalog-types\";\nimport { useIsVisible, useVisibility } from \"./contexts/visibility\";\nimport { useActions } from \"./contexts/actions\";\nimport { useStateStore } from \"./contexts/state\";\nimport { StateProvider } from \"./contexts/state\";\nimport { VisibilityProvider } from \"./contexts/visibility\";\nimport { ActionProvider } from \"./contexts/actions\";\nimport { ValidationProvider } from \"./contexts/validation\";\nimport { ConfirmDialog } from \"./contexts/actions\";\nimport { RepeatScopeProvider, useRepeatScope } from \"./contexts/repeat-scope\";\n\n/**\n * Props passed to component renderers\n */\nexport interface ComponentRenderProps<P = Record<string, unknown>> {\n /** The element being rendered */\n element: UIElement<string, P>;\n /** Rendered children */\n children?: JSX.Element;\n /** Emit a named event. The renderer resolves the event to action binding(s) from the element's `on` field. Always provided by the renderer. */\n emit: (event: string) => void;\n /** Get an event handle with metadata (shouldPreventDefault, bound). Use when you need to inspect event bindings. */\n on: (event: string) => EventHandle;\n /**\n * Two-way binding paths resolved from `$bindState` / `$bindItem` expressions.\n * Maps prop name → absolute state path for write-back.\n * Only present when at least one prop uses `{ $bindState: \"...\" }` or `{ $bindItem: \"...\" }`.\n */\n bindings?: Record<string, string>;\n /** Whether the parent is loading */\n loading?: boolean;\n}\n\n/**\n * Component renderer type\n */\nexport type ComponentRenderer<P = Record<string, unknown>> = Component<\n ComponentRenderProps<P>\n>;\n\n/**\n * Registry of component renderers\n */\nexport type ComponentRegistry = Record<string, ComponentRenderer<any>>;\n\n/**\n * Props for the Renderer component\n */\nexport interface RendererProps {\n /** The UI spec to render */\n spec: Spec | null;\n /** Component registry */\n registry: ComponentRegistry;\n /** Whether the spec is currently loading/streaming */\n loading?: boolean;\n /** Fallback component for unknown types */\n fallback?: ComponentRenderer;\n}\n\n// ---------------------------------------------------------------------------\n// FunctionsContext – provides $computed functions to the element tree\n// ---------------------------------------------------------------------------\n\nconst EMPTY_FUNCTIONS: Record<string, ComputedFunction> = {};\n\nconst FunctionsContext =\n createContext<Record<string, ComputedFunction>>(EMPTY_FUNCTIONS);\n\nfunction useFunctions(): Record<string, ComputedFunction> {\n return useContext(FunctionsContext) ?? EMPTY_FUNCTIONS;\n}\n\ninterface ElementRendererProps {\n element: UIElement;\n /** Spec key for this element. Used by the devtools picker. */\n elementKey?: string;\n spec: Spec;\n registry: ComponentRegistry;\n loading?: boolean;\n fallback?: ComponentRenderer;\n}\n\n/**\n * Reactive mirror of the devtools-active flag. Used to decide whether to\n * wrap each element with a `data-jr-key` attribute for the picker.\n */\nfunction useDevtoolsActive() {\n const [active, setActive] = createSignal(isDevtoolsActive());\n const unsub = subscribeDevtoolsActive(() => setActive(isDevtoolsActive()));\n onCleanup(unsub);\n return active;\n}\n\n/**\n * Element renderer component.\n */\nfunction ElementRenderer(props: ElementRendererProps) {\n const repeatScope = useRepeatScope();\n const { ctx } = useVisibility();\n const { execute } = useActions();\n const stateStore = useStateStore();\n const getSnapshot = () => stateStore.getSnapshot();\n const functions = useFunctions();\n\n // Build context with repeat scope and $computed functions\n const fullCtx = createMemo<PropResolutionContext>(() => {\n const repeatItem = repeatScope?.item;\n const repeatIndex = repeatScope?.index;\n const repeatBasePath = repeatScope?.basePath;\n\n return {\n get stateModel() {\n return ctx.stateModel;\n },\n ...(repeatItem !== undefined ? { repeatItem } : {}),\n ...(repeatIndex !== undefined ? { repeatIndex } : {}),\n ...(repeatBasePath !== undefined ? { repeatBasePath } : {}),\n functions,\n };\n });\n\n // Evaluate visibility (now supports $item/$index inside repeat scopes)\n const isVisible = createMemo(() =>\n props.element.visible === undefined\n ? true\n : evaluateVisibility(props.element.visible, fullCtx()),\n );\n\n // Create emit function that resolves events to action bindings.\n const emit = async (eventName: string) => {\n const onBindings = props.element.on;\n const binding = onBindings?.[eventName];\n if (!binding) return;\n const actionBindings = Array.isArray(binding) ? binding : [binding];\n for (const b of actionBindings) {\n if (!b.params) {\n await execute(b);\n continue;\n }\n // Build a fresh context with live store state so that $state\n // references in later actions see mutations from earlier ones.\n const liveCtx: PropResolutionContext = {\n ...fullCtx(),\n stateModel: getSnapshot(),\n };\n const resolved: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(b.params)) {\n resolved[key] = resolveActionParam(val, liveCtx);\n }\n await execute({ ...b, params: resolved });\n }\n };\n\n // Create on() function that returns an EventHandle with metadata for a specific event.\n const on = (eventName: string): EventHandle => {\n const onBindings = props.element.on;\n const binding = onBindings?.[eventName];\n if (!binding) {\n return { emit: () => {}, shouldPreventDefault: false, bound: false };\n }\n const actionBindings = Array.isArray(binding) ? binding : [binding];\n const shouldPreventDefault = actionBindings.some((b) => b.preventDefault);\n return {\n emit: () => emit(eventName),\n shouldPreventDefault,\n bound: true,\n };\n };\n\n // Watch effect: fire actions when watched state paths change.\n createEffect(() => {\n const watchConfig = props.element.watch;\n if (!watchConfig) return;\n const paths = Object.keys(watchConfig);\n if (paths.length === 0) return;\n\n const unsubscribe = stateStore.subscribeChanges((changes) => {\n const changedPaths = new Set(changes.map((change) => change.path));\n\n void (async () => {\n for (const path of paths) {\n if (!changedPaths.has(path)) continue;\n\n const binding = watchConfig[path];\n if (!binding) continue;\n const bindings = Array.isArray(binding) ? binding : [binding];\n\n for (const b of bindings) {\n if (!b.params) {\n await execute(b);\n continue;\n }\n const liveCtx: PropResolutionContext = {\n ...fullCtx(),\n stateModel: getSnapshot(),\n };\n const resolved: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(b.params)) {\n resolved[key] = resolveActionParam(val, liveCtx);\n }\n await execute({ ...b, params: resolved });\n }\n }\n })().catch(console.error);\n });\n\n onCleanup(() => {\n unsubscribe();\n });\n });\n\n // Resolve $bindState/$bindItem expressions → bindings map (prop name → state path)\n const elementBindings = createMemo(() => {\n const rawProps = props.element.props as Record<string, unknown>;\n return resolveBindings(rawProps, fullCtx());\n });\n\n // Resolve dynamic prop expressions ($state, $item, $index, $bindState, $bindItem, $cond/$then/$else)\n const resolvedElement = createMemo(() => {\n const rawProps = props.element.props as Record<string, unknown>;\n const resolvedProps = resolveElementProps(rawProps, fullCtx());\n return resolvedProps !== props.element.props\n ? { ...props.element, props: resolvedProps }\n : props.element;\n });\n\n return (\n <Show when={isVisible()}>\n <ErrorBoundary\n fallback={(err) => {\n console.error(\n `[json-render] Rendering error in <${props.element.type}>:`,\n err,\n );\n return null;\n }}\n >\n <ElementRendererContent\n resolvedElement={resolvedElement()}\n elementKey={props.elementKey}\n spec={props.spec}\n registry={props.registry}\n loading={props.loading}\n fallback={props.fallback}\n emit={emit}\n on={on}\n bindings={elementBindings()}\n />\n </ErrorBoundary>\n </Show>\n );\n}\n\ninterface ElementRendererContentProps {\n resolvedElement: UIElement;\n elementKey?: string;\n spec: Spec;\n registry: ComponentRegistry;\n loading?: boolean;\n fallback?: ComponentRenderer;\n emit: (event: string) => void;\n on: (event: string) => EventHandle;\n bindings?: Record<string, string>;\n}\n\n/**\n * Inner content renderer, separated so it can be wrapped in Show + ErrorBoundary.\n */\nfunction ElementRendererContent(props: ElementRendererContentProps) {\n const devtoolsActive = useDevtoolsActive();\n // Get the component renderer\n const Comp = () =>\n props.registry[props.resolvedElement.type] ?? props.fallback;\n\n return (\n <Show\n when={Comp()}\n fallback={(() => {\n console.warn(\n `No renderer for component type: ${props.resolvedElement.type}`,\n );\n return null;\n })()}\n >\n {(ComponentFn) => {\n const Component = ComponentFn();\n // Render children (with repeat support)\n const children = () =>\n props.resolvedElement.repeat ? (\n <RepeatChildren\n element={props.resolvedElement}\n spec={props.spec}\n registry={props.registry}\n loading={props.loading}\n fallback={props.fallback}\n />\n ) : (\n <For each={props.resolvedElement.children ?? []}>\n {(childKey) => {\n const childElement = () => props.spec.elements[childKey];\n return (\n <Show\n when={childElement()}\n fallback={(() => {\n if (!props.loading) {\n console.warn(\n `[json-render] Missing element \"${childKey}\" referenced as child of \"${props.resolvedElement.type}\". This element will not render.`,\n );\n }\n return null;\n })()}\n >\n {(el) => (\n <ElementRenderer\n element={el()}\n elementKey={childKey}\n spec={props.spec}\n registry={props.registry}\n loading={props.loading}\n fallback={props.fallback}\n />\n )}\n </Show>\n );\n }}\n </For>\n );\n\n const rendered = (\n <Component\n element={props.resolvedElement}\n emit={props.emit}\n on={props.on}\n bindings={props.bindings}\n loading={props.loading}\n >\n {children()}\n </Component>\n );\n\n return (\n <Show when={devtoolsActive() && props.elementKey} fallback={rendered}>\n <span\n data-jr-key={props.elementKey}\n style={{ display: \"contents\" }}\n >\n {rendered}\n </span>\n </Show>\n );\n }}\n </Show>\n );\n}\n\n// ---------------------------------------------------------------------------\n// RepeatChildren -- renders child elements once per item in a state array.\n// Used when an element has a `repeat` field.\n// ---------------------------------------------------------------------------\n\ninterface RepeatChildrenProps {\n element: UIElement;\n spec: Spec;\n registry: ComponentRegistry;\n loading?: boolean;\n fallback?: ComponentRenderer;\n}\n\nfunction RepeatChildren(props: RepeatChildrenProps) {\n const stateStore = useStateStore();\n const repeat = () => props.element.repeat!;\n const statePath = () => repeat().statePath;\n\n const items = () =>\n (getByPath(stateStore.state, statePath()) as unknown[] | undefined) ?? [];\n\n return (\n <For each={items()}>\n {(itemValue, index) => {\n const key = () => {\n const r = repeat();\n return r.key && typeof itemValue === \"object\" && itemValue !== null\n ? String((itemValue as Record<string, unknown>)[r.key] ?? index())\n : String(index());\n };\n\n return (\n <RepeatScopeProvider\n item={itemValue}\n index={index()}\n basePath={`${statePath()}/${index()}`}\n >\n <For each={props.element.children ?? []}>\n {(childKey) => {\n const childElement = () => props.spec.elements[childKey];\n return (\n <Show\n when={childElement()}\n fallback={(() => {\n if (!props.loading) {\n console.warn(\n `[json-render] Missing element \"${childKey}\" referenced as child of \"${props.element.type}\" (repeat). This element will not render.`,\n );\n }\n return null;\n })()}\n >\n {(el) => (\n <ElementRenderer\n element={el()}\n spec={props.spec}\n registry={props.registry}\n loading={props.loading}\n fallback={props.fallback}\n />\n )}\n </Show>\n );\n }}\n </For>\n </RepeatScopeProvider>\n );\n }}\n </For>\n );\n}\n\n/**\n * Main renderer component\n */\nexport function Renderer(props: RendererProps) {\n const rootElement = createMemo(() => {\n const spec = props.spec;\n if (!spec || !spec.root) return undefined;\n return spec.elements[spec.root];\n });\n\n return (\n <Show when={rootElement()}>\n {(el) => (\n <ElementRenderer\n element={el()}\n elementKey={props.spec!.root}\n spec={props.spec!}\n registry={props.registry}\n loading={props.loading}\n fallback={props.fallback}\n />\n )}\n </Show>\n );\n}\n\n/**\n * Props for JSONUIProvider\n */\nexport interface JSONUIProviderProps {\n /** Component registry */\n registry: ComponentRegistry;\n /**\n * External store (controlled mode). When provided, `initialState` and\n * `onStateChange` are ignored.\n */\n store?: StateStore;\n /** Initial state model (uncontrolled mode) */\n initialState?: Record<string, unknown>;\n /** Action handlers */\n handlers?: Record<\n string,\n (params: Record<string, unknown>) => Promise<unknown> | unknown\n >;\n /** Navigation function */\n navigate?: (path: string) => void;\n /** Custom validation functions */\n validationFunctions?: Record<\n string,\n (value: unknown, args?: Record<string, unknown>) => boolean\n >;\n /** Named functions for `$computed` expressions in props */\n functions?: Record<string, ComputedFunction>;\n /** Callback when state changes (uncontrolled mode) */\n onStateChange?: (changes: Array<{ path: string; value: unknown }>) => void;\n children: JSX.Element;\n}\n\n/**\n * Combined provider for all JSONUI contexts\n */\nexport function JSONUIProvider(props: JSONUIProviderProps) {\n return (\n <StateProvider\n store={props.store}\n initialState={props.initialState}\n onStateChange={props.onStateChange}\n >\n <VisibilityProvider>\n <ValidationProvider customFunctions={props.validationFunctions}>\n <ActionProvider handlers={props.handlers} navigate={props.navigate}>\n <FunctionsContext.Provider\n value={props.functions ?? EMPTY_FUNCTIONS}\n >\n {props.children}\n <ConfirmationDialogManager />\n </FunctionsContext.Provider>\n </ActionProvider>\n </ValidationProvider>\n </VisibilityProvider>\n </StateProvider>\n );\n}\n\n/**\n * Renders the confirmation dialog when needed\n */\nfunction ConfirmationDialogManager() {\n const { pendingConfirmation, confirm, cancel } = useActions();\n\n return (\n <Show when={pendingConfirmation?.action.confirm}>\n {(confirmConfig) => (\n <ConfirmDialog\n confirm={confirmConfig()}\n onConfirm={confirm}\n onCancel={cancel}\n />\n )}\n </Show>\n );\n}\n\n// ============================================================================\n// defineRegistry\n// ============================================================================\n\n/**\n * Result returned by defineRegistry\n */\nexport interface DefineRegistryResult {\n /** Component registry for `<Renderer registry={...} />` */\n registry: ComponentRegistry;\n /**\n * Create ActionProvider-compatible handlers.\n * Accepts getter functions so handlers always read the latest state/setState\n * (e.g. from refs or closures).\n */\n handlers: (\n getSetState: () => SetState | undefined,\n getState: () => StateModel,\n ) => Record<string, (params: Record<string, unknown>) => Promise<void>>;\n /**\n * Execute an action by name imperatively\n * (for use outside the Solid tree, e.g. initial state loading).\n */\n executeAction: (\n actionName: string,\n params: Record<string, unknown> | undefined,\n setState: SetState,\n state?: StateModel,\n ) => Promise<void>;\n}\n\n/**\n * Options for defineRegistry.\n *\n * When the catalog declares actions, the `actions` field is required.\n * When the catalog has no actions (or `actions: {}`), the field is optional.\n */\ntype DefineRegistryOptions<C extends Catalog> = {\n components?: Components<C>;\n} & (CatalogHasActions<C> extends true\n ? { actions: Actions<C> }\n : { actions?: Actions<C> });\n\n/**\n * Create a registry from a catalog with components and/or actions.\n *\n * When the catalog declares actions, the `actions` field is required.\n *\n * @example\n * ```tsx\n * // Components only (catalog has no actions)\n * const { registry } = defineRegistry(catalog, {\n * components: {\n * Card: (ctx) => (\n * <div class=\"card\">{ctx.props.title}{ctx.children}</div>\n * ),\n * },\n * });\n *\n * // Both (catalog declares actions)\n * const { registry, handlers, executeAction } = defineRegistry(catalog, {\n * components: { ... },\n * actions: { ... },\n * });\n * ```\n */\nexport function defineRegistry<C extends Catalog>(\n _catalog: C,\n options: DefineRegistryOptions<C>,\n): DefineRegistryResult {\n // Build component registry\n const registry: ComponentRegistry = {};\n if (options.components) {\n for (const [name, componentFn] of Object.entries(options.components)) {\n registry[name] = (renderProps: ComponentRenderProps) => {\n return (componentFn as DefineRegistryComponentFn)({\n get props() {\n return renderProps.element.props;\n },\n get children() {\n return renderProps.children;\n },\n emit: renderProps.emit,\n on: renderProps.on,\n get bindings() {\n return renderProps.bindings;\n },\n get loading() {\n return renderProps.loading;\n },\n });\n };\n }\n }\n\n // Build action helpers\n const actionMap = options.actions\n ? (Object.entries(options.actions) as Array<\n [string, DefineRegistryActionFn]\n >)\n : [];\n\n const handlers = (\n getSetState: () => SetState | undefined,\n getState: () => StateModel,\n ): Record<string, (params: Record<string, unknown>) => Promise<void>> => {\n const result: Record<\n string,\n (params: Record<string, unknown>) => Promise<void>\n > = {};\n for (const [name, actionFn] of actionMap) {\n result[name] = async (params) => {\n const setState = getSetState();\n const state = getState();\n if (setState) {\n await actionFn(params, setState, state);\n }\n };\n }\n return result;\n };\n\n const executeAction = async (\n actionName: string,\n params: Record<string, unknown> | undefined,\n setState: SetState,\n state: StateModel = {},\n ): Promise<void> => {\n const entry = actionMap.find(([name]) => name === actionName);\n if (entry) {\n await entry[1](params, setState, state);\n } else {\n console.warn(`Unknown action: ${actionName}`);\n }\n };\n\n return { registry, handlers, executeAction };\n}\n\n/** @internal */\ntype DefineRegistryComponentFn = (ctx: {\n props: unknown;\n children?: JSX.Element;\n emit: (event: string) => void;\n on: (event: string) => EventHandle;\n bindings?: Record<string, string>;\n loading?: boolean;\n}) => JSX.Element;\n\n/** @internal */\ntype DefineRegistryActionFn = (\n params: Record<string, unknown> | undefined,\n setState: SetState,\n state: StateModel,\n) => Promise<void>;\n\n// ============================================================================\n// NEW API\n// ============================================================================\n\n/**\n * Props for renderers created with createRenderer\n */\nexport interface CreateRendererProps {\n /** The spec to render (AI-generated JSON) */\n spec: Spec | null;\n /**\n * External store (controlled mode). When provided, `state` and\n * `onStateChange` are ignored.\n */\n store?: StateStore;\n /** State context for dynamic values (uncontrolled mode) */\n state?: Record<string, unknown>;\n /** Action handler */\n onAction?: (actionName: string, params?: Record<string, unknown>) => void;\n /** Callback when state changes (uncontrolled mode) */\n onStateChange?: (changes: Array<{ path: string; value: unknown }>) => void;\n /** Named functions for `$computed` expressions in props */\n functions?: Record<string, ComputedFunction>;\n /** Whether the spec is currently loading/streaming */\n loading?: boolean;\n /** Fallback component for unknown types */\n fallback?: ComponentRenderer;\n}\n\n/**\n * Component map type - maps component names to Solid components\n */\nexport type ComponentMap<\n TComponents extends Record<string, { props: unknown }>,\n> = {\n [K in keyof TComponents]: Component<\n ComponentRenderProps<\n TComponents[K][\"props\"] extends { _output: infer O }\n ? O\n : Record<string, unknown>\n >\n >;\n};\n\n/**\n * Create a renderer from a catalog\n *\n * @example\n * ```typescript\n * const DashboardRenderer = createRenderer(dashboardCatalog, {\n * Card: (renderProps) => <div class=\"card\">{renderProps.children}</div>,\n * Metric: (renderProps) => <span>{renderProps.element.props.value}</span>,\n * });\n *\n * // Usage\n * <DashboardRenderer spec={aiGeneratedSpec} state={state} />\n * ```\n */\nexport function createRenderer<\n TDef extends SchemaDefinition,\n TCatalog extends { components: Record<string, { props: unknown }> },\n>(\n catalog: Catalog<TDef, TCatalog>,\n components: ComponentMap<TCatalog[\"components\"]>,\n): Component<CreateRendererProps> {\n // Convert component map to registry\n const registry: ComponentRegistry =\n components as unknown as ComponentRegistry;\n\n // Return the renderer component\n return function CatalogRenderer(props: CreateRendererProps) {\n // Wrap onAction with a Proxy so any action name routes to the callback\n const actionHandlers = () =>\n props.onAction\n ? new Proxy(\n {} as Record<\n string,\n (params: Record<string, unknown>) => void | Promise<void>\n >,\n {\n get: (_target, prop: string) => {\n return (params: Record<string, unknown>) =>\n props.onAction!(prop, params);\n },\n has: () => true,\n },\n )\n : undefined;\n\n return (\n <StateProvider\n store={props.store}\n initialState={props.state}\n onStateChange={props.onStateChange}\n >\n <VisibilityProvider>\n <ValidationProvider>\n <ActionProvider handlers={actionHandlers()}>\n <FunctionsContext.Provider\n value={props.functions ?? EMPTY_FUNCTIONS}\n >\n <Renderer\n spec={props.spec}\n registry={registry}\n loading={props.loading}\n fallback={props.fallback}\n />\n <ConfirmationDialogManager />\n </FunctionsContext.Provider>\n </ActionProvider>\n </ValidationProvider>\n </VisibilityProvider>\n </StateProvider>\n );\n };\n}\n","import { createSignal, onCleanup, createMemo } from \"solid-js\";\nimport type {\n Spec,\n UIElement,\n FlatElement,\n JsonPatch,\n SpecDataPart,\n} from \"@json-render/core\";\nimport {\n setByPath,\n getByPath,\n addByPath,\n removeByPath,\n createMixedStreamParser,\n applySpecPatch,\n nestedToFlat,\n SPEC_DATA_PART_TYPE,\n} from \"@json-render/core\";\n\n/**\n * Token usage metadata from AI generation\n */\nexport interface TokenUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\n/**\n * Parse result for a single line -- either a patch or usage metadata\n */\ntype ParsedLine =\n | { type: \"patch\"; patch: JsonPatch }\n | { type: \"usage\"; usage: TokenUsage }\n | null;\n\n/**\n * Parse a single JSON line (patch or metadata)\n */\nfunction parseLine(line: string): ParsedLine {\n try {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"//\")) {\n return null;\n }\n const parsed = JSON.parse(trimmed);\n\n // Check for usage metadata\n if (parsed.__meta === \"usage\") {\n return {\n type: \"usage\",\n usage: {\n promptTokens: parsed.promptTokens ?? 0,\n completionTokens: parsed.completionTokens ?? 0,\n totalTokens: parsed.totalTokens ?? 0,\n },\n };\n }\n\n return { type: \"patch\", patch: parsed as JsonPatch };\n } catch {\n return null;\n }\n}\n\n/**\n * Set a value at a spec path (for add/replace operations).\n */\nfunction setSpecValue(newSpec: Spec, path: string, value: unknown): void {\n if (path === \"/root\") {\n newSpec.root = value as string;\n return;\n }\n\n if (path === \"/state\") {\n newSpec.state = value as Record<string, unknown>;\n return;\n }\n\n if (path.startsWith(\"/state/\")) {\n if (!newSpec.state) newSpec.state = {};\n const statePath = path.slice(\"/state\".length); // e.g. \"/posts\"\n setByPath(newSpec.state as Record<string, unknown>, statePath, value);\n return;\n }\n\n if (path.startsWith(\"/elements/\")) {\n const pathParts = path.slice(\"/elements/\".length).split(\"/\");\n const elementKey = pathParts[0];\n if (!elementKey) return;\n\n if (pathParts.length === 1) {\n newSpec.elements[elementKey] = value as UIElement;\n } else {\n const element = newSpec.elements[elementKey];\n if (element) {\n const propPath = \"/\" + pathParts.slice(1).join(\"/\");\n const newElement = { ...element };\n setByPath(\n newElement as unknown as Record<string, unknown>,\n propPath,\n value,\n );\n newSpec.elements[elementKey] = newElement;\n }\n }\n }\n}\n\n/**\n * Remove a value at a spec path.\n */\nfunction removeSpecValue(newSpec: Spec, path: string): void {\n if (path === \"/state\") {\n delete newSpec.state;\n return;\n }\n\n if (path.startsWith(\"/state/\") && newSpec.state) {\n const statePath = path.slice(\"/state\".length);\n removeByPath(newSpec.state as Record<string, unknown>, statePath);\n return;\n }\n\n if (path.startsWith(\"/elements/\")) {\n const pathParts = path.slice(\"/elements/\".length).split(\"/\");\n const elementKey = pathParts[0];\n if (!elementKey) return;\n\n if (pathParts.length === 1) {\n const { [elementKey]: _, ...rest } = newSpec.elements;\n newSpec.elements = rest;\n } else {\n const element = newSpec.elements[elementKey];\n if (element) {\n const propPath = \"/\" + pathParts.slice(1).join(\"/\");\n const newElement = { ...element };\n removeByPath(\n newElement as unknown as Record<string, unknown>,\n propPath,\n );\n newSpec.elements[elementKey] = newElement;\n }\n }\n }\n}\n\n/**\n * Get a value at a spec path.\n */\nfunction getSpecValue(spec: Spec, path: string): unknown {\n if (path === \"/root\") return spec.root;\n if (path === \"/state\") return spec.state;\n if (path.startsWith(\"/state/\") && spec.state) {\n const statePath = path.slice(\"/state\".length);\n return getByPath(spec.state as Record<string, unknown>, statePath);\n }\n return getByPath(spec as unknown as Record<string, unknown>, path);\n}\n\n/**\n * Apply an RFC 6902 JSON patch to the current spec.\n * Supports add, remove, replace, move, copy, and test operations.\n */\nfunction applyPatch(spec: Spec, patch: JsonPatch): Spec {\n const newSpec = {\n ...spec,\n elements: { ...spec.elements },\n ...(spec.state ? { state: { ...spec.state } } : {}),\n };\n\n switch (patch.op) {\n case \"add\":\n case \"replace\": {\n setSpecValue(newSpec, patch.path, patch.value);\n break;\n }\n case \"remove\": {\n removeSpecValue(newSpec, patch.path);\n break;\n }\n case \"move\": {\n if (!patch.from) break;\n const moveValue = getSpecValue(newSpec, patch.from);\n removeSpecValue(newSpec, patch.from);\n setSpecValue(newSpec, patch.path, moveValue);\n break;\n }\n case \"copy\": {\n if (!patch.from) break;\n const copyValue = getSpecValue(newSpec, patch.from);\n setSpecValue(newSpec, patch.path, copyValue);\n break;\n }\n case \"test\": {\n // test is a no-op for rendering purposes (validation only)\n break;\n }\n }\n\n return newSpec;\n}\n\n/**\n * Options for useUIStream\n */\nexport interface UseUIStreamOptions {\n /** API endpoint */\n api: string;\n /** Callback when complete */\n onComplete?: (spec: Spec) => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n}\n\n/**\n * Return type for useUIStream\n */\nexport interface UseUIStreamReturn {\n /** Current UI spec */\n readonly spec: Spec | null;\n /** Whether currently streaming */\n readonly isStreaming: boolean;\n /** Error if any */\n readonly error: Error | null;\n /** Token usage from the last generation */\n readonly usage: TokenUsage | null;\n /** Raw JSONL lines received from the stream (JSON patch lines) */\n readonly rawLines: string[];\n /** Send a prompt to generate UI */\n send: (prompt: string, context?: Record<string, unknown>) => Promise<void>;\n /** Clear the current spec */\n clear: () => void;\n}\n\n/**\n * Hook for streaming UI generation\n */\nexport function useUIStream(options: UseUIStreamOptions): UseUIStreamReturn {\n const [spec, setSpec] = createSignal<Spec | null>(null);\n const [isStreaming, setIsStreaming] = createSignal(false);\n const [error, setError] = createSignal<Error | null>(null);\n const [usage, setUsage] = createSignal<TokenUsage | null>(null);\n const [rawLines, setRawLines] = createSignal<string[]>([]);\n let abortController: AbortController | null = null;\n\n const clear = () => {\n setSpec(null);\n setError(null);\n };\n\n const send = async (prompt: string, context?: Record<string, unknown>) => {\n // Abort any existing request\n abortController?.abort();\n abortController = new AbortController();\n\n setIsStreaming(true);\n setError(null);\n setUsage(null);\n setRawLines([]);\n\n // Start with previous spec if provided, otherwise empty spec\n const previousSpec = context?.previousSpec as Spec | undefined;\n let currentSpec: Spec =\n previousSpec && previousSpec.root\n ? { ...previousSpec, elements: { ...previousSpec.elements } }\n : { root: \"\", elements: {} };\n setSpec(currentSpec);\n\n try {\n const response = await fetch(options.api, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n prompt,\n context,\n currentSpec,\n }),\n signal: abortController.signal,\n });\n\n if (!response.ok) {\n // Try to parse JSON error response for better error messages\n let errorMessage = `HTTP error: ${response.status}`;\n try {\n const errorData = await response.json();\n if (errorData.message) {\n errorMessage = errorData.message;\n } else if (errorData.error) {\n errorMessage = errorData.error;\n }\n } catch {\n // Ignore JSON parsing errors, use default message\n }\n throw new Error(errorMessage);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error(\"No response body\");\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n // Process complete lines\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n const result = parseLine(trimmed);\n if (!result) continue;\n if (result.type === \"usage\") {\n setUsage(result.usage);\n } else {\n setRawLines((prev) => [...prev, trimmed]);\n currentSpec = applyPatch(currentSpec, result.patch);\n setSpec({ ...currentSpec });\n }\n }\n }\n\n // Process any remaining buffer\n if (buffer.trim()) {\n const trimmed = buffer.trim();\n const result = parseLine(trimmed);\n if (result) {\n if (result.type === \"usage\") {\n setUsage(result.usage);\n } else {\n setRawLines((prev) => [...prev, trimmed]);\n currentSpec = applyPatch(currentSpec, result.patch);\n setSpec({ ...currentSpec });\n }\n }\n }\n\n options.onComplete?.(currentSpec);\n } catch (err) {\n if ((err as Error).name === \"AbortError\") {\n return;\n }\n const resolvedError = err instanceof Error ? err : new Error(String(err));\n setError(resolvedError);\n options.onError?.(resolvedError);\n } finally {\n setIsStreaming(false);\n }\n };\n\n // Cleanup on disposal\n onCleanup(() => {\n abortController?.abort();\n });\n\n return {\n get spec() {\n return spec();\n },\n get isStreaming() {\n return isStreaming();\n },\n get error() {\n return error();\n },\n get usage() {\n return usage();\n },\n get rawLines() {\n return rawLines();\n },\n send,\n clear,\n };\n}\n\n/**\n * Convert a flat element list to a Spec.\n * Input elements use key/parentKey to establish identity and relationships.\n * Output spec uses the map-based format where key is the map entry key\n * and parent-child relationships are expressed through children arrays.\n */\nexport function flatToTree(elements: FlatElement[]): Spec {\n const elementMap: Record<string, UIElement> = {};\n let root = \"\";\n\n // First pass: add all elements to map\n for (const element of elements) {\n elementMap[element.key] = {\n type: element.type,\n props: element.props,\n children: [],\n visible: element.visible,\n };\n }\n\n // Second pass: build parent-child relationships\n for (const element of elements) {\n if (element.parentKey) {\n const parent = elementMap[element.parentKey];\n if (parent) {\n if (!parent.children) {\n parent.children = [];\n }\n parent.children.push(element.key);\n }\n } else {\n root = element.key;\n }\n }\n\n return { root, elements: elementMap };\n}\n\n// =============================================================================\n// useBoundProp — Two-way binding helper for $bindState/$bindItem expressions\n// =============================================================================\n\n// Re-export useStateStore access for useBoundProp without circular import\nimport { useStateStore as useStateStoreFromContext } from \"./contexts/state\";\n\n/**\n * Hook for two-way bound props. Returns `[value, setValue]` where:\n *\n * - `value` is the already-resolved prop value (passed through from render props)\n * - `setValue` writes back to the bound state path (no-op if not bound)\n *\n * Designed to work with the `bindings` map that the renderer provides when\n * a prop uses `{ $bindState: \"/path\" }` or `{ $bindItem: \"field\" }`.\n *\n * @example\n * ```tsx\n * import { useBoundProp } from \"@json-render/solid\";\n *\n * const Input: ComponentRenderer = (ctx) => {\n * const [value, setValue] = useBoundProp<string>(ctx.props.value, ctx.bindings?.value);\n * return <input value={value ?? \"\"} onInput={(e) => setValue(e.target.value)} />;\n * };\n * ```\n */\nexport function useBoundProp<T>(\n propValue: T | undefined,\n bindingPath: string | undefined,\n): [T | undefined, (value: T) => void] {\n const { set } = useStateStoreFromContext();\n const setValue = (value: T) => {\n if (bindingPath) set(bindingPath, value);\n };\n return [propValue, setValue];\n}\n\n// =============================================================================\n// buildSpecFromParts — Derive Spec from AI SDK data parts\n// =============================================================================\n\n/**\n * A single part from the AI SDK's `message.parts` array. This is a minimal\n * structural type so that library helpers do not depend on the AI SDK.\n * Fields are optional because different part types carry different data:\n * - Text parts have `text`\n * - Data parts have `data`\n */\nexport interface DataPart {\n type: string;\n text?: string;\n data?: unknown;\n}\n\n/**\n * Build a `Spec` by replaying all spec data parts from a message's\n * parts array. Returns `null` if no spec data parts are present.\n *\n * This function is designed to work with the AI SDK's `UIMessage.parts` array.\n * It picks out parts whose `type` is {@link SPEC_DATA_PART_TYPE} and processes them based\n * on the payload's `type` discriminator:\n *\n * - `\"patch\"`: Applies the JSON Patch operation incrementally via `applySpecPatch`.\n * - `\"flat\"`: Replaces the spec with the complete flat spec.\n * - `\"nested\"`: Assigns the nested spec directly (future: nested-to-flat conversion).\n *\n * The function has no AI SDK dependency -- it operates on a generic array of\n * `{ type: string; data: unknown }` objects.\n *\n * @example\n * ```tsx\n * const spec = buildSpecFromParts(message.parts);\n * if (spec) {\n * return <MyRenderer spec={spec} />;\n * }\n * ```\n */\n/**\n * Type guard that validates a data part payload looks like a valid\n * {@link SpecDataPart} before we cast it. Returns `false` (and the\n * part is silently skipped) for malformed payloads.\n */\nfunction isSpecDataPart(data: unknown): data is SpecDataPart {\n if (typeof data !== \"object\" || data === null) return false;\n const obj = data as Record<string, unknown>;\n switch (obj.type) {\n case \"patch\":\n return typeof obj.patch === \"object\" && obj.patch !== null;\n case \"flat\":\n case \"nested\":\n return typeof obj.spec === \"object\" && obj.spec !== null;\n default:\n return false;\n }\n}\n\nexport function buildSpecFromParts(parts: DataPart[]): Spec | null {\n const spec: Spec = { root: \"\", elements: {} };\n let hasSpec = false;\n\n for (const part of parts) {\n if (part.type === SPEC_DATA_PART_TYPE) {\n if (!isSpecDataPart(part.data)) continue;\n const payload = part.data;\n if (payload.type === \"patch\") {\n hasSpec = true;\n applySpecPatch(spec, payload.patch);\n } else if (payload.type === \"flat\") {\n hasSpec = true;\n Object.assign(spec, payload.spec);\n } else if (payload.type === \"nested\") {\n hasSpec = true;\n const flat = nestedToFlat(payload.spec);\n Object.assign(spec, flat);\n }\n }\n }\n\n return hasSpec ? spec : null;\n}\n\n/**\n * Extract and join all text content from a message's parts array.\n *\n * Filters for parts with `type === \"text\"`, trims each one, and joins them\n * with double newlines so that text from separate agent steps renders as\n * distinct paragraphs in markdown.\n *\n * Has no AI SDK dependency -- operates on a generic `DataPart[]`.\n *\n * @example\n * ```tsx\n * const text = getTextFromParts(message.parts);\n * if (text) {\n * return <Streamdown>{text}</Streamdown>;\n * }\n * ```\n */\nexport function getTextFromParts(parts: DataPart[]): string {\n return parts\n .filter(\n (p): p is DataPart & { text: string } =>\n p.type === \"text\" && typeof p.text === \"string\",\n )\n .map((p) => p.text.trim())\n .filter(Boolean)\n .join(\"\\n\\n\");\n}\n\n// =============================================================================\n// useJsonRenderMessage — extract spec + text from message parts\n// =============================================================================\n\n/**\n * Hook that extracts both the json-render spec and text content from a\n * message's parts array. Combines `buildSpecFromParts` and `getTextFromParts`\n * into a single call with memoized results.\n *\n * **Memoization behavior:** Results are recomputed only when the `parts`\n * accessor returns a new array reference with a different length or last\n * element. This is optimized for the typical AI SDK streaming pattern where\n * parts are appended incrementally.\n *\n * @example\n * ```tsx\n * import { useJsonRenderMessage } from \"@json-render/solid\";\n *\n * function MessageBubble(props: { parts: DataPart[] }) {\n * const msg = useJsonRenderMessage(() => props.parts);\n *\n * return (\n * <div>\n * {msg.text && <Markdown>{msg.text}</Markdown>}\n * {msg.hasSpec && <MyRenderer spec={msg.spec!} />}\n * </div>\n * );\n * }\n * ```\n */\nexport function useJsonRenderMessage(getParts: () => DataPart[]) {\n const result = createMemo(() => {\n const parts = getParts();\n return {\n spec: buildSpecFromParts(parts),\n text: getTextFromParts(parts),\n };\n });\n\n return {\n get spec() {\n return result().spec;\n },\n get text() {\n return result().text;\n },\n get hasSpec() {\n const s = result().spec;\n return s !== null && Object.keys(s.elements || {}).length > 0;\n },\n };\n}\n\n// =============================================================================\n// useChatUI — Chat + GenUI hook\n// =============================================================================\n\n/**\n * A single message in the chat, which may contain text, a rendered UI spec, or both.\n */\nexport interface ChatMessage {\n /** Unique message ID */\n id: string;\n /** Who sent this message */\n role: \"user\" | \"assistant\";\n /** Text content (conversational prose) */\n text: string;\n /** json-render Spec built from JSONL patches (null if no UI was generated) */\n spec: Spec | null;\n}\n\n/**\n * Options for useChatUI\n */\nexport interface UseChatUIOptions {\n /** API endpoint that accepts `{ messages: Array<{ role, content }> }` and returns a text stream */\n api: string;\n /** Callback when streaming completes for a message */\n onComplete?: (message: ChatMessage) => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n}\n\n/**\n * Return type for useChatUI\n */\nexport interface UseChatUIReturn {\n /** All messages in the conversation */\n readonly messages: ChatMessage[];\n /** Whether currently streaming an assistant response */\n readonly isStreaming: boolean;\n /** Error from the last request, if any */\n readonly error: Error | null;\n /** Send a user message */\n send: (text: string) => Promise<void>;\n /** Clear all messages and reset the conversation */\n clear: () => void;\n}\n\nlet chatMessageIdCounter = 0;\nfunction generateChatId(): string {\n if (\n typeof crypto !== \"undefined\" &&\n typeof crypto.randomUUID === \"function\"\n ) {\n return crypto.randomUUID();\n }\n chatMessageIdCounter += 1;\n return `msg-${Date.now()}-${chatMessageIdCounter}`;\n}\n\n/**\n * Hook for chat + GenUI experiences.\n *\n * Manages a multi-turn conversation where each assistant message can contain\n * both conversational text and a json-render UI spec. The hook sends the full\n * message history to the API endpoint, reads the streamed response, and\n * separates text lines from JSONL patch lines using `createMixedStreamParser`.\n *\n * @example\n * ```tsx\n * const chat = useChatUI({ api: \"/api/chat\" });\n *\n * // Send a message\n * await chat.send(\"Compare weather in NYC and Tokyo\");\n *\n * // Render messages\n * <For each={chat.messages}>\n * {(msg) => (\n * <div>\n * {msg.text && <p>{msg.text}</p>}\n * {msg.spec && <MyRenderer spec={msg.spec} />}\n * </div>\n * )}\n * </For>\n * ```\n */\nexport function useChatUI(options: UseChatUIOptions): UseChatUIReturn {\n const [messages, setMessages] = createSignal<ChatMessage[]>([]);\n const [isStreaming, setIsStreaming] = createSignal(false);\n const [error, setError] = createSignal<Error | null>(null);\n let abortController: AbortController | null = null;\n\n const clear = () => {\n setMessages([]);\n setError(null);\n };\n\n const send = async (text: string) => {\n if (!text.trim()) return;\n\n // Abort any existing request\n abortController?.abort();\n abortController = new AbortController();\n\n const userMessage: ChatMessage = {\n id: generateChatId(),\n role: \"user\",\n text: text.trim(),\n spec: null,\n };\n\n const assistantId = generateChatId();\n const assistantMessage: ChatMessage = {\n id: assistantId,\n role: \"assistant\",\n text: \"\",\n spec: null,\n };\n\n // Append user message and empty assistant placeholder\n setMessages((prev) => [...prev, userMessage, assistantMessage]);\n setIsStreaming(true);\n setError(null);\n\n // Build messages array for the API (full conversation history + new message).\n // Read current messages signal for latest state (avoids stale closure).\n const historyForApi = [\n ...messages()\n .filter((m) => m.id !== userMessage.id && m.id !== assistantId)\n .map((m) => ({\n role: m.role,\n content: m.text,\n })),\n { role: \"user\" as const, content: text.trim() },\n ];\n\n // Mutable state for accumulating the assistant response\n let accumulatedText = \"\";\n let currentSpec: Spec = { root: \"\", elements: {} };\n let hasSpec = false;\n\n try {\n const response = await fetch(options.api, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ messages: historyForApi }),\n signal: abortController.signal,\n });\n\n if (!response.ok) {\n let errorMessage = `HTTP error: ${response.status}`;\n try {\n const errorData = await response.json();\n if (errorData.message) {\n errorMessage = errorData.message;\n } else if (errorData.error) {\n errorMessage = errorData.error;\n }\n } catch {\n // Ignore JSON parsing errors\n }\n throw new Error(errorMessage);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error(\"No response body\");\n }\n\n const decoder = new TextDecoder();\n\n // Use createMixedStreamParser to classify lines\n const parser = createMixedStreamParser({\n onPatch(patch) {\n hasSpec = true;\n applySpecPatch(currentSpec, patch);\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantId\n ? {\n ...m,\n spec: {\n root: currentSpec.root,\n elements: { ...currentSpec.elements },\n ...(currentSpec.state\n ? { state: { ...currentSpec.state } }\n : {}),\n },\n }\n : m,\n ),\n );\n },\n onText(line) {\n accumulatedText += (accumulatedText ? \"\\n\" : \"\") + line;\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantId ? { ...m, text: accumulatedText } : m,\n ),\n );\n },\n });\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n parser.push(decoder.decode(value, { stream: true }));\n }\n parser.flush();\n\n // Build final message for onComplete callback\n const finalMessage: ChatMessage = {\n id: assistantId,\n role: \"assistant\",\n text: accumulatedText,\n spec: hasSpec\n ? {\n root: currentSpec.root,\n elements: { ...currentSpec.elements },\n ...(currentSpec.state ? { state: { ...currentSpec.state } } : {}),\n }\n : null,\n };\n options.onComplete?.(finalMessage);\n } catch (err) {\n if ((err as Error).name === \"AbortError\") {\n return;\n }\n const resolvedError = err instanceof Error ? err : new Error(String(err));\n setError(resolvedError);\n // Remove empty assistant message on error\n setMessages((prev) =>\n prev.filter((m) => m.id !== assistantId || m.text.length > 0),\n );\n options.onError?.(resolvedError);\n } finally {\n setIsStreaming(false);\n }\n };\n\n // Cleanup on disposal\n onCleanup(() => {\n abortController?.abort();\n });\n\n return {\n get messages() {\n return messages();\n },\n get isStreaming() {\n return isStreaming();\n },\n get error() {\n return error();\n },\n send,\n clear,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;ACAA,sBASO;AACP,kBAKO;AACP,yBAAkC;AAalC,IAAMA,mBAAeC,+BAAwC,IAAI;AAQjE,SAASC,mBACPC,cACAC,cACgC;AAChC,MAAID,aAAc,QAAO;AACzB,MAAIE,OAAOC,KAAKF,YAAY,EAAEG,WAAW,EAAG,QAAO,CAAC;AACpD,aAAOC,sCAAkBJ,YAAY;AACvC;AAEO,SAASK,cAAcC,OAAwC;AACpE,MAAIC;AACJ,MAAI,CAACD,MAAME,OAAO;AAChBD,wBAAgBE,8BAAiBH,MAAMN,gBAAgB,CAAC,CAAC;EAC3D;AAEA,QAAMQ,QAAQA,MAAMF,MAAME,SAASD;AAEnC,QAAMG,cAAcJ,MAAME,QAAQ,eAAe;AACjD,MAAIG,aAAa;AAEjB,MACE,OAAOC,eAAe,eACrBA,WAAmBC,SAASC,KAAKC,aAAa,cAC/C;AACAC,sCAAa,MAAM;AACjB,YAAMC,cAAcX,MAAME,QAAQ,eAAe;AACjD,UAAIS,gBAAgBP,eAAe,CAACC,YAAY;AAC9CA,qBAAa;AACbO,gBAAQC,KACN,iCAAiCT,WAAW,OAAOO,WAAW,yBAChE;MACF;IACF,CAAC;EACH;AAEA,MAAIG,mBAAmBd,MAAMN;AAC7B,MAAIqB,WAA2CvB,mBAC7C,CAAC,CAACQ,MAAME,OACRF,MAAMN,gBAAgB,CAAC,CACzB;AAEAgB,oCAAa,MAAM;AACjB,QAAIV,MAAME,MAAO;AACjB,UAAMR,eAAeM,MAAMN,gBAAgB,CAAC;AAC5C,QAAIA,iBAAiBoB,iBAAkB;AACvCA,uBAAmBpB;AACnB,UAAMsB,WACJtB,gBAAgBC,OAAOC,KAAKF,YAAY,EAAEG,SAAS,QAC/CC,sCAAkBJ,YAAY,IAC9B,CAAC;AACP,UAAMuB,cAAcF,YAAY,CAAC;AACjC,UAAMG,UAAU,oBAAIC,IAAI,CACtB,GAAGxB,OAAOC,KAAKqB,WAAW,GAC1B,GAAGtB,OAAOC,KAAKoB,QAAQ,CAAC,CACzB;AACD,UAAMI,UAAmC,CAAC;AAC1C,eAAWC,OAAOH,SAAS;AACzB,UAAID,YAAYI,GAAG,MAAML,SAASK,GAAG,GAAG;AACtCD,gBAAQC,GAAG,IAAIA,OAAOL,WAAWA,SAASK,GAAG,IAAIC;MACnD;IACF;AACAP,eAAWC;AACX,QAAIrB,OAAOC,KAAKwB,OAAO,EAAEvB,SAAS,GAAG;AACnCK,YAAM,EAAEqB,OAAOH,OAAO;IACxB;EACF,CAAC;AAED,QAAM,CAACI,OAAOC,QAAQ,QAAIC,8BAAyBxB,MAAM,EAAEyB,YAAY,GAAG;IACxEC,QAAQ;EACV,CAAC;AACD,QAAMC,kBAAkB,oBAAIV,IAE1B;AAEF,QAAMW,mBACJC,cACG;AACHF,oBAAgBG,IAAID,QAAQ;AAC5B,WAAO,MAAM;AACXF,sBAAgBI,OAAOF,QAAQ;IACjC;EACF;AAEA,QAAMG,gBAAiBC,aAAqD;AAC1E,eAAWJ,YAAYF,iBAAiB;AACtCE,eAASI,OAAO;IAClB;EACF;AAEAzB,oCAAa,MAAM;AACjB,UAAM0B,IAAIlC,MAAM;AAChBuB,aAASW,EAAET,YAAY,CAAC;AACxB,UAAMU,cAAcD,EAAEE,UAAU,MAAM;AACpCb,eAASW,EAAET,YAAY,CAAC;IAC1B,CAAC;AACDY,mCAAUF,WAAW;EACvB,CAAC;AAED,QAAMG,MAAMA,CAACC,MAAcC,UAAmB;AAC5C,UAAMN,IAAIlC,MAAM;AAChB,UAAMyC,OAAOP,EAAET,YAAY;AAC3B,UAAMiB,gBAAYC,uBAAUF,MAAMF,IAAI;AACtCL,MAAEI,IAAIC,MAAMC,KAAK;AACjB,QAAIE,cAAcF,OAAO;AACvB,YAAMP,UAAU,CAAC;QAAEM;QAAMC;MAAM,CAAC;AAChCR,oBAAcC,OAAO;AACrB,UAAI,CAACnC,MAAME,SAASkC,EAAET,YAAY,MAAMgB,MAAM;AAC5C3C,cAAM8C,gBAAgBX,OAAO;MAC/B;IACF;EACF;AAEA,QAAMZ,SAAUH,aAAqC;AACnD,UAAMgB,IAAIlC,MAAM;AAChB,UAAMyC,OAAOP,EAAET,YAAY;AAC3BS,MAAEb,OAAOH,OAAO;AAChB,UAAMe,UAAmD,CAAA;AACzD,eAAW,CAACM,MAAMC,KAAK,KAAK/C,OAAOoD,QAAQ3B,OAAO,GAAG;AACnD,cAAIyB,uBAAUF,MAAMF,IAAI,MAAMC,OAAO;AACnCP,gBAAQa,KAAK;UAAEP;UAAMC;QAAM,CAAC;MAC9B;IACF;AACA,QAAIP,QAAQtC,SAAS,GAAG;AACtBqC,oBAAcC,OAAO;AACrB,UAAI,CAACnC,MAAME,SAASkC,EAAET,YAAY,MAAMgB,MAAM;AAC5C3C,cAAM8C,gBAAgBX,OAAO;MAC/B;IACF;EACF;AAEA,QAAMc,MAAOR,UAAiBvC,MAAM,EAAE+C,IAAIR,IAAI;AAE9C,QAAMd,cAAcA,MAAMzB,MAAM,EAAEyB,YAAY;AAE9C,QAAMuB,MAAyB;IAC7B,IAAI1B,QAAQ;AACV,aAAOA,MAAM;IACf;IACAyB;IACAT;IACAjB;IACAI;IACAG;EACF;AAEA,aAAAqB,WAAAA,iBACG7D,aAAa8D,UAAQ;IAACV,OAAOQ;IAAG,IAAAG,WAAA;AAAA,aAAGrD,MAAMqD;IAAQ;EAAA,CAAA;AAEtD;AAEO,SAASC,gBAAmC;AACjD,QAAMJ,UAAMK,4BAAWjE,YAAY;AACnC,MAAI,CAAC4D,KAAK;AACR,UAAM,IAAIM,MAAM,mDAAmD;EACrE;AACA,SAAON;AACT;AAEO,SAASO,cAAiBhB,MAAuC;AACtE,QAAMvC,QAAQoD,cAAc;AAC5B,aAAOI,4BAAW,UAAMb,uBAAU3C,MAAMsB,OAAOiB,IAAI,CAAkB;AACvE;AAEO,SAASkB,gBACdlB,MAC+C;AAC/C,QAAMvC,QAAQoD,cAAc;AAC5B,QAAMZ,YAAQgB,4BAAW,UAAMb,uBAAU3C,MAAMsB,OAAOiB,IAAI,CAAkB;AAC5E,QAAMmB,WAAYC,cAAgB3D,MAAMsC,IAAIC,MAAMoB,QAAQ;AAC1D,SAAO,CAACnB,OAAOkB,QAAQ;AACzB;;;;AC/MA,IAAAE,mBAA4D;AAC5D,IAAAC,eAIO;AAQP,IAAMC,wBAAoBC,gCAA6C,IAAI;AAIpE,SAASC,mBAAmBC,OAAgC;AACjE,QAAMC,aAAaC,cAAc;AAEjC,QAAMC,gBAAuC;IAC3C,IAAIC,aAAa;AACf,aAAOH,WAAWI;IACpB;EACF;AAEA,QAAMC,QAAgC;IACpCC,WAAYC,mBACVC,iCAAmBD,WAAWL,aAAa;IAC7CO,KAAKP;EACP;AAEA,aAAAQ,YAAAA,iBACGd,kBAAkBe,UAAQ;IAACN;IAAY,IAAAO,WAAA;AAAA,aACrCb,MAAMa;IAAQ;EAAA,CAAA;AAGrB;AAEO,SAASC,gBAAwC;AACtD,QAAMJ,UAAMK,6BAAWlB,iBAAiB;AACxC,MAAI,CAACa,KAAK;AACR,UAAM,IAAIM,MAAM,wDAAwD;EAC1E;AACA,SAAON;AACT;AAEO,SAASO,aACdT,WACS;AACT,QAAM;IAAED;EAAU,IAAIO,cAAc;AACpC,SAAOP,UAAUC,SAAS;AAC5B;;;;;;;;;;;ACpDA,IAAAU,mBAMO;AACP,IAAAC,eAUO;;;;ACjBP,IAAAC,mBAQO;AACP,IAAAC,eAKO;AAmBP,IAAMC,wBAAoBC,gCAA6C,IAAI;AAM3E,SAASC,iBACPC,GACAC,GACS;AACT,MAAID,MAAMC,EAAG,QAAO;AACpB,MAAI,CAACD,KAAK,CAACC,EAAG,QAAO;AAErB,QAAMC,QAAQC,OAAOC,KAAKJ,CAAC;AAC3B,QAAMK,QAAQF,OAAOC,KAAKH,CAAC;AAC3B,MAAIC,MAAMI,WAAWD,MAAMC,OAAQ,QAAO;AAE1C,aAAWC,OAAOL,OAAO;AACvB,UAAMM,KAAKR,EAAEO,GAAG;AAChB,UAAME,KAAKR,EAAEM,GAAG;AAChB,QAAIC,OAAOC,GAAI;AACf,QACE,OAAOD,OAAO,YACdA,OAAO,QACP,OAAOC,OAAO,YACdA,OAAO,MACP;AACA,YAAMC,KAAMF,GAA+BG;AAC3C,YAAMC,KAAMH,GAA+BE;AAC3C,UAAI,OAAOD,OAAO,YAAYA,OAAOE,GAAI;IAC3C;AACA,WAAO;EACT;AACA,SAAO;AACT;AAEA,SAASC,sBACPb,GACAC,GACS;AACT,MAAID,MAAMC,EAAG,QAAO;AAEpB,MAAID,EAAEc,eAAeb,EAAEa,WAAY,QAAO;AAE1C,QAAMC,KAAKf,EAAEgB,UAAU,CAAA;AACvB,QAAMC,KAAKhB,EAAEe,UAAU,CAAA;AACvB,MAAID,GAAGT,WAAWW,GAAGX,OAAQ,QAAO;AAEpC,WAASY,IAAI,GAAGA,IAAIH,GAAGT,QAAQY,KAAK;AAClC,UAAMC,KAAKJ,GAAGG,CAAC;AACf,UAAME,KAAKH,GAAGC,CAAC;AACf,QAAIC,GAAGE,SAASD,GAAGC,KAAM,QAAO;AAChC,QAAIF,GAAGG,YAAYF,GAAGE,QAAS,QAAO;AACtC,QAAI,CAACvB,iBAAiBoB,GAAGI,MAAMH,GAAGG,IAAI,EAAG,QAAO;EAClD;AAEA,SAAO;AACT;AAEO,SAASC,mBACdC,OACA;AACA,QAAM;IAAEC;EAAY,IAAIC,cAAc;AACtC,QAAMC,kBAAkBA,MAAMH,MAAMG,mBAAmB,CAAC;AAExD,QAAM,CAACC,aAAaC,cAAc,QAAIC,+BAEpC,CAAC,CAAC;AACJ,MAAIC,iBAAuD,CAAC;AAE5D,QAAM,CAACC,cAAcC,eAAe,QAAIH,+BAEtC,CAAC,CAAC;AAEJ,QAAMI,gBAAgBA,CAACC,MAAcC,WAA6B;AAChEH,oBAAiBI,UAAS;AACxB,YAAMC,WAAWD,KAAKF,IAAI;AAC1B,UAAIG,YAAY1B,sBAAsB0B,UAAUF,MAAM,GAAG;AACvD,eAAOC;MACT;AACA,aAAO;QAAE,GAAGA;QAAM,CAACF,IAAI,GAAGC;MAAO;IACnC,CAAC;EACH;AAEA,QAAMG,WAAWA,CACfJ,MACAC,WACqB;AACrB,UAAMI,eAAef,YAAY;AACjC,UAAMgB,WAAWN,KAAKO,MAAM,GAAG,EAAEC,OAAOC,OAAO;AAC/C,QAAIC,SAAiBL;AACrB,eAAWM,OAAOL,UAAU;AAC1B,UAAII,UAAS,QAAQ,OAAOA,WAAU,UAAU;AAC9CA,QAAAA,SAASA,OAAkCC,GAAG;MAChD,OAAO;AACLD,QAAAA,SAAQE;AACR;MACF;IACF;AACA,UAAMC,aAASC,4BAAcb,QAAQ;MACnCS,OAAAA;MACAK,YAAYV;MACZb,iBAAiBA,gBAAgB;IACnC,CAAC;AAED,UAAMwB,gBAAsC;MAC1CC,SAASrB,eAAeI,IAAI,GAAGiB,WAAW;MAC1CC,WAAW;MACXL;IACF;AACAjB,qBAAiB;MACf,GAAGA;MACH,CAACI,IAAI,GAAGgB;IACV;AACAtB,mBAAeE,cAAc;AAE7B,WAAOiB;EACT;AAEA,QAAMM,QAASnB,UAAiB;AAC9BJ,qBAAiB;MACf,GAAGA;MACH,CAACI,IAAI,GAAG;QACN,GAAGJ,eAAeI,IAAI;QACtBiB,SAAS;QACTC,WAAWtB,eAAeI,IAAI,GAAGkB,aAAa;QAC9CL,QAAQjB,eAAeI,IAAI,GAAGa,UAAU;MAC1C;IACF;AACAnB,mBAAeE,cAAc;EAC/B;AAEA,QAAMwB,QAASpB,UAAiB;AAC9B,UAAM;MAAE,CAACA,IAAI,GAAGqB;MAAG,GAAGC;IAAK,IAAI1B;AAC/BA,qBAAiB0B;AACjB5B,mBAAe4B,IAAI;EACrB;AAEA,QAAMC,cAAcA,MAAM;AACxB,QAAIC,WAAW;AAEf,eAAW,CAACxB,MAAMC,MAAM,KAAKlC,OAAO0D,QAAQ5B,aAAa,CAAC,GAAG;AAC3D,YAAMgB,SAAST,SAASJ,MAAMC,MAAM;AACpC,UAAI,CAACY,OAAOa,OAAO;AACjBF,mBAAW;MACb;IACF;AAEA,WAAOA;EACT;AAEA,QAAMd,QAAgC;IACpC,IAAIlB,kBAAkB;AACpB,aAAOA,gBAAgB;IACzB;IACA,IAAIC,cAAc;AAChBA,kBAAY;AACZ,aAAOG;IACT;IACAQ;IACAe;IACAC;IACAG;IACAxB;EACF;AAEA,aAAA4B,YAAAA,iBACGlE,kBAAkBmE,UAAQ;IAAClB;IAAY,IAAAmB,WAAA;AAAA,aACrCxC,MAAMwC;IAAQ;EAAA,CAAA;AAGrB;AAEO,SAASC,gBAAwC;AACtD,QAAMC,UAAMC,6BAAWvE,iBAAiB;AACxC,MAAI,CAACsE,KAAK;AACR,UAAM,IAAIE,MAAM,wDAAwD;EAC1E;AACA,SAAOF;AACT;AAEO,SAASG,wBAAuD;AACrE,aAAOF,6BAAWvE,iBAAiB;AACrC;AAEO,SAAS0E,mBACdnC,MACAC,QAQA;AACA,QAAMmC,aAAaN,cAAc;AAEjCO,qCAAa,MAAM;AACjB,QAAIrC,QAAQC,QAAQ;AAClBmC,iBAAWrC,cAAcC,MAAMC,MAAM;IACvC;EACF,CAAC;AAED,QAAMqC,YAAQC,6BAAiC,MAAM;AACnD,UAAMC,UAAUJ,WAAW3C,YAAYO,IAAI;AAC3C,WACEwC,WAAW;MACTvB,SAAS;MACTC,WAAW;MACXL,QAAQ;IACV;EAEJ,CAAC;AAED,QAAMT,WAAWA,MAAMgC,WAAWhC,SAASJ,MAAMC,UAAU;IAAErB,QAAQ,CAAA;EAAG,CAAC;AACzE,QAAMuC,QAAQA,MAAMiB,WAAWjB,MAAMnB,IAAI;AACzC,QAAMoB,QAAQA,MAAMgB,WAAWhB,MAAMpB,IAAI;AACzC,QAAMyC,aAASF,6BAAW,MAAMD,MAAM,EAAEzB,QAAQ4B,UAAU,CAAA,CAAE;AAC5D,QAAMC,cAAUH,6BAAW,MAAMD,MAAM,EAAEzB,QAAQa,SAAS,IAAI;AAE9D,SAAO;IACLY;IACAlC;IACAe;IACAC;IACAqB;IACAC;EACF;AACF;;;;ADjPA,IAAIC,YAAY;AAChB,SAASC,mBAA2B;AAClCD,eAAa;AACb,SAAO,GAAGE,KAAKC,IAAI,CAAC,IAAIH,SAAS;AACnC;AAEA,SAASI,iBACPC,OACAC,KACS;AACT,MAAID,UAAU,QAAQA,UAAUE,OAAW,QAAOF;AAElD,MAAIA,UAAU,OAAO;AACnB,WAAOJ,iBAAiB;EAC1B;AAEA,MAAI,OAAOI,UAAU,YAAY,CAACG,MAAMC,QAAQJ,KAAK,GAAG;AACtD,UAAMK,MAAML;AACZ,UAAMM,OAAOC,OAAOD,KAAKD,GAAG;AAE5B,QAAIC,KAAKE,WAAW,KAAK,OAAOH,IAAII,WAAW,UAAU;AACvD,aAAOR,IAAII,IAAII,MAAgB;IACjC;AAEA,QAAIH,KAAKE,WAAW,KAAK,SAASH,KAAK;AACrC,aAAOT,iBAAiB;IAC1B;EACF;AAEA,MAAIO,MAAMC,QAAQJ,KAAK,GAAG;AACxB,WAAOA,MAAMU,IAAKC,UAASZ,iBAAiBY,MAAMV,GAAG,CAAC;EACxD;AAEA,MAAI,OAAOD,UAAU,UAAU;AAC7B,UAAMY,WAAoC,CAAC;AAC3C,eAAW,CAACC,KAAKC,GAAG,KAAKP,OAAOQ,QAAQf,KAAgC,GAAG;AACzEY,eAASC,GAAG,IAAId,iBAAiBe,KAAKb,GAAG;IAC3C;AACA,WAAOW;EACT;AAEA,SAAOZ;AACT;AAmBA,IAAMgB,oBAAgBC,gCAAyC,IAAI;AAO5D,SAASC,eAAeC,OAAyC;AACtE,QAAM;IAAElB;IAAKmB;IAAKC;EAAY,IAAIC,cAAc;AAChD,QAAMC,aAAaC,sBAAsB;AAEzC,QAAM,CAACC,UAAUC,WAAW,QAAIC,+BAC9BR,MAAMM,YAAY,CAAC,CACrB;AACA,QAAM,CAACG,gBAAgBC,iBAAiB,QAAIF,+BAC1C,oBAAIG,IAAI,CACV;AACA,QAAM,CAACC,qBAAqBC,sBAAsB,QAChDL,+BAAyC,IAAI;AAE/C,QAAMM,kBAAkBA,CAACC,MAAcC,YAA2B;AAChET,gBAAaU,WAAU;MAAE,GAAGA;MAAM,CAACF,IAAI,GAAGC;IAAQ,EAAE;EACtD;AAEA,QAAME,UAAU,OAAOC,YAA2B;AAChD,UAAM1B,eAAW2B,4BAAcD,SAASjB,YAAY,CAAC;AAGrD,UAAMmB,iBAAaC,mCAAqB;AACxC,UAAMC,eAAe7C,KAAKC,IAAI;AAC9B6C,2CAAqB;MACnBC,IAAIJ;MACJN,MAAMtB,SAASiC;MACfC,QAAQlC,SAASkC;MACjBC,IAAIL;IACN,CAAC;AACD,QAAIM,OAAO;AACX,QAAIC,UAAmB/C;AAEvB,QAAI;AACF,UAAIU,SAASiC,WAAW,cAAcjC,SAASkC,QAAQ;AACrD,cAAMI,YAAYtC,SAASkC,OAAOI;AAClC,cAAMlD,QAAQY,SAASkC,OAAO9C;AAC9B,YAAIkD,WAAW;AACb9B,cAAI8B,WAAWlD,KAAK;QACtB;AACA;MACF;AAEA,UAAIY,SAASiC,WAAW,eAAejC,SAASkC,QAAQ;AACtD,cAAMI,YAAYtC,SAASkC,OAAOI;AAClC,cAAMC,WAAWvC,SAASkC,OAAO9C;AACjC,YAAIkD,WAAW;AACb,gBAAME,gBAAgBrD,iBAAiBoD,UAAUlD,GAAG;AACpD,gBAAMoD,MAAOpD,IAAIiD,SAAS,KAA+B,CAAA;AACzD9B,cAAI8B,WAAW,CAAC,GAAGG,KAAKD,aAAa,CAAC;AACtC,gBAAME,iBAAiB1C,SAASkC,OAAOQ;AAGvC,cAAIA,gBAAgB;AAClBlC,gBAAIkC,gBAAgB,EAAE;UACxB;QACF;AACA;MACF;AAEA,UAAI1C,SAASiC,WAAW,iBAAiBjC,SAASkC,QAAQ;AACxD,cAAMI,YAAYtC,SAASkC,OAAOI;AAClC,cAAMK,QAAQ3C,SAASkC,OAAOS;AAC9B,YAAIL,cAAchD,UAAaqD,UAAUrD,QAAW;AAClD,gBAAMmD,MAAOpD,IAAIiD,SAAS,KAA+B,CAAA;AACzD9B,cACE8B,WACAG,IAAIG,OAAO,CAACC,GAAGC,MAAMA,MAAMH,KAAK,CAClC;QACF;AACA;MACF;AAEA,UAAI3C,SAASiC,WAAW,UAAUjC,SAASkC,QAAQ;AACjD,cAAMa,SAAS/C,SAASkC,OAAOa;AAC/B,YAAIA,QAAQ;AACV,gBAAMC,gBAAgB3D,IAAI,gBAAgB;AAC1C,gBAAM4D,WAAY5D,IAAI,WAAW,KAA8B,CAAA;AAC/D,cAAI2D,eAAe;AACjBxC,gBAAI,aAAa,CAAC,GAAGyC,UAAUD,aAAa,CAAC;UAC/C,OAAO;AACLxC,gBAAI,aAAa,CAAC,GAAGyC,UAAU,EAAE,CAAC;UACpC;AACAzC,cAAI,kBAAkBuC,MAAM;QAC9B;AACA;MACF;AAEA,UAAI/C,SAASiC,WAAW,OAAO;AAC7B,cAAMgB,WAAY5D,IAAI,WAAW,KAA8B,CAAA;AAC/D,YAAI4D,SAASrD,SAAS,GAAG;AACvB,gBAAMsD,iBAAiBD,SAASA,SAASrD,SAAS,CAAC;AACnDY,cAAI,aAAayC,SAASE,MAAM,GAAG,EAAE,CAAC;AACtC,cAAID,gBAAgB;AAClB1C,gBAAI,kBAAkB0C,cAAc;UACtC,OAAO;AACL1C,gBAAI,kBAAkBlB,MAAS;UACjC;QACF;AACA;MACF;AAEA,UAAIU,SAASiC,WAAW,gBAAgB;AACtC,cAAMmB,cAAczC,YAAYyC;AAChC,YAAI,CAACA,aAAa;AAChBC,kBAAQC,KACN,4IAEF;AACA;QACF;AACA,cAAMC,QAAQH,YAAY;AAC1B,cAAMI,SAAmC,CAAC;AAC1C,mBAAW,CAACC,MAAMC,EAAE,KAAK/D,OAAOQ,QAAQQ,WAAWgD,WAAW,GAAG;AAC/D,cAAID,GAAGE,UAAU,CAACF,GAAGE,OAAOL,OAAO;AACjCC,mBAAOC,IAAI,IAAIC,GAAGE,OAAOJ;UAC3B;QACF;AACA,cAAMlB,YACHtC,SAASkC,QAAQI,aAAwB;AAC5C9B,YAAI8B,WAAW;UAAEiB;UAAOC;QAAO,CAAC;AAChC;MACF;AAEA,YAAMjC,UAAUV,SAAS,EAAEb,SAASiC,MAAM;AAE1C,UAAI,CAACV,SAAS;AACZ8B,gBAAQC,KAAK,qCAAqCtD,SAASiC,MAAM,EAAE;AACnE;MACF;AAEA,UAAIjC,SAAS6D,SAAS;AACpB,eAAO,IAAIC,QAAc,CAACC,SAASC,WAAW;AAC5C5C,iCAAuB;YACrBa,QAAQjC;YACRuB;YACAwC,SAASA,MAAM;AACb3C,qCAAuB,IAAI;AAC3B2C,sBAAQ;YACV;YACAC,QAAQA,MAAM;AACZ5C,qCAAuB,IAAI;AAC3B4C,qBAAO,IAAIC,MAAM,kBAAkB,CAAC;YACtC;UACF,CAAC;QACH,CAAC,EAAEC,KAAK,YAAY;AAClBjD,4BAAmBO,UAAS,IAAIN,IAAIM,IAAI,EAAE2C,IAAInE,SAASiC,MAAM,CAAC;AAC9D,cAAI;AACF,sBAAMmC,4BAAc;cAClBnC,QAAQjC;cACRuB;cACA8C,UAAU7D;cACV8D,UAAU/D,MAAM+D;cAChBF,eAAe,OAAO9C,SAAiB;AACrC,sBAAMiD,aAA4B;kBAAEtC,QAAQX;gBAAK;AACjD,sBAAMG,QAAQ8C,UAAU;cAC1B;YACF,CAAC;UACH,UAAC;AACCtD,8BAAmBO,UAAS;AAC1B,oBAAMgD,OAAO,IAAItD,IAAIM,IAAI;AACzBgD,mBAAKC,OAAOzE,SAASiC,MAAM;AAC3B,qBAAOuC;YACT,CAAC;UACH;QACF,CAAC;MACH;AAEAvD,wBAAmBO,UAAS,IAAIN,IAAIM,IAAI,EAAE2C,IAAInE,SAASiC,MAAM,CAAC;AAC9D,UAAI;AACF,kBAAMmC,4BAAc;UAClBnC,QAAQjC;UACRuB;UACA8C,UAAU7D;UACV8D,UAAU/D,MAAM+D;UAChBF,eAAe,OAAO9C,SAAiB;AACrC,kBAAMiD,aAA4B;cAAEtC,QAAQX;YAAK;AACjD,kBAAMG,QAAQ8C,UAAU;UAC1B;QACF,CAAC;MACH,UAAC;AACCtD,0BAAmBO,UAAS;AAC1B,gBAAMgD,OAAO,IAAItD,IAAIM,IAAI;AACzBgD,eAAKC,OAAOzE,SAASiC,MAAM;AAC3B,iBAAOuC;QACT,CAAC;MACH;IACF,SAASE,KAAK;AACZtC,aAAO;AACPC,gBAAUqC;AACV,YAAMA;IACR,UAAC;AACC,YAAMxF,MAAMD,KAAKC,IAAI;AACrByF,2CAAmB;QACjB3C,IAAIJ;QACJN,MAAMtB,SAASiC;QACf2C,IAAIxC;QACJD,IAAIjD;QACJ2F,YAAY3F,MAAM4C;QAClBgD,OAAOzC;MACT,CAAC;IACH;EACF;AAEA,QAAMwB,UAAUA,MAAM;AACpB1C,wBAAoB,GAAG4C,QAAQ;EACjC;AAEA,QAAMgB,SAASA,MAAM;AACnB5D,wBAAoB,GAAG6C,OAAO;EAChC;AAEA,QAAMgB,MAA0B;IAC9B,IAAInE,WAAW;AACb,aAAOA,SAAS;IAClB;IACA,IAAIG,iBAAiB;AACnB,aAAOA,eAAe;IACxB;IACA,IAAIG,sBAAsB;AACxB,aAAOA,oBAAoB;IAC7B;IACAM;IACAoC;IACAkB;IACA1D;EACF;AAEA,aAAA4D,aAAAA,iBACG7E,cAAc8E,UAAQ;IAAC9F,OAAO4F;IAAG,IAAAG,WAAA;AAAA,aAC/B5E,MAAM4E;IAAQ;EAAA,CAAA;AAGrB;AAEO,SAASC,aAAiC;AAC/C,QAAMJ,UAAMK,6BAAWjF,aAAa;AACpC,MAAI,CAAC4E,KAAK;AACR,UAAM,IAAIf,MAAM,kDAAkD;EACpE;AACA,SAAOe;AACT;AAEO,SAASM,UAAU5D,SAGxB;AACA,QAAM6D,UAAUH,WAAW;AAC3B,SAAO;IACL3D,SAASA,MAAM8D,QAAQ9D,QAAQC,OAAO;IACtC,IAAI8D,YAAY;AACd,aAAOD,QAAQvE,eAAeyE,IAAI/D,QAAQO,MAAM;IAClD;EACF;AACF;AAQO,SAASyD,cAAcnF,OAAwC;AACpE,QAAMoF,WAAWA,MAAMpF,MAAMsD,QAAQ+B,YAAY;AAEjD,UAAA,MAAA;AAAA,QAAAC,OAAAC,OAAA,GAAAC,QAAAF,KAAAG,YAAAC,QAAAF,MAAAC,YAAAE,QAAAD,MAAAE,aAAAC,QAAAF,MAAAC,aAAAE,QAAAD,MAAAJ,YAAAM,QAAAD,MAAAF;AAAAI,qBAAAA,kBAAAV,MAAA,SAWatF,MAAMiG,UAAQ,IAAA;AAAAT,UAAAU,UAWXC,OAAMA,EAAEC,gBAAgB;AAACC,oBAAAA,QAAAX,OAAA,MAShC1F,MAAMsD,QAAQgD,KAAK;AAAAD,oBAAAA,QAAAV,OAAA,MAQnB3F,MAAMsD,QAAQiD,OAAO;AAAAP,qBAAAA,kBAAAF,OAAA,SAUX9F,MAAMiG,UAAQ,IAAA;AAAAI,oBAAAA,QAAAP,OAAA,MAStB9F,MAAMsD,QAAQkD,eAAe,QAAQ;AAAAR,qBAAAA,kBAAAD,OAAA,SAG7B/F,MAAMyG,WAAS,IAAA;AAAAJ,oBAAAA,QAAAN,OAAA,MAUvB/F,MAAMsD,QAAQoD,gBAAgB,SAAS;AAAAC,oBAAAA,QAAAC,aAAAC,YAAAA,kBAAAd,OAAA,oBALlBX,SAAS,IAAI,YAAY,SAAS,CAAA;AAAA,WAAAE;EAAA,GAAA;AAWpE;IAACwB,YAAAA,gBAAA,CAAA,OAAA,CAAA;;;;AE9aD,IAAAC,mBAA4D;AAQ5D,IAAMC,yBAAqBC,gCAAuC,IAAI;AAE/D,SAASC,oBAAoBC,OAAsC;AACxE,aAAAC,aAAAA,iBACGJ,mBAAmBK,UAAQ;IAAA,IAC1BC,QAAK;AAAA,aAAE;QAAEC,MAAMJ,MAAMI;QAAMC,OAAOL,MAAMK;QAAOC,UAAUN,MAAMM;MAAS;IAAC;IAAA,IAAAC,WAAA;AAAA,aAExEP,MAAMO;IAAQ;EAAA,CAAA;AAGrB;AAEO,SAASC,iBAA0C;AACxD,aAAOC,6BAAWZ,kBAAkB;AACtC;;;ACtBA,IAAAa,eAA6B;AAStB,IAAM,aAAS;AAAA,EACpB,CAAC,OAAO;AAAA;AAAA,IAEN,MAAM,EAAE,OAAO;AAAA;AAAA,MAEb,MAAM,EAAE,OAAO;AAAA;AAAA,MAEf,UAAU,EAAE;AAAA,QACV,EAAE,OAAO;AAAA;AAAA,UAEP,MAAM,EAAE,IAAI,oBAAoB;AAAA;AAAA,UAEhC,OAAO,EAAE,QAAQ,oBAAoB;AAAA;AAAA,UAErC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA;AAAA,UAE5B,SAAS,EAAE,IAAI;AAAA,QACjB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA;AAAA,IAGD,SAAS,EAAE,OAAO;AAAA;AAAA,MAEhB,YAAY,EAAE,IAAI;AAAA;AAAA,QAEhB,OAAO,EAAE,IAAI;AAAA;AAAA,QAEb,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA;AAAA,QAEzB,aAAa,EAAE,OAAO;AAAA;AAAA,QAEtB,SAAS,EAAE,IAAI;AAAA,MACjB,CAAC;AAAA;AAAA,MAED,SAAS,EAAE,IAAI;AAAA;AAAA,QAEb,QAAQ,EAAE,IAAI;AAAA;AAAA,QAEd,aAAa,EAAE,OAAO;AAAA,MACxB,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EACA;AAAA,IACE,gBAAgB;AAAA,MACd;AAAA,QACE,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,cAAc;AAAA;AAAA,MAEZ;AAAA,MACA;AAAA;AAAA,MAGA;AAAA,MACA;AAAA;AAAA,MAGA;AAAA,MACA;AAAA;AAAA,MAGA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAkBO,IAAM,oBAAoB;;;ANtDjC,IAAAC,eAAiC;;;;;;;;;AO1DjC,IAAAC,mBAYO;AAUP,IAAAC,eAUO;;AAwEP,IAAMC,kBAAoD,CAAC;AAE3D,IAAMC,uBACJC,gCAAgDF,eAAe;AAEjE,SAASG,eAAiD;AACxD,aAAOC,6BAAWH,gBAAgB,KAAKD;AACzC;AAgBA,SAASK,oBAAoB;AAC3B,QAAM,CAACC,QAAQC,SAAS,QAAIC,mCAAaC,+BAAiB,CAAC;AAC3D,QAAMC,YAAQC,sCAAwB,MAAMJ,cAAUE,+BAAiB,CAAC,CAAC;AACzEG,kCAAUF,KAAK;AACf,SAAOJ;AACT;AAKA,SAASO,gBAAgBC,OAA6B;AACpD,QAAMC,cAAcC,eAAe;AACnC,QAAM;IAAEC;EAAI,IAAIC,cAAc;AAC9B,QAAM;IAAEC;EAAQ,IAAIC,WAAW;AAC/B,QAAMC,aAAaC,cAAc;AACjC,QAAMC,cAAcA,MAAMF,WAAWE,YAAY;AACjD,QAAMC,YAAYrB,aAAa;AAG/B,QAAMsB,cAAUC,6BAAkC,MAAM;AACtD,UAAMC,aAAaZ,aAAaa;AAChC,UAAMC,cAAcd,aAAae;AACjC,UAAMC,iBAAiBhB,aAAaiB;AAEpC,WAAO;MACL,IAAIC,aAAa;AACf,eAAOhB,IAAIgB;MACb;MACA,GAAIN,eAAeO,SAAY;QAAEP;MAAW,IAAI,CAAC;MACjD,GAAIE,gBAAgBK,SAAY;QAAEL;MAAY,IAAI,CAAC;MACnD,GAAIE,mBAAmBG,SAAY;QAAEH;MAAe,IAAI,CAAC;MACzDP;IACF;EACF,CAAC;AAGD,QAAMW,gBAAYT,6BAAW,MAC3BZ,MAAMsB,QAAQC,YAAYH,SACtB,WACAI,iCAAmBxB,MAAMsB,QAAQC,SAASZ,QAAQ,CAAC,CACzD;AAGA,QAAMc,OAAO,OAAOC,cAAsB;AACxC,UAAMC,aAAa3B,MAAMsB,QAAQM;AACjC,UAAMC,UAAUF,aAAaD,SAAS;AACtC,QAAI,CAACG,QAAS;AACd,UAAMC,iBAAiBC,MAAMC,QAAQH,OAAO,IAAIA,UAAU,CAACA,OAAO;AAClE,eAAWI,KAAKH,gBAAgB;AAC9B,UAAI,CAACG,EAAEC,QAAQ;AACb,cAAM7B,QAAQ4B,CAAC;AACf;MACF;AAGA,YAAME,UAAiC;QACrC,GAAGxB,QAAQ;QACXQ,YAAYV,YAAY;MAC1B;AACA,YAAM2B,WAAoC,CAAC;AAC3C,iBAAW,CAACC,KAAKC,GAAG,KAAKC,OAAOC,QAAQP,EAAEC,MAAM,GAAG;AACjDE,iBAASC,GAAG,QAAII,iCAAmBH,KAAKH,OAAO;MACjD;AACA,YAAM9B,QAAQ;QAAE,GAAG4B;QAAGC,QAAQE;MAAS,CAAC;IAC1C;EACF;AAGA,QAAMR,KAAMF,eAAmC;AAC7C,UAAMC,aAAa3B,MAAMsB,QAAQM;AACjC,UAAMC,UAAUF,aAAaD,SAAS;AACtC,QAAI,CAACG,SAAS;AACZ,aAAO;QAAEJ,MAAMA,MAAM;QAAC;QAAGiB,sBAAsB;QAAOC,OAAO;MAAM;IACrE;AACA,UAAMb,iBAAiBC,MAAMC,QAAQH,OAAO,IAAIA,UAAU,CAACA,OAAO;AAClE,UAAMa,uBAAuBZ,eAAec,KAAMX,OAAMA,EAAEY,cAAc;AACxE,WAAO;MACLpB,MAAMA,MAAMA,KAAKC,SAAS;MAC1BgB;MACAC,OAAO;IACT;EACF;AAGAG,qCAAa,MAAM;AACjB,UAAMC,cAAc/C,MAAMsB,QAAQ0B;AAClC,QAAI,CAACD,YAAa;AAClB,UAAME,QAAQV,OAAOW,KAAKH,WAAW;AACrC,QAAIE,MAAME,WAAW,EAAG;AAExB,UAAMC,cAAc7C,WAAW8C,iBAAkBC,aAAY;AAC3D,YAAMC,eAAe,IAAIC,IAAIF,QAAQG,IAAKC,YAAWA,OAAOC,IAAI,CAAC;AAEjE,YAAM,YAAY;AAChB,mBAAWA,QAAQV,OAAO;AACxB,cAAI,CAACM,aAAaK,IAAID,IAAI,EAAG;AAE7B,gBAAM9B,UAAUkB,YAAYY,IAAI;AAChC,cAAI,CAAC9B,QAAS;AACd,gBAAMgC,WAAW9B,MAAMC,QAAQH,OAAO,IAAIA,UAAU,CAACA,OAAO;AAE5D,qBAAWI,KAAK4B,UAAU;AACxB,gBAAI,CAAC5B,EAAEC,QAAQ;AACb,oBAAM7B,QAAQ4B,CAAC;AACf;YACF;AACA,kBAAME,UAAiC;cACrC,GAAGxB,QAAQ;cACXQ,YAAYV,YAAY;YAC1B;AACA,kBAAM2B,WAAoC,CAAC;AAC3C,uBAAW,CAACC,KAAKC,GAAG,KAAKC,OAAOC,QAAQP,EAAEC,MAAM,GAAG;AACjDE,uBAASC,GAAG,QAAII,iCAAmBH,KAAKH,OAAO;YACjD;AACA,kBAAM9B,QAAQ;cAAE,GAAG4B;cAAGC,QAAQE;YAAS,CAAC;UAC1C;QACF;MACF,GAAG,EAAE0B,MAAMC,QAAQC,KAAK;IAC1B,CAAC;AAEDlE,oCAAU,MAAM;AACdsD,kBAAY;IACd,CAAC;EACH,CAAC;AAGD,QAAMa,sBAAkBrD,6BAAW,MAAM;AACvC,UAAMsD,WAAWlE,MAAMsB,QAAQtB;AAC/B,eAAOmE,8BAAgBD,UAAUvD,QAAQ,CAAC;EAC5C,CAAC;AAGD,QAAMyD,sBAAkBxD,6BAAW,MAAM;AACvC,UAAMsD,WAAWlE,MAAMsB,QAAQtB;AAC/B,UAAMqE,oBAAgBC,kCAAoBJ,UAAUvD,QAAQ,CAAC;AAC7D,WAAO0D,kBAAkBrE,MAAMsB,QAAQtB,QACnC;MAAE,GAAGA,MAAMsB;MAAStB,OAAOqE;IAAc,IACzCrE,MAAMsB;EACZ,CAAC;AAED,aAAAiD,aAAAA,iBACGC,uBAAI;IAAA,IAACC,OAAI;AAAA,aAAEpD,UAAU;IAAC;IAAA,IAAAqD,WAAA;AAAA,iBAAAH,aAAAA,iBACpBI,gCAAa;QACZC,UAAWC,SAAQ;AACjBd,kBAAQC,MACN,qCAAqChE,MAAMsB,QAAQwD,IAAI,MACvDD,GACF;AACA,iBAAO;QACT;QAAC,IAAAH,WAAA;AAAA,qBAAAH,aAAAA,iBAEAQ,wBAAsB;YAAA,IACrBX,kBAAe;AAAA,qBAAEA,gBAAgB;YAAC;YAAA,IAClCY,aAAU;AAAA,qBAAEhF,MAAMgF;YAAU;YAAA,IAC5BC,OAAI;AAAA,qBAAEjF,MAAMiF;YAAI;YAAA,IAChBC,WAAQ;AAAA,qBAAElF,MAAMkF;YAAQ;YAAA,IACxBC,UAAO;AAAA,qBAAEnF,MAAMmF;YAAO;YAAA,IACtBP,WAAQ;AAAA,qBAAE5E,MAAM4E;YAAQ;YACxBnD;YACAG;YAAM,IACNiC,WAAQ;AAAA,qBAAEI,gBAAgB;YAAC;UAAA,CAAA;QAAA;MAAA,CAAA;IAAA;EAAA,CAAA;AAKrC;AAiBA,SAASc,uBAAuB/E,OAAoC;AAClE,QAAMoF,iBAAiB7F,kBAAkB;AAEzC,QAAM8F,OAAOA,MACXrF,MAAMkF,SAASlF,MAAMoE,gBAAgBU,IAAI,KAAK9E,MAAM4E;AAEtD,aAAAL,aAAAA,iBACGC,uBAAI;IAAA,IACHC,OAAI;AAAA,aAAEY,KAAK;IAAC;IAAA,IACZT,WAAiB;AACfb,cAAQuB,KACN,mCAAmCtF,MAAMoE,gBAAgBU,IAAI,EAC/D;AACA,aAAO;IACT;IAACJ,UAECa,iBAAgB;AAChB,YAAMC,YAAYD,YAAY;AAE9B,YAAMb,WAAWA,MACf1E,MAAMoE,gBAAgBqB,aAAMlB,aAAAA,iBACzBmB,gBAAc;QAAA,IACbpE,UAAO;AAAA,iBAAEtB,MAAMoE;QAAe;QAAA,IAC9Ba,OAAI;AAAA,iBAAEjF,MAAMiF;QAAI;QAAA,IAChBC,WAAQ;AAAA,iBAAElF,MAAMkF;QAAQ;QAAA,IACxBC,UAAO;AAAA,iBAAEnF,MAAMmF;QAAO;QAAA,IACtBP,WAAQ;AAAA,iBAAE5E,MAAM4E;QAAQ;MAAA,CAAA,QAAAL,aAAAA,iBAGzBoB,sBAAG;QAAA,IAACC,OAAI;AAAA,iBAAE5F,MAAMoE,gBAAgBM,YAAY,CAAA;QAAE;QAAAA,UAC3CmB,cAAa;AACb,gBAAMC,eAAeA,MAAM9F,MAAMiF,KAAKc,SAASF,QAAQ;AACvD,qBAAAtB,aAAAA,iBACGC,uBAAI;YAAA,IACHC,OAAI;AAAA,qBAAEqB,aAAa;YAAC;YAAA,IACpBlB,WAAiB;AACf,kBAAI,CAAC5E,MAAMmF,SAAS;AAClBpB,wBAAQuB,KACN,kCAAkCO,QAAQ,6BAA6B7F,MAAMoE,gBAAgBU,IAAI,kCACnG;cACF;AACA,qBAAO;YACT;YAACJ,UAECsB,YAAEzB,aAAAA,iBACDxE,iBAAe;cAAA,IACduB,UAAO;AAAA,uBAAE0E,GAAG;cAAC;cACbhB,YAAYa;cAAQ,IACpBZ,OAAI;AAAA,uBAAEjF,MAAMiF;cAAI;cAAA,IAChBC,WAAQ;AAAA,uBAAElF,MAAMkF;cAAQ;cAAA,IACxBC,UAAO;AAAA,uBAAEnF,MAAMmF;cAAO;cAAA,IACtBP,WAAQ;AAAA,uBAAE5E,MAAM4E;cAAQ;YAAA,CAAA;UAE3B,CAAA;QAGP;MAAC,CAAA;AAIP,YAAMqB,eAAQ1B,aAAAA,iBACXiB,WAAS;QAAA,IACRlE,UAAO;AAAA,iBAAEtB,MAAMoE;QAAe;QAAA,IAC9B3C,OAAI;AAAA,iBAAEzB,MAAMyB;QAAI;QAAA,IAChBG,KAAE;AAAA,iBAAE5B,MAAM4B;QAAE;QAAA,IACZiC,WAAQ;AAAA,iBAAE7D,MAAM6D;QAAQ;QAAA,IACxBsB,UAAO;AAAA,iBAAEnF,MAAMmF;QAAO;QAAA,IAAAT,WAAA;AAAA,iBAErBA,SAAS;QAAC;MAAA,CAAA;AAIf,iBAAAH,aAAAA,iBACGC,uBAAI;QAAA,IAACC,OAAI;AAAA,qBAAEyB,aAAAA,MAAA,MAAA,CAAA,CAAAd,eAAe,CAAC,EAAA,KAAIpF,MAAMgF;QAAU;QAAEJ,UAAUqB;QAAQ,IAAAvB,WAAA;AAAA,cAAAyB,OAAAC,QAAA;AAAAC,2BAAAA,QAAAF,MAK/DF,QAAQ;AAAAK,2BAAAA,QAAA,UAAAC,aAAAA,cAAAJ,MAAA,eAHInG,MAAMgF,UAAU,CAAA;AAAA,iBAAAmB;QAAA;MAAA,CAAA;IAOrC;EAAC,CAAA;AAGP;AAeA,SAAST,eAAe1F,OAA4B;AAClD,QAAMO,aAAaC,cAAc;AACjC,QAAMiF,SAASA,MAAMzF,MAAMsB,QAAQmE;AACnC,QAAMe,YAAYA,MAAMf,OAAO,EAAEe;AAEjC,QAAMC,QAAQA,UACXC,wBAAUnG,WAAWoG,OAAOH,UAAU,CAAC,KAA+B,CAAA;AAEzE,aAAAjC,aAAAA,iBACGoB,sBAAG;IAAA,IAACC,OAAI;AAAA,aAAEa,MAAM;IAAC;IAAA/B,UACfA,CAACkC,WAAW5F,UAAU;AACrB,YAAMqB,MAAMA,MAAM;AAChB,cAAMwE,IAAIpB,OAAO;AACjB,eAAOoB,EAAExE,OAAO,OAAOuE,cAAc,YAAYA,cAAc,OAC3DE,OAAQF,UAAsCC,EAAExE,GAAG,KAAKrB,MAAM,CAAC,IAC/D8F,OAAO9F,MAAM,CAAC;MACpB;AAEA,iBAAAuD,aAAAA,iBACGwC,qBAAmB;QAClBjG,MAAM8F;QAAS,IACf5F,QAAK;AAAA,iBAAEA,MAAM;QAAC;QAAA,IACdE,WAAQ;AAAA,iBAAE,GAAGsF,UAAU,CAAC,IAAIxF,MAAM,CAAC;QAAE;QAAA,IAAA0D,WAAA;AAAA,qBAAAH,aAAAA,iBAEpCoB,sBAAG;YAAA,IAACC,OAAI;AAAA,qBAAE5F,MAAMsB,QAAQoD,YAAY,CAAA;YAAE;YAAAA,UACnCmB,cAAa;AACb,oBAAMC,eAAeA,MAAM9F,MAAMiF,KAAKc,SAASF,QAAQ;AACvD,yBAAAtB,aAAAA,iBACGC,uBAAI;gBAAA,IACHC,OAAI;AAAA,yBAAEqB,aAAa;gBAAC;gBAAA,IACpBlB,WAAiB;AACf,sBAAI,CAAC5E,MAAMmF,SAAS;AAClBpB,4BAAQuB,KACN,kCAAkCO,QAAQ,6BAA6B7F,MAAMsB,QAAQwD,IAAI,2CAC3F;kBACF;AACA,yBAAO;gBACT;gBAACJ,UAECsB,YAAEzB,aAAAA,iBACDxE,iBAAe;kBAAA,IACduB,UAAO;AAAA,2BAAE0E,GAAG;kBAAC;kBAAA,IACbf,OAAI;AAAA,2BAAEjF,MAAMiF;kBAAI;kBAAA,IAChBC,WAAQ;AAAA,2BAAElF,MAAMkF;kBAAQ;kBAAA,IACxBC,UAAO;AAAA,2BAAEnF,MAAMmF;kBAAO;kBAAA,IACtBP,WAAQ;AAAA,2BAAE5E,MAAM4E;kBAAQ;gBAAA,CAAA;cAE3B,CAAA;YAGP;UAAC,CAAA;QAAA;MAAA,CAAA;IAIT;EAAC,CAAA;AAGP;AAKO,SAASoC,SAAShH,OAAsB;AAC7C,QAAMiH,kBAAcrG,6BAAW,MAAM;AACnC,UAAMqE,OAAOjF,MAAMiF;AACnB,QAAI,CAACA,QAAQ,CAACA,KAAKiC,KAAM,QAAO9F;AAChC,WAAO6D,KAAKc,SAASd,KAAKiC,IAAI;EAChC,CAAC;AAED,aAAA3C,aAAAA,iBACGC,uBAAI;IAAA,IAACC,OAAI;AAAA,aAAEwC,YAAY;IAAC;IAAAvC,UACrBsB,YAAEzB,aAAAA,iBACDxE,iBAAe;MAAA,IACduB,UAAO;AAAA,eAAE0E,GAAG;MAAC;MAAA,IACbhB,aAAU;AAAA,eAAEhF,MAAMiF,KAAMiC;MAAI;MAAA,IAC5BjC,OAAI;AAAA,eAAEjF,MAAMiF;MAAI;MAAA,IAChBC,WAAQ;AAAA,eAAElF,MAAMkF;MAAQ;MAAA,IACxBC,UAAO;AAAA,eAAEnF,MAAMmF;MAAO;MAAA,IACtBP,WAAQ;AAAA,eAAE5E,MAAM4E;MAAQ;IAAA,CAAA;EAE3B,CAAA;AAGP;AAqCO,SAASuC,eAAenH,OAA4B;AACzD,aAAAuE,aAAAA,iBACG6C,eAAa;IAAA,IACZC,QAAK;AAAA,aAAErH,MAAMqH;IAAK;IAAA,IAClBC,eAAY;AAAA,aAAEtH,MAAMsH;IAAY;IAAA,IAChCC,gBAAa;AAAA,aAAEvH,MAAMuH;IAAa;IAAA,IAAA7C,WAAA;AAAA,iBAAAH,aAAAA,iBAEjCiD,oBAAkB;QAAA,IAAA9C,WAAA;AAAA,qBAAAH,aAAAA,iBAChBkD,oBAAkB;YAAA,IAACC,kBAAe;AAAA,qBAAE1H,MAAM2H;YAAmB;YAAA,IAAAjD,WAAA;AAAA,yBAAAH,aAAAA,iBAC3DqD,gBAAc;gBAAA,IAACC,WAAQ;AAAA,yBAAE7H,MAAM6H;gBAAQ;gBAAA,IAAEC,WAAQ;AAAA,yBAAE9H,MAAM8H;gBAAQ;gBAAA,IAAApD,WAAA;AAAA,6BAAAH,aAAAA,iBAC/DpF,iBAAiB4I,UAAQ;oBAAA,IACxBC,QAAK;AAAA,6BAAEhI,MAAMU,aAAaxB;oBAAe;oBAAA,IAAAwF,WAAA;AAAA,6BAAA,KAAAwB,aAAAA,MAAA,MAExClG,MAAM0E,QAAQ,OAAAH,aAAAA,iBACd0D,2BAAyB,CAAA,CAAA,CAAA;oBAAA;kBAAA,CAAA;gBAAA;cAAA,CAAA;YAAA;UAAA,CAAA;QAAA;MAAA,CAAA;IAAA;EAAA,CAAA;AAOxC;AAKA,SAASA,4BAA4B;AACnC,QAAM;IAAEC;IAAqBC;IAASC;EAAO,IAAI9H,WAAW;AAE5D,aAAAiE,aAAAA,iBACGC,uBAAI;IAAA,IAACC,OAAI;AAAA,aAAEyD,qBAAqBG,OAAOF;IAAO;IAAAzD,UAC3C4D,uBAAa/D,aAAAA,iBACZgE,eAAa;MAAA,IACZJ,UAAO;AAAA,eAAEG,cAAc;MAAC;MACxBE,WAAWL;MACXM,UAAUL;IAAM,CAAA;EAEnB,CAAA;AAGP;AAoEO,SAASM,eACdC,UACAC,SACsB;AAEtB,QAAM1D,WAA8B,CAAC;AACrC,MAAI0D,QAAQC,YAAY;AACtB,eAAW,CAACC,MAAMC,WAAW,KAAKxG,OAAOC,QAAQoG,QAAQC,UAAU,GAAG;AACpE3D,eAAS4D,IAAI,IAAKE,iBAAsC;AACtD,eAAQD,YAA0C;UAChD,IAAI/I,QAAQ;AACV,mBAAOgJ,YAAY1H,QAAQtB;UAC7B;UACA,IAAI0E,WAAW;AACb,mBAAOsE,YAAYtE;UACrB;UACAjD,MAAMuH,YAAYvH;UAClBG,IAAIoH,YAAYpH;UAChB,IAAIiC,WAAW;AACb,mBAAOmF,YAAYnF;UACrB;UACA,IAAIsB,UAAU;AACZ,mBAAO6D,YAAY7D;UACrB;QACF,CAAC;MACH;IACF;EACF;AAGA,QAAM8D,YAAYL,QAAQM,UACrB3G,OAAOC,QAAQoG,QAAQM,OAAO,IAG/B,CAAA;AAEJ,QAAMrB,WAAWA,CACfsB,aACAC,aACuE;AACvE,UAAMC,SAGF,CAAC;AACL,eAAW,CAACP,MAAMQ,QAAQ,KAAKL,WAAW;AACxCI,aAAOP,IAAI,IAAI,OAAO5G,WAAW;AAC/B,cAAMqH,WAAWJ,YAAY;AAC7B,cAAMxC,QAAQyC,SAAS;AACvB,YAAIG,UAAU;AACZ,gBAAMD,SAASpH,QAAQqH,UAAU5C,KAAK;QACxC;MACF;IACF;AACA,WAAO0C;EACT;AAEA,QAAMG,iBAAgB,OACpBC,YACAvH,QACAqH,UACA5C,QAAoB,CAAC,MACH;AAClB,UAAM+C,QAAQT,UAAUU,KAAK,CAAC,CAACb,IAAI,MAAMA,SAASW,UAAU;AAC5D,QAAIC,OAAO;AACT,YAAMA,MAAM,CAAC,EAAExH,QAAQqH,UAAU5C,KAAK;IACxC,OAAO;AACL5C,cAAQuB,KAAK,mBAAmBmE,UAAU,EAAE;IAC9C;EACF;AAEA,SAAO;IAAEvE;IAAU2C;IAAU2B,eAAAA;EAAc;AAC7C;AA6EO,SAASI,eAIdC,SACAhB,YACgC;AAEhC,QAAM3D,WACJ2D;AAGF,SAAO,SAASiB,gBAAgB9J,OAA4B;AAE1D,UAAM+J,iBAAiBA,MACrB/J,MAAMgK,WACF,IAAIC,MACF,CAAC,GAID;MACEC,KAAKA,CAACC,SAASC,SAAiB;AAC9B,eAAQlI,YACNlC,MAAMgK,SAAUI,MAAMlI,MAAM;MAChC;MACA0B,KAAKA,MAAM;IACb,CACF,IACAxC;AAEN,eAAAmD,aAAAA,iBACG6C,eAAa;MAAA,IACZC,QAAK;AAAA,eAAErH,MAAMqH;MAAK;MAAA,IAClBC,eAAY;AAAA,eAAEtH,MAAM2G;MAAK;MAAA,IACzBY,gBAAa;AAAA,eAAEvH,MAAMuH;MAAa;MAAA,IAAA7C,WAAA;AAAA,mBAAAH,aAAAA,iBAEjCiD,oBAAkB;UAAA,IAAA9C,WAAA;AAAA,uBAAAH,aAAAA,iBAChBkD,oBAAkB;cAAA,IAAA/C,WAAA;AAAA,2BAAAH,aAAAA,iBAChBqD,gBAAc;kBAAA,IAACC,WAAQ;AAAA,2BAAEkC,eAAe;kBAAC;kBAAA,IAAArF,WAAA;AAAA,+BAAAH,aAAAA,iBACvCpF,iBAAiB4I,UAAQ;sBAAA,IACxBC,QAAK;AAAA,+BAAEhI,MAAMU,aAAaxB;sBAAe;sBAAA,IAAAwF,WAAA;AAAA,+BAAA,KAAAH,aAAAA,iBAExCyC,UAAQ;0BAAA,IACP/B,OAAI;AAAA,mCAAEjF,MAAMiF;0BAAI;0BAChBC;0BAAkB,IAClBC,UAAO;AAAA,mCAAEnF,MAAMmF;0BAAO;0BAAA,IACtBP,WAAQ;AAAA,mCAAE5E,MAAM4E;0BAAQ;wBAAA,CAAA,OAAAL,aAAAA,iBAEzB0D,2BAAyB,CAAA,CAAA,CAAA;sBAAA;oBAAA,CAAA;kBAAA;gBAAA,CAAA;cAAA;YAAA,CAAA;UAAA;QAAA,CAAA;MAAA;IAAA,CAAA;EAOxC;AACF;;;AC10BA,IAAAoC,mBAAoD;AAQpD,IAAAC,eASO;AAsBP,SAAS,UAAU,MAA0B;AAC3C,MAAI;AACF,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,WAAW,QAAQ,WAAW,IAAI,GAAG;AACxC,aAAO;AAAA,IACT;AACA,UAAM,SAAS,KAAK,MAAM,OAAO;AAGjC,QAAI,OAAO,WAAW,SAAS;AAC7B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,UACL,cAAc,OAAO,gBAAgB;AAAA,UACrC,kBAAkB,OAAO,oBAAoB;AAAA,UAC7C,aAAa,OAAO,eAAe;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AAEA,WAAO,EAAE,MAAM,SAAS,OAAO,OAAoB;AAAA,EACrD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKA,SAAS,aAAa,SAAe,MAAc,OAAsB;AACvE,MAAI,SAAS,SAAS;AACpB,YAAQ,OAAO;AACf;AAAA,EACF;AAEA,MAAI,SAAS,UAAU;AACrB,YAAQ,QAAQ;AAChB;AAAA,EACF;AAEA,MAAI,KAAK,WAAW,SAAS,GAAG;AAC9B,QAAI,CAAC,QAAQ,MAAO,SAAQ,QAAQ,CAAC;AACrC,UAAM,YAAY,KAAK,MAAM,SAAS,MAAM;AAC5C,gCAAU,QAAQ,OAAkC,WAAW,KAAK;AACpE;AAAA,EACF;AAEA,MAAI,KAAK,WAAW,YAAY,GAAG;AACjC,UAAM,YAAY,KAAK,MAAM,aAAa,MAAM,EAAE,MAAM,GAAG;AAC3D,UAAM,aAAa,UAAU,CAAC;AAC9B,QAAI,CAAC,WAAY;AAEjB,QAAI,UAAU,WAAW,GAAG;AAC1B,cAAQ,SAAS,UAAU,IAAI;AAAA,IACjC,OAAO;AACL,YAAM,UAAU,QAAQ,SAAS,UAAU;AAC3C,UAAI,SAAS;AACX,cAAM,WAAW,MAAM,UAAU,MAAM,CAAC,EAAE,KAAK,GAAG;AAClD,cAAM,aAAa,EAAE,GAAG,QAAQ;AAChC;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,gBAAQ,SAAS,UAAU,IAAI;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AACF;AAKA,SAAS,gBAAgB,SAAe,MAAoB;AAC1D,MAAI,SAAS,UAAU;AACrB,WAAO,QAAQ;AACf;AAAA,EACF;AAEA,MAAI,KAAK,WAAW,SAAS,KAAK,QAAQ,OAAO;AAC/C,UAAM,YAAY,KAAK,MAAM,SAAS,MAAM;AAC5C,mCAAa,QAAQ,OAAkC,SAAS;AAChE;AAAA,EACF;AAEA,MAAI,KAAK,WAAW,YAAY,GAAG;AACjC,UAAM,YAAY,KAAK,MAAM,aAAa,MAAM,EAAE,MAAM,GAAG;AAC3D,UAAM,aAAa,UAAU,CAAC;AAC9B,QAAI,CAAC,WAAY;AAEjB,QAAI,UAAU,WAAW,GAAG;AAC1B,YAAM,EAAE,CAAC,UAAU,GAAG,GAAG,GAAG,KAAK,IAAI,QAAQ;AAC7C,cAAQ,WAAW;AAAA,IACrB,OAAO;AACL,YAAM,UAAU,QAAQ,SAAS,UAAU;AAC3C,UAAI,SAAS;AACX,cAAM,WAAW,MAAM,UAAU,MAAM,CAAC,EAAE,KAAK,GAAG;AAClD,cAAM,aAAa,EAAE,GAAG,QAAQ;AAChC;AAAA,UACE;AAAA,UACA;AAAA,QACF;AACA,gBAAQ,SAAS,UAAU,IAAI;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AACF;AAKA,SAAS,aAAa,MAAY,MAAuB;AACvD,MAAI,SAAS,QAAS,QAAO,KAAK;AAClC,MAAI,SAAS,SAAU,QAAO,KAAK;AACnC,MAAI,KAAK,WAAW,SAAS,KAAK,KAAK,OAAO;AAC5C,UAAM,YAAY,KAAK,MAAM,SAAS,MAAM;AAC5C,eAAO,wBAAU,KAAK,OAAkC,SAAS;AAAA,EACnE;AACA,aAAO,wBAAU,MAA4C,IAAI;AACnE;AAMA,SAAS,WAAW,MAAY,OAAwB;AACtD,QAAM,UAAU;AAAA,IACd,GAAG;AAAA,IACH,UAAU,EAAE,GAAG,KAAK,SAAS;AAAA,IAC7B,GAAI,KAAK,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,MAAM,EAAE,IAAI,CAAC;AAAA,EACnD;AAEA,UAAQ,MAAM,IAAI;AAAA,IAChB,KAAK;AAAA,IACL,KAAK,WAAW;AACd,mBAAa,SAAS,MAAM,MAAM,MAAM,KAAK;AAC7C;AAAA,IACF;AAAA,IACA,KAAK,UAAU;AACb,sBAAgB,SAAS,MAAM,IAAI;AACnC;AAAA,IACF;AAAA,IACA,KAAK,QAAQ;AACX,UAAI,CAAC,MAAM,KAAM;AACjB,YAAM,YAAY,aAAa,SAAS,MAAM,IAAI;AAClD,sBAAgB,SAAS,MAAM,IAAI;AACnC,mBAAa,SAAS,MAAM,MAAM,SAAS;AAC3C;AAAA,IACF;AAAA,IACA,KAAK,QAAQ;AACX,UAAI,CAAC,MAAM,KAAM;AACjB,YAAM,YAAY,aAAa,SAAS,MAAM,IAAI;AAClD,mBAAa,SAAS,MAAM,MAAM,SAAS;AAC3C;AAAA,IACF;AAAA,IACA,KAAK,QAAQ;AAEX;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAqCO,SAAS,YAAY,SAAgD;AAC1E,QAAM,CAAC,MAAM,OAAO,QAAI,+BAA0B,IAAI;AACtD,QAAM,CAAC,aAAa,cAAc,QAAI,+BAAa,KAAK;AACxD,QAAM,CAAC,OAAO,QAAQ,QAAI,+BAA2B,IAAI;AACzD,QAAM,CAAC,OAAO,QAAQ,QAAI,+BAAgC,IAAI;AAC9D,QAAM,CAAC,UAAU,WAAW,QAAI,+BAAuB,CAAC,CAAC;AACzD,MAAI,kBAA0C;AAE9C,QAAM,QAAQ,MAAM;AAClB,YAAQ,IAAI;AACZ,aAAS,IAAI;AAAA,EACf;AAEA,QAAM,OAAO,OAAO,QAAgB,YAAsC;AAExE,qBAAiB,MAAM;AACvB,sBAAkB,IAAI,gBAAgB;AAEtC,mBAAe,IAAI;AACnB,aAAS,IAAI;AACb,aAAS,IAAI;AACb,gBAAY,CAAC,CAAC;AAGd,UAAM,eAAe,SAAS;AAC9B,QAAI,cACF,gBAAgB,aAAa,OACzB,EAAE,GAAG,cAAc,UAAU,EAAE,GAAG,aAAa,SAAS,EAAE,IAC1D,EAAE,MAAM,IAAI,UAAU,CAAC,EAAE;AAC/B,YAAQ,WAAW;AAEnB,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,QAAQ,KAAK;AAAA,QACxC,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU;AAAA,UACnB;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,QACD,QAAQ,gBAAgB;AAAA,MAC1B,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAEhB,YAAI,eAAe,eAAe,SAAS,MAAM;AACjD,YAAI;AACF,gBAAM,YAAY,MAAM,SAAS,KAAK;AACtC,cAAI,UAAU,SAAS;AACrB,2BAAe,UAAU;AAAA,UAC3B,WAAW,UAAU,OAAO;AAC1B,2BAAe,UAAU;AAAA,UAC3B;AAAA,QACF,QAAQ;AAAA,QAER;AACA,cAAM,IAAI,MAAM,YAAY;AAAA,MAC9B;AAEA,YAAM,SAAS,SAAS,MAAM,UAAU;AACxC,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI,MAAM,kBAAkB;AAAA,MACpC;AAEA,YAAM,UAAU,IAAI,YAAY;AAChC,UAAI,SAAS;AAEb,aAAO,MAAM;AACX,cAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,YAAI,KAAM;AAEV,kBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAGhD,cAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,iBAAS,MAAM,IAAI,KAAK;AAExB,mBAAW,QAAQ,OAAO;AACxB,gBAAM,UAAU,KAAK,KAAK;AAC1B,cAAI,CAAC,QAAS;AACd,gBAAM,SAAS,UAAU,OAAO;AAChC,cAAI,CAAC,OAAQ;AACb,cAAI,OAAO,SAAS,SAAS;AAC3B,qBAAS,OAAO,KAAK;AAAA,UACvB,OAAO;AACL,wBAAY,CAAC,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC;AACxC,0BAAc,WAAW,aAAa,OAAO,KAAK;AAClD,oBAAQ,EAAE,GAAG,YAAY,CAAC;AAAA,UAC5B;AAAA,QACF;AAAA,MACF;AAGA,UAAI,OAAO,KAAK,GAAG;AACjB,cAAM,UAAU,OAAO,KAAK;AAC5B,cAAM,SAAS,UAAU,OAAO;AAChC,YAAI,QAAQ;AACV,cAAI,OAAO,SAAS,SAAS;AAC3B,qBAAS,OAAO,KAAK;AAAA,UACvB,OAAO;AACL,wBAAY,CAAC,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC;AACxC,0BAAc,WAAW,aAAa,OAAO,KAAK;AAClD,oBAAQ,EAAE,GAAG,YAAY,CAAC;AAAA,UAC5B;AAAA,QACF;AAAA,MACF;AAEA,cAAQ,aAAa,WAAW;AAAA,IAClC,SAAS,KAAK;AACZ,UAAK,IAAc,SAAS,cAAc;AACxC;AAAA,MACF;AACA,YAAM,gBAAgB,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AACxE,eAAS,aAAa;AACtB,cAAQ,UAAU,aAAa;AAAA,IACjC,UAAE;AACA,qBAAe,KAAK;AAAA,IACtB;AAAA,EACF;AAGA,kCAAU,MAAM;AACd,qBAAiB,MAAM;AAAA,EACzB,CAAC;AAED,SAAO;AAAA,IACL,IAAI,OAAO;AACT,aAAO,KAAK;AAAA,IACd;AAAA,IACA,IAAI,cAAc;AAChB,aAAO,YAAY;AAAA,IACrB;AAAA,IACA,IAAI,QAAQ;AACV,aAAO,MAAM;AAAA,IACf;AAAA,IACA,IAAI,QAAQ;AACV,aAAO,MAAM;AAAA,IACf;AAAA,IACA,IAAI,WAAW;AACb,aAAO,SAAS;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAQO,SAAS,WAAW,UAA+B;AACxD,QAAM,aAAwC,CAAC;AAC/C,MAAI,OAAO;AAGX,aAAW,WAAW,UAAU;AAC9B,eAAW,QAAQ,GAAG,IAAI;AAAA,MACxB,MAAM,QAAQ;AAAA,MACd,OAAO,QAAQ;AAAA,MACf,UAAU,CAAC;AAAA,MACX,SAAS,QAAQ;AAAA,IACnB;AAAA,EACF;AAGA,aAAW,WAAW,UAAU;AAC9B,QAAI,QAAQ,WAAW;AACrB,YAAM,SAAS,WAAW,QAAQ,SAAS;AAC3C,UAAI,QAAQ;AACV,YAAI,CAAC,OAAO,UAAU;AACpB,iBAAO,WAAW,CAAC;AAAA,QACrB;AACA,eAAO,SAAS,KAAK,QAAQ,GAAG;AAAA,MAClC;AAAA,IACF,OAAO;AACL,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,UAAU,WAAW;AACtC;AA4BO,SAAS,aACd,WACA,aACqC;AACrC,QAAM,EAAE,IAAI,IAAI,cAAyB;AACzC,QAAM,WAAW,CAAC,UAAa;AAC7B,QAAI,YAAa,KAAI,aAAa,KAAK;AAAA,EACzC;AACA,SAAO,CAAC,WAAW,QAAQ;AAC7B;AA+CA,SAAS,eAAe,MAAqC;AAC3D,MAAI,OAAO,SAAS,YAAY,SAAS,KAAM,QAAO;AACtD,QAAM,MAAM;AACZ,UAAQ,IAAI,MAAM;AAAA,IAChB,KAAK;AACH,aAAO,OAAO,IAAI,UAAU,YAAY,IAAI,UAAU;AAAA,IACxD,KAAK;AAAA,IACL,KAAK;AACH,aAAO,OAAO,IAAI,SAAS,YAAY,IAAI,SAAS;AAAA,IACtD;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,mBAAmB,OAAgC;AACjE,QAAM,OAAa,EAAE,MAAM,IAAI,UAAU,CAAC,EAAE;AAC5C,MAAI,UAAU;AAEd,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,SAAS,kCAAqB;AACrC,UAAI,CAAC,eAAe,KAAK,IAAI,EAAG;AAChC,YAAM,UAAU,KAAK;AACrB,UAAI,QAAQ,SAAS,SAAS;AAC5B,kBAAU;AACV,yCAAe,MAAM,QAAQ,KAAK;AAAA,MACpC,WAAW,QAAQ,SAAS,QAAQ;AAClC,kBAAU;AACV,eAAO,OAAO,MAAM,QAAQ,IAAI;AAAA,MAClC,WAAW,QAAQ,SAAS,UAAU;AACpC,kBAAU;AACV,cAAM,WAAO,2BAAa,QAAQ,IAAI;AACtC,eAAO,OAAO,MAAM,IAAI;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAEA,SAAO,UAAU,OAAO;AAC1B;AAmBO,SAAS,iBAAiB,OAA2B;AAC1D,SAAO,MACJ;AAAA,IACC,CAAC,MACC,EAAE,SAAS,UAAU,OAAO,EAAE,SAAS;AAAA,EAC3C,EACC,IAAI,CAAC,MAAM,EAAE,KAAK,KAAK,CAAC,EACxB,OAAO,OAAO,EACd,KAAK,MAAM;AAChB;AAgCO,SAAS,qBAAqB,UAA4B;AAC/D,QAAM,aAAS,6BAAW,MAAM;AAC9B,UAAM,QAAQ,SAAS;AACvB,WAAO;AAAA,MACL,MAAM,mBAAmB,KAAK;AAAA,MAC9B,MAAM,iBAAiB,KAAK;AAAA,IAC9B;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,IAAI,OAAO;AACT,aAAO,OAAO,EAAE;AAAA,IAClB;AAAA,IACA,IAAI,OAAO;AACT,aAAO,OAAO,EAAE;AAAA,IAClB;AAAA,IACA,IAAI,UAAU;AACZ,YAAM,IAAI,OAAO,EAAE;AACnB,aAAO,MAAM,QAAQ,OAAO,KAAK,EAAE,YAAY,CAAC,CAAC,EAAE,SAAS;AAAA,IAC9D;AAAA,EACF;AACF;AAgDA,IAAI,uBAAuB;AAC3B,SAAS,iBAAyB;AAChC,MACE,OAAO,WAAW,eAClB,OAAO,OAAO,eAAe,YAC7B;AACA,WAAO,OAAO,WAAW;AAAA,EAC3B;AACA,0BAAwB;AACxB,SAAO,OAAO,KAAK,IAAI,CAAC,IAAI,oBAAoB;AAClD;AA4BO,SAAS,UAAU,SAA4C;AACpE,QAAM,CAAC,UAAU,WAAW,QAAI,+BAA4B,CAAC,CAAC;AAC9D,QAAM,CAAC,aAAa,cAAc,QAAI,+BAAa,KAAK;AACxD,QAAM,CAAC,OAAO,QAAQ,QAAI,+BAA2B,IAAI;AACzD,MAAI,kBAA0C;AAE9C,QAAM,QAAQ,MAAM;AAClB,gBAAY,CAAC,CAAC;AACd,aAAS,IAAI;AAAA,EACf;AAEA,QAAM,OAAO,OAAO,SAAiB;AACnC,QAAI,CAAC,KAAK,KAAK,EAAG;AAGlB,qBAAiB,MAAM;AACvB,sBAAkB,IAAI,gBAAgB;AAEtC,UAAM,cAA2B;AAAA,MAC/B,IAAI,eAAe;AAAA,MACnB,MAAM;AAAA,MACN,MAAM,KAAK,KAAK;AAAA,MAChB,MAAM;AAAA,IACR;AAEA,UAAM,cAAc,eAAe;AACnC,UAAM,mBAAgC;AAAA,MACpC,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAGA,gBAAY,CAAC,SAAS,CAAC,GAAG,MAAM,aAAa,gBAAgB,CAAC;AAC9D,mBAAe,IAAI;AACnB,aAAS,IAAI;AAIb,UAAM,gBAAgB;AAAA,MACpB,GAAG,SAAS,EACT,OAAO,CAAC,MAAM,EAAE,OAAO,YAAY,MAAM,EAAE,OAAO,WAAW,EAC7D,IAAI,CAAC,OAAO;AAAA,QACX,MAAM,EAAE;AAAA,QACR,SAAS,EAAE;AAAA,MACb,EAAE;AAAA,MACJ,EAAE,MAAM,QAAiB,SAAS,KAAK,KAAK,EAAE;AAAA,IAChD;AAGA,QAAI,kBAAkB;AACtB,QAAI,cAAoB,EAAE,MAAM,IAAI,UAAU,CAAC,EAAE;AACjD,QAAI,UAAU;AAEd,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,QAAQ,KAAK;AAAA,QACxC,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,EAAE,UAAU,cAAc,CAAC;AAAA,QAChD,QAAQ,gBAAgB;AAAA,MAC1B,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,YAAI,eAAe,eAAe,SAAS,MAAM;AACjD,YAAI;AACF,gBAAM,YAAY,MAAM,SAAS,KAAK;AACtC,cAAI,UAAU,SAAS;AACrB,2BAAe,UAAU;AAAA,UAC3B,WAAW,UAAU,OAAO;AAC1B,2BAAe,UAAU;AAAA,UAC3B;AAAA,QACF,QAAQ;AAAA,QAER;AACA,cAAM,IAAI,MAAM,YAAY;AAAA,MAC9B;AAEA,YAAM,SAAS,SAAS,MAAM,UAAU;AACxC,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI,MAAM,kBAAkB;AAAA,MACpC;AAEA,YAAM,UAAU,IAAI,YAAY;AAGhC,YAAM,aAAS,sCAAwB;AAAA,QACrC,QAAQ,OAAO;AACb,oBAAU;AACV,2CAAe,aAAa,KAAK;AACjC;AAAA,YAAY,CAAC,SACX,KAAK;AAAA,cAAI,CAAC,MACR,EAAE,OAAO,cACL;AAAA,gBACE,GAAG;AAAA,gBACH,MAAM;AAAA,kBACJ,MAAM,YAAY;AAAA,kBAClB,UAAU,EAAE,GAAG,YAAY,SAAS;AAAA,kBACpC,GAAI,YAAY,QACZ,EAAE,OAAO,EAAE,GAAG,YAAY,MAAM,EAAE,IAClC,CAAC;AAAA,gBACP;AAAA,cACF,IACA;AAAA,YACN;AAAA,UACF;AAAA,QACF;AAAA,QACA,OAAO,MAAM;AACX,8BAAoB,kBAAkB,OAAO,MAAM;AACnD;AAAA,YAAY,CAAC,SACX,KAAK;AAAA,cAAI,CAAC,MACR,EAAE,OAAO,cAAc,EAAE,GAAG,GAAG,MAAM,gBAAgB,IAAI;AAAA,YAC3D;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAED,aAAO,MAAM;AACX,cAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,YAAI,KAAM;AACV,eAAO,KAAK,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC,CAAC;AAAA,MACrD;AACA,aAAO,MAAM;AAGb,YAAM,eAA4B;AAAA,QAChC,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM,UACF;AAAA,UACE,MAAM,YAAY;AAAA,UAClB,UAAU,EAAE,GAAG,YAAY,SAAS;AAAA,UACpC,GAAI,YAAY,QAAQ,EAAE,OAAO,EAAE,GAAG,YAAY,MAAM,EAAE,IAAI,CAAC;AAAA,QACjE,IACA;AAAA,MACN;AACA,cAAQ,aAAa,YAAY;AAAA,IACnC,SAAS,KAAK;AACZ,UAAK,IAAc,SAAS,cAAc;AACxC;AAAA,MACF;AACA,YAAM,gBAAgB,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AACxE,eAAS,aAAa;AAEtB;AAAA,QAAY,CAAC,SACX,KAAK,OAAO,CAAC,MAAM,EAAE,OAAO,eAAe,EAAE,KAAK,SAAS,CAAC;AAAA,MAC9D;AACA,cAAQ,UAAU,aAAa;AAAA,IACjC,UAAE;AACA,qBAAe,KAAK;AAAA,IACtB;AAAA,EACF;AAGA,kCAAU,MAAM;AACd,qBAAiB,MAAM;AAAA,EACzB,CAAC;AAED,SAAO;AAAA,IACL,IAAI,WAAW;AACb,aAAO,SAAS;AAAA,IAClB;AAAA,IACA,IAAI,cAAc;AAChB,aAAO,YAAY;AAAA,IACrB;AAAA,IACA,IAAI,QAAQ;AACV,aAAO,MAAM;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":["StateContext","createContext","computeInitialFlat","isControlled","initialState","Object","keys","length","flattenToPointers","StateProvider","props","internalStore","store","createStateStore","initialMode","modeWarned","globalThis","process","env","NODE_ENV","createEffect","currentMode","console","warn","prevInitialState","prevFlat","nextFlat","prevFlatObj","allKeys","Set","updates","key","undefined","update","state","setState","createSignal","getSnapshot","equals","changeListeners","subscribeChanges","listener","add","delete","notifyChanges","changes","s","unsubscribe","subscribe","onCleanup","set","path","value","prev","prevValue","getByPath","onStateChange","entries","push","get","ctx","_$createComponent","Provider","children","useStateStore","useContext","Error","useStateValue","createMemo","useStateBinding","setValue","newValue","import_solid_js","import_core","VisibilityContext","createContext","VisibilityProvider","props","stateStore","useStateStore","visibilityCtx","stateModel","state","value","isVisible","condition","evaluateVisibility","ctx","_$createComponent","Provider","children","useVisibility","useContext","Error","useIsVisible","import_solid_js","import_core","import_solid_js","import_core","ValidationContext","createContext","dynamicArgsEqual","a","b","keysA","Object","keys","keysB","length","key","va","vb","sa","$state","sb","validationConfigEqual","validateOn","ac","checks","bc","i","ca","cb","type","message","args","ValidationProvider","props","getSnapshot","useStateStore","customFunctions","fieldStates","setFieldStates","createSignal","fieldStatesRef","fieldConfigs","setFieldConfigs","registerField","path","config","prev","existing","validate","currentState","segments","split","filter","Boolean","value","seg","undefined","result","runValidation","stateModel","newFieldState","touched","validated","touch","clear","_","rest","validateAll","allValid","entries","valid","_$createComponent","Provider","children","useValidation","ctx","useContext","Error","useOptionalValidation","useFieldValidation","validation","createEffect","state","createMemo","current","errors","isValid","idCounter","generateUniqueId","Date","now","deepResolveValue","value","get","undefined","Array","isArray","obj","keys","Object","length","$state","map","item","resolved","key","val","entries","ActionContext","createContext","ActionProvider","props","set","getSnapshot","useStateStore","validation","useOptionalValidation","handlers","setHandlers","createSignal","loadingActions","setLoadingActions","Set","pendingConfirmation","setPendingConfirmation","registerHandler","name","handler","prev","execute","binding","resolveAction","dispatchId","nextActionDispatchId","dispatchedAt","notifyActionDispatch","id","action","params","at","__ok","__error","statePath","rawValue","resolvedValue","arr","clearStatePath","index","filter","_","i","screen","currentScreen","navStack","previousScreen","slice","validateAll","console","warn","valid","errors","path","fs","fieldStates","result","confirm","Promise","resolve","reject","Error","then","add","executeAction","setState","navigate","subBinding","next","delete","err","notifyActionSettle","ok","durationMs","error","cancel","ctx","_$createComponent","Provider","children","useActions","useContext","useAction","actions","isLoading","has","ConfirmDialog","isDanger","variant","_el$","_tmpl$","_el$2","firstChild","_el$3","_el$4","nextSibling","_el$5","_el$6","_el$7","_$addEventListener","onCancel","$$click","e","stopPropagation","_$insert","title","message","cancelLabel","onConfirm","confirmLabel","_$effect","_$p","_$setStyleProperty","_$delegateEvents","import_solid_js","RepeatScopeContext","createContext","RepeatScopeProvider","props","_$createComponent","Provider","value","item","index","basePath","children","useRepeatScope","useContext","import_core","import_core","import_solid_js","import_core","EMPTY_FUNCTIONS","FunctionsContext","createContext","useFunctions","useContext","useDevtoolsActive","active","setActive","createSignal","isDevtoolsActive","unsub","subscribeDevtoolsActive","onCleanup","ElementRenderer","props","repeatScope","useRepeatScope","ctx","useVisibility","execute","useActions","stateStore","useStateStore","getSnapshot","functions","fullCtx","createMemo","repeatItem","item","repeatIndex","index","repeatBasePath","basePath","stateModel","undefined","isVisible","element","visible","evaluateVisibility","emit","eventName","onBindings","on","binding","actionBindings","Array","isArray","b","params","liveCtx","resolved","key","val","Object","entries","resolveActionParam","shouldPreventDefault","bound","some","preventDefault","createEffect","watchConfig","watch","paths","keys","length","unsubscribe","subscribeChanges","changes","changedPaths","Set","map","change","path","has","bindings","catch","console","error","elementBindings","rawProps","resolveBindings","resolvedElement","resolvedProps","resolveElementProps","_$createComponent","Show","when","children","ErrorBoundary","fallback","err","type","ElementRendererContent","elementKey","spec","registry","loading","devtoolsActive","Comp","warn","ComponentFn","Component","repeat","RepeatChildren","For","each","childKey","childElement","elements","el","rendered","_$memo","_el$","_tmpl$","_$insert","_$effect","_$setAttribute","statePath","items","getByPath","state","itemValue","r","String","RepeatScopeProvider","Renderer","rootElement","root","JSONUIProvider","StateProvider","store","initialState","onStateChange","VisibilityProvider","ValidationProvider","customFunctions","validationFunctions","ActionProvider","handlers","navigate","Provider","value","ConfirmationDialogManager","pendingConfirmation","confirm","cancel","action","confirmConfig","ConfirmDialog","onConfirm","onCancel","defineRegistry","_catalog","options","components","name","componentFn","renderProps","actionMap","actions","getSetState","getState","result","actionFn","setState","executeAction","actionName","entry","find","createRenderer","catalog","CatalogRenderer","actionHandlers","onAction","Proxy","get","_target","prop","import_solid_js","import_core"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/contexts/state.tsx","../src/contexts/visibility.tsx","../src/contexts/actions.tsx","../src/contexts/validation.tsx","../src/contexts/repeat-scope.tsx","../src/schema.ts","../src/renderer.tsx","../src/hooks.ts"],"sourcesContent":["// Contexts\nexport {\n StateProvider,\n useStateStore,\n useStateValue,\n useStateBinding,\n type StateContextValue,\n type StateProviderProps,\n} from \"./contexts/state\";\n\nexport {\n VisibilityProvider,\n useVisibility,\n useIsVisible,\n type VisibilityContextValue,\n type VisibilityProviderProps,\n} from \"./contexts/visibility\";\n\nexport {\n ActionProvider,\n useActions,\n useAction,\n ConfirmDialog,\n type ActionContextValue,\n type ActionProviderProps,\n type PendingConfirmation,\n type ConfirmDialogProps,\n} from \"./contexts/actions\";\n\nexport {\n ValidationProvider,\n useValidation,\n useOptionalValidation,\n useFieldValidation,\n type ValidationContextValue,\n type ValidationProviderProps,\n type FieldValidationState,\n} from \"./contexts/validation\";\n\nexport {\n RepeatScopeProvider,\n useRepeatScope,\n type RepeatScopeValue,\n} from \"./contexts/repeat-scope\";\n\n// Schema (Solid's spec format)\nexport {\n schema,\n type SolidSchema,\n type SolidSpec,\n // Backward compatibility\n elementTreeSchema,\n type ElementTreeSchema,\n type ElementTreeSpec,\n} from \"./schema\";\n\n// Core types (re-exported for convenience)\nexport type { Spec, StateStore } from \"@json-render/core\";\nexport { createStateStore } from \"@json-render/core\";\n\n// Catalog-aware types for Solid\nexport type {\n EventHandle,\n BaseComponentProps,\n SetState,\n StateModel,\n ComponentContext,\n ComponentFn,\n Components,\n ActionFn,\n Actions,\n} from \"./catalog-types\";\n\n// Renderer\nexport {\n // Registry\n defineRegistry,\n type DefineRegistryResult,\n // createRenderer (higher-level, includes providers)\n createRenderer,\n type CreateRendererProps,\n type ComponentMap,\n // Low-level\n Renderer,\n JSONUIProvider,\n type ComponentRenderProps,\n type ComponentRenderer,\n type ComponentRegistry,\n type RendererProps,\n type JSONUIProviderProps,\n} from \"./renderer\";\n\n// Hooks\nexport {\n useUIStream,\n useChatUI,\n useBoundProp,\n flatToTree,\n buildSpecFromParts,\n getTextFromParts,\n useJsonRenderMessage,\n type UseUIStreamOptions,\n type UseUIStreamReturn,\n type UseChatUIOptions,\n type UseChatUIReturn,\n type ChatMessage,\n type DataPart,\n type TokenUsage,\n} from \"./hooks\";\n","import {\n createContext,\n useContext,\n createSignal,\n createEffect,\n createMemo,\n onCleanup,\n type Accessor,\n type ParentProps,\n} from \"solid-js\";\nimport {\n getByPath,\n createStateStore,\n type StateModel,\n type StateStore,\n} from \"@json-render/core\";\nimport { flattenToPointers } from \"@json-render/core/store-utils\";\n\nexport interface StateContextValue {\n state: StateModel;\n get: (path: string) => unknown;\n set: (path: string, value: unknown) => void;\n update: (updates: Record<string, unknown>) => void;\n getSnapshot: () => StateModel;\n subscribeChanges: (\n listener: (changes: Array<{ path: string; value: unknown }>) => void,\n ) => () => void;\n}\n\nconst StateContext = createContext<StateContextValue | null>(null);\n\nexport interface StateProviderProps {\n store?: StateStore;\n initialState?: StateModel;\n onStateChange?: (changes: Array<{ path: string; value: unknown }>) => void;\n}\n\nfunction computeInitialFlat(\n isControlled: boolean,\n initialState: StateModel,\n): Record<string, unknown> | null {\n if (isControlled) return null;\n if (Object.keys(initialState).length === 0) return {};\n return flattenToPointers(initialState);\n}\n\nexport function StateProvider(props: ParentProps<StateProviderProps>) {\n let internalStore: StateStore | undefined;\n if (!props.store) {\n internalStore = createStateStore(props.initialState ?? {});\n }\n\n const store = () => props.store ?? internalStore!;\n\n const initialMode = props.store ? \"controlled\" : \"uncontrolled\";\n let modeWarned = false;\n\n if (\n typeof globalThis !== \"undefined\" &&\n (globalThis as any).process?.env?.NODE_ENV !== \"production\"\n ) {\n createEffect(() => {\n const currentMode = props.store ? \"controlled\" : \"uncontrolled\";\n if (currentMode !== initialMode && !modeWarned) {\n modeWarned = true;\n console.warn(\n `StateProvider: switching from ${initialMode} to ${currentMode} mode is not supported.`,\n );\n }\n });\n }\n\n let prevInitialState = props.initialState;\n let prevFlat: Record<string, unknown> | null = computeInitialFlat(\n !!props.store,\n props.initialState ?? {},\n );\n\n createEffect(() => {\n if (props.store) return;\n const initialState = props.initialState ?? {};\n if (initialState === prevInitialState) return;\n prevInitialState = initialState;\n const nextFlat =\n initialState && Object.keys(initialState).length > 0\n ? flattenToPointers(initialState)\n : {};\n const prevFlatObj = prevFlat ?? {};\n const allKeys = new Set([\n ...Object.keys(prevFlatObj),\n ...Object.keys(nextFlat),\n ]);\n const updates: Record<string, unknown> = {};\n for (const key of allKeys) {\n if (prevFlatObj[key] !== nextFlat[key]) {\n updates[key] = key in nextFlat ? nextFlat[key] : undefined;\n }\n }\n prevFlat = nextFlat;\n if (Object.keys(updates).length > 0) {\n store().update(updates);\n }\n });\n\n const [state, setState] = createSignal<StateModel>(store().getSnapshot(), {\n equals: false,\n });\n const changeListeners = new Set<\n (changes: Array<{ path: string; value: unknown }>) => void\n >();\n\n const subscribeChanges = (\n listener: (changes: Array<{ path: string; value: unknown }>) => void,\n ) => {\n changeListeners.add(listener);\n return () => {\n changeListeners.delete(listener);\n };\n };\n\n const notifyChanges = (changes: Array<{ path: string; value: unknown }>) => {\n for (const listener of changeListeners) {\n listener(changes);\n }\n };\n\n createEffect(() => {\n const s = store();\n setState(s.getSnapshot());\n const unsubscribe = s.subscribe(() => {\n setState(s.getSnapshot());\n });\n onCleanup(unsubscribe);\n });\n\n const set = (path: string, value: unknown) => {\n const s = store();\n const prev = s.getSnapshot();\n const prevValue = getByPath(prev, path);\n s.set(path, value);\n if (prevValue !== value) {\n const changes = [{ path, value }];\n notifyChanges(changes);\n if (!props.store && s.getSnapshot() !== prev) {\n props.onStateChange?.(changes);\n }\n }\n };\n\n const update = (updates: Record<string, unknown>) => {\n const s = store();\n const prev = s.getSnapshot();\n s.update(updates);\n const changes: Array<{ path: string; value: unknown }> = [];\n for (const [path, value] of Object.entries(updates)) {\n if (getByPath(prev, path) !== value) {\n changes.push({ path, value });\n }\n }\n if (changes.length > 0) {\n notifyChanges(changes);\n if (!props.store && s.getSnapshot() !== prev) {\n props.onStateChange?.(changes);\n }\n }\n };\n\n const get = (path: string) => store().get(path);\n\n const getSnapshot = () => store().getSnapshot();\n\n const ctx: StateContextValue = {\n get state() {\n return state();\n },\n get,\n set,\n update,\n getSnapshot,\n subscribeChanges,\n };\n\n return (\n <StateContext.Provider value={ctx}>{props.children}</StateContext.Provider>\n );\n}\n\nexport function useStateStore(): StateContextValue {\n const ctx = useContext(StateContext);\n if (!ctx) {\n throw new Error(\"useStateStore must be used within a StateProvider\");\n }\n return ctx;\n}\n\nexport function useStateValue<T>(path: string): Accessor<T | undefined> {\n const store = useStateStore();\n return createMemo(() => getByPath(store.state, path) as T | undefined);\n}\n\nexport function useStateBinding<T>(\n path: string,\n): [Accessor<T | undefined>, (value: T) => void] {\n const store = useStateStore();\n const value = createMemo(() => getByPath(store.state, path) as T | undefined);\n const setValue = (newValue: T) => store.set(path, newValue);\n return [value, setValue];\n}\n","import { createContext, useContext, type ParentProps } from \"solid-js\";\nimport {\n evaluateVisibility,\n type VisibilityCondition,\n type VisibilityContext as CoreVisibilityContext,\n} from \"@json-render/core\";\nimport { useStateStore } from \"./state\";\n\nexport interface VisibilityContextValue {\n isVisible: (condition: VisibilityCondition | undefined) => boolean;\n ctx: CoreVisibilityContext;\n}\n\nconst VisibilityContext = createContext<VisibilityContextValue | null>(null);\n\nexport type VisibilityProviderProps = ParentProps;\n\nexport function VisibilityProvider(props: VisibilityProviderProps) {\n const stateStore = useStateStore();\n\n const visibilityCtx: CoreVisibilityContext = {\n get stateModel() {\n return stateStore.state;\n },\n };\n\n const value: VisibilityContextValue = {\n isVisible: (condition: VisibilityCondition | undefined) =>\n evaluateVisibility(condition, visibilityCtx),\n ctx: visibilityCtx,\n };\n\n return (\n <VisibilityContext.Provider value={value}>\n {props.children}\n </VisibilityContext.Provider>\n );\n}\n\nexport function useVisibility(): VisibilityContextValue {\n const ctx = useContext(VisibilityContext);\n if (!ctx) {\n throw new Error(\"useVisibility must be used within a VisibilityProvider\");\n }\n return ctx;\n}\n\nexport function useIsVisible(\n condition: VisibilityCondition | undefined,\n): boolean {\n const { isVisible } = useVisibility();\n return isVisible(condition);\n}\n","import {\n createContext,\n useContext,\n createSignal,\n type ParentProps,\n type JSX,\n} from \"solid-js\";\nimport {\n resolveAction,\n executeAction,\n nextActionDispatchId,\n notifyActionDispatch,\n notifyActionSettle,\n type ActionBinding,\n type ActionHandler,\n type ActionConfirm,\n type ResolvedAction,\n} from \"@json-render/core\";\nimport { useStateStore } from \"./state\";\nimport { useOptionalValidation } from \"./validation\";\n\nlet idCounter = 0;\nfunction generateUniqueId(): string {\n idCounter += 1;\n return `${Date.now()}-${idCounter}`;\n}\n\nfunction deepResolveValue(\n value: unknown,\n get: (path: string) => unknown,\n): unknown {\n if (value === null || value === undefined) return value;\n\n if (value === \"$id\") {\n return generateUniqueId();\n }\n\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj);\n\n if (keys.length === 1 && typeof obj.$state === \"string\") {\n return get(obj.$state as string);\n }\n\n if (keys.length === 1 && \"$id\" in obj) {\n return generateUniqueId();\n }\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => deepResolveValue(item, get));\n }\n\n if (typeof value === \"object\") {\n const resolved: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value as Record<string, unknown>)) {\n resolved[key] = deepResolveValue(val, get);\n }\n return resolved;\n }\n\n return value;\n}\n\nexport interface PendingConfirmation {\n action: ResolvedAction;\n handler: ActionHandler;\n resolve: () => void;\n reject: () => void;\n}\n\nexport interface ActionContextValue {\n handlers: Record<string, ActionHandler>;\n loadingActions: Set<string>;\n pendingConfirmation: PendingConfirmation | null;\n execute: (binding: ActionBinding) => Promise<void>;\n confirm: () => void;\n cancel: () => void;\n registerHandler: (name: string, handler: ActionHandler) => void;\n}\n\nconst ActionContext = createContext<ActionContextValue | null>(null);\n\nexport interface ActionProviderProps {\n handlers?: Record<string, ActionHandler>;\n navigate?: (path: string) => void;\n}\n\nexport function ActionProvider(props: ParentProps<ActionProviderProps>) {\n const { get, set, getSnapshot } = useStateStore();\n const validation = useOptionalValidation();\n\n const [handlers, setHandlers] = createSignal<Record<string, ActionHandler>>(\n props.handlers ?? {},\n );\n const [loadingActions, setLoadingActions] = createSignal<Set<string>>(\n new Set(),\n );\n const [pendingConfirmation, setPendingConfirmation] =\n createSignal<PendingConfirmation | null>(null);\n\n const registerHandler = (name: string, handler: ActionHandler) => {\n setHandlers((prev) => ({ ...prev, [name]: handler }));\n };\n\n const execute = async (binding: ActionBinding) => {\n const resolved = resolveAction(binding, getSnapshot());\n\n // --- devtools / observer hooks ---\n const dispatchId = nextActionDispatchId();\n const dispatchedAt = Date.now();\n notifyActionDispatch({\n id: dispatchId,\n name: resolved.action,\n params: resolved.params,\n at: dispatchedAt,\n });\n let __ok = true;\n let __error: unknown = undefined;\n\n try {\n if (resolved.action === \"setState\" && resolved.params) {\n const statePath = resolved.params.statePath as string;\n const value = resolved.params.value;\n if (statePath) {\n set(statePath, value);\n }\n return;\n }\n\n if (resolved.action === \"pushState\" && resolved.params) {\n const statePath = resolved.params.statePath as string;\n const rawValue = resolved.params.value;\n if (statePath) {\n const resolvedValue = deepResolveValue(rawValue, get);\n const arr = (get(statePath) as unknown[] | undefined) ?? [];\n set(statePath, [...arr, resolvedValue]);\n const clearStatePath = resolved.params.clearStatePath as\n | string\n | undefined;\n if (clearStatePath) {\n set(clearStatePath, \"\");\n }\n }\n return;\n }\n\n if (resolved.action === \"removeState\" && resolved.params) {\n const statePath = resolved.params.statePath as string;\n const index = resolved.params.index as number;\n if (statePath !== undefined && index !== undefined) {\n const arr = (get(statePath) as unknown[] | undefined) ?? [];\n set(\n statePath,\n arr.filter((_, i) => i !== index),\n );\n }\n return;\n }\n\n if (resolved.action === \"push\" && resolved.params) {\n const screen = resolved.params.screen as string;\n if (screen) {\n const currentScreen = get(\"/currentScreen\") as string | undefined;\n const navStack = (get(\"/navStack\") as string[] | undefined) ?? [];\n if (currentScreen) {\n set(\"/navStack\", [...navStack, currentScreen]);\n } else {\n set(\"/navStack\", [...navStack, \"\"]);\n }\n set(\"/currentScreen\", screen);\n }\n return;\n }\n\n if (resolved.action === \"pop\") {\n const navStack = (get(\"/navStack\") as string[] | undefined) ?? [];\n if (navStack.length > 0) {\n const previousScreen = navStack[navStack.length - 1];\n set(\"/navStack\", navStack.slice(0, -1));\n if (previousScreen) {\n set(\"/currentScreen\", previousScreen);\n } else {\n set(\"/currentScreen\", undefined);\n }\n }\n return;\n }\n\n if (resolved.action === \"validateForm\") {\n const validateAll = validation?.validateAll;\n if (!validateAll) {\n console.warn(\n \"validateForm action was dispatched but no ValidationProvider is connected. \" +\n \"Ensure ValidationProvider is rendered inside the provider tree.\",\n );\n return;\n }\n const valid = validateAll();\n const errors: Record<string, string[]> = {};\n for (const [path, fs] of Object.entries(validation.fieldStates)) {\n if (fs.result && !fs.result.valid) {\n errors[path] = fs.result.errors;\n }\n }\n const statePath =\n (resolved.params?.statePath as string) || \"/formValidation\";\n set(statePath, { valid, errors });\n return;\n }\n\n const handler = handlers()[resolved.action];\n\n if (!handler) {\n console.warn(`No handler registered for action: ${resolved.action}`);\n return;\n }\n\n if (resolved.confirm) {\n return new Promise<void>((resolve, reject) => {\n setPendingConfirmation({\n action: resolved,\n handler,\n resolve: () => {\n setPendingConfirmation(null);\n resolve();\n },\n reject: () => {\n setPendingConfirmation(null);\n reject(new Error(\"Action cancelled\"));\n },\n });\n }).then(async () => {\n setLoadingActions((prev) => new Set(prev).add(resolved.action));\n try {\n await executeAction({\n action: resolved,\n handler,\n setState: set,\n navigate: props.navigate,\n executeAction: async (name: string) => {\n const subBinding: ActionBinding = { action: name };\n await execute(subBinding);\n },\n });\n } finally {\n setLoadingActions((prev) => {\n const next = new Set(prev);\n next.delete(resolved.action);\n return next;\n });\n }\n });\n }\n\n setLoadingActions((prev) => new Set(prev).add(resolved.action));\n try {\n await executeAction({\n action: resolved,\n handler,\n setState: set,\n navigate: props.navigate,\n executeAction: async (name: string) => {\n const subBinding: ActionBinding = { action: name };\n await execute(subBinding);\n },\n });\n } finally {\n setLoadingActions((prev) => {\n const next = new Set(prev);\n next.delete(resolved.action);\n return next;\n });\n }\n } catch (err) {\n __ok = false;\n __error = err;\n throw err;\n } finally {\n const now = Date.now();\n notifyActionSettle({\n id: dispatchId,\n name: resolved.action,\n ok: __ok,\n at: now,\n durationMs: now - dispatchedAt,\n error: __error,\n });\n }\n };\n\n const confirm = () => {\n pendingConfirmation()?.resolve();\n };\n\n const cancel = () => {\n pendingConfirmation()?.reject();\n };\n\n const ctx: ActionContextValue = {\n get handlers() {\n return handlers();\n },\n get loadingActions() {\n return loadingActions();\n },\n get pendingConfirmation() {\n return pendingConfirmation();\n },\n execute,\n confirm,\n cancel,\n registerHandler,\n };\n\n return (\n <ActionContext.Provider value={ctx}>\n {props.children}\n </ActionContext.Provider>\n );\n}\n\nexport function useActions(): ActionContextValue {\n const ctx = useContext(ActionContext);\n if (!ctx) {\n throw new Error(\"useActions must be used within an ActionProvider\");\n }\n return ctx;\n}\n\nexport function useAction(binding: ActionBinding): {\n execute: () => Promise<void>;\n isLoading: boolean;\n} {\n const actions = useActions();\n return {\n execute: () => actions.execute(binding),\n get isLoading() {\n return actions.loadingActions.has(binding.action);\n },\n };\n}\n\nexport interface ConfirmDialogProps {\n confirm: ActionConfirm;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nexport function ConfirmDialog(props: ConfirmDialogProps): JSX.Element {\n const isDanger = () => props.confirm.variant === \"danger\";\n\n return (\n <div\n style={{\n position: \"fixed\",\n inset: \"0\",\n \"background-color\": \"rgba(0, 0, 0, 0.5)\",\n display: \"flex\",\n \"align-items\": \"center\",\n \"justify-content\": \"center\",\n \"z-index\": 50,\n }}\n onClick={props.onCancel}\n >\n <div\n style={{\n \"background-color\": \"white\",\n \"border-radius\": \"8px\",\n padding: \"24px\",\n \"max-width\": \"400px\",\n width: \"100%\",\n \"box-shadow\": \"0 20px 25px -5px rgba(0, 0, 0, 0.1)\",\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <h3\n style={{\n margin: \"0 0 8px 0\",\n \"font-size\": \"18px\",\n \"font-weight\": \"600\",\n }}\n >\n {props.confirm.title}\n </h3>\n <p\n style={{\n margin: \"0 0 24px 0\",\n color: \"#6b7280\",\n }}\n >\n {props.confirm.message}\n </p>\n <div\n style={{\n display: \"flex\",\n gap: \"12px\",\n \"justify-content\": \"flex-end\",\n }}\n >\n <button\n onClick={props.onCancel}\n style={{\n padding: \"8px 16px\",\n \"border-radius\": \"6px\",\n border: \"1px solid #d1d5db\",\n \"background-color\": \"white\",\n cursor: \"pointer\",\n }}\n >\n {props.confirm.cancelLabel ?? \"Cancel\"}\n </button>\n <button\n onClick={props.onConfirm}\n style={{\n padding: \"8px 16px\",\n \"border-radius\": \"6px\",\n border: \"none\",\n \"background-color\": isDanger() ? \"#dc2626\" : \"#3b82f6\",\n color: \"white\",\n cursor: \"pointer\",\n }}\n >\n {props.confirm.confirmLabel ?? \"Confirm\"}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import {\n createContext,\n useContext,\n createSignal,\n createEffect,\n createMemo,\n type Accessor,\n type ParentProps,\n} from \"solid-js\";\nimport {\n runValidation,\n type ValidationConfig,\n type ValidationFunction,\n type ValidationResult,\n} from \"@json-render/core\";\nimport { useStateStore } from \"./state\";\n\nexport interface FieldValidationState {\n touched: boolean;\n validated: boolean;\n result: ValidationResult | null;\n}\n\nexport interface ValidationContextValue {\n customFunctions: Record<string, ValidationFunction>;\n fieldStates: Record<string, FieldValidationState>;\n validate: (path: string, config: ValidationConfig) => ValidationResult;\n touch: (path: string) => void;\n clear: (path: string) => void;\n validateAll: () => boolean;\n registerField: (path: string, config: ValidationConfig) => void;\n}\n\nconst ValidationContext = createContext<ValidationContextValue | null>(null);\n\nexport interface ValidationProviderProps {\n customFunctions?: Record<string, ValidationFunction>;\n}\n\nfunction dynamicArgsEqual(\n a: Record<string, unknown> | undefined,\n b: Record<string, unknown> | undefined,\n): boolean {\n if (a === b) return true;\n if (!a || !b) return false;\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n const va = a[key];\n const vb = b[key];\n if (va === vb) continue;\n if (\n typeof va === \"object\" &&\n va !== null &&\n typeof vb === \"object\" &&\n vb !== null\n ) {\n const sa = (va as Record<string, unknown>).$state;\n const sb = (vb as Record<string, unknown>).$state;\n if (typeof sa === \"string\" && sa === sb) continue;\n }\n return false;\n }\n return true;\n}\n\nfunction validationConfigEqual(\n a: ValidationConfig,\n b: ValidationConfig,\n): boolean {\n if (a === b) return true;\n\n if (a.validateOn !== b.validateOn) return false;\n\n const ac = a.checks ?? [];\n const bc = b.checks ?? [];\n if (ac.length !== bc.length) return false;\n\n for (let i = 0; i < ac.length; i++) {\n const ca = ac[i]!;\n const cb = bc[i]!;\n if (ca.type !== cb.type) return false;\n if (ca.message !== cb.message) return false;\n if (!dynamicArgsEqual(ca.args, cb.args)) return false;\n }\n\n return true;\n}\n\nexport function ValidationProvider(\n props: ParentProps<ValidationProviderProps>,\n) {\n const { getSnapshot } = useStateStore();\n const customFunctions = () => props.customFunctions ?? {};\n\n const [fieldStates, setFieldStates] = createSignal<\n Record<string, FieldValidationState>\n >({});\n let fieldStatesRef: Record<string, FieldValidationState> = {};\n\n const [fieldConfigs, setFieldConfigs] = createSignal<\n Record<string, ValidationConfig>\n >({});\n\n const registerField = (path: string, config: ValidationConfig) => {\n setFieldConfigs((prev) => {\n const existing = prev[path];\n if (existing && validationConfigEqual(existing, config)) {\n return prev;\n }\n return { ...prev, [path]: config };\n });\n };\n\n const validate = (\n path: string,\n config: ValidationConfig,\n ): ValidationResult => {\n const currentState = getSnapshot();\n const segments = path.split(\"/\").filter(Boolean);\n let value: unknown = currentState;\n for (const seg of segments) {\n if (value != null && typeof value === \"object\") {\n value = (value as Record<string, unknown>)[seg];\n } else {\n value = undefined;\n break;\n }\n }\n const result = runValidation(config, {\n value,\n stateModel: currentState,\n customFunctions: customFunctions(),\n });\n\n const newFieldState: FieldValidationState = {\n touched: fieldStatesRef[path]?.touched ?? true,\n validated: true,\n result,\n };\n fieldStatesRef = {\n ...fieldStatesRef,\n [path]: newFieldState,\n };\n setFieldStates(fieldStatesRef);\n\n return result;\n };\n\n const touch = (path: string) => {\n fieldStatesRef = {\n ...fieldStatesRef,\n [path]: {\n ...fieldStatesRef[path],\n touched: true,\n validated: fieldStatesRef[path]?.validated ?? false,\n result: fieldStatesRef[path]?.result ?? null,\n },\n };\n setFieldStates(fieldStatesRef);\n };\n\n const clear = (path: string) => {\n const { [path]: _, ...rest } = fieldStatesRef;\n fieldStatesRef = rest;\n setFieldStates(rest);\n };\n\n const validateAll = () => {\n let allValid = true;\n\n for (const [path, config] of Object.entries(fieldConfigs())) {\n const result = validate(path, config);\n if (!result.valid) {\n allValid = false;\n }\n }\n\n return allValid;\n };\n\n const value: ValidationContextValue = {\n get customFunctions() {\n return customFunctions();\n },\n get fieldStates() {\n fieldStates();\n return fieldStatesRef;\n },\n validate,\n touch,\n clear,\n validateAll,\n registerField,\n };\n\n return (\n <ValidationContext.Provider value={value}>\n {props.children}\n </ValidationContext.Provider>\n );\n}\n\nexport function useValidation(): ValidationContextValue {\n const ctx = useContext(ValidationContext);\n if (!ctx) {\n throw new Error(\"useValidation must be used within a ValidationProvider\");\n }\n return ctx;\n}\n\nexport function useOptionalValidation(): ValidationContextValue | null {\n return useContext(ValidationContext);\n}\n\nexport function useFieldValidation(\n path: string,\n config?: ValidationConfig,\n): {\n state: Accessor<FieldValidationState>;\n validate: () => ValidationResult;\n touch: () => void;\n clear: () => void;\n errors: Accessor<string[]>;\n isValid: Accessor<boolean>;\n} {\n const validation = useValidation();\n\n createEffect(() => {\n if (path && config) {\n validation.registerField(path, config);\n }\n });\n\n const state = createMemo<FieldValidationState>(() => {\n const current = validation.fieldStates[path];\n return (\n current ?? {\n touched: false,\n validated: false,\n result: null,\n }\n );\n });\n\n const validate = () => validation.validate(path, config ?? { checks: [] });\n const touch = () => validation.touch(path);\n const clear = () => validation.clear(path);\n const errors = createMemo(() => state().result?.errors ?? []);\n const isValid = createMemo(() => state().result?.valid ?? true);\n\n return {\n state,\n validate,\n touch,\n clear,\n errors,\n isValid,\n };\n}\n","import { createContext, useContext, type ParentProps } from \"solid-js\";\n\nexport interface RepeatScopeValue {\n item: unknown;\n index: number;\n basePath: string;\n}\n\nconst RepeatScopeContext = createContext<RepeatScopeValue | null>(null);\n\nexport function RepeatScopeProvider(props: ParentProps<RepeatScopeValue>) {\n return (\n <RepeatScopeContext.Provider\n value={{ item: props.item, index: props.index, basePath: props.basePath }}\n >\n {props.children}\n </RepeatScopeContext.Provider>\n );\n}\n\nexport function useRepeatScope(): RepeatScopeValue | null {\n return useContext(RepeatScopeContext);\n}\n","import { defineSchema } from \"@json-render/core\";\n\n/**\n * The schema for @json-render/solid\n *\n * Defines:\n * - Spec: A flat tree of elements with keys, types, props, and children references\n * - Catalog: Components with props schemas, and optional actions\n */\nexport const schema = defineSchema(\n (s) => ({\n // What the AI-generated SPEC looks like\n spec: s.object({\n /** Root element key */\n root: s.string(),\n /** Flat map of elements by key */\n elements: s.record(\n s.object({\n /** Component type from catalog */\n type: s.ref(\"catalog.components\"),\n /** Component props */\n props: s.propsOf(\"catalog.components\"),\n /** Child element keys (flat reference) */\n children: s.array(s.string()),\n /** Visibility condition */\n visible: s.any(),\n }),\n ),\n }),\n\n // What the CATALOG must provide\n catalog: s.object({\n /** Component definitions */\n components: s.map({\n /** Zod schema for component props */\n props: s.zod(),\n /** Slots for this component. Use ['default'] for children, or named slots like ['header', 'footer'] */\n slots: s.array(s.string()),\n /** Description for AI generation hints */\n description: s.string(),\n /** Example prop values used in prompt examples (auto-generated from Zod schema if omitted) */\n example: s.any(),\n }),\n /** Action definitions (optional) */\n actions: s.map({\n /** Zod schema for action params */\n params: s.zod(),\n /** Description for AI generation hints */\n description: s.string(),\n }),\n }),\n }),\n {\n builtInActions: [\n {\n name: \"setState\",\n description:\n \"Update a value in the state model at the given statePath. Params: { statePath: string, value: any }\",\n },\n {\n name: \"pushState\",\n description:\n '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.',\n },\n {\n name: \"removeState\",\n description:\n \"Remove an item from an array in state by index. Params: { statePath: string, index: number }\",\n },\n {\n name: \"validateForm\",\n description:\n \"Validate all registered form fields and write the result to state. Params: { statePath?: string }. Defaults to /formValidation. Result: { valid: boolean, errors: Record<string, string[]> }.\",\n },\n ],\n defaultRules: [\n // Element integrity\n \"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.\",\n \"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.\",\n\n // Field placement\n 'CRITICAL: The \"visible\" field goes on the ELEMENT object, NOT inside \"props\". Correct: {\"type\":\"<ComponentName>\",\"props\":{},\"visible\":{\"$state\":\"/tab\",\"eq\":\"home\"},\"children\":[...]}.',\n '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.',\n\n // State and data\n \"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).\",\n 'When building repeating content backed by a state array (e.g. posts, products, items), use the \"repeat\" field on a container element. Example: { \"type\": \"<ContainerComponent>\", \"props\": {}, \"repeat\": { \"statePath\": \"/posts\", \"key\": \"id\" }, \"children\": [\"post-card\"] }. Replace <ContainerComponent> 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.',\n\n // Design quality\n \"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.\",\n \"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.\",\n \"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.\",\n ],\n },\n);\n\n/**\n * Type for the Solid schema\n */\nexport type SolidSchema = typeof schema;\n\n/**\n * Infer the spec type from a catalog\n */\nexport type SolidSpec<TCatalog> = typeof schema extends {\n createCatalog: (catalog: TCatalog) => { _specType: infer S };\n}\n ? S\n : never;\n\n// Backward compatibility aliases\n/** @deprecated Use `schema` instead */\nexport const elementTreeSchema = schema;\n/** @deprecated Use `SolidSchema` instead */\nexport type ElementTreeSchema = SolidSchema;\n/** @deprecated Use `SolidSpec` instead */\nexport type ElementTreeSpec<T> = SolidSpec<T>;\n","import {\n createContext,\n useContext,\n createMemo,\n createEffect,\n createSignal,\n onCleanup,\n ErrorBoundary,\n Show,\n For,\n type JSX,\n type Component,\n} from \"solid-js\";\nimport type {\n UIElement,\n Spec,\n ActionBinding,\n Catalog,\n SchemaDefinition,\n StateStore,\n ComputedFunction,\n DirectiveDefinition,\n DirectiveRegistry,\n} from \"@json-render/core\";\nimport {\n resolveElementProps,\n resolveBindings,\n resolveActionParam,\n evaluateVisibility,\n getByPath,\n isDevtoolsActive,\n subscribeDevtoolsActive,\n createDirectiveRegistry,\n type PropResolutionContext,\n type VisibilityContext as CoreVisibilityContext,\n} from \"@json-render/core\";\nimport type {\n Components,\n Actions,\n ActionFn,\n SetState,\n StateModel,\n CatalogHasActions,\n EventHandle,\n} from \"./catalog-types\";\nimport { useIsVisible, useVisibility } from \"./contexts/visibility\";\nimport { useActions } from \"./contexts/actions\";\nimport { useStateStore } from \"./contexts/state\";\nimport { StateProvider } from \"./contexts/state\";\nimport { VisibilityProvider } from \"./contexts/visibility\";\nimport { ActionProvider } from \"./contexts/actions\";\nimport { ValidationProvider } from \"./contexts/validation\";\nimport { ConfirmDialog } from \"./contexts/actions\";\nimport { RepeatScopeProvider, useRepeatScope } from \"./contexts/repeat-scope\";\n\n/**\n * Props passed to component renderers\n */\nexport interface ComponentRenderProps<P = Record<string, unknown>> {\n /** The element being rendered */\n element: UIElement<string, P>;\n /** Rendered children */\n children?: JSX.Element;\n /** Emit a named event. The renderer resolves the event to action binding(s) from the element's `on` field. Always provided by the renderer. */\n emit: (event: string) => void;\n /** Get an event handle with metadata (shouldPreventDefault, bound). Use when you need to inspect event bindings. */\n on: (event: string) => EventHandle;\n /**\n * Two-way binding paths resolved from `$bindState` / `$bindItem` expressions.\n * Maps prop name → absolute state path for write-back.\n * Only present when at least one prop uses `{ $bindState: \"...\" }` or `{ $bindItem: \"...\" }`.\n */\n bindings?: Record<string, string>;\n /** Whether the parent is loading */\n loading?: boolean;\n}\n\n/**\n * Component renderer type\n */\nexport type ComponentRenderer<P = Record<string, unknown>> = Component<\n ComponentRenderProps<P>\n>;\n\n/**\n * Registry of component renderers\n */\nexport type ComponentRegistry = Record<string, ComponentRenderer<any>>;\n\n/**\n * Props for the Renderer component\n */\nexport interface RendererProps {\n /** The UI spec to render */\n spec: Spec | null;\n /** Component registry */\n registry: ComponentRegistry;\n /** Whether the spec is currently loading/streaming */\n loading?: boolean;\n /** Fallback component for unknown types */\n fallback?: ComponentRenderer;\n}\n\n// ---------------------------------------------------------------------------\n// FunctionsContext – provides $computed functions to the element tree\n// ---------------------------------------------------------------------------\n\nconst EMPTY_FUNCTIONS: Record<string, ComputedFunction> = {};\n\nconst FunctionsContext =\n createContext<Record<string, ComputedFunction>>(EMPTY_FUNCTIONS);\n\nfunction useFunctions(): Record<string, ComputedFunction> {\n return useContext(FunctionsContext) ?? EMPTY_FUNCTIONS;\n}\n\n// ---------------------------------------------------------------------------\n// DirectivesContext – provides custom directive registry to the element tree\n// ---------------------------------------------------------------------------\n\nconst DirectivesContext = createContext<DirectiveRegistry | undefined>(\n undefined,\n);\n\nfunction useDirectives(): DirectiveRegistry | undefined {\n return useContext(DirectivesContext);\n}\n\ninterface ElementRendererProps {\n element: UIElement;\n /** Spec key for this element. Used by the devtools picker. */\n elementKey?: string;\n spec: Spec;\n registry: ComponentRegistry;\n loading?: boolean;\n fallback?: ComponentRenderer;\n}\n\n/**\n * Reactive mirror of the devtools-active flag. Used to decide whether to\n * wrap each element with a `data-jr-key` attribute for the picker.\n */\nfunction useDevtoolsActive() {\n const [active, setActive] = createSignal(isDevtoolsActive());\n const unsub = subscribeDevtoolsActive(() => setActive(isDevtoolsActive()));\n onCleanup(unsub);\n return active;\n}\n\n/**\n * Element renderer component.\n */\nfunction ElementRenderer(props: ElementRendererProps) {\n const repeatScope = useRepeatScope();\n const { ctx } = useVisibility();\n const { execute } = useActions();\n const stateStore = useStateStore();\n const getSnapshot = () => stateStore.getSnapshot();\n const functions = useFunctions();\n const directives = useDirectives();\n\n // Build context with repeat scope, $computed functions, and custom directives\n const fullCtx = createMemo<PropResolutionContext>(() => {\n const repeatItem = repeatScope?.item;\n const repeatIndex = repeatScope?.index;\n const repeatBasePath = repeatScope?.basePath;\n\n return {\n get stateModel() {\n return ctx.stateModel;\n },\n ...(repeatItem !== undefined ? { repeatItem } : {}),\n ...(repeatIndex !== undefined ? { repeatIndex } : {}),\n ...(repeatBasePath !== undefined ? { repeatBasePath } : {}),\n functions,\n directives,\n };\n });\n\n // Evaluate visibility (now supports $item/$index inside repeat scopes)\n const isVisible = createMemo(() =>\n props.element.visible === undefined\n ? true\n : evaluateVisibility(props.element.visible, fullCtx()),\n );\n\n // Create emit function that resolves events to action bindings.\n const emit = async (eventName: string) => {\n const onBindings = props.element.on;\n const binding = onBindings?.[eventName];\n if (!binding) return;\n const actionBindings = Array.isArray(binding) ? binding : [binding];\n for (const b of actionBindings) {\n if (!b.params) {\n await execute(b);\n continue;\n }\n // Build a fresh context with live store state so that $state\n // references in later actions see mutations from earlier ones.\n const liveCtx: PropResolutionContext = {\n ...fullCtx(),\n stateModel: getSnapshot(),\n };\n const resolved: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(b.params)) {\n resolved[key] = resolveActionParam(val, liveCtx);\n }\n await execute({ ...b, params: resolved });\n }\n };\n\n // Create on() function that returns an EventHandle with metadata for a specific event.\n const on = (eventName: string): EventHandle => {\n const onBindings = props.element.on;\n const binding = onBindings?.[eventName];\n if (!binding) {\n return { emit: () => {}, shouldPreventDefault: false, bound: false };\n }\n const actionBindings = Array.isArray(binding) ? binding : [binding];\n const shouldPreventDefault = actionBindings.some((b) => b.preventDefault);\n return {\n emit: () => emit(eventName),\n shouldPreventDefault,\n bound: true,\n };\n };\n\n // Watch effect: fire actions when watched state paths change.\n createEffect(() => {\n const watchConfig = props.element.watch;\n if (!watchConfig) return;\n const paths = Object.keys(watchConfig);\n if (paths.length === 0) return;\n\n const unsubscribe = stateStore.subscribeChanges((changes) => {\n const changedPaths = new Set(changes.map((change) => change.path));\n\n void (async () => {\n for (const path of paths) {\n if (!changedPaths.has(path)) continue;\n\n const binding = watchConfig[path];\n if (!binding) continue;\n const bindings = Array.isArray(binding) ? binding : [binding];\n\n for (const b of bindings) {\n if (!b.params) {\n await execute(b);\n continue;\n }\n const liveCtx: PropResolutionContext = {\n ...fullCtx(),\n stateModel: getSnapshot(),\n };\n const resolved: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(b.params)) {\n resolved[key] = resolveActionParam(val, liveCtx);\n }\n await execute({ ...b, params: resolved });\n }\n }\n })().catch(console.error);\n });\n\n onCleanup(() => {\n unsubscribe();\n });\n });\n\n // Resolve $bindState/$bindItem expressions → bindings map (prop name → state path)\n const elementBindings = createMemo(() => {\n const rawProps = props.element.props as Record<string, unknown>;\n return resolveBindings(rawProps, fullCtx());\n });\n\n // Resolve dynamic prop expressions ($state, $item, $index, $bindState, $bindItem, $cond/$then/$else)\n const resolvedElement = createMemo(() => {\n const rawProps = props.element.props as Record<string, unknown>;\n const resolvedProps = resolveElementProps(rawProps, fullCtx());\n return resolvedProps !== props.element.props\n ? { ...props.element, props: resolvedProps }\n : props.element;\n });\n\n return (\n <Show when={isVisible()}>\n <ErrorBoundary\n fallback={(err) => {\n console.error(\n `[json-render] Rendering error in <${props.element.type}>:`,\n err,\n );\n return null;\n }}\n >\n <ElementRendererContent\n resolvedElement={resolvedElement()}\n elementKey={props.elementKey}\n spec={props.spec}\n registry={props.registry}\n loading={props.loading}\n fallback={props.fallback}\n emit={emit}\n on={on}\n bindings={elementBindings()}\n />\n </ErrorBoundary>\n </Show>\n );\n}\n\ninterface ElementRendererContentProps {\n resolvedElement: UIElement;\n elementKey?: string;\n spec: Spec;\n registry: ComponentRegistry;\n loading?: boolean;\n fallback?: ComponentRenderer;\n emit: (event: string) => void;\n on: (event: string) => EventHandle;\n bindings?: Record<string, string>;\n}\n\n/**\n * Inner content renderer, separated so it can be wrapped in Show + ErrorBoundary.\n */\nfunction ElementRendererContent(props: ElementRendererContentProps) {\n const devtoolsActive = useDevtoolsActive();\n // Get the component renderer\n const Comp = () =>\n props.registry[props.resolvedElement.type] ?? props.fallback;\n\n return (\n <Show\n when={Comp()}\n fallback={(() => {\n console.warn(\n `No renderer for component type: ${props.resolvedElement.type}`,\n );\n return null;\n })()}\n >\n {(ComponentFn) => {\n const Component = ComponentFn();\n // Render children (with repeat support)\n const children = () =>\n props.resolvedElement.repeat ? (\n <RepeatChildren\n element={props.resolvedElement}\n spec={props.spec}\n registry={props.registry}\n loading={props.loading}\n fallback={props.fallback}\n />\n ) : (\n <For each={props.resolvedElement.children ?? []}>\n {(childKey) => {\n const childElement = () => props.spec.elements[childKey];\n return (\n <Show\n when={childElement()}\n fallback={(() => {\n if (!props.loading) {\n console.warn(\n `[json-render] Missing element \"${childKey}\" referenced as child of \"${props.resolvedElement.type}\". This element will not render.`,\n );\n }\n return null;\n })()}\n >\n {(el) => (\n <ElementRenderer\n element={el()}\n elementKey={childKey}\n spec={props.spec}\n registry={props.registry}\n loading={props.loading}\n fallback={props.fallback}\n />\n )}\n </Show>\n );\n }}\n </For>\n );\n\n const rendered = (\n <Component\n element={props.resolvedElement}\n emit={props.emit}\n on={props.on}\n bindings={props.bindings}\n loading={props.loading}\n >\n {children()}\n </Component>\n );\n\n return (\n <Show when={devtoolsActive() && props.elementKey} fallback={rendered}>\n <span\n data-jr-key={props.elementKey}\n style={{ display: \"contents\" }}\n >\n {rendered}\n </span>\n </Show>\n );\n }}\n </Show>\n );\n}\n\n// ---------------------------------------------------------------------------\n// RepeatChildren -- renders child elements once per item in a state array.\n// Used when an element has a `repeat` field.\n// ---------------------------------------------------------------------------\n\ninterface RepeatChildrenProps {\n element: UIElement;\n spec: Spec;\n registry: ComponentRegistry;\n loading?: boolean;\n fallback?: ComponentRenderer;\n}\n\nfunction RepeatChildren(props: RepeatChildrenProps) {\n const stateStore = useStateStore();\n const repeat = () => props.element.repeat!;\n const statePath = () => repeat().statePath;\n\n const items = () =>\n (getByPath(stateStore.state, statePath()) as unknown[] | undefined) ?? [];\n\n return (\n <For each={items()}>\n {(itemValue, index) => {\n const key = () => {\n const r = repeat();\n return r.key && typeof itemValue === \"object\" && itemValue !== null\n ? String((itemValue as Record<string, unknown>)[r.key] ?? index())\n : String(index());\n };\n\n return (\n <RepeatScopeProvider\n item={itemValue}\n index={index()}\n basePath={`${statePath()}/${index()}`}\n >\n <For each={props.element.children ?? []}>\n {(childKey) => {\n const childElement = () => props.spec.elements[childKey];\n return (\n <Show\n when={childElement()}\n fallback={(() => {\n if (!props.loading) {\n console.warn(\n `[json-render] Missing element \"${childKey}\" referenced as child of \"${props.element.type}\" (repeat). This element will not render.`,\n );\n }\n return null;\n })()}\n >\n {(el) => (\n <ElementRenderer\n element={el()}\n spec={props.spec}\n registry={props.registry}\n loading={props.loading}\n fallback={props.fallback}\n />\n )}\n </Show>\n );\n }}\n </For>\n </RepeatScopeProvider>\n );\n }}\n </For>\n );\n}\n\n/**\n * Main renderer component\n */\nexport function Renderer(props: RendererProps) {\n const rootElement = createMemo(() => {\n const spec = props.spec;\n if (!spec || !spec.root) return undefined;\n return spec.elements[spec.root];\n });\n\n return (\n <Show when={rootElement()}>\n {(el) => (\n <ElementRenderer\n element={el()}\n elementKey={props.spec!.root}\n spec={props.spec!}\n registry={props.registry}\n loading={props.loading}\n fallback={props.fallback}\n />\n )}\n </Show>\n );\n}\n\n/**\n * Props for JSONUIProvider\n */\nexport interface JSONUIProviderProps {\n /** Component registry */\n registry: ComponentRegistry;\n /**\n * External store (controlled mode). When provided, `initialState` and\n * `onStateChange` are ignored.\n */\n store?: StateStore;\n /** Initial state model (uncontrolled mode) */\n initialState?: Record<string, unknown>;\n /** Action handlers */\n handlers?: Record<\n string,\n (params: Record<string, unknown>) => Promise<unknown> | unknown\n >;\n /** Navigation function */\n navigate?: (path: string) => void;\n /** Custom validation functions */\n validationFunctions?: Record<\n string,\n (value: unknown, args?: Record<string, unknown>) => boolean\n >;\n /** Named functions for `$computed` expressions in props */\n functions?: Record<string, ComputedFunction>;\n /** Custom directives for user-defined `$`-prefixed dynamic values */\n directives?: DirectiveDefinition[];\n /** Callback when state changes (uncontrolled mode) */\n onStateChange?: (changes: Array<{ path: string; value: unknown }>) => void;\n children: JSX.Element;\n}\n\n/**\n * Combined provider for all JSONUI contexts\n */\nexport function JSONUIProvider(props: JSONUIProviderProps) {\n const directiveRegistry = createMemo(() =>\n props.directives ? createDirectiveRegistry(props.directives) : undefined,\n );\n return (\n <StateProvider\n store={props.store}\n initialState={props.initialState}\n onStateChange={props.onStateChange}\n >\n <VisibilityProvider>\n <ValidationProvider customFunctions={props.validationFunctions}>\n <ActionProvider handlers={props.handlers} navigate={props.navigate}>\n <FunctionsContext.Provider\n value={props.functions ?? EMPTY_FUNCTIONS}\n >\n <DirectivesContext.Provider value={directiveRegistry()}>\n {props.children}\n <ConfirmationDialogManager />\n </DirectivesContext.Provider>\n </FunctionsContext.Provider>\n </ActionProvider>\n </ValidationProvider>\n </VisibilityProvider>\n </StateProvider>\n );\n}\n\n/**\n * Renders the confirmation dialog when needed\n */\nfunction ConfirmationDialogManager() {\n const { pendingConfirmation, confirm, cancel } = useActions();\n\n return (\n <Show when={pendingConfirmation?.action.confirm}>\n {(confirmConfig) => (\n <ConfirmDialog\n confirm={confirmConfig()}\n onConfirm={confirm}\n onCancel={cancel}\n />\n )}\n </Show>\n );\n}\n\n// ============================================================================\n// defineRegistry\n// ============================================================================\n\n/**\n * Result returned by defineRegistry\n */\nexport interface DefineRegistryResult {\n /** Component registry for `<Renderer registry={...} />` */\n registry: ComponentRegistry;\n /**\n * Create ActionProvider-compatible handlers.\n * Accepts getter functions so handlers always read the latest state/setState\n * (e.g. from refs or closures).\n */\n handlers: (\n getSetState: () => SetState | undefined,\n getState: () => StateModel,\n ) => Record<string, (params: Record<string, unknown>) => Promise<void>>;\n /**\n * Execute an action by name imperatively\n * (for use outside the Solid tree, e.g. initial state loading).\n */\n executeAction: (\n actionName: string,\n params: Record<string, unknown> | undefined,\n setState: SetState,\n state?: StateModel,\n ) => Promise<void>;\n}\n\n/**\n * Options for defineRegistry.\n *\n * When the catalog declares actions, the `actions` field is required.\n * When the catalog has no actions (or `actions: {}`), the field is optional.\n */\ntype DefineRegistryOptions<C extends Catalog> = {\n components?: Components<C>;\n} & (CatalogHasActions<C> extends true\n ? { actions: Actions<C> }\n : { actions?: Actions<C> });\n\n/**\n * Create a registry from a catalog with components and/or actions.\n *\n * When the catalog declares actions, the `actions` field is required.\n *\n * @example\n * ```tsx\n * // Components only (catalog has no actions)\n * const { registry } = defineRegistry(catalog, {\n * components: {\n * Card: (ctx) => (\n * <div class=\"card\">{ctx.props.title}{ctx.children}</div>\n * ),\n * },\n * });\n *\n * // Both (catalog declares actions)\n * const { registry, handlers, executeAction } = defineRegistry(catalog, {\n * components: { ... },\n * actions: { ... },\n * });\n * ```\n */\nexport function defineRegistry<C extends Catalog>(\n _catalog: C,\n options: DefineRegistryOptions<C>,\n): DefineRegistryResult {\n // Build component registry\n const registry: ComponentRegistry = {};\n if (options.components) {\n for (const [name, componentFn] of Object.entries(options.components)) {\n registry[name] = (renderProps: ComponentRenderProps) => {\n return (componentFn as DefineRegistryComponentFn)({\n get props() {\n return renderProps.element.props;\n },\n get children() {\n return renderProps.children;\n },\n emit: renderProps.emit,\n on: renderProps.on,\n get bindings() {\n return renderProps.bindings;\n },\n get loading() {\n return renderProps.loading;\n },\n });\n };\n }\n }\n\n // Build action helpers\n const actionMap = options.actions\n ? (Object.entries(options.actions) as Array<\n [string, DefineRegistryActionFn]\n >)\n : [];\n\n const handlers = (\n getSetState: () => SetState | undefined,\n getState: () => StateModel,\n ): Record<string, (params: Record<string, unknown>) => Promise<void>> => {\n const result: Record<\n string,\n (params: Record<string, unknown>) => Promise<void>\n > = {};\n for (const [name, actionFn] of actionMap) {\n result[name] = async (params) => {\n const setState = getSetState();\n const state = getState();\n if (setState) {\n await actionFn(params, setState, state);\n }\n };\n }\n return result;\n };\n\n const executeAction = async (\n actionName: string,\n params: Record<string, unknown> | undefined,\n setState: SetState,\n state: StateModel = {},\n ): Promise<void> => {\n const entry = actionMap.find(([name]) => name === actionName);\n if (entry) {\n await entry[1](params, setState, state);\n } else {\n console.warn(`Unknown action: ${actionName}`);\n }\n };\n\n return { registry, handlers, executeAction };\n}\n\n/** @internal */\ntype DefineRegistryComponentFn = (ctx: {\n props: unknown;\n children?: JSX.Element;\n emit: (event: string) => void;\n on: (event: string) => EventHandle;\n bindings?: Record<string, string>;\n loading?: boolean;\n}) => JSX.Element;\n\n/** @internal */\ntype DefineRegistryActionFn = (\n params: Record<string, unknown> | undefined,\n setState: SetState,\n state: StateModel,\n) => Promise<void>;\n\n// ============================================================================\n// NEW API\n// ============================================================================\n\n/**\n * Props for renderers created with createRenderer\n */\nexport interface CreateRendererProps {\n /** The spec to render (AI-generated JSON) */\n spec: Spec | null;\n /**\n * External store (controlled mode). When provided, `state` and\n * `onStateChange` are ignored.\n */\n store?: StateStore;\n /** State context for dynamic values (uncontrolled mode) */\n state?: Record<string, unknown>;\n /** Action handler */\n onAction?: (actionName: string, params?: Record<string, unknown>) => void;\n /** Callback when state changes (uncontrolled mode) */\n onStateChange?: (changes: Array<{ path: string; value: unknown }>) => void;\n /** Named functions for `$computed` expressions in props */\n functions?: Record<string, ComputedFunction>;\n /** Custom directives for user-defined `$`-prefixed dynamic values */\n directives?: DirectiveDefinition[];\n /** Whether the spec is currently loading/streaming */\n loading?: boolean;\n /** Fallback component for unknown types */\n fallback?: ComponentRenderer;\n}\n\n/**\n * Component map type - maps component names to Solid components\n */\nexport type ComponentMap<\n TComponents extends Record<string, { props: unknown }>,\n> = {\n [K in keyof TComponents]: Component<\n ComponentRenderProps<\n TComponents[K][\"props\"] extends { _output: infer O }\n ? O\n : Record<string, unknown>\n >\n >;\n};\n\n/**\n * Create a renderer from a catalog\n *\n * @example\n * ```typescript\n * const DashboardRenderer = createRenderer(dashboardCatalog, {\n * Card: (renderProps) => <div class=\"card\">{renderProps.children}</div>,\n * Metric: (renderProps) => <span>{renderProps.element.props.value}</span>,\n * });\n *\n * // Usage\n * <DashboardRenderer spec={aiGeneratedSpec} state={state} />\n * ```\n */\nexport function createRenderer<\n TDef extends SchemaDefinition,\n TCatalog extends { components: Record<string, { props: unknown }> },\n>(\n catalog: Catalog<TDef, TCatalog>,\n components: ComponentMap<TCatalog[\"components\"]>,\n): Component<CreateRendererProps> {\n // Convert component map to registry\n const registry: ComponentRegistry =\n components as unknown as ComponentRegistry;\n\n // Return the renderer component\n return function CatalogRenderer(props: CreateRendererProps) {\n const directiveRegistry = createMemo(() =>\n props.directives ? createDirectiveRegistry(props.directives) : undefined,\n );\n\n // Wrap onAction with a Proxy so any action name routes to the callback\n const actionHandlers = () =>\n props.onAction\n ? new Proxy(\n {} as Record<\n string,\n (params: Record<string, unknown>) => void | Promise<void>\n >,\n {\n get: (_target, prop: string) => {\n return (params: Record<string, unknown>) =>\n props.onAction!(prop, params);\n },\n has: () => true,\n },\n )\n : undefined;\n\n return (\n <StateProvider\n store={props.store}\n initialState={props.state}\n onStateChange={props.onStateChange}\n >\n <VisibilityProvider>\n <ValidationProvider>\n <ActionProvider handlers={actionHandlers()}>\n <FunctionsContext.Provider\n value={props.functions ?? EMPTY_FUNCTIONS}\n >\n <DirectivesContext.Provider value={directiveRegistry()}>\n <Renderer\n spec={props.spec}\n registry={registry}\n loading={props.loading}\n fallback={props.fallback}\n />\n <ConfirmationDialogManager />\n </DirectivesContext.Provider>\n </FunctionsContext.Provider>\n </ActionProvider>\n </ValidationProvider>\n </VisibilityProvider>\n </StateProvider>\n );\n };\n}\n","import { createSignal, onCleanup, createMemo } from \"solid-js\";\nimport type {\n Spec,\n UIElement,\n FlatElement,\n JsonPatch,\n SpecDataPart,\n} from \"@json-render/core\";\nimport {\n setByPath,\n getByPath,\n addByPath,\n removeByPath,\n createMixedStreamParser,\n applySpecPatch,\n nestedToFlat,\n SPEC_DATA_PART_TYPE,\n} from \"@json-render/core\";\n\n/**\n * Token usage metadata from AI generation\n */\nexport interface TokenUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\n/**\n * Parse result for a single line -- either a patch or usage metadata\n */\ntype ParsedLine =\n | { type: \"patch\"; patch: JsonPatch }\n | { type: \"usage\"; usage: TokenUsage }\n | null;\n\n/**\n * Parse a single JSON line (patch or metadata)\n */\nfunction parseLine(line: string): ParsedLine {\n try {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"//\")) {\n return null;\n }\n const parsed = JSON.parse(trimmed);\n\n // Check for usage metadata\n if (parsed.__meta === \"usage\") {\n return {\n type: \"usage\",\n usage: {\n promptTokens: parsed.promptTokens ?? 0,\n completionTokens: parsed.completionTokens ?? 0,\n totalTokens: parsed.totalTokens ?? 0,\n },\n };\n }\n\n return { type: \"patch\", patch: parsed as JsonPatch };\n } catch {\n return null;\n }\n}\n\n/**\n * Set a value at a spec path (for add/replace operations).\n */\nfunction setSpecValue(newSpec: Spec, path: string, value: unknown): void {\n if (path === \"/root\") {\n newSpec.root = value as string;\n return;\n }\n\n if (path === \"/state\") {\n newSpec.state = value as Record<string, unknown>;\n return;\n }\n\n if (path.startsWith(\"/state/\")) {\n if (!newSpec.state) newSpec.state = {};\n const statePath = path.slice(\"/state\".length); // e.g. \"/posts\"\n setByPath(newSpec.state as Record<string, unknown>, statePath, value);\n return;\n }\n\n if (path.startsWith(\"/elements/\")) {\n const pathParts = path.slice(\"/elements/\".length).split(\"/\");\n const elementKey = pathParts[0];\n if (!elementKey) return;\n\n if (pathParts.length === 1) {\n newSpec.elements[elementKey] = value as UIElement;\n } else {\n const element = newSpec.elements[elementKey];\n if (element) {\n const propPath = \"/\" + pathParts.slice(1).join(\"/\");\n const newElement = { ...element };\n setByPath(\n newElement as unknown as Record<string, unknown>,\n propPath,\n value,\n );\n newSpec.elements[elementKey] = newElement;\n }\n }\n }\n}\n\n/**\n * Remove a value at a spec path.\n */\nfunction removeSpecValue(newSpec: Spec, path: string): void {\n if (path === \"/state\") {\n delete newSpec.state;\n return;\n }\n\n if (path.startsWith(\"/state/\") && newSpec.state) {\n const statePath = path.slice(\"/state\".length);\n removeByPath(newSpec.state as Record<string, unknown>, statePath);\n return;\n }\n\n if (path.startsWith(\"/elements/\")) {\n const pathParts = path.slice(\"/elements/\".length).split(\"/\");\n const elementKey = pathParts[0];\n if (!elementKey) return;\n\n if (pathParts.length === 1) {\n const { [elementKey]: _, ...rest } = newSpec.elements;\n newSpec.elements = rest;\n } else {\n const element = newSpec.elements[elementKey];\n if (element) {\n const propPath = \"/\" + pathParts.slice(1).join(\"/\");\n const newElement = { ...element };\n removeByPath(\n newElement as unknown as Record<string, unknown>,\n propPath,\n );\n newSpec.elements[elementKey] = newElement;\n }\n }\n }\n}\n\n/**\n * Get a value at a spec path.\n */\nfunction getSpecValue(spec: Spec, path: string): unknown {\n if (path === \"/root\") return spec.root;\n if (path === \"/state\") return spec.state;\n if (path.startsWith(\"/state/\") && spec.state) {\n const statePath = path.slice(\"/state\".length);\n return getByPath(spec.state as Record<string, unknown>, statePath);\n }\n return getByPath(spec as unknown as Record<string, unknown>, path);\n}\n\n/**\n * Apply an RFC 6902 JSON patch to the current spec.\n * Supports add, remove, replace, move, copy, and test operations.\n */\nfunction applyPatch(spec: Spec, patch: JsonPatch): Spec {\n const newSpec = {\n ...spec,\n elements: { ...spec.elements },\n ...(spec.state ? { state: { ...spec.state } } : {}),\n };\n\n switch (patch.op) {\n case \"add\":\n case \"replace\": {\n setSpecValue(newSpec, patch.path, patch.value);\n break;\n }\n case \"remove\": {\n removeSpecValue(newSpec, patch.path);\n break;\n }\n case \"move\": {\n if (!patch.from) break;\n const moveValue = getSpecValue(newSpec, patch.from);\n removeSpecValue(newSpec, patch.from);\n setSpecValue(newSpec, patch.path, moveValue);\n break;\n }\n case \"copy\": {\n if (!patch.from) break;\n const copyValue = getSpecValue(newSpec, patch.from);\n setSpecValue(newSpec, patch.path, copyValue);\n break;\n }\n case \"test\": {\n // test is a no-op for rendering purposes (validation only)\n break;\n }\n }\n\n return newSpec;\n}\n\n/**\n * Options for useUIStream\n */\nexport interface UseUIStreamOptions {\n /** API endpoint */\n api: string;\n /** Callback when complete */\n onComplete?: (spec: Spec) => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n}\n\n/**\n * Return type for useUIStream\n */\nexport interface UseUIStreamReturn {\n /** Current UI spec */\n readonly spec: Spec | null;\n /** Whether currently streaming */\n readonly isStreaming: boolean;\n /** Error if any */\n readonly error: Error | null;\n /** Token usage from the last generation */\n readonly usage: TokenUsage | null;\n /** Raw JSONL lines received from the stream (JSON patch lines) */\n readonly rawLines: string[];\n /** Send a prompt to generate UI */\n send: (prompt: string, context?: Record<string, unknown>) => Promise<void>;\n /** Clear the current spec */\n clear: () => void;\n}\n\n/**\n * Hook for streaming UI generation\n */\nexport function useUIStream(options: UseUIStreamOptions): UseUIStreamReturn {\n const [spec, setSpec] = createSignal<Spec | null>(null);\n const [isStreaming, setIsStreaming] = createSignal(false);\n const [error, setError] = createSignal<Error | null>(null);\n const [usage, setUsage] = createSignal<TokenUsage | null>(null);\n const [rawLines, setRawLines] = createSignal<string[]>([]);\n let abortController: AbortController | null = null;\n\n const clear = () => {\n setSpec(null);\n setError(null);\n };\n\n const send = async (prompt: string, context?: Record<string, unknown>) => {\n // Abort any existing request\n abortController?.abort();\n abortController = new AbortController();\n\n setIsStreaming(true);\n setError(null);\n setUsage(null);\n setRawLines([]);\n\n // Start with previous spec if provided, otherwise empty spec\n const previousSpec = context?.previousSpec as Spec | undefined;\n let currentSpec: Spec =\n previousSpec && previousSpec.root\n ? { ...previousSpec, elements: { ...previousSpec.elements } }\n : { root: \"\", elements: {} };\n setSpec(currentSpec);\n\n try {\n const response = await fetch(options.api, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n prompt,\n context,\n currentSpec,\n }),\n signal: abortController.signal,\n });\n\n if (!response.ok) {\n // Try to parse JSON error response for better error messages\n let errorMessage = `HTTP error: ${response.status}`;\n try {\n const errorData = await response.json();\n if (errorData.message) {\n errorMessage = errorData.message;\n } else if (errorData.error) {\n errorMessage = errorData.error;\n }\n } catch {\n // Ignore JSON parsing errors, use default message\n }\n throw new Error(errorMessage);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error(\"No response body\");\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n // Process complete lines\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n const result = parseLine(trimmed);\n if (!result) continue;\n if (result.type === \"usage\") {\n setUsage(result.usage);\n } else {\n setRawLines((prev) => [...prev, trimmed]);\n currentSpec = applyPatch(currentSpec, result.patch);\n setSpec({ ...currentSpec });\n }\n }\n }\n\n // Process any remaining buffer\n if (buffer.trim()) {\n const trimmed = buffer.trim();\n const result = parseLine(trimmed);\n if (result) {\n if (result.type === \"usage\") {\n setUsage(result.usage);\n } else {\n setRawLines((prev) => [...prev, trimmed]);\n currentSpec = applyPatch(currentSpec, result.patch);\n setSpec({ ...currentSpec });\n }\n }\n }\n\n options.onComplete?.(currentSpec);\n } catch (err) {\n if ((err as Error).name === \"AbortError\") {\n return;\n }\n const resolvedError = err instanceof Error ? err : new Error(String(err));\n setError(resolvedError);\n options.onError?.(resolvedError);\n } finally {\n setIsStreaming(false);\n }\n };\n\n // Cleanup on disposal\n onCleanup(() => {\n abortController?.abort();\n });\n\n return {\n get spec() {\n return spec();\n },\n get isStreaming() {\n return isStreaming();\n },\n get error() {\n return error();\n },\n get usage() {\n return usage();\n },\n get rawLines() {\n return rawLines();\n },\n send,\n clear,\n };\n}\n\n/**\n * Convert a flat element list to a Spec.\n * Input elements use key/parentKey to establish identity and relationships.\n * Output spec uses the map-based format where key is the map entry key\n * and parent-child relationships are expressed through children arrays.\n */\nexport function flatToTree(elements: FlatElement[]): Spec {\n const elementMap: Record<string, UIElement> = {};\n let root = \"\";\n\n // First pass: add all elements to map\n for (const element of elements) {\n elementMap[element.key] = {\n type: element.type,\n props: element.props,\n children: [],\n visible: element.visible,\n };\n }\n\n // Second pass: build parent-child relationships\n for (const element of elements) {\n if (element.parentKey) {\n const parent = elementMap[element.parentKey];\n if (parent) {\n if (!parent.children) {\n parent.children = [];\n }\n parent.children.push(element.key);\n }\n } else {\n root = element.key;\n }\n }\n\n return { root, elements: elementMap };\n}\n\n// =============================================================================\n// useBoundProp — Two-way binding helper for $bindState/$bindItem expressions\n// =============================================================================\n\n// Re-export useStateStore access for useBoundProp without circular import\nimport { useStateStore as useStateStoreFromContext } from \"./contexts/state\";\n\n/**\n * Hook for two-way bound props. Returns `[value, setValue]` where:\n *\n * - `value` is the already-resolved prop value (passed through from render props)\n * - `setValue` writes back to the bound state path (no-op if not bound)\n *\n * Designed to work with the `bindings` map that the renderer provides when\n * a prop uses `{ $bindState: \"/path\" }` or `{ $bindItem: \"field\" }`.\n *\n * @example\n * ```tsx\n * import { useBoundProp } from \"@json-render/solid\";\n *\n * const Input: ComponentRenderer = (ctx) => {\n * const [value, setValue] = useBoundProp<string>(ctx.props.value, ctx.bindings?.value);\n * return <input value={value ?? \"\"} onInput={(e) => setValue(e.target.value)} />;\n * };\n * ```\n */\nexport function useBoundProp<T>(\n propValue: T | undefined,\n bindingPath: string | undefined,\n): [T | undefined, (value: T) => void] {\n const { set } = useStateStoreFromContext();\n const setValue = (value: T) => {\n if (bindingPath) set(bindingPath, value);\n };\n return [propValue, setValue];\n}\n\n// =============================================================================\n// buildSpecFromParts — Derive Spec from AI SDK data parts\n// =============================================================================\n\n/**\n * A single part from the AI SDK's `message.parts` array. This is a minimal\n * structural type so that library helpers do not depend on the AI SDK.\n * Fields are optional because different part types carry different data:\n * - Text parts have `text`\n * - Data parts have `data`\n */\nexport interface DataPart {\n type: string;\n text?: string;\n data?: unknown;\n}\n\n/**\n * Build a `Spec` by replaying all spec data parts from a message's\n * parts array. Returns `null` if no spec data parts are present.\n *\n * This function is designed to work with the AI SDK's `UIMessage.parts` array.\n * It picks out parts whose `type` is {@link SPEC_DATA_PART_TYPE} and processes them based\n * on the payload's `type` discriminator:\n *\n * - `\"patch\"`: Applies the JSON Patch operation incrementally via `applySpecPatch`.\n * - `\"flat\"`: Replaces the spec with the complete flat spec.\n * - `\"nested\"`: Assigns the nested spec directly (future: nested-to-flat conversion).\n *\n * The function has no AI SDK dependency -- it operates on a generic array of\n * `{ type: string; data: unknown }` objects.\n *\n * @example\n * ```tsx\n * const spec = buildSpecFromParts(message.parts);\n * if (spec) {\n * return <MyRenderer spec={spec} />;\n * }\n * ```\n */\n/**\n * Type guard that validates a data part payload looks like a valid\n * {@link SpecDataPart} before we cast it. Returns `false` (and the\n * part is silently skipped) for malformed payloads.\n */\nfunction isSpecDataPart(data: unknown): data is SpecDataPart {\n if (typeof data !== \"object\" || data === null) return false;\n const obj = data as Record<string, unknown>;\n switch (obj.type) {\n case \"patch\":\n return typeof obj.patch === \"object\" && obj.patch !== null;\n case \"flat\":\n case \"nested\":\n return typeof obj.spec === \"object\" && obj.spec !== null;\n default:\n return false;\n }\n}\n\nexport function buildSpecFromParts(parts: DataPart[]): Spec | null {\n const spec: Spec = { root: \"\", elements: {} };\n let hasSpec = false;\n\n for (const part of parts) {\n if (part.type === SPEC_DATA_PART_TYPE) {\n if (!isSpecDataPart(part.data)) continue;\n const payload = part.data;\n if (payload.type === \"patch\") {\n hasSpec = true;\n applySpecPatch(spec, payload.patch);\n } else if (payload.type === \"flat\") {\n hasSpec = true;\n Object.assign(spec, payload.spec);\n } else if (payload.type === \"nested\") {\n hasSpec = true;\n const flat = nestedToFlat(payload.spec);\n Object.assign(spec, flat);\n }\n }\n }\n\n return hasSpec ? spec : null;\n}\n\n/**\n * Extract and join all text content from a message's parts array.\n *\n * Filters for parts with `type === \"text\"`, trims each one, and joins them\n * with double newlines so that text from separate agent steps renders as\n * distinct paragraphs in markdown.\n *\n * Has no AI SDK dependency -- operates on a generic `DataPart[]`.\n *\n * @example\n * ```tsx\n * const text = getTextFromParts(message.parts);\n * if (text) {\n * return <Streamdown>{text}</Streamdown>;\n * }\n * ```\n */\nexport function getTextFromParts(parts: DataPart[]): string {\n return parts\n .filter(\n (p): p is DataPart & { text: string } =>\n p.type === \"text\" && typeof p.text === \"string\",\n )\n .map((p) => p.text.trim())\n .filter(Boolean)\n .join(\"\\n\\n\");\n}\n\n// =============================================================================\n// useJsonRenderMessage — extract spec + text from message parts\n// =============================================================================\n\n/**\n * Hook that extracts both the json-render spec and text content from a\n * message's parts array. Combines `buildSpecFromParts` and `getTextFromParts`\n * into a single call with memoized results.\n *\n * **Memoization behavior:** Results are recomputed only when the `parts`\n * accessor returns a new array reference with a different length or last\n * element. This is optimized for the typical AI SDK streaming pattern where\n * parts are appended incrementally.\n *\n * @example\n * ```tsx\n * import { useJsonRenderMessage } from \"@json-render/solid\";\n *\n * function MessageBubble(props: { parts: DataPart[] }) {\n * const msg = useJsonRenderMessage(() => props.parts);\n *\n * return (\n * <div>\n * {msg.text && <Markdown>{msg.text}</Markdown>}\n * {msg.hasSpec && <MyRenderer spec={msg.spec!} />}\n * </div>\n * );\n * }\n * ```\n */\nexport function useJsonRenderMessage(getParts: () => DataPart[]) {\n const result = createMemo(() => {\n const parts = getParts();\n return {\n spec: buildSpecFromParts(parts),\n text: getTextFromParts(parts),\n };\n });\n\n return {\n get spec() {\n return result().spec;\n },\n get text() {\n return result().text;\n },\n get hasSpec() {\n const s = result().spec;\n return s !== null && Object.keys(s.elements || {}).length > 0;\n },\n };\n}\n\n// =============================================================================\n// useChatUI — Chat + GenUI hook\n// =============================================================================\n\n/**\n * A single message in the chat, which may contain text, a rendered UI spec, or both.\n */\nexport interface ChatMessage {\n /** Unique message ID */\n id: string;\n /** Who sent this message */\n role: \"user\" | \"assistant\";\n /** Text content (conversational prose) */\n text: string;\n /** json-render Spec built from JSONL patches (null if no UI was generated) */\n spec: Spec | null;\n}\n\n/**\n * Options for useChatUI\n */\nexport interface UseChatUIOptions {\n /** API endpoint that accepts `{ messages: Array<{ role, content }> }` and returns a text stream */\n api: string;\n /** Callback when streaming completes for a message */\n onComplete?: (message: ChatMessage) => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n}\n\n/**\n * Return type for useChatUI\n */\nexport interface UseChatUIReturn {\n /** All messages in the conversation */\n readonly messages: ChatMessage[];\n /** Whether currently streaming an assistant response */\n readonly isStreaming: boolean;\n /** Error from the last request, if any */\n readonly error: Error | null;\n /** Send a user message */\n send: (text: string) => Promise<void>;\n /** Clear all messages and reset the conversation */\n clear: () => void;\n}\n\nlet chatMessageIdCounter = 0;\nfunction generateChatId(): string {\n if (\n typeof crypto !== \"undefined\" &&\n typeof crypto.randomUUID === \"function\"\n ) {\n return crypto.randomUUID();\n }\n chatMessageIdCounter += 1;\n return `msg-${Date.now()}-${chatMessageIdCounter}`;\n}\n\n/**\n * Hook for chat + GenUI experiences.\n *\n * Manages a multi-turn conversation where each assistant message can contain\n * both conversational text and a json-render UI spec. The hook sends the full\n * message history to the API endpoint, reads the streamed response, and\n * separates text lines from JSONL patch lines using `createMixedStreamParser`.\n *\n * @example\n * ```tsx\n * const chat = useChatUI({ api: \"/api/chat\" });\n *\n * // Send a message\n * await chat.send(\"Compare weather in NYC and Tokyo\");\n *\n * // Render messages\n * <For each={chat.messages}>\n * {(msg) => (\n * <div>\n * {msg.text && <p>{msg.text}</p>}\n * {msg.spec && <MyRenderer spec={msg.spec} />}\n * </div>\n * )}\n * </For>\n * ```\n */\nexport function useChatUI(options: UseChatUIOptions): UseChatUIReturn {\n const [messages, setMessages] = createSignal<ChatMessage[]>([]);\n const [isStreaming, setIsStreaming] = createSignal(false);\n const [error, setError] = createSignal<Error | null>(null);\n let abortController: AbortController | null = null;\n\n const clear = () => {\n setMessages([]);\n setError(null);\n };\n\n const send = async (text: string) => {\n if (!text.trim()) return;\n\n // Abort any existing request\n abortController?.abort();\n abortController = new AbortController();\n\n const userMessage: ChatMessage = {\n id: generateChatId(),\n role: \"user\",\n text: text.trim(),\n spec: null,\n };\n\n const assistantId = generateChatId();\n const assistantMessage: ChatMessage = {\n id: assistantId,\n role: \"assistant\",\n text: \"\",\n spec: null,\n };\n\n // Append user message and empty assistant placeholder\n setMessages((prev) => [...prev, userMessage, assistantMessage]);\n setIsStreaming(true);\n setError(null);\n\n // Build messages array for the API (full conversation history + new message).\n // Read current messages signal for latest state (avoids stale closure).\n const historyForApi = [\n ...messages()\n .filter((m) => m.id !== userMessage.id && m.id !== assistantId)\n .map((m) => ({\n role: m.role,\n content: m.text,\n })),\n { role: \"user\" as const, content: text.trim() },\n ];\n\n // Mutable state for accumulating the assistant response\n let accumulatedText = \"\";\n let currentSpec: Spec = { root: \"\", elements: {} };\n let hasSpec = false;\n\n try {\n const response = await fetch(options.api, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ messages: historyForApi }),\n signal: abortController.signal,\n });\n\n if (!response.ok) {\n let errorMessage = `HTTP error: ${response.status}`;\n try {\n const errorData = await response.json();\n if (errorData.message) {\n errorMessage = errorData.message;\n } else if (errorData.error) {\n errorMessage = errorData.error;\n }\n } catch {\n // Ignore JSON parsing errors\n }\n throw new Error(errorMessage);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error(\"No response body\");\n }\n\n const decoder = new TextDecoder();\n\n // Use createMixedStreamParser to classify lines\n const parser = createMixedStreamParser({\n onPatch(patch) {\n hasSpec = true;\n applySpecPatch(currentSpec, patch);\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantId\n ? {\n ...m,\n spec: {\n root: currentSpec.root,\n elements: { ...currentSpec.elements },\n ...(currentSpec.state\n ? { state: { ...currentSpec.state } }\n : {}),\n },\n }\n : m,\n ),\n );\n },\n onText(line) {\n accumulatedText += (accumulatedText ? \"\\n\" : \"\") + line;\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantId ? { ...m, text: accumulatedText } : m,\n ),\n );\n },\n });\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n parser.push(decoder.decode(value, { stream: true }));\n }\n parser.flush();\n\n // Build final message for onComplete callback\n const finalMessage: ChatMessage = {\n id: assistantId,\n role: \"assistant\",\n text: accumulatedText,\n spec: hasSpec\n ? {\n root: currentSpec.root,\n elements: { ...currentSpec.elements },\n ...(currentSpec.state ? { state: { ...currentSpec.state } } : {}),\n }\n : null,\n };\n options.onComplete?.(finalMessage);\n } catch (err) {\n if ((err as Error).name === \"AbortError\") {\n return;\n }\n const resolvedError = err instanceof Error ? err : new Error(String(err));\n setError(resolvedError);\n // Remove empty assistant message on error\n setMessages((prev) =>\n prev.filter((m) => m.id !== assistantId || m.text.length > 0),\n );\n options.onError?.(resolvedError);\n } finally {\n setIsStreaming(false);\n }\n };\n\n // Cleanup on disposal\n onCleanup(() => {\n abortController?.abort();\n });\n\n return {\n get messages() {\n return messages();\n },\n get isStreaming() {\n return isStreaming();\n },\n get error() {\n return error();\n },\n send,\n clear,\n };\n}\n"],"mappings":"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","names":["StateContext","createContext","computeInitialFlat","isControlled","initialState","Object","keys","length","flattenToPointers","StateProvider","props","internalStore","store","createStateStore","initialMode","modeWarned","globalThis","process","env","NODE_ENV","createEffect","currentMode","console","warn","prevInitialState","prevFlat","nextFlat","prevFlatObj","allKeys","Set","updates","key","undefined","update","state","setState","createSignal","getSnapshot","equals","changeListeners","subscribeChanges","listener","add","delete","notifyChanges","changes","s","unsubscribe","subscribe","onCleanup","set","path","value","prev","prevValue","getByPath","onStateChange","entries","push","get","ctx","_$createComponent","Provider","children","useStateStore","useContext","Error","useStateValue","createMemo","useStateBinding","setValue","newValue","import_solid_js","import_core","VisibilityContext","createContext","VisibilityProvider","props","stateStore","useStateStore","visibilityCtx","stateModel","state","value","isVisible","condition","evaluateVisibility","ctx","_$createComponent","Provider","children","useVisibility","useContext","Error","useIsVisible","import_solid_js","import_core","import_solid_js","import_core","ValidationContext","createContext","dynamicArgsEqual","a","b","keysA","Object","keys","keysB","length","key","va","vb","sa","$state","sb","validationConfigEqual","validateOn","ac","checks","bc","i","ca","cb","type","message","args","ValidationProvider","props","getSnapshot","useStateStore","customFunctions","fieldStates","setFieldStates","createSignal","fieldStatesRef","fieldConfigs","setFieldConfigs","registerField","path","config","prev","existing","validate","currentState","segments","split","filter","Boolean","value","seg","undefined","result","runValidation","stateModel","newFieldState","touched","validated","touch","clear","_","rest","validateAll","allValid","entries","valid","_$createComponent","Provider","children","useValidation","ctx","useContext","Error","useOptionalValidation","useFieldValidation","validation","createEffect","state","createMemo","current","errors","isValid","idCounter","generateUniqueId","Date","now","deepResolveValue","value","get","undefined","Array","isArray","obj","keys","Object","length","$state","map","item","resolved","key","val","entries","ActionContext","createContext","ActionProvider","props","set","getSnapshot","useStateStore","validation","useOptionalValidation","handlers","setHandlers","createSignal","loadingActions","setLoadingActions","Set","pendingConfirmation","setPendingConfirmation","registerHandler","name","handler","prev","execute","binding","resolveAction","dispatchId","nextActionDispatchId","dispatchedAt","notifyActionDispatch","id","action","params","at","__ok","__error","statePath","rawValue","resolvedValue","arr","clearStatePath","index","filter","_","i","screen","currentScreen","navStack","previousScreen","slice","validateAll","console","warn","valid","errors","path","fs","fieldStates","result","confirm","Promise","resolve","reject","Error","then","add","executeAction","setState","navigate","subBinding","next","delete","err","notifyActionSettle","ok","durationMs","error","cancel","ctx","_$createComponent","Provider","children","useActions","useContext","useAction","actions","isLoading","has","ConfirmDialog","isDanger","variant","_el$","_tmpl$","_el$2","firstChild","_el$3","_el$4","nextSibling","_el$5","_el$6","_el$7","_$addEventListener","onCancel","$$click","e","stopPropagation","_$insert","title","message","cancelLabel","onConfirm","confirmLabel","_$effect","_$p","_$setStyleProperty","_$delegateEvents","import_solid_js","RepeatScopeContext","createContext","RepeatScopeProvider","props","_$createComponent","Provider","value","item","index","basePath","children","useRepeatScope","useContext","import_core","import_core","import_solid_js","import_core","EMPTY_FUNCTIONS","FunctionsContext","createContext","useFunctions","useContext","DirectivesContext","undefined","useDirectives","useDevtoolsActive","active","setActive","createSignal","isDevtoolsActive","unsub","subscribeDevtoolsActive","onCleanup","ElementRenderer","props","repeatScope","useRepeatScope","ctx","useVisibility","execute","useActions","stateStore","useStateStore","getSnapshot","functions","directives","fullCtx","createMemo","repeatItem","item","repeatIndex","index","repeatBasePath","basePath","stateModel","isVisible","element","visible","evaluateVisibility","emit","eventName","onBindings","on","binding","actionBindings","Array","isArray","b","params","liveCtx","resolved","key","val","Object","entries","resolveActionParam","shouldPreventDefault","bound","some","preventDefault","createEffect","watchConfig","watch","paths","keys","length","unsubscribe","subscribeChanges","changes","changedPaths","Set","map","change","path","has","bindings","catch","console","error","elementBindings","rawProps","resolveBindings","resolvedElement","resolvedProps","resolveElementProps","_$createComponent","Show","when","children","ErrorBoundary","fallback","err","type","ElementRendererContent","elementKey","spec","registry","loading","devtoolsActive","Comp","warn","ComponentFn","Component","repeat","RepeatChildren","For","each","childKey","childElement","elements","el","rendered","_$memo","_el$","_tmpl$","_$insert","_$effect","_$setAttribute","statePath","items","getByPath","state","itemValue","r","String","RepeatScopeProvider","Renderer","rootElement","root","JSONUIProvider","directiveRegistry","createDirectiveRegistry","StateProvider","store","initialState","onStateChange","VisibilityProvider","ValidationProvider","customFunctions","validationFunctions","ActionProvider","handlers","navigate","Provider","value","ConfirmationDialogManager","pendingConfirmation","confirm","cancel","action","confirmConfig","ConfirmDialog","onConfirm","onCancel","defineRegistry","_catalog","options","components","name","componentFn","renderProps","actionMap","actions","getSetState","getState","result","actionFn","setState","executeAction","actionName","entry","find","createRenderer","catalog","CatalogRenderer","actionHandlers","onAction","Proxy","get","_target","prop","import_solid_js","import_core"]}
|