@omerdlw/base-framework 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/dist/atoms/index.d.ts +0 -1
  2. package/dist/atoms/index.d.ts.map +1 -1
  3. package/dist/atoms/index.js +1 -64
  4. package/dist/atoms/index.js.map +1 -1
  5. package/dist/error/index.js +22 -25
  6. package/dist/error/index.js.map +1 -1
  7. package/dist/hooks/index.d.ts +2 -0
  8. package/dist/hooks/index.d.ts.map +1 -1
  9. package/dist/hooks/index.js +97 -4
  10. package/dist/hooks/index.js.map +1 -1
  11. package/dist/hooks/types.d.ts +11 -0
  12. package/dist/hooks/types.d.ts.map +1 -1
  13. package/dist/hooks/use-controllable-state.d.ts +1 -1
  14. package/dist/hooks/use-controllable-state.d.ts.map +1 -1
  15. package/dist/hooks/use-hotkey.d.ts +1 -1
  16. package/dist/hooks/use-hotkey.d.ts.map +1 -1
  17. package/dist/index.js +10811 -10696
  18. package/dist/index.js.map +1 -1
  19. package/dist/kernel/adapters.d.ts.map +1 -1
  20. package/dist/kernel/index.d.ts +1 -0
  21. package/dist/kernel/index.d.ts.map +1 -1
  22. package/dist/kernel/index.js +13 -84
  23. package/dist/kernel/index.js.map +1 -1
  24. package/dist/kernel/installed.d.ts.map +1 -1
  25. package/dist/kernel/page-controller.d.ts.map +1 -1
  26. package/dist/kernel/provider.d.ts.map +1 -1
  27. package/dist/modules/ambient/constants.d.ts +1 -1
  28. package/dist/modules/ambient/constants.d.ts.map +1 -1
  29. package/dist/modules/ambient/index.js +180 -326
  30. package/dist/modules/ambient/index.js.map +1 -1
  31. package/dist/modules/ambient/module.d.ts.map +1 -1
  32. package/dist/modules/background/constants.d.ts +4 -2
  33. package/dist/modules/background/constants.d.ts.map +1 -1
  34. package/dist/modules/background/context.d.ts +3 -0
  35. package/dist/modules/background/context.d.ts.map +1 -1
  36. package/dist/modules/background/hooks.d.ts +1 -1
  37. package/dist/modules/background/index.d.ts +2 -2
  38. package/dist/modules/background/index.d.ts.map +1 -1
  39. package/dist/modules/background/index.js +1172 -1270
  40. package/dist/modules/background/index.js.map +1 -1
  41. package/dist/modules/background/overlay.d.ts +1 -1
  42. package/dist/modules/background/overlay.d.ts.map +1 -1
  43. package/dist/modules/background/types.d.ts +1 -1
  44. package/dist/modules/background/types.d.ts.map +1 -1
  45. package/dist/modules/context-menu/constants.d.ts +1 -1
  46. package/dist/modules/context-menu/constants.d.ts.map +1 -1
  47. package/dist/modules/context-menu/context.d.ts.map +1 -1
  48. package/dist/modules/context-menu/hooks.d.ts.map +1 -1
  49. package/dist/modules/context-menu/index.js +135 -240
  50. package/dist/modules/context-menu/index.js.map +1 -1
  51. package/dist/modules/controls/constants.d.ts +1 -1
  52. package/dist/modules/controls/constants.d.ts.map +1 -1
  53. package/dist/modules/controls/hooks.d.ts +1 -1
  54. package/dist/modules/controls/index.js +31 -165
  55. package/dist/modules/controls/index.js.map +1 -1
  56. package/dist/modules/controls/types.d.ts +1 -1
  57. package/dist/modules/controls/types.d.ts.map +1 -1
  58. package/dist/modules/dock/cards.d.ts +1 -1
  59. package/dist/modules/dock/constants.d.ts +1 -1
  60. package/dist/modules/dock/constants.d.ts.map +1 -1
  61. package/dist/modules/dock/context.d.ts +10 -6
  62. package/dist/modules/dock/context.d.ts.map +1 -1
  63. package/dist/modules/dock/hooks.d.ts +4 -4
  64. package/dist/modules/dock/hooks.d.ts.map +1 -1
  65. package/dist/modules/dock/index.d.ts +1 -1
  66. package/dist/modules/dock/index.d.ts.map +1 -1
  67. package/dist/modules/dock/index.js +2063 -2083
  68. package/dist/modules/dock/index.js.map +1 -1
  69. package/dist/modules/dock/runtime/dock.d.ts.map +1 -1
  70. package/dist/modules/dock/types.d.ts +1 -1
  71. package/dist/modules/dock/types.d.ts.map +1 -1
  72. package/dist/modules/index.js +10193 -10350
  73. package/dist/modules/index.js.map +1 -1
  74. package/dist/modules/loading/constants.d.ts +4 -2
  75. package/dist/modules/loading/constants.d.ts.map +1 -1
  76. package/dist/modules/loading/context.d.ts +3 -0
  77. package/dist/modules/loading/context.d.ts.map +1 -1
  78. package/dist/modules/loading/hooks.d.ts +1 -1
  79. package/dist/modules/loading/hooks.d.ts.map +1 -1
  80. package/dist/modules/loading/index.d.ts +2 -2
  81. package/dist/modules/loading/index.d.ts.map +1 -1
  82. package/dist/modules/loading/index.js +121 -225
  83. package/dist/modules/loading/index.js.map +1 -1
  84. package/dist/modules/loading/types.d.ts +1 -1
  85. package/dist/modules/loading/types.d.ts.map +1 -1
  86. package/dist/modules/media/constants.d.ts +2 -1
  87. package/dist/modules/media/constants.d.ts.map +1 -1
  88. package/dist/modules/media/context.d.ts +3 -0
  89. package/dist/modules/media/context.d.ts.map +1 -1
  90. package/dist/modules/media/index.d.ts +2 -2
  91. package/dist/modules/media/index.d.ts.map +1 -1
  92. package/dist/modules/media/index.js +61 -218
  93. package/dist/modules/media/index.js.map +1 -1
  94. package/dist/modules/modal/constants.d.ts +1 -1
  95. package/dist/modules/modal/constants.d.ts.map +1 -1
  96. package/dist/modules/modal/context.d.ts.map +1 -1
  97. package/dist/modules/modal/hooks.d.ts +2 -2
  98. package/dist/modules/modal/index.js +31 -293
  99. package/dist/modules/modal/index.js.map +1 -1
  100. package/dist/modules/notification/constants.d.ts +4 -2
  101. package/dist/modules/notification/constants.d.ts.map +1 -1
  102. package/dist/modules/notification/context.d.ts +4 -0
  103. package/dist/modules/notification/context.d.ts.map +1 -1
  104. package/dist/modules/notification/hooks.d.ts +1 -1
  105. package/dist/modules/notification/index.d.ts +2 -3
  106. package/dist/modules/notification/index.d.ts.map +1 -1
  107. package/dist/modules/notification/index.js +65 -151
  108. package/dist/modules/notification/index.js.map +1 -1
  109. package/dist/modules/notification/module.d.ts.map +1 -1
  110. package/dist/provider.js +255 -257
  111. package/dist/provider.js.map +1 -1
  112. package/dist/theme.d.ts +1 -0
  113. package/dist/theme.d.ts.map +1 -1
  114. package/dist/theme.js +2 -2
  115. package/dist/theme.js.map +1 -1
  116. package/dist/utils/dom.d.ts +2 -0
  117. package/dist/utils/dom.d.ts.map +1 -1
  118. package/dist/utils/index.d.ts +1 -1
  119. package/dist/utils/index.d.ts.map +1 -1
  120. package/dist/utils/index.js +28 -19
  121. package/dist/utils/index.js.map +1 -1
  122. package/docs/modules/loading.md +1 -1
  123. package/package.json +48 -2
  124. package/dist/hooks/use-async-action.d.ts +0 -3
  125. package/dist/hooks/use-async-action.d.ts.map +0 -1
  126. package/dist/hooks/use-debounce.d.ts +0 -2
  127. package/dist/hooks/use-debounce.d.ts.map +0 -1
  128. package/dist/hooks/use-intersection-observer.d.ts +0 -4
  129. package/dist/hooks/use-intersection-observer.d.ts.map +0 -1
  130. package/dist/hooks/use-media-query.d.ts +0 -2
  131. package/dist/hooks/use-media-query.d.ts.map +0 -1
  132. package/dist/hooks/use-mounted.d.ts +0 -2
  133. package/dist/hooks/use-mounted.d.ts.map +0 -1
  134. package/dist/hooks/use-server-action.d.ts +0 -4
  135. package/dist/hooks/use-server-action.d.ts.map +0 -1
  136. package/dist/hooks/use-storage-state.d.ts +0 -5
  137. package/dist/hooks/use-storage-state.d.ts.map +0 -1
  138. package/dist/modules/theme.d.ts +0 -3
  139. package/dist/modules/theme.d.ts.map +0 -1
  140. package/dist/utils/json.d.ts +0 -3
  141. package/dist/utils/json.d.ts.map +0 -1
