@omerdlw/base-framework 1.0.0 → 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 (171) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +121 -52
  3. package/dist/atoms/index.d.ts +0 -1
  4. package/dist/atoms/index.d.ts.map +1 -1
  5. package/dist/atoms/index.js +1 -64
  6. package/dist/atoms/index.js.map +1 -1
  7. package/dist/error/index.js +22 -25
  8. package/dist/error/index.js.map +1 -1
  9. package/dist/hooks/index.d.ts +2 -9
  10. package/dist/hooks/index.d.ts.map +1 -1
  11. package/dist/hooks/index.js +97 -540
  12. package/dist/hooks/index.js.map +1 -1
  13. package/dist/hooks/types.d.ts +3 -45
  14. package/dist/hooks/types.d.ts.map +1 -1
  15. package/dist/hooks/use-controllable-state.d.ts +1 -1
  16. package/dist/hooks/use-controllable-state.d.ts.map +1 -1
  17. package/dist/hooks/use-global-event.d.ts +0 -2
  18. package/dist/hooks/use-global-event.d.ts.map +1 -1
  19. package/dist/hooks/use-hotkey.d.ts +1 -1
  20. package/dist/hooks/use-hotkey.d.ts.map +1 -1
  21. package/dist/index.js +11283 -11772
  22. package/dist/index.js.map +1 -1
  23. package/dist/kernel/adapters.d.ts.map +1 -1
  24. package/dist/kernel/index.d.ts +1 -0
  25. package/dist/kernel/index.d.ts.map +1 -1
  26. package/dist/kernel/index.js +10 -81
  27. package/dist/kernel/index.js.map +1 -1
  28. package/dist/kernel/installed.d.ts.map +1 -1
  29. package/dist/kernel/page-controller.d.ts.map +1 -1
  30. package/dist/kernel/provider.d.ts.map +1 -1
  31. package/dist/modules/ambient/constants.d.ts +1 -1
  32. package/dist/modules/ambient/constants.d.ts.map +1 -1
  33. package/dist/modules/ambient/index.js +180 -326
  34. package/dist/modules/ambient/index.js.map +1 -1
  35. package/dist/modules/ambient/module.d.ts.map +1 -1
  36. package/dist/modules/background/constants.d.ts +4 -2
  37. package/dist/modules/background/constants.d.ts.map +1 -1
  38. package/dist/modules/background/context.d.ts +3 -0
  39. package/dist/modules/background/context.d.ts.map +1 -1
  40. package/dist/modules/background/hooks.d.ts +1 -1
  41. package/dist/modules/background/index.d.ts +2 -2
  42. package/dist/modules/background/index.d.ts.map +1 -1
  43. package/dist/modules/background/index.js +1172 -1270
  44. package/dist/modules/background/index.js.map +1 -1
  45. package/dist/modules/background/overlay.d.ts +1 -1
  46. package/dist/modules/background/overlay.d.ts.map +1 -1
  47. package/dist/modules/background/types.d.ts +1 -1
  48. package/dist/modules/background/types.d.ts.map +1 -1
  49. package/dist/modules/context-menu/constants.d.ts +1 -1
  50. package/dist/modules/context-menu/constants.d.ts.map +1 -1
  51. package/dist/modules/context-menu/context.d.ts.map +1 -1
  52. package/dist/modules/context-menu/hooks.d.ts.map +1 -1
  53. package/dist/modules/context-menu/index.js +133 -238
  54. package/dist/modules/context-menu/index.js.map +1 -1
  55. package/dist/modules/controls/constants.d.ts +1 -1
  56. package/dist/modules/controls/constants.d.ts.map +1 -1
  57. package/dist/modules/controls/hooks.d.ts +1 -1
  58. package/dist/modules/controls/index.js +28 -162
  59. package/dist/modules/controls/index.js.map +1 -1
  60. package/dist/modules/controls/types.d.ts +1 -1
  61. package/dist/modules/controls/types.d.ts.map +1 -1
  62. package/dist/modules/dock/cards.d.ts +2 -2
  63. package/dist/modules/dock/constants.d.ts +1 -1
  64. package/dist/modules/dock/constants.d.ts.map +1 -1
  65. package/dist/modules/dock/context.d.ts +10 -6
  66. package/dist/modules/dock/context.d.ts.map +1 -1
  67. package/dist/modules/dock/hooks.d.ts +5 -5
  68. package/dist/modules/dock/hooks.d.ts.map +1 -1
  69. package/dist/modules/dock/index.d.ts +1 -1
  70. package/dist/modules/dock/index.d.ts.map +1 -1
  71. package/dist/modules/dock/index.js +2060 -2080
  72. package/dist/modules/dock/index.js.map +1 -1
  73. package/dist/modules/dock/runtime/dock.d.ts.map +1 -1
  74. package/dist/modules/dock/types.d.ts +1 -1
  75. package/dist/modules/dock/types.d.ts.map +1 -1
  76. package/dist/modules/index.js +10789 -11027
  77. package/dist/modules/index.js.map +1 -1
  78. package/dist/modules/loading/constants.d.ts +4 -2
  79. package/dist/modules/loading/constants.d.ts.map +1 -1
  80. package/dist/modules/loading/context.d.ts +3 -0
  81. package/dist/modules/loading/context.d.ts.map +1 -1
  82. package/dist/modules/loading/hooks.d.ts +1 -1
  83. package/dist/modules/loading/hooks.d.ts.map +1 -1
  84. package/dist/modules/loading/index.d.ts +2 -2
  85. package/dist/modules/loading/index.d.ts.map +1 -1
  86. package/dist/modules/loading/index.js +118 -222
  87. package/dist/modules/loading/index.js.map +1 -1
  88. package/dist/modules/loading/types.d.ts +1 -1
  89. package/dist/modules/loading/types.d.ts.map +1 -1
  90. package/dist/modules/media/constants.d.ts +2 -1
  91. package/dist/modules/media/constants.d.ts.map +1 -1
  92. package/dist/modules/media/context.d.ts +3 -0
  93. package/dist/modules/media/context.d.ts.map +1 -1
  94. package/dist/modules/media/index.d.ts +2 -2
  95. package/dist/modules/media/index.d.ts.map +1 -1
  96. package/dist/modules/media/index.js +61 -218
  97. package/dist/modules/media/index.js.map +1 -1
  98. package/dist/modules/modal/constants.d.ts +1 -1
  99. package/dist/modules/modal/constants.d.ts.map +1 -1
  100. package/dist/modules/modal/context.d.ts.map +1 -1
  101. package/dist/modules/modal/hooks.d.ts +2 -2
  102. package/dist/modules/modal/index.js +20 -366
  103. package/dist/modules/modal/index.js.map +1 -1
  104. package/dist/modules/notification/constants.d.ts +4 -2
  105. package/dist/modules/notification/constants.d.ts.map +1 -1
  106. package/dist/modules/notification/context.d.ts +4 -0
  107. package/dist/modules/notification/context.d.ts.map +1 -1
  108. package/dist/modules/notification/hooks.d.ts +1 -1
  109. package/dist/modules/notification/index.d.ts +2 -3
  110. package/dist/modules/notification/index.d.ts.map +1 -1
  111. package/dist/modules/notification/index.js +70 -154
  112. package/dist/modules/notification/index.js.map +1 -1
  113. package/dist/modules/notification/module.d.ts.map +1 -1
  114. package/dist/provider.js +255 -257
  115. package/dist/provider.js.map +1 -1
  116. package/dist/theme.d.ts +1 -0
  117. package/dist/theme.d.ts.map +1 -1
  118. package/dist/theme.js +2 -2
  119. package/dist/theme.js.map +1 -1
  120. package/dist/utils/index.d.ts +5 -6
  121. package/dist/utils/index.d.ts.map +1 -1
  122. package/dist/utils/index.js +1 -57
  123. package/dist/utils/index.js.map +1 -1
  124. package/dist/utils/number.d.ts +0 -1
  125. package/dist/utils/number.d.ts.map +1 -1
  126. package/dist/utils/object.d.ts +0 -2
  127. package/dist/utils/object.d.ts.map +1 -1
  128. package/dist/utils/string.d.ts +0 -3
  129. package/dist/utils/string.d.ts.map +1 -1
  130. package/dist/utils/timing.d.ts +0 -1
  131. package/dist/utils/timing.d.ts.map +1 -1
  132. package/docs/README.md +124 -0
  133. package/docs/architecture-and-rules.md +129 -0
  134. package/docs/core-engine.md +196 -0
  135. package/docs/custom-modules.md +267 -0
  136. package/docs/getting-started.md +199 -0
  137. package/docs/modules/README.md +176 -0
  138. package/docs/modules/ambient.md +150 -0
  139. package/docs/modules/background.md +195 -0
  140. package/docs/modules/context-menu.md +248 -0
  141. package/docs/modules/controls.md +159 -0
  142. package/docs/modules/dock.md +734 -0
  143. package/docs/modules/error-boundary.md +160 -0
  144. package/docs/modules/kernel.md +266 -0
  145. package/docs/modules/loading.md +157 -0
  146. package/docs/modules/media.md +196 -0
  147. package/docs/modules/modal.md +229 -0
  148. package/docs/modules/notification.md +161 -0
  149. package/docs/modules/result.md +135 -0
  150. package/docs/testing.md +160 -0
  151. package/docs/theming.md +185 -0
  152. package/package.json +50 -2
  153. package/templates/AGENTS.md +165 -0
  154. package/dist/hooks/use-async-action.d.ts +0 -3
  155. package/dist/hooks/use-async-action.d.ts.map +0 -1
  156. package/dist/hooks/use-debounce.d.ts +0 -2
  157. package/dist/hooks/use-debounce.d.ts.map +0 -1
  158. package/dist/hooks/use-intersection-observer.d.ts +0 -4
  159. package/dist/hooks/use-intersection-observer.d.ts.map +0 -1
  160. package/dist/hooks/use-media-query.d.ts +0 -2
  161. package/dist/hooks/use-media-query.d.ts.map +0 -1
  162. package/dist/hooks/use-mounted.d.ts +0 -2
  163. package/dist/hooks/use-mounted.d.ts.map +0 -1
  164. package/dist/hooks/use-server-action.d.ts +0 -4
  165. package/dist/hooks/use-server-action.d.ts.map +0 -1
  166. package/dist/hooks/use-storage-state.d.ts +0 -5
  167. package/dist/hooks/use-storage-state.d.ts.map +0 -1
  168. package/dist/modules/theme.d.ts +0 -3
  169. package/dist/modules/theme.d.ts.map +0 -1
  170. package/dist/utils/json.d.ts +0 -3
  171. package/dist/utils/json.d.ts.map +0 -1
