@hai3/framework 0.2.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,1397 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ ACCOUNTS_DOMAIN: () => ACCOUNTS_DOMAIN,
24
+ BaseApiService: () => import_api3.BaseApiService,
25
+ I18nRegistry: () => import_i18n6.I18nRegistryImpl,
26
+ I18nRegistryImpl: () => import_i18n5.I18nRegistryImpl,
27
+ LAYOUT_SLICE_NAME: () => LAYOUT_SLICE_NAME,
28
+ Language: () => import_i18n5.Language,
29
+ LanguageDisplayMode: () => import_i18n5.LanguageDisplayMode,
30
+ LayoutDomain: () => import_screensets7.LayoutDomain,
31
+ MockPlugin: () => import_api3.MockPlugin,
32
+ RestProtocol: () => import_api3.RestProtocol,
33
+ STATE_PATH_MAPPING: () => STATE_PATH_MAPPING,
34
+ SUPPORTED_LANGUAGES: () => import_i18n5.SUPPORTED_LANGUAGES,
35
+ ScreensetCategory: () => import_screensets7.ScreensetCategory,
36
+ SseProtocol: () => import_api3.SseProtocol,
37
+ TENANT_SLICE_NAME: () => TENANT_SLICE_NAME,
38
+ TenantEvents: () => TenantEvents,
39
+ TextDirection: () => import_i18n5.TextDirection,
40
+ apiRegistry: () => import_api3.apiRegistry,
41
+ changeTenant: () => changeTenant,
42
+ clearActiveScreen: () => clearActiveScreen,
43
+ clearTenant: () => clearTenant,
44
+ clearTenantAction: () => clearTenantAction,
45
+ clearUser: () => clearUser,
46
+ closeAllPopups: () => closeAllPopups,
47
+ closePopup: () => closePopup,
48
+ closeTopPopup: () => closeTopPopup,
49
+ createHAI3: () => createHAI3,
50
+ createHAI3App: () => createHAI3App,
51
+ createI18nRegistry: () => import_i18n5.createI18nRegistry,
52
+ createLegacySelector: () => createLegacySelector,
53
+ createRouteRegistry: () => createRouteRegistry,
54
+ createScreensetRegistry: () => import_screensets6.createScreensetRegistry,
55
+ createSlice: () => import_state16.createSlice,
56
+ createStore: () => import_state16.createStore,
57
+ createThemeRegistry: () => createThemeRegistry,
58
+ effects: () => effects,
59
+ eventBus: () => import_state16.eventBus,
60
+ fetchCurrentUser: () => fetchCurrentUser,
61
+ footerActions: () => footerActions,
62
+ footerSlice: () => footerSlice,
63
+ full: () => full,
64
+ getLanguageMetadata: () => import_i18n5.getLanguageMetadata,
65
+ getLayoutDomainState: () => getLayoutDomainState,
66
+ getStore: () => import_state16.getStore,
67
+ hasLegacyUicoreState: () => hasLegacyUicoreState,
68
+ hasNewLayoutState: () => hasNewLayoutState,
69
+ hasSlice: () => import_state16.hasSlice,
70
+ headerActions: () => headerActions,
71
+ headerSlice: () => headerSlice,
72
+ headless: () => headless,
73
+ hideOverlay: () => hideOverlay,
74
+ i18n: () => i18n,
75
+ i18nRegistry: () => import_i18n5.i18nRegistry,
76
+ initTenantEffects: () => initTenantEffects,
77
+ isDeprecationWarningsEnabled: () => isDeprecationWarningsEnabled,
78
+ layout: () => layout,
79
+ layoutDomainReducers: () => layoutDomainReducers,
80
+ layoutReducer: () => layoutReducer,
81
+ legacySelectors: () => legacySelectors,
82
+ menuActions: () => menuActions,
83
+ menuSlice: () => menuSlice,
84
+ minimal: () => minimal,
85
+ navigateTo: () => navigateTo,
86
+ navigateToScreen: () => navigateToScreen,
87
+ navigation: () => navigation,
88
+ openPopup: () => openPopup,
89
+ overlayActions: () => overlayActions,
90
+ overlaySlice: () => overlaySlice,
91
+ popupActions: () => popupActions,
92
+ popupSlice: () => popupSlice,
93
+ presets: () => presets,
94
+ registerSlice: () => import_state16.registerSlice,
95
+ routeRegistry: () => routeRegistry,
96
+ routing: () => routing,
97
+ screenActions: () => screenActions,
98
+ screenSlice: () => screenSlice,
99
+ screensetRegistry: () => import_screensets3.screensetRegistry,
100
+ screensets: () => screensets,
101
+ setActiveScreen: () => setActiveScreen,
102
+ setDeprecationWarnings: () => setDeprecationWarnings,
103
+ setFooterConfig: () => setFooterConfig,
104
+ setFooterVisible: () => setFooterVisible,
105
+ setHeaderLoading: () => setLoading,
106
+ setMenuCollapsed: () => setMenuCollapsed,
107
+ setMenuConfig: () => setMenuConfig,
108
+ setMenuItems: () => setMenuItems,
109
+ setMenuVisible: () => setMenuVisible,
110
+ setOverlayVisible: () => setOverlayVisible,
111
+ setScreenLoading: () => setScreenLoading,
112
+ setSidebarCollapsed: () => setSidebarCollapsed,
113
+ setSidebarConfig: () => setSidebarConfig,
114
+ setSidebarContent: () => setSidebarContent,
115
+ setSidebarPosition: () => setSidebarPosition,
116
+ setSidebarTitle: () => setSidebarTitle,
117
+ setSidebarVisible: () => setSidebarVisible,
118
+ setSidebarWidth: () => setSidebarWidth,
119
+ setTenant: () => setTenant,
120
+ setTenantLoading: () => setTenantLoading,
121
+ setTenantLoadingState: () => setTenantLoadingState,
122
+ setUser: () => setUser,
123
+ showOverlay: () => showOverlay,
124
+ sidebarActions: () => sidebarActions,
125
+ sidebarSlice: () => sidebarSlice,
126
+ tenantActions: () => tenantActions,
127
+ tenantReducer: () => tenantSlice_default,
128
+ tenantSlice: () => tenantSlice,
129
+ themeRegistry: () => themeRegistry,
130
+ themes: () => themes,
131
+ toggleMenu: () => toggleMenu,
132
+ toggleSidebar: () => toggleSidebar
133
+ });
134
+ module.exports = __toCommonJS(src_exports);
135
+
136
+ // src/createHAI3.ts
137
+ var import_state = require("@hai3/state");
138
+ var import_api = require("@hai3/api");
139
+ function isPluginFactory(value) {
140
+ return typeof value === "function";
141
+ }
142
+ function resolvePlugin(plugin) {
143
+ return isPluginFactory(plugin) ? plugin() : plugin;
144
+ }
145
+ var HAI3AppBuilderImpl = class {
146
+ plugins = [];
147
+ config;
148
+ constructor(config = {}) {
149
+ this.config = {
150
+ name: "HAI3 App",
151
+ devMode: false,
152
+ strictMode: false,
153
+ ...config
154
+ };
155
+ }
156
+ /**
157
+ * Add a plugin to the application.
158
+ * Also accepts an array of plugins (for preset support).
159
+ */
160
+ use(plugin) {
161
+ if (Array.isArray(plugin)) {
162
+ plugin.forEach((p) => this.use(p));
163
+ return this;
164
+ }
165
+ const resolved = resolvePlugin(plugin);
166
+ if (this.plugins.some((p) => p.name === resolved.name)) {
167
+ if (this.config.devMode) {
168
+ console.warn(
169
+ `Plugin "${resolved.name}" is already registered. Skipping duplicate.`
170
+ );
171
+ }
172
+ return this;
173
+ }
174
+ this.plugins.push(resolved);
175
+ return this;
176
+ }
177
+ /**
178
+ * Add multiple plugins at once.
179
+ */
180
+ useAll(plugins) {
181
+ plugins.forEach((plugin) => this.use(plugin));
182
+ return this;
183
+ }
184
+ /**
185
+ * Build the application.
186
+ */
187
+ build() {
188
+ const orderedPlugins = this.resolveDependencies();
189
+ orderedPlugins.forEach((plugin) => {
190
+ if (plugin.onRegister) {
191
+ plugin.onRegister(this, plugin._configType);
192
+ }
193
+ });
194
+ const aggregated = this.aggregateProvides(orderedPlugins);
195
+ const store = this.createStoreWithSlices(aggregated.slices);
196
+ aggregated.effects.forEach((initEffect) => {
197
+ initEffect(store.dispatch);
198
+ });
199
+ const app = {
200
+ config: this.config,
201
+ store,
202
+ screensetRegistry: aggregated.registries.screensetRegistry,
203
+ themeRegistry: aggregated.registries.themeRegistry,
204
+ routeRegistry: aggregated.registries.routeRegistry,
205
+ apiRegistry: import_api.apiRegistry,
206
+ i18nRegistry: aggregated.registries.i18nRegistry,
207
+ actions: aggregated.actions,
208
+ destroy: () => this.destroyApp(orderedPlugins, app)
209
+ };
210
+ orderedPlugins.forEach((plugin) => {
211
+ if (plugin.onInit) {
212
+ plugin.onInit(app);
213
+ }
214
+ });
215
+ return app;
216
+ }
217
+ /**
218
+ * Resolve plugin dependencies using topological sort.
219
+ */
220
+ resolveDependencies() {
221
+ const resolved = [];
222
+ const visited = /* @__PURE__ */ new Set();
223
+ const visiting = /* @__PURE__ */ new Set();
224
+ const visit = (plugin) => {
225
+ if (visited.has(plugin.name)) return;
226
+ if (visiting.has(plugin.name)) {
227
+ throw new Error(
228
+ `Circular dependency detected: ${plugin.name} depends on itself or creates a cycle.`
229
+ );
230
+ }
231
+ visiting.add(plugin.name);
232
+ if (plugin.dependencies) {
233
+ for (const depName of plugin.dependencies) {
234
+ const dep = this.plugins.find((p) => p.name === depName);
235
+ if (!dep) {
236
+ if (this.config.strictMode) {
237
+ throw new Error(
238
+ `Plugin "${plugin.name}" requires "${depName}" but it is not registered.
239
+ Add the missing plugin: .use(${depName}())`
240
+ );
241
+ } else {
242
+ console.warn(
243
+ `Plugin "${plugin.name}" requires "${depName}" but it is not registered. Some features may not work correctly.`
244
+ );
245
+ continue;
246
+ }
247
+ }
248
+ visit(dep);
249
+ }
250
+ }
251
+ visiting.delete(plugin.name);
252
+ visited.add(plugin.name);
253
+ resolved.push(plugin);
254
+ };
255
+ this.plugins.forEach(visit);
256
+ return resolved;
257
+ }
258
+ /**
259
+ * Aggregate all provides from plugins.
260
+ */
261
+ aggregateProvides(plugins) {
262
+ const registries = {};
263
+ const slices = [];
264
+ const effects2 = [];
265
+ const actions = {};
266
+ plugins.forEach((plugin) => {
267
+ if (!plugin.provides) return;
268
+ if (plugin.provides.registries) {
269
+ Object.assign(registries, plugin.provides.registries);
270
+ }
271
+ if (plugin.provides.slices) {
272
+ slices.push(...plugin.provides.slices);
273
+ }
274
+ if (plugin.provides.effects) {
275
+ effects2.push(...plugin.provides.effects);
276
+ }
277
+ if (plugin.provides.actions) {
278
+ Object.assign(actions, plugin.provides.actions);
279
+ }
280
+ });
281
+ return { registries, slices, effects: effects2, actions };
282
+ }
283
+ /**
284
+ * Create store with all aggregated slices.
285
+ *
286
+ * IMPORTANT: This method supports the screenset self-registration pattern.
287
+ * Screensets call registerSlice() as module side effects when imported,
288
+ * which may auto-create a store before createHAI3App() is called.
289
+ *
290
+ * This method:
291
+ * 1. Uses the existing store if one was auto-created by screensets
292
+ * 2. Registers framework slices to the existing store
293
+ * 3. Returns the unified store for HAI3App
294
+ */
295
+ createStoreWithSlices(slices) {
296
+ const store = (0, import_state.getStore)();
297
+ slices.forEach((slice9) => {
298
+ (0, import_state.registerSlice)(slice9);
299
+ });
300
+ return store;
301
+ }
302
+ /**
303
+ * Destroy the app and cleanup resources.
304
+ */
305
+ destroyApp(plugins, app) {
306
+ [...plugins].reverse().forEach((plugin) => {
307
+ if (plugin.onDestroy) {
308
+ plugin.onDestroy(app);
309
+ }
310
+ });
311
+ }
312
+ };
313
+ function createHAI3(config) {
314
+ return new HAI3AppBuilderImpl(config);
315
+ }
316
+
317
+ // src/plugins/screensets.ts
318
+ var import_screensets = require("@hai3/screensets");
319
+
320
+ // src/slices/index.ts
321
+ var import_toolkit = require("@reduxjs/toolkit");
322
+
323
+ // src/slices/headerSlice.ts
324
+ var import_state2 = require("@hai3/state");
325
+ var SLICE_KEY = "layout/header";
326
+ var initialState = {
327
+ user: null,
328
+ loading: false
329
+ };
330
+ var { slice, setUser, setLoading, clearUser } = (0, import_state2.createSlice)({
331
+ name: SLICE_KEY,
332
+ initialState,
333
+ reducers: {
334
+ setUser: (state, action) => {
335
+ state.user = action.payload;
336
+ state.loading = false;
337
+ },
338
+ setLoading: (state, action) => {
339
+ state.loading = action.payload;
340
+ },
341
+ clearUser: (state) => {
342
+ state.user = null;
343
+ state.loading = false;
344
+ }
345
+ }
346
+ });
347
+ var headerSlice = slice;
348
+ var headerActions = { setUser, setLoading, clearUser };
349
+ var headerSlice_default = slice.reducer;
350
+
351
+ // src/slices/footerSlice.ts
352
+ var import_state3 = require("@hai3/state");
353
+ var SLICE_KEY2 = "layout/footer";
354
+ var initialState2 = {
355
+ screensetOptions: [],
356
+ visible: true
357
+ };
358
+ var { slice: slice2, setFooterVisible, setFooterConfig, ...restActions } = (0, import_state3.createSlice)({
359
+ name: SLICE_KEY2,
360
+ initialState: initialState2,
361
+ reducers: {
362
+ setFooterVisible: (state, action) => {
363
+ state.visible = action.payload;
364
+ },
365
+ setFooterConfig: (state, action) => {
366
+ return { ...state, ...action.payload };
367
+ }
368
+ }
369
+ });
370
+ var footerSlice = slice2;
371
+ var footerActions = { setFooterVisible, setFooterConfig, ...restActions };
372
+ var footerSlice_default = slice2.reducer;
373
+
374
+ // src/slices/menuSlice.ts
375
+ var import_state4 = require("@hai3/state");
376
+ var SLICE_KEY3 = "layout/menu";
377
+ var initialState3 = {
378
+ collapsed: false,
379
+ items: [],
380
+ visible: true
381
+ };
382
+ var { slice: slice3, toggleMenu, setMenuCollapsed, setMenuItems, setMenuVisible, setMenuConfig } = (0, import_state4.createSlice)({
383
+ name: SLICE_KEY3,
384
+ initialState: initialState3,
385
+ reducers: {
386
+ toggleMenu: (state) => {
387
+ state.collapsed = !state.collapsed;
388
+ },
389
+ setMenuCollapsed: (state, action) => {
390
+ state.collapsed = action.payload;
391
+ },
392
+ setMenuItems: (state, action) => {
393
+ state.items = action.payload;
394
+ },
395
+ setMenuVisible: (state, action) => {
396
+ state.visible = action.payload;
397
+ },
398
+ setMenuConfig: (state, action) => {
399
+ return { ...state, ...action.payload };
400
+ }
401
+ }
402
+ });
403
+ var menuSlice = slice3;
404
+ var menuActions = { toggleMenu, setMenuCollapsed, setMenuItems, setMenuVisible, setMenuConfig };
405
+ var menuSlice_default = slice3.reducer;
406
+
407
+ // src/slices/sidebarSlice.ts
408
+ var import_state5 = require("@hai3/state");
409
+ var SLICE_KEY4 = "layout/sidebar";
410
+ var initialState4 = {
411
+ collapsed: false,
412
+ position: "left",
413
+ title: null,
414
+ content: null,
415
+ visible: false,
416
+ width: 256
417
+ };
418
+ var {
419
+ slice: slice4,
420
+ toggleSidebar,
421
+ setSidebarCollapsed,
422
+ setSidebarPosition,
423
+ setSidebarTitle,
424
+ setSidebarContent,
425
+ setSidebarVisible,
426
+ setSidebarWidth,
427
+ setSidebarConfig
428
+ } = (0, import_state5.createSlice)({
429
+ name: SLICE_KEY4,
430
+ initialState: initialState4,
431
+ reducers: {
432
+ toggleSidebar: (state) => {
433
+ state.collapsed = !state.collapsed;
434
+ },
435
+ setSidebarCollapsed: (state, action) => {
436
+ state.collapsed = action.payload;
437
+ },
438
+ setSidebarPosition: (state, action) => {
439
+ state.position = action.payload;
440
+ },
441
+ setSidebarTitle: (state, action) => {
442
+ state.title = action.payload;
443
+ },
444
+ setSidebarContent: (state, action) => {
445
+ state.content = action.payload;
446
+ },
447
+ setSidebarVisible: (state, action) => {
448
+ state.visible = action.payload;
449
+ },
450
+ setSidebarWidth: (state, action) => {
451
+ state.width = action.payload;
452
+ },
453
+ setSidebarConfig: (state, action) => {
454
+ return { ...state, ...action.payload };
455
+ }
456
+ }
457
+ });
458
+ var sidebarSlice = slice4;
459
+ var sidebarActions = {
460
+ toggleSidebar,
461
+ setSidebarCollapsed,
462
+ setSidebarPosition,
463
+ setSidebarTitle,
464
+ setSidebarContent,
465
+ setSidebarVisible,
466
+ setSidebarWidth,
467
+ setSidebarConfig
468
+ };
469
+ var sidebarSlice_default = slice4.reducer;
470
+
471
+ // src/slices/screenSlice.ts
472
+ var import_state6 = require("@hai3/state");
473
+ var SLICE_KEY5 = "layout/screen";
474
+ var initialState5 = {
475
+ activeScreen: null,
476
+ loading: false
477
+ };
478
+ var { slice: slice5, setActiveScreen, setScreenLoading, navigateTo, clearActiveScreen } = (0, import_state6.createSlice)({
479
+ name: SLICE_KEY5,
480
+ initialState: initialState5,
481
+ reducers: {
482
+ setActiveScreen: (state, action) => {
483
+ state.activeScreen = action.payload;
484
+ },
485
+ setScreenLoading: (state, action) => {
486
+ state.loading = action.payload;
487
+ },
488
+ navigateTo: (state, action) => {
489
+ state.activeScreen = action.payload;
490
+ },
491
+ clearActiveScreen: (state) => {
492
+ state.activeScreen = null;
493
+ }
494
+ }
495
+ });
496
+ var screenSlice = slice5;
497
+ var screenActions = { setActiveScreen, setScreenLoading, navigateTo, clearActiveScreen };
498
+ var screenSlice_default = slice5.reducer;
499
+
500
+ // src/slices/popupSlice.ts
501
+ var import_state7 = require("@hai3/state");
502
+ var SLICE_KEY6 = "layout/popup";
503
+ var initialState6 = {
504
+ stack: []
505
+ };
506
+ var { slice: slice6, openPopup, closePopup, closeTopPopup, closeAllPopups } = (0, import_state7.createSlice)({
507
+ name: SLICE_KEY6,
508
+ initialState: initialState6,
509
+ reducers: {
510
+ openPopup: (state, action) => {
511
+ const zIndex = 1e3 + state.stack.length * 10;
512
+ state.stack.push({ ...action.payload, zIndex });
513
+ },
514
+ closePopup: (state, action) => {
515
+ state.stack = state.stack.filter((popup) => popup.id !== action.payload);
516
+ },
517
+ closeTopPopup: (state) => {
518
+ state.stack.pop();
519
+ },
520
+ closeAllPopups: (state) => {
521
+ state.stack = [];
522
+ }
523
+ }
524
+ });
525
+ var popupSlice = slice6;
526
+ var popupActions = { openPopup, closePopup, closeTopPopup, closeAllPopups };
527
+ var popupSlice_default = slice6.reducer;
528
+
529
+ // src/slices/overlaySlice.ts
530
+ var import_state8 = require("@hai3/state");
531
+ var SLICE_KEY7 = "layout/overlay";
532
+ var initialState7 = {
533
+ visible: false
534
+ };
535
+ var { slice: slice7, showOverlay, hideOverlay, setOverlayVisible } = (0, import_state8.createSlice)({
536
+ name: SLICE_KEY7,
537
+ initialState: initialState7,
538
+ reducers: {
539
+ showOverlay: (state) => {
540
+ state.visible = true;
541
+ },
542
+ hideOverlay: (state) => {
543
+ state.visible = false;
544
+ },
545
+ setOverlayVisible: (state, action) => {
546
+ state.visible = action.payload;
547
+ }
548
+ }
549
+ });
550
+ var overlaySlice = slice7;
551
+ var overlayActions = { showOverlay, hideOverlay, setOverlayVisible };
552
+ var overlaySlice_default = slice7.reducer;
553
+
554
+ // src/slices/tenantSlice.ts
555
+ var import_state9 = require("@hai3/state");
556
+ var SLICE_KEY8 = "app/tenant";
557
+ var initialState8 = {
558
+ tenant: null,
559
+ loading: false
560
+ };
561
+ var { slice: slice8, setTenant, setTenantLoading, clearTenant } = (0, import_state9.createSlice)({
562
+ name: SLICE_KEY8,
563
+ initialState: initialState8,
564
+ reducers: {
565
+ setTenant: (state, action) => {
566
+ state.tenant = action.payload;
567
+ state.loading = false;
568
+ },
569
+ setTenantLoading: (state, action) => {
570
+ state.loading = action.payload;
571
+ },
572
+ clearTenant: (state) => {
573
+ state.tenant = null;
574
+ state.loading = false;
575
+ }
576
+ }
577
+ });
578
+ var tenantSlice = slice8;
579
+ var tenantActions = { setTenant, setTenantLoading, clearTenant };
580
+ var tenantSlice_default = slice8.reducer;
581
+
582
+ // src/slices/index.ts
583
+ var LAYOUT_SLICE_NAME = "layout";
584
+ var TENANT_SLICE_NAME = "app/tenant";
585
+ var layoutDomainReducers = {
586
+ header: headerSlice_default,
587
+ footer: footerSlice_default,
588
+ menu: menuSlice_default,
589
+ sidebar: sidebarSlice_default,
590
+ screen: screenSlice_default,
591
+ popup: popupSlice_default,
592
+ overlay: overlaySlice_default
593
+ };
594
+ var layoutReducer = (0, import_toolkit.combineReducers)(layoutDomainReducers);
595
+
596
+ // src/plugins/screensets.ts
597
+ var screenSlice2 = screenSlice;
598
+ var screenActions2 = screenActions;
599
+ function screensets(config) {
600
+ const screensetRegistry3 = import_screensets.screensetRegistry;
601
+ return {
602
+ name: "screensets",
603
+ dependencies: [],
604
+ provides: {
605
+ registries: {
606
+ screensetRegistry: screensetRegistry3
607
+ },
608
+ slices: [screenSlice2],
609
+ actions: {
610
+ setActiveScreen: screenActions2.navigateTo,
611
+ setScreenLoading: screenActions2.setScreenLoading
612
+ }
613
+ },
614
+ onInit() {
615
+ if (config?.autoDiscover) {
616
+ console.log(
617
+ "[HAI3] Auto-discover is enabled. Screensets should be registered via screensetRegistry.register() in your app."
618
+ );
619
+ }
620
+ }
621
+ };
622
+ }
623
+
624
+ // src/plugins/themes.ts
625
+ var import_state11 = require("@hai3/state");
626
+
627
+ // src/compat.ts
628
+ var import_state10 = require("@hai3/state");
629
+ var import_api2 = require("@hai3/api");
630
+ var import_screensets2 = require("@hai3/screensets");
631
+
632
+ // src/registries/themeRegistry.ts
633
+ function createThemeRegistry() {
634
+ const themes2 = /* @__PURE__ */ new Map();
635
+ const legacyThemes = /* @__PURE__ */ new Map();
636
+ let currentThemeId = null;
637
+ let customApplyFn = null;
638
+ const subscribers = /* @__PURE__ */ new Set();
639
+ let version = 0;
640
+ function notifySubscribers() {
641
+ version++;
642
+ subscribers.forEach((callback) => callback());
643
+ }
644
+ function applyCSSVariables(config) {
645
+ if (typeof document === "undefined") return;
646
+ const root = document.documentElement;
647
+ Object.entries(config.variables).forEach(([key, value]) => {
648
+ root.style.setProperty(key, value);
649
+ });
650
+ }
651
+ return {
652
+ /**
653
+ * Register a theme.
654
+ * Supports both new API (config only) and legacy API (id + theme).
655
+ */
656
+ register(configOrId, legacyTheme) {
657
+ if (typeof configOrId === "string") {
658
+ const id = configOrId;
659
+ if (!legacyTheme) {
660
+ console.warn(`register() called with ID "${id}" but no theme object. Skipping.`);
661
+ return;
662
+ }
663
+ if (themes2.has(id)) {
664
+ console.warn(`Theme "${id}" is already registered. Skipping.`);
665
+ return;
666
+ }
667
+ legacyThemes.set(id, legacyTheme);
668
+ let themeName = id;
669
+ if (legacyTheme && typeof legacyTheme === "object" && "name" in legacyTheme) {
670
+ const nameValue = legacyTheme.name;
671
+ if (typeof nameValue === "string") {
672
+ themeName = nameValue;
673
+ }
674
+ }
675
+ const config2 = {
676
+ id,
677
+ name: themeName,
678
+ variables: {}
679
+ // Legacy themes use custom apply function
680
+ };
681
+ themes2.set(id, config2);
682
+ return;
683
+ }
684
+ const config = configOrId;
685
+ if (themes2.has(config.id)) {
686
+ console.warn(`Theme "${config.id}" is already registered. Skipping.`);
687
+ return;
688
+ }
689
+ themes2.set(config.id, config);
690
+ if (config.default && currentThemeId === null) {
691
+ this.apply(config.id);
692
+ }
693
+ },
694
+ /**
695
+ * Set the apply function (legacy API).
696
+ */
697
+ setApplyFunction(applyFn) {
698
+ customApplyFn = applyFn;
699
+ },
700
+ /**
701
+ * Get theme by ID.
702
+ */
703
+ get(id) {
704
+ return themes2.get(id);
705
+ },
706
+ /**
707
+ * Get all themes.
708
+ */
709
+ getAll() {
710
+ return Array.from(themes2.values());
711
+ },
712
+ /**
713
+ * Apply a theme.
714
+ */
715
+ apply(id) {
716
+ const config = themes2.get(id);
717
+ if (!config) {
718
+ console.warn(`Theme "${id}" not found. Cannot apply.`);
719
+ return;
720
+ }
721
+ const legacyTheme = legacyThemes.get(id);
722
+ if (legacyTheme && customApplyFn) {
723
+ customApplyFn(legacyTheme, id);
724
+ } else if (config.variables && Object.keys(config.variables).length > 0) {
725
+ applyCSSVariables(config);
726
+ }
727
+ currentThemeId = id;
728
+ notifySubscribers();
729
+ },
730
+ /**
731
+ * Get current theme.
732
+ */
733
+ getCurrent() {
734
+ return currentThemeId ? themes2.get(currentThemeId) : void 0;
735
+ },
736
+ /**
737
+ * Subscribe to theme changes.
738
+ * Returns unsubscribe function.
739
+ */
740
+ subscribe(callback) {
741
+ subscribers.add(callback);
742
+ return () => {
743
+ subscribers.delete(callback);
744
+ };
745
+ },
746
+ /**
747
+ * Get current version number.
748
+ * Used by React for re-rendering.
749
+ */
750
+ getVersion() {
751
+ return version;
752
+ }
753
+ };
754
+ }
755
+
756
+ // src/registries/routeRegistry.ts
757
+ function createRouteRegistry(screensetRegistry3) {
758
+ let routes = null;
759
+ function buildRoutes() {
760
+ if (routes !== null) {
761
+ return routes;
762
+ }
763
+ routes = [];
764
+ const screensets2 = screensetRegistry3.getAll();
765
+ screensets2.forEach((screenset) => {
766
+ screenset.menu.forEach((menuScreenItem) => {
767
+ const screenId = menuScreenItem.menuItem.screenId ?? menuScreenItem.menuItem.id;
768
+ if (screenId && menuScreenItem.screen) {
769
+ routes.push({
770
+ screensetId: screenset.id,
771
+ screenId,
772
+ loader: menuScreenItem.screen
773
+ });
774
+ }
775
+ });
776
+ });
777
+ return routes;
778
+ }
779
+ return {
780
+ /**
781
+ * Check if a screen exists by screenId only (globally unique).
782
+ */
783
+ hasScreenById(screenId) {
784
+ const allRoutes = buildRoutes();
785
+ return allRoutes.some((route) => route.screenId === screenId);
786
+ },
787
+ /**
788
+ * Check if a screen exists (legacy, requires both IDs).
789
+ */
790
+ hasScreen(screensetId, screenId) {
791
+ const allRoutes = buildRoutes();
792
+ return allRoutes.some(
793
+ (route) => route.screensetId === screensetId && route.screenId === screenId
794
+ );
795
+ },
796
+ /**
797
+ * Get screenset ID for a given screen ID (reverse lookup).
798
+ * Screen IDs are globally unique across all screensets.
799
+ */
800
+ getScreensetForScreen(screenId) {
801
+ const allRoutes = buildRoutes();
802
+ const route = allRoutes.find((r) => r.screenId === screenId);
803
+ return route?.screensetId;
804
+ },
805
+ /**
806
+ * Get screen loader by screenId only.
807
+ */
808
+ getScreenById(screenId) {
809
+ const allRoutes = buildRoutes();
810
+ const route = allRoutes.find((r) => r.screenId === screenId);
811
+ return route?.loader;
812
+ },
813
+ /**
814
+ * Get screen loader (legacy, requires both IDs).
815
+ */
816
+ getScreen(screensetId, screenId) {
817
+ const allRoutes = buildRoutes();
818
+ const route = allRoutes.find(
819
+ (r) => r.screensetId === screensetId && r.screenId === screenId
820
+ );
821
+ return route?.loader;
822
+ },
823
+ /**
824
+ * Get all routes.
825
+ */
826
+ getAll() {
827
+ const allRoutes = buildRoutes();
828
+ return allRoutes.map(({ screensetId, screenId }) => ({
829
+ screensetId,
830
+ screenId
831
+ }));
832
+ }
833
+ };
834
+ }
835
+
836
+ // src/compat.ts
837
+ var import_screensets3 = require("@hai3/screensets");
838
+ var screenActions3 = screenActions;
839
+ var ACCOUNTS_DOMAIN = "accounts";
840
+ var themeRegistry = createThemeRegistry();
841
+ var routeRegistry = createRouteRegistry(import_screensets2.screensetRegistry);
842
+ var navigateToScreen = (screenId) => {
843
+ (0, import_state10.getStore)().dispatch(screenActions3.setActiveScreen(screenId));
844
+ };
845
+ var fetchCurrentUser = () => (_dispatch) => {
846
+ try {
847
+ const accountsService = import_api2.apiRegistry.getService(ACCOUNTS_DOMAIN);
848
+ const service = accountsService;
849
+ service.getCurrentUser?.();
850
+ } catch {
851
+ console.warn("fetchCurrentUser: accounts service not registered");
852
+ }
853
+ };
854
+
855
+ // src/plugins/themes.ts
856
+ function changeTheme(payload) {
857
+ import_state11.eventBus.emit("theme/changed", payload);
858
+ }
859
+ function themes() {
860
+ const themeRegistry2 = themeRegistry;
861
+ return {
862
+ name: "themes",
863
+ dependencies: [],
864
+ provides: {
865
+ registries: {
866
+ themeRegistry: themeRegistry2
867
+ },
868
+ actions: {
869
+ changeTheme
870
+ }
871
+ },
872
+ onInit(_app) {
873
+ import_state11.eventBus.on("theme/changed", (payload) => {
874
+ themeRegistry2.apply(payload.themeId);
875
+ });
876
+ const themes2 = themeRegistry2.getAll();
877
+ if (themes2.length > 0) {
878
+ themeRegistry2.apply(themes2[0].id);
879
+ }
880
+ }
881
+ };
882
+ }
883
+
884
+ // src/plugins/layout.ts
885
+ var import_state12 = require("@hai3/state");
886
+ var headerSlice2 = headerSlice;
887
+ var footerSlice2 = footerSlice;
888
+ var menuSlice2 = menuSlice;
889
+ var sidebarSlice2 = sidebarSlice;
890
+ var popupSlice2 = popupSlice;
891
+ var overlaySlice2 = overlaySlice;
892
+ var headerActions2 = headerActions;
893
+ var footerActions2 = footerActions;
894
+ var menuActions2 = menuActions;
895
+ var sidebarActions2 = sidebarActions;
896
+ var popupActions2 = popupActions;
897
+ var overlayActions2 = overlayActions;
898
+ function showPopup(payload) {
899
+ import_state12.eventBus.emit("layout/popup/requested", payload);
900
+ }
901
+ function hidePopup() {
902
+ import_state12.eventBus.emit("layout/popup/hidden");
903
+ }
904
+ function showOverlay2(payload) {
905
+ import_state12.eventBus.emit("layout/overlay/requested", payload);
906
+ }
907
+ function hideOverlay2() {
908
+ import_state12.eventBus.emit("layout/overlay/hidden");
909
+ }
910
+ function toggleMenuCollapsed(payload) {
911
+ import_state12.eventBus.emit("layout/menu/collapsed", payload);
912
+ }
913
+ function toggleSidebarCollapsed(payload) {
914
+ import_state12.eventBus.emit("layout/sidebar/collapsed", payload);
915
+ }
916
+ function layout() {
917
+ return {
918
+ name: "layout",
919
+ dependencies: ["screensets"],
920
+ provides: {
921
+ slices: [
922
+ headerSlice2,
923
+ footerSlice2,
924
+ menuSlice2,
925
+ sidebarSlice2,
926
+ popupSlice2,
927
+ overlaySlice2
928
+ ],
929
+ actions: {
930
+ showPopup,
931
+ hidePopup,
932
+ showOverlay: showOverlay2,
933
+ hideOverlay: hideOverlay2,
934
+ toggleMenuCollapsed,
935
+ toggleSidebarCollapsed,
936
+ // Direct slice actions for backward compatibility
937
+ setHeaderVisible: headerActions2.setVisible,
938
+ setFooterVisible: footerActions2.setVisible,
939
+ setMenuCollapsed: menuActions2.setCollapsed,
940
+ setSidebarCollapsed: sidebarActions2.setCollapsed
941
+ }
942
+ },
943
+ onInit(app) {
944
+ const dispatch = app.store.dispatch;
945
+ import_state12.eventBus.on("layout/popup/requested", (payload) => {
946
+ dispatch(popupActions2.open({
947
+ id: payload.id,
948
+ title: payload.title,
949
+ content: payload.content,
950
+ size: payload.size
951
+ }));
952
+ });
953
+ import_state12.eventBus.on("layout/popup/hidden", () => {
954
+ dispatch(popupActions2.close());
955
+ });
956
+ import_state12.eventBus.on("layout/overlay/requested", (payload) => {
957
+ dispatch(overlayActions2.show({ id: payload.id }));
958
+ });
959
+ import_state12.eventBus.on("layout/overlay/hidden", () => {
960
+ dispatch(overlayActions2.hide());
961
+ });
962
+ import_state12.eventBus.on("layout/menu/collapsed", (payload) => {
963
+ dispatch(menuActions2.setCollapsed(payload.collapsed));
964
+ });
965
+ import_state12.eventBus.on("layout/sidebar/collapsed", (payload) => {
966
+ dispatch(sidebarActions2.setCollapsed(payload.collapsed));
967
+ });
968
+ }
969
+ };
970
+ }
971
+
972
+ // src/plugins/navigation.ts
973
+ var import_state13 = require("@hai3/state");
974
+ var import_i18n = require("@hai3/i18n");
975
+ var screenActions4 = screenActions;
976
+ var menuActions3 = menuActions;
977
+ function buildMenuItems(screenset) {
978
+ return screenset.menu.map((item) => ({
979
+ id: item.menuItem.screenId ?? item.menuItem.id,
980
+ label: item.menuItem.label,
981
+ icon: item.menuItem.icon
982
+ }));
983
+ }
984
+ function navigateToScreen2(payload) {
985
+ import_state13.eventBus.emit("navigation/screen/navigated", payload);
986
+ }
987
+ function navigateToScreenset(payload) {
988
+ import_state13.eventBus.emit("navigation/screenset/navigated", payload);
989
+ }
990
+ function navigation() {
991
+ return {
992
+ name: "navigation",
993
+ dependencies: ["screensets"],
994
+ provides: {
995
+ actions: {
996
+ navigateToScreen: navigateToScreen2,
997
+ navigateToScreenset
998
+ }
999
+ },
1000
+ onInit(app) {
1001
+ const dispatch = app.store.dispatch;
1002
+ let currentScreensetId = null;
1003
+ async function loadScreensetTranslations(screensetId, language) {
1004
+ await import_i18n.i18nRegistry.loadScreensetTranslations(screensetId, language);
1005
+ }
1006
+ function updateMenuForScreenset(screensetId) {
1007
+ if (screensetId === currentScreensetId) return;
1008
+ const screenset = app.screensetRegistry.get(screensetId);
1009
+ if (!screenset) return;
1010
+ currentScreensetId = screensetId;
1011
+ loadScreensetTranslations(screensetId).catch((err) => {
1012
+ console.warn(`[HAI3] Failed to load translations for screenset ${screensetId}:`, err);
1013
+ });
1014
+ const menuItems = buildMenuItems(screenset);
1015
+ dispatch(menuActions3.setMenuItems(menuItems));
1016
+ }
1017
+ import_state13.eventBus.on("navigation/screen/navigated", (payload) => {
1018
+ if (app.routeRegistry && !app.routeRegistry.hasScreen(payload.screensetId, payload.screenId)) {
1019
+ console.warn(
1020
+ `Screen "${payload.screenId}" in screenset "${payload.screensetId}" not found.`
1021
+ );
1022
+ return;
1023
+ }
1024
+ updateMenuForScreenset(payload.screensetId);
1025
+ dispatch(screenActions4.navigateTo(payload.screenId));
1026
+ if (typeof window !== "undefined") {
1027
+ const url = `/${payload.screenId}`;
1028
+ window.history.pushState(null, "", url);
1029
+ }
1030
+ });
1031
+ import_state13.eventBus.on("navigation/screenset/navigated", (payload) => {
1032
+ const screenset = app.screensetRegistry.get(payload.screensetId);
1033
+ if (!screenset) {
1034
+ console.warn(`Screenset "${payload.screensetId}" not found.`);
1035
+ return;
1036
+ }
1037
+ navigateToScreen2({
1038
+ screensetId: payload.screensetId,
1039
+ screenId: screenset.defaultScreen
1040
+ });
1041
+ });
1042
+ let lastLoadedLanguage = null;
1043
+ import_i18n.i18nRegistry.subscribe(() => {
1044
+ const currentLanguage = import_i18n.i18nRegistry.getLanguage();
1045
+ if (!currentLanguage || currentLanguage === lastLoadedLanguage) return;
1046
+ if (!currentScreensetId) return;
1047
+ const screenset = app.screensetRegistry.get(currentScreensetId);
1048
+ if (!screenset) return;
1049
+ lastLoadedLanguage = currentLanguage;
1050
+ loadScreensetTranslations(currentScreensetId, currentLanguage).then(() => {
1051
+ const menuItems = buildMenuItems(screenset);
1052
+ dispatch(menuActions3.setMenuItems(menuItems));
1053
+ }).catch((err) => {
1054
+ console.warn(
1055
+ `[HAI3] Failed to reload translations for screenset ${currentScreensetId}:`,
1056
+ err
1057
+ );
1058
+ });
1059
+ });
1060
+ if (typeof window !== "undefined") {
1061
+ window.addEventListener("popstate", () => {
1062
+ const path2 = window.location.pathname;
1063
+ const parts2 = path2.split("/").filter(Boolean);
1064
+ if (parts2.length >= 1) {
1065
+ const screenId = parts2[0];
1066
+ const screensetId = app.routeRegistry?.getScreensetForScreen(screenId);
1067
+ if (screensetId) {
1068
+ updateMenuForScreenset(screensetId);
1069
+ dispatch(screenActions4.navigateTo(screenId));
1070
+ }
1071
+ }
1072
+ });
1073
+ const path = window.location.pathname;
1074
+ const parts = path.split("/").filter(Boolean);
1075
+ const autoNavigate = app.config.autoNavigate !== false;
1076
+ if (parts.length >= 1) {
1077
+ const screenId = parts[0];
1078
+ const screensetId = app.routeRegistry?.getScreensetForScreen(screenId);
1079
+ if (screensetId) {
1080
+ navigateToScreen2({ screensetId, screenId });
1081
+ } else if (autoNavigate) {
1082
+ const screensets2 = app.screensetRegistry.getAll();
1083
+ if (screensets2.length > 0) {
1084
+ navigateToScreenset({ screensetId: screensets2[0].id });
1085
+ }
1086
+ }
1087
+ } else if (autoNavigate) {
1088
+ const screensets2 = app.screensetRegistry.getAll();
1089
+ if (screensets2.length > 0) {
1090
+ navigateToScreenset({ screensetId: screensets2[0].id });
1091
+ }
1092
+ }
1093
+ }
1094
+ }
1095
+ };
1096
+ }
1097
+
1098
+ // src/plugins/routing.ts
1099
+ function routing() {
1100
+ return {
1101
+ name: "routing",
1102
+ dependencies: ["screensets"],
1103
+ onRegister(_app) {
1104
+ },
1105
+ onInit(app) {
1106
+ const routeRegistry2 = createRouteRegistry(app.screensetRegistry);
1107
+ app.routeRegistry = routeRegistry2;
1108
+ }
1109
+ };
1110
+ }
1111
+
1112
+ // src/plugins/i18n.ts
1113
+ var import_state14 = require("@hai3/state");
1114
+ var import_i18n2 = require("@hai3/i18n");
1115
+ function setLanguage(payload) {
1116
+ import_state14.eventBus.emit("i18n/language/changed", payload);
1117
+ }
1118
+ function i18n() {
1119
+ const i18nRegistry3 = import_i18n2.i18nRegistry;
1120
+ return {
1121
+ name: "i18n",
1122
+ dependencies: [],
1123
+ provides: {
1124
+ registries: {
1125
+ i18nRegistry: i18nRegistry3
1126
+ },
1127
+ actions: {
1128
+ setLanguage
1129
+ }
1130
+ },
1131
+ onInit(_app) {
1132
+ import_state14.eventBus.on("i18n/language/changed", async (payload) => {
1133
+ await i18nRegistry3.setLanguage(payload.language);
1134
+ });
1135
+ i18nRegistry3.setLanguage(import_i18n2.Language.English).catch((err) => {
1136
+ console.warn("[HAI3] Failed to load initial translations:", err);
1137
+ });
1138
+ }
1139
+ };
1140
+ }
1141
+
1142
+ // src/plugins/effects.ts
1143
+ function effects() {
1144
+ return {
1145
+ name: "effects",
1146
+ dependencies: [],
1147
+ onInit(app) {
1148
+ if (app.config.devMode) {
1149
+ console.log("[HAI3] Effects plugin initialized");
1150
+ }
1151
+ }
1152
+ };
1153
+ }
1154
+
1155
+ // src/presets/index.ts
1156
+ function full() {
1157
+ return [
1158
+ effects(),
1159
+ screensets({ autoDiscover: true }),
1160
+ themes(),
1161
+ layout(),
1162
+ routing(),
1163
+ navigation(),
1164
+ i18n()
1165
+ ];
1166
+ }
1167
+ function minimal() {
1168
+ return [
1169
+ screensets({ autoDiscover: true }),
1170
+ themes()
1171
+ ];
1172
+ }
1173
+ function headless() {
1174
+ return [
1175
+ screensets()
1176
+ ];
1177
+ }
1178
+ var presets = {
1179
+ full,
1180
+ minimal,
1181
+ headless
1182
+ };
1183
+
1184
+ // src/createHAI3App.ts
1185
+ function createHAI3App(config) {
1186
+ return createHAI3(config).useAll(full()).build();
1187
+ }
1188
+
1189
+ // src/registries/index.ts
1190
+ var import_screensets6 = require("@hai3/screensets");
1191
+
1192
+ // src/index.ts
1193
+ var import_state16 = require("@hai3/state");
1194
+ var import_screensets7 = require("@hai3/screensets");
1195
+
1196
+ // src/effects/tenantEffects.ts
1197
+ var import_state15 = require("@hai3/state");
1198
+ var TenantEvents = {
1199
+ Changed: "app/tenant/changed",
1200
+ Cleared: "app/tenant/cleared"
1201
+ };
1202
+ function initTenantEffects() {
1203
+ const store = (0, import_state15.getStore)();
1204
+ const subChanged = import_state15.eventBus.on(TenantEvents.Changed, (payload) => {
1205
+ store.dispatch(setTenant(payload.tenant));
1206
+ });
1207
+ const subCleared = import_state15.eventBus.on(TenantEvents.Cleared, () => {
1208
+ store.dispatch(clearTenant());
1209
+ });
1210
+ return () => {
1211
+ subChanged.unsubscribe();
1212
+ subCleared.unsubscribe();
1213
+ };
1214
+ }
1215
+ function changeTenant(tenant) {
1216
+ import_state15.eventBus.emit(TenantEvents.Changed, { tenant });
1217
+ }
1218
+ function clearTenantAction() {
1219
+ import_state15.eventBus.emit(TenantEvents.Cleared, {});
1220
+ }
1221
+ function setTenantLoadingState(loading) {
1222
+ (0, import_state15.getStore)().dispatch(setTenantLoading(loading));
1223
+ }
1224
+
1225
+ // src/index.ts
1226
+ var import_api3 = require("@hai3/api");
1227
+ var import_i18n5 = require("@hai3/i18n");
1228
+ var import_i18n6 = require("@hai3/i18n");
1229
+
1230
+ // src/migration.ts
1231
+ var STATE_PATH_MAPPING = {
1232
+ // App state (moved to app slice)
1233
+ "uicore.app.user": "app.user",
1234
+ "uicore.app.tenant": "app.tenant",
1235
+ "uicore.app.language": "app.language",
1236
+ "uicore.app.translationsReady": "app.translationsReady",
1237
+ "uicore.app.loading": "app.loading",
1238
+ "uicore.app.error": "app.error",
1239
+ "uicore.app.useMockApi": "app.useMockApi",
1240
+ // Layout state (split into domains)
1241
+ "uicore.layout.theme": "app.theme",
1242
+ "uicore.layout.currentScreenset": "app.currentScreenset",
1243
+ "uicore.layout.selectedScreen": "layout.screen.activeScreen",
1244
+ // Domain states (moved to layout.*)
1245
+ "uicore.header": "layout.header",
1246
+ "uicore.footer": "layout.footer",
1247
+ "uicore.menu": "layout.menu",
1248
+ "uicore.sidebar": "layout.sidebar",
1249
+ "uicore.screen": "layout.screen",
1250
+ "uicore.popup": "layout.popup",
1251
+ "uicore.overlay": "layout.overlay"
1252
+ };
1253
+ var deprecationWarningsEnabled = true;
1254
+ function setDeprecationWarnings(enabled) {
1255
+ deprecationWarningsEnabled = enabled;
1256
+ }
1257
+ function isDeprecationWarningsEnabled() {
1258
+ return deprecationWarningsEnabled;
1259
+ }
1260
+ function createLegacySelector(legacyPath, newSelector, migrationHint) {
1261
+ let hasWarned = false;
1262
+ return (state) => {
1263
+ if (deprecationWarningsEnabled && !hasWarned && process.env.NODE_ENV === "development") {
1264
+ hasWarned = true;
1265
+ const newPath = STATE_PATH_MAPPING[legacyPath] ?? "unknown";
1266
+ const hint = migrationHint ?? `Use the new state path: ${newPath}`;
1267
+ console.warn(
1268
+ `[HAI3 Migration] Deprecated selector accessing "${legacyPath}". ${hint}`
1269
+ );
1270
+ }
1271
+ return newSelector(state);
1272
+ };
1273
+ }
1274
+ function getLayoutDomainState(state, domain) {
1275
+ return state.layout[domain];
1276
+ }
1277
+ function hasLegacyUicoreState(state) {
1278
+ return typeof state === "object" && state !== null && "uicore" in state && typeof state.uicore === "object";
1279
+ }
1280
+ function hasNewLayoutState(state) {
1281
+ return typeof state === "object" && state !== null && "layout" in state && typeof state.layout === "object";
1282
+ }
1283
+ var legacySelectors = {};
1284
+ // Annotate the CommonJS export names for ESM import in node:
1285
+ 0 && (module.exports = {
1286
+ ACCOUNTS_DOMAIN,
1287
+ BaseApiService,
1288
+ I18nRegistry,
1289
+ I18nRegistryImpl,
1290
+ LAYOUT_SLICE_NAME,
1291
+ Language,
1292
+ LanguageDisplayMode,
1293
+ LayoutDomain,
1294
+ MockPlugin,
1295
+ RestProtocol,
1296
+ STATE_PATH_MAPPING,
1297
+ SUPPORTED_LANGUAGES,
1298
+ ScreensetCategory,
1299
+ SseProtocol,
1300
+ TENANT_SLICE_NAME,
1301
+ TenantEvents,
1302
+ TextDirection,
1303
+ apiRegistry,
1304
+ changeTenant,
1305
+ clearActiveScreen,
1306
+ clearTenant,
1307
+ clearTenantAction,
1308
+ clearUser,
1309
+ closeAllPopups,
1310
+ closePopup,
1311
+ closeTopPopup,
1312
+ createHAI3,
1313
+ createHAI3App,
1314
+ createI18nRegistry,
1315
+ createLegacySelector,
1316
+ createRouteRegistry,
1317
+ createScreensetRegistry,
1318
+ createSlice,
1319
+ createStore,
1320
+ createThemeRegistry,
1321
+ effects,
1322
+ eventBus,
1323
+ fetchCurrentUser,
1324
+ footerActions,
1325
+ footerSlice,
1326
+ full,
1327
+ getLanguageMetadata,
1328
+ getLayoutDomainState,
1329
+ getStore,
1330
+ hasLegacyUicoreState,
1331
+ hasNewLayoutState,
1332
+ hasSlice,
1333
+ headerActions,
1334
+ headerSlice,
1335
+ headless,
1336
+ hideOverlay,
1337
+ i18n,
1338
+ i18nRegistry,
1339
+ initTenantEffects,
1340
+ isDeprecationWarningsEnabled,
1341
+ layout,
1342
+ layoutDomainReducers,
1343
+ layoutReducer,
1344
+ legacySelectors,
1345
+ menuActions,
1346
+ menuSlice,
1347
+ minimal,
1348
+ navigateTo,
1349
+ navigateToScreen,
1350
+ navigation,
1351
+ openPopup,
1352
+ overlayActions,
1353
+ overlaySlice,
1354
+ popupActions,
1355
+ popupSlice,
1356
+ presets,
1357
+ registerSlice,
1358
+ routeRegistry,
1359
+ routing,
1360
+ screenActions,
1361
+ screenSlice,
1362
+ screensetRegistry,
1363
+ screensets,
1364
+ setActiveScreen,
1365
+ setDeprecationWarnings,
1366
+ setFooterConfig,
1367
+ setFooterVisible,
1368
+ setHeaderLoading,
1369
+ setMenuCollapsed,
1370
+ setMenuConfig,
1371
+ setMenuItems,
1372
+ setMenuVisible,
1373
+ setOverlayVisible,
1374
+ setScreenLoading,
1375
+ setSidebarCollapsed,
1376
+ setSidebarConfig,
1377
+ setSidebarContent,
1378
+ setSidebarPosition,
1379
+ setSidebarTitle,
1380
+ setSidebarVisible,
1381
+ setSidebarWidth,
1382
+ setTenant,
1383
+ setTenantLoading,
1384
+ setTenantLoadingState,
1385
+ setUser,
1386
+ showOverlay,
1387
+ sidebarActions,
1388
+ sidebarSlice,
1389
+ tenantActions,
1390
+ tenantReducer,
1391
+ tenantSlice,
1392
+ themeRegistry,
1393
+ themes,
1394
+ toggleMenu,
1395
+ toggleSidebar
1396
+ });
1397
+ //# sourceMappingURL=index.cjs.map