@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
package/dist/provider.js CHANGED
@@ -4,8 +4,6 @@ import * as TooltipPrimitive from '@radix-ui/react-tooltip';
4
4
  import { usePathname } from 'next/navigation';
5
5
  import { Icon as Icon$1 } from '@iconify-icon/react';
6
6
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
7
- import 'clsx';
8
- import 'tailwind-merge';
9
7
 
10
8
  // src/error/constants.ts
11
9
  var ERROR_MESSAGES = Object.freeze({
@@ -396,6 +394,58 @@ function Button({
396
394
  );
397
395
  }
398
396
  Button.displayName = "Button";
397
+
398
+ // src/kernel/constants.ts
399
+ var DEFAULT_SOURCE = "dynamic";
400
+ var REGISTRY_SOURCES = Object.freeze({
401
+ STATIC: "static",
402
+ DYNAMIC: "dynamic",
403
+ USER: "user"
404
+ });
405
+ var REGISTRY_LIFECYCLES = Object.freeze({
406
+ IMMEDIATE: "immediate",
407
+ GRACEFUL: "graceful",
408
+ PERSISTENT: "persistent",
409
+ ROUTE: "route"
410
+ });
411
+ var REGISTRY_VALIDATION_MODES = Object.freeze({
412
+ WARN: "warn",
413
+ STRICT: "strict"
414
+ });
415
+ var REGISTRY_METADATA_KEYS = Object.freeze([
416
+ "cleanup",
417
+ "cleanupDelayMs",
418
+ "instanceId",
419
+ "lifecycle",
420
+ "priority",
421
+ "source",
422
+ "scope",
423
+ "validation"
424
+ ]);
425
+ var REGISTRY_SOURCE_PRIORITY = Object.freeze({
426
+ [REGISTRY_SOURCES.STATIC]: 100,
427
+ [REGISTRY_SOURCES.DYNAMIC]: 200,
428
+ [REGISTRY_SOURCES.USER]: 300
429
+ });
430
+ var REGISTRY_SOURCE_RANK = Object.freeze({
431
+ [REGISTRY_SOURCES.STATIC]: 10,
432
+ [REGISTRY_SOURCES.DYNAMIC]: 20,
433
+ [REGISTRY_SOURCES.USER]: 30
434
+ });
435
+ var REGISTRY_LIFECYCLE_VALUES = new Set(
436
+ Object.values(REGISTRY_LIFECYCLES)
437
+ );
438
+ var REGISTRY_METADATA_KEY_SET = new Set(
439
+ REGISTRY_METADATA_KEYS
440
+ );
441
+ var REGISTRY_SCOPE_KINDS = Object.freeze({
442
+ APP: "app",
443
+ SESSION: "session",
444
+ ROUTE: "route",
445
+ INSTANCE: "instance",
446
+ WORKSPACE: "workspace"
447
+ });
448
+ var DEFAULT_REGISTRY_SCOPE = REGISTRY_SCOPE_KINDS.APP;
399
449
  function getOrCreateGlobalContext(name, defaultValue) {
400
450
  const sym = /* @__PURE__ */ Symbol.for(`@omerdlw/base-framework/context/${name}`);
401
451
  const store = globalThis;
@@ -405,28 +455,6 @@ function getOrCreateGlobalContext(name, defaultValue) {
405
455
  return store[sym];
406
456
  }
407
457
 
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
458
  // src/utils/string.ts
431
459
  function trimToNull(value) {
432
460
  if (value === null || value === void 0) return null;
@@ -583,239 +611,6 @@ function createStore(initialState, { freezeSnapshots = true } = {}) {
583
611
  }
584
612
  });
585
613
  }
586
- var ActionButton = Button;
587
- function DefaultErrorFallback({
588
- error,
589
- message,
590
- resetError,
591
- title
592
- }) {
593
- const theme = useTheme(errorTheme);
594
- return /* @__PURE__ */ jsxs("div", { className: theme.slots.screen, children: [
595
- /* @__PURE__ */ jsx("div", { className: theme.slots.icon, children: /* @__PURE__ */ jsx(Icon, { icon: "solar:danger-circle-bold", size: 30 }) }),
596
- /* @__PURE__ */ jsx("h3", { className: theme.slots.title, children: message || toUserMessage(error, { fallback: ERROR_MESSAGES.FALLBACK_MSG }) }),
597
- /* @__PURE__ */ jsx(
598
- ActionButton,
599
- {
600
- className: theme.slots.retryButton,
601
- onClick: resetError,
602
- type: "button",
603
- children: "Try again"
604
- }
605
- )
606
- ] });
607
- }
608
- var ErrorBoundaryCore = class extends React.Component {
609
- constructor(props) {
610
- super(props);
611
- this.state = {
612
- error: null,
613
- errorInfo: null,
614
- hasError: false,
615
- lastResetKey: props.resetKey
616
- };
617
- }
618
- static getDerivedStateFromError(error) {
619
- return { error, hasError: true };
620
- }
621
- static getDerivedStateFromProps(props, state) {
622
- if (props.resetKey !== state.lastResetKey) {
623
- return {
624
- error: null,
625
- errorInfo: null,
626
- hasError: false,
627
- lastResetKey: props.resetKey
628
- };
629
- }
630
- return null;
631
- }
632
- componentDidCatch(error, errorInfo) {
633
- this.setState({ errorInfo });
634
- const { message, name, onError, silent, title, variant } = this.props;
635
- const context = createErrorContext({ errorInfo, name, title, variant });
636
- try {
637
- onError?.(error, errorInfo, context);
638
- } catch (callbackError) {
639
- report("ErrorBoundary onError callback", callbackError, "warn");
640
- }
641
- if (!silent) {
642
- globalEvents.emit(EVENT_TYPES.APP_ERROR, {
643
- error,
644
- errorInfo,
645
- message: message || toUserMessage(error),
646
- resetError: this.resetError
647
- });
648
- }
649
- try {
650
- const reporter = getErrorReporter();
651
- reporter?.captureError?.(error, context);
652
- } catch (reportingError) {
653
- report("ErrorBoundary reporting", reportingError, "warn");
654
- }
655
- }
656
- resetError = () => {
657
- this.setState({
658
- error: null,
659
- errorInfo: null,
660
- hasError: false
661
- });
662
- this.props.onReset?.();
663
- };
664
- render() {
665
- if (!this.state.hasError) return this.props.children;
666
- const { fallback, message, title } = this.props;
667
- const { error } = this.state;
668
- if (typeof fallback === "function") {
669
- return fallback({ error, resetError: this.resetError });
670
- }
671
- if (fallback) {
672
- return fallback;
673
- }
674
- return /* @__PURE__ */ jsx(
675
- DefaultErrorFallback,
676
- {
677
- error,
678
- message,
679
- resetError: this.resetError,
680
- title
681
- }
682
- );
683
- }
684
- };
685
- function GlobalError({ children, fallback, onReset }) {
686
- const pathname = usePathname();
687
- return /* @__PURE__ */ jsx(
688
- ErrorBoundaryCore,
689
- {
690
- fallback,
691
- message: ERROR_MESSAGES.GLOBAL_MSG,
692
- onReset,
693
- resetKey: pathname,
694
- title: ERROR_MESSAGES.GLOBAL_TITLE,
695
- variant: "full",
696
- children
697
- }
698
- );
699
- }
700
- function ModuleError({
701
- children,
702
- fallback,
703
- name,
704
- onReset
705
- }) {
706
- return /* @__PURE__ */ jsx(
707
- ErrorBoundaryCore,
708
- {
709
- fallback,
710
- message: ERROR_MESSAGES.MODULE_MSG,
711
- name,
712
- onReset,
713
- title: name ? `${name} Error` : ERROR_MESSAGES.MODULE_TITLE,
714
- variant: "module",
715
- children
716
- }
717
- );
718
- }
719
- function GlobalErrorListener() {
720
- const lastError = useRef(0);
721
- const count = useRef(0);
722
- const shown = useRef(/* @__PURE__ */ new Set());
723
- const handleError = useCallback((error, source = "runtime") => {
724
- if (shouldIgnoreError(error)) return;
725
- const now = Date.now();
726
- if (count.current >= ERROR_LISTENER_CONFIG.maxErrors) return;
727
- if (now - lastError.current < ERROR_LISTENER_CONFIG.throttle) return;
728
- const message = getErrorMessage(error);
729
- const key = message || String(error);
730
- if (shown.current.has(key)) return;
731
- shown.current.add(key);
732
- lastError.current = now;
733
- count.current += 1;
734
- try {
735
- const reporter = getErrorReporter();
736
- reporter?.captureError?.(error, {
737
- globalListener: true,
738
- source
739
- });
740
- } catch (reportingError) {
741
- report("GlobalError reporting", reportingError, "warn");
742
- }
743
- globalEvents.emit(EVENT_TYPES.APP_ERROR, {
744
- error,
745
- message: toUserMessage(error)
746
- });
747
- }, []);
748
- useEffect(() => {
749
- const removeSink = setReportSink((scope, error, level) => {
750
- try {
751
- getErrorReporter().captureError(error, { level, scope });
752
- } catch {
753
- }
754
- });
755
- const onError = (event) => handleError(event.error || event.message, "window.onerror");
756
- const onRejection = (event) => handleError(event.reason, "unhandledrejection");
757
- window.addEventListener("error", onError);
758
- window.addEventListener("unhandledrejection", onRejection);
759
- return () => {
760
- removeSink();
761
- window.removeEventListener("error", onError);
762
- window.removeEventListener("unhandledrejection", onRejection);
763
- };
764
- }, [handleError]);
765
- return null;
766
- }
767
-
768
- // src/kernel/constants.ts
769
- var DEFAULT_SOURCE = "dynamic";
770
- var REGISTRY_SOURCES = Object.freeze({
771
- STATIC: "static",
772
- DYNAMIC: "dynamic",
773
- USER: "user"
774
- });
775
- var REGISTRY_LIFECYCLES = Object.freeze({
776
- IMMEDIATE: "immediate",
777
- GRACEFUL: "graceful",
778
- PERSISTENT: "persistent",
779
- ROUTE: "route"
780
- });
781
- var REGISTRY_VALIDATION_MODES = Object.freeze({
782
- WARN: "warn",
783
- STRICT: "strict"
784
- });
785
- var REGISTRY_METADATA_KEYS = Object.freeze([
786
- "cleanup",
787
- "cleanupDelayMs",
788
- "instanceId",
789
- "lifecycle",
790
- "priority",
791
- "source",
792
- "scope",
793
- "validation"
794
- ]);
795
- var REGISTRY_SOURCE_PRIORITY = Object.freeze({
796
- [REGISTRY_SOURCES.STATIC]: 100,
797
- [REGISTRY_SOURCES.DYNAMIC]: 200,
798
- [REGISTRY_SOURCES.USER]: 300
799
- });
800
- var REGISTRY_SOURCE_RANK = Object.freeze({
801
- [REGISTRY_SOURCES.STATIC]: 10,
802
- [REGISTRY_SOURCES.DYNAMIC]: 20,
803
- [REGISTRY_SOURCES.USER]: 30
804
- });
805
- var REGISTRY_LIFECYCLE_VALUES = new Set(
806
- Object.values(REGISTRY_LIFECYCLES)
807
- );
808
- var REGISTRY_METADATA_KEY_SET = new Set(
809
- REGISTRY_METADATA_KEYS
810
- );
811
- var REGISTRY_SCOPE_KINDS = Object.freeze({
812
- APP: "app",
813
- SESSION: "session",
814
- ROUTE: "route",
815
- INSTANCE: "instance",
816
- WORKSPACE: "workspace"
817
- });
818
- var DEFAULT_REGISTRY_SCOPE = REGISTRY_SCOPE_KINDS.APP;
819
614
 
820
615
  // src/kernel/utils.ts
821
616
  function hasOwnProperty(target, key) {
@@ -1933,6 +1728,209 @@ function Compose({ providers, children }) {
1933
1728
  createElement(Fragment$1, null, children)
1934
1729
  );
1935
1730
  }
1731
+
1732
+ // src/theme.tsx
1733
+ function defineThemeSpec(id) {
1734
+ return Object.freeze({ id });
1735
+ }
1736
+ var EMPTY = /* @__PURE__ */ new Map();
1737
+ var ThemeContext = getOrCreateGlobalContext("ThemeContext", EMPTY);
1738
+ function useTheme(spec) {
1739
+ const config = useContext(ThemeContext).get(spec.id);
1740
+ if (!config) {
1741
+ throw new Error(
1742
+ `Theme "${spec.id}" is missing. Ensure its theme configuration is provided to <ThemeProvider themes={[...]}> (e.g. in src/config/ or your theme setup).`
1743
+ );
1744
+ }
1745
+ return {
1746
+ slots: config.slots,
1747
+ styles: config.styles ?? {}
1748
+ };
1749
+ }
1750
+
1751
+ // src/error/theme.ts
1752
+ var errorTheme = defineThemeSpec("error");
1753
+ var ActionButton = Button;
1754
+ function DefaultErrorFallback({
1755
+ error,
1756
+ message,
1757
+ resetError,
1758
+ title
1759
+ }) {
1760
+ const theme = useTheme(errorTheme);
1761
+ return /* @__PURE__ */ jsxs("div", { className: theme.slots.screen, children: [
1762
+ /* @__PURE__ */ jsx("div", { className: theme.slots.icon, children: /* @__PURE__ */ jsx(Icon, { icon: "solar:danger-circle-bold", size: 30 }) }),
1763
+ /* @__PURE__ */ jsx("h3", { className: theme.slots.title, children: message || toUserMessage(error, { fallback: ERROR_MESSAGES.FALLBACK_MSG }) }),
1764
+ /* @__PURE__ */ jsx(
1765
+ ActionButton,
1766
+ {
1767
+ className: theme.slots.retryButton,
1768
+ onClick: resetError,
1769
+ type: "button",
1770
+ children: "Try again"
1771
+ }
1772
+ )
1773
+ ] });
1774
+ }
1775
+ var ErrorBoundaryCore = class extends React.Component {
1776
+ constructor(props) {
1777
+ super(props);
1778
+ this.state = {
1779
+ error: null,
1780
+ errorInfo: null,
1781
+ hasError: false,
1782
+ lastResetKey: props.resetKey
1783
+ };
1784
+ }
1785
+ static getDerivedStateFromError(error) {
1786
+ return { error, hasError: true };
1787
+ }
1788
+ static getDerivedStateFromProps(props, state) {
1789
+ if (props.resetKey !== state.lastResetKey) {
1790
+ return {
1791
+ error: null,
1792
+ errorInfo: null,
1793
+ hasError: false,
1794
+ lastResetKey: props.resetKey
1795
+ };
1796
+ }
1797
+ return null;
1798
+ }
1799
+ componentDidCatch(error, errorInfo) {
1800
+ this.setState({ errorInfo });
1801
+ const { message, name, onError, silent, title, variant } = this.props;
1802
+ const context = createErrorContext({ errorInfo, name, title, variant });
1803
+ try {
1804
+ onError?.(error, errorInfo, context);
1805
+ } catch (callbackError) {
1806
+ report("ErrorBoundary onError callback", callbackError, "warn");
1807
+ }
1808
+ if (!silent) {
1809
+ globalEvents.emit(EVENT_TYPES.APP_ERROR, {
1810
+ error,
1811
+ errorInfo,
1812
+ message: message || toUserMessage(error),
1813
+ resetError: this.resetError
1814
+ });
1815
+ }
1816
+ try {
1817
+ const reporter = getErrorReporter();
1818
+ reporter?.captureError?.(error, context);
1819
+ } catch (reportingError) {
1820
+ report("ErrorBoundary reporting", reportingError, "warn");
1821
+ }
1822
+ }
1823
+ resetError = () => {
1824
+ this.setState({
1825
+ error: null,
1826
+ errorInfo: null,
1827
+ hasError: false
1828
+ });
1829
+ this.props.onReset?.();
1830
+ };
1831
+ render() {
1832
+ if (!this.state.hasError) return this.props.children;
1833
+ const { fallback, message, title } = this.props;
1834
+ const { error } = this.state;
1835
+ if (typeof fallback === "function") {
1836
+ return fallback({ error, resetError: this.resetError });
1837
+ }
1838
+ if (fallback) {
1839
+ return fallback;
1840
+ }
1841
+ return /* @__PURE__ */ jsx(
1842
+ DefaultErrorFallback,
1843
+ {
1844
+ error,
1845
+ message,
1846
+ resetError: this.resetError,
1847
+ title
1848
+ }
1849
+ );
1850
+ }
1851
+ };
1852
+ function GlobalError({ children, fallback, onReset }) {
1853
+ const pathname = usePathname();
1854
+ return /* @__PURE__ */ jsx(
1855
+ ErrorBoundaryCore,
1856
+ {
1857
+ fallback,
1858
+ message: ERROR_MESSAGES.GLOBAL_MSG,
1859
+ onReset,
1860
+ resetKey: pathname,
1861
+ title: ERROR_MESSAGES.GLOBAL_TITLE,
1862
+ variant: "full",
1863
+ children
1864
+ }
1865
+ );
1866
+ }
1867
+ function ModuleError({
1868
+ children,
1869
+ fallback,
1870
+ name,
1871
+ onReset
1872
+ }) {
1873
+ return /* @__PURE__ */ jsx(
1874
+ ErrorBoundaryCore,
1875
+ {
1876
+ fallback,
1877
+ message: ERROR_MESSAGES.MODULE_MSG,
1878
+ name,
1879
+ onReset,
1880
+ title: name ? `${name} Error` : ERROR_MESSAGES.MODULE_TITLE,
1881
+ variant: "module",
1882
+ children
1883
+ }
1884
+ );
1885
+ }
1886
+ function GlobalErrorListener() {
1887
+ const lastError = useRef(0);
1888
+ const count = useRef(0);
1889
+ const shown = useRef(/* @__PURE__ */ new Set());
1890
+ const handleError = useCallback((error, source = "runtime") => {
1891
+ if (shouldIgnoreError(error)) return;
1892
+ const now = Date.now();
1893
+ if (count.current >= ERROR_LISTENER_CONFIG.maxErrors) return;
1894
+ if (now - lastError.current < ERROR_LISTENER_CONFIG.throttle) return;
1895
+ const message = getErrorMessage(error);
1896
+ const key = message || String(error);
1897
+ if (shown.current.has(key)) return;
1898
+ shown.current.add(key);
1899
+ lastError.current = now;
1900
+ count.current += 1;
1901
+ try {
1902
+ const reporter = getErrorReporter();
1903
+ reporter?.captureError?.(error, {
1904
+ globalListener: true,
1905
+ source
1906
+ });
1907
+ } catch (reportingError) {
1908
+ report("GlobalError reporting", reportingError, "warn");
1909
+ }
1910
+ globalEvents.emit(EVENT_TYPES.APP_ERROR, {
1911
+ error,
1912
+ message: toUserMessage(error)
1913
+ });
1914
+ }, []);
1915
+ useEffect(() => {
1916
+ const removeSink = setReportSink((scope, error, level) => {
1917
+ try {
1918
+ getErrorReporter().captureError(error, { level, scope });
1919
+ } catch {
1920
+ }
1921
+ });
1922
+ const onError = (event) => handleError(event.error || event.message, "window.onerror");
1923
+ const onRejection = (event) => handleError(event.reason, "unhandledrejection");
1924
+ window.addEventListener("error", onError);
1925
+ window.addEventListener("unhandledrejection", onRejection);
1926
+ return () => {
1927
+ removeSink();
1928
+ window.removeEventListener("error", onError);
1929
+ window.removeEventListener("unhandledrejection", onRejection);
1930
+ };
1931
+ }, [handleError]);
1932
+ return null;
1933
+ }
1936
1934
  function CoreProvider({
1937
1935
  children,
1938
1936
  modules,