@@ -2,5 +2,4 @@ export { Icon, type IconProps } from "./icon";
2
2
  export { Spinner, type SpinnerProps } from "./spinner";
3
3
  export { Tooltip, type TooltipProps } from "./tooltip";
4
4
  export { Button, type ButtonProps } from "./button";
5
- export { useIsFullscreenStateActive } from "../hooks/use-fullscreen-state";
6
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/atoms/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/atoms/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC"}
@@ -2,7 +2,6 @@
2
2
  import { Icon as Icon$1 } from '@iconify-icon/react';
3
3
  import { jsx, jsxs } from 'react/jsx-runtime';
4
4
  import * as TooltipPrimitive from '@radix-ui/react-tooltip';
5
- import { useSyncExternalStore } from 'react';
6
5
 
7
6
  function Icon({
8
7
  className = "center",
@@ -101,69 +100,7 @@ function Button({
101
100
  );
102
101
  }
103
102
  Button.displayName = "Button";
104
- var listeners = /* @__PURE__ */ new Set();
105
- var activeFullscreenStateIds = /* @__PURE__ */ new Set();
106
- var ACTIVE_FULLSCREEN_ROOT_SELECTOR = '[data-fullscreen-state-root="true"][data-affect-global-state="true"]';
107
- var domObserver = null;
108
- var lastSnapshot = false;
109
- function getDomSnapshot() {
110
- if (typeof document === "undefined") {
111
- return activeFullscreenStateIds.size > 0;
112
- }
113
- return document.querySelector(ACTIVE_FULLSCREEN_ROOT_SELECTOR) !== null;
114
- }
115
- function emitChange() {
116
- listeners.forEach((listener) => listener());
117
- }
118
- function emitIfSnapshotChanged() {
119
- const nextSnapshot = getDomSnapshot();
120
- if (nextSnapshot === lastSnapshot) {
121
- return;
122
- }
123
- lastSnapshot = nextSnapshot;
124
- emitChange();
125
- }
126
- function ensureDomObserver() {
127
- if (typeof document === "undefined" || domObserver || listeners.size === 0) {
128
- return;
129
- }
130
- domObserver = new MutationObserver(() => {
131
- emitIfSnapshotChanged();
132
- });
133
- domObserver.observe(document.documentElement, {
134
- attributes: true,
135
- childList: true,
136
- subtree: true,
137
- attributeFilter: [
138
- "data-fullscreen-state",
139
- "data-fullscreen-state-root",
140
- "data-affect-global-state"
141
- ]
142
- });
143
- }
144
- function releaseDomObserver() {
145
- if (listeners.size > 0 || !domObserver) {
146
- return;
147
- }
148
- domObserver.disconnect();
149
- domObserver = null;
150
- }
151
- function subscribe(listener) {
152
- listeners.add(listener);
153
- ensureDomObserver();
154
- emitIfSnapshotChanged();
155
- return () => {
156
- listeners.delete(listener);
157
- releaseDomObserver();
158
- };
159
- }
160
- function getSnapshot() {
161
- return getDomSnapshot();
162
- }
163
- function useIsFullscreenStateActive() {
164
- return useSyncExternalStore(subscribe, getSnapshot, () => false);
165
- }
166
103
 
167
- export { Button, Icon, Spinner, Tooltip, useIsFullscreenStateActive };
104
+ export { Button, Icon, Spinner, Tooltip };
168
105
  //# sourceMappingURL=index.js.map
169
106
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/atoms/icon.tsx","../../src/atoms/spinner.tsx","../../src/atoms/tooltip.tsx","../../src/atoms/button.tsx","../../src/hooks/use-fullscreen-state.ts"],"names":["IconifyIcon","jsx"],"mappings":";;;;;AAeO,SAAS,IAAA,CAAK;AAAA,EACnB,SAAA,GAAY,QAAA;AAAA,EACZ,KAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA,GAAO,EAAA;AAAA,EACP,KAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAc;AACZ,EAAA,uBACE,GAAA;AAAA,IAACA,MAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,MAAA,EAAQ,IAAA;AAAA,MACR,IAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA,EAAO,EAAE,KAAA,EAAO,GAAG,KAAA,EAAM;AAAA,MACzB,KAAA,EAAO,IAAA;AAAA,MACN,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,IAAA,CAAK,WAAA,GAAc,MAAA;AC5BZ,SAAS,QAAQ,EAAE,SAAA,GAAY,EAAA,EAAI,IAAA,GAAO,IAAG,EAAiB;AACnE,EAAA,uBACEC,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,YAAA,EAAW,SAAA;AAAA,MACX,IAAA,EAAK,QAAA;AAAA,MAEL,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,2BAA0B,IAAA,EAAY;AAAA;AAAA,GACnD;AAEJ;AAEA,OAAA,CAAQ,WAAA,GAAc,SAAA;ACHf,SAAS,OAAA,CAAQ;AAAA,EACtB,QAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA,GAAmB,CAAA;AAAA,EACnB,WAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,UAAA,GAAa,CAAA;AAAA,EACb,IAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAiB;AACf,EAAA,uBACE,IAAA;AAAA,IAAkB,gBAAA,CAAA,IAAA;AAAA,IAAjB;AAAA,MACC,WAAA;AAAA,MACA,aAAA,EAAe,OAAA;AAAA,MACf,YAAA;AAAA,MACA,IAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAA,GAAAA,CAAkB,gBAAA,CAAA,OAAA,EAAjB,EAAyB,OAAA,EAAO,MAC9B,QAAA,EACH,CAAA;AAAA,wBAEAA,GAAAA,CAAkB,gBAAA,CAAA,MAAA,EAAjB,EACC,QAAA,kBAAAA,GAAAA;AAAA,UAAkB,gBAAA,CAAA,OAAA;AAAA,UAAjB;AAAA,YACC,IAAA,EAAM,QAAA;AAAA,YACN,KAAA,EAAM,QAAA;AAAA,YACN,UAAA;AAAA,YACA,gBAAA;AAAA,YACA,SAAA;AAAA,YACC,GAAG,KAAA;AAAA,YAEH,QAAA,EAAA;AAAA;AAAA,SACH,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AAEA,OAAA,CAAQ,WAAA,GAAc,SAAA;AChDf,SAAS,MAAA,CAAO;AAAA,EACrB,GAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,OAAA,GAAU,KAAA;AAAA,EACV,IAAA,GAAO,QAAA;AAAA,EACP,GAAG;AACL,CAAA,EAAgB;AACd,EAAA,uBACEA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA;AAAA,MACA,UAAU,QAAA,IAAY,OAAA;AAAA,MACtB,WAAA,EAAW,UAAU,IAAA,GAAO,MAAA;AAAA,MAC5B,SAAA;AAAA,MACC,GAAG,KAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ;AAEA,MAAA,CAAO,WAAA,GAAc,QAAA;AC7BrB,IAAM,SAAA,uBAAgB,GAAA,EAAgB;AACtC,IAAM,wBAAA,uBAA+B,GAAA,EAAY;AAEjD,IAAM,+BAAA,GACJ,sEAAA;AAEF,IAAI,WAAA,GAAuC,IAAA;AAC3C,IAAI,YAAA,GAAe,KAAA;AAEnB,SAAS,cAAA,GAA0B;AACjC,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,IAAA,OAAO,yBAAyB,IAAA,GAAO,CAAA;AAAA,EACzC;AAEA,EAAA,OAAO,QAAA,CAAS,aAAA,CAAc,+BAA+B,CAAA,KAAM,IAAA;AACrE;AAEA,SAAS,UAAA,GAAmB;AAC1B,EAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,QAAA,KAAa,QAAA,EAAU,CAAA;AAC5C;AAEA,SAAS,qBAAA,GAA8B;AACrC,EAAA,MAAM,eAAe,cAAA,EAAe;AAEpC,EAAA,IAAI,iBAAiB,YAAA,EAAc;AACjC,IAAA;AAAA,EACF;AAEA,EAAA,YAAA,GAAe,YAAA;AACf,EAAA,UAAA,EAAW;AACb;AAEA,SAAS,iBAAA,GAA0B;AACjC,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,IAAe,WAAA,IAAe,SAAA,CAAU,SAAS,CAAA,EAAG;AAC1E,IAAA;AAAA,EACF;AAEA,EAAA,WAAA,GAAc,IAAI,iBAAiB,MAAM;AACvC,IAAA,qBAAA,EAAsB;AAAA,EACxB,CAAC,CAAA;AAED,EAAA,WAAA,CAAY,OAAA,CAAQ,SAAS,eAAA,EAAiB;AAAA,IAC5C,UAAA,EAAY,IAAA;AAAA,IACZ,SAAA,EAAW,IAAA;AAAA,IACX,OAAA,EAAS,IAAA;AAAA,IACT,eAAA,EAAiB;AAAA,MACf,uBAAA;AAAA,MACA,4BAAA;AAAA,MACA;AAAA;AACF,GACD,CAAA;AACH;AAEA,SAAS,kBAAA,GAA2B;AAClC,EAAA,IAAI,SAAA,CAAU,IAAA,GAAO,CAAA,IAAK,CAAC,WAAA,EAAa;AACtC,IAAA;AAAA,EACF;AAEA,EAAA,WAAA,CAAY,UAAA,EAAW;AACvB,EAAA,WAAA,GAAc,IAAA;AAChB;AAEA,SAAS,UAAU,QAAA,EAAkC;AACnD,EAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AACtB,EAAA,iBAAA,EAAkB;AAClB,EAAA,qBAAA,EAAsB;AAEtB,EAAA,OAAO,MAAM;AACX,IAAA,SAAA,CAAU,OAAO,QAAQ,CAAA;AACzB,IAAA,kBAAA,EAAmB;AAAA,EACrB,CAAA;AACF;AAEA,SAAS,WAAA,GAAuB;AAC9B,EAAA,OAAO,cAAA,EAAe;AACxB;AAYO,SAAS,0BAAA,GAAsC;AACpD,EAAA,OAAO,oBAAA,CAAqB,SAAA,EAAW,WAAA,EAAa,MAAM,KAAK,CAAA;AACjE","file":"index.js","sourcesContent":["\"use client\";\n\nimport { Icon as IconifyIcon } from \"@iconify-icon/react\";\nimport type { ComponentProps, CSSProperties } from \"react\";\n\nexport interface IconProps\n extends Omit<ComponentProps<typeof IconifyIcon>, \"icon\" | \"size\"> {\n icon: string | ComponentProps<typeof IconifyIcon>[\"icon\"];\n size?: number | string;\n color?: string;\n className?: string;\n style?: CSSProperties;\n onClick?: () => void;\n}\n\nexport function Icon({\n className = \"center\",\n color,\n icon,\n onClick,\n size = 20,\n style,\n ...props\n}: IconProps) {\n return (\n <IconifyIcon\n className={className}\n height={size}\n icon={icon}\n onClick={onClick}\n style={{ color, ...style }}\n width={size}\n {...props}\n />\n );\n}\n\nIcon.displayName = \"Icon\";\n","\"use client\";\n\nimport { Icon } from \"./icon\";\n\nexport interface SpinnerProps {\n className?: string;\n size?: number;\n}\n\nexport function Spinner({ className = \"\", size = 15 }: SpinnerProps) {\n return (\n <div\n className={className}\n aria-label=\"Loading\"\n role=\"status\"\n >\n <Icon icon=\"mingcute:loading-3-fill\" size={size} />\n </div>\n );\n}\n\nSpinner.displayName = \"Spinner\";\n","\"use client\";\n\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\nimport type { ReactNode } from \"react\";\n\nexport interface TooltipProps {\n children: ReactNode;\n text: ReactNode;\n className?: string;\n open?: boolean;\n defaultOpen?: boolean;\n delayMs?: number;\n position?: \"top\" | \"bottom\" | \"left\" | \"right\";\n sideOffset?: number;\n collisionPadding?: number;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport function Tooltip({\n children,\n className,\n collisionPadding = 8,\n defaultOpen,\n delayMs,\n onOpenChange,\n open,\n position = \"top\",\n sideOffset = 6,\n text,\n ...props\n}: TooltipProps) {\n return (\n <TooltipPrimitive.Root\n defaultOpen={defaultOpen}\n delayDuration={delayMs}\n onOpenChange={onOpenChange}\n open={open}\n >\n <TooltipPrimitive.Trigger asChild>\n {children}\n </TooltipPrimitive.Trigger>\n\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n side={position}\n align=\"center\"\n sideOffset={sideOffset}\n collisionPadding={collisionPadding}\n className={className}\n {...props}\n >\n {text}\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n </TooltipPrimitive.Root>\n );\n}\n\nTooltip.displayName = \"Tooltip\";\n","\"use client\";\n\nimport type { ButtonHTMLAttributes, ReactNode, Ref } from \"react\";\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n ref?: Ref<HTMLButtonElement>;\n children?: ReactNode;\n loading?: boolean;\n}\n\nexport function Button({\n ref,\n children,\n className,\n disabled = false,\n loading = false,\n type = \"button\",\n ...props\n}: ButtonProps) {\n return (\n <button\n ref={ref}\n type={type}\n disabled={disabled || loading}\n aria-busy={loading ? true : undefined}\n className={className}\n {...props}\n >\n {children}\n </button>\n );\n}\n\nButton.displayName = \"Button\";\n","\"use client\";\n\nimport { useSyncExternalStore } from \"react\";\n\nconst listeners = new Set<() => void>();\nconst activeFullscreenStateIds = new Set<string>();\n\nconst ACTIVE_FULLSCREEN_ROOT_SELECTOR =\n '[data-fullscreen-state-root=\"true\"][data-affect-global-state=\"true\"]';\n\nlet domObserver: MutationObserver | null = null;\nlet lastSnapshot = false;\n\nfunction getDomSnapshot(): boolean {\n if (typeof document === \"undefined\") {\n return activeFullscreenStateIds.size > 0;\n }\n\n return document.querySelector(ACTIVE_FULLSCREEN_ROOT_SELECTOR) !== null;\n}\n\nfunction emitChange(): void {\n listeners.forEach((listener) => listener());\n}\n\nfunction emitIfSnapshotChanged(): void {\n const nextSnapshot = getDomSnapshot();\n\n if (nextSnapshot === lastSnapshot) {\n return;\n }\n\n lastSnapshot = nextSnapshot;\n emitChange();\n}\n\nfunction ensureDomObserver(): void {\n if (typeof document === \"undefined\" || domObserver || listeners.size === 0) {\n return;\n }\n\n domObserver = new MutationObserver(() => {\n emitIfSnapshotChanged();\n });\n\n domObserver.observe(document.documentElement, {\n attributes: true,\n childList: true,\n subtree: true,\n attributeFilter: [\n \"data-fullscreen-state\",\n \"data-fullscreen-state-root\",\n \"data-affect-global-state\",\n ],\n });\n}\n\nfunction releaseDomObserver(): void {\n if (listeners.size > 0 || !domObserver) {\n return;\n }\n\n domObserver.disconnect();\n domObserver = null;\n}\n\nfunction subscribe(listener: () => void): () => void {\n listeners.add(listener);\n ensureDomObserver();\n emitIfSnapshotChanged();\n\n return () => {\n listeners.delete(listener);\n releaseDomObserver();\n };\n}\n\nfunction getSnapshot(): boolean {\n return getDomSnapshot();\n}\n\nexport function registerFullscreenState(id: string): void {\n activeFullscreenStateIds.add(id);\n emitIfSnapshotChanged();\n}\n\nexport function unregisterFullscreenState(id: string): void {\n activeFullscreenStateIds.delete(id);\n emitIfSnapshotChanged();\n}\n\nexport function useIsFullscreenStateActive(): boolean {\n return useSyncExternalStore(subscribe, getSnapshot, () => false);\n}\n"]}
1
+ {"version":3,"sources":["../../src/atoms/icon.tsx","../../src/atoms/spinner.tsx","../../src/atoms/tooltip.tsx","../../src/atoms/button.tsx"],"names":["IconifyIcon","jsx"],"mappings":";;;;AAeO,SAAS,IAAA,CAAK;AAAA,EACnB,SAAA,GAAY,QAAA;AAAA,EACZ,KAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA,GAAO,EAAA;AAAA,EACP,KAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAc;AACZ,EAAA,uBACE,GAAA;AAAA,IAACA,MAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,MAAA,EAAQ,IAAA;AAAA,MACR,IAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA,EAAO,EAAE,KAAA,EAAO,GAAG,KAAA,EAAM;AAAA,MACzB,KAAA,EAAO,IAAA;AAAA,MACN,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,IAAA,CAAK,WAAA,GAAc,MAAA;AC5BZ,SAAS,QAAQ,EAAE,SAAA,GAAY,EAAA,EAAI,IAAA,GAAO,IAAG,EAAiB;AACnE,EAAA,uBACEC,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,YAAA,EAAW,SAAA;AAAA,MACX,IAAA,EAAK,QAAA;AAAA,MAEL,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,2BAA0B,IAAA,EAAY;AAAA;AAAA,GACnD;AAEJ;AAEA,OAAA,CAAQ,WAAA,GAAc,SAAA;ACHf,SAAS,OAAA,CAAQ;AAAA,EACtB,QAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA,GAAmB,CAAA;AAAA,EACnB,WAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,UAAA,GAAa,CAAA;AAAA,EACb,IAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAiB;AACf,EAAA,uBACE,IAAA;AAAA,IAAkB,gBAAA,CAAA,IAAA;AAAA,IAAjB;AAAA,MACC,WAAA;AAAA,MACA,aAAA,EAAe,OAAA;AAAA,MACf,YAAA;AAAA,MACA,IAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAA,GAAAA,CAAkB,gBAAA,CAAA,OAAA,EAAjB,EAAyB,OAAA,EAAO,MAC9B,QAAA,EACH,CAAA;AAAA,wBAEAA,GAAAA,CAAkB,gBAAA,CAAA,MAAA,EAAjB,EACC,QAAA,kBAAAA,GAAAA;AAAA,UAAkB,gBAAA,CAAA,OAAA;AAAA,UAAjB;AAAA,YACC,IAAA,EAAM,QAAA;AAAA,YACN,KAAA,EAAM,QAAA;AAAA,YACN,UAAA;AAAA,YACA,gBAAA;AAAA,YACA,SAAA;AAAA,YACC,GAAG,KAAA;AAAA,YAEH,QAAA,EAAA;AAAA;AAAA,SACH,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AAEA,OAAA,CAAQ,WAAA,GAAc,SAAA;AChDf,SAAS,MAAA,CAAO;AAAA,EACrB,GAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,OAAA,GAAU,KAAA;AAAA,EACV,IAAA,GAAO,QAAA;AAAA,EACP,GAAG;AACL,CAAA,EAAgB;AACd,EAAA,uBACEA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA;AAAA,MACA,UAAU,QAAA,IAAY,OAAA;AAAA,MACtB,WAAA,EAAW,UAAU,IAAA,GAAO,MAAA;AAAA,MAC5B,SAAA;AAAA,MACC,GAAG,KAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ;AAEA,MAAA,CAAO,WAAA,GAAc,QAAA","file":"index.js","sourcesContent":["\"use client\";\n\nimport { Icon as IconifyIcon } from \"@iconify-icon/react\";\nimport type { ComponentProps, CSSProperties } from \"react\";\n\nexport interface IconProps\n extends Omit<ComponentProps<typeof IconifyIcon>, \"icon\" | \"size\"> {\n icon: string | ComponentProps<typeof IconifyIcon>[\"icon\"];\n size?: number | string;\n color?: string;\n className?: string;\n style?: CSSProperties;\n onClick?: () => void;\n}\n\nexport function Icon({\n className = \"center\",\n color,\n icon,\n onClick,\n size = 20,\n style,\n ...props\n}: IconProps) {\n return (\n <IconifyIcon\n className={className}\n height={size}\n icon={icon}\n onClick={onClick}\n style={{ color, ...style }}\n width={size}\n {...props}\n />\n );\n}\n\nIcon.displayName = \"Icon\";\n","\"use client\";\n\nimport { Icon } from \"./icon\";\n\nexport interface SpinnerProps {\n className?: string;\n size?: number;\n}\n\nexport function Spinner({ className = \"\", size = 15 }: SpinnerProps) {\n return (\n <div\n className={className}\n aria-label=\"Loading\"\n role=\"status\"\n >\n <Icon icon=\"mingcute:loading-3-fill\" size={size} />\n </div>\n );\n}\n\nSpinner.displayName = \"Spinner\";\n","\"use client\";\n\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\nimport type { ReactNode } from \"react\";\n\nexport interface TooltipProps {\n children: ReactNode;\n text: ReactNode;\n className?: string;\n open?: boolean;\n defaultOpen?: boolean;\n delayMs?: number;\n position?: \"top\" | \"bottom\" | \"left\" | \"right\";\n sideOffset?: number;\n collisionPadding?: number;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport function Tooltip({\n children,\n className,\n collisionPadding = 8,\n defaultOpen,\n delayMs,\n onOpenChange,\n open,\n position = \"top\",\n sideOffset = 6,\n text,\n ...props\n}: TooltipProps) {\n return (\n <TooltipPrimitive.Root\n defaultOpen={defaultOpen}\n delayDuration={delayMs}\n onOpenChange={onOpenChange}\n open={open}\n >\n <TooltipPrimitive.Trigger asChild>\n {children}\n </TooltipPrimitive.Trigger>\n\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n side={position}\n align=\"center\"\n sideOffset={sideOffset}\n collisionPadding={collisionPadding}\n className={className}\n {...props}\n >\n {text}\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n </TooltipPrimitive.Root>\n );\n}\n\nTooltip.displayName = \"Tooltip\";\n","\"use client\";\n\nimport type { ButtonHTMLAttributes, ReactNode, Ref } from \"react\";\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n ref?: Ref<HTMLButtonElement>;\n children?: ReactNode;\n loading?: boolean;\n}\n\nexport function Button({\n ref,\n children,\n className,\n disabled = false,\n loading = false,\n type = \"button\",\n ...props\n}: ButtonProps) {\n return (\n <button\n ref={ref}\n type={type}\n disabled={disabled || loading}\n aria-busy={loading ? true : undefined}\n className={className}\n {...props}\n >\n {children}\n </button>\n );\n}\n\nButton.displayName = \"Button\";\n"]}
@@ -3,9 +3,6 @@ import React, { createContext, useContext, useRef, useCallback, useEffect } from
3
3
  import { usePathname } from 'next/navigation';
