@json-render/vue 0.20.0 → 0.21.1

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/composables/state.ts","../src/composables/visibility.ts","../src/composables/actions.ts","../src/composables/validation.ts","../src/composables/repeat-scope.ts","../src/index.ts","../src/hooks.ts","../src/renderer.ts"],"sourcesContent":["import {\n computed,\n defineComponent,\n inject,\n onUnmounted,\n provide,\n ref,\n shallowRef,\n watch,\n type ComputedRef,\n type PropType,\n type ShallowRef,\n} from \"vue\";\nimport {\n createStateStore,\n getByPath,\n type StateModel,\n type StateStore,\n} from \"@json-render/core\";\nimport { flattenToPointers } from \"@json-render/core/store-utils\";\n\n/**\n * State context value\n */\nexport interface StateContextValue {\n /** Reactive state snapshot — use state.value in reactive contexts */\n state: ShallowRef<StateModel>;\n /** Get a value by path */\n get: (path: string) => unknown;\n /** Set a value by path */\n set: (path: string, value: unknown) => void;\n /** Update multiple values at once */\n update: (updates: Record<string, unknown>) => void;\n /** Return the live state snapshot from the underlying store (not through Vue reactivity). */\n getSnapshot: () => StateModel;\n}\n\nconst STATE_KEY = Symbol(\"json-render:state\");\n\n/**\n * Props for StateProvider\n */\nexport interface StateProviderProps {\n /**\n * External store that owns the state. When provided, the provider operates\n * in **controlled mode** — `initialState` and `onStateChange` are ignored\n * and the store is the single source of truth.\n */\n store?: StateStore;\n /** Initial state model (used only in uncontrolled mode) */\n initialState?: StateModel;\n /**\n * Callback when state changes (used only in uncontrolled mode).\n * Called once per `set` or `update` with all changed entries.\n */\n onStateChange?: (changes: Array<{ path: string; value: unknown }>) => void;\n}\n\n/**\n * Provider for state model context.\n *\n * Supports two modes:\n * - **Controlled**: pass a `store` prop (e.g. backed by Redux / Zustand).\n * - **Uncontrolled** (default): omit `store` and optionally pass\n * `initialState` / `onStateChange`.\n */\nexport const StateProvider = defineComponent({\n name: \"StateProvider\",\n props: {\n store: {\n type: Object as PropType<StateStore>,\n default: undefined,\n },\n initialState: {\n type: Object as PropType<StateModel>,\n default: undefined,\n },\n onStateChange: {\n type: Function as PropType<\n (changes: Array<{ path: string; value: unknown }>) => void\n >,\n default: undefined,\n },\n },\n setup(props, { slots }) {\n const isControlled = !!props.store;\n\n // Use external store (controlled) or create internal store (uncontrolled)\n const internalStore = !isControlled\n ? createStateStore(props.initialState ?? {})\n : null;\n const store: StateStore = props.store ?? internalStore!;\n\n const state = shallowRef<StateModel>(store.getSnapshot());\n\n const unsubscribe = store.subscribe(() => {\n state.value = store.getSnapshot();\n });\n onUnmounted(unsubscribe);\n\n // Sync external initialState changes (uncontrolled mode only)\n if (!isControlled) {\n let prevFlat: Record<string, unknown> =\n props.initialState && Object.keys(props.initialState).length > 0\n ? flattenToPointers(props.initialState)\n : {};\n\n watch(\n () => props.initialState,\n (newInitialState) => {\n if (!newInitialState) return;\n const nextFlat =\n Object.keys(newInitialState).length > 0\n ? flattenToPointers(newInitialState)\n : {};\n const allKeys = new Set([\n ...Object.keys(prevFlat),\n ...Object.keys(nextFlat),\n ]);\n const updates: Record<string, unknown> = {};\n for (const key of allKeys) {\n if (prevFlat[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 }\n\n // Keep onStateChange in a ref so it always reads the latest callback\n const onStateChangeRef = ref(props.onStateChange);\n watch(\n () => props.onStateChange,\n (fn) => {\n onStateChangeRef.value = fn;\n },\n );\n\n const get = (path: string) => store.get(path);\n const getSnapshot = () => store.getSnapshot();\n\n const set = (path: string, value: unknown) => {\n const prev = store.getSnapshot();\n store.set(path, value);\n if (!isControlled && store.getSnapshot() !== prev) {\n onStateChangeRef.value?.([{ path, value }]);\n }\n };\n\n const update = (updates: Record<string, unknown>) => {\n const prev = store.getSnapshot();\n store.update(updates);\n if (!isControlled && store.getSnapshot() !== prev) {\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 onStateChangeRef.value?.(changes);\n }\n }\n };\n\n provide<StateContextValue>(STATE_KEY, {\n state,\n get,\n set,\n update,\n getSnapshot,\n });\n\n return () => slots.default?.();\n },\n});\n\n/**\n * Composable to access the state context\n */\nexport function useStateStore(): StateContextValue {\n const ctx = inject<StateContextValue>(STATE_KEY);\n if (!ctx) {\n throw new Error(\"useStateStore must be used within a StateProvider\");\n }\n return ctx;\n}\n\n/**\n * Composable to get a value from the state model (reactive)\n */\nexport function useStateValue<T>(path: string): ComputedRef<T | undefined> {\n const { state } = useStateStore();\n return computed(() => getByPath(state.value, path) as T | undefined);\n}\n\n/**\n * Composable to get and set a value from the state model by path.\n *\n * This is the path-based variant for use in arbitrary composables. For\n * registry components that receive `bindings` from the renderer, prefer\n * `useBoundProp` which reads the already-resolved prop value and writes back\n * to the bound path.\n */\nexport function useStateBinding<T>(\n path: string,\n): [ComputedRef<T | undefined>, (value: T) => void] {\n const { state, set } = useStateStore();\n const value = computed(() => getByPath(state.value, path) as T | undefined);\n const setValue = (newValue: T) => set(path, newValue);\n return [value, setValue];\n}\n","import {\n computed,\n defineComponent,\n inject,\n provide,\n type ComputedRef,\n} from \"vue\";\nimport {\n evaluateVisibility,\n type VisibilityCondition,\n type VisibilityContext as CoreVisibilityContext,\n} from \"@json-render/core\";\nimport { useStateStore } from \"./state\";\n\n/**\n * Visibility context value\n */\nexport interface VisibilityContextValue {\n /** Evaluate a visibility condition */\n isVisible: (condition: VisibilityCondition | undefined) => boolean;\n /** The underlying visibility context (reactive) */\n ctx: ComputedRef<CoreVisibilityContext>;\n}\n\nconst VISIBILITY_KEY = Symbol(\"json-render:visibility\");\n\n/**\n * Provider for visibility evaluation\n */\nexport const VisibilityProvider = defineComponent({\n name: \"VisibilityProvider\",\n setup(_, { slots }) {\n const { state } = useStateStore();\n\n const ctx = computed<CoreVisibilityContext>(() => ({\n stateModel: state.value,\n }));\n\n const isVisible = (condition: VisibilityCondition | undefined): boolean =>\n evaluateVisibility(condition, ctx.value);\n\n provide<VisibilityContextValue>(VISIBILITY_KEY, { isVisible, ctx });\n\n return () => slots.default?.();\n },\n});\n\n/**\n * Composable to access visibility evaluation\n */\nexport function useVisibility(): VisibilityContextValue {\n const ctx = inject<VisibilityContextValue>(VISIBILITY_KEY);\n if (!ctx) {\n throw new Error(\"useVisibility must be used within a VisibilityProvider\");\n }\n return ctx;\n}\n\n/**\n * Composable to check if a condition is visible. Returns a reactive\n * `ComputedRef<boolean>` so the result updates whenever state changes.\n */\nexport function useIsVisible(\n condition: VisibilityCondition | undefined,\n): ComputedRef<boolean> {\n const { ctx } = useVisibility();\n return computed(() => evaluateVisibility(condition, ctx.value));\n}\n","import {\n computed,\n defineComponent,\n h,\n inject,\n provide,\n ref,\n watch,\n type ComputedRef,\n type PropType,\n} from \"vue\";\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\n/**\n * Generate a unique ID for use with the \"$id\" token.\n */\nlet idCounter = 0;\nfunction generateUniqueId(): string {\n idCounter += 1;\n return `${Date.now()}-${idCounter}`;\n}\n\n/**\n * Deep-resolve dynamic value references within an object.\n *\n * Supported tokens:\n * - `{ $state: \"/statePath\" }` - read a value from state\n * - `\"$id\"` (string) or `{ \"$id\": true }` - generate a unique ID\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\n/**\n * Pending confirmation state\n */\nexport interface PendingConfirmation {\n action: ResolvedAction;\n handler: ActionHandler;\n resolve: () => void;\n reject: () => void;\n}\n\n/**\n * Action context value\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 ACTIONS_KEY = Symbol(\"json-render:actions\");\n\nexport interface ActionProviderProps {\n handlers?: Record<string, ActionHandler>;\n navigate?: (path: string) => void;\n}\n\n/**\n * Provider for action execution\n */\nexport const ActionProvider = defineComponent({\n name: \"ActionProvider\",\n props: {\n handlers: {\n type: Object as PropType<Record<string, ActionHandler>>,\n default: () => ({}),\n },\n navigate: {\n type: Function as PropType<(path: string) => void>,\n default: undefined,\n },\n },\n setup(props, { slots }) {\n const { get, set, getSnapshot } = useStateStore();\n const validation = useOptionalValidation();\n\n const handlers = ref<Record<string, ActionHandler>>(props.handlers ?? {});\n const loadingActions = ref<Set<string>>(new Set());\n const pendingConfirmation = ref<PendingConfirmation | null>(null);\n\n // Sync handlers when prop changes\n watch(\n () => props.handlers,\n (newHandlers) => {\n if (newHandlers) handlers.value = newHandlers;\n },\n );\n\n const registerHandler = (name: string, handler: ActionHandler) => {\n handlers.value = { ...handlers.value, [name]: handler };\n };\n\n const execute = async (binding: ActionBinding): Promise<void> => {\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 // Built-in: setState\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 // Built-in: pushState\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 // Built-in: removeState\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 // Built-in: validateForm — triggers validateAll and writes result to state\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 // Built-in: push (navigation)\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 // Built-in: pop (navigation)\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 const handler = handlers.value[resolved.action];\n\n if (!handler) {\n console.warn(`No handler registered for action: ${resolved.action}`);\n return;\n }\n\n // If confirmation is required, show dialog first\n if (resolved.confirm) {\n await new Promise<void>((resolve, reject) => {\n pendingConfirmation.value = {\n action: resolved,\n handler,\n resolve: () => {\n pendingConfirmation.value = null;\n resolve();\n },\n reject: () => {\n pendingConfirmation.value = null;\n reject(new Error(\"Action cancelled\"));\n },\n };\n });\n\n const addLoading = new Set(loadingActions.value);\n addLoading.add(resolved.action);\n loadingActions.value = addLoading;\n try {\n await executeAction({\n action: resolved,\n handler,\n setState: set,\n navigate: props.navigate,\n executeAction: async (binding) => {\n await execute(binding);\n },\n });\n } finally {\n const removeLoading = new Set(loadingActions.value);\n removeLoading.delete(resolved.action);\n loadingActions.value = removeLoading;\n }\n return;\n }\n\n // Execute immediately\n const addLoading = new Set(loadingActions.value);\n addLoading.add(resolved.action);\n loadingActions.value = addLoading;\n try {\n await executeAction({\n action: resolved,\n handler,\n setState: set,\n navigate: props.navigate,\n executeAction: async (binding) => {\n await execute(binding);\n },\n });\n } finally {\n const removeLoading = new Set(loadingActions.value);\n removeLoading.delete(resolved.action);\n loadingActions.value = removeLoading;\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 = () => pendingConfirmation.value?.resolve();\n const cancel = () => pendingConfirmation.value?.reject();\n\n provide<ActionContextValue>(ACTIONS_KEY, {\n get handlers() {\n return handlers.value;\n },\n get loadingActions() {\n return loadingActions.value;\n },\n get pendingConfirmation() {\n return pendingConfirmation.value;\n },\n execute,\n confirm,\n cancel,\n registerHandler,\n });\n\n return () => slots.default?.();\n },\n});\n\n/**\n * Composable to access action context\n */\nexport function useActions(): ActionContextValue {\n const ctx = inject<ActionContextValue>(ACTIONS_KEY);\n if (!ctx) {\n throw new Error(\"useActions must be used within an ActionProvider\");\n }\n return ctx;\n}\n\n/**\n * Composable to execute an action binding\n */\nexport function useAction(binding: ActionBinding): {\n execute: () => Promise<void>;\n isLoading: ComputedRef<boolean>;\n} {\n const ctx = useActions();\n return {\n execute: () => ctx.execute(binding),\n isLoading: computed(() => ctx.loadingActions.has(binding.action)),\n };\n}\n\n// =============================================================================\n// ConfirmDialog component\n// =============================================================================\n\n/**\n * Props for ConfirmDialog component\n */\nexport interface ConfirmDialogProps {\n confirm: ActionConfirm;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\n/**\n * Default confirmation dialog component\n */\nexport const ConfirmDialog = defineComponent({\n name: \"ConfirmDialog\",\n props: {\n confirm: {\n type: Object as PropType<ActionConfirm>,\n required: true,\n },\n onConfirm: {\n type: Function as PropType<() => void>,\n required: true,\n },\n onCancel: {\n type: Function as PropType<() => void>,\n required: true,\n },\n },\n setup(props) {\n return () => {\n const isDanger = props.confirm.variant === \"danger\";\n\n return h(\n \"div\",\n {\n style: {\n position: \"fixed\",\n inset: \"0\",\n backgroundColor: \"rgba(0, 0, 0, 0.5)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: \"50\",\n },\n onClick: props.onCancel,\n },\n [\n h(\n \"div\",\n {\n style: {\n backgroundColor: \"white\",\n borderRadius: \"8px\",\n padding: \"24px\",\n maxWidth: \"400px\",\n width: \"100%\",\n boxShadow: \"0 20px 25px -5px rgba(0, 0, 0, 0.1)\",\n },\n onClick: (e: MouseEvent) => e.stopPropagation(),\n },\n [\n h(\n \"h3\",\n {\n style: {\n margin: \"0 0 8px 0\",\n fontSize: \"18px\",\n fontWeight: \"600\",\n },\n },\n props.confirm.title,\n ),\n h(\n \"p\",\n {\n style: { margin: \"0 0 24px 0\", color: \"#6b7280\" },\n },\n props.confirm.message,\n ),\n h(\n \"div\",\n {\n style: {\n display: \"flex\",\n gap: \"12px\",\n justifyContent: \"flex-end\",\n },\n },\n [\n h(\n \"button\",\n {\n style: {\n padding: \"8px 16px\",\n borderRadius: \"6px\",\n border: \"1px solid #d1d5db\",\n backgroundColor: \"white\",\n cursor: \"pointer\",\n },\n onClick: props.onCancel,\n },\n props.confirm.cancelLabel ?? \"Cancel\",\n ),\n h(\n \"button\",\n {\n style: {\n padding: \"8px 16px\",\n borderRadius: \"6px\",\n border: \"none\",\n backgroundColor: isDanger ? \"#dc2626\" : \"#3b82f6\",\n color: \"white\",\n cursor: \"pointer\",\n },\n onClick: props.onConfirm,\n },\n props.confirm.confirmLabel ?? \"Confirm\",\n ),\n ],\n ),\n ],\n ),\n ],\n );\n };\n },\n});\n","import {\n computed,\n defineComponent,\n inject,\n onMounted,\n onUnmounted,\n provide,\n ref,\n type ComputedRef,\n type PropType,\n} from \"vue\";\nimport {\n runValidation,\n type ValidationConfig,\n type ValidationFunction,\n type ValidationResult,\n} from \"@json-render/core\";\nimport { useStateStore } from \"./state\";\n\n/**\n * Field validation state\n */\nexport interface FieldValidationState {\n touched: boolean;\n validated: boolean;\n result: ValidationResult | null;\n}\n\n/**\n * Validation context value\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 VALIDATION_KEY = Symbol(\"json-render:validation\");\n\nexport interface ValidationProviderProps {\n customFunctions?: Record<string, ValidationFunction>;\n}\n\n/**\n * Compare two args records shallowly.\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 const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\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\n/**\n * Structural equality check for ValidationConfig.\n */\nfunction validationConfigEqual(\n a: ValidationConfig,\n b: ValidationConfig,\n): boolean {\n if (a === b) return true;\n if (a.validateOn !== b.validateOn) return false;\n const ac = a.checks ?? [];\n const bc = b.checks ?? [];\n if (ac.length !== bc.length) return false;\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 return true;\n}\n\n/**\n * Provider for validation\n */\nexport const ValidationProvider = defineComponent({\n name: \"ValidationProvider\",\n props: {\n customFunctions: {\n type: Object as PropType<Record<string, ValidationFunction>>,\n default: () => ({}),\n },\n },\n setup(props, { slots }) {\n const { state } = useStateStore();\n\n const fieldStates = ref<Record<string, FieldValidationState>>({});\n const fieldConfigs = ref<Record<string, ValidationConfig>>({});\n\n const registerField = (path: string, config: ValidationConfig) => {\n const existing = fieldConfigs.value[path];\n if (existing && validationConfigEqual(existing, config)) return;\n fieldConfigs.value = { ...fieldConfigs.value, [path]: config };\n };\n\n const validate = (\n path: string,\n config: ValidationConfig,\n ): ValidationResult => {\n const currentState = state.value;\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: props.customFunctions,\n });\n\n fieldStates.value = {\n ...fieldStates.value,\n [path]: {\n touched: fieldStates.value[path]?.touched ?? true,\n validated: true,\n result,\n },\n };\n\n return result;\n };\n\n const touch = (path: string) => {\n fieldStates.value = {\n ...fieldStates.value,\n [path]: {\n ...fieldStates.value[path],\n touched: true,\n validated: fieldStates.value[path]?.validated ?? false,\n result: fieldStates.value[path]?.result ?? null,\n },\n };\n };\n\n const clear = (path: string) => {\n const { [path]: _, ...rest } = fieldStates.value;\n fieldStates.value = rest;\n };\n\n const validateAll = (): boolean => {\n let allValid = true;\n for (const [path, config] of Object.entries(fieldConfigs.value)) {\n const result = validate(path, config);\n if (!result.valid) {\n allValid = false;\n }\n }\n return allValid;\n };\n\n provide<ValidationContextValue>(VALIDATION_KEY, {\n get customFunctions() {\n return props.customFunctions;\n },\n get fieldStates() {\n return fieldStates.value;\n },\n validate,\n touch,\n clear,\n validateAll,\n registerField,\n });\n\n return () => slots.default?.();\n },\n});\n\n/**\n * Composable to access validation context (or null if not inside a ValidationProvider).\n * Useful for components that optionally participate in form validation.\n */\nexport function useOptionalValidation(): ValidationContextValue | null {\n return (\n inject<ValidationContextValue>(\n VALIDATION_KEY,\n null as unknown as ValidationContextValue,\n ) ?? null\n );\n}\n\n/**\n * Composable to access validation context\n */\nexport function useValidation(): ValidationContextValue {\n const ctx = inject<ValidationContextValue>(VALIDATION_KEY);\n if (!ctx) {\n throw new Error(\"useValidation must be used within a ValidationProvider\");\n }\n return ctx;\n}\n\n/**\n * Composable to get validation state for a field\n */\nexport function useFieldValidation(\n path: string,\n config?: ValidationConfig,\n): {\n state: ComputedRef<FieldValidationState>;\n validate: () => ValidationResult;\n touch: () => void;\n clear: () => void;\n errors: ComputedRef<string[]>;\n isValid: ComputedRef<boolean>;\n} {\n const ctx = useValidation();\n\n onMounted(() => {\n if (path && config) {\n ctx.registerField(path, config);\n }\n });\n\n onUnmounted(() => {\n ctx.clear(path);\n });\n\n const defaultState: FieldValidationState = {\n touched: false,\n validated: false,\n result: null,\n };\n\n return {\n state: computed(() => ctx.fieldStates[path] ?? defaultState),\n validate: () => ctx.validate(path, config ?? { checks: [] }),\n touch: () => ctx.touch(path),\n clear: () => ctx.clear(path),\n errors: computed(() => ctx.fieldStates[path]?.result?.errors ?? []),\n isValid: computed(() => ctx.fieldStates[path]?.result?.valid ?? true),\n };\n}\n","import { defineComponent, inject, provide, type PropType } from \"vue\";\n\n/**\n * Repeat scope value provided to child elements inside a repeated element.\n */\nexport interface RepeatScopeValue {\n /** The current array item object */\n item: unknown;\n /** Index of the current item in the array */\n index: number;\n /** Absolute state path to the current array item (e.g. \"/todos/0\") — used for statePath two-way binding */\n basePath: string;\n}\n\nconst REPEAT_SCOPE_KEY = Symbol(\"json-render:repeat-scope\");\n\n/**\n * Provides repeat scope to child elements so $item and $index expressions resolve correctly.\n */\nexport const RepeatScopeProvider = defineComponent({\n name: \"RepeatScopeProvider\",\n props: {\n item: {\n required: true,\n },\n index: {\n type: Number,\n required: true,\n },\n basePath: {\n type: String as PropType<string>,\n required: true,\n },\n },\n setup(props, { slots }) {\n provide(REPEAT_SCOPE_KEY, props as RepeatScopeValue);\n return () => slots.default?.();\n },\n});\n\n/**\n * Read the current repeat scope (or null if not inside a repeated element).\n */\nexport function useRepeatScope(): RepeatScopeValue | null {\n return (\n inject<RepeatScopeValue>(\n REPEAT_SCOPE_KEY,\n null as unknown as RepeatScopeValue,\n ) ?? null\n );\n}\n","// Composables & Providers\nexport {\n StateProvider,\n useStateStore,\n useStateValue,\n useStateBinding,\n type StateContextValue,\n type StateProviderProps,\n} from \"./composables/state\";\n\nexport {\n VisibilityProvider,\n useVisibility,\n useIsVisible,\n type VisibilityContextValue,\n} from \"./composables/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 \"./composables/actions\";\n\nexport {\n ValidationProvider,\n useOptionalValidation,\n useValidation,\n useFieldValidation,\n type ValidationContextValue,\n type ValidationProviderProps,\n type FieldValidationState,\n} from \"./composables/validation\";\n\nexport {\n RepeatScopeProvider,\n useRepeatScope,\n type RepeatScopeValue,\n} from \"./composables/repeat-scope\";\n\n// Schema\nexport { schema, type VueSchema, type VueSpec } from \"./schema\";\n\n// Core types (re-exported for convenience)\nexport type { Spec, StateStore, ComputedFunction } from \"@json-render/core\";\nexport { createStateStore } from \"@json-render/core\";\n\n// Catalog-aware types for Vue\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// 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\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 ComponentRegistry,\n type RendererProps,\n type JSONUIProviderProps,\n} from \"./renderer\";\n","import {\n ref,\n shallowRef,\n computed,\n onUnmounted,\n isRef,\n type Ref,\n type ComputedRef,\n} from \"vue\";\nimport { useStateStore } from \"./composables/state\";\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 spec: Ref<Spec | null>;\n /** Whether currently streaming */\n isStreaming: Ref<boolean>;\n /** Error if any */\n error: Ref<Error | null>;\n /** Token usage from the last generation */\n usage: Ref<TokenUsage | null>;\n /** Raw JSONL lines received from the stream (JSON patch lines) */\n rawLines: Ref<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 * Composable for streaming UI generation\n */\nexport function useUIStream({\n api,\n onComplete,\n onError,\n}: UseUIStreamOptions): UseUIStreamReturn {\n const spec = shallowRef<Spec | null>(null);\n const isStreaming = ref(false);\n const error = ref<Error | null>(null);\n const usage = ref<TokenUsage | null>(null);\n const rawLines = ref<string[]>([]);\n\n const onCompleteRef = ref(onComplete);\n const onErrorRef = ref(onError);\n\n let abortController: AbortController | null = null;\n\n const clear = () => {\n spec.value = null;\n error.value = null;\n usage.value = null;\n rawLines.value = [];\n };\n\n const send = async (\n prompt: string,\n context?: Record<string, unknown>,\n ): Promise<void> => {\n // Abort any existing request\n abortController?.abort();\n abortController = new AbortController();\n\n isStreaming.value = true;\n error.value = null;\n usage.value = null;\n rawLines.value = [];\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 spec.value = currentSpec;\n\n try {\n const response = await fetch(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 usage.value = result.usage;\n } else {\n rawLines.value = [...rawLines.value, trimmed];\n currentSpec = applyPatch(currentSpec, result.patch);\n spec.value = { ...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 usage.value = result.usage;\n } else {\n rawLines.value = [...rawLines.value, trimmed];\n currentSpec = applyPatch(currentSpec, result.patch);\n spec.value = { ...currentSpec };\n }\n }\n }\n\n onCompleteRef.value?.(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 error.value = resolvedError;\n onErrorRef.value?.(resolvedError);\n } finally {\n isStreaming.value = false;\n }\n };\n\n // Cleanup on unmount\n onUnmounted(() => {\n abortController?.abort();\n });\n\n return {\n spec,\n isStreaming,\n error,\n usage,\n rawLines,\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/**\n * Composable 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 * ```ts\n * import { useBoundProp } from \"@json-render/vue\";\n *\n * const Input: ComponentFn<AppCatalog, \"Input\"> = ({ props, bindings }) => {\n * const [value, setValue] = useBoundProp<string>(props.value as string, bindings?.value);\n * return h(\"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 } = useStateStore();\n return [\n propValue,\n (value: T) => {\n if (bindingPath) set(bindingPath, value);\n },\n ];\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 * Type guard that validates a data part payload looks like a valid\n * SpecDataPart before we cast it.\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\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 * Works with the AI SDK's `UIMessage.parts` array. Picks out parts whose\n * `type` is `SPEC_DATA_PART_TYPE` and processes them based on the payload's\n * `type` discriminator: `\"patch\"`, `\"flat\"`, or `\"nested\"`.\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 */\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 * Composable that extracts both the json-render spec and text content from a\n * message's parts array. Accepts a plain `DataPart[]` or a `Ref<DataPart[]>`\n * for reactive use in streaming scenarios.\n *\n * Returns `ComputedRef`s that recompute whenever `parts` changes.\n *\n * @example\n * ```ts\n * import { useJsonRenderMessage } from \"@json-render/vue\";\n *\n * const { spec, text, hasSpec } = useJsonRenderMessage(message.parts);\n * ```\n */\nexport function useJsonRenderMessage(parts: DataPart[] | Ref<DataPart[]>): {\n spec: ComputedRef<Spec | null>;\n text: ComputedRef<string>;\n hasSpec: ComputedRef<boolean>;\n} {\n const partsRef = isRef(parts) ? parts : ref(parts);\n const spec = computed(() => buildSpecFromParts(partsRef.value));\n const text = computed(() => getTextFromParts(partsRef.value));\n const hasSpec = computed(\n () =>\n spec.value !== null && Object.keys(spec.value.elements || {}).length > 0,\n );\n return { spec, text, hasSpec };\n}\n\n// =============================================================================\n// useChatUI — Chat + GenUI composable\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 messages: Ref<ChatMessage[]>;\n /** Whether currently streaming an assistant response */\n isStreaming: Ref<boolean>;\n /** Error from the last request, if any */\n error: Ref<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 * Composable 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. Sends the full message\n * history to the API endpoint, reads the streamed response, and separates\n * text lines from JSONL patch lines using `createMixedStreamParser`.\n *\n * @example\n * ```ts\n * const { messages, isStreaming, send, clear } = useChatUI({ api: \"/api/chat\" });\n *\n * await send(\"Compare weather in NYC and Tokyo\");\n * ```\n */\nexport function useChatUI({\n api,\n onComplete,\n onError,\n}: UseChatUIOptions): UseChatUIReturn {\n const messages = ref<ChatMessage[]>([]);\n const isStreaming = ref(false);\n const error = ref<Error | null>(null);\n\n const onCompleteRef = ref(onComplete);\n const onErrorRef = ref(onError);\n\n let abortController: AbortController | null = null;\n\n const clear = () => {\n messages.value = [];\n error.value = null;\n };\n\n const send = async (text: string): Promise<void> => {\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 messages.value = [...messages.value, userMessage, assistantMessage];\n isStreaming.value = true;\n error.value = null;\n\n // Build messages array for the API (full conversation history + new message).\n // Vue refs are always current — no stale closure issue unlike React useRef.\n const historyForApi = [\n ...messages.value\n .filter((m) => m.id !== assistantId)\n .map((m) => ({ role: m.role, content: m.text })),\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(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 messages.value = messages.value.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 onText(line) {\n accumulatedText += (accumulatedText ? \"\\n\" : \"\") + line;\n messages.value = messages.value.map((m) =>\n m.id === assistantId ? { ...m, text: accumulatedText } : m,\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 onCompleteRef.value?.(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 error.value = resolvedError;\n // Remove empty assistant message on error\n messages.value = messages.value.filter(\n (m) => m.id !== assistantId || m.text.length > 0,\n );\n onErrorRef.value?.(resolvedError);\n } finally {\n isStreaming.value = false;\n }\n };\n\n // Cleanup on unmount\n onUnmounted(() => {\n abortController?.abort();\n });\n\n return {\n messages,\n isStreaming,\n error,\n send,\n clear,\n };\n}\n","import {\n computed,\n defineComponent,\n h,\n inject,\n onBeforeUnmount,\n onErrorCaptured,\n provide,\n ref,\n watch,\n type Component,\n type ComputedRef,\n type PropType,\n type VNode,\n} from \"vue\";\nimport type {\n UIElement,\n Spec,\n ActionBinding,\n Catalog,\n ComputedFunction,\n SchemaDefinition,\n StateStore,\n DirectiveDefinition,\n DirectiveRegistry,\n} from \"@json-render/core\";\nimport {\n resolveElementProps,\n resolveBindings,\n resolveActionParam,\n resolveRepeatItemStatePath,\n resolveRepeatStatePath,\n evaluateVisibility,\n getByPath,\n createDirectiveRegistry,\n isDevtoolsActive,\n subscribeDevtoolsActive,\n type PropResolutionContext,\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 { useVisibility } from \"./composables/visibility\";\nimport { useActions } from \"./composables/actions\";\nimport { useStateStore } from \"./composables/state\";\nimport { StateProvider } from \"./composables/state\";\nimport { VisibilityProvider } from \"./composables/visibility\";\nimport { ActionProvider } from \"./composables/actions\";\nimport { ValidationProvider } from \"./composables/validation\";\nimport { ConfirmDialog } from \"./composables/actions\";\nimport {\n RepeatScopeProvider,\n useRepeatScope,\n} from \"./composables/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 /** Emit a named event */\n emit: (event: string) => void;\n /** Get an event handle with metadata */\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 */\n bindings?: Record<string, string>;\n /** Whether the parent is loading */\n loading?: boolean;\n}\n\n/**\n * Registry of component renderers (Vue component definitions)\n */\nexport type ComponentRegistry = Record<string, Component>;\n\n/**\n * Props for the Renderer component\n */\nexport interface RendererProps {\n spec: Spec | null;\n registry: ComponentRegistry;\n loading?: boolean;\n fallback?: Component;\n}\n\n// ---------------------------------------------------------------------------\n// FunctionsContext — provides $computed functions to the element tree\n// ---------------------------------------------------------------------------\n\nconst EMPTY_FUNCTIONS: Record<string, ComputedFunction> = {};\nconst FUNCTIONS_KEY = Symbol(\"json-render:functions\");\n\nconst FunctionsProvider = defineComponent({\n name: \"FunctionsProvider\",\n props: {\n functions: {\n type: Object as PropType<Record<string, ComputedFunction>>,\n default: undefined,\n },\n },\n setup(props, { slots }) {\n const fns = computed(() => props.functions ?? EMPTY_FUNCTIONS);\n provide(FUNCTIONS_KEY, fns);\n return () => slots.default?.();\n },\n});\n\nfunction useFunctions(): ComputedRef<Record<string, ComputedFunction>> {\n return inject<ComputedRef<Record<string, ComputedFunction>>>(\n FUNCTIONS_KEY,\n computed(() => EMPTY_FUNCTIONS),\n );\n}\n\n// ---------------------------------------------------------------------------\n// DirectivesContext — provides custom directive registry to the element tree\n// ---------------------------------------------------------------------------\n\nconst DIRECTIVES_KEY = Symbol(\"json-render:directives\");\n\nconst DirectivesProvider = defineComponent({\n name: \"DirectivesProvider\",\n props: {\n directives: {\n type: Array as PropType<DirectiveDefinition[]>,\n default: undefined,\n },\n },\n setup(props, { slots }) {\n const registry = computed(() =>\n props.directives ? createDirectiveRegistry(props.directives) : undefined,\n );\n provide(DIRECTIVES_KEY, registry);\n return () => slots.default?.();\n },\n});\n\nfunction useDirectives(): ComputedRef<DirectiveRegistry | undefined> {\n return inject<ComputedRef<DirectiveRegistry | undefined>>(\n DIRECTIVES_KEY,\n computed(() => undefined),\n );\n}\n\n// ---------------------------------------------------------------------------\n// ElementErrorBoundary — catches rendering errors in individual elements\n// ---------------------------------------------------------------------------\n\nconst ElementErrorBoundary = defineComponent({\n name: \"ElementErrorBoundary\",\n props: {\n elementType: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const hasError = ref(false);\n\n onErrorCaptured((error) => {\n console.error(\n `[json-render] Rendering error in <${props.elementType}>:`,\n error,\n );\n hasError.value = true;\n return false; // prevent propagation\n });\n\n return () => {\n if (hasError.value) return null;\n return slots.default?.();\n };\n },\n});\n\n// ---------------------------------------------------------------------------\n// resolveAndExecuteBindings — shared helper for emitEvent / watch handlers\n// ---------------------------------------------------------------------------\n\nasync function resolveAndExecuteBindings(\n actionBindings: ActionBinding[],\n ctx: PropResolutionContext,\n getSnapshot: () => Record<string, unknown>,\n execute: (binding: ActionBinding) => Promise<void>,\n cancelled?: () => boolean,\n): Promise<void> {\n for (const b of actionBindings) {\n if (cancelled?.()) break;\n if (!b.params) {\n await execute(b);\n if (cancelled?.()) break;\n continue;\n }\n const liveCtx: PropResolutionContext = {\n ...ctx,\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 if (cancelled?.()) break;\n }\n}\n\n// ---------------------------------------------------------------------------\n// ElementRenderer — renders a single element from the spec\n// ---------------------------------------------------------------------------\n\ninterface ElementRendererInternalProps {\n element: UIElement;\n spec: Spec;\n registry: ComponentRegistry;\n loading?: boolean;\n fallback?: Component;\n}\n\n/**\n * Reactive mirror of the devtools-active flag.\n * Used by ElementRenderer to decide whether to add a `data-jr-key` wrapper.\n */\nfunction useDevtoolsActive() {\n const active = ref(isDevtoolsActive());\n const unsub = subscribeDevtoolsActive(() => {\n active.value = isDevtoolsActive();\n });\n onBeforeUnmount(unsub);\n return active;\n}\n\nconst ElementRenderer = defineComponent({\n name: \"JsonRenderElement\",\n props: {\n element: {\n type: Object as PropType<UIElement>,\n required: true,\n },\n elementKey: {\n type: String,\n default: undefined,\n },\n spec: {\n type: Object as PropType<Spec>,\n required: true,\n },\n registry: {\n type: Object as PropType<ComponentRegistry>,\n required: true,\n },\n loading: {\n type: Boolean,\n default: undefined,\n },\n fallback: {\n type: Object as PropType<Component>,\n default: undefined,\n },\n },\n setup(props: ElementRendererInternalProps & { elementKey?: string }) {\n const devtoolsActive = useDevtoolsActive();\n const repeatScope = useRepeatScope();\n const { ctx: visibilityCtx } = useVisibility();\n const { execute } = useActions();\n const { getSnapshot, state: watchState } = useStateStore();\n const functions = useFunctions();\n const directives = useDirectives();\n\n // Build context with repeat scope, $computed functions, and custom directives\n const fullCtx = computed<PropResolutionContext>(() => {\n const base: PropResolutionContext = repeatScope\n ? {\n ...visibilityCtx.value,\n repeatItem: repeatScope.item,\n repeatIndex: repeatScope.index,\n repeatBasePath: repeatScope.basePath,\n }\n : { ...visibilityCtx.value };\n base.functions = functions.value;\n base.directives = directives.value;\n return base;\n });\n\n // Create emit function\n const emitEvent = async (eventName: string): Promise<void> => {\n const binding = props.element.on?.[eventName];\n if (!binding) return;\n const actionBindings = Array.isArray(binding) ? binding : [binding];\n await resolveAndExecuteBindings(\n actionBindings,\n fullCtx.value,\n getSnapshot,\n execute,\n );\n };\n\n // Create on() function\n const onEvent = (eventName: string): EventHandle => {\n const binding = props.element.on?.[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: () => {\n void emitEvent(eventName);\n },\n shouldPreventDefault,\n bound: true,\n };\n };\n\n // Watch effect: fire actions when watched state paths change.\n const watchedValues = computed(() => {\n const cfg = props.element.watch;\n if (!cfg) return undefined;\n const values: Record<string, unknown> = {};\n for (const path of Object.keys(cfg)) {\n values[path] = getByPath(watchState.value, path);\n }\n return values;\n });\n\n watch(\n watchedValues,\n (current, prev, onCleanup) => {\n const cfg = props.element.watch;\n if (!cfg || !current) return;\n\n let cancelled = false;\n onCleanup(() => {\n cancelled = true;\n });\n\n const paths = Object.keys(cfg);\n void (async () => {\n for (const path of paths) {\n if (cancelled) break;\n if (prev && current[path] === prev[path]) continue;\n const binding = cfg[path];\n if (!binding) continue;\n const bindings = Array.isArray(binding) ? binding : [binding];\n await resolveAndExecuteBindings(\n bindings,\n fullCtx.value,\n getSnapshot,\n execute,\n () => cancelled,\n );\n }\n })().catch(console.error);\n },\n { deep: true },\n );\n\n return () => {\n const ctx = fullCtx.value;\n\n // Evaluate visibility\n const isVisible =\n props.element.visible === undefined\n ? true\n : evaluateVisibility(props.element.visible, ctx);\n\n if (!isVisible) return null;\n\n // Resolve bindings and props\n const rawProps = props.element.props as Record<string, unknown>;\n const elementBindings = resolveBindings(rawProps, ctx);\n const resolvedProps = resolveElementProps(rawProps, ctx);\n\n const resolvedElement =\n resolvedProps !== props.element.props\n ? { ...props.element, props: resolvedProps }\n : props.element;\n\n // Get component from registry\n const Component = props.registry[resolvedElement.type] ?? props.fallback;\n\n if (!Component) {\n console.warn(\n `[json-render] No renderer for component type: ${resolvedElement.type}`,\n );\n return null;\n }\n\n // Render children\n const childrenVNodes: VNode | VNode[] | undefined = resolvedElement.repeat\n ? h(RepeatChildren, {\n element: resolvedElement,\n spec: props.spec,\n registry: props.registry,\n loading: props.loading,\n fallback: props.fallback,\n })\n : (resolvedElement.children\n ?.map((childKey) => {\n const childElement = props.spec.elements[childKey];\n if (!childElement) {\n if (!props.loading) {\n console.warn(\n `[json-render] Missing element \"${childKey}\" referenced as child of \"${resolvedElement.type}\". This element will not render.`,\n );\n }\n return null;\n }\n return h(ElementRenderer, {\n key: childKey,\n element: childElement,\n elementKey: childKey,\n spec: props.spec,\n registry: props.registry,\n loading: props.loading,\n fallback: props.fallback,\n });\n })\n .filter((n): n is VNode => n !== null) ?? undefined);\n\n const componentVNode = h(\n Component,\n {\n element: resolvedElement,\n emit: emitEvent,\n on: onEvent,\n bindings: elementBindings,\n loading: props.loading,\n },\n { default: () => childrenVNodes },\n );\n\n // When devtools is mounted, wrap each element in a transparent span so\n // the picker can map DOM nodes back to spec keys.\n const tagged =\n devtoolsActive.value && props.elementKey\n ? h(\n \"span\",\n { \"data-jr-key\": props.elementKey, style: \"display:contents\" },\n [componentVNode],\n )\n : componentVNode;\n\n return h(\n ElementErrorBoundary,\n { elementType: resolvedElement.type },\n { default: () => tagged },\n );\n };\n },\n});\n\n// ---------------------------------------------------------------------------\n// RepeatChildren — renders child elements once per item in a state array\n// ---------------------------------------------------------------------------\n\nconst RepeatChildren = defineComponent({\n name: \"JsonRenderRepeatChildren\",\n props: {\n element: {\n type: Object as PropType<UIElement>,\n required: true,\n },\n spec: {\n type: Object as PropType<Spec>,\n required: true,\n },\n registry: {\n type: Object as PropType<ComponentRegistry>,\n required: true,\n },\n loading: {\n type: Boolean,\n default: undefined,\n },\n fallback: {\n type: Object as PropType<Component>,\n default: undefined,\n },\n },\n setup(props) {\n const { state } = useStateStore();\n const parentScope = useRepeatScope();\n\n return () => {\n const repeat = props.element.repeat;\n if (!repeat?.statePath) return null;\n const statePath = resolveRepeatStatePath(\n repeat.statePath,\n parentScope?.basePath,\n );\n if (statePath === undefined) {\n console.warn(\n \"[json-render/vue] $item in repeat.statePath used outside of a repeat scope\",\n );\n return null;\n }\n const raw = getByPath(state.value, statePath);\n const items = Array.isArray(raw) ? (raw as unknown[]) : [];\n\n return items.map((itemValue, index) => {\n const key =\n repeat.key && typeof itemValue === \"object\" && itemValue !== null\n ? String(\n (itemValue as Record<string, unknown>)[repeat.key] ?? index,\n )\n : String(index);\n\n return h(\n RepeatScopeProvider,\n {\n key,\n item: itemValue,\n index,\n basePath: resolveRepeatItemStatePath(statePath, index),\n },\n {\n default: () =>\n props.element.children\n ?.map((childKey) => {\n const childElement = props.spec.elements[childKey];\n if (!childElement) {\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 return h(ElementRenderer, {\n key: childKey,\n element: childElement,\n elementKey: childKey,\n spec: props.spec,\n registry: props.registry,\n loading: props.loading,\n fallback: props.fallback,\n });\n })\n .filter((n): n is VNode => n !== null) ?? null,\n },\n );\n });\n };\n },\n});\n\n// ---------------------------------------------------------------------------\n// Renderer — main exported component\n// ---------------------------------------------------------------------------\n\n/**\n * Main renderer component\n */\nexport const Renderer = defineComponent({\n name: \"JsonRenderer\",\n props: {\n spec: {\n type: Object as PropType<Spec | null>,\n default: null,\n },\n registry: {\n type: Object as PropType<ComponentRegistry>,\n required: true,\n },\n loading: {\n type: Boolean,\n default: undefined,\n },\n fallback: {\n type: Object as PropType<Component>,\n default: undefined,\n },\n },\n setup(props) {\n return () => {\n if (!props.spec?.root) return null;\n\n const rootElement = props.spec.elements[props.spec.root];\n if (!rootElement) return null;\n\n return h(ElementRenderer, {\n element: rootElement,\n elementKey: props.spec.root,\n spec: props.spec,\n registry: props.registry,\n loading: props.loading,\n fallback: props.fallback,\n });\n };\n },\n});\n\n// ---------------------------------------------------------------------------\n// ConfirmationDialogManager\n// ---------------------------------------------------------------------------\n\nconst ConfirmationDialogManager = defineComponent({\n name: \"ConfirmationDialogManager\",\n setup() {\n const { pendingConfirmation, confirm, cancel } = useActions();\n\n return () => {\n if (!pendingConfirmation?.action.confirm) return null;\n\n return h(ConfirmDialog, {\n confirm: pendingConfirmation.action.confirm,\n onConfirm: confirm,\n onCancel: cancel,\n });\n };\n },\n});\n\n// ---------------------------------------------------------------------------\n// JSONUIProvider — combined provider for all contexts\n// ---------------------------------------------------------------------------\n\n/**\n * Props for JSONUIProvider\n */\nexport interface JSONUIProviderProps {\n registry: ComponentRegistry;\n store?: StateStore;\n initialState?: Record<string, unknown>;\n handlers?: Record<\n string,\n (params: Record<string, unknown>) => Promise<unknown> | unknown\n >;\n navigate?: (path: string) => void;\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 onStateChange?: (changes: Array<{ path: string; value: unknown }>) => void;\n}\n\n/**\n * Combined provider for all JSONUI contexts\n */\nexport const JSONUIProvider = defineComponent({\n name: \"JSONUIProvider\",\n props: {\n registry: {\n type: Object as PropType<ComponentRegistry>,\n required: true,\n },\n store: {\n type: Object as PropType<StateStore>,\n default: undefined,\n },\n initialState: {\n type: Object as PropType<Record<string, unknown>>,\n default: undefined,\n },\n handlers: {\n type: Object as PropType<\n Record<\n string,\n (params: Record<string, unknown>) => Promise<unknown> | unknown\n >\n >,\n default: undefined,\n },\n navigate: {\n type: Function as PropType<(path: string) => void>,\n default: undefined,\n },\n validationFunctions: {\n type: Object as PropType<\n Record<\n string,\n (value: unknown, args?: Record<string, unknown>) => boolean\n >\n >,\n default: undefined,\n },\n functions: {\n type: Object as PropType<Record<string, ComputedFunction>>,\n default: undefined,\n },\n directives: {\n type: Array as PropType<DirectiveDefinition[]>,\n default: undefined,\n },\n onStateChange: {\n type: Function as PropType<\n (changes: Array<{ path: string; value: unknown }>) => void\n >,\n default: undefined,\n },\n },\n setup(props, { slots }) {\n return () =>\n h(\n StateProvider,\n {\n store: props.store,\n initialState: props.initialState,\n onStateChange: props.onStateChange,\n },\n {\n default: () =>\n h(VisibilityProvider, null, {\n default: () =>\n h(\n ValidationProvider,\n { customFunctions: props.validationFunctions },\n {\n default: () =>\n h(\n ActionProvider,\n { handlers: props.handlers, navigate: props.navigate },\n {\n default: () =>\n h(\n FunctionsProvider,\n { functions: props.functions },\n {\n default: () =>\n h(\n DirectivesProvider,\n { directives: props.directives },\n {\n default: () => [\n slots.default?.(),\n h(ConfirmationDialogManager),\n ],\n },\n ),\n },\n ),\n },\n ),\n },\n ),\n }),\n },\n );\n },\n});\n\n// ============================================================================\n// defineRegistry\n// ============================================================================\n\n/**\n * Result returned by defineRegistry\n */\nexport interface DefineRegistryResult {\n registry: ComponentRegistry;\n handlers: (\n getSetState: () => SetState | undefined,\n getState: () => StateModel,\n ) => Record<string, (params: Record<string, unknown>) => Promise<void>>;\n executeAction: (\n actionName: string,\n params: Record<string, unknown> | undefined,\n setState: SetState,\n state?: StateModel,\n ) => Promise<void>;\n}\n\ntype DefineRegistryOptions<C extends Catalog> = {\n components?: Components<C>;\n} & (CatalogHasActions<C> extends true\n ? { actions: Actions<C> }\n : { actions?: Actions<C> });\n\ntype DefineRegistryComponentFn = (ctx: {\n props: unknown;\n children?: VNode | VNode[];\n emit: (event: string) => void;\n on: (event: string) => EventHandle;\n bindings?: Record<string, string>;\n loading?: boolean;\n}) => VNode | VNode[] | null | string;\n\ntype DefineRegistryActionFn = (\n params: Record<string, unknown> | undefined,\n setState: SetState,\n state: StateModel,\n) => Promise<void>;\n\n/**\n * Create a registry from a catalog with components and/or actions.\n *\n * @example\n * ```ts\n * // Components only\n * const { registry } = defineRegistry(catalog, {\n * components: {\n * Card: ({ props, children }) => h('div', { class: 'card' }, [props.title, children]),\n * },\n * });\n *\n * // Both\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 const registry: ComponentRegistry = {};\n\n if (options.components) {\n for (const [name, componentFn] of Object.entries(options.components)) {\n registry[name] = defineComponent({\n name: `JsonRenderRegistry_${name}`,\n props: {\n element: {\n type: Object as PropType<UIElement>,\n required: true,\n },\n emit: {\n type: Function as PropType<(event: string) => void>,\n required: true,\n },\n on: {\n type: Function as PropType<(event: string) => EventHandle>,\n required: true,\n },\n bindings: {\n type: Object as PropType<Record<string, string>>,\n default: undefined,\n },\n loading: {\n type: Boolean,\n default: undefined,\n },\n },\n setup(registryProps, { slots }) {\n return () =>\n (componentFn as DefineRegistryComponentFn)({\n props: registryProps.element.props,\n children: slots.default?.(),\n emit: registryProps.emit,\n on: registryProps.on,\n bindings: registryProps.bindings,\n loading: registryProps.loading,\n });\n },\n });\n }\n }\n\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// ============================================================================\n// createRenderer\n// ============================================================================\n\n/**\n * Props for renderers created with createRenderer\n */\nexport interface CreateRendererProps {\n spec: Spec | null;\n store?: StateStore;\n state?: Record<string, unknown>;\n onAction?: (actionName: string, params?: Record<string, unknown>) => void;\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 loading?: boolean;\n fallback?: Component;\n}\n\n/**\n * Component map type — maps component names to Vue components\n */\nexport type ComponentMap<\n TComponents extends Record<string, { props: unknown }>,\n> = {\n [K in keyof TComponents]: Component;\n};\n\n/**\n * Create a renderer from a catalog\n *\n * @example\n * ```typescript\n * const DashboardRenderer = createRenderer(dashboardCatalog, {\n * Card: ({ props, children }) => h('div', { class: 'card' }, children),\n * Metric: ({ props }) => h('span', null, props.value),\n * });\n *\n * // Usage in template\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 {\n const registry: ComponentRegistry =\n components as unknown as ComponentRegistry;\n\n return defineComponent({\n name: \"CatalogRenderer\",\n props: {\n spec: {\n type: Object as PropType<Spec | null>,\n default: null,\n },\n store: {\n type: Object as PropType<StateStore>,\n default: undefined,\n },\n state: {\n type: Object as PropType<Record<string, unknown>>,\n default: undefined,\n },\n onAction: {\n type: Function as PropType<\n (actionName: string, params?: Record<string, unknown>) => void\n >,\n default: undefined,\n },\n onStateChange: {\n type: Function as PropType<\n (changes: Array<{ path: string; value: unknown }>) => void\n >,\n default: undefined,\n },\n functions: {\n type: Object as PropType<Record<string, ComputedFunction>>,\n default: undefined,\n },\n directives: {\n type: Array as PropType<DirectiveDefinition[]>,\n default: undefined,\n },\n loading: {\n type: Boolean,\n default: undefined,\n },\n fallback: {\n type: Object as PropType<Component>,\n default: undefined,\n },\n },\n setup(rendererProps) {\n return () => {\n // Build the action handlers proxy if onAction is provided\n const actionHandlers = rendererProps.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 rendererProps.onAction!(prop, params);\n },\n has: () => true,\n },\n )\n : undefined;\n\n return h(\n StateProvider,\n {\n store: rendererProps.store,\n initialState: rendererProps.state,\n onStateChange: rendererProps.onStateChange,\n },\n {\n default: () =>\n h(VisibilityProvider, null, {\n default: () =>\n h(ValidationProvider, null, {\n default: () =>\n h(\n ActionProvider,\n { handlers: actionHandlers },\n {\n default: () =>\n h(\n FunctionsProvider,\n { functions: rendererProps.functions },\n {\n default: () =>\n h(\n DirectivesProvider,\n { directives: rendererProps.directives },\n {\n default: () => [\n h(Renderer, {\n spec: rendererProps.spec,\n registry,\n loading: rendererProps.loading,\n fallback: rendererProps.fallback,\n }),\n h(ConfirmationDialogManager),\n ],\n },\n ),\n },\n ),\n },\n ),\n }),\n }),\n },\n );\n };\n },\n });\n}\n"],"mappings":"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","names":["computed","defineComponent","inject","provide","defineComponent","computed","provide","inject","computed","defineComponent","inject","provide","ref","watch","computed","defineComponent","inject","onUnmounted","provide","ref","defineComponent","ref","provide","inject","onUnmounted","computed","defineComponent","ref","watch","addLoading","binding","provide","inject","computed","defineComponent","inject","provide","createStateStore","ref","shallowRef","computed","onUnmounted","getByPath","shallowRef","ref","onUnmounted","computed","computed","defineComponent","h","inject","provide","ref","watch","evaluateVisibility","getByPath","defineComponent","computed","provide","inject","ref","getByPath","watch","evaluateVisibility","h","executeAction"]}
1
+ {"version":3,"sources":["../src/composables/state.ts","../src/composables/visibility.ts","../src/composables/actions.ts","../src/composables/validation.ts","../src/composables/repeat-scope.ts","../src/index.ts","../src/hooks.ts","../src/renderer.ts"],"sourcesContent":["import {\n computed,\n defineComponent,\n inject,\n onUnmounted,\n provide,\n ref,\n shallowRef,\n watch,\n type ComputedRef,\n type PropType,\n type ShallowRef,\n} from \"vue\";\nimport {\n createStateStore,\n getByPath,\n type StateModel,\n type StateStore,\n} from \"@json-render/core\";\nimport { flattenToPointers } from \"@json-render/core/store-utils\";\n\n/**\n * State context value\n */\nexport interface StateContextValue {\n /** Reactive state snapshot — use state.value in reactive contexts */\n state: ShallowRef<StateModel>;\n /** Get a value by path */\n get: (path: string) => unknown;\n /** Set a value by path */\n set: (path: string, value: unknown) => void;\n /** Update multiple values at once */\n update: (updates: Record<string, unknown>) => void;\n /** Return the live state snapshot from the underlying store (not through Vue reactivity). */\n getSnapshot: () => StateModel;\n}\n\nconst STATE_KEY = Symbol(\"json-render:state\");\n\n/**\n * Props for StateProvider\n */\nexport interface StateProviderProps {\n /**\n * External store that owns the state. When provided, the provider operates\n * in **controlled mode** — `initialState` and `onStateChange` are ignored\n * and the store is the single source of truth.\n */\n store?: StateStore;\n /** Initial state model (used only in uncontrolled mode) */\n initialState?: StateModel;\n /**\n * Callback when state changes (used only in uncontrolled mode).\n * Called once per `set` or `update` with all changed entries.\n */\n onStateChange?: (changes: Array<{ path: string; value: unknown }>) => void;\n}\n\n/**\n * Provider for state model context.\n *\n * Supports two modes:\n * - **Controlled**: pass a `store` prop (e.g. backed by Redux / Zustand).\n * - **Uncontrolled** (default): omit `store` and optionally pass\n * `initialState` / `onStateChange`.\n */\nexport const StateProvider = defineComponent({\n name: \"StateProvider\",\n props: {\n store: {\n type: Object as PropType<StateStore>,\n default: undefined,\n },\n initialState: {\n type: Object as PropType<StateModel>,\n default: undefined,\n },\n onStateChange: {\n type: Function as PropType<\n (changes: Array<{ path: string; value: unknown }>) => void\n >,\n default: undefined,\n },\n },\n setup(props, { slots }) {\n const isControlled = !!props.store;\n\n // Use external store (controlled) or create internal store (uncontrolled)\n const internalStore = !isControlled\n ? createStateStore(props.initialState ?? {})\n : null;\n const store: StateStore = props.store ?? internalStore!;\n\n const state = shallowRef<StateModel>(store.getSnapshot());\n\n const unsubscribe = store.subscribe(() => {\n state.value = store.getSnapshot();\n });\n onUnmounted(unsubscribe);\n\n // Sync external initialState changes (uncontrolled mode only)\n if (!isControlled) {\n let prevFlat: Record<string, unknown> =\n props.initialState && Object.keys(props.initialState).length > 0\n ? flattenToPointers(props.initialState)\n : {};\n\n watch(\n () => props.initialState,\n (newInitialState) => {\n if (!newInitialState) return;\n const nextFlat =\n Object.keys(newInitialState).length > 0\n ? flattenToPointers(newInitialState)\n : {};\n const allKeys = new Set([\n ...Object.keys(prevFlat),\n ...Object.keys(nextFlat),\n ]);\n const updates: Record<string, unknown> = {};\n for (const key of allKeys) {\n if (prevFlat[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 }\n\n // Keep onStateChange in a ref so it always reads the latest callback\n const onStateChangeRef = ref(props.onStateChange);\n watch(\n () => props.onStateChange,\n (fn) => {\n onStateChangeRef.value = fn;\n },\n );\n\n const get = (path: string) => store.get(path);\n const getSnapshot = () => store.getSnapshot();\n\n const set = (path: string, value: unknown) => {\n const prev = store.getSnapshot();\n store.set(path, value);\n if (!isControlled && store.getSnapshot() !== prev) {\n onStateChangeRef.value?.([{ path, value }]);\n }\n };\n\n const update = (updates: Record<string, unknown>) => {\n const prev = store.getSnapshot();\n store.update(updates);\n if (!isControlled && store.getSnapshot() !== prev) {\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 onStateChangeRef.value?.(changes);\n }\n }\n };\n\n provide<StateContextValue>(STATE_KEY, {\n state,\n get,\n set,\n update,\n getSnapshot,\n });\n\n return () => slots.default?.();\n },\n});\n\n/**\n * Composable to access the state context\n */\nexport function useStateStore(): StateContextValue {\n const ctx = inject<StateContextValue>(STATE_KEY);\n if (!ctx) {\n throw new Error(\"useStateStore must be used within a StateProvider\");\n }\n return ctx;\n}\n\n/**\n * Composable to get a value from the state model (reactive)\n */\nexport function useStateValue<T>(path: string): ComputedRef<T | undefined> {\n const { state } = useStateStore();\n return computed(() => getByPath(state.value, path) as T | undefined);\n}\n\n/**\n * Composable to get and set a value from the state model by path.\n *\n * This is the path-based variant for use in arbitrary composables. For\n * registry components that receive `bindings` from the renderer, prefer\n * `useBoundProp` which reads the already-resolved prop value and writes back\n * to the bound path.\n */\nexport function useStateBinding<T>(\n path: string,\n): [ComputedRef<T | undefined>, (value: T) => void] {\n const { state, set } = useStateStore();\n const value = computed(() => getByPath(state.value, path) as T | undefined);\n const setValue = (newValue: T) => set(path, newValue);\n return [value, setValue];\n}\n","import {\n computed,\n defineComponent,\n inject,\n provide,\n type ComputedRef,\n} from \"vue\";\nimport {\n evaluateVisibility,\n type VisibilityCondition,\n type VisibilityContext as CoreVisibilityContext,\n} from \"@json-render/core\";\nimport { useStateStore } from \"./state\";\n\n/**\n * Visibility context value\n */\nexport interface VisibilityContextValue {\n /** Evaluate a visibility condition */\n isVisible: (condition: VisibilityCondition | undefined) => boolean;\n /** The underlying visibility context (reactive) */\n ctx: ComputedRef<CoreVisibilityContext>;\n}\n\nconst VISIBILITY_KEY = Symbol(\"json-render:visibility\");\n\n/**\n * Provider for visibility evaluation\n */\nexport const VisibilityProvider = defineComponent({\n name: \"VisibilityProvider\",\n setup(_, { slots }) {\n const { state } = useStateStore();\n\n const ctx = computed<CoreVisibilityContext>(() => ({\n stateModel: state.value,\n }));\n\n const isVisible = (condition: VisibilityCondition | undefined): boolean =>\n evaluateVisibility(condition, ctx.value);\n\n provide<VisibilityContextValue>(VISIBILITY_KEY, { isVisible, ctx });\n\n return () => slots.default?.();\n },\n});\n\n/**\n * Composable to access visibility evaluation\n */\nexport function useVisibility(): VisibilityContextValue {\n const ctx = inject<VisibilityContextValue>(VISIBILITY_KEY);\n if (!ctx) {\n throw new Error(\"useVisibility must be used within a VisibilityProvider\");\n }\n return ctx;\n}\n\n/**\n * Composable to check if a condition is visible. Returns a reactive\n * `ComputedRef<boolean>` so the result updates whenever state changes.\n */\nexport function useIsVisible(\n condition: VisibilityCondition | undefined,\n): ComputedRef<boolean> {\n const { ctx } = useVisibility();\n return computed(() => evaluateVisibility(condition, ctx.value));\n}\n","import {\n computed,\n defineComponent,\n h,\n inject,\n provide,\n ref,\n watch,\n type ComputedRef,\n type PropType,\n} from \"vue\";\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\n/**\n * Generate a unique ID for use with the \"$id\" token.\n */\nlet idCounter = 0;\nfunction generateUniqueId(): string {\n idCounter += 1;\n return `${Date.now()}-${idCounter}`;\n}\n\n/**\n * Deep-resolve dynamic value references within an object.\n *\n * Supported tokens:\n * - `{ $state: \"/statePath\" }` - read a value from state\n * - `\"$id\"` (string) or `{ \"$id\": true }` - generate a unique ID\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\n/**\n * Pending confirmation state\n */\nexport interface PendingConfirmation {\n action: ResolvedAction;\n handler: ActionHandler;\n resolve: () => void;\n reject: () => void;\n}\n\n/**\n * Action context value\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 ACTIONS_KEY = Symbol(\"json-render:actions\");\n\nexport interface ActionProviderProps {\n handlers?: Record<string, ActionHandler>;\n navigate?: (path: string) => void;\n}\n\n/**\n * Provider for action execution\n */\nexport const ActionProvider = defineComponent({\n name: \"ActionProvider\",\n props: {\n handlers: {\n type: Object as PropType<Record<string, ActionHandler>>,\n default: () => ({}),\n },\n navigate: {\n type: Function as PropType<(path: string) => void>,\n default: undefined,\n },\n },\n setup(props, { slots }) {\n const { get, set, getSnapshot } = useStateStore();\n const validation = useOptionalValidation();\n\n const handlers = ref<Record<string, ActionHandler>>(props.handlers ?? {});\n const loadingActions = ref<Set<string>>(new Set());\n const pendingConfirmation = ref<PendingConfirmation | null>(null);\n\n // Sync handlers when prop changes\n watch(\n () => props.handlers,\n (newHandlers) => {\n if (newHandlers) handlers.value = newHandlers;\n },\n );\n\n const registerHandler = (name: string, handler: ActionHandler) => {\n handlers.value = { ...handlers.value, [name]: handler };\n };\n\n const execute = async (binding: ActionBinding): Promise<void> => {\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 // Built-in: setState\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 // Built-in: pushState\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 // Built-in: removeState\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 // Built-in: validateForm — triggers validateAll and writes result to state\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 // Built-in: push (navigation)\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 // Built-in: pop (navigation)\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 const handler = handlers.value[resolved.action];\n\n if (!handler) {\n console.warn(`No handler registered for action: ${resolved.action}`);\n return;\n }\n\n // If confirmation is required, show dialog first\n if (resolved.confirm) {\n await new Promise<void>((resolve, reject) => {\n pendingConfirmation.value = {\n action: resolved,\n handler,\n resolve: () => {\n pendingConfirmation.value = null;\n resolve();\n },\n reject: () => {\n pendingConfirmation.value = null;\n reject(new Error(\"Action cancelled\"));\n },\n };\n });\n\n const addLoading = new Set(loadingActions.value);\n addLoading.add(resolved.action);\n loadingActions.value = addLoading;\n try {\n await executeAction({\n action: resolved,\n handler,\n setState: set,\n navigate: props.navigate,\n executeAction: async (binding) => {\n await execute(binding);\n },\n });\n } finally {\n const removeLoading = new Set(loadingActions.value);\n removeLoading.delete(resolved.action);\n loadingActions.value = removeLoading;\n }\n return;\n }\n\n // Execute immediately\n const addLoading = new Set(loadingActions.value);\n addLoading.add(resolved.action);\n loadingActions.value = addLoading;\n try {\n await executeAction({\n action: resolved,\n handler,\n setState: set,\n navigate: props.navigate,\n executeAction: async (binding) => {\n await execute(binding);\n },\n });\n } finally {\n const removeLoading = new Set(loadingActions.value);\n removeLoading.delete(resolved.action);\n loadingActions.value = removeLoading;\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 = () => pendingConfirmation.value?.resolve();\n const cancel = () => pendingConfirmation.value?.reject();\n\n provide<ActionContextValue>(ACTIONS_KEY, {\n get handlers() {\n return handlers.value;\n },\n get loadingActions() {\n return loadingActions.value;\n },\n get pendingConfirmation() {\n return pendingConfirmation.value;\n },\n execute,\n confirm,\n cancel,\n registerHandler,\n });\n\n return () => slots.default?.();\n },\n});\n\n/**\n * Composable to access action context\n */\nexport function useActions(): ActionContextValue {\n const ctx = inject<ActionContextValue>(ACTIONS_KEY);\n if (!ctx) {\n throw new Error(\"useActions must be used within an ActionProvider\");\n }\n return ctx;\n}\n\n/**\n * Composable to execute an action binding\n */\nexport function useAction(binding: ActionBinding): {\n execute: () => Promise<void>;\n isLoading: ComputedRef<boolean>;\n} {\n const ctx = useActions();\n return {\n execute: () => ctx.execute(binding),\n isLoading: computed(() => ctx.loadingActions.has(binding.action)),\n };\n}\n\n// =============================================================================\n// ConfirmDialog component\n// =============================================================================\n\n/**\n * Props for ConfirmDialog component\n */\nexport interface ConfirmDialogProps {\n confirm: ActionConfirm;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\n/**\n * Default confirmation dialog component\n */\nexport const ConfirmDialog = defineComponent({\n name: \"ConfirmDialog\",\n props: {\n confirm: {\n type: Object as PropType<ActionConfirm>,\n required: true,\n },\n onConfirm: {\n type: Function as PropType<() => void>,\n required: true,\n },\n onCancel: {\n type: Function as PropType<() => void>,\n required: true,\n },\n },\n setup(props) {\n return () => {\n const isDanger = props.confirm.variant === \"danger\";\n\n return h(\n \"div\",\n {\n style: {\n position: \"fixed\",\n inset: \"0\",\n backgroundColor: \"rgba(0, 0, 0, 0.5)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: \"50\",\n },\n onClick: props.onCancel,\n },\n [\n h(\n \"div\",\n {\n style: {\n backgroundColor: \"white\",\n borderRadius: \"8px\",\n padding: \"24px\",\n maxWidth: \"400px\",\n width: \"100%\",\n boxShadow: \"0 20px 25px -5px rgba(0, 0, 0, 0.1)\",\n },\n onClick: (e: MouseEvent) => e.stopPropagation(),\n },\n [\n h(\n \"h3\",\n {\n style: {\n margin: \"0 0 8px 0\",\n fontSize: \"18px\",\n fontWeight: \"600\",\n },\n },\n props.confirm.title,\n ),\n h(\n \"p\",\n {\n style: { margin: \"0 0 24px 0\", color: \"#6b7280\" },\n },\n props.confirm.message,\n ),\n h(\n \"div\",\n {\n style: {\n display: \"flex\",\n gap: \"12px\",\n justifyContent: \"flex-end\",\n },\n },\n [\n h(\n \"button\",\n {\n style: {\n padding: \"8px 16px\",\n borderRadius: \"6px\",\n border: \"1px solid #d1d5db\",\n backgroundColor: \"white\",\n cursor: \"pointer\",\n },\n onClick: props.onCancel,\n },\n props.confirm.cancelLabel ?? \"Cancel\",\n ),\n h(\n \"button\",\n {\n style: {\n padding: \"8px 16px\",\n borderRadius: \"6px\",\n border: \"none\",\n backgroundColor: isDanger ? \"#dc2626\" : \"#3b82f6\",\n color: \"white\",\n cursor: \"pointer\",\n },\n onClick: props.onConfirm,\n },\n props.confirm.confirmLabel ?? \"Confirm\",\n ),\n ],\n ),\n ],\n ),\n ],\n );\n };\n },\n});\n","import {\n computed,\n defineComponent,\n inject,\n onMounted,\n onUnmounted,\n provide,\n ref,\n type ComputedRef,\n type PropType,\n} from \"vue\";\nimport {\n runValidation,\n type ValidationConfig,\n type ValidationFunction,\n type ValidationResult,\n} from \"@json-render/core\";\nimport { useStateStore } from \"./state\";\n\n/**\n * Field validation state\n */\nexport interface FieldValidationState {\n touched: boolean;\n validated: boolean;\n result: ValidationResult | null;\n}\n\n/**\n * Validation context value\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 VALIDATION_KEY = Symbol(\"json-render:validation\");\n\nexport interface ValidationProviderProps {\n customFunctions?: Record<string, ValidationFunction>;\n}\n\n/**\n * Compare two args records shallowly.\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 const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\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\n/**\n * Structural equality check for ValidationConfig.\n */\nfunction validationConfigEqual(\n a: ValidationConfig,\n b: ValidationConfig,\n): boolean {\n if (a === b) return true;\n if (a.validateOn !== b.validateOn) return false;\n const ac = a.checks ?? [];\n const bc = b.checks ?? [];\n if (ac.length !== bc.length) return false;\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 return true;\n}\n\n/**\n * Provider for validation\n */\nexport const ValidationProvider = defineComponent({\n name: \"ValidationProvider\",\n props: {\n customFunctions: {\n type: Object as PropType<Record<string, ValidationFunction>>,\n default: () => ({}),\n },\n },\n setup(props, { slots }) {\n const { state } = useStateStore();\n\n const fieldStates = ref<Record<string, FieldValidationState>>({});\n const fieldConfigs = ref<Record<string, ValidationConfig>>({});\n\n const registerField = (path: string, config: ValidationConfig) => {\n const existing = fieldConfigs.value[path];\n if (existing && validationConfigEqual(existing, config)) return;\n fieldConfigs.value = { ...fieldConfigs.value, [path]: config };\n };\n\n const validate = (\n path: string,\n config: ValidationConfig,\n ): ValidationResult => {\n const currentState = state.value;\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: props.customFunctions,\n });\n\n fieldStates.value = {\n ...fieldStates.value,\n [path]: {\n touched: fieldStates.value[path]?.touched ?? true,\n validated: true,\n result,\n },\n };\n\n return result;\n };\n\n const touch = (path: string) => {\n fieldStates.value = {\n ...fieldStates.value,\n [path]: {\n ...fieldStates.value[path],\n touched: true,\n validated: fieldStates.value[path]?.validated ?? false,\n result: fieldStates.value[path]?.result ?? null,\n },\n };\n };\n\n const clear = (path: string) => {\n const { [path]: _, ...rest } = fieldStates.value;\n fieldStates.value = rest;\n };\n\n const validateAll = (): boolean => {\n let allValid = true;\n for (const [path, config] of Object.entries(fieldConfigs.value)) {\n const result = validate(path, config);\n if (!result.valid) {\n allValid = false;\n }\n }\n return allValid;\n };\n\n provide<ValidationContextValue>(VALIDATION_KEY, {\n get customFunctions() {\n return props.customFunctions;\n },\n get fieldStates() {\n return fieldStates.value;\n },\n validate,\n touch,\n clear,\n validateAll,\n registerField,\n });\n\n return () => slots.default?.();\n },\n});\n\n/**\n * Composable to access validation context (or null if not inside a ValidationProvider).\n * Useful for components that optionally participate in form validation.\n */\nexport function useOptionalValidation(): ValidationContextValue | null {\n return (\n inject<ValidationContextValue>(\n VALIDATION_KEY,\n null as unknown as ValidationContextValue,\n ) ?? null\n );\n}\n\n/**\n * Composable to access validation context\n */\nexport function useValidation(): ValidationContextValue {\n const ctx = inject<ValidationContextValue>(VALIDATION_KEY);\n if (!ctx) {\n throw new Error(\"useValidation must be used within a ValidationProvider\");\n }\n return ctx;\n}\n\n/**\n * Composable to get validation state for a field\n */\nexport function useFieldValidation(\n path: string,\n config?: ValidationConfig,\n): {\n state: ComputedRef<FieldValidationState>;\n validate: () => ValidationResult;\n touch: () => void;\n clear: () => void;\n errors: ComputedRef<string[]>;\n isValid: ComputedRef<boolean>;\n} {\n const ctx = useValidation();\n\n onMounted(() => {\n if (path && config) {\n ctx.registerField(path, config);\n }\n });\n\n onUnmounted(() => {\n ctx.clear(path);\n });\n\n const defaultState: FieldValidationState = {\n touched: false,\n validated: false,\n result: null,\n };\n\n return {\n state: computed(() => ctx.fieldStates[path] ?? defaultState),\n validate: () => ctx.validate(path, config ?? { checks: [] }),\n touch: () => ctx.touch(path),\n clear: () => ctx.clear(path),\n errors: computed(() => ctx.fieldStates[path]?.result?.errors ?? []),\n isValid: computed(() => ctx.fieldStates[path]?.result?.valid ?? true),\n };\n}\n","import { defineComponent, inject, provide, type PropType } from \"vue\";\n\n/**\n * Repeat scope value provided to child elements inside a repeated element.\n */\nexport interface RepeatScopeValue {\n /** The current array item object */\n item: unknown;\n /** Index of the current item in the array */\n index: number;\n /** Absolute state path to the current array item (e.g. \"/todos/0\") — used for statePath two-way binding */\n basePath: string;\n}\n\nconst REPEAT_SCOPE_KEY = Symbol(\"json-render:repeat-scope\");\n\n/**\n * Provides repeat scope to child elements so $item and $index expressions resolve correctly.\n */\nexport const RepeatScopeProvider = defineComponent({\n name: \"RepeatScopeProvider\",\n props: {\n item: {\n required: true,\n },\n index: {\n type: Number,\n required: true,\n },\n basePath: {\n type: String as PropType<string>,\n required: true,\n },\n },\n setup(props, { slots }) {\n provide(REPEAT_SCOPE_KEY, props as RepeatScopeValue);\n return () => slots.default?.();\n },\n});\n\n/**\n * Read the current repeat scope (or null if not inside a repeated element).\n */\nexport function useRepeatScope(): RepeatScopeValue | null {\n return (\n inject<RepeatScopeValue>(\n REPEAT_SCOPE_KEY,\n null as unknown as RepeatScopeValue,\n ) ?? null\n );\n}\n","// Composables & Providers\nexport {\n StateProvider,\n useStateStore,\n useStateValue,\n useStateBinding,\n type StateContextValue,\n type StateProviderProps,\n} from \"./composables/state\";\n\nexport {\n VisibilityProvider,\n useVisibility,\n useIsVisible,\n type VisibilityContextValue,\n} from \"./composables/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 \"./composables/actions\";\n\nexport {\n ValidationProvider,\n useOptionalValidation,\n useValidation,\n useFieldValidation,\n type ValidationContextValue,\n type ValidationProviderProps,\n type FieldValidationState,\n} from \"./composables/validation\";\n\nexport {\n RepeatScopeProvider,\n useRepeatScope,\n type RepeatScopeValue,\n} from \"./composables/repeat-scope\";\n\n// Schema\nexport { schema, type VueSchema, type VueSpec } from \"./schema\";\n\n// Core types (re-exported for convenience)\nexport type { Spec, StateStore, ComputedFunction } from \"@json-render/core\";\nexport { createStateStore } from \"@json-render/core\";\n\n// Catalog-aware types for Vue\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// 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\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 ComponentRegistry,\n type RendererProps,\n type JSONUIProviderProps,\n} from \"./renderer\";\n","import {\n ref,\n shallowRef,\n computed,\n onUnmounted,\n isRef,\n type Ref,\n type ComputedRef,\n} from \"vue\";\nimport { useStateStore } from \"./composables/state\";\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 spec: Ref<Spec | null>;\n /** Whether currently streaming */\n isStreaming: Ref<boolean>;\n /** Error if any */\n error: Ref<Error | null>;\n /** Token usage from the last generation */\n usage: Ref<TokenUsage | null>;\n /** Raw JSONL lines received from the stream (JSON patch lines) */\n rawLines: Ref<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 * Composable for streaming UI generation\n */\nexport function useUIStream({\n api,\n onComplete,\n onError,\n}: UseUIStreamOptions): UseUIStreamReturn {\n const spec = shallowRef<Spec | null>(null);\n const isStreaming = ref(false);\n const error = ref<Error | null>(null);\n const usage = ref<TokenUsage | null>(null);\n const rawLines = ref<string[]>([]);\n\n const onCompleteRef = ref(onComplete);\n const onErrorRef = ref(onError);\n\n let abortController: AbortController | null = null;\n\n const clear = () => {\n spec.value = null;\n error.value = null;\n usage.value = null;\n rawLines.value = [];\n };\n\n const send = async (\n prompt: string,\n context?: Record<string, unknown>,\n ): Promise<void> => {\n // Abort any existing request\n abortController?.abort();\n abortController = new AbortController();\n\n isStreaming.value = true;\n error.value = null;\n usage.value = null;\n rawLines.value = [];\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 spec.value = currentSpec;\n\n try {\n const response = await fetch(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 usage.value = result.usage;\n } else {\n rawLines.value = [...rawLines.value, trimmed];\n currentSpec = applyPatch(currentSpec, result.patch);\n spec.value = { ...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 usage.value = result.usage;\n } else {\n rawLines.value = [...rawLines.value, trimmed];\n currentSpec = applyPatch(currentSpec, result.patch);\n spec.value = { ...currentSpec };\n }\n }\n }\n\n onCompleteRef.value?.(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 error.value = resolvedError;\n onErrorRef.value?.(resolvedError);\n } finally {\n isStreaming.value = false;\n }\n };\n\n // Cleanup on unmount\n onUnmounted(() => {\n abortController?.abort();\n });\n\n return {\n spec,\n isStreaming,\n error,\n usage,\n rawLines,\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/**\n * Composable 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 * ```ts\n * import { useBoundProp } from \"@json-render/vue\";\n *\n * const Input: ComponentFn<AppCatalog, \"Input\"> = ({ props, bindings }) => {\n * const [value, setValue] = useBoundProp<string>(props.value as string, bindings?.value);\n * return h(\"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 } = useStateStore();\n return [\n propValue,\n (value: T) => {\n if (bindingPath) set(bindingPath, value);\n },\n ];\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 * Type guard that validates a data part payload looks like a valid\n * SpecDataPart before we cast it.\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\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 * Works with the AI SDK's `UIMessage.parts` array. Picks out parts whose\n * `type` is `SPEC_DATA_PART_TYPE` and processes them based on the payload's\n * `type` discriminator: `\"patch\"`, `\"flat\"`, or `\"nested\"`.\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 */\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 * Composable that extracts both the json-render spec and text content from a\n * message's parts array. Accepts a plain `DataPart[]` or a `Ref<DataPart[]>`\n * for reactive use in streaming scenarios.\n *\n * Returns `ComputedRef`s that recompute whenever `parts` changes.\n *\n * @example\n * ```ts\n * import { useJsonRenderMessage } from \"@json-render/vue\";\n *\n * const { spec, text, hasSpec } = useJsonRenderMessage(message.parts);\n * ```\n */\nexport function useJsonRenderMessage(parts: DataPart[] | Ref<DataPart[]>): {\n spec: ComputedRef<Spec | null>;\n text: ComputedRef<string>;\n hasSpec: ComputedRef<boolean>;\n} {\n const partsRef = isRef(parts) ? parts : ref(parts);\n const spec = computed(() => buildSpecFromParts(partsRef.value));\n const text = computed(() => getTextFromParts(partsRef.value));\n const hasSpec = computed(\n () =>\n spec.value !== null && Object.keys(spec.value.elements || {}).length > 0,\n );\n return { spec, text, hasSpec };\n}\n\n// =============================================================================\n// useChatUI — Chat + GenUI composable\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 messages: Ref<ChatMessage[]>;\n /** Whether currently streaming an assistant response */\n isStreaming: Ref<boolean>;\n /** Error from the last request, if any */\n error: Ref<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 * Composable 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. Sends the full message\n * history to the API endpoint, reads the streamed response, and separates\n * text lines from JSONL patch lines using `createMixedStreamParser`.\n *\n * @example\n * ```ts\n * const { messages, isStreaming, send, clear } = useChatUI({ api: \"/api/chat\" });\n *\n * await send(\"Compare weather in NYC and Tokyo\");\n * ```\n */\nexport function useChatUI({\n api,\n onComplete,\n onError,\n}: UseChatUIOptions): UseChatUIReturn {\n const messages = ref<ChatMessage[]>([]);\n const isStreaming = ref(false);\n const error = ref<Error | null>(null);\n\n const onCompleteRef = ref(onComplete);\n const onErrorRef = ref(onError);\n\n let abortController: AbortController | null = null;\n\n const clear = () => {\n messages.value = [];\n error.value = null;\n };\n\n const send = async (text: string): Promise<void> => {\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 messages.value = [...messages.value, userMessage, assistantMessage];\n isStreaming.value = true;\n error.value = null;\n\n // Build messages array for the API (full conversation history + new message).\n // Vue refs are always current — no stale closure issue unlike React useRef.\n const historyForApi = [\n ...messages.value\n .filter((m) => m.id !== assistantId)\n .map((m) => ({ role: m.role, content: m.text })),\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(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 messages.value = messages.value.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 onText(line) {\n accumulatedText += (accumulatedText ? \"\\n\" : \"\") + line;\n messages.value = messages.value.map((m) =>\n m.id === assistantId ? { ...m, text: accumulatedText } : m,\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 onCompleteRef.value?.(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 error.value = resolvedError;\n // Remove empty assistant message on error\n messages.value = messages.value.filter(\n (m) => m.id !== assistantId || m.text.length > 0,\n );\n onErrorRef.value?.(resolvedError);\n } finally {\n isStreaming.value = false;\n }\n };\n\n // Cleanup on unmount\n onUnmounted(() => {\n abortController?.abort();\n });\n\n return {\n messages,\n isStreaming,\n error,\n send,\n clear,\n };\n}\n","import {\n computed,\n defineComponent,\n h,\n inject,\n onBeforeUnmount,\n onErrorCaptured,\n provide,\n ref,\n watch,\n type Component,\n type ComputedRef,\n type PropType,\n type Slots,\n type VNode,\n} from \"vue\";\nimport type {\n UIElement,\n Spec,\n ActionBinding,\n Catalog,\n ComputedFunction,\n SchemaDefinition,\n StateStore,\n DirectiveDefinition,\n DirectiveRegistry,\n} from \"@json-render/core\";\nimport {\n resolveElementProps,\n resolveBindings,\n resolveActionParam,\n resolveRepeatItemStatePath,\n resolveRepeatStatePath,\n evaluateVisibility,\n getByPath,\n createDirectiveRegistry,\n isDevtoolsActive,\n subscribeDevtoolsActive,\n type PropResolutionContext,\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 { useVisibility } from \"./composables/visibility\";\nimport { useActions } from \"./composables/actions\";\nimport { useStateStore } from \"./composables/state\";\nimport { StateProvider } from \"./composables/state\";\nimport { VisibilityProvider } from \"./composables/visibility\";\nimport { ActionProvider } from \"./composables/actions\";\nimport { ValidationProvider } from \"./composables/validation\";\nimport { ConfirmDialog } from \"./composables/actions\";\nimport {\n RepeatScopeProvider,\n useRepeatScope,\n} from \"./composables/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 /** Emit a named event */\n emit: (event: string) => void;\n /** Get an event handle with metadata */\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 */\n bindings?: Record<string, string>;\n /** Whether the parent is loading */\n loading?: boolean;\n}\n\n/**\n * Registry of component renderers (Vue component definitions)\n */\nexport type ComponentRegistry = Record<string, Component>;\n\nconst registryMetadata = new WeakMap<\n ComponentRegistry,\n Record<string, { slots?: string[] }>\n>();\n\n/**\n * Props for the Renderer component\n */\nexport interface RendererProps {\n spec: Spec | null;\n registry: ComponentRegistry;\n loading?: boolean;\n fallback?: Component;\n}\n\n// ---------------------------------------------------------------------------\n// FunctionsContext — provides $computed functions to the element tree\n// ---------------------------------------------------------------------------\n\nconst EMPTY_FUNCTIONS: Record<string, ComputedFunction> = {};\nconst FUNCTIONS_KEY = Symbol(\"json-render:functions\");\n\nconst FunctionsProvider = defineComponent({\n name: \"FunctionsProvider\",\n props: {\n functions: {\n type: Object as PropType<Record<string, ComputedFunction>>,\n default: undefined,\n },\n },\n setup(props, { slots }) {\n const fns = computed(() => props.functions ?? EMPTY_FUNCTIONS);\n provide(FUNCTIONS_KEY, fns);\n return () => slots.default?.();\n },\n});\n\nfunction useFunctions(): ComputedRef<Record<string, ComputedFunction>> {\n return inject<ComputedRef<Record<string, ComputedFunction>>>(\n FUNCTIONS_KEY,\n computed(() => EMPTY_FUNCTIONS),\n );\n}\n\n// ---------------------------------------------------------------------------\n// DirectivesContext — provides custom directive registry to the element tree\n// ---------------------------------------------------------------------------\n\nconst DIRECTIVES_KEY = Symbol(\"json-render:directives\");\n\nconst DirectivesProvider = defineComponent({\n name: \"DirectivesProvider\",\n props: {\n directives: {\n type: Array as PropType<DirectiveDefinition[]>,\n default: undefined,\n },\n },\n setup(props, { slots }) {\n const registry = computed(() =>\n props.directives ? createDirectiveRegistry(props.directives) : undefined,\n );\n provide(DIRECTIVES_KEY, registry);\n return () => slots.default?.();\n },\n});\n\nfunction useDirectives(): ComputedRef<DirectiveRegistry | undefined> {\n return inject<ComputedRef<DirectiveRegistry | undefined>>(\n DIRECTIVES_KEY,\n computed(() => undefined),\n );\n}\n\n// ---------------------------------------------------------------------------\n// ElementErrorBoundary — catches rendering errors in individual elements\n// ---------------------------------------------------------------------------\n\nconst ElementErrorBoundary = defineComponent({\n name: \"ElementErrorBoundary\",\n props: {\n elementType: {\n type: String,\n required: true,\n },\n },\n setup(props, { slots }) {\n const hasError = ref(false);\n\n onErrorCaptured((error) => {\n console.error(\n `[json-render] Rendering error in <${props.elementType}>:`,\n error,\n );\n hasError.value = true;\n return false; // prevent propagation\n });\n\n return () => {\n if (hasError.value) return null;\n return slots.default?.();\n };\n },\n});\n\n// ---------------------------------------------------------------------------\n// resolveAndExecuteBindings — shared helper for emitEvent / watch handlers\n// ---------------------------------------------------------------------------\n\nasync function resolveAndExecuteBindings(\n actionBindings: ActionBinding[],\n ctx: PropResolutionContext,\n getSnapshot: () => Record<string, unknown>,\n execute: (binding: ActionBinding) => Promise<void>,\n cancelled?: () => boolean,\n): Promise<void> {\n for (const b of actionBindings) {\n if (cancelled?.()) break;\n if (!b.params) {\n await execute(b);\n if (cancelled?.()) break;\n continue;\n }\n const liveCtx: PropResolutionContext = {\n ...ctx,\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 if (cancelled?.()) break;\n }\n}\n\n// ---------------------------------------------------------------------------\n// ElementRenderer — renders a single element from the spec\n// ---------------------------------------------------------------------------\n\ninterface ElementRendererInternalProps {\n element: UIElement;\n spec: Spec;\n registry: ComponentRegistry;\n loading?: boolean;\n fallback?: Component;\n}\n\n/**\n * Reactive mirror of the devtools-active flag.\n * Used by ElementRenderer to decide whether to add a `data-jr-key` wrapper.\n */\nfunction useDevtoolsActive() {\n const active = ref(isDevtoolsActive());\n const unsub = subscribeDevtoolsActive(() => {\n active.value = isDevtoolsActive();\n });\n onBeforeUnmount(unsub);\n return active;\n}\n\nconst ElementRenderer = defineComponent({\n name: \"JsonRenderElement\",\n props: {\n element: {\n type: Object as PropType<UIElement>,\n required: true,\n },\n elementKey: {\n type: String,\n default: undefined,\n },\n spec: {\n type: Object as PropType<Spec>,\n required: true,\n },\n registry: {\n type: Object as PropType<ComponentRegistry>,\n required: true,\n },\n loading: {\n type: Boolean,\n default: undefined,\n },\n fallback: {\n type: Object as PropType<Component>,\n default: undefined,\n },\n },\n setup(props: ElementRendererInternalProps & { elementKey?: string }) {\n const devtoolsActive = useDevtoolsActive();\n const repeatScope = useRepeatScope();\n const { ctx: visibilityCtx } = useVisibility();\n const { execute } = useActions();\n const { getSnapshot, state: watchState } = useStateStore();\n const functions = useFunctions();\n const directives = useDirectives();\n\n // Build context with repeat scope, $computed functions, and custom directives\n const fullCtx = computed<PropResolutionContext>(() => {\n const base: PropResolutionContext = repeatScope\n ? {\n ...visibilityCtx.value,\n repeatItem: repeatScope.item,\n repeatIndex: repeatScope.index,\n repeatBasePath: repeatScope.basePath,\n }\n : { ...visibilityCtx.value };\n base.functions = functions.value;\n base.directives = directives.value;\n return base;\n });\n\n // Create emit function\n const emitEvent = async (eventName: string): Promise<void> => {\n const binding = props.element.on?.[eventName];\n if (!binding) return;\n const actionBindings = Array.isArray(binding) ? binding : [binding];\n await resolveAndExecuteBindings(\n actionBindings,\n fullCtx.value,\n getSnapshot,\n execute,\n );\n };\n\n // Create on() function\n const onEvent = (eventName: string): EventHandle => {\n const binding = props.element.on?.[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: () => {\n void emitEvent(eventName);\n },\n shouldPreventDefault,\n bound: true,\n };\n };\n\n // Watch effect: fire actions when watched state paths change.\n const watchedValues = computed(() => {\n const cfg = props.element.watch;\n if (!cfg) return undefined;\n const values: Record<string, unknown> = {};\n for (const path of Object.keys(cfg)) {\n values[path] = getByPath(watchState.value, path);\n }\n return values;\n });\n\n watch(\n watchedValues,\n (current, prev, onCleanup) => {\n const cfg = props.element.watch;\n if (!cfg || !current) return;\n\n let cancelled = false;\n onCleanup(() => {\n cancelled = true;\n });\n\n const paths = Object.keys(cfg);\n void (async () => {\n for (const path of paths) {\n if (cancelled) break;\n if (prev && current[path] === prev[path]) continue;\n const binding = cfg[path];\n if (!binding) continue;\n const bindings = Array.isArray(binding) ? binding : [binding];\n await resolveAndExecuteBindings(\n bindings,\n fullCtx.value,\n getSnapshot,\n execute,\n () => cancelled,\n );\n }\n })().catch(console.error);\n },\n { deep: true },\n );\n\n return () => {\n const ctx = fullCtx.value;\n\n // Evaluate visibility\n const isVisible =\n props.element.visible === undefined\n ? true\n : evaluateVisibility(props.element.visible, ctx);\n\n if (!isVisible) return null;\n\n // Resolve bindings and props\n const rawProps = props.element.props as Record<string, unknown>;\n const elementBindings = resolveBindings(rawProps, ctx);\n const resolvedProps = resolveElementProps(rawProps, ctx);\n\n const resolvedElement =\n resolvedProps !== props.element.props\n ? { ...props.element, props: resolvedProps }\n : props.element;\n\n // Get component from registry\n const Component = props.registry[resolvedElement.type] ?? props.fallback;\n\n if (!Component) {\n console.warn(\n `[json-render] No renderer for component type: ${resolvedElement.type}`,\n );\n return null;\n }\n\n const metadata = registryMetadata.get(props.registry)?.[\n resolvedElement.type\n ];\n if (resolvedElement.slots && metadata?.slots) {\n const availableSlots = new Set(metadata.slots);\n for (const slotName of Object.keys(resolvedElement.slots)) {\n if (slotName === \"default\") {\n console.warn(\n `[json-render] Component \"${resolvedElement.type}\" uses slots.default. Use \"children\" for default slot content.`,\n );\n } else if (!availableSlots.has(slotName)) {\n console.warn(\n `[json-render] Unknown slot \"${slotName}\" on component \"${resolvedElement.type}\". Available slots: ${metadata.slots.join(\", \")}`,\n );\n }\n }\n }\n\n const renderChildKeys = (childKeys: string[], slotName?: string) =>\n childKeys\n .map((childKey) => {\n const childElement = props.spec.elements[childKey];\n if (!childElement) {\n if (!props.loading) {\n const location = slotName\n ? `in slot \"${slotName}\" of \"${resolvedElement.type}\"`\n : `as child of \"${resolvedElement.type}\"`;\n console.warn(\n `[json-render] Missing element \"${childKey}\" referenced ${location}. This element will not render.`,\n );\n }\n return null;\n }\n return h(ElementRenderer, {\n key: childKey,\n element: childElement,\n elementKey: childKey,\n spec: props.spec,\n registry: props.registry,\n loading: props.loading,\n fallback: props.fallback,\n });\n })\n .filter((node): node is VNode => node !== null);\n\n // Render children\n const childrenVNodes: VNode | VNode[] | undefined = resolvedElement.repeat\n ? h(RepeatChildren, {\n element: resolvedElement,\n spec: props.spec,\n registry: props.registry,\n loading: props.loading,\n fallback: props.fallback,\n })\n : resolvedElement.children\n ? renderChildKeys(resolvedElement.children)\n : undefined;\n\n const namedSlots = resolvedElement.slots\n ? Object.fromEntries(\n Object.entries(resolvedElement.slots)\n .filter(([slotName]) => slotName !== \"default\")\n .map(([slotName, childKeys]) => [\n slotName,\n () => renderChildKeys(childKeys, slotName),\n ]),\n )\n : {};\n\n const componentVNode = h(\n Component,\n {\n element: resolvedElement,\n emit: emitEvent,\n on: onEvent,\n bindings: elementBindings,\n loading: props.loading,\n },\n { default: () => childrenVNodes, ...namedSlots },\n );\n\n // When devtools is mounted, wrap each element in a transparent span so\n // the picker can map DOM nodes back to spec keys.\n const tagged =\n devtoolsActive.value && props.elementKey\n ? h(\n \"span\",\n { \"data-jr-key\": props.elementKey, style: \"display:contents\" },\n [componentVNode],\n )\n : componentVNode;\n\n return h(\n ElementErrorBoundary,\n { elementType: resolvedElement.type },\n { default: () => tagged },\n );\n };\n },\n});\n\n// ---------------------------------------------------------------------------\n// RepeatChildren — renders child elements once per item in a state array\n// ---------------------------------------------------------------------------\n\nconst RepeatChildren = defineComponent({\n name: \"JsonRenderRepeatChildren\",\n props: {\n element: {\n type: Object as PropType<UIElement>,\n required: true,\n },\n spec: {\n type: Object as PropType<Spec>,\n required: true,\n },\n registry: {\n type: Object as PropType<ComponentRegistry>,\n required: true,\n },\n loading: {\n type: Boolean,\n default: undefined,\n },\n fallback: {\n type: Object as PropType<Component>,\n default: undefined,\n },\n },\n setup(props) {\n const { state } = useStateStore();\n const parentScope = useRepeatScope();\n\n return () => {\n const repeat = props.element.repeat;\n if (!repeat?.statePath) return null;\n const statePath = resolveRepeatStatePath(\n repeat.statePath,\n parentScope?.basePath,\n );\n if (statePath === undefined) {\n console.warn(\n \"[json-render/vue] $item in repeat.statePath used outside of a repeat scope\",\n );\n return null;\n }\n const raw = getByPath(state.value, statePath);\n const items = Array.isArray(raw) ? (raw as unknown[]) : [];\n\n return items.map((itemValue, index) => {\n const key =\n repeat.key && typeof itemValue === \"object\" && itemValue !== null\n ? String(\n (itemValue as Record<string, unknown>)[repeat.key] ?? index,\n )\n : String(index);\n\n return h(\n RepeatScopeProvider,\n {\n key,\n item: itemValue,\n index,\n basePath: resolveRepeatItemStatePath(statePath, index),\n },\n {\n default: () =>\n props.element.children\n ?.map((childKey) => {\n const childElement = props.spec.elements[childKey];\n if (!childElement) {\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 return h(ElementRenderer, {\n key: childKey,\n element: childElement,\n elementKey: childKey,\n spec: props.spec,\n registry: props.registry,\n loading: props.loading,\n fallback: props.fallback,\n });\n })\n .filter((n): n is VNode => n !== null) ?? null,\n },\n );\n });\n };\n },\n});\n\n// ---------------------------------------------------------------------------\n// Renderer — main exported component\n// ---------------------------------------------------------------------------\n\n/**\n * Main renderer component\n */\nexport const Renderer = defineComponent({\n name: \"JsonRenderer\",\n props: {\n spec: {\n type: Object as PropType<Spec | null>,\n default: null,\n },\n registry: {\n type: Object as PropType<ComponentRegistry>,\n required: true,\n },\n loading: {\n type: Boolean,\n default: undefined,\n },\n fallback: {\n type: Object as PropType<Component>,\n default: undefined,\n },\n },\n setup(props) {\n return () => {\n if (!props.spec?.root) return null;\n\n const rootElement = props.spec.elements[props.spec.root];\n if (!rootElement) return null;\n\n return h(ElementRenderer, {\n element: rootElement,\n elementKey: props.spec.root,\n spec: props.spec,\n registry: props.registry,\n loading: props.loading,\n fallback: props.fallback,\n });\n };\n },\n});\n\n// ---------------------------------------------------------------------------\n// ConfirmationDialogManager\n// ---------------------------------------------------------------------------\n\nconst ConfirmationDialogManager = defineComponent({\n name: \"ConfirmationDialogManager\",\n setup() {\n const { pendingConfirmation, confirm, cancel } = useActions();\n\n return () => {\n if (!pendingConfirmation?.action.confirm) return null;\n\n return h(ConfirmDialog, {\n confirm: pendingConfirmation.action.confirm,\n onConfirm: confirm,\n onCancel: cancel,\n });\n };\n },\n});\n\n// ---------------------------------------------------------------------------\n// JSONUIProvider — combined provider for all contexts\n// ---------------------------------------------------------------------------\n\n/**\n * Props for JSONUIProvider\n */\nexport interface JSONUIProviderProps {\n registry: ComponentRegistry;\n store?: StateStore;\n initialState?: Record<string, unknown>;\n handlers?: Record<\n string,\n (params: Record<string, unknown>) => Promise<unknown> | unknown\n >;\n navigate?: (path: string) => void;\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 onStateChange?: (changes: Array<{ path: string; value: unknown }>) => void;\n}\n\n/**\n * Combined provider for all JSONUI contexts\n */\nexport const JSONUIProvider = defineComponent({\n name: \"JSONUIProvider\",\n props: {\n registry: {\n type: Object as PropType<ComponentRegistry>,\n required: true,\n },\n store: {\n type: Object as PropType<StateStore>,\n default: undefined,\n },\n initialState: {\n type: Object as PropType<Record<string, unknown>>,\n default: undefined,\n },\n handlers: {\n type: Object as PropType<\n Record<\n string,\n (params: Record<string, unknown>) => Promise<unknown> | unknown\n >\n >,\n default: undefined,\n },\n navigate: {\n type: Function as PropType<(path: string) => void>,\n default: undefined,\n },\n validationFunctions: {\n type: Object as PropType<\n Record<\n string,\n (value: unknown, args?: Record<string, unknown>) => boolean\n >\n >,\n default: undefined,\n },\n functions: {\n type: Object as PropType<Record<string, ComputedFunction>>,\n default: undefined,\n },\n directives: {\n type: Array as PropType<DirectiveDefinition[]>,\n default: undefined,\n },\n onStateChange: {\n type: Function as PropType<\n (changes: Array<{ path: string; value: unknown }>) => void\n >,\n default: undefined,\n },\n },\n setup(props, { slots }) {\n return () =>\n h(\n StateProvider,\n {\n store: props.store,\n initialState: props.initialState,\n onStateChange: props.onStateChange,\n },\n {\n default: () =>\n h(VisibilityProvider, null, {\n default: () =>\n h(\n ValidationProvider,\n { customFunctions: props.validationFunctions },\n {\n default: () =>\n h(\n ActionProvider,\n { handlers: props.handlers, navigate: props.navigate },\n {\n default: () =>\n h(\n FunctionsProvider,\n { functions: props.functions },\n {\n default: () =>\n h(\n DirectivesProvider,\n { directives: props.directives },\n {\n default: () => [\n slots.default?.(),\n h(ConfirmationDialogManager),\n ],\n },\n ),\n },\n ),\n },\n ),\n },\n ),\n }),\n },\n );\n },\n});\n\n// ============================================================================\n// defineRegistry\n// ============================================================================\n\n/**\n * Result returned by defineRegistry\n */\nexport interface DefineRegistryResult {\n registry: ComponentRegistry;\n handlers: (\n getSetState: () => SetState | undefined,\n getState: () => StateModel,\n ) => Record<string, (params: Record<string, unknown>) => Promise<void>>;\n executeAction: (\n actionName: string,\n params: Record<string, unknown> | undefined,\n setState: SetState,\n state?: StateModel,\n ) => Promise<void>;\n}\n\ntype DefineRegistryOptions<C extends Catalog> = {\n components?: Components<C>;\n} & (CatalogHasActions<C> extends true\n ? { actions: Actions<C> }\n : { actions?: Actions<C> });\n\ntype DefineRegistryComponentFn = (ctx: {\n props: unknown;\n children?: VNode | VNode[];\n slots: Slots;\n emit: (event: string) => void;\n on: (event: string) => EventHandle;\n bindings?: Record<string, string>;\n loading?: boolean;\n}) => VNode | VNode[] | null | string;\n\ntype DefineRegistryActionFn = (\n params: Record<string, unknown> | undefined,\n setState: SetState,\n state: StateModel,\n) => Promise<void>;\n\n/**\n * Create a registry from a catalog with components and/or actions.\n *\n * @example\n * ```ts\n * // Components only\n * const { registry } = defineRegistry(catalog, {\n * components: {\n * Card: ({ props, children }) => h('div', { class: 'card' }, [props.title, children]),\n * },\n * });\n *\n * // Both\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 const registry: ComponentRegistry = {};\n\n if (options.components) {\n for (const [name, componentFn] of Object.entries(options.components)) {\n registry[name] = defineComponent({\n name: `JsonRenderRegistry_${name}`,\n props: {\n element: {\n type: Object as PropType<UIElement>,\n required: true,\n },\n emit: {\n type: Function as PropType<(event: string) => void>,\n required: true,\n },\n on: {\n type: Function as PropType<(event: string) => EventHandle>,\n required: true,\n },\n bindings: {\n type: Object as PropType<Record<string, string>>,\n default: undefined,\n },\n loading: {\n type: Boolean,\n default: undefined,\n },\n },\n setup(registryProps, { slots }) {\n return () =>\n (componentFn as DefineRegistryComponentFn)({\n props: registryProps.element.props,\n children: slots.default?.(),\n slots,\n emit: registryProps.emit,\n on: registryProps.on,\n bindings: registryProps.bindings,\n loading: registryProps.loading,\n });\n },\n });\n }\n }\n const catalogComponents = (\n catalog as {\n data?: { components?: Record<string, { slots?: string[] }> };\n }\n ).data?.components;\n if (catalogComponents) {\n registryMetadata.set(registry, catalogComponents);\n }\n\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// ============================================================================\n// createRenderer\n// ============================================================================\n\n/**\n * Props for renderers created with createRenderer\n */\nexport interface CreateRendererProps {\n spec: Spec | null;\n store?: StateStore;\n state?: Record<string, unknown>;\n onAction?: (actionName: string, params?: Record<string, unknown>) => void;\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 loading?: boolean;\n fallback?: Component;\n}\n\n/**\n * Component map type — maps component names to Vue components\n */\nexport type ComponentMap<\n TComponents extends Record<string, { props: unknown }>,\n> = {\n [K in keyof TComponents]: Component;\n};\n\n/**\n * Create a renderer from a catalog\n *\n * @example\n * ```typescript\n * const DashboardRenderer = createRenderer(dashboardCatalog, {\n * Card: ({ props, children }) => h('div', { class: 'card' }, children),\n * Metric: ({ props }) => h('span', null, props.value),\n * });\n *\n * // Usage in template\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 {\n const registry: ComponentRegistry =\n components as unknown as ComponentRegistry;\n const catalogComponents = (\n catalog.data as { components?: Record<string, { slots?: string[] }> }\n ).components;\n if (catalogComponents) {\n registryMetadata.set(registry, catalogComponents);\n }\n\n return defineComponent({\n name: \"CatalogRenderer\",\n props: {\n spec: {\n type: Object as PropType<Spec | null>,\n default: null,\n },\n store: {\n type: Object as PropType<StateStore>,\n default: undefined,\n },\n state: {\n type: Object as PropType<Record<string, unknown>>,\n default: undefined,\n },\n onAction: {\n type: Function as PropType<\n (actionName: string, params?: Record<string, unknown>) => void\n >,\n default: undefined,\n },\n onStateChange: {\n type: Function as PropType<\n (changes: Array<{ path: string; value: unknown }>) => void\n >,\n default: undefined,\n },\n functions: {\n type: Object as PropType<Record<string, ComputedFunction>>,\n default: undefined,\n },\n directives: {\n type: Array as PropType<DirectiveDefinition[]>,\n default: undefined,\n },\n loading: {\n type: Boolean,\n default: undefined,\n },\n fallback: {\n type: Object as PropType<Component>,\n default: undefined,\n },\n },\n setup(rendererProps) {\n return () => {\n // Build the action handlers proxy if onAction is provided\n const actionHandlers = rendererProps.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 rendererProps.onAction!(prop, params);\n },\n has: () => true,\n },\n )\n : undefined;\n\n return h(\n StateProvider,\n {\n store: rendererProps.store,\n initialState: rendererProps.state,\n onStateChange: rendererProps.onStateChange,\n },\n {\n default: () =>\n h(VisibilityProvider, null, {\n default: () =>\n h(ValidationProvider, null, {\n default: () =>\n h(\n ActionProvider,\n { handlers: actionHandlers },\n {\n default: () =>\n h(\n FunctionsProvider,\n { functions: rendererProps.functions },\n {\n default: () =>\n h(\n DirectivesProvider,\n { directives: rendererProps.directives },\n {\n default: () => [\n h(Renderer, {\n spec: rendererProps.spec,\n registry,\n loading: rendererProps.loading,\n fallback: rendererProps.fallback,\n }),\n h(ConfirmationDialogManager),\n ],\n },\n ),\n },\n ),\n },\n ),\n }),\n }),\n },\n );\n };\n },\n });\n}\n"],"mappings":";;;;;AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OAGK;AACP,SAAS,yBAAyB;AAkBlC,IAAM,YAAY,uBAAO,mBAAmB;AA6BrC,IAAM,gBAAgB,gBAAgB;AAAA,EAC3C,MAAM;AAAA,EACN,OAAO;AAAA,IACL,OAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,cAAc;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,eAAe;AAAA,MACb,MAAM;AAAA,MAGN,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,OAAO,EAAE,MAAM,GAAG;AACtB,UAAM,eAAe,CAAC,CAAC,MAAM;AAG7B,UAAM,gBAAgB,CAAC,eACnB,iBAAiB,MAAM,gBAAgB,CAAC,CAAC,IACzC;AACJ,UAAM,QAAoB,MAAM,SAAS;AAEzC,UAAM,QAAQ,WAAuB,MAAM,YAAY,CAAC;AAExD,UAAM,cAAc,MAAM,UAAU,MAAM;AACxC,YAAM,QAAQ,MAAM,YAAY;AAAA,IAClC,CAAC;AACD,gBAAY,WAAW;AAGvB,QAAI,CAAC,cAAc;AACjB,UAAI,WACF,MAAM,gBAAgB,OAAO,KAAK,MAAM,YAAY,EAAE,SAAS,IAC3D,kBAAkB,MAAM,YAAY,IACpC,CAAC;AAEP;AAAA,QACE,MAAM,MAAM;AAAA,QACZ,CAAC,oBAAoB;AACnB,cAAI,CAAC,gBAAiB;AACtB,gBAAM,WACJ,OAAO,KAAK,eAAe,EAAE,SAAS,IAClC,kBAAkB,eAAe,IACjC,CAAC;AACP,gBAAM,UAAU,oBAAI,IAAI;AAAA,YACtB,GAAG,OAAO,KAAK,QAAQ;AAAA,YACvB,GAAG,OAAO,KAAK,QAAQ;AAAA,UACzB,CAAC;AACD,gBAAM,UAAmC,CAAC;AAC1C,qBAAW,OAAO,SAAS;AACzB,gBAAI,SAAS,GAAG,MAAM,SAAS,GAAG,GAAG;AACnC,sBAAQ,GAAG,IAAI,OAAO,WAAW,SAAS,GAAG,IAAI;AAAA,YACnD;AAAA,UACF;AACA,qBAAW;AACX,cAAI,OAAO,KAAK,OAAO,EAAE,SAAS,GAAG;AACnC,kBAAM,OAAO,OAAO;AAAA,UACtB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,mBAAmB,IAAI,MAAM,aAAa;AAChD;AAAA,MACE,MAAM,MAAM;AAAA,MACZ,CAAC,OAAO;AACN,yBAAiB,QAAQ;AAAA,MAC3B;AAAA,IACF;AAEA,UAAM,MAAM,CAAC,SAAiB,MAAM,IAAI,IAAI;AAC5C,UAAM,cAAc,MAAM,MAAM,YAAY;AAE5C,UAAM,MAAM,CAAC,MAAc,UAAmB;AAC5C,YAAM,OAAO,MAAM,YAAY;AAC/B,YAAM,IAAI,MAAM,KAAK;AACrB,UAAI,CAAC,gBAAgB,MAAM,YAAY,MAAM,MAAM;AACjD,yBAAiB,QAAQ,CAAC,EAAE,MAAM,MAAM,CAAC,CAAC;AAAA,MAC5C;AAAA,IACF;AAEA,UAAM,SAAS,CAAC,YAAqC;AACnD,YAAM,OAAO,MAAM,YAAY;AAC/B,YAAM,OAAO,OAAO;AACpB,UAAI,CAAC,gBAAgB,MAAM,YAAY,MAAM,MAAM;AACjD,cAAM,UAAmD,CAAC;AAC1D,mBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AACnD,cAAI,UAAU,MAAM,IAAI,MAAM,OAAO;AACnC,oBAAQ,KAAK,EAAE,MAAM,MAAM,CAAC;AAAA,UAC9B;AAAA,QACF;AACA,YAAI,QAAQ,SAAS,GAAG;AACtB,2BAAiB,QAAQ,OAAO;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAEA,YAA2B,WAAW;AAAA,MACpC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,WAAO,MAAM,MAAM,UAAU;AAAA,EAC/B;AACF,CAAC;AAKM,SAAS,gBAAmC;AACjD,QAAM,MAAM,OAA0B,SAAS;AAC/C,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AACA,SAAO;AACT;AAKO,SAAS,cAAiB,MAA0C;AACzE,QAAM,EAAE,MAAM,IAAI,cAAc;AAChC,SAAO,SAAS,MAAM,UAAU,MAAM,OAAO,IAAI,CAAkB;AACrE;AAUO,SAAS,gBACd,MACkD;AAClD,QAAM,EAAE,OAAO,IAAI,IAAI,cAAc;AACrC,QAAM,QAAQ,SAAS,MAAM,UAAU,MAAM,OAAO,IAAI,CAAkB;AAC1E,QAAM,WAAW,CAAC,aAAgB,IAAI,MAAM,QAAQ;AACpD,SAAO,CAAC,OAAO,QAAQ;AACzB;;;ACvNA;AAAA,EACE,YAAAA;AAAA,EACA,mBAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,OAEK;AACP;AAAA,EACE;AAAA,OAGK;AAaP,IAAM,iBAAiB,uBAAO,wBAAwB;AAK/C,IAAM,qBAAqBC,iBAAgB;AAAA,EAChD,MAAM;AAAA,EACN,MAAM,GAAG,EAAE,MAAM,GAAG;AAClB,UAAM,EAAE,MAAM,IAAI,cAAc;AAEhC,UAAM,MAAMC,UAAgC,OAAO;AAAA,MACjD,YAAY,MAAM;AAAA,IACpB,EAAE;AAEF,UAAM,YAAY,CAAC,cACjB,mBAAmB,WAAW,IAAI,KAAK;AAEzC,IAAAC,SAAgC,gBAAgB,EAAE,WAAW,IAAI,CAAC;AAElE,WAAO,MAAM,MAAM,UAAU;AAAA,EAC/B;AACF,CAAC;AAKM,SAAS,gBAAwC;AACtD,QAAM,MAAMC,QAA+B,cAAc;AACzD,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AACA,SAAO;AACT;AAMO,SAAS,aACd,WACsB;AACtB,QAAM,EAAE,IAAI,IAAI,cAAc;AAC9B,SAAOF,UAAS,MAAM,mBAAmB,WAAW,IAAI,KAAK,CAAC;AAChE;;;ACnEA;AAAA,EACE,YAAAG;AAAA,EACA,mBAAAC;AAAA,EACA;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,SAAAC;AAAA,OAGK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAKK;;;ACrBP;AAAA,EACE,YAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,UAAAC;AAAA,EACA;AAAA,EACA,eAAAC;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC;AAAA,OAGK;AACP;AAAA,EACE;AAAA,OAIK;AAyBP,IAAM,iBAAiB,uBAAO,wBAAwB;AAStD,SAAS,iBACP,GACA,GACS;AACT,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,CAAC,KAAK,CAAC,EAAG,QAAO;AACrB,QAAM,QAAQ,OAAO,KAAK,CAAC;AAC3B,QAAM,QAAQ,OAAO,KAAK,CAAC;AAC3B,MAAI,MAAM,WAAW,MAAM,OAAQ,QAAO;AAC1C,aAAW,OAAO,OAAO;AACvB,UAAM,KAAK,EAAE,GAAG;AAChB,UAAM,KAAK,EAAE,GAAG;AAChB,QAAI,OAAO,GAAI;AACf,QACE,OAAO,OAAO,YACd,OAAO,QACP,OAAO,OAAO,YACd,OAAO,MACP;AACA,YAAM,KAAM,GAA+B;AAC3C,YAAM,KAAM,GAA+B;AAC3C,UAAI,OAAO,OAAO,YAAY,OAAO,GAAI;AAAA,IAC3C;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAKA,SAAS,sBACP,GACA,GACS;AACT,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,EAAE,eAAe,EAAE,WAAY,QAAO;AAC1C,QAAM,KAAK,EAAE,UAAU,CAAC;AACxB,QAAM,KAAK,EAAE,UAAU,CAAC;AACxB,MAAI,GAAG,WAAW,GAAG,OAAQ,QAAO;AACpC,WAAS,IAAI,GAAG,IAAI,GAAG,QAAQ,KAAK;AAClC,UAAM,KAAK,GAAG,CAAC;AACf,UAAM,KAAK,GAAG,CAAC;AACf,QAAI,GAAG,SAAS,GAAG,KAAM,QAAO;AAChC,QAAI,GAAG,YAAY,GAAG,QAAS,QAAO;AACtC,QAAI,CAAC,iBAAiB,GAAG,MAAM,GAAG,IAAI,EAAG,QAAO;AAAA,EAClD;AACA,SAAO;AACT;AAKO,IAAM,qBAAqBC,iBAAgB;AAAA,EAChD,MAAM;AAAA,EACN,OAAO;AAAA,IACL,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,SAAS,OAAO,CAAC;AAAA,IACnB;AAAA,EACF;AAAA,EACA,MAAM,OAAO,EAAE,MAAM,GAAG;AACtB,UAAM,EAAE,MAAM,IAAI,cAAc;AAEhC,UAAM,cAAcC,KAA0C,CAAC,CAAC;AAChE,UAAM,eAAeA,KAAsC,CAAC,CAAC;AAE7D,UAAM,gBAAgB,CAAC,MAAc,WAA6B;AAChE,YAAM,WAAW,aAAa,MAAM,IAAI;AACxC,UAAI,YAAY,sBAAsB,UAAU,MAAM,EAAG;AACzD,mBAAa,QAAQ,EAAE,GAAG,aAAa,OAAO,CAAC,IAAI,GAAG,OAAO;AAAA,IAC/D;AAEA,UAAM,WAAW,CACf,MACA,WACqB;AACrB,YAAM,eAAe,MAAM;AAC3B,YAAM,WAAW,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAC/C,UAAI,QAAiB;AACrB,iBAAW,OAAO,UAAU;AAC1B,YAAI,SAAS,QAAQ,OAAO,UAAU,UAAU;AAC9C,kBAAS,MAAkC,GAAG;AAAA,QAChD,OAAO;AACL,kBAAQ;AACR;AAAA,QACF;AAAA,MACF;AACA,YAAM,SAAS,cAAc,QAAQ;AAAA,QACnC;AAAA,QACA,YAAY;AAAA,QACZ,iBAAiB,MAAM;AAAA,MACzB,CAAC;AAED,kBAAY,QAAQ;AAAA,QAClB,GAAG,YAAY;AAAA,QACf,CAAC,IAAI,GAAG;AAAA,UACN,SAAS,YAAY,MAAM,IAAI,GAAG,WAAW;AAAA,UAC7C,WAAW;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ,CAAC,SAAiB;AAC9B,kBAAY,QAAQ;AAAA,QAClB,GAAG,YAAY;AAAA,QACf,CAAC,IAAI,GAAG;AAAA,UACN,GAAG,YAAY,MAAM,IAAI;AAAA,UACzB,SAAS;AAAA,UACT,WAAW,YAAY,MAAM,IAAI,GAAG,aAAa;AAAA,UACjD,QAAQ,YAAY,MAAM,IAAI,GAAG,UAAU;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QAAQ,CAAC,SAAiB;AAC9B,YAAM,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,KAAK,IAAI,YAAY;AAC3C,kBAAY,QAAQ;AAAA,IACtB;AAEA,UAAM,cAAc,MAAe;AACjC,UAAI,WAAW;AACf,iBAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,aAAa,KAAK,GAAG;AAC/D,cAAM,SAAS,SAAS,MAAM,MAAM;AACpC,YAAI,CAAC,OAAO,OAAO;AACjB,qBAAW;AAAA,QACb;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,IAAAC,SAAgC,gBAAgB;AAAA,MAC9C,IAAI,kBAAkB;AACpB,eAAO,MAAM;AAAA,MACf;AAAA,MACA,IAAI,cAAc;AAChB,eAAO,YAAY;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,WAAO,MAAM,MAAM,UAAU;AAAA,EAC/B;AACF,CAAC;AAMM,SAAS,wBAAuD;AACrE,SACEC;AAAA,IACE;AAAA,IACA;AAAA,EACF,KAAK;AAET;AAKO,SAAS,gBAAwC;AACtD,QAAM,MAAMA,QAA+B,cAAc;AACzD,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AACA,SAAO;AACT;AAKO,SAAS,mBACd,MACA,QAQA;AACA,QAAM,MAAM,cAAc;AAE1B,YAAU,MAAM;AACd,QAAI,QAAQ,QAAQ;AAClB,UAAI,cAAc,MAAM,MAAM;AAAA,IAChC;AAAA,EACF,CAAC;AAED,EAAAC,aAAY,MAAM;AAChB,QAAI,MAAM,IAAI;AAAA,EAChB,CAAC;AAED,QAAM,eAAqC;AAAA,IACzC,SAAS;AAAA,IACT,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AAEA,SAAO;AAAA,IACL,OAAOC,UAAS,MAAM,IAAI,YAAY,IAAI,KAAK,YAAY;AAAA,IAC3D,UAAU,MAAM,IAAI,SAAS,MAAM,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC;AAAA,IAC3D,OAAO,MAAM,IAAI,MAAM,IAAI;AAAA,IAC3B,OAAO,MAAM,IAAI,MAAM,IAAI;AAAA,IAC3B,QAAQA,UAAS,MAAM,IAAI,YAAY,IAAI,GAAG,QAAQ,UAAU,CAAC,CAAC;AAAA,IAClE,SAASA,UAAS,MAAM,IAAI,YAAY,IAAI,GAAG,QAAQ,SAAS,IAAI;AAAA,EACtE;AACF;;;AD9OA,IAAI,YAAY;AAChB,SAAS,mBAA2B;AAClC,eAAa;AACb,SAAO,GAAG,KAAK,IAAI,CAAC,IAAI,SAAS;AACnC;AASA,SAAS,iBACP,OACA,KACS;AACT,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAElD,MAAI,UAAU,OAAO;AACnB,WAAO,iBAAiB;AAAA,EAC1B;AAEA,MAAI,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AACtD,UAAM,MAAM;AACZ,UAAM,OAAO,OAAO,KAAK,GAAG;AAE5B,QAAI,KAAK,WAAW,KAAK,OAAO,IAAI,WAAW,UAAU;AACvD,aAAO,IAAI,IAAI,MAAgB;AAAA,IACjC;AAEA,QAAI,KAAK,WAAW,KAAK,SAAS,KAAK;AACrC,aAAO,iBAAiB;AAAA,IAC1B;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,SAAS,iBAAiB,MAAM,GAAG,CAAC;AAAA,EACxD;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,WAAoC,CAAC;AAC3C,eAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,KAAgC,GAAG;AACzE,eAAS,GAAG,IAAI,iBAAiB,KAAK,GAAG;AAAA,IAC3C;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAyBA,IAAM,cAAc,uBAAO,qBAAqB;AAUzC,IAAM,iBAAiBC,iBAAgB;AAAA,EAC5C,MAAM;AAAA,EACN,OAAO;AAAA,IACL,UAAU;AAAA,MACR,MAAM;AAAA,MACN,SAAS,OAAO,CAAC;AAAA,IACnB;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,OAAO,EAAE,MAAM,GAAG;AACtB,UAAM,EAAE,KAAK,KAAK,YAAY,IAAI,cAAc;AAChD,UAAM,aAAa,sBAAsB;AAEzC,UAAM,WAAWC,KAAmC,MAAM,YAAY,CAAC,CAAC;AACxE,UAAM,iBAAiBA,KAAiB,oBAAI,IAAI,CAAC;AACjD,UAAM,sBAAsBA,KAAgC,IAAI;AAGhE,IAAAC;AAAA,MACE,MAAM,MAAM;AAAA,MACZ,CAAC,gBAAgB;AACf,YAAI,YAAa,UAAS,QAAQ;AAAA,MACpC;AAAA,IACF;AAEA,UAAM,kBAAkB,CAAC,MAAc,YAA2B;AAChE,eAAS,QAAQ,EAAE,GAAG,SAAS,OAAO,CAAC,IAAI,GAAG,QAAQ;AAAA,IACxD;AAEA,UAAM,UAAU,OAAO,YAA0C;AAC/D,YAAM,WAAW,cAAc,SAAS,YAAY,CAAC;AAGrD,YAAM,aAAa,qBAAqB;AACxC,YAAM,eAAe,KAAK,IAAI;AAC9B,2BAAqB;AAAA,QACnB,IAAI;AAAA,QACJ,MAAM,SAAS;AAAA,QACf,QAAQ,SAAS;AAAA,QACjB,IAAI;AAAA,MACN,CAAC;AACD,UAAI,OAAO;AACX,UAAI,UAAmB;AAEvB,UAAI;AAEF,YAAI,SAAS,WAAW,cAAc,SAAS,QAAQ;AACrD,gBAAM,YAAY,SAAS,OAAO;AAClC,gBAAM,QAAQ,SAAS,OAAO;AAC9B,cAAI,WAAW;AACb,gBAAI,WAAW,KAAK;AAAA,UACtB;AACA;AAAA,QACF;AAGA,YAAI,SAAS,WAAW,eAAe,SAAS,QAAQ;AACtD,gBAAM,YAAY,SAAS,OAAO;AAClC,gBAAM,WAAW,SAAS,OAAO;AACjC,cAAI,WAAW;AACb,kBAAM,gBAAgB,iBAAiB,UAAU,GAAG;AACpD,kBAAM,MAAO,IAAI,SAAS,KAA+B,CAAC;AAC1D,gBAAI,WAAW,CAAC,GAAG,KAAK,aAAa,CAAC;AACtC,kBAAM,iBAAiB,SAAS,OAAO;AAGvC,gBAAI,gBAAgB;AAClB,kBAAI,gBAAgB,EAAE;AAAA,YACxB;AAAA,UACF;AACA;AAAA,QACF;AAGA,YAAI,SAAS,WAAW,iBAAiB,SAAS,QAAQ;AACxD,gBAAM,YAAY,SAAS,OAAO;AAClC,gBAAM,QAAQ,SAAS,OAAO;AAC9B,cAAI,cAAc,UAAa,UAAU,QAAW;AAClD,kBAAM,MAAO,IAAI,SAAS,KAA+B,CAAC;AAC1D;AAAA,cACE;AAAA,cACA,IAAI,OAAO,CAAC,GAAG,MAAM,MAAM,KAAK;AAAA,YAClC;AAAA,UACF;AACA;AAAA,QACF;AAGA,YAAI,SAAS,WAAW,gBAAgB;AACtC,gBAAM,cAAc,YAAY;AAChC,cAAI,CAAC,aAAa;AAChB,oBAAQ;AAAA,cACN;AAAA,YAEF;AACA;AAAA,UACF;AACA,gBAAM,QAAQ,YAAY;AAC1B,gBAAM,SAAmC,CAAC;AAC1C,qBAAW,CAAC,MAAM,EAAE,KAAK,OAAO,QAAQ,WAAW,WAAW,GAAG;AAC/D,gBAAI,GAAG,UAAU,CAAC,GAAG,OAAO,OAAO;AACjC,qBAAO,IAAI,IAAI,GAAG,OAAO;AAAA,YAC3B;AAAA,UACF;AACA,gBAAM,YACH,SAAS,QAAQ,aAAwB;AAC5C,cAAI,WAAW,EAAE,OAAO,OAAO,CAAC;AAChC;AAAA,QACF;AAGA,YAAI,SAAS,WAAW,UAAU,SAAS,QAAQ;AACjD,gBAAM,SAAS,SAAS,OAAO;AAC/B,cAAI,QAAQ;AACV,kBAAM,gBAAgB,IAAI,gBAAgB;AAC1C,kBAAM,WAAY,IAAI,WAAW,KAA8B,CAAC;AAChE,gBAAI,eAAe;AACjB,kBAAI,aAAa,CAAC,GAAG,UAAU,aAAa,CAAC;AAAA,YAC/C,OAAO;AACL,kBAAI,aAAa,CAAC,GAAG,UAAU,EAAE,CAAC;AAAA,YACpC;AACA,gBAAI,kBAAkB,MAAM;AAAA,UAC9B;AACA;AAAA,QACF;AAGA,YAAI,SAAS,WAAW,OAAO;AAC7B,gBAAM,WAAY,IAAI,WAAW,KAA8B,CAAC;AAChE,cAAI,SAAS,SAAS,GAAG;AACvB,kBAAM,iBAAiB,SAAS,SAAS,SAAS,CAAC;AACnD,gBAAI,aAAa,SAAS,MAAM,GAAG,EAAE,CAAC;AACtC,gBAAI,gBAAgB;AAClB,kBAAI,kBAAkB,cAAc;AAAA,YACtC,OAAO;AACL,kBAAI,kBAAkB,MAAS;AAAA,YACjC;AAAA,UACF;AACA;AAAA,QACF;AAEA,cAAM,UAAU,SAAS,MAAM,SAAS,MAAM;AAE9C,YAAI,CAAC,SAAS;AACZ,kBAAQ,KAAK,qCAAqC,SAAS,MAAM,EAAE;AACnE;AAAA,QACF;AAGA,YAAI,SAAS,SAAS;AACpB,gBAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,gCAAoB,QAAQ;AAAA,cAC1B,QAAQ;AAAA,cACR;AAAA,cACA,SAAS,MAAM;AACb,oCAAoB,QAAQ;AAC5B,wBAAQ;AAAA,cACV;AAAA,cACA,QAAQ,MAAM;AACZ,oCAAoB,QAAQ;AAC5B,uBAAO,IAAI,MAAM,kBAAkB,CAAC;AAAA,cACtC;AAAA,YACF;AAAA,UACF,CAAC;AAED,gBAAMC,cAAa,IAAI,IAAI,eAAe,KAAK;AAC/C,UAAAA,YAAW,IAAI,SAAS,MAAM;AAC9B,yBAAe,QAAQA;AACvB,cAAI;AACF,kBAAM,cAAc;AAAA,cAClB,QAAQ;AAAA,cACR;AAAA,cACA,UAAU;AAAA,cACV,UAAU,MAAM;AAAA,cAChB,eAAe,OAAOC,aAAY;AAChC,sBAAM,QAAQA,QAAO;AAAA,cACvB;AAAA,YACF,CAAC;AAAA,UACH,UAAE;AACA,kBAAM,gBAAgB,IAAI,IAAI,eAAe,KAAK;AAClD,0BAAc,OAAO,SAAS,MAAM;AACpC,2BAAe,QAAQ;AAAA,UACzB;AACA;AAAA,QACF;AAGA,cAAM,aAAa,IAAI,IAAI,eAAe,KAAK;AAC/C,mBAAW,IAAI,SAAS,MAAM;AAC9B,uBAAe,QAAQ;AACvB,YAAI;AACF,gBAAM,cAAc;AAAA,YAClB,QAAQ;AAAA,YACR;AAAA,YACA,UAAU;AAAA,YACV,UAAU,MAAM;AAAA,YAChB,eAAe,OAAOA,aAAY;AAChC,oBAAM,QAAQA,QAAO;AAAA,YACvB;AAAA,UACF,CAAC;AAAA,QACH,UAAE;AACA,gBAAM,gBAAgB,IAAI,IAAI,eAAe,KAAK;AAClD,wBAAc,OAAO,SAAS,MAAM;AACpC,yBAAe,QAAQ;AAAA,QACzB;AAAA,MACF,SAAS,KAAK;AACZ,eAAO;AACP,kBAAU;AACV,cAAM;AAAA,MACR,UAAE;AACA,cAAM,MAAM,KAAK,IAAI;AACrB,2BAAmB;AAAA,UACjB,IAAI;AAAA,UACJ,MAAM,SAAS;AAAA,UACf,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,YAAY,MAAM;AAAA,UAClB,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,UAAU,MAAM,oBAAoB,OAAO,QAAQ;AACzD,UAAM,SAAS,MAAM,oBAAoB,OAAO,OAAO;AAEvD,IAAAC,SAA4B,aAAa;AAAA,MACvC,IAAI,WAAW;AACb,eAAO,SAAS;AAAA,MAClB;AAAA,MACA,IAAI,iBAAiB;AACnB,eAAO,eAAe;AAAA,MACxB;AAAA,MACA,IAAI,sBAAsB;AACxB,eAAO,oBAAoB;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,WAAO,MAAM,MAAM,UAAU;AAAA,EAC/B;AACF,CAAC;AAKM,SAAS,aAAiC;AAC/C,QAAM,MAAMC,QAA2B,WAAW;AAClD,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AACA,SAAO;AACT;AAKO,SAAS,UAAU,SAGxB;AACA,QAAM,MAAM,WAAW;AACvB,SAAO;AAAA,IACL,SAAS,MAAM,IAAI,QAAQ,OAAO;AAAA,IAClC,WAAWC,UAAS,MAAM,IAAI,eAAe,IAAI,QAAQ,MAAM,CAAC;AAAA,EAClE;AACF;AAkBO,IAAM,gBAAgBP,iBAAgB;AAAA,EAC3C,MAAM;AAAA,EACN,OAAO;AAAA,IACL,SAAS;AAAA,MACP,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,IACA,WAAW;AAAA,MACT,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,MAAM,OAAO;AACX,WAAO,MAAM;AACX,YAAM,WAAW,MAAM,QAAQ,YAAY;AAE3C,aAAO;AAAA,QACL;AAAA,QACA;AAAA,UACE,OAAO;AAAA,YACL,UAAU;AAAA,YACV,OAAO;AAAA,YACP,iBAAiB;AAAA,YACjB,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,gBAAgB;AAAA,YAChB,QAAQ;AAAA,UACV;AAAA,UACA,SAAS,MAAM;AAAA,QACjB;AAAA,QACA;AAAA,UACE;AAAA,YACE;AAAA,YACA;AAAA,cACE,OAAO;AAAA,gBACL,iBAAiB;AAAA,gBACjB,cAAc;AAAA,gBACd,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,OAAO;AAAA,gBACP,WAAW;AAAA,cACb;AAAA,cACA,SAAS,CAAC,MAAkB,EAAE,gBAAgB;AAAA,YAChD;AAAA,YACA;AAAA,cACE;AAAA,gBACE;AAAA,gBACA;AAAA,kBACE,OAAO;AAAA,oBACL,QAAQ;AAAA,oBACR,UAAU;AAAA,oBACV,YAAY;AAAA,kBACd;AAAA,gBACF;AAAA,gBACA,MAAM,QAAQ;AAAA,cAChB;AAAA,cACA;AAAA,gBACE;AAAA,gBACA;AAAA,kBACE,OAAO,EAAE,QAAQ,cAAc,OAAO,UAAU;AAAA,gBAClD;AAAA,gBACA,MAAM,QAAQ;AAAA,cAChB;AAAA,cACA;AAAA,gBACE;AAAA,gBACA;AAAA,kBACE,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,KAAK;AAAA,oBACL,gBAAgB;AAAA,kBAClB;AAAA,gBACF;AAAA,gBACA;AAAA,kBACE;AAAA,oBACE;AAAA,oBACA;AAAA,sBACE,OAAO;AAAA,wBACL,SAAS;AAAA,wBACT,cAAc;AAAA,wBACd,QAAQ;AAAA,wBACR,iBAAiB;AAAA,wBACjB,QAAQ;AAAA,sBACV;AAAA,sBACA,SAAS,MAAM;AAAA,oBACjB;AAAA,oBACA,MAAM,QAAQ,eAAe;AAAA,kBAC/B;AAAA,kBACA;AAAA,oBACE;AAAA,oBACA;AAAA,sBACE,OAAO;AAAA,wBACL,SAAS;AAAA,wBACT,cAAc;AAAA,wBACd,QAAQ;AAAA,wBACR,iBAAiB,WAAW,YAAY;AAAA,wBACxC,OAAO;AAAA,wBACP,QAAQ;AAAA,sBACV;AAAA,sBACA,SAAS,MAAM;AAAA,oBACjB;AAAA,oBACA,MAAM,QAAQ,gBAAgB;AAAA,kBAChC;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;AEngBD,SAAS,mBAAAQ,kBAAiB,UAAAC,SAAQ,WAAAC,gBAA8B;AAchE,IAAM,mBAAmB,uBAAO,0BAA0B;AAKnD,IAAM,sBAAsBF,iBAAgB;AAAA,EACjD,MAAM;AAAA,EACN,OAAO;AAAA,IACL,MAAM;AAAA,MACJ,UAAU;AAAA,IACZ;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,MAAM,OAAO,EAAE,MAAM,GAAG;AACtB,IAAAE,SAAQ,kBAAkB,KAAyB;AACnD,WAAO,MAAM,MAAM,UAAU;AAAA,EAC/B;AACF,CAAC;AAKM,SAAS,iBAA0C;AACxD,SACED;AAAA,IACE;AAAA,IACA;AAAA,EACF,KAAK;AAET;;;ACDA,SAAS,oBAAAE,yBAAwB;;;ACjDjC;AAAA,EACE,OAAAC;AAAA,EACA,cAAAC;AAAA,EACA,YAAAC;AAAA,EACA,eAAAC;AAAA,EACA;AAAA,OAGK;AASP;AAAA,EACE;AAAA,EACA,aAAAC;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;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,cAAU,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,iBAAa,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,WAAOA,WAAU,KAAK,OAAkC,SAAS;AAAA,EACnE;AACA,SAAOA,WAAU,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;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AACF,GAA0C;AACxC,QAAM,OAAOC,YAAwB,IAAI;AACzC,QAAM,cAAcC,KAAI,KAAK;AAC7B,QAAM,QAAQA,KAAkB,IAAI;AACpC,QAAM,QAAQA,KAAuB,IAAI;AACzC,QAAM,WAAWA,KAAc,CAAC,CAAC;AAEjC,QAAM,gBAAgBA,KAAI,UAAU;AACpC,QAAM,aAAaA,KAAI,OAAO;AAE9B,MAAI,kBAA0C;AAE9C,QAAM,QAAQ,MAAM;AAClB,SAAK,QAAQ;AACb,UAAM,QAAQ;AACd,UAAM,QAAQ;AACd,aAAS,QAAQ,CAAC;AAAA,EACpB;AAEA,QAAM,OAAO,OACX,QACA,YACkB;AAElB,qBAAiB,MAAM;AACvB,sBAAkB,IAAI,gBAAgB;AAEtC,gBAAY,QAAQ;AACpB,UAAM,QAAQ;AACd,UAAM,QAAQ;AACd,aAAS,QAAQ,CAAC;AAGlB,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,SAAK,QAAQ;AAEb,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QAChC,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,kBAAM,QAAQ,OAAO;AAAA,UACvB,OAAO;AACL,qBAAS,QAAQ,CAAC,GAAG,SAAS,OAAO,OAAO;AAC5C,0BAAc,WAAW,aAAa,OAAO,KAAK;AAClD,iBAAK,QAAQ,EAAE,GAAG,YAAY;AAAA,UAChC;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,kBAAM,QAAQ,OAAO;AAAA,UACvB,OAAO;AACL,qBAAS,QAAQ,CAAC,GAAG,SAAS,OAAO,OAAO;AAC5C,0BAAc,WAAW,aAAa,OAAO,KAAK;AAClD,iBAAK,QAAQ,EAAE,GAAG,YAAY;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AAEA,oBAAc,QAAQ,WAAW;AAAA,IACnC,SAAS,KAAK;AACZ,UAAK,IAAc,SAAS,cAAc;AACxC;AAAA,MACF;AACA,YAAM,gBAAgB,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AACxE,YAAM,QAAQ;AACd,iBAAW,QAAQ,aAAa;AAAA,IAClC,UAAE;AACA,kBAAY,QAAQ;AAAA,IACtB;AAAA,EACF;AAGA,EAAAC,aAAY,MAAM;AAChB,qBAAiB,MAAM;AAAA,EACzB,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;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;AAyBO,SAAS,aACd,WACA,aACqC;AACrC,QAAM,EAAE,IAAI,IAAI,cAAc;AAC9B,SAAO;AAAA,IACL;AAAA,IACA,CAAC,UAAa;AACZ,UAAI,YAAa,KAAI,aAAa,KAAK;AAAA,IACzC;AAAA,EACF;AACF;AAuBA,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;AAUO,SAAS,mBAAmB,OAAgC;AACjE,QAAM,OAAa,EAAE,MAAM,IAAI,UAAU,CAAC,EAAE;AAC5C,MAAI,UAAU;AAEd,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,SAAS,qBAAqB;AACrC,UAAI,CAAC,eAAe,KAAK,IAAI,EAAG;AAChC,YAAM,UAAU,KAAK;AACrB,UAAI,QAAQ,SAAS,SAAS;AAC5B,kBAAU;AACV,uBAAe,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,OAAO,aAAa,QAAQ,IAAI;AACtC,eAAO,OAAO,MAAM,IAAI;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAEA,SAAO,UAAU,OAAO;AAC1B;AASO,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;AAoBO,SAAS,qBAAqB,OAInC;AACA,QAAM,WAAW,MAAM,KAAK,IAAI,QAAQD,KAAI,KAAK;AACjD,QAAM,OAAOE,UAAS,MAAM,mBAAmB,SAAS,KAAK,CAAC;AAC9D,QAAM,OAAOA,UAAS,MAAM,iBAAiB,SAAS,KAAK,CAAC;AAC5D,QAAM,UAAUA;AAAA,IACd,MACE,KAAK,UAAU,QAAQ,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC,CAAC,EAAE,SAAS;AAAA,EAC3E;AACA,SAAO,EAAE,MAAM,MAAM,QAAQ;AAC/B;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;AAiBO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AACF,GAAsC;AACpC,QAAM,WAAWF,KAAmB,CAAC,CAAC;AACtC,QAAM,cAAcA,KAAI,KAAK;AAC7B,QAAM,QAAQA,KAAkB,IAAI;AAEpC,QAAM,gBAAgBA,KAAI,UAAU;AACpC,QAAM,aAAaA,KAAI,OAAO;AAE9B,MAAI,kBAA0C;AAE9C,QAAM,QAAQ,MAAM;AAClB,aAAS,QAAQ,CAAC;AAClB,UAAM,QAAQ;AAAA,EAChB;AAEA,QAAM,OAAO,OAAO,SAAgC;AAClD,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,aAAS,QAAQ,CAAC,GAAG,SAAS,OAAO,aAAa,gBAAgB;AAClE,gBAAY,QAAQ;AACpB,UAAM,QAAQ;AAId,UAAM,gBAAgB;AAAA,MACpB,GAAG,SAAS,MACT,OAAO,CAAC,MAAM,EAAE,OAAO,WAAW,EAClC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,EAAE,KAAK,EAAE;AAAA,MACjD,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,KAAK;AAAA,QAChC,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,SAAS,wBAAwB;AAAA,QACrC,QAAQ,OAAO;AACb,oBAAU;AACV,yBAAe,aAAa,KAAK;AACjC,mBAAS,QAAQ,SAAS,MAAM;AAAA,YAAI,CAAC,MACnC,EAAE,OAAO,cACL;AAAA,cACE,GAAG;AAAA,cACH,MAAM;AAAA,gBACJ,MAAM,YAAY;AAAA,gBAClB,UAAU,EAAE,GAAG,YAAY,SAAS;AAAA,gBACpC,GAAI,YAAY,QACZ,EAAE,OAAO,EAAE,GAAG,YAAY,MAAM,EAAE,IAClC,CAAC;AAAA,cACP;AAAA,YACF,IACA;AAAA,UACN;AAAA,QACF;AAAA,QACA,OAAO,MAAM;AACX,8BAAoB,kBAAkB,OAAO,MAAM;AACnD,mBAAS,QAAQ,SAAS,MAAM;AAAA,YAAI,CAAC,MACnC,EAAE,OAAO,cAAc,EAAE,GAAG,GAAG,MAAM,gBAAgB,IAAI;AAAA,UAC3D;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,oBAAc,QAAQ,YAAY;AAAA,IACpC,SAAS,KAAK;AACZ,UAAK,IAAc,SAAS,cAAc;AACxC;AAAA,MACF;AACA,YAAM,gBAAgB,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AACxE,YAAM,QAAQ;AAEd,eAAS,QAAQ,SAAS,MAAM;AAAA,QAC9B,CAAC,MAAM,EAAE,OAAO,eAAe,EAAE,KAAK,SAAS;AAAA,MACjD;AACA,iBAAW,QAAQ,aAAa;AAAA,IAClC,UAAE;AACA,kBAAY,QAAQ;AAAA,IACtB;AAAA,EACF;AAGA,EAAAC,aAAY,MAAM;AAChB,qBAAiB,MAAM;AAAA,EACzB,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC7zBA;AAAA,EACE,YAAAE;AAAA,EACA,mBAAAC;AAAA,EACA,KAAAC;AAAA,EACA,UAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,SAAAC;AAAA,OAMK;AAYP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,sBAAAC;AAAA,EACA,aAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AA+CP,IAAM,mBAAmB,oBAAI,QAG3B;AAgBF,IAAM,kBAAoD,CAAC;AAC3D,IAAM,gBAAgB,uBAAO,uBAAuB;AAEpD,IAAM,oBAAoBC,iBAAgB;AAAA,EACxC,MAAM;AAAA,EACN,OAAO;AAAA,IACL,WAAW;AAAA,MACT,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,OAAO,EAAE,MAAM,GAAG;AACtB,UAAM,MAAMC,UAAS,MAAM,MAAM,aAAa,eAAe;AAC7D,IAAAC,SAAQ,eAAe,GAAG;AAC1B,WAAO,MAAM,MAAM,UAAU;AAAA,EAC/B;AACF,CAAC;AAED,SAAS,eAA8D;AACrE,SAAOC;AAAA,IACL;AAAA,IACAF,UAAS,MAAM,eAAe;AAAA,EAChC;AACF;AAMA,IAAM,iBAAiB,uBAAO,wBAAwB;AAEtD,IAAM,qBAAqBD,iBAAgB;AAAA,EACzC,MAAM;AAAA,EACN,OAAO;AAAA,IACL,YAAY;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,OAAO,EAAE,MAAM,GAAG;AACtB,UAAM,WAAWC;AAAA,MAAS,MACxB,MAAM,aAAa,wBAAwB,MAAM,UAAU,IAAI;AAAA,IACjE;AACA,IAAAC,SAAQ,gBAAgB,QAAQ;AAChC,WAAO,MAAM,MAAM,UAAU;AAAA,EAC/B;AACF,CAAC;AAED,SAAS,gBAA4D;AACnE,SAAOC;AAAA,IACL;AAAA,IACAF,UAAS,MAAM,MAAS;AAAA,EAC1B;AACF;AAMA,IAAM,uBAAuBD,iBAAgB;AAAA,EAC3C,MAAM;AAAA,EACN,OAAO;AAAA,IACL,aAAa;AAAA,MACX,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,MAAM,OAAO,EAAE,MAAM,GAAG;AACtB,UAAM,WAAWI,KAAI,KAAK;AAE1B,oBAAgB,CAAC,UAAU;AACzB,cAAQ;AAAA,QACN,qCAAqC,MAAM,WAAW;AAAA,QACtD;AAAA,MACF;AACA,eAAS,QAAQ;AACjB,aAAO;AAAA,IACT,CAAC;AAED,WAAO,MAAM;AACX,UAAI,SAAS,MAAO,QAAO;AAC3B,aAAO,MAAM,UAAU;AAAA,IACzB;AAAA,EACF;AACF,CAAC;AAMD,eAAe,0BACb,gBACA,KACA,aACA,SACA,WACe;AACf,aAAW,KAAK,gBAAgB;AAC9B,QAAI,YAAY,EAAG;AACnB,QAAI,CAAC,EAAE,QAAQ;AACb,YAAM,QAAQ,CAAC;AACf,UAAI,YAAY,EAAG;AACnB;AAAA,IACF;AACA,UAAM,UAAiC;AAAA,MACrC,GAAG;AAAA,MACH,YAAY,YAAY;AAAA,IAC1B;AACA,UAAM,WAAoC,CAAC;AAC3C,eAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,EAAE,MAAM,GAAG;AACjD,eAAS,GAAG,IAAI,mBAAmB,KAAK,OAAO;AAAA,IACjD;AACA,UAAM,QAAQ,EAAE,GAAG,GAAG,QAAQ,SAAS,CAAC;AACxC,QAAI,YAAY,EAAG;AAAA,EACrB;AACF;AAkBA,SAAS,oBAAoB;AAC3B,QAAM,SAASA,KAAI,iBAAiB,CAAC;AACrC,QAAM,QAAQ,wBAAwB,MAAM;AAC1C,WAAO,QAAQ,iBAAiB;AAAA,EAClC,CAAC;AACD,kBAAgB,KAAK;AACrB,SAAO;AACT;AAEA,IAAM,kBAAkBJ,iBAAgB;AAAA,EACtC,MAAM;AAAA,EACN,OAAO;AAAA,IACL,SAAS;AAAA,MACP,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,IACA,YAAY;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,OAA+D;AACnE,UAAM,iBAAiB,kBAAkB;AACzC,UAAM,cAAc,eAAe;AACnC,UAAM,EAAE,KAAK,cAAc,IAAI,cAAc;AAC7C,UAAM,EAAE,QAAQ,IAAI,WAAW;AAC/B,UAAM,EAAE,aAAa,OAAO,WAAW,IAAI,cAAc;AACzD,UAAM,YAAY,aAAa;AAC/B,UAAM,aAAa,cAAc;AAGjC,UAAM,UAAUC,UAAgC,MAAM;AACpD,YAAM,OAA8B,cAChC;AAAA,QACE,GAAG,cAAc;AAAA,QACjB,YAAY,YAAY;AAAA,QACxB,aAAa,YAAY;AAAA,QACzB,gBAAgB,YAAY;AAAA,MAC9B,IACA,EAAE,GAAG,cAAc,MAAM;AAC7B,WAAK,YAAY,UAAU;AAC3B,WAAK,aAAa,WAAW;AAC7B,aAAO;AAAA,IACT,CAAC;AAGD,UAAM,YAAY,OAAO,cAAqC;AAC5D,YAAM,UAAU,MAAM,QAAQ,KAAK,SAAS;AAC5C,UAAI,CAAC,QAAS;AACd,YAAM,iBAAiB,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;AAClE,YAAM;AAAA,QACJ;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,UAAM,UAAU,CAAC,cAAmC;AAClD,YAAM,UAAU,MAAM,QAAQ,KAAK,SAAS;AAC5C,UAAI,CAAC,SAAS;AACZ,eAAO,EAAE,MAAM,MAAM;AAAA,QAAC,GAAG,sBAAsB,OAAO,OAAO,MAAM;AAAA,MACrE;AACA,YAAM,iBAAiB,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;AAClE,YAAM,uBAAuB,eAAe,KAAK,CAAC,MAAM,EAAE,cAAc;AACxE,aAAO;AAAA,QACL,MAAM,MAAM;AACV,eAAK,UAAU,SAAS;AAAA,QAC1B;AAAA,QACA;AAAA,QACA,OAAO;AAAA,MACT;AAAA,IACF;AAGA,UAAM,gBAAgBA,UAAS,MAAM;AACnC,YAAM,MAAM,MAAM,QAAQ;AAC1B,UAAI,CAAC,IAAK,QAAO;AACjB,YAAM,SAAkC,CAAC;AACzC,iBAAW,QAAQ,OAAO,KAAK,GAAG,GAAG;AACnC,eAAO,IAAI,IAAII,WAAU,WAAW,OAAO,IAAI;AAAA,MACjD;AACA,aAAO;AAAA,IACT,CAAC;AAED,IAAAC;AAAA,MACE;AAAA,MACA,CAAC,SAAS,MAAM,cAAc;AAC5B,cAAM,MAAM,MAAM,QAAQ;AAC1B,YAAI,CAAC,OAAO,CAAC,QAAS;AAEtB,YAAI,YAAY;AAChB,kBAAU,MAAM;AACd,sBAAY;AAAA,QACd,CAAC;AAED,cAAM,QAAQ,OAAO,KAAK,GAAG;AAC7B,cAAM,YAAY;AAChB,qBAAW,QAAQ,OAAO;AACxB,gBAAI,UAAW;AACf,gBAAI,QAAQ,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAG;AAC1C,kBAAM,UAAU,IAAI,IAAI;AACxB,gBAAI,CAAC,QAAS;AACd,kBAAM,WAAW,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;AAC5D,kBAAM;AAAA,cACJ;AAAA,cACA,QAAQ;AAAA,cACR;AAAA,cACA;AAAA,cACA,MAAM;AAAA,YACR;AAAA,UACF;AAAA,QACF,GAAG,EAAE,MAAM,QAAQ,KAAK;AAAA,MAC1B;AAAA,MACA,EAAE,MAAM,KAAK;AAAA,IACf;AAEA,WAAO,MAAM;AACX,YAAM,MAAM,QAAQ;AAGpB,YAAM,YACJ,MAAM,QAAQ,YAAY,SACtB,OACAC,oBAAmB,MAAM,QAAQ,SAAS,GAAG;AAEnD,UAAI,CAAC,UAAW,QAAO;AAGvB,YAAM,WAAW,MAAM,QAAQ;AAC/B,YAAM,kBAAkB,gBAAgB,UAAU,GAAG;AACrD,YAAM,gBAAgB,oBAAoB,UAAU,GAAG;AAEvD,YAAM,kBACJ,kBAAkB,MAAM,QAAQ,QAC5B,EAAE,GAAG,MAAM,SAAS,OAAO,cAAc,IACzC,MAAM;AAGZ,YAAM,YAAY,MAAM,SAAS,gBAAgB,IAAI,KAAK,MAAM;AAEhE,UAAI,CAAC,WAAW;AACd,gBAAQ;AAAA,UACN,iDAAiD,gBAAgB,IAAI;AAAA,QACvE;AACA,eAAO;AAAA,MACT;AAEA,YAAM,WAAW,iBAAiB,IAAI,MAAM,QAAQ,IAClD,gBAAgB,IAClB;AACA,UAAI,gBAAgB,SAAS,UAAU,OAAO;AAC5C,cAAM,iBAAiB,IAAI,IAAI,SAAS,KAAK;AAC7C,mBAAW,YAAY,OAAO,KAAK,gBAAgB,KAAK,GAAG;AACzD,cAAI,aAAa,WAAW;AAC1B,oBAAQ;AAAA,cACN,4BAA4B,gBAAgB,IAAI;AAAA,YAClD;AAAA,UACF,WAAW,CAAC,eAAe,IAAI,QAAQ,GAAG;AACxC,oBAAQ;AAAA,cACN,+BAA+B,QAAQ,mBAAmB,gBAAgB,IAAI,uBAAuB,SAAS,MAAM,KAAK,IAAI,CAAC;AAAA,YAChI;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,kBAAkB,CAAC,WAAqB,aAC5C,UACG,IAAI,CAAC,aAAa;AACjB,cAAM,eAAe,MAAM,KAAK,SAAS,QAAQ;AACjD,YAAI,CAAC,cAAc;AACjB,cAAI,CAAC,MAAM,SAAS;AAClB,kBAAM,WAAW,WACb,YAAY,QAAQ,SAAS,gBAAgB,IAAI,MACjD,gBAAgB,gBAAgB,IAAI;AACxC,oBAAQ;AAAA,cACN,kCAAkC,QAAQ,gBAAgB,QAAQ;AAAA,YACpE;AAAA,UACF;AACA,iBAAO;AAAA,QACT;AACA,eAAOC,GAAE,iBAAiB;AAAA,UACxB,KAAK;AAAA,UACL,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,MAAM,MAAM;AAAA,UACZ,UAAU,MAAM;AAAA,UAChB,SAAS,MAAM;AAAA,UACf,UAAU,MAAM;AAAA,QAClB,CAAC;AAAA,MACH,CAAC,EACA,OAAO,CAAC,SAAwB,SAAS,IAAI;AAGlD,YAAM,iBAA8C,gBAAgB,SAChEA,GAAE,gBAAgB;AAAA,QAChB,SAAS;AAAA,QACT,MAAM,MAAM;AAAA,QACZ,UAAU,MAAM;AAAA,QAChB,SAAS,MAAM;AAAA,QACf,UAAU,MAAM;AAAA,MAClB,CAAC,IACD,gBAAgB,WACd,gBAAgB,gBAAgB,QAAQ,IACxC;AAEN,YAAM,aAAa,gBAAgB,QAC/B,OAAO;AAAA,QACL,OAAO,QAAQ,gBAAgB,KAAK,EACjC,OAAO,CAAC,CAAC,QAAQ,MAAM,aAAa,SAAS,EAC7C,IAAI,CAAC,CAAC,UAAU,SAAS,MAAM;AAAA,UAC9B;AAAA,UACA,MAAM,gBAAgB,WAAW,QAAQ;AAAA,QAC3C,CAAC;AAAA,MACL,IACA,CAAC;AAEL,YAAM,iBAAiBA;AAAA,QACrB;AAAA,QACA;AAAA,UACE,SAAS;AAAA,UACT,MAAM;AAAA,UACN,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,SAAS,MAAM;AAAA,QACjB;AAAA,QACA,EAAE,SAAS,MAAM,gBAAgB,GAAG,WAAW;AAAA,MACjD;AAIA,YAAM,SACJ,eAAe,SAAS,MAAM,aAC1BA;AAAA,QACE;AAAA,QACA,EAAE,eAAe,MAAM,YAAY,OAAO,mBAAmB;AAAA,QAC7D,CAAC,cAAc;AAAA,MACjB,IACA;AAEN,aAAOA;AAAA,QACL;AAAA,QACA,EAAE,aAAa,gBAAgB,KAAK;AAAA,QACpC,EAAE,SAAS,MAAM,OAAO;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAMD,IAAM,iBAAiBR,iBAAgB;AAAA,EACrC,MAAM;AAAA,EACN,OAAO;AAAA,IACL,SAAS;AAAA,MACP,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,OAAO;AACX,UAAM,EAAE,MAAM,IAAI,cAAc;AAChC,UAAM,cAAc,eAAe;AAEnC,WAAO,MAAM;AACX,YAAM,SAAS,MAAM,QAAQ;AAC7B,UAAI,CAAC,QAAQ,UAAW,QAAO;AAC/B,YAAM,YAAY;AAAA,QAChB,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AACA,UAAI,cAAc,QAAW;AAC3B,gBAAQ;AAAA,UACN;AAAA,QACF;AACA,eAAO;AAAA,MACT;AACA,YAAM,MAAMK,WAAU,MAAM,OAAO,SAAS;AAC5C,YAAM,QAAQ,MAAM,QAAQ,GAAG,IAAK,MAAoB,CAAC;AAEzD,aAAO,MAAM,IAAI,CAAC,WAAW,UAAU;AACrC,cAAM,MACJ,OAAO,OAAO,OAAO,cAAc,YAAY,cAAc,OACzD;AAAA,UACG,UAAsC,OAAO,GAAG,KAAK;AAAA,QACxD,IACA,OAAO,KAAK;AAElB,eAAOG;AAAA,UACL;AAAA,UACA;AAAA,YACE;AAAA,YACA,MAAM;AAAA,YACN;AAAA,YACA,UAAU,2BAA2B,WAAW,KAAK;AAAA,UACvD;AAAA,UACA;AAAA,YACE,SAAS,MACP,MAAM,QAAQ,UACV,IAAI,CAAC,aAAa;AAClB,oBAAM,eAAe,MAAM,KAAK,SAAS,QAAQ;AACjD,kBAAI,CAAC,cAAc;AACjB,oBAAI,CAAC,MAAM,SAAS;AAClB,0BAAQ;AAAA,oBACN,kCAAkC,QAAQ,6BAA6B,MAAM,QAAQ,IAAI;AAAA,kBAC3F;AAAA,gBACF;AACA,uBAAO;AAAA,cACT;AACA,qBAAOA,GAAE,iBAAiB;AAAA,gBACxB,KAAK;AAAA,gBACL,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,MAAM,MAAM;AAAA,gBACZ,UAAU,MAAM;AAAA,gBAChB,SAAS,MAAM;AAAA,gBACf,UAAU,MAAM;AAAA,cAClB,CAAC;AAAA,YACH,CAAC,EACA,OAAO,CAAC,MAAkB,MAAM,IAAI,KAAK;AAAA,UAChD;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF,CAAC;AASM,IAAM,WAAWR,iBAAgB;AAAA,EACtC,MAAM;AAAA,EACN,OAAO;AAAA,IACL,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,OAAO;AACX,WAAO,MAAM;AACX,UAAI,CAAC,MAAM,MAAM,KAAM,QAAO;AAE9B,YAAM,cAAc,MAAM,KAAK,SAAS,MAAM,KAAK,IAAI;AACvD,UAAI,CAAC,YAAa,QAAO;AAEzB,aAAOQ,GAAE,iBAAiB;AAAA,QACxB,SAAS;AAAA,QACT,YAAY,MAAM,KAAK;AAAA,QACvB,MAAM,MAAM;AAAA,QACZ,UAAU,MAAM;AAAA,QAChB,SAAS,MAAM;AAAA,QACf,UAAU,MAAM;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,EACF;AACF,CAAC;AAMD,IAAM,4BAA4BR,iBAAgB;AAAA,EAChD,MAAM;AAAA,EACN,QAAQ;AACN,UAAM,EAAE,qBAAqB,SAAS,OAAO,IAAI,WAAW;AAE5D,WAAO,MAAM;AACX,UAAI,CAAC,qBAAqB,OAAO,QAAS,QAAO;AAEjD,aAAOQ,GAAE,eAAe;AAAA,QACtB,SAAS,oBAAoB,OAAO;AAAA,QACpC,WAAW;AAAA,QACX,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AACF,CAAC;AAgCM,IAAM,iBAAiBR,iBAAgB;AAAA,EAC5C,MAAM;AAAA,EACN,OAAO;AAAA,IACL,UAAU;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,cAAc;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MAMN,SAAS;AAAA,IACX;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,qBAAqB;AAAA,MACnB,MAAM;AAAA,MAMN,SAAS;AAAA,IACX;AAAA,IACA,WAAW;AAAA,MACT,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,YAAY;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,eAAe;AAAA,MACb,MAAM;AAAA,MAGN,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,OAAO,EAAE,MAAM,GAAG;AACtB,WAAO,MACLQ;AAAA,MACE;AAAA,MACA;AAAA,QACE,OAAO,MAAM;AAAA,QACb,cAAc,MAAM;AAAA,QACpB,eAAe,MAAM;AAAA,MACvB;AAAA,MACA;AAAA,QACE,SAAS,MACPA,GAAE,oBAAoB,MAAM;AAAA,UAC1B,SAAS,MACPA;AAAA,YACE;AAAA,YACA,EAAE,iBAAiB,MAAM,oBAAoB;AAAA,YAC7C;AAAA,cACE,SAAS,MACPA;AAAA,gBACE;AAAA,gBACA,EAAE,UAAU,MAAM,UAAU,UAAU,MAAM,SAAS;AAAA,gBACrD;AAAA,kBACE,SAAS,MACPA;AAAA,oBACE;AAAA,oBACA,EAAE,WAAW,MAAM,UAAU;AAAA,oBAC7B;AAAA,sBACE,SAAS,MACPA;AAAA,wBACE;AAAA,wBACA,EAAE,YAAY,MAAM,WAAW;AAAA,wBAC/B;AAAA,0BACE,SAAS,MAAM;AAAA,4BACb,MAAM,UAAU;AAAA,4BAChBA,GAAE,yBAAyB;AAAA,0BAC7B;AAAA,wBACF;AAAA,sBACF;AAAA,oBACJ;AAAA,kBACF;AAAA,gBACJ;AAAA,cACF;AAAA,YACJ;AAAA,UACF;AAAA,QACJ,CAAC;AAAA,MACL;AAAA,IACF;AAAA,EACJ;AACF,CAAC;AAgEM,SAAS,eACd,SACA,SACsB;AACtB,QAAM,WAA8B,CAAC;AAErC,MAAI,QAAQ,YAAY;AACtB,eAAW,CAAC,MAAM,WAAW,KAAK,OAAO,QAAQ,QAAQ,UAAU,GAAG;AACpE,eAAS,IAAI,IAAIR,iBAAgB;AAAA,QAC/B,MAAM,sBAAsB,IAAI;AAAA,QAChC,OAAO;AAAA,UACL,SAAS;AAAA,YACP,MAAM;AAAA,YACN,UAAU;AAAA,UACZ;AAAA,UACA,MAAM;AAAA,YACJ,MAAM;AAAA,YACN,UAAU;AAAA,UACZ;AAAA,UACA,IAAI;AAAA,YACF,MAAM;AAAA,YACN,UAAU;AAAA,UACZ;AAAA,UACA,UAAU;AAAA,YACR,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,UACA,SAAS;AAAA,YACP,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,QACF;AAAA,QACA,MAAM,eAAe,EAAE,MAAM,GAAG;AAC9B,iBAAO,MACJ,YAA0C;AAAA,YACzC,OAAO,cAAc,QAAQ;AAAA,YAC7B,UAAU,MAAM,UAAU;AAAA,YAC1B;AAAA,YACA,MAAM,cAAc;AAAA,YACpB,IAAI,cAAc;AAAA,YAClB,UAAU,cAAc;AAAA,YACxB,SAAS,cAAc;AAAA,UACzB,CAAC;AAAA,QACL;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACA,QAAM,oBACJ,QAGA,MAAM;AACR,MAAI,mBAAmB;AACrB,qBAAiB,IAAI,UAAU,iBAAiB;AAAA,EAClD;AAEA,QAAM,YAAY,QAAQ,UACrB,OAAO,QAAQ,QAAQ,OAAO,IAG/B,CAAC;AAEL,QAAM,WAAW,CACf,aACA,aACuE;AACvE,UAAM,SAGF,CAAC;AACL,eAAW,CAAC,MAAM,QAAQ,KAAK,WAAW;AACxC,aAAO,IAAI,IAAI,OAAO,WAAW;AAC/B,cAAM,WAAW,YAAY;AAC7B,cAAM,QAAQ,SAAS;AACvB,YAAI,UAAU;AACZ,gBAAM,SAAS,QAAQ,UAAU,KAAK;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,QAAMS,iBAAgB,OACpB,YACA,QACA,UACA,QAAoB,CAAC,MACH;AAClB,UAAM,QAAQ,UAAU,KAAK,CAAC,CAAC,IAAI,MAAM,SAAS,UAAU;AAC5D,QAAI,OAAO;AACT,YAAM,MAAM,CAAC,EAAE,QAAQ,UAAU,KAAK;AAAA,IACxC,OAAO;AACL,cAAQ,KAAK,mBAAmB,UAAU,EAAE;AAAA,IAC9C;AAAA,EACF;AAEA,SAAO,EAAE,UAAU,UAAU,eAAAA,eAAc;AAC7C;AA8CO,SAAS,eAId,SACA,YACW;AACX,QAAM,WACJ;AACF,QAAM,oBACJ,QAAQ,KACR;AACF,MAAI,mBAAmB;AACrB,qBAAiB,IAAI,UAAU,iBAAiB;AAAA,EAClD;AAEA,SAAOT,iBAAgB;AAAA,IACrB,MAAM;AAAA,IACN,OAAO;AAAA,MACL,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,MACA,UAAU;AAAA,QACR,MAAM;AAAA,QAGN,SAAS;AAAA,MACX;AAAA,MACA,eAAe;AAAA,QACb,MAAM;AAAA,QAGN,SAAS;AAAA,MACX;AAAA,MACA,WAAW;AAAA,QACT,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,MACA,YAAY;AAAA,QACV,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,MACA,SAAS;AAAA,QACP,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,MACA,UAAU;AAAA,QACR,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,MAAM,eAAe;AACnB,aAAO,MAAM;AAEX,cAAM,iBAAiB,cAAc,WACjC,IAAI;AAAA,UACF,CAAC;AAAA,UAID;AAAA,YACE,KAAK,CAAC,SAAS,SAAiB;AAC9B,qBAAO,CAAC,WACN,cAAc,SAAU,MAAM,MAAM;AAAA,YACxC;AAAA,YACA,KAAK,MAAM;AAAA,UACb;AAAA,QACF,IACA;AAEJ,eAAOQ;AAAA,UACL;AAAA,UACA;AAAA,YACE,OAAO,cAAc;AAAA,YACrB,cAAc,cAAc;AAAA,YAC5B,eAAe,cAAc;AAAA,UAC/B;AAAA,UACA;AAAA,YACE,SAAS,MACPA,GAAE,oBAAoB,MAAM;AAAA,cAC1B,SAAS,MACPA,GAAE,oBAAoB,MAAM;AAAA,gBAC1B,SAAS,MACPA;AAAA,kBACE;AAAA,kBACA,EAAE,UAAU,eAAe;AAAA,kBAC3B;AAAA,oBACE,SAAS,MACPA;AAAA,sBACE;AAAA,sBACA,EAAE,WAAW,cAAc,UAAU;AAAA,sBACrC;AAAA,wBACE,SAAS,MACPA;AAAA,0BACE;AAAA,0BACA,EAAE,YAAY,cAAc,WAAW;AAAA,0BACvC;AAAA,4BACE,SAAS,MAAM;AAAA,8BACbA,GAAE,UAAU;AAAA,gCACV,MAAM,cAAc;AAAA,gCACpB;AAAA,gCACA,SAAS,cAAc;AAAA,gCACvB,UAAU,cAAc;AAAA,8BAC1B,CAAC;AAAA,8BACDA,GAAE,yBAAyB;AAAA,4BAC7B;AAAA,0BACF;AAAA,wBACF;AAAA,sBACJ;AAAA,oBACF;AAAA,kBACJ;AAAA,gBACF;AAAA,cACJ,CAAC;AAAA,YACL,CAAC;AAAA,UACL;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;","names":["computed","defineComponent","inject","provide","defineComponent","computed","provide","inject","computed","defineComponent","inject","provide","ref","watch","computed","defineComponent","inject","onUnmounted","provide","ref","defineComponent","ref","provide","inject","onUnmounted","computed","defineComponent","ref","watch","addLoading","binding","provide","inject","computed","defineComponent","inject","provide","createStateStore","ref","shallowRef","computed","onUnmounted","getByPath","shallowRef","ref","onUnmounted","computed","computed","defineComponent","h","inject","provide","ref","watch","evaluateVisibility","getByPath","defineComponent","computed","provide","inject","ref","getByPath","watch","evaluateVisibility","h","executeAction"]}