@pushframe/sdk 0.1.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/dist/index.d.mts +458 -0
- package/dist/index.d.ts +458 -0
- package/dist/index.js +788 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +758 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/context/PushFrameContext.ts","../src/primitives/Text.tsx","../src/primitives/View.tsx","../src/primitives/ScrollView.tsx","../src/primitives/Image.tsx","../src/primitives/Pressable.tsx","../src/primitives/TextInput.tsx","../src/primitives/FlatList.tsx","../src/primitives/Modal.tsx","../src/primitives/ActivityIndicator.tsx","../src/primitives/Switch.tsx","../src/primitives/KeyboardAvoidingView.tsx","../src/primitives/SafeAreaView.tsx","../src/primitives/StatusBar.tsx","../src/registry/ComponentRegistry.ts","../src/overlays/ToastHost.tsx","../src/overlays/BottomSheetHost.tsx","../src/renderer/bindingResolver.ts","../src/renderer/conditionalEvaluator.ts","../src/renderer/RecursiveRenderer.tsx","../src/components/PushFrameProvider.tsx","../src/components/PushFrameComponent.tsx","../src/components/PushFrameScreen.tsx","../src/index.ts"],"names":["createContext","useContext","RNText","jsx","RNView","forwardRef","ScrollView","RNScrollView","RNImage","RNPressable","RNTextInput","RNFlatList","RNModal","RNActivityIndicator","RNSwitch","RNKeyboardAvoidingView","RNStatusBar","ToastHost","useState","useRef","Animated","useCallback","useEffect","useImperativeHandle","View","Text","StyleSheet","Dimensions","BottomSheetHost","jsxs","Modal","Pressable","styles","React","useMemo","Fragment"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useContext } from 'react';\nimport type React from 'react';\nimport type { ComponentRegistry } from '../registry/ComponentRegistry';\n\n// ---------------------------------------------------------------------------\n// Schema types\n// ---------------------------------------------------------------------------\n\nexport interface SchemaNode {\n type: string;\n props?: Record<string, unknown>;\n children?: SchemaNode[];\n actions?: Action[];\n if?: string;\n}\n\nexport interface FlatListSchemaNode extends SchemaNode {\n type: 'flatlist';\n renderItem: SchemaNode;\n}\n\nexport interface Action {\n trigger: string;\n action: string;\n payload?: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// Overlay payload types\n// ---------------------------------------------------------------------------\n\nexport interface ToastPayload {\n message: string;\n duration?: number;\n type?: 'success' | 'error' | 'info' | 'warning';\n}\n\nexport interface BottomSheetPayload {\n schema: SchemaNode;\n context?: Record<string, unknown>;\n}\n\nexport interface ScrollToPayload {\n x?: number;\n y?: number;\n animated?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Context value\n// ---------------------------------------------------------------------------\n\nexport interface PushFrameContextValue {\n apiKey: string;\n baseUrl: string;\n appVersion?: string;\n globalContext: Record<string, unknown>;\n registry: ComponentRegistry;\n loadingComponent?: React.ReactNode;\n fallbackComponent?: React.ReactNode;\n onAction?: (action: string, payload?: Record<string, unknown>) => void;\n onError?: (error: Error) => void;\n // Overlay imperatives\n showToast: (payload: ToastPayload) => void;\n showBottomSheet: (payload: BottomSheetPayload) => void;\n dismissBottomSheet: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Context and hook\n// ---------------------------------------------------------------------------\n\nexport const PushFrameContext = createContext<PushFrameContextValue | null>(null);\n\nexport function usePushFrameContext(): PushFrameContextValue {\n const ctx = useContext(PushFrameContext);\n if (!ctx) {\n throw new Error('[PushFrame] usePushFrameContext must be called inside <PushFrame.Provider>');\n }\n return ctx;\n}\n","import React from 'react';\nimport { Text as RNText } from 'react-native';\nimport type { TextProps as RNTextProps } from 'react-native';\nimport type { Action } from '../context/PushFrameContext';\n\nexport interface PushFrameTextProps extends RNTextProps {\n /** Pushframe: hidden by RecursiveRenderer before component renders. */\n if?: string;\n /** Pushframe: converted to handlers by RecursiveRenderer before component renders. */\n actions?: Action[];\n /**\n * Text content via binding. If provided, takes precedence over children.\n * Pushframe-specific — resolved to a string by the time the component renders.\n */\n value?: string;\n}\n\n/**\n * Thin wrapper over React Native Text.\n * Strips `if`, `actions` before forwarding to RN.\n * `value` takes precedence over `children` when both are present.\n */\nexport function Text({ if: _if, actions: _actions, value, children, ...rest }: PushFrameTextProps) {\n return <RNText {...rest}>{value !== undefined ? value : children}</RNText>;\n}\n","import React from 'react';\nimport { View as RNView } from 'react-native';\nimport type { ViewProps as RNViewProps } from 'react-native';\nimport type { Action } from '../context/PushFrameContext';\n\nexport interface PushFrameViewProps extends RNViewProps {\n if?: string;\n actions?: Action[];\n}\n\n/**\n * Thin wrapper over React Native View.\n * Strips `if`, `actions` before forwarding to RN.\n */\nexport function View({ if: _if, actions: _actions, ...rest }: PushFrameViewProps) {\n return <RNView {...rest} />;\n}\n","import React, { forwardRef } from 'react';\nimport { ScrollView as RNScrollView } from 'react-native';\nimport type { ScrollViewProps as RNScrollViewProps } from 'react-native';\nimport type { Action } from '../context/PushFrameContext';\n\nexport interface PushFrameScrollViewProps extends RNScrollViewProps {\n if?: string;\n actions?: Action[];\n}\n\n/**\n * Thin wrapper over React Native ScrollView.\n * Forwards ref to support programmatic scrolling (e.g. scroll-to action).\n * Strips `if`, `actions` before forwarding to RN.\n */\nexport const ScrollView = forwardRef<RNScrollView, PushFrameScrollViewProps>(function ScrollView(\n { if: _if, actions: _actions, ...rest },\n ref,\n) {\n return <RNScrollView ref={ref} {...rest} />;\n});\n","import React from 'react';\nimport { Image as RNImage } from 'react-native';\nimport type { ImageProps as RNImageProps } from 'react-native';\nimport type { Action } from '../context/PushFrameContext';\n\nexport interface PushFrameImageProps extends Omit<RNImageProps, 'source'> {\n if?: string;\n actions?: Action[];\n /**\n * URI string for the image source. Maps to RN `source={{ uri: src }}`.\n * Takes precedence over the base `source` prop.\n */\n src?: string;\n /** Pass-through for cases where a static require() source is needed. */\n source?: RNImageProps['source'];\n}\n\n/**\n * Thin wrapper over React Native Image.\n * `src` maps to `source={{ uri: src }}`.\n * Strips `if`, `actions`, `src` before forwarding to RN.\n */\nexport function Image({ if: _if, actions: _actions, src, source, ...rest }: PushFrameImageProps) {\n const resolvedSource = src ? { uri: src } : source ?? { uri: '' };\n return <RNImage source={resolvedSource} {...rest} />;\n}\n","import React from 'react';\nimport { Pressable as RNPressable } from 'react-native';\nimport type { PressableProps as RNPressableProps } from 'react-native';\nimport type { Action } from '../context/PushFrameContext';\n\nexport interface PushFramePressableProps extends RNPressableProps {\n if?: string;\n actions?: Action[];\n}\n\n/**\n * Thin wrapper over React Native Pressable.\n * Actions with trigger \"onPress\" and \"onLongPress\" are wired by RecursiveRenderer\n * and forwarded through as standard RN props.\n * Strips `if`, `actions` before forwarding to RN.\n */\nexport function Pressable({ if: _if, actions: _actions, ...rest }: PushFramePressableProps) {\n return <RNPressable {...rest} />;\n}\n","import React from 'react';\nimport { TextInput as RNTextInput } from 'react-native';\nimport type { TextInputProps as RNTextInputProps } from 'react-native';\nimport type { Action } from '../context/PushFrameContext';\n\nexport interface PushFrameTextInputProps extends Omit<RNTextInputProps, 'onChange'> {\n if?: string;\n actions?: Action[];\n /**\n * Schema trigger \"onChange\" — wired by RecursiveRenderer.\n * Mapped to RN `onChangeText` by this component.\n */\n onChange?: (text: string) => void;\n /**\n * Schema trigger \"onSubmit\" — wired by RecursiveRenderer.\n * Mapped to RN `onSubmitEditing` by this component.\n */\n onSubmit?: () => void;\n}\n\n/**\n * Thin wrapper over React Native TextInput.\n * Maps Pushframe schema triggers to RN event props:\n * onChange → onChangeText\n * onSubmit → onSubmitEditing\n * Strips `if`, `actions`, `onChange`, `onSubmit` before forwarding to RN.\n */\nexport function TextInput({\n if: _if,\n actions: _actions,\n onChange,\n onSubmit,\n ...rest\n}: PushFrameTextInputProps) {\n return (\n <RNTextInput\n onChangeText={onChange}\n onSubmitEditing={onSubmit ? () => onSubmit() : undefined}\n {...rest}\n />\n );\n}\n","import React from 'react';\nimport { FlatList as RNFlatList } from 'react-native';\nimport type { FlatListProps as RNFlatListProps } from 'react-native';\nimport type { Action } from '../context/PushFrameContext';\n\nexport interface PushFrameFlatListProps<T = unknown>\n extends Omit<RNFlatListProps<T>, 'data' | 'horizontal'> {\n if?: string;\n actions?: Action[];\n /**\n * Resolved array of items. Populated by RecursiveRenderer from the\n * `items` binding expression on the schema node.\n */\n items?: T[];\n /**\n * \"vertical\" (default) or \"horizontal\". Maps to RN `horizontal` boolean.\n */\n direction?: 'vertical' | 'horizontal';\n /**\n * Number of columns for grid layouts. Forwarded directly to RN FlatList.\n */\n numColumns?: number;\n}\n\n/**\n * Thin wrapper over React Native FlatList.\n * RecursiveRenderer handles this type specially — it resolves `items` from\n * a binding expression and constructs the `renderItem` per-item context.\n *\n * This component maps Pushframe props to RN FlatList props and strips\n * Pushframe-specific props before forwarding.\n */\nexport function FlatList<T = unknown>({\n if: _if,\n actions: _actions,\n items,\n direction,\n numColumns,\n ...rest\n}: PushFrameFlatListProps<T>) {\n return (\n <RNFlatList<T>\n data={items}\n horizontal={direction === 'horizontal'}\n numColumns={numColumns}\n {...rest}\n />\n );\n}\n","import React from 'react';\nimport { Modal as RNModal } from 'react-native';\nimport type { ModalProps as RNModalProps } from 'react-native';\nimport type { Action } from '../context/PushFrameContext';\n\nexport interface PushFrameModalProps extends RNModalProps {\n if?: string;\n actions?: Action[];\n}\n\n/**\n * Thin wrapper over React Native Modal.\n * Strips `if`, `actions` before forwarding to RN.\n */\nexport function Modal({ if: _if, actions: _actions, ...rest }: PushFrameModalProps) {\n return <RNModal {...rest} />;\n}\n","import React from 'react';\nimport { ActivityIndicator as RNActivityIndicator } from 'react-native';\nimport type { ActivityIndicatorProps as RNActivityIndicatorProps } from 'react-native';\nimport type { Action } from '../context/PushFrameContext';\n\nexport interface PushFrameActivityIndicatorProps extends RNActivityIndicatorProps {\n if?: string;\n actions?: Action[];\n}\n\n/**\n * Thin wrapper over React Native ActivityIndicator.\n * Strips `if`, `actions` before forwarding to RN.\n */\nexport function ActivityIndicator({\n if: _if,\n actions: _actions,\n ...rest\n}: PushFrameActivityIndicatorProps) {\n return <RNActivityIndicator {...rest} />;\n}\n","import React from 'react';\nimport { Switch as RNSwitch } from 'react-native';\nimport type { SwitchProps as RNSwitchProps } from 'react-native';\nimport type { Action } from '../context/PushFrameContext';\n\nexport interface PushFrameSwitchProps extends Omit<RNSwitchProps, 'onValueChange' | 'onChange'> {\n if?: string;\n actions?: Action[];\n /**\n * Schema trigger \"onChange\" — wired by RecursiveRenderer.\n * Mapped to RN `onValueChange` by this component.\n */\n onChange?: (value: boolean) => void;\n}\n\n/**\n * Thin wrapper over React Native Switch.\n * Maps Pushframe schema trigger to RN event prop:\n * onChange → onValueChange\n * Strips `if`, `actions`, `onChange` before forwarding to RN.\n */\nexport function Switch({ if: _if, actions: _actions, onChange, ...rest }: PushFrameSwitchProps) {\n return <RNSwitch onValueChange={onChange} {...rest} />;\n}\n","import React from 'react';\nimport { KeyboardAvoidingView as RNKeyboardAvoidingView } from 'react-native';\nimport type { KeyboardAvoidingViewProps as RNKeyboardAvoidingViewProps } from 'react-native';\nimport type { Action } from '../context/PushFrameContext';\n\nexport interface PushFrameKeyboardAvoidingViewProps extends RNKeyboardAvoidingViewProps {\n if?: string;\n actions?: Action[];\n}\n\n/**\n * Thin wrapper over React Native KeyboardAvoidingView.\n * Strips `if`, `actions` before forwarding to RN.\n */\nexport function KeyboardAvoidingView({\n if: _if,\n actions: _actions,\n ...rest\n}: PushFrameKeyboardAvoidingViewProps) {\n return <RNKeyboardAvoidingView {...rest} />;\n}\n","import React from 'react';\nimport type { ViewProps } from 'react-native';\nimport type { Action } from '../context/PushFrameContext';\n\nexport interface PushFrameSafeAreaViewProps extends ViewProps {\n if?: string;\n actions?: Action[];\n}\n\n// Prefer react-native-safe-area-context (standard Expo dependency) when available;\n// fall back to RN core SafeAreaView otherwise.\nlet NativeSafeAreaView: React.ComponentType<ViewProps>;\n\ntry {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n NativeSafeAreaView = (require('react-native-safe-area-context') as { SafeAreaView: React.ComponentType<ViewProps> }).SafeAreaView;\n} catch {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n NativeSafeAreaView = (require('react-native') as { SafeAreaView: React.ComponentType<ViewProps> }).SafeAreaView;\n}\n\n/**\n * Thin wrapper over SafeAreaView.\n * Uses react-native-safe-area-context when available, RN core otherwise.\n * Strips `if`, `actions` before forwarding to the underlying component.\n */\nexport function SafeAreaView({ if: _if, actions: _actions, ...rest }: PushFrameSafeAreaViewProps) {\n return <NativeSafeAreaView {...rest} />;\n}\n","import React from 'react';\nimport { StatusBar as RNStatusBar } from 'react-native';\nimport type { StatusBarProps as RNStatusBarProps } from 'react-native';\nimport type { Action } from '../context/PushFrameContext';\n\nexport interface PushFrameStatusBarProps extends RNStatusBarProps {\n if?: string;\n actions?: Action[];\n}\n\n/**\n * Thin wrapper over React Native StatusBar.\n * Strips `if`, `actions` before forwarding to RN.\n */\nexport function StatusBar({ if: _if, actions: _actions, ...rest }: PushFrameStatusBarProps) {\n return <RNStatusBar {...rest} />;\n}\n","import type React from 'react';\nimport { Text } from '../primitives/Text';\nimport { View } from '../primitives/View';\nimport { ScrollView } from '../primitives/ScrollView';\nimport { Image } from '../primitives/Image';\nimport { Pressable } from '../primitives/Pressable';\nimport { TextInput } from '../primitives/TextInput';\nimport { FlatList } from '../primitives/FlatList';\nimport { Modal } from '../primitives/Modal';\nimport { ActivityIndicator } from '../primitives/ActivityIndicator';\nimport { Switch } from '../primitives/Switch';\nimport { KeyboardAvoidingView } from '../primitives/KeyboardAvoidingView';\nimport { SafeAreaView } from '../primitives/SafeAreaView';\nimport { StatusBar } from '../primitives/StatusBar';\n\n// ---------------------------------------------------------------------------\n// Built-in type → component mappings (cannot be overridden)\n// ---------------------------------------------------------------------------\n\nconst BUILT_IN_TYPES: ReadonlySet<string> = new Set([\n 'text',\n 'view',\n 'scrollview',\n 'image',\n 'pressable',\n 'textinput',\n 'flatlist',\n 'modal',\n 'activityindicator',\n 'switch',\n 'keyboardavoidingview',\n 'safeareaview',\n 'statusbar',\n]);\n\nconst BUILT_IN_COMPONENTS: ReadonlyMap<string, React.ComponentType<Record<string, unknown>>> =\n new Map([\n ['text', Text as React.ComponentType<Record<string, unknown>>],\n ['view', View as React.ComponentType<Record<string, unknown>>],\n ['scrollview', ScrollView as React.ComponentType<Record<string, unknown>>],\n ['image', Image as React.ComponentType<Record<string, unknown>>],\n ['pressable', Pressable as React.ComponentType<Record<string, unknown>>],\n ['textinput', TextInput as React.ComponentType<Record<string, unknown>>],\n ['flatlist', FlatList as unknown as React.ComponentType<Record<string, unknown>>],\n ['modal', Modal as React.ComponentType<Record<string, unknown>>],\n ['activityindicator', ActivityIndicator as React.ComponentType<Record<string, unknown>>],\n ['switch', Switch as React.ComponentType<Record<string, unknown>>],\n ['keyboardavoidingview', KeyboardAvoidingView as React.ComponentType<Record<string, unknown>>],\n ['safeareaview', SafeAreaView as React.ComponentType<Record<string, unknown>>],\n ['statusbar', StatusBar as React.ComponentType<Record<string, unknown>>],\n ]);\n\n// ---------------------------------------------------------------------------\n// ComponentRegistry\n// ---------------------------------------------------------------------------\n\n/**\n * Maps component type strings to React components.\n *\n * Built-ins are always present and cannot be overridden.\n * Developer-registered components are merged on top for non-conflicting types.\n */\nexport class ComponentRegistry {\n private readonly components: Map<string, React.ComponentType<Record<string, unknown>>>;\n\n constructor(developerComponents?: Record<string, React.ComponentType<unknown>>) {\n // Start with built-ins\n this.components = new Map(BUILT_IN_COMPONENTS);\n\n // Merge developer components, skipping any that conflict with built-ins\n if (developerComponents) {\n for (const [type, component] of Object.entries(developerComponents)) {\n if (BUILT_IN_TYPES.has(type)) {\n console.warn(\n `[PushFrame] ComponentRegistry: \"${type}\" is a built-in type and cannot be overridden. ` +\n `Registration skipped.`,\n );\n continue;\n }\n this.components.set(type, component as React.ComponentType<Record<string, unknown>>);\n }\n }\n }\n\n /**\n * Resolve a type string to its React component.\n * Returns null if no component is registered for the type.\n */\n resolve(type: string): React.ComponentType<Record<string, unknown>> | null {\n return this.components.get(type) ?? null;\n }\n\n /**\n * Returns all registered type strings (useful for debugging).\n */\n types(): string[] {\n return Array.from(this.components.keys());\n }\n}\n","import React, {\n forwardRef,\n useImperativeHandle,\n useState,\n useEffect,\n useRef,\n useCallback,\n} from 'react';\nimport { View, Text, StyleSheet, Animated } from 'react-native';\nimport type { ToastPayload } from '../context/PushFrameContext';\n\n// ---------------------------------------------------------------------------\n// Imperative handle\n// ---------------------------------------------------------------------------\n\nexport interface ToastHostHandle {\n show(payload: ToastPayload): void;\n}\n\n// ---------------------------------------------------------------------------\n// Internal state\n// ---------------------------------------------------------------------------\n\ninterface ToastState {\n id: number;\n message: string;\n duration: number;\n type: ToastPayload['type'];\n}\n\n// ---------------------------------------------------------------------------\n// Style helpers\n// ---------------------------------------------------------------------------\n\nconst TYPE_COLORS: Record<NonNullable<ToastPayload['type']>, string> = {\n success: '#22c55e',\n error: '#ef4444',\n info: '#3b82f6',\n warning: '#f59e0b',\n};\n\n// ---------------------------------------------------------------------------\n// ToastHost\n// ---------------------------------------------------------------------------\n\n/**\n * Rendered by PushFrameProvider at the root level.\n * Exposes an imperative `show()` handle for displaying toast messages.\n * Zero third-party dependencies — built with Animated API.\n */\nexport const ToastHost = forwardRef<ToastHostHandle>(function ToastHost(_props, ref) {\n const [toast, setToast] = useState<ToastState | null>(null);\n const opacity = useRef(new Animated.Value(0)).current;\n const idRef = useRef(0);\n\n const hide = useCallback(() => {\n Animated.timing(opacity, {\n toValue: 0,\n duration: 200,\n useNativeDriver: true,\n }).start(() => {\n setToast(null);\n });\n }, [opacity]);\n\n useEffect(() => {\n if (!toast) return;\n\n // Fade in\n Animated.timing(opacity, {\n toValue: 1,\n duration: 200,\n useNativeDriver: true,\n }).start();\n\n // Auto-dismiss after duration\n const timer = setTimeout(() => {\n hide();\n }, toast.duration);\n\n return () => {\n clearTimeout(timer);\n };\n }, [toast, opacity, hide]);\n\n useImperativeHandle(\n ref,\n () => ({\n show(payload: ToastPayload) {\n idRef.current += 1;\n setToast({\n id: idRef.current,\n message: payload.message,\n duration: payload.duration ?? 3000,\n type: payload.type ?? 'info',\n });\n // Reset opacity for new toast\n opacity.setValue(0);\n },\n }),\n [opacity],\n );\n\n if (!toast) return null;\n\n const backgroundColor = TYPE_COLORS[toast.type ?? 'info'] ?? TYPE_COLORS.info;\n\n return (\n <View style={styles.container} pointerEvents=\"none\">\n <Animated.View style={[styles.toast, { backgroundColor, opacity }]}>\n <Text style={styles.message}>{toast.message}</Text>\n </Animated.View>\n </View>\n );\n});\n\n// ---------------------------------------------------------------------------\n// Styles\n// ---------------------------------------------------------------------------\n\nconst styles = StyleSheet.create({\n container: {\n position: 'absolute',\n bottom: 60,\n left: 16,\n right: 16,\n alignItems: 'center',\n zIndex: 9999,\n },\n toast: {\n paddingVertical: 12,\n paddingHorizontal: 20,\n borderRadius: 8,\n maxWidth: 400,\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.2,\n shadowRadius: 4,\n elevation: 6,\n },\n message: {\n color: '#fff',\n fontSize: 14,\n fontWeight: '500',\n textAlign: 'center',\n },\n});\n","import React, {\n forwardRef,\n useImperativeHandle,\n useState,\n useRef,\n useCallback,\n useEffect,\n} from 'react';\nimport {\n View,\n Modal,\n Pressable,\n StyleSheet,\n Animated,\n Dimensions,\n} from 'react-native';\nimport type { BottomSheetPayload } from '../context/PushFrameContext';\nimport type { SchemaNode } from '../context/PushFrameContext';\n\n// ---------------------------------------------------------------------------\n// Imperative handle\n// ---------------------------------------------------------------------------\n\nexport interface BottomSheetHostHandle {\n show(payload: BottomSheetPayload): void;\n dismiss(): void;\n}\n\n// ---------------------------------------------------------------------------\n// Props from Provider (renderer callback)\n// ---------------------------------------------------------------------------\n\nexport interface BottomSheetHostProps {\n /**\n * Callback to render a SchemaNode inside the bottom sheet.\n * Provided by the Provider which has access to registry and context.\n */\n renderContent: (\n schema: SchemaNode,\n context?: Record<string, unknown>,\n ) => React.ReactElement | null;\n}\n\n// ---------------------------------------------------------------------------\n// BottomSheetHost\n// ---------------------------------------------------------------------------\n\nconst SCREEN_HEIGHT = Dimensions.get('window').height;\n\n/**\n * Rendered by PushFrameProvider at the root level.\n * Exposes imperative `show()` and `dismiss()` handles.\n * Zero third-party dependencies — built with Animated + Modal.\n */\nexport const BottomSheetHost = forwardRef<BottomSheetHostHandle, BottomSheetHostProps>(\n function BottomSheetHost({ renderContent }, ref) {\n const [visible, setVisible] = useState(false);\n const [payload, setPayload] = useState<BottomSheetPayload | null>(null);\n const translateY = useRef(new Animated.Value(SCREEN_HEIGHT)).current;\n\n const animateIn = useCallback(() => {\n Animated.spring(translateY, {\n toValue: 0,\n useNativeDriver: true,\n bounciness: 4,\n }).start();\n }, [translateY]);\n\n const animateOut = useCallback(\n (onDone?: () => void) => {\n Animated.timing(translateY, {\n toValue: SCREEN_HEIGHT,\n duration: 250,\n useNativeDriver: true,\n }).start(() => {\n onDone?.();\n });\n },\n [translateY],\n );\n\n useEffect(() => {\n if (visible) {\n translateY.setValue(SCREEN_HEIGHT);\n animateIn();\n }\n }, [visible, translateY, animateIn]);\n\n const dismiss = useCallback(() => {\n animateOut(() => {\n setVisible(false);\n setPayload(null);\n });\n }, [animateOut]);\n\n useImperativeHandle(\n ref,\n () => ({\n show(p: BottomSheetPayload) {\n setPayload(p);\n setVisible(true);\n },\n dismiss() {\n dismiss();\n },\n }),\n [dismiss],\n );\n\n if (!visible || !payload) return null;\n\n return (\n <Modal\n visible={visible}\n transparent\n animationType=\"none\"\n onRequestClose={dismiss}\n statusBarTranslucent\n >\n {/* Backdrop */}\n <Pressable style={styles.backdrop} onPress={dismiss} />\n\n {/* Sheet */}\n <Animated.View style={[styles.sheet, { transform: [{ translateY }] }]}>\n <View style={styles.handle} />\n <View style={styles.content}>\n {renderContent(payload.schema, payload.context)}\n </View>\n </Animated.View>\n </Modal>\n );\n },\n);\n\n// ---------------------------------------------------------------------------\n// Styles\n// ---------------------------------------------------------------------------\n\nconst styles = StyleSheet.create({\n backdrop: {\n ...StyleSheet.absoluteFillObject,\n backgroundColor: 'rgba(0,0,0,0.5)',\n },\n sheet: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n backgroundColor: '#fff',\n borderTopLeftRadius: 16,\n borderTopRightRadius: 16,\n paddingBottom: 34, // safe-area approximation\n minHeight: 200,\n maxHeight: '80%',\n shadowColor: '#000',\n shadowOffset: { width: 0, height: -4 },\n shadowOpacity: 0.15,\n shadowRadius: 12,\n elevation: 20,\n },\n handle: {\n alignSelf: 'center',\n width: 36,\n height: 4,\n borderRadius: 2,\n backgroundColor: '#d1d5db',\n marginTop: 12,\n marginBottom: 8,\n },\n content: {\n flex: 1,\n paddingHorizontal: 16,\n paddingTop: 8,\n },\n});\n","/**\n * Binding resolver for PushFrame {{expression}} syntax.\n *\n * Rules:\n * - A value that is entirely \"{{expr}}\" resolves to the bound value (any type)\n * - A value with inline bindings \"Hello {{user.name}}\" resolves to a string\n * - Unresolved paths return undefined — never throws\n * - Non-string values are returned as-is\n */\n\nconst FULL_BINDING_RE = /^\\{\\{(.+)\\}\\}$/;\nconst INLINE_BINDING_RE = /\\{\\{([^}]+)\\}\\}/g;\n\n/**\n * Evaluate a binding expression string against the provided context.\n * Uses Function constructor for safe, sandboxed expression evaluation.\n * Returns undefined on any error.\n */\nfunction evaluateExpression(expr: string, context: Record<string, unknown>): unknown {\n try {\n const keys = Object.keys(context);\n const values = keys.map((k) => context[k]);\n // eslint-disable-next-line no-new-func\n const fn = new Function(...keys, `\"use strict\"; try { return (${expr}); } catch(e) { return undefined; }`) as (\n ...args: unknown[]\n ) => unknown;\n return fn(...values);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Resolve a single prop value against context.\n *\n * - String values: check for full binding \"{{expr}}\" or inline bindings \"Hello {{name}}\"\n * - Non-string values: returned as-is\n */\nexport function resolveValue(value: unknown, context: Record<string, unknown>): unknown {\n if (typeof value !== 'string') {\n return value;\n }\n\n // Full binding: entire string is \"{{expr}}\" — return the actual resolved value\n const fullMatch = FULL_BINDING_RE.exec(value);\n if (fullMatch?.[1] !== undefined) {\n return evaluateExpression(fullMatch[1].trim(), context);\n }\n\n // Inline binding: replace each \"{{expr}}\" occurrence within the string\n if (INLINE_BINDING_RE.test(value)) {\n INLINE_BINDING_RE.lastIndex = 0;\n return value.replace(INLINE_BINDING_RE, (_, expr: string) => {\n const resolved = evaluateExpression(expr.trim(), context);\n return resolved !== undefined && resolved !== null ? String(resolved) : '';\n });\n }\n\n // No bindings — return as-is\n return value;\n}\n\n/**\n * Resolve all values in a props map against the context.\n * Recursively resolves nested objects and arrays.\n */\nexport function resolveProps(\n props: Record<string, unknown> | undefined,\n context: Record<string, unknown>,\n): Record<string, unknown> {\n if (!props) return {};\n const resolved: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(props)) {\n resolved[key] = resolveDeep(value, context);\n }\n return resolved;\n}\n\n/**\n * Recursively resolve binding expressions in a value (including nested objects/arrays).\n */\nexport function resolveDeep(value: unknown, context: Record<string, unknown>): unknown {\n if (Array.isArray(value)) {\n return value.map((item) => resolveDeep(item, context));\n }\n if (typeof value === 'object' && value !== null) {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n result[k] = resolveDeep(v, context);\n }\n return result;\n }\n return resolveValue(value, context);\n}\n","import { resolveValue } from './bindingResolver';\n\n/**\n * Evaluate the `if` expression of a SchemaNode against the current context.\n *\n * Returns true → node should render\n * Returns false → node (and its entire subtree) should be skipped\n *\n * Falsy values: false, null, undefined, 0, \"\" all hide the node.\n * When `ifExpr` is undefined the node always renders.\n */\nexport function evaluateIf(\n ifExpr: string | undefined,\n context: Record<string, unknown>,\n): boolean {\n if (ifExpr === undefined) return true;\n\n const resolved = resolveValue(ifExpr, context);\n\n // Standard falsy check — any falsy value hides the node\n return Boolean(resolved);\n}\n","import React from 'react';\nimport type { ReactElement } from 'react';\nimport type { SchemaNode, FlatListSchemaNode, Action } from '../context/PushFrameContext';\nimport type { ComponentRegistry } from '../registry/ComponentRegistry';\nimport { resolveProps, resolveDeep, resolveValue } from './bindingResolver';\nimport { evaluateIf } from './conditionalEvaluator';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface DispatchAction {\n (actionName: string, payload?: Record<string, unknown>): void;\n}\n\nexport interface RecursiveRendererProps {\n node: SchemaNode;\n /** Current merged data context for binding resolution. */\n context: Record<string, unknown>;\n registry: ComponentRegistry;\n /** Handles all actions — built-ins and host-app bubbling. Provided by the slot component. */\n dispatchAction: DispatchAction;\n /** Shown when a component type is not found in the registry. */\n fallbackComponent?: React.ReactNode;\n}\n\n// ---------------------------------------------------------------------------\n// Action wiring helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Group an actions array by trigger name and produce a prop map where each\n * trigger key maps to a callback that fires all actions for that trigger.\n */\nfunction buildActionProps(\n actions: Action[],\n context: Record<string, unknown>,\n dispatchAction: DispatchAction,\n): Record<string, (...args: unknown[]) => void> {\n // Group by trigger\n const grouped = new Map<string, Action[]>();\n for (const action of actions) {\n const existing = grouped.get(action.trigger);\n if (existing) {\n existing.push(action);\n } else {\n grouped.set(action.trigger, [action]);\n }\n }\n\n const result: Record<string, (...args: unknown[]) => void> = {};\n for (const [trigger, triggerActions] of grouped) {\n result[trigger] = (..._args: unknown[]) => {\n for (const action of triggerActions) {\n const resolvedPayload =\n action.payload !== undefined\n ? (resolveDeep(action.payload, context) as Record<string, unknown>)\n : undefined;\n dispatchAction(action.action, resolvedPayload);\n }\n };\n }\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// FlatList special handling\n// ---------------------------------------------------------------------------\n\nfunction renderFlatListNode(\n node: FlatListSchemaNode,\n context: Record<string, unknown>,\n registry: ComponentRegistry,\n dispatchAction: DispatchAction,\n fallbackComponent: React.ReactNode,\n): ReactElement | null {\n // Resolve the items array\n const resolvedProps = resolveProps(node.props, context);\n const items = Array.isArray(resolvedProps['items']) ? (resolvedProps['items'] as unknown[]) : [];\n\n // Build action props for the FlatList container itself\n const actionProps = node.actions ? buildActionProps(node.actions, context, dispatchAction) : {};\n\n // Extract FlatList-specific props (direction, numColumns) and drop items\n // since we pass the resolved array as `items` to the primitive.\n const { items: _items, keyExtractor: keyExtractorExpr, direction, numColumns, ...restProps } = resolvedProps;\n\n // Build a keyExtractor function if specified in schema\n let keyExtractorFn: ((item: unknown, index: number) => string) | undefined;\n if (typeof keyExtractorExpr === 'string') {\n const extractorExpr = keyExtractorExpr;\n keyExtractorFn = (item: unknown, index: number) => {\n const itemContext = { ...context, item, index };\n const resolved = resolveValue(extractorExpr, itemContext);\n return resolved !== undefined && resolved !== null ? String(resolved) : String(index);\n };\n }\n\n // renderItem: per-item context merges { item, index } into current context\n const renderItemFn = ({ item, index }: { item: unknown; index: number }): ReactElement | null => {\n const itemContext = { ...context, item, index };\n return (\n <RecursiveRenderer\n node={node.renderItem}\n context={itemContext}\n registry={registry}\n dispatchAction={dispatchAction}\n fallbackComponent={fallbackComponent}\n key={keyExtractorFn ? keyExtractorFn(item, index) : index}\n />\n );\n };\n\n const FlatListComponent = registry.resolve('flatlist');\n if (!FlatListComponent) {\n console.warn('[PushFrame] RecursiveRenderer: \"flatlist\" not found in registry.');\n return fallbackComponent ? (fallbackComponent as ReactElement) : null;\n }\n\n return React.createElement(FlatListComponent, {\n ...restProps,\n ...actionProps,\n items,\n direction,\n numColumns,\n keyExtractor: keyExtractorFn,\n renderItem: renderItemFn,\n });\n}\n\n// ---------------------------------------------------------------------------\n// RecursiveRenderer\n// ---------------------------------------------------------------------------\n\n/**\n * Stateless recursive renderer. Evaluates schema nodes and produces React elements.\n *\n * - Evaluates `if` expression; returns null when falsy\n * - Handles FlatList nodes with per-item context injection\n * - Resolves all prop bindings against current context\n * - Wires actions to component event handler props\n * - Looks up component in registry; renders fallback or null when not found\n * - Recurses into children\n */\nexport function RecursiveRenderer({\n node,\n context,\n registry,\n dispatchAction,\n fallbackComponent,\n}: RecursiveRendererProps): ReactElement | null {\n // 1. Evaluate conditional — skip entire subtree if falsy\n if (!evaluateIf(node.if, context)) {\n return null;\n }\n\n // 2. FlatList special case\n if (node.type === 'flatlist') {\n return renderFlatListNode(\n node as FlatListSchemaNode,\n context,\n registry,\n dispatchAction,\n fallbackComponent,\n );\n }\n\n // 3. Resolve props\n const resolvedProps = resolveProps(node.props, context);\n\n // 4. Wire actions → inject as trigger-named props\n const actionProps = node.actions ? buildActionProps(node.actions, context, dispatchAction) : {};\n\n // 5. Resolve component from registry\n const Component = registry.resolve(node.type);\n if (!Component) {\n console.warn(\n `[PushFrame] RecursiveRenderer: Unknown component type \"${node.type}\". ` +\n `Registered types: ${registry.types().join(', ')}`,\n );\n return fallbackComponent ? (fallbackComponent as ReactElement) : null;\n }\n\n // 6. Render children recursively\n const children =\n node.children && node.children.length > 0\n ? node.children.map((child, index) => (\n <RecursiveRenderer\n key={`${child.type}-${index}`}\n node={child}\n context={context}\n registry={registry}\n dispatchAction={dispatchAction}\n fallbackComponent={fallbackComponent}\n />\n ))\n : undefined;\n\n return React.createElement(Component, {\n ...resolvedProps,\n ...actionProps,\n children,\n });\n}\n","import React, { useCallback, useMemo, useRef } from 'react';\nimport type { ReactNode } from 'react';\nimport { PushFrameContext } from '../context/PushFrameContext';\nimport type {\n PushFrameContextValue,\n ToastPayload,\n BottomSheetPayload,\n SchemaNode,\n} from '../context/PushFrameContext';\nimport { ComponentRegistry } from '../registry/ComponentRegistry';\nimport { ToastHost } from '../overlays/ToastHost';\nimport type { ToastHostHandle } from '../overlays/ToastHost';\nimport { BottomSheetHost } from '../overlays/BottomSheetHost';\nimport type { BottomSheetHostHandle } from '../overlays/BottomSheetHost';\nimport { RecursiveRenderer } from '../renderer/RecursiveRenderer';\n\nconst DEFAULT_BASE_URL = 'https://api.pushframe.io';\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface PushFrameProviderProps {\n /** Pushframe API key — sent as Authorization header on all fetches. */\n apiKey: string;\n /**\n * Runtime data context. Screens/Components bind to this via {{expressions}}.\n * Merged at the Provider level; slot-level context wins on conflict.\n */\n context?: Record<string, unknown>;\n /**\n * Base URL of the Pushframe delivery service.\n * Defaults to the production endpoint: https://api.pushframe.io\n */\n baseUrl?: string;\n /**\n * Semver string appended to fetch paths for schema version targeting.\n * e.g. \"1.2.3\" → GET /screens/home/1.2.3\n * When not provided, \"null\" is sent as the appVersion in the URL.\n */\n appVersion?: string;\n /**\n * Developer-registered native components merged into the ComponentRegistry.\n * Built-in types cannot be overridden — conflicting keys are warned and skipped.\n */\n components?: Record<string, React.ComponentType<unknown>>;\n /** Default loading UI shown while schema is fetching or isLoading=true. */\n loadingComponent?: ReactNode;\n /** Default fallback UI shown on fetch error or unknown component type. */\n fallbackComponent?: ReactNode;\n /**\n * Global action handler. Receives actions that are not handled as built-ins\n * and were not stopped by a slot-level onAction.\n */\n onAction?: (action: string, payload?: Record<string, unknown>) => void;\n /** Called whenever a fetch or render error occurs. */\n onError?: (error: Error) => void;\n children: ReactNode;\n}\n\n// ---------------------------------------------------------------------------\n// PushFrameProvider\n// ---------------------------------------------------------------------------\n\n/**\n * Root provider for the PushFrame SDK.\n *\n * Wrap your app (or a subtree) in this provider. All PushFrame.Screen and\n * PushFrame.Component slots inside will fetch their schemas from the delivery\n * service and render them using the shared ComponentRegistry and context.\n *\n * Also renders the ToastHost and BottomSheetHost overlay hosts at root level\n * so any component in the tree can trigger them via built-in actions.\n */\nexport function PushFrameProvider({\n apiKey,\n context = {},\n baseUrl = DEFAULT_BASE_URL,\n appVersion,\n components,\n loadingComponent,\n fallbackComponent,\n onAction,\n onError,\n children,\n}: PushFrameProviderProps) {\n // Registry — created once (components prop should be stable)\n const registry = useMemo(\n () => new ComponentRegistry(components),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n\n // Overlay refs\n const toastRef = useRef<ToastHostHandle>(null);\n const bottomSheetRef = useRef<BottomSheetHostHandle>(null);\n\n const showToast = useCallback((payload: ToastPayload) => {\n toastRef.current?.show(payload);\n }, []);\n\n const showBottomSheet = useCallback((payload: BottomSheetPayload) => {\n bottomSheetRef.current?.show(payload);\n }, []);\n\n const dismissBottomSheet = useCallback(() => {\n bottomSheetRef.current?.dismiss();\n }, []);\n\n // renderContent for BottomSheetHost — renders a schema node with the Provider's registry\n const renderBottomSheetContent = useCallback(\n (schema: SchemaNode, sheetContext?: Record<string, unknown>) => {\n const mergedContext = sheetContext ? { ...context, ...sheetContext } : context;\n // No-op dispatchAction for bottom sheet content (actions bubble via onAction)\n const dispatchAction = (action: string, payload?: Record<string, unknown>) => {\n if (action === 'dismiss-bottom-sheet') {\n dismissBottomSheet();\n return;\n }\n if (action === 'show-toast') {\n showToast(payload as unknown as ToastPayload);\n return;\n }\n onAction?.(action, payload);\n };\n return (\n <RecursiveRenderer\n node={schema}\n context={mergedContext}\n registry={registry}\n dispatchAction={dispatchAction}\n fallbackComponent={fallbackComponent}\n />\n );\n },\n [context, registry, fallbackComponent, onAction, dismissBottomSheet, showToast],\n );\n\n const contextValue = useMemo<PushFrameContextValue>(\n () => ({\n apiKey,\n baseUrl,\n appVersion,\n globalContext: context,\n registry,\n loadingComponent,\n fallbackComponent,\n onAction,\n onError,\n showToast,\n showBottomSheet,\n dismissBottomSheet,\n }),\n [\n apiKey,\n baseUrl,\n appVersion,\n context,\n registry,\n loadingComponent,\n fallbackComponent,\n onAction,\n onError,\n showToast,\n showBottomSheet,\n dismissBottomSheet,\n ],\n );\n\n return (\n <PushFrameContext.Provider value={contextValue}>\n {children}\n <ToastHost ref={toastRef} />\n <BottomSheetHost ref={bottomSheetRef} renderContent={renderBottomSheetContent} />\n </PushFrameContext.Provider>\n );\n}\n","import React, { useCallback, useEffect, useState } from 'react';\nimport type { ReactNode, ReactElement } from 'react';\nimport { usePushFrameContext } from '../context/PushFrameContext';\nimport type { SchemaNode, ToastPayload, BottomSheetPayload } from '../context/PushFrameContext';\nimport { RecursiveRenderer } from '../renderer/RecursiveRenderer';\n\n// ---------------------------------------------------------------------------\n// Shared slot props (used by both Screen and Component)\n// ---------------------------------------------------------------------------\n\nexport interface PushFrameSlotProps {\n /** ID of the screen/component to fetch from the delivery service. */\n id: string;\n /**\n * Data context local to this slot. Merged with the Provider context;\n * local keys win on conflict.\n */\n context?: Record<string, unknown>;\n /**\n * External loading signal from the host app. When true, loading UI is shown\n * even if the schema has already been fetched.\n */\n isLoading?: boolean;\n /**\n * Loading UI shown while isLoading=true OR schema is being fetched.\n * Falls back to Provider-level loadingComponent.\n */\n loadingComponent?: ReactNode;\n /**\n * Fallback UI shown on fetch error or unresolvable component type.\n * Falls back to Provider-level fallbackComponent.\n */\n fallbackComponent?: ReactNode;\n /**\n * Slot-level action handler. Return true to stop the action from bubbling\n * to the Provider-level onAction.\n */\n onAction?: (action: string, payload?: Record<string, unknown>) => boolean | void;\n}\n\n// ---------------------------------------------------------------------------\n// Schema fetch\n// ---------------------------------------------------------------------------\n\nasync function fetchSchema(\n baseUrl: string,\n apiKey: string,\n path: string,\n): Promise<SchemaNode> {\n const url = new URL(path, baseUrl + '/').toString();\n const headers: Record<string, string> = {\n Accept: 'application/json',\n Authorization: `Bearer ${apiKey}`,\n 'x-project-key': apiKey,\n };\n\n const res = await fetch(url, { headers });\n if (!res.ok) {\n throw new Error(`[PushFrame] HTTP ${res.status} fetching \"${path}\"`);\n }\n\n const envelope = (await res.json()) as { schema?: SchemaNode } & SchemaNode;\n return envelope.schema ?? envelope;\n}\n\n// ---------------------------------------------------------------------------\n// PushFrameComponent\n// ---------------------------------------------------------------------------\n\ninterface PushFrameComponentInternalProps extends PushFrameSlotProps {\n /** Resource type — determines which delivery endpoint to hit. */\n resourceType: 'screens' | 'components';\n /** When true, wraps the rendered output with flex:1 (used by Screen). */\n fullscreen?: boolean;\n}\n\nfunction PushFrameComponentInternal({\n id,\n resourceType,\n context: slotContext,\n isLoading: externalLoading,\n loadingComponent: slotLoading,\n fallbackComponent: slotFallback,\n onAction: slotOnAction,\n fullscreen,\n}: PushFrameComponentInternalProps) {\n const {\n apiKey,\n baseUrl,\n appVersion,\n globalContext,\n registry,\n loadingComponent: providerLoading,\n fallbackComponent: providerFallback,\n onAction: providerOnAction,\n onError,\n showToast,\n showBottomSheet,\n dismissBottomSheet,\n } = usePushFrameContext();\n\n const [schema, setSchema] = useState<SchemaNode | null>(null);\n const [fetchError, setFetchError] = useState<Error | null>(null);\n const [isFetching, setIsFetching] = useState(true);\n\n // Build fetch path: {resourceType}/{id}/{appVersion} — \"null\" when not set\n const fetchPath = `${resourceType}/${encodeURIComponent(id)}/${encodeURIComponent(appVersion ?? 'null')}`;\n\n // Merged data context: provider → slot (local wins)\n const mergedContext = slotContext ? { ...globalContext, ...slotContext } : globalContext;\n\n // Resolved UI components with fallback precedence\n const loadingUI = slotLoading !== undefined ? slotLoading : providerLoading;\n const fallbackUI = slotFallback !== undefined ? slotFallback : providerFallback;\n\n // Fetch schema\n useEffect(() => {\n let cancelled = false;\n setSchema(null);\n setFetchError(null);\n setIsFetching(true);\n\n fetchSchema(baseUrl, apiKey, fetchPath)\n .then((s) => {\n if (!cancelled) {\n setSchema(s);\n setIsFetching(false);\n }\n })\n .catch((err: unknown) => {\n if (!cancelled) {\n const error = err instanceof Error ? err : new Error(String(err));\n setFetchError(error);\n setIsFetching(false);\n onError?.(error);\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [fetchPath, baseUrl, apiKey, onError]);\n\n // Dispatch action — handles built-ins, then bubbles via slot → provider\n const dispatchAction = useCallback(\n (action: string, payload?: Record<string, unknown>) => {\n // Built-in actions — never bubble to host app\n if (action === 'show-toast') {\n showToast(payload as unknown as ToastPayload);\n return;\n }\n if (action === 'show-bottom-sheet') {\n showBottomSheet(payload as unknown as BottomSheetPayload);\n return;\n }\n if (action === 'dismiss-bottom-sheet') {\n dismissBottomSheet();\n return;\n }\n if (action === 'scroll-to') {\n // scroll-to is handled by the ScrollView primitive via ref; no bubbling needed\n return;\n }\n\n // Bubble: slot onAction first; if it returns true, stop\n const stopped = slotOnAction?.(action, payload);\n if (stopped) return;\n\n // Provider onAction\n providerOnAction?.(action, payload);\n },\n [showToast, showBottomSheet, dismissBottomSheet, slotOnAction, providerOnAction],\n );\n\n // Loading state: external flag OR schema not yet fetched\n const isShowingLoader = externalLoading || isFetching;\n\n if (isShowingLoader) {\n return (loadingUI as ReactElement | null) ?? null;\n }\n\n if (fetchError || !schema) {\n return (fallbackUI as ReactElement | null) ?? null;\n }\n\n const rendered = (\n <RecursiveRenderer\n node={schema}\n context={mergedContext}\n registry={registry}\n dispatchAction={dispatchAction}\n fallbackComponent={fallbackUI}\n />\n );\n\n if (fullscreen) {\n // PushFrame.Screen wraps with flex:1\n return <>{rendered}</>;\n }\n\n return rendered;\n}\n\n// ---------------------------------------------------------------------------\n// Public PushFrameComponent\n// ---------------------------------------------------------------------------\n\n/**\n * Fetches a component schema from GET /components/:id[/:appVersion] on the\n * delivery service and renders it inline using RecursiveRenderer.\n *\n * Context is merged: Provider context → slot context (local wins).\n * Actions bubble: slot onAction → Provider onAction.\n * Built-in actions (show-toast, show-bottom-sheet, etc.) are handled internally.\n */\nexport function PushFrameComponent(props: PushFrameSlotProps) {\n return <PushFrameComponentInternal {...props} resourceType=\"components\" />;\n}\n\n// Re-export internal for Screen to use\nexport { PushFrameComponentInternal };\n","import React from 'react';\nimport { View, StyleSheet } from 'react-native';\nimport { PushFrameComponentInternal } from './PushFrameComponent';\nimport type { PushFrameSlotProps } from './PushFrameComponent';\n\n/**\n * Fetches a screen schema from GET /screens/:id[/:appVersion] on the delivery\n * service and renders it with flex:1 sizing (full-page layout).\n *\n * Identical to PushFrame.Component in behaviour, but:\n * - Fetches from /screens/:id instead of /components/:id\n * - Applies flex:1 to its container so it fills the available space\n *\n * Context is merged: Provider context → slot context (local wins).\n * Actions bubble: slot onAction → Provider onAction.\n * Built-in actions (show-toast, show-bottom-sheet, etc.) are handled internally.\n */\nexport function PushFrameScreen(props: PushFrameSlotProps) {\n return (\n <View style={styles.container}>\n <PushFrameComponentInternal {...props} resourceType=\"screens\" fullscreen />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n});\n","/**\n * @pushframe/sdk — Server-Driven UI for React Native\n *\n * Usage:\n * import { PushFrame } from '@pushframe/sdk';\n *\n * <PushFrame.Provider apiKey=\"...\" context={...}>\n * <PushFrame.Screen name=\"home\" />\n * <PushFrame.Component name=\"promo-banner\" />\n * </PushFrame.Provider>\n */\n\n// ---------------------------------------------------------------------------\n// Component imports (for namespace assembly)\n// ---------------------------------------------------------------------------\n\nimport { PushFrameProvider } from './components/PushFrameProvider';\nimport { PushFrameScreen } from './components/PushFrameScreen';\nimport { PushFrameComponent } from './components/PushFrameComponent';\nimport { Text } from './primitives/Text';\nimport { View } from './primitives/View';\nimport { ScrollView } from './primitives/ScrollView';\nimport { Image } from './primitives/Image';\nimport { Pressable } from './primitives/Pressable';\nimport { TextInput } from './primitives/TextInput';\nimport { FlatList } from './primitives/FlatList';\nimport { Modal } from './primitives/Modal';\nimport { ActivityIndicator } from './primitives/ActivityIndicator';\nimport { Switch } from './primitives/Switch';\nimport { KeyboardAvoidingView } from './primitives/KeyboardAvoidingView';\nimport { SafeAreaView } from './primitives/SafeAreaView';\nimport { StatusBar } from './primitives/StatusBar';\n\n// ---------------------------------------------------------------------------\n// PushFrame namespace — the primary API surface\n// ---------------------------------------------------------------------------\n\n/**\n * The PushFrame namespace. Import this as the single entry-point for the SDK.\n *\n * Slot components:\n * - PushFrame.Provider — wraps the app, initialises registry and context\n * - PushFrame.Screen — full-page slot (fetches /screens/:name, applies flex:1)\n * - PushFrame.Component — inline slot (fetches /components/:name)\n *\n * Primitives (used internally by RecursiveRenderer, available for direct use):\n * - PushFrame.Text, PushFrame.View, PushFrame.ScrollView, PushFrame.Image\n * - PushFrame.Pressable, PushFrame.TextInput, PushFrame.FlatList\n * - PushFrame.Modal, PushFrame.ActivityIndicator, PushFrame.Switch\n * - PushFrame.KeyboardAvoidingView, PushFrame.SafeAreaView, PushFrame.StatusBar\n */\nexport const PushFrame = {\n // Slot components\n Provider: PushFrameProvider,\n Screen: PushFrameScreen,\n Component: PushFrameComponent,\n\n // Primitives\n Text,\n View,\n ScrollView,\n Image,\n Pressable,\n TextInput,\n FlatList,\n Modal,\n ActivityIndicator,\n Switch,\n KeyboardAvoidingView,\n SafeAreaView,\n StatusBar,\n} as const;\n\n// ---------------------------------------------------------------------------\n// Named exports (for tree-shaking and selective imports)\n// ---------------------------------------------------------------------------\n\n// Slot components\nexport { PushFrameProvider } from './components/PushFrameProvider';\nexport type { PushFrameProviderProps } from './components/PushFrameProvider';\nexport { PushFrameScreen } from './components/PushFrameScreen';\nexport { PushFrameComponent } from './components/PushFrameComponent';\nexport type { PushFrameSlotProps } from './components/PushFrameComponent';\n\n// Context\nexport { PushFrameContext, usePushFrameContext } from './context/PushFrameContext';\nexport type {\n PushFrameContextValue,\n SchemaNode,\n FlatListSchemaNode,\n Action,\n ToastPayload,\n BottomSheetPayload,\n ScrollToPayload,\n} from './context/PushFrameContext';\n\n// Registry\nexport { ComponentRegistry } from './registry/ComponentRegistry';\n\n// Renderer\nexport { RecursiveRenderer } from './renderer/RecursiveRenderer';\nexport type { RecursiveRendererProps, DispatchAction } from './renderer/RecursiveRenderer';\n\n// Binding utilities\nexport { resolveValue, resolveProps, resolveDeep } from './renderer/bindingResolver';\nexport { evaluateIf } from './renderer/conditionalEvaluator';\n\n// Primitives\nexport * from './primitives/index';\n"]}
|