{"version":3,"sources":["../../react-state/src/index.tsx","../src/contexts/visibility.tsx","../src/contexts/actions.tsx","../src/contexts/validation.tsx","../src/contexts/repeat-scope.tsx","../src/index.ts","../src/renderer.tsx","../src/hooks.ts"],"sourcesContent":["\"use client\";\n\nimport React, {\n  createContext,\n  useContext,\n  useCallback,\n  useEffect,\n  useMemo,\n  useRef,\n  useSyncExternalStore,\n  type ReactNode,\n} from \"react\";\nimport {\n  getByPath,\n  createStateStore,\n  type StateModel,\n  type StateStore,\n} from \"@json-render/core\";\nimport { flattenToPointers } from \"@json-render/core/store-utils\";\n\n/**\n * State context value\n */\nexport interface StateContextValue {\n  /** The current state model */\n  state: 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 the React render snapshot). */\n  getSnapshot: () => StateModel;\n}\n\nconst StateContext = createContext<StateContextValue | null>(null);\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  children: ReactNode;\n}\n\nfunction computeInitialFlat(\n  isControlled: boolean,\n  initialState: StateModel,\n): Record<string, unknown> | null {\n  if (isControlled) return null;\n  if (Object.keys(initialState).length === 0) return {};\n  return flattenToPointers(initialState);\n}\n\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 function StateProvider({\n  store: externalStore,\n  initialState = {},\n  onStateChange,\n  children,\n}: StateProviderProps) {\n  const internalStoreRef = useRef<StateStore | undefined>(undefined);\n  if (!externalStore && !internalStoreRef.current) {\n    internalStoreRef.current = createStateStore(initialState);\n  }\n\n  const store = externalStore ?? internalStoreRef.current!;\n\n  // Refs for stable callback identity — callbacks never change regardless of\n  // whether the consumer passes a new store / onStateChange reference.\n  const storeRef = useRef(store);\n  storeRef.current = store;\n\n  const isControlledRef = useRef(!!externalStore);\n  isControlledRef.current = !!externalStore;\n\n  const initialModeRef = useRef(externalStore ? \"controlled\" : \"uncontrolled\");\n  const modeWarnedRef = useRef(false);\n  if (process.env.NODE_ENV !== \"production\") {\n    const currentMode = externalStore ? \"controlled\" : \"uncontrolled\";\n    if (currentMode !== initialModeRef.current && !modeWarnedRef.current) {\n      modeWarnedRef.current = true;\n      console.warn(\n        `StateProvider: switching from ${initialModeRef.current} to ${currentMode} mode is not supported.`,\n      );\n    }\n  }\n\n  const prevInitialStateRef = useRef(initialState);\n  const prevFlatRef = useRef<Record<string, unknown> | null>(\n    computeInitialFlat(!!externalStore, initialState),\n  );\n  useEffect(() => {\n    if (externalStore) return;\n    if (initialState === prevInitialStateRef.current) return;\n    prevInitialStateRef.current = initialState;\n    const nextFlat =\n      initialState && Object.keys(initialState).length > 0\n        ? flattenToPointers(initialState)\n        : {};\n    const prevFlat = prevFlatRef.current ?? {};\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    prevFlatRef.current = nextFlat;\n    if (Object.keys(updates).length > 0) {\n      store.update(updates);\n    }\n  }, [externalStore, initialState, store]);\n\n  const state = useSyncExternalStore(\n    store.subscribe,\n    store.getSnapshot,\n    store.getServerSnapshot ?? store.getSnapshot,\n  );\n\n  const onStateChangeRef = useRef(onStateChange);\n  onStateChangeRef.current = onStateChange;\n\n  const set = useCallback((path: string, value: unknown) => {\n    const s = storeRef.current;\n    const prev = s.getSnapshot();\n    s.set(path, value);\n    if (!isControlledRef.current && s.getSnapshot() !== prev) {\n      onStateChangeRef.current?.([{ path, value }]);\n    }\n  }, []);\n\n  const update = useCallback((updates: Record<string, unknown>) => {\n    const s = storeRef.current;\n    const prev = s.getSnapshot();\n    s.update(updates);\n    if (!isControlledRef.current && s.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.current?.(changes);\n      }\n    }\n  }, []);\n\n  const get = useCallback((path: string) => storeRef.current.get(path), []);\n\n  const getSnapshot = useCallback(() => storeRef.current.getSnapshot(), []);\n\n  const value = useMemo<StateContextValue>(\n    () => ({ state, get, set, update, getSnapshot }),\n    [state, get, set, update, getSnapshot],\n  );\n\n  return (\n    <StateContext.Provider value={value}>{children}</StateContext.Provider>\n  );\n}\n\n/**\n * Hook to access the state context\n */\nexport function useStateStore(): StateContextValue {\n  const ctx = useContext(StateContext);\n  if (!ctx) {\n    throw new Error(\"useStateStore must be used within a StateProvider\");\n  }\n  return ctx;\n}\n\n/**\n * Hook to get a value from the state model\n */\nexport function useStateValue<T>(path: string): T | undefined {\n  const { state } = useStateStore();\n  return getByPath(state, path) as T | undefined;\n}\n\n/**\n * Hook to get and set a value from the state model (like useState).\n *\n * @deprecated Use {@link useBoundProp} with `$bindState` expressions instead.\n * `useStateBinding` takes a raw state path string, while `useBoundProp` works\n * with the renderer's `bindings` map and supports both `$bindState` and\n * `$bindItem` expressions.\n */\nexport function useStateBinding<T>(\n  path: string,\n): [T | undefined, (value: T) => void] {\n  const { state, set } = useStateStore();\n  const value = getByPath(state, path) as T | undefined;\n  const setValue = useCallback(\n    (newValue: T) => set(path, newValue),\n    [path, set],\n  );\n  return [value, setValue];\n}\n","\"use client\";\n\nimport React, {\n  createContext,\n  useContext,\n  useMemo,\n  type ReactNode,\n} from \"react\";\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 */\n  ctx: CoreVisibilityContext;\n}\n\nconst VisibilityContext = createContext<VisibilityContextValue | null>(null);\n\n/**\n * Props for VisibilityProvider\n */\nexport interface VisibilityProviderProps {\n  children: ReactNode;\n}\n\n/**\n * Provider for visibility evaluation\n */\nexport function VisibilityProvider({ children }: VisibilityProviderProps) {\n  const { state } = useStateStore();\n\n  const ctx: CoreVisibilityContext = useMemo(\n    () => ({\n      stateModel: state,\n    }),\n    [state],\n  );\n\n  const isVisible = useMemo(\n    () => (condition: VisibilityCondition | undefined) =>\n      evaluateVisibility(condition, ctx),\n    [ctx],\n  );\n\n  const value = useMemo<VisibilityContextValue>(\n    () => ({ isVisible, ctx }),\n    [isVisible, ctx],\n  );\n\n  return (\n    <VisibilityContext.Provider value={value}>\n      {children}\n    </VisibilityContext.Provider>\n  );\n}\n\n/**\n * Hook to access visibility evaluation\n */\nexport function useVisibility(): VisibilityContextValue {\n  const ctx = useContext(VisibilityContext);\n  if (!ctx) {\n    throw new Error(\"useVisibility must be used within a VisibilityProvider\");\n  }\n  return ctx;\n}\n\n/**\n * Hook to check if a condition is visible\n */\nexport function useIsVisible(\n  condition: VisibilityCondition | undefined,\n): boolean {\n  const { isVisible } = useVisibility();\n  return isVisible(condition);\n}\n","\"use client\";\n\nimport React, {\n  createContext,\n  useContext,\n  useState,\n  useCallback,\n  useMemo,\n  type ReactNode,\n} from \"react\";\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 * Combines a timestamp with a random suffix for uniqueness.\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 *\n * This allows pushState values to contain references to current state\n * and auto-generated IDs.\n */\nfunction deepResolveValue(\n  value: unknown,\n  get: (path: string) => unknown,\n): unknown {\n  if (value === null || value === undefined) return value;\n\n  // \"$id\" string token -> generate unique ID\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    // { $state: \"/foo\" } -> read from state\n    if (keys.length === 1 && typeof obj.$state === \"string\") {\n      return get(obj.$state as string);\n    }\n\n    // { \"$id\": true } -> generate unique ID (single-key object)\n    if (keys.length === 1 && \"$id\" in obj) {\n      return generateUniqueId();\n    }\n  }\n\n  // Recurse into arrays\n  if (Array.isArray(value)) {\n    return value.map((item) => deepResolveValue(item, get));\n  }\n\n  // Recurse into plain objects\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  /** The resolved action */\n  action: ResolvedAction;\n  /** The action handler */\n  handler: ActionHandler;\n  /** Resolve callback */\n  resolve: () => void;\n  /** Reject callback */\n  reject: () => void;\n}\n\n/**\n * Action context value\n */\nexport interface ActionContextValue {\n  /** Registered action handlers */\n  handlers: Record<string, ActionHandler>;\n  /** Currently loading action names */\n  loadingActions: Set<string>;\n  /** Pending confirmation dialog */\n  pendingConfirmation: PendingConfirmation | null;\n  /** Execute an action binding */\n  execute: (binding: ActionBinding) => Promise<void>;\n  /** Confirm the pending action */\n  confirm: () => void;\n  /** Cancel the pending action */\n  cancel: () => void;\n  /** Register an action handler */\n  registerHandler: (name: string, handler: ActionHandler) => void;\n}\n\nconst ActionContext = createContext<ActionContextValue | null>(null);\n\n/**\n * Props for ActionProvider\n */\nexport interface ActionProviderProps {\n  /** Initial action handlers */\n  handlers?: Record<string, ActionHandler>;\n  /** Navigation function */\n  navigate?: (path: string) => void;\n  children: ReactNode;\n}\n\n/**\n * Provider for action execution\n */\nexport function ActionProvider({\n  handlers: initialHandlers = {},\n  navigate,\n  children,\n}: ActionProviderProps) {\n  const { get, set, getSnapshot } = useStateStore();\n  const validation = useOptionalValidation();\n\n  const [handlers, setHandlers] =\n    useState<Record<string, ActionHandler>>(initialHandlers);\n  const [loadingActions, setLoadingActions] = useState<Set<string>>(new Set());\n  const [pendingConfirmation, setPendingConfirmation] =\n    useState<PendingConfirmation | null>(null);\n\n  const registerHandler = useCallback(\n    (name: string, handler: ActionHandler) => {\n      setHandlers((prev) => ({ ...prev, [name]: handler }));\n    },\n    [],\n  );\n\n  const execute = useCallback(\n    async (binding: ActionBinding) => {\n      const resolved = resolveAction(binding, getSnapshot());\n\n      // --- devtools / observer hooks ---\n      const dispatchId = nextActionDispatchId();\n      const dispatchedAt = Date.now();\n      notifyActionDispatch({\n        id: dispatchId,\n        name: resolved.action,\n        params: resolved.params,\n        at: dispatchedAt,\n      });\n      let __ok = true;\n      let __error: unknown = undefined;\n\n      try {\n        // Built-in: setState updates the StateProvider state directly\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 appends an item to an array in state.\n        // Supports dynamic values inside the value object via { $state: \"/...\" } syntax.\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            // Optionally clear a state path after pushing (e.g. clear the input)\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 removes an item from an array in state by index.\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: push navigates to a new screen by updating state.\n        // Pushes the current screen onto /navStack and sets /currentScreen.\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              // No current screen set yet -- push a sentinel so pop returns here\n              set(\"/navStack\", [...navStack, \"\"]);\n            }\n            set(\"/currentScreen\", screen);\n          }\n          return;\n        }\n\n        // Built-in: pop navigates back to the previous screen.\n        // Pops the last entry from /navStack and restores /currentScreen.\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        // Built-in: validateForm triggers validateAll from the ValidationProvider\n        // and writes the result to a state path (default: /formValidation).\n        // IMPORTANT: validateAll() is synchronous — it runs all registered field\n        // validations and returns immediately. This guarantees that the next action\n        // in a sequential list (e.g. [validateForm, submitForm]) can read the\n        // validation result from state without awaiting an extra tick.\n        if (resolved.action === \"validateForm\") {\n          const validateAll = validation?.validateAll;\n          if (!validateAll) {\n            console.warn(\n              \"validateForm action was dispatched but no ValidationProvider is connected. \" +\n                \"Ensure ValidationProvider is rendered inside the provider tree.\",\n            );\n            return;\n          }\n          const valid = validateAll();\n          const errors: Record<string, string[]> = {};\n          for (const [path, fs] of Object.entries(validation.fieldStates)) {\n            if (fs.result && !fs.result.valid) {\n              errors[path] = fs.result.errors;\n            }\n          }\n          const statePath =\n            (resolved.params?.statePath as string) || \"/formValidation\";\n          set(statePath, { valid, errors });\n          return;\n        }\n\n        const handler = handlers[resolved.action];\n\n        if (!handler) {\n          console.warn(`No handler registered for action: ${resolved.action}`);\n          return;\n        }\n\n        // If confirmation is required, show dialog\n        if (resolved.confirm) {\n          return new Promise<void>((resolve, reject) => {\n            setPendingConfirmation({\n              action: resolved,\n              handler,\n              resolve: () => {\n                setPendingConfirmation(null);\n                resolve();\n              },\n              reject: () => {\n                setPendingConfirmation(null);\n                reject(new Error(\"Action cancelled\"));\n              },\n            });\n          }).then(async () => {\n            setLoadingActions((prev) => new Set(prev).add(resolved.action));\n            try {\n              await executeAction({\n                action: resolved,\n                handler,\n                setState: set,\n                navigate,\n                executeAction: async (name) => {\n                  const subBinding: ActionBinding = { action: name };\n                  await execute(subBinding);\n                },\n              });\n            } finally {\n              setLoadingActions((prev) => {\n                const next = new Set(prev);\n                next.delete(resolved.action);\n                return next;\n              });\n            }\n          });\n        }\n\n        // Execute immediately\n        setLoadingActions((prev) => new Set(prev).add(resolved.action));\n        try {\n          await executeAction({\n            action: resolved,\n            handler,\n            setState: set,\n            navigate,\n            executeAction: async (name) => {\n              const subBinding: ActionBinding = { action: name };\n              await execute(subBinding);\n            },\n          });\n        } finally {\n          setLoadingActions((prev) => {\n            const next = new Set(prev);\n            next.delete(resolved.action);\n            return next;\n          });\n        }\n      } catch (err) {\n        __ok = false;\n        __error = err;\n        throw err;\n      } finally {\n        const now = Date.now();\n        notifyActionSettle({\n          id: dispatchId,\n          name: resolved.action,\n          ok: __ok,\n          at: now,\n          durationMs: now - dispatchedAt,\n          error: __error,\n        });\n      }\n    },\n    [handlers, get, set, getSnapshot, navigate, validation],\n  );\n\n  const confirm = useCallback(() => {\n    pendingConfirmation?.resolve();\n  }, [pendingConfirmation]);\n\n  const cancel = useCallback(() => {\n    pendingConfirmation?.reject();\n  }, [pendingConfirmation]);\n\n  const value = useMemo<ActionContextValue>(\n    () => ({\n      handlers,\n      loadingActions,\n      pendingConfirmation,\n      execute,\n      confirm,\n      cancel,\n      registerHandler,\n    }),\n    [\n      handlers,\n      loadingActions,\n      pendingConfirmation,\n      execute,\n      confirm,\n      cancel,\n      registerHandler,\n    ],\n  );\n\n  return (\n    <ActionContext.Provider value={value}>{children}</ActionContext.Provider>\n  );\n}\n\n/**\n * Hook to access action context\n */\nexport function useActions(): ActionContextValue {\n  const ctx = useContext(ActionContext);\n  if (!ctx) {\n    throw new Error(\"useActions must be used within an ActionProvider\");\n  }\n  return ctx;\n}\n\n/**\n * Hook to execute an action binding\n */\nexport function useAction(binding: ActionBinding): {\n  execute: () => Promise<void>;\n  isLoading: boolean;\n} {\n  const { execute, loadingActions } = useActions();\n  const isLoading = loadingActions.has(binding.action);\n\n  const executeAction = useCallback(() => execute(binding), [execute, binding]);\n\n  return { execute: executeAction, isLoading };\n}\n\n/**\n * Props for ConfirmDialog component\n */\nexport interface ConfirmDialogProps {\n  /** The confirmation config */\n  confirm: ActionConfirm;\n  /** Called when confirmed */\n  onConfirm: () => void;\n  /** Called when cancelled */\n  onCancel: () => void;\n}\n\n/**\n * Default confirmation dialog component\n */\nexport function ConfirmDialog({\n  confirm,\n  onConfirm,\n  onCancel,\n}: ConfirmDialogProps) {\n  const isDanger = confirm.variant === \"danger\";\n\n  return (\n    <div\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={onCancel}\n    >\n      <div\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) => e.stopPropagation()}\n      >\n        <h3\n          style={{\n            margin: \"0 0 8px 0\",\n            fontSize: \"18px\",\n            fontWeight: 600,\n          }}\n        >\n          {confirm.title}\n        </h3>\n        <p\n          style={{\n            margin: \"0 0 24px 0\",\n            color: \"#6b7280\",\n          }}\n        >\n          {confirm.message}\n        </p>\n        <div\n          style={{\n            display: \"flex\",\n            gap: \"12px\",\n            justifyContent: \"flex-end\",\n          }}\n        >\n          <button\n            onClick={onCancel}\n            style={{\n              padding: \"8px 16px\",\n              borderRadius: \"6px\",\n              border: \"1px solid #d1d5db\",\n              backgroundColor: \"white\",\n              cursor: \"pointer\",\n            }}\n          >\n            {confirm.cancelLabel ?? \"Cancel\"}\n          </button>\n          <button\n            onClick={onConfirm}\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          >\n            {confirm.confirmLabel ?? \"Confirm\"}\n          </button>\n        </div>\n      </div>\n    </div>\n  );\n}\n","\"use client\";\n\nimport React, {\n  createContext,\n  useContext,\n  useRef,\n  useState,\n  useCallback,\n  useMemo,\n  type ReactNode,\n} from \"react\";\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  /** Whether the field has been touched */\n  touched: boolean;\n  /** Whether the field has been validated */\n  validated: boolean;\n  /** Validation result */\n  result: ValidationResult | null;\n}\n\n/**\n * Validation context value\n */\nexport interface ValidationContextValue {\n  /** Custom validation functions from catalog */\n  customFunctions: Record<string, ValidationFunction>;\n  /** Validation state by field path */\n  fieldStates: Record<string, FieldValidationState>;\n  /** Validate a field */\n  validate: (path: string, config: ValidationConfig) => ValidationResult;\n  /** Mark field as touched */\n  touch: (path: string) => void;\n  /** Clear validation for a field */\n  clear: (path: string) => void;\n  /** Validate all fields */\n  validateAll: () => boolean;\n  /** Register field config */\n  registerField: (path: string, config: ValidationConfig) => void;\n}\n\nconst ValidationContext = createContext<ValidationContextValue | null>(null);\n\n/**\n * Props for ValidationProvider\n */\nexport interface ValidationProviderProps {\n  /** Custom validation functions from catalog */\n  customFunctions?: Record<string, ValidationFunction>;\n  children: ReactNode;\n}\n\n/**\n * Compare two DynamicValue args records shallowly.\n * Values are primitives or { $state: string }, so shallow comparison suffices.\n */\nfunction dynamicArgsEqual(\n  a: Record<string, unknown> | undefined,\n  b: Record<string, unknown> | undefined,\n): boolean {\n  if (a === b) return true;\n  if (!a || !b) return false;\n\n  const keysA = Object.keys(a);\n  const keysB = Object.keys(b);\n  if (keysA.length !== keysB.length) return false;\n\n  for (const key of keysA) {\n    const va = a[key];\n    const vb = b[key];\n    if (va === vb) continue;\n    // Handle { $state: string } objects\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\n  // Compare validateOn\n  if (a.validateOn !== b.validateOn) return false;\n\n  // Compare checks arrays\n  const ac = a.checks ?? [];\n  const bc = b.checks ?? [];\n  if (ac.length !== bc.length) return false;\n\n  for (let i = 0; i < ac.length; i++) {\n    const ca = ac[i]!;\n    const cb = bc[i]!;\n    if (ca.type !== cb.type) return false;\n    if (ca.message !== cb.message) return false;\n    if (!dynamicArgsEqual(ca.args, cb.args)) return false;\n  }\n\n  return true;\n}\n\n/**\n * Provider for validation\n */\nexport function ValidationProvider({\n  customFunctions = {},\n  children,\n}: ValidationProviderProps) {\n  const { state, getSnapshot } = useStateStore();\n\n  const [fieldStates, setFieldStates] = useState<\n    Record<string, FieldValidationState>\n  >({});\n  // Mutable mirror of fieldStates for synchronous reads (e.g. reading errors\n  // immediately after validateAll() before React flushes the batched setState).\n  const fieldStatesRef = useRef<Record<string, FieldValidationState>>({});\n  const [fieldConfigs, setFieldConfigs] = useState<\n    Record<string, ValidationConfig>\n  >({});\n\n  const registerField = useCallback(\n    (path: string, config: ValidationConfig) => {\n      setFieldConfigs((prev) => {\n        const existing = prev[path];\n        // Bail out (return same reference) if config is unchanged to avoid\n        // infinite re-render loops when callers pass a fresh object each render.\n        if (existing && validationConfigEqual(existing, config)) {\n          return prev;\n        }\n        return { ...prev, [path]: config };\n      });\n    },\n    [],\n  );\n\n  const validate = useCallback(\n    (path: string, config: ValidationConfig): ValidationResult => {\n      // Read from the store directly so validation sees values written in the\n      // same synchronous handler (e.g. setValue then validate in onChange).\n      // Using React state would return the stale pre-render snapshot.\n      const currentState = getSnapshot();\n      const segments = path.split(\"/\").filter(Boolean);\n      let value: unknown = currentState;\n      for (const seg of segments) {\n        if (value != null && typeof value === \"object\") {\n          value = (value as Record<string, unknown>)[seg];\n        } else {\n          value = undefined;\n          break;\n        }\n      }\n      const result = runValidation(config, {\n        value,\n        stateModel: currentState,\n        customFunctions,\n      });\n\n      const newFieldState: FieldValidationState = {\n        touched: fieldStatesRef.current[path]?.touched ?? true,\n        validated: true,\n        result,\n      };\n      fieldStatesRef.current = {\n        ...fieldStatesRef.current,\n        [path]: newFieldState,\n      };\n      setFieldStates(fieldStatesRef.current);\n\n      return result;\n    },\n    [customFunctions, getSnapshot],\n  );\n\n  const touch = useCallback((path: string) => {\n    fieldStatesRef.current = {\n      ...fieldStatesRef.current,\n      [path]: {\n        ...fieldStatesRef.current[path],\n        touched: true,\n        validated: fieldStatesRef.current[path]?.validated ?? false,\n        result: fieldStatesRef.current[path]?.result ?? null,\n      },\n    };\n    setFieldStates(fieldStatesRef.current);\n  }, []);\n\n  const clear = useCallback((path: string) => {\n    const { [path]: _, ...rest } = fieldStatesRef.current;\n    fieldStatesRef.current = rest;\n    setFieldStates(rest);\n  }, []);\n\n  const validateAll = useCallback(() => {\n    let allValid = true;\n\n    for (const [path, config] of Object.entries(fieldConfigs)) {\n      const result = validate(path, config);\n      if (!result.valid) {\n        allValid = false;\n      }\n    }\n\n    return allValid;\n  }, [fieldConfigs, validate]);\n\n  const value = useMemo<ValidationContextValue>(\n    () => ({\n      customFunctions,\n      // Getter returns the mutable ref so callers that read fieldStates\n      // synchronously after validateAll() see the latest values.\n      get fieldStates() {\n        return fieldStatesRef.current;\n      },\n      validate,\n      touch,\n      clear,\n      validateAll,\n      registerField,\n    }),\n    [\n      customFunctions,\n      // fieldStates (React state) stays in deps so the context value object\n      // is recreated on re-render, triggering downstream consumers.\n      fieldStates,\n      validate,\n      touch,\n      clear,\n      validateAll,\n      registerField,\n    ],\n  );\n\n  return (\n    <ValidationContext.Provider value={value}>\n      {children}\n    </ValidationContext.Provider>\n  );\n}\n\n/**\n * Hook to access validation context\n */\nexport function useValidation(): ValidationContextValue {\n  const ctx = useContext(ValidationContext);\n  if (!ctx) {\n    throw new Error(\"useValidation must be used within a ValidationProvider\");\n  }\n  return ctx;\n}\n\n/**\n * Non-throwing variant of useValidation.\n * Returns null when no ValidationProvider is present.\n */\nexport function useOptionalValidation(): ValidationContextValue | null {\n  return useContext(ValidationContext);\n}\n\n/**\n * Hook to get validation state for a field\n */\nexport function useFieldValidation(\n  path: string,\n  config?: ValidationConfig,\n): {\n  state: FieldValidationState;\n  validate: () => ValidationResult;\n  touch: () => void;\n  clear: () => void;\n  errors: string[];\n  isValid: boolean;\n} {\n  const {\n    fieldStates,\n    validate: validateField,\n    touch: touchField,\n    clear: clearField,\n    registerField,\n  } = useValidation();\n\n  // Register field on mount\n  React.useEffect(() => {\n    if (path && config) {\n      registerField(path, config);\n    }\n  }, [path, config, registerField]);\n\n  const state = fieldStates[path] ?? {\n    touched: false,\n    validated: false,\n    result: null,\n  };\n\n  const validate = useCallback(\n    () => validateField(path, config ?? { checks: [] }),\n    [path, config, validateField],\n  );\n\n  const touch = useCallback(() => touchField(path), [path, touchField]);\n  const clear = useCallback(() => clearField(path), [path, clearField]);\n\n  return {\n    state,\n    validate,\n    touch,\n    clear,\n    errors: state.result?.errors ?? [],\n    isValid: state.result?.valid ?? true,\n  };\n}\n","\"use client\";\n\nimport React, { createContext, useContext, type ReactNode } from \"react\";\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 RepeatScopeContext = createContext<RepeatScopeValue | null>(null);\n\n/**\n * Provides repeat scope to child elements so $item and $index expressions resolve correctly.\n */\nexport function RepeatScopeProvider({\n  item,\n  index,\n  basePath,\n  children,\n}: RepeatScopeValue & { children: ReactNode }) {\n  return (\n    <RepeatScopeContext.Provider value={{ item, index, basePath }}>\n      {children}\n    </RepeatScopeContext.Provider>\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 useContext(RepeatScopeContext);\n}\n","// Contexts\nexport {\n  StateProvider,\n  useStateStore,\n  useStateValue,\n  useStateBinding,\n  type StateContextValue,\n  type StateProviderProps,\n} from \"./contexts/state\";\n\nexport {\n  VisibilityProvider,\n  useVisibility,\n  useIsVisible,\n  type VisibilityContextValue,\n  type VisibilityProviderProps,\n} from \"./contexts/visibility\";\n\nexport {\n  ActionProvider,\n  useActions,\n  useAction,\n  ConfirmDialog,\n  type ActionContextValue,\n  type ActionProviderProps,\n  type PendingConfirmation,\n  type ConfirmDialogProps,\n} from \"./contexts/actions\";\n\nexport {\n  ValidationProvider,\n  useValidation,\n  useOptionalValidation,\n  useFieldValidation,\n  type ValidationContextValue,\n  type ValidationProviderProps,\n  type FieldValidationState,\n} from \"./contexts/validation\";\n\nexport {\n  RepeatScopeProvider,\n  useRepeatScope,\n  type RepeatScopeValue,\n} from \"./contexts/repeat-scope\";\n\n// Schema (React's spec format)\nexport {\n  schema,\n  type ReactSchema,\n  type ReactSpec,\n  // Backward compatibility\n  elementTreeSchema,\n  type ElementTreeSchema,\n  type ElementTreeSpec,\n} from \"./schema\";\n\n// Core types (re-exported for convenience)\nexport type { Spec, StateStore } from \"@json-render/core\";\nexport { createStateStore } from \"@json-render/core\";\n\n// Catalog-aware types for React\nexport type {\n  EventHandle,\n  BaseComponentProps,\n  SetState,\n  StateModel,\n  ComponentContext,\n  ComponentFn,\n  Components,\n  ActionFn,\n  Actions,\n} from \"./catalog-types\";\n\n// Renderer\nexport {\n  // Registry\n  defineRegistry,\n  type DefineRegistryResult,\n  // createRenderer (higher-level, includes providers)\n  createRenderer,\n  type CreateRendererProps,\n  type ComponentMap,\n  // Low-level\n  Renderer,\n  JSONUIProvider,\n  type ComponentRenderProps,\n  type ComponentRenderer,\n  type ComponentRegistry,\n  type RendererProps,\n  type JSONUIProviderProps,\n} from \"./renderer\";\n\n// Hooks\nexport {\n  useUIStream,\n  useChatUI,\n  useBoundProp,\n  flatToTree,\n  buildSpecFromParts,\n  getTextFromParts,\n  useJsonRenderMessage,\n  type UseUIStreamOptions,\n  type UseUIStreamReturn,\n  type UseChatUIOptions,\n  type UseChatUIReturn,\n  type ChatMessage,\n  type DataPart,\n  type TokenUsage,\n} from \"./hooks\";\n","\"use client\";\n\nimport React, {\n  type ComponentType,\n  type ErrorInfo,\n  type ReactNode,\n  useCallback,\n  useEffect,\n  useMemo,\n  useRef,\n} from \"react\";\nimport type {\n  UIElement,\n  Spec,\n  ActionBinding,\n  Catalog,\n  SchemaDefinition,\n  StateStore,\n  ComputedFunction,\n  DirectiveDefinition,\n  DirectiveRegistry,\n} from \"@json-render/core\";\nimport {\n  resolveElementProps,\n  resolveBindings,\n  resolveActionParam,\n  evaluateVisibility,\n  getByPath,\n  isDevtoolsActive,\n  subscribeDevtoolsActive,\n  createDirectiveRegistry,\n  type PropResolutionContext,\n  type VisibilityContext as CoreVisibilityContext,\n} from \"@json-render/core\";\nimport type {\n  Components,\n  Actions,\n  ActionFn,\n  SetState,\n  StateModel,\n  CatalogHasActions,\n  EventHandle,\n} from \"./catalog-types\";\nimport { useIsVisible, useVisibility } from \"./contexts/visibility\";\nimport { useActions } from \"./contexts/actions\";\nimport { useStateStore } from \"./contexts/state\";\nimport { StateProvider } from \"./contexts/state\";\nimport { VisibilityProvider } from \"./contexts/visibility\";\nimport { ActionProvider } from \"./contexts/actions\";\nimport { ValidationProvider } from \"./contexts/validation\";\nimport { ConfirmDialog } from \"./contexts/actions\";\nimport { RepeatScopeProvider, useRepeatScope } from \"./contexts/repeat-scope\";\n\n/**\n * Props passed to component renderers\n */\nexport interface ComponentRenderProps<P = Record<string, unknown>> {\n  /** The element being rendered */\n  element: UIElement<string, P>;\n  /** Rendered children */\n  children?: ReactNode;\n  /** Emit a named event. The renderer resolves the event to action binding(s) from the element's `on` field. Always provided by the renderer. */\n  emit: (event: string) => void;\n  /** Get an event handle with metadata (shouldPreventDefault, bound). Use when you need to inspect event bindings. */\n  on: (event: string) => EventHandle;\n  /**\n   * Two-way binding paths resolved from `$bindState` / `$bindItem` expressions.\n   * Maps prop name → absolute state path for write-back.\n   * Only present when at least one prop uses `{ $bindState: \"...\" }` or `{ $bindItem: \"...\" }`.\n   */\n  bindings?: Record<string, string>;\n  /** Whether the parent is loading */\n  loading?: boolean;\n}\n\n/**\n * Component renderer type\n */\nexport type ComponentRenderer<P = Record<string, unknown>> = ComponentType<\n  ComponentRenderProps<P>\n>;\n\n/**\n * Registry of component renderers\n */\nexport type ComponentRegistry = Record<string, ComponentRenderer<any>>;\n\n/**\n * Props for the Renderer component\n */\nexport interface RendererProps {\n  /** The UI spec to render */\n  spec: Spec | null;\n  /** Component registry */\n  registry: ComponentRegistry;\n  /** Whether the spec is currently loading/streaming */\n  loading?: boolean;\n  /** Fallback component for unknown types */\n  fallback?: ComponentRenderer;\n}\n\n// ---------------------------------------------------------------------------\n// ElementErrorBoundary – catches rendering errors in individual elements so\n// a single bad component never crashes the whole page.\n// ---------------------------------------------------------------------------\n\ninterface ElementErrorBoundaryProps {\n  elementType: string;\n  children: ReactNode;\n}\n\ninterface ElementErrorBoundaryState {\n  hasError: boolean;\n}\n\nclass ElementErrorBoundary extends React.Component<\n  ElementErrorBoundaryProps,\n  ElementErrorBoundaryState\n> {\n  constructor(props: ElementErrorBoundaryProps) {\n    super(props);\n    this.state = { hasError: false };\n  }\n\n  static getDerivedStateFromError(): ElementErrorBoundaryState {\n    return { hasError: true };\n  }\n\n  componentDidCatch(error: Error, info: ErrorInfo) {\n    console.error(\n      `[json-render] Rendering error in <${this.props.elementType}>:`,\n      error,\n      info.componentStack,\n    );\n  }\n\n  render() {\n    if (this.state.hasError) {\n      // Render nothing – the element silently disappears rather than\n      // crashing the entire application.\n      return null;\n    }\n    return this.props.children;\n  }\n}\n\n// ---------------------------------------------------------------------------\n// FunctionsContext – provides $computed functions to the element tree\n// ---------------------------------------------------------------------------\n\nconst EMPTY_FUNCTIONS: Record<string, ComputedFunction> = {};\n\nconst FunctionsContext =\n  React.createContext<Record<string, ComputedFunction>>(EMPTY_FUNCTIONS);\n\nfunction useFunctions(): Record<string, ComputedFunction> {\n  return React.useContext(FunctionsContext);\n}\n\n// ---------------------------------------------------------------------------\n// DirectivesContext – provides custom directive registry to the element tree\n// ---------------------------------------------------------------------------\n\nconst DirectivesContext = React.createContext<DirectiveRegistry | undefined>(\n  undefined,\n);\n\nfunction useDirectives(): DirectiveRegistry | undefined {\n  return React.useContext(DirectivesContext);\n}\n\ninterface ElementRendererProps {\n  element: UIElement;\n  /** Spec key for this element. Used by the devtools picker. */\n  elementKey?: string;\n  spec: Spec;\n  registry: ComponentRegistry;\n  loading?: boolean;\n  fallback?: ComponentRenderer;\n}\n\n/**\n * Subscribe to whether any devtools is mounted so the renderer can add a\n * `data-jr-key` wrapper for the picker. Trivially cheap when inactive.\n */\nfunction useDevtoolsActive(): boolean {\n  return React.useSyncExternalStore(\n    subscribeDevtoolsActive,\n    isDevtoolsActive,\n    () => false,\n  );\n}\n\n/**\n * Element renderer component.\n * Memoized to prevent re-rendering all repeat children when state changes.\n */\nconst ElementRenderer = React.memo(function ElementRenderer({\n  element,\n  elementKey,\n  spec,\n  registry,\n  loading,\n  fallback,\n}: ElementRendererProps) {\n  const devtoolsActive = useDevtoolsActive();\n  const repeatScope = useRepeatScope();\n  const { ctx } = 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: PropResolutionContext = useMemo(() => {\n    const base: PropResolutionContext = repeatScope\n      ? {\n          ...ctx,\n          repeatItem: repeatScope.item,\n          repeatIndex: repeatScope.index,\n          repeatBasePath: repeatScope.basePath,\n        }\n      : { ...ctx };\n    base.functions = functions;\n    base.directives = directives;\n    return base;\n  }, [ctx, repeatScope, functions, directives]);\n\n  // Evaluate visibility (now supports $item/$index inside repeat scopes)\n  const isVisible =\n    element.visible === undefined\n      ? true\n      : evaluateVisibility(element.visible, fullCtx);\n\n  // Create emit function that resolves events to action bindings.\n  // Must be called before any early return to satisfy Rules of Hooks.\n  const onBindings = element.on;\n  const emit = useCallback(\n    async (eventName: string) => {\n      const binding = onBindings?.[eventName];\n      if (!binding) return;\n      const actionBindings = Array.isArray(binding) ? binding : [binding];\n      for (const b of actionBindings) {\n        if (!b.params) {\n          await execute(b);\n          continue;\n        }\n        // Build a fresh context with live store state so that $state\n        // references in later actions see mutations from earlier ones.\n        const liveCtx: PropResolutionContext = {\n          ...fullCtx,\n          stateModel: getSnapshot(),\n        };\n        const resolved: Record<string, unknown> = {};\n        for (const [key, val] of Object.entries(b.params)) {\n          resolved[key] = resolveActionParam(val, liveCtx);\n        }\n        await execute({ ...b, params: resolved });\n      }\n    },\n    [onBindings, execute, fullCtx, getSnapshot],\n  );\n\n  // Create on() function that returns an EventHandle with metadata for a specific event.\n  const on = useCallback(\n    (eventName: string): EventHandle => {\n      const binding = onBindings?.[eventName];\n      if (!binding) {\n        return { emit: () => {}, shouldPreventDefault: false, bound: false };\n      }\n      const actionBindings = Array.isArray(binding) ? binding : [binding];\n      const shouldPreventDefault = actionBindings.some((b) => b.preventDefault);\n      return {\n        emit: () => emit(eventName),\n        shouldPreventDefault,\n        bound: true,\n      };\n    },\n    [onBindings, emit],\n  );\n\n  // Watch effect: fire actions when watched state paths change.\n  // Must be called before any early return to satisfy Rules of Hooks.\n  //\n  // Two refs serve distinct roles:\n  // - `stableWatchRef` (useMemo): holds the last emitted values object so we\n  //   can return the same reference when watched values haven't changed,\n  //   preventing the downstream useEffect from firing on unrelated state updates.\n  // - `prevWatchValues` (useEffect): tracks the previous watched-values snapshot\n  //   for change detection. Starts as `null` to skip the initial mount.\n  const watchConfig = element.watch;\n  const prevWatchValues = useRef<Record<string, unknown> | null>(null);\n  const stableWatchRef = useRef<Record<string, unknown> | undefined>(undefined);\n\n  const watchedValues = useMemo(() => {\n    if (!watchConfig) return undefined;\n    const values: Record<string, unknown> = {};\n    for (const path of Object.keys(watchConfig)) {\n      values[path] = getByPath(watchState, path);\n    }\n    const prev = stableWatchRef.current;\n    if (prev) {\n      const keys = Object.keys(values);\n      if (\n        keys.length === Object.keys(prev).length &&\n        keys.every((k) => values[k] === prev[k])\n      ) {\n        return prev;\n      }\n    }\n    stableWatchRef.current = values;\n    return values;\n  }, [watchConfig, watchState]);\n\n  useEffect(() => {\n    if (!watchConfig || !watchedValues) return;\n    const paths = Object.keys(watchConfig);\n    if (paths.length === 0) return;\n\n    const prev = prevWatchValues.current;\n    prevWatchValues.current = watchedValues;\n\n    // Skip the initial mount — only fire on changes\n    if (prev === null) return;\n\n    let cancelled = false;\n    void (async () => {\n      for (const path of paths) {\n        if (cancelled) break;\n        if (watchedValues[path] !== prev[path]) {\n          const binding = watchConfig[path];\n          if (!binding) continue;\n          const bindings = Array.isArray(binding) ? binding : [binding];\n          for (const b of bindings) {\n            if (cancelled) break;\n            if (!b.params) {\n              await execute(b);\n              if (cancelled) break;\n              continue;\n            }\n            const liveCtx: PropResolutionContext = {\n              ...fullCtx,\n              stateModel: getSnapshot(),\n            };\n            const resolved: Record<string, unknown> = {};\n            for (const [key, val] of Object.entries(b.params)) {\n              resolved[key] = resolveActionParam(val, liveCtx);\n            }\n            await execute({ ...b, params: resolved });\n            if (cancelled) break;\n          }\n        }\n      }\n    })().catch(console.error);\n\n    return () => {\n      cancelled = true;\n    };\n  }, [watchConfig, watchedValues, execute, fullCtx, getSnapshot]);\n\n  // Don't render if not visible\n  if (!isVisible) {\n    return null;\n  }\n\n  // Resolve $bindState/$bindItem expressions → bindings map (prop name → state path)\n  const rawProps = element.props as Record<string, unknown>;\n  const elementBindings = resolveBindings(rawProps, fullCtx);\n\n  // Resolve dynamic prop expressions ($state, $item, $index, $bindState, $bindItem, $cond/$then/$else)\n  const resolvedProps = resolveElementProps(rawProps, fullCtx);\n\n  const resolvedElement =\n    resolvedProps !== element.props\n      ? { ...element, props: resolvedProps }\n      : element;\n\n  // Get the component renderer\n  const Component = registry[resolvedElement.type] ?? fallback;\n\n  if (!Component) {\n    console.warn(`No renderer for component type: ${resolvedElement.type}`);\n    return null;\n  }\n\n  // ---- Render children (with repeat support) ----\n  const children = resolvedElement.repeat ? (\n    <RepeatChildren\n      element={resolvedElement}\n      spec={spec}\n      registry={registry}\n      loading={loading}\n      fallback={fallback}\n    />\n  ) : (\n    resolvedElement.children?.map((childKey) => {\n      const childElement = spec.elements[childKey];\n      if (!childElement) {\n        if (!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 (\n        <ElementRenderer\n          key={childKey}\n          element={childElement}\n          elementKey={childKey}\n          spec={spec}\n          registry={registry}\n          loading={loading}\n          fallback={fallback}\n        />\n      );\n    })\n  );\n\n  const rendered = (\n    <Component\n      element={resolvedElement}\n      emit={emit}\n      on={on}\n      bindings={elementBindings}\n      loading={loading}\n    >\n      {children}\n    </Component>\n  );\n\n  // When devtools is mounted, wrap each element in a transparent span so the\n  // picker can map DOM nodes back to spec keys. `display: contents` avoids\n  // most layout impact.\n  const tagged =\n    devtoolsActive && elementKey ? (\n      <span data-jr-key={elementKey} style={{ display: \"contents\" }}>\n        {rendered}\n      </span>\n    ) : (\n      rendered\n    );\n\n  return (\n    <ElementErrorBoundary elementType={resolvedElement.type}>\n      {tagged}\n    </ElementErrorBoundary>\n  );\n});\n\n// ---------------------------------------------------------------------------\n// RepeatChildren -- renders child elements once per item in a state array.\n// Used when an element has a `repeat` field.\n// ---------------------------------------------------------------------------\n\nfunction RepeatChildren({\n  element,\n  spec,\n  registry,\n  loading,\n  fallback,\n}: {\n  element: UIElement;\n  spec: Spec;\n  registry: ComponentRegistry;\n  loading?: boolean;\n  fallback?: ComponentRenderer;\n}) {\n  const { state } = useStateStore();\n  const repeat = element.repeat!;\n  const statePath = repeat.statePath;\n\n  const items = (getByPath(state, statePath) as unknown[] | undefined) ?? [];\n\n  return (\n    <>\n      {items.map((itemValue, index) => {\n        // Use a stable key: prefer key field, fall back to 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 (\n          <RepeatScopeProvider\n            key={key}\n            item={itemValue}\n            index={index}\n            basePath={`${statePath}/${index}`}\n          >\n            {element.children?.map((childKey) => {\n              const childElement = spec.elements[childKey];\n              if (!childElement) {\n                if (!loading) {\n                  console.warn(\n                    `[json-render] Missing element \"${childKey}\" referenced as child of \"${element.type}\" (repeat). This element will not render.`,\n                  );\n                }\n                return null;\n              }\n              return (\n                <ElementRenderer\n                  key={childKey}\n                  element={childElement}\n                  elementKey={childKey}\n                  spec={spec}\n                  registry={registry}\n                  loading={loading}\n                  fallback={fallback}\n                />\n              );\n            })}\n          </RepeatScopeProvider>\n        );\n      })}\n    </>\n  );\n}\n\n/**\n * Main renderer component\n */\nexport function Renderer({ spec, registry, loading, fallback }: RendererProps) {\n  if (!spec || !spec.root) {\n    return null;\n  }\n\n  const rootElement = spec.elements[spec.root];\n  if (!rootElement) {\n    return null;\n  }\n\n  return (\n    <ElementRenderer\n      element={rootElement}\n      elementKey={spec.root}\n      spec={spec}\n      registry={registry}\n      loading={loading}\n      fallback={fallback}\n    />\n  );\n}\n\n/**\n * Props for JSONUIProvider\n */\nexport interface JSONUIProviderProps {\n  /** Component registry */\n  registry: ComponentRegistry;\n  /**\n   * External store (controlled mode). When provided, `initialState` and\n   * `onStateChange` are ignored.\n   */\n  store?: StateStore;\n  /** Initial state model (uncontrolled mode) */\n  initialState?: Record<string, unknown>;\n  /** Action handlers */\n  handlers?: Record<\n    string,\n    (params: Record<string, unknown>) => Promise<unknown> | unknown\n  >;\n  /** Navigation function */\n  navigate?: (path: string) => void;\n  /** Custom validation functions */\n  validationFunctions?: Record<\n    string,\n    (value: unknown, args?: Record<string, unknown>) => boolean\n  >;\n  /** Named functions for `$computed` expressions in props */\n  functions?: Record<string, ComputedFunction>;\n  /** Custom directives for user-defined `$`-prefixed dynamic values */\n  directives?: DirectiveDefinition[];\n  /** Callback when state changes (uncontrolled mode) */\n  onStateChange?: (changes: Array<{ path: string; value: unknown }>) => void;\n  children: ReactNode;\n}\n\n/**\n * Combined provider for all JSONUI contexts\n */\nexport function JSONUIProvider({\n  registry,\n  store,\n  initialState,\n  handlers,\n  navigate,\n  validationFunctions,\n  functions,\n  directives,\n  onStateChange,\n  children,\n}: JSONUIProviderProps) {\n  const directiveRegistry = useMemo(\n    () => (directives ? createDirectiveRegistry(directives) : undefined),\n    [directives],\n  );\n  return (\n    <StateProvider\n      store={store}\n      initialState={initialState}\n      onStateChange={onStateChange}\n    >\n      <VisibilityProvider>\n        <ValidationProvider customFunctions={validationFunctions}>\n          <ActionProvider handlers={handlers} navigate={navigate}>\n            <FunctionsContext.Provider value={functions ?? EMPTY_FUNCTIONS}>\n              <DirectivesContext.Provider value={directiveRegistry}>\n                {children}\n                <ConfirmationDialogManager />\n              </DirectivesContext.Provider>\n            </FunctionsContext.Provider>\n          </ActionProvider>\n        </ValidationProvider>\n      </VisibilityProvider>\n    </StateProvider>\n  );\n}\n\n/**\n * Renders the confirmation dialog when needed\n */\nfunction ConfirmationDialogManager() {\n  const { pendingConfirmation, confirm, cancel } = useActions();\n\n  if (!pendingConfirmation?.action.confirm) {\n    return null;\n  }\n\n  return (\n    <ConfirmDialog\n      confirm={pendingConfirmation.action.confirm}\n      onConfirm={confirm}\n      onCancel={cancel}\n    />\n  );\n}\n\n// ============================================================================\n// defineRegistry\n// ============================================================================\n\n/**\n * Result returned by defineRegistry\n */\nexport interface DefineRegistryResult {\n  /** Component registry for `<Renderer registry={...} />` */\n  registry: ComponentRegistry;\n  /**\n   * Create ActionProvider-compatible handlers.\n   * Accepts getter functions so handlers always read the latest state/setState\n   * (e.g. from React refs).\n   */\n  handlers: (\n    getSetState: () => SetState | undefined,\n    getState: () => StateModel,\n  ) => Record<string, (params: Record<string, unknown>) => Promise<void>>;\n  /**\n   * Execute an action by name imperatively\n   * (for use outside the React tree, e.g. initial state loading).\n   */\n  executeAction: (\n    actionName: string,\n    params: Record<string, unknown> | undefined,\n    setState: SetState,\n    state?: StateModel,\n  ) => Promise<void>;\n}\n\n/**\n * Options for defineRegistry.\n *\n * When the catalog declares actions, the `actions` field is required.\n * When the catalog has no actions (or `actions: {}`), the field is optional.\n */\ntype DefineRegistryOptions<C extends Catalog> = {\n  components?: Components<C>;\n} & (CatalogHasActions<C> extends true\n  ? { actions: Actions<C> }\n  : { actions?: Actions<C> });\n\n/**\n * Create a registry from a catalog with components and/or actions.\n *\n * When the catalog declares actions, the `actions` field is required.\n *\n * @example\n * ```tsx\n * // Components only (catalog has no actions)\n * const { registry } = defineRegistry(catalog, {\n *   components: {\n *     Card: ({ props, children }) => (\n *       <div className=\"card\">{props.title}{children}</div>\n *     ),\n *   },\n * });\n *\n * // Both (catalog declares actions)\n * const { registry, handlers, executeAction } = defineRegistry(catalog, {\n *   components: { ... },\n *   actions: { ... },\n * });\n * ```\n */\nexport function defineRegistry<C extends Catalog>(\n  _catalog: C,\n  options: DefineRegistryOptions<C>,\n): DefineRegistryResult {\n  // Build component registry\n  const registry: ComponentRegistry = {};\n  if (options.components) {\n    for (const [name, componentFn] of Object.entries(options.components)) {\n      registry[name] = ({\n        element,\n        children,\n        emit,\n        on,\n        bindings,\n        loading,\n      }: ComponentRenderProps) => {\n        return (componentFn as DefineRegistryComponentFn)({\n          props: element.props,\n          children,\n          emit,\n          on,\n          bindings,\n          loading,\n        });\n      };\n    }\n  }\n\n  // Build action helpers\n  const actionMap = options.actions\n    ? (Object.entries(options.actions) as Array<\n        [string, DefineRegistryActionFn]\n      >)\n    : [];\n\n  const handlers = (\n    getSetState: () => SetState | undefined,\n    getState: () => StateModel,\n  ): Record<string, (params: Record<string, unknown>) => Promise<void>> => {\n    const result: Record<\n      string,\n      (params: Record<string, unknown>) => Promise<void>\n    > = {};\n    for (const [name, actionFn] of actionMap) {\n      result[name] = async (params) => {\n        const setState = getSetState();\n        const state = getState();\n        if (setState) {\n          await actionFn(params, setState, state);\n        }\n      };\n    }\n    return result;\n  };\n\n  const executeAction = async (\n    actionName: string,\n    params: Record<string, unknown> | undefined,\n    setState: SetState,\n    state: StateModel = {},\n  ): Promise<void> => {\n    const entry = actionMap.find(([name]) => name === actionName);\n    if (entry) {\n      await entry[1](params, setState, state);\n    } else {\n      console.warn(`Unknown action: ${actionName}`);\n    }\n  };\n\n  return { registry, handlers, executeAction };\n}\n\n/** @internal */\ntype DefineRegistryComponentFn = (ctx: {\n  props: unknown;\n  children?: React.ReactNode;\n  emit: (event: string) => void;\n  on: (event: string) => EventHandle;\n  bindings?: Record<string, string>;\n  loading?: boolean;\n}) => React.ReactNode;\n\n/** @internal */\ntype DefineRegistryActionFn = (\n  params: Record<string, unknown> | undefined,\n  setState: SetState,\n  state: StateModel,\n) => Promise<void>;\n\n// ============================================================================\n// NEW API\n// ============================================================================\n\n/**\n * Props for renderers created with createRenderer\n */\nexport interface CreateRendererProps {\n  /** The spec to render (AI-generated JSON) */\n  spec: Spec | null;\n  /**\n   * External store (controlled mode). When provided, `state` and\n   * `onStateChange` are ignored.\n   */\n  store?: StateStore;\n  /** State context for dynamic values (uncontrolled mode) */\n  state?: Record<string, unknown>;\n  /** Action handler */\n  onAction?: (actionName: string, params?: Record<string, unknown>) => void;\n  /** Callback when state changes (uncontrolled mode) */\n  onStateChange?: (changes: Array<{ path: string; value: unknown }>) => void;\n  /** Named functions for `$computed` expressions in props */\n  functions?: Record<string, ComputedFunction>;\n  /** Custom directives for user-defined `$`-prefixed dynamic values */\n  directives?: DirectiveDefinition[];\n  /** Whether the spec is currently loading/streaming */\n  loading?: boolean;\n  /** Fallback component for unknown types */\n  fallback?: ComponentRenderer;\n}\n\n/**\n * Component map type - maps component names to React components\n */\nexport type ComponentMap<\n  TComponents extends Record<string, { props: unknown }>,\n> = {\n  [K in keyof TComponents]: ComponentType<\n    ComponentRenderProps<\n      TComponents[K][\"props\"] extends { _output: infer O }\n        ? O\n        : Record<string, unknown>\n    >\n  >;\n};\n\n/**\n * Create a renderer from a catalog\n *\n * @example\n * ```typescript\n * const DashboardRenderer = createRenderer(dashboardCatalog, {\n *   Card: ({ element, children }) => <div className=\"card\">{children}</div>,\n *   Metric: ({ element }) => <span>{element.props.value}</span>,\n * });\n *\n * // Usage\n * <DashboardRenderer spec={aiGeneratedSpec} state={state} />\n * ```\n */\nexport function createRenderer<\n  TDef extends SchemaDefinition,\n  TCatalog extends { components: Record<string, { props: unknown }> },\n>(\n  catalog: Catalog<TDef, TCatalog>,\n  components: ComponentMap<TCatalog[\"components\"]>,\n): ComponentType<CreateRendererProps> {\n  // Convert component map to registry\n  const registry: ComponentRegistry =\n    components as unknown as ComponentRegistry;\n\n  // Return the renderer component\n  return function CatalogRenderer({\n    spec,\n    store,\n    state,\n    onAction,\n    onStateChange,\n    functions,\n    directives,\n    loading,\n    fallback,\n  }: CreateRendererProps) {\n    const directiveRegistry = useMemo(\n      () => (directives ? createDirectiveRegistry(directives) : undefined),\n      [directives],\n    );\n\n    // Wrap onAction with a Proxy so any action name routes to the callback\n    const actionHandlers = 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                onAction(prop, params);\n            },\n            has: () => true,\n          },\n        )\n      : undefined;\n\n    return (\n      <StateProvider\n        store={store}\n        initialState={state}\n        onStateChange={onStateChange}\n      >\n        <VisibilityProvider>\n          <ValidationProvider>\n            <ActionProvider handlers={actionHandlers}>\n              <FunctionsContext.Provider value={functions ?? EMPTY_FUNCTIONS}>\n                <DirectivesContext.Provider value={directiveRegistry}>\n                  <Renderer\n                    spec={spec}\n                    registry={registry}\n                    loading={loading}\n                    fallback={fallback}\n                  />\n                  <ConfirmationDialogManager />\n                </DirectivesContext.Provider>\n              </FunctionsContext.Provider>\n            </ActionProvider>\n          </ValidationProvider>\n        </VisibilityProvider>\n      </StateProvider>\n    );\n  };\n}\n","\"use client\";\n\nimport { useState, useCallback, useRef, useEffect } from \"react\";\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: Spec | null;\n  /** Whether currently streaming */\n  isStreaming: boolean;\n  /** Error if any */\n  error: Error | null;\n  /** Token usage from the last generation */\n  usage: TokenUsage | null;\n  /** Raw JSONL lines received from the stream (JSON patch lines) */\n  rawLines: string[];\n  /** Send a prompt to generate UI */\n  send: (prompt: string, context?: Record<string, unknown>) => Promise<void>;\n  /** Clear the current spec */\n  clear: () => void;\n}\n\n/**\n * Hook for streaming UI generation\n */\nexport function useUIStream({\n  api,\n  onComplete,\n  onError,\n}: UseUIStreamOptions): UseUIStreamReturn {\n  const [spec, setSpec] = useState<Spec | null>(null);\n  const [isStreaming, setIsStreaming] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n  const [usage, setUsage] = useState<TokenUsage | null>(null);\n  const [rawLines, setRawLines] = useState<string[]>([]);\n  const abortControllerRef = useRef<AbortController | null>(null);\n\n  // Keep refs to callbacks so `send` doesn't recreate when consumers\n  // pass inline arrow functions.\n  const onCompleteRef = useRef(onComplete);\n  onCompleteRef.current = onComplete;\n  const onErrorRef = useRef(onError);\n  onErrorRef.current = onError;\n\n  const clear = useCallback(() => {\n    setSpec(null);\n    setError(null);\n  }, []);\n\n  const send = useCallback(\n    async (prompt: string, context?: Record<string, unknown>) => {\n      // Abort any existing request\n      abortControllerRef.current?.abort();\n      abortControllerRef.current = new AbortController();\n\n      setIsStreaming(true);\n      setError(null);\n      setUsage(null);\n      setRawLines([]);\n\n      // Start with previous spec if provided, otherwise empty spec\n      const previousSpec = context?.previousSpec as Spec | undefined;\n      let currentSpec: Spec =\n        previousSpec && previousSpec.root\n          ? { ...previousSpec, elements: { ...previousSpec.elements } }\n          : { root: \"\", elements: {} };\n      setSpec(currentSpec);\n\n      try {\n        const response = await fetch(api, {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application/json\" },\n          body: JSON.stringify({\n            prompt,\n            context,\n            currentSpec,\n          }),\n          signal: abortControllerRef.current.signal,\n        });\n\n        if (!response.ok) {\n          // Try to parse JSON error response for better error messages\n          let errorMessage = `HTTP error: ${response.status}`;\n          try {\n            const errorData = await response.json();\n            if (errorData.message) {\n              errorMessage = errorData.message;\n            } else if (errorData.error) {\n              errorMessage = errorData.error;\n            }\n          } catch {\n            // Ignore JSON parsing errors, use default message\n          }\n          throw new Error(errorMessage);\n        }\n\n        const reader = response.body?.getReader();\n        if (!reader) {\n          throw new Error(\"No response body\");\n        }\n\n        const decoder = new TextDecoder();\n        let buffer = \"\";\n\n        while (true) {\n          const { done, value } = await reader.read();\n          if (done) break;\n\n          buffer += decoder.decode(value, { stream: true });\n\n          // Process complete lines\n          const lines = buffer.split(\"\\n\");\n          buffer = lines.pop() ?? \"\";\n\n          for (const line of lines) {\n            const trimmed = line.trim();\n            if (!trimmed) continue;\n            const result = parseLine(trimmed);\n            if (!result) continue;\n            if (result.type === \"usage\") {\n              setUsage(result.usage);\n            } else {\n              setRawLines((prev) => [...prev, trimmed]);\n              currentSpec = applyPatch(currentSpec, result.patch);\n              setSpec({ ...currentSpec });\n            }\n          }\n        }\n\n        // Process any remaining buffer\n        if (buffer.trim()) {\n          const trimmed = buffer.trim();\n          const result = parseLine(trimmed);\n          if (result) {\n            if (result.type === \"usage\") {\n              setUsage(result.usage);\n            } else {\n              setRawLines((prev) => [...prev, trimmed]);\n              currentSpec = applyPatch(currentSpec, result.patch);\n              setSpec({ ...currentSpec });\n            }\n          }\n        }\n\n        onCompleteRef.current?.(currentSpec);\n      } catch (err) {\n        if ((err as Error).name === \"AbortError\") {\n          return;\n        }\n        const error = err instanceof Error ? err : new Error(String(err));\n        setError(error);\n        onErrorRef.current?.(error);\n      } finally {\n        setIsStreaming(false);\n      }\n    },\n    [api],\n  );\n\n  // Cleanup on unmount\n  useEffect(() => {\n    return () => {\n      abortControllerRef.current?.abort();\n    };\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 * Hook for two-way bound props. Returns `[value, setValue]` where:\n *\n * - `value` is the already-resolved prop value (passed through from render props)\n * - `setValue` writes back to the bound state path (no-op if not bound)\n *\n * Designed to work with the `bindings` map that the renderer provides when\n * a prop uses `{ $bindState: \"/path\" }` or `{ $bindItem: \"field\" }`.\n *\n * @example\n * ```tsx\n * import { useBoundProp } from \"@json-render/react\";\n *\n * const Input: ComponentRenderer = ({ props, bindings }) => {\n *   const [value, setValue] = useBoundProp<string>(props.value, bindings?.value);\n *   return <input value={value ?? \"\"} onChange={(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  // Import useStateStore lazily to avoid circular dependency issues.\n  // The hook is always called inside a StateProvider so this is safe.\n  const { set } = useStateStoreFromContext();\n  const setValue = useCallback(\n    (value: T) => {\n      if (bindingPath) set(bindingPath, value);\n    },\n    [bindingPath, set],\n  );\n  return [propValue, setValue];\n}\n\n// Re-export useStateStore access for useBoundProp without circular import\nimport { useStateStore as useStateStoreFromContext } from \"./contexts/state\";\n\n// =============================================================================\n// buildSpecFromParts — Derive Spec from AI SDK data parts\n// =============================================================================\n\n/**\n * A single part from the AI SDK's `message.parts` array. This is a minimal\n * structural type so that library helpers do not depend on the AI SDK.\n * Fields are optional because different part types carry different data:\n * - Text parts have `text`\n * - Data parts have `data`\n */\nexport interface DataPart {\n  type: string;\n  text?: string;\n  data?: unknown;\n}\n\n/**\n * Build a `Spec` by replaying all spec data parts from a message's\n * parts array. Returns `null` if no spec data parts are present.\n *\n * This function is designed to work with the AI SDK's `UIMessage.parts` array.\n * It picks out parts whose `type` is {@link SPEC_DATA_PART_TYPE} and processes them based\n * on the payload's `type` discriminator:\n *\n * - `\"patch\"`: Applies the JSON Patch operation incrementally via `applySpecPatch`.\n * - `\"flat\"`: Replaces the spec with the complete flat spec.\n * - `\"nested\"`: Assigns the nested spec directly (future: nested-to-flat conversion).\n *\n * The function has no AI SDK dependency — it operates on a generic array of\n * `{ type: string; data: unknown }` objects.\n *\n * @example\n * ```tsx\n * const spec = buildSpecFromParts(message.parts);\n * if (spec) {\n *   return <MyRenderer spec={spec} />;\n * }\n * ```\n */\n/**\n * Type guard that validates a data part payload looks like a valid\n * {@link SpecDataPart} before we cast it. Returns `false` (and the\n * part is silently skipped) for malformed payloads.\n */\nfunction isSpecDataPart(data: unknown): data is SpecDataPart {\n  if (typeof data !== \"object\" || data === null) return false;\n  const obj = data as Record<string, unknown>;\n  switch (obj.type) {\n    case \"patch\":\n      return typeof obj.patch === \"object\" && obj.patch !== null;\n    case \"flat\":\n    case \"nested\":\n      return typeof obj.spec === \"object\" && obj.spec !== null;\n    default:\n      return false;\n  }\n}\n\nexport function buildSpecFromParts(parts: DataPart[]): Spec | null {\n  const spec: Spec = { root: \"\", elements: {} };\n  let hasSpec = false;\n\n  for (const part of parts) {\n    if (part.type === SPEC_DATA_PART_TYPE) {\n      if (!isSpecDataPart(part.data)) continue;\n      const payload = part.data;\n      if (payload.type === \"patch\") {\n        hasSpec = true;\n        applySpecPatch(spec, payload.patch);\n      } else if (payload.type === \"flat\") {\n        hasSpec = true;\n        Object.assign(spec, payload.spec);\n      } else if (payload.type === \"nested\") {\n        hasSpec = true;\n        const flat = nestedToFlat(payload.spec);\n        Object.assign(spec, flat);\n      }\n    }\n  }\n\n  return hasSpec ? spec : null;\n}\n\n/**\n * Extract and join all text content from a message's parts array.\n *\n * Filters for parts with `type === \"text\"`, trims each one, and joins them\n * with double newlines so that text from separate agent steps renders as\n * distinct paragraphs in markdown.\n *\n * Has no AI SDK dependency — operates on a generic `DataPart[]`.\n *\n * @example\n * ```tsx\n * const text = getTextFromParts(message.parts);\n * if (text) {\n *   return <Streamdown>{text}</Streamdown>;\n * }\n * ```\n */\nexport function getTextFromParts(parts: DataPart[]): string {\n  return parts\n    .filter(\n      (p): p is DataPart & { text: string } =>\n        p.type === \"text\" && typeof p.text === \"string\",\n    )\n    .map((p) => p.text.trim())\n    .filter(Boolean)\n    .join(\"\\n\\n\");\n}\n\n// =============================================================================\n// useJsonRenderMessage — extract spec + text from message parts\n// =============================================================================\n\n/**\n * Hook that extracts both the json-render spec and text content from a\n * message's parts array. Combines `buildSpecFromParts` and `getTextFromParts`\n * into a single call with memoized results.\n *\n * **Memoization behavior:** Results are recomputed only when the `parts` array\n * reference changes **and** either the length differs or the last element is a\n * different object. This is optimized for the typical AI SDK streaming pattern\n * where parts are appended incrementally. Mid-array edits (e.g. replacing an\n * earlier part without appending) may not trigger recomputation. If you need to\n * force a recompute after such edits, pass a new array reference with a\n * different last element.\n *\n * @example\n * ```tsx\n * import { useJsonRenderMessage } from \"@json-render/react\";\n *\n * function MessageBubble({ message }) {\n *   const { spec, text, hasSpec } = useJsonRenderMessage(message.parts);\n *\n *   return (\n *     <div>\n *       {text && <Markdown>{text}</Markdown>}\n *       {hasSpec && <MyRenderer spec={spec} />}\n *     </div>\n *   );\n * }\n * ```\n */\nexport function useJsonRenderMessage(parts: DataPart[]) {\n  const prevPartsRef = useRef<DataPart[]>([]);\n  const prevResultRef = useRef<{ spec: Spec | null; text: string }>({\n    spec: null,\n    text: \"\",\n  });\n\n  // Recompute only when parts actually change (by length + last element identity).\n  // AI SDK typically appends to the parts array during streaming, so checking\n  // length and the last element covers both \"new array reference with same\n  // content\" (no recompute) and \"new part appended\" (recompute).\n  const partsChanged =\n    parts !== prevPartsRef.current &&\n    (parts.length !== prevPartsRef.current.length ||\n      parts[parts.length - 1] !==\n        prevPartsRef.current[prevPartsRef.current.length - 1]);\n\n  if (partsChanged || prevPartsRef.current.length === 0) {\n    prevPartsRef.current = parts;\n    prevResultRef.current = {\n      spec: buildSpecFromParts(parts),\n      text: getTextFromParts(parts),\n    };\n  }\n\n  const { spec, text } = prevResultRef.current;\n  const hasSpec = spec !== null && Object.keys(spec.elements || {}).length > 0;\n  return { spec, text, hasSpec };\n}\n\n// =============================================================================\n// useChatUI — Chat + GenUI hook\n// =============================================================================\n\n/**\n * A single message in the chat, which may contain text, a rendered UI spec, or both.\n */\nexport interface ChatMessage {\n  /** Unique message ID */\n  id: string;\n  /** Who sent this message */\n  role: \"user\" | \"assistant\";\n  /** Text content (conversational prose) */\n  text: string;\n  /** json-render Spec built from JSONL patches (null if no UI was generated) */\n  spec: Spec | null;\n}\n\n/**\n * Options for useChatUI\n */\nexport interface UseChatUIOptions {\n  /** API endpoint that accepts `{ messages: Array<{ role, content }> }` and returns a text stream */\n  api: string;\n  /** Callback when streaming completes for a message */\n  onComplete?: (message: ChatMessage) => void;\n  /** Callback on error */\n  onError?: (error: Error) => void;\n}\n\n/**\n * Return type for useChatUI\n */\nexport interface UseChatUIReturn {\n  /** All messages in the conversation */\n  messages: ChatMessage[];\n  /** Whether currently streaming an assistant response */\n  isStreaming: boolean;\n  /** Error from the last request, if any */\n  error: Error | null;\n  /** Send a user message */\n  send: (text: string) => Promise<void>;\n  /** Clear all messages and reset the conversation */\n  clear: () => void;\n}\n\nlet chatMessageIdCounter = 0;\nfunction generateChatId(): string {\n  if (\n    typeof crypto !== \"undefined\" &&\n    typeof crypto.randomUUID === \"function\"\n  ) {\n    return crypto.randomUUID();\n  }\n  chatMessageIdCounter += 1;\n  return `msg-${Date.now()}-${chatMessageIdCounter}`;\n}\n\n/**\n * Hook for chat + GenUI experiences.\n *\n * Manages a multi-turn conversation where each assistant message can contain\n * both conversational text and a json-render UI spec. The hook sends the full\n * message history to the API endpoint, reads the streamed response, and\n * separates text lines from JSONL patch lines using `createMixedStreamParser`.\n *\n * @example\n * ```tsx\n * const { messages, isStreaming, send, clear } = useChatUI({\n *   api: \"/api/chat\",\n * });\n *\n * // Send a message\n * await send(\"Compare weather in NYC and Tokyo\");\n *\n * // Render messages\n * {messages.map((msg) => (\n *   <div key={msg.id}>\n *     {msg.text && <p>{msg.text}</p>}\n *     {msg.spec && <MyRenderer spec={msg.spec} />}\n *   </div>\n * ))}\n * ```\n */\nexport function useChatUI({\n  api,\n  onComplete,\n  onError,\n}: UseChatUIOptions): UseChatUIReturn {\n  const [messages, setMessages] = useState<ChatMessage[]>([]);\n  const [isStreaming, setIsStreaming] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n  const abortControllerRef = useRef<AbortController | null>(null);\n  // Keep a ref to the latest messages so `send` always reads the\n  // current history, avoiding stale closure issues.\n  const messagesRef = useRef(messages);\n  messagesRef.current = messages;\n  // Keep refs to callbacks so `send` doesn't recreate when consumers\n  // pass inline arrow functions.\n  const onCompleteRef = useRef(onComplete);\n  onCompleteRef.current = onComplete;\n  const onErrorRef = useRef(onError);\n  onErrorRef.current = onError;\n\n  const clear = useCallback(() => {\n    setMessages([]);\n    setError(null);\n  }, []);\n\n  const send = useCallback(\n    async (text: string) => {\n      if (!text.trim()) return;\n\n      // Abort any existing request\n      abortControllerRef.current?.abort();\n      abortControllerRef.current = new AbortController();\n\n      const userMessage: ChatMessage = {\n        id: generateChatId(),\n        role: \"user\",\n        text: text.trim(),\n        spec: null,\n      };\n\n      const assistantId = generateChatId();\n      const assistantMessage: ChatMessage = {\n        id: assistantId,\n        role: \"assistant\",\n        text: \"\",\n        spec: null,\n      };\n\n      // Append user message and empty assistant placeholder\n      setMessages((prev) => [...prev, userMessage, assistantMessage]);\n      setIsStreaming(true);\n      setError(null);\n\n      // Build messages array for the API (full conversation history + new message).\n      // Read from ref to always get the latest messages (avoids stale closure).\n      const historyForApi = [\n        ...messagesRef.current.map((m) => ({\n          role: m.role,\n          content: m.text,\n        })),\n        { role: \"user\" as const, content: text.trim() },\n      ];\n\n      // Mutable state for accumulating the assistant response\n      let accumulatedText = \"\";\n      let currentSpec: Spec = { root: \"\", elements: {} };\n      let hasSpec = false;\n\n      try {\n        const response = await fetch(api, {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application/json\" },\n          body: JSON.stringify({ messages: historyForApi }),\n          signal: abortControllerRef.current.signal,\n        });\n\n        if (!response.ok) {\n          let errorMessage = `HTTP error: ${response.status}`;\n          try {\n            const errorData = await response.json();\n            if (errorData.message) {\n              errorMessage = errorData.message;\n            } else if (errorData.error) {\n              errorMessage = errorData.error;\n            }\n          } catch {\n            // Ignore JSON parsing errors\n          }\n          throw new Error(errorMessage);\n        }\n\n        const reader = response.body?.getReader();\n        if (!reader) {\n          throw new Error(\"No response body\");\n        }\n\n        const decoder = new TextDecoder();\n\n        // Use createMixedStreamParser to classify lines\n        const parser = createMixedStreamParser({\n          onPatch(patch) {\n            hasSpec = true;\n            applySpecPatch(currentSpec, patch);\n            setMessages((prev) =>\n              prev.map((m) =>\n                m.id === assistantId\n                  ? {\n                      ...m,\n                      spec: {\n                        root: currentSpec.root,\n                        elements: { ...currentSpec.elements },\n                        ...(currentSpec.state\n                          ? { state: { ...currentSpec.state } }\n                          : {}),\n                      },\n                    }\n                  : m,\n              ),\n            );\n          },\n          onText(line) {\n            accumulatedText += (accumulatedText ? \"\\n\" : \"\") + line;\n            setMessages((prev) =>\n              prev.map((m) =>\n                m.id === assistantId ? { ...m, text: accumulatedText } : m,\n              ),\n            );\n          },\n        });\n\n        while (true) {\n          const { done, value } = await reader.read();\n          if (done) break;\n          parser.push(decoder.decode(value, { stream: true }));\n        }\n        parser.flush();\n\n        // Build final message for onComplete callback\n        const finalMessage: ChatMessage = {\n          id: assistantId,\n          role: \"assistant\",\n          text: accumulatedText,\n          spec: hasSpec\n            ? {\n                root: currentSpec.root,\n                elements: { ...currentSpec.elements },\n                ...(currentSpec.state\n                  ? { state: { ...currentSpec.state } }\n                  : {}),\n              }\n            : null,\n        };\n        onCompleteRef.current?.(finalMessage);\n      } catch (err) {\n        if ((err as Error).name === \"AbortError\") {\n          return;\n        }\n        const resolvedError =\n          err instanceof Error ? err : new Error(String(err));\n        setError(resolvedError);\n        // Remove empty assistant message on error\n        setMessages((prev) =>\n          prev.filter((m) => m.id !== assistantId || m.text.length > 0),\n        );\n        onErrorRef.current?.(resolvedError);\n      } finally {\n        setIsStreaming(false);\n      }\n    },\n    [api],\n  );\n\n  // Cleanup on unmount\n  useEffect(() => {\n    return () => {\n      abortControllerRef.current?.abort();\n    };\n  }, []);\n\n  return {\n    messages,\n    isStreaming,\n    error,\n    send,\n    clear,\n  };\n}\n"],"mappings":"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","names":["value","createContext","useContext","useMemo","jsx","createContext","useMemo","useContext","createContext","useContext","useState","useCallback","useMemo","React","createContext","useContext","useRef","useCallback","useMemo","jsx","createContext","useRef","useCallback","value","useMemo","useContext","React","jsx","createContext","useState","useCallback","value","useMemo","useContext","executeAction","createContext","useContext","jsx","createStateStore","React","useCallback","useEffect","useMemo","useRef","evaluateVisibility","getByPath","jsx","jsxs","React","ElementRenderer","useMemo","evaluateVisibility","useCallback","useRef","getByPath","useEffect","executeAction","useState","useCallback","useRef","useEffect","getByPath","getByPath","useState","useRef","useCallback","error","useEffect"]}