@omerdlw/base-framework 1.0.1 → 1.0.2

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.
Files changed (141) hide show
  1. package/dist/atoms/index.d.ts +0 -1
  2. package/dist/atoms/index.d.ts.map +1 -1
  3. package/dist/atoms/index.js +1 -64
  4. package/dist/atoms/index.js.map +1 -1
  5. package/dist/error/index.js +22 -25
  6. package/dist/error/index.js.map +1 -1
  7. package/dist/hooks/index.d.ts +2 -0
  8. package/dist/hooks/index.d.ts.map +1 -1
  9. package/dist/hooks/index.js +97 -4
  10. package/dist/hooks/index.js.map +1 -1
  11. package/dist/hooks/types.d.ts +11 -0
  12. package/dist/hooks/types.d.ts.map +1 -1
  13. package/dist/hooks/use-controllable-state.d.ts +1 -1
  14. package/dist/hooks/use-controllable-state.d.ts.map +1 -1
  15. package/dist/hooks/use-hotkey.d.ts +1 -1
  16. package/dist/hooks/use-hotkey.d.ts.map +1 -1
  17. package/dist/index.js +10811 -10696
  18. package/dist/index.js.map +1 -1
  19. package/dist/kernel/adapters.d.ts.map +1 -1
  20. package/dist/kernel/index.d.ts +1 -0
  21. package/dist/kernel/index.d.ts.map +1 -1
  22. package/dist/kernel/index.js +13 -84
  23. package/dist/kernel/index.js.map +1 -1
  24. package/dist/kernel/installed.d.ts.map +1 -1
  25. package/dist/kernel/page-controller.d.ts.map +1 -1
  26. package/dist/kernel/provider.d.ts.map +1 -1
  27. package/dist/modules/ambient/constants.d.ts +1 -1
  28. package/dist/modules/ambient/constants.d.ts.map +1 -1
  29. package/dist/modules/ambient/index.js +180 -326
  30. package/dist/modules/ambient/index.js.map +1 -1
  31. package/dist/modules/ambient/module.d.ts.map +1 -1
  32. package/dist/modules/background/constants.d.ts +4 -2
  33. package/dist/modules/background/constants.d.ts.map +1 -1
  34. package/dist/modules/background/context.d.ts +3 -0
  35. package/dist/modules/background/context.d.ts.map +1 -1
  36. package/dist/modules/background/hooks.d.ts +1 -1
  37. package/dist/modules/background/index.d.ts +2 -2
  38. package/dist/modules/background/index.d.ts.map +1 -1
  39. package/dist/modules/background/index.js +1172 -1270
  40. package/dist/modules/background/index.js.map +1 -1
  41. package/dist/modules/background/overlay.d.ts +1 -1
  42. package/dist/modules/background/overlay.d.ts.map +1 -1
  43. package/dist/modules/background/types.d.ts +1 -1
  44. package/dist/modules/background/types.d.ts.map +1 -1
  45. package/dist/modules/context-menu/constants.d.ts +1 -1
  46. package/dist/modules/context-menu/constants.d.ts.map +1 -1
  47. package/dist/modules/context-menu/context.d.ts.map +1 -1
  48. package/dist/modules/context-menu/hooks.d.ts.map +1 -1
  49. package/dist/modules/context-menu/index.js +135 -240
  50. package/dist/modules/context-menu/index.js.map +1 -1
  51. package/dist/modules/controls/constants.d.ts +1 -1
  52. package/dist/modules/controls/constants.d.ts.map +1 -1
  53. package/dist/modules/controls/hooks.d.ts +1 -1
  54. package/dist/modules/controls/index.js +31 -165
  55. package/dist/modules/controls/index.js.map +1 -1
  56. package/dist/modules/controls/types.d.ts +1 -1
  57. package/dist/modules/controls/types.d.ts.map +1 -1
  58. package/dist/modules/dock/cards.d.ts +1 -1
  59. package/dist/modules/dock/constants.d.ts +1 -1
  60. package/dist/modules/dock/constants.d.ts.map +1 -1
  61. package/dist/modules/dock/context.d.ts +10 -6
  62. package/dist/modules/dock/context.d.ts.map +1 -1
  63. package/dist/modules/dock/hooks.d.ts +4 -4
  64. package/dist/modules/dock/hooks.d.ts.map +1 -1
  65. package/dist/modules/dock/index.d.ts +1 -1
  66. package/dist/modules/dock/index.d.ts.map +1 -1
  67. package/dist/modules/dock/index.js +2063 -2083
  68. package/dist/modules/dock/index.js.map +1 -1
  69. package/dist/modules/dock/runtime/dock.d.ts.map +1 -1
  70. package/dist/modules/dock/types.d.ts +1 -1
  71. package/dist/modules/dock/types.d.ts.map +1 -1
  72. package/dist/modules/index.js +10193 -10350
  73. package/dist/modules/index.js.map +1 -1
  74. package/dist/modules/loading/constants.d.ts +4 -2
  75. package/dist/modules/loading/constants.d.ts.map +1 -1
  76. package/dist/modules/loading/context.d.ts +3 -0
  77. package/dist/modules/loading/context.d.ts.map +1 -1
  78. package/dist/modules/loading/hooks.d.ts +1 -1
  79. package/dist/modules/loading/hooks.d.ts.map +1 -1
  80. package/dist/modules/loading/index.d.ts +2 -2
  81. package/dist/modules/loading/index.d.ts.map +1 -1
  82. package/dist/modules/loading/index.js +121 -225
  83. package/dist/modules/loading/index.js.map +1 -1
  84. package/dist/modules/loading/types.d.ts +1 -1
  85. package/dist/modules/loading/types.d.ts.map +1 -1
  86. package/dist/modules/media/constants.d.ts +2 -1
  87. package/dist/modules/media/constants.d.ts.map +1 -1
  88. package/dist/modules/media/context.d.ts +3 -0
  89. package/dist/modules/media/context.d.ts.map +1 -1
  90. package/dist/modules/media/index.d.ts +2 -2
  91. package/dist/modules/media/index.d.ts.map +1 -1
  92. package/dist/modules/media/index.js +61 -218
  93. package/dist/modules/media/index.js.map +1 -1
  94. package/dist/modules/modal/constants.d.ts +1 -1
  95. package/dist/modules/modal/constants.d.ts.map +1 -1
  96. package/dist/modules/modal/context.d.ts.map +1 -1
  97. package/dist/modules/modal/hooks.d.ts +2 -2
  98. package/dist/modules/modal/index.js +31 -293
  99. package/dist/modules/modal/index.js.map +1 -1
  100. package/dist/modules/notification/constants.d.ts +4 -2
  101. package/dist/modules/notification/constants.d.ts.map +1 -1
  102. package/dist/modules/notification/context.d.ts +4 -0
  103. package/dist/modules/notification/context.d.ts.map +1 -1
  104. package/dist/modules/notification/hooks.d.ts +1 -1
  105. package/dist/modules/notification/index.d.ts +2 -3
  106. package/dist/modules/notification/index.d.ts.map +1 -1
  107. package/dist/modules/notification/index.js +65 -151
  108. package/dist/modules/notification/index.js.map +1 -1
  109. package/dist/modules/notification/module.d.ts.map +1 -1
  110. package/dist/provider.js +255 -257
  111. package/dist/provider.js.map +1 -1
  112. package/dist/theme.d.ts +1 -0
  113. package/dist/theme.d.ts.map +1 -1
  114. package/dist/theme.js +2 -2
  115. package/dist/theme.js.map +1 -1
  116. package/dist/utils/dom.d.ts +2 -0
  117. package/dist/utils/dom.d.ts.map +1 -1
  118. package/dist/utils/index.d.ts +1 -1
  119. package/dist/utils/index.d.ts.map +1 -1
  120. package/dist/utils/index.js +28 -19
  121. package/dist/utils/index.js.map +1 -1
  122. package/docs/modules/loading.md +1 -1
  123. package/package.json +48 -2
  124. package/dist/hooks/use-async-action.d.ts +0 -3
  125. package/dist/hooks/use-async-action.d.ts.map +0 -1
  126. package/dist/hooks/use-debounce.d.ts +0 -2
  127. package/dist/hooks/use-debounce.d.ts.map +0 -1
  128. package/dist/hooks/use-intersection-observer.d.ts +0 -4
  129. package/dist/hooks/use-intersection-observer.d.ts.map +0 -1
  130. package/dist/hooks/use-media-query.d.ts +0 -2
  131. package/dist/hooks/use-media-query.d.ts.map +0 -1
  132. package/dist/hooks/use-mounted.d.ts +0 -2
  133. package/dist/hooks/use-mounted.d.ts.map +0 -1
  134. package/dist/hooks/use-server-action.d.ts +0 -4
  135. package/dist/hooks/use-server-action.d.ts.map +0 -1
  136. package/dist/hooks/use-storage-state.d.ts +0 -5
  137. package/dist/hooks/use-storage-state.d.ts.map +0 -1
  138. package/dist/modules/theme.d.ts +0 -3
  139. package/dist/modules/theme.d.ts.map +0 -1
  140. package/dist/utils/json.d.ts +0 -3
  141. package/dist/utils/json.d.ts.map +0 -1