package/dist/theme.d.ts CHANGED
@@ -22,4 +22,5 @@ export declare function ThemeProvider({ children, themes, }: {
22
22
  themes: readonly ThemeEntry[];
23
23
  }): import("react").FunctionComponentElement<import("react").ProviderProps<ReadonlyMap<string, ThemeConfig<string>>>>;
24
24
  export declare function useTheme<S extends string>(spec: ThemeSpec<S>): ResolvedTheme<S>;
25
+ export { useTheme as useModuleTheme };
25
26
  //# sourceMappingURL=theme.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.tsx"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IAClD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;CACrB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,MAAM;IAC3C,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,MAAM;IAC7C,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;CAC9D;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACtC;AAED,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAE1E;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAC1C,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,EAClB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAC9B,UAAU,CAEZ;AASD,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,MAAM,GACP,EAAE;IACD,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;CAC/B,qHAGA;AAED,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,EACvC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,GACjB,aAAa,CAAC,CAAC,CAAC,CAWlB"}
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.tsx"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IAClD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;CACrB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,MAAM;IAC3C,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,MAAM;IAC7C,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;CAC9D;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACtC;AAED,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAE1E;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAC1C,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,EAClB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAC9B,UAAU,CAEZ;AAQD,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,MAAM,GACP,EAAE;IACD,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;CAC/B,qHAGA;AAED,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,EACvC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,GACjB,aAAa,CAAC,CAAC,CAAC,CAWlB;AAED,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,CAAC"}
package/dist/theme.js CHANGED
@@ -30,7 +30,7 @@ function useTheme(spec) {
30
30
  const config = useContext(ThemeContext).get(spec.id);
31
31
  if (!config) {
32
32
  throw new Error(
33
- `Theme "${spec.id}" is missing. Add its theme file to src/config/ and list it in src/config/index.ts.`
33
+ `Theme "${spec.id}" is missing. Ensure its theme configuration is provided to <ThemeProvider themes={[...]}> (e.g. in src/config/ or your theme setup).`
34
34
  );
35
35
  }
36
36
  return {
@@ -39,6 +39,6 @@ function useTheme(spec) {
39
39
  };
40
40
  }
41
41
 
42
- export { ThemeProvider, defineTheme, defineThemeSpec, useTheme };
42
+ export { ThemeProvider, defineTheme, defineThemeSpec, useTheme as useModuleTheme, useTheme };
43
43
  //# sourceMappingURL=theme.js.map
44
44
  //# sourceMappingURL=theme.js.map
package/dist/theme.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/kernel/context-registry.ts","../src/theme.tsx"],"names":[],"mappings":";;AAEO,SAAS,wBAAA,CACd,MACA,YAAA,EACY;AACZ,EAAA,MAAM,GAAA,mBAAM,MAAA,CAAO,GAAA,CAAI,CAAA,gCAAA,EAAmC,IAAI,CAAA,CAAE,CAAA;AAChE,EAAA,MAAM,KAAA,GAAQ,UAAA;AACd,EAAA,IAAI,CAAC,KAAA,CAAM,GAAG,CAAA,EAAG;AACf,IAAA,KAAA,CAAM,GAAG,CAAA,GAAI,aAAA,CAAiB,YAAY,CAAA;AAAA,EAC5C;AACA,EAAA,OAAO,MAAM,GAAG,CAAA;AAClB;;;ACkBO,SAAS,gBAAkC,EAAA,EAA0B;AAC1E,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,EAAE,EAAA,EAAI,CAAA;AAC7B;AAEO,SAAS,WAAA,CACd,MACA,MAAA,EACY;AACZ,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,MAAA,EAAuC;AAC/D;AAIA,IAAM,KAAA,uBAAuD,GAAA,EAAI;AACjE,IAAM,YAAA,GAAe,wBAAA,CAEnB,cAAA,EAAgB,KAAK,CAAA;AAEhB,SAAS,aAAA,CAAc;AAAA,EAC5B,QAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU,CAAC,KAAA,CAAM,EAAA,EAAI,KAAA,CAAM,MAAM,CAAC,CAAC,CAAA;AACvE,EAAA,OAAO,cAAc,YAAA,CAAa,QAAA,EAAU,EAAE,KAAA,EAAO,OAAA,IAAW,QAAQ,CAAA;AAC1E;AAEO,SAAS,SACd,IAAA,EACkB;AAClB,EAAA,MAAM,SAAS,UAAA,CAAW,YAAY,CAAA,CAAE,GAAA,CAAI,KAAK,EAAE,CAAA;AACnD,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,OAAA,EAAU,KAAK,EAAE,CAAA,mFAAA;AAAA,KACnB;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,MAAA,EAAQ,MAAA,CAAO,MAAA,IAAU;AAAC,GAC5B;AACF","file":"theme.js","sourcesContent":["import { createContext, type Context } from \"react\";\n\nexport function getOrCreateGlobalContext<T>(\n name: string,\n defaultValue: T,\n): Context<T> {\n const sym = Symbol.for(`@omerdlw/base-framework/context/${name}`);\n const store = globalThis as unknown as Record<symbol, Context<T>>;\n if (!store[sym]) {\n store[sym] = createContext<T>(defaultValue);\n }\n return store[sym];\n}\n","\"use client\";\n\nimport {\n createContext,\n createElement,\n useContext,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\n\nexport interface ThemeSpec<S extends string = string> {\n readonly id: string;\n readonly _slots?: S;\n}\n\nexport interface ThemeConfig<S extends string> {\n slots: Readonly<Record<S, string>>;\n styles?: Readonly<Partial<Record<S, CSSProperties>>>;\n}\n\nexport interface ResolvedTheme<S extends string> {\n readonly slots: Readonly<Record<S, string>>;\n readonly styles: Readonly<Partial<Record<S, CSSProperties>>>;\n}\n\nexport interface ThemeEntry {\n readonly id: string;\n readonly config: ThemeConfig<string>;\n}\n\nexport function defineThemeSpec<S extends string>(id: string): ThemeSpec<S> {\n return Object.freeze({ id });\n}\n\nexport function defineTheme<S extends string>(\n spec: ThemeSpec<S>,\n config: ThemeConfig<NoInfer<S>>,\n): ThemeEntry {\n return { id: spec.id, config: config as ThemeEntry[\"config\"] };\n}\n\nimport { getOrCreateGlobalContext } from \"@/kernel/context-registry\";\n\nconst EMPTY: ReadonlyMap<string, ThemeEntry[\"config\"]> = new Map();\nconst ThemeContext = getOrCreateGlobalContext<\n ReadonlyMap<string, ThemeEntry[\"config\"]>\n>(\"ThemeContext\", EMPTY);\n\nexport function ThemeProvider({\n children,\n themes,\n}: {\n children?: ReactNode;\n themes: readonly ThemeEntry[];\n}) {\n const configs = new Map(themes.map((entry) => [entry.id, entry.config]));\n return createElement(ThemeContext.Provider, { value: configs }, children);\n}\n\nexport function useTheme<S extends string>(\n spec: ThemeSpec<S>,\n): ResolvedTheme<S> {\n const config = useContext(ThemeContext).get(spec.id);\n if (!config) {\n throw new Error(\n `Theme \"${spec.id}\" is missing. Add its theme file to src/config/ and list it in src/config/index.ts.`,\n );\n }\n return {\n slots: config.slots,\n styles: config.styles ?? {},\n } as ResolvedTheme<S>;\n}\n"]}
1
+ {"version":3,"sources":["../src/kernel/context-registry.ts","../src/theme.tsx"],"names":[],"mappings":";;AAEO,SAAS,wBAAA,CACd,MACA,YAAA,EACY;AACZ,EAAA,MAAM,GAAA,mBAAM,MAAA,CAAO,GAAA,CAAI,CAAA,gCAAA,EAAmC,IAAI,CAAA,CAAE,CAAA;AAChE,EAAA,MAAM,KAAA,GAAQ,UAAA;AACd,EAAA,IAAI,CAAC,KAAA,CAAM,GAAG,CAAA,EAAG;AACf,IAAA,KAAA,CAAM,GAAG,CAAA,GAAI,aAAA,CAAiB,YAAY,CAAA;AAAA,EAC5C;AACA,EAAA,OAAO,MAAM,GAAG,CAAA;AAClB;;;ACkBO,SAAS,gBAAkC,EAAA,EAA0B;AAC1E,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,EAAE,EAAA,EAAI,CAAA;AAC7B;AAEO,SAAS,WAAA,CACd,MACA,MAAA,EACY;AACZ,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,MAAA,EAAuC;AAC/D;AAEA,IAAM,KAAA,uBAAuD,GAAA,EAAI;AACjE,IAAM,YAAA,GAAe,wBAAA,CAEnB,cAAA,EAAgB,KAAK,CAAA;AAGhB,SAAS,aAAA,CAAc;AAAA,EAC5B,QAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU,CAAC,KAAA,CAAM,EAAA,EAAI,KAAA,CAAM,MAAM,CAAC,CAAC,CAAA;AACvE,EAAA,OAAO,cAAc,YAAA,CAAa,QAAA,EAAU,EAAE,KAAA,EAAO,OAAA,IAAW,QAAQ,CAAA;AAC1E;AAEO,SAAS,SACd,IAAA,EACkB;AAClB,EAAA,MAAM,SAAS,UAAA,CAAW,YAAY,CAAA,CAAE,GAAA,CAAI,KAAK,EAAE,CAAA;AACnD,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,OAAA,EAAU,KAAK,EAAE,CAAA,qIAAA;AAAA,KACnB;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,MAAA,EAAQ,MAAA,CAAO,MAAA,IAAU;AAAC,GAC5B;AACF","file":"theme.js","sourcesContent":["import { createContext, type Context } from \"react\";\n\nexport function getOrCreateGlobalContext<T>(\n name: string,\n defaultValue: T,\n): Context<T> {\n const sym = Symbol.for(`@omerdlw/base-framework/context/${name}`);\n const store = globalThis as unknown as Record<symbol, Context<T>>;\n if (!store[sym]) {\n store[sym] = createContext<T>(defaultValue);\n }\n return store[sym];\n}\n","\"use client\";\n\nimport {\n createElement,\n useContext,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { getOrCreateGlobalContext } from \"@/kernel\";\n\nexport interface ThemeSpec<S extends string = string> {\n readonly id: string;\n readonly _slots?: S;\n}\n\nexport interface ThemeConfig<S extends string> {\n slots: Readonly<Record<S, string>>;\n styles?: Readonly<Partial<Record<S, CSSProperties>>>;\n}\n\nexport interface ResolvedTheme<S extends string> {\n readonly slots: Readonly<Record<S, string>>;\n readonly styles: Readonly<Partial<Record<S, CSSProperties>>>;\n}\n\nexport interface ThemeEntry {\n readonly id: string;\n readonly config: ThemeConfig<string>;\n}\n\nexport function defineThemeSpec<S extends string>(id: string): ThemeSpec<S> {\n return Object.freeze({ id });\n}\n\nexport function defineTheme<S extends string>(\n spec: ThemeSpec<S>,\n config: ThemeConfig<NoInfer<S>>,\n): ThemeEntry {\n return { id: spec.id, config: config as ThemeEntry[\"config\"] };\n}\n\nconst EMPTY: ReadonlyMap<string, ThemeEntry[\"config\"]> = new Map();\nconst ThemeContext = getOrCreateGlobalContext<\n ReadonlyMap<string, ThemeEntry[\"config\"]>\n>(\"ThemeContext\", EMPTY);\n\n\nexport function ThemeProvider({\n children,\n themes,\n}: {\n children?: ReactNode;\n themes: readonly ThemeEntry[];\n}) {\n const configs = new Map(themes.map((entry) => [entry.id, entry.config]));\n return createElement(ThemeContext.Provider, { value: configs }, children);\n}\n\nexport function useTheme<S extends string>(\n spec: ThemeSpec<S>,\n): ResolvedTheme<S> {\n const config = useContext(ThemeContext).get(spec.id);\n if (!config) {\n throw new Error(\n `Theme \"${spec.id}\" is missing. Ensure its theme configuration is provided to <ThemeProvider themes={[...]}> (e.g. in src/config/ or your theme setup).`,\n );\n }\n return {\n slots: config.slots,\n styles: config.styles ?? {},\n } as ResolvedTheme<S>;\n}\n\nexport { useTheme as useModuleTheme };\n\n"]}
@@ -1,10 +1,9 @@
1
1
  export { cn } from "./cn";
