@json-render/react-native 0.19.0 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/{chunk-T27PQA6P.mjs → chunk-TAJ5ASZ5.mjs} +6 -3
- package/dist/chunk-TAJ5ASZ5.mjs.map +1 -0
- package/dist/index.js +38 -12
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +36 -11
- package/dist/index.mjs.map +1 -1
- package/dist/schema.d.mts +22 -2
- package/dist/schema.d.ts +22 -2
- package/dist/schema.js +5 -2
- package/dist/schema.js.map +1 -1
- package/dist/schema.mjs +1 -1
- package/package.json +4 -4
- package/dist/chunk-T27PQA6P.mjs.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../../react-state/src/index.tsx","../src/contexts/visibility.tsx","../src/contexts/actions.tsx","../src/contexts/validation.tsx","../src/contexts/repeat-scope.tsx","../src/schema.ts","../src/renderer.tsx","../src/components/standard.tsx","../src/hooks.ts","../src/catalog.ts"],"sourcesContent":["// Contexts\nexport {\n StateProvider,\n useStateStore,\n useStateValue,\n useStateBinding,\n type StateContextValue,\n type StateProviderProps,\n} from \"./contexts/state\";\n\nexport {\n VisibilityProvider,\n useVisibility,\n useIsVisible,\n type VisibilityContextValue,\n type VisibilityProviderProps,\n} from \"./contexts/visibility\";\n\nexport {\n ActionProvider,\n useActions,\n useAction,\n ConfirmDialog,\n type ActionContextValue,\n type ActionProviderProps,\n type PendingConfirmation,\n type ConfirmDialogProps,\n} from \"./contexts/actions\";\n\nexport {\n ValidationProvider,\n useValidation,\n 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","\"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","import { defineSchema } from \"@json-render/core\";\n\n/**\n * The schema for @json-render/react-native\n *\n * Defines:\n * - Spec: A flat tree of elements with keys, types, props, and children references\n * - Catalog: Components with props schemas, and optional actions\n */\nexport const schema = defineSchema(\n (s) => ({\n // What the AI-generated SPEC looks like\n spec: s.object({\n /** Root element key */\n root: s.string(),\n /** Flat map of elements by key */\n elements: s.record(\n s.object({\n /** Component type from catalog */\n type: s.ref(\"catalog.components\"),\n /** Component props */\n props: s.propsOf(\"catalog.components\"),\n /** Child element keys (flat reference) */\n children: s.array(s.string()),\n /** Visibility condition */\n visible: s.any(),\n }),\n ),\n }),\n\n // What the CATALOG must provide\n catalog: s.object({\n /** Component definitions */\n components: s.map({\n /** Zod schema for component props */\n props: s.zod(),\n /** Slots for this component. Use ['default'] for children, or named slots like ['header', 'footer'] */\n slots: s.array(s.string()),\n /** Description for AI generation hints */\n description: s.string(),\n /** Example prop values used in prompt examples (auto-generated from Zod schema if omitted) */\n example: s.any(),\n }),\n /** Action definitions (optional) */\n actions: s.map({\n /** Zod schema for action params */\n params: s.zod(),\n /** Description for AI generation hints */\n description: s.string(),\n }),\n }),\n }),\n {\n defaultRules: [\n // Layout patterns\n \"FIXED BOTTOM BAR PATTERN: When building a screen with a fixed header and/or fixed bottom tab bar, the outermost vertical layout component must have flex:1 so it fills the screen. The scrollable content area must also have flex:1. Structure: screen wrapper > vertical layout(flex:1, gap:0) > [header, content wrapper(flex:1) > [scroll container(...)], bottom-tabs]. Both the outer layout AND the content wrapper need flex:1. ONLY use components from the AVAILABLE COMPONENTS list.\",\n \"NEVER place a bottom tab bar or fixed footer inside a scroll container. It must be a sibling AFTER the flex:1 container that holds the scroll content.\",\n\n // Element integrity\n \"CRITICAL INTEGRITY CHECK: Before outputting ANY element that references children, you MUST have already output (or will output) each child as its own element. If an element has children: ['a', 'b'], then elements 'a' and 'b' MUST exist. A missing child element causes that entire branch of the UI to be invisible.\",\n \"SELF-CHECK: After generating all elements, mentally walk the tree from root. Every key in every children array must resolve to a defined element. If you find a gap, output the missing element immediately.\",\n 'When building repeating content backed by a state array (e.g. todos, posts, cart items), use the \"repeat\" field on a container element from the AVAILABLE COMPONENTS list. Example: { \"type\": \"<ContainerComponent>\", \"props\": { \"gap\": 8 }, \"repeat\": { \"statePath\": \"/todos\", \"key\": \"id\" }, \"children\": [\"todo-item\"] }. Inside repeated children, use { \"$item\": \"field\" } to read a field from the current item, and { \"$index\": true } for the current array index. For two-way binding to an item field use { \"$bindItem\": \"completed\" }. Do NOT hardcode individual elements for each array item.',\n\n // Visible field placement\n 'CRITICAL: The \"visible\" field goes on the ELEMENT object, NOT inside \"props\". Correct: {\"type\":\"<ComponentName>\",\"props\":{},\"visible\":{\"$state\":\"/activeTab\",\"eq\":\"home\"},\"children\":[...]}. WRONG: {\"type\":\"<ComponentName>\",\"props\":{},\"visible\":{...},\"children\":[...]} with visible inside props.',\n\n // Tab navigation pattern\n \"TAB NAVIGATION PATTERN: When building a UI with multiple tabs, use a pressable/tappable component + setState action + visible conditions to make tabs functional. ONLY use components from the AVAILABLE COMPONENTS list.\",\n 'Each tab button should be a pressable component wrapping its icon/label children, with action \"setState\" and actionParams { \"statePath\": \"/activeTab\", \"value\": \"tabName\" }.',\n 'Each tab\\'s content section should have a visible condition: { \"$state\": \"/activeTab\", \"eq\": \"tabName\" }.',\n \"The first tab's content should NOT have a visible condition (so it shows by default when no tab is selected yet). All other tabs MUST have a visible condition.\",\n\n // Tab active state highlighting (using dynamic props)\n \"TAB ACTIVE STYLING: Use $cond dynamic props on icon elements inside each tab button so a single icon changes appearance based on the active tab.\",\n ' - For the icon name: { \"$cond\": { \"$state\": \"/activeTab\", \"eq\": \"thisTabName\" }, \"$then\": \"home\", \"$else\": \"home-outline\" }',\n ' - For the icon color: { \"$cond\": { \"$state\": \"/activeTab\", \"eq\": \"thisTabName\" }, \"$then\": \"#007AFF\", \"$else\": \"#8E8E93\" }',\n \" - For labels, use $cond on the color prop similarly.\",\n ' - For the FIRST/DEFAULT tab, use { \"$cond\": [{ \"$state\": \"/activeTab\", \"eq\": \"thisTabName\" }], \"$then\": \"#007AFF\", \"$else\": \"#8E8E93\" } so it appears active before any tab is tapped. When no tab is selected yet, include a default tab with no visible condition.',\n\n // Push/pop screen navigation (all screens in one spec)\n 'SCREEN NAVIGATION: Use a pressable component with action \"push\" and actionParams { \"screen\": \"screenName\" } to navigate to a new screen. Use action \"pop\" to go back. All screens must be defined in the SAME spec. ONLY use components from the AVAILABLE COMPONENTS list.',\n 'Each screen section uses a visible condition on /currentScreen: { \"$state\": \"/currentScreen\", \"eq\": \"screenName\" }. The default/home screen should show by default (no visible condition) and all other screens should have the appropriate visible condition.',\n \"push automatically maintains a /navStack in the state model so pop always returns to the previous screen.\",\n 'Include a back button on pushed screens using action \"pop\". Example: pressable(action:\"pop\") > row layout > back icon + back label. ONLY use components from the AVAILABLE COMPONENTS list.',\n \"Use push/pop for drill-down flows: tapping a list item to see details, opening a profile, etc. Use setState + visible conditions for tab switching within a screen.\",\n 'Example: A list screen with items that push to detail: a pressable component with action:\"push\" and actionParams:{screen:\"detail\"} wrapping each list item. The detail screen section has visible:{\"$state\":\"/currentScreen\",\"eq\":\"detail\"} and contains a back button with action:\"pop\". ONLY use components from the AVAILABLE COMPONENTS list.',\n ],\n },\n);\n\n/**\n * Type for the React Native schema\n */\nexport type ReactNativeSchema = typeof schema;\n\n/**\n * Infer the spec type from a catalog\n */\nexport type ReactNativeSpec<TCatalog> = typeof schema extends {\n createCatalog: (catalog: TCatalog) => { _specType: infer S };\n}\n ? S\n : never;\n\n// Backward compatibility aliases\n/** @deprecated Use `schema` instead */\nexport const elementTreeSchema = schema;\n/** @deprecated Use `ReactNativeSchema` instead */\nexport type ElementTreeSchema = ReactNativeSchema;\n/** @deprecated Use `ReactNativeSpec` instead */\nexport type ElementTreeSpec<T> = ReactNativeSpec<T>;\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","import { z } from \"zod\";\n\n// =============================================================================\n// Standard Component Definitions for React Native\n// =============================================================================\n\n/**\n * Standard component definitions for React Native catalogs.\n *\n * These can be used directly or extended with custom components.\n * All components are built using React Native core primitives only.\n */\nexport const standardComponentDefinitions = {\n // ==========================================================================\n // Layout Components\n // ==========================================================================\n\n Container: {\n props: z.object({\n padding: z.number().nullable(),\n paddingHorizontal: z.number().nullable(),\n paddingVertical: z.number().nullable(),\n margin: z.number().nullable(),\n backgroundColor: z.string().nullable(),\n borderRadius: z.number().nullable(),\n flex: z.number().nullable(),\n }),\n slots: [\"default\"],\n description:\n \"Generic container wrapper. Use for grouping elements with padding, margin, and background color.\",\n example: { padding: 16, backgroundColor: \"#FFFFFF\" },\n },\n\n Row: {\n props: z.object({\n gap: z.number().nullable(),\n alignItems: z\n .enum([\"flex-start\", \"center\", \"flex-end\", \"stretch\", \"baseline\"])\n .nullable(),\n justifyContent: z\n .enum([\n \"flex-start\",\n \"center\",\n \"flex-end\",\n \"space-between\",\n \"space-around\",\n \"space-evenly\",\n ])\n .nullable(),\n flexWrap: z.enum([\"wrap\", \"nowrap\"]).nullable(),\n padding: z.number().nullable(),\n flex: z.number().nullable(),\n }),\n slots: [\"default\"],\n description:\n \"Horizontal flex layout. Use for placing elements side by side.\",\n example: { gap: 12, alignItems: \"center\" },\n },\n\n Column: {\n props: z.object({\n gap: z.number().nullable(),\n alignItems: z\n .enum([\"flex-start\", \"center\", \"flex-end\", \"stretch\", \"baseline\"])\n .nullable(),\n justifyContent: z\n .enum([\n \"flex-start\",\n \"center\",\n \"flex-end\",\n \"space-between\",\n \"space-around\",\n \"space-evenly\",\n ])\n .nullable(),\n padding: z.number().nullable(),\n flex: z.number().nullable(),\n }),\n slots: [\"default\"],\n description:\n \"Vertical flex layout. Use for stacking elements top to bottom.\",\n example: { gap: 12, padding: 16 },\n },\n\n ScrollContainer: {\n props: z.object({\n horizontal: z.boolean().nullable(),\n showsScrollIndicator: z.boolean().nullable(),\n padding: z.number().nullable(),\n backgroundColor: z.string().nullable(),\n }),\n slots: [\"default\"],\n description:\n \"Scrollable container. Use for content that may overflow the screen.\",\n },\n\n SafeArea: {\n props: z.object({\n backgroundColor: z.string().nullable(),\n }),\n slots: [\"default\"],\n description:\n \"Safe area container that respects device notches and system bars. Use as the outermost wrapper for screens.\",\n },\n\n Spacer: {\n props: z.object({\n size: z.number().nullable(),\n flex: z.number().nullable(),\n }),\n slots: [],\n description:\n \"Empty space between elements. Set size for fixed spacing or flex for flexible spacing.\",\n },\n\n Pressable: {\n props: z.object({}),\n events: [\"press\", \"longPress\"],\n slots: [\"default\"],\n description:\n \"Touchable wrapper that triggers events on press. Wrap any element to make it tappable. Bind on.press to setState to update state for visibility-driven UIs like tabs.\",\n },\n\n Divider: {\n props: z.object({\n direction: z.enum([\"horizontal\", \"vertical\"]).nullable(),\n color: z.string().nullable(),\n thickness: z.number().nullable(),\n margin: z.number().nullable(),\n }),\n slots: [],\n description: \"Thin line separator between content sections.\",\n },\n\n // ==========================================================================\n // Content Components\n // ==========================================================================\n\n Heading: {\n props: z.object({\n text: z.string(),\n level: z.enum([\"h1\", \"h2\", \"h3\", \"h4\"]).nullable(),\n color: z.string().nullable(),\n align: z.enum([\"left\", \"center\", \"right\"]).nullable(),\n }),\n slots: [],\n description:\n \"Heading text at various levels. h1 is largest, h4 is smallest.\",\n example: { text: \"Welcome\", level: \"h1\" },\n },\n\n Paragraph: {\n props: z.object({\n text: z.string(),\n color: z.string().nullable(),\n align: z.enum([\"left\", \"center\", \"right\"]).nullable(),\n numberOfLines: z.number().nullable(),\n fontSize: z.number().nullable(),\n }),\n slots: [],\n description:\n \"Body text paragraph. Use for descriptions and longer content.\",\n example: { text: \"This is a paragraph of body text.\" },\n },\n\n Label: {\n props: z.object({\n text: z.string(),\n color: z.string().nullable(),\n bold: z.boolean().nullable(),\n size: z.enum([\"xs\", \"sm\", \"md\"]).nullable(),\n }),\n slots: [],\n description:\n \"Small utility text. Use for captions, form labels, and secondary information.\",\n example: { text: \"Status\", size: \"sm\" },\n },\n\n Image: {\n props: z.object({\n src: z.string(),\n alt: z.string().nullable(),\n width: z.number().nullable(),\n height: z.number().nullable(),\n resizeMode: z.enum([\"cover\", \"contain\", \"stretch\", \"center\"]).nullable(),\n borderRadius: z.number().nullable(),\n }),\n slots: [],\n description: \"Image display. Provide a source URL and optional dimensions.\",\n example: {\n src: \"https://picsum.photos/300/200\",\n alt: \"Photo\",\n width: 300,\n height: 200,\n },\n },\n\n Avatar: {\n props: z.object({\n src: z.string().nullable(),\n initials: z.string().nullable(),\n size: z.enum([\"sm\", \"md\", \"lg\", \"xl\"]).nullable(),\n backgroundColor: z.string().nullable(),\n }),\n slots: [],\n description:\n \"Circular avatar showing an image or initials. Use for user profiles and contacts.\",\n example: { initials: \"JD\", size: \"md\" },\n },\n\n Badge: {\n props: z.object({\n label: z.string(),\n variant: z\n .enum([\"default\", \"info\", \"success\", \"warning\", \"error\"])\n .nullable(),\n }),\n slots: [],\n description:\n \"Small colored indicator with a label. Use for status, counts, and categories.\",\n example: { label: \"New\", variant: \"info\" },\n },\n\n Chip: {\n props: z.object({\n label: z.string(),\n selected: z.boolean().nullable(),\n backgroundColor: z.string().nullable(),\n }),\n events: [\"press\", \"remove\"],\n slots: [],\n description:\n \"Tag or filter chip. Bind on.remove for removable chips, on.press for selectable chips.\",\n },\n\n // ==========================================================================\n // Input Components\n // ==========================================================================\n\n Button: {\n props: z.object({\n label: z.string(),\n variant: z\n .enum([\"primary\", \"secondary\", \"danger\", \"outline\", \"ghost\"])\n .nullable(),\n size: z.enum([\"sm\", \"md\", \"lg\"]).nullable(),\n disabled: z.boolean().nullable(),\n loading: z.boolean().nullable(),\n }),\n events: [\"press\"],\n slots: [],\n description:\n \"Pressable button with label. Set variant for styling. Bind on.press for the handler to call on press.\",\n example: { label: \"Submit\", variant: \"primary\" },\n },\n\n TextInput: {\n props: z.object({\n placeholder: z.string().nullable(),\n value: z.string().nullable(),\n secureTextEntry: z.boolean().nullable(),\n keyboardType: z\n .enum([\"default\", \"email-address\", \"numeric\", \"phone-pad\", \"url\"])\n .nullable(),\n multiline: z.boolean().nullable(),\n numberOfLines: z.number().nullable(),\n label: z.string().nullable(),\n flex: z.number().nullable(),\n }),\n events: [\"submit\", \"focus\", \"blur\"],\n slots: [],\n description:\n \"Text input field. Use $bindState to bind to the state model for two-way binding. The value typed by the user is stored at the bound path.\",\n example: {\n placeholder: \"Enter text...\",\n label: \"Name\",\n },\n },\n\n Switch: {\n props: z.object({\n checked: z.boolean().nullable(),\n label: z.string().nullable(),\n disabled: z.boolean().nullable(),\n }),\n events: [\"change\"],\n slots: [],\n description: \"Toggle switch. Use $bindState to bind to the state model.\",\n },\n\n Checkbox: {\n props: z.object({\n checked: z.boolean().nullable(),\n label: z.string().nullable(),\n disabled: z.boolean().nullable(),\n }),\n events: [\"change\"],\n slots: [],\n description:\n \"Checkbox for boolean selections. Use $bindState to bind to the state model.\",\n },\n\n Slider: {\n props: z.object({\n min: z.number().nullable(),\n max: z.number().nullable(),\n step: z.number().nullable(),\n value: z.number().nullable(),\n label: z.string().nullable(),\n color: z.string().nullable(),\n }),\n slots: [],\n description:\n \"Range slider for numeric values. Use $bindState to bind to the state model.\",\n },\n\n SearchBar: {\n props: z.object({\n placeholder: z.string().nullable(),\n value: z.string().nullable(),\n }),\n events: [\"submit\"],\n slots: [],\n description:\n \"Search input with icon. Bind on.submit to trigger search on submit.\",\n },\n\n // ==========================================================================\n // Feedback Components\n // ==========================================================================\n\n Spinner: {\n props: z.object({\n size: z.enum([\"small\", \"large\"]).nullable(),\n color: z.string().nullable(),\n }),\n slots: [],\n description: \"Loading spinner indicator. Use while content is loading.\",\n },\n\n ProgressBar: {\n props: z.object({\n progress: z.number(),\n color: z.string().nullable(),\n trackColor: z.string().nullable(),\n height: z.number().nullable(),\n }),\n slots: [],\n description: \"Horizontal progress bar. Set progress from 0 to 1.\",\n },\n\n // ==========================================================================\n // Composite Components\n // ==========================================================================\n\n Card: {\n props: z.object({\n title: z.string().nullable(),\n subtitle: z.string().nullable(),\n padding: z.number().nullable(),\n backgroundColor: z.string().nullable(),\n borderRadius: z.number().nullable(),\n elevated: z.boolean().nullable(),\n }),\n slots: [\"default\"],\n description:\n \"Elevated card container with optional title. Use for grouping related content.\",\n example: { title: \"Details\", padding: 16, elevated: true },\n },\n\n ListItem: {\n props: z.object({\n title: z.string(),\n subtitle: z.string().nullable(),\n leading: z.string().nullable(),\n trailing: z.string().nullable(),\n showChevron: z.boolean().nullable(),\n }),\n events: [\"press\"],\n slots: [],\n description:\n \"List row with title, subtitle, and optional leading/trailing text. Bind on.press for the press handler.\",\n example: {\n title: \"Settings\",\n subtitle: \"Manage your preferences\",\n showChevron: true,\n },\n },\n\n Modal: {\n props: z.object({\n visible: z.boolean(),\n title: z.string().nullable(),\n animationType: z.enum([\"slide\", \"fade\", \"none\"]).nullable(),\n }),\n slots: [\"default\"],\n description:\n \"Modal overlay dialog. Use $bindState on visible to bind visibility to the state model.\",\n },\n};\n\n// =============================================================================\n// Standard Action Definitions for React Native\n// =============================================================================\n\n/**\n * Standard action definitions for React Native catalogs.\n *\n * These use React Native core APIs (Alert, Share, Linking) and\n * user-provided functions (navigate).\n */\nexport const standardActionDefinitions = {\n navigate: {\n params: z.object({\n screen: z.string(),\n params: z.record(z.string(), z.unknown()).nullable(),\n }),\n description:\n \"Navigate to a screen. Calls the user-provided navigation function.\",\n },\n\n goBack: {\n params: z.object({}),\n description: \"Navigate back to the previous screen.\",\n },\n\n showAlert: {\n params: z.object({\n title: z.string(),\n message: z.string().nullable(),\n buttons: z\n .array(\n z.object({\n text: z.string(),\n style: z.enum([\"default\", \"cancel\", \"destructive\"]).nullable(),\n action: z.string().nullable(),\n }),\n )\n .nullable(),\n }),\n description: \"Show a native alert dialog using Alert.alert().\",\n },\n\n share: {\n params: z.object({\n message: z.string(),\n url: z.string().nullable(),\n title: z.string().nullable(),\n }),\n description: \"Open the native share sheet using Share.share().\",\n },\n\n openURL: {\n params: z.object({\n url: z.string(),\n }),\n description: \"Open a URL in the default browser using Linking.openURL().\",\n },\n\n setState: {\n params: z.object({\n statePath: z.string(),\n value: z.unknown(),\n }),\n description: \"Update a value in the state model at the given statePath.\",\n },\n\n pushState: {\n params: z.object({\n statePath: z.string(),\n value: z.unknown(),\n clearStatePath: z.string().optional(),\n }),\n description:\n 'Append an item to an array in the state model. The value can contain { $state: \"/statePath\" } references to read from current state, and \"$id\" to auto-generate a unique ID. Use clearStatePath to reset another path after pushing (e.g. clear an input field). Example: { statePath: \"/todos\", value: { id: \"$id\", title: { $state: \"/newTodoText\" }, completed: false }, clearStatePath: \"/newTodoText\" }.',\n },\n\n removeState: {\n params: z.object({\n statePath: z.string(),\n index: z.number(),\n }),\n description:\n \"Remove an item from an array in the state model at the given index.\",\n },\n\n refresh: {\n params: z.object({\n target: z.string().nullable(),\n }),\n description:\n \"Trigger a data refresh. Optionally specify a target to refresh.\",\n },\n};\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Type for a component definition\n */\nexport type ComponentDefinition = {\n props: z.ZodType;\n slots: string[];\n events?: string[];\n description: string;\n};\n\n/**\n * Type for an action definition\n */\nexport type ActionDefinition = {\n params: z.ZodType;\n description: string;\n};\n"],"mappings":"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","names":["value","import_react","import_core","import_jsx_runtime","import_react","import_core","import_jsx_runtime","value","executeAction","import_react","import_core","import_jsx_runtime","value","React","import_react","import_jsx_runtime","import_core","import_core","import_react","import_core","import_react_native","import_react","import_core","error","import_jsx_runtime","RNImage","RNTextInput","RNSwitch","RNModal","import_jsx_runtime","React","ElementRenderer","executeAction"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../../react-state/src/index.tsx","../src/contexts/visibility.tsx","../src/contexts/actions.tsx","../src/contexts/validation.tsx","../src/contexts/repeat-scope.tsx","../src/schema.ts","../src/renderer.tsx","../src/components/standard.tsx","../src/hooks.ts","../src/catalog.ts"],"sourcesContent":["// Contexts\nexport {\n StateProvider,\n useStateStore,\n useStateValue,\n useStateBinding,\n type StateContextValue,\n type StateProviderProps,\n} from \"./contexts/state\";\n\nexport {\n VisibilityProvider,\n useVisibility,\n useIsVisible,\n type VisibilityContextValue,\n type VisibilityProviderProps,\n} from \"./contexts/visibility\";\n\nexport {\n ActionProvider,\n useActions,\n useAction,\n ConfirmDialog,\n type ActionContextValue,\n type ActionProviderProps,\n type PendingConfirmation,\n type ConfirmDialogProps,\n} from \"./contexts/actions\";\n\nexport {\n ValidationProvider,\n useValidation,\n 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","\"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","import { defineSchema } from \"@json-render/core\";\n\n/**\n * The schema for @json-render/react-native\n *\n * Defines:\n * - Spec: A flat tree of elements with keys, types, props, and children references\n * - Catalog: Components with props schemas, and optional actions\n */\nexport const schema = defineSchema(\n (s) => ({\n // What the AI-generated SPEC looks like\n spec: s.object({\n /** Root element key */\n root: s.string(),\n /** Flat map of elements by key */\n elements: s.record(\n s.object({\n /** Component type from catalog */\n type: s.ref(\"catalog.components\"),\n /** Component props */\n props: s.propsOf(\"catalog.components\"),\n /** Child element keys (flat reference) */\n children: s.array(s.string()),\n /** Visibility condition */\n visible: { ...s.any(), ...s.optional() },\n /** Repeat children from a state array */\n repeat: { ...s.any(), ...s.optional() },\n }),\n ),\n }),\n\n // What the CATALOG must provide\n catalog: s.object({\n /** Component definitions */\n components: s.map({\n /** Zod schema for component props */\n props: s.zod(),\n /** Slots for this component. Use ['default'] for children, or named slots like ['header', 'footer'] */\n slots: s.array(s.string()),\n /** Description for AI generation hints */\n description: s.string(),\n /** Example prop values used in prompt examples (auto-generated from Zod schema if omitted) */\n example: s.any(),\n }),\n /** Action definitions (optional) */\n actions: s.map({\n /** Zod schema for action params */\n params: s.zod(),\n /** Description for AI generation hints */\n description: s.string(),\n }),\n }),\n }),\n {\n defaultRules: [\n // Layout patterns\n \"FIXED BOTTOM BAR PATTERN: When building a screen with a fixed header and/or fixed bottom tab bar, the outermost vertical layout component must have flex:1 so it fills the screen. The scrollable content area must also have flex:1. Structure: screen wrapper > vertical layout(flex:1, gap:0) > [header, content wrapper(flex:1) > [scroll container(...)], bottom-tabs]. Both the outer layout AND the content wrapper need flex:1. ONLY use components from the AVAILABLE COMPONENTS list.\",\n \"NEVER place a bottom tab bar or fixed footer inside a scroll container. It must be a sibling AFTER the flex:1 container that holds the scroll content.\",\n\n // Element integrity\n \"CRITICAL INTEGRITY CHECK: Before outputting ANY element that references children, you MUST have already output (or will output) each child as its own element. If an element has children: ['a', 'b'], then elements 'a' and 'b' MUST exist. A missing child element causes that entire branch of the UI to be invisible.\",\n \"SELF-CHECK: After generating all elements, mentally walk the tree from root. Every key in every children array must resolve to a defined element. If you find a gap, output the missing element immediately.\",\n 'REQUIRED FIELDS: Every element MUST include a \"children\" array. Leaf elements (text, badges, inputs, images) use an empty array: \"children\": []. Omitting \"children\" fails validation.',\n 'When building repeating content backed by a state array (e.g. todos, posts, cart items), use the \"repeat\" field on a container element from the AVAILABLE COMPONENTS list. Example: { \"type\": \"<ContainerComponent>\", \"props\": { \"gap\": 8 }, \"repeat\": { \"statePath\": \"/todos\", \"key\": \"id\" }, \"children\": [\"todo-item\"] }. For a nested list stored on the enclosing item, use \"repeat\": { \"statePath\": { \"$item\": \"comments\" }, \"key\": \"id\" }. The $item statePath form is valid only inside another repeat. Inside repeated children, use { \"$item\": \"field\" } to read a field from the current item, and { \"$index\": true } for the current array index. For two-way binding to an item field use { \"$bindItem\": \"completed\" }. Do NOT hardcode individual elements for each array item.',\n\n // Visible field placement\n 'CRITICAL: The \"visible\" field goes on the ELEMENT object, NOT inside \"props\". Correct: {\"type\":\"<ComponentName>\",\"props\":{},\"visible\":{\"$state\":\"/activeTab\",\"eq\":\"home\"},\"children\":[...]}. WRONG: {\"type\":\"<ComponentName>\",\"props\":{},\"visible\":{...},\"children\":[...]} with visible inside props.',\n\n // Tab navigation pattern\n \"TAB NAVIGATION PATTERN: When building a UI with multiple tabs, use a pressable/tappable component + setState action + visible conditions to make tabs functional. ONLY use components from the AVAILABLE COMPONENTS list.\",\n 'Each tab button should be a pressable component wrapping its icon/label children, with action \"setState\" and actionParams { \"statePath\": \"/activeTab\", \"value\": \"tabName\" }.',\n 'Each tab\\'s content section should have a visible condition: { \"$state\": \"/activeTab\", \"eq\": \"tabName\" }.',\n \"The first tab's content should NOT have a visible condition (so it shows by default when no tab is selected yet). All other tabs MUST have a visible condition.\",\n\n // Tab active state highlighting (using dynamic props)\n \"TAB ACTIVE STYLING: Use $cond dynamic props on icon elements inside each tab button so a single icon changes appearance based on the active tab.\",\n ' - For the icon name: { \"$cond\": { \"$state\": \"/activeTab\", \"eq\": \"thisTabName\" }, \"$then\": \"home\", \"$else\": \"home-outline\" }',\n ' - For the icon color: { \"$cond\": { \"$state\": \"/activeTab\", \"eq\": \"thisTabName\" }, \"$then\": \"#007AFF\", \"$else\": \"#8E8E93\" }',\n \" - For labels, use $cond on the color prop similarly.\",\n ' - For the FIRST/DEFAULT tab, use { \"$cond\": [{ \"$state\": \"/activeTab\", \"eq\": \"thisTabName\" }], \"$then\": \"#007AFF\", \"$else\": \"#8E8E93\" } so it appears active before any tab is tapped. When no tab is selected yet, include a default tab with no visible condition.',\n\n // Push/pop screen navigation (all screens in one spec)\n 'SCREEN NAVIGATION: Use a pressable component with action \"push\" and actionParams { \"screen\": \"screenName\" } to navigate to a new screen. Use action \"pop\" to go back. All screens must be defined in the SAME spec. ONLY use components from the AVAILABLE COMPONENTS list.',\n 'Each screen section uses a visible condition on /currentScreen: { \"$state\": \"/currentScreen\", \"eq\": \"screenName\" }. The default/home screen should show by default (no visible condition) and all other screens should have the appropriate visible condition.',\n \"push automatically maintains a /navStack in the state model so pop always returns to the previous screen.\",\n 'Include a back button on pushed screens using action \"pop\". Example: pressable(action:\"pop\") > row layout > back icon + back label. ONLY use components from the AVAILABLE COMPONENTS list.',\n \"Use push/pop for drill-down flows: tapping a list item to see details, opening a profile, etc. Use setState + visible conditions for tab switching within a screen.\",\n 'Example: A list screen with items that push to detail: a pressable component with action:\"push\" and actionParams:{screen:\"detail\"} wrapping each list item. The detail screen section has visible:{\"$state\":\"/currentScreen\",\"eq\":\"detail\"} and contains a back button with action:\"pop\". ONLY use components from the AVAILABLE COMPONENTS list.',\n ],\n },\n);\n\n/**\n * Type for the React Native schema\n */\nexport type ReactNativeSchema = typeof schema;\n\n/**\n * Infer the spec type from a catalog\n */\nexport type ReactNativeSpec<TCatalog> = typeof schema extends {\n createCatalog: (catalog: TCatalog) => { _specType: infer S };\n}\n ? S\n : never;\n\n// Backward compatibility aliases\n/** @deprecated Use `schema` instead */\nexport const elementTreeSchema = schema;\n/** @deprecated Use `ReactNativeSchema` instead */\nexport type ElementTreeSchema = ReactNativeSchema;\n/** @deprecated Use `ReactNativeSpec` instead */\nexport type ElementTreeSpec<T> = ReactNativeSpec<T>;\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","import { z } from \"zod\";\n\n// =============================================================================\n// Standard Component Definitions for React Native\n// =============================================================================\n\n/**\n * Standard component definitions for React Native catalogs.\n *\n * These can be used directly or extended with custom components.\n * All components are built using React Native core primitives only.\n */\nexport const standardComponentDefinitions = {\n // ==========================================================================\n // Layout Components\n // ==========================================================================\n\n Container: {\n props: z.object({\n padding: z.number().nullable(),\n paddingHorizontal: z.number().nullable(),\n paddingVertical: z.number().nullable(),\n margin: z.number().nullable(),\n backgroundColor: z.string().nullable(),\n borderRadius: z.number().nullable(),\n flex: z.number().nullable(),\n }),\n slots: [\"default\"],\n description:\n \"Generic container wrapper. Use for grouping elements with padding, margin, and background color.\",\n example: { padding: 16, backgroundColor: \"#FFFFFF\" },\n },\n\n Row: {\n props: z.object({\n gap: z.number().nullable(),\n alignItems: z\n .enum([\"flex-start\", \"center\", \"flex-end\", \"stretch\", \"baseline\"])\n .nullable(),\n justifyContent: z\n .enum([\n \"flex-start\",\n \"center\",\n \"flex-end\",\n \"space-between\",\n \"space-around\",\n \"space-evenly\",\n ])\n .nullable(),\n flexWrap: z.enum([\"wrap\", \"nowrap\"]).nullable(),\n padding: z.number().nullable(),\n flex: z.number().nullable(),\n }),\n slots: [\"default\"],\n description:\n \"Horizontal flex layout. Use for placing elements side by side.\",\n example: { gap: 12, alignItems: \"center\" },\n },\n\n Column: {\n props: z.object({\n gap: z.number().nullable(),\n alignItems: z\n .enum([\"flex-start\", \"center\", \"flex-end\", \"stretch\", \"baseline\"])\n .nullable(),\n justifyContent: z\n .enum([\n \"flex-start\",\n \"center\",\n \"flex-end\",\n \"space-between\",\n \"space-around\",\n \"space-evenly\",\n ])\n .nullable(),\n padding: z.number().nullable(),\n flex: z.number().nullable(),\n }),\n slots: [\"default\"],\n description:\n \"Vertical flex layout. Use for stacking elements top to bottom.\",\n example: { gap: 12, padding: 16 },\n },\n\n ScrollContainer: {\n props: z.object({\n horizontal: z.boolean().nullable(),\n showsScrollIndicator: z.boolean().nullable(),\n padding: z.number().nullable(),\n backgroundColor: z.string().nullable(),\n }),\n slots: [\"default\"],\n description:\n \"Scrollable container. Use for content that may overflow the screen.\",\n },\n\n SafeArea: {\n props: z.object({\n backgroundColor: z.string().nullable(),\n }),\n slots: [\"default\"],\n description:\n \"Safe area container that respects device notches and system bars. Use as the outermost wrapper for screens.\",\n },\n\n Spacer: {\n props: z.object({\n size: z.number().nullable(),\n flex: z.number().nullable(),\n }),\n slots: [],\n description:\n \"Empty space between elements. Set size for fixed spacing or flex for flexible spacing.\",\n },\n\n Pressable: {\n props: z.object({}),\n events: [\"press\", \"longPress\"],\n slots: [\"default\"],\n description:\n \"Touchable wrapper that triggers events on press. Wrap any element to make it tappable. Bind on.press to setState to update state for visibility-driven UIs like tabs.\",\n },\n\n Divider: {\n props: z.object({\n direction: z.enum([\"horizontal\", \"vertical\"]).nullable(),\n color: z.string().nullable(),\n thickness: z.number().nullable(),\n margin: z.number().nullable(),\n }),\n slots: [],\n description: \"Thin line separator between content sections.\",\n },\n\n // ==========================================================================\n // Content Components\n // ==========================================================================\n\n Heading: {\n props: z.object({\n text: z.string(),\n level: z.enum([\"h1\", \"h2\", \"h3\", \"h4\"]).nullable(),\n color: z.string().nullable(),\n align: z.enum([\"left\", \"center\", \"right\"]).nullable(),\n }),\n slots: [],\n description:\n \"Heading text at various levels. h1 is largest, h4 is smallest.\",\n example: { text: \"Welcome\", level: \"h1\" },\n },\n\n Paragraph: {\n props: z.object({\n text: z.string(),\n color: z.string().nullable(),\n align: z.enum([\"left\", \"center\", \"right\"]).nullable(),\n numberOfLines: z.number().nullable(),\n fontSize: z.number().nullable(),\n }),\n slots: [],\n description:\n \"Body text paragraph. Use for descriptions and longer content.\",\n example: { text: \"This is a paragraph of body text.\" },\n },\n\n Label: {\n props: z.object({\n text: z.string(),\n color: z.string().nullable(),\n bold: z.boolean().nullable(),\n size: z.enum([\"xs\", \"sm\", \"md\"]).nullable(),\n }),\n slots: [],\n description:\n \"Small utility text. Use for captions, form labels, and secondary information.\",\n example: { text: \"Status\", size: \"sm\" },\n },\n\n Image: {\n props: z.object({\n src: z.string(),\n alt: z.string().nullable(),\n width: z.number().nullable(),\n height: z.number().nullable(),\n resizeMode: z.enum([\"cover\", \"contain\", \"stretch\", \"center\"]).nullable(),\n borderRadius: z.number().nullable(),\n }),\n slots: [],\n description: \"Image display. Provide a source URL and optional dimensions.\",\n example: {\n src: \"https://picsum.photos/300/200\",\n alt: \"Photo\",\n width: 300,\n height: 200,\n },\n },\n\n Avatar: {\n props: z.object({\n src: z.string().nullable(),\n initials: z.string().nullable(),\n size: z.enum([\"sm\", \"md\", \"lg\", \"xl\"]).nullable(),\n backgroundColor: z.string().nullable(),\n }),\n slots: [],\n description:\n \"Circular avatar showing an image or initials. Use for user profiles and contacts.\",\n example: { initials: \"JD\", size: \"md\" },\n },\n\n Badge: {\n props: z.object({\n label: z.string(),\n variant: z\n .enum([\"default\", \"info\", \"success\", \"warning\", \"error\"])\n .nullable(),\n }),\n slots: [],\n description:\n \"Small colored indicator with a label. Use for status, counts, and categories.\",\n example: { label: \"New\", variant: \"info\" },\n },\n\n Chip: {\n props: z.object({\n label: z.string(),\n selected: z.boolean().nullable(),\n backgroundColor: z.string().nullable(),\n }),\n events: [\"press\", \"remove\"],\n slots: [],\n description:\n \"Tag or filter chip. Bind on.remove for removable chips, on.press for selectable chips.\",\n },\n\n // ==========================================================================\n // Input Components\n // ==========================================================================\n\n Button: {\n props: z.object({\n label: z.string(),\n variant: z\n .enum([\"primary\", \"secondary\", \"danger\", \"outline\", \"ghost\"])\n .nullable(),\n size: z.enum([\"sm\", \"md\", \"lg\"]).nullable(),\n disabled: z.boolean().nullable(),\n loading: z.boolean().nullable(),\n }),\n events: [\"press\"],\n slots: [],\n description:\n \"Pressable button with label. Set variant for styling. Bind on.press for the handler to call on press.\",\n example: { label: \"Submit\", variant: \"primary\" },\n },\n\n TextInput: {\n props: z.object({\n placeholder: z.string().nullable(),\n value: z.string().nullable(),\n secureTextEntry: z.boolean().nullable(),\n keyboardType: z\n .enum([\"default\", \"email-address\", \"numeric\", \"phone-pad\", \"url\"])\n .nullable(),\n multiline: z.boolean().nullable(),\n numberOfLines: z.number().nullable(),\n label: z.string().nullable(),\n flex: z.number().nullable(),\n }),\n events: [\"submit\", \"focus\", \"blur\"],\n slots: [],\n description:\n \"Text input field. Use $bindState to bind to the state model for two-way binding. The value typed by the user is stored at the bound path.\",\n example: {\n placeholder: \"Enter text...\",\n label: \"Name\",\n },\n },\n\n Switch: {\n props: z.object({\n checked: z.boolean().nullable(),\n label: z.string().nullable(),\n disabled: z.boolean().nullable(),\n }),\n events: [\"change\"],\n slots: [],\n description: \"Toggle switch. Use $bindState to bind to the state model.\",\n },\n\n Checkbox: {\n props: z.object({\n checked: z.boolean().nullable(),\n label: z.string().nullable(),\n disabled: z.boolean().nullable(),\n }),\n events: [\"change\"],\n slots: [],\n description:\n \"Checkbox for boolean selections. Use $bindState to bind to the state model.\",\n },\n\n Slider: {\n props: z.object({\n min: z.number().nullable(),\n max: z.number().nullable(),\n step: z.number().nullable(),\n value: z.number().nullable(),\n label: z.string().nullable(),\n color: z.string().nullable(),\n }),\n slots: [],\n description:\n \"Range slider for numeric values. Use $bindState to bind to the state model.\",\n },\n\n SearchBar: {\n props: z.object({\n placeholder: z.string().nullable(),\n value: z.string().nullable(),\n }),\n events: [\"submit\"],\n slots: [],\n description:\n \"Search input with icon. Bind on.submit to trigger search on submit.\",\n },\n\n // ==========================================================================\n // Feedback Components\n // ==========================================================================\n\n Spinner: {\n props: z.object({\n size: z.enum([\"small\", \"large\"]).nullable(),\n color: z.string().nullable(),\n }),\n slots: [],\n description: \"Loading spinner indicator. Use while content is loading.\",\n },\n\n ProgressBar: {\n props: z.object({\n progress: z.number(),\n color: z.string().nullable(),\n trackColor: z.string().nullable(),\n height: z.number().nullable(),\n }),\n slots: [],\n description: \"Horizontal progress bar. Set progress from 0 to 1.\",\n },\n\n // ==========================================================================\n // Composite Components\n // ==========================================================================\n\n Card: {\n props: z.object({\n title: z.string().nullable(),\n subtitle: z.string().nullable(),\n padding: z.number().nullable(),\n backgroundColor: z.string().nullable(),\n borderRadius: z.number().nullable(),\n elevated: z.boolean().nullable(),\n }),\n slots: [\"default\"],\n description:\n \"Elevated card container with optional title. Use for grouping related content.\",\n example: { title: \"Details\", padding: 16, elevated: true },\n },\n\n ListItem: {\n props: z.object({\n title: z.string(),\n subtitle: z.string().nullable(),\n leading: z.string().nullable(),\n trailing: z.string().nullable(),\n showChevron: z.boolean().nullable(),\n }),\n events: [\"press\"],\n slots: [],\n description:\n \"List row with title, subtitle, and optional leading/trailing text. Bind on.press for the press handler.\",\n example: {\n title: \"Settings\",\n subtitle: \"Manage your preferences\",\n showChevron: true,\n },\n },\n\n Modal: {\n props: z.object({\n visible: z.boolean(),\n title: z.string().nullable(),\n animationType: z.enum([\"slide\", \"fade\", \"none\"]).nullable(),\n }),\n slots: [\"default\"],\n description:\n \"Modal overlay dialog. Use $bindState on visible to bind visibility to the state model.\",\n },\n};\n\n// =============================================================================\n// Standard Action Definitions for React Native\n// =============================================================================\n\n/**\n * Standard action definitions for React Native catalogs.\n *\n * These use React Native core APIs (Alert, Share, Linking) and\n * user-provided functions (navigate).\n */\nexport const standardActionDefinitions = {\n navigate: {\n params: z.object({\n screen: z.string(),\n params: z.record(z.string(), z.unknown()).nullable(),\n }),\n description:\n \"Navigate to a screen. Calls the user-provided navigation function.\",\n },\n\n goBack: {\n params: z.object({}),\n description: \"Navigate back to the previous screen.\",\n },\n\n showAlert: {\n params: z.object({\n title: z.string(),\n message: z.string().nullable(),\n buttons: z\n .array(\n z.object({\n text: z.string(),\n style: z.enum([\"default\", \"cancel\", \"destructive\"]).nullable(),\n action: z.string().nullable(),\n }),\n )\n .nullable(),\n }),\n description: \"Show a native alert dialog using Alert.alert().\",\n },\n\n share: {\n params: z.object({\n message: z.string(),\n url: z.string().nullable(),\n title: z.string().nullable(),\n }),\n description: \"Open the native share sheet using Share.share().\",\n },\n\n openURL: {\n params: z.object({\n url: z.string(),\n }),\n description: \"Open a URL in the default browser using Linking.openURL().\",\n },\n\n setState: {\n params: z.object({\n statePath: z.string(),\n value: z.unknown(),\n }),\n description: \"Update a value in the state model at the given statePath.\",\n },\n\n pushState: {\n params: z.object({\n statePath: z.string(),\n value: z.unknown(),\n clearStatePath: z.string().optional(),\n }),\n description:\n 'Append an item to an array in the state model. The value can contain { $state: \"/statePath\" } references to read from current state, and \"$id\" to auto-generate a unique ID. Use clearStatePath to reset another path after pushing (e.g. clear an input field). Example: { statePath: \"/todos\", value: { id: \"$id\", title: { $state: \"/newTodoText\" }, completed: false }, clearStatePath: \"/newTodoText\" }.',\n },\n\n removeState: {\n params: z.object({\n statePath: z.string(),\n index: z.number(),\n }),\n description:\n \"Remove an item from an array in the state model at the given index.\",\n },\n\n refresh: {\n params: z.object({\n target: z.string().nullable(),\n }),\n description:\n \"Trigger a data refresh. Optionally specify a target to refresh.\",\n },\n};\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Type for a component definition\n */\nexport type ComponentDefinition = {\n props: z.ZodType;\n slots: string[];\n events?: string[];\n description: string;\n};\n\n/**\n * Type for an action definition\n */\nexport type ActionDefinition = {\n params: z.ZodType;\n description: string;\n};\n"],"mappings":"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","names":["value","import_react","import_core","import_jsx_runtime","import_react","import_core","import_jsx_runtime","value","binding","executeAction","import_react","import_core","import_jsx_runtime","value","React","import_react","import_jsx_runtime","import_core","import_core","import_react","import_core","import_react_native","import_react","import_core","error","import_jsx_runtime","RNImage","RNTextInput","RNSwitch","RNModal","import_jsx_runtime","React","ElementRenderer","executeAction"]}
|