@@ -1,5 +1,7 @@
1
- import { type LoadingState } from "./types";
1
+ import { type LoadingActions, type LoadingState, type LoadingStateWithPage } from "./types";
2
2
  export declare const DEFAULT_LOADING_STATE: LoadingState;
3
+ export declare const DEFAULT_LOADING_STATE_WITH_PAGE: LoadingStateWithPage;
4
+ export declare const INERT_LOADING_ACTIONS: LoadingActions;
3
5
  export declare const LOADING_REGISTRY_KEY = "page-loading";
4
- export declare const loadingTheme: import("../theme").ThemeSpec<"overlay">;
6
+ export declare const loadingTheme: import("@/theme").ThemeSpec<"overlay">;
5
7
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/modules/loading/constants.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,YAAY,EAAyB,MAAM,SAAS,CAAC;AAEnE,eAAO,MAAM,qBAAqB,EAAE,YAMlC,CAAC;AAEH,eAAO,MAAM,oBAAoB,iBAAiB,CAAC;AAEnD,eAAO,MAAM,YAAY,yCAA+C,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/modules/loading/constants.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,oBAAoB,EAE1B,MAAM,SAAS,CAAC;AAEjB,eAAO,MAAM,qBAAqB,EAAE,YAMlC,CAAC;AAEH,eAAO,MAAM,+BAA+B,EAAE,oBAG5C,CAAC;AAEH,eAAO,MAAM,qBAAqB,EAAE,cAOlC,CAAC;AAEH,eAAO,MAAM,oBAAoB,iBAAiB,CAAC;AAEnD,eAAO,MAAM,YAAY,wCAA+C,CAAC"}
@@ -10,4 +10,7 @@ export declare function useLoadingActions(): LoadingActions;
10
10
  export declare function useLoading(config?: LoadingPageConfig | null, options?: RegistryMetadata & {
11
11
  enabled?: boolean;
12
12
  }): LoadingStateWithPage & LoadingActions;