2
- export { isBrowser, acquireGlobalScrollLock, getSiteUrl, getCurrentPath, } from "./dom";
3
- export { trimToNull, stripTrailingSlash, normalizePath, isImageIconSource, truncate, capitalize, slugify, } from "./string";
4
- export { clamp, toFiniteNumber, randomBetween } from "./number";
5
- export { isObject, isPlainObject, isEmpty, shallowEqual, toArray, dedupe, } from "./object";
6
- export { sleep, debounce, throttle } from "./timing";
7
- export { safeJsonParse, safeJsonStringify } from "./json";
2
+ export { isBrowser, acquireGlobalScrollLock, getCurrentPath, getSiteUrl, } from "./dom";
3
+ export { trimToNull, stripTrailingSlash, normalizePath, isImageIconSource, } from "./string";
4
+ export { clamp, toFiniteNumber } from "./number";
5
+ export { isObject, isPlainObject, shallowEqual, toArray } from "./object";
6
+ export { debounce, throttle } from "./timing";
8
7
  export { report, setReportSink } from "./report";
9
8
  export { USER_MESSAGES, UserError, toUserMessage } from "./user-message";
10
9
  export type { UserMessageOptions } from "./user-message";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAC1B,OAAO,EACL,SAAS,EACT,uBAAuB,EACvB,UAAU,EACV,cAAc,GACf,MAAM,OAAO,CAAC;AACf,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACR,UAAU,EACV,OAAO,GACR,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAChE,OAAO,EACL,QAAQ,EACR,aAAa,EACb,OAAO,EACP,YAAY,EACZ,OAAO,EACP,MAAM,GACP,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACzE,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAC1B,OAAO,EACL,SAAS,EACT,uBAAuB,EACvB,cAAc,EACd,UAAU,GACX,MAAM,OAAO,CAAC;AACf,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,aAAa,EACb,iBAAiB,GAClB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACzE,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,aAAa,CAAC"}
