{"version":3,"sources":["../../react-state/src/index.tsx","../src/contexts/visibility.tsx","../src/contexts/actions.tsx","../src/contexts/focus.tsx","../src/contexts/validation.tsx","../src/contexts/repeat-scope.tsx","../src/index.ts","../src/renderer.tsx","../src/components/standard.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","import 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","import {\n  createContext,\n  useContext,\n  useState,\n  useCallback,\n  useMemo,\n  useRef,\n  type ReactNode,\n} from \"react\";\nimport { Box, Text, useInput } from \"ink\";\nimport {\n  resolveAction,\n  executeAction,\n  type ActionBinding,\n  type ActionHandler,\n  type ActionConfirm,\n  type ResolvedAction,\n} from \"@json-render/core\";\nimport { useStateStore } from \"./state\";\nimport { useFocusDisable } from \"./focus\";\n\n/**\n * Generate a unique ID for use with the \"$id\" token.\n * Uses crypto.randomUUID when available, otherwise a timestamp + random suffix.\n * No module-level mutable counter — safe across multiple render trees.\n */\nfunction generateUniqueId(): string {\n  if (\n    typeof crypto !== \"undefined\" &&\n    typeof crypto.randomUUID === \"function\"\n  ) {\n    return crypto.randomUUID();\n  }\n  return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n}\n\nconst MAX_RESOLVE_DEPTH = 10;\n\n/**\n * Deep-resolve dynamic value references within an object.\n *\n * Supported tokens:\n * - `{ $state: \"/statePath\" }` - read a value from state\n * - `\"$id\"` (string) or `{ \"$id\": true }` - generate a unique ID\n */\nfunction deepResolveValue(\n  value: unknown,\n  get: (path: string) => unknown,\n  depth = 0,\n): unknown {\n  if (depth > MAX_RESOLVE_DEPTH) return value;\n  if (value === null || value === undefined) return value;\n\n  if (value === \"$id\") {\n    return generateUniqueId();\n  }\n\n  if (typeof value === \"object\" && !Array.isArray(value)) {\n    const obj = value as Record<string, unknown>;\n    const keys = Object.keys(obj);\n\n    if (keys.length === 1 && typeof obj.$state === \"string\") {\n      return get(obj.$state as string);\n    }\n\n    if (keys.length === 1 && \"$id\" in obj) {\n      return generateUniqueId();\n    }\n\n    const resolved: Record<string, unknown> = {};\n    for (const [key, val] of Object.entries(obj)) {\n      resolved[key] = deepResolveValue(val, get, depth + 1);\n    }\n    return resolved;\n  }\n\n  if (Array.isArray(value)) {\n    return value.map((item) => deepResolveValue(item, get, depth + 1));\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  /** Actions currently executing (count of in-flight executions per action name) */\n  loadingActions: Map<string, number>;\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}\n\nconst ActionContext = createContext<ActionContextValue | null>(null);\n\n/**\n * Props for ActionProvider\n */\nexport interface ActionProviderProps {\n  /** Action handlers (custom handlers override built-in actions) */\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  // Ref always holds the latest prop-based handlers (avoids stale closures\n  // when createRenderer creates a new Proxy each render).\n  const initialHandlersRef = useRef(initialHandlers);\n  initialHandlersRef.current = initialHandlers;\n  const navigateRef = useRef(navigate);\n  navigateRef.current = navigate;\n  const [loadingActions, setLoadingActions] = useState<Map<string, number>>(\n    new Map(),\n  );\n  const [pendingConfirmation, setPendingConfirmation] =\n    useState<PendingConfirmation | null>(null);\n  // Ref tracks current pending confirmation so overlapping confirms can\n  // auto-reject the previous one without a stale closure.\n  const pendingRef = useRef<PendingConfirmation | null>(null);\n\n  const lookupHandler = useCallback(\n    (name: string): ActionHandler | undefined =>\n      initialHandlersRef.current[name],\n    [],\n  );\n\n  const execute = useCallback(\n    async (binding: ActionBinding) => {\n      const resolved = resolveAction(binding, getSnapshot());\n\n      // Check for custom handler override first — allows consumers to override\n      // built-in actions like setState, pushState, etc.\n      const customHandler = lookupHandler(resolved.action);\n\n      // Built-in: setState (overridable)\n      if (resolved.action === \"setState\" && !customHandler && 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 (overridable)\n      if (\n        resolved.action === \"pushState\" &&\n        !customHandler &&\n        resolved.params\n      ) {\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 raw = get(statePath);\n          const arr = Array.isArray(raw) ? raw : [];\n          set(statePath, [...arr, resolvedValue]);\n          const clearStatePath = resolved.params.clearStatePath as\n            | string\n            | undefined;\n          if (clearStatePath) {\n            set(clearStatePath, \"\");\n          }\n        }\n        return;\n      }\n\n      // Built-in: removeState (overridable)\n      if (\n        resolved.action === \"removeState\" &&\n        !customHandler &&\n        resolved.params\n      ) {\n        const statePath = resolved.params.statePath as string;\n        const index = resolved.params.index as number;\n        if (statePath !== undefined && index !== undefined) {\n          const raw = get(statePath);\n          if (!Array.isArray(raw)) return;\n          set(\n            statePath,\n            raw.filter((_, i) => i !== index),\n          );\n        }\n        return;\n      }\n\n      // Built-in: log (overridable)\n      if (resolved.action === \"log\" && !customHandler) {\n        const message =\n          resolved.params?.message ?? resolved.params?.value ?? \"\";\n        console.log(\"[json-render]\", message);\n        return;\n      }\n\n      // Built-in: exit (always delegates to handler if available)\n      if (resolved.action === \"exit\" && !customHandler) {\n        // No-op when no handler is provided\n        return;\n      }\n\n      const handler = customHandler;\n\n      if (!handler) {\n        console.warn(\n          `[json-render] No handler registered for action: ${resolved.action}`,\n        );\n        return;\n      }\n\n      // If confirmation is required, show dialog and wait for user response.\n      // Uses resolve(boolean) instead of reject() to avoid unhandled rejections.\n      if (resolved.confirm) {\n        // Auto-reject any existing pending confirmation so its promise resolves\n        // (prevents orphaned promises when a second confirm fires).\n        pendingRef.current?.reject();\n\n        const confirmed = await new Promise<boolean>((res) => {\n          const entry: PendingConfirmation = {\n            action: resolved,\n            handler,\n            resolve: () => {\n              pendingRef.current = null;\n              setPendingConfirmation(null);\n              res(true);\n            },\n            reject: () => {\n              pendingRef.current = null;\n              setPendingConfirmation(null);\n              res(false);\n            },\n          };\n          pendingRef.current = entry;\n          setPendingConfirmation(entry);\n        });\n\n        if (!confirmed) return;\n      }\n\n      const actionName = resolved.action;\n      setLoadingActions((prev) => {\n        const next = new Map(prev);\n        next.set(actionName, (next.get(actionName) ?? 0) + 1);\n        return next;\n      });\n      try {\n        await executeAction({\n          action: resolved,\n          handler,\n          setState: set,\n          navigate: navigateRef.current,\n          executeAction: async (binding) => {\n            await execute(binding);\n          },\n        });\n      } finally {\n        setLoadingActions((prev) => {\n          const next = new Map(prev);\n          const count = (next.get(actionName) ?? 1) - 1;\n          if (count <= 0) {\n            next.delete(actionName);\n          } else {\n            next.set(actionName, count);\n          }\n          return next;\n        });\n      }\n    },\n    [lookupHandler, get, set, getSnapshot],\n  );\n\n  // Use pendingRef for confirm/cancel to avoid stale closure issues\n  const confirm = useCallback(() => {\n    pendingRef.current?.resolve();\n  }, []);\n\n  const cancel = useCallback(() => {\n    pendingRef.current?.reject();\n  }, []);\n\n  const value = useMemo<ActionContextValue>(\n    () => ({\n      handlers: initialHandlers,\n      loadingActions,\n      pendingConfirmation,\n      execute,\n      confirm,\n      cancel,\n    }),\n    [\n      initialHandlers,\n      loadingActions,\n      pendingConfirmation,\n      execute,\n      confirm,\n      cancel,\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 for a single action binding — returns execute and loading state.\n */\nexport function useAction(binding: ActionBinding): {\n  execute: () => Promise<void>;\n  isLoading: boolean;\n} {\n  const { execute, loadingActions } = useActions();\n  const executeAction = useCallback(() => execute(binding), [execute, binding]);\n  const isLoading = (loadingActions.get(binding.action) ?? 0) > 0;\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 * Terminal confirmation dialog using Ink's Box/Text and useInput.\n * Press Y to confirm, N or Escape to cancel.\n */\nexport function ConfirmDialog({\n  confirm,\n  onConfirm,\n  onCancel,\n}: ConfirmDialogProps) {\n  const isDanger = confirm.variant === \"danger\";\n\n  // Suppress Tab cycling while modal is open\n  useFocusDisable(true);\n\n  // ConfirmDialog always captures input when mounted (it's modal)\n  useInput((input, key) => {\n    if (input.toLowerCase() === \"y\") {\n      onConfirm();\n    } else if (input.toLowerCase() === \"n\" || key.escape) {\n      onCancel();\n    }\n  });\n\n  return (\n    <Box\n      flexDirection=\"column\"\n      borderStyle=\"round\"\n      borderColor={isDanger ? \"red\" : \"blue\"}\n      paddingX={2}\n      paddingY={1}\n    >\n      <Text bold>{confirm.title}</Text>\n      <Text dimColor>{confirm.message}</Text>\n      <Box marginTop={1} gap={2}>\n        <Text>\n          <Text color={isDanger ? \"red\" : \"green\"} bold>\n            [Y]\n          </Text>{\" \"}\n          {confirm.confirmLabel ?? \"Confirm\"}\n        </Text>\n        <Text>\n          <Text bold>[N]</Text> {confirm.cancelLabel ?? \"Cancel\"}\n        </Text>\n      </Box>\n    </Box>\n  );\n}\n","import React, {\n  createContext,\n  useCallback,\n  useContext,\n  useEffect,\n  useId,\n  useMemo,\n  useReducer,\n  useState,\n} from \"react\";\nimport { useInput } from \"ink\";\n\n// =============================================================================\n// Focus context — tracks which interactive component receives keyboard input.\n// Tab/Shift+Tab cycles focus. useInput's `isActive` gates input delivery.\n// =============================================================================\n\ninterface FocusContextValue {\n  /** Register an interactive component by ID. */\n  register: (id: string) => void;\n  /** Unregister when unmounting. */\n  unregister: (id: string) => void;\n  /** The currently focused component's ID (or null). */\n  focusedId: string | null;\n  /** Check if a given ID is the focused component. */\n  isFocused: (id: string) => boolean;\n  /** Suppress Tab cycling (e.g. during modal dialogs). */\n  setDisabled: (disabled: boolean) => void;\n}\n\nconst FocusContext = createContext<FocusContextValue | null>(null);\n\n// Reducer state combines ids and focusedId for atomic updates.\ninterface FocusState {\n  ids: string[];\n  focusedId: string | null;\n}\n\ntype FocusAction =\n  | { type: \"register\"; id: string }\n  | { type: \"unregister\"; id: string }\n  | { type: \"cycle\"; direction: \"next\" | \"prev\" };\n\nfunction focusReducer(state: FocusState, action: FocusAction): FocusState {\n  switch (action.type) {\n    case \"register\": {\n      if (state.ids.includes(action.id)) return state;\n      const ids = [...state.ids, action.id];\n      // Auto-focus if first interactive component\n      const focusedId = state.focusedId ?? action.id;\n      return { ids, focusedId };\n    }\n    case \"unregister\": {\n      const ids = state.ids.filter((x) => x !== action.id);\n      let focusedId = state.focusedId;\n      if (focusedId === action.id) {\n        // Move focus to first remaining element, or null\n        focusedId = ids[0] ?? null;\n      }\n      return { ids, focusedId };\n    }\n    case \"cycle\": {\n      const { ids, focusedId } = state;\n      if (ids.length === 0) return { ...state, focusedId: null };\n      const idx = focusedId ? ids.indexOf(focusedId) : -1;\n      const next =\n        action.direction === \"next\"\n          ? ids[(idx + 1) % ids.length]!\n          : ids[(idx - 1 + ids.length) % ids.length]!;\n      return { ...state, focusedId: next };\n    }\n  }\n}\n\nexport function FocusProvider({ children }: { children: React.ReactNode }) {\n  const [state, dispatch] = useReducer(focusReducer, {\n    ids: [],\n    focusedId: null,\n  });\n  const [disableCount, setDisableCount] = useState(0);\n  const disabled = disableCount > 0;\n\n  // Counter-based disable: multiple concurrent callers (e.g. nested modals)\n  // each increment on mount and decrement on unmount. Focus is only re-enabled\n  // when all callers have released.\n  const setDisabled = useCallback((value: boolean) => {\n    setDisableCount((prev) => (value ? prev + 1 : Math.max(0, prev - 1)));\n  }, []);\n\n  const register = useCallback(\n    (id: string) => dispatch({ type: \"register\", id }),\n    [],\n  );\n\n  const unregister = useCallback(\n    (id: string) => dispatch({ type: \"unregister\", id }),\n    [],\n  );\n\n  // When disabled (e.g. modal dialog open), all components report isActive=false\n  // so their useInput({ isActive }) stops processing keystrokes.\n  const isFocused = useCallback(\n    (id: string) => !disabled && state.focusedId === id,\n    [state.focusedId, disabled],\n  );\n\n  // Tab / Shift+Tab to cycle focus (suppressed when disabled, e.g. during modals)\n  useInput((_input, key) => {\n    if (disabled) return;\n    if (!key.tab) return;\n    dispatch({ type: \"cycle\", direction: key.shift ? \"prev\" : \"next\" });\n  });\n\n  const value = useMemo(\n    () => ({\n      register,\n      unregister,\n      focusedId: state.focusedId,\n      isFocused,\n      setDisabled,\n    }),\n    [register, unregister, state.focusedId, isFocused, setDisabled],\n  );\n\n  return (\n    <FocusContext.Provider value={value}>{children}</FocusContext.Provider>\n  );\n}\n\n/**\n * Hook for interactive components. Registers on mount via useEffect,\n * unregisters on unmount. Returns `isActive` boolean for gating `useInput`.\n *\n * Uses React.useId() for stable, instance-scoped IDs (no module-level counters).\n */\nexport function useFocus(): { isActive: boolean; id: string } {\n  const ctx = useContext(FocusContext);\n  const id = useId();\n\n  useEffect(() => {\n    ctx?.register(id);\n    return () => {\n      ctx?.unregister(id);\n    };\n  }, [ctx, id]);\n\n  const isActive = ctx?.isFocused(id) ?? false;\n  return { isActive, id };\n}\n\n/**\n * Hook to suppress/restore Tab cycling.\n * Used by modal dialogs (e.g. ConfirmDialog) to prevent background focus changes.\n *\n * Tracks the disabled value at effect time via a ref to avoid double-decrement\n * when the `disabled` prop toggles from true to false.\n */\nexport function useFocusDisable(disabled: boolean): void {\n  const ctx = useContext(FocusContext);\n\n  useEffect(() => {\n    if (!disabled) return;\n    ctx?.setDisabled(true);\n    return () => {\n      ctx?.setDisabled(false);\n    };\n  }, [ctx, disabled]);\n}\n","import {\n  createContext,\n  useContext,\n  useState,\n  useCallback,\n  useEffect,\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  /** Unregister field (removes from validateAll and clears state) */\n  unregisterField: (path: string) => 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 */\nfunction dynamicArgsEqual(\n  a: Record<string, unknown> | undefined,\n  b: Record<string, unknown> | undefined,\n): boolean {\n  if (a === b) return true;\n  if (!a || !b) return false;\n\n  const keysA = Object.keys(a);\n  const keysB = Object.keys(b);\n  if (keysA.length !== keysB.length) return false;\n\n  for (const key of keysA) {\n    const va = a[key];\n    const vb = b[key];\n    if (va === vb) continue;\n    if (\n      typeof va === \"object\" &&\n      va !== null &&\n      typeof vb === \"object\" &&\n      vb !== null\n    ) {\n      const sa = (va as Record<string, unknown>).$state;\n      const sb = (vb as Record<string, unknown>).$state;\n      if (typeof sa === \"string\" && sa === sb) continue;\n    }\n    return false;\n  }\n  return true;\n}\n\n/**\n * Structural equality check for ValidationConfig.\n */\nfunction validationConfigEqual(\n  a: ValidationConfig,\n  b: ValidationConfig,\n): boolean {\n  if (a === b) return true;\n  if (a.validateOn !== b.validateOn) return false;\n\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 { getSnapshot } = useStateStore();\n  const [fieldStates, setFieldStates] = useState<\n    Record<string, FieldValidationState>\n  >({});\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        if (existing && validationConfigEqual(existing, config)) {\n          return prev;\n        }\n        return { ...prev, [path]: config };\n      });\n    },\n    [],\n  );\n\n  const unregisterField = useCallback((path: string) => {\n    setFieldConfigs((prev) => {\n      const { [path]: _, ...rest } = prev;\n      return rest;\n    });\n    setFieldStates((prev) => {\n      const { [path]: _, ...rest } = prev;\n      return rest;\n    });\n  }, []);\n\n  const validate = useCallback(\n    (path: string, config: ValidationConfig): ValidationResult => {\n      const currentState = getSnapshot();\n      const segments = path.split(\"/\").filter(Boolean);\n      let value: unknown = currentState;\n      for (const seg of segments) {\n        if (value != null && typeof value === \"object\") {\n          value = (value as Record<string, unknown>)[seg];\n        } else {\n          value = undefined;\n          break;\n        }\n      }\n      const result = runValidation(config, {\n        value,\n        stateModel: currentState,\n        customFunctions,\n      });\n\n      setFieldStates((prev) => ({\n        ...prev,\n        [path]: {\n          touched: prev[path]?.touched ?? true,\n          validated: true,\n          result,\n        },\n      }));\n\n      return result;\n    },\n    [getSnapshot, customFunctions],\n  );\n\n  const touch = useCallback((path: string) => {\n    setFieldStates((prev) => ({\n      ...prev,\n      [path]: {\n        ...prev[path],\n        touched: true,\n        validated: prev[path]?.validated ?? false,\n        result: prev[path]?.result ?? null,\n      },\n    }));\n  }, []);\n\n  const clear = useCallback((path: string) => {\n    setFieldStates((prev) => {\n      const { [path]: _, ...rest } = prev;\n      return rest;\n    });\n  }, []);\n\n  const validateAll = useCallback(() => {\n    let allValid = true;\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    return allValid;\n  }, [fieldConfigs, validate]);\n\n  const value = useMemo<ValidationContextValue>(\n    () => ({\n      customFunctions,\n      fieldStates,\n      validate,\n      touch,\n      clear,\n      validateAll,\n      registerField,\n      unregisterField,\n    }),\n    [\n      customFunctions,\n      fieldStates,\n      validate,\n      touch,\n      clear,\n      validateAll,\n      registerField,\n      unregisterField,\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 * Hook to optionally access validation context (returns null if outside provider).\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    unregisterField,\n  } = useValidation();\n\n  // Register whenever config changes (registerField deduplicates via structural equality)\n  useEffect(() => {\n    if (config) {\n      registerField(path, config);\n    }\n  }, [path, config, registerField]);\n\n  // Unregister only on true unmount — avoids clearing validation state\n  // when config identity changes (e.g. inline objects re-created each render)\n  useEffect(() => {\n    return () => {\n      unregisterField(path);\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [path]);\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","import { createContext, useContext, useMemo, 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  const value = useMemo(\n    () => ({ item, index, basePath }),\n    [item, index, basePath],\n  );\n  return (\n    <RepeatScopeContext.Provider value={value}>\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\nexport { FocusProvider, useFocus, useFocusDisable } from \"./contexts/focus\";\n\n// Schema (Ink's spec format)\nexport { schema, type InkSchema, type InkSpec } 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 Ink\nexport type {\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// Standard components\nexport { standardComponents } from \"./components/standard\";\n\n// Hooks\nexport {\n  useUIStream,\n  useBoundProp,\n  flatToTree,\n  type UseUIStreamOptions,\n  type UseUIStreamReturn,\n} from \"./hooks\";\n\n// Catalog definitions\nexport {\n  standardComponentDefinitions,\n  standardActionDefinitions,\n  type ComponentDefinition,\n  type ActionDefinition,\n} from \"./catalog\";\n","import React, {\n  type ComponentType,\n  type ErrorInfo,\n  type ReactNode,\n  useCallback,\n  useMemo,\n} from \"react\";\nimport { Text } from \"ink\";\nimport type {\n  UIElement,\n  Spec,\n  Catalog,\n  SchemaDefinition,\n  StateStore,\n} from \"@json-render/core\";\nimport {\n  resolveElementProps,\n  resolveBindings,\n  resolveActionParam,\n  resolveRepeatItemStatePath,\n  resolveRepeatStatePath,\n  evaluateVisibility,\n  getByPath,\n  type PropResolutionContext,\n} from \"@json-render/core\";\nimport type {\n  Components,\n  Actions,\n  SetState,\n  StateModel,\n} from \"./catalog-types\";\nimport { useVisibility, VisibilityProvider } from \"./contexts/visibility\";\nimport { useActions, ActionProvider, ConfirmDialog } from \"./contexts/actions\";\nimport { useStateStore, StateProvider } from \"./contexts/state\";\nimport { ValidationProvider } from \"./contexts/validation\";\nimport { standardComponents } from \"./components/standard\";\nimport { RepeatScopeProvider, useRepeatScope } from \"./contexts/repeat-scope\";\nimport { FocusProvider } from \"./contexts/focus\";\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. */\n  emit: (event: string) => void;\n  /**\n   * Two-way binding paths resolved from `$bindState` / `$bindItem` expressions.\n   * Maps prop name → absolute state path for write-back.\n   */\n  bindings?: Record<string, string>;\n  /** Whether the parent is loading */\n  loading?: boolean;\n}\n\n/**\n * 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  /**\n   * Component registry. If omitted, only standard components are used.\n   * When provided, custom components are merged with (and override) standard components.\n   */\n  registry?: ComponentRegistry;\n  /** Whether to include standard components (default: true) */\n  includeStandard?: boolean;\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\n// ---------------------------------------------------------------------------\n\ninterface ElementErrorBoundaryProps {\n  elementType: string;\n  children: ReactNode;\n}\n\ninterface ElementErrorBoundaryState {\n  hasError: boolean;\n  /** The elementType at the time of the error — used to reset when the type changes. */\n  errorType: string | null;\n}\n\nclass ElementErrorBoundary extends React.Component<\n  ElementErrorBoundaryProps,\n  ElementErrorBoundaryState\n> {\n  constructor(props: ElementErrorBoundaryProps) {\n    super(props);\n    this.state = { hasError: false, errorType: null };\n  }\n\n  static getDerivedStateFromError(): Partial<ElementErrorBoundaryState> {\n    return { hasError: true, errorType: \"__pending__\" };\n  }\n\n  static getDerivedStateFromProps(\n    props: ElementErrorBoundaryProps,\n    state: ElementErrorBoundaryState,\n  ): Partial<ElementErrorBoundaryState> | null {\n    // Reset error state when the element type changes (e.g. spec update replaced\n    // the erroring component). Same-key/same-type errors are still sticky to\n    // prevent infinite error loops; callers can force a reset by changing the key.\n    // \"__pending__\" means getDerivedStateFromError fired but componentDidCatch\n    // hasn't set the real type yet — don't reset in that window.\n    if (\n      state.hasError &&\n      state.errorType !== null &&\n      state.errorType !== \"__pending__\" &&\n      state.errorType !== props.elementType\n    ) {\n      return { hasError: false, errorType: null };\n    }\n    return null;\n  }\n\n  componentDidCatch(error: Error, info: ErrorInfo) {\n    this.setState({ errorType: this.props.elementType });\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      return null;\n    }\n    return this.props.children;\n  }\n}\n\ninterface ElementRendererProps {\n  element: UIElement;\n  spec: Spec;\n  registry: ComponentRegistry;\n  loading?: boolean;\n  fallback?: ComponentRenderer;\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  spec,\n  registry,\n  loading,\n  fallback,\n}: ElementRendererProps) {\n  const repeatScope = useRepeatScope();\n  const { ctx } = useVisibility();\n  const { execute } = useActions();\n  const { getSnapshot } = useStateStore();\n\n  // Build context with repeat scope\n  const fullCtx: PropResolutionContext = useMemo(\n    () =>\n      repeatScope\n        ? {\n            ...ctx,\n            repeatItem: repeatScope.item,\n            repeatIndex: repeatScope.index,\n            repeatBasePath: repeatScope.basePath,\n          }\n        : ctx,\n    [ctx, repeatScope],\n  );\n\n  // Evaluate visibility\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  // Errors are caught internally so callers (useInput callbacks) don't\n  // produce unhandled promise rejections.\n  const onBindings = element.on;\n  const emit = useCallback(\n    (eventName: string) => {\n      const binding = onBindings?.[eventName];\n      if (!binding) return;\n      const actionBindings = Array.isArray(binding) ? binding : [binding];\n      (async () => {\n        for (const b of actionBindings) {\n          if (!b.params) {\n            await execute(b);\n            continue;\n          }\n          const liveCtx: PropResolutionContext = {\n            ...fullCtx,\n            stateModel: getSnapshot(),\n          };\n          const resolved: Record<string, unknown> = {};\n          for (const [key, val] of Object.entries(b.params)) {\n            resolved[key] = resolveActionParam(val, liveCtx);\n          }\n          await execute({ ...b, params: resolved });\n        }\n      })().catch((err) => {\n        console.error(\n          `[json-render] Error handling event \"${eventName}\":`,\n          err,\n        );\n      });\n    },\n    [onBindings, execute, fullCtx, getSnapshot],\n  );\n\n  if (!isVisible) {\n    return null;\n  }\n\n  // Resolve bindings and props\n  const rawProps = element.props as Record<string, unknown>;\n  const elementBindings = resolveBindings(rawProps, fullCtx);\n  const resolvedProps = resolveElementProps(rawProps, fullCtx);\n\n  const resolvedElement =\n    resolvedProps !== element.props\n      ? { ...element, props: resolvedProps }\n      : element;\n\n  const Component = registry[resolvedElement.type] ?? fallback;\n\n  if (!Component) {\n    console.warn(\n      `[json-render] No renderer for component type: ${resolvedElement.type}`,\n    );\n    return null;\n  }\n\n  // Render children (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          return (\n            <Text key={childKey} color=\"red\">{`[Missing: ${childKey}]`}</Text>\n          );\n        }\n        return null;\n      }\n      return (\n        <ElementRenderer\n          key={childKey}\n          element={childElement}\n          spec={spec}\n          registry={registry}\n          loading={loading}\n          fallback={fallback}\n        />\n      );\n    })\n  );\n\n  return (\n    <ElementErrorBoundary elementType={resolvedElement.type}>\n      <Component\n        element={resolvedElement}\n        emit={emit}\n        bindings={elementBindings}\n        loading={loading}\n      >\n        {children}\n      </Component>\n    </ElementErrorBoundary>\n  );\n});\n\n// ---------------------------------------------------------------------------\n// RepeatChildren\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 parentScope = useRepeatScope();\n  const repeat = element.repeat!;\n  const statePath = resolveRepeatStatePath(\n    repeat.statePath,\n    parentScope?.basePath,\n  );\n  if (statePath === undefined) {\n    console.warn(\n      \"[json-render/ink] $item in repeat.statePath used outside of a repeat scope\",\n    );\n    return null;\n  }\n\n  const raw = getByPath(state, statePath);\n  const items = Array.isArray(raw) ? raw : [];\n\n  return (\n    <>\n      {items.map((itemValue, index) => {\n        const key =\n          repeat.key && typeof itemValue === \"object\" && itemValue !== null\n            ? String(\n                (itemValue as Record<string, unknown>)[repeat.key] ?? index,\n              )\n            : String(index);\n\n        return (\n          <RepeatScopeProvider\n            key={key}\n            item={itemValue}\n            index={index}\n            basePath={resolveRepeatItemStatePath(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                  return (\n                    <Text\n                      key={`${key}:${childKey}`}\n                      color=\"red\"\n                    >{`[Missing: ${childKey}]`}</Text>\n                  );\n                }\n                return null;\n              }\n              return (\n                <ElementRenderer\n                  key={`${key}:${childKey}`}\n                  element={childElement}\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 *\n * By default, standard Ink components are included.\n * Custom components in `registry` override standard ones with the same name.\n */\nexport function Renderer({\n  spec,\n  registry: customRegistry,\n  includeStandard = true,\n  loading,\n  fallback,\n}: RendererProps) {\n  const registry: ComponentRegistry = useMemo(\n    () => ({\n      ...(includeStandard ? standardComponents : {}),\n      ...customRegistry,\n    }),\n    [customRegistry, includeStandard],\n  );\n\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      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  /**\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  /** 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  store,\n  initialState,\n  handlers,\n  navigate,\n  validationFunctions,\n  onStateChange,\n  children,\n}: JSONUIProviderProps) {\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            <FocusProvider>\n              {children}\n              <ConfirmationDialogManager />\n            </FocusProvider>\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   */\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   */\n  executeAction: (\n    actionName: string,\n    params: Record<string, unknown> | undefined,\n    setState: SetState,\n    state?: StateModel,\n  ) => Promise<void>;\n}\n\n/**\n * Create a registry from a catalog with components and/or actions.\n */\nexport function defineRegistry<C extends Catalog>(\n  _catalog: C,\n  options: {\n    components?: Components<C>;\n    actions?: Actions<C>;\n  },\n): DefineRegistryResult {\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        bindings,\n        loading,\n      }: ComponentRenderProps) => {\n        return (componentFn as DefineRegistryComponentFn)({\n          props: element.props,\n          children,\n          emit,\n          bindings,\n          loading,\n        });\n      };\n    }\n  }\n\n  const actionMap = options.actions\n    ? (Object.entries(options.actions) as Array<\n        [string, DefineRegistryActionFn]\n      >)\n    : [];\n\n  const handlers = (\n    getSetState: () => SetState | undefined,\n    getState: () => StateModel,\n  ): Record<string, (params: Record<string, unknown>) => Promise<void>> => {\n    const result: Record<\n      string,\n      (params: Record<string, unknown>) => Promise<void>\n    > = {};\n    for (const [name, actionFn] of actionMap) {\n      result[name] = async (params) => {\n        const setState = getSetState();\n        const state = getState();\n        if (setState) {\n          await actionFn(params, setState, state);\n        } else {\n          console.warn(\n            `[json-render] Action \"${name}\" skipped: setState not available. ` +\n              `Ensure the action handler is used within a mounted StateProvider.`,\n          );\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(`[json-render] 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  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// createRenderer\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).\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  /** 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\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 */\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  const registry: ComponentRegistry =\n    components as unknown as ComponentRegistry;\n\n  return function CatalogRenderer({\n    spec,\n    store,\n    state,\n    onAction,\n    onStateChange,\n    loading,\n    fallback,\n  }: CreateRendererProps) {\n    const actionHandlers = useMemo(\n      () =>\n        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      [onAction],\n    );\n\n    return (\n      <JSONUIProvider\n        store={store}\n        initialState={state}\n        handlers={actionHandlers}\n        onStateChange={onStateChange}\n      >\n        <Renderer\n          spec={spec}\n          registry={registry}\n          loading={loading}\n          fallback={fallback}\n        />\n      </JSONUIProvider>\n    );\n  };\n}\n","import { useState, useEffect, useMemo } from \"react\";\nimport {\n  Box,\n  Text,\n  Newline as InkNewline,\n  Spacer as InkSpacer,\n  useInput,\n} from \"ink\";\nimport { marked, type Token, type Tokens } from \"marked\";\nimport type { ComponentRenderProps, ComponentRegistry } from \"../renderer\";\nimport { useBoundProp } from \"../hooks\";\nimport { useFocus } from \"../contexts/focus\";\n\n// =============================================================================\n// Layout Components (Ink Primitives)\n// =============================================================================\n\n// Props that must never be forwarded from AI-generated specs to React/Ink elements.\nconst BLOCKED_PROPS = new Set([\n  \"key\",\n  \"ref\",\n  \"children\",\n  \"dangerouslySetInnerHTML\",\n  \"style\",\n  \"className\",\n  \"id\",\n]);\n\n// Colors that are invisible on typical dark terminal backgrounds.\nconst INVISIBLE_COLORS = new Set([\"black\", \"#000\", \"#000000\"]);\n\n/** Return undefined for colors that would be invisible on dark terminals. */\nfunction safeColor(color: string | undefined): string | undefined {\n  if (color && INVISIBLE_COLORS.has(color)) return undefined;\n  return color;\n}\n\n// Strip null values so Ink's default layout applies (Ink has no concept of null props)\n// and block dangerous or web-only props from AI-generated specs.\nfunction safeBoxProps(obj: Record<string, unknown>): Record<string, unknown> {\n  const result: Record<string, unknown> = {};\n  for (const [k, v] of Object.entries(obj)) {\n    if (v !== undefined && v !== null && !BLOCKED_PROPS.has(k)) {\n      // Drop foreground colors that would be invisible on dark backgrounds\n      if (k === \"color\" && typeof v === \"string\" && INVISIBLE_COLORS.has(v)) {\n        continue;\n      }\n      result[k] = v;\n    }\n  }\n  return result;\n}\n\nfunction BoxComponent({ element, children }: ComponentRenderProps) {\n  const p = element.props as Record<string, unknown>;\n\n  return <Box {...safeBoxProps(p)}>{children}</Box>;\n}\n\nfunction TextComponent({ element }: ComponentRenderProps) {\n  const { text, ...style } = element.props as Record<string, unknown>;\n\n  return <Text {...safeBoxProps(style)}>{(text as string) ?? \"\"}</Text>;\n}\n\nfunction NewlineComponent({ element }: ComponentRenderProps) {\n  const p = element.props as { count?: number };\n  return <InkNewline count={p.count} />;\n}\n\nfunction SpacerComponent() {\n  return <InkSpacer />;\n}\n\n// =============================================================================\n// Content Components (Higher-Level)\n// =============================================================================\n\nfunction HeadingComponent({ element }: ComponentRenderProps) {\n  const p = element.props as {\n    text?: string;\n    level?: \"h1\" | \"h2\" | \"h3\" | \"h4\";\n    color?: string;\n  };\n\n  const level = p.level ?? \"h2\";\n\n  switch (level) {\n    case \"h1\":\n      return (\n        <Text bold underline color={safeColor(p.color)}>\n          {p.text ?? \"\"}\n        </Text>\n      );\n    case \"h2\":\n      return (\n        <Text bold color={safeColor(p.color)}>\n          {p.text ?? \"\"}\n        </Text>\n      );\n    case \"h3\":\n      return (\n        <Text bold dimColor color={safeColor(p.color)}>\n          {p.text ?? \"\"}\n        </Text>\n      );\n    case \"h4\":\n    default:\n      return (\n        <Text dimColor color={safeColor(p.color)}>\n          {p.text ?? \"\"}\n        </Text>\n      );\n  }\n}\n\nfunction DividerComponent({ element }: ComponentRenderProps) {\n  const p = element.props as {\n    character?: string;\n    color?: string;\n    dimColor?: boolean;\n    title?: string;\n    width?: number;\n  };\n\n  const char = Array.from(p.character ?? \"─\")[0] || \"─\";\n  const totalWidth = p.width ?? 40;\n\n  if (p.title) {\n    const titleStr = ` ${p.title} `;\n    const available = Math.max(0, totalWidth - titleStr.length);\n    const leftLen = Math.floor(available / 2);\n    const rightLen = available - leftLen;\n    return (\n      <Text color={safeColor(p.color)} dimColor={p.dimColor}>\n        {char.repeat(leftLen)}\n        {titleStr}\n        {char.repeat(rightLen)}\n      </Text>\n    );\n  }\n\n  return (\n    <Text color={safeColor(p.color)} dimColor={p.dimColor}>\n      {char.repeat(totalWidth)}\n    </Text>\n  );\n}\n\nconst BADGE_COLORS: Record<string, string> = {\n  default: \"white\",\n  info: \"blue\",\n  success: \"green\",\n  warning: \"yellow\",\n  error: \"red\",\n};\n\nfunction BadgeComponent({ element }: ComponentRenderProps) {\n  const p = element.props as {\n    label?: string;\n    variant?: \"default\" | \"info\" | \"success\" | \"warning\" | \"error\";\n  };\n\n  const color = BADGE_COLORS[p.variant ?? \"default\"] ?? \"white\";\n\n  return (\n    <Text backgroundColor={color} bold>\n      {` ${p.label ?? \"\"} `}\n    </Text>\n  );\n}\n\nconst SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n\nfunction SpinnerComponent({ element }: ComponentRenderProps) {\n  const p = element.props as {\n    label?: string;\n    color?: string;\n  };\n\n  const [frame, setFrame] = useState(0);\n\n  useEffect(() => {\n    const timer = setInterval(() => {\n      setFrame((prev) => (prev + 1) % SPINNER_FRAMES.length);\n    }, 80);\n    return () => clearInterval(timer);\n  }, []);\n\n  return (\n    <Box gap={1}>\n      <Text color={safeColor(p.color)}>{SPINNER_FRAMES[frame]}</Text>\n      {p.label ? <Text>{p.label}</Text> : null}\n    </Box>\n  );\n}\n\nfunction ProgressBarComponent({ element }: ComponentRenderProps) {\n  const p = element.props as {\n    progress?: number;\n    width?: number;\n    color?: string;\n    label?: string;\n  };\n\n  const progress = Math.min(1, Math.max(0, p.progress ?? 0));\n  const barWidth = p.width ?? 30;\n  const filled = Math.round(progress * barWidth);\n  const empty = barWidth - filled;\n  const percentage = Math.round(progress * 100);\n\n  return (\n    <Box gap={1}>\n      {p.label ? <Text>{p.label}</Text> : null}\n      <Text>\n        <Text color={safeColor(p.color) ?? \"green\"}>{\"█\".repeat(filled)}</Text>\n        <Text dimColor>{\"░\".repeat(empty)}</Text>\n      </Text>\n      <Text dimColor>{percentage}%</Text>\n    </Box>\n  );\n}\n\nconst SPARK_BLOCKS = [\"▁\", \"▂\", \"▃\", \"▄\", \"▅\", \"▆\", \"▇\", \"█\"];\n\nfunction SparklineComponent({ element }: ComponentRenderProps) {\n  const p = element.props as {\n    data?: number[];\n    width?: number;\n    color?: string;\n    label?: string;\n    min?: number;\n    max?: number;\n  };\n\n  const data = p.data ?? [];\n  if (data.length === 0) {\n    return p.label ? <Text dimColor>{p.label}: (no data)</Text> : null;\n  }\n\n  const minVal = p.min ?? Math.min(...data);\n  const maxVal = p.max ?? Math.max(...data);\n  const range = maxVal - minVal || 1;\n\n  // If width is set and smaller than data length, sample down\n  const maxWidth = p.width ?? data.length;\n  let sampled = data;\n  if (maxWidth < data.length) {\n    sampled = [];\n    for (let i = 0; i < maxWidth; i++) {\n      const idx =\n        maxWidth === 1\n          ? 0\n          : Math.round((i / (maxWidth - 1)) * (data.length - 1));\n      sampled.push(data[idx]!);\n    }\n  }\n\n  const blocks = sampled\n    .map((v) => {\n      const normalized = (v - minVal) / range;\n      const idx = Math.min(\n        SPARK_BLOCKS.length - 1,\n        Math.round(normalized * (SPARK_BLOCKS.length - 1)),\n      );\n      return SPARK_BLOCKS[idx];\n    })\n    .join(\"\");\n\n  return (\n    <Box gap={1}>\n      {p.label ? <Text>{p.label}</Text> : null}\n      <Text color={safeColor(p.color) ?? \"green\"}>{blocks}</Text>\n    </Box>\n  );\n}\n\nfunction BarChartComponent({ element }: ComponentRenderProps) {\n  const p = element.props as {\n    data?: Array<{ label: string; value: number; color?: string }>;\n    width?: number;\n    showValues?: boolean;\n    showPercentage?: boolean;\n  };\n\n  const data = p.data ?? [];\n  if (data.length === 0) return null;\n\n  const maxValue = Math.max(...data.map((d) => d.value), 1);\n  const total = data.reduce((sum, d) => sum + d.value, 0);\n  const maxLabelLen = Math.max(...data.map((d) => d.label.length));\n  const barWidth = p.width ?? 30;\n\n  return (\n    <Box flexDirection=\"column\">\n      {data.map((item) => {\n        const filled = Math.round((item.value / maxValue) * barWidth);\n        const padded = item.label.padEnd(maxLabelLen);\n        const suffix: string[] = [];\n        if (p.showValues) suffix.push(String(item.value));\n        if (p.showPercentage && total > 0)\n          suffix.push(`${Math.round((item.value / total) * 100)}%`);\n\n        return (\n          <Box key={item.label} gap={1}>\n            <Text>{padded}</Text>\n            <Text color={item.color ?? \"green\"}>{\"█\".repeat(filled)}</Text>\n            {suffix.length > 0 ? (\n              <Text dimColor>{suffix.join(\" \")}</Text>\n            ) : null}\n          </Box>\n        );\n      })}\n    </Box>\n  );\n}\n\nfunction TableComponent({ element }: ComponentRenderProps) {\n  const p = element.props as {\n    columns?: Array<{\n      header: string;\n      key: string;\n      width?: number;\n      align?: \"left\" | \"center\" | \"right\";\n    }>;\n    rows?: Array<Record<string, string>>;\n    borderStyle?: string;\n    backgroundColor?: string;\n    headerColor?: string;\n  };\n\n  const columns = p.columns ?? [];\n  const rows = p.rows ?? [];\n\n  // Calculate column widths\n  const colWidths = columns.map((col) => {\n    if (col.width) return col.width;\n    let max = col.header.length;\n    for (const row of rows) {\n      const val = row[col.key] ?? \"\";\n      if (val.length > max) max = val.length;\n    }\n    return max + 2;\n  });\n\n  const padCell = (text: string, width: number, align?: string): string => {\n    const truncated =\n      text.length > width ? text.slice(0, width - 1) + \"…\" : text;\n    const pad = width - truncated.length;\n    if (align === \"right\") return \" \".repeat(pad) + truncated;\n    if (align === \"center\") {\n      const left = Math.floor(pad / 2);\n      return \" \".repeat(left) + truncated + \" \".repeat(pad - left);\n    }\n    return truncated + \" \".repeat(pad);\n  };\n\n  const borderStyleProp = p.borderStyle as\n    | \"single\"\n    | \"double\"\n    | \"round\"\n    | \"bold\"\n    | \"classic\"\n    | undefined;\n\n  return (\n    <Box\n      flexDirection=\"column\"\n      alignSelf=\"flex-start\"\n      borderStyle={borderStyleProp}\n      backgroundColor={p.backgroundColor}\n    >\n      {/* Header */}\n      <Box>\n        {columns.map((col, i) => (\n          <Text key={col.key} bold color={safeColor(p.headerColor)}>\n            {padCell(col.header, colWidths[i]!, col.align)}\n          </Text>\n        ))}\n      </Box>\n      {/* Separator */}\n      <Text dimColor>{colWidths.map((w) => \"─\".repeat(w)).join(\"─\")}</Text>\n      {/* Rows */}\n      {rows.map((row, rowIdx) => {\n        const rowKey =\n          columns.map((c) => row[c.key] ?? \"\").join(\"\\0\") || String(rowIdx);\n        return (\n          <Box key={rowKey} gap={0}>\n            {columns.map((col, i) => (\n              <Text key={col.key}>\n                {padCell(row[col.key] || \"—\", colWidths[i]!, col.align)}\n              </Text>\n            ))}\n          </Box>\n        );\n      })}\n    </Box>\n  );\n}\n\nfunction ListComponent({ element }: ComponentRenderProps) {\n  const p = element.props as {\n    items?: string[];\n    ordered?: boolean;\n    bulletChar?: string;\n    spacing?: number;\n  };\n\n  const items = p.items ?? [];\n  const bullet = p.bulletChar ?? \"•\";\n\n  return (\n    <Box flexDirection=\"column\" gap={p.spacing ?? 0}>\n      {items.map((item, i) => (\n        <Box key={`${i}:${item}`} gap={1}>\n          <Text dimColor>{p.ordered ? `${i + 1}.` : bullet}</Text>\n          <Text>{item}</Text>\n        </Box>\n      ))}\n    </Box>\n  );\n}\n\nfunction ListItemComponent({ element }: ComponentRenderProps) {\n  const p = element.props as {\n    title?: string;\n    subtitle?: string;\n    leading?: string;\n    trailing?: string;\n  };\n\n  return (\n    <Box gap={1}>\n      {p.leading ? <Text>{p.leading}</Text> : null}\n      <Box flexDirection=\"column\" flexGrow={1}>\n        <Text bold>{p.title ?? \"\"}</Text>\n        {p.subtitle ? <Text>{p.subtitle}</Text> : null}\n      </Box>\n      {p.trailing ? <Text>{String(p.trailing)}</Text> : null}\n    </Box>\n  );\n}\n\nfunction CardComponent({ element, children }: ComponentRenderProps) {\n  const p = element.props as {\n    title?: string;\n    backgroundColor?: string;\n    padding?: number;\n  };\n\n  return (\n    <Box\n      flexDirection=\"column\"\n      alignSelf=\"flex-start\"\n      backgroundColor={p.backgroundColor ?? \"#1a1a1a\"}\n      padding={p.padding ?? 1}\n    >\n      {p.title ? (\n        <Box marginBottom={1}>\n          <Text bold>{p.title}</Text>\n        </Box>\n      ) : null}\n      {children}\n    </Box>\n  );\n}\n\n/** Coerce any value into a display string. Handles arrays, numbers, objects. */\nfunction coerceToString(val: unknown): string {\n  if (val == null) return \"\";\n  if (typeof val === \"string\") return val;\n  if (typeof val === \"number\") return val.toLocaleString();\n  if (typeof val === \"boolean\") return val ? \"true\" : \"false\";\n  if (Array.isArray(val)) return val.map(coerceToString).join(\", \");\n  if (typeof val === \"object\") {\n    // Handle {language: \"TypeScript\", percentage: 65} style objects\n    const values = Object.values(val as Record<string, unknown>);\n    return values.map(coerceToString).join(\" \");\n  }\n  return String(val);\n}\n\nfunction KeyValueComponent({ element }: ComponentRenderProps) {\n  const p = element.props as {\n    label?: string;\n    value?: unknown;\n    labelColor?: string;\n    separator?: string;\n  };\n\n  const sep = p.separator ?? \":\";\n\n  return (\n    <Box gap={1}>\n      <Text color={safeColor(p.labelColor)} bold dimColor>\n        {p.label ?? \"\"}\n        {sep}\n      </Text>\n      <Text>{coerceToString(p.value) || \"—\"}</Text>\n    </Box>\n  );\n}\n\nfunction LinkComponent({ element }: ComponentRenderProps) {\n  const p = element.props as {\n    url?: string;\n    label?: string;\n    color?: string;\n  };\n\n  const url = p.url ?? \"\";\n  const label = p.label ?? url;\n\n  return (\n    <Text color={safeColor(p.color) ?? \"cyan\"} underline>\n      {label}\n      {label !== url ? ` (${url})` : \"\"}\n    </Text>\n  );\n}\n\nconst STATUS_CONFIG: Record<string, { icon: string; color: string }> = {\n  info: { icon: \"ℹ\", color: \"blue\" },\n  success: { icon: \"✔\", color: \"green\" },\n  warning: { icon: \"⚠\", color: \"yellow\" },\n  error: { icon: \"✖\", color: \"red\" },\n};\n\nfunction StatusLineComponent({ element }: ComponentRenderProps) {\n  const p = element.props as {\n    text?: string;\n    status?: \"info\" | \"success\" | \"warning\" | \"error\";\n    icon?: string;\n  };\n\n  const status = p.status ?? \"info\";\n  const config = STATUS_CONFIG[status];\n  const icon = p.icon ?? config?.icon ?? \"•\";\n  const color = config?.color ?? \"white\";\n\n  return (\n    <Box gap={1}>\n      <Text color={color}>{icon}</Text>\n      <Text>{p.text ?? \"\"}</Text>\n    </Box>\n  );\n}\n\n// =============================================================================\n// Metric, Callout, Timeline\n// =============================================================================\n\nconst TREND_CONFIG: Record<string, { prefix: string; color: string }> = {\n  up: { prefix: \"+\", color: \"green\" },\n  down: { prefix: \"\", color: \"red\" },\n  neutral: { prefix: \"~\", color: \"gray\" },\n};\n\nfunction MetricComponent({ element }: ComponentRenderProps) {\n  const p = element.props as {\n    label?: string;\n    value?: string;\n    detail?: string;\n    trend?: \"up\" | \"down\" | \"neutral\";\n  };\n\n  const trend = p.trend ? TREND_CONFIG[p.trend] : null;\n\n  return (\n    <Box flexDirection=\"column\">\n      <Text dimColor>{p.label ?? \"\"}</Text>\n      <Box gap={1}>\n        <Text bold>{p.value ?? \"\"}</Text>\n        {trend && p.detail ? (\n          <Text color={trend.color}>\n            {trend.prefix}\n            {p.detail}\n          </Text>\n        ) : null}\n      </Box>\n      {!trend && p.detail ? <Text dimColor>{p.detail}</Text> : null}\n    </Box>\n  );\n}\n\nconst CALLOUT_CONFIG: Record<string, { label: string; color: string }> = {\n  info: { label: \"INFO\", color: \"blue\" },\n  tip: { label: \"TIP\", color: \"green\" },\n  warning: { label: \"WARNING\", color: \"yellow\" },\n  important: { label: \"IMPORTANT\", color: \"magenta\" },\n};\n\nfunction CalloutComponent({ element }: ComponentRenderProps) {\n  const p = element.props as {\n    type?: \"info\" | \"tip\" | \"warning\" | \"important\";\n    title?: string;\n    content?: string;\n  };\n\n  const config = CALLOUT_CONFIG[p.type ?? \"info\"] ?? CALLOUT_CONFIG.info!;\n\n  return (\n    <Box\n      flexDirection=\"column\"\n      borderStyle=\"bold\"\n      borderLeft\n      borderRight={false}\n      borderTop={false}\n      borderBottom={false}\n      borderColor={config.color}\n      paddingLeft={1}\n    >\n      {p.title ? (\n        <Text bold color={config.color}>\n          {p.title}\n        </Text>\n      ) : null}\n      <Text>{p.content ?? \"\"}</Text>\n    </Box>\n  );\n}\n\nconst TIMELINE_DOT: Record<string, { dot: string; color: string }> = {\n  completed: { dot: \"●\", color: \"green\" },\n  current: { dot: \"◆\", color: \"cyan\" },\n  upcoming: { dot: \"○\", color: \"gray\" },\n};\n\nfunction TimelineComponent({ element }: ComponentRenderProps) {\n  const p = element.props as {\n    items?: Array<{\n      title?: string;\n      description?: string;\n      date?: string;\n      status?: \"completed\" | \"current\" | \"upcoming\";\n    }>;\n  };\n\n  const items = p.items ?? [];\n\n  return (\n    <Box flexDirection=\"column\" gap={1}>\n      {items.map((item, i) => {\n        const cfg =\n          TIMELINE_DOT[item.status ?? \"upcoming\"] ?? TIMELINE_DOT.upcoming!;\n        return (\n          <Box key={i} flexDirection=\"column\">\n            <Box gap={1}>\n              <Text color={cfg.color}>{cfg.dot}</Text>\n              <Text bold>{item.title ?? \"\"}</Text>\n              {item.date ? <Text dimColor>{item.date}</Text> : null}\n            </Box>\n            {item.description ? (\n              <Box paddingLeft={2}>\n                <Text dimColor>{item.description}</Text>\n              </Box>\n            ) : null}\n          </Box>\n        );\n      })}\n    </Box>\n  );\n}\n\n// =============================================================================\n// Interactive Components\n// =============================================================================\n\n/** Count code points instead of UTF-16 code units (handles emoji/surrogate pairs). */\nfunction codePointLength(s: string): number {\n  return Array.from(s).length;\n}\n\n/** Slice by code point index instead of UTF-16 offset. */\nfunction codePointSlice(s: string, start: number, end?: number): string {\n  return Array.from(s).slice(start, end).join(\"\");\n}\n\nfunction TextInputComponent({ element, emit, bindings }: ComponentRenderProps) {\n  const p = element.props as {\n    placeholder?: string;\n    value?: string;\n    label?: string;\n    mask?: string;\n  };\n\n  const { isActive } = useFocus();\n  const [value, setValue] = useBoundProp<string>(\n    (p.value as string) ?? \"\",\n    bindings?.value,\n  );\n\n  const currentValue = value ?? \"\";\n  const [cursorPos, setCursorPos] = useState(codePointLength(currentValue));\n\n  // Keep cursor in bounds when value changes externally\n  useEffect(() => {\n    setCursorPos((prev) => Math.min(prev, codePointLength(currentValue)));\n  }, [currentValue]);\n\n  useInput(\n    (input, key) => {\n      if (key.return) {\n        emit(\"submit\");\n        return;\n      }\n\n      if (key.backspace || key.delete) {\n        if (cursorPos > 0) {\n          const newVal =\n            codePointSlice(currentValue, 0, cursorPos - 1) +\n            codePointSlice(currentValue, cursorPos);\n          setValue(newVal);\n          setCursorPos((prev) => prev - 1);\n          emit(\"change\");\n        }\n        return;\n      }\n\n      // Cursor movement\n      if (key.leftArrow) {\n        setCursorPos((prev) => Math.max(0, prev - 1));\n        return;\n      }\n      if (key.rightArrow) {\n        setCursorPos((prev) =>\n          Math.min(codePointLength(currentValue), prev + 1),\n        );\n        return;\n      }\n\n      // Ignore control keys\n      if (key.ctrl || key.meta || key.escape || key.tab) return;\n      if (key.upArrow || key.downArrow) return;\n\n      if (input) {\n        const newVal =\n          codePointSlice(currentValue, 0, cursorPos) +\n          input +\n          codePointSlice(currentValue, cursorPos);\n        setValue(newVal);\n        setCursorPos((prev) => prev + codePointLength(input));\n        emit(\"change\");\n      }\n    },\n    { isActive },\n  );\n\n  const displayValue = currentValue\n    ? p.mask\n      ? p.mask.repeat(codePointLength(currentValue))\n      : currentValue\n    : \"\";\n\n  const before = codePointSlice(displayValue, 0, cursorPos);\n  const after = codePointSlice(displayValue, cursorPos);\n\n  return (\n    <Box gap={1}>\n      {p.label ? <Text bold>{p.label}:</Text> : null}\n      <Text>\n        {currentValue ? (\n          <>\n            {before}\n            {isActive ? <Text color=\"cyan\">▎</Text> : null}\n            {after}\n          </>\n        ) : (\n          <>\n            {isActive ? <Text color=\"cyan\">▎</Text> : null}\n            <Text dimColor>{p.placeholder ?? \"\"}</Text>\n          </>\n        )}\n      </Text>\n    </Box>\n  );\n}\n\nfunction SelectComponent({ element, emit, bindings }: ComponentRenderProps) {\n  const p = element.props as {\n    options?: Array<{ label: string; value: string }>;\n    value?: string;\n    label?: string;\n  };\n\n  const { isActive } = useFocus();\n  const options = p.options ?? [];\n  const [selectedValue, setSelectedValue] = useBoundProp<string>(\n    (p.value as string) ?? \"\",\n    bindings?.value,\n  );\n\n  const currentIndex = options.findIndex((o) => o.value === selectedValue);\n  const [highlightIndex, setHighlightIndex] = useState(\n    currentIndex >= 0 ? currentIndex : 0,\n  );\n\n  // Stable key derived from option values — prevents the effect from firing\n  // on every render due to resolved props creating new array references.\n  const optionsKey = options.map((o) => o.value).join(\"\\0\");\n\n  // Sync highlight when selectedValue changes externally (e.g. via another action)\n  // Also clamp when options shrink to prevent out-of-bounds highlight\n  useEffect(() => {\n    const idx = options.findIndex((o) => o.value === selectedValue);\n    if (idx >= 0) {\n      setHighlightIndex(idx);\n    } else if (options.length > 0) {\n      setHighlightIndex((prev) => Math.min(prev, options.length - 1));\n    } else {\n      setHighlightIndex(0);\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps -- optionsKey is a stable proxy for options identity\n  }, [selectedValue, optionsKey]);\n\n  useInput(\n    (_input, key) => {\n      if (options.length === 0) return;\n      if (key.upArrow) {\n        setHighlightIndex((prev) => (prev > 0 ? prev - 1 : options.length - 1));\n      } else if (key.downArrow) {\n        setHighlightIndex((prev) => (prev < options.length - 1 ? prev + 1 : 0));\n      } else if (key.return) {\n        const option = options[highlightIndex];\n        if (option) {\n          setSelectedValue(option.value);\n          emit(\"change\");\n        }\n      }\n    },\n    { isActive },\n  );\n\n  return (\n    <Box flexDirection=\"column\">\n      {p.label ? (\n        <Box marginBottom={1}>\n          <Text bold>{p.label}:</Text>\n        </Box>\n      ) : null}\n      {options.map((option, i) => {\n        const isHighlighted = i === highlightIndex;\n        const isSelected = option.value === selectedValue;\n        return (\n          <Box key={option.value} gap={1}>\n            <Text color={isHighlighted ? \"cyan\" : undefined}>\n              {isHighlighted ? \"❯\" : \" \"}\n            </Text>\n            <Text\n              color={isSelected ? \"green\" : isHighlighted ? \"cyan\" : undefined}\n              bold={isSelected}\n            >\n              {option.label}\n            </Text>\n          </Box>\n        );\n      })}\n    </Box>\n  );\n}\n\nfunction MultiSelectComponent({\n  element,\n  emit,\n  bindings,\n}: ComponentRenderProps) {\n  const p = element.props as {\n    options?: Array<{ label: string; value: string }>;\n    value?: string[];\n    label?: string;\n    min?: number;\n    max?: number;\n  };\n\n  const { isActive } = useFocus();\n  const options = p.options ?? [];\n  const [selectedValues, setSelectedValues] = useBoundProp<string[]>(\n    (p.value as string[]) ?? [],\n    bindings?.value,\n  );\n\n  const selected = selectedValues ?? [];\n  const [highlightIndex, setHighlightIndex] = useState(0);\n\n  const optionsKey = options.map((o) => o.value).join(\"\\0\");\n\n  useEffect(() => {\n    if (options.length > 0) {\n      setHighlightIndex((prev) => Math.min(prev, options.length - 1));\n    } else {\n      setHighlightIndex(0);\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps -- optionsKey is a stable proxy for options identity\n  }, [optionsKey]);\n\n  useInput(\n    (_input, key) => {\n      if (options.length === 0) return;\n      if (key.upArrow) {\n        setHighlightIndex((prev) => (prev > 0 ? prev - 1 : options.length - 1));\n      } else if (key.downArrow) {\n        setHighlightIndex((prev) => (prev < options.length - 1 ? prev + 1 : 0));\n      } else if (_input === \" \") {\n        const option = options[highlightIndex];\n        if (!option) return;\n        const isSelected = selected.includes(option.value);\n        let next: string[];\n        if (isSelected) {\n          if (p.min != null && selected.length <= p.min) return;\n          next = selected.filter((v) => v !== option.value);\n        } else {\n          if (p.max != null && selected.length >= p.max) return;\n          next = [...selected, option.value];\n        }\n        setSelectedValues(next);\n        emit(\"change\");\n      } else if (key.return) {\n        emit(\"submit\");\n      }\n    },\n    { isActive },\n  );\n\n  return (\n    <Box flexDirection=\"column\">\n      {p.label ? (\n        <Box marginBottom={1}>\n          <Text bold>{p.label}:</Text>\n          <Text dimColor> (space to toggle, enter to confirm)</Text>\n        </Box>\n      ) : null}\n      {options.map((option, i) => {\n        const isHighlighted = i === highlightIndex;\n        const isChecked = selected.includes(option.value);\n        return (\n          <Box key={option.value} gap={1}>\n            <Text color={isHighlighted ? \"cyan\" : undefined}>\n              {isHighlighted ? \"❯\" : \" \"}\n            </Text>\n            <Text color={isChecked ? \"green\" : undefined}>\n              {isChecked ? \"◉\" : \"◯\"}\n            </Text>\n            <Text color={isHighlighted ? \"cyan\" : undefined} bold={isChecked}>\n              {option.label}\n            </Text>\n          </Box>\n        );\n      })}\n      {selected.length > 0 ? (\n        <Box marginTop={1}>\n          <Text dimColor>Selected: {selected.length}</Text>\n        </Box>\n      ) : null}\n    </Box>\n  );\n}\n\nfunction ConfirmInputComponent({ element, emit }: ComponentRenderProps) {\n  const p = element.props as {\n    message?: string;\n    defaultValue?: boolean;\n    yesLabel?: string;\n    noLabel?: string;\n  };\n\n  const { isActive } = useFocus();\n  const [value, setValue] = useState<boolean | null>(p.defaultValue ?? null);\n\n  useInput(\n    (input, key) => {\n      const lower = input.toLowerCase();\n      if (lower === \"y\") {\n        setValue(true);\n        emit(\"confirm\");\n      } else if (lower === \"n\") {\n        setValue(false);\n        emit(\"deny\");\n      } else if (key.return && value !== null) {\n        emit(value ? \"confirm\" : \"deny\");\n      }\n    },\n    { isActive },\n  );\n\n  const yesLabel = p.yesLabel ?? \"Yes\";\n  const noLabel = p.noLabel ?? \"No\";\n\n  return (\n    <Box gap={1}>\n      <Text bold>{p.message ?? \"Are you sure?\"}</Text>\n      <Text>\n        <Text color={value === true ? \"green\" : \"gray\"} bold={value === true}>\n          {yesLabel}\n        </Text>\n        <Text dimColor> / </Text>\n        <Text color={value === false ? \"red\" : \"gray\"} bold={value === false}>\n          {noLabel}\n        </Text>\n      </Text>\n      <Text dimColor>(y/n)</Text>\n    </Box>\n  );\n}\n\nfunction TabsComponent({\n  element,\n  emit,\n  bindings,\n  children,\n}: ComponentRenderProps) {\n  const p = element.props as {\n    tabs?: Array<{ label: string; value: string; icon?: string }>;\n    value?: string;\n    color?: string;\n  };\n\n  const { isActive } = useFocus();\n  const tabs = p.tabs ?? [];\n  const [activeTab, setActiveTab] = useBoundProp<string>(\n    (p.value as string) ?? tabs[0]?.value ?? \"\",\n    bindings?.value,\n  );\n\n  const activeIndex = tabs.findIndex((t) => t.value === activeTab);\n\n  useInput(\n    (_input, key) => {\n      if (tabs.length === 0) return;\n      const currentIdx = activeIndex >= 0 ? activeIndex : 0;\n      if (key.leftArrow) {\n        const next = currentIdx > 0 ? currentIdx - 1 : tabs.length - 1;\n        const tab = tabs[next];\n        if (tab) {\n          setActiveTab(tab.value);\n          emit(\"change\");\n        }\n      } else if (key.rightArrow) {\n        const next = currentIdx < tabs.length - 1 ? currentIdx + 1 : 0;\n        const tab = tabs[next];\n        if (tab) {\n          setActiveTab(tab.value);\n          emit(\"change\");\n        }\n      }\n    },\n    { isActive },\n  );\n\n  const accentColor = p.color ?? \"cyan\";\n\n  return (\n    <Box flexDirection=\"column\">\n      <Box gap={2}>\n        {tabs.map((tab) => {\n          const isActive = tab.value === activeTab;\n          return (\n            <Text\n              key={tab.value}\n              color={isActive ? accentColor : undefined}\n              bold={isActive}\n              dimColor={!isActive}\n            >\n              {tab.icon ? `${tab.icon} ` : \"\"}\n              {tab.label}\n            </Text>\n          );\n        })}\n      </Box>\n      <Text color={accentColor}>\n        {tabs\n          .map((tab) => {\n            const isActive = tab.value === activeTab;\n            const labelWidth =\n              (tab.icon ? tab.icon.length + 1 : 0) + tab.label.length;\n            return isActive\n              ? \"━\".repeat(labelWidth) + \"  \"\n              : \" \".repeat(labelWidth) + \"  \";\n          })\n          .join(\"\")}\n      </Text>\n      {children}\n    </Box>\n  );\n}\n\n// =============================================================================\n// Markdown Component\n// =============================================================================\n\n/** Render an array of inline tokens into Ink Text elements. */\nfunction renderInline(tokens: Token[]): React.ReactNode[] {\n  const nodes: React.ReactNode[] = [];\n  for (let i = 0; i < tokens.length; i++) {\n    const t = tokens[i]!;\n    switch (t.type) {\n      case \"strong\":\n        nodes.push(\n          <Text key={i} bold>\n            {renderInline((t as Tokens.Strong).tokens)}\n          </Text>,\n        );\n        break;\n      case \"em\":\n        nodes.push(\n          <Text key={i} italic>\n            {renderInline((t as Tokens.Em).tokens)}\n          </Text>,\n        );\n        break;\n      case \"codespan\":\n        nodes.push(\n          <Text\n            key={i}\n            bold\n            dimColor\n          >{`\\`${(t as Tokens.Codespan).text}\\``}</Text>,\n        );\n        break;\n      case \"del\":\n        nodes.push(\n          <Text key={i} strikethrough>\n            {renderInline((t as Tokens.Del).tokens)}\n          </Text>,\n        );\n        break;\n      case \"link\":\n        nodes.push(\n          <Text key={i} underline>\n            {renderInline((t as Tokens.Link).tokens)}\n          </Text>,\n        );\n        break;\n      case \"text\": {\n        const tt = t as Tokens.Text;\n        // Paragraph-level text tokens can have nested inline tokens\n        if (tt.tokens) {\n          nodes.push(...renderInline(tt.tokens));\n        } else {\n          nodes.push(tt.text);\n        }\n        break;\n      }\n      case \"br\":\n        nodes.push(\"\\n\");\n        break;\n      case \"escape\":\n        nodes.push((t as Tokens.Escape).text);\n        break;\n      default:\n        if (\"text\" in t) nodes.push((t as { text: string }).text);\n        break;\n    }\n  }\n  return nodes;\n}\n\n/** Render a single block-level token into Ink components. */\nfunction renderBlock(token: Token, key: number): React.ReactNode {\n  switch (token.type) {\n    case \"heading\": {\n      const h = token as Tokens.Heading;\n      const content = renderInline(h.tokens);\n      if (h.depth === 1)\n        return (\n          <Text key={key} bold underline>\n            {content}\n          </Text>\n        );\n      if (h.depth === 2)\n        return (\n          <Text key={key} bold>\n            {content}\n          </Text>\n        );\n      if (h.depth === 3)\n        return (\n          <Text key={key} bold dimColor>\n            {content}\n          </Text>\n        );\n      return (\n        <Text key={key} dimColor>\n          {content}\n        </Text>\n      );\n    }\n    case \"paragraph\": {\n      const p = token as Tokens.Paragraph;\n      return <Text key={key}>{renderInline(p.tokens)}</Text>;\n    }\n    case \"code\": {\n      const c = token as Tokens.Code;\n      return (\n        <Box\n          key={key}\n          borderStyle=\"single\"\n          borderColor=\"gray\"\n          paddingX={1}\n          marginY={0}\n        >\n          <Text dimColor>{c.text}</Text>\n        </Box>\n      );\n    }\n    case \"blockquote\": {\n      const bq = token as Tokens.Blockquote;\n      return (\n        <Box\n          key={key}\n          paddingLeft={1}\n          borderStyle=\"bold\"\n          borderLeft\n          borderTop={false}\n          borderBottom={false}\n          borderRight={false}\n          borderColor=\"gray\"\n        >\n          <Box flexDirection=\"column\">\n            {bq.tokens.map((child, i) => renderBlock(child, i))}\n          </Box>\n        </Box>\n      );\n    }\n    case \"list\": {\n      const l = token as Tokens.List;\n      return (\n        <Box key={key} flexDirection=\"column\">\n          {l.items.map((item, idx) => (\n            <Box key={idx} gap={1}>\n              <Text dimColor>\n                {l.ordered ? `${Number(l.start ?? 1) + idx}.` : \"•\"}\n              </Text>\n              <Text>\n                {item.tokens.flatMap((child) => {\n                  if (child.type === \"text\") {\n                    const tt = child as Tokens.Text;\n                    return tt.tokens ? renderInline(tt.tokens) : [tt.text];\n                  }\n                  if (child.type === \"list\") return [renderBlock(child, idx)];\n                  return \"tokens\" in child\n                    ? renderInline((child as { tokens: Token[] }).tokens)\n                    : [];\n                })}\n              </Text>\n            </Box>\n          ))}\n        </Box>\n      );\n    }\n    case \"hr\":\n      return (\n        <Text key={key} dimColor>\n          {\"─\".repeat(40)}\n        </Text>\n      );\n    case \"space\":\n      return null;\n    default:\n      // Fallback: render raw text if present\n      if (\"text\" in token)\n        return <Text key={key}>{(token as { text: string }).text}</Text>;\n      return null;\n  }\n}\n\n/**\n * MarkdownText — renders markdown-formatted text with proper terminal styling.\n *\n * Uses `marked` lexer to parse markdown into an AST, then maps tokens to\n * Ink components. Supports headings, bold, italic, code (inline + blocks),\n * lists, blockquotes, horizontal rules, strikethrough, and links.\n *\n */\nfunction MarkdownText({ text }: { text: string }) {\n  const tokens = useMemo(\n    () => marked.lexer(text, { gfm: true, breaks: true }),\n    [text],\n  );\n  const blocks = tokens\n    .map((t, i) => renderBlock(t, i))\n    .filter((n) => n != null);\n  return (\n    <Box flexDirection=\"column\" gap={0}>\n      {blocks}\n    </Box>\n  );\n}\n\nfunction MarkdownComponent({ element }: ComponentRenderProps) {\n  const p = element.props as { text?: string };\n  return <MarkdownText text={p.text ?? \"\"} />;\n}\n\n// =============================================================================\n// Standard Components Registry\n// =============================================================================\n\nexport const standardComponents: ComponentRegistry = {\n  Box: BoxComponent,\n  Text: TextComponent,\n  Newline: NewlineComponent,\n  Spacer: SpacerComponent,\n  Heading: HeadingComponent,\n  Divider: DividerComponent,\n  Badge: BadgeComponent,\n  Spinner: SpinnerComponent,\n  ProgressBar: ProgressBarComponent,\n  Sparkline: SparklineComponent,\n  BarChart: BarChartComponent,\n  Table: TableComponent,\n  List: ListComponent,\n  ListItem: ListItemComponent,\n  Card: CardComponent,\n  KeyValue: KeyValueComponent,\n  Link: LinkComponent,\n  StatusLine: StatusLineComponent,\n  Metric: MetricComponent,\n  Callout: CalloutComponent,\n  Timeline: TimelineComponent,\n  TextInput: TextInputComponent,\n  Select: SelectComponent,\n  MultiSelect: MultiSelectComponent,\n  ConfirmInput: ConfirmInputComponent,\n  Tabs: TabsComponent,\n  Markdown: MarkdownComponent,\n};\n","import { useState, useCallback, useRef, useEffect } from \"react\";\nimport type {\n  Spec,\n  UIElement,\n  FlatElement,\n  SpecStreamLine,\n} from \"@json-render/core\";\nimport {\n  applySpecPatch,\n  validateSpec,\n  autoFixSpec,\n  formatSpecIssues,\n} from \"@json-render/core\";\nimport { useStateStore } from \"./contexts/state\";\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 * @example\n * ```tsx\n * const [value, setValue] = useBoundProp<string>(element.props.value, bindings?.value);\n * ```\n */\nexport function useBoundProp<T>(\n  propValue: T | undefined,\n  bindingPath: string | undefined,\n): [T | undefined, (value: T) => void] {\n  const { set } = useStateStore();\n  const setValue = useCallback(\n    (value: T) => {\n      if (bindingPath) set(bindingPath, value);\n    },\n    [bindingPath, set],\n  );\n  return [propValue, setValue];\n}\n\n/**\n * Result of attempting to parse a JSONL line.\n * - `patch`: successfully parsed patch (or null)\n * - `malformed`: true only if the line looked like JSON (starts with `{`)\n *   but could not be parsed. Plain text commentary is NOT malformed.\n */\ninterface ParseResult {\n  patch: SpecStreamLine | null;\n  malformed: boolean;\n}\n\n/**\n * Check if a line looks like it's attempting to be JSON.\n * LLMs often output commentary text before/between patches — those\n * lines should be skipped, not treated as malformed.\n */\nfunction looksLikeJson(line: string): boolean {\n  return line.startsWith(\"{\") || line.startsWith(\"[\");\n}\n\n/**\n * Parse a single JSON patch line with LLM-specific recovery.\n * Wraps core's parseSpecStreamLine with recovery for common LLM errors\n * like trailing extra braces.\n *\n * Returns a ParseResult so the caller can distinguish between:\n * - Successfully parsed patch\n * - Commentary text (skip silently)\n * - Genuinely malformed JSON (trigger retry)\n */\nfunction parsePatchLine(line: string): ParseResult {\n  const trimmed = line.trim();\n  if (!trimmed || trimmed.startsWith(\"//\")) {\n    return { patch: null, malformed: false };\n  }\n\n  // If it doesn't look like JSON at all, it's commentary — skip it\n  if (!looksLikeJson(trimmed)) {\n    return { patch: null, malformed: false };\n  }\n\n  // Try parsing as-is first\n  try {\n    const parsed = JSON.parse(trimmed);\n    // Validate it's a patch operation (must have `op` field)\n    if (parsed && typeof parsed === \"object\" && typeof parsed.op === \"string\") {\n      return { patch: parsed as SpecStreamLine, malformed: false };\n    }\n    // Valid JSON but not a patch — skip (could be metadata)\n    return { patch: null, malformed: false };\n  } catch {\n    // Fall through to recovery\n  }\n\n  // Recovery: strip trailing extra braces/brackets one at a time\n  // LLMs commonly generate extra closing characters in nested JSON\n  let attempt = trimmed;\n  for (let i = 0; i < 8; i++) {\n    const last = attempt[attempt.length - 1];\n    if (last === \"}\" || last === \"]\") {\n      attempt = attempt.slice(0, -1);\n      try {\n        const result = JSON.parse(attempt);\n        // Validate that the parsed result is actually a patch operation\n        if (\n          result &&\n          typeof result === \"object\" &&\n          typeof result.op === \"string\"\n        ) {\n          console.warn(\n            `[json-render] Recovered malformed JSONL line by removing ${i + 1} trailing '${last}'`,\n          );\n          return { patch: result as SpecStreamLine, malformed: false };\n        }\n        // Valid JSON but not a patch — treat as malformed\n        return { patch: null, malformed: true };\n      } catch {\n        // Keep stripping\n      }\n    } else {\n      break;\n    }\n  }\n\n  // Looks like JSON but couldn't parse — genuinely malformed\n  return { patch: null, malformed: true };\n}\n\n// =============================================================================\n// Stream result types\n// =============================================================================\n\n/** Result of a single stream request */\ninterface StreamResult {\n  /** The spec after applying all successfully parsed patches */\n  spec: Spec;\n  /** Whether the stream completed naturally (vs. being aborted) */\n  completed: boolean;\n  /** Malformed lines that could not be parsed (even after recovery) */\n  malformedLines: string[];\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   * Custom fetch implementation with ReadableStream support.\n   *\n   * Falls back to the global `fetch` if not provided.\n   */\n  fetch?: (url: string, init?: RequestInit) => Promise<Response>;\n  /**\n   * Enable validation and auto-repair.\n   *\n   * When true:\n   * - **Mid-stream**: Each JSONL line is validated as it arrives. If a line\n   *   is malformed JSON (and recovery fails), the stream is aborted\n   *   immediately and a repair prompt is sent to continue generation.\n   * - **Post-stream**: After the stream completes, structural validation\n   *   runs (missing children, visible-in-props, etc.). Issues that can be\n   *   auto-fixed are fixed locally; remaining errors trigger a repair prompt.\n   *\n   * Defaults to false.\n   */\n  validate?: boolean;\n  /**\n   * Maximum number of automatic repair retries (covers both mid-stream\n   * and post-stream retries combined). Defaults to 5.\n   */\n  maxRetries?: number;\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  /** Send a prompt to generate UI */\n  send: (prompt: string, context?: Record<string, unknown>) => Promise<void>;\n  /** Stop the current generation */\n  stop: () => void;\n  /** Clear the current spec */\n  clear: () => void;\n}\n\n/**\n * Hook for streaming UI generation via JSONL patches.\n *\n * @example\n * ```tsx\n * const { spec, isStreaming, send } = useUIStream({\n *   api: \"/api/generate-ui\",\n *   onComplete: (spec) => console.log(\"Done!\", spec),\n * });\n *\n * // Trigger generation\n * await send(\"Create a dashboard with stats\");\n *\n * // Render the spec\n * <Renderer spec={spec} loading={isStreaming} />\n * ```\n */\nexport function useUIStream({\n  api,\n  onComplete,\n  onError,\n  fetch: fetchFn = globalThis.fetch,\n  validate: enableValidation = false,\n  maxRetries = 5,\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 abortControllerRef = useRef<AbortController | null>(null);\n  // Tracks the current request so only the latest one updates isStreaming.\n  const requestIdRef = useRef(0);\n\n  // Use refs for callbacks to avoid stale closures and unnecessary\n  // re-creation of `send` when consumers 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 stop = useCallback(() => {\n    abortControllerRef.current?.abort();\n    setIsStreaming(false);\n  }, []);\n\n  const clear = useCallback(() => {\n    setSpec(null);\n    setError(null);\n  }, []);\n\n  /**\n   * Stream a single request. Returns the result including whether the\n   * stream completed and any malformed lines encountered.\n   *\n   * When `abortOnMalformed` is true, the stream is aborted on the first\n   * malformed line so the caller can retry immediately.\n   */\n  const streamRequest = useCallback(\n    async (\n      prompt: string,\n      context: Record<string, unknown> | undefined,\n      initialSpec: Spec,\n      abortOnMalformed: boolean,\n      controller: AbortController,\n    ): Promise<StreamResult> => {\n      let currentSpec = initialSpec;\n      setSpec(currentSpec);\n      const malformedLines: string[] = [];\n\n      const response = await fetchFn(api, {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify({\n          prompt,\n          context,\n          currentSpec,\n        }),\n        signal: controller.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, 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      let aborted = false;\n\n      while (true) {\n        const { done, value } = await reader.read();\n        if (done) {\n          break;\n        }\n\n        const decoded = decoder.decode(value, { stream: true });\n        buffer += decoded;\n\n        // Process complete lines\n        const lines = buffer.split(\"\\n\");\n        buffer = lines.pop() ?? \"\";\n\n        for (const line of lines) {\n          const { patch, malformed } = parsePatchLine(line);\n          if (patch) {\n            // applySpecPatch mutates in place — deep-clone so React\n            // never sees mutated objects from a previous render.\n            currentSpec = applySpecPatch(structuredClone(currentSpec), patch);\n            setSpec(currentSpec);\n          } else if (malformed) {\n            // Genuinely malformed JSON (started with { but couldn't parse)\n            malformedLines.push(line.trim());\n\n            if (abortOnMalformed) {\n              await reader.cancel();\n              aborted = true;\n              break;\n            }\n          }\n          // else: commentary text — skip silently\n        }\n\n        if (aborted) break;\n      }\n\n      // Process any remaining buffer (only if stream completed naturally)\n      if (!aborted && buffer.trim()) {\n        const { patch, malformed } = parsePatchLine(buffer);\n        if (patch) {\n          currentSpec = applySpecPatch(structuredClone(currentSpec), patch);\n          setSpec(currentSpec);\n        } else if (malformed) {\n          malformedLines.push(buffer.trim());\n        }\n      }\n\n      return { spec: currentSpec, completed: !aborted, malformedLines };\n    },\n    [api, fetchFn],\n  );\n\n  const send = useCallback(\n    async (prompt: string, context?: Record<string, unknown>) => {\n      // Abort any existing request\n      abortControllerRef.current?.abort();\n      const controller = new AbortController();\n      abortControllerRef.current = controller;\n      const thisRequestId = ++requestIdRef.current;\n\n      setIsStreaming(true);\n      setError(null);\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\n      let retriesUsed = 0;\n      let currentPrompt = prompt;\n      let currentContext = context;\n\n      try {\n        // Retry loop handles both mid-stream (malformed JSON) and\n        // post-stream (structural validation) repairs.\n        while (retriesUsed <= maxRetries) {\n          const result = await streamRequest(\n            currentPrompt,\n            currentContext,\n            currentSpec,\n            enableValidation, // only abort on malformed when validation is on\n            controller,\n          );\n          currentSpec = result.spec;\n\n          // ---------------------------------------------------------------\n          // Mid-stream repair: stream was aborted due to malformed line\n          // ---------------------------------------------------------------\n          if (!result.completed && result.malformedLines.length > 0) {\n            if (retriesUsed >= maxRetries) {\n              break;\n            }\n            retriesUsed++;\n\n            // Build a repair prompt that asks the AI to continue from\n            // the current partial spec\n            currentContext = { ...context, previousSpec: currentSpec };\n            currentPrompt =\n              `The previous generation contained malformed JSON that could not be parsed. The line was:\\n` +\n              `${result.malformedLines[result.malformedLines.length - 1]?.slice(0, 500)}\\n\\n` +\n              `The current spec state is provided. Continue generating from where you left off. ` +\n              `Output ONLY the remaining patches needed to complete the UI.`;\n            continue;\n          }\n\n          // ---------------------------------------------------------------\n          // Post-stream: validation is off or spec is empty → done\n          // ---------------------------------------------------------------\n          if (!enableValidation || !currentSpec.root) {\n            break;\n          }\n\n          // ---------------------------------------------------------------\n          // Post-stream: auto-fix deterministic issues. Lossless fixes (field\n          // relocations) apply immediately. Lossy fixes (pruned content) are\n          // held back while retries remain so validation fails and the model\n          // is asked to repair; they apply as a last resort once retries are\n          // exhausted, trading dropped content for a renderable spec.\n          // ---------------------------------------------------------------\n          const { spec: fixedSpec, fixDetails } = autoFixSpec(currentSpec, {\n            lossy: retriesUsed >= maxRetries,\n          });\n          if (fixDetails.length > 0) {\n            currentSpec = fixedSpec;\n            setSpec({ ...currentSpec });\n          }\n\n          // ---------------------------------------------------------------\n          // Post-stream: structural validation\n          // ---------------------------------------------------------------\n          const validation = validateSpec(currentSpec);\n          if (validation.valid) {\n            break;\n          }\n\n          // Still has errors — check if max retries exhausted\n          if (retriesUsed >= maxRetries) {\n            break;\n          }\n\n          retriesUsed++;\n          const issueText = formatSpecIssues(validation.issues);\n\n          currentContext = { ...context, previousSpec: currentSpec };\n          currentPrompt =\n            `FIX THE FOLLOWING ERRORS in the current UI spec. Output ONLY the patches needed to fix these issues, do not recreate the entire UI.\\n\\n` +\n            issueText;\n          // continue loop\n        }\n\n        // If retries were exhausted and validation still fails, report error\n        // instead of silently treating partial/invalid specs as complete.\n        if (enableValidation && retriesUsed >= maxRetries && currentSpec.root) {\n          const finalValidation = validateSpec(currentSpec);\n          if (!finalValidation.valid) {\n            const issueText = formatSpecIssues(finalValidation.issues);\n            const validationError = new Error(\n              `Spec validation failed after ${maxRetries} retries:\\n${issueText}`,\n            );\n            setError(validationError);\n            onErrorRef.current?.(validationError);\n            return;\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        // Only the latest request updates isStreaming to avoid the race\n        // where an aborted request's finally clears streaming for the active one.\n        if (requestIdRef.current === thisRequestId) {\n          setIsStreaming(false);\n        }\n      }\n    },\n    [api, fetchFn, enableValidation, maxRetries, streamRequest],\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    send,\n    stop,\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      } else {\n        console.warn(\n          `[json-render] flatToTree: element \"${element.key}\" references parent \"${element.parentKey}\" which does not exist. Element will be orphaned.`,\n        );\n      }\n    } else {\n      if (root) {\n        console.warn(\n          `[json-render] flatToTree: multiple root elements found (\"${root}\" and \"${element.key}\"). Using \"${element.key}\" as root.`,\n        );\n      }\n      root = element.key;\n    }\n  }\n\n  return { root, elements: elementMap };\n}\n"],"mappings":"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","names":["value","createContext","useContext","useMemo","jsx","createContext","useMemo","useContext","createContext","useContext","useState","useCallback","useMemo","useRef","useInput","createContext","useCallback","useContext","useEffect","useMemo","jsx","value","jsx","createContext","useRef","useState","useCallback","value","binding","useMemo","useContext","executeAction","useInput","createContext","useContext","useState","useCallback","useEffect","useMemo","jsx","createContext","useState","useCallback","value","useMemo","useContext","useEffect","createContext","useContext","useMemo","jsx","createStateStore","React","useCallback","useMemo","Text","evaluateVisibility","getByPath","useState","useEffect","useMemo","Box","Text","useInput","useState","useCallback","useRef","useEffect","useCallback","useState","useRef","error","useEffect","jsx","jsxs","Box","Text","useState","useEffect","useInput","isActive","useMemo","Fragment","jsx","jsxs","React","ElementRenderer","useMemo","evaluateVisibility","useCallback","Text","getByPath","executeAction"]}