13
+ export declare function useOptionalLoadingState(): LoadingStateWithPage;
14
+ export declare function useOptionalLoadingState<T>(selector: (state: LoadingStateWithPage) => T, isEqual?: (a: T, b: T) => boolean): T;
15
+ export declare function useOptionalLoadingActions(): LoadingActions;
13
16
  //# sourceMappingURL=context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/modules/loading/context.tsx"],"names":[],"mappings":"AAeA,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,mBAAmB,EAExB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EAEzB,KAAK,oBAAoB,EAE1B,MAAM,SAAS,CAAC;AAIjB,eAAO,MAAM,cAAc,qDACmD,CAAC;AAE/E,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,EAC5C,OAAO,CAAC,EAAE,gBAAgB,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GACjD,IAAI,CAEN;AAED,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,EAAE,oBAAoB,+BA8IjE;AAED,wBAAgB,eAAe,IAAI,oBAAoB,CAOtD;AAED,wBAAgB,iBAAiB,IAAI,cAAc,CAMlD;AAED,wBAAgB,UAAU,CACxB,MAAM,CAAC,EAAE,iBAAiB,GAAG,IAAI,EACjC,OAAO,CAAC,EAAE,gBAAgB,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GACjD,oBAAoB,GAAG,cAAc,CAOvC"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/modules/loading/context.tsx"],"names":[],"mappings":"AAeA,OAAO,EAIL,KAAK,gBAAgB,EACtB,MAAM,UAAU,CAAC;AASlB,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,mBAAmB,EAExB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EAEzB,KAAK,oBAAoB,EAE1B,MAAM,SAAS,CAAC;AAGjB,eAAO,MAAM,cAAc,qDAEmD,CAAC;AAE/E,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,EAC5C,OAAO,CAAC,EAAE,gBAAgB,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GACjD,IAAI,CAEN;AAED,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,EAAE,oBAAoB,+BA8IjE;AAED,wBAAgB,eAAe,IAAI,oBAAoB,CAOtD;AAED,wBAAgB,iBAAiB,IAAI,cAAc,CAMlD;AAED,wBAAgB,UAAU,CACxB,MAAM,CAAC,EAAE,iBAAiB,GAAG,IAAI,EACjC,OAAO,CAAC,EAAE,gBAAgB,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GACjD,oBAAoB,GAAG,cAAc,CAOvC;AAMD,wBAAgB,uBAAuB,IAAI,oBAAoB,CAAC;AAChE,wBAAgB,uBAAuB,CAAC,CAAC,EACvC,QAAQ,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,CAAC,EAC5C,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,OAAO,GAChC,CAAC,CAAC;AAaL,wBAAgB,yBAAyB,IAAI,cAAc,CAG1D"}
