@hai3/react 0.2.0-alpha.2 → 0.2.0-alpha.3
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.cjs +3 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +24 -3
- package/dist/index.d.ts +24 -3
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.cts +1 -1
- package/dist/types.d.ts +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -68,7 +68,7 @@ __export(src_exports, {
|
|
|
68
68
|
createStore: () => import_framework2.createStore,
|
|
69
69
|
createThemeRegistry: () => import_framework2.createThemeRegistry,
|
|
70
70
|
effects: () => import_framework2.effects,
|
|
71
|
-
eventBus: () =>
|
|
71
|
+
eventBus: () => eventBus,
|
|
72
72
|
footerActions: () => import_framework2.footerActions,
|
|
73
73
|
footerSlice: () => import_framework2.footerSlice,
|
|
74
74
|
getLanguageMetadata: () => import_framework2.getLanguageMetadata,
|
|
@@ -454,6 +454,8 @@ var AppRouter = ({
|
|
|
454
454
|
// src/index.ts
|
|
455
455
|
var import_framework2 = require("@hai3/framework");
|
|
456
456
|
var import_framework3 = require("@hai3/framework");
|
|
457
|
+
var import_framework4 = require("@hai3/framework");
|
|
458
|
+
var eventBus = import_framework4.eventBus;
|
|
457
459
|
// Annotate the CommonJS export names for ESM import in node:
|
|
458
460
|
0 && (module.exports = {
|
|
459
461
|
ACCOUNTS_DOMAIN,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/HAI3Provider.tsx","../src/HAI3Context.tsx","../src/hooks/useAppDispatch.ts","../src/hooks/useAppSelector.ts","../src/hooks/useTranslation.ts","../src/hooks/useScreenTranslations.ts","../src/hooks/useNavigation.ts","../src/hooks/useTheme.ts","../src/components/AppRouter.tsx"],"sourcesContent":["/**\n * @hai3/react - React Bindings\n *\n * This package provides:\n * - HAI3Provider context provider\n * - Type-safe hooks for state and actions\n * - AppRouter for screen rendering\n *\n * Layer: L3 (Depends on @hai3/framework)\n */\n\n// ============================================================================\n// Provider\n// ============================================================================\n\nexport { HAI3Provider } from './HAI3Provider';\nexport { HAI3Context, useHAI3 } from './HAI3Context';\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\nexport {\n useAppDispatch,\n useAppSelector,\n useTranslation,\n useScreenTranslations,\n useNavigation,\n useTheme,\n} from './hooks';\n\n// ============================================================================\n// Components\n// ============================================================================\n\nexport { AppRouter } from './components';\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\nexport type {\n HAI3ProviderProps,\n UseHAI3Return,\n UseAppSelector,\n UseAppDispatchReturn,\n UseTranslationReturn,\n UseScreenTranslationsReturn,\n UseLanguageReturn,\n UseThemeReturn,\n UseMenuReturn,\n UseScreenReturn,\n UseNavigationReturn,\n UseScreensetReturn,\n UsePopupReturn,\n UseOverlayReturn,\n AppRouterProps,\n HAI3ProviderComponent,\n AppRouterComponent,\n} from './types';\n\n// ============================================================================\n// Re-exports from @hai3/framework for convenience\n// ============================================================================\n\n// These re-exports allow users to import everything from @hai3/react\n// without needing to import from @hai3/framework directly\n\nexport {\n // Core\n createHAI3,\n createHAI3App,\n presets,\n\n // Backward compatibility singletons\n screensetRegistry,\n\n // Backward compatibility constants\n ACCOUNTS_DOMAIN,\n\n // I18nRegistry class (capital I for backward compat)\n I18nRegistry,\n\n // Plugins\n screensets,\n themes,\n layout,\n navigation,\n routing,\n i18n,\n effects,\n\n // Registries\n createScreensetRegistry,\n createThemeRegistry,\n createRouteRegistry,\n\n // Flux (Event bus + Store)\n eventBus,\n\n // Store\n createStore,\n getStore,\n registerSlice,\n hasSlice,\n createSlice,\n\n // Layout domain exports\n LayoutDomain,\n ScreensetCategory,\n layoutReducer,\n layoutDomainReducers,\n LAYOUT_SLICE_NAME,\n headerSlice,\n footerSlice,\n menuSlice,\n sidebarSlice,\n screenSlice,\n popupSlice,\n overlaySlice,\n headerActions,\n footerActions,\n menuActions,\n sidebarActions,\n screenActions,\n popupActions,\n overlayActions,\n // Individual reducer functions - header\n setUser,\n setHeaderLoading,\n clearUser,\n // Individual reducer functions - footer\n setFooterVisible,\n setFooterConfig,\n toggleMenu,\n setMenuCollapsed,\n setMenuItems,\n setMenuVisible,\n setMenuConfig,\n toggleSidebar,\n setSidebarCollapsed,\n setSidebarPosition,\n setSidebarTitle,\n setSidebarContent,\n setSidebarVisible,\n setSidebarWidth,\n setSidebarConfig,\n setActiveScreen,\n setScreenLoading,\n navigateTo,\n clearActiveScreen,\n openPopup,\n closePopup,\n closeTopPopup,\n closeAllPopups,\n showOverlay,\n hideOverlay,\n setOverlayVisible,\n\n // Tenant (app-level, not layout)\n TENANT_SLICE_NAME,\n tenantSlice,\n tenantActions,\n tenantReducer,\n setTenant,\n setTenantLoading,\n clearTenant,\n // Tenant effects and events\n initTenantEffects,\n changeTenant,\n clearTenantAction,\n setTenantLoadingState,\n TenantEvents,\n\n // Mock (app-level, not layout)\n mockSlice,\n mockActions,\n setMockEnabled,\n // Mock effects and events\n initMockEffects,\n toggleMockMode,\n MockEvents,\n\n // API\n apiRegistry,\n BaseApiService,\n RestProtocol,\n SseProtocol,\n // Protocol-specific mock plugins (replaces generic MockPlugin)\n RestMockPlugin,\n SseMockPlugin,\n MockEventSource,\n // Plugin base classes\n ApiPluginBase,\n ApiPlugin,\n ApiProtocol,\n RestPlugin,\n RestPluginWithConfig,\n SsePlugin,\n SsePluginWithConfig,\n // Type guards\n isShortCircuit,\n isRestShortCircuit,\n isSseShortCircuit,\n // Mock plugin identification\n MOCK_PLUGIN,\n isMockPlugin,\n\n // I18n\n i18nRegistry,\n I18nRegistryImpl,\n createI18nRegistry,\n SUPPORTED_LANGUAGES,\n getLanguageMetadata,\n} from '@hai3/framework';\n\n// Re-export i18n types from @hai3/framework (correct layer access)\nexport { Language, TextDirection, LanguageDisplayMode } from '@hai3/framework';\n\n// Re-export types from @hai3/framework\nexport type {\n // Config\n HAI3Config,\n HAI3Plugin,\n HAI3AppBuilder,\n HAI3App,\n PluginFactory,\n PluginProvides,\n PluginLifecycle,\n ScreensetRegistry,\n ThemeRegistry,\n ThemeConfig,\n RouteRegistry,\n Preset,\n Presets,\n ScreensetsConfig,\n NavigateToScreenPayload,\n NavigateToScreensetPayload,\n ShowPopupPayload,\n ChangeThemePayload,\n SetLanguagePayload,\n\n // Flux (Events + Store)\n EventPayloadMap,\n EventHandler,\n Subscription,\n\n // Store\n RootState,\n AppDispatch,\n SliceObject,\n HAI3Store,\n\n // Layout\n ScreensetId,\n ScreenId,\n MenuItemConfig,\n ScreenLoader,\n ScreenConfig,\n MenuScreenItem,\n ScreensetDefinition,\n LayoutDomainState,\n HeaderUser,\n HeaderConfig,\n HeaderState,\n FooterConfig,\n FooterState,\n MenuItem,\n MenuState,\n SidebarPosition,\n SidebarState,\n ScreenState,\n PopupConfig,\n PopupState,\n PopupSliceState,\n OverlayConfig,\n OverlayState,\n LayoutState,\n RootStateWithLayout,\n LayoutDomainReducers,\n\n // Tenant types\n Tenant,\n TenantState,\n TenantChangedPayload,\n TenantClearedPayload,\n\n // Mock types\n MockState,\n MockTogglePayload,\n\n // API\n MockMap,\n ApiServiceConfig,\n JsonValue,\n JsonObject,\n JsonPrimitive,\n JsonCompatible,\n SseProtocolConfig,\n RestProtocolConfig,\n // Plugin context types (class-based plugin system)\n ApiRequestContext,\n ApiResponseContext,\n ShortCircuitResponse,\n PluginClass,\n ProtocolClass,\n ProtocolPluginType,\n BasePluginHooks,\n // Protocol-specific types\n RestPluginHooks,\n SsePluginHooks,\n RestRequestContext,\n RestResponseContext,\n ApiPluginErrorContext,\n SseConnectContext,\n EventSourceLike,\n RestShortCircuitResponse,\n SseShortCircuitResponse,\n RestMockConfig,\n SseMockConfig,\n SseMockEvent,\n\n // Backward compatibility type aliases\n ScreensetConfig,\n\n // Theme types\n ThemeApplyFn,\n UikitTheme,\n\n // I18n\n I18nConfig,\n TranslationLoader,\n TranslationMap,\n TranslationDictionary,\n LanguageMetadata,\n I18nRegistryType,\n} from '@hai3/framework';\n","/**\n * HAI3 Provider - Main provider component for HAI3 applications\n *\n * React Layer: L3 (Depends on @hai3/framework)\n */\n\nimport React, { useMemo, useEffect } from 'react';\nimport { Provider as ReduxProvider } from 'react-redux';\nimport { createHAI3App } from '@hai3/framework';\nimport type { HAI3App } from '@hai3/framework';\nimport { HAI3Context } from './HAI3Context';\nimport type { HAI3ProviderProps } from './types';\n\n/**\n * HAI3 Provider Component\n *\n * Provides the HAI3 application context to all child components.\n * Creates the HAI3 app instance with the full preset by default.\n *\n * @example\n * ```tsx\n * // Default - creates app with full preset\n * <HAI3Provider>\n * <App />\n * </HAI3Provider>\n *\n * // With configuration\n * <HAI3Provider config={{ devMode: true }}>\n * <App />\n * </HAI3Provider>\n *\n * // With pre-built app\n * const app = createHAI3().use(screensets()).build();\n * <HAI3Provider app={app}>\n * <App />\n * </HAI3Provider>\n * ```\n */\nexport const HAI3Provider: React.FC<HAI3ProviderProps> = ({\n children,\n config,\n app: providedApp,\n}) => {\n // Create or use provided app instance\n const app = useMemo<HAI3App>(() => {\n if (providedApp) {\n return providedApp;\n }\n\n return createHAI3App(config);\n }, [providedApp, config]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n // Only destroy if we created the app (not provided)\n if (!providedApp) {\n app.destroy();\n }\n };\n }, [app, providedApp]);\n\n return (\n <HAI3Context.Provider value={app}>\n <ReduxProvider store={app.store as Parameters<typeof ReduxProvider>[0]['store']}>\n {children}\n </ReduxProvider>\n </HAI3Context.Provider>\n );\n};\n","/**\n * HAI3 Context - React context for HAI3 application\n *\n * React Layer: L3 (Depends on @hai3/framework)\n */\n\nimport { createContext, useContext } from 'react';\nimport type { HAI3App } from '@hai3/framework';\n\n// ============================================================================\n// Context Definition\n// ============================================================================\n\n/**\n * HAI3 Context\n * Holds the HAI3 app instance for the application.\n */\nexport const HAI3Context = createContext<HAI3App | null>(null);\n\n/**\n * Use the HAI3 context.\n * Throws if used outside of HAI3Provider.\n *\n * @returns The HAI3 app instance\n */\nexport function useHAI3(): HAI3App {\n const context = useContext(HAI3Context);\n\n if (!context) {\n throw new Error(\n 'useHAI3 must be used within a HAI3Provider. ' +\n 'Wrap your application with <HAI3Provider> to access HAI3 features.'\n );\n }\n\n return context;\n}\n","/**\n * useAppDispatch Hook - Type-safe dispatch hook\n *\n * React Layer: L3\n */\n\nimport { useDispatch } from 'react-redux';\nimport type { AppDispatch } from '@hai3/framework';\n\n/**\n * Type-safe dispatch hook.\n *\n * @returns The typed dispatch function\n *\n * @example\n * ```tsx\n * const dispatch = useAppDispatch();\n * dispatch(someAction());\n * ```\n */\nexport function useAppDispatch(): AppDispatch {\n // Use untyped useDispatch and cast the result\n // This avoids type constraint issues with react-redux's generic\n return useDispatch() as AppDispatch;\n}\n","/**\n * useAppSelector Hook - Type-safe selector hook\n *\n * React Layer: L3\n */\n\nimport { useSelector, type TypedUseSelectorHook } from 'react-redux';\nimport type { RootState } from '@hai3/framework';\n\n/**\n * Type-safe selector hook.\n *\n * @example\n * ```tsx\n * const activeScreen = useAppSelector(selectActiveScreen);\n * const menuCollapsed = useAppSelector(selectMenuCollapsed);\n * ```\n */\nexport const useAppSelector: TypedUseSelectorHook<RootState> = useSelector;\n","/**\n * useTranslation Hook - Translation utilities\n *\n * React Layer: L3\n */\n\nimport { useMemo, useCallback, useSyncExternalStore } from 'react';\nimport type { Language } from '@hai3/framework';\nimport { useHAI3 } from '../HAI3Context';\nimport type { UseTranslationReturn } from '../types';\n\n/**\n * Hook for accessing translation utilities.\n *\n * @returns Translation utilities\n *\n * @example\n * ```tsx\n * const { t, language, setLanguage, isRTL } = useTranslation();\n *\n * return (\n * <div dir={isRTL ? 'rtl' : 'ltr'}>\n * <h1>{t('common:app.title')}</h1>\n * <p>{t('common:app.welcome', { name: 'John' })}</p>\n * </div>\n * );\n * ```\n */\nexport function useTranslation(): UseTranslationReturn {\n const app = useHAI3();\n const { i18nRegistry } = app;\n\n // Subscribe to translation changes using useSyncExternalStore\n // Uses version counter to trigger re-renders when translations change\n const version = useSyncExternalStore(\n useCallback(\n (callback: () => void) => {\n // Subscribe to translation changes (new translations registered)\n return i18nRegistry.subscribe(callback);\n },\n [i18nRegistry]\n ),\n () => i18nRegistry.getVersion(),\n () => i18nRegistry.getVersion()\n );\n\n // Get current language (memoized to avoid unnecessary recalculations)\n // version is used to trigger recalculation when translations change\n const language = useMemo(() => {\n void version; // Trigger recalculation when version changes\n return i18nRegistry.getLanguage();\n }, [i18nRegistry, version]);\n\n // Translation function\n const t = useCallback(\n (key: string, params?: Record<string, string | number | boolean>) => {\n return i18nRegistry.t(key, params);\n },\n [i18nRegistry]\n );\n\n // Set language function\n const setLanguage = useCallback(\n async (lang: Language) => {\n await i18nRegistry.setLanguage(lang);\n },\n [i18nRegistry]\n );\n\n // Check RTL - recomputes when language changes\n const isRTL = useMemo(() => {\n // Reference language to trigger recalculation on language change\n void language;\n return i18nRegistry.isRTL();\n }, [i18nRegistry, language]);\n\n return {\n t,\n language,\n setLanguage,\n isRTL,\n };\n}\n","/**\n * useScreenTranslations Hook - Screen-level translation loading\n *\n * React Layer: L3\n */\n\nimport { useState, useEffect, useMemo, useCallback, useSyncExternalStore } from 'react';\nimport type { TranslationMap, TranslationLoader } from '@hai3/framework';\nimport { useHAI3 } from '../HAI3Context';\nimport type { UseScreenTranslationsReturn } from '../types';\n\n// Re-export TranslationMap for consumers who need it\nexport type { TranslationMap };\n\n/**\n * Check if the input is a TranslationLoader function (from I18nRegistry.createLoader)\n * vs a TranslationMap object\n */\nfunction isTranslationLoader(\n input: TranslationMap | TranslationLoader\n): input is TranslationLoader {\n return typeof input === 'function';\n}\n\n/**\n * Hook for loading screen-level translations.\n * Use this in screen components to lazy-load translations.\n * Automatically reloads translations when language changes.\n *\n * @param screensetId - The screenset ID\n * @param screenId - The screen ID\n * @param translations - Either a TranslationMap object or a TranslationLoader function\n * (from I18nRegistry.createLoader)\n * @returns Loading state\n *\n * @example\n * ```tsx\n * // Option 1: Using I18nRegistry.createLoader (recommended)\n * const translations = I18nRegistry.createLoader({\n * en: () => import('./i18n/en.json'),\n * es: () => import('./i18n/es.json'),\n * });\n *\n * // Option 2: Using raw TranslationMap\n * const translations = {\n * en: () => import('./i18n/en.json'),\n * es: () => import('./i18n/es.json'),\n * };\n *\n * export const HomeScreen: React.FC = () => {\n * const { isLoaded, error } = useScreenTranslations(\n * 'demo',\n * 'home',\n * translations\n * );\n *\n * if (!isLoaded) return <LoadingSpinner />;\n * if (error) return <ErrorMessage error={error} />;\n *\n * return <div>...</div>;\n * };\n * ```\n */\nexport function useScreenTranslations(\n screensetId: string,\n screenId: string,\n translations: TranslationMap | TranslationLoader\n): UseScreenTranslationsReturn {\n const app = useHAI3();\n const { i18nRegistry } = app;\n\n // Track loading state per language to handle language changes\n const [loadedLanguage, setLoadedLanguage] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Subscribe to translation changes using useSyncExternalStore\n // This ensures we reload when language changes\n const version = useSyncExternalStore(\n useCallback(\n (callback: () => void) => i18nRegistry.subscribe(callback),\n [i18nRegistry]\n ),\n () => i18nRegistry.getVersion(),\n () => i18nRegistry.getVersion()\n );\n\n // Get current language (changes when version changes)\n // version is used to trigger recalculation when translations change\n const currentLanguage = useMemo(() => {\n void version; // Trigger recalculation when version changes\n return i18nRegistry.getLanguage();\n }, [i18nRegistry, version]);\n\n // Create a TranslationLoader function from the translation map or use directly if already a loader\n const loader: TranslationLoader = useMemo(() => {\n if (isTranslationLoader(translations)) {\n // Already a loader function (from I18nRegistry.createLoader)\n return translations;\n }\n\n // Convert TranslationMap to TranslationLoader\n return async (language: string) => {\n const importFn = translations[language as keyof typeof translations];\n if (!importFn) {\n // Return empty dictionary if language not in map\n return {};\n }\n const module = await importFn();\n return module.default;\n };\n }, [translations]);\n\n useEffect(() => {\n // Skip if no language or already loaded for this language\n if (!currentLanguage || currentLanguage === loadedLanguage) {\n return;\n }\n\n let cancelled = false;\n setIsLoading(true);\n\n const loadTranslations = async () => {\n try {\n const namespace = `screen.${screensetId}.${screenId}`;\n\n // Register the loader for future language changes\n i18nRegistry.registerLoader(namespace, loader);\n\n // Actually load the translations for current language\n const loadedTranslations = await loader(currentLanguage);\n i18nRegistry.register(namespace, currentLanguage, loadedTranslations);\n\n if (!cancelled) {\n setLoadedLanguage(currentLanguage);\n setIsLoading(false);\n setError(null);\n }\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setIsLoading(false);\n }\n }\n };\n\n loadTranslations();\n\n return () => {\n cancelled = true;\n };\n }, [screensetId, screenId, loader, i18nRegistry, currentLanguage, loadedLanguage]);\n\n // Derive isLoaded from whether we've loaded translations for the current language\n const isLoaded = currentLanguage !== null && currentLanguage === loadedLanguage && !isLoading;\n\n return { isLoaded, error };\n}\n","/**\n * useNavigation Hook - Navigation utilities\n *\n * React Layer: L3\n */\n\nimport { useCallback } from 'react';\nimport { useHAI3 } from '../HAI3Context';\nimport { useAppSelector } from './useAppSelector';\nimport type { RootStateWithLayout } from '@hai3/framework';\nimport type { UseNavigationReturn } from '../types';\n\n/**\n * Hook for navigation utilities.\n *\n * @returns Navigation utilities\n *\n * @example\n * ```tsx\n * const { navigateToScreen, navigateToScreenset, currentScreen } = useNavigation();\n *\n * return (\n * <button onClick={() => navigateToScreen('demo', 'home')}>\n * Go to Home\n * </button>\n * );\n * ```\n */\nexport function useNavigation(): UseNavigationReturn {\n const app = useHAI3();\n // Access state directly via useAppSelector - no selectors needed\n // Layout slices use flat keys like 'layout/screen', not nested 'layout.screen'\n const currentScreen = useAppSelector(\n (state) => {\n // Try flat key first (current SDK architecture)\n const flatKey = state as Record<string, { activeScreen?: string | null }>;\n if (flatKey['layout/screen']) {\n return flatKey['layout/screen'].activeScreen ?? null;\n }\n // Fallback to nested structure (for backward compatibility)\n const nested = state as unknown as RootStateWithLayout;\n return nested.layout?.screen?.activeScreen ?? null;\n }\n );\n\n // Navigate to a specific screen\n const navigateToScreen = useCallback(\n (screensetId: string, screenId: string) => {\n if (app.actions.navigateToScreen) {\n app.actions.navigateToScreen({ screensetId, screenId });\n }\n },\n [app.actions]\n );\n\n // Navigate to a screenset (uses default screen)\n const navigateToScreenset = useCallback(\n (screensetId: string) => {\n if (app.actions.navigateToScreenset) {\n app.actions.navigateToScreenset({ screensetId });\n }\n },\n [app.actions]\n );\n\n /**\n * Derived state: screenset looked up from currentScreen via routeRegistry.\n * Single source of truth (Redux), automatic reactivity.\n */\n const currentScreenset = currentScreen\n ? app.routeRegistry?.getScreensetForScreen(currentScreen) ?? null\n : null;\n\n return {\n navigateToScreen,\n navigateToScreenset,\n currentScreenset,\n currentScreen,\n };\n}\n","/**\n * useTheme Hook - Theme utilities\n *\n * React Layer: L3\n */\n\nimport { useCallback, useMemo, useSyncExternalStore } from 'react';\nimport { useHAI3 } from '../HAI3Context';\nimport type { UseThemeReturn } from '../types';\n\n/**\n * Hook for theme utilities.\n *\n * @returns Theme utilities\n *\n * @example\n * ```tsx\n * const { currentTheme, themes, setTheme } = useTheme();\n *\n * return (\n * <select\n * value={currentTheme}\n * onChange={(e) => setTheme(e.target.value)}\n * >\n * {themes.map((theme) => (\n * <option key={theme.id} value={theme.id}>\n * {theme.name}\n * </option>\n * ))}\n * </select>\n * );\n * ```\n */\nexport function useTheme(): UseThemeReturn {\n const app = useHAI3();\n const { themeRegistry } = app;\n\n // Subscribe to theme changes using useSyncExternalStore\n // Uses version counter to trigger re-renders when theme changes\n const version = useSyncExternalStore(\n useCallback(\n (callback: () => void) => {\n return themeRegistry.subscribe(callback);\n },\n [themeRegistry]\n ),\n () => themeRegistry.getVersion(),\n () => themeRegistry.getVersion()\n );\n\n // Get current theme (memoized, recalculates on version change)\n const currentTheme = useMemo(() => {\n // Reference version to trigger recalculation on theme change\n void version;\n const theme = themeRegistry.getCurrent();\n return theme?.id;\n }, [themeRegistry, version]);\n\n // Get all themes\n const themes = useMemo(() => {\n return themeRegistry.getAll().map((theme) => ({\n id: theme.id,\n name: theme.name,\n }));\n }, [themeRegistry]);\n\n // Set theme\n const setTheme = useCallback(\n (themeId: string) => {\n if (app.actions.changeTheme) {\n app.actions.changeTheme({ themeId });\n }\n },\n [app.actions]\n );\n\n return {\n currentTheme,\n themes,\n setTheme,\n };\n}\n","/**\n * AppRouter Component - Renders the active screen\n *\n * React Layer: L3\n */\n\nimport React, { Suspense, useState, useEffect } from 'react';\nimport { useHAI3 } from '../HAI3Context';\nimport { useNavigation } from '../hooks/useNavigation';\nimport type { AppRouterProps } from '../types';\n\n/**\n * AppRouter Component\n *\n * Renders the currently active screen based on navigation state.\n * Handles lazy loading and error boundaries.\n *\n * @example\n * ```tsx\n * <HAI3Provider>\n * <Layout>\n * <AppRouter\n * fallback={<LoadingSpinner />}\n * errorFallback={(error) => <ErrorPage error={error} />}\n * />\n * </Layout>\n * </HAI3Provider>\n * ```\n */\nexport const AppRouter: React.FC<AppRouterProps> = ({\n fallback = null,\n errorFallback,\n}) => {\n const app = useHAI3();\n const { currentScreenset, currentScreen } = useNavigation();\n const [ScreenComponent, setScreenComponent] = useState<React.ComponentType | null>(null);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n\n const loadScreen = async () => {\n if (!currentScreenset || !currentScreen) {\n setScreenComponent(null);\n return;\n }\n\n try {\n // Get screen loader from route registry\n const loader = app.routeRegistry.getScreen(currentScreenset, currentScreen);\n\n if (!loader) {\n throw new Error(\n `Screen \"${currentScreen}\" not found in screenset \"${currentScreenset}\".`\n );\n }\n\n // Load the screen component\n const module = await loader();\n\n if (!cancelled) {\n setScreenComponent(() => module.default);\n setError(null);\n }\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setScreenComponent(null);\n }\n }\n };\n\n loadScreen();\n\n return () => {\n cancelled = true;\n };\n }, [currentScreenset, currentScreen, app.routeRegistry]);\n\n // Handle error state\n if (error) {\n if (errorFallback) {\n if (typeof errorFallback === 'function') {\n return <>{errorFallback(error)}</>;\n }\n return <>{errorFallback}</>;\n }\n // Default error display\n return (\n <div className=\"p-5 text-destructive\">\n <h2>Error loading screen</h2>\n <p>{error.message}</p>\n </div>\n );\n }\n\n // Handle loading state\n if (!ScreenComponent) {\n return <>{fallback}</>;\n }\n\n // Render the screen component\n return (\n <Suspense fallback={fallback}>\n <ScreenComponent />\n </Suspense>\n );\n};\n"],"mappings":"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","names":["import_react","ReduxProvider","import_react_redux","import_react_redux","import_react","i18nRegistry","import_react","i18nRegistry","module","import_react","import_react","themes","import_react","import_jsx_runtime","module","import_framework"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/HAI3Provider.tsx","../src/HAI3Context.tsx","../src/hooks/useAppDispatch.ts","../src/hooks/useAppSelector.ts","../src/hooks/useTranslation.ts","../src/hooks/useScreenTranslations.ts","../src/hooks/useNavigation.ts","../src/hooks/useTheme.ts","../src/components/AppRouter.tsx"],"sourcesContent":["/**\n * @hai3/react - React Bindings\n *\n * This package provides:\n * - HAI3Provider context provider\n * - Type-safe hooks for state and actions\n * - AppRouter for screen rendering\n *\n * Layer: L3 (Depends on @hai3/framework)\n */\n\n// ============================================================================\n// Provider\n// ============================================================================\n\nexport { HAI3Provider } from './HAI3Provider';\nexport { HAI3Context, useHAI3 } from './HAI3Context';\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\nexport {\n useAppDispatch,\n useAppSelector,\n useTranslation,\n useScreenTranslations,\n useNavigation,\n useTheme,\n} from './hooks';\n\n// ============================================================================\n// Components\n// ============================================================================\n\nexport { AppRouter } from './components';\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\nexport type {\n HAI3ProviderProps,\n UseHAI3Return,\n UseAppSelector,\n UseAppDispatchReturn,\n UseTranslationReturn,\n UseScreenTranslationsReturn,\n UseLanguageReturn,\n UseThemeReturn,\n UseMenuReturn,\n UseScreenReturn,\n UseNavigationReturn,\n UseScreensetReturn,\n UsePopupReturn,\n UseOverlayReturn,\n AppRouterProps,\n HAI3ProviderComponent,\n AppRouterComponent,\n} from './types';\n\n// ============================================================================\n// Re-exports from @hai3/framework for convenience\n// ============================================================================\n\n// These re-exports allow users to import everything from @hai3/react\n// without needing to import from @hai3/framework directly\n\nexport {\n // Core\n createHAI3,\n createHAI3App,\n presets,\n\n // Backward compatibility singletons\n screensetRegistry,\n\n // Backward compatibility constants\n ACCOUNTS_DOMAIN,\n\n // I18nRegistry class (capital I for backward compat)\n I18nRegistry,\n\n // Plugins\n screensets,\n themes,\n layout,\n navigation,\n routing,\n i18n,\n effects,\n\n // Registries\n createScreensetRegistry,\n createThemeRegistry,\n createRouteRegistry,\n\n // Flux (Event bus + Store)\n // NOTE: eventBus is re-exported separately below with augmented EventPayloadMap type\n\n // Store\n createStore,\n getStore,\n registerSlice,\n hasSlice,\n createSlice,\n\n // Layout domain exports\n LayoutDomain,\n ScreensetCategory,\n layoutReducer,\n layoutDomainReducers,\n LAYOUT_SLICE_NAME,\n headerSlice,\n footerSlice,\n menuSlice,\n sidebarSlice,\n screenSlice,\n popupSlice,\n overlaySlice,\n headerActions,\n footerActions,\n menuActions,\n sidebarActions,\n screenActions,\n popupActions,\n overlayActions,\n // Individual reducer functions - header\n setUser,\n setHeaderLoading,\n clearUser,\n // Individual reducer functions - footer\n setFooterVisible,\n setFooterConfig,\n toggleMenu,\n setMenuCollapsed,\n setMenuItems,\n setMenuVisible,\n setMenuConfig,\n toggleSidebar,\n setSidebarCollapsed,\n setSidebarPosition,\n setSidebarTitle,\n setSidebarContent,\n setSidebarVisible,\n setSidebarWidth,\n setSidebarConfig,\n setActiveScreen,\n setScreenLoading,\n navigateTo,\n clearActiveScreen,\n openPopup,\n closePopup,\n closeTopPopup,\n closeAllPopups,\n showOverlay,\n hideOverlay,\n setOverlayVisible,\n\n // Tenant (app-level, not layout)\n TENANT_SLICE_NAME,\n tenantSlice,\n tenantActions,\n tenantReducer,\n setTenant,\n setTenantLoading,\n clearTenant,\n // Tenant effects and events\n initTenantEffects,\n changeTenant,\n clearTenantAction,\n setTenantLoadingState,\n TenantEvents,\n\n // Mock (app-level, not layout)\n mockSlice,\n mockActions,\n setMockEnabled,\n // Mock effects and events\n initMockEffects,\n toggleMockMode,\n MockEvents,\n\n // API\n apiRegistry,\n BaseApiService,\n RestProtocol,\n SseProtocol,\n // Protocol-specific mock plugins (replaces generic MockPlugin)\n RestMockPlugin,\n SseMockPlugin,\n MockEventSource,\n // Plugin base classes\n ApiPluginBase,\n ApiPlugin,\n ApiProtocol,\n RestPlugin,\n RestPluginWithConfig,\n SsePlugin,\n SsePluginWithConfig,\n // Type guards\n isShortCircuit,\n isRestShortCircuit,\n isSseShortCircuit,\n // Mock plugin identification\n MOCK_PLUGIN,\n isMockPlugin,\n\n // I18n\n i18nRegistry,\n I18nRegistryImpl,\n createI18nRegistry,\n SUPPORTED_LANGUAGES,\n getLanguageMetadata,\n} from '@hai3/framework';\n\n// Re-export i18n types from @hai3/framework (correct layer access)\nexport { Language, TextDirection, LanguageDisplayMode } from '@hai3/framework';\n\n// Re-export types from @hai3/framework\nexport type {\n // Config\n HAI3Config,\n HAI3Plugin,\n HAI3AppBuilder,\n HAI3App,\n PluginFactory,\n PluginProvides,\n PluginLifecycle,\n ScreensetRegistry,\n ThemeRegistry,\n ThemeConfig,\n RouteRegistry,\n Preset,\n Presets,\n ScreensetsConfig,\n NavigateToScreenPayload,\n NavigateToScreensetPayload,\n ShowPopupPayload,\n ChangeThemePayload,\n SetLanguagePayload,\n\n // Flux (Events + Store)\n EventHandler,\n Subscription,\n\n // Store\n RootState,\n AppDispatch,\n SliceObject,\n HAI3Store,\n\n // Layout\n ScreensetId,\n ScreenId,\n MenuItemConfig,\n ScreenLoader,\n ScreenConfig,\n MenuScreenItem,\n ScreensetDefinition,\n LayoutDomainState,\n HeaderUser,\n HeaderConfig,\n HeaderState,\n FooterConfig,\n FooterState,\n MenuItem,\n MenuState,\n SidebarPosition,\n SidebarState,\n ScreenState,\n PopupConfig,\n PopupState,\n PopupSliceState,\n OverlayConfig,\n OverlayState,\n LayoutState,\n RootStateWithLayout,\n LayoutDomainReducers,\n\n // Tenant types\n Tenant,\n TenantState,\n TenantChangedPayload,\n TenantClearedPayload,\n\n // Mock types\n MockState,\n MockTogglePayload,\n\n // API\n MockMap,\n ApiServiceConfig,\n JsonValue,\n JsonObject,\n JsonPrimitive,\n JsonCompatible,\n SseProtocolConfig,\n RestProtocolConfig,\n // Plugin context types (class-based plugin system)\n ApiRequestContext,\n ApiResponseContext,\n ShortCircuitResponse,\n PluginClass,\n ProtocolClass,\n ProtocolPluginType,\n BasePluginHooks,\n // Protocol-specific types\n RestPluginHooks,\n SsePluginHooks,\n RestRequestContext,\n RestResponseContext,\n ApiPluginErrorContext,\n SseConnectContext,\n EventSourceLike,\n RestShortCircuitResponse,\n SseShortCircuitResponse,\n RestMockConfig,\n SseMockConfig,\n SseMockEvent,\n\n // Backward compatibility type aliases\n ScreensetConfig,\n\n // Theme types\n ThemeApplyFn,\n UikitTheme,\n\n // I18n\n I18nConfig,\n TranslationLoader,\n TranslationMap,\n TranslationDictionary,\n LanguageMetadata,\n I18nRegistryType,\n} from '@hai3/framework';\n\n// ============================================================================\n// Module Augmentation Support - EventPayloadMap Re-declaration\n// ============================================================================\n\n/**\n * Re-declare EventPayloadMap to enable module augmentation on @hai3/react\n *\n * This creates a new declaration site in @hai3/react that TypeScript can augment.\n * App-layer code can now use `declare module '@hai3/react'` instead of importing\n * from L1 packages directly, maintaining proper layer architecture.\n *\n * ARCHITECTURE: This pattern allows L3+ code to augment event types without\n * violating layer boundaries by importing from L1 (@hai3/state).\n *\n * IMPORTANT: We must also re-export eventBus with the augmented type to ensure\n * type safety. The eventBus instance uses this augmented EventPayloadMap.\n *\n * @example\n * ```typescript\n * // In app-layer code (e.g., src/app/events/bootstrapEvents.ts)\n * import '@hai3/react';\n *\n * declare module '@hai3/react' {\n * interface EventPayloadMap {\n * 'app/user/fetch': void;\n * 'app/user/loaded': { user: ApiUser };\n * }\n * }\n * ```\n */\nimport type { EventPayloadMap as FrameworkEventPayloadMap } from '@hai3/framework';\nimport type { EventBus } from '@hai3/state';\nimport { eventBus as frameworkEventBus } from '@hai3/framework';\n\nexport interface EventPayloadMap extends FrameworkEventPayloadMap {}\n\n/**\n * Re-export eventBus with augmented EventPayloadMap type.\n * This ensures that code importing eventBus from @hai3/react gets\n * type-safe access to both framework events and app-layer augmented events.\n */\nexport const eventBus: EventBus<EventPayloadMap> = frameworkEventBus as EventBus<EventPayloadMap>;\n","/**\n * HAI3 Provider - Main provider component for HAI3 applications\n *\n * React Layer: L3 (Depends on @hai3/framework)\n */\n\nimport React, { useMemo, useEffect } from 'react';\nimport { Provider as ReduxProvider } from 'react-redux';\nimport { createHAI3App } from '@hai3/framework';\nimport type { HAI3App } from '@hai3/framework';\nimport { HAI3Context } from './HAI3Context';\nimport type { HAI3ProviderProps } from './types';\n\n/**\n * HAI3 Provider Component\n *\n * Provides the HAI3 application context to all child components.\n * Creates the HAI3 app instance with the full preset by default.\n *\n * @example\n * ```tsx\n * // Default - creates app with full preset\n * <HAI3Provider>\n * <App />\n * </HAI3Provider>\n *\n * // With configuration\n * <HAI3Provider config={{ devMode: true }}>\n * <App />\n * </HAI3Provider>\n *\n * // With pre-built app\n * const app = createHAI3().use(screensets()).build();\n * <HAI3Provider app={app}>\n * <App />\n * </HAI3Provider>\n * ```\n */\nexport const HAI3Provider: React.FC<HAI3ProviderProps> = ({\n children,\n config,\n app: providedApp,\n}) => {\n // Create or use provided app instance\n const app = useMemo<HAI3App>(() => {\n if (providedApp) {\n return providedApp;\n }\n\n return createHAI3App(config);\n }, [providedApp, config]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n // Only destroy if we created the app (not provided)\n if (!providedApp) {\n app.destroy();\n }\n };\n }, [app, providedApp]);\n\n return (\n <HAI3Context.Provider value={app}>\n <ReduxProvider store={app.store as Parameters<typeof ReduxProvider>[0]['store']}>\n {children}\n </ReduxProvider>\n </HAI3Context.Provider>\n );\n};\n","/**\n * HAI3 Context - React context for HAI3 application\n *\n * React Layer: L3 (Depends on @hai3/framework)\n */\n\nimport { createContext, useContext } from 'react';\nimport type { HAI3App } from '@hai3/framework';\n\n// ============================================================================\n// Context Definition\n// ============================================================================\n\n/**\n * HAI3 Context\n * Holds the HAI3 app instance for the application.\n */\nexport const HAI3Context = createContext<HAI3App | null>(null);\n\n/**\n * Use the HAI3 context.\n * Throws if used outside of HAI3Provider.\n *\n * @returns The HAI3 app instance\n */\nexport function useHAI3(): HAI3App {\n const context = useContext(HAI3Context);\n\n if (!context) {\n throw new Error(\n 'useHAI3 must be used within a HAI3Provider. ' +\n 'Wrap your application with <HAI3Provider> to access HAI3 features.'\n );\n }\n\n return context;\n}\n","/**\n * useAppDispatch Hook - Type-safe dispatch hook\n *\n * React Layer: L3\n */\n\nimport { useDispatch } from 'react-redux';\nimport type { AppDispatch } from '@hai3/framework';\n\n/**\n * Type-safe dispatch hook.\n *\n * @returns The typed dispatch function\n *\n * @example\n * ```tsx\n * const dispatch = useAppDispatch();\n * dispatch(someAction());\n * ```\n */\nexport function useAppDispatch(): AppDispatch {\n // Use untyped useDispatch and cast the result\n // This avoids type constraint issues with react-redux's generic\n return useDispatch() as AppDispatch;\n}\n","/**\n * useAppSelector Hook - Type-safe selector hook\n *\n * React Layer: L3\n */\n\nimport { useSelector, type TypedUseSelectorHook } from 'react-redux';\nimport type { RootState } from '@hai3/framework';\n\n/**\n * Type-safe selector hook.\n *\n * @example\n * ```tsx\n * const activeScreen = useAppSelector(selectActiveScreen);\n * const menuCollapsed = useAppSelector(selectMenuCollapsed);\n * ```\n */\nexport const useAppSelector: TypedUseSelectorHook<RootState> = useSelector;\n","/**\n * useTranslation Hook - Translation utilities\n *\n * React Layer: L3\n */\n\nimport { useMemo, useCallback, useSyncExternalStore } from 'react';\nimport type { Language } from '@hai3/framework';\nimport { useHAI3 } from '../HAI3Context';\nimport type { UseTranslationReturn } from '../types';\n\n/**\n * Hook for accessing translation utilities.\n *\n * @returns Translation utilities\n *\n * @example\n * ```tsx\n * const { t, language, setLanguage, isRTL } = useTranslation();\n *\n * return (\n * <div dir={isRTL ? 'rtl' : 'ltr'}>\n * <h1>{t('common:app.title')}</h1>\n * <p>{t('common:app.welcome', { name: 'John' })}</p>\n * </div>\n * );\n * ```\n */\nexport function useTranslation(): UseTranslationReturn {\n const app = useHAI3();\n const { i18nRegistry } = app;\n\n // Subscribe to translation changes using useSyncExternalStore\n // Uses version counter to trigger re-renders when translations change\n const version = useSyncExternalStore(\n useCallback(\n (callback: () => void) => {\n // Subscribe to translation changes (new translations registered)\n return i18nRegistry.subscribe(callback);\n },\n [i18nRegistry]\n ),\n () => i18nRegistry.getVersion(),\n () => i18nRegistry.getVersion()\n );\n\n // Get current language (memoized to avoid unnecessary recalculations)\n // version is used to trigger recalculation when translations change\n const language = useMemo(() => {\n void version; // Trigger recalculation when version changes\n return i18nRegistry.getLanguage();\n }, [i18nRegistry, version]);\n\n // Translation function\n const t = useCallback(\n (key: string, params?: Record<string, string | number | boolean>) => {\n return i18nRegistry.t(key, params);\n },\n [i18nRegistry]\n );\n\n // Set language function\n const setLanguage = useCallback(\n async (lang: Language) => {\n await i18nRegistry.setLanguage(lang);\n },\n [i18nRegistry]\n );\n\n // Check RTL - recomputes when language changes\n const isRTL = useMemo(() => {\n // Reference language to trigger recalculation on language change\n void language;\n return i18nRegistry.isRTL();\n }, [i18nRegistry, language]);\n\n return {\n t,\n language,\n setLanguage,\n isRTL,\n };\n}\n","/**\n * useScreenTranslations Hook - Screen-level translation loading\n *\n * React Layer: L3\n */\n\nimport { useState, useEffect, useMemo, useCallback, useSyncExternalStore } from 'react';\nimport type { TranslationMap, TranslationLoader } from '@hai3/framework';\nimport { useHAI3 } from '../HAI3Context';\nimport type { UseScreenTranslationsReturn } from '../types';\n\n// Re-export TranslationMap for consumers who need it\nexport type { TranslationMap };\n\n/**\n * Check if the input is a TranslationLoader function (from I18nRegistry.createLoader)\n * vs a TranslationMap object\n */\nfunction isTranslationLoader(\n input: TranslationMap | TranslationLoader\n): input is TranslationLoader {\n return typeof input === 'function';\n}\n\n/**\n * Hook for loading screen-level translations.\n * Use this in screen components to lazy-load translations.\n * Automatically reloads translations when language changes.\n *\n * @param screensetId - The screenset ID\n * @param screenId - The screen ID\n * @param translations - Either a TranslationMap object or a TranslationLoader function\n * (from I18nRegistry.createLoader)\n * @returns Loading state\n *\n * @example\n * ```tsx\n * // Option 1: Using I18nRegistry.createLoader (recommended)\n * const translations = I18nRegistry.createLoader({\n * en: () => import('./i18n/en.json'),\n * es: () => import('./i18n/es.json'),\n * });\n *\n * // Option 2: Using raw TranslationMap\n * const translations = {\n * en: () => import('./i18n/en.json'),\n * es: () => import('./i18n/es.json'),\n * };\n *\n * export const HomeScreen: React.FC = () => {\n * const { isLoaded, error } = useScreenTranslations(\n * 'demo',\n * 'home',\n * translations\n * );\n *\n * if (!isLoaded) return <LoadingSpinner />;\n * if (error) return <ErrorMessage error={error} />;\n *\n * return <div>...</div>;\n * };\n * ```\n */\nexport function useScreenTranslations(\n screensetId: string,\n screenId: string,\n translations: TranslationMap | TranslationLoader\n): UseScreenTranslationsReturn {\n const app = useHAI3();\n const { i18nRegistry } = app;\n\n // Track loading state per language to handle language changes\n const [loadedLanguage, setLoadedLanguage] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Subscribe to translation changes using useSyncExternalStore\n // This ensures we reload when language changes\n const version = useSyncExternalStore(\n useCallback(\n (callback: () => void) => i18nRegistry.subscribe(callback),\n [i18nRegistry]\n ),\n () => i18nRegistry.getVersion(),\n () => i18nRegistry.getVersion()\n );\n\n // Get current language (changes when version changes)\n // version is used to trigger recalculation when translations change\n const currentLanguage = useMemo(() => {\n void version; // Trigger recalculation when version changes\n return i18nRegistry.getLanguage();\n }, [i18nRegistry, version]);\n\n // Create a TranslationLoader function from the translation map or use directly if already a loader\n const loader: TranslationLoader = useMemo(() => {\n if (isTranslationLoader(translations)) {\n // Already a loader function (from I18nRegistry.createLoader)\n return translations;\n }\n\n // Convert TranslationMap to TranslationLoader\n return async (language: string) => {\n const importFn = translations[language as keyof typeof translations];\n if (!importFn) {\n // Return empty dictionary if language not in map\n return {};\n }\n const module = await importFn();\n return module.default;\n };\n }, [translations]);\n\n useEffect(() => {\n // Skip if no language or already loaded for this language\n if (!currentLanguage || currentLanguage === loadedLanguage) {\n return;\n }\n\n let cancelled = false;\n setIsLoading(true);\n\n const loadTranslations = async () => {\n try {\n const namespace = `screen.${screensetId}.${screenId}`;\n\n // Register the loader for future language changes\n i18nRegistry.registerLoader(namespace, loader);\n\n // Actually load the translations for current language\n const loadedTranslations = await loader(currentLanguage);\n i18nRegistry.register(namespace, currentLanguage, loadedTranslations);\n\n if (!cancelled) {\n setLoadedLanguage(currentLanguage);\n setIsLoading(false);\n setError(null);\n }\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setIsLoading(false);\n }\n }\n };\n\n loadTranslations();\n\n return () => {\n cancelled = true;\n };\n }, [screensetId, screenId, loader, i18nRegistry, currentLanguage, loadedLanguage]);\n\n // Derive isLoaded from whether we've loaded translations for the current language\n const isLoaded = currentLanguage !== null && currentLanguage === loadedLanguage && !isLoading;\n\n return { isLoaded, error };\n}\n","/**\n * useNavigation Hook - Navigation utilities\n *\n * React Layer: L3\n */\n\nimport { useCallback } from 'react';\nimport { useHAI3 } from '../HAI3Context';\nimport { useAppSelector } from './useAppSelector';\nimport type { RootStateWithLayout } from '@hai3/framework';\nimport type { UseNavigationReturn } from '../types';\n\n/**\n * Hook for navigation utilities.\n *\n * @returns Navigation utilities\n *\n * @example\n * ```tsx\n * const { navigateToScreen, navigateToScreenset, currentScreen } = useNavigation();\n *\n * return (\n * <button onClick={() => navigateToScreen('demo', 'home')}>\n * Go to Home\n * </button>\n * );\n * ```\n */\nexport function useNavigation(): UseNavigationReturn {\n const app = useHAI3();\n // Access state directly via useAppSelector - no selectors needed\n // Layout slices use flat keys like 'layout/screen', not nested 'layout.screen'\n const currentScreen = useAppSelector(\n (state) => {\n // Try flat key first (current SDK architecture)\n const flatKey = state as Record<string, { activeScreen?: string | null }>;\n if (flatKey['layout/screen']) {\n return flatKey['layout/screen'].activeScreen ?? null;\n }\n // Fallback to nested structure (for backward compatibility)\n const nested = state as unknown as RootStateWithLayout;\n return nested.layout?.screen?.activeScreen ?? null;\n }\n );\n\n // Navigate to a specific screen\n const navigateToScreen = useCallback(\n (screensetId: string, screenId: string) => {\n if (app.actions.navigateToScreen) {\n app.actions.navigateToScreen({ screensetId, screenId });\n }\n },\n [app.actions]\n );\n\n // Navigate to a screenset (uses default screen)\n const navigateToScreenset = useCallback(\n (screensetId: string) => {\n if (app.actions.navigateToScreenset) {\n app.actions.navigateToScreenset({ screensetId });\n }\n },\n [app.actions]\n );\n\n /**\n * Derived state: screenset looked up from currentScreen via routeRegistry.\n * Single source of truth (Redux), automatic reactivity.\n */\n const currentScreenset = currentScreen\n ? app.routeRegistry?.getScreensetForScreen(currentScreen) ?? null\n : null;\n\n return {\n navigateToScreen,\n navigateToScreenset,\n currentScreenset,\n currentScreen,\n };\n}\n","/**\n * useTheme Hook - Theme utilities\n *\n * React Layer: L3\n */\n\nimport { useCallback, useMemo, useSyncExternalStore } from 'react';\nimport { useHAI3 } from '../HAI3Context';\nimport type { UseThemeReturn } from '../types';\n\n/**\n * Hook for theme utilities.\n *\n * @returns Theme utilities\n *\n * @example\n * ```tsx\n * const { currentTheme, themes, setTheme } = useTheme();\n *\n * return (\n * <select\n * value={currentTheme}\n * onChange={(e) => setTheme(e.target.value)}\n * >\n * {themes.map((theme) => (\n * <option key={theme.id} value={theme.id}>\n * {theme.name}\n * </option>\n * ))}\n * </select>\n * );\n * ```\n */\nexport function useTheme(): UseThemeReturn {\n const app = useHAI3();\n const { themeRegistry } = app;\n\n // Subscribe to theme changes using useSyncExternalStore\n // Uses version counter to trigger re-renders when theme changes\n const version = useSyncExternalStore(\n useCallback(\n (callback: () => void) => {\n return themeRegistry.subscribe(callback);\n },\n [themeRegistry]\n ),\n () => themeRegistry.getVersion(),\n () => themeRegistry.getVersion()\n );\n\n // Get current theme (memoized, recalculates on version change)\n const currentTheme = useMemo(() => {\n // Reference version to trigger recalculation on theme change\n void version;\n const theme = themeRegistry.getCurrent();\n return theme?.id;\n }, [themeRegistry, version]);\n\n // Get all themes\n const themes = useMemo(() => {\n return themeRegistry.getAll().map((theme) => ({\n id: theme.id,\n name: theme.name,\n }));\n }, [themeRegistry]);\n\n // Set theme\n const setTheme = useCallback(\n (themeId: string) => {\n if (app.actions.changeTheme) {\n app.actions.changeTheme({ themeId });\n }\n },\n [app.actions]\n );\n\n return {\n currentTheme,\n themes,\n setTheme,\n };\n}\n","/**\n * AppRouter Component - Renders the active screen\n *\n * React Layer: L3\n */\n\nimport React, { Suspense, useState, useEffect } from 'react';\nimport { useHAI3 } from '../HAI3Context';\nimport { useNavigation } from '../hooks/useNavigation';\nimport type { AppRouterProps } from '../types';\n\n/**\n * AppRouter Component\n *\n * Renders the currently active screen based on navigation state.\n * Handles lazy loading and error boundaries.\n *\n * @example\n * ```tsx\n * <HAI3Provider>\n * <Layout>\n * <AppRouter\n * fallback={<LoadingSpinner />}\n * errorFallback={(error) => <ErrorPage error={error} />}\n * />\n * </Layout>\n * </HAI3Provider>\n * ```\n */\nexport const AppRouter: React.FC<AppRouterProps> = ({\n fallback = null,\n errorFallback,\n}) => {\n const app = useHAI3();\n const { currentScreenset, currentScreen } = useNavigation();\n const [ScreenComponent, setScreenComponent] = useState<React.ComponentType | null>(null);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n\n const loadScreen = async () => {\n if (!currentScreenset || !currentScreen) {\n setScreenComponent(null);\n return;\n }\n\n try {\n // Get screen loader from route registry\n const loader = app.routeRegistry.getScreen(currentScreenset, currentScreen);\n\n if (!loader) {\n throw new Error(\n `Screen \"${currentScreen}\" not found in screenset \"${currentScreenset}\".`\n );\n }\n\n // Load the screen component\n const module = await loader();\n\n if (!cancelled) {\n setScreenComponent(() => module.default);\n setError(null);\n }\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setScreenComponent(null);\n }\n }\n };\n\n loadScreen();\n\n return () => {\n cancelled = true;\n };\n }, [currentScreenset, currentScreen, app.routeRegistry]);\n\n // Handle error state\n if (error) {\n if (errorFallback) {\n if (typeof errorFallback === 'function') {\n return <>{errorFallback(error)}</>;\n }\n return <>{errorFallback}</>;\n }\n // Default error display\n return (\n <div className=\"p-5 text-destructive\">\n <h2>Error loading screen</h2>\n <p>{error.message}</p>\n </div>\n );\n }\n\n // Handle loading state\n if (!ScreenComponent) {\n return <>{fallback}</>;\n }\n\n // Render the screen component\n return (\n <Suspense fallback={fallback}>\n <ScreenComponent />\n </Suspense>\n );\n};\n"],"mappings":"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","names":["import_react","ReduxProvider","import_react_redux","import_react_redux","import_react","i18nRegistry","import_react","i18nRegistry","module","import_react","import_react","themes","import_react","import_jsx_runtime","module","import_framework","frameworkEventBus"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -2,9 +2,10 @@ import * as React from 'react';
|
|
|
2
2
|
import React__default from 'react';
|
|
3
3
|
import { HAI3ProviderProps, UseTranslationReturn, UseScreenTranslationsReturn, UseNavigationReturn, UseThemeReturn, AppRouterProps } from './types.cjs';
|
|
4
4
|
export { AppRouterComponent, HAI3ProviderComponent, UseAppDispatchReturn, UseAppSelector, UseHAI3Return, UseLanguageReturn, UseMenuReturn, UseOverlayReturn, UsePopupReturn, UseScreenReturn, UseScreensetReturn } from './types.cjs';
|
|
5
|
-
import { HAI3App, AppDispatch, RootState, TranslationMap, TranslationLoader } from '@hai3/framework';
|
|
6
|
-
export { ACCOUNTS_DOMAIN, ApiPlugin, ApiPluginBase, ApiPluginErrorContext, ApiProtocol, ApiRequestContext, ApiResponseContext, ApiServiceConfig, AppDispatch, BaseApiService, BasePluginHooks, ChangeThemePayload, EventHandler,
|
|
5
|
+
import { HAI3App, AppDispatch, RootState, TranslationMap, TranslationLoader, EventPayloadMap as EventPayloadMap$1 } from '@hai3/framework';
|
|
6
|
+
export { ACCOUNTS_DOMAIN, ApiPlugin, ApiPluginBase, ApiPluginErrorContext, ApiProtocol, ApiRequestContext, ApiResponseContext, ApiServiceConfig, AppDispatch, BaseApiService, BasePluginHooks, ChangeThemePayload, EventHandler, EventSourceLike, FooterConfig, FooterState, HAI3App, HAI3AppBuilder, HAI3Config, HAI3Plugin, HAI3Store, HeaderConfig, HeaderState, HeaderUser, I18nConfig, I18nRegistry, I18nRegistryImpl, I18nRegistryType, JsonCompatible, JsonObject, JsonPrimitive, JsonValue, LAYOUT_SLICE_NAME, Language, LanguageDisplayMode, LanguageMetadata, LayoutDomain, LayoutDomainReducers, LayoutDomainState, LayoutState, MOCK_PLUGIN, MenuItem, MenuItemConfig, MenuScreenItem, MenuState, MockEventSource, MockEvents, MockMap, MockState, MockTogglePayload, NavigateToScreenPayload, NavigateToScreensetPayload, OverlayConfig, OverlayState, PluginClass, PluginFactory, PluginLifecycle, PluginProvides, PopupConfig, PopupSliceState, PopupState, Preset, Presets, ProtocolClass, ProtocolPluginType, RestMockConfig, RestMockPlugin, RestPlugin, RestPluginHooks, RestPluginWithConfig, RestProtocol, RestProtocolConfig, RestRequestContext, RestResponseContext, RestShortCircuitResponse, RootState, RootStateWithLayout, RouteRegistry, SUPPORTED_LANGUAGES, ScreenConfig, ScreenId, ScreenLoader, ScreenState, ScreensetCategory, ScreensetConfig, ScreensetDefinition, ScreensetId, ScreensetRegistry, ScreensetsConfig, SetLanguagePayload, ShortCircuitResponse, ShowPopupPayload, SidebarPosition, SidebarState, SliceObject, SseConnectContext, SseMockConfig, SseMockEvent, SseMockPlugin, SsePlugin, SsePluginHooks, SsePluginWithConfig, SseProtocol, SseProtocolConfig, SseShortCircuitResponse, Subscription, TENANT_SLICE_NAME, Tenant, TenantChangedPayload, TenantClearedPayload, TenantEvents, TenantState, TextDirection, ThemeApplyFn, ThemeConfig, ThemeRegistry, TranslationDictionary, TranslationLoader, TranslationMap, UikitTheme, apiRegistry, changeTenant, clearActiveScreen, clearTenant, clearTenantAction, clearUser, closeAllPopups, closePopup, closeTopPopup, createHAI3, createHAI3App, createI18nRegistry, createRouteRegistry, createScreensetRegistry, createSlice, createStore, createThemeRegistry, effects, footerActions, footerSlice, getLanguageMetadata, getStore, hasSlice, headerActions, headerSlice, hideOverlay, i18n, i18nRegistry, initMockEffects, initTenantEffects, isMockPlugin, isRestShortCircuit, isShortCircuit, isSseShortCircuit, layout, layoutDomainReducers, layoutReducer, menuActions, menuSlice, mockActions, mockSlice, navigateTo, navigation, openPopup, overlayActions, overlaySlice, popupActions, popupSlice, presets, registerSlice, routing, screenActions, screenSlice, screensetRegistry, screensets, setActiveScreen, setFooterConfig, setFooterVisible, setHeaderLoading, setMenuCollapsed, setMenuConfig, setMenuItems, setMenuVisible, setMockEnabled, setOverlayVisible, setScreenLoading, setSidebarCollapsed, setSidebarConfig, setSidebarContent, setSidebarPosition, setSidebarTitle, setSidebarVisible, setSidebarWidth, setTenant, setTenantLoading, setTenantLoadingState, setUser, showOverlay, sidebarActions, sidebarSlice, tenantActions, tenantReducer, tenantSlice, themes, toggleMenu, toggleMockMode, toggleSidebar } from '@hai3/framework';
|
|
7
7
|
import { TypedUseSelectorHook } from 'react-redux';
|
|
8
|
+
import { EventBus } from '@hai3/state';
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* HAI3 Provider - Main provider component for HAI3 applications
|
|
@@ -241,4 +242,24 @@ declare function useTheme(): UseThemeReturn;
|
|
|
241
242
|
*/
|
|
242
243
|
declare const AppRouter: React__default.FC<AppRouterProps>;
|
|
243
244
|
|
|
244
|
-
|
|
245
|
+
/**
|
|
246
|
+
* @hai3/react - React Bindings
|
|
247
|
+
*
|
|
248
|
+
* This package provides:
|
|
249
|
+
* - HAI3Provider context provider
|
|
250
|
+
* - Type-safe hooks for state and actions
|
|
251
|
+
* - AppRouter for screen rendering
|
|
252
|
+
*
|
|
253
|
+
* Layer: L3 (Depends on @hai3/framework)
|
|
254
|
+
*/
|
|
255
|
+
|
|
256
|
+
interface EventPayloadMap extends EventPayloadMap$1 {
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Re-export eventBus with augmented EventPayloadMap type.
|
|
260
|
+
* This ensures that code importing eventBus from @hai3/react gets
|
|
261
|
+
* type-safe access to both framework events and app-layer augmented events.
|
|
262
|
+
*/
|
|
263
|
+
declare const eventBus: EventBus<EventPayloadMap>;
|
|
264
|
+
|
|
265
|
+
export { AppRouter, AppRouterProps, type EventPayloadMap, HAI3Context, HAI3Provider, HAI3ProviderProps, UseNavigationReturn, UseScreenTranslationsReturn, UseThemeReturn, UseTranslationReturn, eventBus, useAppDispatch, useAppSelector, useHAI3, useNavigation, useScreenTranslations, useTheme, useTranslation };
|
package/dist/index.d.ts
CHANGED
|
@@ -2,9 +2,10 @@ import * as React from 'react';
|
|
|
2
2
|
import React__default from 'react';
|
|
3
3
|
import { HAI3ProviderProps, UseTranslationReturn, UseScreenTranslationsReturn, UseNavigationReturn, UseThemeReturn, AppRouterProps } from './types.js';
|
|
4
4
|
export { AppRouterComponent, HAI3ProviderComponent, UseAppDispatchReturn, UseAppSelector, UseHAI3Return, UseLanguageReturn, UseMenuReturn, UseOverlayReturn, UsePopupReturn, UseScreenReturn, UseScreensetReturn } from './types.js';
|
|
5
|
-
import { HAI3App, AppDispatch, RootState, TranslationMap, TranslationLoader } from '@hai3/framework';
|
|
6
|
-
export { ACCOUNTS_DOMAIN, ApiPlugin, ApiPluginBase, ApiPluginErrorContext, ApiProtocol, ApiRequestContext, ApiResponseContext, ApiServiceConfig, AppDispatch, BaseApiService, BasePluginHooks, ChangeThemePayload, EventHandler,
|
|
5
|
+
import { HAI3App, AppDispatch, RootState, TranslationMap, TranslationLoader, EventPayloadMap as EventPayloadMap$1 } from '@hai3/framework';
|
|
6
|
+
export { ACCOUNTS_DOMAIN, ApiPlugin, ApiPluginBase, ApiPluginErrorContext, ApiProtocol, ApiRequestContext, ApiResponseContext, ApiServiceConfig, AppDispatch, BaseApiService, BasePluginHooks, ChangeThemePayload, EventHandler, EventSourceLike, FooterConfig, FooterState, HAI3App, HAI3AppBuilder, HAI3Config, HAI3Plugin, HAI3Store, HeaderConfig, HeaderState, HeaderUser, I18nConfig, I18nRegistry, I18nRegistryImpl, I18nRegistryType, JsonCompatible, JsonObject, JsonPrimitive, JsonValue, LAYOUT_SLICE_NAME, Language, LanguageDisplayMode, LanguageMetadata, LayoutDomain, LayoutDomainReducers, LayoutDomainState, LayoutState, MOCK_PLUGIN, MenuItem, MenuItemConfig, MenuScreenItem, MenuState, MockEventSource, MockEvents, MockMap, MockState, MockTogglePayload, NavigateToScreenPayload, NavigateToScreensetPayload, OverlayConfig, OverlayState, PluginClass, PluginFactory, PluginLifecycle, PluginProvides, PopupConfig, PopupSliceState, PopupState, Preset, Presets, ProtocolClass, ProtocolPluginType, RestMockConfig, RestMockPlugin, RestPlugin, RestPluginHooks, RestPluginWithConfig, RestProtocol, RestProtocolConfig, RestRequestContext, RestResponseContext, RestShortCircuitResponse, RootState, RootStateWithLayout, RouteRegistry, SUPPORTED_LANGUAGES, ScreenConfig, ScreenId, ScreenLoader, ScreenState, ScreensetCategory, ScreensetConfig, ScreensetDefinition, ScreensetId, ScreensetRegistry, ScreensetsConfig, SetLanguagePayload, ShortCircuitResponse, ShowPopupPayload, SidebarPosition, SidebarState, SliceObject, SseConnectContext, SseMockConfig, SseMockEvent, SseMockPlugin, SsePlugin, SsePluginHooks, SsePluginWithConfig, SseProtocol, SseProtocolConfig, SseShortCircuitResponse, Subscription, TENANT_SLICE_NAME, Tenant, TenantChangedPayload, TenantClearedPayload, TenantEvents, TenantState, TextDirection, ThemeApplyFn, ThemeConfig, ThemeRegistry, TranslationDictionary, TranslationLoader, TranslationMap, UikitTheme, apiRegistry, changeTenant, clearActiveScreen, clearTenant, clearTenantAction, clearUser, closeAllPopups, closePopup, closeTopPopup, createHAI3, createHAI3App, createI18nRegistry, createRouteRegistry, createScreensetRegistry, createSlice, createStore, createThemeRegistry, effects, footerActions, footerSlice, getLanguageMetadata, getStore, hasSlice, headerActions, headerSlice, hideOverlay, i18n, i18nRegistry, initMockEffects, initTenantEffects, isMockPlugin, isRestShortCircuit, isShortCircuit, isSseShortCircuit, layout, layoutDomainReducers, layoutReducer, menuActions, menuSlice, mockActions, mockSlice, navigateTo, navigation, openPopup, overlayActions, overlaySlice, popupActions, popupSlice, presets, registerSlice, routing, screenActions, screenSlice, screensetRegistry, screensets, setActiveScreen, setFooterConfig, setFooterVisible, setHeaderLoading, setMenuCollapsed, setMenuConfig, setMenuItems, setMenuVisible, setMockEnabled, setOverlayVisible, setScreenLoading, setSidebarCollapsed, setSidebarConfig, setSidebarContent, setSidebarPosition, setSidebarTitle, setSidebarVisible, setSidebarWidth, setTenant, setTenantLoading, setTenantLoadingState, setUser, showOverlay, sidebarActions, sidebarSlice, tenantActions, tenantReducer, tenantSlice, themes, toggleMenu, toggleMockMode, toggleSidebar } from '@hai3/framework';
|
|
7
7
|
import { TypedUseSelectorHook } from 'react-redux';
|
|
8
|
+
import { EventBus } from '@hai3/state';
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* HAI3 Provider - Main provider component for HAI3 applications
|
|
@@ -241,4 +242,24 @@ declare function useTheme(): UseThemeReturn;
|
|
|
241
242
|
*/
|
|
242
243
|
declare const AppRouter: React__default.FC<AppRouterProps>;
|
|
243
244
|
|
|
244
|
-
|
|
245
|
+
/**
|
|
246
|
+
* @hai3/react - React Bindings
|
|
247
|
+
*
|
|
248
|
+
* This package provides:
|
|
249
|
+
* - HAI3Provider context provider
|
|
250
|
+
* - Type-safe hooks for state and actions
|
|
251
|
+
* - AppRouter for screen rendering
|
|
252
|
+
*
|
|
253
|
+
* Layer: L3 (Depends on @hai3/framework)
|
|
254
|
+
*/
|
|
255
|
+
|
|
256
|
+
interface EventPayloadMap extends EventPayloadMap$1 {
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Re-export eventBus with augmented EventPayloadMap type.
|
|
260
|
+
* This ensures that code importing eventBus from @hai3/react gets
|
|
261
|
+
* type-safe access to both framework events and app-layer augmented events.
|
|
262
|
+
*/
|
|
263
|
+
declare const eventBus: EventBus<EventPayloadMap>;
|
|
264
|
+
|
|
265
|
+
export { AppRouter, AppRouterProps, type EventPayloadMap, HAI3Context, HAI3Provider, HAI3ProviderProps, UseNavigationReturn, UseScreenTranslationsReturn, UseThemeReturn, UseTranslationReturn, eventBus, useAppDispatch, useAppSelector, useHAI3, useNavigation, useScreenTranslations, useTheme, useTranslation };
|
package/dist/index.js
CHANGED
|
@@ -319,7 +319,6 @@ import {
|
|
|
319
319
|
createScreensetRegistry,
|
|
320
320
|
createThemeRegistry,
|
|
321
321
|
createRouteRegistry,
|
|
322
|
-
eventBus,
|
|
323
322
|
createStore,
|
|
324
323
|
getStore,
|
|
325
324
|
registerSlice,
|
|
@@ -417,6 +416,8 @@ import {
|
|
|
417
416
|
getLanguageMetadata
|
|
418
417
|
} from "@hai3/framework";
|
|
419
418
|
import { Language, TextDirection, LanguageDisplayMode } from "@hai3/framework";
|
|
419
|
+
import { eventBus as frameworkEventBus } from "@hai3/framework";
|
|
420
|
+
var eventBus = frameworkEventBus;
|
|
420
421
|
export {
|
|
421
422
|
ACCOUNTS_DOMAIN,
|
|
422
423
|
ApiPlugin,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/HAI3Provider.tsx","../src/HAI3Context.tsx","../src/hooks/useAppDispatch.ts","../src/hooks/useAppSelector.ts","../src/hooks/useTranslation.ts","../src/hooks/useScreenTranslations.ts","../src/hooks/useNavigation.ts","../src/hooks/useTheme.ts","../src/components/AppRouter.tsx","../src/index.ts"],"sourcesContent":["/**\n * HAI3 Provider - Main provider component for HAI3 applications\n *\n * React Layer: L3 (Depends on @hai3/framework)\n */\n\nimport React, { useMemo, useEffect } from 'react';\nimport { Provider as ReduxProvider } from 'react-redux';\nimport { createHAI3App } from '@hai3/framework';\nimport type { HAI3App } from '@hai3/framework';\nimport { HAI3Context } from './HAI3Context';\nimport type { HAI3ProviderProps } from './types';\n\n/**\n * HAI3 Provider Component\n *\n * Provides the HAI3 application context to all child components.\n * Creates the HAI3 app instance with the full preset by default.\n *\n * @example\n * ```tsx\n * // Default - creates app with full preset\n * <HAI3Provider>\n * <App />\n * </HAI3Provider>\n *\n * // With configuration\n * <HAI3Provider config={{ devMode: true }}>\n * <App />\n * </HAI3Provider>\n *\n * // With pre-built app\n * const app = createHAI3().use(screensets()).build();\n * <HAI3Provider app={app}>\n * <App />\n * </HAI3Provider>\n * ```\n */\nexport const HAI3Provider: React.FC<HAI3ProviderProps> = ({\n children,\n config,\n app: providedApp,\n}) => {\n // Create or use provided app instance\n const app = useMemo<HAI3App>(() => {\n if (providedApp) {\n return providedApp;\n }\n\n return createHAI3App(config);\n }, [providedApp, config]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n // Only destroy if we created the app (not provided)\n if (!providedApp) {\n app.destroy();\n }\n };\n }, [app, providedApp]);\n\n return (\n <HAI3Context.Provider value={app}>\n <ReduxProvider store={app.store as Parameters<typeof ReduxProvider>[0]['store']}>\n {children}\n </ReduxProvider>\n </HAI3Context.Provider>\n );\n};\n","/**\n * HAI3 Context - React context for HAI3 application\n *\n * React Layer: L3 (Depends on @hai3/framework)\n */\n\nimport { createContext, useContext } from 'react';\nimport type { HAI3App } from '@hai3/framework';\n\n// ============================================================================\n// Context Definition\n// ============================================================================\n\n/**\n * HAI3 Context\n * Holds the HAI3 app instance for the application.\n */\nexport const HAI3Context = createContext<HAI3App | null>(null);\n\n/**\n * Use the HAI3 context.\n * Throws if used outside of HAI3Provider.\n *\n * @returns The HAI3 app instance\n */\nexport function useHAI3(): HAI3App {\n const context = useContext(HAI3Context);\n\n if (!context) {\n throw new Error(\n 'useHAI3 must be used within a HAI3Provider. ' +\n 'Wrap your application with <HAI3Provider> to access HAI3 features.'\n );\n }\n\n return context;\n}\n","/**\n * useAppDispatch Hook - Type-safe dispatch hook\n *\n * React Layer: L3\n */\n\nimport { useDispatch } from 'react-redux';\nimport type { AppDispatch } from '@hai3/framework';\n\n/**\n * Type-safe dispatch hook.\n *\n * @returns The typed dispatch function\n *\n * @example\n * ```tsx\n * const dispatch = useAppDispatch();\n * dispatch(someAction());\n * ```\n */\nexport function useAppDispatch(): AppDispatch {\n // Use untyped useDispatch and cast the result\n // This avoids type constraint issues with react-redux's generic\n return useDispatch() as AppDispatch;\n}\n","/**\n * useAppSelector Hook - Type-safe selector hook\n *\n * React Layer: L3\n */\n\nimport { useSelector, type TypedUseSelectorHook } from 'react-redux';\nimport type { RootState } from '@hai3/framework';\n\n/**\n * Type-safe selector hook.\n *\n * @example\n * ```tsx\n * const activeScreen = useAppSelector(selectActiveScreen);\n * const menuCollapsed = useAppSelector(selectMenuCollapsed);\n * ```\n */\nexport const useAppSelector: TypedUseSelectorHook<RootState> = useSelector;\n","/**\n * useTranslation Hook - Translation utilities\n *\n * React Layer: L3\n */\n\nimport { useMemo, useCallback, useSyncExternalStore } from 'react';\nimport type { Language } from '@hai3/framework';\nimport { useHAI3 } from '../HAI3Context';\nimport type { UseTranslationReturn } from '../types';\n\n/**\n * Hook for accessing translation utilities.\n *\n * @returns Translation utilities\n *\n * @example\n * ```tsx\n * const { t, language, setLanguage, isRTL } = useTranslation();\n *\n * return (\n * <div dir={isRTL ? 'rtl' : 'ltr'}>\n * <h1>{t('common:app.title')}</h1>\n * <p>{t('common:app.welcome', { name: 'John' })}</p>\n * </div>\n * );\n * ```\n */\nexport function useTranslation(): UseTranslationReturn {\n const app = useHAI3();\n const { i18nRegistry } = app;\n\n // Subscribe to translation changes using useSyncExternalStore\n // Uses version counter to trigger re-renders when translations change\n const version = useSyncExternalStore(\n useCallback(\n (callback: () => void) => {\n // Subscribe to translation changes (new translations registered)\n return i18nRegistry.subscribe(callback);\n },\n [i18nRegistry]\n ),\n () => i18nRegistry.getVersion(),\n () => i18nRegistry.getVersion()\n );\n\n // Get current language (memoized to avoid unnecessary recalculations)\n // version is used to trigger recalculation when translations change\n const language = useMemo(() => {\n void version; // Trigger recalculation when version changes\n return i18nRegistry.getLanguage();\n }, [i18nRegistry, version]);\n\n // Translation function\n const t = useCallback(\n (key: string, params?: Record<string, string | number | boolean>) => {\n return i18nRegistry.t(key, params);\n },\n [i18nRegistry]\n );\n\n // Set language function\n const setLanguage = useCallback(\n async (lang: Language) => {\n await i18nRegistry.setLanguage(lang);\n },\n [i18nRegistry]\n );\n\n // Check RTL - recomputes when language changes\n const isRTL = useMemo(() => {\n // Reference language to trigger recalculation on language change\n void language;\n return i18nRegistry.isRTL();\n }, [i18nRegistry, language]);\n\n return {\n t,\n language,\n setLanguage,\n isRTL,\n };\n}\n","/**\n * useScreenTranslations Hook - Screen-level translation loading\n *\n * React Layer: L3\n */\n\nimport { useState, useEffect, useMemo, useCallback, useSyncExternalStore } from 'react';\nimport type { TranslationMap, TranslationLoader } from '@hai3/framework';\nimport { useHAI3 } from '../HAI3Context';\nimport type { UseScreenTranslationsReturn } from '../types';\n\n// Re-export TranslationMap for consumers who need it\nexport type { TranslationMap };\n\n/**\n * Check if the input is a TranslationLoader function (from I18nRegistry.createLoader)\n * vs a TranslationMap object\n */\nfunction isTranslationLoader(\n input: TranslationMap | TranslationLoader\n): input is TranslationLoader {\n return typeof input === 'function';\n}\n\n/**\n * Hook for loading screen-level translations.\n * Use this in screen components to lazy-load translations.\n * Automatically reloads translations when language changes.\n *\n * @param screensetId - The screenset ID\n * @param screenId - The screen ID\n * @param translations - Either a TranslationMap object or a TranslationLoader function\n * (from I18nRegistry.createLoader)\n * @returns Loading state\n *\n * @example\n * ```tsx\n * // Option 1: Using I18nRegistry.createLoader (recommended)\n * const translations = I18nRegistry.createLoader({\n * en: () => import('./i18n/en.json'),\n * es: () => import('./i18n/es.json'),\n * });\n *\n * // Option 2: Using raw TranslationMap\n * const translations = {\n * en: () => import('./i18n/en.json'),\n * es: () => import('./i18n/es.json'),\n * };\n *\n * export const HomeScreen: React.FC = () => {\n * const { isLoaded, error } = useScreenTranslations(\n * 'demo',\n * 'home',\n * translations\n * );\n *\n * if (!isLoaded) return <LoadingSpinner />;\n * if (error) return <ErrorMessage error={error} />;\n *\n * return <div>...</div>;\n * };\n * ```\n */\nexport function useScreenTranslations(\n screensetId: string,\n screenId: string,\n translations: TranslationMap | TranslationLoader\n): UseScreenTranslationsReturn {\n const app = useHAI3();\n const { i18nRegistry } = app;\n\n // Track loading state per language to handle language changes\n const [loadedLanguage, setLoadedLanguage] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Subscribe to translation changes using useSyncExternalStore\n // This ensures we reload when language changes\n const version = useSyncExternalStore(\n useCallback(\n (callback: () => void) => i18nRegistry.subscribe(callback),\n [i18nRegistry]\n ),\n () => i18nRegistry.getVersion(),\n () => i18nRegistry.getVersion()\n );\n\n // Get current language (changes when version changes)\n // version is used to trigger recalculation when translations change\n const currentLanguage = useMemo(() => {\n void version; // Trigger recalculation when version changes\n return i18nRegistry.getLanguage();\n }, [i18nRegistry, version]);\n\n // Create a TranslationLoader function from the translation map or use directly if already a loader\n const loader: TranslationLoader = useMemo(() => {\n if (isTranslationLoader(translations)) {\n // Already a loader function (from I18nRegistry.createLoader)\n return translations;\n }\n\n // Convert TranslationMap to TranslationLoader\n return async (language: string) => {\n const importFn = translations[language as keyof typeof translations];\n if (!importFn) {\n // Return empty dictionary if language not in map\n return {};\n }\n const module = await importFn();\n return module.default;\n };\n }, [translations]);\n\n useEffect(() => {\n // Skip if no language or already loaded for this language\n if (!currentLanguage || currentLanguage === loadedLanguage) {\n return;\n }\n\n let cancelled = false;\n setIsLoading(true);\n\n const loadTranslations = async () => {\n try {\n const namespace = `screen.${screensetId}.${screenId}`;\n\n // Register the loader for future language changes\n i18nRegistry.registerLoader(namespace, loader);\n\n // Actually load the translations for current language\n const loadedTranslations = await loader(currentLanguage);\n i18nRegistry.register(namespace, currentLanguage, loadedTranslations);\n\n if (!cancelled) {\n setLoadedLanguage(currentLanguage);\n setIsLoading(false);\n setError(null);\n }\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setIsLoading(false);\n }\n }\n };\n\n loadTranslations();\n\n return () => {\n cancelled = true;\n };\n }, [screensetId, screenId, loader, i18nRegistry, currentLanguage, loadedLanguage]);\n\n // Derive isLoaded from whether we've loaded translations for the current language\n const isLoaded = currentLanguage !== null && currentLanguage === loadedLanguage && !isLoading;\n\n return { isLoaded, error };\n}\n","/**\n * useNavigation Hook - Navigation utilities\n *\n * React Layer: L3\n */\n\nimport { useCallback } from 'react';\nimport { useHAI3 } from '../HAI3Context';\nimport { useAppSelector } from './useAppSelector';\nimport type { RootStateWithLayout } from '@hai3/framework';\nimport type { UseNavigationReturn } from '../types';\n\n/**\n * Hook for navigation utilities.\n *\n * @returns Navigation utilities\n *\n * @example\n * ```tsx\n * const { navigateToScreen, navigateToScreenset, currentScreen } = useNavigation();\n *\n * return (\n * <button onClick={() => navigateToScreen('demo', 'home')}>\n * Go to Home\n * </button>\n * );\n * ```\n */\nexport function useNavigation(): UseNavigationReturn {\n const app = useHAI3();\n // Access state directly via useAppSelector - no selectors needed\n // Layout slices use flat keys like 'layout/screen', not nested 'layout.screen'\n const currentScreen = useAppSelector(\n (state) => {\n // Try flat key first (current SDK architecture)\n const flatKey = state as Record<string, { activeScreen?: string | null }>;\n if (flatKey['layout/screen']) {\n return flatKey['layout/screen'].activeScreen ?? null;\n }\n // Fallback to nested structure (for backward compatibility)\n const nested = state as unknown as RootStateWithLayout;\n return nested.layout?.screen?.activeScreen ?? null;\n }\n );\n\n // Navigate to a specific screen\n const navigateToScreen = useCallback(\n (screensetId: string, screenId: string) => {\n if (app.actions.navigateToScreen) {\n app.actions.navigateToScreen({ screensetId, screenId });\n }\n },\n [app.actions]\n );\n\n // Navigate to a screenset (uses default screen)\n const navigateToScreenset = useCallback(\n (screensetId: string) => {\n if (app.actions.navigateToScreenset) {\n app.actions.navigateToScreenset({ screensetId });\n }\n },\n [app.actions]\n );\n\n /**\n * Derived state: screenset looked up from currentScreen via routeRegistry.\n * Single source of truth (Redux), automatic reactivity.\n */\n const currentScreenset = currentScreen\n ? app.routeRegistry?.getScreensetForScreen(currentScreen) ?? null\n : null;\n\n return {\n navigateToScreen,\n navigateToScreenset,\n currentScreenset,\n currentScreen,\n };\n}\n","/**\n * useTheme Hook - Theme utilities\n *\n * React Layer: L3\n */\n\nimport { useCallback, useMemo, useSyncExternalStore } from 'react';\nimport { useHAI3 } from '../HAI3Context';\nimport type { UseThemeReturn } from '../types';\n\n/**\n * Hook for theme utilities.\n *\n * @returns Theme utilities\n *\n * @example\n * ```tsx\n * const { currentTheme, themes, setTheme } = useTheme();\n *\n * return (\n * <select\n * value={currentTheme}\n * onChange={(e) => setTheme(e.target.value)}\n * >\n * {themes.map((theme) => (\n * <option key={theme.id} value={theme.id}>\n * {theme.name}\n * </option>\n * ))}\n * </select>\n * );\n * ```\n */\nexport function useTheme(): UseThemeReturn {\n const app = useHAI3();\n const { themeRegistry } = app;\n\n // Subscribe to theme changes using useSyncExternalStore\n // Uses version counter to trigger re-renders when theme changes\n const version = useSyncExternalStore(\n useCallback(\n (callback: () => void) => {\n return themeRegistry.subscribe(callback);\n },\n [themeRegistry]\n ),\n () => themeRegistry.getVersion(),\n () => themeRegistry.getVersion()\n );\n\n // Get current theme (memoized, recalculates on version change)\n const currentTheme = useMemo(() => {\n // Reference version to trigger recalculation on theme change\n void version;\n const theme = themeRegistry.getCurrent();\n return theme?.id;\n }, [themeRegistry, version]);\n\n // Get all themes\n const themes = useMemo(() => {\n return themeRegistry.getAll().map((theme) => ({\n id: theme.id,\n name: theme.name,\n }));\n }, [themeRegistry]);\n\n // Set theme\n const setTheme = useCallback(\n (themeId: string) => {\n if (app.actions.changeTheme) {\n app.actions.changeTheme({ themeId });\n }\n },\n [app.actions]\n );\n\n return {\n currentTheme,\n themes,\n setTheme,\n };\n}\n","/**\n * AppRouter Component - Renders the active screen\n *\n * React Layer: L3\n */\n\nimport React, { Suspense, useState, useEffect } from 'react';\nimport { useHAI3 } from '../HAI3Context';\nimport { useNavigation } from '../hooks/useNavigation';\nimport type { AppRouterProps } from '../types';\n\n/**\n * AppRouter Component\n *\n * Renders the currently active screen based on navigation state.\n * Handles lazy loading and error boundaries.\n *\n * @example\n * ```tsx\n * <HAI3Provider>\n * <Layout>\n * <AppRouter\n * fallback={<LoadingSpinner />}\n * errorFallback={(error) => <ErrorPage error={error} />}\n * />\n * </Layout>\n * </HAI3Provider>\n * ```\n */\nexport const AppRouter: React.FC<AppRouterProps> = ({\n fallback = null,\n errorFallback,\n}) => {\n const app = useHAI3();\n const { currentScreenset, currentScreen } = useNavigation();\n const [ScreenComponent, setScreenComponent] = useState<React.ComponentType | null>(null);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n\n const loadScreen = async () => {\n if (!currentScreenset || !currentScreen) {\n setScreenComponent(null);\n return;\n }\n\n try {\n // Get screen loader from route registry\n const loader = app.routeRegistry.getScreen(currentScreenset, currentScreen);\n\n if (!loader) {\n throw new Error(\n `Screen \"${currentScreen}\" not found in screenset \"${currentScreenset}\".`\n );\n }\n\n // Load the screen component\n const module = await loader();\n\n if (!cancelled) {\n setScreenComponent(() => module.default);\n setError(null);\n }\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setScreenComponent(null);\n }\n }\n };\n\n loadScreen();\n\n return () => {\n cancelled = true;\n };\n }, [currentScreenset, currentScreen, app.routeRegistry]);\n\n // Handle error state\n if (error) {\n if (errorFallback) {\n if (typeof errorFallback === 'function') {\n return <>{errorFallback(error)}</>;\n }\n return <>{errorFallback}</>;\n }\n // Default error display\n return (\n <div className=\"p-5 text-destructive\">\n <h2>Error loading screen</h2>\n <p>{error.message}</p>\n </div>\n );\n }\n\n // Handle loading state\n if (!ScreenComponent) {\n return <>{fallback}</>;\n }\n\n // Render the screen component\n return (\n <Suspense fallback={fallback}>\n <ScreenComponent />\n </Suspense>\n );\n};\n","/**\n * @hai3/react - React Bindings\n *\n * This package provides:\n * - HAI3Provider context provider\n * - Type-safe hooks for state and actions\n * - AppRouter for screen rendering\n *\n * Layer: L3 (Depends on @hai3/framework)\n */\n\n// ============================================================================\n// Provider\n// ============================================================================\n\nexport { HAI3Provider } from './HAI3Provider';\nexport { HAI3Context, useHAI3 } from './HAI3Context';\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\nexport {\n useAppDispatch,\n useAppSelector,\n useTranslation,\n useScreenTranslations,\n useNavigation,\n useTheme,\n} from './hooks';\n\n// ============================================================================\n// Components\n// ============================================================================\n\nexport { AppRouter } from './components';\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\nexport type {\n HAI3ProviderProps,\n UseHAI3Return,\n UseAppSelector,\n UseAppDispatchReturn,\n UseTranslationReturn,\n UseScreenTranslationsReturn,\n UseLanguageReturn,\n UseThemeReturn,\n UseMenuReturn,\n UseScreenReturn,\n UseNavigationReturn,\n UseScreensetReturn,\n UsePopupReturn,\n UseOverlayReturn,\n AppRouterProps,\n HAI3ProviderComponent,\n AppRouterComponent,\n} from './types';\n\n// ============================================================================\n// Re-exports from @hai3/framework for convenience\n// ============================================================================\n\n// These re-exports allow users to import everything from @hai3/react\n// without needing to import from @hai3/framework directly\n\nexport {\n // Core\n createHAI3,\n createHAI3App,\n presets,\n\n // Backward compatibility singletons\n screensetRegistry,\n\n // Backward compatibility constants\n ACCOUNTS_DOMAIN,\n\n // I18nRegistry class (capital I for backward compat)\n I18nRegistry,\n\n // Plugins\n screensets,\n themes,\n layout,\n navigation,\n routing,\n i18n,\n effects,\n\n // Registries\n createScreensetRegistry,\n createThemeRegistry,\n createRouteRegistry,\n\n // Flux (Event bus + Store)\n eventBus,\n\n // Store\n createStore,\n getStore,\n registerSlice,\n hasSlice,\n createSlice,\n\n // Layout domain exports\n LayoutDomain,\n ScreensetCategory,\n layoutReducer,\n layoutDomainReducers,\n LAYOUT_SLICE_NAME,\n headerSlice,\n footerSlice,\n menuSlice,\n sidebarSlice,\n screenSlice,\n popupSlice,\n overlaySlice,\n headerActions,\n footerActions,\n menuActions,\n sidebarActions,\n screenActions,\n popupActions,\n overlayActions,\n // Individual reducer functions - header\n setUser,\n setHeaderLoading,\n clearUser,\n // Individual reducer functions - footer\n setFooterVisible,\n setFooterConfig,\n toggleMenu,\n setMenuCollapsed,\n setMenuItems,\n setMenuVisible,\n setMenuConfig,\n toggleSidebar,\n setSidebarCollapsed,\n setSidebarPosition,\n setSidebarTitle,\n setSidebarContent,\n setSidebarVisible,\n setSidebarWidth,\n setSidebarConfig,\n setActiveScreen,\n setScreenLoading,\n navigateTo,\n clearActiveScreen,\n openPopup,\n closePopup,\n closeTopPopup,\n closeAllPopups,\n showOverlay,\n hideOverlay,\n setOverlayVisible,\n\n // Tenant (app-level, not layout)\n TENANT_SLICE_NAME,\n tenantSlice,\n tenantActions,\n tenantReducer,\n setTenant,\n setTenantLoading,\n clearTenant,\n // Tenant effects and events\n initTenantEffects,\n changeTenant,\n clearTenantAction,\n setTenantLoadingState,\n TenantEvents,\n\n // Mock (app-level, not layout)\n mockSlice,\n mockActions,\n setMockEnabled,\n // Mock effects and events\n initMockEffects,\n toggleMockMode,\n MockEvents,\n\n // API\n apiRegistry,\n BaseApiService,\n RestProtocol,\n SseProtocol,\n // Protocol-specific mock plugins (replaces generic MockPlugin)\n RestMockPlugin,\n SseMockPlugin,\n MockEventSource,\n // Plugin base classes\n ApiPluginBase,\n ApiPlugin,\n ApiProtocol,\n RestPlugin,\n RestPluginWithConfig,\n SsePlugin,\n SsePluginWithConfig,\n // Type guards\n isShortCircuit,\n isRestShortCircuit,\n isSseShortCircuit,\n // Mock plugin identification\n MOCK_PLUGIN,\n isMockPlugin,\n\n // I18n\n i18nRegistry,\n I18nRegistryImpl,\n createI18nRegistry,\n SUPPORTED_LANGUAGES,\n getLanguageMetadata,\n} from '@hai3/framework';\n\n// Re-export i18n types from @hai3/framework (correct layer access)\nexport { Language, TextDirection, LanguageDisplayMode } from '@hai3/framework';\n\n// Re-export types from @hai3/framework\nexport type {\n // Config\n HAI3Config,\n HAI3Plugin,\n HAI3AppBuilder,\n HAI3App,\n PluginFactory,\n PluginProvides,\n PluginLifecycle,\n ScreensetRegistry,\n ThemeRegistry,\n ThemeConfig,\n RouteRegistry,\n Preset,\n Presets,\n ScreensetsConfig,\n NavigateToScreenPayload,\n NavigateToScreensetPayload,\n ShowPopupPayload,\n ChangeThemePayload,\n SetLanguagePayload,\n\n // Flux (Events + Store)\n EventPayloadMap,\n EventHandler,\n Subscription,\n\n // Store\n RootState,\n AppDispatch,\n SliceObject,\n HAI3Store,\n\n // Layout\n ScreensetId,\n ScreenId,\n MenuItemConfig,\n ScreenLoader,\n ScreenConfig,\n MenuScreenItem,\n ScreensetDefinition,\n LayoutDomainState,\n HeaderUser,\n HeaderConfig,\n HeaderState,\n FooterConfig,\n FooterState,\n MenuItem,\n MenuState,\n SidebarPosition,\n SidebarState,\n ScreenState,\n PopupConfig,\n PopupState,\n PopupSliceState,\n OverlayConfig,\n OverlayState,\n LayoutState,\n RootStateWithLayout,\n LayoutDomainReducers,\n\n // Tenant types\n Tenant,\n TenantState,\n TenantChangedPayload,\n TenantClearedPayload,\n\n // Mock types\n MockState,\n MockTogglePayload,\n\n // API\n MockMap,\n ApiServiceConfig,\n JsonValue,\n JsonObject,\n JsonPrimitive,\n JsonCompatible,\n SseProtocolConfig,\n RestProtocolConfig,\n // Plugin context types (class-based plugin system)\n ApiRequestContext,\n ApiResponseContext,\n ShortCircuitResponse,\n PluginClass,\n ProtocolClass,\n ProtocolPluginType,\n BasePluginHooks,\n // Protocol-specific types\n RestPluginHooks,\n SsePluginHooks,\n RestRequestContext,\n RestResponseContext,\n ApiPluginErrorContext,\n SseConnectContext,\n EventSourceLike,\n RestShortCircuitResponse,\n SseShortCircuitResponse,\n RestMockConfig,\n SseMockConfig,\n SseMockEvent,\n\n // Backward compatibility type aliases\n ScreensetConfig,\n\n // Theme types\n ThemeApplyFn,\n UikitTheme,\n\n // I18n\n I18nConfig,\n TranslationLoader,\n TranslationMap,\n TranslationDictionary,\n LanguageMetadata,\n I18nRegistryType,\n} from '@hai3/framework';\n"],"mappings":"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","names":["useMemo","i18nRegistry","useMemo","useEffect","useMemo","useCallback","useSyncExternalStore","i18nRegistry","useSyncExternalStore","useCallback","useMemo","useEffect","useCallback","useCallback","useCallback","useMemo","useSyncExternalStore","useSyncExternalStore","useCallback","useMemo","themes","useState","useEffect","jsx","useState","useEffect","createHAI3App"]}
|
|
1
|
+
{"version":3,"sources":["../src/HAI3Provider.tsx","../src/HAI3Context.tsx","../src/hooks/useAppDispatch.ts","../src/hooks/useAppSelector.ts","../src/hooks/useTranslation.ts","../src/hooks/useScreenTranslations.ts","../src/hooks/useNavigation.ts","../src/hooks/useTheme.ts","../src/components/AppRouter.tsx","../src/index.ts"],"sourcesContent":["/**\n * HAI3 Provider - Main provider component for HAI3 applications\n *\n * React Layer: L3 (Depends on @hai3/framework)\n */\n\nimport React, { useMemo, useEffect } from 'react';\nimport { Provider as ReduxProvider } from 'react-redux';\nimport { createHAI3App } from '@hai3/framework';\nimport type { HAI3App } from '@hai3/framework';\nimport { HAI3Context } from './HAI3Context';\nimport type { HAI3ProviderProps } from './types';\n\n/**\n * HAI3 Provider Component\n *\n * Provides the HAI3 application context to all child components.\n * Creates the HAI3 app instance with the full preset by default.\n *\n * @example\n * ```tsx\n * // Default - creates app with full preset\n * <HAI3Provider>\n * <App />\n * </HAI3Provider>\n *\n * // With configuration\n * <HAI3Provider config={{ devMode: true }}>\n * <App />\n * </HAI3Provider>\n *\n * // With pre-built app\n * const app = createHAI3().use(screensets()).build();\n * <HAI3Provider app={app}>\n * <App />\n * </HAI3Provider>\n * ```\n */\nexport const HAI3Provider: React.FC<HAI3ProviderProps> = ({\n children,\n config,\n app: providedApp,\n}) => {\n // Create or use provided app instance\n const app = useMemo<HAI3App>(() => {\n if (providedApp) {\n return providedApp;\n }\n\n return createHAI3App(config);\n }, [providedApp, config]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n // Only destroy if we created the app (not provided)\n if (!providedApp) {\n app.destroy();\n }\n };\n }, [app, providedApp]);\n\n return (\n <HAI3Context.Provider value={app}>\n <ReduxProvider store={app.store as Parameters<typeof ReduxProvider>[0]['store']}>\n {children}\n </ReduxProvider>\n </HAI3Context.Provider>\n );\n};\n","/**\n * HAI3 Context - React context for HAI3 application\n *\n * React Layer: L3 (Depends on @hai3/framework)\n */\n\nimport { createContext, useContext } from 'react';\nimport type { HAI3App } from '@hai3/framework';\n\n// ============================================================================\n// Context Definition\n// ============================================================================\n\n/**\n * HAI3 Context\n * Holds the HAI3 app instance for the application.\n */\nexport const HAI3Context = createContext<HAI3App | null>(null);\n\n/**\n * Use the HAI3 context.\n * Throws if used outside of HAI3Provider.\n *\n * @returns The HAI3 app instance\n */\nexport function useHAI3(): HAI3App {\n const context = useContext(HAI3Context);\n\n if (!context) {\n throw new Error(\n 'useHAI3 must be used within a HAI3Provider. ' +\n 'Wrap your application with <HAI3Provider> to access HAI3 features.'\n );\n }\n\n return context;\n}\n","/**\n * useAppDispatch Hook - Type-safe dispatch hook\n *\n * React Layer: L3\n */\n\nimport { useDispatch } from 'react-redux';\nimport type { AppDispatch } from '@hai3/framework';\n\n/**\n * Type-safe dispatch hook.\n *\n * @returns The typed dispatch function\n *\n * @example\n * ```tsx\n * const dispatch = useAppDispatch();\n * dispatch(someAction());\n * ```\n */\nexport function useAppDispatch(): AppDispatch {\n // Use untyped useDispatch and cast the result\n // This avoids type constraint issues with react-redux's generic\n return useDispatch() as AppDispatch;\n}\n","/**\n * useAppSelector Hook - Type-safe selector hook\n *\n * React Layer: L3\n */\n\nimport { useSelector, type TypedUseSelectorHook } from 'react-redux';\nimport type { RootState } from '@hai3/framework';\n\n/**\n * Type-safe selector hook.\n *\n * @example\n * ```tsx\n * const activeScreen = useAppSelector(selectActiveScreen);\n * const menuCollapsed = useAppSelector(selectMenuCollapsed);\n * ```\n */\nexport const useAppSelector: TypedUseSelectorHook<RootState> = useSelector;\n","/**\n * useTranslation Hook - Translation utilities\n *\n * React Layer: L3\n */\n\nimport { useMemo, useCallback, useSyncExternalStore } from 'react';\nimport type { Language } from '@hai3/framework';\nimport { useHAI3 } from '../HAI3Context';\nimport type { UseTranslationReturn } from '../types';\n\n/**\n * Hook for accessing translation utilities.\n *\n * @returns Translation utilities\n *\n * @example\n * ```tsx\n * const { t, language, setLanguage, isRTL } = useTranslation();\n *\n * return (\n * <div dir={isRTL ? 'rtl' : 'ltr'}>\n * <h1>{t('common:app.title')}</h1>\n * <p>{t('common:app.welcome', { name: 'John' })}</p>\n * </div>\n * );\n * ```\n */\nexport function useTranslation(): UseTranslationReturn {\n const app = useHAI3();\n const { i18nRegistry } = app;\n\n // Subscribe to translation changes using useSyncExternalStore\n // Uses version counter to trigger re-renders when translations change\n const version = useSyncExternalStore(\n useCallback(\n (callback: () => void) => {\n // Subscribe to translation changes (new translations registered)\n return i18nRegistry.subscribe(callback);\n },\n [i18nRegistry]\n ),\n () => i18nRegistry.getVersion(),\n () => i18nRegistry.getVersion()\n );\n\n // Get current language (memoized to avoid unnecessary recalculations)\n // version is used to trigger recalculation when translations change\n const language = useMemo(() => {\n void version; // Trigger recalculation when version changes\n return i18nRegistry.getLanguage();\n }, [i18nRegistry, version]);\n\n // Translation function\n const t = useCallback(\n (key: string, params?: Record<string, string | number | boolean>) => {\n return i18nRegistry.t(key, params);\n },\n [i18nRegistry]\n );\n\n // Set language function\n const setLanguage = useCallback(\n async (lang: Language) => {\n await i18nRegistry.setLanguage(lang);\n },\n [i18nRegistry]\n );\n\n // Check RTL - recomputes when language changes\n const isRTL = useMemo(() => {\n // Reference language to trigger recalculation on language change\n void language;\n return i18nRegistry.isRTL();\n }, [i18nRegistry, language]);\n\n return {\n t,\n language,\n setLanguage,\n isRTL,\n };\n}\n","/**\n * useScreenTranslations Hook - Screen-level translation loading\n *\n * React Layer: L3\n */\n\nimport { useState, useEffect, useMemo, useCallback, useSyncExternalStore } from 'react';\nimport type { TranslationMap, TranslationLoader } from '@hai3/framework';\nimport { useHAI3 } from '../HAI3Context';\nimport type { UseScreenTranslationsReturn } from '../types';\n\n// Re-export TranslationMap for consumers who need it\nexport type { TranslationMap };\n\n/**\n * Check if the input is a TranslationLoader function (from I18nRegistry.createLoader)\n * vs a TranslationMap object\n */\nfunction isTranslationLoader(\n input: TranslationMap | TranslationLoader\n): input is TranslationLoader {\n return typeof input === 'function';\n}\n\n/**\n * Hook for loading screen-level translations.\n * Use this in screen components to lazy-load translations.\n * Automatically reloads translations when language changes.\n *\n * @param screensetId - The screenset ID\n * @param screenId - The screen ID\n * @param translations - Either a TranslationMap object or a TranslationLoader function\n * (from I18nRegistry.createLoader)\n * @returns Loading state\n *\n * @example\n * ```tsx\n * // Option 1: Using I18nRegistry.createLoader (recommended)\n * const translations = I18nRegistry.createLoader({\n * en: () => import('./i18n/en.json'),\n * es: () => import('./i18n/es.json'),\n * });\n *\n * // Option 2: Using raw TranslationMap\n * const translations = {\n * en: () => import('./i18n/en.json'),\n * es: () => import('./i18n/es.json'),\n * };\n *\n * export const HomeScreen: React.FC = () => {\n * const { isLoaded, error } = useScreenTranslations(\n * 'demo',\n * 'home',\n * translations\n * );\n *\n * if (!isLoaded) return <LoadingSpinner />;\n * if (error) return <ErrorMessage error={error} />;\n *\n * return <div>...</div>;\n * };\n * ```\n */\nexport function useScreenTranslations(\n screensetId: string,\n screenId: string,\n translations: TranslationMap | TranslationLoader\n): UseScreenTranslationsReturn {\n const app = useHAI3();\n const { i18nRegistry } = app;\n\n // Track loading state per language to handle language changes\n const [loadedLanguage, setLoadedLanguage] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Subscribe to translation changes using useSyncExternalStore\n // This ensures we reload when language changes\n const version = useSyncExternalStore(\n useCallback(\n (callback: () => void) => i18nRegistry.subscribe(callback),\n [i18nRegistry]\n ),\n () => i18nRegistry.getVersion(),\n () => i18nRegistry.getVersion()\n );\n\n // Get current language (changes when version changes)\n // version is used to trigger recalculation when translations change\n const currentLanguage = useMemo(() => {\n void version; // Trigger recalculation when version changes\n return i18nRegistry.getLanguage();\n }, [i18nRegistry, version]);\n\n // Create a TranslationLoader function from the translation map or use directly if already a loader\n const loader: TranslationLoader = useMemo(() => {\n if (isTranslationLoader(translations)) {\n // Already a loader function (from I18nRegistry.createLoader)\n return translations;\n }\n\n // Convert TranslationMap to TranslationLoader\n return async (language: string) => {\n const importFn = translations[language as keyof typeof translations];\n if (!importFn) {\n // Return empty dictionary if language not in map\n return {};\n }\n const module = await importFn();\n return module.default;\n };\n }, [translations]);\n\n useEffect(() => {\n // Skip if no language or already loaded for this language\n if (!currentLanguage || currentLanguage === loadedLanguage) {\n return;\n }\n\n let cancelled = false;\n setIsLoading(true);\n\n const loadTranslations = async () => {\n try {\n const namespace = `screen.${screensetId}.${screenId}`;\n\n // Register the loader for future language changes\n i18nRegistry.registerLoader(namespace, loader);\n\n // Actually load the translations for current language\n const loadedTranslations = await loader(currentLanguage);\n i18nRegistry.register(namespace, currentLanguage, loadedTranslations);\n\n if (!cancelled) {\n setLoadedLanguage(currentLanguage);\n setIsLoading(false);\n setError(null);\n }\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setIsLoading(false);\n }\n }\n };\n\n loadTranslations();\n\n return () => {\n cancelled = true;\n };\n }, [screensetId, screenId, loader, i18nRegistry, currentLanguage, loadedLanguage]);\n\n // Derive isLoaded from whether we've loaded translations for the current language\n const isLoaded = currentLanguage !== null && currentLanguage === loadedLanguage && !isLoading;\n\n return { isLoaded, error };\n}\n","/**\n * useNavigation Hook - Navigation utilities\n *\n * React Layer: L3\n */\n\nimport { useCallback } from 'react';\nimport { useHAI3 } from '../HAI3Context';\nimport { useAppSelector } from './useAppSelector';\nimport type { RootStateWithLayout } from '@hai3/framework';\nimport type { UseNavigationReturn } from '../types';\n\n/**\n * Hook for navigation utilities.\n *\n * @returns Navigation utilities\n *\n * @example\n * ```tsx\n * const { navigateToScreen, navigateToScreenset, currentScreen } = useNavigation();\n *\n * return (\n * <button onClick={() => navigateToScreen('demo', 'home')}>\n * Go to Home\n * </button>\n * );\n * ```\n */\nexport function useNavigation(): UseNavigationReturn {\n const app = useHAI3();\n // Access state directly via useAppSelector - no selectors needed\n // Layout slices use flat keys like 'layout/screen', not nested 'layout.screen'\n const currentScreen = useAppSelector(\n (state) => {\n // Try flat key first (current SDK architecture)\n const flatKey = state as Record<string, { activeScreen?: string | null }>;\n if (flatKey['layout/screen']) {\n return flatKey['layout/screen'].activeScreen ?? null;\n }\n // Fallback to nested structure (for backward compatibility)\n const nested = state as unknown as RootStateWithLayout;\n return nested.layout?.screen?.activeScreen ?? null;\n }\n );\n\n // Navigate to a specific screen\n const navigateToScreen = useCallback(\n (screensetId: string, screenId: string) => {\n if (app.actions.navigateToScreen) {\n app.actions.navigateToScreen({ screensetId, screenId });\n }\n },\n [app.actions]\n );\n\n // Navigate to a screenset (uses default screen)\n const navigateToScreenset = useCallback(\n (screensetId: string) => {\n if (app.actions.navigateToScreenset) {\n app.actions.navigateToScreenset({ screensetId });\n }\n },\n [app.actions]\n );\n\n /**\n * Derived state: screenset looked up from currentScreen via routeRegistry.\n * Single source of truth (Redux), automatic reactivity.\n */\n const currentScreenset = currentScreen\n ? app.routeRegistry?.getScreensetForScreen(currentScreen) ?? null\n : null;\n\n return {\n navigateToScreen,\n navigateToScreenset,\n currentScreenset,\n currentScreen,\n };\n}\n","/**\n * useTheme Hook - Theme utilities\n *\n * React Layer: L3\n */\n\nimport { useCallback, useMemo, useSyncExternalStore } from 'react';\nimport { useHAI3 } from '../HAI3Context';\nimport type { UseThemeReturn } from '../types';\n\n/**\n * Hook for theme utilities.\n *\n * @returns Theme utilities\n *\n * @example\n * ```tsx\n * const { currentTheme, themes, setTheme } = useTheme();\n *\n * return (\n * <select\n * value={currentTheme}\n * onChange={(e) => setTheme(e.target.value)}\n * >\n * {themes.map((theme) => (\n * <option key={theme.id} value={theme.id}>\n * {theme.name}\n * </option>\n * ))}\n * </select>\n * );\n * ```\n */\nexport function useTheme(): UseThemeReturn {\n const app = useHAI3();\n const { themeRegistry } = app;\n\n // Subscribe to theme changes using useSyncExternalStore\n // Uses version counter to trigger re-renders when theme changes\n const version = useSyncExternalStore(\n useCallback(\n (callback: () => void) => {\n return themeRegistry.subscribe(callback);\n },\n [themeRegistry]\n ),\n () => themeRegistry.getVersion(),\n () => themeRegistry.getVersion()\n );\n\n // Get current theme (memoized, recalculates on version change)\n const currentTheme = useMemo(() => {\n // Reference version to trigger recalculation on theme change\n void version;\n const theme = themeRegistry.getCurrent();\n return theme?.id;\n }, [themeRegistry, version]);\n\n // Get all themes\n const themes = useMemo(() => {\n return themeRegistry.getAll().map((theme) => ({\n id: theme.id,\n name: theme.name,\n }));\n }, [themeRegistry]);\n\n // Set theme\n const setTheme = useCallback(\n (themeId: string) => {\n if (app.actions.changeTheme) {\n app.actions.changeTheme({ themeId });\n }\n },\n [app.actions]\n );\n\n return {\n currentTheme,\n themes,\n setTheme,\n };\n}\n","/**\n * AppRouter Component - Renders the active screen\n *\n * React Layer: L3\n */\n\nimport React, { Suspense, useState, useEffect } from 'react';\nimport { useHAI3 } from '../HAI3Context';\nimport { useNavigation } from '../hooks/useNavigation';\nimport type { AppRouterProps } from '../types';\n\n/**\n * AppRouter Component\n *\n * Renders the currently active screen based on navigation state.\n * Handles lazy loading and error boundaries.\n *\n * @example\n * ```tsx\n * <HAI3Provider>\n * <Layout>\n * <AppRouter\n * fallback={<LoadingSpinner />}\n * errorFallback={(error) => <ErrorPage error={error} />}\n * />\n * </Layout>\n * </HAI3Provider>\n * ```\n */\nexport const AppRouter: React.FC<AppRouterProps> = ({\n fallback = null,\n errorFallback,\n}) => {\n const app = useHAI3();\n const { currentScreenset, currentScreen } = useNavigation();\n const [ScreenComponent, setScreenComponent] = useState<React.ComponentType | null>(null);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n\n const loadScreen = async () => {\n if (!currentScreenset || !currentScreen) {\n setScreenComponent(null);\n return;\n }\n\n try {\n // Get screen loader from route registry\n const loader = app.routeRegistry.getScreen(currentScreenset, currentScreen);\n\n if (!loader) {\n throw new Error(\n `Screen \"${currentScreen}\" not found in screenset \"${currentScreenset}\".`\n );\n }\n\n // Load the screen component\n const module = await loader();\n\n if (!cancelled) {\n setScreenComponent(() => module.default);\n setError(null);\n }\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setScreenComponent(null);\n }\n }\n };\n\n loadScreen();\n\n return () => {\n cancelled = true;\n };\n }, [currentScreenset, currentScreen, app.routeRegistry]);\n\n // Handle error state\n if (error) {\n if (errorFallback) {\n if (typeof errorFallback === 'function') {\n return <>{errorFallback(error)}</>;\n }\n return <>{errorFallback}</>;\n }\n // Default error display\n return (\n <div className=\"p-5 text-destructive\">\n <h2>Error loading screen</h2>\n <p>{error.message}</p>\n </div>\n );\n }\n\n // Handle loading state\n if (!ScreenComponent) {\n return <>{fallback}</>;\n }\n\n // Render the screen component\n return (\n <Suspense fallback={fallback}>\n <ScreenComponent />\n </Suspense>\n );\n};\n","/**\n * @hai3/react - React Bindings\n *\n * This package provides:\n * - HAI3Provider context provider\n * - Type-safe hooks for state and actions\n * - AppRouter for screen rendering\n *\n * Layer: L3 (Depends on @hai3/framework)\n */\n\n// ============================================================================\n// Provider\n// ============================================================================\n\nexport { HAI3Provider } from './HAI3Provider';\nexport { HAI3Context, useHAI3 } from './HAI3Context';\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\nexport {\n useAppDispatch,\n useAppSelector,\n useTranslation,\n useScreenTranslations,\n useNavigation,\n useTheme,\n} from './hooks';\n\n// ============================================================================\n// Components\n// ============================================================================\n\nexport { AppRouter } from './components';\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\nexport type {\n HAI3ProviderProps,\n UseHAI3Return,\n UseAppSelector,\n UseAppDispatchReturn,\n UseTranslationReturn,\n UseScreenTranslationsReturn,\n UseLanguageReturn,\n UseThemeReturn,\n UseMenuReturn,\n UseScreenReturn,\n UseNavigationReturn,\n UseScreensetReturn,\n UsePopupReturn,\n UseOverlayReturn,\n AppRouterProps,\n HAI3ProviderComponent,\n AppRouterComponent,\n} from './types';\n\n// ============================================================================\n// Re-exports from @hai3/framework for convenience\n// ============================================================================\n\n// These re-exports allow users to import everything from @hai3/react\n// without needing to import from @hai3/framework directly\n\nexport {\n // Core\n createHAI3,\n createHAI3App,\n presets,\n\n // Backward compatibility singletons\n screensetRegistry,\n\n // Backward compatibility constants\n ACCOUNTS_DOMAIN,\n\n // I18nRegistry class (capital I for backward compat)\n I18nRegistry,\n\n // Plugins\n screensets,\n themes,\n layout,\n navigation,\n routing,\n i18n,\n effects,\n\n // Registries\n createScreensetRegistry,\n createThemeRegistry,\n createRouteRegistry,\n\n // Flux (Event bus + Store)\n // NOTE: eventBus is re-exported separately below with augmented EventPayloadMap type\n\n // Store\n createStore,\n getStore,\n registerSlice,\n hasSlice,\n createSlice,\n\n // Layout domain exports\n LayoutDomain,\n ScreensetCategory,\n layoutReducer,\n layoutDomainReducers,\n LAYOUT_SLICE_NAME,\n headerSlice,\n footerSlice,\n menuSlice,\n sidebarSlice,\n screenSlice,\n popupSlice,\n overlaySlice,\n headerActions,\n footerActions,\n menuActions,\n sidebarActions,\n screenActions,\n popupActions,\n overlayActions,\n // Individual reducer functions - header\n setUser,\n setHeaderLoading,\n clearUser,\n // Individual reducer functions - footer\n setFooterVisible,\n setFooterConfig,\n toggleMenu,\n setMenuCollapsed,\n setMenuItems,\n setMenuVisible,\n setMenuConfig,\n toggleSidebar,\n setSidebarCollapsed,\n setSidebarPosition,\n setSidebarTitle,\n setSidebarContent,\n setSidebarVisible,\n setSidebarWidth,\n setSidebarConfig,\n setActiveScreen,\n setScreenLoading,\n navigateTo,\n clearActiveScreen,\n openPopup,\n closePopup,\n closeTopPopup,\n closeAllPopups,\n showOverlay,\n hideOverlay,\n setOverlayVisible,\n\n // Tenant (app-level, not layout)\n TENANT_SLICE_NAME,\n tenantSlice,\n tenantActions,\n tenantReducer,\n setTenant,\n setTenantLoading,\n clearTenant,\n // Tenant effects and events\n initTenantEffects,\n changeTenant,\n clearTenantAction,\n setTenantLoadingState,\n TenantEvents,\n\n // Mock (app-level, not layout)\n mockSlice,\n mockActions,\n setMockEnabled,\n // Mock effects and events\n initMockEffects,\n toggleMockMode,\n MockEvents,\n\n // API\n apiRegistry,\n BaseApiService,\n RestProtocol,\n SseProtocol,\n // Protocol-specific mock plugins (replaces generic MockPlugin)\n RestMockPlugin,\n SseMockPlugin,\n MockEventSource,\n // Plugin base classes\n ApiPluginBase,\n ApiPlugin,\n ApiProtocol,\n RestPlugin,\n RestPluginWithConfig,\n SsePlugin,\n SsePluginWithConfig,\n // Type guards\n isShortCircuit,\n isRestShortCircuit,\n isSseShortCircuit,\n // Mock plugin identification\n MOCK_PLUGIN,\n isMockPlugin,\n\n // I18n\n i18nRegistry,\n I18nRegistryImpl,\n createI18nRegistry,\n SUPPORTED_LANGUAGES,\n getLanguageMetadata,\n} from '@hai3/framework';\n\n// Re-export i18n types from @hai3/framework (correct layer access)\nexport { Language, TextDirection, LanguageDisplayMode } from '@hai3/framework';\n\n// Re-export types from @hai3/framework\nexport type {\n // Config\n HAI3Config,\n HAI3Plugin,\n HAI3AppBuilder,\n HAI3App,\n PluginFactory,\n PluginProvides,\n PluginLifecycle,\n ScreensetRegistry,\n ThemeRegistry,\n ThemeConfig,\n RouteRegistry,\n Preset,\n Presets,\n ScreensetsConfig,\n NavigateToScreenPayload,\n NavigateToScreensetPayload,\n ShowPopupPayload,\n ChangeThemePayload,\n SetLanguagePayload,\n\n // Flux (Events + Store)\n EventHandler,\n Subscription,\n\n // Store\n RootState,\n AppDispatch,\n SliceObject,\n HAI3Store,\n\n // Layout\n ScreensetId,\n ScreenId,\n MenuItemConfig,\n ScreenLoader,\n ScreenConfig,\n MenuScreenItem,\n ScreensetDefinition,\n LayoutDomainState,\n HeaderUser,\n HeaderConfig,\n HeaderState,\n FooterConfig,\n FooterState,\n MenuItem,\n MenuState,\n SidebarPosition,\n SidebarState,\n ScreenState,\n PopupConfig,\n PopupState,\n PopupSliceState,\n OverlayConfig,\n OverlayState,\n LayoutState,\n RootStateWithLayout,\n LayoutDomainReducers,\n\n // Tenant types\n Tenant,\n TenantState,\n TenantChangedPayload,\n TenantClearedPayload,\n\n // Mock types\n MockState,\n MockTogglePayload,\n\n // API\n MockMap,\n ApiServiceConfig,\n JsonValue,\n JsonObject,\n JsonPrimitive,\n JsonCompatible,\n SseProtocolConfig,\n RestProtocolConfig,\n // Plugin context types (class-based plugin system)\n ApiRequestContext,\n ApiResponseContext,\n ShortCircuitResponse,\n PluginClass,\n ProtocolClass,\n ProtocolPluginType,\n BasePluginHooks,\n // Protocol-specific types\n RestPluginHooks,\n SsePluginHooks,\n RestRequestContext,\n RestResponseContext,\n ApiPluginErrorContext,\n SseConnectContext,\n EventSourceLike,\n RestShortCircuitResponse,\n SseShortCircuitResponse,\n RestMockConfig,\n SseMockConfig,\n SseMockEvent,\n\n // Backward compatibility type aliases\n ScreensetConfig,\n\n // Theme types\n ThemeApplyFn,\n UikitTheme,\n\n // I18n\n I18nConfig,\n TranslationLoader,\n TranslationMap,\n TranslationDictionary,\n LanguageMetadata,\n I18nRegistryType,\n} from '@hai3/framework';\n\n// ============================================================================\n// Module Augmentation Support - EventPayloadMap Re-declaration\n// ============================================================================\n\n/**\n * Re-declare EventPayloadMap to enable module augmentation on @hai3/react\n *\n * This creates a new declaration site in @hai3/react that TypeScript can augment.\n * App-layer code can now use `declare module '@hai3/react'` instead of importing\n * from L1 packages directly, maintaining proper layer architecture.\n *\n * ARCHITECTURE: This pattern allows L3+ code to augment event types without\n * violating layer boundaries by importing from L1 (@hai3/state).\n *\n * IMPORTANT: We must also re-export eventBus with the augmented type to ensure\n * type safety. The eventBus instance uses this augmented EventPayloadMap.\n *\n * @example\n * ```typescript\n * // In app-layer code (e.g., src/app/events/bootstrapEvents.ts)\n * import '@hai3/react';\n *\n * declare module '@hai3/react' {\n * interface EventPayloadMap {\n * 'app/user/fetch': void;\n * 'app/user/loaded': { user: ApiUser };\n * }\n * }\n * ```\n */\nimport type { EventPayloadMap as FrameworkEventPayloadMap } from '@hai3/framework';\nimport type { EventBus } from '@hai3/state';\nimport { eventBus as frameworkEventBus } from '@hai3/framework';\n\nexport interface EventPayloadMap extends FrameworkEventPayloadMap {}\n\n/**\n * Re-export eventBus with augmented EventPayloadMap type.\n * This ensures that code importing eventBus from @hai3/react gets\n * type-safe access to both framework events and app-layer augmented events.\n */\nexport const eventBus: EventBus<EventPayloadMap> = frameworkEventBus as EventBus<EventPayloadMap>;\n"],"mappings":"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","names":["useMemo","i18nRegistry","useMemo","useEffect","useMemo","useCallback","useSyncExternalStore","i18nRegistry","useSyncExternalStore","useCallback","useMemo","useEffect","useCallback","useCallback","useCallback","useMemo","useSyncExternalStore","useSyncExternalStore","useCallback","useMemo","themes","useState","useEffect","jsx","useState","useEffect","createHAI3App"]}
|
package/dist/types.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
|
-
import { HAI3Config, HAI3App,
|
|
2
|
+
import { HAI3Config, HAI3App, RootState, Language, LanguageMetadata, MenuItemConfig, ScreensetDefinition, ScreensetCategory } from '@hai3/framework';
|
|
3
3
|
export { HAI3App, HAI3Config, MenuItemConfig, ScreensetCategory, ScreensetDefinition } from '@hai3/framework';
|
|
4
4
|
|
|
5
5
|
/**
|
package/dist/types.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
|
-
import { HAI3Config, HAI3App,
|
|
2
|
+
import { HAI3Config, HAI3App, RootState, Language, LanguageMetadata, MenuItemConfig, ScreensetDefinition, ScreensetCategory } from '@hai3/framework';
|
|
3
3
|
export { HAI3App, HAI3Config, MenuItemConfig, ScreensetCategory, ScreensetDefinition } from '@hai3/framework';
|
|
4
4
|
|
|
5
5
|
/**
|