@omerdlw/base-framework 1.0.6 → 2.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 (234) hide show
  1. package/dist/atoms/index.js +1 -103
  2. package/dist/atoms/index.js.map +1 -1
  3. package/dist/chunk-3BUP64Q6.js +105 -0
  4. package/dist/chunk-3BUP64Q6.js.map +1 -0
  5. package/dist/chunk-4GMQKD6F.js +353 -0
  6. package/dist/chunk-4GMQKD6F.js.map +1 -0
  7. package/dist/chunk-6SG7V77J.js +577 -0
  8. package/dist/chunk-6SG7V77J.js.map +1 -0
  9. package/dist/chunk-6ZJVLUBE.js +26 -0
  10. package/dist/chunk-6ZJVLUBE.js.map +1 -0
  11. package/dist/chunk-7HQMXTNP.js +419 -0
  12. package/dist/chunk-7HQMXTNP.js.map +1 -0
  13. package/dist/chunk-7TAVYJ3A.js +371 -0
  14. package/dist/chunk-7TAVYJ3A.js.map +1 -0
  15. package/dist/chunk-A5RE3F6O.js +9905 -0
  16. package/dist/chunk-A5RE3F6O.js.map +1 -0
  17. package/dist/chunk-AQ4BNXA2.js +349 -0
  18. package/dist/chunk-AQ4BNXA2.js.map +1 -0
  19. package/dist/chunk-CGHZSSFR.js +2166 -0
  20. package/dist/chunk-CGHZSSFR.js.map +1 -0
  21. package/dist/chunk-DGCQWQLZ.js +61 -0
  22. package/dist/chunk-DGCQWQLZ.js.map +1 -0
  23. package/dist/chunk-FIMPHODX.js +67 -0
  24. package/dist/chunk-FIMPHODX.js.map +1 -0
  25. package/dist/chunk-GF7TUX5I.js +1889 -0
  26. package/dist/chunk-GF7TUX5I.js.map +1 -0
  27. package/dist/chunk-JELG4JLT.js +454 -0
  28. package/dist/chunk-JELG4JLT.js.map +1 -0
  29. package/dist/chunk-K676GL7Z.js +51 -0
  30. package/dist/chunk-K676GL7Z.js.map +1 -0
  31. package/dist/chunk-QI3ALLIB.js +38 -0
  32. package/dist/chunk-QI3ALLIB.js.map +1 -0
  33. package/dist/chunk-QXR55VVS.js +1139 -0
  34. package/dist/chunk-QXR55VVS.js.map +1 -0
  35. package/dist/chunk-R2YGFJDJ.js +408 -0
  36. package/dist/chunk-R2YGFJDJ.js.map +1 -0
  37. package/dist/chunk-RFZQWLC5.js +27 -0
  38. package/dist/chunk-RFZQWLC5.js.map +1 -0
  39. package/dist/chunk-SKBITB5X.js +888 -0
  40. package/dist/chunk-SKBITB5X.js.map +1 -0
  41. package/dist/chunk-SYAVGTOX.js +521 -0
  42. package/dist/chunk-SYAVGTOX.js.map +1 -0
  43. package/dist/chunk-TV3WEF5G.js +784 -0
  44. package/dist/chunk-TV3WEF5G.js.map +1 -0
  45. package/dist/chunk-XASQT4CQ.js +280 -0
  46. package/dist/chunk-XASQT4CQ.js.map +1 -0
  47. package/dist/error/index.js +5 -682
  48. package/dist/error/index.js.map +1 -1
  49. package/dist/error/reporter.d.ts.map +1 -1
  50. package/dist/error/theme.d.ts +1 -1
  51. package/dist/error/theme.d.ts.map +1 -1
  52. package/dist/events.js +1 -7
  53. package/dist/events.js.map +1 -1
  54. package/dist/hooks/index.js +1 -358
  55. package/dist/hooks/index.js.map +1 -1
  56. package/dist/hooks/use-global-event.d.ts +1 -1
  57. package/dist/index.js +18 -20029
  58. package/dist/index.js.map +1 -1
  59. package/dist/kernel/index.js +2 -2035
  60. package/dist/kernel/index.js.map +1 -1
  61. package/dist/kernel/types.d.ts +1 -1
  62. package/dist/modules/ambient/analyze.d.ts +46 -0
  63. package/dist/modules/ambient/analyze.d.ts.map +1 -0
  64. package/dist/modules/ambient/constants.d.ts +1 -5
  65. package/dist/modules/ambient/constants.d.ts.map +1 -1
  66. package/dist/modules/ambient/context.d.ts.map +1 -1
  67. package/dist/modules/ambient/dom.d.ts +11 -12
  68. package/dist/modules/ambient/dom.d.ts.map +1 -1
  69. package/dist/modules/ambient/extractor.d.ts +10 -10
  70. package/dist/modules/ambient/extractor.d.ts.map +1 -1
  71. package/dist/modules/ambient/hooks.d.ts +1 -1
  72. package/dist/modules/ambient/hooks.d.ts.map +1 -1
  73. package/dist/modules/ambient/index.d.ts +6 -4
  74. package/dist/modules/ambient/index.d.ts.map +1 -1
  75. package/dist/modules/ambient/index.js +7 -762
  76. package/dist/modules/ambient/index.js.map +1 -1
  77. package/dist/modules/ambient/module.d.ts +1 -1
  78. package/dist/modules/ambient/module.d.ts.map +1 -1
  79. package/dist/modules/ambient/oklab.d.ts +36 -0
  80. package/dist/modules/ambient/oklab.d.ts.map +1 -0
  81. package/dist/modules/ambient/pipeline.d.ts +28 -0
  82. package/dist/modules/ambient/pipeline.d.ts.map +1 -0
  83. package/dist/modules/ambient/quantize.d.ts +22 -0
  84. package/dist/modules/ambient/quantize.d.ts.map +1 -0
  85. package/dist/modules/ambient/server/address.d.ts +8 -0
  86. package/dist/modules/ambient/server/address.d.ts.map +1 -0
  87. package/dist/modules/ambient/server/index.d.ts +53 -0
  88. package/dist/modules/ambient/server/index.d.ts.map +1 -0
  89. package/dist/modules/ambient/server/index.js +221 -0
  90. package/dist/modules/ambient/server/index.js.map +1 -0
  91. package/dist/modules/ambient/settings.d.ts +19 -0
  92. package/dist/modules/ambient/settings.d.ts.map +1 -0
  93. package/dist/modules/ambient/types.d.ts +105 -9
  94. package/dist/modules/ambient/types.d.ts.map +1 -1
  95. package/dist/modules/ambient/worker/index.d.ts +15 -0
  96. package/dist/modules/ambient/worker/index.d.ts.map +1 -0
  97. package/dist/modules/ambient/worker/index.js +114 -0
  98. package/dist/modules/ambient/worker/index.js.map +1 -0
  99. package/dist/modules/background/constants.d.ts +2 -2
  100. package/dist/modules/background/constants.d.ts.map +1 -1
  101. package/dist/modules/background/hooks.d.ts +1 -1
  102. package/dist/modules/background/index.js +6 -3078
  103. package/dist/modules/background/index.js.map +1 -1
  104. package/dist/modules/background/motion.d.ts +9 -7
  105. package/dist/modules/background/motion.d.ts.map +1 -1
  106. package/dist/modules/background/overlay.d.ts +3 -8
  107. package/dist/modules/background/overlay.d.ts.map +1 -1
  108. package/dist/modules/background/types.d.ts +16 -2
  109. package/dist/modules/background/types.d.ts.map +1 -1
  110. package/dist/modules/context-menu/constants.d.ts +2 -2
  111. package/dist/modules/context-menu/constants.d.ts.map +1 -1
  112. package/dist/modules/context-menu/hooks.d.ts +1 -1
  113. package/dist/modules/context-menu/index.js +10 -1896
  114. package/dist/modules/context-menu/index.js.map +1 -1
  115. package/dist/modules/context-menu/motion.d.ts +1 -8
  116. package/dist/modules/context-menu/motion.d.ts.map +1 -1
  117. package/dist/modules/context-menu/overlay.d.ts.map +1 -1
  118. package/dist/modules/context-menu/types.d.ts +16 -2
  119. package/dist/modules/context-menu/types.d.ts.map +1 -1
  120. package/dist/modules/controls/constants.d.ts +1 -1
  121. package/dist/modules/controls/constants.d.ts.map +1 -1
  122. package/dist/modules/controls/entries.d.ts +1 -1
  123. package/dist/modules/controls/hooks.d.ts +1 -1
  124. package/dist/modules/controls/index.js +4 -1110
  125. package/dist/modules/controls/index.js.map +1 -1
  126. package/dist/modules/controls/overlay.d.ts +1 -1
  127. package/dist/modules/controls/types.d.ts +2 -2
  128. package/dist/modules/dock/cards.d.ts +711 -24
  129. package/dist/modules/dock/cards.d.ts.map +1 -1
  130. package/dist/modules/dock/constants.d.ts +2 -2
  131. package/dist/modules/dock/constants.d.ts.map +1 -1
  132. package/dist/modules/dock/helpers.d.ts +2 -2
  133. package/dist/modules/dock/hooks.d.ts +2 -2
  134. package/dist/modules/dock/index.d.ts +1 -1
  135. package/dist/modules/dock/index.d.ts.map +1 -1
  136. package/dist/modules/dock/index.js +9 -12132
  137. package/dist/modules/dock/index.js.map +1 -1
  138. package/dist/modules/dock/layout.d.ts.map +1 -1
  139. package/dist/modules/dock/module.d.ts +1 -1
  140. package/dist/modules/dock/motion.d.ts +44 -912
  141. package/dist/modules/dock/motion.d.ts.map +1 -1
  142. package/dist/modules/dock/overlay.d.ts +1 -1
  143. package/dist/modules/dock/overlay.d.ts.map +1 -1
  144. package/dist/modules/dock/runtime/dock.d.ts +1 -23
  145. package/dist/modules/dock/runtime/dock.d.ts.map +1 -1
  146. package/dist/modules/dock/styles.d.ts +4 -4
  147. package/dist/modules/dock/surface/hooks.d.ts +5 -20
  148. package/dist/modules/dock/surface/hooks.d.ts.map +1 -1
  149. package/dist/modules/dock/surface/machine.d.ts +4 -3
  150. package/dist/modules/dock/surface/machine.d.ts.map +1 -1
  151. package/dist/modules/dock/surface/stack.d.ts.map +1 -1
  152. package/dist/modules/dock/surface/view-model.d.ts.map +1 -1
  153. package/dist/modules/dock/types.d.ts +162 -3
  154. package/dist/modules/dock/types.d.ts.map +1 -1
  155. package/dist/modules/index.js +16 -17883
  156. package/dist/modules/index.js.map +1 -1
  157. package/dist/modules/loading/constants.d.ts +1 -1
  158. package/dist/modules/loading/constants.d.ts.map +1 -1
  159. package/dist/modules/loading/context.d.ts +1 -1
  160. package/dist/modules/loading/hooks.d.ts +1 -1
  161. package/dist/modules/loading/index.js +5 -1153
  162. package/dist/modules/loading/index.js.map +1 -1
  163. package/dist/modules/loading/types.d.ts +2 -2
  164. package/dist/modules/media/context.d.ts +1 -1
  165. package/dist/modules/media/index.js +3 -570
  166. package/dist/modules/media/index.js.map +1 -1
  167. package/dist/modules/media/types.d.ts +2 -2
  168. package/dist/modules/modal/constants.d.ts +2 -2
  169. package/dist/modules/modal/constants.d.ts.map +1 -1
  170. package/dist/modules/modal/context.d.ts +1 -1
  171. package/dist/modules/modal/hooks.d.ts +3 -3
  172. package/dist/modules/modal/index.js +8 -2355
  173. package/dist/modules/modal/index.js.map +1 -1
  174. package/dist/modules/modal/motion.d.ts +3 -8
  175. package/dist/modules/modal/motion.d.ts.map +1 -1
  176. package/dist/modules/modal/overlay.d.ts.map +1 -1
  177. package/dist/modules/modal/types.d.ts +21 -0
  178. package/dist/modules/modal/types.d.ts.map +1 -1
  179. package/dist/modules/notification/constants.d.ts +2 -2
  180. package/dist/modules/notification/constants.d.ts.map +1 -1
  181. package/dist/modules/notification/context.d.ts +1 -1
  182. package/dist/modules/notification/hooks.d.ts +1 -1
  183. package/dist/modules/notification/index.js +4 -828
  184. package/dist/modules/notification/index.js.map +1 -1
  185. package/dist/modules/notification/motion.d.ts +1 -7
  186. package/dist/modules/notification/motion.d.ts.map +1 -1
  187. package/dist/modules/notification/overlay.d.ts.map +1 -1
  188. package/dist/modules/notification/types.d.ts +9 -1
  189. package/dist/modules/notification/types.d.ts.map +1 -1
  190. package/dist/overlay-TZ6L52A5.js +9 -0
  191. package/dist/overlay-TZ6L52A5.js.map +1 -0
  192. package/dist/provider.d.ts +1 -1
  193. package/dist/provider.d.ts.map +1 -1
  194. package/dist/provider.js +6 -1968
  195. package/dist/provider.js.map +1 -1
  196. package/dist/result.js +2 -63
  197. package/dist/result.js.map +1 -1
  198. package/dist/theme.d.ts +45 -8
  199. package/dist/theme.d.ts.map +1 -1
  200. package/dist/theme.js +3 -41
  201. package/dist/theme.js.map +1 -1
  202. package/dist/tokens/index.d.ts +1 -0
  203. package/dist/tokens/index.d.ts.map +1 -1
  204. package/dist/tokens/index.js +126 -155
  205. package/dist/tokens/index.js.map +1 -1
  206. package/dist/tokens/motion-config.d.ts +44 -0
  207. package/dist/tokens/motion-config.d.ts.map +1 -0
  208. package/dist/tokens/motion.d.ts +23 -174
  209. package/dist/tokens/motion.d.ts.map +1 -1
  210. package/dist/utils/index.js +4 -82
  211. package/dist/utils/index.js.map +1 -1
  212. package/dist/utils/report.d.ts.map +1 -1
  213. package/docs/README.md +1 -0
  214. package/docs/architecture-and-rules.md +4 -3
  215. package/docs/core-engine.md +7 -10
  216. package/docs/getting-started.md +4 -2
  217. package/docs/modules/ambient.md +194 -80
  218. package/docs/modules/background.md +3 -3
  219. package/docs/modules/context-menu.md +2 -2
  220. package/docs/modules/dock.md +9 -6
  221. package/docs/modules/modal.md +2 -2
  222. package/docs/modules/notification.md +2 -2
  223. package/docs/theming.md +81 -9
  224. package/package.json +22 -5
  225. package/templates/AGENTS.md +1 -1
  226. package/templates/motion/background.ts +17 -0
  227. package/templates/motion/context-menu.ts +63 -0
  228. package/templates/motion/dock.ts +327 -0
  229. package/templates/motion/modal.ts +79 -0
  230. package/templates/motion/notification.ts +27 -0
  231. package/templates/motion/tokens.ts +47 -0
  232. package/templates/tsconfig.json +7 -0
  233. package/dist/modules/ambient/color.d.ts +0 -21
  234. package/dist/modules/ambient/color.d.ts.map +0 -1
