@omerdlw/base-framework 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +121 -52
  3. package/dist/hooks/index.d.ts +1 -10
  4. package/dist/hooks/index.d.ts.map +1 -1
  5. package/dist/hooks/index.js +2 -538
  6. package/dist/hooks/index.js.map +1 -1
  7. package/dist/hooks/types.d.ts +0 -53
  8. package/dist/hooks/types.d.ts.map +1 -1
  9. package/dist/hooks/use-global-event.d.ts +0 -2
  10. package/dist/hooks/use-global-event.d.ts.map +1 -1
  11. package/dist/index.js +138 -742
  12. package/dist/index.js.map +1 -1
  13. package/dist/kernel/index.js +3 -3
  14. package/dist/kernel/index.js.map +1 -1
  15. package/dist/modules/ambient/index.js.map +1 -1
  16. package/dist/modules/background/index.js +5 -5
  17. package/dist/modules/background/index.js.map +1 -1
  18. package/dist/modules/context-menu/index.js +4 -4
  19. package/dist/modules/context-menu/index.js.map +1 -1
  20. package/dist/modules/controls/index.js +3 -3
  21. package/dist/modules/controls/index.js.map +1 -1
  22. package/dist/modules/dock/cards.d.ts +1 -1
  23. package/dist/modules/dock/hooks.d.ts +1 -1
  24. package/dist/modules/dock/index.js +3 -3
  25. package/dist/modules/dock/index.js.map +1 -1
  26. package/dist/modules/index.js +34 -115
  27. package/dist/modules/index.js.map +1 -1
  28. package/dist/modules/loading/index.js +3 -3
  29. package/dist/modules/loading/index.js.map +1 -1
  30. package/dist/modules/media/index.js.map +1 -1
  31. package/dist/modules/modal/index.js +11 -95
  32. package/dist/modules/modal/index.js.map +1 -1
  33. package/dist/modules/notification/index.js +7 -5
  34. package/dist/modules/notification/index.js.map +1 -1
  35. package/dist/provider.js.map +1 -1
  36. package/dist/utils/dom.d.ts +0 -2
  37. package/dist/utils/dom.d.ts.map +1 -1
  38. package/dist/utils/index.d.ts +5 -6
  39. package/dist/utils/index.d.ts.map +1 -1
  40. package/dist/utils/index.js +19 -84
  41. package/dist/utils/index.js.map +1 -1
  42. package/dist/utils/number.d.ts +0 -1
  43. package/dist/utils/number.d.ts.map +1 -1
  44. package/dist/utils/object.d.ts +0 -2
  45. package/dist/utils/object.d.ts.map +1 -1
  46. package/dist/utils/string.d.ts +0 -3
  47. package/dist/utils/string.d.ts.map +1 -1
  48. package/dist/utils/timing.d.ts +0 -1
  49. package/dist/utils/timing.d.ts.map +1 -1
  50. package/docs/README.md +124 -0
  51. package/docs/architecture-and-rules.md +129 -0
  52. package/docs/core-engine.md +196 -0
  53. package/docs/custom-modules.md +267 -0
  54. package/docs/getting-started.md +199 -0
  55. package/docs/modules/README.md +176 -0
  56. package/docs/modules/ambient.md +150 -0
  57. package/docs/modules/background.md +195 -0
  58. package/docs/modules/context-menu.md +248 -0
  59. package/docs/modules/controls.md +159 -0
  60. package/docs/modules/dock.md +734 -0
  61. package/docs/modules/error-boundary.md +160 -0
  62. package/docs/modules/kernel.md +266 -0
  63. package/docs/modules/loading.md +157 -0
  64. package/docs/modules/media.md +196 -0
  65. package/docs/modules/modal.md +229 -0
  66. package/docs/modules/notification.md +161 -0
  67. package/docs/modules/result.md +135 -0
  68. package/docs/testing.md +160 -0
  69. package/docs/theming.md +185 -0
  70. package/package.json +3 -1
  71. package/templates/AGENTS.md +165 -0
@@ -1,5 +1,3 @@
1
1
  export declare const isBrowser: boolean;
2
2
  export declare function acquireGlobalScrollLock(): () => void;
3
- export declare function getSiteUrl(): string;
4
- export declare function getCurrentPath(): string;
5
3
  //# sourceMappingURL=dom.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../src/utils/dom.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS,EAAE,OAAuC,CAAC;AAWhE,wBAAgB,uBAAuB,IAAI,MAAM,IAAI,CAkCpD;AAED,wBAAgB,UAAU,IAAI,MAAM,CAInC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAGvC"}