@@ -25,19 +25,6 @@ function normalizePath(path) {
25
25
  function isImageIconSource(icon) {
26
26
  return typeof icon === "string" && (icon.startsWith("http://") || icon.startsWith("https://") || icon.startsWith("/") || icon.startsWith("data:image/"));
27
27
  }
28
- function truncate(text, maxLength = 100, suffix = "...") {
29
- if (typeof text !== "string") return "";
30
- if (text.length <= maxLength) return text;
31
- return `${text.slice(0, maxLength).trimEnd()}${suffix}`;
32
- }
33
- function capitalize(str) {
34
- if (typeof str !== "string" || !str) return "";
35
- return str.charAt(0).toUpperCase() + str.slice(1);
36
- }
37
- function slugify(str) {
38
- if (typeof str !== "string" || !str) return "";
39
- return str.toLowerCase().trim().replace(/[^\w\s-]/g, "").replace(/[\s_-]+/g, "-").replace(/^-+|-+$/g, "");
40
- }
41
28
 
42
29
  // src/utils/dom.ts
43
30
  var isBrowser = typeof window !== "undefined";
@@ -92,11 +79,6 @@ function toFiniteNumber(value, fallback = 0) {
92
79
  const parsed = Number(value);
93
80
  return Number.isFinite(parsed) ? parsed : fallback;
94
81
  }
95
- function randomBetween(min, max) {
96
- const lower = Math.ceil(min);
97
- const upper = Math.floor(max);
98
- return Math.floor(Math.random() * (upper - lower + 1)) + lower;
99
- }
100
82
 
101
83
  // src/utils/object.ts
102
84
  function isObject(value) {
@@ -107,13 +89,6 @@ function isPlainObject(value) {
107
89
  const proto = Object.getPrototypeOf(value);
108
90
  return proto === Object.prototype || proto === null;
109
91
  }
110
- function isEmpty(value) {
111
- if (value === null || value === void 0) return true;
112
- if (typeof value === "string" || Array.isArray(value))
113
- return value.length === 0;
114
- if (isObject(value)) return Object.keys(value).length === 0;
115
- return false;
116
- }
117
92
  function shallowEqual(a, b) {
118
93
  if (Object.is(a, b)) return true;
119
94
  if (typeof a !== "object" || a === null || typeof b !== "object" || b === null) {
@@ -136,22 +111,8 @@ function toArray(value) {
136
111
  if (value === null || value === void 0) return [];
137
112
  return Array.isArray(value) ? value : [value];
138
113
  }
139
- function dedupe(array, keyFn = null) {
140
- if (!Array.isArray(array)) return [];
141
- if (!keyFn) return [...new Set(array)];
142
- const seen = /* @__PURE__ */ new Set();
143
- return array.filter((item) => {
144
- const key = keyFn(item);
145
- if (seen.has(key)) return false;
146
- seen.add(key);
147
- return true;
148
- });
149
- }
150
114
 
151
115
  // src/utils/timing.ts
152
- function sleep(ms = 0) {
153
- return new Promise((resolve) => setTimeout(resolve, ms));
154
- }
155
116
  function debounce(func, wait = 300) {
156
117
  let timeoutId = null;
157
118
  function debounced(...args) {
@@ -196,23 +157,6 @@ function throttle(func, limit = 300) {
196
157
  return throttled;
197
158
  }
198
159
 
199
- // src/utils/json.ts
200
- function safeJsonParse(text, fallback = null) {
201
- if (typeof text !== "string") return fallback;
202
- try {
203
- return JSON.parse(text);
204
- } catch {
205
- return fallback;
206
- }
207
- }
208
- function safeJsonStringify(value, fallback = "") {
209
- try {
210
- return JSON.stringify(value) ?? fallback;
211
- } catch {
212
- return fallback;
213
- }
214
- }
215
-
216
160
  // src/utils/report.ts
217
161
  var sink = null;
218
162
  function report(scope, error, level = "error") {
@@ -480,6 +424,6 @@ function createScheduler({
480
424
  });
481
425
  }
482
426
 
483
- export { USER_MESSAGES, UserError, acquireGlobalScrollLock, capitalize, clamp, cn, createScheduler, createStore, debounce, dedupe, getCurrentPath, getSiteUrl, isBrowser, isEmpty, isImageIconSource, isObject, isPlainObject, normalizePath, randomBetween, report, safeJsonParse, safeJsonStringify, setReportSink, shallowEqual, sleep, slugify, stripTrailingSlash, throttle, toArray, toFiniteNumber, toUserMessage, trimToNull, truncate };
427
+ export { USER_MESSAGES, UserError, acquireGlobalScrollLock, clamp, cn, createScheduler, createStore, debounce, getCurrentPath, getSiteUrl, isBrowser, isImageIconSource, isObject, isPlainObject, normalizePath, report, setReportSink, shallowEqual, stripTrailingSlash, throttle, toArray, toFiniteNumber, toUserMessage, trimToNull };
484
428
  //# sourceMappingURL=index.js.map
485
429
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/cn.ts","../../src/utils/string.ts","../../src/utils/dom.ts","../../src/utils/number.ts","../../src/utils/object.ts","../../src/utils/timing.ts","../../src/utils/json.ts","../../src/utils/report.ts","../../src/utils/user-message.ts","../../src/utils/store.ts","../../src/utils/scheduler.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","export function trimToNull(value: unknown): string | null {\n if (value === null || value === undefined) return null;\n const trimmed = String(value).trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nexport function stripTrailingSlash(url: unknown): string {\n if (typeof url !== \"string\") return \"\";\n return url.replace(/\\/+$/, \"\");\n}\n\nexport function normalizePath(path: unknown): string {\n const trimmed = trimToNull(path);\n if (!trimmed) return \"\";\n if (trimmed === \"/\") return \"/\";\n return stripTrailingSlash(trimmed);\n}\n\nexport function isImageIconSource(icon: unknown): boolean {\n return (\n typeof icon === \"string\" &&\n (icon.startsWith(\"http://\") ||\n icon.startsWith(\"https://\") ||\n icon.startsWith(\"/\") ||\n icon.startsWith(\"data:image/\"))\n );\n}\n\nexport function truncate(\n text: unknown,\n maxLength: number = 100,\n suffix: string = \"...\",\n): string {\n if (typeof text !== \"string\") return \"\";\n if (text.length <= maxLength) return text;\n return `${text.slice(0, maxLength).trimEnd()}${suffix}`;\n}\n\nexport function capitalize(str: unknown): string {\n if (typeof str !== \"string\" || !str) return \"\";\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport function slugify(str: unknown): string {\n if (typeof str !== \"string\" || !str) return \"\";\n return str\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, \"\")\n .replace(/[\\s_-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n","import { stripTrailingSlash } from \"./string\";\n\nexport const isBrowser: boolean = typeof window !== \"undefined\";\n\nlet globalScrollLockCount = 0;\n\nlet globalScrollLockStyles: {\n bodyOverflow: string;\n bodyOverscrollBehavior: string;\n htmlOverflow: string;\n htmlOverscrollBehavior: string;\n} | null = null;\n\nexport function acquireGlobalScrollLock(): () => void {\n if (typeof document === \"undefined\") return () => {};\n\n if (globalScrollLockCount === 0) {\n globalScrollLockStyles = {\n bodyOverflow: document.body.style.overflow,\n bodyOverscrollBehavior: document.body.style.overscrollBehavior,\n htmlOverflow: document.documentElement.style.overflow,\n htmlOverscrollBehavior: document.documentElement.style.overscrollBehavior,\n };\n }\n\n globalScrollLockCount += 1;\n document.body.style.overflow = \"hidden\";\n document.body.style.overscrollBehavior = \"none\";\n document.documentElement.style.overflow = \"hidden\";\n document.documentElement.style.overscrollBehavior = \"none\";\n\n let released = false;\n return () => {\n if (released) return;\n released = true;\n globalScrollLockCount = Math.max(0, globalScrollLockCount - 1);\n if (globalScrollLockCount > 0 || !globalScrollLockStyles) return;\n\n document.body.style.overflow = globalScrollLockStyles.bodyOverflow;\n document.body.style.overscrollBehavior =\n globalScrollLockStyles.bodyOverscrollBehavior;\n document.documentElement.style.overflow =\n globalScrollLockStyles.htmlOverflow;\n document.documentElement.style.overscrollBehavior =\n globalScrollLockStyles.htmlOverscrollBehavior;\n globalScrollLockStyles = null;\n };\n}\n\nexport function getSiteUrl(): string {\n return stripTrailingSlash(\n process.env.NEXT_PUBLIC_SITE_URL || \"http://localhost:3000\",\n );\n}\n\nexport function getCurrentPath(): string {\n if (!isBrowser) return \"/\";\n return `${window.location.pathname}${window.location.search}`;\n}\n","export function clamp(value: unknown, min: number, max: number): number {\n const num = Number(value);\n const finite = Number.isFinite(num) ? num : min;\n return Math.min(Math.max(finite, min), max);\n}\n\nexport function toFiniteNumber(value: unknown, fallback: number = 0): number {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n\nexport function randomBetween(min: number, max: number): number {\n const lower = Math.ceil(min);\n const upper = Math.floor(max);\n return Math.floor(Math.random() * (upper - lower + 1)) + lower;\n}\n","export function isObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function isPlainObject(\n value: unknown,\n): value is Record<string, unknown> {\n if (!isObject(value)) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\nexport function isEmpty(value: unknown): boolean {\n if (value === null || value === undefined) return true;\n if (typeof value === \"string\" || Array.isArray(value))\n return value.length === 0;\n if (isObject(value)) return Object.keys(value).length === 0;\n return false;\n}\n\nexport function shallowEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (\n typeof a !== \"object\" ||\n a === null ||\n typeof b !== \"object\" ||\n b === null\n ) {\n return false;\n }\n\n const keysA = Object.keys(a as object);\n const keysB = Object.keys(b as object);\n\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (\n !Object.prototype.hasOwnProperty.call(b, key) ||\n !Object.is(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key],\n )\n ) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function toArray<T>(value: T | T[] | null | undefined): T[] {\n if (value === null || value === undefined) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nexport function dedupe<T>(\n array: T[],\n keyFn: ((item: T) => unknown) | null = null,\n): T[] {\n if (!Array.isArray(array)) return [];\n if (!keyFn) return [...new Set(array)];\n const seen = new Set();\n return array.filter((item) => {\n const key = keyFn(item);\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n","export function sleep(ms: number = 0): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function debounce<T extends (...args: never[]) => void>(\n func: T,\n wait: number = 300,\n): ((...args: Parameters<T>) => void) & { cancel: () => void } {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n function debounced(...args: Parameters<T>): void {\n if (timeoutId !== null) clearTimeout(timeoutId);\n timeoutId = setTimeout(() => {\n timeoutId = null;\n func(...args);\n }, wait);\n }\n debounced.cancel = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n return debounced;\n}\n\nexport function throttle<T extends (...args: never[]) => void>(\n func: T,\n limit: number = 300,\n): ((...args: Parameters<T>) => void) & { cancel: () => void } {\n let lastRan = 0;\n let timerId: ReturnType<typeof setTimeout> | null = null;\n const throttled: ((...args: Parameters<T>) => void) & {\n cancel: () => void;\n } = function (...args: Parameters<T>): void {\n const now = Date.now();\n if (now - lastRan >= limit) {\n lastRan = now;\n func(...args);\n } else if (timerId === null) {\n timerId = setTimeout(\n () => {\n lastRan = Date.now();\n timerId = null;\n func(...args);\n },\n limit - (now - lastRan),\n );\n }\n };\n throttled.cancel = () => {\n if (timerId === null) return;\n clearTimeout(timerId);\n timerId = null;\n };\n return throttled;\n}\n","export function safeJsonParse<T = unknown>(\n text: unknown,\n fallback: T | null = null,\n): T | null {\n if (typeof text !== \"string\") return fallback;\n try {\n return JSON.parse(text) as T;\n } catch {\n return fallback;\n }\n}\n\nexport function safeJsonStringify(\n value: unknown,\n fallback: string = \"\",\n): string {\n try {\n return JSON.stringify(value) ?? fallback;\n } catch {\n return fallback;\n }\n}\n","export type ReportLevel = \"error\" | \"warn\";\n\nexport type ReportSink = (\n scope: string,\n error: unknown,\n level: ReportLevel,\n) => void;\n\nlet sink: ReportSink | null = null;\n\nexport function report(\n scope: string,\n error: unknown,\n level: ReportLevel = \"error\",\n): void {\n if (sink) {\n try {\n sink(scope, error, level);\n return;\n } catch {}\n }\n\n if (process.env.NODE_ENV === \"production\" && typeof window !== \"undefined\") {\n return;\n }\n console[level](`[${scope}]`, error);\n}\n\nexport function setReportSink(next: ReportSink): () => void {\n sink = next;\n return () => {\n if (sink === next) sink = null;\n };\n}\n","export const USER_MESSAGES = Object.freeze({\n generic: \"Something went wrong. Please try again\",\n network: \"You appear to be offline. Check your connection and try again\",\n timeout: \"That took too long. Please try again\",\n unauthorized: \"Your session has expired. Please sign in again\",\n forbidden: \"You don't have permission to do that\",\n notFound: \"We couldn't find what you were looking for\",\n rateLimited: \"Too many attempts. Please wait a moment and try again\",\n server: \"We're having trouble on our end. Please try again in a moment\",\n} as const);\n\nexport class UserError extends Error {\n readonly status?: number;\n\n constructor(message: string, status?: number) {\n super(message);\n this.name = \"UserError\";\n this.status = status;\n }\n}\n\nexport interface UserMessageOptions {\n fallback?: string;\n codes?: Readonly<Record<string, string>>;\n}\n\nconst NETWORK_FAILURE = /failed to fetch|network|load failed|fetch failed/i;\n\nfunction readField<T>(\n source: unknown,\n field: string,\n type: \"string\" | \"number\",\n): T | undefined {\n const value = (source as Record<string, unknown> | null)?.[field];\n return typeof value === type ? (value as T) : undefined;\n}\n\nfunction readPayloadMessage(error: unknown): string | undefined {\n const payload = (error as { payload?: unknown } | null)?.payload;\n const message = readField<string>(payload, \"error\", \"string\")?.trim();\n return message || undefined;\n}\n\nexport function toUserMessage(\n error: unknown,\n { codes, fallback = USER_MESSAGES.generic }: UserMessageOptions = {},\n): string {\n if (typeof error === \"string\") return error.trim() || fallback;\n if (!error || typeof error !== \"object\") return fallback;\n\n if (error instanceof UserError) {\n if (error.status === 401) return USER_MESSAGES.unauthorized;\n return error.message || fallback;\n }\n if ((error as { name?: string }).name === \"AbortError\") return fallback;\n\n const code = readField<string>(error, \"code\", \"string\");\n if (code && codes?.[code]) return codes[code];\n\n const status = readField<number>(error, \"status\", \"number\");\n\n if (status === 401) return USER_MESSAGES.unauthorized;\n if (status === 429) return USER_MESSAGES.rateLimited;\n if (status === 408 || status === 504) return USER_MESSAGES.timeout;\n if (status !== undefined && status >= 500) return USER_MESSAGES.server;\n\n if (status !== undefined && status >= 400) {\n const authored = readPayloadMessage(error);\n if (authored) return authored;\n if (status === 403) return USER_MESSAGES.forbidden;\n if (status === 404) return USER_MESSAGES.notFound;\n return fallback;\n }\n\n const isOffline =\n typeof navigator !== \"undefined\" && navigator.onLine === false;\n if (\n isOffline ||\n (NETWORK_FAILURE.test((error as Error).message ?? \"\") &&\n (error instanceof TypeError || /fetch/i.test((error as Error).name)))\n ) {\n return USER_MESSAGES.network;\n }\n\n return fallback;\n}\n","import { report } from \"./report\";\nexport interface ExternalStore<TState = unknown> {\n readonly getSnapshot: () => TState;\n readonly publish: (\n nextState: TState | ((currentState: TState) => TState),\n ) => boolean;\n readonly setState: (\n updater: Partial<TState> | ((currentState: TState) => TState),\n ) => boolean;\n readonly subscribe: (listener: () => void) => () => void;\n}\n\nfunction freezeStoreSnapshot<TState>(state: TState): TState {\n if (\n process.env.NODE_ENV === \"production\" ||\n !state ||\n typeof state !== \"object\"\n ) {\n return state;\n }\n\n const seen = new WeakSet<object>();\n const freeze = (value: object): void => {\n if (seen.has(value) || Object.isFrozen(value)) return;\n seen.add(value);\n\n const prototype = Object.getPrototypeOf(value);\n if (\n Array.isArray(value) ||\n prototype === Object.prototype ||\n prototype === null\n ) {\n for (const key of Reflect.ownKeys(value)) {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (descriptor && \"value\" in descriptor && descriptor.value !== null) {\n if (typeof descriptor.value === \"object\") freeze(descriptor.value);\n }\n }\n }\n\n Object.freeze(value);\n };\n\n freeze(state);\n return state;\n}\n\nexport interface CreateStoreOptions {\n freezeSnapshots?: boolean;\n}\n\nexport function createStore<TState = Record<string, unknown>>(\n initialState: TState,\n { freezeSnapshots = true }: CreateStoreOptions = {},\n): ExternalStore<TState> {\n const listeners = new Set<() => void>();\n const prepare = freezeSnapshots\n ? freezeStoreSnapshot\n : <T>(state: T): T => state;\n let snapshot = prepare(initialState);\n\n const publish = (\n nextStateOrUpdater: TState | ((currentState: TState) => TState),\n ): boolean => {\n const nextState =\n typeof nextStateOrUpdater === \"function\"\n ? (nextStateOrUpdater as (currentState: TState) => TState)(snapshot)\n : nextStateOrUpdater;\n if (Object.is(snapshot, nextState)) return false;\n snapshot = prepare(nextState);\n\n for (const listener of listeners) {\n try {\n listener();\n } catch (error) {\n report(\"CoreStore subscriber\", error, \"warn\");\n }\n }\n return true;\n };\n\n const setState = (\n updater: Partial<TState> | ((currentState: TState) => TState),\n ): boolean => {\n if (typeof updater === \"function\") {\n return publish(updater as (currentState: TState) => TState);\n }\n if (\n snapshot &&\n typeof snapshot === \"object\" &&\n updater &&\n typeof updater === \"object\"\n ) {\n return publish({ ...snapshot, ...updater });\n }\n return publish(updater as TState);\n };\n\n return Object.freeze({\n getSnapshot() {\n return snapshot;\n },\n publish,\n setState,\n subscribe(listener: () => void) {\n if (typeof listener !== \"function\") return () => {};\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n });\n}\n","import { report } from \"./report\";\nconst DEFAULT_SCHEDULER_FRAME_MS = 16;\n\nconst EMPTY_SCHEDULER_TASKS: readonly ScheduledTaskSnapshot[] = Object.freeze(\n [],\n);\n\nfunction getDefaultSchedulerNow(): number {\n return typeof performance !== \"undefined\" &&\n typeof performance.now === \"function\"\n ? performance.now()\n : Date.now();\n}\n\nexport interface ScheduledTaskSnapshot {\n readonly createdAt: number;\n readonly dueAt: number;\n readonly id: number;\n readonly kind: \"timer\" | \"frame\";\n readonly label: string;\n}\n\nexport interface SchedulerSnapshot {\n readonly pendingCount: number;\n readonly tasks: readonly ScheduledTaskSnapshot[];\n}\n\nexport type ScheduleHandle = ReturnType<typeof setTimeout> | number;\n\nexport interface CoreSchedulerOptions {\n cancelFrame?: (id: ScheduleHandle) => void;\n clearTimer?: (id: ScheduleHandle) => void;\n defaultLabel?: string;\n now?: () => number;\n requestFrame?: (cb: (time: number) => void) => ScheduleHandle;\n scheduleTimer?: (cb: () => void, delayMs?: number) => ScheduleHandle;\n}\n\nexport function createScheduler({\n cancelFrame = typeof window !== \"undefined\" &&\n typeof window.cancelAnimationFrame === \"function\"\n ? (id: ScheduleHandle) => window.cancelAnimationFrame(id as number)\n : (id: ScheduleHandle) => clearTimeout(id),\n clearTimer = (id: ScheduleHandle) => clearTimeout(id),\n defaultLabel = \"scheduled-task\",\n now = getDefaultSchedulerNow,\n requestFrame = typeof window !== \"undefined\" &&\n typeof window.requestAnimationFrame === \"function\"\n ? (cb: FrameRequestCallback) => window.requestAnimationFrame(cb)\n : (cb: FrameRequestCallback) =>\n setTimeout(cb, DEFAULT_SCHEDULER_FRAME_MS) as unknown as number,\n scheduleTimer = (cb: () => void, delayMs?: number) => setTimeout(cb, delayMs),\n}: CoreSchedulerOptions = {}) {\n const listeners = new Set<() => void>();\n const tasks = new Map<\n number,\n {\n cancel: (id: ScheduleHandle) => void;\n createdAt: number;\n dueAt: number;\n id: number;\n kind: \"timer\" | \"frame\";\n label: string;\n nativeId: ScheduleHandle;\n }\n >();\n let nextTaskId = 0;\n let snapshot: SchedulerSnapshot = {\n pendingCount: 0,\n tasks: EMPTY_SCHEDULER_TASKS,\n };\n\n const publish = () => {\n const currentTasks: ScheduledTaskSnapshot[] = [];\n for (const task of tasks.values()) {\n currentTasks.push({\n createdAt: task.createdAt,\n dueAt: task.dueAt,\n id: task.id,\n kind: task.kind,\n label: task.label,\n });\n }\n\n snapshot = {\n pendingCount: tasks.size,\n tasks: currentTasks,\n };\n\n for (const listener of listeners) {\n try {\n listener();\n } catch (error) {\n report(\"Scheduler subscriber\", error, \"warn\");\n }\n }\n };\n\n const scheduleInternal = (\n kind: \"timer\" | \"frame\",\n callback: (timestamp: number) => void,\n delayMs: number,\n options: { label?: string } = {},\n ): number | null => {\n if (typeof callback !== \"function\") return null;\n\n const safeDelay = Math.max(0, Number(delayMs) || 0);\n const taskId = ++nextTaskId;\n const createdAt = now();\n\n const invoke = (timestamp = now()) => {\n if (!tasks.has(taskId)) return;\n tasks.delete(taskId);\n publish();\n callback(timestamp);\n };\n\n const nativeId =\n kind === \"frame\"\n ? requestFrame(invoke)\n : scheduleTimer(invoke, safeDelay);\n\n tasks.set(taskId, {\n cancel: kind === \"frame\" ? cancelFrame : clearTimer,\n createdAt,\n dueAt:\n createdAt + (kind === \"frame\" ? DEFAULT_SCHEDULER_FRAME_MS : safeDelay),\n id: taskId,\n kind,\n label:\n typeof options.label === \"string\" && options.label\n ? options.label\n : defaultLabel,\n nativeId,\n });\n\n publish();\n return taskId;\n };\n\n const cancel = (taskId: number): boolean => {\n const task = tasks.get(taskId);\n if (!task) return false;\n\n tasks.delete(taskId);\n try {\n task.cancel(task.nativeId);\n } catch (error) {\n report(\"Scheduler cancellation\", error, \"warn\");\n }\n\n publish();\n return true;\n };\n\n return Object.freeze({\n cancel,\n cancelAll(): number[] {\n if (tasks.size === 0) return [];\n\n const taskIds: number[] = [];\n for (const [taskId, task] of tasks) {\n taskIds.push(taskId);\n try {\n task.cancel(task.nativeId);\n } catch (error) {\n report(\"Scheduler cancellation\", error, \"warn\");\n }\n }\n\n tasks.clear();\n publish();\n return taskIds;\n },\n getSnapshot(): SchedulerSnapshot {\n return snapshot;\n },\n now,\n schedule(\n callback: (timestamp: number) => void,\n delayMs = 0,\n options: { label?: string } = {},\n ): number | null {\n return scheduleInternal(\"timer\", callback, delayMs, options);\n },\n scheduleFrame(\n callback: (timestamp: number) => void,\n options: { label?: string } = {},\n ): number | null {\n return scheduleInternal(\n \"frame\",\n callback,\n DEFAULT_SCHEDULER_FRAME_MS,\n options,\n );\n },\n subscribe(listener: () => void): () => void {\n if (typeof listener !== \"function\") return () => {};\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n });\n}\n"]}
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/utils/string.ts","../../src/utils/dom.ts","../../src/utils/number.ts","../../src/utils/object.ts","../../src/utils/timing.ts","../../src/utils/report.ts","../../src/utils/user-message.ts","../../src/utils/store.ts","../../src/utils/scheduler.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","export function trimToNull(value: unknown): string | null {\n if (value === null || value === undefined) return null;\n const trimmed = String(value).trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nexport function stripTrailingSlash(url: unknown): string {\n if (typeof url !== \"string\") return \"\";\n return url.replace(/\\/+$/, \"\");\n}\n\nexport function normalizePath(path: unknown): string {\n const trimmed = trimToNull(path);\n if (!trimmed) return \"\";\n if (trimmed === \"/\") return \"/\";\n return stripTrailingSlash(trimmed);\n}\n\nexport function isImageIconSource(icon: unknown): boolean {\n return (\n typeof icon === \"string\" &&\n (icon.startsWith(\"http://\") ||\n icon.startsWith(\"https://\") ||\n icon.startsWith(\"/\") ||\n icon.startsWith(\"data:image/\"))\n );\n}\n","import { stripTrailingSlash } from \"./string\";\n\nexport const isBrowser: boolean = typeof window !== \"undefined\";\n\nlet globalScrollLockCount = 0;\n\nlet globalScrollLockStyles: {\n bodyOverflow: string;\n bodyOverscrollBehavior: string;\n htmlOverflow: string;\n htmlOverscrollBehavior: string;\n} | null = null;\n\nexport function acquireGlobalScrollLock(): () => void {\n if (typeof document === \"undefined\") return () => {};\n\n if (globalScrollLockCount === 0) {\n globalScrollLockStyles = {\n bodyOverflow: document.body.style.overflow,\n bodyOverscrollBehavior: document.body.style.overscrollBehavior,\n htmlOverflow: document.documentElement.style.overflow,\n htmlOverscrollBehavior: document.documentElement.style.overscrollBehavior,\n };\n }\n\n globalScrollLockCount += 1;\n document.body.style.overflow = \"hidden\";\n document.body.style.overscrollBehavior = \"none\";\n document.documentElement.style.overflow = \"hidden\";\n document.documentElement.style.overscrollBehavior = \"none\";\n\n let released = false;\n return () => {\n if (released) return;\n released = true;\n globalScrollLockCount = Math.max(0, globalScrollLockCount - 1);\n if (globalScrollLockCount > 0 || !globalScrollLockStyles) return;\n\n document.body.style.overflow = globalScrollLockStyles.bodyOverflow;\n document.body.style.overscrollBehavior =\n globalScrollLockStyles.bodyOverscrollBehavior;\n document.documentElement.style.overflow =\n globalScrollLockStyles.htmlOverflow;\n document.documentElement.style.overscrollBehavior =\n globalScrollLockStyles.htmlOverscrollBehavior;\n globalScrollLockStyles = null;\n };\n}\n\nexport function getSiteUrl(): string {\n return stripTrailingSlash(\n process.env.NEXT_PUBLIC_SITE_URL || \"http://localhost:3000\",\n );\n}\n\nexport function getCurrentPath(): string {\n if (!isBrowser) return \"/\";\n return `${window.location.pathname}${window.location.search}`;\n}\n\n","export function clamp(value: unknown, min: number, max: number): number {\n const num = Number(value);\n const finite = Number.isFinite(num) ? num : min;\n return Math.min(Math.max(finite, min), max);\n}\n\nexport function toFiniteNumber(value: unknown, fallback: number = 0): number {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n","export function isObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function isPlainObject(\n value: unknown,\n): value is Record<string, unknown> {\n if (!isObject(value)) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\nexport function shallowEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (\n typeof a !== \"object\" ||\n a === null ||\n typeof b !== \"object\" ||\n b === null\n ) {\n return false;\n }\n\n const keysA = Object.keys(a as object);\n const keysB = Object.keys(b as object);\n\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (\n !Object.prototype.hasOwnProperty.call(b, key) ||\n !Object.is(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key],\n )\n ) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function toArray<T>(value: T | T[] | null | undefined): T[] {\n if (value === null || value === undefined) return [];\n return Array.isArray(value) ? value : [value];\n}\n","export function debounce<T extends (...args: never[]) => void>(\n func: T,\n wait: number = 300,\n): ((...args: Parameters<T>) => void) & { cancel: () => void } {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n function debounced(...args: Parameters<T>): void {\n if (timeoutId !== null) clearTimeout(timeoutId);\n timeoutId = setTimeout(() => {\n timeoutId = null;\n func(...args);\n }, wait);\n }\n debounced.cancel = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n return debounced;\n}\n\nexport function throttle<T extends (...args: never[]) => void>(\n func: T,\n limit: number = 300,\n): ((...args: Parameters<T>) => void) & { cancel: () => void } {\n let lastRan = 0;\n let timerId: ReturnType<typeof setTimeout> | null = null;\n const throttled: ((...args: Parameters<T>) => void) & {\n cancel: () => void;\n } = function (...args: Parameters<T>): void {\n const now = Date.now();\n if (now - lastRan >= limit) {\n lastRan = now;\n func(...args);\n } else if (timerId === null) {\n timerId = setTimeout(\n () => {\n lastRan = Date.now();\n timerId = null;\n func(...args);\n },\n limit - (now - lastRan),\n );\n }\n };\n throttled.cancel = () => {\n if (timerId === null) return;\n clearTimeout(timerId);\n timerId = null;\n };\n return throttled;\n}\n","export type ReportLevel = \"error\" | \"warn\";\n\nexport type ReportSink = (\n scope: string,\n error: unknown,\n level: ReportLevel,\n) => void;\n\nlet sink: ReportSink | null = null;\n\nexport function report(\n scope: string,\n error: unknown,\n level: ReportLevel = \"error\",\n): void {\n if (sink) {\n try {\n sink(scope, error, level);\n return;\n } catch {}\n }\n\n if (process.env.NODE_ENV === \"production\" && typeof window !== \"undefined\") {\n return;\n }\n console[level](`[${scope}]`, error);\n}\n\nexport function setReportSink(next: ReportSink): () => void {\n sink = next;\n return () => {\n if (sink === next) sink = null;\n };\n}\n","export const USER_MESSAGES = Object.freeze({\n generic: \"Something went wrong. Please try again\",\n network: \"You appear to be offline. Check your connection and try again\",\n timeout: \"That took too long. Please try again\",\n unauthorized: \"Your session has expired. Please sign in again\",\n forbidden: \"You don't have permission to do that\",\n notFound: \"We couldn't find what you were looking for\",\n rateLimited: \"Too many attempts. Please wait a moment and try again\",\n server: \"We're having trouble on our end. Please try again in a moment\",\n} as const);\n\nexport class UserError extends Error {\n readonly status?: number;\n\n constructor(message: string, status?: number) {\n super(message);\n this.name = \"UserError\";\n this.status = status;\n }\n}\n\nexport interface UserMessageOptions {\n fallback?: string;\n codes?: Readonly<Record<string, string>>;\n}\n\nconst NETWORK_FAILURE = /failed to fetch|network|load failed|fetch failed/i;\n\nfunction readField<T>(\n source: unknown,\n field: string,\n type: \"string\" | \"number\",\n): T | undefined {\n const value = (source as Record<string, unknown> | null)?.[field];\n return typeof value === type ? (value as T) : undefined;\n}\n\nfunction readPayloadMessage(error: unknown): string | undefined {\n const payload = (error as { payload?: unknown } | null)?.payload;\n const message = readField<string>(payload, \"error\", \"string\")?.trim();\n return message || undefined;\n}\n\nexport function toUserMessage(\n error: unknown,\n { codes, fallback = USER_MESSAGES.generic }: UserMessageOptions = {},\n): string {\n if (typeof error === \"string\") return error.trim() || fallback;\n if (!error || typeof error !== \"object\") return fallback;\n\n if (error instanceof UserError) {\n if (error.status === 401) return USER_MESSAGES.unauthorized;\n return error.message || fallback;\n }\n if ((error as { name?: string }).name === \"AbortError\") return fallback;\n\n const code = readField<string>(error, \"code\", \"string\");\n if (code && codes?.[code]) return codes[code];\n\n const status = readField<number>(error, \"status\", \"number\");\n\n if (status === 401) return USER_MESSAGES.unauthorized;\n if (status === 429) return USER_MESSAGES.rateLimited;\n if (status === 408 || status === 504) return USER_MESSAGES.timeout;\n if (status !== undefined && status >= 500) return USER_MESSAGES.server;\n\n if (status !== undefined && status >= 400) {\n const authored = readPayloadMessage(error);\n if (authored) return authored;\n if (status === 403) return USER_MESSAGES.forbidden;\n if (status === 404) return USER_MESSAGES.notFound;\n return fallback;\n }\n\n const isOffline =\n typeof navigator !== \"undefined\" && navigator.onLine === false;\n if (\n isOffline ||\n (NETWORK_FAILURE.test((error as Error).message ?? \"\") &&\n (error instanceof TypeError || /fetch/i.test((error as Error).name)))\n ) {\n return USER_MESSAGES.network;\n }\n\n return fallback;\n}\n","import { report } from \"./report\";\nexport interface ExternalStore<TState = unknown> {\n readonly getSnapshot: () => TState;\n readonly publish: (\n nextState: TState | ((currentState: TState) => TState),\n ) => boolean;\n readonly setState: (\n updater: Partial<TState> | ((currentState: TState) => TState),\n ) => boolean;\n readonly subscribe: (listener: () => void) => () => void;\n}\n\nfunction freezeStoreSnapshot<TState>(state: TState): TState {\n if (\n process.env.NODE_ENV === \"production\" ||\n !state ||\n typeof state !== \"object\"\n ) {\n return state;\n }\n\n const seen = new WeakSet<object>();\n const freeze = (value: object): void => {\n if (seen.has(value) || Object.isFrozen(value)) return;\n seen.add(value);\n\n const prototype = Object.getPrototypeOf(value);\n if (\n Array.isArray(value) ||\n prototype === Object.prototype ||\n prototype === null\n ) {\n for (const key of Reflect.ownKeys(value)) {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (descriptor && \"value\" in descriptor && descriptor.value !== null) {\n if (typeof descriptor.value === \"object\") freeze(descriptor.value);\n }\n }\n }\n\n Object.freeze(value);\n };\n\n freeze(state);\n return state;\n}\n\nexport interface CreateStoreOptions {\n freezeSnapshots?: boolean;\n}\n\nexport function createStore<TState = Record<string, unknown>>(\n initialState: TState,\n { freezeSnapshots = true }: CreateStoreOptions = {},\n): ExternalStore<TState> {\n const listeners = new Set<() => void>();\n const prepare = freezeSnapshots\n ? freezeStoreSnapshot\n : <T>(state: T): T => state;\n let snapshot = prepare(initialState);\n\n const publish = (\n nextStateOrUpdater: TState | ((currentState: TState) => TState),\n ): boolean => {\n const nextState =\n typeof nextStateOrUpdater === \"function\"\n ? (nextStateOrUpdater as (currentState: TState) => TState)(snapshot)\n : nextStateOrUpdater;\n if (Object.is(snapshot, nextState)) return false;\n snapshot = prepare(nextState);\n\n for (const listener of listeners) {\n try {\n listener();\n } catch (error) {\n report(\"CoreStore subscriber\", error, \"warn\");\n }\n }\n return true;\n };\n\n const setState = (\n updater: Partial<TState> | ((currentState: TState) => TState),\n ): boolean => {\n if (typeof updater === \"function\") {\n return publish(updater as (currentState: TState) => TState);\n }\n if (\n snapshot &&\n typeof snapshot === \"object\" &&\n updater &&\n typeof updater === \"object\"\n ) {\n return publish({ ...snapshot, ...updater });\n }\n return publish(updater as TState);\n };\n\n return Object.freeze({\n getSnapshot() {\n return snapshot;\n },\n publish,\n setState,\n subscribe(listener: () => void) {\n if (typeof listener !== \"function\") return () => {};\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n });\n}\n","import { report } from \"./report\";\nconst DEFAULT_SCHEDULER_FRAME_MS = 16;\n\nconst EMPTY_SCHEDULER_TASKS: readonly ScheduledTaskSnapshot[] = Object.freeze(\n [],\n);\n\nfunction getDefaultSchedulerNow(): number {\n return typeof performance !== \"undefined\" &&\n typeof performance.now === \"function\"\n ? performance.now()\n : Date.now();\n}\n\nexport interface ScheduledTaskSnapshot {\n readonly createdAt: number;\n readonly dueAt: number;\n readonly id: number;\n readonly kind: \"timer\" | \"frame\";\n readonly label: string;\n}\n\nexport interface SchedulerSnapshot {\n readonly pendingCount: number;\n readonly tasks: readonly ScheduledTaskSnapshot[];\n}\n\nexport type ScheduleHandle = ReturnType<typeof setTimeout> | number;\n\nexport interface CoreSchedulerOptions {\n cancelFrame?: (id: ScheduleHandle) => void;\n clearTimer?: (id: ScheduleHandle) => void;\n defaultLabel?: string;\n now?: () => number;\n requestFrame?: (cb: (time: number) => void) => ScheduleHandle;\n scheduleTimer?: (cb: () => void, delayMs?: number) => ScheduleHandle;\n}\n\nexport function createScheduler({\n cancelFrame = typeof window !== \"undefined\" &&\n typeof window.cancelAnimationFrame === \"function\"\n ? (id: ScheduleHandle) => window.cancelAnimationFrame(id as number)\n : (id: ScheduleHandle) => clearTimeout(id),\n clearTimer = (id: ScheduleHandle) => clearTimeout(id),\n defaultLabel = \"scheduled-task\",\n now = getDefaultSchedulerNow,\n requestFrame = typeof window !== \"undefined\" &&\n typeof window.requestAnimationFrame === \"function\"\n ? (cb: FrameRequestCallback) => window.requestAnimationFrame(cb)\n : (cb: FrameRequestCallback) =>\n setTimeout(cb, DEFAULT_SCHEDULER_FRAME_MS) as unknown as number,\n scheduleTimer = (cb: () => void, delayMs?: number) => setTimeout(cb, delayMs),\n}: CoreSchedulerOptions = {}) {\n const listeners = new Set<() => void>();\n const tasks = new Map<\n number,\n {\n cancel: (id: ScheduleHandle) => void;\n createdAt: number;\n dueAt: number;\n id: number;\n kind: \"timer\" | \"frame\";\n label: string;\n nativeId: ScheduleHandle;\n }\n >();\n let nextTaskId = 0;\n let snapshot: SchedulerSnapshot = {\n pendingCount: 0,\n tasks: EMPTY_SCHEDULER_TASKS,\n };\n\n const publish = () => {\n const currentTasks: ScheduledTaskSnapshot[] = [];\n for (const task of tasks.values()) {\n currentTasks.push({\n createdAt: task.createdAt,\n dueAt: task.dueAt,\n id: task.id,\n kind: task.kind,\n label: task.label,\n });\n }\n\n snapshot = {\n pendingCount: tasks.size,\n tasks: currentTasks,\n };\n\n for (const listener of listeners) {\n try {\n listener();\n } catch (error) {\n report(\"Scheduler subscriber\", error, \"warn\");\n }\n }\n };\n\n const scheduleInternal = (\n kind: \"timer\" | \"frame\",\n callback: (timestamp: number) => void,\n delayMs: number,\n options: { label?: string } = {},\n ): number | null => {\n if (typeof callback !== \"function\") return null;\n\n const safeDelay = Math.max(0, Number(delayMs) || 0);\n const taskId = ++nextTaskId;\n const createdAt = now();\n\n const invoke = (timestamp = now()) => {\n if (!tasks.has(taskId)) return;\n tasks.delete(taskId);\n publish();\n callback(timestamp);\n };\n\n const nativeId =\n kind === \"frame\"\n ? requestFrame(invoke)\n : scheduleTimer(invoke, safeDelay);\n\n tasks.set(taskId, {\n cancel: kind === \"frame\" ? cancelFrame : clearTimer,\n createdAt,\n dueAt:\n createdAt + (kind === \"frame\" ? DEFAULT_SCHEDULER_FRAME_MS : safeDelay),\n id: taskId,\n kind,\n label:\n typeof options.label === \"string\" && options.label\n ? options.label\n : defaultLabel,\n nativeId,\n });\n\n publish();\n return taskId;\n };\n\n const cancel = (taskId: number): boolean => {\n const task = tasks.get(taskId);\n if (!task) return false;\n\n tasks.delete(taskId);\n try {\n task.cancel(task.nativeId);\n } catch (error) {\n report(\"Scheduler cancellation\", error, \"warn\");\n }\n\n publish();\n return true;\n };\n\n return Object.freeze({\n cancel,\n cancelAll(): number[] {\n if (tasks.size === 0) return [];\n\n const taskIds: number[] = [];\n for (const [taskId, task] of tasks) {\n taskIds.push(taskId);\n try {\n task.cancel(task.nativeId);\n } catch (error) {\n report(\"Scheduler cancellation\", error, \"warn\");\n }\n }\n\n tasks.clear();\n publish();\n return taskIds;\n },\n getSnapshot(): SchedulerSnapshot {\n return snapshot;\n },\n now,\n schedule(\n callback: (timestamp: number) => void,\n delayMs = 0,\n options: { label?: string } = {},\n ): number | null {\n return scheduleInternal(\"timer\", callback, delayMs, options);\n },\n scheduleFrame(\n callback: (timestamp: number) => void,\n options: { label?: string } = {},\n ): number | null {\n return scheduleInternal(\n \"frame\",\n callback,\n DEFAULT_SCHEDULER_FRAME_MS,\n options,\n );\n },\n subscribe(listener: () => void): () => void {\n if (typeof listener !== \"function\") return () => {};\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n });\n}\n"]}
@@ -1,4 +1,3 @@
1
1
  export declare function clamp(value: unknown, min: number, max: number): number;
2
2
  export declare function toFiniteNumber(value: unknown, fallback?: number): number;
3
- export declare function randomBetween(min: number, max: number): number;
4
3
  //# sourceMappingURL=number.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"number.d.ts","sourceRoot":"","sources":["../../src/utils/number.ts"],"names":[],"mappings":"AAAA,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAItE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,GAAE,MAAU,GAAG,MAAM,CAG3E;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAI9D"}
1
+ {"version":3,"file":"number.d.ts","sourceRoot":"","sources":["../../src/utils/number.ts"],"names":[],"mappings":"AAAA,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAItE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,GAAE,MAAU,GAAG,MAAM,CAG3E"}
@@ -1,7 +1,5 @@
1
1
  export declare function isObject(value: unknown): value is Record<string, unknown>;
2
2
  export declare function isPlainObject(value: unknown): value is Record<string, unknown>;
3
- export declare function isEmpty(value: unknown): boolean;
4
3
  export declare function shallowEqual(a: unknown, b: unknown): boolean;
5
4
  export declare function toArray<T>(value: T | T[] | null | undefined): T[];
6
- export declare function dedupe<T>(array: T[], keyFn?: ((item: T) => unknown) | null): T[];
7
5
  //# sourceMappingURL=object.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/utils/object.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAIlC;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAM/C;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CA6B5D;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,GAAG,SAAS,GAAG,CAAC,EAAE,CAGjE;AAED,wBAAgB,MAAM,CAAC,CAAC,EACtB,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,GAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,GAAG,IAAW,GAC1C,CAAC,EAAE,CAUL"}
1
+ {"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/utils/object.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAIlC;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CA6B5D;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,GAAG,SAAS,GAAG,CAAC,EAAE,CAGjE"}
@@ -2,7 +2,4 @@ export declare function trimToNull(value: unknown): string | null;
2
2
  export declare function stripTrailingSlash(url: unknown): string;
3
3
  export declare function normalizePath(path: unknown): string;
4
4
  export declare function isImageIconSource(icon: unknown): boolean;
5
- export declare function truncate(text: unknown, maxLength?: number, suffix?: string): string;
6
- export declare function capitalize(str: unknown): string;
7
- export declare function slugify(str: unknown): string;
8
5
  //# sourceMappingURL=string.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../../src/utils/string.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAIxD;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAGvD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAKnD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAQxD;AAED,wBAAgB,QAAQ,CACtB,IAAI,EAAE,OAAO,EACb,SAAS,GAAE,MAAY,EACvB,MAAM,GAAE,MAAc,GACrB,MAAM,CAIR;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAG/C;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAQ5C"}
1
+ {"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../../src/utils/string.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAIxD;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAGvD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAKnD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAQxD"}
@@ -1,4 +1,3 @@
1
- export declare function sleep(ms?: number): Promise<void>;
2
1
  export declare function debounce<T extends (...args: never[]) => void>(func: T, wait?: number): ((...args: Parameters<T>) => void) & {
3
2
  cancel: () => void;
4
3
  };
@@ -1 +1 @@
1
- {"version":3,"file":"timing.d.ts","sourceRoot":"","sources":["../../src/utils/timing.ts"],"names":[],"mappings":"AAAA,wBAAgB,KAAK,CAAC,EAAE,GAAE,MAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnD;AAED,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,EAC3D,IAAI,EAAE,CAAC,EACP,IAAI,GAAE,MAAY,GACjB,CAAC,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG;IAAE,MAAM,EAAE,MAAM,IAAI,CAAA;CAAE,CAgB7D;AAED,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,EAC3D,IAAI,EAAE,CAAC,EACP,KAAK,GAAE,MAAY,GAClB,CAAC,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG;IAAE,MAAM,EAAE,MAAM,IAAI,CAAA;CAAE,CA2B7D"}
1
+ {"version":3,"file":"timing.d.ts","sourceRoot":"","sources":["../../src/utils/timing.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,EAC3D,IAAI,EAAE,CAAC,EACP,IAAI,GAAE,MAAY,GACjB,CAAC,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG;IAAE,MAAM,EAAE,MAAM,IAAI,CAAA;CAAE,CAgB7D;AAED,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,EAC3D,IAAI,EAAE,CAAC,EACP,KAAK,GAAE,MAAY,GAClB,CAAC,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG;IAAE,MAAM,EAAE,MAAM,IAAI,CAAA;CAAE,CA2B7D"}
package/docs/README.md ADDED
@@ -0,0 +1,124 @@
1
+ # Base Framework — System Architecture & Documentation Map
2
+
3
+ > **Microkernel orchestration engine and first-party declarative UI modules for app-like Next.js 16 (App Router) & React 19 web applications.**
4
+ > Package: [`@omerdlw/base-framework`](https://www.npmjs.com/package/@omerdlw/base-framework)
5
+ > Version: `1.0.0` • License: `MIT`
6
+
7
+ ---
8
+
9
+ ## 1. The System in One Page
10
+
11
+ ```
12
+ Consumer Next.js App (app/, layout.tsx, page.tsx)
13
+ │ usePage({ dock, modal, background, ... })
14
+ ▼
15
+ @omerdlw/base-framework/kernel (Microkernel Engine: ModuleHost, RegistryStore, Context Registry)
16
+ │
17
+ ├─ Topologically sorts modules according to declared dependencies (`uses: [...]`)
18
+ ├─ Nests module context providers in deterministic order
19
+ ├─ Renders Backdrops behind children and Overlays above children in isolated error boundaries
20
+ └─ Reconciles route visual chrome atomically on navigation
21
+ │
22
+ ▼
23
+ First-Party Declarative UI Modules:
24
+ ├─ @omerdlw/base-framework/modules/dock (Floating app chrome, cards, surfaces, flows, HUD, navigation guards)
25
+ ├─ @omerdlw/base-framework/modules/modal (Promise-based stacked dialogs, focus trap, smooth scroll lock)
26
+ ├─ @omerdlw/base-framework/modules/notification (Toast notifications, toast.promise, toast.fromResult)
27
+ ├─ @omerdlw/base-framework/modules/ambient (Media color extraction & dynamic canvas lighting)
28
+ ├─ @omerdlw/base-framework/modules/background (Multi-layer video, YouTube loop proxy, edge fades)
29
+ ├─ @omerdlw/base-framework/modules/controls (Paired HUD action rails flanking the dock)
30
+ ├─ @omerdlw/base-framework/modules/loading (Coordinated loading overlay, skeleton sync, anti-flicker delay)
31
+ ├─ @omerdlw/base-framework/modules/media (Unified media playback session, transport leader vs displacement)
32
+ └─ @omerdlw/base-framework/modules/context-menu (Viewport-clamped right-click context menus)
33
+
34
+ Foundational Libraries & Primitives:
35
+ ├─ @omerdlw/base-framework/theme (Theme engine: defineThemeSpec, defineTheme, ThemeProvider, useTheme)
36
+ ├─ @omerdlw/base-framework/result (Functional Result<T, E> error handling: ok, err, createSafeAction)
37
+ ├─ @omerdlw/base-framework/events (Cross-cutting decoupled event bus: globalEvents, EVENT_TYPES)
38
+ ├─ @omerdlw/base-framework/atoms (Unstyled accessible UI atoms: Button, Icon, Spinner, Tooltip)
39
+ ├─ @omerdlw/base-framework/tokens (Hardware GPU motion presets, easing curves, Z-index hierarchy)
40
+ ├─ @omerdlw/base-framework/hooks (useStore, useGlobalEvent, useClickOutside, useRequiredContext)
41
+ ├─ @omerdlw/base-framework/utils (cn, clamp, debounce, throttle, createStore, createScheduler, report)
42
+ └─ @omerdlw/base-framework/error (GlobalError, ModuleError, UserError, toUserMessage)
43
+ ```
44
+
45
+ ---
46
+
47
+ ## 2. Documentation Map
48
+
49
+ Whether you are a software architect or an AI Pair Programmer (Antigravity, Cursor, Claude Code), consult these guides for comprehensive reference:
50
+
51
+ ### 2.1 General Architecture Guides
52
+
53
+ | Document | Primary Audience | Scope & Contents |
54
+ | :--- | :--- | :--- |
55
+ | **[`getting-started.md`](./getting-started.md)** | All Developers | Step-by-step Next.js 16 installation, Tailwind CSS v4 `@source` configuration, and root layout setup. |
56
+ | **[`architecture-and-rules.md`](./architecture-and-rules.md)** | Architects & Agents | The package layer hierarchy, 10 inviolable rules, import boundaries, decision tree, anti-patterns. |
57
+ | **[`theming.md`](./theming.md)** | Designers & Developers | Visual customization guide: `defineThemeSpec()`, `defineTheme()`, `<ThemeProvider>`, and slot reference. |
58
+ | **[`custom-modules.md`](./custom-modules.md)** | Advanced Developers | Authoring custom modules via `defineModule()`, topological dependencies, and `usePage()` augmentation. |
59
+ | **[`core-engine.md`](./core-engine.md)** | Developers & Agents | `CoreProvider`, Theme engine, Event bus, Motion & Z-index tokens, Pure utils, scheduler, and reactive stores. |
60
+ | **[`testing.md`](./testing.md)** | Developers & QA | Running the 520+ test suite, `happy-dom` harness (`renderHook`, `Themed`), and downstream component testing. |
61
+ | **[`templates/AGENTS.md`](../templates/AGENTS.md)** | AI Agents & Tech Leads | **Drop-in instructions** for AI coding assistants in projects using `@omerdlw/base-framework`. |
62
+
63
+ ### 2.2 Module Reference — [`modules/`](./modules/README.md)
64
+
65
+ | Page | What it covers |
66
+ | :--- | :--- |
67
+ | **[`kernel.md`](./modules/kernel.md)** | `usePage()`, `defineModule()`, transactional registry (sources, priority, lifecycles), topological sorting, peers. |
68
+ | **[`dock.md`](./modules/dock.md)** | The framework chrome: cards, surfaces/steps/flows, HUD, operations, status overlays, guards, navigation, theming. |
69
+ | **[`modal.md`](./modules/modal.md)** | Promise-based stacked dialogs, positions, chromes, focus trap, smooth scroll lock. |
70
+ | **[`notification.md`](./modules/notification.md)** | Toast notifications (`useToast`), `toast.promise`, `toast.fromResult`, error boundary bridging, auto 401 listener. |
71
+ | **[`loading.md`](./modules/loading.md)** | Loading overlay, skeleton synchronization, anti-flicker delay, `withLoading` wrapper. |
72
+ | **[`background.md`](./modules/background.md)** | Image / video / YouTube loop backgrounds, cross-fades, edge fades, YouTube stream proxy. |
73
+ | **[`media.md`](./modules/media.md)** | The unified media transport session behind dock controls; playback leader vs audible displacement. |
74
+ | **[`ambient.md`](./modules/ambient.md)** | Media color extraction → OKLCH dynamic canvas illumination. |
75
+ | **[`controls.md`](./modules/controls.md)** | Paired control rails beside the dock, hotkeys, page controls. |
76
+ | **[`context-menu.md`](./modules/context-menu.md)** | Declarative right-click menus, viewport clamping, accessibility, hotkey triggers. |
77
+ | **[`error-boundary.md`](./modules/error-boundary.md)** | Hierarchical boundaries, diagnostic `report()` sink, deduplicating reporter, user-safe messages. |
78
+ | **[`result.md`](./modules/result.md)** | Functional `Result<T, E>` pattern, `ok()`, `err()`, safe server actions. |
79
+
80
+ ---
81
+
82
+ ## 3. Find It Fast (by Task)
83
+
84
+ | I want to… | Read |
85
+ | :--- | :--- |
86
+ | Install and set up the package in a Next.js App | [`getting-started.md`](./getting-started.md) |
87
+ | Add a page with a title, icon, and background | [`getting-started.md §5`](./getting-started.md#5-building-your-first-route-with-usepage) → [`dock.md §3`](./modules/dock.md#3-quick-start) |
88
+ | Restyle a module with custom Tailwind classes | [`theming.md`](./theming.md) |
89
+ | Build an interactive onboarding tour or custom module | [`custom-modules.md`](./custom-modules.md) |
90
+ | Open a multi-step sheet/wizard and await result | [`dock.md §8`](./modules/dock.md#8-surfaces) |
91
+ | Confirm an action with a modal dialog | [`modal.md`](./modules/modal.md) |
92
+ | Show "Saved" toast or handle Server Action feedback | [`notification.md`](./modules/notification.md), [`result.md`](./modules/result.md) |
93
+ | Block navigation when leaving a dirty form | [`dock.md §12`](./modules/dock.md#12-navigation-guards-and-transactions) |
94
+ | Display progress for a long background operation | [`dock.md §9.4`](./modules/dock.md#94-operations) |
95
+ | Play audio synchronized to background media | [`media.md`](./modules/media.md) |
96
+ | Dynamically tint the canvas based on an image | [`ambient.md`](./modules/ambient.md) |
97
+ | Add action buttons beside the floating dock | [`controls.md`](./modules/controls.md) |
98
+ | Attach a contextual right-click menu | [`context-menu.md`](./modules/context-menu.md) |
99
+ | Animate an element with hardware GPU acceleration | [`core-engine.md §6`](./core-engine.md#6-motion--design-tokens-omerdlwbase-frameworktokens), [Rule 4](./architecture-and-rules.md#rule-4-motion-token-singularity) |
100
+ | Write a robust, type-safe Server Action | [`result.md`](./modules/result.md) |
101
+ | Run tests or write a new unit/integration test | [`testing.md`](./testing.md) |
102
+ | Resolve an architecture or lint boundary failure | [`architecture-and-rules.md §4`](./architecture-and-rules.md#4-enforcement-mechanisms) |
103
+
104
+ ---
105
+
106
+ ## 4. Working in the Codebase
107
+
108
+ 1. **Before writing code:** Read [`architecture-and-rules.md`](./architecture-and-rules.md) for import restrictions and the 10 inviolable rules, plus the module guide for any unit you touch.
109
+ 2. **Finding your way:** Each module guide opens with an *At a Glance* table and ends with a *File Map*; use them instead of grepping whole directories.
110
+ 3. **Modifying a module:** Update its documentation in the same commit (documentation is treated as code).
111
+ 4. **Before committing:** Run the pre-flight suite:
112
+ ```bash
113
+ npm run type-check && npm run lint && npm run check:architecture && npm test && npm run build
114
+ ```
115
+ All checks must exit `0`.
116
+
117
+ ---
118
+
119
+ ## 5. Conventions Used in These Docs
120
+
121
+ - Package imports use `@omerdlw/base-framework/*` (e.g., `@omerdlw/base-framework/kernel`, `@omerdlw/base-framework/modules/dock`).
122
+ - "Page API" refers to `usePage(...).modules.<id>`; "peer" refers to a module consumed via `definePeer` / `useModuleState`.
123
+ - Configuration tables list **defaults**; if a default is not stated, the option is optional and defaults to undefined.
124
+ - When documentation and source code disagree, **the code wins** — fix the documentation immediately.