4
4
  import { Icon as Icon$1 } from '@iconify-icon/react';
5
5
  import { jsx, jsxs } from 'react/jsx-runtime';
6
- import '@radix-ui/react-tooltip';
7
- import 'clsx';
8
- import 'tailwind-merge';
9
6
 
10
7
  // src/error/constants.ts
11
8
  var ERROR_MESSAGES = Object.freeze({
@@ -405,28 +402,6 @@ function getOrCreateGlobalContext(name, defaultValue) {
405
402
  return store[sym];
406
403
  }
407
404
 
408
- // src/theme.tsx
409
- function defineThemeSpec(id) {
410
- return Object.freeze({ id });
411
- }
412
- var EMPTY = /* @__PURE__ */ new Map();
413
- var ThemeContext = getOrCreateGlobalContext("ThemeContext", EMPTY);
414
- function useTheme(spec) {
415
- const config = useContext(ThemeContext).get(spec.id);
416
- if (!config) {
417
- throw new Error(
418
- `Theme "${spec.id}" is missing. Add its theme file to src/config/ and list it in src/config/index.ts.`
419
- );
420
- }
421
- return {
422
- slots: config.slots,
423
- styles: config.styles ?? {}
424
- };
425
- }
426
-
427
- // src/error/theme.ts
428
- var errorTheme = defineThemeSpec("error");
429
-
430
405
  // src/utils/user-message.ts
431
406
  var USER_MESSAGES = Object.freeze({
432
407
  generic: "Something went wrong. Please try again",
@@ -484,6 +459,28 @@ function toUserMessage(error, { codes, fallback = USER_MESSAGES.generic } = {})
484
459
  }
485
460
  return fallback;
486
461
  }
462
+
463
+ // src/theme.tsx
464
+ function defineThemeSpec(id) {
465
+ return Object.freeze({ id });
466
+ }
467
+ var EMPTY = /* @__PURE__ */ new Map();
468
+ var ThemeContext = getOrCreateGlobalContext("ThemeContext", EMPTY);
469
+ function useTheme(spec) {
470
+ const config = useContext(ThemeContext).get(spec.id);
471
+ if (!config) {
472
+ throw new Error(
473
+ `Theme "${spec.id}" is missing. Ensure its theme configuration is provided to <ThemeProvider themes={[...]}> (e.g. in src/config/ or your theme setup).`
474
+ );
475
+ }
476
+ return {
477
+ slots: config.slots,
478
+ styles: config.styles ?? {}
479
+ };
480
+ }
481
+
482
+ // src/error/theme.ts
483
+ var errorTheme = defineThemeSpec("error");
487
484
  var ActionButton = Button;
488
485
  function DefaultErrorFallback({
489
486
  error,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/error/constants.ts","../../src/error/utils.ts","../../src/error/reporter.ts","../../src/utils/report.ts","../../src/events.ts","../../src/atoms/icon.tsx","../../src/atoms/button.tsx","../../src/kernel/context-registry.ts","../../src/theme.tsx","../../src/error/theme.ts","../../src/utils/user-message.ts","../../src/error/boundary.tsx","../../src/error/listener.ts"],"names":["IS_BROWSER","report","IconifyIcon","jsx","jsxs"],"mappings":"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","file":"index.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\nlet instance: ErrorReporter | null = null;\n\nexport function getErrorReporter(\n options: ErrorReporterOptions = {},\n): ErrorReporter {\n if (!instance) {\n instance = new ErrorReporter(options);\n }\n return instance;\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","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","import { report } from \"./utils/report\";\nexport type EventListener<T = unknown> = (payload: T) => void;\n\nexport const EVENT_TYPES = Object.freeze({\n API_UNAUTHORIZED: \"API_UNAUTHORIZED\",\n STATE_CHANGE: \"STATE_CHANGE\",\n API_ERROR: \"API_ERROR\",\n APP_ERROR: \"APP_ERROR\",\n} as const);\n\nexport interface FrameworkEventMap {\n [EVENT_TYPES.API_UNAUTHORIZED]: {\n error?: unknown;\n status?: number;\n [key: string]: unknown;\n };\n [EVENT_TYPES.API_ERROR]: {\n error: unknown;\n isCritical?: boolean;\n message?: string;\n retry?: () => void;\n status?: number;\n [key: string]: unknown;\n };\n [EVENT_TYPES.APP_ERROR]: {\n error?: unknown;\n message?: string;\n resetError?: () => void;\n source?: string;\n [key: string]: unknown;\n };\n [EVENT_TYPES.STATE_CHANGE]: {\n message?: string;\n status?: \"success\" | \"warning\" | \"info\" | \"error\" | string;\n [key: string]: unknown;\n };\n}\n\nexport class EventEmitter<TEvents extends object = FrameworkEventMap> {\n private events: Map<string, Set<EventListener<never>>> = new Map();\n private debounceTimers: Map<string, ReturnType<typeof setTimeout>> =\n new Map();\n\n subscribe<K extends keyof TEvents>(\n event: K,\n callback: EventListener<TEvents[K]>,\n ): () => void;\n subscribe<T = unknown>(event: string, callback: EventListener<T>): () => void;\n subscribe(event: string, callback: EventListener<never>): () => void {\n if (typeof event !== \"string\" || !event || typeof callback !== \"function\") {\n return () => {};\n }\n const listeners = this.events.get(event) || new Set<EventListener<never>>();\n listeners.add(callback);\n this.events.set(event, listeners);\n\n return () => {\n listeners.delete(callback);\n if (listeners.size === 0) this.events.delete(event);\n };\n }\n\n emit<K extends keyof TEvents>(\n event: K,\n ...args: TEvents[K] extends void | undefined\n ? [payload?: TEvents[K]]\n : [payload: TEvents[K]]\n ): void;\n emit<T = unknown>(event: string, payload?: T): void;\n emit(event: string, payload?: unknown): void {\n const listeners = this.events.get(event);\n if (!listeners || listeners.size === 0) return;\n const snapshot = Array.from(listeners);\n for (const callback of snapshot) {\n try {\n (callback as EventListener<unknown>)(payload);\n } catch (error) {\n report(`Event listener (${String(event)})`, error);\n }\n }\n }\n\n emitDebounced<K extends keyof TEvents>(\n event: K,\n payload: TEvents[K],\n waitMs?: number,\n ): void;\n emitDebounced<T = unknown>(event: string, payload?: T, waitMs?: number): void;\n emitDebounced(event: string, payload?: unknown, waitMs: number = 100): void {\n const existing = this.debounceTimers.get(event);\n if (existing) clearTimeout(existing);\n\n const timer = setTimeout(() => {\n this.debounceTimers.delete(event);\n this.emit(event, payload);\n }, waitMs);\n\n this.debounceTimers.set(event, timer);\n }\n\n cancelDebounced(event?: string): void {\n if (event) {\n const timer = this.debounceTimers.get(event);\n if (timer) {\n clearTimeout(timer);\n this.debounceTimers.delete(event);\n }\n } else {\n for (const timer of this.debounceTimers.values()) {\n clearTimeout(timer);\n }\n this.debounceTimers.clear();\n }\n }\n\n unsubscribeAll(event?: string): void {\n this.cancelDebounced(event);\n if (event) this.events.delete(event);\n else this.events.clear();\n }\n\n hasListeners(event: string): boolean {\n return Boolean(this.events.get(event)?.size);\n }\n\n getListenerCount(event: string): number {\n return this.events.get(event)?.size || 0;\n }\n\n getAllEvents(): string[] {\n return [...this.events.keys()];\n }\n}\n\nconst GLOBAL_EVENTS_KEY = Symbol.for(\"__base_framework_global_events__\");\ntype GlobalWithEvents = typeof globalThis & {\n [GLOBAL_EVENTS_KEY]?: EventEmitter<FrameworkEventMap>;\n};\n\nconst _global = globalThis as GlobalWithEvents;\nexport const globalEvents: EventEmitter<FrameworkEventMap> =\n _global[GLOBAL_EVENTS_KEY] ??\n (_global[GLOBAL_EVENTS_KEY] = new EventEmitter<FrameworkEventMap>());\n","\"use client\";\n\nimport { Icon as IconifyIcon } from \"@iconify-icon/react\";\nimport type { ComponentProps, CSSProperties } from \"react\";\n\nexport interface IconProps\n extends Omit<ComponentProps<typeof IconifyIcon>, \"icon\" | \"size\"> {\n icon: string | ComponentProps<typeof IconifyIcon>[\"icon\"];\n size?: number | string;\n color?: string;\n className?: string;\n style?: CSSProperties;\n onClick?: () => void;\n}\n\nexport function Icon({\n className = \"center\",\n color,\n icon,\n onClick,\n size = 20,\n style,\n ...props\n}: IconProps) {\n return (\n <IconifyIcon\n className={className}\n height={size}\n icon={icon}\n onClick={onClick}\n style={{ color, ...style }}\n width={size}\n {...props}\n />\n );\n}\n\nIcon.displayName = \"Icon\";\n","\"use client\";\n\nimport type { ButtonHTMLAttributes, ReactNode, Ref } from \"react\";\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n ref?: Ref<HTMLButtonElement>;\n children?: ReactNode;\n loading?: boolean;\n}\n\nexport function Button({\n ref,\n children,\n className,\n disabled = false,\n loading = false,\n type = \"button\",\n ...props\n}: ButtonProps) {\n return (\n <button\n ref={ref}\n type={type}\n disabled={disabled || loading}\n aria-busy={loading ? true : undefined}\n className={className}\n {...props}\n >\n {children}\n </button>\n );\n}\n\nButton.displayName = \"Button\";\n","import { createContext, type Context } from \"react\";\n\nexport function getOrCreateGlobalContext<T>(\n name: string,\n defaultValue: T,\n): Context<T> {\n const sym = Symbol.for(`@omerdlw/base-framework/context/${name}`);\n const store = globalThis as unknown as Record<symbol, Context<T>>;\n if (!store[sym]) {\n store[sym] = createContext<T>(defaultValue);\n }\n return store[sym];\n}\n","\"use client\";\n\nimport {\n createContext,\n createElement,\n useContext,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\n\nexport interface ThemeSpec<S extends string = string> {\n readonly id: string;\n readonly _slots?: S;\n}\n\nexport interface ThemeConfig<S extends string> {\n slots: Readonly<Record<S, string>>;\n styles?: Readonly<Partial<Record<S, CSSProperties>>>;\n}\n\nexport interface ResolvedTheme<S extends string> {\n readonly slots: Readonly<Record<S, string>>;\n readonly styles: Readonly<Partial<Record<S, CSSProperties>>>;\n}\n\nexport interface ThemeEntry {\n readonly id: string;\n readonly config: ThemeConfig<string>;\n}\n\nexport function defineThemeSpec<S extends string>(id: string): ThemeSpec<S> {\n return Object.freeze({ id });\n}\n\nexport function defineTheme<S extends string>(\n spec: ThemeSpec<S>,\n config: ThemeConfig<NoInfer<S>>,\n): ThemeEntry {\n return { id: spec.id, config: config as ThemeEntry[\"config\"] };\n}\n\nimport { getOrCreateGlobalContext } from \"@/kernel/context-registry\";\n\nconst EMPTY: ReadonlyMap<string, ThemeEntry[\"config\"]> = new Map();\nconst ThemeContext = getOrCreateGlobalContext<\n ReadonlyMap<string, ThemeEntry[\"config\"]>\n>(\"ThemeContext\", EMPTY);\n\nexport function ThemeProvider({\n children,\n themes,\n}: {\n children?: ReactNode;\n themes: readonly ThemeEntry[];\n}) {\n const configs = new Map(themes.map((entry) => [entry.id, entry.config]));\n return createElement(ThemeContext.Provider, { value: configs }, children);\n}\n\nexport function useTheme<S extends string>(\n spec: ThemeSpec<S>,\n): ResolvedTheme<S> {\n const config = useContext(ThemeContext).get(spec.id);\n if (!config) {\n throw new Error(\n `Theme \"${spec.id}\" is missing. Add its theme file to src/config/ and list it in src/config/index.ts.`,\n );\n }\n return {\n slots: config.slots,\n styles: config.styles ?? {},\n } as ResolvedTheme<S>;\n}\n","import { defineThemeSpec } from \"@/theme\";\n\nexport type ErrorThemeSlot = \"screen\" | \"icon\" | \"title\" | \"retryButton\";\n\nexport const errorTheme = defineThemeSpec<ErrorThemeSlot>(\"error\");\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","\"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"]}
1
+ {"version":3,"sources":["../../src/error/constants.ts","../../src/error/utils.ts","../../src/error/reporter.ts","../../src/utils/report.ts","../../src/events.ts","../../src/atoms/icon.tsx","../../src/atoms/button.tsx","../../src/kernel/context-registry.ts","../../src/utils/user-message.ts","../../src/theme.tsx","../../src/error/theme.ts","../../src/error/boundary.tsx","../../src/error/listener.ts"],"names":["IS_BROWSER","report","IconifyIcon","jsx"],"mappings":"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","file":"index.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\nlet instance: ErrorReporter | null = null;\n\nexport function getErrorReporter(\n options: ErrorReporterOptions = {},\n): ErrorReporter {\n if (!instance) {\n instance = new ErrorReporter(options);\n }\n return instance;\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","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","import { report } from \"./utils/report\";\nexport type EventListener<T = unknown> = (payload: T) => void;\n\nexport const EVENT_TYPES = Object.freeze({\n API_UNAUTHORIZED: \"API_UNAUTHORIZED\",\n STATE_CHANGE: \"STATE_CHANGE\",\n API_ERROR: \"API_ERROR\",\n APP_ERROR: \"APP_ERROR\",\n} as const);\n\nexport interface FrameworkEventMap {\n [EVENT_TYPES.API_UNAUTHORIZED]: {\n error?: unknown;\n status?: number;\n [key: string]: unknown;\n };\n [EVENT_TYPES.API_ERROR]: {\n error: unknown;\n isCritical?: boolean;\n message?: string;\n retry?: () => void;\n status?: number;\n [key: string]: unknown;\n };\n [EVENT_TYPES.APP_ERROR]: {\n error?: unknown;\n message?: string;\n resetError?: () => void;\n source?: string;\n [key: string]: unknown;\n };\n [EVENT_TYPES.STATE_CHANGE]: {\n message?: string;\n status?: \"success\" | \"warning\" | \"info\" | \"error\" | string;\n [key: string]: unknown;\n };\n}\n\nexport class EventEmitter<TEvents extends object = FrameworkEventMap> {\n private events: Map<string, Set<EventListener<never>>> = new Map();\n private debounceTimers: Map<string, ReturnType<typeof setTimeout>> =\n new Map();\n\n subscribe<K extends keyof TEvents>(\n event: K,\n callback: EventListener<TEvents[K]>,\n ): () => void;\n subscribe<T = unknown>(event: string, callback: EventListener<T>): () => void;\n subscribe(event: string, callback: EventListener<never>): () => void {\n if (typeof event !== \"string\" || !event || typeof callback !== \"function\") {\n return () => {};\n }\n const listeners = this.events.get(event) || new Set<EventListener<never>>();\n listeners.add(callback);\n this.events.set(event, listeners);\n\n return () => {\n listeners.delete(callback);\n if (listeners.size === 0) this.events.delete(event);\n };\n }\n\n emit<K extends keyof TEvents>(\n event: K,\n ...args: TEvents[K] extends void | undefined\n ? [payload?: TEvents[K]]\n : [payload: TEvents[K]]\n ): void;\n emit<T = unknown>(event: string, payload?: T): void;\n emit(event: string, payload?: unknown): void {\n const listeners = this.events.get(event);\n if (!listeners || listeners.size === 0) return;\n const snapshot = Array.from(listeners);\n for (const callback of snapshot) {\n try {\n (callback as EventListener<unknown>)(payload);\n } catch (error) {\n report(`Event listener (${String(event)})`, error);\n }\n }\n }\n\n emitDebounced<K extends keyof TEvents>(\n event: K,\n payload: TEvents[K],\n waitMs?: number,\n ): void;\n emitDebounced<T = unknown>(event: string, payload?: T, waitMs?: number): void;\n emitDebounced(event: string, payload?: unknown, waitMs: number = 100): void {\n const existing = this.debounceTimers.get(event);\n if (existing) clearTimeout(existing);\n\n const timer = setTimeout(() => {\n this.debounceTimers.delete(event);\n this.emit(event, payload);\n }, waitMs);\n\n this.debounceTimers.set(event, timer);\n }\n\n cancelDebounced(event?: string): void {\n if (event) {\n const timer = this.debounceTimers.get(event);\n if (timer) {\n clearTimeout(timer);\n this.debounceTimers.delete(event);\n }\n } else {\n for (const timer of this.debounceTimers.values()) {\n clearTimeout(timer);\n }\n this.debounceTimers.clear();\n }\n }\n\n unsubscribeAll(event?: string): void {\n this.cancelDebounced(event);\n if (event) this.events.delete(event);\n else this.events.clear();\n }\n\n hasListeners(event: string): boolean {\n return Boolean(this.events.get(event)?.size);\n }\n\n getListenerCount(event: string): number {\n return this.events.get(event)?.size || 0;\n }\n\n getAllEvents(): string[] {\n return [...this.events.keys()];\n }\n}\n\nconst GLOBAL_EVENTS_KEY = Symbol.for(\"__base_framework_global_events__\");\ntype GlobalWithEvents = typeof globalThis & {\n [GLOBAL_EVENTS_KEY]?: EventEmitter<FrameworkEventMap>;\n};\n\nconst _global = globalThis as GlobalWithEvents;\nexport const globalEvents: EventEmitter<FrameworkEventMap> =\n _global[GLOBAL_EVENTS_KEY] ??\n (_global[GLOBAL_EVENTS_KEY] = new EventEmitter<FrameworkEventMap>());\n","\"use client\";\n\nimport { Icon as IconifyIcon } from \"@iconify-icon/react\";\nimport type { ComponentProps, CSSProperties } from \"react\";\n\nexport interface IconProps\n extends Omit<ComponentProps<typeof IconifyIcon>, \"icon\" | \"size\"> {\n icon: string | ComponentProps<typeof IconifyIcon>[\"icon\"];\n size?: number | string;\n color?: string;\n className?: string;\n style?: CSSProperties;\n onClick?: () => void;\n}\n\nexport function Icon({\n className = \"center\",\n color,\n icon,\n onClick,\n size = 20,\n style,\n ...props\n}: IconProps) {\n return (\n <IconifyIcon\n className={className}\n height={size}\n icon={icon}\n onClick={onClick}\n style={{ color, ...style }}\n width={size}\n {...props}\n />\n );\n}\n\nIcon.displayName = \"Icon\";\n","\"use client\";\n\nimport type { ButtonHTMLAttributes, ReactNode, Ref } from \"react\";\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n ref?: Ref<HTMLButtonElement>;\n children?: ReactNode;\n loading?: boolean;\n}\n\nexport function Button({\n ref,\n children,\n className,\n disabled = false,\n loading = false,\n type = \"button\",\n ...props\n}: ButtonProps) {\n return (\n <button\n ref={ref}\n type={type}\n disabled={disabled || loading}\n aria-busy={loading ? true : undefined}\n className={className}\n {...props}\n >\n {children}\n </button>\n );\n}\n\nButton.displayName = \"Button\";\n","import { createContext, type Context } from \"react\";\n\nexport function getOrCreateGlobalContext<T>(\n name: string,\n defaultValue: T,\n): Context<T> {\n const sym = Symbol.for(`@omerdlw/base-framework/context/${name}`);\n const store = globalThis as unknown as Record<symbol, Context<T>>;\n if (!store[sym]) {\n store[sym] = createContext<T>(defaultValue);\n }\n return store[sym];\n}\n","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","\"use client\";\n\nimport {\n createElement,\n useContext,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { getOrCreateGlobalContext } from \"@/kernel\";\n\nexport interface ThemeSpec<S extends string = string> {\n readonly id: string;\n readonly _slots?: S;\n}\n\nexport interface ThemeConfig<S extends string> {\n slots: Readonly<Record<S, string>>;\n styles?: Readonly<Partial<Record<S, CSSProperties>>>;\n}\n\nexport interface ResolvedTheme<S extends string> {\n readonly slots: Readonly<Record<S, string>>;\n readonly styles: Readonly<Partial<Record<S, CSSProperties>>>;\n}\n\nexport interface ThemeEntry {\n readonly id: string;\n readonly config: ThemeConfig<string>;\n}\n\nexport function defineThemeSpec<S extends string>(id: string): ThemeSpec<S> {\n return Object.freeze({ id });\n}\n\nexport function defineTheme<S extends string>(\n spec: ThemeSpec<S>,\n config: ThemeConfig<NoInfer<S>>,\n): ThemeEntry {\n return { id: spec.id, config: config as ThemeEntry[\"config\"] };\n}\n\nconst EMPTY: ReadonlyMap<string, ThemeEntry[\"config\"]> = new Map();\nconst ThemeContext = getOrCreateGlobalContext<\n ReadonlyMap<string, ThemeEntry[\"config\"]>\n>(\"ThemeContext\", EMPTY);\n\n\nexport function ThemeProvider({\n children,\n themes,\n}: {\n children?: ReactNode;\n themes: readonly ThemeEntry[];\n}) {\n const configs = new Map(themes.map((entry) => [entry.id, entry.config]));\n return createElement(ThemeContext.Provider, { value: configs }, children);\n}\n\nexport function useTheme<S extends string>(\n spec: ThemeSpec<S>,\n): ResolvedTheme<S> {\n const config = useContext(ThemeContext).get(spec.id);\n if (!config) {\n throw new Error(\n `Theme \"${spec.id}\" is missing. Ensure its theme configuration is provided to <ThemeProvider themes={[...]}> (e.g. in src/config/ or your theme setup).`,\n );\n }\n return {\n slots: config.slots,\n styles: config.styles ?? {},\n } as ResolvedTheme<S>;\n}\n\nexport { useTheme as useModuleTheme };\n\n","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"]}
@@ -4,5 +4,7 @@ export { useClickOutside } from "./use-click-outside";
4
4
  export { useIsomorphicLayoutEffect } from "./use-isomorphic-layout-effect";
5
5
  export { useGlobalEvent } from "./use-global-event";
6
6
  export { useIsFullscreenStateActive } from "./use-fullscreen-state";
7
+ export { useControllableState } from "./use-controllable-state";
8
+ export { useHotkey, useEscapeKey } from "./use-hotkey";
7
9
  export type * from "./types";
8
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAEpE,mBAAmB,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEvD,mBAAmB,SAAS,CAAC"}
@@ -1,7 +1,5 @@
1
1
  "use client";
2
- import { useLayoutEffect, useEffect, use, useRef, useCallback, useSyncExternalStore } from 'react';
3
- import 'clsx';
4
- import 'tailwind-merge';
2
+ import { useLayoutEffect, useEffect, use, useRef, useCallback, useSyncExternalStore, useState } from 'react';
5
3
 
6
4
  function useRequiredContext(context, hookName, providerName) {
7
5
  const value = use(context);
@@ -262,7 +260,102 @@ function getSnapshot() {
262
260
  function useIsFullscreenStateActive() {
263
261
  return useSyncExternalStore(subscribe, getSnapshot, () => false);
264
262
  }
263
+ function useControllableState({
264
+ defaultValue,
265
+ onChange,
266
+ value
267
+ }) {
268
+ const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue);
269
+ const isControlled = value !== void 0;
270
+ const currentValue = isControlled ? value : uncontrolledValue;
271
+ const valueRef = useRef(currentValue);
272
+ const onChangeRef = useRef(onChange);
273
+ useIsomorphicLayoutEffect(() => {
274
+ valueRef.current = currentValue;
275
+ onChangeRef.current = onChange;
276
+ });
277
+ const setValue = useCallback(
278
+ (next) => {
279
+ const resolvedNext = typeof next === "function" ? next(valueRef.current) : next;
280
+ if (!Object.is(valueRef.current, resolvedNext)) {
281
+ if (!isControlled) {
282
+ setUncontrolledValue(resolvedNext);
283
+ }
284
+ onChangeRef.current?.(resolvedNext);
285
+ }
286
+ },
287
+ [isControlled]
288
+ );
289
+ return [currentValue, setValue];
290
+ }
291
+ function isEditableElement(target) {
292
+ if (!target || typeof target.tagName !== "string") {
293
+ return false;
294
+ }
295
+ const element = target;
296
+ const tagName = element.tagName.toLowerCase();
297
+ if (tagName === "input" || tagName === "textarea" || tagName === "select") {
298
+ return true;
299
+ }
300
+ return Boolean(element.isContentEditable);
301
+ }
302
+ function matchesKeyCombo(event, combo) {
303
+ const parts = combo.toLowerCase().split("+").map((p) => p.trim()).filter(Boolean);
304
+ if (parts.length === 0) return false;
305
+ const keyPart = parts[parts.length - 1];
306
+ const modifiers = new Set(parts.slice(0, -1));
307
+ const wantsMod = modifiers.has("mod") || modifiers.has("cmd") || modifiers.has("meta");
308
+ const wantsCtrl = modifiers.has("ctrl") || modifiers.has("control");
309
+ const wantsAlt = modifiers.has("alt") || modifiers.has("option");
310
+ const wantsShift = modifiers.has("shift");
311
+ const isModPressed = event.metaKey || event.ctrlKey;
312
+ if (wantsMod && !isModPressed) return false;
313
+ if (!wantsMod && !wantsCtrl && (event.metaKey || event.ctrlKey)) return false;
314
+ if (wantsCtrl && !event.ctrlKey) return false;
315
+ if (wantsAlt !== event.altKey) return false;
316
+ if (wantsShift !== event.shiftKey) return false;
317
+ const pressedKey = event.key.toLowerCase();
318
+ if (keyPart === "esc" || keyPart === "escape") {
319
+ return pressedKey === "escape" || pressedKey === "esc";
320
+ }
321
+ if (keyPart === "space") {
322
+ return pressedKey === " " || pressedKey === "spacebar";
323
+ }
324
+ return pressedKey === keyPart;
325
+ }
326
+ function useHotkey(combo, callback, options) {
327
+ const callbackRef = useRef(callback);
328
+ useIsomorphicLayoutEffect(() => {
329
+ callbackRef.current = callback;
330
+ });
331
+ const enabled = options?.enabled ?? true;
332
+ const enableOnFormTags = options?.enableOnFormTags ?? false;
333
+ const preventDefault = options?.preventDefault ?? true;
334
+ const stopPropagation = options?.stopPropagation ?? false;
335
+ useEffect(() => {
336
+ if (!isBrowser || !enabled || !combo) return;
337
+ const combos = (Array.isArray(combo) ? combo : [combo]).filter(Boolean);
338
+ if (combos.length === 0) return;
339
+ const handleKeyDown = (event) => {
340
+ if (!enableOnFormTags && isEditableElement(event.target)) return;
341
+ const matched = combos.some((c) => matchesKeyCombo(event, c));
342
+ if (!matched) return;
343
+ if (preventDefault) event.preventDefault();
344
+ if (stopPropagation) event.stopPropagation();
345
+ callbackRef.current?.(event);
346
+ };
347
+ window.addEventListener("keydown", handleKeyDown);
348
+ return () => window.removeEventListener("keydown", handleKeyDown);
349
+ }, [combo, enabled, enableOnFormTags, preventDefault, stopPropagation]);
350
+ }
351
+ function useEscapeKey(callback, enabled = true) {
352
+ useHotkey("escape", callback, {
353
+ enabled,
354
+ enableOnFormTags: true,
355
+ preventDefault: false
356
+ });
357
+ }
265
358
 
266
- export { useClickOutside, useGlobalEvent, useIsFullscreenStateActive, useIsomorphicLayoutEffect, useRequiredContext, useStore };
359
+ export { useClickOutside, useControllableState, useEscapeKey, useGlobalEvent, useHotkey, useIsFullscreenStateActive, useIsomorphicLayoutEffect, useRequiredContext, useStore };
267
360
  //# sourceMappingURL=index.js.map
268
361
  //# sourceMappingURL=index.js.map