@hai3/react 0.4.0-alpha.0 → 0.4.0-alpha.1
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/commands/hai3-new-component.md +5 -31
- package/commands/hai3-new-screen.md +12 -53
- package/commands/hai3-new-screenset.md +14 -51
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -5,8 +5,7 @@
|
|
|
5
5
|
1) Check if @hai3/uikit has equivalent component first.
|
|
6
6
|
2) Gather requirements from user.
|
|
7
7
|
3) Determine type: screenset composite (default) | screenset base (rare).
|
|
8
|
-
4)
|
|
9
|
-
5) After approval, apply implementation.
|
|
8
|
+
4) Implement.
|
|
10
9
|
|
|
11
10
|
## CHECK GLOBAL UIKIT FIRST
|
|
12
11
|
- REQUIRED: Before creating screenset component, verify @hai3/uikit lacks equivalent.
|
|
@@ -25,31 +24,9 @@ Ask user for:
|
|
|
25
24
|
- uikit/composite/: Screenset-specific composites (theme tokens only).
|
|
26
25
|
- uikit/base/: Rare primitives needing inline styles (needs strong justification).
|
|
27
26
|
|
|
28
|
-
### STEP 1:
|
|
29
|
-
Create openspec/changes/add-{screenset}-{component}/ with:
|
|
27
|
+
### STEP 1: Implementation
|
|
30
28
|
|
|
31
|
-
####
|
|
32
|
-
- Summary: Add new screenset-specific component to {screenset}.
|
|
33
|
-
- Details: Screenset, component name, placement (base/composite), description, props.
|
|
34
|
-
- Justification (if base/): Why global uikit insufficient, why composite insufficient.
|
|
35
|
-
- Implementation: HAI3 patterns (no Redux, no business logic).
|
|
36
|
-
|
|
37
|
-
#### tasks.md
|
|
38
|
-
- Create component file in uikit/{base|composite}/.
|
|
39
|
-
- Implement props interface.
|
|
40
|
-
- Add theme token styling (or inline for base/).
|
|
41
|
-
- Export from local index if needed.
|
|
42
|
-
- Validate: npm run arch:check.
|
|
43
|
-
- Test in UI.
|
|
44
|
-
|
|
45
|
-
### STEP 2: Wait for Approval
|
|
46
|
-
Tell user: "Review proposal at openspec/changes/add-{screenset}-{component}/."
|
|
47
|
-
Tell user: "Run /openspec:apply add-{screenset}-{component} to implement."
|
|
48
|
-
|
|
49
|
-
### STEP 3: Apply Implementation (after approval)
|
|
50
|
-
When user runs /openspec:apply:
|
|
51
|
-
|
|
52
|
-
#### 3.1 Create Component
|
|
29
|
+
#### 1.1 Create Component
|
|
53
30
|
File: src/screensets/{screenset}/uikit/{base|composite}/{ComponentName}.tsx
|
|
54
31
|
- composite/: Use theme tokens only (no inline styles).
|
|
55
32
|
- base/: May use inline styles (rare, needs justification).
|
|
@@ -58,16 +35,13 @@ File: src/screensets/{screenset}/uikit/{base|composite}/{ComponentName}.tsx
|
|
|
58
35
|
- NO Redux or state management.
|
|
59
36
|
- Accept value/onChange pattern for state.
|
|
60
37
|
|
|
61
|
-
####
|
|
38
|
+
#### 1.2 Export
|
|
62
39
|
Export from local index if needed.
|
|
63
40
|
|
|
64
|
-
####
|
|
41
|
+
#### 1.3 Validation
|
|
65
42
|
Run: npm run arch:check && npm run dev
|
|
66
43
|
Test component in UI.
|
|
67
44
|
|
|
68
|
-
#### 3.4 Mark Tasks Complete
|
|
69
|
-
Update tasks.md to mark all completed tasks.
|
|
70
|
-
|
|
71
45
|
## RULES
|
|
72
46
|
- REQUIRED: Check @hai3/uikit first; screenset uikit only if missing.
|
|
73
47
|
- REQUIRED: Screenset base components need strong justification.
|
|
@@ -1,15 +1,10 @@
|
|
|
1
1
|
<!-- @standalone -->
|
|
2
2
|
# hai3:new-screen - Add New Screen
|
|
3
3
|
|
|
4
|
-
## PREREQUISITES (CRITICAL - STOP IF FAILED)
|
|
5
|
-
FORBIDDEN: Proceeding without proposal.
|
|
6
|
-
FORBIDDEN: Creating screen manually without OpenSpec workflow.
|
|
7
|
-
|
|
8
4
|
## AI WORKFLOW (REQUIRED)
|
|
9
5
|
1) Read .ai/targets/SCREENSETS.md and .ai/targets/EVENTS.md before starting.
|
|
10
6
|
2) Gather requirements from user (including UI sections).
|
|
11
|
-
3)
|
|
12
|
-
4) After approval, implement via `.claude/commands/openspec-apply.md` (REQUIRED).
|
|
7
|
+
3) Implement.
|
|
13
8
|
|
|
14
9
|
## GATHER REQUIREMENTS
|
|
15
10
|
Ask user for:
|
|
@@ -18,53 +13,7 @@ Ask user for:
|
|
|
18
13
|
- UI sections (e.g., "header, form, data table").
|
|
19
14
|
- Add to menu? (Y/N)
|
|
20
15
|
|
|
21
|
-
## STEP 1:
|
|
22
|
-
Execute openspec:proposal command (see `.claude/commands/openspec-proposal.md`).
|
|
23
|
-
Proposal name: `add-{screenset}-{screen}`
|
|
24
|
-
|
|
25
|
-
### proposal.md content
|
|
26
|
-
```
|
|
27
|
-
# Proposal: Add {ScreenName} Screen
|
|
28
|
-
|
|
29
|
-
## Summary
|
|
30
|
-
Add new screen "{screenName}" to {screenset} screenset.
|
|
31
|
-
|
|
32
|
-
## Details
|
|
33
|
-
- Screenset: {screenset}
|
|
34
|
-
- Screen name: {screenName}
|
|
35
|
-
- Add to menu: {Y/N}
|
|
36
|
-
|
|
37
|
-
## Component Plan
|
|
38
|
-
- REQUIRED: Use @hai3/uikit components first; local uikit only if missing.
|
|
39
|
-
- uikit/base/: rare primitives (inline styles allowed, needs justification)
|
|
40
|
-
- uikit/composite/: screenset composites (theme tokens only)
|
|
41
|
-
- screens/{screen}/components/: screen-specific components
|
|
42
|
-
|
|
43
|
-
## Data Flow
|
|
44
|
-
- Uses existing screenset events/slices per EVENTS.md
|
|
45
|
-
- Screen dispatches actions, never direct slice updates
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
### tasks.md minimum required tasks
|
|
49
|
-
NOTE: Proposal may include additional tasks, but MUST include these:
|
|
50
|
-
```
|
|
51
|
-
- [ ] Add screen ID to ids.ts
|
|
52
|
-
- [ ] Create components per Component Plan (BEFORE screen file)
|
|
53
|
-
- [ ] Create screen (orchestrates components, follows EVENTS.md data flow)
|
|
54
|
-
- [ ] Add i18n files for all languages
|
|
55
|
-
- [ ] Add to menu (if requested)
|
|
56
|
-
- [ ] Validate: `npm run type-check && npm run lint`
|
|
57
|
-
- [ ] Test via Chrome DevTools MCP
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
## STEP 2: Wait for Approval
|
|
61
|
-
Tell user: "Review proposal at `openspec/changes/add-{screenset}-{screen}/`."
|
|
62
|
-
Tell user: "Execute openspec:apply command to implement."
|
|
63
|
-
|
|
64
|
-
## STEP 3: Implementation (via openspec:apply)
|
|
65
|
-
BEFORE executing openspec:apply, verify tasks.md contains all minimum required tasks above.
|
|
66
|
-
Execute openspec:apply command (see `.claude/commands/openspec-apply.md`).
|
|
67
|
-
Follow tasks.md strictly:
|
|
16
|
+
## STEP 1: Implementation
|
|
68
17
|
1) Add screen ID to ids.ts.
|
|
69
18
|
2) Create components BEFORE screen file per Component Plan.
|
|
70
19
|
3) Create screen following data flow rules from .ai/targets/EVENTS.md:
|
|
@@ -79,3 +28,13 @@ Follow tasks.md strictly:
|
|
|
79
28
|
- Test UI interactions and data flow
|
|
80
29
|
- Verify translations load correctly
|
|
81
30
|
- STOP if MCP connection fails
|
|
31
|
+
|
|
32
|
+
## COMPONENT PLAN
|
|
33
|
+
- REQUIRED: Use @hai3/uikit components first; local uikit only if missing.
|
|
34
|
+
- uikit/base/: rare primitives (inline styles allowed, needs justification)
|
|
35
|
+
- uikit/composite/: screenset composites (theme tokens only)
|
|
36
|
+
- screens/{screen}/components/: screen-specific components
|
|
37
|
+
|
|
38
|
+
## DATA FLOW
|
|
39
|
+
- Uses existing screenset events/slices per EVENTS.md
|
|
40
|
+
- Screen dispatches actions, never direct slice updates
|
|
@@ -4,15 +4,13 @@
|
|
|
4
4
|
## PREREQUISITES (CRITICAL - STOP IF FAILED)
|
|
5
5
|
Run `hai3 --version`.
|
|
6
6
|
STOP: If fails, tell user to install.
|
|
7
|
-
FORBIDDEN: Proceeding without CLI tools.
|
|
8
7
|
FORBIDDEN: Creating screenset manually or by copying peers.
|
|
9
8
|
|
|
10
9
|
## AI WORKFLOW (REQUIRED)
|
|
11
10
|
1) Check prerequisites above.
|
|
12
11
|
2) Read .ai/targets/SCREENSETS.md and .ai/targets/EVENTS.md before starting.
|
|
13
12
|
3) Gather requirements from user (including UI sections).
|
|
14
|
-
4)
|
|
15
|
-
5) After approval, implement via `.claude/commands/openspec-apply.md` (REQUIRED).
|
|
13
|
+
4) Implement.
|
|
16
14
|
|
|
17
15
|
## GATHER REQUIREMENTS
|
|
18
16
|
Ask user for:
|
|
@@ -21,54 +19,7 @@ Ask user for:
|
|
|
21
19
|
- Initial screens.
|
|
22
20
|
- UI sections per screen (e.g., "stats cards, charts, activity feed").
|
|
23
21
|
|
|
24
|
-
## STEP 1:
|
|
25
|
-
Execute openspec:proposal command (see `.claude/commands/openspec-proposal.md`).
|
|
26
|
-
Proposal name: `add-{screenset-name}`
|
|
27
|
-
|
|
28
|
-
### proposal.md content
|
|
29
|
-
```
|
|
30
|
-
# Proposal: Add {ScreensetName} Screenset
|
|
31
|
-
|
|
32
|
-
## Summary
|
|
33
|
-
Add new {category} screenset "{screensetName}" with {screens} screen(s).
|
|
34
|
-
|
|
35
|
-
## Details
|
|
36
|
-
- Name: {screensetName}
|
|
37
|
-
- Category: {category}
|
|
38
|
-
- Initial screens: {screens}
|
|
39
|
-
|
|
40
|
-
## Component Plan
|
|
41
|
-
- REQUIRED: Use @hai3/uikit components first; local uikit only if missing.
|
|
42
|
-
- uikit/base/: rare primitives (inline styles allowed, needs justification)
|
|
43
|
-
- uikit/composite/: screenset composites (theme tokens only)
|
|
44
|
-
- components/: multi-screen components
|
|
45
|
-
- screens/{screen}/components/: screen-specific components
|
|
46
|
-
|
|
47
|
-
## Data Flow
|
|
48
|
-
- Events: {domain events per EVENTS.md}
|
|
49
|
-
- State: slices/, events/, effects/, actions/
|
|
50
|
-
- API: api/{Name}ApiService.ts with mocks
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
### tasks.md minimum required tasks
|
|
54
|
-
NOTE: Proposal may include additional tasks, but MUST include these:
|
|
55
|
-
```
|
|
56
|
-
- [ ] Create screenset: `hai3 screenset create {name} --category={category}`
|
|
57
|
-
- [ ] Create components per Component Plan (BEFORE screen file)
|
|
58
|
-
- [ ] Implement data flow per EVENTS.md (actions emit events, effects update slices)
|
|
59
|
-
- [ ] Add API service with mocks
|
|
60
|
-
- [ ] Validate: `npm run type-check && npm run arch:check && npm run lint`
|
|
61
|
-
- [ ] Test via Chrome DevTools MCP
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
## STEP 2: Wait for Approval
|
|
65
|
-
Tell user: "Review proposal at `openspec/changes/add-{screenset-name}/`."
|
|
66
|
-
Tell user: "Execute openspec:apply command to implement."
|
|
67
|
-
|
|
68
|
-
## STEP 3: Implementation (via openspec:apply)
|
|
69
|
-
BEFORE executing openspec:apply, verify tasks.md contains all minimum required tasks above.
|
|
70
|
-
Execute openspec:apply command (see `.claude/commands/openspec-apply.md`).
|
|
71
|
-
Follow tasks.md strictly:
|
|
22
|
+
## STEP 1: Implementation
|
|
72
23
|
1) Create screenset via `hai3 screenset create` (REQUIRED).
|
|
73
24
|
2) Create components BEFORE screen file per Component Plan.
|
|
74
25
|
3) Implement data flow per .ai/targets/EVENTS.md:
|
|
@@ -83,3 +34,15 @@ Follow tasks.md strictly:
|
|
|
83
34
|
- Test user interactions trigger correct events
|
|
84
35
|
- Verify state updates via Redux DevTools
|
|
85
36
|
- STOP if MCP connection fails
|
|
37
|
+
|
|
38
|
+
## COMPONENT PLAN
|
|
39
|
+
- REQUIRED: Use @hai3/uikit components first; local uikit only if missing.
|
|
40
|
+
- uikit/base/: rare primitives (inline styles allowed, needs justification)
|
|
41
|
+
- uikit/composite/: screenset composites (theme tokens only)
|
|
42
|
+
- components/: multi-screen components
|
|
43
|
+
- screens/{screen}/components/: screen-specific components
|
|
44
|
+
|
|
45
|
+
## DATA FLOW
|
|
46
|
+
- Events: {domain events per EVENTS.md}
|
|
47
|
+
- State: slices/, events/, effects/, actions/
|
|
48
|
+
- API: api/{Name}ApiService.ts with mocks
|
package/dist/index.cjs
CHANGED
|
@@ -32,6 +32,7 @@ __export(src_exports, {
|
|
|
32
32
|
HAI3_ACTION_LOAD_EXT: () => import_framework13.HAI3_ACTION_LOAD_EXT,
|
|
33
33
|
HAI3_ACTION_MOUNT_EXT: () => import_framework13.HAI3_ACTION_MOUNT_EXT,
|
|
34
34
|
HAI3_ACTION_UNMOUNT_EXT: () => import_framework13.HAI3_ACTION_UNMOUNT_EXT,
|
|
35
|
+
HAI3_MFE_ENTRY_MF: () => import_framework12.HAI3_MFE_ENTRY_MF,
|
|
35
36
|
HAI3_OVERLAY_DOMAIN: () => import_framework11.HAI3_OVERLAY_DOMAIN,
|
|
36
37
|
HAI3_POPUP_DOMAIN: () => import_framework11.HAI3_POPUP_DOMAIN,
|
|
37
38
|
HAI3_SCREEN_DOMAIN: () => import_framework11.HAI3_SCREEN_DOMAIN,
|
|
@@ -738,6 +739,7 @@ var eventBus = import_framework18.eventBus;
|
|
|
738
739
|
HAI3_ACTION_LOAD_EXT,
|
|
739
740
|
HAI3_ACTION_MOUNT_EXT,
|
|
740
741
|
HAI3_ACTION_UNMOUNT_EXT,
|
|
742
|
+
HAI3_MFE_ENTRY_MF,
|
|
741
743
|
HAI3_OVERLAY_DOMAIN,
|
|
742
744
|
HAI3_POPUP_DOMAIN,
|
|
743
745
|
HAI3_SCREEN_DOMAIN,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/HAI3Provider.tsx","../src/HAI3Context.tsx","../src/mfe/MfeContext.tsx","../src/mfe/MfeProvider.tsx","../src/hooks/useAppDispatch.ts","../src/hooks/useAppSelector.ts","../src/hooks/useTranslation.ts","../src/hooks/useScreenTranslations.ts","../src/hooks/useFormatters.ts","../src/hooks/useTheme.ts","../src/mfe/hooks/useMfeBridge.ts","../src/mfe/hooks/useSharedProperty.ts","../src/mfe/hooks/useHostAction.ts","../src/mfe/hooks/useDomainExtensions.ts","../src/mfe/hooks/useRegisteredPackages.ts","../src/mfe/hooks/useActivePackage.ts","../src/mfe/components/RefContainerProvider.ts","../src/mfe/components/ExtensionDomainSlot.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 * - MFE context, hooks, and components\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 useFormatters,\n useTheme,\n} from './hooks';\n\n// ============================================================================\n// MFE Context and Hooks\n// ============================================================================\n\nexport {\n MfeContext,\n useMfeContext,\n MfeProvider,\n useMfeBridge,\n useSharedProperty,\n useHostAction,\n useDomainExtensions,\n useRegisteredPackages,\n useActivePackage,\n RefContainerProvider,\n ExtensionDomainSlot,\n} from './mfe';\n\nexport type {\n MfeContextValue,\n MfeProviderProps,\n ExtensionDomainSlotProps,\n} from './mfe';\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\nexport type {\n HAI3ProviderProps,\n UseHAI3Return,\n UseAppSelector,\n UseAppDispatchReturn,\n UseTranslationReturn,\n UseScreenTranslationsReturn,\n UseFormattersReturn,\n UseThemeReturn,\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 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 i18n,\n effects,\n\n // Registries\n createThemeRegistry,\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 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 ThemeRegistry,\n ThemeConfig,\n Preset,\n Presets,\n ScreensetsConfig,\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 ReducerPayload,\n\n // Layout\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 // 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// MFE Re-exports from @hai3/framework (Layering Compliance)\n// ============================================================================\n\n// MFE Plugin factories\nexport {\n microfrontends,\n mock,\n} from '@hai3/framework';\n\n// MFE Action functions\nexport {\n loadExtension,\n mountExtension,\n unmountExtension,\n registerExtension,\n unregisterExtension,\n} from '@hai3/framework';\n\n// MFE Selectors\nexport {\n selectExtensionState,\n selectRegisteredExtensions,\n selectExtensionError,\n} from '@hai3/framework';\n\n// MFE Domain constants\nexport {\n HAI3_POPUP_DOMAIN,\n HAI3_SIDEBAR_DOMAIN,\n HAI3_SCREEN_DOMAIN,\n HAI3_OVERLAY_DOMAIN,\n // Base ExtensionDomain constants\n screenDomain,\n sidebarDomain,\n popupDomain,\n overlayDomain,\n} from '@hai3/framework';\n\n// MFE Type constants\nexport {\n HAI3_SCREEN_EXTENSION_TYPE,\n} from '@hai3/framework';\n\n// MFE Action constants\nexport {\n HAI3_ACTION_LOAD_EXT,\n HAI3_ACTION_MOUNT_EXT,\n HAI3_ACTION_UNMOUNT_EXT,\n} from '@hai3/framework';\n\n// MFE Shared Property constants\nexport {\n HAI3_SHARED_PROPERTY_THEME,\n HAI3_SHARED_PROPERTY_LANGUAGE,\n} from '@hai3/framework';\n\n// MFE Types\nexport type {\n ChildMfeBridge,\n ParentMfeBridge,\n Extension,\n ScreenExtension,\n ExtensionPresentation,\n ExtensionDomain,\n ActionsChain,\n Action,\n SharedProperty,\n LifecycleStage,\n LifecycleHook,\n MfeEntryLifecycle,\n MfeEntry,\n MfeEntryMF,\n JSONSchema,\n ValidationError,\n ValidationResult,\n LoadExtPayload,\n MountExtPayload,\n UnmountExtPayload,\n ScreensetsRegistryConfig,\n TypeSystemPlugin,\n} from '@hai3/framework';\n\n// MFE Abstract classes\nexport {\n MfeHandler,\n MfeBridgeFactory,\n ScreensetsRegistry,\n ScreensetsRegistryFactory,\n screensetsRegistryFactory,\n ContainerProvider,\n} from '@hai3/framework';\n\n// MFE Concrete implementations\nexport { MfeHandlerMF, gtsPlugin } from '@hai3/framework';\n\n// MFE Utilities\nexport {\n createShadowRoot,\n injectCssVariables,\n extractGtsPackage,\n} from '@hai3/framework';\n\n// MFE Plugin types\nexport type {\n MfeState,\n ExtensionRegistrationState,\n RegisterExtensionPayload,\n UnregisterExtensionPayload,\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, EventBus } from '@hai3/framework';\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 { MfeProvider } from './mfe/MfeProvider';\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()).use(microfrontends()).build();\n * <HAI3Provider app={app}>\n * <App />\n * </HAI3Provider>\n *\n * // With MFE bridge (for MFE components)\n * <HAI3Provider mfeBridge={{ bridge, extensionId, domainId }}>\n * <MyMfeApp />\n * </HAI3Provider>\n * ```\n */\nexport const HAI3Provider: React.FC<HAI3ProviderProps> = ({\n children,\n config,\n app: providedApp,\n mfeBridge,\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 // Render content\n const content = (\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 // Wrap with MfeProvider if bridge is provided\n if (mfeBridge) {\n return (\n <MfeProvider value={mfeBridge}>\n {content}\n </MfeProvider>\n );\n }\n\n return content;\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 * MFE Context - React context for MFE state\n *\n * Provides MFE bridge and metadata to child components.\n * Used by MFE components to access their runtime context.\n *\n * React Layer: L3 (Depends on @hai3/framework)\n */\n\nimport { createContext, useContext } from 'react';\nimport type { ChildMfeBridge } from '@hai3/framework';\n\n// ============================================================================\n// Context Value Types\n// ============================================================================\n\n/**\n * MFE Context Value\n * Contains bridge and metadata about the MFE instance.\n */\nexport interface MfeContextValue {\n /** Child bridge for communication with host */\n bridge: ChildMfeBridge;\n /** Extension ID */\n extensionId: string;\n /** Domain ID where MFE is mounted */\n domainId: string;\n}\n\n// ============================================================================\n// Context Definition\n// ============================================================================\n\n/**\n * MFE Context\n * Holds the MFE bridge and metadata for child components.\n */\nexport const MfeContext = createContext<MfeContextValue | null>(null);\n\n/**\n * Use the MFE context.\n * Throws if used outside of MFE context.\n *\n * @returns The MFE context value\n */\nexport function useMfeContext(): MfeContextValue {\n const context = useContext(MfeContext);\n\n if (!context) {\n throw new Error(\n 'useMfeContext must be used within a MfeProvider. ' +\n 'This hook can only be used inside MFE components.'\n );\n }\n\n return context;\n}\n","/**\n * MFE Provider - Provides MFE context to child components\n *\n * Wraps MFE components with bridge and metadata.\n * Used by the MFE mounting system.\n *\n * React Layer: L3 (Depends on @hai3/framework)\n */\n\nimport React from 'react';\nimport { MfeContext, type MfeContextValue } from './MfeContext';\n\n// ============================================================================\n// Provider Props\n// ============================================================================\n\n/**\n * MFE Provider Props\n */\nexport interface MfeProviderProps {\n /** MFE context value */\n value: MfeContextValue;\n /** Child components */\n children: React.ReactNode;\n}\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\n/**\n * MFE Provider Component\n *\n * Provides MFE bridge and metadata to child components.\n * Used by the MFE mounting system to wrap MFE components.\n *\n * @example\n * ```tsx\n * <MfeProvider value={{ bridge, extensionId, domainId }}>\n * <MyMfeComponent />\n * </MfeProvider>\n * ```\n */\nexport const MfeProvider: React.FC<MfeProviderProps> = ({ value, children }) => {\n return (\n <MfeContext.Provider value={value}>\n {children}\n </MfeContext.Provider>\n );\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 via framework action (emits event bus for MFE propagation)\n const setLanguage = useCallback(\n (lang: Language) => {\n if (app.actions.setLanguage) {\n app.actions.setLanguage({ language: lang });\n }\n },\n [app.actions]\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 * useFormatters Hook - Locale-aware formatters\n *\n * Returns formatters that use i18nRegistry.getLanguage() internally.\n * Calls useTranslation() so the component re-renders when language changes.\n *\n * React Layer: L3\n */\n\nimport { useMemo } from 'react';\nimport {\n formatDate as formatDateFn,\n formatTime as formatTimeFn,\n formatDateTime as formatDateTimeFn,\n formatRelative as formatRelativeFn,\n formatNumber as formatNumberFn,\n formatPercent as formatPercentFn,\n formatCompact as formatCompactFn,\n formatCurrency as formatCurrencyFn,\n compareStrings as compareStringsFn,\n createCollator as createCollatorFn,\n} from '@hai3/framework';\nimport type { UseFormattersReturn } from '../types';\nimport { useTranslation } from './useTranslation';\n\n/**\n * Hook for accessing locale-aware formatters (date, number, currency, sort).\n *\n * Formatters use the current app language from i18nRegistry.getLanguage().\n * Re-renders when language changes via useTranslation() subscription.\n *\n * @returns Object with formatDate, formatTime, formatDateTime, formatRelative,\n * formatNumber, formatPercent, formatCompact, formatCurrency, compareStrings, createCollator\n *\n * @example\n * ```tsx\n * const { formatDate, formatCurrency } = useFormatters();\n * return (\n * <span>{formatDate(new Date(), 'short')}</span>\n * <span>{formatCurrency(99.99, 'USD')}</span>\n * );\n * ```\n */\nexport function useFormatters(): UseFormattersReturn {\n // useTranslation() subscribes to language changes so this component re-renders\n // when language changes; formatters read i18nRegistry.getLanguage() at call time\n const { language } = useTranslation();\n\n return useMemo<UseFormattersReturn>(\n () => {\n void language; // re-run when language changes so formatters see new locale\n return {\n formatDate: formatDateFn,\n formatTime: formatTimeFn,\n formatDateTime: formatDateTimeFn,\n formatRelative: formatRelativeFn,\n formatNumber: formatNumberFn,\n formatPercent: formatPercentFn,\n formatCompact: formatCompactFn,\n formatCurrency: formatCurrencyFn,\n compareStrings: compareStringsFn,\n createCollator: createCollatorFn,\n };\n },\n [language]\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 * useMfeBridge Hook - MFE bridge access\n *\n * Returns the ChildMfeBridge from context for communication with host.\n *\n * React Layer: L3\n */\n\nimport { useMfeContext } from '../MfeContext';\nimport type { ChildMfeBridge } from '@hai3/framework';\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for accessing the MFE bridge.\n *\n * Returns the ChildMfeBridge instance for communication with the host.\n * Must be used within a MfeProvider (i.e., inside an MFE component).\n *\n * @returns Child MFE bridge\n *\n * @example\n * ```tsx\n * function MyMfeComponent() {\n * const bridge = useMfeBridge();\n *\n * // Bridge methods:\n * // bridge.executeActionsChain(chain);\n * // bridge.subscribeToProperty(propertyTypeId, callback);\n *\n * return <div>Domain: {bridge.domainId}</div>;\n * }\n * ```\n */\nexport function useMfeBridge(): ChildMfeBridge {\n const { bridge } = useMfeContext();\n return bridge;\n}\n","/**\n * useSharedProperty Hook - Shared property subscription\n *\n * Subscribes to shared property updates from the host.\n *\n * React Layer: L3\n */\n\nimport { useSyncExternalStore, useCallback } from 'react';\nimport { useMfeContext } from '../MfeContext';\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for subscribing to a shared property.\n *\n * Subscribes to property updates from the host and returns the current value.\n * Must be used within a MfeProvider (i.e., inside an MFE component).\n *\n * NOTE: This hook provides the interface and uses useSyncExternalStore with a stub subscription.\n * Full bridge subscription should be implemented when bridge methods are available.\n *\n * @param _propertyTypeId - Type ID of the shared property to subscribe to (currently unused)\n * @returns Current property value\n *\n * @example\n * ```tsx\n * function MyMfeComponent() {\n * const userData = useSharedProperty('gts.hai3.mfes.comm.shared_property.v1~myapp.user_data.v1');\n *\n * return <div>User: {userData?.name}</div>;\n * }\n * ```\n */\nexport function useSharedProperty<T = unknown>(propertyTypeId: string): T | undefined {\n // Enforce MfeProvider context requirement\n const { bridge } = useMfeContext(); // Throws if not in MfeProvider\n\n // Subscribe to property updates via bridge\n const subscribe = useCallback((callback: () => void) => {\n return bridge.subscribeToProperty(propertyTypeId, () => {\n // When property changes, trigger React re-render\n callback();\n });\n }, [bridge, propertyTypeId]);\n\n const getSnapshot = useCallback(() => {\n const property = bridge.getProperty(propertyTypeId);\n // Type narrowing: caller specifies expected type T (standard React hook pattern)\n // Similar to useState<T>, useContext<T> - type safety is caller's responsibility\n return property?.value as T | undefined;\n }, [bridge, propertyTypeId]);\n\n const value = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n return value;\n}\n","/**\n * useHostAction Hook - Host action requests\n *\n * Returns a callback to request host actions via the bridge.\n *\n * React Layer: L3\n */\n\nimport { useCallback } from 'react';\nimport { useMfeContext } from '../MfeContext';\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for requesting host actions.\n *\n * Returns a callback function that sends an actions chain to the host.\n * Must be used within a MfeProvider (i.e., inside an MFE component).\n *\n * NOTE: This hook provides the interface. Bridge executeActionsChain() delegates to the registry.\n *\n * @param actionTypeId - Type ID of the action to request\n * @returns Callback function to request the action with payload\n *\n * @example\n * ```tsx\n * function MyMfeComponent() {\n * const requestNavigation = useHostAction('gts.hai3.mfes.comm.action.v1~myapp.navigate.v1');\n *\n * const handleClick = () => {\n * requestNavigation({ path: '/dashboard' });\n * };\n *\n * return <button onClick={handleClick}>Navigate</button>;\n * }\n * ```\n */\nexport function useHostAction<TPayload extends Record<string, unknown> = Record<string, unknown>>(\n actionTypeId: string\n): (payload?: TPayload) => void {\n // Enforce MfeProvider context requirement\n const { bridge } = useMfeContext(); // Throws if not in MfeProvider\n\n return useCallback((payload?: TPayload) => {\n // Construct an ActionsChain with the action\n // With the constraint, TPayload extends Record<string, unknown>,\n // so this is a safe widening from specific to general\n const chain = {\n action: {\n type: actionTypeId,\n target: bridge.domainId,\n payload: payload as Record<string, unknown> | undefined,\n },\n };\n\n // Send the chain to the host\n bridge.executeActionsChain(chain).catch((error: Error) => {\n console.error(\n `[useHostAction] Failed to send action '${actionTypeId}':`,\n error\n );\n });\n }, [actionTypeId, bridge]);\n}\n","/**\n * useDomainExtensions Hook - Domain extension list subscription\n *\n * Subscribes to store changes to detect when extensions are registered or unregistered,\n * and returns the current list of extensions for a domain.\n *\n * React Layer: L3\n */\n\nimport { useSyncExternalStore, useCallback, useRef } from 'react';\nimport { useHAI3 } from '../../HAI3Context';\nimport type { Extension } from '@hai3/framework';\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for observing extensions registered for a domain.\n *\n * Subscribes to the HAI3 store to detect registration state changes,\n * and returns the current list of extensions for the specified domain.\n *\n * @param domainId - Domain ID to query extensions for\n * @returns Array of extensions currently registered for the domain\n *\n * @example\n * ```tsx\n * function SidebarExtensions() {\n * const extensions = useDomainExtensions('gts.hai3.mfes.ext.domain.v1~hai3.screensets.layout.sidebar.v1');\n *\n * return (\n * <div>\n * {extensions.map(ext => (\n * <div key={ext.id}>{ext.id}</div>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function useDomainExtensions(domainId: string): Extension[] {\n const app = useHAI3();\n const registry = app.screensetsRegistry;\n\n if (!registry) {\n throw new Error(\n 'useDomainExtensions requires the microfrontends plugin. ' +\n 'Add microfrontends() to your HAI3 app configuration.'\n );\n }\n\n // Subscribe to store changes.\n // Any dispatch (including registration state updates) triggers a snapshot check.\n // The snapshot comparison ensures only actual extension list changes cause re-renders.\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n return app.store.subscribe(onStoreChange);\n },\n [app.store]\n );\n\n // Cache the snapshot to maintain referential stability for useSyncExternalStore.\n // Only update when the extension IDs actually change.\n const cacheRef = useRef<{ ids: string; extensions: Extension[] }>({ ids: '', extensions: [] });\n\n const getSnapshot = useCallback(() => {\n const extensions = registry.getExtensionsForDomain(domainId);\n const ids = extensions.map(e => e.id).join(',');\n if (ids !== cacheRef.current.ids) {\n cacheRef.current = { ids, extensions };\n }\n return cacheRef.current.extensions;\n }, [registry, domainId]);\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n}\n","/**\n * useRegisteredPackages Hook - Registered GTS packages subscription\n *\n * Subscribes to store changes to detect when extensions are registered or unregistered,\n * and returns the current list of registered GTS packages.\n *\n * React Layer: L3\n */\n\nimport { useSyncExternalStore, useCallback, useRef } from 'react';\nimport { useHAI3 } from '../../HAI3Context';\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for observing registered GTS packages.\n *\n * Subscribes to the HAI3 store to detect registration state changes,\n * and returns the current list of GTS packages extracted from registered\n * extensions.\n *\n * ARCHITECTURAL NOTE ON STORE SUBSCRIPTION COUPLING:\n * This hook uses `useSyncExternalStore` with `app.store.subscribe`, which\n * fires on any Redux dispatch. Since `registerExtension()` dispatches to\n * the mfe store slice, the subscription WILL trigger when packages change.\n * The `getSnapshot` function calls `screensetsRegistry.getRegisteredPackages()`\n * which reads the private `packages` Map. This works because every package\n * map mutation (in registerExtension/unregisterExtension) is always\n * accompanied by a store dispatch in the same serializer callback.\n *\n * IMPORTANT: If a future change mutates the packages map WITHOUT a store\n * dispatch, this hook would fail to re-render. Keep this coupling documented.\n *\n * @returns Array of GTS package strings currently registered\n *\n * @example\n * ```tsx\n * function PackageList() {\n * const packages = useRegisteredPackages();\n *\n * return (\n * <div>\n * {packages.map(pkg => (\n * <div key={pkg}>{pkg}</div>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function useRegisteredPackages(): string[] {\n const app = useHAI3();\n const registry = app.screensetsRegistry;\n\n if (!registry) {\n throw new Error(\n 'useRegisteredPackages requires the microfrontends plugin. ' +\n 'Add microfrontends() to your HAI3 app configuration.'\n );\n }\n\n // Subscribe to store changes.\n // Any dispatch (including registration state updates) triggers a snapshot check.\n // The snapshot comparison ensures only actual package list changes cause re-renders.\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n return app.store.subscribe(onStoreChange);\n },\n [app.store]\n );\n\n // Cache the snapshot to maintain referential stability for useSyncExternalStore.\n // Only update when the package list actually changes.\n const cacheRef = useRef<{ packages: string; list: string[] }>({ packages: '', list: [] });\n\n const getSnapshot = useCallback(() => {\n const list = registry.getRegisteredPackages();\n const packages = list.join(',');\n if (packages !== cacheRef.current.packages) {\n cacheRef.current = { packages, list };\n }\n return cacheRef.current.list;\n }, [registry]);\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n}\n","/**\n * useActivePackage Hook - Active GTS package subscription\n *\n * Subscribes to store changes and returns the GTS package of the currently\n * mounted screen extension.\n *\n * React Layer: L3\n */\n\nimport { useSyncExternalStore, useCallback, useRef } from 'react';\nimport { useHAI3 } from '../../HAI3Context';\nimport { extractGtsPackage, HAI3_SCREEN_DOMAIN } from '@hai3/framework';\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for observing the active GTS package (the package of the currently\n * mounted screen extension).\n *\n * Subscribes to the HAI3 store to detect mount state changes, and returns\n * the GTS package extracted from the currently mounted screen extension's ID.\n *\n * Returns `undefined` if no screen extension is currently mounted.\n *\n * @returns GTS package string of the active screen extension, or undefined\n *\n * @example\n * ```tsx\n * function ActivePackageIndicator() {\n * const activePackage = useActivePackage();\n *\n * if (!activePackage) {\n * return <div>No active screen</div>;\n * }\n *\n * return <div>Active package: {activePackage}</div>;\n * }\n * ```\n */\nexport function useActivePackage(): string | undefined {\n const app = useHAI3();\n const registry = app.screensetsRegistry;\n\n if (!registry) {\n throw new Error(\n 'useActivePackage requires the microfrontends plugin. ' +\n 'Add microfrontends() to your HAI3 app configuration.'\n );\n }\n\n // Subscribe to store changes.\n // Any dispatch (including mount state updates) triggers a snapshot check.\n // The snapshot comparison ensures only actual active package changes cause re-renders.\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n return app.store.subscribe(onStoreChange);\n },\n [app.store]\n );\n\n // Cache the snapshot to maintain referential stability for useSyncExternalStore.\n // Only update when the active package actually changes.\n const cacheRef = useRef<{ activePackage: string | undefined }>({ activePackage: undefined });\n\n const getSnapshot = useCallback(() => {\n const mountedExtensionId = registry.getMountedExtension(HAI3_SCREEN_DOMAIN);\n\n // Guard: if no extension is mounted, return undefined immediately\n if (!mountedExtensionId) {\n const result = undefined;\n if (result !== cacheRef.current.activePackage) {\n cacheRef.current = { activePackage: result };\n }\n return cacheRef.current.activePackage;\n }\n\n // Extract GTS package from the mounted extension ID\n const activePackage = extractGtsPackage(mountedExtensionId);\n if (activePackage !== cacheRef.current.activePackage) {\n cacheRef.current = { activePackage };\n }\n return cacheRef.current.activePackage;\n }, [registry]);\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n}\n","/**\n * Ref Container Provider\n *\n * Concrete ContainerProvider that wraps a React ref.\n * Created by React components (like ExtensionDomainSlot) for use\n * by framework-level domain registration code.\n *\n * @packageDocumentation\n */\n\nimport type { RefObject } from 'react';\nimport { ContainerProvider } from '@hai3/framework';\n\n/**\n * Concrete ContainerProvider that wraps a React ref.\n *\n * This provider reads the container element from a React ref at mount time.\n * It is designed to be created by React components but passed to domain\n * registration code (framework-level).\n *\n * Usage pattern:\n * 1. React component creates a ref via `useRef<HTMLDivElement>(null)`\n * 2. Framework-level code creates `RefContainerProvider` wrapping the ref\n * 3. Framework-level code passes the provider to `registerDomain(domain, provider)`\n * 4. When mount_ext is dispatched, the provider returns `ref.current`\n */\nexport class RefContainerProvider extends ContainerProvider {\n constructor(private readonly containerRef: RefObject<HTMLDivElement>) {\n super();\n }\n\n getContainer(_extensionId: string): Element {\n if (!this.containerRef.current) {\n throw new Error('Container ref is not attached -- component may not be mounted yet');\n }\n return this.containerRef.current;\n }\n\n releaseContainer(_extensionId: string): void {\n // No-op for React ref -- the ref lifecycle is managed by React.\n // Container cleanup happens when the component unmounts.\n }\n}\n","/**\n * Extension Domain Slot Component\n *\n * React component that renders extensions within a domain slot.\n * Manages extension lifecycle (mount/unmount) and provides rendering context.\n *\n * @packageDocumentation\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport type { ScreensetsRegistry, ParentMfeBridge } from '@hai3/framework';\nimport {\n HAI3_ACTION_MOUNT_EXT,\n HAI3_ACTION_UNMOUNT_EXT,\n} from '@hai3/framework';\n\n/**\n * Props for ExtensionDomainSlot component\n */\nexport interface ExtensionDomainSlotProps {\n /**\n * The screensets registry instance\n */\n registry: ScreensetsRegistry;\n\n /**\n * The domain ID for this slot\n */\n domainId: string;\n\n /**\n * The extension ID to render in this slot\n */\n extensionId: string;\n\n /**\n * Optional CSS class name for the container\n */\n className?: string;\n\n /**\n * Optional callback when extension is mounted\n */\n onMounted?: (bridge: ParentMfeBridge) => void;\n\n /**\n * Optional callback when extension is unmounted\n */\n onUnmounted?: () => void;\n\n /**\n * Optional error callback\n */\n onError?: (error: Error) => void;\n\n /**\n * Optional loading component\n */\n loadingComponent?: React.ReactNode;\n\n /**\n * Optional error component renderer\n */\n errorComponent?: (error: Error) => React.ReactNode;\n}\n\n/**\n * Extension Domain Slot Component\n *\n * Renders an extension within a domain slot. Manages the extension lifecycle:\n * - Mounts the extension on component mount\n * - Unmounts the extension on component unmount\n * - Handles loading and error states\n *\n * @example\n * ```tsx\n * <ExtensionDomainSlot\n * registry={registry}\n * domainId=\"gts.hai3.mfes.ext.domain.v1~hai3.screensets.layout.sidebar.v1\"\n * extensionId=\"gts.hai3.mfes.ext.extension.v1~myapp.sidebar.widget.v1\"\n * className=\"sidebar-slot\"\n * />\n * ```\n */\nexport function ExtensionDomainSlot(props: ExtensionDomainSlotProps): React.ReactElement {\n const {\n registry,\n domainId,\n extensionId,\n className,\n onMounted,\n onUnmounted,\n onError,\n loadingComponent,\n errorComponent,\n } = props;\n\n const containerRef = useRef<HTMLDivElement>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const [bridge, setBridge] = useState<ParentMfeBridge | null>(null);\n\n useEffect(() => {\n let mounted = true;\n let currentBridge: ParentMfeBridge | null = null;\n\n async function mountExtension() {\n if (!containerRef.current) {\n return;\n }\n\n try {\n setIsLoading(true);\n setError(null);\n\n // Mount the extension via actions chain (auto-loads if not already loaded)\n // Container is provided by the domain's ContainerProvider (registered at domain registration time)\n await registry.executeActionsChain({\n action: {\n type: HAI3_ACTION_MOUNT_EXT,\n target: domainId,\n payload: {\n extensionId,\n },\n },\n });\n\n if (!mounted) {\n // Component was unmounted while mounting - clean up\n await registry.executeActionsChain({\n action: {\n type: HAI3_ACTION_UNMOUNT_EXT,\n target: domainId,\n payload: {\n extensionId,\n },\n },\n });\n return;\n }\n\n // Query the bridge after mount completes\n const newBridge = registry.getParentBridge(extensionId);\n if (!newBridge) {\n throw new Error(`Failed to obtain bridge for extension ${extensionId} after mount`);\n }\n\n currentBridge = newBridge;\n setBridge(newBridge);\n setIsLoading(false);\n\n // Notify parent\n if (onMounted) {\n onMounted(newBridge);\n }\n } catch (err) {\n if (!mounted) {\n return;\n }\n\n const errorObj = err instanceof Error ? err : new Error(String(err));\n setError(errorObj);\n setIsLoading(false);\n\n if (onError) {\n onError(errorObj);\n }\n }\n }\n\n // Start mounting\n void mountExtension();\n\n // Cleanup on unmount\n return () => {\n mounted = false;\n\n if (currentBridge) {\n // Unmount extension asynchronously via actions chain\n void registry.executeActionsChain({\n action: {\n type: HAI3_ACTION_UNMOUNT_EXT,\n target: domainId,\n payload: {\n extensionId,\n },\n },\n }).then(() => {\n if (onUnmounted) {\n onUnmounted();\n }\n });\n }\n };\n }, [registry, domainId, extensionId, onMounted, onUnmounted, onError]);\n\n // Render loading state\n if (isLoading) {\n return (\n <div className={className} data-domain-id={domainId} data-extension-id={extensionId}>\n {loadingComponent ?? <div>Loading extension...</div>}\n </div>\n );\n }\n\n // Render error state\n if (error) {\n return (\n <div className={className} data-domain-id={domainId} data-extension-id={extensionId}>\n {errorComponent ? errorComponent(error) : (\n <div>\n <strong>Error loading extension:</strong>\n <pre>{error.message}</pre>\n </div>\n )}\n </div>\n );\n }\n\n // Render the container for the mounted extension\n return (\n <div\n ref={containerRef}\n className={className}\n data-domain-id={domainId}\n data-extension-id={extensionId}\n data-bridge-active={bridge !== null}\n />\n );\n}\n"],"mappings":"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","names":["import_react","import_react","import_jsx_runtime","ReduxProvider","import_react_redux","import_react_redux","import_react","i18nRegistry","import_react","i18nRegistry","module","import_react","import_framework","formatDateFn","formatTimeFn","formatDateTimeFn","formatRelativeFn","formatNumberFn","formatPercentFn","formatCompactFn","formatCurrencyFn","compareStringsFn","createCollatorFn","import_react","themes","import_react","import_react","import_react","import_react","import_react","import_framework","import_framework","import_react","import_framework","import_jsx_runtime","mountExtension","import_framework","frameworkEventBus"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/HAI3Provider.tsx","../src/HAI3Context.tsx","../src/mfe/MfeContext.tsx","../src/mfe/MfeProvider.tsx","../src/hooks/useAppDispatch.ts","../src/hooks/useAppSelector.ts","../src/hooks/useTranslation.ts","../src/hooks/useScreenTranslations.ts","../src/hooks/useFormatters.ts","../src/hooks/useTheme.ts","../src/mfe/hooks/useMfeBridge.ts","../src/mfe/hooks/useSharedProperty.ts","../src/mfe/hooks/useHostAction.ts","../src/mfe/hooks/useDomainExtensions.ts","../src/mfe/hooks/useRegisteredPackages.ts","../src/mfe/hooks/useActivePackage.ts","../src/mfe/components/RefContainerProvider.ts","../src/mfe/components/ExtensionDomainSlot.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 * - MFE context, hooks, and components\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 useFormatters,\n useTheme,\n} from './hooks';\n\n// ============================================================================\n// MFE Context and Hooks\n// ============================================================================\n\nexport {\n MfeContext,\n useMfeContext,\n MfeProvider,\n useMfeBridge,\n useSharedProperty,\n useHostAction,\n useDomainExtensions,\n useRegisteredPackages,\n useActivePackage,\n RefContainerProvider,\n ExtensionDomainSlot,\n} from './mfe';\n\nexport type {\n MfeContextValue,\n MfeProviderProps,\n ExtensionDomainSlotProps,\n} from './mfe';\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\nexport type {\n HAI3ProviderProps,\n UseHAI3Return,\n UseAppSelector,\n UseAppDispatchReturn,\n UseTranslationReturn,\n UseScreenTranslationsReturn,\n UseFormattersReturn,\n UseThemeReturn,\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 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 i18n,\n effects,\n\n // Registries\n createThemeRegistry,\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 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 ThemeRegistry,\n ThemeConfig,\n Preset,\n Presets,\n ScreensetsConfig,\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 ReducerPayload,\n\n // Layout\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 // 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// MFE Re-exports from @hai3/framework (Layering Compliance)\n// ============================================================================\n\n// MFE Plugin factories\nexport {\n microfrontends,\n mock,\n} from '@hai3/framework';\n\n// MFE Action functions\nexport {\n loadExtension,\n mountExtension,\n unmountExtension,\n registerExtension,\n unregisterExtension,\n} from '@hai3/framework';\n\n// MFE Selectors\nexport {\n selectExtensionState,\n selectRegisteredExtensions,\n selectExtensionError,\n} from '@hai3/framework';\n\n// MFE Domain constants\nexport {\n HAI3_POPUP_DOMAIN,\n HAI3_SIDEBAR_DOMAIN,\n HAI3_SCREEN_DOMAIN,\n HAI3_OVERLAY_DOMAIN,\n // Base ExtensionDomain constants\n screenDomain,\n sidebarDomain,\n popupDomain,\n overlayDomain,\n} from '@hai3/framework';\n\n// MFE Type constants\nexport {\n HAI3_SCREEN_EXTENSION_TYPE,\n HAI3_MFE_ENTRY_MF,\n} from '@hai3/framework';\n\n// MFE Action constants\nexport {\n HAI3_ACTION_LOAD_EXT,\n HAI3_ACTION_MOUNT_EXT,\n HAI3_ACTION_UNMOUNT_EXT,\n} from '@hai3/framework';\n\n// MFE Shared Property constants\nexport {\n HAI3_SHARED_PROPERTY_THEME,\n HAI3_SHARED_PROPERTY_LANGUAGE,\n} from '@hai3/framework';\n\n// MFE Types\nexport type {\n ChildMfeBridge,\n ParentMfeBridge,\n Extension,\n ScreenExtension,\n ExtensionPresentation,\n ExtensionDomain,\n ActionsChain,\n Action,\n SharedProperty,\n LifecycleStage,\n LifecycleHook,\n MfeEntryLifecycle,\n MfeEntry,\n MfeEntryMF,\n JSONSchema,\n ValidationError,\n ValidationResult,\n LoadExtPayload,\n MountExtPayload,\n UnmountExtPayload,\n ScreensetsRegistryConfig,\n TypeSystemPlugin,\n} from '@hai3/framework';\n\n// MFE Abstract classes\nexport {\n MfeHandler,\n MfeBridgeFactory,\n ScreensetsRegistry,\n ScreensetsRegistryFactory,\n screensetsRegistryFactory,\n ContainerProvider,\n} from '@hai3/framework';\n\n// MFE Concrete implementations\nexport { MfeHandlerMF, gtsPlugin } from '@hai3/framework';\n\n// MFE Utilities\nexport {\n createShadowRoot,\n injectCssVariables,\n extractGtsPackage,\n} from '@hai3/framework';\n\n// MFE Plugin types\nexport type {\n MfeState,\n ExtensionRegistrationState,\n RegisterExtensionPayload,\n UnregisterExtensionPayload,\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, EventBus } from '@hai3/framework';\nimport { eventBus as frameworkEventBus } from '@hai3/framework';\n\n// @cpt-dod:cpt-hai3-dod-react-bindings-event-payload-map:p2\n// @cpt-begin:cpt-hai3-dod-react-bindings-event-payload-map:p2:inst-event-payload-map\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// @cpt-end:cpt-hai3-dod-react-bindings-event-payload-map:p2:inst-event-payload-map\n","/**\n * HAI3 Provider - Main provider component for HAI3 applications\n *\n * React Layer: L3 (Depends on @hai3/framework)\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-bootstrap-provider:p1\n// @cpt-algo:cpt-hai3-algo-react-bindings-resolve-app:p1\n// @cpt-algo:cpt-hai3-algo-react-bindings-build-provider-tree:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-provider:p1\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 { MfeProvider } from './mfe/MfeProvider';\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()).use(microfrontends()).build();\n * <HAI3Provider app={app}>\n * <App />\n * </HAI3Provider>\n *\n * // With MFE bridge (for MFE components)\n * <HAI3Provider mfeBridge={{ bridge, extensionId, domainId }}>\n * <MyMfeApp />\n * </HAI3Provider>\n * ```\n */\n// @cpt-begin:cpt-hai3-flow-react-bindings-bootstrap-provider:p1:inst-render-provider\n// @cpt-begin:cpt-hai3-dod-react-bindings-provider:p1:inst-render-provider\nexport const HAI3Provider: React.FC<HAI3ProviderProps> = ({\n children,\n config,\n app: providedApp,\n mfeBridge,\n}) => {\n // @cpt-begin:cpt-hai3-flow-react-bindings-bootstrap-provider:p1:inst-resolve-app\n // @cpt-begin:cpt-hai3-algo-react-bindings-resolve-app:p1:inst-use-provided-app\n // @cpt-begin:cpt-hai3-algo-react-bindings-resolve-app:p1:inst-create-app\n // @cpt-begin:cpt-hai3-algo-react-bindings-resolve-app:p1:inst-memoize-app\n // @cpt-begin:cpt-hai3-algo-react-bindings-build-provider-tree:p1:inst-resolve-app-tree\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 // @cpt-end:cpt-hai3-algo-react-bindings-resolve-app:p1:inst-use-provided-app\n // @cpt-end:cpt-hai3-algo-react-bindings-resolve-app:p1:inst-create-app\n // @cpt-end:cpt-hai3-algo-react-bindings-resolve-app:p1:inst-memoize-app\n // @cpt-end:cpt-hai3-algo-react-bindings-build-provider-tree:p1:inst-resolve-app-tree\n // @cpt-end:cpt-hai3-flow-react-bindings-bootstrap-provider:p1:inst-resolve-app\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-bootstrap-provider:p1:inst-destroy-app\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 // @cpt-end:cpt-hai3-flow-react-bindings-bootstrap-provider:p1:inst-destroy-app\n\n // @cpt-begin:cpt-hai3-algo-react-bindings-build-provider-tree:p1:inst-wrap-hai3-context\n // @cpt-begin:cpt-hai3-algo-react-bindings-build-provider-tree:p1:inst-wrap-redux\n // @cpt-begin:cpt-hai3-algo-react-bindings-build-provider-tree:p1:inst-render-children-tree\n // @cpt-begin:cpt-hai3-flow-react-bindings-bootstrap-provider:p1:inst-set-hai3-context\n // @cpt-begin:cpt-hai3-flow-react-bindings-bootstrap-provider:p1:inst-set-redux-provider\n // @cpt-begin:cpt-hai3-flow-react-bindings-bootstrap-provider:p1:inst-render-children\n // Render content\n const content = (\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 // @cpt-end:cpt-hai3-algo-react-bindings-build-provider-tree:p1:inst-wrap-hai3-context\n // @cpt-end:cpt-hai3-algo-react-bindings-build-provider-tree:p1:inst-wrap-redux\n // @cpt-end:cpt-hai3-algo-react-bindings-build-provider-tree:p1:inst-render-children-tree\n // @cpt-end:cpt-hai3-flow-react-bindings-bootstrap-provider:p1:inst-set-hai3-context\n // @cpt-end:cpt-hai3-flow-react-bindings-bootstrap-provider:p1:inst-set-redux-provider\n // @cpt-end:cpt-hai3-flow-react-bindings-bootstrap-provider:p1:inst-render-children\n\n // @cpt-begin:cpt-hai3-algo-react-bindings-build-provider-tree:p1:inst-wrap-mfe-conditional\n // @cpt-begin:cpt-hai3-flow-react-bindings-bootstrap-provider:p2:inst-wrap-mfe-provider\n // Wrap with MfeProvider if bridge is provided\n if (mfeBridge) {\n return (\n <MfeProvider value={mfeBridge}>\n {content}\n </MfeProvider>\n );\n }\n // @cpt-end:cpt-hai3-algo-react-bindings-build-provider-tree:p1:inst-wrap-mfe-conditional\n // @cpt-end:cpt-hai3-flow-react-bindings-bootstrap-provider:p2:inst-wrap-mfe-provider\n\n return content;\n};\n// @cpt-end:cpt-hai3-flow-react-bindings-bootstrap-provider:p1:inst-render-provider\n// @cpt-end:cpt-hai3-dod-react-bindings-provider:p1:inst-render-provider\n","/**\n * HAI3 Context - React context for HAI3 application\n *\n * React Layer: L3 (Depends on @hai3/framework)\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-use-hai3:p2\n// @cpt-algo:cpt-hai3-algo-react-bindings-mfe-context-guard:p1\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 */\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-hai3:p2:inst-call-use-hai3\n// @cpt-begin:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-hai3-context\nexport function useHAI3(): HAI3App {\n const context = useContext(HAI3Context);\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-hai3:p2:inst-guard-hai3-context\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 // @cpt-end:cpt-hai3-flow-react-bindings-use-hai3:p2:inst-guard-hai3-context\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-hai3:p2:inst-return-hai3-app\n return context;\n // @cpt-end:cpt-hai3-flow-react-bindings-use-hai3:p2:inst-return-hai3-app\n}\n// @cpt-end:cpt-hai3-flow-react-bindings-use-hai3:p2:inst-call-use-hai3\n// @cpt-end:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-hai3-context\n","/**\n * MFE Context - React context for MFE state\n *\n * Provides MFE bridge and metadata to child components.\n * Used by MFE components to access their runtime context.\n *\n * React Layer: L3 (Depends on @hai3/framework)\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-mfe-provider:p1\n// @cpt-algo:cpt-hai3-algo-react-bindings-mfe-context-guard:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-mfe-hooks:p1\n\nimport { createContext, useContext } from 'react';\nimport type { ChildMfeBridge } from '@hai3/framework';\n\n// ============================================================================\n// Context Value Types\n// ============================================================================\n\n/**\n * MFE Context Value\n * Contains bridge and metadata about the MFE instance.\n */\nexport interface MfeContextValue {\n /** Child bridge for communication with host */\n bridge: ChildMfeBridge;\n /** Extension ID */\n extensionId: string;\n /** Domain ID where MFE is mounted */\n domainId: string;\n}\n\n// ============================================================================\n// Context Definition\n// ============================================================================\n\n/**\n * MFE Context\n * Holds the MFE bridge and metadata for child components.\n */\nexport const MfeContext = createContext<MfeContextValue | null>(null);\n\n/**\n * Use the MFE context.\n * Throws if used outside of MFE context.\n *\n * @returns The MFE context value\n */\n// @cpt-begin:cpt-hai3-flow-react-bindings-mfe-provider:p1:inst-use-mfe-context\n// @cpt-begin:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-mfe-context\n// @cpt-begin:cpt-hai3-dod-react-bindings-mfe-hooks:p1:inst-use-mfe-context\nexport function useMfeContext(): MfeContextValue {\n const context = useContext(MfeContext);\n\n if (!context) {\n throw new Error(\n 'useMfeContext must be used within a MfeProvider. ' +\n 'This hook can only be used inside MFE components.'\n );\n }\n\n return context;\n}\n// @cpt-end:cpt-hai3-flow-react-bindings-mfe-provider:p1:inst-use-mfe-context\n// @cpt-end:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-mfe-context\n// @cpt-end:cpt-hai3-dod-react-bindings-mfe-hooks:p1:inst-use-mfe-context\n","/**\n * MFE Provider - Provides MFE context to child components\n *\n * Wraps MFE components with bridge and metadata.\n * Used by the MFE mounting system.\n *\n * React Layer: L3 (Depends on @hai3/framework)\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-mfe-provider:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-mfe-hooks:p1\n\nimport React from 'react';\nimport { MfeContext, type MfeContextValue } from './MfeContext';\n\n// ============================================================================\n// Provider Props\n// ============================================================================\n\n/**\n * MFE Provider Props\n */\nexport interface MfeProviderProps {\n /** MFE context value */\n value: MfeContextValue;\n /** Child components */\n children: React.ReactNode;\n}\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\n/**\n * MFE Provider Component\n *\n * Provides MFE bridge and metadata to child components.\n * Used by the MFE mounting system to wrap MFE components.\n *\n * @example\n * ```tsx\n * <MfeProvider value={{ bridge, extensionId, domainId }}>\n * <MyMfeComponent />\n * </MfeProvider>\n * ```\n */\n// @cpt-begin:cpt-hai3-flow-react-bindings-mfe-provider:p1:inst-render-mfe-provider\n// @cpt-begin:cpt-hai3-flow-react-bindings-mfe-provider:p1:inst-set-mfe-context\n// @cpt-begin:cpt-hai3-dod-react-bindings-mfe-hooks:p1:inst-render-mfe-provider\nexport const MfeProvider: React.FC<MfeProviderProps> = ({ value, children }) => {\n return (\n <MfeContext.Provider value={value}>\n {children}\n </MfeContext.Provider>\n );\n};\n// @cpt-end:cpt-hai3-flow-react-bindings-mfe-provider:p1:inst-render-mfe-provider\n// @cpt-end:cpt-hai3-flow-react-bindings-mfe-provider:p1:inst-set-mfe-context\n// @cpt-end:cpt-hai3-dod-react-bindings-mfe-hooks:p1:inst-render-mfe-provider\n","/**\n * useAppDispatch Hook - Type-safe dispatch hook\n *\n * React Layer: L3\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-use-dispatch:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-redux-hooks:p1\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 */\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-dispatch:p1:inst-call-dispatch\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-dispatch:p1:inst-delegate-dispatch\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-dispatch:p1:inst-use-dispatch\n// @cpt-begin:cpt-hai3-dod-react-bindings-redux-hooks:p1:inst-use-dispatch\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// @cpt-end:cpt-hai3-flow-react-bindings-use-dispatch:p1:inst-call-dispatch\n// @cpt-end:cpt-hai3-flow-react-bindings-use-dispatch:p1:inst-delegate-dispatch\n// @cpt-end:cpt-hai3-flow-react-bindings-use-dispatch:p1:inst-use-dispatch\n// @cpt-end:cpt-hai3-dod-react-bindings-redux-hooks:p1:inst-use-dispatch\n","/**\n * useAppSelector Hook - Type-safe selector hook\n *\n * React Layer: L3\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-use-selector:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-redux-hooks:p1\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 */\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-selector:p1:inst-call-selector\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-selector:p1:inst-delegate-selector\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-selector:p1:inst-return-state\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-selector:p1:inst-rerender-on-change\n// @cpt-begin:cpt-hai3-dod-react-bindings-redux-hooks:p1:inst-use-selector\nexport const useAppSelector: TypedUseSelectorHook<RootState> = useSelector;\n// @cpt-end:cpt-hai3-flow-react-bindings-use-selector:p1:inst-call-selector\n// @cpt-end:cpt-hai3-flow-react-bindings-use-selector:p1:inst-delegate-selector\n// @cpt-end:cpt-hai3-flow-react-bindings-use-selector:p1:inst-return-state\n// @cpt-end:cpt-hai3-flow-react-bindings-use-selector:p1:inst-rerender-on-change\n// @cpt-end:cpt-hai3-dod-react-bindings-redux-hooks:p1:inst-use-selector\n","/**\n * useTranslation Hook - Translation utilities\n *\n * React Layer: L3\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-use-translation:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-translation-hook:p1\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 */\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-translation:p1:inst-call-translation\n// @cpt-begin:cpt-hai3-dod-react-bindings-translation-hook:p1:inst-call-translation\nexport function useTranslation(): UseTranslationReturn {\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-translation:p1:inst-read-i18n-registry\n const app = useHAI3();\n const { i18nRegistry } = app;\n // @cpt-end:cpt-hai3-flow-react-bindings-use-translation:p1:inst-read-i18n-registry\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-translation:p1:inst-subscribe-i18n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-translation:p1:inst-rerender-on-lang-change\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 // @cpt-end:cpt-hai3-flow-react-bindings-use-translation:p1:inst-subscribe-i18n\n // @cpt-end:cpt-hai3-flow-react-bindings-use-translation:p1:inst-rerender-on-lang-change\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 // @cpt-begin:cpt-hai3-flow-react-bindings-use-translation:p1:inst-set-language\n // Set language via framework action (emits event bus for MFE propagation)\n const setLanguage = useCallback(\n (lang: Language) => {\n if (app.actions.setLanguage) {\n app.actions.setLanguage({ language: lang });\n }\n },\n [app.actions]\n );\n // @cpt-end:cpt-hai3-flow-react-bindings-use-translation:p1:inst-set-language\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 // @cpt-begin:cpt-hai3-flow-react-bindings-use-translation:p1:inst-return-translation-api\n return {\n t,\n language,\n setLanguage,\n isRTL,\n };\n // @cpt-end:cpt-hai3-flow-react-bindings-use-translation:p1:inst-return-translation-api\n}\n// @cpt-end:cpt-hai3-flow-react-bindings-use-translation:p1:inst-call-translation\n// @cpt-end:cpt-hai3-dod-react-bindings-translation-hook:p1:inst-call-translation\n","/**\n * useScreenTranslations Hook - Screen-level translation loading\n *\n * React Layer: L3\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-use-screen-translations:p1\n// @cpt-algo:cpt-hai3-algo-react-bindings-load-screen-translations:p1\n// @cpt-state:cpt-hai3-state-react-bindings-screen-translation:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-screen-translation-hook:p1\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 */\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-screen-translations:p1:inst-call-screen-translations\n// @cpt-begin:cpt-hai3-dod-react-bindings-screen-translation-hook:p1:inst-call-screen-translations\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 // @cpt-begin:cpt-hai3-state-react-bindings-screen-translation:p1:inst-begin-load\n // @cpt-begin:cpt-hai3-state-react-bindings-screen-translation:p1:inst-load-success\n // @cpt-begin:cpt-hai3-state-react-bindings-screen-translation:p1:inst-load-error\n // @cpt-begin:cpt-hai3-state-react-bindings-screen-translation:p1:inst-reload-on-lang-change\n // @cpt-begin:cpt-hai3-state-react-bindings-screen-translation:p2:inst-retry-on-lang-change\n const [loadedLanguage, setLoadedLanguage] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n // @cpt-end:cpt-hai3-state-react-bindings-screen-translation:p1:inst-begin-load\n // @cpt-end:cpt-hai3-state-react-bindings-screen-translation:p1:inst-load-success\n // @cpt-end:cpt-hai3-state-react-bindings-screen-translation:p1:inst-load-error\n // @cpt-end:cpt-hai3-state-react-bindings-screen-translation:p1:inst-reload-on-lang-change\n // @cpt-end:cpt-hai3-state-react-bindings-screen-translation:p2:inst-retry-on-lang-change\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-screen-translations:p1:inst-subscribe-lang-change\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 // @cpt-end:cpt-hai3-flow-react-bindings-use-screen-translations:p1:inst-subscribe-lang-change\n\n // @cpt-begin:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-get-current-lang\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 // @cpt-end:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-get-current-lang\n\n // @cpt-begin:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-resolve-loader\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 // @cpt-end:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-resolve-loader\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-screen-translations:p1:inst-run-load-screen-translations\n useEffect(() => {\n // @cpt-begin:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-skip-if-loaded\n // Skip if no language or already loaded for this language\n if (!currentLanguage || currentLanguage === loadedLanguage) {\n return;\n }\n // @cpt-end:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-skip-if-loaded\n\n let cancelled = false;\n setIsLoading(true);\n\n const loadTranslations = async () => {\n try {\n const namespace = `screen.${screensetId}.${screenId}`;\n\n // @cpt-begin:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-register-loader\n // Register the loader for future language changes\n i18nRegistry.registerLoader(namespace, loader);\n // @cpt-end:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-register-loader\n\n // @cpt-begin:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-call-loader\n // Actually load the translations for current language\n const loadedTranslations = await loader(currentLanguage);\n // @cpt-end:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-call-loader\n\n // @cpt-begin:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-register-translations\n i18nRegistry.register(namespace, currentLanguage, loadedTranslations);\n // @cpt-end:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-register-translations\n\n // @cpt-begin:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-cancel-on-unmount\n if (!cancelled) {\n setLoadedLanguage(currentLanguage);\n setIsLoading(false);\n setError(null);\n }\n // @cpt-end:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-cancel-on-unmount\n } catch (err) {\n // @cpt-begin:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-handle-load-error\n if (!cancelled) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setIsLoading(false);\n }\n // @cpt-end:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-handle-load-error\n }\n };\n\n loadTranslations();\n\n // @cpt-begin:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-cancel-stale-load\n return () => {\n cancelled = true;\n };\n // @cpt-end:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-cancel-stale-load\n }, [screensetId, screenId, loader, i18nRegistry, currentLanguage, loadedLanguage]);\n // @cpt-end:cpt-hai3-flow-react-bindings-use-screen-translations:p1:inst-run-load-screen-translations\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-screen-translations:p1:inst-return-loading-state\n // Derive isLoaded from whether we've loaded translations for the current language\n const isLoaded = currentLanguage !== null && currentLanguage === loadedLanguage && !isLoading;\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-screen-translations:p1:inst-gate-render\n // isLoaded is the gate value: consumers must check this before rendering translation-dependent UI\n return { isLoaded, error };\n // @cpt-end:cpt-hai3-flow-react-bindings-use-screen-translations:p1:inst-gate-render\n // @cpt-end:cpt-hai3-flow-react-bindings-use-screen-translations:p1:inst-return-loading-state\n}\n// @cpt-end:cpt-hai3-flow-react-bindings-use-screen-translations:p1:inst-call-screen-translations\n// @cpt-end:cpt-hai3-dod-react-bindings-screen-translation-hook:p1:inst-call-screen-translations\n","/**\n * useFormatters Hook - Locale-aware formatters\n *\n * Returns formatters that use i18nRegistry.getLanguage() internally.\n * Calls useTranslation() so the component re-renders when language changes.\n *\n * React Layer: L3\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-use-formatters:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-formatters-hook:p1\n\nimport { useMemo } from 'react';\nimport {\n formatDate as formatDateFn,\n formatTime as formatTimeFn,\n formatDateTime as formatDateTimeFn,\n formatRelative as formatRelativeFn,\n formatNumber as formatNumberFn,\n formatPercent as formatPercentFn,\n formatCompact as formatCompactFn,\n formatCurrency as formatCurrencyFn,\n compareStrings as compareStringsFn,\n createCollator as createCollatorFn,\n} from '@hai3/framework';\nimport type { UseFormattersReturn } from '../types';\nimport { useTranslation } from './useTranslation';\n\n/**\n * Hook for accessing locale-aware formatters (date, number, currency, sort).\n *\n * Formatters use the current app language from i18nRegistry.getLanguage().\n * Re-renders when language changes via useTranslation() subscription.\n *\n * @returns Object with formatDate, formatTime, formatDateTime, formatRelative,\n * formatNumber, formatPercent, formatCompact, formatCurrency, compareStrings, createCollator\n *\n * @example\n * ```tsx\n * const { formatDate, formatCurrency } = useFormatters();\n * return (\n * <span>{formatDate(new Date(), 'short')}</span>\n * <span>{formatCurrency(99.99, 'USD')}</span>\n * );\n * ```\n */\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-formatters:p1:inst-call-formatters\n// @cpt-begin:cpt-hai3-dod-react-bindings-formatters-hook:p1:inst-call-formatters\nexport function useFormatters(): UseFormattersReturn {\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-formatters:p1:inst-subscribe-via-translation\n // useTranslation() subscribes to language changes so this component re-renders\n // when language changes; formatters read i18nRegistry.getLanguage() at call time\n const { language } = useTranslation();\n // @cpt-end:cpt-hai3-flow-react-bindings-use-formatters:p1:inst-subscribe-via-translation\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-formatters:p1:inst-return-formatters\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-formatters:p1:inst-formatters-read-locale\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-formatters:p1:inst-recompute-on-lang\n return useMemo<UseFormattersReturn>(\n () => {\n void language; // re-run when language changes so formatters see new locale\n return {\n formatDate: formatDateFn,\n formatTime: formatTimeFn,\n formatDateTime: formatDateTimeFn,\n formatRelative: formatRelativeFn,\n formatNumber: formatNumberFn,\n formatPercent: formatPercentFn,\n formatCompact: formatCompactFn,\n formatCurrency: formatCurrencyFn,\n compareStrings: compareStringsFn,\n createCollator: createCollatorFn,\n };\n },\n [language]\n );\n // @cpt-end:cpt-hai3-flow-react-bindings-use-formatters:p1:inst-return-formatters\n // @cpt-end:cpt-hai3-flow-react-bindings-use-formatters:p1:inst-formatters-read-locale\n // @cpt-end:cpt-hai3-flow-react-bindings-use-formatters:p1:inst-recompute-on-lang\n}\n// @cpt-end:cpt-hai3-flow-react-bindings-use-formatters:p1:inst-call-formatters\n// @cpt-end:cpt-hai3-dod-react-bindings-formatters-hook:p1:inst-call-formatters\n","/**\n * useTheme Hook - Theme utilities\n *\n * React Layer: L3\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-use-theme:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-theme-hook:p1\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 */\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-theme:p1:inst-call-theme\n// @cpt-begin:cpt-hai3-dod-react-bindings-theme-hook:p1:inst-call-theme\nexport function useTheme(): UseThemeReturn {\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-theme:p1:inst-read-theme-registry\n const app = useHAI3();\n const { themeRegistry } = app;\n // @cpt-end:cpt-hai3-flow-react-bindings-use-theme:p1:inst-read-theme-registry\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-theme:p1:inst-subscribe-theme\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-theme:p1:inst-rerender-on-theme-change\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 // @cpt-end:cpt-hai3-flow-react-bindings-use-theme:p1:inst-subscribe-theme\n // @cpt-end:cpt-hai3-flow-react-bindings-use-theme:p1:inst-rerender-on-theme-change\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 // @cpt-begin:cpt-hai3-flow-react-bindings-use-theme:p1:inst-dispatch-change-theme\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 // @cpt-end:cpt-hai3-flow-react-bindings-use-theme:p1:inst-dispatch-change-theme\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-theme:p1:inst-return-theme-api\n return {\n currentTheme,\n themes,\n setTheme,\n };\n // @cpt-end:cpt-hai3-flow-react-bindings-use-theme:p1:inst-return-theme-api\n}\n// @cpt-end:cpt-hai3-flow-react-bindings-use-theme:p1:inst-call-theme\n// @cpt-end:cpt-hai3-dod-react-bindings-theme-hook:p1:inst-call-theme\n","/**\n * useMfeBridge Hook - MFE bridge access\n *\n * Returns the ChildMfeBridge from context for communication with host.\n *\n * React Layer: L3\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-mfe-provider:p1\n// @cpt-algo:cpt-hai3-algo-react-bindings-mfe-context-guard:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-mfe-hooks:p1\n\nimport { useMfeContext } from '../MfeContext';\nimport type { ChildMfeBridge } from '@hai3/framework';\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for accessing the MFE bridge.\n *\n * Returns the ChildMfeBridge instance for communication with the host.\n * Must be used within a MfeProvider (i.e., inside an MFE component).\n *\n * @returns Child MFE bridge\n *\n * @example\n * ```tsx\n * function MyMfeComponent() {\n * const bridge = useMfeBridge();\n *\n * // Bridge methods:\n * // bridge.executeActionsChain(chain);\n * // bridge.subscribeToProperty(propertyTypeId, callback);\n *\n * return <div>Domain: {bridge.domainId}</div>;\n * }\n * ```\n */\n// @cpt-begin:cpt-hai3-flow-react-bindings-mfe-provider:p1:inst-use-bridge\n// @cpt-begin:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-mfe-context\n// @cpt-begin:cpt-hai3-dod-react-bindings-mfe-hooks:p1:inst-use-bridge\nexport function useMfeBridge(): ChildMfeBridge {\n const { bridge } = useMfeContext();\n return bridge;\n}\n// @cpt-end:cpt-hai3-flow-react-bindings-mfe-provider:p1:inst-use-bridge\n// @cpt-end:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-mfe-context\n// @cpt-end:cpt-hai3-dod-react-bindings-mfe-hooks:p1:inst-use-bridge\n","/**\n * useSharedProperty Hook - Shared property subscription\n *\n * Subscribes to shared property updates from the host.\n *\n * React Layer: L3\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-use-shared-property:p1\n// @cpt-algo:cpt-hai3-algo-react-bindings-mfe-context-guard:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-mfe-hooks:p1\n\nimport { useSyncExternalStore, useCallback } from 'react';\nimport { useMfeContext } from '../MfeContext';\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for subscribing to a shared property.\n *\n * Subscribes to property updates from the host and returns the current value.\n * Must be used within a MfeProvider (i.e., inside an MFE component).\n *\n * NOTE: This hook provides the interface and uses useSyncExternalStore with a stub subscription.\n * Full bridge subscription should be implemented when bridge methods are available.\n *\n * @param _propertyTypeId - Type ID of the shared property to subscribe to (currently unused)\n * @returns Current property value\n *\n * @example\n * ```tsx\n * function MyMfeComponent() {\n * const userData = useSharedProperty('gts.hai3.mfes.comm.shared_property.v1~myapp.user_data.v1');\n *\n * return <div>User: {userData?.name}</div>;\n * }\n * ```\n */\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-shared-property:p1:inst-call-shared-property\n// @cpt-begin:cpt-hai3-dod-react-bindings-mfe-hooks:p1:inst-call-shared-property\nexport function useSharedProperty<T = unknown>(propertyTypeId: string): T | undefined {\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-shared-property:p1:inst-read-bridge\n // @cpt-begin:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-mfe-context\n // Enforce MfeProvider context requirement\n const { bridge } = useMfeContext(); // Throws if not in MfeProvider\n // @cpt-end:cpt-hai3-flow-react-bindings-use-shared-property:p1:inst-read-bridge\n // @cpt-end:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-mfe-context\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-shared-property:p1:inst-subscribe-property\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-shared-property:p1:inst-rerender-on-property-change\n // Subscribe to property updates via bridge\n const subscribe = useCallback((callback: () => void) => {\n return bridge.subscribeToProperty(propertyTypeId, () => {\n // When property changes, trigger React re-render\n callback();\n });\n }, [bridge, propertyTypeId]);\n // @cpt-end:cpt-hai3-flow-react-bindings-use-shared-property:p1:inst-subscribe-property\n // @cpt-end:cpt-hai3-flow-react-bindings-use-shared-property:p1:inst-rerender-on-property-change\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-shared-property:p1:inst-return-property-value\n const getSnapshot = useCallback(() => {\n const property = bridge.getProperty(propertyTypeId);\n // Type narrowing: caller specifies expected type T (standard React hook pattern)\n // Similar to useState<T>, useContext<T> - type safety is caller's responsibility\n return property?.value as T | undefined;\n }, [bridge, propertyTypeId]);\n\n const value = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n return value;\n // @cpt-end:cpt-hai3-flow-react-bindings-use-shared-property:p1:inst-return-property-value\n}\n// @cpt-end:cpt-hai3-flow-react-bindings-use-shared-property:p1:inst-call-shared-property\n// @cpt-end:cpt-hai3-dod-react-bindings-mfe-hooks:p1:inst-call-shared-property\n","/**\n * useHostAction Hook - Host action requests\n *\n * Returns a callback to request host actions via the bridge.\n *\n * React Layer: L3\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-use-host-action:p1\n// @cpt-algo:cpt-hai3-algo-react-bindings-mfe-context-guard:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-mfe-hooks:p1\n\nimport { useCallback } from 'react';\nimport { useMfeContext } from '../MfeContext';\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for requesting host actions.\n *\n * Returns a callback function that sends an actions chain to the host.\n * Must be used within a MfeProvider (i.e., inside an MFE component).\n *\n * NOTE: This hook provides the interface. Bridge executeActionsChain() delegates to the registry.\n *\n * @param actionTypeId - Type ID of the action to request\n * @returns Callback function to request the action with payload\n *\n * @example\n * ```tsx\n * function MyMfeComponent() {\n * const requestNavigation = useHostAction('gts.hai3.mfes.comm.action.v1~myapp.navigate.v1');\n *\n * const handleClick = () => {\n * requestNavigation({ path: '/dashboard' });\n * };\n *\n * return <button onClick={handleClick}>Navigate</button>;\n * }\n * ```\n */\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-host-action:p1:inst-call-host-action\n// @cpt-begin:cpt-hai3-dod-react-bindings-mfe-hooks:p1:inst-call-host-action\nexport function useHostAction<TPayload extends Record<string, unknown> = Record<string, unknown>>(\n actionTypeId: string\n): (payload?: TPayload) => void {\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-host-action:p1:inst-read-bridge-for-action\n // @cpt-begin:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-mfe-context\n // Enforce MfeProvider context requirement\n const { bridge } = useMfeContext(); // Throws if not in MfeProvider\n // @cpt-end:cpt-hai3-flow-react-bindings-use-host-action:p1:inst-read-bridge-for-action\n // @cpt-end:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-mfe-context\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-host-action:p1:inst-return-action-callback\n return useCallback((payload?: TPayload) => {\n // Construct an ActionsChain with the action\n // With the constraint, TPayload extends Record<string, unknown>,\n // so this is a safe widening from specific to general\n const chain = {\n action: {\n type: actionTypeId,\n target: bridge.domainId,\n payload: payload as Record<string, unknown> | undefined,\n },\n };\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-host-action:p1:inst-log-action-error\n // Send the chain to the host\n bridge.executeActionsChain(chain).catch((error: Error) => {\n console.error(\n `[useHostAction] Failed to send action '${actionTypeId}':`,\n error\n );\n });\n // @cpt-end:cpt-hai3-flow-react-bindings-use-host-action:p1:inst-log-action-error\n }, [actionTypeId, bridge]);\n // @cpt-end:cpt-hai3-flow-react-bindings-use-host-action:p1:inst-return-action-callback\n}\n// @cpt-end:cpt-hai3-flow-react-bindings-use-host-action:p1:inst-call-host-action\n// @cpt-end:cpt-hai3-dod-react-bindings-mfe-hooks:p1:inst-call-host-action\n","/**\n * useDomainExtensions Hook - Domain extension list subscription\n *\n * Subscribes to store changes to detect when extensions are registered or unregistered,\n * and returns the current list of extensions for a domain.\n *\n * React Layer: L3\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-use-domain-extensions:p1\n// @cpt-algo:cpt-hai3-algo-react-bindings-mfe-context-guard:p1\n// @cpt-algo:cpt-hai3-algo-react-bindings-stable-snapshots:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-observation-hooks:p1\n\nimport { useSyncExternalStore, useCallback, useRef } from 'react';\nimport { useHAI3 } from '../../HAI3Context';\nimport type { Extension } from '@hai3/framework';\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for observing extensions registered for a domain.\n *\n * Subscribes to the HAI3 store to detect registration state changes,\n * and returns the current list of extensions for the specified domain.\n *\n * @param domainId - Domain ID to query extensions for\n * @returns Array of extensions currently registered for the domain\n *\n * @example\n * ```tsx\n * function SidebarExtensions() {\n * const extensions = useDomainExtensions('gts.hai3.mfes.ext.domain.v1~hai3.screensets.layout.sidebar.v1');\n *\n * return (\n * <div>\n * {extensions.map(ext => (\n * <div key={ext.id}>{ext.id}</div>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-domain-extensions:p1:inst-call-domain-extensions\n// @cpt-begin:cpt-hai3-dod-react-bindings-observation-hooks:p1:inst-call-domain-extensions\nexport function useDomainExtensions(domainId: string): Extension[] {\n const app = useHAI3();\n const registry = app.screensetsRegistry;\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-domain-extensions:p1:inst-guard-registry\n // @cpt-begin:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-registry\n if (!registry) {\n throw new Error(\n 'useDomainExtensions requires the microfrontends plugin. ' +\n 'Add microfrontends() to your HAI3 app configuration.'\n );\n }\n // @cpt-end:cpt-hai3-flow-react-bindings-use-domain-extensions:p1:inst-guard-registry\n // @cpt-end:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-registry\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-domain-extensions:p1:inst-subscribe-store\n // Subscribe to store changes.\n // Any dispatch (including registration state updates) triggers a snapshot check.\n // The snapshot comparison ensures only actual extension list changes cause re-renders.\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n return app.store.subscribe(onStoreChange);\n },\n [app.store]\n );\n // @cpt-end:cpt-hai3-flow-react-bindings-use-domain-extensions:p1:inst-subscribe-store\n\n // @cpt-begin:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-cache-ref\n // Cache the snapshot to maintain referential stability for useSyncExternalStore.\n // Only update when the extension IDs actually change.\n const cacheRef = useRef<{ ids: string; extensions: Extension[] }>({ ids: '', extensions: [] });\n // @cpt-end:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-cache-ref\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-domain-extensions:p1:inst-diff-extensions\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-domain-extensions:p1:inst-stable-reference\n const getSnapshot = useCallback(() => {\n const extensions = registry.getExtensionsForDomain(domainId);\n // @cpt-begin:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-compute-cache-key\n const ids = extensions.map(e => e.id).join(',');\n // @cpt-end:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-compute-cache-key\n // @cpt-begin:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-return-cached\n // @cpt-begin:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-update-cache\n if (ids !== cacheRef.current.ids) {\n cacheRef.current = { ids, extensions };\n }\n return cacheRef.current.extensions;\n // @cpt-end:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-return-cached\n // @cpt-end:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-update-cache\n }, [registry, domainId]);\n // @cpt-end:cpt-hai3-flow-react-bindings-use-domain-extensions:p1:inst-diff-extensions\n // @cpt-end:cpt-hai3-flow-react-bindings-use-domain-extensions:p1:inst-stable-reference\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n}\n// @cpt-end:cpt-hai3-flow-react-bindings-use-domain-extensions:p1:inst-call-domain-extensions\n// @cpt-end:cpt-hai3-dod-react-bindings-observation-hooks:p1:inst-call-domain-extensions\n","/**\n * useRegisteredPackages Hook - Registered GTS packages subscription\n *\n * Subscribes to store changes to detect when extensions are registered or unregistered,\n * and returns the current list of registered GTS packages.\n *\n * React Layer: L3\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-use-registered-packages:p1\n// @cpt-algo:cpt-hai3-algo-react-bindings-mfe-context-guard:p1\n// @cpt-algo:cpt-hai3-algo-react-bindings-stable-snapshots:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-observation-hooks:p1\n\nimport { useSyncExternalStore, useCallback, useRef } from 'react';\nimport { useHAI3 } from '../../HAI3Context';\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for observing registered GTS packages.\n *\n * Subscribes to the HAI3 store to detect registration state changes,\n * and returns the current list of GTS packages extracted from registered\n * extensions.\n *\n * ARCHITECTURAL NOTE ON STORE SUBSCRIPTION COUPLING:\n * This hook uses `useSyncExternalStore` with `app.store.subscribe`, which\n * fires on any Redux dispatch. Since `registerExtension()` dispatches to\n * the mfe store slice, the subscription WILL trigger when packages change.\n * The `getSnapshot` function calls `screensetsRegistry.getRegisteredPackages()`\n * which reads the private `packages` Map. This works because every package\n * map mutation (in registerExtension/unregisterExtension) is always\n * accompanied by a store dispatch in the same serializer callback.\n *\n * IMPORTANT: If a future change mutates the packages map WITHOUT a store\n * dispatch, this hook would fail to re-render. Keep this coupling documented.\n *\n * @returns Array of GTS package strings currently registered\n *\n * @example\n * ```tsx\n * function PackageList() {\n * const packages = useRegisteredPackages();\n *\n * return (\n * <div>\n * {packages.map(pkg => (\n * <div key={pkg}>{pkg}</div>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-registered-packages:p1:inst-call-registered-packages\n// @cpt-begin:cpt-hai3-dod-react-bindings-observation-hooks:p1:inst-call-registered-packages\nexport function useRegisteredPackages(): string[] {\n const app = useHAI3();\n const registry = app.screensetsRegistry;\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-registered-packages:p1:inst-guard-registry-packages\n // @cpt-begin:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-registry\n if (!registry) {\n throw new Error(\n 'useRegisteredPackages requires the microfrontends plugin. ' +\n 'Add microfrontends() to your HAI3 app configuration.'\n );\n }\n // @cpt-end:cpt-hai3-flow-react-bindings-use-registered-packages:p1:inst-guard-registry-packages\n // @cpt-end:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-registry\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-registered-packages:p1:inst-subscribe-store-packages\n // Subscribe to store changes.\n // Any dispatch (including registration state updates) triggers a snapshot check.\n // The snapshot comparison ensures only actual package list changes cause re-renders.\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n return app.store.subscribe(onStoreChange);\n },\n [app.store]\n );\n // @cpt-end:cpt-hai3-flow-react-bindings-use-registered-packages:p1:inst-subscribe-store-packages\n\n // @cpt-begin:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-cache-ref\n // Cache the snapshot to maintain referential stability for useSyncExternalStore.\n // Only update when the package list actually changes.\n const cacheRef = useRef<{ packages: string; list: string[] }>({ packages: '', list: [] });\n // @cpt-end:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-cache-ref\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-registered-packages:p1:inst-diff-packages\n const getSnapshot = useCallback(() => {\n const list = registry.getRegisteredPackages();\n // @cpt-begin:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-compute-cache-key\n const packages = list.join(',');\n // @cpt-end:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-compute-cache-key\n // @cpt-begin:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-return-cached\n // @cpt-begin:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-update-cache\n if (packages !== cacheRef.current.packages) {\n cacheRef.current = { packages, list };\n }\n return cacheRef.current.list;\n // @cpt-end:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-return-cached\n // @cpt-end:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-update-cache\n }, [registry]);\n // @cpt-end:cpt-hai3-flow-react-bindings-use-registered-packages:p1:inst-diff-packages\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n}\n// @cpt-end:cpt-hai3-flow-react-bindings-use-registered-packages:p1:inst-call-registered-packages\n// @cpt-end:cpt-hai3-dod-react-bindings-observation-hooks:p1:inst-call-registered-packages\n","/**\n * useActivePackage Hook - Active GTS package subscription\n *\n * Subscribes to store changes and returns the GTS package of the currently\n * mounted screen extension.\n *\n * React Layer: L3\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-use-active-package:p1\n// @cpt-algo:cpt-hai3-algo-react-bindings-mfe-context-guard:p1\n// @cpt-algo:cpt-hai3-algo-react-bindings-stable-snapshots:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-observation-hooks:p1\n\nimport { useSyncExternalStore, useCallback, useRef } from 'react';\nimport { useHAI3 } from '../../HAI3Context';\nimport { extractGtsPackage, HAI3_SCREEN_DOMAIN } from '@hai3/framework';\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for observing the active GTS package (the package of the currently\n * mounted screen extension).\n *\n * Subscribes to the HAI3 store to detect mount state changes, and returns\n * the GTS package extracted from the currently mounted screen extension's ID.\n *\n * Returns `undefined` if no screen extension is currently mounted.\n *\n * @returns GTS package string of the active screen extension, or undefined\n *\n * @example\n * ```tsx\n * function ActivePackageIndicator() {\n * const activePackage = useActivePackage();\n *\n * if (!activePackage) {\n * return <div>No active screen</div>;\n * }\n *\n * return <div>Active package: {activePackage}</div>;\n * }\n * ```\n */\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-active-package:p1:inst-call-active-package\n// @cpt-begin:cpt-hai3-dod-react-bindings-observation-hooks:p1:inst-call-active-package\nexport function useActivePackage(): string | undefined {\n const app = useHAI3();\n const registry = app.screensetsRegistry;\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-active-package:p1:inst-guard-registry-active\n // @cpt-begin:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-registry\n if (!registry) {\n throw new Error(\n 'useActivePackage requires the microfrontends plugin. ' +\n 'Add microfrontends() to your HAI3 app configuration.'\n );\n }\n // @cpt-end:cpt-hai3-flow-react-bindings-use-active-package:p1:inst-guard-registry-active\n // @cpt-end:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-registry\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-active-package:p1:inst-subscribe-store-active\n // Subscribe to store changes.\n // Any dispatch (including mount state updates) triggers a snapshot check.\n // The snapshot comparison ensures only actual active package changes cause re-renders.\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n return app.store.subscribe(onStoreChange);\n },\n [app.store]\n );\n // @cpt-end:cpt-hai3-flow-react-bindings-use-active-package:p1:inst-subscribe-store-active\n\n // @cpt-begin:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-cache-ref\n // Cache the snapshot to maintain referential stability for useSyncExternalStore.\n // Only update when the active package actually changes.\n const cacheRef = useRef<{ activePackage: string | undefined }>({ activePackage: undefined });\n // @cpt-end:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-cache-ref\n\n const getSnapshot = useCallback(() => {\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-active-package:p1:inst-get-mounted-extension\n const mountedExtensionId = registry.getMountedExtension(HAI3_SCREEN_DOMAIN);\n // @cpt-end:cpt-hai3-flow-react-bindings-use-active-package:p1:inst-get-mounted-extension\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-active-package:p1:inst-return-undefined-active\n // Guard: if no extension is mounted, return undefined immediately\n if (!mountedExtensionId) {\n const result = undefined;\n // @cpt-begin:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-return-cached\n if (result !== cacheRef.current.activePackage) {\n cacheRef.current = { activePackage: result };\n }\n return cacheRef.current.activePackage;\n // @cpt-end:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-return-cached\n }\n // @cpt-end:cpt-hai3-flow-react-bindings-use-active-package:p1:inst-return-undefined-active\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-active-package:p1:inst-extract-package\n // @cpt-begin:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-compute-cache-key\n // Extract GTS package from the mounted extension ID\n const activePackage = extractGtsPackage(mountedExtensionId);\n // @cpt-end:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-compute-cache-key\n\n // @cpt-begin:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-update-cache\n if (activePackage !== cacheRef.current.activePackage) {\n cacheRef.current = { activePackage };\n }\n // @cpt-end:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-update-cache\n\n return cacheRef.current.activePackage;\n // @cpt-end:cpt-hai3-flow-react-bindings-use-active-package:p1:inst-extract-package\n }, [registry]);\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n}\n// @cpt-end:cpt-hai3-flow-react-bindings-use-active-package:p1:inst-call-active-package\n// @cpt-end:cpt-hai3-dod-react-bindings-observation-hooks:p1:inst-call-active-package\n","/**\n * Ref Container Provider\n *\n * Concrete ContainerProvider that wraps a React ref.\n * Created by React components (like ExtensionDomainSlot) for use\n * by framework-level domain registration code.\n *\n * @packageDocumentation\n */\n// @cpt-dod:cpt-hai3-dod-react-bindings-ref-container-provider:p1\n\nimport type { RefObject } from 'react';\nimport { ContainerProvider } from '@hai3/framework';\n\n/**\n * Concrete ContainerProvider that wraps a React ref.\n *\n * This provider reads the container element from a React ref at mount time.\n * It is designed to be created by React components but passed to domain\n * registration code (framework-level).\n *\n * Usage pattern:\n * 1. React component creates a ref via `useRef<HTMLDivElement>(null)`\n * 2. Framework-level code creates `RefContainerProvider` wrapping the ref\n * 3. Framework-level code passes the provider to `registerDomain(domain, provider)`\n * 4. When mount_ext is dispatched, the provider returns `ref.current`\n */\n// @cpt-begin:cpt-hai3-dod-react-bindings-ref-container-provider:p1:inst-1\nexport class RefContainerProvider extends ContainerProvider {\n constructor(private readonly containerRef: RefObject<HTMLDivElement>) {\n super();\n }\n\n getContainer(_extensionId: string): Element {\n if (!this.containerRef.current) {\n throw new Error('Container ref is not attached -- component may not be mounted yet');\n }\n return this.containerRef.current;\n }\n\n releaseContainer(_extensionId: string): void {\n // No-op for React ref -- the ref lifecycle is managed by React.\n // Container cleanup happens when the component unmounts.\n }\n}\n// @cpt-end:cpt-hai3-dod-react-bindings-ref-container-provider:p1:inst-1\n","/**\n * Extension Domain Slot Component\n *\n * React component that renders extensions within a domain slot.\n * Manages extension lifecycle (mount/unmount) and provides rendering context.\n *\n * @packageDocumentation\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-extension-domain-slot:p1\n// @cpt-state:cpt-hai3-state-react-bindings-extension-slot:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-extension-slot:p1\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport type { ScreensetsRegistry, ParentMfeBridge } from '@hai3/framework';\nimport {\n HAI3_ACTION_MOUNT_EXT,\n HAI3_ACTION_UNMOUNT_EXT,\n} from '@hai3/framework';\n\n/**\n * Props for ExtensionDomainSlot component\n */\nexport interface ExtensionDomainSlotProps {\n /**\n * The screensets registry instance\n */\n registry: ScreensetsRegistry;\n\n /**\n * The domain ID for this slot\n */\n domainId: string;\n\n /**\n * The extension ID to render in this slot\n */\n extensionId: string;\n\n /**\n * Optional CSS class name for the container\n */\n className?: string;\n\n /**\n * Optional callback when extension is mounted\n */\n onMounted?: (bridge: ParentMfeBridge) => void;\n\n /**\n * Optional callback when extension is unmounted\n */\n onUnmounted?: () => void;\n\n /**\n * Optional error callback\n */\n onError?: (error: Error) => void;\n\n /**\n * Optional loading component\n */\n loadingComponent?: React.ReactNode;\n\n /**\n * Optional error component renderer\n */\n errorComponent?: (error: Error) => React.ReactNode;\n}\n\n/**\n * Extension Domain Slot Component\n *\n * Renders an extension within a domain slot. Manages the extension lifecycle:\n * - Mounts the extension on component mount\n * - Unmounts the extension on component unmount\n * - Handles loading and error states\n *\n * @example\n * ```tsx\n * <ExtensionDomainSlot\n * registry={registry}\n * domainId=\"gts.hai3.mfes.ext.domain.v1~hai3.screensets.layout.sidebar.v1\"\n * extensionId=\"gts.hai3.mfes.ext.extension.v1~myapp.sidebar.widget.v1\"\n * className=\"sidebar-slot\"\n * />\n * ```\n */\n// @cpt-begin:cpt-hai3-flow-react-bindings-extension-domain-slot:p1:inst-render-slot\n// @cpt-begin:cpt-hai3-dod-react-bindings-extension-slot:p1:inst-render-slot\nexport function ExtensionDomainSlot(props: ExtensionDomainSlotProps): React.ReactElement {\n const {\n registry,\n domainId,\n extensionId,\n className,\n onMounted,\n onUnmounted,\n onError,\n loadingComponent,\n errorComponent,\n } = props;\n\n const containerRef = useRef<HTMLDivElement>(null);\n // @cpt-begin:cpt-hai3-state-react-bindings-extension-slot:p1:inst-start-mount\n const [isLoading, setIsLoading] = useState(true);\n // @cpt-end:cpt-hai3-state-react-bindings-extension-slot:p1:inst-start-mount\n const [error, setError] = useState<Error | null>(null);\n const [bridge, setBridge] = useState<ParentMfeBridge | null>(null);\n\n useEffect(() => {\n let mounted = true;\n let currentBridge: ParentMfeBridge | null = null;\n\n async function mountExtension() {\n if (!containerRef.current) {\n return;\n }\n\n try {\n // @cpt-begin:cpt-hai3-state-react-bindings-extension-slot:p2:inst-retry-mount\n // Resetting error/loading here also handles the ERROR→MOUNTING transition when\n // extensionId or domainId props change (effect re-runs due to dependency array)\n setIsLoading(true);\n setError(null);\n // @cpt-end:cpt-hai3-state-react-bindings-extension-slot:p2:inst-retry-mount\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-extension-domain-slot:p1:inst-dispatch-mount\n // Mount the extension via actions chain (auto-loads if not already loaded)\n // Container is provided by the domain's ContainerProvider (registered at domain registration time)\n await registry.executeActionsChain({\n action: {\n type: HAI3_ACTION_MOUNT_EXT,\n target: domainId,\n payload: {\n extensionId,\n },\n },\n });\n // @cpt-end:cpt-hai3-flow-react-bindings-extension-domain-slot:p1:inst-dispatch-mount\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-extension-domain-slot:p2:inst-race-cleanup\n // @cpt-begin:cpt-hai3-state-react-bindings-extension-slot:p1:inst-race-unmount\n if (!mounted) {\n // Component was unmounted while mounting - clean up\n await registry.executeActionsChain({\n action: {\n type: HAI3_ACTION_UNMOUNT_EXT,\n target: domainId,\n payload: {\n extensionId,\n },\n },\n });\n return;\n }\n // @cpt-end:cpt-hai3-flow-react-bindings-extension-domain-slot:p2:inst-race-cleanup\n // @cpt-end:cpt-hai3-state-react-bindings-extension-slot:p1:inst-race-unmount\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-extension-domain-slot:p1:inst-get-bridge\n // @cpt-begin:cpt-hai3-state-react-bindings-extension-slot:p1:inst-mount-success\n // Query the bridge after mount completes\n const newBridge = registry.getParentBridge(extensionId);\n if (!newBridge) {\n throw new Error(`Failed to obtain bridge for extension ${extensionId} after mount`);\n }\n\n currentBridge = newBridge;\n setBridge(newBridge);\n setIsLoading(false);\n // @cpt-end:cpt-hai3-flow-react-bindings-extension-domain-slot:p1:inst-get-bridge\n // @cpt-end:cpt-hai3-state-react-bindings-extension-slot:p1:inst-mount-success\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-extension-domain-slot:p1:inst-notify-mounted\n // Notify parent\n if (onMounted) {\n onMounted(newBridge);\n }\n // @cpt-end:cpt-hai3-flow-react-bindings-extension-domain-slot:p1:inst-notify-mounted\n } catch (err) {\n // @cpt-begin:cpt-hai3-flow-react-bindings-extension-domain-slot:p1:inst-handle-mount-error\n // @cpt-begin:cpt-hai3-state-react-bindings-extension-slot:p1:inst-mount-error\n if (!mounted) {\n return;\n }\n\n const errorObj = err instanceof Error ? err : new Error(String(err));\n setError(errorObj);\n setIsLoading(false);\n\n if (onError) {\n onError(errorObj);\n }\n // @cpt-end:cpt-hai3-flow-react-bindings-extension-domain-slot:p1:inst-handle-mount-error\n // @cpt-end:cpt-hai3-state-react-bindings-extension-slot:p1:inst-mount-error\n }\n }\n\n // Start mounting\n void mountExtension();\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-extension-domain-slot:p1:inst-cleanup-unmount\n // @cpt-begin:cpt-hai3-state-react-bindings-extension-slot:p1:inst-start-unmount\n // Cleanup on unmount\n return () => {\n mounted = false;\n\n if (currentBridge) {\n // Unmount extension asynchronously via actions chain\n void registry.executeActionsChain({\n action: {\n type: HAI3_ACTION_UNMOUNT_EXT,\n target: domainId,\n payload: {\n extensionId,\n },\n },\n }).then(() => {\n if (onUnmounted) {\n onUnmounted();\n }\n });\n }\n };\n // @cpt-end:cpt-hai3-flow-react-bindings-extension-domain-slot:p1:inst-cleanup-unmount\n // @cpt-end:cpt-hai3-state-react-bindings-extension-slot:p1:inst-start-unmount\n }, [registry, domainId, extensionId, onMounted, onUnmounted, onError]);\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-extension-domain-slot:p1:inst-show-loading\n // Render loading state\n if (isLoading) {\n return (\n <div className={className} data-domain-id={domainId} data-extension-id={extensionId}>\n {loadingComponent ?? <div>Loading extension...</div>}\n </div>\n );\n }\n // @cpt-end:cpt-hai3-flow-react-bindings-extension-domain-slot:p1:inst-show-loading\n\n // Render error state\n if (error) {\n return (\n <div className={className} data-domain-id={domainId} data-extension-id={extensionId}>\n {errorComponent ? errorComponent(error) : (\n <div>\n <strong>Error loading extension:</strong>\n <pre>{error.message}</pre>\n </div>\n )}\n </div>\n );\n }\n\n // Render the container for the mounted extension\n return (\n <div\n ref={containerRef}\n className={className}\n data-domain-id={domainId}\n data-extension-id={extensionId}\n data-bridge-active={bridge !== null}\n />\n );\n}\n// @cpt-end:cpt-hai3-flow-react-bindings-extension-domain-slot:p1:inst-render-slot\n// @cpt-end:cpt-hai3-dod-react-bindings-extension-slot:p1:inst-render-slot\n"],"mappings":"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","names":["import_react","import_react","import_jsx_runtime","ReduxProvider","import_react_redux","import_react_redux","import_react","i18nRegistry","import_react","i18nRegistry","module","import_react","import_framework","formatDateFn","formatTimeFn","formatDateTimeFn","formatRelativeFn","formatNumberFn","formatPercentFn","formatCompactFn","formatCurrencyFn","compareStringsFn","createCollatorFn","import_react","themes","import_react","import_react","import_react","import_react","import_react","import_framework","import_framework","import_react","import_framework","import_jsx_runtime","mountExtension","import_framework","frameworkEventBus"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -3,7 +3,7 @@ import React__default, { RefObject } from 'react';
|
|
|
3
3
|
import { H as HAI3ProviderProps, U as UseTranslationReturn, a as UseScreenTranslationsReturn, b as UseFormattersReturn, c as UseThemeReturn, M as MfeContextValue } from './types-CcLYaLwF.cjs';
|
|
4
4
|
export { d as MfeContext, e as UseAppDispatchReturn, f as UseAppSelector, g as UseHAI3Return, u as useMfeContext } from './types-CcLYaLwF.cjs';
|
|
5
5
|
import { HAI3App, AppDispatch, RootState, TranslationMap, TranslationLoader, ChildMfeBridge, Extension, ContainerProvider, ScreensetsRegistry, ParentMfeBridge, EventPayloadMap as EventPayloadMap$1, EventBus } from '@hai3/framework';
|
|
6
|
-
export { ACCOUNTS_DOMAIN, Action, ActionsChain, ApiPlugin, ApiPluginBase, ApiPluginErrorContext, ApiProtocol, ApiRequestContext, ApiResponseContext, ApiServiceConfig, AppDispatch, BaseApiService, BasePluginHooks, ChangeThemePayload, ChildMfeBridge, ContainerProvider, EventHandler, EventSourceLike, Extension, ExtensionDomain, ExtensionPresentation, ExtensionRegistrationState, FooterConfig, FooterState, HAI3App, HAI3AppBuilder, HAI3Config, HAI3Plugin, HAI3Store, HAI3_ACTION_LOAD_EXT, HAI3_ACTION_MOUNT_EXT, HAI3_ACTION_UNMOUNT_EXT, HAI3_OVERLAY_DOMAIN, HAI3_POPUP_DOMAIN, HAI3_SCREEN_DOMAIN, HAI3_SCREEN_EXTENSION_TYPE, HAI3_SHARED_PROPERTY_LANGUAGE, HAI3_SHARED_PROPERTY_THEME, HAI3_SIDEBAR_DOMAIN, HeaderConfig, HeaderState, HeaderUser, I18nConfig, I18nRegistry, I18nRegistryImpl, I18nRegistryType, JSONSchema, JsonCompatible, JsonObject, JsonPrimitive, JsonValue, LAYOUT_SLICE_NAME, Language, LanguageDisplayMode, LanguageMetadata, LayoutDomain, LayoutDomainReducers, LayoutDomainState, LayoutState, LifecycleHook, LifecycleStage, LoadExtPayload, MOCK_PLUGIN, MenuItem, MenuState, MfeBridgeFactory, MfeEntry, MfeEntryLifecycle, MfeEntryMF, MfeHandler, MfeHandlerMF, MfeState, MockEventSource, MockEvents, MockMap, MockState, MockTogglePayload, MountExtPayload, OverlayConfig, OverlayState, ParentMfeBridge, PluginClass, PluginFactory, PluginLifecycle, PluginProvides, PopupConfig, PopupSliceState, PopupState, Preset, Presets, ProtocolClass, ProtocolPluginType, ReducerPayload, RegisterExtensionPayload, RestMockConfig, RestMockPlugin, RestPlugin, RestPluginHooks, RestPluginWithConfig, RestProtocol, RestProtocolConfig, RestRequestContext, RestResponseContext, RestShortCircuitResponse, RootState, RootStateWithLayout, SUPPORTED_LANGUAGES, ScreenExtension, ScreenState, ScreensetsConfig, ScreensetsRegistry, ScreensetsRegistryConfig, ScreensetsRegistryFactory, SetLanguagePayload, SharedProperty, 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, TypeSystemPlugin, UikitTheme, UnmountExtPayload, UnregisterExtensionPayload, ValidationError, ValidationResult, apiRegistry, changeTenant, clearActiveScreen, clearTenant, clearTenantAction, clearUser, closeAllPopups, closePopup, closeTopPopup, createHAI3, createHAI3App, createI18nRegistry, createShadowRoot, createSlice, createStore, createThemeRegistry, effects, extractGtsPackage, footerActions, footerSlice, getLanguageMetadata, getStore, gtsPlugin, hasSlice, headerActions, headerSlice, hideOverlay, i18n, i18nRegistry, initMockEffects, initTenantEffects, injectCssVariables, isMockPlugin, isRestShortCircuit, isShortCircuit, isSseShortCircuit, layout, layoutDomainReducers, layoutReducer, loadExtension, menuActions, menuSlice, microfrontends, mock, mockActions, mockSlice, mountExtension, navigateTo, openPopup, overlayActions, overlayDomain, overlaySlice, popupActions, popupDomain, popupSlice, presets, registerExtension, registerSlice, screenActions, screenDomain, screenSlice, screensets, screensetsRegistryFactory, selectExtensionError, selectExtensionState, selectRegisteredExtensions, setActiveScreen, setFooterConfig, setFooterVisible, setHeaderLoading, setMenuCollapsed, setMenuConfig, setMenuItems, setMenuVisible, setMockEnabled, setOverlayVisible, setScreenLoading, setSidebarCollapsed, setSidebarConfig, setSidebarContent, setSidebarPosition, setSidebarTitle, setSidebarVisible, setSidebarWidth, setTenant, setTenantLoading, setTenantLoadingState, setUser, showOverlay, sidebarActions, sidebarDomain, sidebarSlice, tenantActions, tenantReducer, tenantSlice, themes, toggleMenu, toggleMockMode, toggleSidebar, unmountExtension, unregisterExtension } from '@hai3/framework';
|
|
6
|
+
export { ACCOUNTS_DOMAIN, Action, ActionsChain, ApiPlugin, ApiPluginBase, ApiPluginErrorContext, ApiProtocol, ApiRequestContext, ApiResponseContext, ApiServiceConfig, AppDispatch, BaseApiService, BasePluginHooks, ChangeThemePayload, ChildMfeBridge, ContainerProvider, EventHandler, EventSourceLike, Extension, ExtensionDomain, ExtensionPresentation, ExtensionRegistrationState, FooterConfig, FooterState, HAI3App, HAI3AppBuilder, HAI3Config, HAI3Plugin, HAI3Store, HAI3_ACTION_LOAD_EXT, HAI3_ACTION_MOUNT_EXT, HAI3_ACTION_UNMOUNT_EXT, HAI3_MFE_ENTRY_MF, HAI3_OVERLAY_DOMAIN, HAI3_POPUP_DOMAIN, HAI3_SCREEN_DOMAIN, HAI3_SCREEN_EXTENSION_TYPE, HAI3_SHARED_PROPERTY_LANGUAGE, HAI3_SHARED_PROPERTY_THEME, HAI3_SIDEBAR_DOMAIN, HeaderConfig, HeaderState, HeaderUser, I18nConfig, I18nRegistry, I18nRegistryImpl, I18nRegistryType, JSONSchema, JsonCompatible, JsonObject, JsonPrimitive, JsonValue, LAYOUT_SLICE_NAME, Language, LanguageDisplayMode, LanguageMetadata, LayoutDomain, LayoutDomainReducers, LayoutDomainState, LayoutState, LifecycleHook, LifecycleStage, LoadExtPayload, MOCK_PLUGIN, MenuItem, MenuState, MfeBridgeFactory, MfeEntry, MfeEntryLifecycle, MfeEntryMF, MfeHandler, MfeHandlerMF, MfeState, MockEventSource, MockEvents, MockMap, MockState, MockTogglePayload, MountExtPayload, OverlayConfig, OverlayState, ParentMfeBridge, PluginClass, PluginFactory, PluginLifecycle, PluginProvides, PopupConfig, PopupSliceState, PopupState, Preset, Presets, ProtocolClass, ProtocolPluginType, ReducerPayload, RegisterExtensionPayload, RestMockConfig, RestMockPlugin, RestPlugin, RestPluginHooks, RestPluginWithConfig, RestProtocol, RestProtocolConfig, RestRequestContext, RestResponseContext, RestShortCircuitResponse, RootState, RootStateWithLayout, SUPPORTED_LANGUAGES, ScreenExtension, ScreenState, ScreensetsConfig, ScreensetsRegistry, ScreensetsRegistryConfig, ScreensetsRegistryFactory, SetLanguagePayload, SharedProperty, 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, TypeSystemPlugin, UikitTheme, UnmountExtPayload, UnregisterExtensionPayload, ValidationError, ValidationResult, apiRegistry, changeTenant, clearActiveScreen, clearTenant, clearTenantAction, clearUser, closeAllPopups, closePopup, closeTopPopup, createHAI3, createHAI3App, createI18nRegistry, createShadowRoot, createSlice, createStore, createThemeRegistry, effects, extractGtsPackage, footerActions, footerSlice, getLanguageMetadata, getStore, gtsPlugin, hasSlice, headerActions, headerSlice, hideOverlay, i18n, i18nRegistry, initMockEffects, initTenantEffects, injectCssVariables, isMockPlugin, isRestShortCircuit, isShortCircuit, isSseShortCircuit, layout, layoutDomainReducers, layoutReducer, loadExtension, menuActions, menuSlice, microfrontends, mock, mockActions, mockSlice, mountExtension, navigateTo, openPopup, overlayActions, overlayDomain, overlaySlice, popupActions, popupDomain, popupSlice, presets, registerExtension, registerSlice, screenActions, screenDomain, screenSlice, screensets, screensetsRegistryFactory, selectExtensionError, selectExtensionState, selectRegisteredExtensions, setActiveScreen, setFooterConfig, setFooterVisible, setHeaderLoading, setMenuCollapsed, setMenuConfig, setMenuItems, setMenuVisible, setMockEnabled, setOverlayVisible, setScreenLoading, setSidebarCollapsed, setSidebarConfig, setSidebarContent, setSidebarPosition, setSidebarTitle, setSidebarVisible, setSidebarWidth, setTenant, setTenantLoading, setTenantLoadingState, setUser, showOverlay, sidebarActions, sidebarDomain, sidebarSlice, tenantActions, tenantReducer, tenantSlice, themes, toggleMenu, toggleMockMode, toggleSidebar, unmountExtension, unregisterExtension } from '@hai3/framework';
|
|
7
7
|
import { TypedUseSelectorHook } from 'react-redux';
|
|
8
8
|
|
|
9
9
|
/**
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import React__default, { RefObject } from 'react';
|
|
|
3
3
|
import { H as HAI3ProviderProps, U as UseTranslationReturn, a as UseScreenTranslationsReturn, b as UseFormattersReturn, c as UseThemeReturn, M as MfeContextValue } from './types-CcLYaLwF.js';
|
|
4
4
|
export { d as MfeContext, e as UseAppDispatchReturn, f as UseAppSelector, g as UseHAI3Return, u as useMfeContext } from './types-CcLYaLwF.js';
|
|
5
5
|
import { HAI3App, AppDispatch, RootState, TranslationMap, TranslationLoader, ChildMfeBridge, Extension, ContainerProvider, ScreensetsRegistry, ParentMfeBridge, EventPayloadMap as EventPayloadMap$1, EventBus } from '@hai3/framework';
|
|
6
|
-
export { ACCOUNTS_DOMAIN, Action, ActionsChain, ApiPlugin, ApiPluginBase, ApiPluginErrorContext, ApiProtocol, ApiRequestContext, ApiResponseContext, ApiServiceConfig, AppDispatch, BaseApiService, BasePluginHooks, ChangeThemePayload, ChildMfeBridge, ContainerProvider, EventHandler, EventSourceLike, Extension, ExtensionDomain, ExtensionPresentation, ExtensionRegistrationState, FooterConfig, FooterState, HAI3App, HAI3AppBuilder, HAI3Config, HAI3Plugin, HAI3Store, HAI3_ACTION_LOAD_EXT, HAI3_ACTION_MOUNT_EXT, HAI3_ACTION_UNMOUNT_EXT, HAI3_OVERLAY_DOMAIN, HAI3_POPUP_DOMAIN, HAI3_SCREEN_DOMAIN, HAI3_SCREEN_EXTENSION_TYPE, HAI3_SHARED_PROPERTY_LANGUAGE, HAI3_SHARED_PROPERTY_THEME, HAI3_SIDEBAR_DOMAIN, HeaderConfig, HeaderState, HeaderUser, I18nConfig, I18nRegistry, I18nRegistryImpl, I18nRegistryType, JSONSchema, JsonCompatible, JsonObject, JsonPrimitive, JsonValue, LAYOUT_SLICE_NAME, Language, LanguageDisplayMode, LanguageMetadata, LayoutDomain, LayoutDomainReducers, LayoutDomainState, LayoutState, LifecycleHook, LifecycleStage, LoadExtPayload, MOCK_PLUGIN, MenuItem, MenuState, MfeBridgeFactory, MfeEntry, MfeEntryLifecycle, MfeEntryMF, MfeHandler, MfeHandlerMF, MfeState, MockEventSource, MockEvents, MockMap, MockState, MockTogglePayload, MountExtPayload, OverlayConfig, OverlayState, ParentMfeBridge, PluginClass, PluginFactory, PluginLifecycle, PluginProvides, PopupConfig, PopupSliceState, PopupState, Preset, Presets, ProtocolClass, ProtocolPluginType, ReducerPayload, RegisterExtensionPayload, RestMockConfig, RestMockPlugin, RestPlugin, RestPluginHooks, RestPluginWithConfig, RestProtocol, RestProtocolConfig, RestRequestContext, RestResponseContext, RestShortCircuitResponse, RootState, RootStateWithLayout, SUPPORTED_LANGUAGES, ScreenExtension, ScreenState, ScreensetsConfig, ScreensetsRegistry, ScreensetsRegistryConfig, ScreensetsRegistryFactory, SetLanguagePayload, SharedProperty, 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, TypeSystemPlugin, UikitTheme, UnmountExtPayload, UnregisterExtensionPayload, ValidationError, ValidationResult, apiRegistry, changeTenant, clearActiveScreen, clearTenant, clearTenantAction, clearUser, closeAllPopups, closePopup, closeTopPopup, createHAI3, createHAI3App, createI18nRegistry, createShadowRoot, createSlice, createStore, createThemeRegistry, effects, extractGtsPackage, footerActions, footerSlice, getLanguageMetadata, getStore, gtsPlugin, hasSlice, headerActions, headerSlice, hideOverlay, i18n, i18nRegistry, initMockEffects, initTenantEffects, injectCssVariables, isMockPlugin, isRestShortCircuit, isShortCircuit, isSseShortCircuit, layout, layoutDomainReducers, layoutReducer, loadExtension, menuActions, menuSlice, microfrontends, mock, mockActions, mockSlice, mountExtension, navigateTo, openPopup, overlayActions, overlayDomain, overlaySlice, popupActions, popupDomain, popupSlice, presets, registerExtension, registerSlice, screenActions, screenDomain, screenSlice, screensets, screensetsRegistryFactory, selectExtensionError, selectExtensionState, selectRegisteredExtensions, setActiveScreen, setFooterConfig, setFooterVisible, setHeaderLoading, setMenuCollapsed, setMenuConfig, setMenuItems, setMenuVisible, setMockEnabled, setOverlayVisible, setScreenLoading, setSidebarCollapsed, setSidebarConfig, setSidebarContent, setSidebarPosition, setSidebarTitle, setSidebarVisible, setSidebarWidth, setTenant, setTenantLoading, setTenantLoadingState, setUser, showOverlay, sidebarActions, sidebarDomain, sidebarSlice, tenantActions, tenantReducer, tenantSlice, themes, toggleMenu, toggleMockMode, toggleSidebar, unmountExtension, unregisterExtension } from '@hai3/framework';
|
|
6
|
+
export { ACCOUNTS_DOMAIN, Action, ActionsChain, ApiPlugin, ApiPluginBase, ApiPluginErrorContext, ApiProtocol, ApiRequestContext, ApiResponseContext, ApiServiceConfig, AppDispatch, BaseApiService, BasePluginHooks, ChangeThemePayload, ChildMfeBridge, ContainerProvider, EventHandler, EventSourceLike, Extension, ExtensionDomain, ExtensionPresentation, ExtensionRegistrationState, FooterConfig, FooterState, HAI3App, HAI3AppBuilder, HAI3Config, HAI3Plugin, HAI3Store, HAI3_ACTION_LOAD_EXT, HAI3_ACTION_MOUNT_EXT, HAI3_ACTION_UNMOUNT_EXT, HAI3_MFE_ENTRY_MF, HAI3_OVERLAY_DOMAIN, HAI3_POPUP_DOMAIN, HAI3_SCREEN_DOMAIN, HAI3_SCREEN_EXTENSION_TYPE, HAI3_SHARED_PROPERTY_LANGUAGE, HAI3_SHARED_PROPERTY_THEME, HAI3_SIDEBAR_DOMAIN, HeaderConfig, HeaderState, HeaderUser, I18nConfig, I18nRegistry, I18nRegistryImpl, I18nRegistryType, JSONSchema, JsonCompatible, JsonObject, JsonPrimitive, JsonValue, LAYOUT_SLICE_NAME, Language, LanguageDisplayMode, LanguageMetadata, LayoutDomain, LayoutDomainReducers, LayoutDomainState, LayoutState, LifecycleHook, LifecycleStage, LoadExtPayload, MOCK_PLUGIN, MenuItem, MenuState, MfeBridgeFactory, MfeEntry, MfeEntryLifecycle, MfeEntryMF, MfeHandler, MfeHandlerMF, MfeState, MockEventSource, MockEvents, MockMap, MockState, MockTogglePayload, MountExtPayload, OverlayConfig, OverlayState, ParentMfeBridge, PluginClass, PluginFactory, PluginLifecycle, PluginProvides, PopupConfig, PopupSliceState, PopupState, Preset, Presets, ProtocolClass, ProtocolPluginType, ReducerPayload, RegisterExtensionPayload, RestMockConfig, RestMockPlugin, RestPlugin, RestPluginHooks, RestPluginWithConfig, RestProtocol, RestProtocolConfig, RestRequestContext, RestResponseContext, RestShortCircuitResponse, RootState, RootStateWithLayout, SUPPORTED_LANGUAGES, ScreenExtension, ScreenState, ScreensetsConfig, ScreensetsRegistry, ScreensetsRegistryConfig, ScreensetsRegistryFactory, SetLanguagePayload, SharedProperty, 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, TypeSystemPlugin, UikitTheme, UnmountExtPayload, UnregisterExtensionPayload, ValidationError, ValidationResult, apiRegistry, changeTenant, clearActiveScreen, clearTenant, clearTenantAction, clearUser, closeAllPopups, closePopup, closeTopPopup, createHAI3, createHAI3App, createI18nRegistry, createShadowRoot, createSlice, createStore, createThemeRegistry, effects, extractGtsPackage, footerActions, footerSlice, getLanguageMetadata, getStore, gtsPlugin, hasSlice, headerActions, headerSlice, hideOverlay, i18n, i18nRegistry, initMockEffects, initTenantEffects, injectCssVariables, isMockPlugin, isRestShortCircuit, isShortCircuit, isSseShortCircuit, layout, layoutDomainReducers, layoutReducer, loadExtension, menuActions, menuSlice, microfrontends, mock, mockActions, mockSlice, mountExtension, navigateTo, openPopup, overlayActions, overlayDomain, overlaySlice, popupActions, popupDomain, popupSlice, presets, registerExtension, registerSlice, screenActions, screenDomain, screenSlice, screensets, screensetsRegistryFactory, selectExtensionError, selectExtensionState, selectRegisteredExtensions, setActiveScreen, setFooterConfig, setFooterVisible, setHeaderLoading, setMenuCollapsed, setMenuConfig, setMenuItems, setMenuVisible, setMockEnabled, setOverlayVisible, setScreenLoading, setSidebarCollapsed, setSidebarConfig, setSidebarContent, setSidebarPosition, setSidebarTitle, setSidebarVisible, setSidebarWidth, setTenant, setTenantLoading, setTenantLoadingState, setUser, showOverlay, sidebarActions, sidebarDomain, sidebarSlice, tenantActions, tenantReducer, tenantSlice, themes, toggleMenu, toggleMockMode, toggleSidebar, unmountExtension, unregisterExtension } from '@hai3/framework';
|
|
7
7
|
import { TypedUseSelectorHook } from 'react-redux';
|
|
8
8
|
|
|
9
9
|
/**
|
package/dist/index.js
CHANGED
|
@@ -670,7 +670,8 @@ import {
|
|
|
670
670
|
overlayDomain
|
|
671
671
|
} from "@hai3/framework";
|
|
672
672
|
import {
|
|
673
|
-
HAI3_SCREEN_EXTENSION_TYPE
|
|
673
|
+
HAI3_SCREEN_EXTENSION_TYPE,
|
|
674
|
+
HAI3_MFE_ENTRY_MF
|
|
674
675
|
} from "@hai3/framework";
|
|
675
676
|
import {
|
|
676
677
|
HAI3_ACTION_LOAD_EXT,
|
|
@@ -710,6 +711,7 @@ export {
|
|
|
710
711
|
HAI3_ACTION_LOAD_EXT,
|
|
711
712
|
HAI3_ACTION_MOUNT_EXT2 as HAI3_ACTION_MOUNT_EXT,
|
|
712
713
|
HAI3_ACTION_UNMOUNT_EXT2 as HAI3_ACTION_UNMOUNT_EXT,
|
|
714
|
+
HAI3_MFE_ENTRY_MF,
|
|
713
715
|
HAI3_OVERLAY_DOMAIN,
|
|
714
716
|
HAI3_POPUP_DOMAIN,
|
|
715
717
|
HAI3_SCREEN_DOMAIN2 as HAI3_SCREEN_DOMAIN,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/HAI3Provider.tsx","../src/HAI3Context.tsx","../src/mfe/MfeContext.tsx","../src/mfe/MfeProvider.tsx","../src/hooks/useAppDispatch.ts","../src/hooks/useAppSelector.ts","../src/hooks/useTranslation.ts","../src/hooks/useScreenTranslations.ts","../src/hooks/useFormatters.ts","../src/hooks/useTheme.ts","../src/mfe/hooks/useMfeBridge.ts","../src/mfe/hooks/useSharedProperty.ts","../src/mfe/hooks/useHostAction.ts","../src/mfe/hooks/useDomainExtensions.ts","../src/mfe/hooks/useRegisteredPackages.ts","../src/mfe/hooks/useActivePackage.ts","../src/mfe/components/RefContainerProvider.ts","../src/mfe/components/ExtensionDomainSlot.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 { MfeProvider } from './mfe/MfeProvider';\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()).use(microfrontends()).build();\n * <HAI3Provider app={app}>\n * <App />\n * </HAI3Provider>\n *\n * // With MFE bridge (for MFE components)\n * <HAI3Provider mfeBridge={{ bridge, extensionId, domainId }}>\n * <MyMfeApp />\n * </HAI3Provider>\n * ```\n */\nexport const HAI3Provider: React.FC<HAI3ProviderProps> = ({\n children,\n config,\n app: providedApp,\n mfeBridge,\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 // Render content\n const content = (\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 // Wrap with MfeProvider if bridge is provided\n if (mfeBridge) {\n return (\n <MfeProvider value={mfeBridge}>\n {content}\n </MfeProvider>\n );\n }\n\n return content;\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 * MFE Context - React context for MFE state\n *\n * Provides MFE bridge and metadata to child components.\n * Used by MFE components to access their runtime context.\n *\n * React Layer: L3 (Depends on @hai3/framework)\n */\n\nimport { createContext, useContext } from 'react';\nimport type { ChildMfeBridge } from '@hai3/framework';\n\n// ============================================================================\n// Context Value Types\n// ============================================================================\n\n/**\n * MFE Context Value\n * Contains bridge and metadata about the MFE instance.\n */\nexport interface MfeContextValue {\n /** Child bridge for communication with host */\n bridge: ChildMfeBridge;\n /** Extension ID */\n extensionId: string;\n /** Domain ID where MFE is mounted */\n domainId: string;\n}\n\n// ============================================================================\n// Context Definition\n// ============================================================================\n\n/**\n * MFE Context\n * Holds the MFE bridge and metadata for child components.\n */\nexport const MfeContext = createContext<MfeContextValue | null>(null);\n\n/**\n * Use the MFE context.\n * Throws if used outside of MFE context.\n *\n * @returns The MFE context value\n */\nexport function useMfeContext(): MfeContextValue {\n const context = useContext(MfeContext);\n\n if (!context) {\n throw new Error(\n 'useMfeContext must be used within a MfeProvider. ' +\n 'This hook can only be used inside MFE components.'\n );\n }\n\n return context;\n}\n","/**\n * MFE Provider - Provides MFE context to child components\n *\n * Wraps MFE components with bridge and metadata.\n * Used by the MFE mounting system.\n *\n * React Layer: L3 (Depends on @hai3/framework)\n */\n\nimport React from 'react';\nimport { MfeContext, type MfeContextValue } from './MfeContext';\n\n// ============================================================================\n// Provider Props\n// ============================================================================\n\n/**\n * MFE Provider Props\n */\nexport interface MfeProviderProps {\n /** MFE context value */\n value: MfeContextValue;\n /** Child components */\n children: React.ReactNode;\n}\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\n/**\n * MFE Provider Component\n *\n * Provides MFE bridge and metadata to child components.\n * Used by the MFE mounting system to wrap MFE components.\n *\n * @example\n * ```tsx\n * <MfeProvider value={{ bridge, extensionId, domainId }}>\n * <MyMfeComponent />\n * </MfeProvider>\n * ```\n */\nexport const MfeProvider: React.FC<MfeProviderProps> = ({ value, children }) => {\n return (\n <MfeContext.Provider value={value}>\n {children}\n </MfeContext.Provider>\n );\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 via framework action (emits event bus for MFE propagation)\n const setLanguage = useCallback(\n (lang: Language) => {\n if (app.actions.setLanguage) {\n app.actions.setLanguage({ language: lang });\n }\n },\n [app.actions]\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 * useFormatters Hook - Locale-aware formatters\n *\n * Returns formatters that use i18nRegistry.getLanguage() internally.\n * Calls useTranslation() so the component re-renders when language changes.\n *\n * React Layer: L3\n */\n\nimport { useMemo } from 'react';\nimport {\n formatDate as formatDateFn,\n formatTime as formatTimeFn,\n formatDateTime as formatDateTimeFn,\n formatRelative as formatRelativeFn,\n formatNumber as formatNumberFn,\n formatPercent as formatPercentFn,\n formatCompact as formatCompactFn,\n formatCurrency as formatCurrencyFn,\n compareStrings as compareStringsFn,\n createCollator as createCollatorFn,\n} from '@hai3/framework';\nimport type { UseFormattersReturn } from '../types';\nimport { useTranslation } from './useTranslation';\n\n/**\n * Hook for accessing locale-aware formatters (date, number, currency, sort).\n *\n * Formatters use the current app language from i18nRegistry.getLanguage().\n * Re-renders when language changes via useTranslation() subscription.\n *\n * @returns Object with formatDate, formatTime, formatDateTime, formatRelative,\n * formatNumber, formatPercent, formatCompact, formatCurrency, compareStrings, createCollator\n *\n * @example\n * ```tsx\n * const { formatDate, formatCurrency } = useFormatters();\n * return (\n * <span>{formatDate(new Date(), 'short')}</span>\n * <span>{formatCurrency(99.99, 'USD')}</span>\n * );\n * ```\n */\nexport function useFormatters(): UseFormattersReturn {\n // useTranslation() subscribes to language changes so this component re-renders\n // when language changes; formatters read i18nRegistry.getLanguage() at call time\n const { language } = useTranslation();\n\n return useMemo<UseFormattersReturn>(\n () => {\n void language; // re-run when language changes so formatters see new locale\n return {\n formatDate: formatDateFn,\n formatTime: formatTimeFn,\n formatDateTime: formatDateTimeFn,\n formatRelative: formatRelativeFn,\n formatNumber: formatNumberFn,\n formatPercent: formatPercentFn,\n formatCompact: formatCompactFn,\n formatCurrency: formatCurrencyFn,\n compareStrings: compareStringsFn,\n createCollator: createCollatorFn,\n };\n },\n [language]\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 * useMfeBridge Hook - MFE bridge access\n *\n * Returns the ChildMfeBridge from context for communication with host.\n *\n * React Layer: L3\n */\n\nimport { useMfeContext } from '../MfeContext';\nimport type { ChildMfeBridge } from '@hai3/framework';\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for accessing the MFE bridge.\n *\n * Returns the ChildMfeBridge instance for communication with the host.\n * Must be used within a MfeProvider (i.e., inside an MFE component).\n *\n * @returns Child MFE bridge\n *\n * @example\n * ```tsx\n * function MyMfeComponent() {\n * const bridge = useMfeBridge();\n *\n * // Bridge methods:\n * // bridge.executeActionsChain(chain);\n * // bridge.subscribeToProperty(propertyTypeId, callback);\n *\n * return <div>Domain: {bridge.domainId}</div>;\n * }\n * ```\n */\nexport function useMfeBridge(): ChildMfeBridge {\n const { bridge } = useMfeContext();\n return bridge;\n}\n","/**\n * useSharedProperty Hook - Shared property subscription\n *\n * Subscribes to shared property updates from the host.\n *\n * React Layer: L3\n */\n\nimport { useSyncExternalStore, useCallback } from 'react';\nimport { useMfeContext } from '../MfeContext';\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for subscribing to a shared property.\n *\n * Subscribes to property updates from the host and returns the current value.\n * Must be used within a MfeProvider (i.e., inside an MFE component).\n *\n * NOTE: This hook provides the interface and uses useSyncExternalStore with a stub subscription.\n * Full bridge subscription should be implemented when bridge methods are available.\n *\n * @param _propertyTypeId - Type ID of the shared property to subscribe to (currently unused)\n * @returns Current property value\n *\n * @example\n * ```tsx\n * function MyMfeComponent() {\n * const userData = useSharedProperty('gts.hai3.mfes.comm.shared_property.v1~myapp.user_data.v1');\n *\n * return <div>User: {userData?.name}</div>;\n * }\n * ```\n */\nexport function useSharedProperty<T = unknown>(propertyTypeId: string): T | undefined {\n // Enforce MfeProvider context requirement\n const { bridge } = useMfeContext(); // Throws if not in MfeProvider\n\n // Subscribe to property updates via bridge\n const subscribe = useCallback((callback: () => void) => {\n return bridge.subscribeToProperty(propertyTypeId, () => {\n // When property changes, trigger React re-render\n callback();\n });\n }, [bridge, propertyTypeId]);\n\n const getSnapshot = useCallback(() => {\n const property = bridge.getProperty(propertyTypeId);\n // Type narrowing: caller specifies expected type T (standard React hook pattern)\n // Similar to useState<T>, useContext<T> - type safety is caller's responsibility\n return property?.value as T | undefined;\n }, [bridge, propertyTypeId]);\n\n const value = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n return value;\n}\n","/**\n * useHostAction Hook - Host action requests\n *\n * Returns a callback to request host actions via the bridge.\n *\n * React Layer: L3\n */\n\nimport { useCallback } from 'react';\nimport { useMfeContext } from '../MfeContext';\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for requesting host actions.\n *\n * Returns a callback function that sends an actions chain to the host.\n * Must be used within a MfeProvider (i.e., inside an MFE component).\n *\n * NOTE: This hook provides the interface. Bridge executeActionsChain() delegates to the registry.\n *\n * @param actionTypeId - Type ID of the action to request\n * @returns Callback function to request the action with payload\n *\n * @example\n * ```tsx\n * function MyMfeComponent() {\n * const requestNavigation = useHostAction('gts.hai3.mfes.comm.action.v1~myapp.navigate.v1');\n *\n * const handleClick = () => {\n * requestNavigation({ path: '/dashboard' });\n * };\n *\n * return <button onClick={handleClick}>Navigate</button>;\n * }\n * ```\n */\nexport function useHostAction<TPayload extends Record<string, unknown> = Record<string, unknown>>(\n actionTypeId: string\n): (payload?: TPayload) => void {\n // Enforce MfeProvider context requirement\n const { bridge } = useMfeContext(); // Throws if not in MfeProvider\n\n return useCallback((payload?: TPayload) => {\n // Construct an ActionsChain with the action\n // With the constraint, TPayload extends Record<string, unknown>,\n // so this is a safe widening from specific to general\n const chain = {\n action: {\n type: actionTypeId,\n target: bridge.domainId,\n payload: payload as Record<string, unknown> | undefined,\n },\n };\n\n // Send the chain to the host\n bridge.executeActionsChain(chain).catch((error: Error) => {\n console.error(\n `[useHostAction] Failed to send action '${actionTypeId}':`,\n error\n );\n });\n }, [actionTypeId, bridge]);\n}\n","/**\n * useDomainExtensions Hook - Domain extension list subscription\n *\n * Subscribes to store changes to detect when extensions are registered or unregistered,\n * and returns the current list of extensions for a domain.\n *\n * React Layer: L3\n */\n\nimport { useSyncExternalStore, useCallback, useRef } from 'react';\nimport { useHAI3 } from '../../HAI3Context';\nimport type { Extension } from '@hai3/framework';\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for observing extensions registered for a domain.\n *\n * Subscribes to the HAI3 store to detect registration state changes,\n * and returns the current list of extensions for the specified domain.\n *\n * @param domainId - Domain ID to query extensions for\n * @returns Array of extensions currently registered for the domain\n *\n * @example\n * ```tsx\n * function SidebarExtensions() {\n * const extensions = useDomainExtensions('gts.hai3.mfes.ext.domain.v1~hai3.screensets.layout.sidebar.v1');\n *\n * return (\n * <div>\n * {extensions.map(ext => (\n * <div key={ext.id}>{ext.id}</div>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function useDomainExtensions(domainId: string): Extension[] {\n const app = useHAI3();\n const registry = app.screensetsRegistry;\n\n if (!registry) {\n throw new Error(\n 'useDomainExtensions requires the microfrontends plugin. ' +\n 'Add microfrontends() to your HAI3 app configuration.'\n );\n }\n\n // Subscribe to store changes.\n // Any dispatch (including registration state updates) triggers a snapshot check.\n // The snapshot comparison ensures only actual extension list changes cause re-renders.\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n return app.store.subscribe(onStoreChange);\n },\n [app.store]\n );\n\n // Cache the snapshot to maintain referential stability for useSyncExternalStore.\n // Only update when the extension IDs actually change.\n const cacheRef = useRef<{ ids: string; extensions: Extension[] }>({ ids: '', extensions: [] });\n\n const getSnapshot = useCallback(() => {\n const extensions = registry.getExtensionsForDomain(domainId);\n const ids = extensions.map(e => e.id).join(',');\n if (ids !== cacheRef.current.ids) {\n cacheRef.current = { ids, extensions };\n }\n return cacheRef.current.extensions;\n }, [registry, domainId]);\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n}\n","/**\n * useRegisteredPackages Hook - Registered GTS packages subscription\n *\n * Subscribes to store changes to detect when extensions are registered or unregistered,\n * and returns the current list of registered GTS packages.\n *\n * React Layer: L3\n */\n\nimport { useSyncExternalStore, useCallback, useRef } from 'react';\nimport { useHAI3 } from '../../HAI3Context';\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for observing registered GTS packages.\n *\n * Subscribes to the HAI3 store to detect registration state changes,\n * and returns the current list of GTS packages extracted from registered\n * extensions.\n *\n * ARCHITECTURAL NOTE ON STORE SUBSCRIPTION COUPLING:\n * This hook uses `useSyncExternalStore` with `app.store.subscribe`, which\n * fires on any Redux dispatch. Since `registerExtension()` dispatches to\n * the mfe store slice, the subscription WILL trigger when packages change.\n * The `getSnapshot` function calls `screensetsRegistry.getRegisteredPackages()`\n * which reads the private `packages` Map. This works because every package\n * map mutation (in registerExtension/unregisterExtension) is always\n * accompanied by a store dispatch in the same serializer callback.\n *\n * IMPORTANT: If a future change mutates the packages map WITHOUT a store\n * dispatch, this hook would fail to re-render. Keep this coupling documented.\n *\n * @returns Array of GTS package strings currently registered\n *\n * @example\n * ```tsx\n * function PackageList() {\n * const packages = useRegisteredPackages();\n *\n * return (\n * <div>\n * {packages.map(pkg => (\n * <div key={pkg}>{pkg}</div>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function useRegisteredPackages(): string[] {\n const app = useHAI3();\n const registry = app.screensetsRegistry;\n\n if (!registry) {\n throw new Error(\n 'useRegisteredPackages requires the microfrontends plugin. ' +\n 'Add microfrontends() to your HAI3 app configuration.'\n );\n }\n\n // Subscribe to store changes.\n // Any dispatch (including registration state updates) triggers a snapshot check.\n // The snapshot comparison ensures only actual package list changes cause re-renders.\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n return app.store.subscribe(onStoreChange);\n },\n [app.store]\n );\n\n // Cache the snapshot to maintain referential stability for useSyncExternalStore.\n // Only update when the package list actually changes.\n const cacheRef = useRef<{ packages: string; list: string[] }>({ packages: '', list: [] });\n\n const getSnapshot = useCallback(() => {\n const list = registry.getRegisteredPackages();\n const packages = list.join(',');\n if (packages !== cacheRef.current.packages) {\n cacheRef.current = { packages, list };\n }\n return cacheRef.current.list;\n }, [registry]);\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n}\n","/**\n * useActivePackage Hook - Active GTS package subscription\n *\n * Subscribes to store changes and returns the GTS package of the currently\n * mounted screen extension.\n *\n * React Layer: L3\n */\n\nimport { useSyncExternalStore, useCallback, useRef } from 'react';\nimport { useHAI3 } from '../../HAI3Context';\nimport { extractGtsPackage, HAI3_SCREEN_DOMAIN } from '@hai3/framework';\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for observing the active GTS package (the package of the currently\n * mounted screen extension).\n *\n * Subscribes to the HAI3 store to detect mount state changes, and returns\n * the GTS package extracted from the currently mounted screen extension's ID.\n *\n * Returns `undefined` if no screen extension is currently mounted.\n *\n * @returns GTS package string of the active screen extension, or undefined\n *\n * @example\n * ```tsx\n * function ActivePackageIndicator() {\n * const activePackage = useActivePackage();\n *\n * if (!activePackage) {\n * return <div>No active screen</div>;\n * }\n *\n * return <div>Active package: {activePackage}</div>;\n * }\n * ```\n */\nexport function useActivePackage(): string | undefined {\n const app = useHAI3();\n const registry = app.screensetsRegistry;\n\n if (!registry) {\n throw new Error(\n 'useActivePackage requires the microfrontends plugin. ' +\n 'Add microfrontends() to your HAI3 app configuration.'\n );\n }\n\n // Subscribe to store changes.\n // Any dispatch (including mount state updates) triggers a snapshot check.\n // The snapshot comparison ensures only actual active package changes cause re-renders.\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n return app.store.subscribe(onStoreChange);\n },\n [app.store]\n );\n\n // Cache the snapshot to maintain referential stability for useSyncExternalStore.\n // Only update when the active package actually changes.\n const cacheRef = useRef<{ activePackage: string | undefined }>({ activePackage: undefined });\n\n const getSnapshot = useCallback(() => {\n const mountedExtensionId = registry.getMountedExtension(HAI3_SCREEN_DOMAIN);\n\n // Guard: if no extension is mounted, return undefined immediately\n if (!mountedExtensionId) {\n const result = undefined;\n if (result !== cacheRef.current.activePackage) {\n cacheRef.current = { activePackage: result };\n }\n return cacheRef.current.activePackage;\n }\n\n // Extract GTS package from the mounted extension ID\n const activePackage = extractGtsPackage(mountedExtensionId);\n if (activePackage !== cacheRef.current.activePackage) {\n cacheRef.current = { activePackage };\n }\n return cacheRef.current.activePackage;\n }, [registry]);\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n}\n","/**\n * Ref Container Provider\n *\n * Concrete ContainerProvider that wraps a React ref.\n * Created by React components (like ExtensionDomainSlot) for use\n * by framework-level domain registration code.\n *\n * @packageDocumentation\n */\n\nimport type { RefObject } from 'react';\nimport { ContainerProvider } from '@hai3/framework';\n\n/**\n * Concrete ContainerProvider that wraps a React ref.\n *\n * This provider reads the container element from a React ref at mount time.\n * It is designed to be created by React components but passed to domain\n * registration code (framework-level).\n *\n * Usage pattern:\n * 1. React component creates a ref via `useRef<HTMLDivElement>(null)`\n * 2. Framework-level code creates `RefContainerProvider` wrapping the ref\n * 3. Framework-level code passes the provider to `registerDomain(domain, provider)`\n * 4. When mount_ext is dispatched, the provider returns `ref.current`\n */\nexport class RefContainerProvider extends ContainerProvider {\n constructor(private readonly containerRef: RefObject<HTMLDivElement>) {\n super();\n }\n\n getContainer(_extensionId: string): Element {\n if (!this.containerRef.current) {\n throw new Error('Container ref is not attached -- component may not be mounted yet');\n }\n return this.containerRef.current;\n }\n\n releaseContainer(_extensionId: string): void {\n // No-op for React ref -- the ref lifecycle is managed by React.\n // Container cleanup happens when the component unmounts.\n }\n}\n","/**\n * Extension Domain Slot Component\n *\n * React component that renders extensions within a domain slot.\n * Manages extension lifecycle (mount/unmount) and provides rendering context.\n *\n * @packageDocumentation\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport type { ScreensetsRegistry, ParentMfeBridge } from '@hai3/framework';\nimport {\n HAI3_ACTION_MOUNT_EXT,\n HAI3_ACTION_UNMOUNT_EXT,\n} from '@hai3/framework';\n\n/**\n * Props for ExtensionDomainSlot component\n */\nexport interface ExtensionDomainSlotProps {\n /**\n * The screensets registry instance\n */\n registry: ScreensetsRegistry;\n\n /**\n * The domain ID for this slot\n */\n domainId: string;\n\n /**\n * The extension ID to render in this slot\n */\n extensionId: string;\n\n /**\n * Optional CSS class name for the container\n */\n className?: string;\n\n /**\n * Optional callback when extension is mounted\n */\n onMounted?: (bridge: ParentMfeBridge) => void;\n\n /**\n * Optional callback when extension is unmounted\n */\n onUnmounted?: () => void;\n\n /**\n * Optional error callback\n */\n onError?: (error: Error) => void;\n\n /**\n * Optional loading component\n */\n loadingComponent?: React.ReactNode;\n\n /**\n * Optional error component renderer\n */\n errorComponent?: (error: Error) => React.ReactNode;\n}\n\n/**\n * Extension Domain Slot Component\n *\n * Renders an extension within a domain slot. Manages the extension lifecycle:\n * - Mounts the extension on component mount\n * - Unmounts the extension on component unmount\n * - Handles loading and error states\n *\n * @example\n * ```tsx\n * <ExtensionDomainSlot\n * registry={registry}\n * domainId=\"gts.hai3.mfes.ext.domain.v1~hai3.screensets.layout.sidebar.v1\"\n * extensionId=\"gts.hai3.mfes.ext.extension.v1~myapp.sidebar.widget.v1\"\n * className=\"sidebar-slot\"\n * />\n * ```\n */\nexport function ExtensionDomainSlot(props: ExtensionDomainSlotProps): React.ReactElement {\n const {\n registry,\n domainId,\n extensionId,\n className,\n onMounted,\n onUnmounted,\n onError,\n loadingComponent,\n errorComponent,\n } = props;\n\n const containerRef = useRef<HTMLDivElement>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const [bridge, setBridge] = useState<ParentMfeBridge | null>(null);\n\n useEffect(() => {\n let mounted = true;\n let currentBridge: ParentMfeBridge | null = null;\n\n async function mountExtension() {\n if (!containerRef.current) {\n return;\n }\n\n try {\n setIsLoading(true);\n setError(null);\n\n // Mount the extension via actions chain (auto-loads if not already loaded)\n // Container is provided by the domain's ContainerProvider (registered at domain registration time)\n await registry.executeActionsChain({\n action: {\n type: HAI3_ACTION_MOUNT_EXT,\n target: domainId,\n payload: {\n extensionId,\n },\n },\n });\n\n if (!mounted) {\n // Component was unmounted while mounting - clean up\n await registry.executeActionsChain({\n action: {\n type: HAI3_ACTION_UNMOUNT_EXT,\n target: domainId,\n payload: {\n extensionId,\n },\n },\n });\n return;\n }\n\n // Query the bridge after mount completes\n const newBridge = registry.getParentBridge(extensionId);\n if (!newBridge) {\n throw new Error(`Failed to obtain bridge for extension ${extensionId} after mount`);\n }\n\n currentBridge = newBridge;\n setBridge(newBridge);\n setIsLoading(false);\n\n // Notify parent\n if (onMounted) {\n onMounted(newBridge);\n }\n } catch (err) {\n if (!mounted) {\n return;\n }\n\n const errorObj = err instanceof Error ? err : new Error(String(err));\n setError(errorObj);\n setIsLoading(false);\n\n if (onError) {\n onError(errorObj);\n }\n }\n }\n\n // Start mounting\n void mountExtension();\n\n // Cleanup on unmount\n return () => {\n mounted = false;\n\n if (currentBridge) {\n // Unmount extension asynchronously via actions chain\n void registry.executeActionsChain({\n action: {\n type: HAI3_ACTION_UNMOUNT_EXT,\n target: domainId,\n payload: {\n extensionId,\n },\n },\n }).then(() => {\n if (onUnmounted) {\n onUnmounted();\n }\n });\n }\n };\n }, [registry, domainId, extensionId, onMounted, onUnmounted, onError]);\n\n // Render loading state\n if (isLoading) {\n return (\n <div className={className} data-domain-id={domainId} data-extension-id={extensionId}>\n {loadingComponent ?? <div>Loading extension...</div>}\n </div>\n );\n }\n\n // Render error state\n if (error) {\n return (\n <div className={className} data-domain-id={domainId} data-extension-id={extensionId}>\n {errorComponent ? errorComponent(error) : (\n <div>\n <strong>Error loading extension:</strong>\n <pre>{error.message}</pre>\n </div>\n )}\n </div>\n );\n }\n\n // Render the container for the mounted extension\n return (\n <div\n ref={containerRef}\n className={className}\n data-domain-id={domainId}\n data-extension-id={extensionId}\n data-bridge-active={bridge !== null}\n />\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 * - MFE context, hooks, and components\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 useFormatters,\n useTheme,\n} from './hooks';\n\n// ============================================================================\n// MFE Context and Hooks\n// ============================================================================\n\nexport {\n MfeContext,\n useMfeContext,\n MfeProvider,\n useMfeBridge,\n useSharedProperty,\n useHostAction,\n useDomainExtensions,\n useRegisteredPackages,\n useActivePackage,\n RefContainerProvider,\n ExtensionDomainSlot,\n} from './mfe';\n\nexport type {\n MfeContextValue,\n MfeProviderProps,\n ExtensionDomainSlotProps,\n} from './mfe';\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\nexport type {\n HAI3ProviderProps,\n UseHAI3Return,\n UseAppSelector,\n UseAppDispatchReturn,\n UseTranslationReturn,\n UseScreenTranslationsReturn,\n UseFormattersReturn,\n UseThemeReturn,\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 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 i18n,\n effects,\n\n // Registries\n createThemeRegistry,\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 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 ThemeRegistry,\n ThemeConfig,\n Preset,\n Presets,\n ScreensetsConfig,\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 ReducerPayload,\n\n // Layout\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 // 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// MFE Re-exports from @hai3/framework (Layering Compliance)\n// ============================================================================\n\n// MFE Plugin factories\nexport {\n microfrontends,\n mock,\n} from '@hai3/framework';\n\n// MFE Action functions\nexport {\n loadExtension,\n mountExtension,\n unmountExtension,\n registerExtension,\n unregisterExtension,\n} from '@hai3/framework';\n\n// MFE Selectors\nexport {\n selectExtensionState,\n selectRegisteredExtensions,\n selectExtensionError,\n} from '@hai3/framework';\n\n// MFE Domain constants\nexport {\n HAI3_POPUP_DOMAIN,\n HAI3_SIDEBAR_DOMAIN,\n HAI3_SCREEN_DOMAIN,\n HAI3_OVERLAY_DOMAIN,\n // Base ExtensionDomain constants\n screenDomain,\n sidebarDomain,\n popupDomain,\n overlayDomain,\n} from '@hai3/framework';\n\n// MFE Type constants\nexport {\n HAI3_SCREEN_EXTENSION_TYPE,\n} from '@hai3/framework';\n\n// MFE Action constants\nexport {\n HAI3_ACTION_LOAD_EXT,\n HAI3_ACTION_MOUNT_EXT,\n HAI3_ACTION_UNMOUNT_EXT,\n} from '@hai3/framework';\n\n// MFE Shared Property constants\nexport {\n HAI3_SHARED_PROPERTY_THEME,\n HAI3_SHARED_PROPERTY_LANGUAGE,\n} from '@hai3/framework';\n\n// MFE Types\nexport type {\n ChildMfeBridge,\n ParentMfeBridge,\n Extension,\n ScreenExtension,\n ExtensionPresentation,\n ExtensionDomain,\n ActionsChain,\n Action,\n SharedProperty,\n LifecycleStage,\n LifecycleHook,\n MfeEntryLifecycle,\n MfeEntry,\n MfeEntryMF,\n JSONSchema,\n ValidationError,\n ValidationResult,\n LoadExtPayload,\n MountExtPayload,\n UnmountExtPayload,\n ScreensetsRegistryConfig,\n TypeSystemPlugin,\n} from '@hai3/framework';\n\n// MFE Abstract classes\nexport {\n MfeHandler,\n MfeBridgeFactory,\n ScreensetsRegistry,\n ScreensetsRegistryFactory,\n screensetsRegistryFactory,\n ContainerProvider,\n} from '@hai3/framework';\n\n// MFE Concrete implementations\nexport { MfeHandlerMF, gtsPlugin } from '@hai3/framework';\n\n// MFE Utilities\nexport {\n createShadowRoot,\n injectCssVariables,\n extractGtsPackage,\n} from '@hai3/framework';\n\n// MFE Plugin types\nexport type {\n MfeState,\n ExtensionRegistrationState,\n RegisterExtensionPayload,\n UnregisterExtensionPayload,\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, EventBus } from '@hai3/framework';\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":["createContext","useContext","jsx","useMemo","i18nRegistry","useMemo","useEffect","useMemo","useCallback","useSyncExternalStore","i18nRegistry","useSyncExternalStore","useCallback","useMemo","useEffect","useMemo","useMemo","useCallback","useMemo","useSyncExternalStore","useSyncExternalStore","useCallback","useMemo","themes","useSyncExternalStore","useCallback","useCallback","useSyncExternalStore","useCallback","useCallback","useSyncExternalStore","useCallback","useCallback","useSyncExternalStore","useSyncExternalStore","useCallback","useRef","useCallback","useRef","useSyncExternalStore","useSyncExternalStore","useCallback","useRef","useCallback","useRef","useSyncExternalStore","useEffect","useRef","useState","jsx","mountExtension","createHAI3App","HAI3_SCREEN_DOMAIN","HAI3_ACTION_MOUNT_EXT","HAI3_ACTION_UNMOUNT_EXT","ContainerProvider","extractGtsPackage"]}
|
|
1
|
+
{"version":3,"sources":["../src/HAI3Provider.tsx","../src/HAI3Context.tsx","../src/mfe/MfeContext.tsx","../src/mfe/MfeProvider.tsx","../src/hooks/useAppDispatch.ts","../src/hooks/useAppSelector.ts","../src/hooks/useTranslation.ts","../src/hooks/useScreenTranslations.ts","../src/hooks/useFormatters.ts","../src/hooks/useTheme.ts","../src/mfe/hooks/useMfeBridge.ts","../src/mfe/hooks/useSharedProperty.ts","../src/mfe/hooks/useHostAction.ts","../src/mfe/hooks/useDomainExtensions.ts","../src/mfe/hooks/useRegisteredPackages.ts","../src/mfe/hooks/useActivePackage.ts","../src/mfe/components/RefContainerProvider.ts","../src/mfe/components/ExtensionDomainSlot.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// @cpt-flow:cpt-hai3-flow-react-bindings-bootstrap-provider:p1\n// @cpt-algo:cpt-hai3-algo-react-bindings-resolve-app:p1\n// @cpt-algo:cpt-hai3-algo-react-bindings-build-provider-tree:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-provider:p1\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 { MfeProvider } from './mfe/MfeProvider';\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()).use(microfrontends()).build();\n * <HAI3Provider app={app}>\n * <App />\n * </HAI3Provider>\n *\n * // With MFE bridge (for MFE components)\n * <HAI3Provider mfeBridge={{ bridge, extensionId, domainId }}>\n * <MyMfeApp />\n * </HAI3Provider>\n * ```\n */\n// @cpt-begin:cpt-hai3-flow-react-bindings-bootstrap-provider:p1:inst-render-provider\n// @cpt-begin:cpt-hai3-dod-react-bindings-provider:p1:inst-render-provider\nexport const HAI3Provider: React.FC<HAI3ProviderProps> = ({\n children,\n config,\n app: providedApp,\n mfeBridge,\n}) => {\n // @cpt-begin:cpt-hai3-flow-react-bindings-bootstrap-provider:p1:inst-resolve-app\n // @cpt-begin:cpt-hai3-algo-react-bindings-resolve-app:p1:inst-use-provided-app\n // @cpt-begin:cpt-hai3-algo-react-bindings-resolve-app:p1:inst-create-app\n // @cpt-begin:cpt-hai3-algo-react-bindings-resolve-app:p1:inst-memoize-app\n // @cpt-begin:cpt-hai3-algo-react-bindings-build-provider-tree:p1:inst-resolve-app-tree\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 // @cpt-end:cpt-hai3-algo-react-bindings-resolve-app:p1:inst-use-provided-app\n // @cpt-end:cpt-hai3-algo-react-bindings-resolve-app:p1:inst-create-app\n // @cpt-end:cpt-hai3-algo-react-bindings-resolve-app:p1:inst-memoize-app\n // @cpt-end:cpt-hai3-algo-react-bindings-build-provider-tree:p1:inst-resolve-app-tree\n // @cpt-end:cpt-hai3-flow-react-bindings-bootstrap-provider:p1:inst-resolve-app\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-bootstrap-provider:p1:inst-destroy-app\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 // @cpt-end:cpt-hai3-flow-react-bindings-bootstrap-provider:p1:inst-destroy-app\n\n // @cpt-begin:cpt-hai3-algo-react-bindings-build-provider-tree:p1:inst-wrap-hai3-context\n // @cpt-begin:cpt-hai3-algo-react-bindings-build-provider-tree:p1:inst-wrap-redux\n // @cpt-begin:cpt-hai3-algo-react-bindings-build-provider-tree:p1:inst-render-children-tree\n // @cpt-begin:cpt-hai3-flow-react-bindings-bootstrap-provider:p1:inst-set-hai3-context\n // @cpt-begin:cpt-hai3-flow-react-bindings-bootstrap-provider:p1:inst-set-redux-provider\n // @cpt-begin:cpt-hai3-flow-react-bindings-bootstrap-provider:p1:inst-render-children\n // Render content\n const content = (\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 // @cpt-end:cpt-hai3-algo-react-bindings-build-provider-tree:p1:inst-wrap-hai3-context\n // @cpt-end:cpt-hai3-algo-react-bindings-build-provider-tree:p1:inst-wrap-redux\n // @cpt-end:cpt-hai3-algo-react-bindings-build-provider-tree:p1:inst-render-children-tree\n // @cpt-end:cpt-hai3-flow-react-bindings-bootstrap-provider:p1:inst-set-hai3-context\n // @cpt-end:cpt-hai3-flow-react-bindings-bootstrap-provider:p1:inst-set-redux-provider\n // @cpt-end:cpt-hai3-flow-react-bindings-bootstrap-provider:p1:inst-render-children\n\n // @cpt-begin:cpt-hai3-algo-react-bindings-build-provider-tree:p1:inst-wrap-mfe-conditional\n // @cpt-begin:cpt-hai3-flow-react-bindings-bootstrap-provider:p2:inst-wrap-mfe-provider\n // Wrap with MfeProvider if bridge is provided\n if (mfeBridge) {\n return (\n <MfeProvider value={mfeBridge}>\n {content}\n </MfeProvider>\n );\n }\n // @cpt-end:cpt-hai3-algo-react-bindings-build-provider-tree:p1:inst-wrap-mfe-conditional\n // @cpt-end:cpt-hai3-flow-react-bindings-bootstrap-provider:p2:inst-wrap-mfe-provider\n\n return content;\n};\n// @cpt-end:cpt-hai3-flow-react-bindings-bootstrap-provider:p1:inst-render-provider\n// @cpt-end:cpt-hai3-dod-react-bindings-provider:p1:inst-render-provider\n","/**\n * HAI3 Context - React context for HAI3 application\n *\n * React Layer: L3 (Depends on @hai3/framework)\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-use-hai3:p2\n// @cpt-algo:cpt-hai3-algo-react-bindings-mfe-context-guard:p1\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 */\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-hai3:p2:inst-call-use-hai3\n// @cpt-begin:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-hai3-context\nexport function useHAI3(): HAI3App {\n const context = useContext(HAI3Context);\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-hai3:p2:inst-guard-hai3-context\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 // @cpt-end:cpt-hai3-flow-react-bindings-use-hai3:p2:inst-guard-hai3-context\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-hai3:p2:inst-return-hai3-app\n return context;\n // @cpt-end:cpt-hai3-flow-react-bindings-use-hai3:p2:inst-return-hai3-app\n}\n// @cpt-end:cpt-hai3-flow-react-bindings-use-hai3:p2:inst-call-use-hai3\n// @cpt-end:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-hai3-context\n","/**\n * MFE Context - React context for MFE state\n *\n * Provides MFE bridge and metadata to child components.\n * Used by MFE components to access their runtime context.\n *\n * React Layer: L3 (Depends on @hai3/framework)\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-mfe-provider:p1\n// @cpt-algo:cpt-hai3-algo-react-bindings-mfe-context-guard:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-mfe-hooks:p1\n\nimport { createContext, useContext } from 'react';\nimport type { ChildMfeBridge } from '@hai3/framework';\n\n// ============================================================================\n// Context Value Types\n// ============================================================================\n\n/**\n * MFE Context Value\n * Contains bridge and metadata about the MFE instance.\n */\nexport interface MfeContextValue {\n /** Child bridge for communication with host */\n bridge: ChildMfeBridge;\n /** Extension ID */\n extensionId: string;\n /** Domain ID where MFE is mounted */\n domainId: string;\n}\n\n// ============================================================================\n// Context Definition\n// ============================================================================\n\n/**\n * MFE Context\n * Holds the MFE bridge and metadata for child components.\n */\nexport const MfeContext = createContext<MfeContextValue | null>(null);\n\n/**\n * Use the MFE context.\n * Throws if used outside of MFE context.\n *\n * @returns The MFE context value\n */\n// @cpt-begin:cpt-hai3-flow-react-bindings-mfe-provider:p1:inst-use-mfe-context\n// @cpt-begin:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-mfe-context\n// @cpt-begin:cpt-hai3-dod-react-bindings-mfe-hooks:p1:inst-use-mfe-context\nexport function useMfeContext(): MfeContextValue {\n const context = useContext(MfeContext);\n\n if (!context) {\n throw new Error(\n 'useMfeContext must be used within a MfeProvider. ' +\n 'This hook can only be used inside MFE components.'\n );\n }\n\n return context;\n}\n// @cpt-end:cpt-hai3-flow-react-bindings-mfe-provider:p1:inst-use-mfe-context\n// @cpt-end:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-mfe-context\n// @cpt-end:cpt-hai3-dod-react-bindings-mfe-hooks:p1:inst-use-mfe-context\n","/**\n * MFE Provider - Provides MFE context to child components\n *\n * Wraps MFE components with bridge and metadata.\n * Used by the MFE mounting system.\n *\n * React Layer: L3 (Depends on @hai3/framework)\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-mfe-provider:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-mfe-hooks:p1\n\nimport React from 'react';\nimport { MfeContext, type MfeContextValue } from './MfeContext';\n\n// ============================================================================\n// Provider Props\n// ============================================================================\n\n/**\n * MFE Provider Props\n */\nexport interface MfeProviderProps {\n /** MFE context value */\n value: MfeContextValue;\n /** Child components */\n children: React.ReactNode;\n}\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\n/**\n * MFE Provider Component\n *\n * Provides MFE bridge and metadata to child components.\n * Used by the MFE mounting system to wrap MFE components.\n *\n * @example\n * ```tsx\n * <MfeProvider value={{ bridge, extensionId, domainId }}>\n * <MyMfeComponent />\n * </MfeProvider>\n * ```\n */\n// @cpt-begin:cpt-hai3-flow-react-bindings-mfe-provider:p1:inst-render-mfe-provider\n// @cpt-begin:cpt-hai3-flow-react-bindings-mfe-provider:p1:inst-set-mfe-context\n// @cpt-begin:cpt-hai3-dod-react-bindings-mfe-hooks:p1:inst-render-mfe-provider\nexport const MfeProvider: React.FC<MfeProviderProps> = ({ value, children }) => {\n return (\n <MfeContext.Provider value={value}>\n {children}\n </MfeContext.Provider>\n );\n};\n// @cpt-end:cpt-hai3-flow-react-bindings-mfe-provider:p1:inst-render-mfe-provider\n// @cpt-end:cpt-hai3-flow-react-bindings-mfe-provider:p1:inst-set-mfe-context\n// @cpt-end:cpt-hai3-dod-react-bindings-mfe-hooks:p1:inst-render-mfe-provider\n","/**\n * useAppDispatch Hook - Type-safe dispatch hook\n *\n * React Layer: L3\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-use-dispatch:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-redux-hooks:p1\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 */\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-dispatch:p1:inst-call-dispatch\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-dispatch:p1:inst-delegate-dispatch\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-dispatch:p1:inst-use-dispatch\n// @cpt-begin:cpt-hai3-dod-react-bindings-redux-hooks:p1:inst-use-dispatch\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// @cpt-end:cpt-hai3-flow-react-bindings-use-dispatch:p1:inst-call-dispatch\n// @cpt-end:cpt-hai3-flow-react-bindings-use-dispatch:p1:inst-delegate-dispatch\n// @cpt-end:cpt-hai3-flow-react-bindings-use-dispatch:p1:inst-use-dispatch\n// @cpt-end:cpt-hai3-dod-react-bindings-redux-hooks:p1:inst-use-dispatch\n","/**\n * useAppSelector Hook - Type-safe selector hook\n *\n * React Layer: L3\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-use-selector:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-redux-hooks:p1\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 */\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-selector:p1:inst-call-selector\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-selector:p1:inst-delegate-selector\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-selector:p1:inst-return-state\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-selector:p1:inst-rerender-on-change\n// @cpt-begin:cpt-hai3-dod-react-bindings-redux-hooks:p1:inst-use-selector\nexport const useAppSelector: TypedUseSelectorHook<RootState> = useSelector;\n// @cpt-end:cpt-hai3-flow-react-bindings-use-selector:p1:inst-call-selector\n// @cpt-end:cpt-hai3-flow-react-bindings-use-selector:p1:inst-delegate-selector\n// @cpt-end:cpt-hai3-flow-react-bindings-use-selector:p1:inst-return-state\n// @cpt-end:cpt-hai3-flow-react-bindings-use-selector:p1:inst-rerender-on-change\n// @cpt-end:cpt-hai3-dod-react-bindings-redux-hooks:p1:inst-use-selector\n","/**\n * useTranslation Hook - Translation utilities\n *\n * React Layer: L3\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-use-translation:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-translation-hook:p1\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 */\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-translation:p1:inst-call-translation\n// @cpt-begin:cpt-hai3-dod-react-bindings-translation-hook:p1:inst-call-translation\nexport function useTranslation(): UseTranslationReturn {\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-translation:p1:inst-read-i18n-registry\n const app = useHAI3();\n const { i18nRegistry } = app;\n // @cpt-end:cpt-hai3-flow-react-bindings-use-translation:p1:inst-read-i18n-registry\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-translation:p1:inst-subscribe-i18n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-translation:p1:inst-rerender-on-lang-change\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 // @cpt-end:cpt-hai3-flow-react-bindings-use-translation:p1:inst-subscribe-i18n\n // @cpt-end:cpt-hai3-flow-react-bindings-use-translation:p1:inst-rerender-on-lang-change\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 // @cpt-begin:cpt-hai3-flow-react-bindings-use-translation:p1:inst-set-language\n // Set language via framework action (emits event bus for MFE propagation)\n const setLanguage = useCallback(\n (lang: Language) => {\n if (app.actions.setLanguage) {\n app.actions.setLanguage({ language: lang });\n }\n },\n [app.actions]\n );\n // @cpt-end:cpt-hai3-flow-react-bindings-use-translation:p1:inst-set-language\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 // @cpt-begin:cpt-hai3-flow-react-bindings-use-translation:p1:inst-return-translation-api\n return {\n t,\n language,\n setLanguage,\n isRTL,\n };\n // @cpt-end:cpt-hai3-flow-react-bindings-use-translation:p1:inst-return-translation-api\n}\n// @cpt-end:cpt-hai3-flow-react-bindings-use-translation:p1:inst-call-translation\n// @cpt-end:cpt-hai3-dod-react-bindings-translation-hook:p1:inst-call-translation\n","/**\n * useScreenTranslations Hook - Screen-level translation loading\n *\n * React Layer: L3\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-use-screen-translations:p1\n// @cpt-algo:cpt-hai3-algo-react-bindings-load-screen-translations:p1\n// @cpt-state:cpt-hai3-state-react-bindings-screen-translation:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-screen-translation-hook:p1\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 */\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-screen-translations:p1:inst-call-screen-translations\n// @cpt-begin:cpt-hai3-dod-react-bindings-screen-translation-hook:p1:inst-call-screen-translations\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 // @cpt-begin:cpt-hai3-state-react-bindings-screen-translation:p1:inst-begin-load\n // @cpt-begin:cpt-hai3-state-react-bindings-screen-translation:p1:inst-load-success\n // @cpt-begin:cpt-hai3-state-react-bindings-screen-translation:p1:inst-load-error\n // @cpt-begin:cpt-hai3-state-react-bindings-screen-translation:p1:inst-reload-on-lang-change\n // @cpt-begin:cpt-hai3-state-react-bindings-screen-translation:p2:inst-retry-on-lang-change\n const [loadedLanguage, setLoadedLanguage] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n // @cpt-end:cpt-hai3-state-react-bindings-screen-translation:p1:inst-begin-load\n // @cpt-end:cpt-hai3-state-react-bindings-screen-translation:p1:inst-load-success\n // @cpt-end:cpt-hai3-state-react-bindings-screen-translation:p1:inst-load-error\n // @cpt-end:cpt-hai3-state-react-bindings-screen-translation:p1:inst-reload-on-lang-change\n // @cpt-end:cpt-hai3-state-react-bindings-screen-translation:p2:inst-retry-on-lang-change\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-screen-translations:p1:inst-subscribe-lang-change\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 // @cpt-end:cpt-hai3-flow-react-bindings-use-screen-translations:p1:inst-subscribe-lang-change\n\n // @cpt-begin:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-get-current-lang\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 // @cpt-end:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-get-current-lang\n\n // @cpt-begin:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-resolve-loader\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 // @cpt-end:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-resolve-loader\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-screen-translations:p1:inst-run-load-screen-translations\n useEffect(() => {\n // @cpt-begin:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-skip-if-loaded\n // Skip if no language or already loaded for this language\n if (!currentLanguage || currentLanguage === loadedLanguage) {\n return;\n }\n // @cpt-end:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-skip-if-loaded\n\n let cancelled = false;\n setIsLoading(true);\n\n const loadTranslations = async () => {\n try {\n const namespace = `screen.${screensetId}.${screenId}`;\n\n // @cpt-begin:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-register-loader\n // Register the loader for future language changes\n i18nRegistry.registerLoader(namespace, loader);\n // @cpt-end:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-register-loader\n\n // @cpt-begin:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-call-loader\n // Actually load the translations for current language\n const loadedTranslations = await loader(currentLanguage);\n // @cpt-end:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-call-loader\n\n // @cpt-begin:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-register-translations\n i18nRegistry.register(namespace, currentLanguage, loadedTranslations);\n // @cpt-end:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-register-translations\n\n // @cpt-begin:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-cancel-on-unmount\n if (!cancelled) {\n setLoadedLanguage(currentLanguage);\n setIsLoading(false);\n setError(null);\n }\n // @cpt-end:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-cancel-on-unmount\n } catch (err) {\n // @cpt-begin:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-handle-load-error\n if (!cancelled) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setIsLoading(false);\n }\n // @cpt-end:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-handle-load-error\n }\n };\n\n loadTranslations();\n\n // @cpt-begin:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-cancel-stale-load\n return () => {\n cancelled = true;\n };\n // @cpt-end:cpt-hai3-algo-react-bindings-load-screen-translations:p1:inst-cancel-stale-load\n }, [screensetId, screenId, loader, i18nRegistry, currentLanguage, loadedLanguage]);\n // @cpt-end:cpt-hai3-flow-react-bindings-use-screen-translations:p1:inst-run-load-screen-translations\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-screen-translations:p1:inst-return-loading-state\n // Derive isLoaded from whether we've loaded translations for the current language\n const isLoaded = currentLanguage !== null && currentLanguage === loadedLanguage && !isLoading;\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-screen-translations:p1:inst-gate-render\n // isLoaded is the gate value: consumers must check this before rendering translation-dependent UI\n return { isLoaded, error };\n // @cpt-end:cpt-hai3-flow-react-bindings-use-screen-translations:p1:inst-gate-render\n // @cpt-end:cpt-hai3-flow-react-bindings-use-screen-translations:p1:inst-return-loading-state\n}\n// @cpt-end:cpt-hai3-flow-react-bindings-use-screen-translations:p1:inst-call-screen-translations\n// @cpt-end:cpt-hai3-dod-react-bindings-screen-translation-hook:p1:inst-call-screen-translations\n","/**\n * useFormatters Hook - Locale-aware formatters\n *\n * Returns formatters that use i18nRegistry.getLanguage() internally.\n * Calls useTranslation() so the component re-renders when language changes.\n *\n * React Layer: L3\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-use-formatters:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-formatters-hook:p1\n\nimport { useMemo } from 'react';\nimport {\n formatDate as formatDateFn,\n formatTime as formatTimeFn,\n formatDateTime as formatDateTimeFn,\n formatRelative as formatRelativeFn,\n formatNumber as formatNumberFn,\n formatPercent as formatPercentFn,\n formatCompact as formatCompactFn,\n formatCurrency as formatCurrencyFn,\n compareStrings as compareStringsFn,\n createCollator as createCollatorFn,\n} from '@hai3/framework';\nimport type { UseFormattersReturn } from '../types';\nimport { useTranslation } from './useTranslation';\n\n/**\n * Hook for accessing locale-aware formatters (date, number, currency, sort).\n *\n * Formatters use the current app language from i18nRegistry.getLanguage().\n * Re-renders when language changes via useTranslation() subscription.\n *\n * @returns Object with formatDate, formatTime, formatDateTime, formatRelative,\n * formatNumber, formatPercent, formatCompact, formatCurrency, compareStrings, createCollator\n *\n * @example\n * ```tsx\n * const { formatDate, formatCurrency } = useFormatters();\n * return (\n * <span>{formatDate(new Date(), 'short')}</span>\n * <span>{formatCurrency(99.99, 'USD')}</span>\n * );\n * ```\n */\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-formatters:p1:inst-call-formatters\n// @cpt-begin:cpt-hai3-dod-react-bindings-formatters-hook:p1:inst-call-formatters\nexport function useFormatters(): UseFormattersReturn {\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-formatters:p1:inst-subscribe-via-translation\n // useTranslation() subscribes to language changes so this component re-renders\n // when language changes; formatters read i18nRegistry.getLanguage() at call time\n const { language } = useTranslation();\n // @cpt-end:cpt-hai3-flow-react-bindings-use-formatters:p1:inst-subscribe-via-translation\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-formatters:p1:inst-return-formatters\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-formatters:p1:inst-formatters-read-locale\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-formatters:p1:inst-recompute-on-lang\n return useMemo<UseFormattersReturn>(\n () => {\n void language; // re-run when language changes so formatters see new locale\n return {\n formatDate: formatDateFn,\n formatTime: formatTimeFn,\n formatDateTime: formatDateTimeFn,\n formatRelative: formatRelativeFn,\n formatNumber: formatNumberFn,\n formatPercent: formatPercentFn,\n formatCompact: formatCompactFn,\n formatCurrency: formatCurrencyFn,\n compareStrings: compareStringsFn,\n createCollator: createCollatorFn,\n };\n },\n [language]\n );\n // @cpt-end:cpt-hai3-flow-react-bindings-use-formatters:p1:inst-return-formatters\n // @cpt-end:cpt-hai3-flow-react-bindings-use-formatters:p1:inst-formatters-read-locale\n // @cpt-end:cpt-hai3-flow-react-bindings-use-formatters:p1:inst-recompute-on-lang\n}\n// @cpt-end:cpt-hai3-flow-react-bindings-use-formatters:p1:inst-call-formatters\n// @cpt-end:cpt-hai3-dod-react-bindings-formatters-hook:p1:inst-call-formatters\n","/**\n * useTheme Hook - Theme utilities\n *\n * React Layer: L3\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-use-theme:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-theme-hook:p1\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 */\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-theme:p1:inst-call-theme\n// @cpt-begin:cpt-hai3-dod-react-bindings-theme-hook:p1:inst-call-theme\nexport function useTheme(): UseThemeReturn {\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-theme:p1:inst-read-theme-registry\n const app = useHAI3();\n const { themeRegistry } = app;\n // @cpt-end:cpt-hai3-flow-react-bindings-use-theme:p1:inst-read-theme-registry\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-theme:p1:inst-subscribe-theme\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-theme:p1:inst-rerender-on-theme-change\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 // @cpt-end:cpt-hai3-flow-react-bindings-use-theme:p1:inst-subscribe-theme\n // @cpt-end:cpt-hai3-flow-react-bindings-use-theme:p1:inst-rerender-on-theme-change\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 // @cpt-begin:cpt-hai3-flow-react-bindings-use-theme:p1:inst-dispatch-change-theme\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 // @cpt-end:cpt-hai3-flow-react-bindings-use-theme:p1:inst-dispatch-change-theme\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-theme:p1:inst-return-theme-api\n return {\n currentTheme,\n themes,\n setTheme,\n };\n // @cpt-end:cpt-hai3-flow-react-bindings-use-theme:p1:inst-return-theme-api\n}\n// @cpt-end:cpt-hai3-flow-react-bindings-use-theme:p1:inst-call-theme\n// @cpt-end:cpt-hai3-dod-react-bindings-theme-hook:p1:inst-call-theme\n","/**\n * useMfeBridge Hook - MFE bridge access\n *\n * Returns the ChildMfeBridge from context for communication with host.\n *\n * React Layer: L3\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-mfe-provider:p1\n// @cpt-algo:cpt-hai3-algo-react-bindings-mfe-context-guard:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-mfe-hooks:p1\n\nimport { useMfeContext } from '../MfeContext';\nimport type { ChildMfeBridge } from '@hai3/framework';\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for accessing the MFE bridge.\n *\n * Returns the ChildMfeBridge instance for communication with the host.\n * Must be used within a MfeProvider (i.e., inside an MFE component).\n *\n * @returns Child MFE bridge\n *\n * @example\n * ```tsx\n * function MyMfeComponent() {\n * const bridge = useMfeBridge();\n *\n * // Bridge methods:\n * // bridge.executeActionsChain(chain);\n * // bridge.subscribeToProperty(propertyTypeId, callback);\n *\n * return <div>Domain: {bridge.domainId}</div>;\n * }\n * ```\n */\n// @cpt-begin:cpt-hai3-flow-react-bindings-mfe-provider:p1:inst-use-bridge\n// @cpt-begin:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-mfe-context\n// @cpt-begin:cpt-hai3-dod-react-bindings-mfe-hooks:p1:inst-use-bridge\nexport function useMfeBridge(): ChildMfeBridge {\n const { bridge } = useMfeContext();\n return bridge;\n}\n// @cpt-end:cpt-hai3-flow-react-bindings-mfe-provider:p1:inst-use-bridge\n// @cpt-end:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-mfe-context\n// @cpt-end:cpt-hai3-dod-react-bindings-mfe-hooks:p1:inst-use-bridge\n","/**\n * useSharedProperty Hook - Shared property subscription\n *\n * Subscribes to shared property updates from the host.\n *\n * React Layer: L3\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-use-shared-property:p1\n// @cpt-algo:cpt-hai3-algo-react-bindings-mfe-context-guard:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-mfe-hooks:p1\n\nimport { useSyncExternalStore, useCallback } from 'react';\nimport { useMfeContext } from '../MfeContext';\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for subscribing to a shared property.\n *\n * Subscribes to property updates from the host and returns the current value.\n * Must be used within a MfeProvider (i.e., inside an MFE component).\n *\n * NOTE: This hook provides the interface and uses useSyncExternalStore with a stub subscription.\n * Full bridge subscription should be implemented when bridge methods are available.\n *\n * @param _propertyTypeId - Type ID of the shared property to subscribe to (currently unused)\n * @returns Current property value\n *\n * @example\n * ```tsx\n * function MyMfeComponent() {\n * const userData = useSharedProperty('gts.hai3.mfes.comm.shared_property.v1~myapp.user_data.v1');\n *\n * return <div>User: {userData?.name}</div>;\n * }\n * ```\n */\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-shared-property:p1:inst-call-shared-property\n// @cpt-begin:cpt-hai3-dod-react-bindings-mfe-hooks:p1:inst-call-shared-property\nexport function useSharedProperty<T = unknown>(propertyTypeId: string): T | undefined {\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-shared-property:p1:inst-read-bridge\n // @cpt-begin:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-mfe-context\n // Enforce MfeProvider context requirement\n const { bridge } = useMfeContext(); // Throws if not in MfeProvider\n // @cpt-end:cpt-hai3-flow-react-bindings-use-shared-property:p1:inst-read-bridge\n // @cpt-end:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-mfe-context\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-shared-property:p1:inst-subscribe-property\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-shared-property:p1:inst-rerender-on-property-change\n // Subscribe to property updates via bridge\n const subscribe = useCallback((callback: () => void) => {\n return bridge.subscribeToProperty(propertyTypeId, () => {\n // When property changes, trigger React re-render\n callback();\n });\n }, [bridge, propertyTypeId]);\n // @cpt-end:cpt-hai3-flow-react-bindings-use-shared-property:p1:inst-subscribe-property\n // @cpt-end:cpt-hai3-flow-react-bindings-use-shared-property:p1:inst-rerender-on-property-change\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-shared-property:p1:inst-return-property-value\n const getSnapshot = useCallback(() => {\n const property = bridge.getProperty(propertyTypeId);\n // Type narrowing: caller specifies expected type T (standard React hook pattern)\n // Similar to useState<T>, useContext<T> - type safety is caller's responsibility\n return property?.value as T | undefined;\n }, [bridge, propertyTypeId]);\n\n const value = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n return value;\n // @cpt-end:cpt-hai3-flow-react-bindings-use-shared-property:p1:inst-return-property-value\n}\n// @cpt-end:cpt-hai3-flow-react-bindings-use-shared-property:p1:inst-call-shared-property\n// @cpt-end:cpt-hai3-dod-react-bindings-mfe-hooks:p1:inst-call-shared-property\n","/**\n * useHostAction Hook - Host action requests\n *\n * Returns a callback to request host actions via the bridge.\n *\n * React Layer: L3\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-use-host-action:p1\n// @cpt-algo:cpt-hai3-algo-react-bindings-mfe-context-guard:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-mfe-hooks:p1\n\nimport { useCallback } from 'react';\nimport { useMfeContext } from '../MfeContext';\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for requesting host actions.\n *\n * Returns a callback function that sends an actions chain to the host.\n * Must be used within a MfeProvider (i.e., inside an MFE component).\n *\n * NOTE: This hook provides the interface. Bridge executeActionsChain() delegates to the registry.\n *\n * @param actionTypeId - Type ID of the action to request\n * @returns Callback function to request the action with payload\n *\n * @example\n * ```tsx\n * function MyMfeComponent() {\n * const requestNavigation = useHostAction('gts.hai3.mfes.comm.action.v1~myapp.navigate.v1');\n *\n * const handleClick = () => {\n * requestNavigation({ path: '/dashboard' });\n * };\n *\n * return <button onClick={handleClick}>Navigate</button>;\n * }\n * ```\n */\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-host-action:p1:inst-call-host-action\n// @cpt-begin:cpt-hai3-dod-react-bindings-mfe-hooks:p1:inst-call-host-action\nexport function useHostAction<TPayload extends Record<string, unknown> = Record<string, unknown>>(\n actionTypeId: string\n): (payload?: TPayload) => void {\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-host-action:p1:inst-read-bridge-for-action\n // @cpt-begin:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-mfe-context\n // Enforce MfeProvider context requirement\n const { bridge } = useMfeContext(); // Throws if not in MfeProvider\n // @cpt-end:cpt-hai3-flow-react-bindings-use-host-action:p1:inst-read-bridge-for-action\n // @cpt-end:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-mfe-context\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-host-action:p1:inst-return-action-callback\n return useCallback((payload?: TPayload) => {\n // Construct an ActionsChain with the action\n // With the constraint, TPayload extends Record<string, unknown>,\n // so this is a safe widening from specific to general\n const chain = {\n action: {\n type: actionTypeId,\n target: bridge.domainId,\n payload: payload as Record<string, unknown> | undefined,\n },\n };\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-host-action:p1:inst-log-action-error\n // Send the chain to the host\n bridge.executeActionsChain(chain).catch((error: Error) => {\n console.error(\n `[useHostAction] Failed to send action '${actionTypeId}':`,\n error\n );\n });\n // @cpt-end:cpt-hai3-flow-react-bindings-use-host-action:p1:inst-log-action-error\n }, [actionTypeId, bridge]);\n // @cpt-end:cpt-hai3-flow-react-bindings-use-host-action:p1:inst-return-action-callback\n}\n// @cpt-end:cpt-hai3-flow-react-bindings-use-host-action:p1:inst-call-host-action\n// @cpt-end:cpt-hai3-dod-react-bindings-mfe-hooks:p1:inst-call-host-action\n","/**\n * useDomainExtensions Hook - Domain extension list subscription\n *\n * Subscribes to store changes to detect when extensions are registered or unregistered,\n * and returns the current list of extensions for a domain.\n *\n * React Layer: L3\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-use-domain-extensions:p1\n// @cpt-algo:cpt-hai3-algo-react-bindings-mfe-context-guard:p1\n// @cpt-algo:cpt-hai3-algo-react-bindings-stable-snapshots:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-observation-hooks:p1\n\nimport { useSyncExternalStore, useCallback, useRef } from 'react';\nimport { useHAI3 } from '../../HAI3Context';\nimport type { Extension } from '@hai3/framework';\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for observing extensions registered for a domain.\n *\n * Subscribes to the HAI3 store to detect registration state changes,\n * and returns the current list of extensions for the specified domain.\n *\n * @param domainId - Domain ID to query extensions for\n * @returns Array of extensions currently registered for the domain\n *\n * @example\n * ```tsx\n * function SidebarExtensions() {\n * const extensions = useDomainExtensions('gts.hai3.mfes.ext.domain.v1~hai3.screensets.layout.sidebar.v1');\n *\n * return (\n * <div>\n * {extensions.map(ext => (\n * <div key={ext.id}>{ext.id}</div>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-domain-extensions:p1:inst-call-domain-extensions\n// @cpt-begin:cpt-hai3-dod-react-bindings-observation-hooks:p1:inst-call-domain-extensions\nexport function useDomainExtensions(domainId: string): Extension[] {\n const app = useHAI3();\n const registry = app.screensetsRegistry;\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-domain-extensions:p1:inst-guard-registry\n // @cpt-begin:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-registry\n if (!registry) {\n throw new Error(\n 'useDomainExtensions requires the microfrontends plugin. ' +\n 'Add microfrontends() to your HAI3 app configuration.'\n );\n }\n // @cpt-end:cpt-hai3-flow-react-bindings-use-domain-extensions:p1:inst-guard-registry\n // @cpt-end:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-registry\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-domain-extensions:p1:inst-subscribe-store\n // Subscribe to store changes.\n // Any dispatch (including registration state updates) triggers a snapshot check.\n // The snapshot comparison ensures only actual extension list changes cause re-renders.\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n return app.store.subscribe(onStoreChange);\n },\n [app.store]\n );\n // @cpt-end:cpt-hai3-flow-react-bindings-use-domain-extensions:p1:inst-subscribe-store\n\n // @cpt-begin:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-cache-ref\n // Cache the snapshot to maintain referential stability for useSyncExternalStore.\n // Only update when the extension IDs actually change.\n const cacheRef = useRef<{ ids: string; extensions: Extension[] }>({ ids: '', extensions: [] });\n // @cpt-end:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-cache-ref\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-domain-extensions:p1:inst-diff-extensions\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-domain-extensions:p1:inst-stable-reference\n const getSnapshot = useCallback(() => {\n const extensions = registry.getExtensionsForDomain(domainId);\n // @cpt-begin:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-compute-cache-key\n const ids = extensions.map(e => e.id).join(',');\n // @cpt-end:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-compute-cache-key\n // @cpt-begin:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-return-cached\n // @cpt-begin:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-update-cache\n if (ids !== cacheRef.current.ids) {\n cacheRef.current = { ids, extensions };\n }\n return cacheRef.current.extensions;\n // @cpt-end:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-return-cached\n // @cpt-end:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-update-cache\n }, [registry, domainId]);\n // @cpt-end:cpt-hai3-flow-react-bindings-use-domain-extensions:p1:inst-diff-extensions\n // @cpt-end:cpt-hai3-flow-react-bindings-use-domain-extensions:p1:inst-stable-reference\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n}\n// @cpt-end:cpt-hai3-flow-react-bindings-use-domain-extensions:p1:inst-call-domain-extensions\n// @cpt-end:cpt-hai3-dod-react-bindings-observation-hooks:p1:inst-call-domain-extensions\n","/**\n * useRegisteredPackages Hook - Registered GTS packages subscription\n *\n * Subscribes to store changes to detect when extensions are registered or unregistered,\n * and returns the current list of registered GTS packages.\n *\n * React Layer: L3\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-use-registered-packages:p1\n// @cpt-algo:cpt-hai3-algo-react-bindings-mfe-context-guard:p1\n// @cpt-algo:cpt-hai3-algo-react-bindings-stable-snapshots:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-observation-hooks:p1\n\nimport { useSyncExternalStore, useCallback, useRef } from 'react';\nimport { useHAI3 } from '../../HAI3Context';\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for observing registered GTS packages.\n *\n * Subscribes to the HAI3 store to detect registration state changes,\n * and returns the current list of GTS packages extracted from registered\n * extensions.\n *\n * ARCHITECTURAL NOTE ON STORE SUBSCRIPTION COUPLING:\n * This hook uses `useSyncExternalStore` with `app.store.subscribe`, which\n * fires on any Redux dispatch. Since `registerExtension()` dispatches to\n * the mfe store slice, the subscription WILL trigger when packages change.\n * The `getSnapshot` function calls `screensetsRegistry.getRegisteredPackages()`\n * which reads the private `packages` Map. This works because every package\n * map mutation (in registerExtension/unregisterExtension) is always\n * accompanied by a store dispatch in the same serializer callback.\n *\n * IMPORTANT: If a future change mutates the packages map WITHOUT a store\n * dispatch, this hook would fail to re-render. Keep this coupling documented.\n *\n * @returns Array of GTS package strings currently registered\n *\n * @example\n * ```tsx\n * function PackageList() {\n * const packages = useRegisteredPackages();\n *\n * return (\n * <div>\n * {packages.map(pkg => (\n * <div key={pkg}>{pkg}</div>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-registered-packages:p1:inst-call-registered-packages\n// @cpt-begin:cpt-hai3-dod-react-bindings-observation-hooks:p1:inst-call-registered-packages\nexport function useRegisteredPackages(): string[] {\n const app = useHAI3();\n const registry = app.screensetsRegistry;\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-registered-packages:p1:inst-guard-registry-packages\n // @cpt-begin:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-registry\n if (!registry) {\n throw new Error(\n 'useRegisteredPackages requires the microfrontends plugin. ' +\n 'Add microfrontends() to your HAI3 app configuration.'\n );\n }\n // @cpt-end:cpt-hai3-flow-react-bindings-use-registered-packages:p1:inst-guard-registry-packages\n // @cpt-end:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-registry\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-registered-packages:p1:inst-subscribe-store-packages\n // Subscribe to store changes.\n // Any dispatch (including registration state updates) triggers a snapshot check.\n // The snapshot comparison ensures only actual package list changes cause re-renders.\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n return app.store.subscribe(onStoreChange);\n },\n [app.store]\n );\n // @cpt-end:cpt-hai3-flow-react-bindings-use-registered-packages:p1:inst-subscribe-store-packages\n\n // @cpt-begin:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-cache-ref\n // Cache the snapshot to maintain referential stability for useSyncExternalStore.\n // Only update when the package list actually changes.\n const cacheRef = useRef<{ packages: string; list: string[] }>({ packages: '', list: [] });\n // @cpt-end:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-cache-ref\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-registered-packages:p1:inst-diff-packages\n const getSnapshot = useCallback(() => {\n const list = registry.getRegisteredPackages();\n // @cpt-begin:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-compute-cache-key\n const packages = list.join(',');\n // @cpt-end:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-compute-cache-key\n // @cpt-begin:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-return-cached\n // @cpt-begin:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-update-cache\n if (packages !== cacheRef.current.packages) {\n cacheRef.current = { packages, list };\n }\n return cacheRef.current.list;\n // @cpt-end:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-return-cached\n // @cpt-end:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-update-cache\n }, [registry]);\n // @cpt-end:cpt-hai3-flow-react-bindings-use-registered-packages:p1:inst-diff-packages\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n}\n// @cpt-end:cpt-hai3-flow-react-bindings-use-registered-packages:p1:inst-call-registered-packages\n// @cpt-end:cpt-hai3-dod-react-bindings-observation-hooks:p1:inst-call-registered-packages\n","/**\n * useActivePackage Hook - Active GTS package subscription\n *\n * Subscribes to store changes and returns the GTS package of the currently\n * mounted screen extension.\n *\n * React Layer: L3\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-use-active-package:p1\n// @cpt-algo:cpt-hai3-algo-react-bindings-mfe-context-guard:p1\n// @cpt-algo:cpt-hai3-algo-react-bindings-stable-snapshots:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-observation-hooks:p1\n\nimport { useSyncExternalStore, useCallback, useRef } from 'react';\nimport { useHAI3 } from '../../HAI3Context';\nimport { extractGtsPackage, HAI3_SCREEN_DOMAIN } from '@hai3/framework';\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for observing the active GTS package (the package of the currently\n * mounted screen extension).\n *\n * Subscribes to the HAI3 store to detect mount state changes, and returns\n * the GTS package extracted from the currently mounted screen extension's ID.\n *\n * Returns `undefined` if no screen extension is currently mounted.\n *\n * @returns GTS package string of the active screen extension, or undefined\n *\n * @example\n * ```tsx\n * function ActivePackageIndicator() {\n * const activePackage = useActivePackage();\n *\n * if (!activePackage) {\n * return <div>No active screen</div>;\n * }\n *\n * return <div>Active package: {activePackage}</div>;\n * }\n * ```\n */\n// @cpt-begin:cpt-hai3-flow-react-bindings-use-active-package:p1:inst-call-active-package\n// @cpt-begin:cpt-hai3-dod-react-bindings-observation-hooks:p1:inst-call-active-package\nexport function useActivePackage(): string | undefined {\n const app = useHAI3();\n const registry = app.screensetsRegistry;\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-active-package:p1:inst-guard-registry-active\n // @cpt-begin:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-registry\n if (!registry) {\n throw new Error(\n 'useActivePackage requires the microfrontends plugin. ' +\n 'Add microfrontends() to your HAI3 app configuration.'\n );\n }\n // @cpt-end:cpt-hai3-flow-react-bindings-use-active-package:p1:inst-guard-registry-active\n // @cpt-end:cpt-hai3-algo-react-bindings-mfe-context-guard:p1:inst-throw-no-registry\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-active-package:p1:inst-subscribe-store-active\n // Subscribe to store changes.\n // Any dispatch (including mount state updates) triggers a snapshot check.\n // The snapshot comparison ensures only actual active package changes cause re-renders.\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n return app.store.subscribe(onStoreChange);\n },\n [app.store]\n );\n // @cpt-end:cpt-hai3-flow-react-bindings-use-active-package:p1:inst-subscribe-store-active\n\n // @cpt-begin:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-cache-ref\n // Cache the snapshot to maintain referential stability for useSyncExternalStore.\n // Only update when the active package actually changes.\n const cacheRef = useRef<{ activePackage: string | undefined }>({ activePackage: undefined });\n // @cpt-end:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-cache-ref\n\n const getSnapshot = useCallback(() => {\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-active-package:p1:inst-get-mounted-extension\n const mountedExtensionId = registry.getMountedExtension(HAI3_SCREEN_DOMAIN);\n // @cpt-end:cpt-hai3-flow-react-bindings-use-active-package:p1:inst-get-mounted-extension\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-active-package:p1:inst-return-undefined-active\n // Guard: if no extension is mounted, return undefined immediately\n if (!mountedExtensionId) {\n const result = undefined;\n // @cpt-begin:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-return-cached\n if (result !== cacheRef.current.activePackage) {\n cacheRef.current = { activePackage: result };\n }\n return cacheRef.current.activePackage;\n // @cpt-end:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-return-cached\n }\n // @cpt-end:cpt-hai3-flow-react-bindings-use-active-package:p1:inst-return-undefined-active\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-use-active-package:p1:inst-extract-package\n // @cpt-begin:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-compute-cache-key\n // Extract GTS package from the mounted extension ID\n const activePackage = extractGtsPackage(mountedExtensionId);\n // @cpt-end:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-compute-cache-key\n\n // @cpt-begin:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-update-cache\n if (activePackage !== cacheRef.current.activePackage) {\n cacheRef.current = { activePackage };\n }\n // @cpt-end:cpt-hai3-algo-react-bindings-stable-snapshots:p1:inst-update-cache\n\n return cacheRef.current.activePackage;\n // @cpt-end:cpt-hai3-flow-react-bindings-use-active-package:p1:inst-extract-package\n }, [registry]);\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n}\n// @cpt-end:cpt-hai3-flow-react-bindings-use-active-package:p1:inst-call-active-package\n// @cpt-end:cpt-hai3-dod-react-bindings-observation-hooks:p1:inst-call-active-package\n","/**\n * Ref Container Provider\n *\n * Concrete ContainerProvider that wraps a React ref.\n * Created by React components (like ExtensionDomainSlot) for use\n * by framework-level domain registration code.\n *\n * @packageDocumentation\n */\n// @cpt-dod:cpt-hai3-dod-react-bindings-ref-container-provider:p1\n\nimport type { RefObject } from 'react';\nimport { ContainerProvider } from '@hai3/framework';\n\n/**\n * Concrete ContainerProvider that wraps a React ref.\n *\n * This provider reads the container element from a React ref at mount time.\n * It is designed to be created by React components but passed to domain\n * registration code (framework-level).\n *\n * Usage pattern:\n * 1. React component creates a ref via `useRef<HTMLDivElement>(null)`\n * 2. Framework-level code creates `RefContainerProvider` wrapping the ref\n * 3. Framework-level code passes the provider to `registerDomain(domain, provider)`\n * 4. When mount_ext is dispatched, the provider returns `ref.current`\n */\n// @cpt-begin:cpt-hai3-dod-react-bindings-ref-container-provider:p1:inst-1\nexport class RefContainerProvider extends ContainerProvider {\n constructor(private readonly containerRef: RefObject<HTMLDivElement>) {\n super();\n }\n\n getContainer(_extensionId: string): Element {\n if (!this.containerRef.current) {\n throw new Error('Container ref is not attached -- component may not be mounted yet');\n }\n return this.containerRef.current;\n }\n\n releaseContainer(_extensionId: string): void {\n // No-op for React ref -- the ref lifecycle is managed by React.\n // Container cleanup happens when the component unmounts.\n }\n}\n// @cpt-end:cpt-hai3-dod-react-bindings-ref-container-provider:p1:inst-1\n","/**\n * Extension Domain Slot Component\n *\n * React component that renders extensions within a domain slot.\n * Manages extension lifecycle (mount/unmount) and provides rendering context.\n *\n * @packageDocumentation\n */\n// @cpt-flow:cpt-hai3-flow-react-bindings-extension-domain-slot:p1\n// @cpt-state:cpt-hai3-state-react-bindings-extension-slot:p1\n// @cpt-dod:cpt-hai3-dod-react-bindings-extension-slot:p1\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport type { ScreensetsRegistry, ParentMfeBridge } from '@hai3/framework';\nimport {\n HAI3_ACTION_MOUNT_EXT,\n HAI3_ACTION_UNMOUNT_EXT,\n} from '@hai3/framework';\n\n/**\n * Props for ExtensionDomainSlot component\n */\nexport interface ExtensionDomainSlotProps {\n /**\n * The screensets registry instance\n */\n registry: ScreensetsRegistry;\n\n /**\n * The domain ID for this slot\n */\n domainId: string;\n\n /**\n * The extension ID to render in this slot\n */\n extensionId: string;\n\n /**\n * Optional CSS class name for the container\n */\n className?: string;\n\n /**\n * Optional callback when extension is mounted\n */\n onMounted?: (bridge: ParentMfeBridge) => void;\n\n /**\n * Optional callback when extension is unmounted\n */\n onUnmounted?: () => void;\n\n /**\n * Optional error callback\n */\n onError?: (error: Error) => void;\n\n /**\n * Optional loading component\n */\n loadingComponent?: React.ReactNode;\n\n /**\n * Optional error component renderer\n */\n errorComponent?: (error: Error) => React.ReactNode;\n}\n\n/**\n * Extension Domain Slot Component\n *\n * Renders an extension within a domain slot. Manages the extension lifecycle:\n * - Mounts the extension on component mount\n * - Unmounts the extension on component unmount\n * - Handles loading and error states\n *\n * @example\n * ```tsx\n * <ExtensionDomainSlot\n * registry={registry}\n * domainId=\"gts.hai3.mfes.ext.domain.v1~hai3.screensets.layout.sidebar.v1\"\n * extensionId=\"gts.hai3.mfes.ext.extension.v1~myapp.sidebar.widget.v1\"\n * className=\"sidebar-slot\"\n * />\n * ```\n */\n// @cpt-begin:cpt-hai3-flow-react-bindings-extension-domain-slot:p1:inst-render-slot\n// @cpt-begin:cpt-hai3-dod-react-bindings-extension-slot:p1:inst-render-slot\nexport function ExtensionDomainSlot(props: ExtensionDomainSlotProps): React.ReactElement {\n const {\n registry,\n domainId,\n extensionId,\n className,\n onMounted,\n onUnmounted,\n onError,\n loadingComponent,\n errorComponent,\n } = props;\n\n const containerRef = useRef<HTMLDivElement>(null);\n // @cpt-begin:cpt-hai3-state-react-bindings-extension-slot:p1:inst-start-mount\n const [isLoading, setIsLoading] = useState(true);\n // @cpt-end:cpt-hai3-state-react-bindings-extension-slot:p1:inst-start-mount\n const [error, setError] = useState<Error | null>(null);\n const [bridge, setBridge] = useState<ParentMfeBridge | null>(null);\n\n useEffect(() => {\n let mounted = true;\n let currentBridge: ParentMfeBridge | null = null;\n\n async function mountExtension() {\n if (!containerRef.current) {\n return;\n }\n\n try {\n // @cpt-begin:cpt-hai3-state-react-bindings-extension-slot:p2:inst-retry-mount\n // Resetting error/loading here also handles the ERROR→MOUNTING transition when\n // extensionId or domainId props change (effect re-runs due to dependency array)\n setIsLoading(true);\n setError(null);\n // @cpt-end:cpt-hai3-state-react-bindings-extension-slot:p2:inst-retry-mount\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-extension-domain-slot:p1:inst-dispatch-mount\n // Mount the extension via actions chain (auto-loads if not already loaded)\n // Container is provided by the domain's ContainerProvider (registered at domain registration time)\n await registry.executeActionsChain({\n action: {\n type: HAI3_ACTION_MOUNT_EXT,\n target: domainId,\n payload: {\n extensionId,\n },\n },\n });\n // @cpt-end:cpt-hai3-flow-react-bindings-extension-domain-slot:p1:inst-dispatch-mount\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-extension-domain-slot:p2:inst-race-cleanup\n // @cpt-begin:cpt-hai3-state-react-bindings-extension-slot:p1:inst-race-unmount\n if (!mounted) {\n // Component was unmounted while mounting - clean up\n await registry.executeActionsChain({\n action: {\n type: HAI3_ACTION_UNMOUNT_EXT,\n target: domainId,\n payload: {\n extensionId,\n },\n },\n });\n return;\n }\n // @cpt-end:cpt-hai3-flow-react-bindings-extension-domain-slot:p2:inst-race-cleanup\n // @cpt-end:cpt-hai3-state-react-bindings-extension-slot:p1:inst-race-unmount\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-extension-domain-slot:p1:inst-get-bridge\n // @cpt-begin:cpt-hai3-state-react-bindings-extension-slot:p1:inst-mount-success\n // Query the bridge after mount completes\n const newBridge = registry.getParentBridge(extensionId);\n if (!newBridge) {\n throw new Error(`Failed to obtain bridge for extension ${extensionId} after mount`);\n }\n\n currentBridge = newBridge;\n setBridge(newBridge);\n setIsLoading(false);\n // @cpt-end:cpt-hai3-flow-react-bindings-extension-domain-slot:p1:inst-get-bridge\n // @cpt-end:cpt-hai3-state-react-bindings-extension-slot:p1:inst-mount-success\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-extension-domain-slot:p1:inst-notify-mounted\n // Notify parent\n if (onMounted) {\n onMounted(newBridge);\n }\n // @cpt-end:cpt-hai3-flow-react-bindings-extension-domain-slot:p1:inst-notify-mounted\n } catch (err) {\n // @cpt-begin:cpt-hai3-flow-react-bindings-extension-domain-slot:p1:inst-handle-mount-error\n // @cpt-begin:cpt-hai3-state-react-bindings-extension-slot:p1:inst-mount-error\n if (!mounted) {\n return;\n }\n\n const errorObj = err instanceof Error ? err : new Error(String(err));\n setError(errorObj);\n setIsLoading(false);\n\n if (onError) {\n onError(errorObj);\n }\n // @cpt-end:cpt-hai3-flow-react-bindings-extension-domain-slot:p1:inst-handle-mount-error\n // @cpt-end:cpt-hai3-state-react-bindings-extension-slot:p1:inst-mount-error\n }\n }\n\n // Start mounting\n void mountExtension();\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-extension-domain-slot:p1:inst-cleanup-unmount\n // @cpt-begin:cpt-hai3-state-react-bindings-extension-slot:p1:inst-start-unmount\n // Cleanup on unmount\n return () => {\n mounted = false;\n\n if (currentBridge) {\n // Unmount extension asynchronously via actions chain\n void registry.executeActionsChain({\n action: {\n type: HAI3_ACTION_UNMOUNT_EXT,\n target: domainId,\n payload: {\n extensionId,\n },\n },\n }).then(() => {\n if (onUnmounted) {\n onUnmounted();\n }\n });\n }\n };\n // @cpt-end:cpt-hai3-flow-react-bindings-extension-domain-slot:p1:inst-cleanup-unmount\n // @cpt-end:cpt-hai3-state-react-bindings-extension-slot:p1:inst-start-unmount\n }, [registry, domainId, extensionId, onMounted, onUnmounted, onError]);\n\n // @cpt-begin:cpt-hai3-flow-react-bindings-extension-domain-slot:p1:inst-show-loading\n // Render loading state\n if (isLoading) {\n return (\n <div className={className} data-domain-id={domainId} data-extension-id={extensionId}>\n {loadingComponent ?? <div>Loading extension...</div>}\n </div>\n );\n }\n // @cpt-end:cpt-hai3-flow-react-bindings-extension-domain-slot:p1:inst-show-loading\n\n // Render error state\n if (error) {\n return (\n <div className={className} data-domain-id={domainId} data-extension-id={extensionId}>\n {errorComponent ? errorComponent(error) : (\n <div>\n <strong>Error loading extension:</strong>\n <pre>{error.message}</pre>\n </div>\n )}\n </div>\n );\n }\n\n // Render the container for the mounted extension\n return (\n <div\n ref={containerRef}\n className={className}\n data-domain-id={domainId}\n data-extension-id={extensionId}\n data-bridge-active={bridge !== null}\n />\n );\n}\n// @cpt-end:cpt-hai3-flow-react-bindings-extension-domain-slot:p1:inst-render-slot\n// @cpt-end:cpt-hai3-dod-react-bindings-extension-slot:p1:inst-render-slot\n","/**\n * @hai3/react - React Bindings\n *\n * This package provides:\n * - HAI3Provider context provider\n * - Type-safe hooks for state and actions\n * - MFE context, hooks, and components\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 useFormatters,\n useTheme,\n} from './hooks';\n\n// ============================================================================\n// MFE Context and Hooks\n// ============================================================================\n\nexport {\n MfeContext,\n useMfeContext,\n MfeProvider,\n useMfeBridge,\n useSharedProperty,\n useHostAction,\n useDomainExtensions,\n useRegisteredPackages,\n useActivePackage,\n RefContainerProvider,\n ExtensionDomainSlot,\n} from './mfe';\n\nexport type {\n MfeContextValue,\n MfeProviderProps,\n ExtensionDomainSlotProps,\n} from './mfe';\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\nexport type {\n HAI3ProviderProps,\n UseHAI3Return,\n UseAppSelector,\n UseAppDispatchReturn,\n UseTranslationReturn,\n UseScreenTranslationsReturn,\n UseFormattersReturn,\n UseThemeReturn,\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 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 i18n,\n effects,\n\n // Registries\n createThemeRegistry,\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 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 ThemeRegistry,\n ThemeConfig,\n Preset,\n Presets,\n ScreensetsConfig,\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 ReducerPayload,\n\n // Layout\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 // 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// MFE Re-exports from @hai3/framework (Layering Compliance)\n// ============================================================================\n\n// MFE Plugin factories\nexport {\n microfrontends,\n mock,\n} from '@hai3/framework';\n\n// MFE Action functions\nexport {\n loadExtension,\n mountExtension,\n unmountExtension,\n registerExtension,\n unregisterExtension,\n} from '@hai3/framework';\n\n// MFE Selectors\nexport {\n selectExtensionState,\n selectRegisteredExtensions,\n selectExtensionError,\n} from '@hai3/framework';\n\n// MFE Domain constants\nexport {\n HAI3_POPUP_DOMAIN,\n HAI3_SIDEBAR_DOMAIN,\n HAI3_SCREEN_DOMAIN,\n HAI3_OVERLAY_DOMAIN,\n // Base ExtensionDomain constants\n screenDomain,\n sidebarDomain,\n popupDomain,\n overlayDomain,\n} from '@hai3/framework';\n\n// MFE Type constants\nexport {\n HAI3_SCREEN_EXTENSION_TYPE,\n HAI3_MFE_ENTRY_MF,\n} from '@hai3/framework';\n\n// MFE Action constants\nexport {\n HAI3_ACTION_LOAD_EXT,\n HAI3_ACTION_MOUNT_EXT,\n HAI3_ACTION_UNMOUNT_EXT,\n} from '@hai3/framework';\n\n// MFE Shared Property constants\nexport {\n HAI3_SHARED_PROPERTY_THEME,\n HAI3_SHARED_PROPERTY_LANGUAGE,\n} from '@hai3/framework';\n\n// MFE Types\nexport type {\n ChildMfeBridge,\n ParentMfeBridge,\n Extension,\n ScreenExtension,\n ExtensionPresentation,\n ExtensionDomain,\n ActionsChain,\n Action,\n SharedProperty,\n LifecycleStage,\n LifecycleHook,\n MfeEntryLifecycle,\n MfeEntry,\n MfeEntryMF,\n JSONSchema,\n ValidationError,\n ValidationResult,\n LoadExtPayload,\n MountExtPayload,\n UnmountExtPayload,\n ScreensetsRegistryConfig,\n TypeSystemPlugin,\n} from '@hai3/framework';\n\n// MFE Abstract classes\nexport {\n MfeHandler,\n MfeBridgeFactory,\n ScreensetsRegistry,\n ScreensetsRegistryFactory,\n screensetsRegistryFactory,\n ContainerProvider,\n} from '@hai3/framework';\n\n// MFE Concrete implementations\nexport { MfeHandlerMF, gtsPlugin } from '@hai3/framework';\n\n// MFE Utilities\nexport {\n createShadowRoot,\n injectCssVariables,\n extractGtsPackage,\n} from '@hai3/framework';\n\n// MFE Plugin types\nexport type {\n MfeState,\n ExtensionRegistrationState,\n RegisterExtensionPayload,\n UnregisterExtensionPayload,\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, EventBus } from '@hai3/framework';\nimport { eventBus as frameworkEventBus } from '@hai3/framework';\n\n// @cpt-dod:cpt-hai3-dod-react-bindings-event-payload-map:p2\n// @cpt-begin:cpt-hai3-dod-react-bindings-event-payload-map:p2:inst-event-payload-map\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// @cpt-end:cpt-hai3-dod-react-bindings-event-payload-map:p2:inst-event-payload-map\n"],"mappings":"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","names":["createContext","useContext","jsx","useMemo","i18nRegistry","useMemo","useEffect","useMemo","useCallback","useSyncExternalStore","i18nRegistry","useSyncExternalStore","useCallback","useMemo","useEffect","useMemo","useMemo","useCallback","useMemo","useSyncExternalStore","useSyncExternalStore","useCallback","useMemo","themes","useSyncExternalStore","useCallback","useCallback","useSyncExternalStore","useCallback","useCallback","useSyncExternalStore","useCallback","useCallback","useSyncExternalStore","useSyncExternalStore","useCallback","useRef","useCallback","useRef","useSyncExternalStore","useSyncExternalStore","useCallback","useRef","useCallback","useRef","useSyncExternalStore","useEffect","useRef","useState","jsx","mountExtension","createHAI3App","HAI3_SCREEN_DOMAIN","HAI3_ACTION_MOUNT_EXT","HAI3_ACTION_UNMOUNT_EXT","ContainerProvider","extractGtsPackage"]}
|