@@ -0,0 +1,454 @@
1
+ import { defineThemeSpec, useTheme } from './chunk-7TAVYJ3A.js';
2
+ import { report, globalEvents, EVENT_TYPES, toUserMessage, setReportSink } from './chunk-TV3WEF5G.js';
3
+ import { Icon, Button } from './chunk-3BUP64Q6.js';
4
+ import React, { useRef, useCallback, useEffect } from 'react';
5
+ import { usePathname } from 'next/navigation';
6
+ import { jsx, jsxs } from 'react/jsx-runtime';
7
+
8
+ // src/error/constants.ts
9
+ var ERROR_MESSAGES = Object.freeze({
10
+ GLOBAL_TITLE: "Something went wrong",
11
+ GLOBAL_MSG: "We ran into an unexpected problem. Please try again",
12
+ MODULE_TITLE: "Something went wrong",
13
+ MODULE_MSG: "This part of the app isn't working right now. Please try again",
14
+ COMPONENT_MSG: "This section couldn't be loaded. Please try again",
15
+ FALLBACK_TITLE: "Something went wrong",
16
+ FALLBACK_MSG: "This section couldn't be loaded. Please try again"
17
+ });
18
+ var MAX_CONTEXT = 10;
19
+ var MAX_FINGERPRINTS = 100;
20
+ var DEFAULT_DEDUPE_WINDOW = 6e4;
21
+ var ERROR_LISTENER_CONFIG = Object.freeze({
22
+ maxErrors: 10,
23
+ throttle: 2e3,
24
+ ignored: Object.freeze([
25
+ /ResizeObserver loop/i,
26
+ /Network request failed/i,
27
+ /Loading chunk/i,
28
+ /Unexpected end of input/i,
29
+ /Failed to fetch/i,
30
+ /Script error/i,
31
+ /HTTP\s*404/i
32
+ ])
33
+ });
34
+
35
+ // src/error/utils.ts
36
+ var IS_BROWSER = typeof window !== "undefined";
37
+ var HAS_NAVIGATOR = typeof navigator !== "undefined";
38
+ var getRuntimePath = () => typeof window !== "undefined" ? window.location.pathname : null;
39
+ var getUserAgent = () => typeof navigator !== "undefined" ? navigator.userAgent : null;
40
+ function createErrorContext({
41
+ errorInfo,
42
+ name,
43
+ title,
44
+ variant
45
+ }) {
46
+ return {
47
+ componentStack: errorInfo?.componentStack || null,
48
+ route: getRuntimePath(),
49
+ userAgent: getUserAgent(),
50
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
51
+ name: name || title || "ErrorBoundary",
52
+ variant: variant || "default",
53
+ source: "ErrorBoundary"
54
+ };
55
+ }
56
+ function normalizeSampleRate(value) {
57
+ const sampleRate = Number(value);
58
+ return Number.isFinite(sampleRate) ? Math.min(1, Math.max(0, sampleRate)) : 1;
59
+ }
60
+ function normalizeDedupeWindow(value) {
61
+ const dedupeWindow = Number(value);
62
+ return Number.isFinite(dedupeWindow) ? Math.max(0, dedupeWindow) : DEFAULT_DEDUPE_WINDOW;
63
+ }
64
+ function getBrowserEnvironment(route) {
65
+ return {
66
+ route: route || (IS_BROWSER ? window.location.pathname : null),
67
+ userAgent: HAS_NAVIGATOR ? navigator.userAgent : null,
68
+ platform: HAS_NAVIGATOR ? navigator.platform : null,
69
+ language: HAS_NAVIGATOR ? navigator.language : null,
70
+ online: HAS_NAVIGATOR ? navigator.onLine : true,
71
+ url: IS_BROWSER ? window.location.href : null
72
+ };
73
+ }
74
+ function fingerprint(error, context = {}) {
75
+ const stackTop = typeof context.componentStack === "string" ? context.componentStack.split("\n").find(Boolean) || "" : "";
76
+ const errObj = error;
77
+ const errorMessage = (errObj?.message || String(error || "")).slice(0, 100);
78
+ const errorName = errObj?.name || "UnknownError";
79
+ const route = context.route || "";
80
+ return [stackTop, errorMessage, errorName, route].filter(Boolean).join("::");
81
+ }
82
+ function createReport(error, {
83
+ context = {},
84
+ tags = {}
85
+ } = {}) {
86
+ const errObj = error;
87
+ return {
88
+ error: {
89
+ message: errObj?.message || String(error),
90
+ stack: errObj?.stack || null,
91
+ name: errObj?.name || "UnknownError"
92
+ },
93
+ fingerprint: fingerprint(error, context),
94
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
95
+ environment: getBrowserEnvironment(context.route),
96
+ componentStack: context.componentStack || null,
97
+ context,
98
+ tags
99
+ };
100
+ }
101
+ function getErrorMessage(error) {
102
+ if (!error) return "";
103
+ if (typeof error === "string") return error.trim();
104
+ if (error instanceof Error) return error.message.trim();
105
+ const errObj = error;
106
+ return String(errObj?.message || errObj?.toString?.() || error).trim();
107
+ }
108
+ function shouldIgnoreError(error) {
109
+ if (!error) return true;
110
+ const errWithNotFound = error;
111
+ if (typeof errWithNotFound?.isNotFound === "function" && errWithNotFound.isNotFound()) {
112
+ return true;
113
+ }
114
+ const message = getErrorMessage(error);
115
+ return ERROR_LISTENER_CONFIG.ignored.some((pattern) => pattern.test(message));
116
+ }
117
+
118
+ // src/error/reporter.ts
119
+ var IS_PRODUCTION = process.env.NODE_ENV === "production";
120
+ var IS_BROWSER2 = typeof window !== "undefined";
121
+ var ErrorReporter = class {
122
+ handlers = [];
123
+ context = {};
124
+ tags = {};
125
+ seen = /* @__PURE__ */ new Set();
126
+ enabled;
127
+ sampleRate;
128
+ beforeSend;
129
+ dedupeWindow;
130
+ constructor(options = {}) {
131
+ this.enabled = options.enabled ?? true;
132
+ this.sampleRate = normalizeSampleRate(options.sampleRate ?? 1);
133
+ this.beforeSend = options.beforeSend || null;
134
+ this.dedupeWindow = normalizeDedupeWindow(
135
+ options.deduplicateWindow ?? DEFAULT_DEDUPE_WINDOW
136
+ );
137
+ }
138
+ addHandler(handler) {
139
+ if (typeof handler?.handle === "function") {
140
+ this.handlers.push(handler);
141
+ }
142
+ return this;
143
+ }
144
+ removeHandler(name) {
145
+ this.handlers = this.handlers.filter((handler) => handler.name !== name);
146
+ return this;
147
+ }
148
+ setContext(key, value) {
149
+ if (Object.hasOwn(this.context, key) || Object.keys(this.context).length < MAX_CONTEXT) {
150
+ this.context[key] = value;
151
+ }
152
+ return this;
153
+ }
154
+ setTag(key, value) {
155
+ this.tags[key] = String(value);
156
+ return this;
157
+ }
158
+ captureError(error, extraContext = {}) {
159
+ if (!this.enabled || Math.random() > this.sampleRate) return;
160
+ this.ensureDefaultHandlers();
161
+ const context = { ...this.context, ...extraContext };
162
+ let report2 = createReport(error, { context, tags: { ...this.tags } });
163
+ const dedupeKey = report2.fingerprint;
164
+ if (this.seen.has(dedupeKey)) return;
165
+ if (this.seen.size >= MAX_FINGERPRINTS) {
166
+ const first = this.seen.keys().next().value;
167
+ if (first) this.seen.delete(first);
168
+ }
169
+ this.seen.add(dedupeKey);
170
+ setTimeout(() => this.seen.delete(dedupeKey), this.dedupeWindow);
171
+ if (typeof this.beforeSend === "function") {
172
+ try {
173
+ const transformed = this.beforeSend(report2);
174
+ if (!transformed) return;
175
+ report2 = transformed;
176
+ } catch {
177
+ }
178
+ }
179
+ this.handlers.forEach((handler) => {
180
+ try {
181
+ handler.handle(report2);
182
+ } catch {
183
+ }
184
+ });
185
+ return report2;
186
+ }
187
+ captureMessage(message, level = "info", context = {}) {
188
+ const error = new Error(message);
189
+ error.name = "Message";
190
+ return this.captureError(error, { ...context, level });
191
+ }
192
+ ensureDefaultHandlers() {
193
+ if (this.handlers.length || !IS_BROWSER2) return;
194
+ this.handlers.push(createConsoleHandler());
195
+ if (window.Sentry) {
196
+ const sentryHandler = createSentryHandler(window.Sentry);
197
+ if (sentryHandler.name === "sentry") {
198
+ this.handlers.push(sentryHandler);
199
+ }
200
+ }
201
+ }
202
+ };
203
+ var GLOBAL_REPORTER_KEY = /* @__PURE__ */ Symbol.for("__base_framework_error_reporter__");
204
+ var _global = globalThis;
205
+ function getErrorReporter(options = {}) {
206
+ return _global[GLOBAL_REPORTER_KEY] ??= new ErrorReporter(options);
207
+ }
208
+ function createConsoleHandler() {
209
+ return {
210
+ name: "console",
211
+ handle(report2) {
212
+ if (IS_PRODUCTION) return;
213
+ console.error("[ErrorReporter]", {
214
+ error: report2.error.message,
215
+ fingerprint: report2.fingerprint,
216
+ route: report2.environment.route
217
+ });
218
+ }
219
+ };
220
+ }
221
+ function createSentryHandler(Sentry) {
222
+ const sentryObj = Sentry;
223
+ if (!sentryObj || typeof sentryObj.captureException !== "function" || typeof sentryObj.withScope !== "function") {
224
+ return createConsoleHandler();
225
+ }
226
+ return {
227
+ name: "sentry",
228
+ handle(report2) {
229
+ sentryObj.withScope((scope) => {
230
+ if (report2.fingerprint) scope.setFingerprint([report2.fingerprint]);
231
+ if (report2.user) scope.setUser(report2.user);
232
+ if (report2.tags && typeof report2.tags === "object") {
233
+ Object.entries(report2.tags).forEach(
234
+ ([key, value]) => scope.setTag(key, String(value))
235
+ );
236
+ }
237
+ if (report2.environment)
238
+ scope.setContext("environment", report2.environment);
239
+ if (report2.context) scope.setContext("custom", report2.context);
240
+ if (report2.componentStack)
241
+ scope.setExtra("componentStack", report2.componentStack);
242
+ const error = new Error(report2.error.message);
243
+ error.name = report2.error.name || "Error";
244
+ error.stack = report2.error.stack || void 0;
245
+ sentryObj.captureException(error);
246
+ });
247
+ }
248
+ };
249
+ }
250
+
251
+ // src/error/theme.ts
252
+ var errorTheme = defineThemeSpec("error");
253
+ var ActionButton = Button;
254
+ function DefaultErrorFallback({
255
+ error,
256
+ message,
257
+ resetError,
258
+ title
259
+ }) {
260
+ const theme = useTheme(errorTheme);
261
+ return /* @__PURE__ */ jsxs("div", { className: theme.slots.screen, children: [
262
+ /* @__PURE__ */ jsx("div", { className: theme.slots.icon, children: /* @__PURE__ */ jsx(Icon, { icon: "solar:danger-circle-bold", size: 30 }) }),
263
+ /* @__PURE__ */ jsx("h3", { className: theme.slots.title, children: message || toUserMessage(error, { fallback: ERROR_MESSAGES.FALLBACK_MSG }) }),
264
+ /* @__PURE__ */ jsx(
265
+ ActionButton,
266
+ {
267
+ className: theme.slots.retryButton,
268
+ onClick: resetError,
269
+ type: "button",
270
+ children: "Try again"
271
+ }
272
+ )
273
+ ] });
274
+ }
275
+ var ErrorBoundaryCore = class extends React.Component {
276
+ constructor(props) {
277
+ super(props);
278
+ this.state = {
279
+ error: null,
280
+ errorInfo: null,
281
+ hasError: false,
282
+ lastResetKey: props.resetKey
283
+ };
284
+ }
285
+ static getDerivedStateFromError(error) {
286
+ return { error, hasError: true };
287
+ }
288
+ static getDerivedStateFromProps(props, state) {
289
+ if (props.resetKey !== state.lastResetKey) {
290
+ return {
291
+ error: null,
292
+ errorInfo: null,
293
+ hasError: false,
294
+ lastResetKey: props.resetKey
295
+ };
296
+ }
297
+ return null;
298
+ }
299
+ componentDidCatch(error, errorInfo) {
300
+ this.setState({ errorInfo });
301
+ const { message, name, onError, silent, title, variant } = this.props;
302
+ const context = createErrorContext({ errorInfo, name, title, variant });
303
+ try {
304
+ onError?.(error, errorInfo, context);
305
+ } catch (callbackError) {
306
+ report("ErrorBoundary onError callback", callbackError, "warn");
307
+ }
308
+ if (!silent) {
309
+ globalEvents.emit(EVENT_TYPES.APP_ERROR, {
310
+ error,
311
+ errorInfo,
312
+ message: message || toUserMessage(error),
313
+ resetError: this.resetError
314
+ });
315
+ }
316
+ try {
317
+ const reporter = getErrorReporter();
318
+ reporter?.captureError?.(error, context);
319
+ } catch (reportingError) {
320
+ report("ErrorBoundary reporting", reportingError, "warn");
321
+ }
322
+ }
323
+ resetError = () => {
324
+ this.setState({
325
+ error: null,
326
+ errorInfo: null,
327
+ hasError: false
328
+ });
329
+ this.props.onReset?.();
330
+ };
331
+ render() {
332
+ if (!this.state.hasError) return this.props.children;
333
+ const { fallback, message, title } = this.props;
334
+ const { error } = this.state;
335
+ if (typeof fallback === "function") {
336
+ return fallback({ error, resetError: this.resetError });
337
+ }
338
+ if (fallback) {
339
+ return fallback;
340
+ }
341
+ return /* @__PURE__ */ jsx(
342
+ DefaultErrorFallback,
343
+ {
344
+ error,
345
+ message,
346
+ resetError: this.resetError,
347
+ title
348
+ }
349
+ );
350
+ }
351
+ };
352
+ function GlobalError({ children, fallback, onReset }) {
353
+ const pathname = usePathname();
354
+ return /* @__PURE__ */ jsx(
355
+ ErrorBoundaryCore,
356
+ {
357
+ fallback,
358
+ message: ERROR_MESSAGES.GLOBAL_MSG,
359
+ onReset,
360
+ resetKey: pathname,
361
+ title: ERROR_MESSAGES.GLOBAL_TITLE,
362
+ variant: "full",
363
+ children
364
+ }
365
+ );
366
+ }
367
+ function ModuleError({
368
+ children,
369
+ fallback,
370
+ name,
371
+ onReset
372
+ }) {
373
+ return /* @__PURE__ */ jsx(
374
+ ErrorBoundaryCore,
375
+ {
376
+ fallback,
377
+ message: ERROR_MESSAGES.MODULE_MSG,
378
+ name,
379
+ onReset,
380
+ title: name ? `${name} Error` : ERROR_MESSAGES.MODULE_TITLE,
381
+ variant: "module",
382
+ children
383
+ }
384
+ );
385
+ }
386
+ function ComponentError({
387
+ children,
388
+ fallback,
389
+ message,
390
+ onReset
391
+ }) {
392
+ return /* @__PURE__ */ jsx(
393
+ ErrorBoundaryCore,
394
+ {
395
+ fallback,
396
+ message: message || ERROR_MESSAGES.COMPONENT_MSG,
397
+ onReset,
398
+ variant: "inline",
399
+ children
400
+ }
401
+ );
402
+ }
403
+ function GlobalErrorListener() {
404
+ const lastError = useRef(0);
405
+ const count = useRef(0);
406
+ const shown = useRef(/* @__PURE__ */ new Set());
407
+ const handleError = useCallback((error, source = "runtime") => {
408
+ if (shouldIgnoreError(error)) return;
409
+ const now = Date.now();
410
+ if (count.current >= ERROR_LISTENER_CONFIG.maxErrors) return;
411
+ if (now - lastError.current < ERROR_LISTENER_CONFIG.throttle) return;
412
+ const message = getErrorMessage(error);
413
+ const key = message || String(error);
414
+ if (shown.current.has(key)) return;
415
+ shown.current.add(key);
416
+ lastError.current = now;
417
+ count.current += 1;
418
+ try {
419
+ const reporter = getErrorReporter();
420
+ reporter?.captureError?.(error, {
421
+ globalListener: true,
422
+ source
423
+ });
424
+ } catch (reportingError) {
425
+ report("GlobalError reporting", reportingError, "warn");
426
+ }
427
+ globalEvents.emit(EVENT_TYPES.APP_ERROR, {
428
+ error,
429
+ message: toUserMessage(error)
430
+ });
431
+ }, []);
432
+ useEffect(() => {
433
+ const removeSink = setReportSink((scope, error, level) => {
434
+ try {
435
+ getErrorReporter().captureError(error, { level, scope });
436
+ } catch {
437
+ }
438
+ });
439
+ const onError = (event) => handleError(event.error || event.message, "window.onerror");
440
+ const onRejection = (event) => handleError(event.reason, "unhandledrejection");
441
+ window.addEventListener("error", onError);
442
+ window.addEventListener("unhandledrejection", onRejection);
443
+ return () => {
444
+ removeSink();
445
+ window.removeEventListener("error", onError);
446
+ window.removeEventListener("unhandledrejection", onRejection);
447
+ };
448
+ }, [handleError]);
449
+ return null;
450
+ }
451
+
452
+ export { ComponentError, DEFAULT_DEDUPE_WINDOW, ERROR_LISTENER_CONFIG, ERROR_MESSAGES, ErrorBoundaryCore, GlobalError, GlobalErrorListener, MAX_CONTEXT, MAX_FINGERPRINTS, ModuleError, createConsoleHandler, createErrorContext, createReport, createSentryHandler, errorTheme, fingerprint, getBrowserEnvironment, getErrorMessage, getErrorReporter, getRuntimePath, getUserAgent, normalizeDedupeWindow, normalizeSampleRate, shouldIgnoreError };
453
+ //# sourceMappingURL=chunk-JELG4JLT.js.map
454
+ //# sourceMappingURL=chunk-JELG4JLT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/error/constants.ts","../src/error/utils.ts","../src/error/reporter.ts","../src/error/theme.ts","../src/error/boundary.tsx","../src/error/listener.ts"],"names":["IS_BROWSER","report"],"mappings":"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","file":"chunk-JELG4JLT.js","sourcesContent":["export const ERROR_MESSAGES = Object.freeze({\n GLOBAL_TITLE: \"Something went wrong\",\n GLOBAL_MSG: \"We ran into an unexpected problem. Please try again\",\n MODULE_TITLE: \"Something went wrong\",\n MODULE_MSG: \"This part of the app isn't working right now. Please try again\",\n COMPONENT_MSG: \"This section couldn't be loaded. Please try again\",\n FALLBACK_TITLE: \"Something went wrong\",\n FALLBACK_MSG: \"This section couldn't be loaded. Please try again\",\n} as const);\n\nexport const MAX_CONTEXT = 10;\nexport const MAX_FINGERPRINTS = 100;\nexport const DEFAULT_DEDUPE_WINDOW = 60000;\n\nexport const ERROR_LISTENER_CONFIG = Object.freeze({\n maxErrors: 10,\n throttle: 2000,\n ignored: Object.freeze([\n /ResizeObserver loop/i,\n /Network request failed/i,\n /Loading chunk/i,\n /Unexpected end of input/i,\n /Failed to fetch/i,\n /Script error/i,\n /HTTP\\s*404/i,\n ]),\n} as const);\n","import type { ErrorInfo } from \"react\";\nimport { DEFAULT_DEDUPE_WINDOW, ERROR_LISTENER_CONFIG } from \"./constants\";\nimport type {\n BrowserEnvironment,\n ErrorContextData,\n ErrorReport,\n} from \"./types\";\n\nconst IS_BROWSER = typeof window !== \"undefined\";\nconst HAS_NAVIGATOR = typeof navigator !== \"undefined\";\n\nexport const getRuntimePath = (): string | null =>\n typeof window !== \"undefined\" ? window.location.pathname : null;\n\nexport const getUserAgent = (): string | null =>\n typeof navigator !== \"undefined\" ? navigator.userAgent : null;\n\nexport function createErrorContext({\n errorInfo,\n name,\n title,\n variant,\n}: {\n errorInfo?: ErrorInfo | null;\n name?: string;\n title?: string;\n variant?: string;\n}): ErrorContextData {\n return {\n componentStack: errorInfo?.componentStack || null,\n route: getRuntimePath(),\n userAgent: getUserAgent(),\n timestamp: new Date().toISOString(),\n name: name || title || \"ErrorBoundary\",\n variant: variant || \"default\",\n source: \"ErrorBoundary\",\n };\n}\n\nexport function normalizeSampleRate(value: unknown): number {\n const sampleRate = Number(value);\n return Number.isFinite(sampleRate) ? Math.min(1, Math.max(0, sampleRate)) : 1;\n}\n\nexport function normalizeDedupeWindow(value: unknown): number {\n const dedupeWindow = Number(value);\n return Number.isFinite(dedupeWindow)\n ? Math.max(0, dedupeWindow)\n : DEFAULT_DEDUPE_WINDOW;\n}\n\nexport function getBrowserEnvironment(\n route?: string | null,\n): BrowserEnvironment {\n return {\n route: route || (IS_BROWSER ? window.location.pathname : null),\n userAgent: HAS_NAVIGATOR ? navigator.userAgent : null,\n platform: HAS_NAVIGATOR ? navigator.platform : null,\n language: HAS_NAVIGATOR ? navigator.language : null,\n online: HAS_NAVIGATOR ? navigator.onLine : true,\n url: IS_BROWSER ? window.location.href : null,\n };\n}\n\nexport function fingerprint(\n error: unknown,\n context: Partial<ErrorContextData> = {},\n): string {\n const stackTop =\n typeof context.componentStack === \"string\"\n ? context.componentStack.split(\"\\n\").find(Boolean) || \"\"\n : \"\";\n\n const errObj = error as { message?: string; name?: string } | null;\n const errorMessage = (errObj?.message || String(error || \"\")).slice(0, 100);\n const errorName = errObj?.name || \"UnknownError\";\n const route = context.route || \"\";\n\n return [stackTop, errorMessage, errorName, route].filter(Boolean).join(\"::\");\n}\n\nexport function createReport(\n error: unknown,\n {\n context = {},\n tags = {},\n }: {\n context?: Record<string, unknown>;\n tags?: Record<string, string>;\n } = {},\n): ErrorReport {\n const errObj = error as {\n message?: string;\n name?: string;\n stack?: string;\n } | null;\n return {\n error: {\n message: errObj?.message || String(error),\n stack: errObj?.stack || null,\n name: errObj?.name || \"UnknownError\",\n },\n fingerprint: fingerprint(error, context as Partial<ErrorContextData>),\n timestamp: new Date().toISOString(),\n environment: getBrowserEnvironment(context.route as string | undefined),\n componentStack: (context.componentStack as string) || null,\n context,\n tags,\n };\n}\n\nexport function getErrorMessage(error: unknown): string {\n if (!error) return \"\";\n if (typeof error === \"string\") return error.trim();\n if (error instanceof Error) return error.message.trim();\n\n const errObj = error as { message?: string; toString?: () => string };\n return String(errObj?.message || errObj?.toString?.() || error).trim();\n}\n\nexport function shouldIgnoreError(error: unknown): boolean {\n if (!error) return true;\n\n const errWithNotFound = error as { isNotFound?: () => boolean };\n if (\n typeof errWithNotFound?.isNotFound === \"function\" &&\n errWithNotFound.isNotFound()\n ) {\n return true;\n }\n\n const message = getErrorMessage(error);\n return ERROR_LISTENER_CONFIG.ignored.some((pattern) => pattern.test(message));\n}\n","import {\n DEFAULT_DEDUPE_WINDOW,\n MAX_CONTEXT,\n MAX_FINGERPRINTS,\n} from \"./constants\";\nimport type {\n ErrorReport,\n ErrorReporterHandler,\n ErrorReporterOptions,\n SentryScope,\n} from \"./types\";\nimport {\n createReport,\n normalizeDedupeWindow,\n normalizeSampleRate,\n} from \"./utils\";\n\nconst IS_PRODUCTION = process.env.NODE_ENV === \"production\";\nconst IS_BROWSER = typeof window !== \"undefined\";\n\ndeclare global {\n interface Window {\n Sentry?: {\n captureException: (error: unknown) => void;\n withScope: (callback: (scope: SentryScope) => void) => void;\n };\n }\n}\n\nclass ErrorReporter {\n private handlers: ErrorReporterHandler[] = [];\n private context: Record<string, unknown> = {};\n private tags: Record<string, string> = {};\n private seen = new Set<string>();\n private enabled: boolean;\n private sampleRate: number;\n private beforeSend: ((report: ErrorReport) => ErrorReport | null) | null;\n private dedupeWindow: number;\n\n constructor(options: ErrorReporterOptions = {}) {\n this.enabled = options.enabled ?? true;\n this.sampleRate = normalizeSampleRate(options.sampleRate ?? 1);\n this.beforeSend = options.beforeSend || null;\n this.dedupeWindow = normalizeDedupeWindow(\n options.deduplicateWindow ?? DEFAULT_DEDUPE_WINDOW,\n );\n }\n\n addHandler(handler: ErrorReporterHandler): this {\n if (typeof handler?.handle === \"function\") {\n this.handlers.push(handler);\n }\n return this;\n }\n\n removeHandler(name: string): this {\n this.handlers = this.handlers.filter((handler) => handler.name !== name);\n return this;\n }\n\n setContext(key: string, value: unknown): this {\n if (\n Object.hasOwn(this.context, key) ||\n Object.keys(this.context).length < MAX_CONTEXT\n ) {\n this.context[key] = value;\n }\n return this;\n }\n\n setTag(key: string, value: unknown): this {\n this.tags[key] = String(value);\n return this;\n }\n\n captureError(\n error: unknown,\n extraContext: Record<string, unknown> = {},\n ): ErrorReport | undefined {\n if (!this.enabled || Math.random() > this.sampleRate) return;\n\n this.ensureDefaultHandlers();\n\n const context = { ...this.context, ...extraContext };\n let report = createReport(error, { context, tags: { ...this.tags } });\n const dedupeKey = report.fingerprint;\n\n if (this.seen.has(dedupeKey)) return;\n\n if (this.seen.size >= MAX_FINGERPRINTS) {\n const first = this.seen.keys().next().value;\n if (first) this.seen.delete(first);\n }\n\n this.seen.add(dedupeKey);\n setTimeout(() => this.seen.delete(dedupeKey), this.dedupeWindow);\n\n if (typeof this.beforeSend === \"function\") {\n try {\n const transformed = this.beforeSend(report);\n if (!transformed) return;\n report = transformed;\n } catch {}\n }\n\n this.handlers.forEach((handler) => {\n try {\n handler.handle(report);\n } catch {}\n });\n\n return report;\n }\n\n captureMessage(\n message: string,\n level = \"info\",\n context: Record<string, unknown> = {},\n ): ErrorReport | undefined {\n const error = new Error(message);\n error.name = \"Message\";\n return this.captureError(error, { ...context, level });\n }\n\n ensureDefaultHandlers(): void {\n if (this.handlers.length || !IS_BROWSER) return;\n\n this.handlers.push(createConsoleHandler());\n\n if (window.Sentry) {\n const sentryHandler = createSentryHandler(window.Sentry);\n if (sentryHandler.name === \"sentry\") {\n this.handlers.push(sentryHandler);\n }\n }\n }\n}\n\n// One reporter per page, shared across bundled copies of this module, so a\n// handler added through \"/error\" is the one GlobalErrorListener reports to.\nconst GLOBAL_REPORTER_KEY = Symbol.for(\"__base_framework_error_reporter__\");\ntype GlobalWithReporter = typeof globalThis & {\n [GLOBAL_REPORTER_KEY]?: ErrorReporter;\n};\n\nconst _global = globalThis as GlobalWithReporter;\n\nexport function getErrorReporter(\n options: ErrorReporterOptions = {},\n): ErrorReporter {\n return (_global[GLOBAL_REPORTER_KEY] ??= new ErrorReporter(options));\n}\n\nexport function createConsoleHandler(): ErrorReporterHandler {\n return {\n name: \"console\",\n handle(report: ErrorReport) {\n if (IS_PRODUCTION) return;\n console.error(\"[ErrorReporter]\", {\n error: report.error.message,\n fingerprint: report.fingerprint,\n route: report.environment.route,\n });\n },\n };\n}\n\nexport function createSentryHandler(Sentry: unknown): ErrorReporterHandler {\n const sentryObj = Sentry as {\n captureException?: (err: Error) => void;\n withScope?: (cb: (scope: SentryScope) => void) => void;\n } | null;\n\n if (\n !sentryObj ||\n typeof sentryObj.captureException !== \"function\" ||\n typeof sentryObj.withScope !== \"function\"\n ) {\n return createConsoleHandler();\n }\n\n return {\n name: \"sentry\",\n handle(report: ErrorReport) {\n sentryObj.withScope!((scope: SentryScope) => {\n if (report.fingerprint) scope.setFingerprint([report.fingerprint]);\n if (report.user) scope.setUser(report.user);\n\n if (report.tags && typeof report.tags === \"object\") {\n Object.entries(report.tags).forEach(([key, value]) =>\n scope.setTag(key, String(value)),\n );\n }\n\n if (report.environment)\n scope.setContext(\"environment\", report.environment);\n if (report.context) scope.setContext(\"custom\", report.context);\n if (report.componentStack)\n scope.setExtra(\"componentStack\", report.componentStack);\n\n const error = new Error(report.error.message);\n error.name = report.error.name || \"Error\";\n error.stack = report.error.stack || undefined;\n\n sentryObj.captureException!(error);\n });\n },\n };\n}\n","import { defineThemeSpec } from \"@/theme\";\n\nexport type ErrorThemeSlot = \"screen\" | \"icon\" | \"title\" | \"retryButton\";\n\nexport const errorTheme = defineThemeSpec<ErrorThemeSlot>(\"error\");\n","\"use client\";\n\nimport React, { type ErrorInfo, type ReactNode } from \"react\";\nimport { usePathname } from \"next/navigation\";\nimport { EVENT_TYPES, globalEvents } from \"@/events\";\nimport { Button, Icon } from \"@/atoms\";\nimport { useTheme } from \"@/theme\";\nimport { ERROR_MESSAGES } from \"./constants\";\nimport { errorTheme } from \"./theme\";\nimport { getErrorReporter } from \"./reporter\";\nimport type {\n ComponentErrorProps,\n ErrorBoundaryCoreProps,\n ErrorBoundaryCoreState,\n GlobalErrorProps,\n ModuleErrorProps,\n} from \"./types\";\nimport { createErrorContext } from \"./utils\";\nimport { report, toUserMessage } from \"@/utils\";\n\nconst ActionButton = Button as React.ComponentType<{\n children?: ReactNode;\n className?: string;\n onClick?: () => void;\n type?: \"button\" | \"submit\" | \"reset\";\n}>;\n\nfunction DefaultErrorFallback({\n error,\n message,\n resetError,\n title,\n}: {\n error: Error | null;\n message?: string;\n resetError: () => void;\n title?: string;\n}) {\n const theme = useTheme(errorTheme);\n\n return (\n <div className={theme.slots.screen}>\n <div className={theme.slots.icon}>\n <Icon icon={\"solar:danger-circle-bold\"} size={30} />\n </div>\n <h3 className={theme.slots.title}>\n {message ||\n toUserMessage(error, { fallback: ERROR_MESSAGES.FALLBACK_MSG })}\n </h3>\n <ActionButton\n className={theme.slots.retryButton}\n onClick={resetError}\n type=\"button\"\n >\n Try again\n </ActionButton>\n </div>\n );\n}\n\nexport class ErrorBoundaryCore extends React.Component<\n ErrorBoundaryCoreProps,\n ErrorBoundaryCoreState\n> {\n constructor(props: ErrorBoundaryCoreProps) {\n super(props);\n this.state = {\n error: null,\n errorInfo: null,\n hasError: false,\n lastResetKey: props.resetKey,\n };\n }\n\n static getDerivedStateFromError(\n error: Error,\n ): Partial<ErrorBoundaryCoreState> {\n return { error, hasError: true };\n }\n\n static getDerivedStateFromProps(\n props: ErrorBoundaryCoreProps,\n state: ErrorBoundaryCoreState,\n ): Partial<ErrorBoundaryCoreState> | null {\n if (props.resetKey !== state.lastResetKey) {\n return {\n error: null,\n errorInfo: null,\n hasError: false,\n lastResetKey: props.resetKey,\n };\n }\n return null;\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n this.setState({ errorInfo });\n\n const { message, name, onError, silent, title, variant } = this.props;\n const context = createErrorContext({ errorInfo, name, title, variant });\n\n try {\n onError?.(error, errorInfo, context);\n } catch (callbackError) {\n report(\"ErrorBoundary onError callback\", callbackError, \"warn\");\n }\n\n if (!silent) {\n globalEvents.emit(EVENT_TYPES.APP_ERROR, {\n error,\n errorInfo,\n message: message || toUserMessage(error),\n resetError: this.resetError,\n });\n }\n\n try {\n const reporter = getErrorReporter();\n reporter?.captureError?.(error, context);\n } catch (reportingError) {\n report(\"ErrorBoundary reporting\", reportingError, \"warn\");\n }\n }\n\n resetError = () => {\n this.setState({\n error: null,\n errorInfo: null,\n hasError: false,\n });\n this.props.onReset?.();\n };\n\n render(): ReactNode {\n if (!this.state.hasError) return this.props.children;\n\n const { fallback, message, title } = this.props;\n const { error } = this.state;\n\n if (typeof fallback === \"function\") {\n return fallback({ error, resetError: this.resetError });\n }\n\n if (fallback) {\n return fallback;\n }\n\n return (\n <DefaultErrorFallback\n error={error}\n message={message}\n resetError={this.resetError}\n title={title}\n />\n );\n }\n}\n\nexport function GlobalError({ children, fallback, onReset }: GlobalErrorProps) {\n const pathname = usePathname();\n\n return (\n <ErrorBoundaryCore\n fallback={fallback}\n message={ERROR_MESSAGES.GLOBAL_MSG}\n onReset={onReset}\n resetKey={pathname}\n title={ERROR_MESSAGES.GLOBAL_TITLE}\n variant=\"full\"\n >\n {children}\n </ErrorBoundaryCore>\n );\n}\n\nexport function ModuleError({\n children,\n fallback,\n name,\n onReset,\n}: ModuleErrorProps) {\n return (\n <ErrorBoundaryCore\n fallback={fallback}\n message={ERROR_MESSAGES.MODULE_MSG}\n name={name}\n onReset={onReset}\n title={name ? `${name} Error` : ERROR_MESSAGES.MODULE_TITLE}\n variant=\"module\"\n >\n {children}\n </ErrorBoundaryCore>\n );\n}\n\nexport function ComponentError({\n children,\n fallback,\n message,\n onReset,\n}: ComponentErrorProps) {\n return (\n <ErrorBoundaryCore\n fallback={fallback}\n message={message || ERROR_MESSAGES.COMPONENT_MSG}\n onReset={onReset}\n variant=\"inline\"\n >\n {children}\n </ErrorBoundaryCore>\n );\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useRef } from \"react\";\nimport { EVENT_TYPES, globalEvents } from \"@/events\";\nimport { ERROR_LISTENER_CONFIG } from \"./constants\";\nimport { getErrorReporter } from \"./reporter\";\nimport { getErrorMessage, shouldIgnoreError } from \"./utils\";\nimport { report, setReportSink, toUserMessage } from \"@/utils\";\n\nexport function GlobalErrorListener(): null {\n const lastError = useRef<number>(0);\n const count = useRef<number>(0);\n const shown = useRef<Set<string>>(new Set());\n\n const handleError = useCallback((error: unknown, source = \"runtime\") => {\n if (shouldIgnoreError(error)) return;\n\n const now = Date.now();\n\n if (count.current >= ERROR_LISTENER_CONFIG.maxErrors) return;\n if (now - lastError.current < ERROR_LISTENER_CONFIG.throttle) return;\n\n const message = getErrorMessage(error);\n const key = message || String(error);\n\n if (shown.current.has(key)) return;\n shown.current.add(key);\n\n lastError.current = now;\n count.current += 1;\n\n try {\n const reporter = getErrorReporter();\n reporter?.captureError?.(error, {\n globalListener: true,\n source,\n });\n } catch (reportingError) {\n report(\"GlobalError reporting\", reportingError, \"warn\");\n }\n\n globalEvents.emit(EVENT_TYPES.APP_ERROR, {\n error,\n message: toUserMessage(error),\n });\n }, []);\n\n useEffect(() => {\n const removeSink = setReportSink((scope, error, level) => {\n try {\n getErrorReporter().captureError(error, { level, scope });\n } catch {}\n });\n const onError = (event: ErrorEvent) =>\n handleError(event.error || event.message, \"window.onerror\");\n const onRejection = (event: PromiseRejectionEvent) =>\n handleError(event.reason, \"unhandledrejection\");\n\n window.addEventListener(\"error\", onError);\n window.addEventListener(\"unhandledrejection\", onRejection);\n\n return () => {\n removeSink();\n window.removeEventListener(\"error\", onError);\n window.removeEventListener(\"unhandledrejection\", onRejection);\n };\n }, [handleError]);\n\n return null;\n}\n"]}
@@ -0,0 +1,51 @@
1
+ import { GlobalError, GlobalErrorListener, ModuleError } from './chunk-JELG4JLT.js';
2
+ import { ModuleMotionConfig } from './chunk-7TAVYJ3A.js';
3
+ import { ModuleHost, Compose } from './chunk-GF7TUX5I.js';
4
+ import { useMemo } from 'react';
5
+ import * as TooltipPrimitive from '@radix-ui/react-tooltip';
6
+ import { jsxs, jsx } from 'react/jsx-runtime';
7
+
8
+ function ModuleBoundary({
9
+ children,
10
+ name
11
+ }) {
12
+ return /* @__PURE__ */ jsx(ModuleError, { name, children: /* @__PURE__ */ jsx(ModuleMotionConfig, { children }) });
13
+ }
14
+ function CoreProvider({
15
+ children,
16
+ modules,
17
+ overlays,
18
+ providers,
19
+ registryEntries,
20
+ slots,
21
+ tooltip = true
22
+ }) {
23
+ const tooltipConfig = useMemo(
24
+ () => tooltip === false ? null : {
25
+ delayDuration: typeof tooltip === "object" && tooltip.delayDuration || 300,
26
+ skipDelayDuration: typeof tooltip === "object" && tooltip.skipDelayDuration || 150
27
+ },
28
+ [tooltip]
29
+ );
30
+ const providerPipeline = useMemo(
31
+ () => [
32
+ GlobalError,
33
+ ...tooltipConfig ? [[TooltipPrimitive.Provider, tooltipConfig]] : [],
34
+ [ModuleHost, { boundary: ModuleBoundary, modules, registryEntries }],
35
+ ...providers ?? []
36
+ ],
37
+ [modules, providers, registryEntries, tooltipConfig]
38
+ );
39
+ return /* @__PURE__ */ jsxs(Compose, { providers: providerPipeline, children: [
40
+ slots?.beforeContent,
41
+ children,
42
+ slots?.afterContent,
43
+ overlays,
44
+ slots?.overlays,
45
+ /* @__PURE__ */ jsx(GlobalErrorListener, {})
46
+ ] });
47
+ }
48
+
49
+ export { CoreProvider };
50
+ //# sourceMappingURL=chunk-K676GL7Z.js.map
51
+ //# sourceMappingURL=chunk-K676GL7Z.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/provider.tsx"],"names":[],"mappings":";;;;;;;AA2BA,SAAS,cAAA,CAAe;AAAA,EACtB,QAAA;AAAA,EACA;AACF,CAAA,EAGgB;AACd,EAAA,2BACG,WAAA,EAAA,EAAY,IAAA,EACX,QAAA,kBAAA,GAAA,CAAC,kBAAA,EAAA,EAAoB,UAAS,CAAA,EAChC,CAAA;AAEJ;AAYO,SAAS,YAAA,CAAa;AAAA,EAC3B,QAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA,GAAU;AACZ,CAAA,EAAmC;AACjC,EAAA,MAAM,aAAA,GAAgB,OAAA;AAAA,IACpB,MACE,OAAA,KAAY,KAAA,GACR,IAAA,GACA;AAAA,MACE,aAAA,EACG,OAAO,OAAA,KAAY,QAAA,IAAY,QAAQ,aAAA,IAAkB,GAAA;AAAA,MAC5D,iBAAA,EACG,OAAO,OAAA,KAAY,QAAA,IAAY,QAAQ,iBAAA,IAAsB;AAAA,KAClE;AAAA,IACN,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,gBAAA,GAAmB,OAAA;AAAA,IACvB,MAAM;AAAA,MACJ,WAAA;AAAA,MACA,GAAI,gBACA,CAAC,CAAkB,2BAAU,aAAa,CAAU,IACpD,EAAC;AAAA,MACL,CAAC,UAAA,EAAY,EAAE,UAAU,cAAA,EAAgB,OAAA,EAAS,iBAAiB,CAAA;AAAA,MACnE,GAAI,aAAa;AAAC,KACpB;AAAA,IACA,CAAC,OAAA,EAAS,SAAA,EAAW,eAAA,EAAiB,aAAa;AAAA,GACrD;AAEA,EAAA,uBACE,IAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAW,gBAAA,EACjB,QAAA,EAAA;AAAA,IAAA,KAAA,EAAO,aAAA;AAAA,IACP,QAAA;AAAA,IACA,KAAA,EAAO,YAAA;AAAA,IACP,QAAA;AAAA,IACA,KAAA,EAAO,QAAA;AAAA,wBACP,mBAAA,EAAA,EAAoB;AAAA,GAAA,EACvB,CAAA;AAEJ","file":"chunk-K676GL7Z.js","sourcesContent":["\"use client\";\n\nimport { useMemo, type JSX, type ReactNode } from \"react\";\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\nimport { GlobalError, GlobalErrorListener, ModuleError } from \"@/error\";\nimport { ModuleMotionConfig } from \"@/theme\";\nimport {\n Compose,\n ModuleHost,\n type AnyCoreModule,\n type AppRegistryEntry,\n type ProviderEntry,\n} from \"@/kernel\";\n\ninterface CoreTooltipConfig {\n delayDuration?: number;\n skipDelayDuration?: number;\n}\n\ninterface CoreProviderSlots {\n afterContent?: ReactNode;\n beforeContent?: ReactNode;\n overlays?: ReactNode;\n}\n\n// Every module's backdrop and overlay plays under the app's reduced-motion\n// policy; app content outside the modules keeps its own motion settings.\nfunction ModuleBoundary({\n children,\n name,\n}: {\n children?: ReactNode;\n name?: string;\n}): JSX.Element {\n return (\n <ModuleError name={name}>\n <ModuleMotionConfig>{children}</ModuleMotionConfig>\n </ModuleError>\n );\n}\n\nexport interface CoreProviderProps {\n children: ReactNode;\n modules: readonly AnyCoreModule[];\n overlays?: ReactNode;\n providers?: readonly ProviderEntry[];\n registryEntries?: readonly AppRegistryEntry[];\n slots?: CoreProviderSlots;\n tooltip?: boolean | CoreTooltipConfig;\n}\n\nexport function CoreProvider({\n children,\n modules,\n overlays,\n providers,\n registryEntries,\n slots,\n tooltip = true,\n}: CoreProviderProps): JSX.Element {\n const tooltipConfig = useMemo(\n () =>\n tooltip === false\n ? null\n : {\n delayDuration:\n (typeof tooltip === \"object\" && tooltip.delayDuration) || 300,\n skipDelayDuration:\n (typeof tooltip === \"object\" && tooltip.skipDelayDuration) || 150,\n },\n [tooltip],\n );\n\n const providerPipeline = useMemo<readonly ProviderEntry[]>(\n () => [\n GlobalError,\n ...(tooltipConfig\n ? [[TooltipPrimitive.Provider, tooltipConfig] as const]\n : []),\n [ModuleHost, { boundary: ModuleBoundary, modules, registryEntries }],\n ...(providers ?? []),\n ],\n [modules, providers, registryEntries, tooltipConfig],\n );\n\n return (\n <Compose providers={providerPipeline}>\n {slots?.beforeContent}\n {children}\n {slots?.afterContent}\n {overlays}\n {slots?.overlays}\n <GlobalErrorListener />\n </Compose>\n );\n}\n"]}
@@ -0,0 +1,38 @@
1
+ // src/tokens/tokens.ts
2
+ var Z_INDEX = Object.freeze({
3
+ BACKGROUND: 0,
4
+ DOCK_BACKDROP: 100,
5
+ DOCK: 110,
6
+ NOTIFICATION: 120,
7
+ MODAL_BACKDROP: 130,
8
+ MODAL: 140,
9
+ SELECT: 150,
10
+ LOADING: 160,
11
+ ERROR_OVERLAY: 170,
12
+ CONTEXT_MENU_BACKDROP: 180,
13
+ CONTEXT_MENU: 190,
14
+ TOOLTIP: 200,
15
+ UI_ELEMENT: 10,
16
+ DOCK_CARD_BACKGROUND: 0,
17
+ DOCK_CARD_CONTENT: 10,
18
+ DOCK_CARD_STACK_BASE: 10,
19
+ DOCK_CARD_BADGE: 20,
20
+ DOCK_CARD_MEDIA: 30,
21
+ DOCK_BREADCRUMBS: 10,
22
+ DOCK_SURFACE_CONTROL: 10,
23
+ DOCK_SURFACE_POPOVER: 30,
24
+ DOCK_SURFACE_CENTER: 0,
25
+ MODAL_FRAME: 1,
26
+ MODAL_STICKY_HEADER: 10
27
+ });
28
+ var SURFACE_CLASSES = Object.freeze({
29
+ description: "text-white/70",
30
+ icon: "bg-white/10 text-white",
31
+ surface: "bg-black/60 ring-1 ring-inset ring-white/10",
32
+ title: "text-white"
33
+ });
34
+ var ACTION_TONE_CLASS = "bg-primary/10 text-primary hover:bg-primary hover:text-black";
35
+
36
+ export { ACTION_TONE_CLASS, SURFACE_CLASSES, Z_INDEX };
37
+ //# sourceMappingURL=chunk-QI3ALLIB.js.map
38
+ //# sourceMappingURL=chunk-QI3ALLIB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tokens/tokens.ts"],"names":[],"mappings":";AAAO,IAAM,OAAA,GAAU,OAAO,MAAA,CAAO;AAAA,EACnC,UAAA,EAAY,CAAA;AAAA,EACZ,aAAA,EAAe,GAAA;AAAA,EACf,IAAA,EAAM,GAAA;AAAA,EACN,YAAA,EAAc,GAAA;AAAA,EACd,cAAA,EAAgB,GAAA;AAAA,EAChB,KAAA,EAAO,GAAA;AAAA,EACP,MAAA,EAAQ,GAAA;AAAA,EACR,OAAA,EAAS,GAAA;AAAA,EACT,aAAA,EAAe,GAAA;AAAA,EACf,qBAAA,EAAuB,GAAA;AAAA,EACvB,YAAA,EAAc,GAAA;AAAA,EACd,OAAA,EAAS,GAAA;AAAA,EAET,UAAA,EAAY,EAAA;AAAA,EACZ,oBAAA,EAAsB,CAAA;AAAA,EACtB,iBAAA,EAAmB,EAAA;AAAA,EACnB,oBAAA,EAAsB,EAAA;AAAA,EACtB,eAAA,EAAiB,EAAA;AAAA,EACjB,eAAA,EAAiB,EAAA;AAAA,EACjB,gBAAA,EAAkB,EAAA;AAAA,EAClB,oBAAA,EAAsB,EAAA;AAAA,EACtB,oBAAA,EAAsB,EAAA;AAAA,EACtB,mBAAA,EAAqB,CAAA;AAAA,EACrB,WAAA,EAAa,CAAA;AAAA,EACb,mBAAA,EAAqB;AACvB,CAAU;AAEH,IAAM,eAAA,GAAkB,OAAO,MAAA,CAAO;AAAA,EAC3C,WAAA,EAAa,eAAA;AAAA,EACb,IAAA,EAAM,wBAAA;AAAA,EACN,OAAA,EAAS,6CAAA;AAAA,EACT,KAAA,EAAO;AACT,CAAU;AAEH,IAAM,iBAAA,GACX","file":"chunk-QI3ALLIB.js","sourcesContent":["export const Z_INDEX = Object.freeze({\n BACKGROUND: 0,\n DOCK_BACKDROP: 100,\n DOCK: 110,\n NOTIFICATION: 120,\n MODAL_BACKDROP: 130,\n MODAL: 140,\n SELECT: 150,\n LOADING: 160,\n ERROR_OVERLAY: 170,\n CONTEXT_MENU_BACKDROP: 180,\n CONTEXT_MENU: 190,\n TOOLTIP: 200,\n\n UI_ELEMENT: 10,\n DOCK_CARD_BACKGROUND: 0,\n DOCK_CARD_CONTENT: 10,\n DOCK_CARD_STACK_BASE: 10,\n DOCK_CARD_BADGE: 20,\n DOCK_CARD_MEDIA: 30,\n DOCK_BREADCRUMBS: 10,\n DOCK_SURFACE_CONTROL: 10,\n DOCK_SURFACE_POPOVER: 30,\n DOCK_SURFACE_CENTER: 0,\n MODAL_FRAME: 1,\n MODAL_STICKY_HEADER: 10,\n} as const);\n\nexport const SURFACE_CLASSES = Object.freeze({\n description: \"text-white/70\",\n icon: \"bg-white/10 text-white\",\n surface: \"bg-black/60 ring-1 ring-inset ring-white/10\",\n title: \"text-white\",\n} as const);\n\nexport const ACTION_TONE_CLASS =\n \"bg-primary/10 text-primary hover:bg-primary hover:text-black\";\n"]}