1
+ {"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../src/utils/dom.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,EAAE,OAAuC,CAAC;AAWhE,wBAAgB,uBAAuB,IAAI,MAAM,IAAI,CAkCpD"}
@@ -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 } 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,EAAE,SAAS,EAAE,uBAAuB,EAAE,MAAM,OAAO,CAAC;AAC3D,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"}
@@ -6,39 +6,6 @@ function cn(...inputs) {
6
6
  return twMerge(clsx(inputs));
7
7
  }
8
8
 
9
- // src/utils/string.ts
10
- function trimToNull(value) {
11
- if (value === null || value === void 0) return null;
12
- const trimmed = String(value).trim();
13
- return trimmed.length > 0 ? trimmed : null;
14
- }
15
- function stripTrailingSlash(url) {
16
- if (typeof url !== "string") return "";
17
- return url.replace(/\/+$/, "");
18
- }
19
- function normalizePath(path) {
20
- const trimmed = trimToNull(path);
21
- if (!trimmed) return "";
22
- if (trimmed === "/") return "/";
23
- return stripTrailingSlash(trimmed);
24
- }
25
- function isImageIconSource(icon) {
26
- return typeof icon === "string" && (icon.startsWith("http://") || icon.startsWith("https://") || icon.startsWith("/") || icon.startsWith("data:image/"));
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
-
42
9
  // src/utils/dom.ts
43
10
  var isBrowser = typeof window !== "undefined";
44
11
  var globalScrollLockCount = 0;
@@ -72,14 +39,25 @@ function acquireGlobalScrollLock() {
72
39
  globalScrollLockStyles = null;
73
40
  };
74
41
  }
75
- function getSiteUrl() {
76
- return stripTrailingSlash(
77
- process.env.NEXT_PUBLIC_SITE_URL || "http://localhost:3000"
78
- );
42
+
43
+ // src/utils/string.ts
44
+ function trimToNull(value) {
45
+ if (value === null || value === void 0) return null;
46
+ const trimmed = String(value).trim();
47
+ return trimmed.length > 0 ? trimmed : null;
48
+ }
49
+ function stripTrailingSlash(url) {
50
+ if (typeof url !== "string") return "";
51
+ return url.replace(/\/+$/, "");
52
+ }
53
+ function normalizePath(path) {
54
+ const trimmed = trimToNull(path);
55
+ if (!trimmed) return "";
56
+ if (trimmed === "/") return "/";
57
+ return stripTrailingSlash(trimmed);
79
58
  }
80
- function getCurrentPath() {
81
- if (!isBrowser) return "/";
82
- return `${window.location.pathname}${window.location.search}`;
59
+ function isImageIconSource(icon) {
60
+ return typeof icon === "string" && (icon.startsWith("http://") || icon.startsWith("https://") || icon.startsWith("/") || icon.startsWith("data:image/"));
83
61
  }
84
62
 
85
63
  // src/utils/number.ts
@@ -92,11 +70,6 @@ function toFiniteNumber(value, fallback = 0) {
92
70
  const parsed = Number(value);
93
71
  return Number.isFinite(parsed) ? parsed : fallback;
94
72
  }
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
73
 
101
74
  // src/utils/object.ts
102
75
  function isObject(value) {
@@ -107,13 +80,6 @@ function isPlainObject(value) {
107
80
  const proto = Object.getPrototypeOf(value);
108
81
  return proto === Object.prototype || proto === null;
109
82
  }
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
83
  function shallowEqual(a, b) {
118
84
  if (Object.is(a, b)) return true;
119
85
  if (typeof a !== "object" || a === null || typeof b !== "object" || b === null) {
@@ -136,22 +102,8 @@ function toArray(value) {
136
102
  if (value === null || value === void 0) return [];
137
103
  return Array.isArray(value) ? value : [value];
138
104
  }
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
105
 
151
106
  // src/utils/timing.ts
152
- function sleep(ms = 0) {
153
- return new Promise((resolve) => setTimeout(resolve, ms));
154
- }
155
107
  function debounce(func, wait = 300) {
156
108
  let timeoutId = null;
157
109
  function debounced(...args) {
@@ -196,23 +148,6 @@ function throttle(func, limit = 300) {
196
148
  return throttled;
197
149
  }
198
150
 
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
151
  // src/utils/report.ts
217
152
  var sink = null;
218
153
  function report(scope, error, level = "error") {
@@ -480,6 +415,6 @@ function createScheduler({
480
415
  });
481
416
  }
482
417
 
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 };
418
+ export { USER_MESSAGES, UserError, acquireGlobalScrollLock, clamp, cn, createScheduler, createStore, debounce, isBrowser, isImageIconSource, isObject, isPlainObject, normalizePath, report, setReportSink, shallowEqual, stripTrailingSlash, throttle, toArray, toFiniteNumber, toUserMessage, trimToNull };
484
419
  //# sourceMappingURL=index.js.map
485
420
  //# 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/dom.ts","../../src/utils/string.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 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","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","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.