@almadar/ui 1.0.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/LICENSE +72 -0
- package/README.md +335 -0
- package/dist/ThemeContext-lI5bo85E.d.ts +103 -0
- package/dist/components/index.d.ts +4789 -0
- package/dist/components/index.js +21566 -0
- package/dist/components/index.js.map +1 -0
- package/dist/context/index.d.ts +208 -0
- package/dist/context/index.js +443 -0
- package/dist/context/index.js.map +1 -0
- package/dist/event-bus-types-8-cjyMxw.d.ts +65 -0
- package/dist/hooks/index.d.ts +1006 -0
- package/dist/hooks/index.js +2262 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/lib/index.d.ts +291 -0
- package/dist/lib/index.js +431 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/offline-executor-CHr4uAhf.d.ts +401 -0
- package/dist/providers/index.d.ts +386 -0
- package/dist/providers/index.js +1111 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/renderer/index.d.ts +382 -0
- package/dist/renderer/index.js +808 -0
- package/dist/renderer/index.js.map +1 -0
- package/dist/stores/index.d.ts +151 -0
- package/dist/stores/index.js +196 -0
- package/dist/stores/index.js.map +1 -0
- package/dist/useUISlots-mnggE9X9.d.ts +105 -0
- package/package.json +121 -0
- package/themes/almadar.css +196 -0
- package/themes/index.css +11 -0
- package/themes/minimalist.css +193 -0
- package/themes/wireframe.css +188 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../context/ThemeContext.tsx","../../hooks/useUISlots.ts","../../context/UISlotContext.tsx","../../hooks/useEventBus.ts","../../providers/EventBusProvider.tsx","../../providers/SelectionProvider.tsx","../../providers/FetchedDataProvider.tsx","../../providers/OrbitalProvider.tsx","../../renderer/client-effect-executor.ts","../../renderer/offline-executor.ts","../../providers/OfflineModeProvider.tsx"],"names":["useState","useEffect","useCallback","createContext","useMemo","jsx","useContext","useRef"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Unified ThemeContext - Single provider for theme and color mode\n *\n * Combines design theme selection (ocean, wireframe, etc.) with\n * color mode (light/dark) into a single, simple system.\n *\n * Uses a single data attribute: data-theme=\"ocean-light\" or data-theme=\"ocean-dark\"\n *\n * @packageDocumentation\n */\n\nimport React, {\n createContext,\n useContext,\n useState,\n useEffect,\n useCallback,\n useMemo,\n} from \"react\";\n\n/** Color mode preference */\nexport type ColorMode = \"light\" | \"dark\" | \"system\";\n\n/** Resolved color mode (what's actually applied) */\nexport type ResolvedMode = \"light\" | \"dark\";\n\n/** Theme definition */\nexport interface ThemeDefinition {\n /** Theme identifier (e.g., \"ocean\", \"wireframe\") */\n name: string;\n /** Display name for UI (e.g., \"Ocean Blue\") */\n displayName?: string;\n /** Whether this theme has light mode styles */\n hasLightMode?: boolean;\n /** Whether this theme has dark mode styles */\n hasDarkMode?: boolean;\n}\n\n/** Built-in themes available in the design system */\nexport const BUILT_IN_THEMES: ThemeDefinition[] = [\n {\n name: \"wireframe\",\n displayName: \"Wireframe\",\n hasLightMode: true,\n hasDarkMode: true,\n },\n {\n name: \"minimalist\",\n displayName: \"Minimalist\",\n hasLightMode: true,\n hasDarkMode: true,\n },\n {\n name: \"almadar\",\n displayName: \"Almadar\",\n hasLightMode: true,\n hasDarkMode: true,\n },\n];\n\n/** Theme context value */\ninterface ThemeContextValue {\n /** Current theme name */\n theme: string;\n /** Current color mode setting (may be 'system') */\n mode: ColorMode;\n /** Resolved color mode (always 'light' or 'dark') */\n resolvedMode: ResolvedMode;\n /** Set the theme */\n setTheme: (theme: string) => void;\n /** Set the color mode */\n setMode: (mode: ColorMode) => void;\n /** Toggle between light and dark modes */\n toggleMode: () => void;\n /** Available themes */\n availableThemes: ThemeDefinition[];\n /** The full theme string applied to data-theme (e.g., \"ocean-light\") */\n appliedTheme: string;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | undefined>(undefined);\n\n/** Storage keys */\nconst THEME_STORAGE_KEY = \"theme\";\nconst MODE_STORAGE_KEY = \"theme-mode\";\n\n/**\n * Get the system preferred color scheme\n */\nfunction getSystemMode(): ResolvedMode {\n if (typeof window === \"undefined\") return \"light\";\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n ? \"dark\"\n : \"light\";\n}\n\n/**\n * Resolve the color mode (handle 'system' preference)\n */\nfunction resolveMode(mode: ColorMode): ResolvedMode {\n if (mode === \"system\") {\n return getSystemMode();\n }\n return mode;\n}\n\nexport interface ThemeProviderProps {\n children: React.ReactNode;\n /** Available themes (will be merged with built-in themes) */\n themes?: readonly ThemeDefinition[] | ThemeDefinition[];\n /** Default theme name */\n defaultTheme?: string;\n /** Default color mode */\n defaultMode?: ColorMode;\n}\n\n/**\n * Unified ThemeProvider component\n *\n * @example\n * ```tsx\n * // Basic usage with built-in themes\n * <ThemeProvider defaultTheme=\"wireframe\" defaultMode=\"light\">\n * <App />\n * </ThemeProvider>\n *\n * // With custom themes from orbital schema\n * import { THEMES } from './generated/theme-manifest';\n * <ThemeProvider themes={THEMES} defaultTheme=\"ocean\" defaultMode=\"system\">\n * <App />\n * </ThemeProvider>\n * ```\n */\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({\n children,\n themes = [],\n defaultTheme = \"wireframe\",\n defaultMode = \"system\",\n}) => {\n // Merge built-in themes with custom themes\n const availableThemes = useMemo(() => {\n const themeMap = new Map<string, ThemeDefinition>();\n // Add built-in themes first\n BUILT_IN_THEMES.forEach((t) => themeMap.set(t.name, t));\n // Custom themes override built-in if same name\n themes.forEach((t) => themeMap.set(t.name, t));\n return Array.from(themeMap.values());\n }, [themes]);\n\n // Initialize theme from storage or default\n const [theme, setThemeState] = useState<string>(() => {\n if (typeof window === \"undefined\") return defaultTheme;\n const stored = localStorage.getItem(THEME_STORAGE_KEY);\n // Validate stored theme exists\n const validThemes = [\n ...BUILT_IN_THEMES.map((t) => t.name),\n ...themes.map((t) => t.name),\n ];\n if (stored && validThemes.includes(stored)) {\n return stored;\n }\n return defaultTheme;\n });\n\n // Initialize mode from storage or default\n const [mode, setModeState] = useState<ColorMode>(() => {\n if (typeof window === \"undefined\") return defaultMode;\n const stored = localStorage.getItem(MODE_STORAGE_KEY);\n if (stored === \"light\" || stored === \"dark\" || stored === \"system\") {\n return stored;\n }\n return defaultMode;\n });\n\n // Resolved mode (handles 'system' preference)\n const [resolvedMode, setResolvedMode] = useState<ResolvedMode>(() =>\n resolveMode(mode),\n );\n\n // The applied theme string (e.g., \"ocean-light\")\n const appliedTheme = useMemo(\n () => `${theme}-${resolvedMode}`,\n [theme, resolvedMode],\n );\n\n // Update resolved mode when mode changes or system preference changes\n useEffect(() => {\n const updateResolved = () => {\n setResolvedMode(resolveMode(mode));\n };\n\n updateResolved();\n\n // Listen for system theme changes\n if (mode === \"system\") {\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const handleChange = () => updateResolved();\n mediaQuery.addEventListener(\"change\", handleChange);\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\n }\n return undefined;\n }, [mode]);\n\n // Apply theme to document\n useEffect(() => {\n const root = document.documentElement;\n root.setAttribute(\"data-theme\", appliedTheme);\n\n // Also set class for Tailwind dark: variant compatibility\n root.classList.remove(\"light\", \"dark\");\n root.classList.add(resolvedMode);\n }, [appliedTheme, resolvedMode]);\n\n // Set theme\n const setTheme = useCallback(\n (newTheme: string) => {\n const validTheme = availableThemes.find((t) => t.name === newTheme);\n if (validTheme) {\n setThemeState(newTheme);\n if (typeof window !== \"undefined\") {\n localStorage.setItem(THEME_STORAGE_KEY, newTheme);\n }\n } else {\n console.warn(\n `Theme \"${newTheme}\" not found. Available: ${availableThemes.map((t) => t.name).join(\", \")}`,\n );\n }\n },\n [availableThemes],\n );\n\n // Set mode\n const setMode = useCallback((newMode: ColorMode) => {\n setModeState(newMode);\n if (typeof window !== \"undefined\") {\n localStorage.setItem(MODE_STORAGE_KEY, newMode);\n }\n }, []);\n\n // Toggle between light and dark\n const toggleMode = useCallback(() => {\n const newMode: ColorMode = resolvedMode === \"dark\" ? \"light\" : \"dark\";\n setMode(newMode);\n }, [resolvedMode, setMode]);\n\n const contextValue = useMemo<ThemeContextValue>(\n () => ({\n theme,\n mode,\n resolvedMode,\n setTheme,\n setMode,\n toggleMode,\n availableThemes,\n appliedTheme,\n }),\n [\n theme,\n mode,\n resolvedMode,\n setTheme,\n setMode,\n toggleMode,\n availableThemes,\n appliedTheme,\n ],\n );\n\n return (\n <ThemeContext.Provider value={contextValue}>\n {children}\n </ThemeContext.Provider>\n );\n};\n\n/**\n * Hook for accessing theme context\n *\n * @returns Theme context value\n *\n * @example\n * ```tsx\n * const { theme, resolvedMode, toggleMode, setTheme } = useTheme();\n *\n * // Toggle dark mode\n * <button onClick={toggleMode}>\n * {resolvedMode === 'dark' ? 'Light' : 'Dark'}\n * </button>\n *\n * // Change theme\n * <select value={theme} onChange={(e) => setTheme(e.target.value)}>\n * {availableThemes.map(t => (\n * <option key={t.name} value={t.name}>{t.displayName || t.name}</option>\n * ))}\n * </select>\n * ```\n */\nexport function useTheme(): ThemeContextValue {\n const context = useContext(ThemeContext);\n if (context === undefined) {\n // Return a default implementation for storybook/testing\n return {\n theme: \"wireframe\",\n mode: \"light\",\n resolvedMode: \"light\",\n setTheme: () => {},\n setMode: () => {},\n toggleMode: () => {},\n availableThemes: BUILT_IN_THEMES,\n appliedTheme: \"wireframe-light\",\n };\n }\n return context;\n}\n\n// Legacy exports for backward compatibility\nexport type Theme = ColorMode;\nexport type ResolvedTheme = ResolvedMode;\nexport type DesignTheme = ThemeDefinition;\n\nexport default ThemeContext;\n","/**\n * useUISlots Hook\n *\n * Core hook for managing UI slot rendering in the trait-driven architecture.\n * Traits use render_ui effects to dynamically render content into slots.\n *\n * Slots:\n * - main: Primary content area\n * - sidebar: Left/right sidebar\n * - modal: Modal overlay\n * - drawer: Slide-in drawer\n * - overlay: Full-screen overlay\n * - center: Centered popup\n * - toast: Toast notifications\n * - hud-top: Game HUD top bar\n * - hud-bottom: Game HUD bottom bar\n * - floating: Draggable floating panel\n *\n * @packageDocumentation\n */\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Valid UI slot names\n */\nexport type UISlot =\n | 'main'\n | 'sidebar'\n | 'modal'\n | 'drawer'\n | 'overlay'\n | 'center'\n | 'toast'\n | 'hud-top'\n | 'hud-bottom'\n | 'floating';\n\n/**\n * Animation types for slot transitions\n */\nexport type SlotAnimation = 'fade' | 'slide' | 'scale' | 'none';\n\n/**\n * Content rendered in a slot\n */\nexport interface SlotContent {\n /** Unique ID for this content */\n id: string;\n /** Pattern/component type to render */\n pattern: string;\n /** Props to pass to the pattern component */\n props: Record<string, unknown>;\n /** Priority for conflict resolution (higher wins) */\n priority: number;\n /** Animation for showing/hiding */\n animation?: SlotAnimation;\n /** Auto-dismiss timestamp (for toasts) */\n autoDismissAt?: number;\n /** Callback when dismissed */\n onDismiss?: () => void;\n /** Source trait that rendered this content */\n sourceTrait?: string;\n}\n\n/**\n * Configuration for render_ui effect\n */\nexport interface RenderUIConfig {\n /** Target slot */\n target: UISlot;\n /** Pattern/component to render */\n pattern: string;\n /** Props for the pattern */\n props?: Record<string, unknown>;\n /** Priority (default: 0) */\n priority?: number;\n /** Animation type */\n animation?: SlotAnimation;\n /** Auto-dismiss after ms (for toasts) */\n autoDismissMs?: number;\n /** Callback on dismiss */\n onDismiss?: () => void;\n /** Source trait name */\n sourceTrait?: string;\n}\n\n/**\n * Callback for slot changes\n */\nexport type SlotChangeCallback = (slot: UISlot, content: SlotContent | null) => void;\n\n/**\n * UI Slot Manager interface\n */\nexport interface UISlotManager {\n /** Current content for each slot */\n slots: Record<UISlot, SlotContent | null>;\n /** Render content to a slot */\n render: (config: RenderUIConfig) => string;\n /** Clear a specific slot */\n clear: (slot: UISlot) => void;\n /** Clear content by ID */\n clearById: (id: string) => void;\n /** Clear all slots */\n clearAll: () => void;\n /** Subscribe to slot changes */\n subscribe: (callback: SlotChangeCallback) => () => void;\n /** Check if a slot has content */\n hasContent: (slot: UISlot) => boolean;\n /** Get content for a slot */\n getContent: (slot: UISlot) => SlotContent | null;\n}\n\n// ============================================================================\n// Default Slots State\n// ============================================================================\n\nconst DEFAULT_SLOTS: Record<UISlot, SlotContent | null> = {\n main: null,\n sidebar: null,\n modal: null,\n drawer: null,\n overlay: null,\n center: null,\n toast: null,\n 'hud-top': null,\n 'hud-bottom': null,\n floating: null,\n};\n\n// ============================================================================\n// ID Generator\n// ============================================================================\n\nlet idCounter = 0;\nfunction generateId(): string {\n return `slot-content-${++idCounter}-${Date.now()}`;\n}\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Create a UI Slot Manager instance.\n *\n * This is the internal hook that creates the manager.\n * Use `useUISlots()` from context in components.\n */\nexport function useUISlotManager(): UISlotManager {\n const [slots, setSlots] = useState<Record<UISlot, SlotContent | null>>(DEFAULT_SLOTS);\n const subscribersRef = useRef<Set<SlotChangeCallback>>(new Set());\n const timersRef = useRef<Map<string, NodeJS.Timeout>>(new Map());\n\n // Clean up timers on unmount\n useEffect(() => {\n return () => {\n timersRef.current.forEach((timer) => clearTimeout(timer));\n timersRef.current.clear();\n };\n }, []);\n\n // Notify subscribers of slot changes\n const notifySubscribers = useCallback((slot: UISlot, content: SlotContent | null) => {\n subscribersRef.current.forEach((callback) => {\n try {\n callback(slot, content);\n } catch (error) {\n console.error('[UISlots] Subscriber error:', error);\n }\n });\n }, []);\n\n // Render content to a slot\n const render = useCallback((config: RenderUIConfig): string => {\n const id = generateId();\n const content: SlotContent = {\n id,\n pattern: config.pattern,\n props: config.props ?? {},\n priority: config.priority ?? 0,\n animation: config.animation ?? 'fade',\n onDismiss: config.onDismiss,\n sourceTrait: config.sourceTrait,\n };\n\n // Set auto-dismiss timer if specified\n if (config.autoDismissMs && config.autoDismissMs > 0) {\n content.autoDismissAt = Date.now() + config.autoDismissMs;\n const timer = setTimeout(() => {\n setSlots((prev) => {\n if (prev[config.target]?.id === id) {\n // Call onDismiss callback\n content.onDismiss?.();\n notifySubscribers(config.target, null);\n return { ...prev, [config.target]: null };\n }\n return prev;\n });\n timersRef.current.delete(id);\n }, config.autoDismissMs);\n timersRef.current.set(id, timer);\n }\n\n setSlots((prev) => {\n const existing = prev[config.target];\n\n // Priority-based conflict resolution\n if (existing && existing.priority > content.priority) {\n console.warn(\n `[UISlots] Slot \"${config.target}\" already has higher priority content (${existing.priority} > ${content.priority})`\n );\n return prev;\n }\n\n notifySubscribers(config.target, content);\n return { ...prev, [config.target]: content };\n });\n\n return id;\n }, [notifySubscribers]);\n\n // Clear a specific slot\n const clear = useCallback((slot: UISlot) => {\n setSlots((prev) => {\n const content = prev[slot];\n if (content) {\n // Clear any auto-dismiss timer\n const timer = timersRef.current.get(content.id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(content.id);\n }\n // Call onDismiss callback\n content.onDismiss?.();\n notifySubscribers(slot, null);\n }\n return { ...prev, [slot]: null };\n });\n }, [notifySubscribers]);\n\n // Clear content by ID\n const clearById = useCallback((id: string) => {\n setSlots((prev) => {\n const entry = Object.entries(prev).find(([, content]) => content?.id === id);\n if (entry) {\n const [slot, content] = entry as [UISlot, SlotContent];\n // Clear any auto-dismiss timer\n const timer = timersRef.current.get(id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(id);\n }\n // Call onDismiss callback\n content.onDismiss?.();\n notifySubscribers(slot, null);\n return { ...prev, [slot]: null };\n }\n return prev;\n });\n }, [notifySubscribers]);\n\n // Clear all slots\n const clearAll = useCallback(() => {\n // Clear all timers\n timersRef.current.forEach((timer) => clearTimeout(timer));\n timersRef.current.clear();\n\n setSlots((prev) => {\n // Call onDismiss for all content\n Object.entries(prev).forEach(([slot, content]) => {\n if (content) {\n content.onDismiss?.();\n notifySubscribers(slot as UISlot, null);\n }\n });\n return DEFAULT_SLOTS;\n });\n }, [notifySubscribers]);\n\n // Subscribe to slot changes\n const subscribe = useCallback((callback: SlotChangeCallback): (() => void) => {\n subscribersRef.current.add(callback);\n return () => {\n subscribersRef.current.delete(callback);\n };\n }, []);\n\n // Check if slot has content\n const hasContent = useCallback((slot: UISlot): boolean => {\n return slots[slot] !== null;\n }, [slots]);\n\n // Get content for a slot\n const getContent = useCallback((slot: UISlot): SlotContent | null => {\n return slots[slot];\n }, [slots]);\n\n return {\n slots,\n render,\n clear,\n clearById,\n clearAll,\n subscribe,\n hasContent,\n getContent,\n };\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport { DEFAULT_SLOTS };\n","/**\n * UISlotContext\n *\n * React context for providing the UI Slot Manager throughout the application.\n * Traits use this context to render content into slots via render_ui effects.\n *\n * Usage:\n * ```tsx\n * // In App.tsx or layout\n * <UISlotProvider>\n * <App />\n * </UISlotProvider>\n *\n * // In trait hooks or components\n * const { render, clear } = useUISlots();\n * render({ target: 'modal', pattern: 'form-section', props: {...} });\n * ```\n *\n * @packageDocumentation\n */\n\nimport React, { createContext, useContext, useMemo } from 'react';\nimport {\n useUISlotManager,\n type UISlotManager,\n type UISlot,\n type SlotContent,\n type RenderUIConfig,\n type SlotAnimation,\n type SlotChangeCallback,\n} from '../hooks/useUISlots';\n\n// ============================================================================\n// Context\n// ============================================================================\n\n/**\n * Context for the UI Slot Manager\n */\nconst UISlotContext = createContext<UISlotManager | null>(null);\n\n// ============================================================================\n// Provider\n// ============================================================================\n\nexport interface UISlotProviderProps {\n children: React.ReactNode;\n}\n\n/**\n * Provider component that creates and provides the UI Slot Manager.\n *\n * Must wrap any components that use traits with render_ui effects.\n */\nexport function UISlotProvider({ children }: UISlotProviderProps): React.ReactElement {\n const slotManager = useUISlotManager();\n\n // Memoize the context value to prevent unnecessary re-renders\n const contextValue = useMemo(() => slotManager, [slotManager]);\n\n return (\n <UISlotContext.Provider value={contextValue}>\n {children}\n </UISlotContext.Provider>\n );\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook to access the UI Slot Manager.\n *\n * Must be used within a UISlotProvider.\n *\n * @throws Error if used outside of UISlotProvider\n *\n * @example\n * ```tsx\n * function MyTraitHook() {\n * const { render, clear } = useUISlots();\n *\n * const showModal = () => {\n * render({\n * target: 'modal',\n * pattern: 'form-section',\n * props: { title: 'Create Item' },\n * });\n * };\n *\n * const closeModal = () => {\n * clear('modal');\n * };\n *\n * return { showModal, closeModal };\n * }\n * ```\n */\nexport function useUISlots(): UISlotManager {\n const context = useContext(UISlotContext);\n\n if (!context) {\n throw new Error(\n 'useUISlots must be used within a UISlotProvider. ' +\n 'Make sure your component tree is wrapped with <UISlotProvider>.'\n );\n }\n\n return context;\n}\n\n/**\n * Hook to get content for a specific slot.\n *\n * Useful for components that only need to read slot state.\n */\nexport function useSlotContent(slot: UISlot): SlotContent | null {\n const { getContent } = useUISlots();\n return getContent(slot);\n}\n\n/**\n * Hook to check if a slot has content.\n */\nexport function useSlotHasContent(slot: UISlot): boolean {\n const { hasContent } = useUISlots();\n return hasContent(slot);\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport {\n UISlotContext,\n type UISlotManager,\n type UISlot,\n type SlotContent,\n type RenderUIConfig,\n type SlotAnimation,\n type SlotChangeCallback,\n};\n","/**\n * useEventBus Hook\n *\n * Provides event bus utilities for component communication.\n * This connects to the EventBusProvider for real applications\n * or provides a simple in-memory bus for design system / Storybook.\n *\n * @packageDocumentation\n */\n\nimport { useCallback, useEffect, useRef, useContext } from 'react';\nimport { EventBusContext } from '../providers/EventBusProvider';\nimport type { KFlowEvent, EventListener, Unsubscribe, EventBusContextType } from './event-bus-types';\n\n// Re-export types for convenience\nexport type { KFlowEvent, EventListener, Unsubscribe, EventBusContextType };\n\n// ============================================================================\n// Global Event Bus Bridge\n// ============================================================================\n\n/**\n * Global event bus reference for bridging between packages.\n *\n * When the EventBusProvider mounts, it can register itself as the global\n * event bus. This allows components in other packages (like ui-shell) to\n * emit events to the same bus that the main app's trait state machine listens to.\n */\nlet globalEventBus: EventBusContextType | null = null;\n\n/**\n * Set the global event bus reference.\n * Called by EventBusProvider when it mounts.\n *\n * @param bus - The event bus context to set as global, or null to clear\n */\nexport function setGlobalEventBus(bus: EventBusContextType | null): void {\n globalEventBus = bus;\n}\n\n/**\n * Get the global event bus reference.\n *\n * @returns The global event bus if set, null otherwise\n */\nexport function getGlobalEventBus(): EventBusContextType | null {\n return globalEventBus;\n}\n\n// ============================================================================\n// Fallback Event Bus (for use outside EventBusProvider)\n// ============================================================================\n\nconst fallbackListeners = new Map<string, Set<EventListener>>();\n\nconst fallbackEventBus: EventBusContextType = {\n emit: (type: string, payload?: Record<string, unknown>) => {\n const event: KFlowEvent = {\n type,\n payload,\n timestamp: Date.now(),\n };\n const handlers = fallbackListeners.get(type);\n if (handlers) {\n handlers.forEach((handler) => {\n try {\n handler(event);\n } catch (error) {\n console.error(`[EventBus] Error in listener for '${type}':`, error);\n }\n });\n }\n },\n on: (type: string, listener: EventListener): Unsubscribe => {\n if (!fallbackListeners.has(type)) {\n fallbackListeners.set(type, new Set());\n }\n fallbackListeners.get(type)!.add(listener);\n return () => {\n const handlers = fallbackListeners.get(type);\n if (handlers) {\n handlers.delete(listener);\n if (handlers.size === 0) {\n fallbackListeners.delete(type);\n }\n }\n };\n },\n once: (type: string, listener: EventListener): Unsubscribe => {\n const wrappedListener: EventListener = (event) => {\n fallbackListeners.get(type)?.delete(wrappedListener);\n listener(event);\n };\n return fallbackEventBus.on(type, wrappedListener);\n },\n hasListeners: (type: string): boolean => {\n const handlers = fallbackListeners.get(type);\n return handlers !== undefined && handlers.size > 0;\n },\n};\n\n// ============================================================================\n// Main Hook\n// ============================================================================\n\n/**\n * Hook for accessing the event bus.\n *\n * Uses EventBusProvider context if available, otherwise falls back to\n * a simple in-memory event bus (for design system / Storybook).\n *\n * @returns Event bus instance with emit, on, once, and hasListeners methods\n *\n * @example\n * ```tsx\n * const eventBus = useEventBus();\n *\n * // Emit an event\n * eventBus.emit('UI:CLICK', { id: '123' });\n *\n * // Subscribe to an event\n * useEffect(() => {\n * return eventBus.on('UI:CLICK', (event) => {\n * console.log('Clicked:', event.payload);\n * });\n * }, []);\n * ```\n */\nexport function useEventBus(): EventBusContextType {\n const context = useContext(EventBusContext);\n // Priority: 1) React context, 2) Global bridge, 3) Fallback\n return context ?? globalEventBus ?? fallbackEventBus;\n}\n\n// ============================================================================\n// Convenience Hooks\n// ============================================================================\n\n/**\n * Hook for subscribing to a specific event.\n * Automatically cleans up subscription on unmount.\n *\n * @param event - Event name to subscribe to\n * @param handler - Event handler function\n *\n * @example\n * ```tsx\n * useEventListener('UI:CLICK', (event) => {\n * console.log('Clicked:', event.payload);\n * });\n * ```\n */\nexport function useEventListener(\n event: string,\n handler: EventListener\n): void {\n const eventBus = useEventBus();\n const handlerRef = useRef(handler);\n handlerRef.current = handler;\n\n useEffect(() => {\n const wrappedHandler: EventListener = (evt) => {\n handlerRef.current(evt);\n };\n return eventBus.on(event, wrappedHandler);\n }, [event, eventBus]);\n}\n\n/**\n * Alias for useEventListener for backward compatibility\n */\nexport const useEventSubscription = useEventListener;\n\n/**\n * Hook for emitting events.\n * Returns a memoized emit function.\n *\n * @returns Function to emit events\n *\n * @example\n * ```tsx\n * const emit = useEmitEvent();\n *\n * const handleClick = () => {\n * emit('UI:CLICK', { id: '123' });\n * };\n * ```\n */\nexport function useEmitEvent(): (type: string, payload?: Record<string, unknown>) => void {\n const eventBus = useEventBus();\n return useCallback(\n (type: string, payload?: Record<string, unknown>) => {\n eventBus.emit(type, payload);\n },\n [eventBus]\n );\n}\n\nexport default useEventBus;\n","/**\n * EventBusProvider - React context provider for the event bus\n *\n * Provides a page-scoped event bus for trait communication.\n * Each page has its own event bus instance.\n *\n * NOTE: Selection state has been moved to SelectionProvider.\n * Use SelectionProvider for tracking selected entities.\n *\n * @packageDocumentation\n */\n\nimport React, { createContext, useCallback, useRef, useMemo, useEffect, type ReactNode } from 'react';\nimport type { KFlowEvent, EventListener, Unsubscribe, EventBusContextType } from '../hooks/event-bus-types';\nimport { setGlobalEventBus } from '../hooks/useEventBus';\n\n// ============================================================================\n// Context\n// ============================================================================\n\n/**\n * Extended context type for backward compatibility.\n *\n * @deprecated getSelectedEntity and clearSelectedEntity are deprecated.\n * Use SelectionProvider and useSelection hook instead.\n */\nexport interface EventBusContextTypeExtended extends EventBusContextType {\n /**\n * @deprecated Use useSelection from SelectionProvider instead.\n * This method now returns null - selection state moved to SelectionProvider.\n */\n getSelectedEntity: () => unknown | null;\n /**\n * @deprecated Use useSelection from SelectionProvider instead.\n * This method is now a no-op - selection state moved to SelectionProvider.\n */\n clearSelectedEntity: () => void;\n}\n\nexport const EventBusContext = createContext<EventBusContextTypeExtended | null>(null);\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\ninterface EventBusProviderProps {\n children: ReactNode;\n /** Enable debug logging in development */\n debug?: boolean;\n}\n\n/**\n * Provider component for the page event bus.\n *\n * This is a pure pub/sub event bus. For selection state,\n * use SelectionProvider which listens to events and maintains state.\n *\n * @example\n * ```tsx\n * function TaskDetailPage() {\n * return (\n * <EventBusProvider debug={process.env.NODE_ENV === 'development'}>\n * <SelectionProvider>\n * <TaskHeader />\n * <TaskForm />\n * <TaskActions />\n * </SelectionProvider>\n * </EventBusProvider>\n * );\n * }\n * ```\n */\nexport function EventBusProvider({ children, debug = false }: EventBusProviderProps) {\n // Store listeners by event type\n const listenersRef = useRef<Map<string, Set<EventListener>>>(new Map());\n\n // Track if deprecation warning has been shown\n const deprecationWarningShown = useRef(false);\n\n /**\n * @deprecated Use useSelection from SelectionProvider instead.\n */\n const getSelectedEntity = useCallback(() => {\n if (!deprecationWarningShown.current) {\n console.warn(\n '[EventBus] getSelectedEntity is deprecated. ' +\n 'Use SelectionProvider and useSelection hook instead. ' +\n 'See SelectionProvider.tsx for migration guide.'\n );\n deprecationWarningShown.current = true;\n }\n return null;\n }, []);\n\n /**\n * @deprecated Use useSelection from SelectionProvider instead.\n */\n const clearSelectedEntity = useCallback(() => {\n if (!deprecationWarningShown.current) {\n console.warn(\n '[EventBus] clearSelectedEntity is deprecated. ' +\n 'Use SelectionProvider and useSelection hook instead. ' +\n 'See SelectionProvider.tsx for migration guide.'\n );\n deprecationWarningShown.current = true;\n }\n }, []);\n\n /**\n * Emit an event to all listeners of that type.\n */\n const emit = useCallback((type: string, payload?: Record<string, unknown>) => {\n const event: KFlowEvent = {\n type,\n payload,\n timestamp: Date.now(),\n };\n\n const listeners = listenersRef.current.get(type);\n const listenerCount = listeners?.size ?? 0;\n\n if (debug) {\n if (listenerCount > 0) {\n console.log(`[EventBus] Emit: ${type} → ${listenerCount} listener(s)`, payload);\n } else {\n console.warn(`[EventBus] Emit: ${type} (NO LISTENERS - event may be lost!)`, payload);\n }\n }\n\n if (listeners) {\n // Create a copy to avoid issues if listener modifies the set\n const listenersCopy = Array.from(listeners);\n for (const listener of listenersCopy) {\n try {\n listener(event);\n } catch (error) {\n console.error(`[EventBus] Error in listener for '${type}':`, error);\n }\n }\n }\n }, [debug]);\n\n /**\n * Subscribe to an event type.\n * Returns an unsubscribe function.\n */\n const on = useCallback((type: string, listener: EventListener): Unsubscribe => {\n if (!listenersRef.current.has(type)) {\n listenersRef.current.set(type, new Set());\n }\n\n const listeners = listenersRef.current.get(type)!;\n listeners.add(listener);\n\n if (debug) {\n console.log(`[EventBus] Subscribed to '${type}', total: ${listeners.size}`);\n }\n\n // Return unsubscribe function\n return () => {\n listeners.delete(listener);\n if (debug) {\n console.log(`[EventBus] Unsubscribed from '${type}', remaining: ${listeners.size}`);\n }\n // Clean up empty sets\n if (listeners.size === 0) {\n listenersRef.current.delete(type);\n }\n };\n }, [debug]);\n\n /**\n * Subscribe to an event type, but only fire once.\n */\n const once = useCallback((type: string, listener: EventListener): Unsubscribe => {\n const wrappedListener: EventListener = (event) => {\n // Remove self before calling listener\n listenersRef.current.get(type)?.delete(wrappedListener);\n listener(event);\n };\n\n return on(type, wrappedListener);\n }, [on]);\n\n /**\n * Check if there are any listeners for an event type.\n */\n const hasListeners = useCallback((type: string): boolean => {\n const listeners = listenersRef.current.get(type);\n return listeners !== undefined && listeners.size > 0;\n }, []);\n\n // Memoize context value\n const contextValue = useMemo(\n () => ({\n emit,\n on,\n once,\n hasListeners,\n getSelectedEntity,\n clearSelectedEntity,\n }),\n [emit, on, once, hasListeners, getSelectedEntity, clearSelectedEntity]\n );\n\n // Bridge to global event bus system.\n // Components in other packages (like shell components) use their own useEventBus hook\n // which checks for a global event bus. Setting it here allows shell components to\n // emit events to the same bus that the main app's trait state machine listens to.\n useEffect(() => {\n setGlobalEventBus(contextValue);\n return () => {\n setGlobalEventBus(null);\n };\n }, [contextValue]);\n\n return (\n <EventBusContext.Provider value={contextValue}>\n {children}\n </EventBusContext.Provider>\n );\n}\n\nexport type { EventBusContextType };\n","/**\n * SelectionProvider - Manages selected entity state\n *\n * Separates selection state from the EventBusProvider to maintain\n * clean architecture (event bus stays pure pub/sub).\n *\n * This provider:\n * - Listens to UI:VIEW and UI:SELECT events to track selected entity\n * - Listens to UI:CLOSE, UI:DESELECT, UI:CANCEL to clear selection\n * - Provides the selected entity to any component that needs it\n *\n * @packageDocumentation\n */\n\nimport React, {\n createContext,\n useContext,\n useState,\n useEffect,\n useCallback,\n type ReactNode,\n} from 'react';\nimport { useEventBus, type KFlowEvent } from '../hooks/useEventBus';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface SelectionContextType<T = unknown> {\n /** The currently selected entity */\n selected: T | null;\n /** Manually set the selected entity */\n setSelected: (entity: T | null) => void;\n /** Clear the selection */\n clearSelection: () => void;\n /** Check if an entity is selected */\n isSelected: (entity: T) => boolean;\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst SelectionContext = createContext<SelectionContextType | null>(null);\n\n// ============================================================================\n// Provider\n// ============================================================================\n\ninterface SelectionProviderProps {\n children: ReactNode;\n /** Enable debug logging */\n debug?: boolean;\n /** Custom comparison function for isSelected */\n compareEntities?: (a: unknown, b: unknown) => boolean;\n}\n\n/**\n * Default entity comparison - compares by id field\n */\nconst defaultCompareEntities = (a: unknown, b: unknown): boolean => {\n if (a === b) return true;\n if (!a || !b) return false;\n if (typeof a === 'object' && typeof b === 'object') {\n const aId = (a as Record<string, unknown>).id;\n const bId = (b as Record<string, unknown>).id;\n return aId !== undefined && aId === bId;\n }\n return false;\n};\n\n/**\n * Provider component for selection state.\n *\n * Must be used within an EventBusProvider.\n *\n * @example\n * ```tsx\n * function OrderListPage() {\n * return (\n * <EventBusProvider>\n * <SelectionProvider debug={process.env.NODE_ENV === 'development'}>\n * <OrderTable />\n * <OrderDetailDrawer />\n * </SelectionProvider>\n * </EventBusProvider>\n * );\n * }\n * ```\n */\nexport function SelectionProvider({\n children,\n debug = false,\n compareEntities = defaultCompareEntities,\n}: SelectionProviderProps) {\n const eventBus = useEventBus();\n const [selected, setSelectedState] = useState<unknown | null>(null);\n\n /**\n * Set the selected entity\n */\n const setSelected = useCallback(\n (entity: unknown | null) => {\n setSelectedState(entity);\n if (debug) {\n console.log('[SelectionProvider] Selection set:', entity);\n }\n },\n [debug]\n );\n\n /**\n * Clear the selection\n */\n const clearSelection = useCallback(() => {\n setSelectedState(null);\n if (debug) {\n console.log('[SelectionProvider] Selection cleared');\n }\n }, [debug]);\n\n /**\n * Check if an entity is selected\n */\n const isSelected = useCallback(\n (entity: unknown): boolean => {\n return compareEntities(selected, entity);\n },\n [selected, compareEntities]\n );\n\n /**\n * Listen to event bus for selection events\n */\n useEffect(() => {\n // Handle selection events\n const handleSelect = (event: KFlowEvent) => {\n const row = event.payload?.row;\n if (row) {\n setSelected(row);\n if (debug) {\n console.log(`[SelectionProvider] ${event.type} received:`, row);\n }\n }\n };\n\n // Handle deselection events\n const handleDeselect = (event: KFlowEvent) => {\n clearSelection();\n if (debug) {\n console.log(`[SelectionProvider] ${event.type} received - clearing selection`);\n }\n };\n\n // Subscribe to selection events\n const unsubView = eventBus.on('UI:VIEW', handleSelect);\n const unsubSelect = eventBus.on('UI:SELECT', handleSelect);\n\n // Subscribe to deselection events\n const unsubClose = eventBus.on('UI:CLOSE', handleDeselect);\n const unsubDeselect = eventBus.on('UI:DESELECT', handleDeselect);\n const unsubCancel = eventBus.on('UI:CANCEL', handleDeselect);\n\n return () => {\n unsubView();\n unsubSelect();\n unsubClose();\n unsubDeselect();\n unsubCancel();\n };\n }, [eventBus, setSelected, clearSelection, debug]);\n\n const contextValue: SelectionContextType = {\n selected,\n setSelected,\n clearSelection,\n isSelected,\n };\n\n return (\n <SelectionContext.Provider value={contextValue}>\n {children}\n </SelectionContext.Provider>\n );\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook to access selection state.\n *\n * @throws Error if used outside SelectionProvider\n *\n * @example\n * ```tsx\n * function OrderDetailDrawer() {\n * const { selected, clearSelection } = useSelection<Order>();\n *\n * if (!selected) return null;\n *\n * return (\n * <Drawer onClose={clearSelection}>\n * <OrderDetail order={selected} />\n * </Drawer>\n * );\n * }\n * ```\n */\nexport function useSelection<T = unknown>(): SelectionContextType<T> {\n const context = useContext(SelectionContext);\n\n if (!context) {\n throw new Error('useSelection must be used within a SelectionProvider');\n }\n\n return context as SelectionContextType<T>;\n}\n\n/**\n * Hook to access selection state with fallback for components\n * that may be used outside SelectionProvider.\n *\n * Returns null if no SelectionProvider is found.\n */\nexport function useSelectionOptional<T = unknown>(): SelectionContextType<T> | null {\n const context = useContext(SelectionContext);\n return context as SelectionContextType<T> | null;\n}\n\nexport { SelectionContext };\n","/**\n * FetchedDataProvider\n *\n * Provides server-fetched entity data to the client runtime.\n * This context stores data returned from compiled event handlers\n * via the `data` field in EventResponse.\n *\n * Data Flow:\n * 1. Client sends event to server\n * 2. Server executes compiled handler with fetch effects\n * 3. Server returns { data: { EntityName: [...records] }, clientEffects: [...] }\n * 4. Provider stores data in this context\n * 5. Pattern components access data via useFetchedData hook\n *\n * Used by both Builder preview and compiled shell.\n *\n * @packageDocumentation\n */\n\nimport React, { createContext, useContext, useState, useCallback, useMemo } from 'react';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface EntityRecord {\n id: string;\n [key: string]: unknown;\n}\n\nexport interface FetchedDataState {\n /** Entity data by entity name (e.g., { Task: [...], User: [...] }) */\n data: Record<string, EntityRecord[]>;\n /** Timestamp of last fetch per entity */\n fetchedAt: Record<string, number>;\n /** Whether data is currently being fetched */\n loading: boolean;\n /** Last error message */\n error: string | null;\n}\n\nexport interface FetchedDataContextValue {\n /** Get all records for an entity */\n getData: (entityName: string) => EntityRecord[];\n /** Get a single record by ID */\n getById: (entityName: string, id: string) => EntityRecord | undefined;\n /** Check if entity data exists */\n hasData: (entityName: string) => boolean;\n /** Get fetch timestamp for entity */\n getFetchedAt: (entityName: string) => number | undefined;\n /** Update data from server response */\n setData: (data: Record<string, unknown[]>) => void;\n /** Clear all fetched data */\n clearData: () => void;\n /** Clear data for specific entity */\n clearEntity: (entityName: string) => void;\n /** Current loading state */\n loading: boolean;\n /** Set loading state */\n setLoading: (loading: boolean) => void;\n /** Current error */\n error: string | null;\n /** Set error */\n setError: (error: string | null) => void;\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\nexport const FetchedDataContext = createContext<FetchedDataContextValue | null>(null);\n\n// ============================================================================\n// Provider\n// ============================================================================\n\nexport interface FetchedDataProviderProps {\n /** Initial data (optional) */\n initialData?: Record<string, unknown[]>;\n /** Children */\n children: React.ReactNode;\n}\n\n/**\n * FetchedDataProvider - Provides server-fetched entity data\n *\n * @example\n * ```tsx\n * <FetchedDataProvider>\n * <OrbitalProvider>\n * <App />\n * </OrbitalProvider>\n * </FetchedDataProvider>\n * ```\n */\nexport function FetchedDataProvider({\n initialData,\n children,\n}: FetchedDataProviderProps): React.ReactElement {\n const [state, setState] = useState<FetchedDataState>(() => ({\n data: (initialData as Record<string, EntityRecord[]>) || {},\n fetchedAt: {},\n loading: false,\n error: null,\n }));\n\n const getData = useCallback(\n (entityName: string): EntityRecord[] => {\n return state.data[entityName] || [];\n },\n [state.data]\n );\n\n const getById = useCallback(\n (entityName: string, id: string): EntityRecord | undefined => {\n const records = state.data[entityName];\n return records?.find((r) => r.id === id);\n },\n [state.data]\n );\n\n const hasData = useCallback(\n (entityName: string): boolean => {\n return entityName in state.data && state.data[entityName].length > 0;\n },\n [state.data]\n );\n\n const getFetchedAt = useCallback(\n (entityName: string): number | undefined => {\n return state.fetchedAt[entityName];\n },\n [state.fetchedAt]\n );\n\n const setData = useCallback((data: Record<string, unknown[]>): void => {\n const now = Date.now();\n setState((prev) => ({\n ...prev,\n data: {\n ...prev.data,\n ...(data as Record<string, EntityRecord[]>),\n },\n fetchedAt: {\n ...prev.fetchedAt,\n ...Object.keys(data).reduce(\n (acc, key) => ({ ...acc, [key]: now }),\n {}\n ),\n },\n loading: false,\n error: null,\n }));\n }, []);\n\n const clearData = useCallback((): void => {\n setState((prev) => ({\n ...prev,\n data: {},\n fetchedAt: {},\n }));\n }, []);\n\n const clearEntity = useCallback((entityName: string): void => {\n setState((prev) => {\n const newData = { ...prev.data };\n const newFetchedAt = { ...prev.fetchedAt };\n delete newData[entityName];\n delete newFetchedAt[entityName];\n return {\n ...prev,\n data: newData,\n fetchedAt: newFetchedAt,\n };\n });\n }, []);\n\n const setLoading = useCallback((loading: boolean): void => {\n setState((prev) => ({ ...prev, loading }));\n }, []);\n\n const setError = useCallback((error: string | null): void => {\n setState((prev) => ({ ...prev, error, loading: false }));\n }, []);\n\n const contextValue = useMemo<FetchedDataContextValue>(\n () => ({\n getData,\n getById,\n hasData,\n getFetchedAt,\n setData,\n clearData,\n clearEntity,\n loading: state.loading,\n setLoading,\n error: state.error,\n setError,\n }),\n [\n getData,\n getById,\n hasData,\n getFetchedAt,\n setData,\n clearData,\n clearEntity,\n state.loading,\n setLoading,\n state.error,\n setError,\n ]\n );\n\n return (\n <FetchedDataContext.Provider value={contextValue}>\n {children}\n </FetchedDataContext.Provider>\n );\n}\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\n/**\n * Access the fetched data context.\n * Returns null if not within a FetchedDataProvider.\n */\nexport function useFetchedDataContext(): FetchedDataContextValue | null {\n return useContext(FetchedDataContext);\n}\n\n/**\n * Access fetched data with fallback behavior.\n * If not in a provider, returns empty data.\n */\nexport function useFetchedData(): FetchedDataContextValue {\n const context = useContext(FetchedDataContext);\n if (!context) {\n // Return a no-op implementation when not wrapped in provider\n return {\n getData: () => [],\n getById: () => undefined,\n hasData: () => false,\n getFetchedAt: () => undefined,\n setData: () => {},\n clearData: () => {},\n clearEntity: () => {},\n loading: false,\n setLoading: () => {},\n error: null,\n setError: () => {},\n };\n }\n return context;\n}\n\n/**\n * Access fetched data for a specific entity.\n * Provides a convenient API for entity-specific operations.\n */\nexport function useFetchedEntity(entityName: string) {\n const context = useFetchedData();\n\n return {\n /** All fetched records for this entity */\n records: context.getData(entityName),\n /** Get a record by ID */\n getById: (id: string) => context.getById(entityName, id),\n /** Whether data has been fetched for this entity */\n hasData: context.hasData(entityName),\n /** When data was last fetched */\n fetchedAt: context.getFetchedAt(entityName),\n /** Whether data is loading */\n loading: context.loading,\n /** Current error */\n error: context.error,\n };\n}\n","/**\n * OrbitalProvider\n *\n * Unified provider that combines all required contexts for Orbital applications.\n * Provides a single import for both Builder preview and compiled shell.\n *\n * Combines:\n * - ThemeProvider - Theme and color mode management\n * - EventBusProvider - Page-scoped event pub/sub\n * - UISlotProvider - UI slot management for render_ui effects\n * - SelectionProvider - Selected entity tracking\n * - FetchedDataProvider - Server-fetched entity data\n *\n * @packageDocumentation\n */\n\nimport React, { type ReactNode } from 'react';\nimport { ThemeProvider, type ThemeProviderProps, type ThemeDefinition } from '../context/ThemeContext';\nimport { UISlotProvider } from '../context/UISlotContext';\nimport { EventBusProvider } from './EventBusProvider';\nimport { SelectionProvider } from './SelectionProvider';\nimport { FetchedDataProvider } from './FetchedDataProvider';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface OrbitalProviderProps {\n children: ReactNode;\n\n // Theme options\n /** Custom themes (merged with built-in themes) */\n themes?: ThemeDefinition[];\n /** Default theme name */\n defaultTheme?: string;\n /** Default color mode */\n defaultMode?: 'light' | 'dark' | 'system';\n\n // Debug options\n /** Enable debug logging for all providers */\n debug?: boolean;\n\n // Data options\n /** Initial fetched data */\n initialData?: Record<string, unknown[]>;\n}\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\n/**\n * OrbitalProvider - Unified context provider for Orbital applications\n *\n * Wraps your application with all required providers in the correct order.\n *\n * @example\n * ```tsx\n * // Basic usage\n * function App() {\n * return (\n * <OrbitalProvider>\n * <Router>\n * <Routes />\n * </Router>\n * </OrbitalProvider>\n * );\n * }\n *\n * // With configuration\n * function App() {\n * return (\n * <OrbitalProvider\n * defaultTheme=\"minimalist\"\n * defaultMode=\"dark\"\n * debug={process.env.NODE_ENV === 'development'}\n * >\n * <Router>\n * <Routes />\n * </Router>\n * </OrbitalProvider>\n * );\n * }\n *\n * // With custom themes from schema\n * import { THEMES } from './generated/theme-manifest';\n *\n * function App() {\n * return (\n * <OrbitalProvider themes={THEMES} defaultTheme=\"ocean\">\n * <Router>\n * <Routes />\n * </Router>\n * </OrbitalProvider>\n * );\n * }\n * ```\n */\nexport function OrbitalProvider({\n children,\n themes,\n defaultTheme = 'wireframe',\n defaultMode = 'system',\n debug = false,\n initialData,\n}: OrbitalProviderProps): React.ReactElement {\n return (\n <ThemeProvider\n themes={themes}\n defaultTheme={defaultTheme}\n defaultMode={defaultMode}\n >\n <FetchedDataProvider initialData={initialData}>\n <EventBusProvider debug={debug}>\n <UISlotProvider>\n <SelectionProvider debug={debug}>\n {children}\n </SelectionProvider>\n </UISlotProvider>\n </EventBusProvider>\n </FetchedDataProvider>\n </ThemeProvider>\n );\n}\n\nOrbitalProvider.displayName = 'OrbitalProvider';\n\n// ============================================================================\n// Re-exports for convenience\n// ============================================================================\n\nexport { ThemeProvider } from '../context/ThemeContext';\nexport { UISlotProvider } from '../context/UISlotContext';\nexport { EventBusProvider } from './EventBusProvider';\nexport { SelectionProvider } from './SelectionProvider';\nexport { FetchedDataProvider } from './FetchedDataProvider';\n","/**\n * Client Effect Executor\n *\n * Executes client effects returned from the server.\n * This is the core of the dual execution model - the server processes\n * events and returns client effects, which this module executes.\n *\n * Used by both Builder preview and compiled shells.\n *\n * @packageDocumentation\n */\n\nimport type {\n ClientEffect,\n ClientEffectExecutorConfig,\n PatternConfig,\n NotifyOptions,\n} from './types';\n\n// ============================================================================\n// Effect Execution\n// ============================================================================\n\n/**\n * Execute an array of client effects.\n *\n * Effects are executed sequentially in order.\n * Errors in one effect don't prevent subsequent effects from executing.\n *\n * @param effects - Array of client effects to execute\n * @param config - Configuration providing implementations for each effect type\n *\n * @example\n * ```typescript\n * executeClientEffects(\n * [\n * ['render-ui', 'main', { type: 'entity-table', entity: 'Task' }],\n * ['notify', 'Tasks loaded!', { type: 'success' }]\n * ],\n * {\n * renderToSlot: (slot, pattern) => slotManager.render(slot, pattern),\n * navigate: (path) => router.push(path),\n * notify: (message, opts) => toast.show(message, opts),\n * eventBus: { emit: (event, payload) => bus.emit(event, payload) }\n * }\n * );\n * ```\n */\nexport function executeClientEffects(\n effects: ClientEffect[],\n config: ClientEffectExecutorConfig\n): void {\n if (!effects || effects.length === 0) {\n return;\n }\n\n for (const effect of effects) {\n try {\n executeEffect(effect, config);\n } catch (error) {\n console.error(\n `[ClientEffectExecutor] Error executing effect:`,\n effect,\n error\n );\n }\n }\n\n // Call onComplete callback if provided\n config.onComplete?.();\n}\n\n/**\n * Execute a single client effect.\n */\nfunction executeEffect(\n effect: ClientEffect,\n config: ClientEffectExecutorConfig\n): void {\n const [effectType, ...args] = effect;\n\n switch (effectType) {\n case 'render-ui': {\n const [slot, patternConfig] = args as [string, PatternConfig | null];\n executeRenderUI(slot, patternConfig, config);\n break;\n }\n\n case 'navigate': {\n const [path, params] = args as [string, Record<string, unknown>?];\n executeNavigate(path, params, config);\n break;\n }\n\n case 'notify': {\n const [message, options] = args as [string, NotifyOptions?];\n executeNotify(message, options, config);\n break;\n }\n\n case 'emit': {\n const [event, payload] = args as [string, unknown?];\n executeEmit(event, payload, config);\n break;\n }\n\n default:\n console.warn(`[ClientEffectExecutor] Unknown effect type: ${effectType}`);\n }\n}\n\n// ============================================================================\n// Individual Effect Handlers\n// ============================================================================\n\n/**\n * Execute a render-ui effect.\n *\n * If patternConfig is null, the slot is cleared.\n */\nfunction executeRenderUI(\n slot: string,\n patternConfig: PatternConfig | null,\n config: ClientEffectExecutorConfig\n): void {\n config.renderToSlot(slot, patternConfig);\n}\n\n/**\n * Execute a navigate effect.\n */\nfunction executeNavigate(\n path: string,\n params: Record<string, unknown> | undefined,\n config: ClientEffectExecutorConfig\n): void {\n config.navigate(path, params);\n}\n\n/**\n * Execute a notify effect.\n */\nfunction executeNotify(\n message: string,\n options: NotifyOptions | undefined,\n config: ClientEffectExecutorConfig\n): void {\n config.notify(message, options);\n}\n\n/**\n * Execute an emit effect.\n */\nfunction executeEmit(\n event: string,\n payload: unknown | undefined,\n config: ClientEffectExecutorConfig\n): void {\n config.eventBus.emit(event, payload);\n}\n\n// ============================================================================\n// Effect Parsing Utilities\n// ============================================================================\n\n/**\n * Parse a raw effect array into a typed ClientEffect.\n * Handles unknown effect formats gracefully.\n */\nexport function parseClientEffect(\n raw: unknown[]\n): ClientEffect | null {\n if (!Array.isArray(raw) || raw.length < 1) {\n console.warn('[ClientEffectExecutor] Invalid effect format:', raw);\n return null;\n }\n\n const [type, ...args] = raw;\n\n if (typeof type !== 'string') {\n console.warn('[ClientEffectExecutor] Effect type must be string:', raw);\n return null;\n }\n\n switch (type) {\n case 'render-ui':\n return ['render-ui', args[0] as string, args[1] as PatternConfig | null];\n case 'navigate':\n return ['navigate', args[0] as string, args[1] as Record<string, unknown>];\n case 'notify':\n return ['notify', args[0] as string, args[1] as NotifyOptions];\n case 'emit':\n return ['emit', args[0] as string, args[1]];\n default:\n console.warn(`[ClientEffectExecutor] Unknown effect type: ${type}`);\n return null;\n }\n}\n\n/**\n * Parse an array of raw effects into typed ClientEffects.\n * Filters out invalid effects.\n */\nexport function parseClientEffects(\n raw: unknown[] | undefined\n): ClientEffect[] {\n if (!raw || !Array.isArray(raw)) {\n return [];\n }\n\n return raw\n .map((effect) => parseClientEffect(effect as unknown[]))\n .filter((effect): effect is ClientEffect => effect !== null);\n}\n\n// ============================================================================\n// Effect Filtering\n// ============================================================================\n\n/**\n * Filter effects by type.\n */\nexport function filterEffectsByType<T extends ClientEffect[0]>(\n effects: ClientEffect[],\n type: T\n): Extract<ClientEffect, [T, ...unknown[]]>[] {\n return effects.filter(\n (effect): effect is Extract<ClientEffect, [T, ...unknown[]]> =>\n effect[0] === type\n );\n}\n\n/**\n * Get all render-ui effects.\n */\nexport function getRenderUIEffects(\n effects: ClientEffect[]\n): Array<['render-ui', string, PatternConfig | null]> {\n return filterEffectsByType(effects, 'render-ui');\n}\n\n/**\n * Get all navigate effects.\n */\nexport function getNavigateEffects(\n effects: ClientEffect[]\n): Array<['navigate', string, Record<string, unknown>?]> {\n return filterEffectsByType(effects, 'navigate');\n}\n\n/**\n * Get all notify effects.\n */\nexport function getNotifyEffects(\n effects: ClientEffect[]\n): Array<['notify', string, NotifyOptions?]> {\n return filterEffectsByType(effects, 'notify');\n}\n\n/**\n * Get all emit effects.\n */\nexport function getEmitEffects(\n effects: ClientEffect[]\n): Array<['emit', string, unknown?]> {\n return filterEffectsByType(effects, 'emit');\n}\n","/**\n * Offline Effect Executor\n *\n * Enables client-only mode for applications that need to work without\n * server connectivity. Provides:\n * - Mock data providers for simulating server responses\n * - Local effect execution without server round-trip\n * - Sync queue for effects that need server persistence when back online\n *\n * Used by both Builder preview (offline mode) and compiled shells (PWA mode).\n *\n * @packageDocumentation\n */\n\nimport type {\n ClientEffect,\n ClientEffectExecutorConfig,\n PatternConfig,\n EventResponse,\n} from './types';\nimport { executeClientEffects } from './client-effect-executor';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Effect that needs to be synced to server when online\n */\nexport interface PendingSyncEffect {\n /** Unique ID for this effect */\n id: string;\n /** Timestamp when effect was queued */\n timestamp: number;\n /** Effect type (persist, call-service, etc.) */\n type: string;\n /** Effect payload */\n payload: unknown;\n /** Number of retry attempts */\n retries: number;\n /** Maximum retries before giving up */\n maxRetries: number;\n}\n\n/**\n * Configuration for offline executor\n */\nexport interface OfflineExecutorConfig extends ClientEffectExecutorConfig {\n /**\n * Mock data provider for simulating fetch responses.\n * Returns data for a given entity name.\n */\n mockDataProvider?: (entityName: string) => unknown[];\n\n /**\n * Whether to queue server effects for sync when online.\n * Default: true\n */\n enableSyncQueue?: boolean;\n\n /**\n * Maximum number of effects to queue before dropping oldest.\n * Default: 100\n */\n maxQueueSize?: number;\n\n /**\n * Callback when an effect is added to sync queue.\n */\n onEffectQueued?: (effect: PendingSyncEffect) => void;\n\n /**\n * Callback when sync queue changes.\n */\n onQueueChange?: (queue: PendingSyncEffect[]) => void;\n}\n\n/**\n * Offline executor state\n */\nexport interface OfflineExecutorState {\n /** Whether we're in offline mode */\n isOffline: boolean;\n /** Pending effects waiting for sync */\n syncQueue: PendingSyncEffect[];\n /** Number of effects processed locally */\n localEffectsProcessed: number;\n /** Number of effects synced to server */\n effectsSynced: number;\n /** Last sync attempt timestamp */\n lastSyncAttempt?: number;\n /** Last successful sync timestamp */\n lastSuccessfulSync?: number;\n}\n\n// ============================================================================\n// ID Generator\n// ============================================================================\n\nlet effectIdCounter = 0;\nfunction generateEffectId(): string {\n return `offline-effect-${++effectIdCounter}-${Date.now()}`;\n}\n\n// ============================================================================\n// Offline Executor Class\n// ============================================================================\n\n/**\n * OfflineExecutor - Handles effects in offline/client-only mode.\n *\n * Features:\n * - Executes client effects immediately (render-ui, navigate, notify, emit)\n * - Queues server effects (persist, fetch, call-service) for later sync\n * - Provides mock data for fetch effects when offline\n * - Syncs queued effects when connection is restored\n *\n * @example\n * ```typescript\n * const executor = new OfflineExecutor({\n * renderToSlot: (slot, pattern) => slotManager.render(slot, pattern),\n * navigate: (path) => router.push(path),\n * notify: (message, opts) => toast.show(message, opts),\n * eventBus: { emit: (event, payload) => bus.emit(event, payload) },\n * mockDataProvider: (entityName) => mockStore.getAll(entityName),\n * });\n *\n * // Process effects locally\n * const response = executor.processEventOffline('LOAD', { id: '123' });\n *\n * // When back online\n * await executor.syncPendingEffects(serverUrl);\n * ```\n */\nexport class OfflineExecutor {\n private config: OfflineExecutorConfig;\n private state: OfflineExecutorState;\n private storage: Storage | null;\n\n constructor(config: OfflineExecutorConfig) {\n this.config = {\n enableSyncQueue: true,\n maxQueueSize: 100,\n ...config,\n };\n\n this.state = {\n isOffline: !this.checkOnline(),\n syncQueue: [],\n localEffectsProcessed: 0,\n effectsSynced: 0,\n };\n\n // Use localStorage if available\n this.storage = typeof localStorage !== 'undefined' ? localStorage : null;\n\n // Load persisted queue\n this.loadSyncQueue();\n\n // Listen for online/offline events\n if (typeof window !== 'undefined') {\n window.addEventListener('online', this.handleOnline);\n window.addEventListener('offline', this.handleOffline);\n }\n }\n\n /**\n * Check if we're online (browser API)\n */\n private checkOnline(): boolean {\n return typeof navigator !== 'undefined' ? navigator.onLine : true;\n }\n\n /**\n * Handle going online\n */\n private handleOnline = (): void => {\n this.state.isOffline = false;\n // Attempt to sync pending effects\n // Note: Actual sync should be triggered by the app with proper server URL\n };\n\n /**\n * Handle going offline\n */\n private handleOffline = (): void => {\n this.state.isOffline = true;\n };\n\n /**\n * Load sync queue from localStorage\n */\n private loadSyncQueue(): void {\n if (!this.storage) return;\n\n try {\n const stored = this.storage.getItem('orbital-offline-queue');\n if (stored) {\n this.state.syncQueue = JSON.parse(stored);\n }\n } catch (error) {\n console.warn('[OfflineExecutor] Failed to load sync queue:', error);\n }\n }\n\n /**\n * Save sync queue to localStorage\n */\n private saveSyncQueue(): void {\n if (!this.storage) return;\n\n try {\n this.storage.setItem('orbital-offline-queue', JSON.stringify(this.state.syncQueue));\n } catch (error) {\n console.warn('[OfflineExecutor] Failed to save sync queue:', error);\n }\n }\n\n /**\n * Add an effect to the sync queue\n */\n private queueForSync(type: string, payload: unknown): void {\n if (!this.config.enableSyncQueue) return;\n\n const effect: PendingSyncEffect = {\n id: generateEffectId(),\n timestamp: Date.now(),\n type,\n payload,\n retries: 0,\n maxRetries: 3,\n };\n\n // Add to queue, respecting max size\n this.state.syncQueue.push(effect);\n if (this.state.syncQueue.length > (this.config.maxQueueSize ?? 100)) {\n this.state.syncQueue.shift(); // Remove oldest\n }\n\n this.saveSyncQueue();\n\n // Notify listeners\n this.config.onEffectQueued?.(effect);\n this.config.onQueueChange?.(this.state.syncQueue);\n }\n\n /**\n * Execute client effects immediately.\n */\n executeClientEffects(effects: ClientEffect[]): void {\n if (effects.length === 0) return;\n\n executeClientEffects(effects, this.config);\n this.state.localEffectsProcessed += effects.length;\n }\n\n /**\n * Process an event in offline mode.\n *\n * Returns a simulated EventResponse with mock data.\n * Client effects are executed immediately.\n * Server effects are queued for sync.\n */\n processEventOffline(\n event: string,\n payload?: Record<string, unknown>,\n effects?: Array<unknown[]>\n ): EventResponse {\n const clientEffects: ClientEffect[] = [];\n const fetchedData: Record<string, unknown[]> = {};\n\n // Process effects\n if (effects) {\n for (const effect of effects) {\n if (!Array.isArray(effect) || effect.length < 1) continue;\n\n const [type, ...args] = effect as [string, ...unknown[]];\n\n switch (type) {\n // Client effects - execute immediately\n case 'render-ui':\n case 'navigate':\n case 'notify':\n case 'emit':\n clientEffects.push(effect as ClientEffect);\n break;\n\n // Fetch effect - use mock data\n case 'fetch': {\n const [entityName, _query] = args;\n if (typeof entityName === 'string' && this.config.mockDataProvider) {\n fetchedData[entityName] = this.config.mockDataProvider(entityName);\n }\n break;\n }\n\n // Server effects - queue for sync\n case 'persist':\n case 'call-service':\n case 'spawn':\n case 'despawn':\n this.queueForSync(type, { args, event, payload });\n break;\n\n default:\n console.warn(`[OfflineExecutor] Unknown effect type: ${type}`);\n }\n }\n }\n\n // Execute client effects\n if (clientEffects.length > 0) {\n this.executeClientEffects(clientEffects);\n }\n\n return {\n success: true,\n data: Object.keys(fetchedData).length > 0 ? fetchedData : undefined,\n clientEffects: clientEffects.length > 0 ? clientEffects : undefined,\n };\n }\n\n /**\n * Sync pending effects to server.\n *\n * @param serverUrl - Base URL for the orbital server\n * @param authToken - Optional auth token for requests\n * @returns Number of successfully synced effects\n */\n async syncPendingEffects(\n serverUrl: string,\n authToken?: string\n ): Promise<number> {\n if (this.state.syncQueue.length === 0) {\n return 0;\n }\n\n this.state.lastSyncAttempt = Date.now();\n let syncedCount = 0;\n const failedEffects: PendingSyncEffect[] = [];\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (authToken) {\n headers['Authorization'] = `Bearer ${authToken}`;\n }\n\n for (const effect of this.state.syncQueue) {\n try {\n const response = await fetch(`${serverUrl}/sync-effect`, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n type: effect.type,\n payload: effect.payload,\n offlineId: effect.id,\n offlineTimestamp: effect.timestamp,\n }),\n });\n\n if (response.ok) {\n syncedCount++;\n } else {\n // Increment retry count\n effect.retries++;\n if (effect.retries < effect.maxRetries) {\n failedEffects.push(effect);\n }\n }\n } catch (error) {\n // Network error - keep in queue\n effect.retries++;\n if (effect.retries < effect.maxRetries) {\n failedEffects.push(effect);\n }\n }\n }\n\n // Update queue with failed effects\n this.state.syncQueue = failedEffects;\n this.state.effectsSynced += syncedCount;\n\n if (syncedCount > 0) {\n this.state.lastSuccessfulSync = Date.now();\n }\n\n this.saveSyncQueue();\n this.config.onQueueChange?.(this.state.syncQueue);\n\n return syncedCount;\n }\n\n /**\n * Get current executor state\n */\n getState(): OfflineExecutorState {\n return { ...this.state };\n }\n\n /**\n * Get number of pending effects\n */\n getPendingCount(): number {\n return this.state.syncQueue.length;\n }\n\n /**\n * Clear the sync queue\n */\n clearQueue(): void {\n this.state.syncQueue = [];\n this.saveSyncQueue();\n this.config.onQueueChange?.(this.state.syncQueue);\n }\n\n /**\n * Dispose the executor and clean up listeners\n */\n dispose(): void {\n if (typeof window !== 'undefined') {\n window.removeEventListener('online', this.handleOnline);\n window.removeEventListener('offline', this.handleOffline);\n }\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\n/**\n * Create an offline executor with sensible defaults.\n *\n * @example\n * ```typescript\n * const executor = createOfflineExecutor({\n * renderToSlot: slotManager.render,\n * navigate: router.push,\n * notify: toast.show,\n * eventBus: { emit: bus.emit },\n * mockDataProvider: (entity) => store.getAll(entity),\n * });\n * ```\n */\nexport function createOfflineExecutor(\n config: OfflineExecutorConfig\n): OfflineExecutor {\n return new OfflineExecutor(config);\n}\n\n// ============================================================================\n// React Hook (optional integration)\n// ============================================================================\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\n\n/**\n * Options for useOfflineExecutor hook\n */\nexport interface UseOfflineExecutorOptions extends OfflineExecutorConfig {\n /** Server URL for syncing */\n serverUrl?: string;\n /** Auth token for server requests */\n authToken?: string;\n /** Auto-sync when coming back online */\n autoSync?: boolean;\n}\n\n/**\n * Result of useOfflineExecutor hook\n */\nexport interface UseOfflineExecutorResult {\n /** Current executor state */\n state: OfflineExecutorState;\n /** Whether we're offline */\n isOffline: boolean;\n /** Number of pending effects */\n pendingCount: number;\n /** Execute client effects */\n executeClientEffects: (effects: ClientEffect[]) => void;\n /** Process event offline */\n processEventOffline: (\n event: string,\n payload?: Record<string, unknown>,\n effects?: Array<unknown[]>\n ) => EventResponse;\n /** Manually trigger sync */\n sync: () => Promise<number>;\n /** Clear the queue */\n clearQueue: () => void;\n}\n\n/**\n * React hook for offline effect execution.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { isOffline, pendingCount, processEventOffline, sync } = useOfflineExecutor({\n * renderToSlot: slotManager.render,\n * navigate: router.push,\n * notify: toast.show,\n * eventBus: { emit: bus.emit },\n * serverUrl: '/api/orbitals',\n * autoSync: true,\n * });\n *\n * return (\n * <div>\n * {isOffline && <Banner>Offline - {pendingCount} changes pending</Banner>}\n * <button onClick={() => processEventOffline('SAVE', data)}>Save</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useOfflineExecutor(\n options: UseOfflineExecutorOptions\n): UseOfflineExecutorResult {\n const executorRef = useRef<OfflineExecutor | null>(null);\n const [state, setState] = useState<OfflineExecutorState>({\n isOffline: false,\n syncQueue: [],\n localEffectsProcessed: 0,\n effectsSynced: 0,\n });\n\n // Create executor on mount\n useEffect(() => {\n const executor = new OfflineExecutor({\n ...options,\n onQueueChange: (queue) => {\n setState(executor.getState());\n options.onQueueChange?.(queue);\n },\n });\n\n executorRef.current = executor;\n setState(executor.getState());\n\n return () => {\n executor.dispose();\n executorRef.current = null;\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Auto-sync when coming online\n useEffect(() => {\n if (!options.autoSync || !options.serverUrl) return;\n\n const handleOnline = async () => {\n if (executorRef.current) {\n await executorRef.current.syncPendingEffects(\n options.serverUrl!,\n options.authToken\n );\n setState(executorRef.current.getState());\n }\n };\n\n window.addEventListener('online', handleOnline);\n return () => window.removeEventListener('online', handleOnline);\n }, [options.autoSync, options.serverUrl, options.authToken]);\n\n const executeEffects = useCallback((effects: ClientEffect[]) => {\n executorRef.current?.executeClientEffects(effects);\n if (executorRef.current) {\n setState(executorRef.current.getState());\n }\n }, []);\n\n const processEventOffline = useCallback(\n (event: string, payload?: Record<string, unknown>, effects?: Array<unknown[]>) => {\n const result = executorRef.current?.processEventOffline(event, payload, effects);\n if (executorRef.current) {\n setState(executorRef.current.getState());\n }\n return result ?? { success: false, error: 'Executor not initialized' };\n },\n []\n );\n\n const sync = useCallback(async () => {\n if (!executorRef.current || !options.serverUrl) return 0;\n const count = await executorRef.current.syncPendingEffects(\n options.serverUrl,\n options.authToken\n );\n setState(executorRef.current.getState());\n return count;\n }, [options.serverUrl, options.authToken]);\n\n const clearQueue = useCallback(() => {\n executorRef.current?.clearQueue();\n if (executorRef.current) {\n setState(executorRef.current.getState());\n }\n }, []);\n\n return {\n state,\n isOffline: state.isOffline,\n pendingCount: state.syncQueue.length,\n executeClientEffects: executeEffects,\n processEventOffline,\n sync,\n clearQueue,\n };\n}\n","/**\n * OfflineModeProvider\n *\n * Context provider that wraps useOfflineExecutor with force-offline toggle support.\n * Enables testing offline behavior without actually disconnecting.\n *\n * @packageDocumentation\n */\n\nimport React, { createContext, useContext, useState, useCallback, useMemo } from 'react';\nimport {\n useOfflineExecutor,\n type UseOfflineExecutorOptions,\n type UseOfflineExecutorResult,\n type OfflineExecutorState,\n} from '../renderer/offline-executor';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface OfflineModeContextValue extends UseOfflineExecutorResult {\n /** Force offline mode for testing */\n forceOffline: boolean;\n /** Toggle force offline mode */\n setForceOffline: (value: boolean) => void;\n /** Whether effectively offline (real or forced) */\n effectivelyOffline: boolean;\n}\n\nexport interface OfflineModeProviderProps extends UseOfflineExecutorOptions {\n children: React.ReactNode;\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst OfflineModeContext = createContext<OfflineModeContextValue | null>(null);\n\n// ============================================================================\n// Provider\n// ============================================================================\n\n/**\n * OfflineModeProvider - Wraps offline executor with force-offline support.\n *\n * @example\n * ```tsx\n * function App() {\n * return (\n * <OfflineModeProvider\n * serverUrl=\"/api/orbitals\"\n * authToken={token}\n * autoSync={true}\n * renderToSlot={slotManager.render}\n * navigate={router.push}\n * notify={toast.show}\n * eventBus={{ emit: bus.emit }}\n * >\n * <PreviewPage />\n * </OfflineModeProvider>\n * );\n * }\n * ```\n */\nexport function OfflineModeProvider({\n children,\n ...executorOptions\n}: OfflineModeProviderProps): React.ReactElement {\n const [forceOffline, setForceOffline] = useState(false);\n\n const executor = useOfflineExecutor(executorOptions);\n\n // Effectively offline if actually offline OR force-offline is enabled\n const effectivelyOffline = executor.isOffline || forceOffline;\n\n const contextValue = useMemo<OfflineModeContextValue>(\n () => ({\n ...executor,\n forceOffline,\n setForceOffline,\n effectivelyOffline,\n }),\n [executor, forceOffline, effectivelyOffline]\n );\n\n return (\n <OfflineModeContext.Provider value={contextValue}>\n {children}\n </OfflineModeContext.Provider>\n );\n}\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\n/**\n * Access offline mode context.\n *\n * @example\n * ```tsx\n * function OfflineToggle() {\n * const {\n * effectivelyOffline,\n * forceOffline,\n * setForceOffline,\n * pendingCount,\n * sync,\n * } = useOfflineMode();\n *\n * return (\n * <div>\n * <Toggle\n * checked={forceOffline}\n * onChange={setForceOffline}\n * >\n * Test Offline\n * </Toggle>\n * {pendingCount > 0 && <Badge>{pendingCount} pending</Badge>}\n * <Button onClick={sync}>Sync Now</Button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useOfflineMode(): OfflineModeContextValue {\n const context = useContext(OfflineModeContext);\n if (!context) {\n throw new Error('useOfflineMode must be used within OfflineModeProvider');\n }\n return context;\n}\n\n/**\n * Check if offline mode provider is available (optional usage).\n */\nexport function useOptionalOfflineMode(): OfflineModeContextValue | null {\n return useContext(OfflineModeContext);\n}\n\nexport default OfflineModeProvider;\n"]}
|