@@ -1,6 +1,6 @@
1
1
  export declare function useLoadingOverlayModel(): {
2
2
  skeleton: import("react").ReactNode;
3
3
  isVisible: boolean;
4
- theme: import("../theme").ResolvedTheme<"overlay">;
4
+ theme: import("@/theme").ResolvedTheme<"overlay">;
5
5
  };
6
6
  //# sourceMappingURL=hooks.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/modules/loading/hooks.ts"],"names":[],"mappings":"AAOA,wBAAgB,sBAAsB;;;;EAQrC"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/modules/loading/hooks.ts"],"names":[],"mappings":"AAMA,wBAAgB,sBAAsB;;;;EAQrC"}
@@ -1,7 +1,7 @@
1
1
  export { LoadingOverlay } from "./overlay";
2
- export { LoadingContext, LoadingProvider, useLoading, useLoadingActions, useLoadingRegistration, useLoadingState, } from "./context";
2
+ export { LoadingContext, LoadingProvider, useLoading, useLoadingActions, useLoadingRegistration, useLoadingState, useOptionalLoadingActions, useOptionalLoadingState, } from "./context";
3
3
  export { defineLoading, loadingModule } from "./module";
4
- export { DEFAULT_LOADING_STATE, LOADING_REGISTRY_KEY, loadingTheme, } from "./constants";
4
+ export { DEFAULT_LOADING_STATE, DEFAULT_LOADING_STATE_WITH_PAGE, INERT_LOADING_ACTIONS, LOADING_REGISTRY_KEY, loadingTheme, } from "./constants";
5
5
  export { normalizeLoadingOptions, selectPageLoading } from "./utils";
6
6
  export type * from "./types";
7
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/loading/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EACL,cAAc,EACd,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,GAChB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACrE,mBAAmB,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/loading/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EACL,cAAc,EACd,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,EACf,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EACL,qBAAqB,EACrB,+BAA+B,EAC/B,qBAAqB,EACrB,oBAAoB,EACpB,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACrE,mBAAmB,SAAS,CAAC"}
@@ -1,10 +1,7 @@
1
1
  "use client";
2
2
  import { Icon as Icon$1 } from '@iconify-icon/react';
3
3
  import { jsx } from 'react/jsx-runtime';
4
- import '@radix-ui/react-tooltip';
5
- import { createContext, useState, useRef, useCallback, useEffect, useMemo, useSyncExternalStore, useLayoutEffect, use, useId, useContext, isValidElement, cloneElement, Children } from 'react';
6
- import 'clsx';
7
- import 'tailwind-merge';
4
+ import { createContext, useState, useRef, useCallback, useEffect, useMemo, useContext, useSyncExternalStore, useLayoutEffect, use, useId, isValidElement, cloneElement, Children } from 'react';
8
5
  import { usePathname } from 'next/navigation';
9
6
 
