@json-render/react-native 0.18.0 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../react-state/src/index.tsx","../src/contexts/visibility.tsx","../src/contexts/actions.tsx","../src/contexts/validation.tsx","../src/contexts/repeat-scope.tsx","../src/index.ts","../src/renderer.tsx","../src/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 React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport { Modal, View, Text, Pressable, StyleSheet } from \"react-native\";\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\";\n\n/**\n * Generate a unique ID for use with the \"$id\" token.\n * Combines a timestamp with a random suffix for uniqueness.\n */\nlet idCounter = 0;\nfunction generateUniqueId(): string {\n idCounter += 1;\n return `${Date.now()}-${idCounter}`;\n}\n\n/**\n * Deep-resolve dynamic value references within an object.\n *\n * Supported tokens:\n * - `{ $state: \"/statePath\" }` - read a value from state\n * - `\"$id\"` (string) or `{ \"$id\": true }` - generate a unique ID\n *\n * This allows pushState values to contain references to current state\n * and auto-generated IDs.\n */\nfunction deepResolveValue(\n value: unknown,\n get: (path: string) => unknown,\n): unknown {\n if (value === null || value === undefined) return value;\n\n // \"$id\" string token -> generate unique ID\n if (value === \"$id\") {\n return generateUniqueId();\n }\n\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj);\n\n // { $state: \"/foo\" } -> read from state\n if (keys.length === 1 && typeof obj.$state === \"string\") {\n return get(obj.$state as string);\n }\n\n // { \"$id\": true } -> generate unique ID (single-key object)\n if (keys.length === 1 && \"$id\" in obj) {\n return generateUniqueId();\n }\n }\n\n // Recurse into arrays\n if (Array.isArray(value)) {\n return value.map((item) => deepResolveValue(item, get));\n }\n\n // Recurse into plain objects\n if (typeof value === \"object\") {\n const resolved: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value as Record<string, unknown>)) {\n resolved[key] = deepResolveValue(val, get);\n }\n return resolved;\n }\n\n return value;\n}\n\n/**\n * Pending confirmation state\n */\nexport interface PendingConfirmation {\n /** The resolved action */\n action: ResolvedAction;\n /** The action handler */\n handler: ActionHandler;\n /** Resolve callback */\n resolve: () => void;\n /** Reject callback */\n reject: () => void;\n}\n\n/**\n * Action context value\n */\nexport interface ActionContextValue {\n /** Registered action handlers */\n handlers: Record<string, ActionHandler>;\n /** Currently loading action names */\n loadingActions: Set<string>;\n /** Pending confirmation dialog */\n pendingConfirmation: PendingConfirmation | null;\n /** Execute an action binding */\n execute: (binding: ActionBinding) => Promise<void>;\n /** Confirm the pending action */\n confirm: () => void;\n /** Cancel the pending action */\n cancel: () => void;\n /** Register an action handler */\n registerHandler: (name: string, handler: ActionHandler) => void;\n}\n\nconst ActionContext = createContext<ActionContextValue | null>(null);\n\n/**\n * Props for ActionProvider\n */\nexport interface ActionProviderProps {\n /** Initial action handlers */\n handlers?: Record<string, ActionHandler>;\n /** Navigation function */\n navigate?: (path: string) => void;\n children: ReactNode;\n}\n\n/**\n * Provider for action execution\n */\nexport function ActionProvider({\n handlers: initialHandlers = {},\n navigate,\n children,\n}: ActionProviderProps) {\n const { get, set, getSnapshot } = useStateStore();\n const [handlers, setHandlers] =\n useState<Record<string, ActionHandler>>(initialHandlers);\n const [loadingActions, setLoadingActions] = useState<Set<string>>(new Set());\n const [pendingConfirmation, setPendingConfirmation] =\n useState<PendingConfirmation | null>(null);\n\n const registerHandler = useCallback(\n (name: string, handler: ActionHandler) => {\n setHandlers((prev) => ({ ...prev, [name]: handler }));\n },\n [],\n );\n\n const execute = useCallback(\n async (binding: ActionBinding) => {\n const resolved = resolveAction(binding, getSnapshot());\n\n // Built-in: setState updates the StateProvider state directly\n if (resolved.action === \"setState\" && resolved.params) {\n const statePath = resolved.params.statePath as string;\n const value = resolved.params.value;\n if (statePath) {\n set(statePath, value);\n }\n return;\n }\n\n // Built-in: pushState appends an item to an array in state.\n // Supports dynamic values inside the value object via { $state: \"/...\" } syntax.\n if (resolved.action === \"pushState\" && resolved.params) {\n const statePath = resolved.params.statePath as string;\n const rawValue = resolved.params.value;\n if (statePath) {\n const resolvedValue = deepResolveValue(rawValue, get);\n const arr = (get(statePath) as unknown[] | undefined) ?? [];\n set(statePath, [...arr, resolvedValue]);\n // Optionally clear a state path after pushing (e.g. clear the input)\n const clearStatePath = resolved.params.clearStatePath as\n | string\n | undefined;\n if (clearStatePath) {\n set(clearStatePath, \"\");\n }\n }\n return;\n }\n\n // Built-in: removeState removes an item from an array in state by index.\n if (resolved.action === \"removeState\" && resolved.params) {\n const statePath = resolved.params.statePath as string;\n const index = resolved.params.index as number;\n if (statePath !== undefined && index !== undefined) {\n const arr = (get(statePath) as unknown[] | undefined) ?? [];\n set(\n statePath,\n arr.filter((_, i) => i !== index),\n );\n }\n return;\n }\n\n // Built-in: push navigates to a new screen by updating state.\n // Pushes the current screen onto /navStack and sets /currentScreen.\n if (resolved.action === \"push\" && resolved.params) {\n const screen = resolved.params.screen as string;\n if (screen) {\n const currentScreen = get(\"/currentScreen\") as string | undefined;\n const navStack = (get(\"/navStack\") as string[] | undefined) ?? [];\n if (currentScreen) {\n set(\"/navStack\", [...navStack, currentScreen]);\n } else {\n // No current screen set yet -- push a sentinel so pop returns here\n set(\"/navStack\", [...navStack, \"\"]);\n }\n set(\"/currentScreen\", screen);\n }\n return;\n }\n\n // Built-in: pop navigates back to the previous screen.\n // Pops the last entry from /navStack and restores /currentScreen.\n if (resolved.action === \"pop\") {\n const navStack = (get(\"/navStack\") as string[] | undefined) ?? [];\n if (navStack.length > 0) {\n const previousScreen = navStack[navStack.length - 1];\n set(\"/navStack\", navStack.slice(0, -1));\n if (previousScreen) {\n set(\"/currentScreen\", previousScreen);\n } else {\n // Sentinel empty string = clear currentScreen (return to default)\n set(\"/currentScreen\", undefined);\n }\n }\n return;\n }\n\n const handler = handlers[resolved.action];\n\n if (!handler) {\n console.warn(`No handler registered for action: ${resolved.action}`);\n return;\n }\n\n // If confirmation is required, show dialog\n if (resolved.confirm) {\n return new Promise<void>((resolve, reject) => {\n setPendingConfirmation({\n action: resolved,\n handler,\n resolve: () => {\n setPendingConfirmation(null);\n resolve();\n },\n reject: () => {\n setPendingConfirmation(null);\n reject(new Error(\"Action cancelled\"));\n },\n });\n }).then(async () => {\n setLoadingActions((prev) => new Set(prev).add(resolved.action));\n try {\n await executeAction({\n action: resolved,\n handler,\n setState: set,\n navigate,\n executeAction: async (name) => {\n const subBinding: ActionBinding = { action: name };\n await execute(subBinding);\n },\n });\n } finally {\n setLoadingActions((prev) => {\n const next = new Set(prev);\n next.delete(resolved.action);\n return next;\n });\n }\n });\n }\n\n // Execute immediately\n setLoadingActions((prev) => new Set(prev).add(resolved.action));\n try {\n await executeAction({\n action: resolved,\n handler,\n setState: set,\n navigate,\n executeAction: async (name) => {\n const subBinding: ActionBinding = { action: name };\n await execute(subBinding);\n },\n });\n } finally {\n setLoadingActions((prev) => {\n const next = new Set(prev);\n next.delete(resolved.action);\n return next;\n });\n }\n },\n [handlers, get, set, getSnapshot, navigate],\n );\n\n const confirm = useCallback(() => {\n pendingConfirmation?.resolve();\n }, [pendingConfirmation]);\n\n const cancel = useCallback(() => {\n pendingConfirmation?.reject();\n }, [pendingConfirmation]);\n\n const value = useMemo<ActionContextValue>(\n () => ({\n handlers,\n loadingActions,\n pendingConfirmation,\n execute,\n confirm,\n cancel,\n registerHandler,\n }),\n [\n handlers,\n loadingActions,\n pendingConfirmation,\n execute,\n confirm,\n cancel,\n registerHandler,\n ],\n );\n\n return (\n <ActionContext.Provider value={value}>{children}</ActionContext.Provider>\n );\n}\n\n/**\n * Hook to access action context\n */\nexport function useActions(): ActionContextValue {\n const ctx = useContext(ActionContext);\n if (!ctx) {\n throw new Error(\"useActions must be used within an ActionProvider\");\n }\n return ctx;\n}\n\n/**\n * Hook to execute an action binding\n */\nexport function useAction(binding: ActionBinding): {\n execute: () => Promise<void>;\n isLoading: boolean;\n} {\n const { execute, loadingActions } = useActions();\n const isLoading = loadingActions.has(binding.action);\n\n const executeAction = useCallback(() => execute(binding), [execute, binding]);\n\n return { execute: executeAction, isLoading };\n}\n\n/**\n * Props for ConfirmDialog component\n */\nexport interface ConfirmDialogProps {\n /** The confirmation config */\n confirm: ActionConfirm;\n /** Called when confirmed */\n onConfirm: () => void;\n /** Called when cancelled */\n onCancel: () => void;\n}\n\n/**\n * Default confirmation dialog component for React Native\n */\nexport function ConfirmDialog({\n confirm,\n onConfirm,\n onCancel,\n}: ConfirmDialogProps) {\n const isDanger = confirm.variant === \"danger\";\n\n return (\n <Modal transparent animationType=\"fade\" visible onRequestClose={onCancel}>\n <Pressable style={styles.overlay} onPress={onCancel}>\n <Pressable style={styles.dialog} onPress={() => {}}>\n <Text style={styles.title}>{confirm.title}</Text>\n <Text style={styles.message}>{confirm.message}</Text>\n <View style={styles.buttons}>\n <Pressable style={styles.cancelButton} onPress={onCancel}>\n <Text style={styles.cancelButtonText}>\n {confirm.cancelLabel ?? \"Cancel\"}\n </Text>\n </Pressable>\n <Pressable\n style={[\n styles.confirmButton,\n isDanger && styles.confirmButtonDanger,\n ]}\n onPress={onConfirm}\n >\n <Text style={styles.confirmButtonText}>\n {confirm.confirmLabel ?? \"Confirm\"}\n </Text>\n </Pressable>\n </View>\n </Pressable>\n </Pressable>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: {\n flex: 1,\n backgroundColor: \"rgba(0, 0, 0, 0.5)\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n dialog: {\n backgroundColor: \"white\",\n borderRadius: 8,\n padding: 24,\n maxWidth: 400,\n width: \"90%\",\n shadowColor: \"#000\",\n shadowOffset: { width: 0, height: 20 },\n shadowOpacity: 0.1,\n shadowRadius: 25,\n elevation: 10,\n },\n title: {\n fontSize: 18,\n fontWeight: \"600\",\n marginBottom: 8,\n },\n message: {\n fontSize: 14,\n color: \"#6b7280\",\n marginBottom: 24,\n },\n buttons: {\n flexDirection: \"row\",\n justifyContent: \"flex-end\",\n gap: 12,\n },\n cancelButton: {\n paddingVertical: 8,\n paddingHorizontal: 16,\n borderRadius: 6,\n borderWidth: 1,\n borderColor: \"#d1d5db\",\n backgroundColor: \"white\",\n },\n cancelButtonText: {\n fontSize: 14,\n color: \"#374151\",\n },\n confirmButton: {\n paddingVertical: 8,\n paddingHorizontal: 16,\n borderRadius: 6,\n backgroundColor: \"#3b82f6\",\n },\n confirmButtonDanger: {\n backgroundColor: \"#dc2626\",\n },\n confirmButtonText: {\n fontSize: 14,\n color: \"white\",\n },\n});\n","import React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport {\n runValidation,\n type ValidationConfig,\n type ValidationFunction,\n type ValidationResult,\n} from \"@json-render/core\";\nimport { useStateStore } from \"./state\";\n\n/**\n * Field validation state\n */\nexport interface FieldValidationState {\n /** Whether the field has been touched */\n touched: boolean;\n /** Whether the field has been validated */\n validated: boolean;\n /** Validation result */\n result: ValidationResult | null;\n}\n\n/**\n * Validation context value\n */\nexport interface ValidationContextValue {\n /** Custom validation functions from catalog */\n customFunctions: Record<string, ValidationFunction>;\n /** Validation state by field path */\n fieldStates: Record<string, FieldValidationState>;\n /** Validate a field */\n validate: (path: string, config: ValidationConfig) => ValidationResult;\n /** Mark field as touched */\n touch: (path: string) => void;\n /** Clear validation for a field */\n clear: (path: string) => void;\n /** Validate all fields */\n validateAll: () => boolean;\n /** Register field config */\n registerField: (path: string, config: ValidationConfig) => void;\n}\n\nconst ValidationContext = createContext<ValidationContextValue | null>(null);\n\n/**\n * Props for ValidationProvider\n */\nexport interface ValidationProviderProps {\n /** Custom validation functions from catalog */\n customFunctions?: Record<string, ValidationFunction>;\n children: ReactNode;\n}\n\n/**\n * Compare two DynamicValue args records shallowly.\n * Values are primitives or { $state: string }, so shallow comparison suffices.\n */\nfunction dynamicArgsEqual(\n a: Record<string, unknown> | undefined,\n b: Record<string, unknown> | undefined,\n): boolean {\n if (a === b) return true;\n if (!a || !b) return false;\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n const va = a[key];\n const vb = b[key];\n if (va === vb) continue;\n // Handle { $state: string } objects\n if (\n typeof va === \"object\" &&\n va !== null &&\n typeof vb === \"object\" &&\n vb !== null\n ) {\n const sa = (va as Record<string, unknown>).$state;\n const sb = (vb as Record<string, unknown>).$state;\n if (typeof sa === \"string\" && sa === sb) continue;\n }\n return false;\n }\n return true;\n}\n\n/**\n * Structural equality check for ValidationConfig.\n */\nfunction validationConfigEqual(\n a: ValidationConfig,\n b: ValidationConfig,\n): boolean {\n if (a === b) return true;\n\n // Compare validateOn\n if (a.validateOn !== b.validateOn) return false;\n\n // Compare checks arrays\n const ac = a.checks ?? [];\n const bc = b.checks ?? [];\n if (ac.length !== bc.length) return false;\n\n for (let i = 0; i < ac.length; i++) {\n const ca = ac[i]!;\n const cb = bc[i]!;\n if (ca.type !== cb.type) return false;\n if (ca.message !== cb.message) return false;\n if (!dynamicArgsEqual(ca.args, cb.args)) return false;\n }\n\n return true;\n}\n\n/**\n * Provider for validation\n */\nexport function ValidationProvider({\n customFunctions = {},\n children,\n}: ValidationProviderProps) {\n const { state } = 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 // Bail out (return same reference) if config is unchanged to avoid\n // infinite re-render loops when callers pass a fresh object each render.\n if (existing && validationConfigEqual(existing, config)) {\n return prev;\n }\n return { ...prev, [path]: config };\n });\n },\n [],\n );\n\n const validate = useCallback(\n (path: string, config: ValidationConfig): ValidationResult => {\n // Walk the nested state object using JSON Pointer segments\n const segments = path.split(\"/\").filter(Boolean);\n let value: unknown = state;\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: state,\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 [state, 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\n for (const [path, config] of Object.entries(fieldConfigs)) {\n const result = validate(path, config);\n if (!result.valid) {\n allValid = false;\n }\n }\n\n return allValid;\n }, [fieldConfigs, validate]);\n\n const value = useMemo<ValidationContextValue>(\n () => ({\n customFunctions,\n fieldStates,\n validate,\n touch,\n clear,\n validateAll,\n registerField,\n }),\n [\n customFunctions,\n fieldStates,\n validate,\n touch,\n clear,\n validateAll,\n registerField,\n ],\n );\n\n return (\n <ValidationContext.Provider value={value}>\n {children}\n </ValidationContext.Provider>\n );\n}\n\n/**\n * Hook to access validation context\n */\nexport function useValidation(): ValidationContextValue {\n const ctx = useContext(ValidationContext);\n if (!ctx) {\n throw new Error(\"useValidation must be used within a ValidationProvider\");\n }\n return ctx;\n}\n\n/**\n * Hook to get validation state for a field\n */\nexport function useFieldValidation(\n path: string,\n config?: ValidationConfig,\n): {\n state: FieldValidationState;\n validate: () => ValidationResult;\n touch: () => void;\n clear: () => void;\n errors: string[];\n isValid: boolean;\n} {\n const {\n fieldStates,\n validate: validateField,\n touch: touchField,\n clear: clearField,\n registerField,\n } = useValidation();\n\n // Register field on mount\n React.useEffect(() => {\n if (config) {\n registerField(path, config);\n }\n }, [path, config, registerField]);\n\n const state = fieldStates[path] ?? {\n touched: false,\n validated: false,\n result: null,\n };\n\n const validate = useCallback(\n () => validateField(path, config ?? { checks: [] }),\n [path, config, validateField],\n );\n\n const touch = useCallback(() => touchField(path), [path, touchField]);\n const clear = useCallback(() => clearField(path), [path, clearField]);\n\n return {\n state,\n validate,\n touch,\n clear,\n errors: state.result?.errors ?? [],\n isValid: state.result?.valid ?? true,\n };\n}\n","import React, { createContext, useContext, type ReactNode } from \"react\";\n\n/**\n * Repeat scope value provided to child elements inside a repeated element.\n */\nexport interface RepeatScopeValue {\n /** The current array item object */\n item: unknown;\n /** Index of the current item in the array */\n index: number;\n /** Absolute state path to the current array item (e.g. \"/todos/0\") — used for statePath two-way binding */\n basePath: string;\n}\n\nconst RepeatScopeContext = createContext<RepeatScopeValue | null>(null);\n\n/**\n * Provides repeat scope to child elements so $item and $index expressions resolve correctly.\n */\nexport function RepeatScopeProvider({\n item,\n index,\n basePath,\n children,\n}: RepeatScopeValue & { children: ReactNode }) {\n return (\n <RepeatScopeContext.Provider value={{ item, index, basePath }}>\n {children}\n </RepeatScopeContext.Provider>\n );\n}\n\n/**\n * Read the current repeat scope (or null if not inside a repeated element).\n */\nexport function useRepeatScope(): RepeatScopeValue | null {\n return useContext(RepeatScopeContext);\n}\n","// Contexts\nexport {\n StateProvider,\n useStateStore,\n useStateValue,\n useStateBinding,\n type StateContextValue,\n type StateProviderProps,\n} from \"./contexts/state\";\n\nexport {\n VisibilityProvider,\n useVisibility,\n useIsVisible,\n type VisibilityContextValue,\n type VisibilityProviderProps,\n} from \"./contexts/visibility\";\n\nexport {\n ActionProvider,\n useActions,\n useAction,\n ConfirmDialog,\n type ActionContextValue,\n type ActionProviderProps,\n type PendingConfirmation,\n type ConfirmDialogProps,\n} from \"./contexts/actions\";\n\nexport {\n ValidationProvider,\n useValidation,\n useFieldValidation,\n type ValidationContextValue,\n type ValidationProviderProps,\n type FieldValidationState,\n} from \"./contexts/validation\";\n\nexport {\n RepeatScopeProvider,\n useRepeatScope,\n type RepeatScopeValue,\n} from \"./contexts/repeat-scope\";\n\n// Schema (React Native's spec format)\nexport {\n schema,\n type ReactNativeSchema,\n type ReactNativeSpec,\n // Backward compatibility\n elementTreeSchema,\n type ElementTreeSchema,\n type ElementTreeSpec,\n} from \"./schema\";\n\n// Core types (re-exported for convenience)\nexport type { Spec, StateStore } from \"@json-render/core\";\nexport { createStateStore } from \"@json-render/core\";\n\n// Catalog-aware types for React Native\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 // Standard components\n standardComponents,\n createStandardActionHandlers,\n} from \"./renderer\";\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 type {\n UIElement,\n Spec,\n ActionBinding,\n Catalog,\n SchemaDefinition,\n StateStore,\n} from \"@json-render/core\";\nimport {\n resolveElementProps,\n resolveBindings,\n resolveActionParam,\n evaluateVisibility,\n getByPath,\n type PropResolutionContext,\n type VisibilityContext as CoreVisibilityContext,\n} from \"@json-render/core\";\nimport type {\n Components,\n Actions,\n ActionFn,\n SetState,\n StateModel,\n} from \"./catalog-types\";\nimport { useIsVisible, useVisibility } from \"./contexts/visibility\";\nimport { useActions } from \"./contexts/actions\";\nimport { useStateStore } from \"./contexts/state\";\nimport { StateProvider } from \"./contexts/state\";\nimport { VisibilityProvider } from \"./contexts/visibility\";\nimport { ActionProvider } from \"./contexts/actions\";\nimport { ValidationProvider } from \"./contexts/validation\";\nimport { ConfirmDialog } from \"./contexts/actions\";\nimport { standardComponents } from \"./components/standard\";\nimport { RepeatScopeProvider, useRepeatScope } from \"./contexts/repeat-scope\";\n\n/**\n * Props passed to component renderers\n */\nexport interface ComponentRenderProps<P = Record<string, unknown>> {\n /** The element being rendered */\n element: UIElement<string, P>;\n /** Rendered children */\n children?: ReactNode;\n /** Emit a named event. The renderer resolves the event to action binding(s) from the element's `on` field. Always provided by the renderer. */\n emit: (event: string) => void;\n /**\n * Two-way binding paths resolved from `$bindState` / `$bindItem` expressions.\n * Maps prop name → absolute state path for write-back.\n * Only present when at least one prop uses `{ $bindState: \"...\" }` or `{ $bindItem: \"...\" }`.\n */\n bindings?: Record<string, string>;\n /** Whether the parent is loading */\n loading?: boolean;\n}\n\n/**\n * Component renderer type\n */\nexport type ComponentRenderer<P = Record<string, unknown>> = ComponentType<\n ComponentRenderProps<P>\n>;\n\n/**\n * Registry of component renderers\n */\nexport type ComponentRegistry = Record<string, ComponentRenderer<any>>;\n\n/**\n * Props for the Renderer component\n */\nexport interface RendererProps {\n /** The UI spec to render */\n spec: Spec | null;\n /**\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 so\n// a single bad component never crashes the whole page.\n// ---------------------------------------------------------------------------\n\ninterface ElementErrorBoundaryProps {\n elementType: string;\n children: ReactNode;\n}\n\ninterface ElementErrorBoundaryState {\n hasError: boolean;\n}\n\nclass ElementErrorBoundary extends React.Component<\n ElementErrorBoundaryProps,\n ElementErrorBoundaryState\n> {\n constructor(props: ElementErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(): ElementErrorBoundaryState {\n return { hasError: true };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n console.error(\n `[json-render] Rendering error in <${this.props.elementType}>:`,\n error,\n info.componentStack,\n );\n }\n\n render() {\n if (this.state.hasError) {\n // Render nothing – the element silently disappears rather than\n // crashing the entire application.\n return null;\n }\n return this.props.children;\n }\n}\n\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 (used for both visibility and props)\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 (now supports $item/$index inside repeat scopes)\n const isVisible =\n element.visible === undefined\n ? true\n : evaluateVisibility(element.visible, fullCtx);\n\n // Create emit function that resolves events to action bindings.\n // Must be called before any early return to satisfy Rules of Hooks.\n const onBindings = element.on;\n const emit = useCallback(\n async (eventName: string) => {\n const binding = onBindings?.[eventName];\n if (!binding) return;\n const actionBindings = Array.isArray(binding) ? binding : [binding];\n for (const b of actionBindings) {\n if (!b.params) {\n await execute(b);\n continue;\n }\n // Build a fresh context with live store state so that $state\n // references in later actions see mutations from earlier ones.\n const liveCtx: PropResolutionContext = {\n ...fullCtx,\n stateModel: getSnapshot(),\n };\n const resolved: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(b.params)) {\n resolved[key] = resolveActionParam(val, liveCtx);\n }\n await execute({ ...b, params: resolved });\n }\n },\n [onBindings, execute, fullCtx, getSnapshot],\n );\n\n // Don't render if not visible\n if (!isVisible) {\n return null;\n }\n\n // Resolve $bindState/$bindItem expressions → bindings map (prop name → state path)\n const rawProps = element.props as Record<string, unknown>;\n const elementBindings = resolveBindings(rawProps, fullCtx);\n\n // Resolve dynamic prop expressions ($state, $item, $index, $bindState, $bindItem, $cond/$then/$else)\n const resolvedProps = resolveElementProps(rawProps, fullCtx);\n\n const resolvedElement =\n resolvedProps !== element.props\n ? { ...element, props: resolvedProps }\n : element;\n\n // Get the component renderer\n const Component = registry[resolvedElement.type] ?? fallback;\n\n if (!Component) {\n console.warn(`No renderer for component type: ${resolvedElement.type}`);\n return null;\n }\n\n // ---- Render children (with repeat support) ----\n const children = resolvedElement.repeat ? (\n <RepeatChildren\n element={resolvedElement}\n spec={spec}\n registry={registry}\n loading={loading}\n fallback={fallback}\n />\n ) : (\n resolvedElement.children?.map((childKey) => {\n const childElement = spec.elements[childKey];\n if (!childElement) {\n if (!loading) {\n console.warn(\n `[json-render] Missing element \"${childKey}\" referenced as child of \"${resolvedElement.type}\". This element will not render.`,\n );\n }\n return null;\n }\n return (\n <ElementRenderer\n key={childKey}\n element={childElement}\n 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 -- renders child elements once per item in a state array.\n// Used when an element has a `repeat` field.\n// ---------------------------------------------------------------------------\n\nfunction RepeatChildren({\n element,\n spec,\n registry,\n loading,\n fallback,\n}: {\n element: UIElement;\n spec: Spec;\n registry: ComponentRegistry;\n loading?: boolean;\n fallback?: ComponentRenderer;\n}) {\n const { state } = useStateStore();\n const repeat = element.repeat!;\n const statePath = repeat.statePath;\n\n const items = (getByPath(state, statePath) as unknown[] | undefined) ?? [];\n\n return (\n <>\n {items.map((itemValue, index) => {\n // Use a stable key: prefer key field, fall back to index\n const key =\n repeat.key && typeof itemValue === \"object\" && itemValue !== null\n ? String(\n (itemValue as Record<string, unknown>)[repeat.key] ?? index,\n )\n : String(index);\n\n return (\n <RepeatScopeProvider\n key={key}\n item={itemValue}\n index={index}\n basePath={`${statePath}/${index}`}\n >\n {element.children?.map((childKey) => {\n const childElement = spec.elements[childKey];\n if (!childElement) {\n if (!loading) {\n console.warn(\n `[json-render] Missing element \"${childKey}\" referenced as child of \"${element.type}\" (repeat). This element will not render.`,\n );\n }\n return null;\n }\n return (\n <ElementRenderer\n key={childKey}\n element={childElement}\n 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 React Native components are included.\n * Custom components in `registry` override standard ones with the same name.\n *\n * @example\n * ```tsx\n * // Use standard components only\n * <Renderer spec={spec} />\n *\n * // Add/override components\n * <Renderer spec={spec} registry={{ CustomCard: MyCard }} />\n *\n * // Disable standard components entirely\n * <Renderer spec={spec} registry={myRegistry} includeStandard={false} />\n * ```\n */\nexport function Renderer({\n spec,\n registry: customRegistry,\n includeStandard = true,\n loading,\n fallback,\n}: RendererProps) {\n // Merge standard + custom components (custom overrides standard)\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// Re-export standard components and action handlers\nexport {\n standardComponents,\n createStandardActionHandlers,\n} from \"./components/standard\";\n\n/**\n * Props for JSONUIProvider\n */\nexport interface JSONUIProviderProps {\n /**\n * Component registry. If omitted, only standard components are used.\n * Custom components are merged with (and override) standard components.\n */\n registry?: ComponentRegistry;\n /**\n * External store (controlled mode). When provided, `initialState` and\n * `onStateChange` are ignored.\n */\n store?: StateStore;\n /** Initial state model (uncontrolled mode) */\n initialState?: Record<string, unknown>;\n /** Action handlers */\n handlers?: Record<\n string,\n (params: Record<string, unknown>) => Promise<unknown> | unknown\n >;\n /** Navigation function */\n navigate?: (path: string) => void;\n /** Custom validation functions */\n validationFunctions?: Record<\n string,\n (value: unknown, args?: Record<string, unknown>) => boolean\n >;\n /** Callback when state changes (uncontrolled mode) */\n onStateChange?: (changes: Array<{ path: string; value: unknown }>) => void;\n children: ReactNode;\n}\n\n/**\n * Combined provider for all JSONUI contexts\n */\nexport function JSONUIProvider({\n registry,\n store,\n initialState,\n handlers,\n navigate,\n validationFunctions,\n onStateChange,\n children,\n}: JSONUIProviderProps) {\n return (\n <StateProvider\n store={store}\n initialState={initialState}\n onStateChange={onStateChange}\n >\n <VisibilityProvider>\n <ActionProvider handlers={handlers} navigate={navigate}>\n <ValidationProvider customFunctions={validationFunctions}>\n {children}\n <ConfirmationDialogManager />\n </ValidationProvider>\n </ActionProvider>\n </VisibilityProvider>\n </StateProvider>\n );\n}\n\n/**\n * Renders the confirmation dialog when needed\n */\nfunction ConfirmationDialogManager() {\n const { pendingConfirmation, confirm, cancel } = useActions();\n\n if (!pendingConfirmation?.action.confirm) {\n return null;\n }\n\n return (\n <ConfirmDialog\n confirm={pendingConfirmation.action.confirm}\n onConfirm={confirm}\n onCancel={cancel}\n />\n );\n}\n\n// ============================================================================\n// defineRegistry\n// ============================================================================\n\n/**\n * Result returned by defineRegistry\n */\nexport interface DefineRegistryResult {\n /** Component registry for `<Renderer registry={...} />` */\n registry: ComponentRegistry;\n /**\n * Create ActionProvider-compatible handlers.\n * Accepts getter functions so handlers always read the latest state/setState\n * (e.g. from React refs).\n */\n handlers: (\n getSetState: () => SetState | undefined,\n getState: () => StateModel,\n ) => Record<string, (params: Record<string, unknown>) => Promise<void>>;\n /**\n * Execute an action by name imperatively\n * (for use outside the React tree, e.g. initial state loading).\n */\n executeAction: (\n actionName: string,\n params: Record<string, unknown> | undefined,\n setState: SetState,\n state?: StateModel,\n ) => Promise<void>;\n}\n\n/**\n * Create a registry from a catalog with components and/or actions.\n *\n * @example\n * ```tsx\n * // Components only\n * const { registry } = defineRegistry(catalog, {\n * components: {\n * Card: ({ props, children }) => (\n * <View style={styles.card}><Text>{props.title}</Text>{children}</View>\n * ),\n * },\n * });\n *\n * // Actions only\n * const { handlers, executeAction } = defineRegistry(catalog, {\n * actions: {\n * viewCustomers: async (params, setState) => { ... },\n * },\n * });\n *\n * // Both\n * const { registry, handlers, executeAction } = defineRegistry(catalog, {\n * components: { ... },\n * actions: { ... },\n * });\n * ```\n */\nexport function defineRegistry<C extends Catalog>(\n _catalog: C,\n options: {\n components?: Components<C>;\n actions?: Actions<C>;\n },\n): DefineRegistryResult {\n // Build component registry\n const registry: ComponentRegistry = {};\n if (options.components) {\n for (const [name, componentFn] of Object.entries(options.components)) {\n registry[name] = ({\n element,\n children,\n emit,\n 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 // Build action helpers\n const actionMap = options.actions\n ? (Object.entries(options.actions) as Array<\n [string, DefineRegistryActionFn]\n >)\n : [];\n\n const handlers = (\n getSetState: () => SetState | undefined,\n getState: () => StateModel,\n ): Record<string, (params: Record<string, unknown>) => Promise<void>> => {\n const result: Record<\n string,\n (params: Record<string, unknown>) => Promise<void>\n > = {};\n for (const [name, actionFn] of actionMap) {\n result[name] = async (params) => {\n const setState = getSetState();\n const state = getState();\n if (setState) {\n await actionFn(params, setState, state);\n }\n };\n }\n return result;\n };\n\n const executeAction = async (\n actionName: string,\n params: Record<string, unknown> | undefined,\n setState: SetState,\n state: StateModel = {},\n ): Promise<void> => {\n const entry = actionMap.find(([name]) => name === actionName);\n if (entry) {\n await entry[1](params, setState, state);\n } else {\n console.warn(`Unknown action: ${actionName}`);\n }\n };\n\n return { registry, handlers, executeAction };\n}\n\n/** @internal */\ntype DefineRegistryComponentFn = (ctx: {\n props: unknown;\n children?: React.ReactNode;\n emit: (event: string) => void;\n bindings?: Record<string, string>;\n loading?: boolean;\n}) => React.ReactNode;\n\n/** @internal */\ntype DefineRegistryActionFn = (\n params: Record<string, unknown> | undefined,\n setState: SetState,\n state: StateModel,\n) => Promise<void>;\n\n// ============================================================================\n// NEW API\n// ============================================================================\n\n/**\n * Props for renderers created with createRenderer\n */\nexport interface CreateRendererProps {\n /** The spec to render (AI-generated JSON) */\n spec: Spec | null;\n /**\n * External store (controlled mode). When provided, `state` and\n * `onStateChange` are ignored.\n */\n store?: StateStore;\n /** State context for dynamic values (uncontrolled mode) */\n state?: Record<string, unknown>;\n /** Action handler */\n onAction?: (actionName: string, params?: Record<string, unknown>) => void;\n /** Callback when state changes (uncontrolled mode) */\n onStateChange?: (changes: Array<{ path: string; value: unknown }>) => void;\n /** Whether the spec is currently loading/streaming */\n loading?: boolean;\n /** Fallback component for unknown types */\n fallback?: ComponentRenderer;\n}\n\n/**\n * Component map type - maps component names to React Native components\n */\nexport type ComponentMap<\n TComponents extends Record<string, { props: unknown }>,\n> = {\n [K in keyof TComponents]: ComponentType<\n ComponentRenderProps<\n TComponents[K][\"props\"] extends { _output: infer O }\n ? O\n : Record<string, unknown>\n >\n >;\n};\n\n/**\n * Create a renderer from a catalog\n *\n * @example\n * ```typescript\n * const DashboardRenderer = createRenderer(dashboardCatalog, {\n * Card: ({ element, children }) => <View style={styles.card}>{children}</View>,\n * Metric: ({ element }) => <Text>{element.props.value}</Text>,\n * });\n *\n * // Usage\n * <DashboardRenderer spec={aiGeneratedSpec} state={state} />\n * ```\n */\nexport function createRenderer<\n TDef extends SchemaDefinition,\n TCatalog extends { components: Record<string, { props: unknown }> },\n>(\n catalog: Catalog<TDef, TCatalog>,\n components: ComponentMap<TCatalog[\"components\"]>,\n): ComponentType<CreateRendererProps> {\n // Convert component map to registry\n const registry: ComponentRegistry =\n components as unknown as ComponentRegistry;\n\n // Return the renderer component\n return function CatalogRenderer({\n spec,\n store,\n state,\n onAction,\n onStateChange,\n loading,\n fallback,\n }: CreateRendererProps) {\n // Wrap onAction with a Proxy so any action name routes to the callback\n const actionHandlers = onAction\n ? new Proxy(\n {} as Record<\n string,\n (params: Record<string, unknown>) => void | Promise<void>\n >,\n {\n get: (_target, prop: string) => {\n return (params: Record<string, unknown>) =>\n onAction(prop, params);\n },\n has: () => true,\n },\n )\n : undefined;\n\n return (\n <StateProvider\n store={store}\n initialState={state}\n onStateChange={onStateChange}\n >\n <VisibilityProvider>\n <ActionProvider handlers={actionHandlers}>\n <ValidationProvider>\n <Renderer\n spec={spec}\n registry={registry}\n loading={loading}\n fallback={fallback}\n />\n <ConfirmationDialogManager />\n </ValidationProvider>\n </ActionProvider>\n </VisibilityProvider>\n </StateProvider>\n );\n };\n}\n","import React from \"react\";\nimport {\n View,\n Text,\n Image as RNImage,\n ScrollView,\n SafeAreaView,\n Pressable,\n TextInput as RNTextInput,\n Switch as RNSwitch,\n ActivityIndicator,\n Modal as RNModal,\n StyleSheet,\n Alert,\n Share,\n Linking,\n} from \"react-native\";\nimport type { ComponentRenderProps } from \"../renderer\";\nimport type { ComponentRegistry } from \"../renderer\";\nimport { useBoundProp } from \"../hooks\";\n\n// =============================================================================\n// Layout Components\n// =============================================================================\n\nfunction ContainerComponent({ element, children }: ComponentRenderProps) {\n const p = element.props as {\n padding?: number;\n paddingHorizontal?: number;\n paddingVertical?: number;\n margin?: number;\n backgroundColor?: string;\n borderRadius?: number;\n flex?: number;\n };\n\n return (\n <View\n style={{\n padding: p.padding ?? undefined,\n paddingHorizontal: p.paddingHorizontal ?? undefined,\n paddingVertical: p.paddingVertical ?? undefined,\n margin: p.margin ?? undefined,\n backgroundColor: p.backgroundColor ?? undefined,\n borderRadius: p.borderRadius ?? undefined,\n flex: p.flex ?? undefined,\n }}\n >\n {children}\n </View>\n );\n}\n\nfunction RowComponent({ element, children }: ComponentRenderProps) {\n const p = element.props as {\n gap?: number;\n alignItems?: \"flex-start\" | \"center\" | \"flex-end\" | \"stretch\" | \"baseline\";\n justifyContent?:\n | \"flex-start\"\n | \"center\"\n | \"flex-end\"\n | \"space-between\"\n | \"space-around\"\n | \"space-evenly\";\n flexWrap?: \"wrap\" | \"nowrap\";\n padding?: number;\n flex?: number;\n };\n\n return (\n <View\n style={{\n flexDirection: \"row\",\n gap: p.gap ?? undefined,\n alignItems: p.alignItems ?? undefined,\n justifyContent: p.justifyContent ?? undefined,\n flexWrap: p.flexWrap ?? undefined,\n padding: p.padding ?? undefined,\n flex: p.flex ?? undefined,\n }}\n >\n {children}\n </View>\n );\n}\n\nfunction ColumnComponent({ element, children }: ComponentRenderProps) {\n const p = element.props as {\n gap?: number;\n alignItems?: \"flex-start\" | \"center\" | \"flex-end\" | \"stretch\" | \"baseline\";\n justifyContent?:\n | \"flex-start\"\n | \"center\"\n | \"flex-end\"\n | \"space-between\"\n | \"space-around\"\n | \"space-evenly\";\n padding?: number;\n flex?: number;\n };\n\n return (\n <View\n style={{\n flexDirection: \"column\",\n gap: p.gap ?? undefined,\n alignItems: p.alignItems ?? undefined,\n justifyContent: p.justifyContent ?? undefined,\n padding: p.padding ?? undefined,\n flex: p.flex ?? undefined,\n }}\n >\n {children}\n </View>\n );\n}\n\nfunction ScrollContainerComponent({ element, children }: ComponentRenderProps) {\n const p = element.props as {\n horizontal?: boolean;\n showsScrollIndicator?: boolean;\n padding?: number;\n backgroundColor?: string;\n flex?: number;\n };\n\n return (\n <ScrollView\n horizontal={p.horizontal ?? false}\n showsVerticalScrollIndicator={p.showsScrollIndicator ?? true}\n showsHorizontalScrollIndicator={p.showsScrollIndicator ?? true}\n contentContainerStyle={{\n padding: p.padding ?? undefined,\n }}\n style={{\n flex: p.flex ?? 1,\n backgroundColor: p.backgroundColor ?? undefined,\n }}\n >\n {children}\n </ScrollView>\n );\n}\n\nfunction SafeAreaComponent({ element, children }: ComponentRenderProps) {\n const p = element.props as {\n backgroundColor?: string;\n };\n\n return (\n <SafeAreaView\n style={{\n flex: 1,\n backgroundColor: p.backgroundColor ?? undefined,\n }}\n >\n {children}\n </SafeAreaView>\n );\n}\n\nfunction SpacerComponent({ element }: ComponentRenderProps) {\n const p = element.props as {\n size?: number;\n flex?: number;\n };\n\n return (\n <View\n style={{\n width: p.size ?? undefined,\n height: p.size ?? undefined,\n flex: p.flex ?? undefined,\n }}\n />\n );\n}\n\nfunction PressableComponent({ children, emit }: ComponentRenderProps) {\n return (\n <Pressable\n onPress={() => emit(\"press\")}\n onLongPress={() => emit(\"longPress\")}\n style={({ pressed }) => ({\n opacity: pressed ? 0.7 : 1,\n })}\n >\n {children}\n </Pressable>\n );\n}\n\nfunction DividerComponent({ element }: ComponentRenderProps) {\n const p = element.props as {\n direction?: \"horizontal\" | \"vertical\";\n color?: string;\n thickness?: number;\n margin?: number;\n };\n\n const isVertical = p.direction === \"vertical\";\n const thickness = p.thickness ?? 1;\n const color = p.color ?? \"#e5e7eb\";\n\n return (\n <View\n style={{\n width: isVertical ? thickness : \"100%\",\n height: isVertical ? \"100%\" : thickness,\n backgroundColor: color,\n marginVertical: isVertical ? 0 : (p.margin ?? 8),\n marginHorizontal: isVertical ? (p.margin ?? 8) : 0,\n }}\n />\n );\n}\n\n// =============================================================================\n// Content Components\n// =============================================================================\n\nconst headingSizes = {\n h1: 32,\n h2: 24,\n h3: 20,\n h4: 16,\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 align?: \"left\" | \"center\" | \"right\";\n };\n\n const level = p.level ?? \"h2\";\n\n return (\n <Text\n style={{\n fontSize: headingSizes[level],\n fontWeight: \"700\",\n color: p.color ?? \"#111827\",\n textAlign: p.align ?? \"left\",\n }}\n >\n {p.text}\n </Text>\n );\n}\n\nfunction ParagraphComponent({ element }: ComponentRenderProps) {\n const p = element.props as {\n text: string;\n color?: string;\n align?: \"left\" | \"center\" | \"right\";\n numberOfLines?: number;\n fontSize?: number;\n };\n\n return (\n <Text\n numberOfLines={p.numberOfLines ?? undefined}\n style={{\n fontSize: p.fontSize ?? 16,\n lineHeight: (p.fontSize ?? 16) * 1.5,\n color: p.color ?? \"#374151\",\n textAlign: p.align ?? \"left\",\n }}\n >\n {p.text}\n </Text>\n );\n}\n\nconst labelSizes = {\n xs: 10,\n sm: 12,\n md: 14,\n};\n\nfunction LabelComponent({ element }: ComponentRenderProps) {\n const p = element.props as {\n text: string;\n color?: string;\n bold?: boolean;\n size?: \"xs\" | \"sm\" | \"md\";\n };\n\n return (\n <Text\n style={{\n fontSize: labelSizes[p.size ?? \"sm\"],\n fontWeight: p.bold ? \"600\" : \"400\",\n color: p.color ?? \"#6b7280\",\n }}\n >\n {p.text}\n </Text>\n );\n}\n\nfunction ImageComponent({ element }: ComponentRenderProps) {\n const p = element.props as {\n src: string;\n alt?: string;\n width?: number;\n height?: number;\n resizeMode?: \"cover\" | \"contain\" | \"stretch\" | \"center\";\n borderRadius?: number;\n };\n\n return (\n <RNImage\n source={{ uri: p.src }}\n accessibilityLabel={p.alt ?? undefined}\n resizeMode={p.resizeMode ?? \"cover\"}\n style={{\n width: p.width ?? \"100%\",\n height: p.height ?? 200,\n borderRadius: p.borderRadius ?? 0,\n }}\n />\n );\n}\n\nconst avatarSizeMap = {\n sm: 32,\n md: 48,\n lg: 64,\n xl: 96,\n};\n\nfunction AvatarComponent({ element }: ComponentRenderProps) {\n const p = element.props as {\n src?: string;\n initials?: string;\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n backgroundColor?: string;\n };\n\n const size = avatarSizeMap[p.size ?? \"md\"];\n const bgColor = p.backgroundColor ?? \"#6366f1\";\n\n if (p.src) {\n return (\n <RNImage\n source={{ uri: p.src }}\n style={{\n width: size,\n height: size,\n borderRadius: size / 2,\n backgroundColor: \"#e5e7eb\",\n }}\n />\n );\n }\n\n return (\n <View\n style={{\n width: size,\n height: size,\n borderRadius: size / 2,\n backgroundColor: bgColor,\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <Text\n style={{\n color: \"#ffffff\",\n fontSize: size * 0.4,\n fontWeight: \"600\",\n }}\n >\n {p.initials ?? \"?\"}\n </Text>\n </View>\n );\n}\n\nconst badgeVariantColors: Record<string, { bg: string; text: string }> = {\n default: { bg: \"#e5e7eb\", text: \"#374151\" },\n info: { bg: \"#dbeafe\", text: \"#1d4ed8\" },\n success: { bg: \"#dcfce7\", text: \"#15803d\" },\n warning: { bg: \"#fef3c7\", text: \"#92400e\" },\n error: { bg: \"#fee2e2\", text: \"#dc2626\" },\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 colors = badgeVariantColors[p.variant ?? \"default\"] ?? {\n bg: \"#e5e7eb\",\n text: \"#374151\",\n };\n\n return (\n <View\n style={{\n backgroundColor: colors.bg,\n paddingHorizontal: 8,\n paddingVertical: 2,\n borderRadius: 9999,\n alignSelf: \"flex-start\",\n }}\n >\n <Text\n style={{\n fontSize: 12,\n fontWeight: \"600\",\n color: colors.text,\n }}\n >\n {p.label}\n </Text>\n </View>\n );\n}\n\nfunction ChipComponent({ element, emit }: ComponentRenderProps) {\n const p = element.props as {\n label: string;\n selected?: boolean;\n backgroundColor?: string;\n };\n\n const bgColor = p.selected ? \"#6366f1\" : (p.backgroundColor ?? \"#f3f4f6\");\n const textColor = p.selected ? \"#ffffff\" : \"#374151\";\n const hasRemove = !!element.on?.remove;\n\n return (\n <Pressable\n onPress={() => emit(\"press\")}\n style={{\n flexDirection: \"row\",\n alignItems: \"center\",\n backgroundColor: bgColor,\n paddingHorizontal: 12,\n paddingVertical: 6,\n borderRadius: 9999,\n alignSelf: \"flex-start\",\n }}\n >\n <Text style={{ fontSize: 14, color: textColor }}>{p.label}</Text>\n {hasRemove && (\n <Pressable onPress={() => emit(\"remove\")} style={{ marginLeft: 4 }}>\n <Text style={{ fontSize: 14, color: textColor, fontWeight: \"700\" }}>\n x\n </Text>\n </Pressable>\n )}\n </Pressable>\n );\n}\n\n// =============================================================================\n// Input Components\n// =============================================================================\n\nconst buttonVariantStyles: Record<\n string,\n { bg: string; text: string; border?: string }\n> = {\n primary: { bg: \"#3b82f6\", text: \"#ffffff\" },\n secondary: { bg: \"#6b7280\", text: \"#ffffff\" },\n danger: { bg: \"#dc2626\", text: \"#ffffff\" },\n outline: { bg: \"transparent\", text: \"#3b82f6\", border: \"#3b82f6\" },\n ghost: { bg: \"transparent\", text: \"#374151\" },\n};\n\nconst buttonSizeStyles: Record<\n string,\n { paddingH: number; paddingV: number; fontSize: number }\n> = {\n sm: { paddingH: 12, paddingV: 6, fontSize: 13 },\n md: { paddingH: 16, paddingV: 10, fontSize: 15 },\n lg: { paddingH: 24, paddingV: 14, fontSize: 17 },\n};\n\nfunction ButtonComponent({ element, emit }: ComponentRenderProps) {\n const p = element.props as {\n label: string;\n variant?: \"primary\" | \"secondary\" | \"danger\" | \"outline\" | \"ghost\";\n size?: \"sm\" | \"md\" | \"lg\";\n disabled?: boolean;\n loading?: boolean;\n };\n\n const variant = buttonVariantStyles[p.variant ?? \"primary\"] ?? {\n bg: \"#3b82f6\",\n text: \"#ffffff\",\n };\n const size = buttonSizeStyles[p.size ?? \"md\"] ?? {\n paddingH: 16,\n paddingV: 10,\n fontSize: 15,\n };\n const disabled = p.disabled || p.loading;\n\n return (\n <Pressable\n disabled={disabled}\n onPress={() => emit(\"press\")}\n style={({ pressed }) => ({\n backgroundColor: variant.bg,\n paddingHorizontal: size.paddingH,\n paddingVertical: size.paddingV,\n borderRadius: 8,\n alignItems: \"center\" as const,\n justifyContent: \"center\" as const,\n flexDirection: \"row\" as const,\n opacity: disabled ? 0.5 : pressed ? 0.8 : 1,\n borderWidth: variant.border ? 1 : 0,\n borderColor: variant.border,\n alignSelf: \"flex-start\" as const,\n })}\n >\n {p.loading && (\n <ActivityIndicator\n size=\"small\"\n color={variant.text}\n style={{ marginRight: 8 }}\n />\n )}\n <Text\n style={{\n color: variant.text,\n fontSize: size.fontSize,\n fontWeight: \"600\",\n }}\n >\n {p.label}\n </Text>\n </Pressable>\n );\n}\n\nfunction TextInputComponent({ element, bindings }: ComponentRenderProps) {\n const p = element.props as {\n placeholder?: string;\n value?: string;\n secureTextEntry?: boolean;\n keyboardType?:\n | \"default\"\n | \"email-address\"\n | \"numeric\"\n | \"phone-pad\"\n | \"url\";\n multiline?: boolean;\n numberOfLines?: number;\n label?: string;\n flex?: number;\n };\n\n const [boundValue, setBoundValue] = useBoundProp<string>(\n p.value as string | undefined,\n bindings?.value,\n );\n const displayValue = boundValue ?? \"\";\n\n return (\n <View style={p.flex != null ? { flex: p.flex } : undefined}>\n {p.label && <Text style={inputStyles.label}>{p.label}</Text>}\n <RNTextInput\n placeholder={p.placeholder ?? undefined}\n value={displayValue}\n onChangeText={bindings?.value ? setBoundValue : undefined}\n secureTextEntry={p.secureTextEntry ?? false}\n keyboardType={p.keyboardType ?? \"default\"}\n multiline={p.multiline ?? false}\n numberOfLines={p.numberOfLines ?? undefined}\n style={[\n inputStyles.input,\n p.multiline && {\n minHeight: (p.numberOfLines ?? 3) * 20,\n textAlignVertical: \"top\" as const,\n },\n ]}\n />\n </View>\n );\n}\n\nfunction SwitchComponent({ element, bindings }: ComponentRenderProps) {\n const p = element.props as {\n checked?: boolean;\n label?: string;\n disabled?: boolean;\n };\n\n const [checked, setChecked] = useBoundProp<boolean>(\n p.checked as boolean | undefined,\n bindings?.checked,\n );\n const displayValue = checked ?? false;\n\n return (\n <View style={{ flexDirection: \"row\", alignItems: \"center\", gap: 8 }}>\n <RNSwitch\n value={displayValue}\n onValueChange={bindings?.checked ? setChecked : undefined}\n disabled={p.disabled ?? false}\n />\n {p.label && (\n <Text style={{ fontSize: 16, color: \"#374151\" }}>{p.label}</Text>\n )}\n </View>\n );\n}\n\nfunction CheckboxComponent({ element, bindings }: ComponentRenderProps) {\n const p = element.props as {\n checked?: boolean;\n label?: string;\n disabled?: boolean;\n };\n\n const [checked, setChecked] = useBoundProp<boolean>(\n p.checked as boolean | undefined,\n bindings?.checked,\n );\n const isChecked = checked ?? false;\n\n return (\n <Pressable\n disabled={p.disabled ?? false}\n onPress={() => {\n if (bindings?.checked) {\n setChecked(!isChecked);\n }\n }}\n style={{\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 8,\n opacity: p.disabled ? 0.5 : 1,\n }}\n >\n <View\n style={{\n width: 20,\n height: 20,\n borderRadius: 4,\n borderWidth: 2,\n borderColor: isChecked ? \"#3b82f6\" : \"#d1d5db\",\n backgroundColor: isChecked ? \"#3b82f6\" : \"transparent\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {isChecked && (\n <Text style={{ color: \"#ffffff\", fontSize: 12, fontWeight: \"700\" }}>\n {\"✓\"}\n </Text>\n )}\n </View>\n {p.label && (\n <Text style={{ fontSize: 16, color: \"#374151\" }}>{p.label}</Text>\n )}\n </Pressable>\n );\n}\n\nfunction SliderComponent({ element }: ComponentRenderProps) {\n const p = element.props as {\n min?: number;\n max?: number;\n step?: number;\n value?: number;\n label?: string;\n color?: string;\n };\n\n const min = p.min ?? 0;\n const max = p.max ?? 100;\n const value = p.value ?? min;\n const progress = max > min ? (value - min) / (max - min) : 0;\n const trackColor = p.color ?? \"#3b82f6\";\n\n return (\n <View>\n {p.label && (\n <View\n style={{\n flexDirection: \"row\",\n justifyContent: \"space-between\",\n marginBottom: 4,\n }}\n >\n <Text style={{ fontSize: 14, color: \"#374151\" }}>{p.label}</Text>\n <Text style={{ fontSize: 14, color: \"#6b7280\" }}>{value}</Text>\n </View>\n )}\n <View\n style={{\n height: 6,\n backgroundColor: \"#e5e7eb\",\n borderRadius: 3,\n overflow: \"hidden\",\n }}\n >\n <View\n style={{\n width: `${Math.min(Math.max(progress * 100, 0), 100)}%`,\n height: \"100%\",\n backgroundColor: trackColor,\n borderRadius: 3,\n }}\n />\n </View>\n </View>\n );\n}\n\nfunction SearchBarComponent({ element, emit }: ComponentRenderProps) {\n const p = element.props as {\n placeholder?: string;\n value?: string;\n };\n\n return (\n <View\n style={{\n flexDirection: \"row\",\n alignItems: \"center\",\n backgroundColor: \"#f3f4f6\",\n borderRadius: 8,\n paddingHorizontal: 12,\n }}\n >\n <Text style={{ fontSize: 16, color: \"#9ca3af\", marginRight: 8 }}>\n {\"Search\"}\n </Text>\n <RNTextInput\n placeholder={p.placeholder ?? \"Search...\"}\n value={p.value ?? undefined}\n returnKeyType=\"search\"\n onSubmitEditing={() => emit(\"submit\")}\n style={{\n flex: 1,\n paddingVertical: 10,\n fontSize: 16,\n color: \"#111827\",\n }}\n />\n </View>\n );\n}\n\n// =============================================================================\n// Feedback Components\n// =============================================================================\n\nfunction SpinnerComponent({ element }: ComponentRenderProps) {\n const p = element.props as {\n size?: \"small\" | \"large\";\n color?: string;\n };\n\n return (\n <ActivityIndicator size={p.size ?? \"small\"} color={p.color ?? \"#3b82f6\"} />\n );\n}\n\nfunction ProgressBarComponent({ element }: ComponentRenderProps) {\n const p = element.props as {\n progress: number;\n color?: string;\n trackColor?: string;\n height?: number;\n };\n\n const height = p.height ?? 6;\n const progress = Math.min(Math.max(p.progress, 0), 1);\n\n return (\n <View\n style={{\n height,\n backgroundColor: p.trackColor ?? \"#e5e7eb\",\n borderRadius: height / 2,\n overflow: \"hidden\",\n }}\n >\n <View\n style={{\n width: `${progress * 100}%`,\n height: \"100%\",\n backgroundColor: p.color ?? \"#3b82f6\",\n borderRadius: height / 2,\n }}\n />\n </View>\n );\n}\n\n// =============================================================================\n// Composite Components\n// =============================================================================\n\nfunction CardComponent({ element, children }: ComponentRenderProps) {\n const p = element.props as {\n title?: string;\n subtitle?: string;\n padding?: number;\n backgroundColor?: string;\n borderRadius?: number;\n elevated?: boolean;\n };\n\n const elevated = p.elevated !== false;\n const padding = p.padding ?? 16;\n\n return (\n <View\n style={[\n {\n backgroundColor: p.backgroundColor ?? \"#ffffff\",\n borderRadius: p.borderRadius ?? 12,\n padding,\n },\n elevated && {\n shadowColor: \"#000\",\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.1,\n shadowRadius: 8,\n elevation: 3,\n },\n ]}\n >\n {p.title && (\n <Text\n style={{\n fontSize: 18,\n fontWeight: \"600\",\n color: \"#111827\",\n marginBottom: p.subtitle ? 2 : 12,\n }}\n >\n {p.title}\n </Text>\n )}\n {p.subtitle && (\n <Text\n style={{\n fontSize: 14,\n color: \"#6b7280\",\n marginBottom: 12,\n }}\n >\n {p.subtitle}\n </Text>\n )}\n {children}\n </View>\n );\n}\n\nfunction ListItemComponent({ element, emit }: ComponentRenderProps) {\n const p = element.props as {\n title: string;\n subtitle?: string;\n leading?: string;\n trailing?: string;\n showChevron?: boolean;\n };\n\n const hasPress = !!element.on?.press;\n\n const content = (\n <View\n style={{\n flexDirection: \"row\",\n alignItems: \"center\",\n paddingVertical: 12,\n paddingHorizontal: 16,\n }}\n >\n {p.leading && (\n <Text\n style={{\n fontSize: 16,\n color: \"#6b7280\",\n marginRight: 12,\n width: 24,\n textAlign: \"center\",\n }}\n >\n {p.leading}\n </Text>\n )}\n <View style={{ flex: 1 }}>\n <Text style={{ fontSize: 16, color: \"#111827\" }}>{p.title}</Text>\n {p.subtitle && (\n <Text style={{ fontSize: 14, color: \"#6b7280\", marginTop: 2 }}>\n {p.subtitle}\n </Text>\n )}\n </View>\n {p.trailing && (\n <Text style={{ fontSize: 14, color: \"#6b7280\", marginLeft: 8 }}>\n {p.trailing}\n </Text>\n )}\n {p.showChevron && (\n <Text style={{ fontSize: 16, color: \"#9ca3af\", marginLeft: 8 }}>\n {\">\"}\n </Text>\n )}\n </View>\n );\n\n if (hasPress) {\n return (\n <Pressable\n onPress={() => emit(\"press\")}\n style={({ pressed }) => ({\n opacity: pressed ? 0.7 : 1,\n backgroundColor: pressed ? \"#f9fafb\" : \"transparent\",\n })}\n >\n {content}\n </Pressable>\n );\n }\n\n return content;\n}\n\nfunction ModalComponent({ element, children }: ComponentRenderProps) {\n const p = element.props as {\n visible: boolean;\n title?: string;\n animationType?: \"slide\" | \"fade\" | \"none\";\n };\n\n return (\n <RNModal\n visible={p.visible}\n animationType={p.animationType ?? \"slide\"}\n transparent\n >\n <View style={modalStyles.overlay}>\n <View style={modalStyles.content}>\n {p.title && <Text style={modalStyles.title}>{p.title}</Text>}\n {children}\n </View>\n </View>\n </RNModal>\n );\n}\n\n// =============================================================================\n// Standard Action Handlers\n// =============================================================================\n\n/**\n * Create standard action handlers for React Native.\n *\n * @param options - Configuration for standard actions\n * @returns Action handler map compatible with ActionProvider\n */\nexport function createStandardActionHandlers(options?: {\n /** Navigation function - called by navigate and goBack actions */\n navigate?: (screen: string, params?: Record<string, unknown>) => void;\n /** Go back function */\n goBack?: () => void;\n /** Called when setData action is triggered */\n onSetData?: (path: string, value: unknown) => void;\n /** Called when refresh action is triggered */\n onRefresh?: (target?: string) => void;\n}): Record<string, (params: Record<string, unknown>) => Promise<void>> {\n return {\n navigate: async (params) => {\n const screen = params.screen as string;\n const navParams = params.params as Record<string, unknown> | undefined;\n options?.navigate?.(screen, navParams ?? undefined);\n },\n\n goBack: async () => {\n options?.goBack?.();\n },\n\n showAlert: async (params) => {\n const title = params.title as string;\n const message = (params.message as string) ?? undefined;\n const buttons = params.buttons as\n | Array<{\n text: string;\n style?: \"default\" | \"cancel\" | \"destructive\";\n action?: string;\n }>\n | undefined;\n\n const alertButtons = buttons?.map((btn) => ({\n text: btn.text,\n style: btn.style as \"default\" | \"cancel\" | \"destructive\" | undefined,\n }));\n\n Alert.alert(title, message, alertButtons);\n },\n\n share: async (params) => {\n const message = params.message as string;\n const url = (params.url as string) ?? undefined;\n const title = (params.title as string) ?? undefined;\n\n await Share.share({ message, url, title });\n },\n\n openURL: async (params) => {\n const url = params.url as string;\n const canOpen = await Linking.canOpenURL(url);\n if (canOpen) {\n await Linking.openURL(url);\n }\n },\n\n setData: async (params) => {\n const statePath = params.statePath as string;\n const value = params.value;\n options?.onSetData?.(statePath, value);\n },\n\n refresh: async (params) => {\n const target = (params.target as string) ?? undefined;\n options?.onRefresh?.(target);\n },\n };\n}\n\n// =============================================================================\n// Standard Components Registry\n// =============================================================================\n\n/**\n * Standard component registry with all built-in React Native components.\n * Pass to Renderer or merge with custom components.\n */\nexport const standardComponents: ComponentRegistry = {\n // Layout\n Container: ContainerComponent,\n Row: RowComponent,\n Column: ColumnComponent,\n ScrollContainer: ScrollContainerComponent,\n SafeArea: SafeAreaComponent,\n Pressable: PressableComponent,\n Spacer: SpacerComponent,\n Divider: DividerComponent,\n // Content\n Heading: HeadingComponent,\n Paragraph: ParagraphComponent,\n Label: LabelComponent,\n Image: ImageComponent,\n Avatar: AvatarComponent,\n Badge: BadgeComponent,\n Chip: ChipComponent,\n // Input\n Button: ButtonComponent,\n TextInput: TextInputComponent,\n Switch: SwitchComponent,\n Checkbox: CheckboxComponent,\n Slider: SliderComponent,\n SearchBar: SearchBarComponent,\n // Feedback\n Spinner: SpinnerComponent,\n ProgressBar: ProgressBarComponent,\n // Composite\n Card: CardComponent,\n ListItem: ListItemComponent,\n Modal: ModalComponent,\n};\n\n// =============================================================================\n// Shared Styles\n// =============================================================================\n\nconst inputStyles = StyleSheet.create({\n label: {\n fontSize: 14,\n fontWeight: \"500\",\n color: \"#374151\",\n marginBottom: 4,\n },\n input: {\n borderWidth: 1,\n borderColor: \"#d1d5db\",\n borderRadius: 8,\n paddingHorizontal: 12,\n paddingVertical: 10,\n fontSize: 16,\n color: \"#111827\",\n backgroundColor: \"#ffffff\",\n },\n});\n\nconst modalStyles = StyleSheet.create({\n overlay: {\n flex: 1,\n backgroundColor: \"rgba(0, 0, 0, 0.5)\",\n justifyContent: \"flex-end\",\n },\n content: {\n backgroundColor: \"#ffffff\",\n borderTopLeftRadius: 16,\n borderTopRightRadius: 16,\n padding: 24,\n maxHeight: \"80%\",\n },\n title: {\n fontSize: 20,\n fontWeight: \"600\",\n color: \"#111827\",\n marginBottom: 16,\n },\n});\n","import { useState, useCallback, useRef, useEffect } from \"react\";\nimport type {\n Spec,\n UIElement,\n FlatElement,\n JsonPatch,\n} from \"@json-render/core\";\nimport {\n setByPath,\n getByPath,\n removeByPath,\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: JsonPatch | 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.\n * Includes recovery for common LLM JSON errors 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 return { patch: JSON.parse(trimmed) as JsonPatch, 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 < 3; 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) as JsonPatch;\n console.warn(\n `[json-render] Recovered malformed JSONL line by removing ${i + 1} trailing '${last}'`,\n );\n return { patch: result, malformed: false };\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 * Set a value at a spec path (for add/replace operations).\n */\nfunction setSpecValue(newSpec: Spec, path: string, value: unknown): void {\n if (path === \"/root\") {\n newSpec.root = value as string;\n return;\n }\n\n if (path === \"/state\") {\n newSpec.state = value as Record<string, unknown>;\n return;\n }\n\n if (path.startsWith(\"/state/\")) {\n if (!newSpec.state) newSpec.state = {};\n const statePath = path.slice(\"/state\".length);\n setByPath(newSpec.state as Record<string, unknown>, statePath, value);\n return;\n }\n\n if (path.startsWith(\"/elements/\")) {\n const pathParts = path.slice(\"/elements/\".length).split(\"/\");\n const elementKey = pathParts[0];\n if (!elementKey) return;\n\n if (pathParts.length === 1) {\n newSpec.elements[elementKey] = value as UIElement;\n } else {\n const element = newSpec.elements[elementKey];\n if (element) {\n const propPath = \"/\" + pathParts.slice(1).join(\"/\");\n const newElement = { ...element };\n setByPath(\n newElement as unknown as Record<string, unknown>,\n propPath,\n value,\n );\n newSpec.elements[elementKey] = newElement;\n }\n }\n }\n}\n\n/**\n * Remove a value at a spec path.\n */\nfunction removeSpecValue(newSpec: Spec, path: string): void {\n if (path === \"/state\") {\n newSpec.state = undefined;\n return;\n }\n\n if (path.startsWith(\"/state/\") && newSpec.state) {\n const statePath = path.slice(\"/state\".length);\n removeByPath(newSpec.state as Record<string, unknown>, statePath);\n return;\n }\n\n if (path.startsWith(\"/elements/\")) {\n const pathParts = path.slice(\"/elements/\".length).split(\"/\");\n const elementKey = pathParts[0];\n if (!elementKey) return;\n\n if (pathParts.length === 1) {\n const { [elementKey]: _, ...rest } = newSpec.elements;\n newSpec.elements = rest;\n } else {\n const element = newSpec.elements[elementKey];\n if (element) {\n const propPath = \"/\" + pathParts.slice(1).join(\"/\");\n const newElement = { ...element };\n removeByPath(\n newElement as unknown as Record<string, unknown>,\n propPath,\n );\n newSpec.elements[elementKey] = newElement;\n }\n }\n }\n}\n\n/**\n * Get a value at a spec path.\n */\nfunction getSpecValue(spec: Spec, path: string): unknown {\n if (path === \"/root\") return spec.root;\n return getByPath(spec as unknown as Record<string, unknown>, path);\n}\n\n/**\n * Apply an RFC 6902 JSON patch to the current spec.\n * Supports add, remove, replace, move, copy, and test operations.\n */\nfunction applyPatch(spec: Spec, patch: JsonPatch): Spec {\n const newSpec = { ...spec, elements: { ...spec.elements } };\n\n switch (patch.op) {\n case \"add\":\n case \"replace\": {\n setSpecValue(newSpec, patch.path, patch.value);\n break;\n }\n case \"remove\": {\n removeSpecValue(newSpec, patch.path);\n break;\n }\n case \"move\": {\n if (!patch.from) break;\n const moveValue = getSpecValue(newSpec, patch.from);\n removeSpecValue(newSpec, patch.from);\n setSpecValue(newSpec, patch.path, moveValue);\n break;\n }\n case \"copy\": {\n if (!patch.from) break;\n const copyValue = getSpecValue(newSpec, patch.from);\n setSpecValue(newSpec, patch.path, copyValue);\n break;\n }\n case \"test\": {\n // test is a no-op for rendering purposes (validation only)\n break;\n }\n }\n\n return newSpec;\n}\n\n// =============================================================================\n// 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 * React Native's built-in fetch does not support `response.body`\n * (ReadableStream). Pass a streaming-capable fetch here, e.g.\n * `import { fetch } from 'expo/fetch'`.\n *\n * Falls back to the global `fetch` if not provided.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fetch?: (url: string, init?: any) => 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 /** Raw JSONL lines received from the stream */\n rawLines: string[];\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\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 [rawLines, setRawLines] = useState<string[]>([]);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const stop = useCallback(() => {\n abortControllerRef.current?.abort();\n abortControllerRef.current = null;\n setIsStreaming(false);\n }, []);\n\n const clear = useCallback(() => {\n setSpec(null);\n setError(null);\n setRawLines([]);\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 ): 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: abortControllerRef.current!.signal,\n });\n\n if (!response.ok) {\n let errorMessage = `HTTP error: ${response.status}`;\n try {\n const errorData = await response.json();\n if (errorData.message) {\n errorMessage = errorData.message;\n } else if (errorData.error) {\n errorMessage = errorData.error;\n }\n } catch {\n // Ignore JSON parsing errors, 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 const newLines: string[] = [];\n for (const line of lines) {\n if (line.trim()) {\n newLines.push(line);\n }\n const { patch, malformed } = parsePatchLine(line);\n if (patch) {\n currentSpec = applyPatch(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 if (newLines.length > 0) {\n setRawLines((prev) => [...prev, ...newLines]);\n }\n }\n\n // Process any remaining buffer (only if stream completed naturally)\n if (!aborted && buffer.trim()) {\n setRawLines((prev) => [...prev, buffer]);\n const { patch, malformed } = parsePatchLine(buffer);\n if (patch) {\n currentSpec = applyPatch(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 abortControllerRef.current = new AbortController();\n\n setIsStreaming(true);\n setError(null);\n setRawLines([]);\n\n // Start with previous spec if provided, otherwise empty spec\n const previousSpec = context?.previousSpec as Spec | undefined;\n let currentSpec: Spec =\n previousSpec && previousSpec.root\n ? { ...previousSpec, elements: { ...previousSpec.elements } }\n : { root: \"\", elements: {} };\n\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 );\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 (no retry needed)\n // ---------------------------------------------------------------\n const { spec: fixedSpec, fixes } = autoFixSpec(currentSpec);\n if (fixes.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\n const errors = validation.issues.filter(\n (i) => i.severity === \"error\",\n );\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 onComplete?.(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 onError?.(error);\n } finally {\n setIsStreaming(false);\n }\n },\n [\n api,\n fetchFn,\n onComplete,\n onError,\n enableValidation,\n maxRetries,\n streamRequest,\n ],\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 rawLines,\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 }\n } else {\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","useCallback","useMemo","jsx","createContext","useCallback","value","useMemo","useContext","executeAction","React","createContext","useContext","useState","useCallback","useMemo","jsx","createContext","useState","useCallback","value","useMemo","useContext","React","createContext","useContext","jsx","createStateStore","React","useCallback","useMemo","evaluateVisibility","getByPath","View","Text","Pressable","StyleSheet","useState","useCallback","useRef","useEffect","getByPath","useCallback","getByPath","useState","useRef","error","useEffect","jsx","jsxs","View","Pressable","Text","StyleSheet","jsx","jsxs","React","ElementRenderer","useMemo","evaluateVisibility","useCallback","getByPath","executeAction"]}
1
+ {"version":3,"sources":["../../react-state/src/index.tsx","../src/contexts/visibility.tsx","../src/contexts/actions.tsx","../src/contexts/validation.tsx","../src/contexts/repeat-scope.tsx","../src/index.ts","../src/renderer.tsx","../src/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 React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport { Modal, View, Text, Pressable, StyleSheet } from \"react-native\";\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\";\n\n/**\n * Generate a unique ID for use with the \"$id\" token.\n * Combines a timestamp with a random suffix for uniqueness.\n */\nlet idCounter = 0;\nfunction generateUniqueId(): string {\n idCounter += 1;\n return `${Date.now()}-${idCounter}`;\n}\n\n/**\n * Deep-resolve dynamic value references within an object.\n *\n * Supported tokens:\n * - `{ $state: \"/statePath\" }` - read a value from state\n * - `\"$id\"` (string) or `{ \"$id\": true }` - generate a unique ID\n *\n * This allows pushState values to contain references to current state\n * and auto-generated IDs.\n */\nfunction deepResolveValue(\n value: unknown,\n get: (path: string) => unknown,\n): unknown {\n if (value === null || value === undefined) return value;\n\n // \"$id\" string token -> generate unique ID\n if (value === \"$id\") {\n return generateUniqueId();\n }\n\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj);\n\n // { $state: \"/foo\" } -> read from state\n if (keys.length === 1 && typeof obj.$state === \"string\") {\n return get(obj.$state as string);\n }\n\n // { \"$id\": true } -> generate unique ID (single-key object)\n if (keys.length === 1 && \"$id\" in obj) {\n return generateUniqueId();\n }\n }\n\n // Recurse into arrays\n if (Array.isArray(value)) {\n return value.map((item) => deepResolveValue(item, get));\n }\n\n // Recurse into plain objects\n if (typeof value === \"object\") {\n const resolved: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value as Record<string, unknown>)) {\n resolved[key] = deepResolveValue(val, get);\n }\n return resolved;\n }\n\n return value;\n}\n\n/**\n * Pending confirmation state\n */\nexport interface PendingConfirmation {\n /** The resolved action */\n action: ResolvedAction;\n /** The action handler */\n handler: ActionHandler;\n /** Resolve callback */\n resolve: () => void;\n /** Reject callback */\n reject: () => void;\n}\n\n/**\n * Action context value\n */\nexport interface ActionContextValue {\n /** Registered action handlers */\n handlers: Record<string, ActionHandler>;\n /** Currently loading action names */\n loadingActions: Set<string>;\n /** Pending confirmation dialog */\n pendingConfirmation: PendingConfirmation | null;\n /** Execute an action binding */\n execute: (binding: ActionBinding) => Promise<void>;\n /** Confirm the pending action */\n confirm: () => void;\n /** Cancel the pending action */\n cancel: () => void;\n /** Register an action handler */\n registerHandler: (name: string, handler: ActionHandler) => void;\n}\n\nconst ActionContext = createContext<ActionContextValue | null>(null);\n\n/**\n * Props for ActionProvider\n */\nexport interface ActionProviderProps {\n /** Initial action handlers */\n handlers?: Record<string, ActionHandler>;\n /** Navigation function */\n navigate?: (path: string) => void;\n children: ReactNode;\n}\n\n/**\n * Provider for action execution\n */\nexport function ActionProvider({\n handlers: initialHandlers = {},\n navigate,\n children,\n}: ActionProviderProps) {\n const { get, set, getSnapshot } = useStateStore();\n const [handlers, setHandlers] =\n useState<Record<string, ActionHandler>>(initialHandlers);\n const [loadingActions, setLoadingActions] = useState<Set<string>>(new Set());\n const [pendingConfirmation, setPendingConfirmation] =\n useState<PendingConfirmation | null>(null);\n\n const registerHandler = useCallback(\n (name: string, handler: ActionHandler) => {\n setHandlers((prev) => ({ ...prev, [name]: handler }));\n },\n [],\n );\n\n const execute = useCallback(\n async (binding: ActionBinding) => {\n const resolved = resolveAction(binding, getSnapshot());\n\n // Built-in: setState updates the StateProvider state directly\n if (resolved.action === \"setState\" && resolved.params) {\n const statePath = resolved.params.statePath as string;\n const value = resolved.params.value;\n if (statePath) {\n set(statePath, value);\n }\n return;\n }\n\n // Built-in: pushState appends an item to an array in state.\n // Supports dynamic values inside the value object via { $state: \"/...\" } syntax.\n if (resolved.action === \"pushState\" && resolved.params) {\n const statePath = resolved.params.statePath as string;\n const rawValue = resolved.params.value;\n if (statePath) {\n const resolvedValue = deepResolveValue(rawValue, get);\n const arr = (get(statePath) as unknown[] | undefined) ?? [];\n set(statePath, [...arr, resolvedValue]);\n // Optionally clear a state path after pushing (e.g. clear the input)\n const clearStatePath = resolved.params.clearStatePath as\n | string\n | undefined;\n if (clearStatePath) {\n set(clearStatePath, \"\");\n }\n }\n return;\n }\n\n // Built-in: removeState removes an item from an array in state by index.\n if (resolved.action === \"removeState\" && resolved.params) {\n const statePath = resolved.params.statePath as string;\n const index = resolved.params.index as number;\n if (statePath !== undefined && index !== undefined) {\n const arr = (get(statePath) as unknown[] | undefined) ?? [];\n set(\n statePath,\n arr.filter((_, i) => i !== index),\n );\n }\n return;\n }\n\n // Built-in: push navigates to a new screen by updating state.\n // Pushes the current screen onto /navStack and sets /currentScreen.\n if (resolved.action === \"push\" && resolved.params) {\n const screen = resolved.params.screen as string;\n if (screen) {\n const currentScreen = get(\"/currentScreen\") as string | undefined;\n const navStack = (get(\"/navStack\") as string[] | undefined) ?? [];\n if (currentScreen) {\n set(\"/navStack\", [...navStack, currentScreen]);\n } else {\n // No current screen set yet -- push a sentinel so pop returns here\n set(\"/navStack\", [...navStack, \"\"]);\n }\n set(\"/currentScreen\", screen);\n }\n return;\n }\n\n // Built-in: pop navigates back to the previous screen.\n // Pops the last entry from /navStack and restores /currentScreen.\n if (resolved.action === \"pop\") {\n const navStack = (get(\"/navStack\") as string[] | undefined) ?? [];\n if (navStack.length > 0) {\n const previousScreen = navStack[navStack.length - 1];\n set(\"/navStack\", navStack.slice(0, -1));\n if (previousScreen) {\n set(\"/currentScreen\", previousScreen);\n } else {\n // Sentinel empty string = clear currentScreen (return to default)\n set(\"/currentScreen\", undefined);\n }\n }\n return;\n }\n\n const handler = handlers[resolved.action];\n\n if (!handler) {\n console.warn(`No handler registered for action: ${resolved.action}`);\n return;\n }\n\n // If confirmation is required, show dialog\n if (resolved.confirm) {\n return new Promise<void>((resolve, reject) => {\n setPendingConfirmation({\n action: resolved,\n handler,\n resolve: () => {\n setPendingConfirmation(null);\n resolve();\n },\n reject: () => {\n setPendingConfirmation(null);\n reject(new Error(\"Action cancelled\"));\n },\n });\n }).then(async () => {\n setLoadingActions((prev) => new Set(prev).add(resolved.action));\n try {\n await executeAction({\n action: resolved,\n handler,\n setState: set,\n navigate,\n executeAction: async (binding) => {\n await execute(binding);\n },\n });\n } finally {\n setLoadingActions((prev) => {\n const next = new Set(prev);\n next.delete(resolved.action);\n return next;\n });\n }\n });\n }\n\n // Execute immediately\n setLoadingActions((prev) => new Set(prev).add(resolved.action));\n try {\n await executeAction({\n action: resolved,\n handler,\n setState: set,\n navigate,\n executeAction: async (binding) => {\n await execute(binding);\n },\n });\n } finally {\n setLoadingActions((prev) => {\n const next = new Set(prev);\n next.delete(resolved.action);\n return next;\n });\n }\n },\n [handlers, get, set, getSnapshot, navigate],\n );\n\n const confirm = useCallback(() => {\n pendingConfirmation?.resolve();\n }, [pendingConfirmation]);\n\n const cancel = useCallback(() => {\n pendingConfirmation?.reject();\n }, [pendingConfirmation]);\n\n const value = useMemo<ActionContextValue>(\n () => ({\n handlers,\n loadingActions,\n pendingConfirmation,\n execute,\n confirm,\n cancel,\n registerHandler,\n }),\n [\n handlers,\n loadingActions,\n pendingConfirmation,\n execute,\n confirm,\n cancel,\n registerHandler,\n ],\n );\n\n return (\n <ActionContext.Provider value={value}>{children}</ActionContext.Provider>\n );\n}\n\n/**\n * Hook to access action context\n */\nexport function useActions(): ActionContextValue {\n const ctx = useContext(ActionContext);\n if (!ctx) {\n throw new Error(\"useActions must be used within an ActionProvider\");\n }\n return ctx;\n}\n\n/**\n * Hook to execute an action binding\n */\nexport function useAction(binding: ActionBinding): {\n execute: () => Promise<void>;\n isLoading: boolean;\n} {\n const { execute, loadingActions } = useActions();\n const isLoading = loadingActions.has(binding.action);\n\n const executeAction = useCallback(() => execute(binding), [execute, binding]);\n\n return { execute: executeAction, isLoading };\n}\n\n/**\n * Props for ConfirmDialog component\n */\nexport interface ConfirmDialogProps {\n /** The confirmation config */\n confirm: ActionConfirm;\n /** Called when confirmed */\n onConfirm: () => void;\n /** Called when cancelled */\n onCancel: () => void;\n}\n\n/**\n * Default confirmation dialog component for React Native\n */\nexport function ConfirmDialog({\n confirm,\n onConfirm,\n onCancel,\n}: ConfirmDialogProps) {\n const isDanger = confirm.variant === \"danger\";\n\n return (\n <Modal transparent animationType=\"fade\" visible onRequestClose={onCancel}>\n <Pressable style={styles.overlay} onPress={onCancel}>\n <Pressable style={styles.dialog} onPress={() => {}}>\n <Text style={styles.title}>{confirm.title}</Text>\n <Text style={styles.message}>{confirm.message}</Text>\n <View style={styles.buttons}>\n <Pressable style={styles.cancelButton} onPress={onCancel}>\n <Text style={styles.cancelButtonText}>\n {confirm.cancelLabel ?? \"Cancel\"}\n </Text>\n </Pressable>\n <Pressable\n style={[\n styles.confirmButton,\n isDanger && styles.confirmButtonDanger,\n ]}\n onPress={onConfirm}\n >\n <Text style={styles.confirmButtonText}>\n {confirm.confirmLabel ?? \"Confirm\"}\n </Text>\n </Pressable>\n </View>\n </Pressable>\n </Pressable>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: {\n flex: 1,\n backgroundColor: \"rgba(0, 0, 0, 0.5)\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n dialog: {\n backgroundColor: \"white\",\n borderRadius: 8,\n padding: 24,\n maxWidth: 400,\n width: \"90%\",\n shadowColor: \"#000\",\n shadowOffset: { width: 0, height: 20 },\n shadowOpacity: 0.1,\n shadowRadius: 25,\n elevation: 10,\n },\n title: {\n fontSize: 18,\n fontWeight: \"600\",\n marginBottom: 8,\n },\n message: {\n fontSize: 14,\n color: \"#6b7280\",\n marginBottom: 24,\n },\n buttons: {\n flexDirection: \"row\",\n justifyContent: \"flex-end\",\n gap: 12,\n },\n cancelButton: {\n paddingVertical: 8,\n paddingHorizontal: 16,\n borderRadius: 6,\n borderWidth: 1,\n borderColor: \"#d1d5db\",\n backgroundColor: \"white\",\n },\n cancelButtonText: {\n fontSize: 14,\n color: \"#374151\",\n },\n confirmButton: {\n paddingVertical: 8,\n paddingHorizontal: 16,\n borderRadius: 6,\n backgroundColor: \"#3b82f6\",\n },\n confirmButtonDanger: {\n backgroundColor: \"#dc2626\",\n },\n confirmButtonText: {\n fontSize: 14,\n color: \"white\",\n },\n});\n","import React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport {\n runValidation,\n type ValidationConfig,\n type ValidationFunction,\n type ValidationResult,\n} from \"@json-render/core\";\nimport { useStateStore } from \"./state\";\n\n/**\n * Field validation state\n */\nexport interface FieldValidationState {\n /** Whether the field has been touched */\n touched: boolean;\n /** Whether the field has been validated */\n validated: boolean;\n /** Validation result */\n result: ValidationResult | null;\n}\n\n/**\n * Validation context value\n */\nexport interface ValidationContextValue {\n /** Custom validation functions from catalog */\n customFunctions: Record<string, ValidationFunction>;\n /** Validation state by field path */\n fieldStates: Record<string, FieldValidationState>;\n /** Validate a field */\n validate: (path: string, config: ValidationConfig) => ValidationResult;\n /** Mark field as touched */\n touch: (path: string) => void;\n /** Clear validation for a field */\n clear: (path: string) => void;\n /** Validate all fields */\n validateAll: () => boolean;\n /** Register field config */\n registerField: (path: string, config: ValidationConfig) => void;\n}\n\nconst ValidationContext = createContext<ValidationContextValue | null>(null);\n\n/**\n * Props for ValidationProvider\n */\nexport interface ValidationProviderProps {\n /** Custom validation functions from catalog */\n customFunctions?: Record<string, ValidationFunction>;\n children: ReactNode;\n}\n\n/**\n * Compare two DynamicValue args records shallowly.\n * Values are primitives or { $state: string }, so shallow comparison suffices.\n */\nfunction dynamicArgsEqual(\n a: Record<string, unknown> | undefined,\n b: Record<string, unknown> | undefined,\n): boolean {\n if (a === b) return true;\n if (!a || !b) return false;\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n const va = a[key];\n const vb = b[key];\n if (va === vb) continue;\n // Handle { $state: string } objects\n if (\n typeof va === \"object\" &&\n va !== null &&\n typeof vb === \"object\" &&\n vb !== null\n ) {\n const sa = (va as Record<string, unknown>).$state;\n const sb = (vb as Record<string, unknown>).$state;\n if (typeof sa === \"string\" && sa === sb) continue;\n }\n return false;\n }\n return true;\n}\n\n/**\n * Structural equality check for ValidationConfig.\n */\nfunction validationConfigEqual(\n a: ValidationConfig,\n b: ValidationConfig,\n): boolean {\n if (a === b) return true;\n\n // Compare validateOn\n if (a.validateOn !== b.validateOn) return false;\n\n // Compare checks arrays\n const ac = a.checks ?? [];\n const bc = b.checks ?? [];\n if (ac.length !== bc.length) return false;\n\n for (let i = 0; i < ac.length; i++) {\n const ca = ac[i]!;\n const cb = bc[i]!;\n if (ca.type !== cb.type) return false;\n if (ca.message !== cb.message) return false;\n if (!dynamicArgsEqual(ca.args, cb.args)) return false;\n }\n\n return true;\n}\n\n/**\n * Provider for validation\n */\nexport function ValidationProvider({\n customFunctions = {},\n children,\n}: ValidationProviderProps) {\n const { state } = 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 // Bail out (return same reference) if config is unchanged to avoid\n // infinite re-render loops when callers pass a fresh object each render.\n if (existing && validationConfigEqual(existing, config)) {\n return prev;\n }\n return { ...prev, [path]: config };\n });\n },\n [],\n );\n\n const validate = useCallback(\n (path: string, config: ValidationConfig): ValidationResult => {\n // Walk the nested state object using JSON Pointer segments\n const segments = path.split(\"/\").filter(Boolean);\n let value: unknown = state;\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: state,\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 [state, 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\n for (const [path, config] of Object.entries(fieldConfigs)) {\n const result = validate(path, config);\n if (!result.valid) {\n allValid = false;\n }\n }\n\n return allValid;\n }, [fieldConfigs, validate]);\n\n const value = useMemo<ValidationContextValue>(\n () => ({\n customFunctions,\n fieldStates,\n validate,\n touch,\n clear,\n validateAll,\n registerField,\n }),\n [\n customFunctions,\n fieldStates,\n validate,\n touch,\n clear,\n validateAll,\n registerField,\n ],\n );\n\n return (\n <ValidationContext.Provider value={value}>\n {children}\n </ValidationContext.Provider>\n );\n}\n\n/**\n * Hook to access validation context\n */\nexport function useValidation(): ValidationContextValue {\n const ctx = useContext(ValidationContext);\n if (!ctx) {\n throw new Error(\"useValidation must be used within a ValidationProvider\");\n }\n return ctx;\n}\n\n/**\n * Hook to get validation state for a field\n */\nexport function useFieldValidation(\n path: string,\n config?: ValidationConfig,\n): {\n state: FieldValidationState;\n validate: () => ValidationResult;\n touch: () => void;\n clear: () => void;\n errors: string[];\n isValid: boolean;\n} {\n const {\n fieldStates,\n validate: validateField,\n touch: touchField,\n clear: clearField,\n registerField,\n } = useValidation();\n\n // Register field on mount\n React.useEffect(() => {\n if (config) {\n registerField(path, config);\n }\n }, [path, config, registerField]);\n\n const state = fieldStates[path] ?? {\n touched: false,\n validated: false,\n result: null,\n };\n\n const validate = useCallback(\n () => validateField(path, config ?? { checks: [] }),\n [path, config, validateField],\n );\n\n const touch = useCallback(() => touchField(path), [path, touchField]);\n const clear = useCallback(() => clearField(path), [path, clearField]);\n\n return {\n state,\n validate,\n touch,\n clear,\n errors: state.result?.errors ?? [],\n isValid: state.result?.valid ?? true,\n };\n}\n","import React, { createContext, useContext, type ReactNode } from \"react\";\n\n/**\n * Repeat scope value provided to child elements inside a repeated element.\n */\nexport interface RepeatScopeValue {\n /** The current array item object */\n item: unknown;\n /** Index of the current item in the array */\n index: number;\n /** Absolute state path to the current array item (e.g. \"/todos/0\") — used for statePath two-way binding */\n basePath: string;\n}\n\nconst RepeatScopeContext = createContext<RepeatScopeValue | null>(null);\n\n/**\n * Provides repeat scope to child elements so $item and $index expressions resolve correctly.\n */\nexport function RepeatScopeProvider({\n item,\n index,\n basePath,\n children,\n}: RepeatScopeValue & { children: ReactNode }) {\n return (\n <RepeatScopeContext.Provider value={{ item, index, basePath }}>\n {children}\n </RepeatScopeContext.Provider>\n );\n}\n\n/**\n * Read the current repeat scope (or null if not inside a repeated element).\n */\nexport function useRepeatScope(): RepeatScopeValue | null {\n return useContext(RepeatScopeContext);\n}\n","// Contexts\nexport {\n StateProvider,\n useStateStore,\n useStateValue,\n useStateBinding,\n type StateContextValue,\n type StateProviderProps,\n} from \"./contexts/state\";\n\nexport {\n VisibilityProvider,\n useVisibility,\n useIsVisible,\n type VisibilityContextValue,\n type VisibilityProviderProps,\n} from \"./contexts/visibility\";\n\nexport {\n ActionProvider,\n useActions,\n useAction,\n ConfirmDialog,\n type ActionContextValue,\n type ActionProviderProps,\n type PendingConfirmation,\n type ConfirmDialogProps,\n} from \"./contexts/actions\";\n\nexport {\n ValidationProvider,\n useValidation,\n useFieldValidation,\n type ValidationContextValue,\n type ValidationProviderProps,\n type FieldValidationState,\n} from \"./contexts/validation\";\n\nexport {\n RepeatScopeProvider,\n useRepeatScope,\n type RepeatScopeValue,\n} from \"./contexts/repeat-scope\";\n\n// Schema (React Native's spec format)\nexport {\n schema,\n type ReactNativeSchema,\n type ReactNativeSpec,\n // Backward compatibility\n elementTreeSchema,\n type ElementTreeSchema,\n type ElementTreeSpec,\n} from \"./schema\";\n\n// Core types (re-exported for convenience)\nexport type { Spec, StateStore } from \"@json-render/core\";\nexport { createStateStore } from \"@json-render/core\";\n\n// Catalog-aware types for React Native\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 // Standard components\n standardComponents,\n createStandardActionHandlers,\n} from \"./renderer\";\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 type {\n UIElement,\n Spec,\n ActionBinding,\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 type VisibilityContext as CoreVisibilityContext,\n} from \"@json-render/core\";\nimport type {\n Components,\n Actions,\n ActionFn,\n SetState,\n StateModel,\n} from \"./catalog-types\";\nimport { useIsVisible, useVisibility } from \"./contexts/visibility\";\nimport { useActions } from \"./contexts/actions\";\nimport { useStateStore } from \"./contexts/state\";\nimport { StateProvider } from \"./contexts/state\";\nimport { VisibilityProvider } from \"./contexts/visibility\";\nimport { ActionProvider } from \"./contexts/actions\";\nimport { ValidationProvider } from \"./contexts/validation\";\nimport { ConfirmDialog } from \"./contexts/actions\";\nimport { standardComponents } from \"./components/standard\";\nimport { RepeatScopeProvider, useRepeatScope } from \"./contexts/repeat-scope\";\n\n/**\n * Props passed to component renderers\n */\nexport interface ComponentRenderProps<P = Record<string, unknown>> {\n /** The element being rendered */\n element: UIElement<string, P>;\n /** Rendered children */\n children?: ReactNode;\n /** Emit a named event. The renderer resolves the event to action binding(s) from the element's `on` field. Always provided by the renderer. */\n emit: (event: string) => void;\n /**\n * Two-way binding paths resolved from `$bindState` / `$bindItem` expressions.\n * Maps prop name → absolute state path for write-back.\n * Only present when at least one prop uses `{ $bindState: \"...\" }` or `{ $bindItem: \"...\" }`.\n */\n bindings?: Record<string, string>;\n /** Whether the parent is loading */\n loading?: boolean;\n}\n\n/**\n * Component renderer type\n */\nexport type ComponentRenderer<P = Record<string, unknown>> = ComponentType<\n ComponentRenderProps<P>\n>;\n\n/**\n * Registry of component renderers\n */\nexport type ComponentRegistry = Record<string, ComponentRenderer<any>>;\n\n/**\n * Props for the Renderer component\n */\nexport interface RendererProps {\n /** The UI spec to render */\n spec: Spec | null;\n /**\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 so\n// a single bad component never crashes the whole page.\n// ---------------------------------------------------------------------------\n\ninterface ElementErrorBoundaryProps {\n elementType: string;\n children: ReactNode;\n}\n\ninterface ElementErrorBoundaryState {\n hasError: boolean;\n}\n\nclass ElementErrorBoundary extends React.Component<\n ElementErrorBoundaryProps,\n ElementErrorBoundaryState\n> {\n constructor(props: ElementErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(): ElementErrorBoundaryState {\n return { hasError: true };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n console.error(\n `[json-render] Rendering error in <${this.props.elementType}>:`,\n error,\n info.componentStack,\n );\n }\n\n render() {\n if (this.state.hasError) {\n // Render nothing – the element silently disappears rather than\n // crashing the entire application.\n return null;\n }\n return this.props.children;\n }\n}\n\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 (used for both visibility and props)\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 (now supports $item/$index inside repeat scopes)\n const isVisible =\n element.visible === undefined\n ? true\n : evaluateVisibility(element.visible, fullCtx);\n\n // Create emit function that resolves events to action bindings.\n // Must be called before any early return to satisfy Rules of Hooks.\n const onBindings = element.on;\n const emit = useCallback(\n async (eventName: string) => {\n const binding = onBindings?.[eventName];\n if (!binding) return;\n const actionBindings = Array.isArray(binding) ? binding : [binding];\n for (const b of actionBindings) {\n if (!b.params) {\n await execute(b);\n continue;\n }\n // Build a fresh context with live store state so that $state\n // references in later actions see mutations from earlier ones.\n const liveCtx: PropResolutionContext = {\n ...fullCtx,\n stateModel: getSnapshot(),\n };\n const resolved: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(b.params)) {\n resolved[key] = resolveActionParam(val, liveCtx);\n }\n await execute({ ...b, params: resolved });\n }\n },\n [onBindings, execute, fullCtx, getSnapshot],\n );\n\n // Don't render if not visible\n if (!isVisible) {\n return null;\n }\n\n // Resolve $bindState/$bindItem expressions → bindings map (prop name → state path)\n const rawProps = element.props as Record<string, unknown>;\n const elementBindings = resolveBindings(rawProps, fullCtx);\n\n // Resolve dynamic prop expressions ($state, $item, $index, $bindState, $bindItem, $cond/$then/$else)\n const resolvedProps = resolveElementProps(rawProps, fullCtx);\n\n const resolvedElement =\n resolvedProps !== element.props\n ? { ...element, props: resolvedProps }\n : element;\n\n // Get the component renderer\n const Component = registry[resolvedElement.type] ?? fallback;\n\n if (!Component) {\n console.warn(`No renderer for component type: ${resolvedElement.type}`);\n return null;\n }\n\n // ---- Render children (with repeat support) ----\n const children = resolvedElement.repeat ? (\n <RepeatChildren\n element={resolvedElement}\n spec={spec}\n registry={registry}\n loading={loading}\n fallback={fallback}\n />\n ) : (\n resolvedElement.children?.map((childKey) => {\n const childElement = spec.elements[childKey];\n if (!childElement) {\n if (!loading) {\n console.warn(\n `[json-render] Missing element \"${childKey}\" referenced as child of \"${resolvedElement.type}\". This element will not render.`,\n );\n }\n return null;\n }\n return (\n <ElementRenderer\n key={childKey}\n element={childElement}\n 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 -- renders child elements once per item in a state array.\n// Used when an element has a `repeat` field.\n// ---------------------------------------------------------------------------\n\nfunction RepeatChildren({\n element,\n spec,\n registry,\n loading,\n fallback,\n}: {\n element: UIElement;\n spec: Spec;\n registry: ComponentRegistry;\n loading?: boolean;\n fallback?: ComponentRenderer;\n}) {\n const { state } = useStateStore();\n const 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/react-native] $item in repeat.statePath used outside of a repeat scope\",\n );\n return null;\n }\n\n const items = (getByPath(state, statePath) as unknown[] | undefined) ?? [];\n\n return (\n <>\n {items.map((itemValue, index) => {\n // Use a stable key: prefer key field, fall back to index\n const key =\n repeat.key && typeof itemValue === \"object\" && itemValue !== null\n ? String(\n (itemValue as Record<string, unknown>)[repeat.key] ?? index,\n )\n : String(index);\n\n return (\n <RepeatScopeProvider\n key={key}\n item={itemValue}\n index={index}\n basePath={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 }\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 </RepeatScopeProvider>\n );\n })}\n </>\n );\n}\n\n/**\n * Main renderer component.\n *\n * By default, standard React Native components are included.\n * Custom components in `registry` override standard ones with the same name.\n *\n * @example\n * ```tsx\n * // Use standard components only\n * <Renderer spec={spec} />\n *\n * // Add/override components\n * <Renderer spec={spec} registry={{ CustomCard: MyCard }} />\n *\n * // Disable standard components entirely\n * <Renderer spec={spec} registry={myRegistry} includeStandard={false} />\n * ```\n */\nexport function Renderer({\n spec,\n registry: customRegistry,\n includeStandard = true,\n loading,\n fallback,\n}: RendererProps) {\n // Merge standard + custom components (custom overrides standard)\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// Re-export standard components and action handlers\nexport {\n standardComponents,\n createStandardActionHandlers,\n} from \"./components/standard\";\n\n/**\n * Props for JSONUIProvider\n */\nexport interface JSONUIProviderProps {\n /**\n * Component registry. If omitted, only standard components are used.\n * Custom components are merged with (and override) standard components.\n */\n registry?: ComponentRegistry;\n /**\n * External store (controlled mode). When provided, `initialState` and\n * `onStateChange` are ignored.\n */\n store?: StateStore;\n /** Initial state model (uncontrolled mode) */\n initialState?: Record<string, unknown>;\n /** Action handlers */\n handlers?: Record<\n string,\n (params: Record<string, unknown>) => Promise<unknown> | unknown\n >;\n /** Navigation function */\n navigate?: (path: string) => void;\n /** Custom validation functions */\n validationFunctions?: Record<\n string,\n (value: unknown, args?: Record<string, unknown>) => boolean\n >;\n /** Callback when state changes (uncontrolled mode) */\n onStateChange?: (changes: Array<{ path: string; value: unknown }>) => void;\n children: ReactNode;\n}\n\n/**\n * Combined provider for all JSONUI contexts\n */\nexport function JSONUIProvider({\n registry,\n store,\n initialState,\n handlers,\n navigate,\n validationFunctions,\n onStateChange,\n children,\n}: JSONUIProviderProps) {\n return (\n <StateProvider\n store={store}\n initialState={initialState}\n onStateChange={onStateChange}\n >\n <VisibilityProvider>\n <ActionProvider handlers={handlers} navigate={navigate}>\n <ValidationProvider customFunctions={validationFunctions}>\n {children}\n <ConfirmationDialogManager />\n </ValidationProvider>\n </ActionProvider>\n </VisibilityProvider>\n </StateProvider>\n );\n}\n\n/**\n * Renders the confirmation dialog when needed\n */\nfunction ConfirmationDialogManager() {\n const { pendingConfirmation, confirm, cancel } = useActions();\n\n if (!pendingConfirmation?.action.confirm) {\n return null;\n }\n\n return (\n <ConfirmDialog\n confirm={pendingConfirmation.action.confirm}\n onConfirm={confirm}\n onCancel={cancel}\n />\n );\n}\n\n// ============================================================================\n// defineRegistry\n// ============================================================================\n\n/**\n * Result returned by defineRegistry\n */\nexport interface DefineRegistryResult {\n /** Component registry for `<Renderer registry={...} />` */\n registry: ComponentRegistry;\n /**\n * Create ActionProvider-compatible handlers.\n * Accepts getter functions so handlers always read the latest state/setState\n * (e.g. from React refs).\n */\n handlers: (\n getSetState: () => SetState | undefined,\n getState: () => StateModel,\n ) => Record<string, (params: Record<string, unknown>) => Promise<void>>;\n /**\n * Execute an action by name imperatively\n * (for use outside the React tree, e.g. initial state loading).\n */\n executeAction: (\n actionName: string,\n params: Record<string, unknown> | undefined,\n setState: SetState,\n state?: StateModel,\n ) => Promise<void>;\n}\n\n/**\n * Create a registry from a catalog with components and/or actions.\n *\n * @example\n * ```tsx\n * // Components only\n * const { registry } = defineRegistry(catalog, {\n * components: {\n * Card: ({ props, children }) => (\n * <View style={styles.card}><Text>{props.title}</Text>{children}</View>\n * ),\n * },\n * });\n *\n * // Actions only\n * const { handlers, executeAction } = defineRegistry(catalog, {\n * actions: {\n * viewCustomers: async (params, setState) => { ... },\n * },\n * });\n *\n * // Both\n * const { registry, handlers, executeAction } = defineRegistry(catalog, {\n * components: { ... },\n * actions: { ... },\n * });\n * ```\n */\nexport function defineRegistry<C extends Catalog>(\n _catalog: C,\n options: {\n components?: Components<C>;\n actions?: Actions<C>;\n },\n): DefineRegistryResult {\n // Build component registry\n const registry: ComponentRegistry = {};\n if (options.components) {\n for (const [name, componentFn] of Object.entries(options.components)) {\n registry[name] = ({\n element,\n children,\n emit,\n 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 // Build action helpers\n const actionMap = options.actions\n ? (Object.entries(options.actions) as Array<\n [string, DefineRegistryActionFn]\n >)\n : [];\n\n const handlers = (\n getSetState: () => SetState | undefined,\n getState: () => StateModel,\n ): Record<string, (params: Record<string, unknown>) => Promise<void>> => {\n const result: Record<\n string,\n (params: Record<string, unknown>) => Promise<void>\n > = {};\n for (const [name, actionFn] of actionMap) {\n result[name] = async (params) => {\n const setState = getSetState();\n const state = getState();\n if (setState) {\n await actionFn(params, setState, state);\n }\n };\n }\n return result;\n };\n\n const executeAction = async (\n actionName: string,\n params: Record<string, unknown> | undefined,\n setState: SetState,\n state: StateModel = {},\n ): Promise<void> => {\n const entry = actionMap.find(([name]) => name === actionName);\n if (entry) {\n await entry[1](params, setState, state);\n } else {\n console.warn(`Unknown action: ${actionName}`);\n }\n };\n\n return { registry, handlers, executeAction };\n}\n\n/** @internal */\ntype DefineRegistryComponentFn = (ctx: {\n props: unknown;\n children?: React.ReactNode;\n emit: (event: string) => void;\n bindings?: Record<string, string>;\n loading?: boolean;\n}) => React.ReactNode;\n\n/** @internal */\ntype DefineRegistryActionFn = (\n params: Record<string, unknown> | undefined,\n setState: SetState,\n state: StateModel,\n) => Promise<void>;\n\n// ============================================================================\n// NEW API\n// ============================================================================\n\n/**\n * Props for renderers created with createRenderer\n */\nexport interface CreateRendererProps {\n /** The spec to render (AI-generated JSON) */\n spec: Spec | null;\n /**\n * External store (controlled mode). When provided, `state` and\n * `onStateChange` are ignored.\n */\n store?: StateStore;\n /** State context for dynamic values (uncontrolled mode) */\n state?: Record<string, unknown>;\n /** Action handler */\n onAction?: (actionName: string, params?: Record<string, unknown>) => void;\n /** Callback when state changes (uncontrolled mode) */\n onStateChange?: (changes: Array<{ path: string; value: unknown }>) => void;\n /** Whether the spec is currently loading/streaming */\n loading?: boolean;\n /** Fallback component for unknown types */\n fallback?: ComponentRenderer;\n}\n\n/**\n * Component map type - maps component names to React Native components\n */\nexport type ComponentMap<\n TComponents extends Record<string, { props: unknown }>,\n> = {\n [K in keyof TComponents]: ComponentType<\n ComponentRenderProps<\n TComponents[K][\"props\"] extends { _output: infer O }\n ? O\n : Record<string, unknown>\n >\n >;\n};\n\n/**\n * Create a renderer from a catalog\n *\n * @example\n * ```typescript\n * const DashboardRenderer = createRenderer(dashboardCatalog, {\n * Card: ({ element, children }) => <View style={styles.card}>{children}</View>,\n * Metric: ({ element }) => <Text>{element.props.value}</Text>,\n * });\n *\n * // Usage\n * <DashboardRenderer spec={aiGeneratedSpec} state={state} />\n * ```\n */\nexport function createRenderer<\n TDef extends SchemaDefinition,\n TCatalog extends { components: Record<string, { props: unknown }> },\n>(\n catalog: Catalog<TDef, TCatalog>,\n components: ComponentMap<TCatalog[\"components\"]>,\n): ComponentType<CreateRendererProps> {\n // Convert component map to registry\n const registry: ComponentRegistry =\n components as unknown as ComponentRegistry;\n\n // Return the renderer component\n return function CatalogRenderer({\n spec,\n store,\n state,\n onAction,\n onStateChange,\n loading,\n fallback,\n }: CreateRendererProps) {\n // Wrap onAction with a Proxy so any action name routes to the callback\n const actionHandlers = onAction\n ? new Proxy(\n {} as Record<\n string,\n (params: Record<string, unknown>) => void | Promise<void>\n >,\n {\n get: (_target, prop: string) => {\n return (params: Record<string, unknown>) =>\n onAction(prop, params);\n },\n has: () => true,\n },\n )\n : undefined;\n\n return (\n <StateProvider\n store={store}\n initialState={state}\n onStateChange={onStateChange}\n >\n <VisibilityProvider>\n <ActionProvider handlers={actionHandlers}>\n <ValidationProvider>\n <Renderer\n spec={spec}\n registry={registry}\n loading={loading}\n fallback={fallback}\n />\n <ConfirmationDialogManager />\n </ValidationProvider>\n </ActionProvider>\n </VisibilityProvider>\n </StateProvider>\n );\n };\n}\n","import React from \"react\";\nimport {\n View,\n Text,\n Image as RNImage,\n ScrollView,\n SafeAreaView,\n Pressable,\n TextInput as RNTextInput,\n Switch as RNSwitch,\n ActivityIndicator,\n Modal as RNModal,\n StyleSheet,\n Alert,\n Share,\n Linking,\n} from \"react-native\";\nimport type { ComponentRenderProps } from \"../renderer\";\nimport type { ComponentRegistry } from \"../renderer\";\nimport { useBoundProp } from \"../hooks\";\n\n// =============================================================================\n// Layout Components\n// =============================================================================\n\nfunction ContainerComponent({ element, children }: ComponentRenderProps) {\n const p = element.props as {\n padding?: number;\n paddingHorizontal?: number;\n paddingVertical?: number;\n margin?: number;\n backgroundColor?: string;\n borderRadius?: number;\n flex?: number;\n };\n\n return (\n <View\n style={{\n padding: p.padding ?? undefined,\n paddingHorizontal: p.paddingHorizontal ?? undefined,\n paddingVertical: p.paddingVertical ?? undefined,\n margin: p.margin ?? undefined,\n backgroundColor: p.backgroundColor ?? undefined,\n borderRadius: p.borderRadius ?? undefined,\n flex: p.flex ?? undefined,\n }}\n >\n {children}\n </View>\n );\n}\n\nfunction RowComponent({ element, children }: ComponentRenderProps) {\n const p = element.props as {\n gap?: number;\n alignItems?: \"flex-start\" | \"center\" | \"flex-end\" | \"stretch\" | \"baseline\";\n justifyContent?:\n | \"flex-start\"\n | \"center\"\n | \"flex-end\"\n | \"space-between\"\n | \"space-around\"\n | \"space-evenly\";\n flexWrap?: \"wrap\" | \"nowrap\";\n padding?: number;\n flex?: number;\n };\n\n return (\n <View\n style={{\n flexDirection: \"row\",\n gap: p.gap ?? undefined,\n alignItems: p.alignItems ?? undefined,\n justifyContent: p.justifyContent ?? undefined,\n flexWrap: p.flexWrap ?? undefined,\n padding: p.padding ?? undefined,\n flex: p.flex ?? undefined,\n }}\n >\n {children}\n </View>\n );\n}\n\nfunction ColumnComponent({ element, children }: ComponentRenderProps) {\n const p = element.props as {\n gap?: number;\n alignItems?: \"flex-start\" | \"center\" | \"flex-end\" | \"stretch\" | \"baseline\";\n justifyContent?:\n | \"flex-start\"\n | \"center\"\n | \"flex-end\"\n | \"space-between\"\n | \"space-around\"\n | \"space-evenly\";\n padding?: number;\n flex?: number;\n };\n\n return (\n <View\n style={{\n flexDirection: \"column\",\n gap: p.gap ?? undefined,\n alignItems: p.alignItems ?? undefined,\n justifyContent: p.justifyContent ?? undefined,\n padding: p.padding ?? undefined,\n flex: p.flex ?? undefined,\n }}\n >\n {children}\n </View>\n );\n}\n\nfunction ScrollContainerComponent({ element, children }: ComponentRenderProps) {\n const p = element.props as {\n horizontal?: boolean;\n showsScrollIndicator?: boolean;\n padding?: number;\n backgroundColor?: string;\n flex?: number;\n };\n\n return (\n <ScrollView\n horizontal={p.horizontal ?? false}\n showsVerticalScrollIndicator={p.showsScrollIndicator ?? true}\n showsHorizontalScrollIndicator={p.showsScrollIndicator ?? true}\n contentContainerStyle={{\n padding: p.padding ?? undefined,\n }}\n style={{\n flex: p.flex ?? 1,\n backgroundColor: p.backgroundColor ?? undefined,\n }}\n >\n {children}\n </ScrollView>\n );\n}\n\nfunction SafeAreaComponent({ element, children }: ComponentRenderProps) {\n const p = element.props as {\n backgroundColor?: string;\n };\n\n return (\n <SafeAreaView\n style={{\n flex: 1,\n backgroundColor: p.backgroundColor ?? undefined,\n }}\n >\n {children}\n </SafeAreaView>\n );\n}\n\nfunction SpacerComponent({ element }: ComponentRenderProps) {\n const p = element.props as {\n size?: number;\n flex?: number;\n };\n\n return (\n <View\n style={{\n width: p.size ?? undefined,\n height: p.size ?? undefined,\n flex: p.flex ?? undefined,\n }}\n />\n );\n}\n\nfunction PressableComponent({ children, emit }: ComponentRenderProps) {\n return (\n <Pressable\n onPress={() => emit(\"press\")}\n onLongPress={() => emit(\"longPress\")}\n style={({ pressed }) => ({\n opacity: pressed ? 0.7 : 1,\n })}\n >\n {children}\n </Pressable>\n );\n}\n\nfunction DividerComponent({ element }: ComponentRenderProps) {\n const p = element.props as {\n direction?: \"horizontal\" | \"vertical\";\n color?: string;\n thickness?: number;\n margin?: number;\n };\n\n const isVertical = p.direction === \"vertical\";\n const thickness = p.thickness ?? 1;\n const color = p.color ?? \"#e5e7eb\";\n\n return (\n <View\n style={{\n width: isVertical ? thickness : \"100%\",\n height: isVertical ? \"100%\" : thickness,\n backgroundColor: color,\n marginVertical: isVertical ? 0 : (p.margin ?? 8),\n marginHorizontal: isVertical ? (p.margin ?? 8) : 0,\n }}\n />\n );\n}\n\n// =============================================================================\n// Content Components\n// =============================================================================\n\nconst headingSizes = {\n h1: 32,\n h2: 24,\n h3: 20,\n h4: 16,\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 align?: \"left\" | \"center\" | \"right\";\n };\n\n const level = p.level ?? \"h2\";\n\n return (\n <Text\n style={{\n fontSize: headingSizes[level],\n fontWeight: \"700\",\n color: p.color ?? \"#111827\",\n textAlign: p.align ?? \"left\",\n }}\n >\n {p.text}\n </Text>\n );\n}\n\nfunction ParagraphComponent({ element }: ComponentRenderProps) {\n const p = element.props as {\n text: string;\n color?: string;\n align?: \"left\" | \"center\" | \"right\";\n numberOfLines?: number;\n fontSize?: number;\n };\n\n return (\n <Text\n numberOfLines={p.numberOfLines ?? undefined}\n style={{\n fontSize: p.fontSize ?? 16,\n lineHeight: (p.fontSize ?? 16) * 1.5,\n color: p.color ?? \"#374151\",\n textAlign: p.align ?? \"left\",\n }}\n >\n {p.text}\n </Text>\n );\n}\n\nconst labelSizes = {\n xs: 10,\n sm: 12,\n md: 14,\n};\n\nfunction LabelComponent({ element }: ComponentRenderProps) {\n const p = element.props as {\n text: string;\n color?: string;\n bold?: boolean;\n size?: \"xs\" | \"sm\" | \"md\";\n };\n\n return (\n <Text\n style={{\n fontSize: labelSizes[p.size ?? \"sm\"],\n fontWeight: p.bold ? \"600\" : \"400\",\n color: p.color ?? \"#6b7280\",\n }}\n >\n {p.text}\n </Text>\n );\n}\n\nfunction ImageComponent({ element }: ComponentRenderProps) {\n const p = element.props as {\n src: string;\n alt?: string;\n width?: number;\n height?: number;\n resizeMode?: \"cover\" | \"contain\" | \"stretch\" | \"center\";\n borderRadius?: number;\n };\n\n return (\n <RNImage\n source={{ uri: p.src }}\n accessibilityLabel={p.alt ?? undefined}\n resizeMode={p.resizeMode ?? \"cover\"}\n style={{\n width: p.width ?? \"100%\",\n height: p.height ?? 200,\n borderRadius: p.borderRadius ?? 0,\n }}\n />\n );\n}\n\nconst avatarSizeMap = {\n sm: 32,\n md: 48,\n lg: 64,\n xl: 96,\n};\n\nfunction AvatarComponent({ element }: ComponentRenderProps) {\n const p = element.props as {\n src?: string;\n initials?: string;\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n backgroundColor?: string;\n };\n\n const size = avatarSizeMap[p.size ?? \"md\"];\n const bgColor = p.backgroundColor ?? \"#6366f1\";\n\n if (p.src) {\n return (\n <RNImage\n source={{ uri: p.src }}\n style={{\n width: size,\n height: size,\n borderRadius: size / 2,\n backgroundColor: \"#e5e7eb\",\n }}\n />\n );\n }\n\n return (\n <View\n style={{\n width: size,\n height: size,\n borderRadius: size / 2,\n backgroundColor: bgColor,\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <Text\n style={{\n color: \"#ffffff\",\n fontSize: size * 0.4,\n fontWeight: \"600\",\n }}\n >\n {p.initials ?? \"?\"}\n </Text>\n </View>\n );\n}\n\nconst badgeVariantColors: Record<string, { bg: string; text: string }> = {\n default: { bg: \"#e5e7eb\", text: \"#374151\" },\n info: { bg: \"#dbeafe\", text: \"#1d4ed8\" },\n success: { bg: \"#dcfce7\", text: \"#15803d\" },\n warning: { bg: \"#fef3c7\", text: \"#92400e\" },\n error: { bg: \"#fee2e2\", text: \"#dc2626\" },\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 colors = badgeVariantColors[p.variant ?? \"default\"] ?? {\n bg: \"#e5e7eb\",\n text: \"#374151\",\n };\n\n return (\n <View\n style={{\n backgroundColor: colors.bg,\n paddingHorizontal: 8,\n paddingVertical: 2,\n borderRadius: 9999,\n alignSelf: \"flex-start\",\n }}\n >\n <Text\n style={{\n fontSize: 12,\n fontWeight: \"600\",\n color: colors.text,\n }}\n >\n {p.label}\n </Text>\n </View>\n );\n}\n\nfunction ChipComponent({ element, emit }: ComponentRenderProps) {\n const p = element.props as {\n label: string;\n selected?: boolean;\n backgroundColor?: string;\n };\n\n const bgColor = p.selected ? \"#6366f1\" : (p.backgroundColor ?? \"#f3f4f6\");\n const textColor = p.selected ? \"#ffffff\" : \"#374151\";\n const hasRemove = !!element.on?.remove;\n\n return (\n <Pressable\n onPress={() => emit(\"press\")}\n style={{\n flexDirection: \"row\",\n alignItems: \"center\",\n backgroundColor: bgColor,\n paddingHorizontal: 12,\n paddingVertical: 6,\n borderRadius: 9999,\n alignSelf: \"flex-start\",\n }}\n >\n <Text style={{ fontSize: 14, color: textColor }}>{p.label}</Text>\n {hasRemove && (\n <Pressable onPress={() => emit(\"remove\")} style={{ marginLeft: 4 }}>\n <Text style={{ fontSize: 14, color: textColor, fontWeight: \"700\" }}>\n x\n </Text>\n </Pressable>\n )}\n </Pressable>\n );\n}\n\n// =============================================================================\n// Input Components\n// =============================================================================\n\nconst buttonVariantStyles: Record<\n string,\n { bg: string; text: string; border?: string }\n> = {\n primary: { bg: \"#3b82f6\", text: \"#ffffff\" },\n secondary: { bg: \"#6b7280\", text: \"#ffffff\" },\n danger: { bg: \"#dc2626\", text: \"#ffffff\" },\n outline: { bg: \"transparent\", text: \"#3b82f6\", border: \"#3b82f6\" },\n ghost: { bg: \"transparent\", text: \"#374151\" },\n};\n\nconst buttonSizeStyles: Record<\n string,\n { paddingH: number; paddingV: number; fontSize: number }\n> = {\n sm: { paddingH: 12, paddingV: 6, fontSize: 13 },\n md: { paddingH: 16, paddingV: 10, fontSize: 15 },\n lg: { paddingH: 24, paddingV: 14, fontSize: 17 },\n};\n\nfunction ButtonComponent({ element, emit }: ComponentRenderProps) {\n const p = element.props as {\n label: string;\n variant?: \"primary\" | \"secondary\" | \"danger\" | \"outline\" | \"ghost\";\n size?: \"sm\" | \"md\" | \"lg\";\n disabled?: boolean;\n loading?: boolean;\n };\n\n const variant = buttonVariantStyles[p.variant ?? \"primary\"] ?? {\n bg: \"#3b82f6\",\n text: \"#ffffff\",\n };\n const size = buttonSizeStyles[p.size ?? \"md\"] ?? {\n paddingH: 16,\n paddingV: 10,\n fontSize: 15,\n };\n const disabled = p.disabled || p.loading;\n\n return (\n <Pressable\n disabled={disabled}\n onPress={() => emit(\"press\")}\n style={({ pressed }) => ({\n backgroundColor: variant.bg,\n paddingHorizontal: size.paddingH,\n paddingVertical: size.paddingV,\n borderRadius: 8,\n alignItems: \"center\" as const,\n justifyContent: \"center\" as const,\n flexDirection: \"row\" as const,\n opacity: disabled ? 0.5 : pressed ? 0.8 : 1,\n borderWidth: variant.border ? 1 : 0,\n borderColor: variant.border,\n alignSelf: \"flex-start\" as const,\n })}\n >\n {p.loading && (\n <ActivityIndicator\n size=\"small\"\n color={variant.text}\n style={{ marginRight: 8 }}\n />\n )}\n <Text\n style={{\n color: variant.text,\n fontSize: size.fontSize,\n fontWeight: \"600\",\n }}\n >\n {p.label}\n </Text>\n </Pressable>\n );\n}\n\nfunction TextInputComponent({ element, bindings }: ComponentRenderProps) {\n const p = element.props as {\n placeholder?: string;\n value?: string;\n secureTextEntry?: boolean;\n keyboardType?:\n | \"default\"\n | \"email-address\"\n | \"numeric\"\n | \"phone-pad\"\n | \"url\";\n multiline?: boolean;\n numberOfLines?: number;\n label?: string;\n flex?: number;\n };\n\n const [boundValue, setBoundValue] = useBoundProp<string>(\n p.value as string | undefined,\n bindings?.value,\n );\n const displayValue = boundValue ?? \"\";\n\n return (\n <View style={p.flex != null ? { flex: p.flex } : undefined}>\n {p.label && <Text style={inputStyles.label}>{p.label}</Text>}\n <RNTextInput\n placeholder={p.placeholder ?? undefined}\n value={displayValue}\n onChangeText={bindings?.value ? setBoundValue : undefined}\n secureTextEntry={p.secureTextEntry ?? false}\n keyboardType={p.keyboardType ?? \"default\"}\n multiline={p.multiline ?? false}\n numberOfLines={p.numberOfLines ?? undefined}\n style={[\n inputStyles.input,\n p.multiline && {\n minHeight: (p.numberOfLines ?? 3) * 20,\n textAlignVertical: \"top\" as const,\n },\n ]}\n />\n </View>\n );\n}\n\nfunction SwitchComponent({ element, bindings }: ComponentRenderProps) {\n const p = element.props as {\n checked?: boolean;\n label?: string;\n disabled?: boolean;\n };\n\n const [checked, setChecked] = useBoundProp<boolean>(\n p.checked as boolean | undefined,\n bindings?.checked,\n );\n const displayValue = checked ?? false;\n\n return (\n <View style={{ flexDirection: \"row\", alignItems: \"center\", gap: 8 }}>\n <RNSwitch\n value={displayValue}\n onValueChange={bindings?.checked ? setChecked : undefined}\n disabled={p.disabled ?? false}\n />\n {p.label && (\n <Text style={{ fontSize: 16, color: \"#374151\" }}>{p.label}</Text>\n )}\n </View>\n );\n}\n\nfunction CheckboxComponent({ element, bindings }: ComponentRenderProps) {\n const p = element.props as {\n checked?: boolean;\n label?: string;\n disabled?: boolean;\n };\n\n const [checked, setChecked] = useBoundProp<boolean>(\n p.checked as boolean | undefined,\n bindings?.checked,\n );\n const isChecked = checked ?? false;\n\n return (\n <Pressable\n disabled={p.disabled ?? false}\n onPress={() => {\n if (bindings?.checked) {\n setChecked(!isChecked);\n }\n }}\n style={{\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 8,\n opacity: p.disabled ? 0.5 : 1,\n }}\n >\n <View\n style={{\n width: 20,\n height: 20,\n borderRadius: 4,\n borderWidth: 2,\n borderColor: isChecked ? \"#3b82f6\" : \"#d1d5db\",\n backgroundColor: isChecked ? \"#3b82f6\" : \"transparent\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {isChecked && (\n <Text style={{ color: \"#ffffff\", fontSize: 12, fontWeight: \"700\" }}>\n {\"✓\"}\n </Text>\n )}\n </View>\n {p.label && (\n <Text style={{ fontSize: 16, color: \"#374151\" }}>{p.label}</Text>\n )}\n </Pressable>\n );\n}\n\nfunction SliderComponent({ element }: ComponentRenderProps) {\n const p = element.props as {\n min?: number;\n max?: number;\n step?: number;\n value?: number;\n label?: string;\n color?: string;\n };\n\n const min = p.min ?? 0;\n const max = p.max ?? 100;\n const value = p.value ?? min;\n const progress = max > min ? (value - min) / (max - min) : 0;\n const trackColor = p.color ?? \"#3b82f6\";\n\n return (\n <View>\n {p.label && (\n <View\n style={{\n flexDirection: \"row\",\n justifyContent: \"space-between\",\n marginBottom: 4,\n }}\n >\n <Text style={{ fontSize: 14, color: \"#374151\" }}>{p.label}</Text>\n <Text style={{ fontSize: 14, color: \"#6b7280\" }}>{value}</Text>\n </View>\n )}\n <View\n style={{\n height: 6,\n backgroundColor: \"#e5e7eb\",\n borderRadius: 3,\n overflow: \"hidden\",\n }}\n >\n <View\n style={{\n width: `${Math.min(Math.max(progress * 100, 0), 100)}%`,\n height: \"100%\",\n backgroundColor: trackColor,\n borderRadius: 3,\n }}\n />\n </View>\n </View>\n );\n}\n\nfunction SearchBarComponent({ element, emit }: ComponentRenderProps) {\n const p = element.props as {\n placeholder?: string;\n value?: string;\n };\n\n return (\n <View\n style={{\n flexDirection: \"row\",\n alignItems: \"center\",\n backgroundColor: \"#f3f4f6\",\n borderRadius: 8,\n paddingHorizontal: 12,\n }}\n >\n <Text style={{ fontSize: 16, color: \"#9ca3af\", marginRight: 8 }}>\n {\"Search\"}\n </Text>\n <RNTextInput\n placeholder={p.placeholder ?? \"Search...\"}\n value={p.value ?? undefined}\n returnKeyType=\"search\"\n onSubmitEditing={() => emit(\"submit\")}\n style={{\n flex: 1,\n paddingVertical: 10,\n fontSize: 16,\n color: \"#111827\",\n }}\n />\n </View>\n );\n}\n\n// =============================================================================\n// Feedback Components\n// =============================================================================\n\nfunction SpinnerComponent({ element }: ComponentRenderProps) {\n const p = element.props as {\n size?: \"small\" | \"large\";\n color?: string;\n };\n\n return (\n <ActivityIndicator size={p.size ?? \"small\"} color={p.color ?? \"#3b82f6\"} />\n );\n}\n\nfunction ProgressBarComponent({ element }: ComponentRenderProps) {\n const p = element.props as {\n progress: number;\n color?: string;\n trackColor?: string;\n height?: number;\n };\n\n const height = p.height ?? 6;\n const progress = Math.min(Math.max(p.progress, 0), 1);\n\n return (\n <View\n style={{\n height,\n backgroundColor: p.trackColor ?? \"#e5e7eb\",\n borderRadius: height / 2,\n overflow: \"hidden\",\n }}\n >\n <View\n style={{\n width: `${progress * 100}%`,\n height: \"100%\",\n backgroundColor: p.color ?? \"#3b82f6\",\n borderRadius: height / 2,\n }}\n />\n </View>\n );\n}\n\n// =============================================================================\n// Composite Components\n// =============================================================================\n\nfunction CardComponent({ element, children }: ComponentRenderProps) {\n const p = element.props as {\n title?: string;\n subtitle?: string;\n padding?: number;\n backgroundColor?: string;\n borderRadius?: number;\n elevated?: boolean;\n };\n\n const elevated = p.elevated !== false;\n const padding = p.padding ?? 16;\n\n return (\n <View\n style={[\n {\n backgroundColor: p.backgroundColor ?? \"#ffffff\",\n borderRadius: p.borderRadius ?? 12,\n padding,\n },\n elevated && {\n shadowColor: \"#000\",\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.1,\n shadowRadius: 8,\n elevation: 3,\n },\n ]}\n >\n {p.title && (\n <Text\n style={{\n fontSize: 18,\n fontWeight: \"600\",\n color: \"#111827\",\n marginBottom: p.subtitle ? 2 : 12,\n }}\n >\n {p.title}\n </Text>\n )}\n {p.subtitle && (\n <Text\n style={{\n fontSize: 14,\n color: \"#6b7280\",\n marginBottom: 12,\n }}\n >\n {p.subtitle}\n </Text>\n )}\n {children}\n </View>\n );\n}\n\nfunction ListItemComponent({ element, emit }: ComponentRenderProps) {\n const p = element.props as {\n title: string;\n subtitle?: string;\n leading?: string;\n trailing?: string;\n showChevron?: boolean;\n };\n\n const hasPress = !!element.on?.press;\n\n const content = (\n <View\n style={{\n flexDirection: \"row\",\n alignItems: \"center\",\n paddingVertical: 12,\n paddingHorizontal: 16,\n }}\n >\n {p.leading && (\n <Text\n style={{\n fontSize: 16,\n color: \"#6b7280\",\n marginRight: 12,\n width: 24,\n textAlign: \"center\",\n }}\n >\n {p.leading}\n </Text>\n )}\n <View style={{ flex: 1 }}>\n <Text style={{ fontSize: 16, color: \"#111827\" }}>{p.title}</Text>\n {p.subtitle && (\n <Text style={{ fontSize: 14, color: \"#6b7280\", marginTop: 2 }}>\n {p.subtitle}\n </Text>\n )}\n </View>\n {p.trailing && (\n <Text style={{ fontSize: 14, color: \"#6b7280\", marginLeft: 8 }}>\n {p.trailing}\n </Text>\n )}\n {p.showChevron && (\n <Text style={{ fontSize: 16, color: \"#9ca3af\", marginLeft: 8 }}>\n {\">\"}\n </Text>\n )}\n </View>\n );\n\n if (hasPress) {\n return (\n <Pressable\n onPress={() => emit(\"press\")}\n style={({ pressed }) => ({\n opacity: pressed ? 0.7 : 1,\n backgroundColor: pressed ? \"#f9fafb\" : \"transparent\",\n })}\n >\n {content}\n </Pressable>\n );\n }\n\n return content;\n}\n\nfunction ModalComponent({ element, children }: ComponentRenderProps) {\n const p = element.props as {\n visible: boolean;\n title?: string;\n animationType?: \"slide\" | \"fade\" | \"none\";\n };\n\n return (\n <RNModal\n visible={p.visible}\n animationType={p.animationType ?? \"slide\"}\n transparent\n >\n <View style={modalStyles.overlay}>\n <View style={modalStyles.content}>\n {p.title && <Text style={modalStyles.title}>{p.title}</Text>}\n {children}\n </View>\n </View>\n </RNModal>\n );\n}\n\n// =============================================================================\n// Standard Action Handlers\n// =============================================================================\n\n/**\n * Create standard action handlers for React Native.\n *\n * @param options - Configuration for standard actions\n * @returns Action handler map compatible with ActionProvider\n */\nexport function createStandardActionHandlers(options?: {\n /** Navigation function - called by navigate and goBack actions */\n navigate?: (screen: string, params?: Record<string, unknown>) => void;\n /** Go back function */\n goBack?: () => void;\n /** Called when setData action is triggered */\n onSetData?: (path: string, value: unknown) => void;\n /** Called when refresh action is triggered */\n onRefresh?: (target?: string) => void;\n}): Record<string, (params: Record<string, unknown>) => Promise<void>> {\n return {\n navigate: async (params) => {\n const screen = params.screen as string;\n const navParams = params.params as Record<string, unknown> | undefined;\n options?.navigate?.(screen, navParams ?? undefined);\n },\n\n goBack: async () => {\n options?.goBack?.();\n },\n\n showAlert: async (params) => {\n const title = params.title as string;\n const message = (params.message as string) ?? undefined;\n const buttons = params.buttons as\n | Array<{\n text: string;\n style?: \"default\" | \"cancel\" | \"destructive\";\n action?: string;\n }>\n | undefined;\n\n const alertButtons = buttons?.map((btn) => ({\n text: btn.text,\n style: btn.style as \"default\" | \"cancel\" | \"destructive\" | undefined,\n }));\n\n Alert.alert(title, message, alertButtons);\n },\n\n share: async (params) => {\n const message = params.message as string;\n const url = (params.url as string) ?? undefined;\n const title = (params.title as string) ?? undefined;\n\n await Share.share({ message, url, title });\n },\n\n openURL: async (params) => {\n const url = params.url as string;\n const canOpen = await Linking.canOpenURL(url);\n if (canOpen) {\n await Linking.openURL(url);\n }\n },\n\n setData: async (params) => {\n const statePath = params.statePath as string;\n const value = params.value;\n options?.onSetData?.(statePath, value);\n },\n\n refresh: async (params) => {\n const target = (params.target as string) ?? undefined;\n options?.onRefresh?.(target);\n },\n };\n}\n\n// =============================================================================\n// Standard Components Registry\n// =============================================================================\n\n/**\n * Standard component registry with all built-in React Native components.\n * Pass to Renderer or merge with custom components.\n */\nexport const standardComponents: ComponentRegistry = {\n // Layout\n Container: ContainerComponent,\n Row: RowComponent,\n Column: ColumnComponent,\n ScrollContainer: ScrollContainerComponent,\n SafeArea: SafeAreaComponent,\n Pressable: PressableComponent,\n Spacer: SpacerComponent,\n Divider: DividerComponent,\n // Content\n Heading: HeadingComponent,\n Paragraph: ParagraphComponent,\n Label: LabelComponent,\n Image: ImageComponent,\n Avatar: AvatarComponent,\n Badge: BadgeComponent,\n Chip: ChipComponent,\n // Input\n Button: ButtonComponent,\n TextInput: TextInputComponent,\n Switch: SwitchComponent,\n Checkbox: CheckboxComponent,\n Slider: SliderComponent,\n SearchBar: SearchBarComponent,\n // Feedback\n Spinner: SpinnerComponent,\n ProgressBar: ProgressBarComponent,\n // Composite\n Card: CardComponent,\n ListItem: ListItemComponent,\n Modal: ModalComponent,\n};\n\n// =============================================================================\n// Shared Styles\n// =============================================================================\n\nconst inputStyles = StyleSheet.create({\n label: {\n fontSize: 14,\n fontWeight: \"500\",\n color: \"#374151\",\n marginBottom: 4,\n },\n input: {\n borderWidth: 1,\n borderColor: \"#d1d5db\",\n borderRadius: 8,\n paddingHorizontal: 12,\n paddingVertical: 10,\n fontSize: 16,\n color: \"#111827\",\n backgroundColor: \"#ffffff\",\n },\n});\n\nconst modalStyles = StyleSheet.create({\n overlay: {\n flex: 1,\n backgroundColor: \"rgba(0, 0, 0, 0.5)\",\n justifyContent: \"flex-end\",\n },\n content: {\n backgroundColor: \"#ffffff\",\n borderTopLeftRadius: 16,\n borderTopRightRadius: 16,\n padding: 24,\n maxHeight: \"80%\",\n },\n title: {\n fontSize: 20,\n fontWeight: \"600\",\n color: \"#111827\",\n marginBottom: 16,\n },\n});\n","import { useState, useCallback, useRef, useEffect } from \"react\";\nimport type {\n Spec,\n UIElement,\n FlatElement,\n JsonPatch,\n} from \"@json-render/core\";\nimport {\n setByPath,\n getByPath,\n removeByPath,\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: JsonPatch | 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.\n * Includes recovery for common LLM JSON errors 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 return { patch: JSON.parse(trimmed) as JsonPatch, 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 < 3; 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) as JsonPatch;\n console.warn(\n `[json-render] Recovered malformed JSONL line by removing ${i + 1} trailing '${last}'`,\n );\n return { patch: result, malformed: false };\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 * Set a value at a spec path (for add/replace operations).\n */\nfunction setSpecValue(newSpec: Spec, path: string, value: unknown): void {\n if (path === \"/root\") {\n newSpec.root = value as string;\n return;\n }\n\n if (path === \"/state\") {\n newSpec.state = value as Record<string, unknown>;\n return;\n }\n\n if (path.startsWith(\"/state/\")) {\n if (!newSpec.state) newSpec.state = {};\n const statePath = path.slice(\"/state\".length);\n setByPath(newSpec.state as Record<string, unknown>, statePath, value);\n return;\n }\n\n if (path.startsWith(\"/elements/\")) {\n const pathParts = path.slice(\"/elements/\".length).split(\"/\");\n const elementKey = pathParts[0];\n if (!elementKey) return;\n\n if (pathParts.length === 1) {\n newSpec.elements[elementKey] = value as UIElement;\n } else {\n const element = newSpec.elements[elementKey];\n if (element) {\n const propPath = \"/\" + pathParts.slice(1).join(\"/\");\n const newElement = { ...element };\n setByPath(\n newElement as unknown as Record<string, unknown>,\n propPath,\n value,\n );\n newSpec.elements[elementKey] = newElement;\n }\n }\n }\n}\n\n/**\n * Remove a value at a spec path.\n */\nfunction removeSpecValue(newSpec: Spec, path: string): void {\n if (path === \"/state\") {\n newSpec.state = undefined;\n return;\n }\n\n if (path.startsWith(\"/state/\") && newSpec.state) {\n const statePath = path.slice(\"/state\".length);\n removeByPath(newSpec.state as Record<string, unknown>, statePath);\n return;\n }\n\n if (path.startsWith(\"/elements/\")) {\n const pathParts = path.slice(\"/elements/\".length).split(\"/\");\n const elementKey = pathParts[0];\n if (!elementKey) return;\n\n if (pathParts.length === 1) {\n const { [elementKey]: _, ...rest } = newSpec.elements;\n newSpec.elements = rest;\n } else {\n const element = newSpec.elements[elementKey];\n if (element) {\n const propPath = \"/\" + pathParts.slice(1).join(\"/\");\n const newElement = { ...element };\n removeByPath(\n newElement as unknown as Record<string, unknown>,\n propPath,\n );\n newSpec.elements[elementKey] = newElement;\n }\n }\n }\n}\n\n/**\n * Get a value at a spec path.\n */\nfunction getSpecValue(spec: Spec, path: string): unknown {\n if (path === \"/root\") return spec.root;\n return getByPath(spec as unknown as Record<string, unknown>, path);\n}\n\n/**\n * Apply an RFC 6902 JSON patch to the current spec.\n * Supports add, remove, replace, move, copy, and test operations.\n */\nfunction applyPatch(spec: Spec, patch: JsonPatch): Spec {\n const newSpec = { ...spec, elements: { ...spec.elements } };\n\n switch (patch.op) {\n case \"add\":\n case \"replace\": {\n setSpecValue(newSpec, patch.path, patch.value);\n break;\n }\n case \"remove\": {\n removeSpecValue(newSpec, patch.path);\n break;\n }\n case \"move\": {\n if (!patch.from) break;\n const moveValue = getSpecValue(newSpec, patch.from);\n removeSpecValue(newSpec, patch.from);\n setSpecValue(newSpec, patch.path, moveValue);\n break;\n }\n case \"copy\": {\n if (!patch.from) break;\n const copyValue = getSpecValue(newSpec, patch.from);\n setSpecValue(newSpec, patch.path, copyValue);\n break;\n }\n case \"test\": {\n // test is a no-op for rendering purposes (validation only)\n break;\n }\n }\n\n return newSpec;\n}\n\n// =============================================================================\n// 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 * React Native's built-in fetch does not support `response.body`\n * (ReadableStream). Pass a streaming-capable fetch here, e.g.\n * `import { fetch } from 'expo/fetch'`.\n *\n * Falls back to the global `fetch` if not provided.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fetch?: (url: string, init?: any) => 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 /** Raw JSONL lines received from the stream */\n rawLines: string[];\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\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 [rawLines, setRawLines] = useState<string[]>([]);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const stop = useCallback(() => {\n abortControllerRef.current?.abort();\n abortControllerRef.current = null;\n setIsStreaming(false);\n }, []);\n\n const clear = useCallback(() => {\n setSpec(null);\n setError(null);\n setRawLines([]);\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 ): 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: abortControllerRef.current!.signal,\n });\n\n if (!response.ok) {\n let errorMessage = `HTTP error: ${response.status}`;\n try {\n const errorData = await response.json();\n if (errorData.message) {\n errorMessage = errorData.message;\n } else if (errorData.error) {\n errorMessage = errorData.error;\n }\n } catch {\n // Ignore JSON parsing errors, 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 const newLines: string[] = [];\n for (const line of lines) {\n if (line.trim()) {\n newLines.push(line);\n }\n const { patch, malformed } = parsePatchLine(line);\n if (patch) {\n currentSpec = applyPatch(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 if (newLines.length > 0) {\n setRawLines((prev) => [...prev, ...newLines]);\n }\n }\n\n // Process any remaining buffer (only if stream completed naturally)\n if (!aborted && buffer.trim()) {\n setRawLines((prev) => [...prev, buffer]);\n const { patch, malformed } = parsePatchLine(buffer);\n if (patch) {\n currentSpec = applyPatch(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 abortControllerRef.current = new AbortController();\n\n setIsStreaming(true);\n setError(null);\n setRawLines([]);\n\n // Start with previous spec if provided, otherwise empty spec\n const previousSpec = context?.previousSpec as Spec | undefined;\n let currentSpec: Spec =\n previousSpec && previousSpec.root\n ? { ...previousSpec, elements: { ...previousSpec.elements } }\n : { root: \"\", elements: {} };\n\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 );\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\n const errors = validation.issues.filter(\n (i) => i.severity === \"error\",\n );\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 onError?.(validationError);\n return;\n }\n }\n\n onComplete?.(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 onError?.(error);\n } finally {\n setIsStreaming(false);\n }\n },\n [\n api,\n fetchFn,\n onComplete,\n onError,\n enableValidation,\n maxRetries,\n streamRequest,\n ],\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 rawLines,\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 }\n } else {\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","useCallback","useMemo","jsx","createContext","useCallback","value","binding","useMemo","useContext","executeAction","React","createContext","useContext","useState","useCallback","useMemo","jsx","createContext","useState","useCallback","value","useMemo","useContext","React","createContext","useContext","jsx","createStateStore","React","useCallback","useMemo","evaluateVisibility","getByPath","View","Text","Pressable","StyleSheet","useState","useCallback","useRef","useEffect","getByPath","useCallback","getByPath","useState","useRef","error","useEffect","jsx","jsxs","View","Pressable","Text","StyleSheet","jsx","jsxs","React","ElementRenderer","useMemo","evaluateVisibility","useCallback","getByPath","executeAction"]}