10
7
  function Icon({
@@ -42,95 +39,6 @@ function Spinner({ className = "", size = 15 }) {
42
39
  );
43
40
  }
44
41
  Spinner.displayName = "Spinner";
45
- var listeners = /* @__PURE__ */ new Set();
46
- var activeFullscreenStateIds = /* @__PURE__ */ new Set();
47
- var ACTIVE_FULLSCREEN_ROOT_SELECTOR = '[data-fullscreen-state-root="true"][data-affect-global-state="true"]';
48
- var domObserver = null;
49
- var lastSnapshot = false;
50
- function getDomSnapshot() {
51
- if (typeof document === "undefined") {
52
- return activeFullscreenStateIds.size > 0;
53
- }
54
- return document.querySelector(ACTIVE_FULLSCREEN_ROOT_SELECTOR) !== null;
55
- }
56
- function emitChange() {
57
- listeners.forEach((listener) => listener());
58
- }
59
- function emitIfSnapshotChanged() {
60
- const nextSnapshot = getDomSnapshot();
61
- if (nextSnapshot === lastSnapshot) {
62
- return;
63
- }
64
- lastSnapshot = nextSnapshot;
65
- emitChange();
66
- }
67
- function ensureDomObserver() {
68
- if (typeof document === "undefined" || domObserver || listeners.size === 0) {
69
- return;
70
- }
71
- domObserver = new MutationObserver(() => {
72
- emitIfSnapshotChanged();
73
- });
74
- domObserver.observe(document.documentElement, {
75
- attributes: true,
76
- childList: true,
77
- subtree: true,
78
- attributeFilter: [
79
- "data-fullscreen-state",
80
- "data-fullscreen-state-root",
81
- "data-affect-global-state"
82
- ]
83
- });
84
- }
85
- function releaseDomObserver() {
86
- if (listeners.size > 0 || !domObserver) {
87
- return;
88
- }
89
- domObserver.disconnect();
90
- domObserver = null;
91
- }
92
- function subscribe(listener) {
93
- listeners.add(listener);
94
- ensureDomObserver();
95
- emitIfSnapshotChanged();
96
- return () => {
97
- listeners.delete(listener);
98
- releaseDomObserver();
99
- };
100
- }
101
- function getSnapshot() {
102
- return getDomSnapshot();
103
- }
104
- function useIsFullscreenStateActive() {
105
- return useSyncExternalStore(subscribe, getSnapshot, () => false);
106
- }
107
- function getOrCreateGlobalContext(name, defaultValue) {
108
- const sym = /* @__PURE__ */ Symbol.for(`@omerdlw/base-framework/context/${name}`);
109
- const store = globalThis;
110
- if (!store[sym]) {
111
- store[sym] = createContext(defaultValue);
112
- }
113
- return store[sym];
114
- }
115
-
116
- // src/theme.tsx
117
- function defineThemeSpec(id) {
118
- return Object.freeze({ id });
119
- }
120
- var EMPTY = /* @__PURE__ */ new Map();
121
- var ThemeContext = getOrCreateGlobalContext("ThemeContext", EMPTY);
122
- function useTheme(spec) {
123
- const config = useContext(ThemeContext).get(spec.id);
124
- if (!config) {
125
- throw new Error(
126
- `Theme "${spec.id}" is missing. Add its theme file to src/config/ and list it in src/config/index.ts.`
127
- );
128
- }
129
- return {
130
- slots: config.slots,
131
- styles: config.styles ?? {}
132
- };
133
- }
134
42
  function useRequiredContext(context, hookName, providerName) {
135
43
  const value = use(context);
136
44
  if (value === null) {
@@ -172,9 +80,6 @@ function useStore(store, selector = (state) => state, isEqual = Object.is) {
172
80
  );
173
81
  }
174
82
 
175
- // src/utils/dom.ts
176
- var isBrowser = typeof window !== "undefined";
177
-
178
83
  // src/utils/string.ts
179
84
  function trimToNull(value) {
180
85
  if (value === null || value === void 0) return null;
@@ -182,6 +87,9 @@ function trimToNull(value) {
182
87
  return trimmed.length > 0 ? trimmed : null;
183
88
  }
184
89
 
90
+ // src/utils/dom.ts
91
+ var isBrowser = typeof window !== "undefined";
92
+
185
93
  // src/utils/object.ts
186
94
  function isObject(value) {
187
95
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
@@ -259,75 +167,68 @@ function createStore(initialState, { freezeSnapshots = true } = {}) {
259
167
 
260
168
  // src/hooks/use-isomorphic-layout-effect.ts
261
169
  var useIsomorphicLayoutEffect = isBrowser ? useLayoutEffect : useEffect;
262
- var EventEmitter = class {
263
- events = /* @__PURE__ */ new Map();
264
- debounceTimers = /* @__PURE__ */ new Map();
265
- subscribe(event, callback) {
266
- if (typeof event !== "string" || !event || typeof callback !== "function") {
267
- return () => {
268
- };
269
- }
270
- const listeners2 = this.events.get(event) || /* @__PURE__ */ new Set();
271
- listeners2.add(callback);
272
- this.events.set(event, listeners2);
273
- return () => {
274
- listeners2.delete(callback);
275
- if (listeners2.size === 0) this.events.delete(event);
276
- };
277
- }
278
- emit(event, payload) {
279
- const listeners2 = this.events.get(event);
280
- if (!listeners2 || listeners2.size === 0) return;
281
- const snapshot = Array.from(listeners2);
282
- for (const callback of snapshot) {
283
- try {
284
- callback(payload);
285
- } catch (error) {
286
- report(`Event listener (${String(event)})`, error);
287
- }
288
- }
289
- }
290
- emitDebounced(event, payload, waitMs = 100) {
291
- const existing = this.debounceTimers.get(event);
292
- if (existing) clearTimeout(existing);
293
- const timer = setTimeout(() => {
294
- this.debounceTimers.delete(event);
295
- this.emit(event, payload);
296
- }, waitMs);
297
- this.debounceTimers.set(event, timer);
298
- }
299
- cancelDebounced(event) {
300
- if (event) {
301
- const timer = this.debounceTimers.get(event);
302
- if (timer) {
303
- clearTimeout(timer);
304
- this.debounceTimers.delete(event);
305
- }
306
- } else {
307
- for (const timer of this.debounceTimers.values()) {
308
- clearTimeout(timer);
309
- }
310
- this.debounceTimers.clear();
311
- }
312
- }
313
- unsubscribeAll(event) {
314
- this.cancelDebounced(event);
315
- if (event) this.events.delete(event);
316
- else this.events.clear();
170
+ var listeners = /* @__PURE__ */ new Set();
171
+ var activeFullscreenStateIds = /* @__PURE__ */ new Set();
172
+ var ACTIVE_FULLSCREEN_ROOT_SELECTOR = '[data-fullscreen-state-root="true"][data-affect-global-state="true"]';
173
+ var domObserver = null;
174
+ var lastSnapshot = false;
175
+ function getDomSnapshot() {
176
+ if (typeof document === "undefined") {
177
+ return activeFullscreenStateIds.size > 0;
317
178
  }
318
- hasListeners(event) {
319
- return Boolean(this.events.get(event)?.size);
179
+ return document.querySelector(ACTIVE_FULLSCREEN_ROOT_SELECTOR) !== null;
180
+ }
181
+ function emitChange() {
182
+ listeners.forEach((listener) => listener());
183
+ }
184
+ function emitIfSnapshotChanged() {
185
+ const nextSnapshot = getDomSnapshot();
186
+ if (nextSnapshot === lastSnapshot) {
187
+ return;
320
188
  }
321
- getListenerCount(event) {
322
- return this.events.get(event)?.size || 0;
189
+ lastSnapshot = nextSnapshot;
190
+ emitChange();
191
+ }
192
+ function ensureDomObserver() {
193
+ if (typeof document === "undefined" || domObserver || listeners.size === 0) {
194
+ return;
323
195
  }
324
- getAllEvents() {
325
- return [...this.events.keys()];
196
+ domObserver = new MutationObserver(() => {
197
+ emitIfSnapshotChanged();
198
+ });
199
+ domObserver.observe(document.documentElement, {
200
+ attributes: true,
201
+ childList: true,
202
+ subtree: true,
203
+ attributeFilter: [
204
+ "data-fullscreen-state",
205
+ "data-fullscreen-state-root",
206
+ "data-affect-global-state"
207
+ ]
208
+ });
209
+ }
210
+ function releaseDomObserver() {
211
+ if (listeners.size > 0 || !domObserver) {
212
+ return;
326
213
  }
327
- };
328
- var GLOBAL_EVENTS_KEY = /* @__PURE__ */ Symbol.for("__base_framework_global_events__");
329
- var _global = globalThis;
330
- _global[GLOBAL_EVENTS_KEY] ?? (_global[GLOBAL_EVENTS_KEY] = new EventEmitter());
214
+ domObserver.disconnect();
215
+ domObserver = null;
216
+ }
217
+ function subscribe(listener) {
218
+ listeners.add(listener);
219
+ ensureDomObserver();
220
+ emitIfSnapshotChanged();
221
+ return () => {
222
+ listeners.delete(listener);
223
+ releaseDomObserver();
224
+ };
225
+ }
226
+ function getSnapshot() {
227
+ return getDomSnapshot();
228
+ }
229
+ function useIsFullscreenStateActive() {
230
+ return useSyncExternalStore(subscribe, getSnapshot, () => false);
231
+ }
331
232
 
332
233
  // src/kernel/constants.ts
333
234
  var DEFAULT_SOURCE = "dynamic";
@@ -380,6 +281,14 @@ var REGISTRY_SCOPE_KINDS = Object.freeze({
380
281
  WORKSPACE: "workspace"
381
282
  });
382
283
  REGISTRY_SCOPE_KINDS.APP;
284
+ function getOrCreateGlobalContext(name, defaultValue) {
285
+ const sym = /* @__PURE__ */ Symbol.for(`@omerdlw/base-framework/context/${name}`);
286
+ const store = globalThis;
287
+ if (!store[sym]) {
288
+ store[sym] = createContext(defaultValue);
289
+ }
290
+ return store[sym];
291
+ }
383
292
 
384
293
  // src/kernel/utils.ts
385
294
  function parseFiniteNumber(value) {
@@ -479,24 +388,6 @@ function pickRegistryMetadata(options) {
479
388
  )
480
389
  );
481
390
  }
482
- function createNoopHandle(status = "rejected", reason = "unknown") {
483
- const handle = Object.assign(() => false, {
484
- active: false,
485
- dispose: () => false,
486
- instanceId: null,
487
- key: "",
488
- priority: 0,
489
- reason,
490
- source: "",
491
- status,
492
- type: "",
493
- update: () => handle,
494
- updatedAt: 0,
495
- validation: "warn"
496
- });
497
- return handle;
498
- }
499
- createNoopHandle();
500
391
  var RegistryContext = getOrCreateGlobalContext(
501
392
  "RegistryContext",
502
393
  null
@@ -959,56 +850,12 @@ function useRegistry(config, metadata) {
959
850
  );
960
851
  useAppliedRegistryConfig(payload, context, componentSlices);
961
852
  }
962
- function createPageControllerStore() {
963
- const listeners2 = /* @__PURE__ */ new Set();
964
- let stack = [];
965
- const notify = () => {
966
- listeners2.forEach((listener) => {
967
- try {
968
- listener();
969
- } catch (error) {
970
- report("Page controller listener", error);
971
- }
972
- });
973
- };
974
- return {
975
- getSnapshot() {
976
- const top = stack[stack.length - 1];
977
- return top?.controllerRef?.current || null;
978
- },
979
- notify,
980
- register(id, controllerRef) {
981
- stack = stack.filter((item) => item.id !== id);
982
- stack.push({ controllerRef, id });
983
- notify();
984
- },
985
- subscribe(listener) {
986
- listeners2.add(listener);
987
- return () => {
988
- listeners2.delete(listener);
989
- };
990
- },
991
- unregister(id) {
992
- stack = stack.filter((item) => item.id !== id);
993
- notify();
994
- }
995
- };
996
- }
997
- var fallbackStandaloneStore = createPageControllerStore();
998
- getOrCreateGlobalContext(
999
- "PageControllerContext",
1000
- null
1001
- );
1002
- getOrCreateGlobalContext(
1003
- "PageControllerStoreContext",
1004
- fallbackStandaloneStore
1005
- );
1006
853
  function defineModule(coreModule) {
1007
854
  return Object.freeze({ ...coreModule });
1008
855
  }
1009
856
  createStore(void 0);
1010
857
 
1011
- // src/kernel/adapters.tsx
858
+ // src/kernel/adapters.ts
1012
859
  function useModuleRegistration(id, value, options) {
1013
860
  const coreModule = useInstalledModules().find(
1014
861
  (candidate) => candidate.id === id
@@ -1017,6 +864,25 @@ function useModuleRegistration(id, value, options) {
1017
864
  useRegistry(config, pickRegistryMetadata(options));
1018
865
  }
1019
866
 
867
+ // src/theme.tsx
868
+ function defineThemeSpec(id) {
869
+ return Object.freeze({ id });
870
+ }
871
+ var EMPTY = /* @__PURE__ */ new Map();
872
+ var ThemeContext = getOrCreateGlobalContext("ThemeContext", EMPTY);
873
+ function useTheme(spec) {
874
+ const config = useContext(ThemeContext).get(spec.id);
875
+ if (!config) {
876
+ throw new Error(
877
+ `Theme "${spec.id}" is missing. Ensure its theme configuration is provided to <ThemeProvider themes={[...]}> (e.g. in src/config/ or your theme setup).`
878
+ );
879
+ }
880
+ return {
881
+ slots: config.slots,
882
+ styles: config.styles ?? {}
883
+ };
884
+ }
885
+
1020
886
  // src/modules/loading/constants.ts
1021
887
  var DEFAULT_LOADING_STATE = Object.freeze({
1022
888
  isLoading: false,
@@ -1025,6 +891,21 @@ var DEFAULT_LOADING_STATE = Object.freeze({
1025
891
  showOverlay: true,
1026
892
  message: null
1027
893
  });
894
+ var DEFAULT_LOADING_STATE_WITH_PAGE = Object.freeze({
895
+ ...DEFAULT_LOADING_STATE,
896
+ isPageLoading: false
897
+ });
898
+ var INERT_LOADING_ACTIONS = Object.freeze({
899
+ setLoading: () => {
900
+ },
901
+ setSkeleton: () => {
902
+ },
903
+ startLoading: () => {
904
+ },
905
+ stopLoading: () => {
906
+ },
907
+ withLoading: async (task) => typeof task === "function" ? task() : task
908
+ });
1028
909
  var LOADING_REGISTRY_KEY = "page-loading";
1029
910
  var loadingTheme = defineThemeSpec("loading");
1030
911
 
@@ -1184,6 +1065,21 @@ function useLoading(config, options) {
1184
1065
  const state = useLoadingState();
1185
1066
  return useMemo(() => ({ ...state, ...actions }), [actions, state]);
1186
1067
  }
1068
+ var NOOP_LOADING_STORE = createStore(
1069
+ DEFAULT_LOADING_STATE_WITH_PAGE
1070
+ );
1071
+ function useOptionalLoadingState(selector, isEqual) {
1072
+ const ctx = useContext(LoadingContext);
1073
+ return useStore(
1074
+ ctx?.store ?? NOOP_LOADING_STORE,
1075
+ selector,
1076
+ isEqual
1077
+ );
1078
+ }
1079
+ function useOptionalLoadingActions() {
1080
+ const ctx = useContext(LoadingContext);
1081
+ return ctx?.actions ?? INERT_LOADING_ACTIONS;
1082
+ }
1187
1083
 
1188
1084
  // src/modules/loading/hooks.ts
1189
1085
  function useLoadingOverlayModel() {
@@ -1251,6 +1147,6 @@ var loadingModule = defineModule({
1251
1147
  }
1252
1148
  });
1253
1149
 
1254
- export { DEFAULT_LOADING_STATE, LOADING_REGISTRY_KEY, LoadingContext, LoadingOverlay, LoadingProvider, defineLoading, loadingModule, loadingTheme, normalizeLoadingOptions, selectPageLoading, useLoading, useLoadingActions, useLoadingRegistration, useLoadingState };
1150
+ export { DEFAULT_LOADING_STATE, DEFAULT_LOADING_STATE_WITH_PAGE, INERT_LOADING_ACTIONS, LOADING_REGISTRY_KEY, LoadingContext, LoadingOverlay, LoadingProvider, defineLoading, loadingModule, loadingTheme, normalizeLoadingOptions, selectPageLoading, useLoading, useLoadingActions, useLoadingRegistration, useLoadingState, useOptionalLoadingActions, useOptionalLoadingState };
1255
1151
  //# sourceMappingURL=index.js.map
1256
1152
  //# sourceMappingURL=index.js.map