@omnitron-dev/prism 0.3.1 → 0.3.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 (305) hide show
  1. package/README.md +68 -2
  2. package/THIRD-PARTY-NOTICES.txt +26 -0
  3. package/dist/accessibility/index.js +2 -0
  4. package/dist/accessibility/index.js.map +1 -1
  5. package/dist/auth/index.d.ts +4 -0
  6. package/dist/auth/index.d.ts.map +1 -0
  7. package/dist/auth/index.js +4 -0
  8. package/dist/auth/index.js.map +1 -0
  9. package/dist/blocks/auth-block/guards.d.ts +3 -2
  10. package/dist/blocks/auth-block/guards.d.ts.map +1 -1
  11. package/dist/blocks/dashboard-block/dashboard-block.d.ts.map +1 -1
  12. package/dist/blocks/dashboard-block/types.d.ts +4 -2
  13. package/dist/blocks/dashboard-block/types.d.ts.map +1 -1
  14. package/dist/blocks/dashboard-block/use-dashboard-block.d.ts +2 -2
  15. package/dist/blocks/dashboard-block/use-dashboard-block.d.ts.map +1 -1
  16. package/dist/blocks/data-grid-block/data-grid-block.d.ts.map +1 -1
  17. package/dist/blocks/data-grid-block/types.d.ts +3 -0
  18. package/dist/blocks/data-grid-block/types.d.ts.map +1 -1
  19. package/dist/blocks/index.js +80 -255
  20. package/dist/blocks/index.js.map +1 -1
  21. package/dist/chunk-2AB7VGPW.js +447 -0
  22. package/dist/chunk-2AB7VGPW.js.map +1 -0
  23. package/dist/{chunk-LOY2NPCO.js → chunk-2E67PQ4T.js} +3 -3
  24. package/dist/{chunk-LOY2NPCO.js.map → chunk-2E67PQ4T.js.map} +1 -1
  25. package/dist/chunk-2KG2NI73.js +84 -0
  26. package/dist/chunk-2KG2NI73.js.map +1 -0
  27. package/dist/chunk-2UYRW6X3.js +44 -0
  28. package/dist/chunk-2UYRW6X3.js.map +1 -0
  29. package/dist/chunk-36C5H56C.js +208 -0
  30. package/dist/chunk-36C5H56C.js.map +1 -0
  31. package/dist/chunk-36FOXX25.js +73 -0
  32. package/dist/chunk-36FOXX25.js.map +1 -0
  33. package/dist/{chunk-52PQL67Q.js → chunk-3VSM7NZG.js} +18 -15
  34. package/dist/chunk-3VSM7NZG.js.map +1 -0
  35. package/dist/{chunk-GUGTDURV.js → chunk-4B2LTPK2.js} +2 -2
  36. package/dist/{chunk-GUGTDURV.js.map → chunk-4B2LTPK2.js.map} +1 -1
  37. package/dist/chunk-4HUGZJKU.js +108 -0
  38. package/dist/chunk-4HUGZJKU.js.map +1 -0
  39. package/dist/{chunk-PXXPLHIY.js → chunk-4Q5L7LDG.js} +3 -3
  40. package/dist/{chunk-PXXPLHIY.js.map → chunk-4Q5L7LDG.js.map} +1 -1
  41. package/dist/{chunk-BRDWQVRT.js → chunk-4R7EZ7GQ.js} +3 -2
  42. package/dist/chunk-4R7EZ7GQ.js.map +1 -0
  43. package/dist/chunk-6IANOSMD.js +185 -0
  44. package/dist/chunk-6IANOSMD.js.map +1 -0
  45. package/dist/{chunk-YHE7HXSG.js → chunk-7ATBURW2.js} +3 -3
  46. package/dist/{chunk-YHE7HXSG.js.map → chunk-7ATBURW2.js.map} +1 -1
  47. package/dist/{chunk-7G5D5PTC.js → chunk-AATAOOSF.js} +4 -4
  48. package/dist/{chunk-7G5D5PTC.js.map → chunk-AATAOOSF.js.map} +1 -1
  49. package/dist/chunk-AKLRKCYH.js +128 -0
  50. package/dist/chunk-AKLRKCYH.js.map +1 -0
  51. package/dist/chunk-CT46KJOR.js +133 -0
  52. package/dist/chunk-CT46KJOR.js.map +1 -0
  53. package/dist/{chunk-LSPFFEJT.js → chunk-D4GFAJAZ.js} +298 -3900
  54. package/dist/chunk-D4GFAJAZ.js.map +1 -0
  55. package/dist/{chunk-BJE2AKD4.js → chunk-D5J3KW6Q.js} +3 -2
  56. package/dist/chunk-D5J3KW6Q.js.map +1 -0
  57. package/dist/chunk-DEPJRTVT.js +3 -0
  58. package/dist/{chunk-FU52GL2E.js.map → chunk-DEPJRTVT.js.map} +1 -1
  59. package/dist/{chunk-472SOF76.js → chunk-DHTYHUYI.js} +85 -107
  60. package/dist/chunk-DHTYHUYI.js.map +1 -0
  61. package/dist/{chunk-FF5RF32O.js → chunk-E7WM2RXA.js} +3 -2
  62. package/dist/chunk-E7WM2RXA.js.map +1 -0
  63. package/dist/chunk-F6RZ7LW6.js +1271 -0
  64. package/dist/chunk-F6RZ7LW6.js.map +1 -0
  65. package/dist/chunk-FOGY3HA4.js +217 -0
  66. package/dist/chunk-FOGY3HA4.js.map +1 -0
  67. package/dist/chunk-G2GANYMW.js +139 -0
  68. package/dist/chunk-G2GANYMW.js.map +1 -0
  69. package/dist/chunk-I6DILPFE.js +293 -0
  70. package/dist/chunk-I6DILPFE.js.map +1 -0
  71. package/dist/{chunk-HOXFSQUV.js → chunk-IRYU3NTG.js} +2 -2
  72. package/dist/{chunk-HOXFSQUV.js.map → chunk-IRYU3NTG.js.map} +1 -1
  73. package/dist/chunk-JTIUGPW5.js +284 -0
  74. package/dist/chunk-JTIUGPW5.js.map +1 -0
  75. package/dist/{chunk-GUFHFEPZ.js → chunk-JZBSPDED.js} +2 -2
  76. package/dist/{chunk-GUFHFEPZ.js.map → chunk-JZBSPDED.js.map} +1 -1
  77. package/dist/{chunk-PFT2BNYO.js → chunk-KPY7TA4D.js} +5 -5
  78. package/dist/{chunk-PFT2BNYO.js.map → chunk-KPY7TA4D.js.map} +1 -1
  79. package/dist/{chunk-GMIE6III.js → chunk-LFWKGNCX.js} +50 -623
  80. package/dist/chunk-LFWKGNCX.js.map +1 -0
  81. package/dist/chunk-LH4ZZZYB.js +37 -0
  82. package/dist/chunk-LH4ZZZYB.js.map +1 -0
  83. package/dist/chunk-NFJ7CPG3.js +13 -0
  84. package/dist/chunk-NFJ7CPG3.js.map +1 -0
  85. package/dist/chunk-NFPOIHD4.js +3 -0
  86. package/dist/{chunk-JSQTYDPG.js.map → chunk-NFPOIHD4.js.map} +1 -1
  87. package/dist/{chunk-XIXSSI3B.js → chunk-NJM5AVBM.js} +3 -2
  88. package/dist/chunk-NJM5AVBM.js.map +1 -0
  89. package/dist/{chunk-4Z5DE5GK.js → chunk-NSNM53WI.js} +133 -115
  90. package/dist/chunk-NSNM53WI.js.map +1 -0
  91. package/dist/chunk-NTREGTG7.js +31 -0
  92. package/dist/chunk-NTREGTG7.js.map +1 -0
  93. package/dist/{chunk-ADG4HZEP.js → chunk-OKJA6SJM.js} +4 -4
  94. package/dist/chunk-OKJA6SJM.js.map +1 -0
  95. package/dist/{chunk-SU3LVQ7N.js → chunk-Q6JDNFSG.js} +11 -226
  96. package/dist/chunk-Q6JDNFSG.js.map +1 -0
  97. package/dist/chunk-RPOGINR5.js +115 -0
  98. package/dist/chunk-RPOGINR5.js.map +1 -0
  99. package/dist/{chunk-KQ67XB6T.js → chunk-RSWVYIXK.js} +151 -114
  100. package/dist/chunk-RSWVYIXK.js.map +1 -0
  101. package/dist/chunk-SSEHL5VP.js +110 -0
  102. package/dist/chunk-SSEHL5VP.js.map +1 -0
  103. package/dist/chunk-TEIGUOWN.js +523 -0
  104. package/dist/chunk-TEIGUOWN.js.map +1 -0
  105. package/dist/{chunk-AYYFMTMI.js → chunk-TJ7DHXUX.js} +2 -2
  106. package/dist/{chunk-AYYFMTMI.js.map → chunk-TJ7DHXUX.js.map} +1 -1
  107. package/dist/{chunk-75FQ5IW3.js → chunk-TZHWYT34.js} +3 -3
  108. package/dist/{chunk-75FQ5IW3.js.map → chunk-TZHWYT34.js.map} +1 -1
  109. package/dist/chunk-TZWHELY4.js +45 -0
  110. package/dist/chunk-TZWHELY4.js.map +1 -0
  111. package/dist/{chunk-OKTLA23Q.js → chunk-UEINJFLS.js} +6 -6
  112. package/dist/chunk-UEINJFLS.js.map +1 -0
  113. package/dist/chunk-URFQX3I6.js +129 -0
  114. package/dist/chunk-URFQX3I6.js.map +1 -0
  115. package/dist/chunk-VG6FOMOH.js +187 -0
  116. package/dist/chunk-VG6FOMOH.js.map +1 -0
  117. package/dist/{chunk-PGHEP4JD.js → chunk-VQVVHMPG.js} +3 -3
  118. package/dist/{chunk-PGHEP4JD.js.map → chunk-VQVVHMPG.js.map} +1 -1
  119. package/dist/{chunk-DRFNMZLG.js → chunk-VUKOT432.js} +3 -2
  120. package/dist/chunk-VUKOT432.js.map +1 -0
  121. package/dist/chunk-WD4N72DL.js +315 -0
  122. package/dist/chunk-WD4N72DL.js.map +1 -0
  123. package/dist/chunk-XBYMG4QK.js +119 -0
  124. package/dist/chunk-XBYMG4QK.js.map +1 -0
  125. package/dist/chunk-YHM6GIHV.js +3 -0
  126. package/dist/chunk-YHM6GIHV.js.map +1 -0
  127. package/dist/{chunk-SNZK5X6F.js → chunk-Z2AN43YU.js} +4 -2
  128. package/dist/chunk-Z2AN43YU.js.map +1 -0
  129. package/dist/chunk-ZNWHMQRM.js +171 -0
  130. package/dist/chunk-ZNWHMQRM.js.map +1 -0
  131. package/dist/{chunk-YSIG2XYH.js → chunk-ZRJYQN6Y.js} +2 -2
  132. package/dist/{chunk-YSIG2XYH.js.map → chunk-ZRJYQN6Y.js.map} +1 -1
  133. package/dist/{chunk-AD4W7HYC.js → chunk-ZYI3MHLE.js} +3 -2
  134. package/dist/chunk-ZYI3MHLE.js.map +1 -0
  135. package/dist/cli/index.js +59 -421
  136. package/dist/cli/index.js.map +1 -1
  137. package/dist/components/admin-filters/admin-data-table.d.ts +7 -1
  138. package/dist/components/admin-filters/admin-data-table.d.ts.map +1 -1
  139. package/dist/components/admin-filters/filter-toolbar.d.ts.map +1 -1
  140. package/dist/components/admin-filters/index.js +8 -0
  141. package/dist/components/admin-filters/index.js.map +1 -0
  142. package/dist/components/alert/alert.d.ts.map +1 -1
  143. package/dist/components/alert/index.js +5 -0
  144. package/dist/components/alert/index.js.map +1 -0
  145. package/dist/components/animate/index.js +5 -0
  146. package/dist/components/animate/index.js.map +1 -0
  147. package/dist/components/breadcrumbs/breadcrumbs.d.ts.map +1 -1
  148. package/dist/components/breadcrumbs/index.js +4 -0
  149. package/dist/components/breadcrumbs/index.js.map +1 -0
  150. package/dist/components/card/index.js +4 -0
  151. package/dist/components/card/index.js.map +1 -0
  152. package/dist/components/chart/chart.d.ts.map +1 -1
  153. package/dist/components/chart/index.css +52 -0
  154. package/dist/components/chart/index.css.map +1 -0
  155. package/dist/components/chart/index.js +5 -0
  156. package/dist/components/chart/index.js.map +1 -0
  157. package/dist/components/chart/types.d.ts +3 -1
  158. package/dist/components/chart/types.d.ts.map +1 -1
  159. package/dist/components/chart/use-chart.d.ts.map +1 -1
  160. package/dist/components/command-palette/command-palette.d.ts +3 -1
  161. package/dist/components/command-palette/command-palette.d.ts.map +1 -1
  162. package/dist/components/command-palette/index.js +4 -0
  163. package/dist/components/command-palette/index.js.map +1 -0
  164. package/dist/components/confirm-dialog/index.js +4 -0
  165. package/dist/components/confirm-dialog/index.js.map +1 -0
  166. package/dist/components/date-input/date-input.d.ts +1 -0
  167. package/dist/components/date-input/date-input.d.ts.map +1 -1
  168. package/dist/components/date-input/index.d.ts +0 -1
  169. package/dist/components/date-input/index.d.ts.map +1 -1
  170. package/dist/components/doc-layout/index.js +5 -4
  171. package/dist/components/doc-layout/index.js.map +1 -1
  172. package/dist/components/editor/index.js +4 -3
  173. package/dist/components/editor/index.js.map +1 -1
  174. package/dist/components/emoji-picker/index.js +2 -1
  175. package/dist/components/emoji-picker/index.js.map +1 -1
  176. package/dist/components/empty-content/empty-content.d.ts.map +1 -1
  177. package/dist/components/empty-content/index.js +4 -0
  178. package/dist/components/empty-content/index.js.map +1 -0
  179. package/dist/components/error-boundary/index.js +6 -0
  180. package/dist/components/error-boundary/index.js.map +1 -0
  181. package/dist/components/index.css +13 -10
  182. package/dist/components/index.css.map +1 -1
  183. package/dist/components/index.d.ts +1 -0
  184. package/dist/components/index.d.ts.map +1 -1
  185. package/dist/components/index.js +47 -21
  186. package/dist/components/index.js.map +1 -1
  187. package/dist/components/knowledge-graph/edge-labels.d.ts.map +1 -1
  188. package/dist/components/knowledge-graph/index.js +18 -16
  189. package/dist/components/knowledge-graph/index.js.map +1 -1
  190. package/dist/components/label/index.js +5 -0
  191. package/dist/components/label/index.js.map +1 -0
  192. package/dist/components/label/label.d.ts.map +1 -1
  193. package/dist/components/loading-screen/index.js +4 -0
  194. package/dist/components/loading-screen/index.js.map +1 -0
  195. package/dist/components/map/MapPointPicker.d.ts.map +1 -1
  196. package/dist/components/map/index.js +2 -1
  197. package/dist/components/map/index.js.map +1 -1
  198. package/dist/components/navigation-progress/index.js +4 -0
  199. package/dist/components/navigation-progress/index.js.map +1 -0
  200. package/dist/components/page-content/index.js +4 -0
  201. package/dist/components/page-content/index.js.map +1 -0
  202. package/dist/components/popover/index.js +4 -0
  203. package/dist/components/popover/index.js.map +1 -0
  204. package/dist/components/research/diagram.d.ts.map +1 -1
  205. package/dist/components/research/index.js +6 -4
  206. package/dist/components/research/index.js.map +1 -1
  207. package/dist/components/research-editor/extensions.d.ts +1 -1
  208. package/dist/components/research-editor/index.js +11 -10
  209. package/dist/components/research-editor/index.js.map +1 -1
  210. package/dist/components/research-editor/math-navigation.d.ts +2 -2
  211. package/dist/components/research-editor/math-navigation.d.ts.map +1 -1
  212. package/dist/components/scroll-to-top/index.js +4 -0
  213. package/dist/components/scroll-to-top/index.js.map +1 -0
  214. package/dist/components/search-input/index.js +7 -0
  215. package/dist/components/search-input/index.js.map +1 -0
  216. package/dist/components/search-input/search-input.d.ts +3 -1
  217. package/dist/components/search-input/search-input.d.ts.map +1 -1
  218. package/dist/components/skeleton/index.js +4 -0
  219. package/dist/components/skeleton/index.js.map +1 -0
  220. package/dist/components/snackbar/index.js +6 -0
  221. package/dist/components/snackbar/index.js.map +1 -0
  222. package/dist/components/stepper/index.js +4 -0
  223. package/dist/components/stepper/index.js.map +1 -0
  224. package/dist/components/table/index.d.ts +1 -0
  225. package/dist/components/table/index.d.ts.map +1 -1
  226. package/dist/components/table/index.js +5 -0
  227. package/dist/components/table/index.js.map +1 -0
  228. package/dist/components/table/table-viewport.d.ts +13 -0
  229. package/dist/components/table/table-viewport.d.ts.map +1 -0
  230. package/dist/components/table/table.d.ts +3 -1
  231. package/dist/components/table/table.d.ts.map +1 -1
  232. package/dist/components/tabs/index.js +6 -0
  233. package/dist/components/tabs/index.js.map +1 -0
  234. package/dist/components/tabs/tabs.d.ts +12 -1
  235. package/dist/components/tabs/tabs.d.ts.map +1 -1
  236. package/dist/core/index.js +12 -10
  237. package/dist/core/index.js.map +1 -1
  238. package/dist/forms/index.js +2 -0
  239. package/dist/forms/index.js.map +1 -1
  240. package/dist/hooks/index.js +14 -12
  241. package/dist/hooks/index.js.map +1 -1
  242. package/dist/hooks/use-config-from-query.d.ts +2 -0
  243. package/dist/hooks/use-config-from-query.d.ts.map +1 -1
  244. package/dist/hooks/use-image-dimensions.d.ts.map +1 -1
  245. package/dist/hooks/use-keyboard-shortcut.d.ts.map +1 -1
  246. package/dist/hooks/use-scroll-position.d.ts.map +1 -1
  247. package/dist/hooks/use-window-size.d.ts.map +1 -1
  248. package/dist/icons/context.d.ts.map +1 -1
  249. package/dist/icons/index.js +3 -2
  250. package/dist/icons/index.js.map +1 -1
  251. package/dist/index.css +13 -10
  252. package/dist/index.css.map +1 -1
  253. package/dist/index.js +57 -31
  254. package/dist/index.js.map +1 -1
  255. package/dist/internal/research-parser.js +3 -0
  256. package/dist/internal/research-parser.js.map +1 -0
  257. package/dist/layouts/core/header-section.d.ts +1 -0
  258. package/dist/layouts/core/header-section.d.ts.map +1 -1
  259. package/dist/layouts/dashboard/layout.d.ts +3 -1
  260. package/dist/layouts/dashboard/layout.d.ts.map +1 -1
  261. package/dist/layouts/dashboard/sidenav.d.ts.map +1 -1
  262. package/dist/layouts/index.js +9 -8
  263. package/dist/layouts/index.js.map +1 -1
  264. package/dist/netron/index.js +2 -1
  265. package/dist/netron/index.js.map +1 -1
  266. package/dist/registry/index.js +1 -1
  267. package/dist/state/create-store.d.ts.map +1 -1
  268. package/dist/state/index.js +3 -2
  269. package/dist/state/index.js.map +1 -1
  270. package/dist/state/settings-version.d.ts.map +1 -1
  271. package/dist/theme/components/Chip.d.ts.map +1 -1
  272. package/dist/theme/components/Dialog.d.ts.map +1 -1
  273. package/dist/theme/components/TextField.d.ts.map +1 -1
  274. package/dist/theme/components/index.d.ts.map +1 -1
  275. package/dist/theme/components/theme-utils.d.ts +2 -2
  276. package/dist/theme/components/theme-utils.d.ts.map +1 -1
  277. package/dist/theme/index.js +8 -6
  278. package/dist/theme/index.js.map +1 -1
  279. package/dist/theme/palette/overrides.d.ts +1 -0
  280. package/dist/theme/palette/overrides.d.ts.map +1 -1
  281. package/dist/theme/semantic-surface.d.ts +8 -0
  282. package/dist/theme/semantic-surface.d.ts.map +1 -0
  283. package/dist/types/index.js +2 -2
  284. package/dist/ui/index.js +6 -5
  285. package/dist/ui/index.js.map +1 -1
  286. package/dist/utils/async-lock.d.ts.map +1 -1
  287. package/package.json +143 -37
  288. package/dist/chunk-472SOF76.js.map +0 -1
  289. package/dist/chunk-4Z5DE5GK.js.map +0 -1
  290. package/dist/chunk-52PQL67Q.js.map +0 -1
  291. package/dist/chunk-AD4W7HYC.js.map +0 -1
  292. package/dist/chunk-ADG4HZEP.js.map +0 -1
  293. package/dist/chunk-BJE2AKD4.js.map +0 -1
  294. package/dist/chunk-BRDWQVRT.js.map +0 -1
  295. package/dist/chunk-DRFNMZLG.js.map +0 -1
  296. package/dist/chunk-FF5RF32O.js.map +0 -1
  297. package/dist/chunk-FU52GL2E.js +0 -3
  298. package/dist/chunk-GMIE6III.js.map +0 -1
  299. package/dist/chunk-JSQTYDPG.js +0 -3
  300. package/dist/chunk-KQ67XB6T.js.map +0 -1
  301. package/dist/chunk-LSPFFEJT.js.map +0 -1
  302. package/dist/chunk-OKTLA23Q.js.map +0 -1
  303. package/dist/chunk-SNZK5X6F.js.map +0 -1
  304. package/dist/chunk-SU3LVQ7N.js.map +0 -1
  305. package/dist/chunk-XIXSSI3B.js.map +0 -1
@@ -0,0 +1,139 @@
1
+ import { CloseIcon } from './chunk-VQVVHMPG.js';
2
+ import { createContext, useContext, useState, useCallback, useMemo } from 'react';
3
+ import Snackbar from '@mui/material/Snackbar';
4
+ import Alert from '@mui/material/Alert';
5
+ import IconButton from '@mui/material/IconButton';
6
+ import { jsxs, jsx } from 'react/jsx-runtime';
7
+
8
+ var SnackbarContext = createContext(null);
9
+ function useSnackbar() {
10
+ const context = useContext(SnackbarContext);
11
+ if (!context) {
12
+ throw new Error("useSnackbar must be used within a SnackbarProvider");
13
+ }
14
+ return context;
15
+ }
16
+ var defaultState = {
17
+ open: false,
18
+ message: "",
19
+ severity: "info",
20
+ duration: 5e3,
21
+ position: { vertical: "bottom", horizontal: "left" },
22
+ key: 0
23
+ };
24
+ function SnackbarProvider({
25
+ children,
26
+ defaultDuration = 5e3,
27
+ defaultPosition = { vertical: "bottom", horizontal: "left" },
28
+ sx
29
+ }) {
30
+ const [state, setState] = useState({
31
+ ...defaultState,
32
+ duration: defaultDuration,
33
+ position: defaultPosition
34
+ });
35
+ const show = useCallback(
36
+ (options) => {
37
+ const opts = typeof options === "string" ? { message: options } : options;
38
+ setState((prev) => ({
39
+ open: true,
40
+ message: opts.message,
41
+ severity: opts.severity ?? "info",
42
+ duration: opts.duration ?? defaultDuration,
43
+ position: opts.position ?? defaultPosition,
44
+ action: opts.action,
45
+ key: opts.key ?? Date.now()
46
+ }));
47
+ },
48
+ [defaultDuration, defaultPosition]
49
+ );
50
+ const success = useCallback(
51
+ (message, options) => {
52
+ show({ message, severity: "success", ...options });
53
+ },
54
+ [show]
55
+ );
56
+ const error = useCallback(
57
+ (message, options) => {
58
+ show({ message, severity: "error", ...options });
59
+ },
60
+ [show]
61
+ );
62
+ const warning = useCallback(
63
+ (message, options) => {
64
+ show({ message, severity: "warning", ...options });
65
+ },
66
+ [show]
67
+ );
68
+ const info = useCallback(
69
+ (message, options) => {
70
+ show({ message, severity: "info", ...options });
71
+ },
72
+ [show]
73
+ );
74
+ const close = useCallback(() => {
75
+ setState((prev) => ({ ...prev, open: false }));
76
+ }, []);
77
+ const handleClose = useCallback(
78
+ (_event, reason) => {
79
+ if (reason === "clickaway") return;
80
+ close();
81
+ },
82
+ [close]
83
+ );
84
+ const value = useMemo(
85
+ () => ({
86
+ show,
87
+ success,
88
+ error,
89
+ warning,
90
+ info,
91
+ close
92
+ }),
93
+ [show, success, error, warning, info, close]
94
+ );
95
+ return /* @__PURE__ */ jsxs(SnackbarContext.Provider, { value, children: [
96
+ children,
97
+ /* @__PURE__ */ jsx(
98
+ Snackbar,
99
+ {
100
+ open: state.open,
101
+ autoHideDuration: state.duration,
102
+ onClose: handleClose,
103
+ anchorOrigin: state.position,
104
+ sx,
105
+ children: /* @__PURE__ */ jsx(
106
+ Alert,
107
+ {
108
+ severity: state.severity,
109
+ variant: "filled",
110
+ onClose: handleClose,
111
+ action: state.action || /* @__PURE__ */ jsx(IconButton, { size: "small", "aria-label": "close", color: "inherit", onClick: close, children: /* @__PURE__ */ jsx(CloseIcon, { fontSize: "small" }) }),
112
+ sx: { width: "100%", alignItems: "center" },
113
+ children: state.message
114
+ }
115
+ )
116
+ },
117
+ state.key
118
+ )
119
+ ] });
120
+ }
121
+ function SimpleSnackbar({
122
+ open,
123
+ onClose,
124
+ message,
125
+ severity = "info",
126
+ duration = 5e3,
127
+ position = { vertical: "bottom", horizontal: "left" },
128
+ sx
129
+ }) {
130
+ const handleClose = (_event, reason) => {
131
+ if (reason === "clickaway") return;
132
+ onClose();
133
+ };
134
+ return /* @__PURE__ */ jsx(Snackbar, { open, autoHideDuration: duration, onClose: handleClose, anchorOrigin: position, sx, children: /* @__PURE__ */ jsx(Alert, { severity, variant: "filled", onClose: handleClose, sx: { width: "100%" }, children: message }) });
135
+ }
136
+
137
+ export { SimpleSnackbar, SnackbarProvider, useSnackbar };
138
+ //# sourceMappingURL=chunk-G2GANYMW.js.map
139
+ //# sourceMappingURL=chunk-G2GANYMW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/snackbar/snackbar.tsx"],"names":[],"mappings":"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","file":"chunk-G2GANYMW.js","sourcesContent":["'use client';\n\n/**\n * Snackbar Component\n *\n * Enhanced snackbar with context-based API for easy notifications.\n *\n * @module components/snackbar\n */\n\nimport type { ReactNode } from 'react';\nimport { createContext, useContext, useState, useCallback, useMemo } from 'react';\nimport Snackbar from '@mui/material/Snackbar';\nimport Alert from '@mui/material/Alert';\nimport IconButton from '@mui/material/IconButton';\nimport { CloseIcon } from '../../icons/controls.js';\nimport type { AlertColor } from '@mui/material/Alert';\nimport type { SnackbarOrigin } from '@mui/material/Snackbar';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface SnackbarOptions {\n /** Message to display */\n message: string;\n /** Severity/type of the snackbar */\n severity?: AlertColor;\n /** Auto-hide duration in milliseconds */\n duration?: number;\n /** Position on screen */\n position?: SnackbarOrigin;\n /** Action button */\n action?: ReactNode;\n /** Unique key for the snackbar */\n key?: string | number;\n}\n\nexport interface SnackbarContextValue {\n /** Show a snackbar notification */\n show: (options: SnackbarOptions | string) => void;\n /** Show a success notification */\n success: (message: string, options?: Partial<SnackbarOptions>) => void;\n /** Show an error notification */\n error: (message: string, options?: Partial<SnackbarOptions>) => void;\n /** Show a warning notification */\n warning: (message: string, options?: Partial<SnackbarOptions>) => void;\n /** Show an info notification */\n info: (message: string, options?: Partial<SnackbarOptions>) => void;\n /** Close the current snackbar */\n close: () => void;\n}\n\nexport interface SnackbarProviderProps {\n /** Children to wrap */\n children: ReactNode;\n /** Default auto-hide duration */\n defaultDuration?: number;\n /** Default position */\n defaultPosition?: SnackbarOrigin;\n /** Maximum number of snackbars to show */\n maxSnackbars?: number;\n /** Additional styles */\n sx?: SxProps<Theme>;\n}\n\n// =============================================================================\n// CONTEXT\n// =============================================================================\n\nconst SnackbarContext = createContext<SnackbarContextValue | null>(null);\n\n// =============================================================================\n// HOOK\n// =============================================================================\n\n/**\n * useSnackbar - Hook for showing snackbar notifications.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const snackbar = useSnackbar();\n *\n * const handleSave = async () => {\n * try {\n * await saveData();\n * snackbar.success('Data saved successfully!');\n * } catch (err) {\n * snackbar.error('Failed to save data');\n * }\n * };\n * }\n * ```\n */\nexport function useSnackbar(): SnackbarContextValue {\n const context = useContext(SnackbarContext);\n\n if (!context) {\n throw new Error('useSnackbar must be used within a SnackbarProvider');\n }\n\n return context;\n}\n\n// =============================================================================\n// PROVIDER\n// =============================================================================\n\ninterface SnackbarState {\n open: boolean;\n message: string;\n severity: AlertColor;\n duration: number;\n position: SnackbarOrigin;\n action?: ReactNode;\n key: string | number;\n}\n\nconst defaultState: SnackbarState = {\n open: false,\n message: '',\n severity: 'info',\n duration: 5000,\n position: { vertical: 'bottom', horizontal: 'left' },\n key: 0,\n};\n\n/**\n * SnackbarProvider - Provider for snackbar notifications.\n *\n * @example\n * ```tsx\n * // Wrap your app with the provider\n * function App() {\n * return (\n * <SnackbarProvider>\n * <MyApp />\n * </SnackbarProvider>\n * );\n * }\n * ```\n */\nexport function SnackbarProvider({\n children,\n defaultDuration = 5000,\n defaultPosition = { vertical: 'bottom', horizontal: 'left' },\n sx,\n}: SnackbarProviderProps): ReactNode {\n const [state, setState] = useState<SnackbarState>({\n ...defaultState,\n duration: defaultDuration,\n position: defaultPosition,\n });\n\n const show = useCallback(\n (options: SnackbarOptions | string) => {\n const opts = typeof options === 'string' ? { message: options } : options;\n\n setState((prev) => ({\n open: true,\n message: opts.message,\n severity: opts.severity ?? 'info',\n duration: opts.duration ?? defaultDuration,\n position: opts.position ?? defaultPosition,\n action: opts.action,\n key: opts.key ?? Date.now(),\n }));\n },\n [defaultDuration, defaultPosition]\n );\n\n const success = useCallback(\n (message: string, options?: Partial<SnackbarOptions>) => {\n show({ message, severity: 'success', ...options });\n },\n [show]\n );\n\n const error = useCallback(\n (message: string, options?: Partial<SnackbarOptions>) => {\n show({ message, severity: 'error', ...options });\n },\n [show]\n );\n\n const warning = useCallback(\n (message: string, options?: Partial<SnackbarOptions>) => {\n show({ message, severity: 'warning', ...options });\n },\n [show]\n );\n\n const info = useCallback(\n (message: string, options?: Partial<SnackbarOptions>) => {\n show({ message, severity: 'info', ...options });\n },\n [show]\n );\n\n const close = useCallback(() => {\n setState((prev) => ({ ...prev, open: false }));\n }, []);\n\n const handleClose = useCallback(\n (_event?: React.SyntheticEvent | Event | null, reason?: string) => {\n if (reason === 'clickaway') return;\n close();\n },\n [close]\n );\n\n const value = useMemo<SnackbarContextValue>(\n () => ({\n show,\n success,\n error,\n warning,\n info,\n close,\n }),\n [show, success, error, warning, info, close]\n );\n\n return (\n <SnackbarContext.Provider value={value}>\n {children}\n\n <Snackbar\n key={state.key}\n open={state.open}\n autoHideDuration={state.duration}\n onClose={handleClose}\n anchorOrigin={state.position}\n sx={sx}\n >\n <Alert\n severity={state.severity}\n variant=\"filled\"\n onClose={handleClose}\n action={\n state.action || (\n <IconButton size=\"small\" aria-label=\"close\" color=\"inherit\" onClick={close}>\n <CloseIcon fontSize=\"small\" />\n </IconButton>\n )\n }\n sx={{ width: '100%', alignItems: 'center' }}\n >\n {state.message}\n </Alert>\n </Snackbar>\n </SnackbarContext.Provider>\n );\n}\n\n// =============================================================================\n// STANDALONE SNACKBAR\n// =============================================================================\n\nexport interface SimpleSnackbarProps {\n /** Whether the snackbar is open */\n open: boolean;\n /** Close handler */\n onClose: () => void;\n /** Message to display */\n message: string;\n /** Severity/type */\n severity?: AlertColor;\n /** Auto-hide duration in milliseconds */\n duration?: number;\n /** Position on screen */\n position?: SnackbarOrigin;\n /** Additional styles */\n sx?: SxProps<Theme>;\n}\n\n/**\n * SimpleSnackbar - Standalone snackbar component (without context).\n *\n * @example\n * ```tsx\n * const [open, setOpen] = useState(false);\n *\n * <SimpleSnackbar\n * open={open}\n * onClose={() => setOpen(false)}\n * message=\"Changes saved!\"\n * severity=\"success\"\n * />\n * ```\n */\nexport function SimpleSnackbar({\n open,\n onClose,\n message,\n severity = 'info',\n duration = 5000,\n position = { vertical: 'bottom', horizontal: 'left' },\n sx,\n}: SimpleSnackbarProps): ReactNode {\n const handleClose = (_event?: React.SyntheticEvent | Event | null, reason?: string) => {\n if (reason === 'clickaway') return;\n onClose();\n };\n\n return (\n <Snackbar open={open} autoHideDuration={duration} onClose={handleClose} anchorOrigin={position} sx={sx}>\n <Alert severity={severity} variant=\"filled\" onClose={handleClose} sx={{ width: '100%' }}>\n {message}\n </Alert>\n </Snackbar>\n );\n}\n"]}
@@ -0,0 +1,293 @@
1
+ import { ChevronDownIcon, CopyIcon } from './chunk-VQVVHMPG.js';
2
+ import { Component, useState } from 'react';
3
+ import Box from '@mui/material/Box';
4
+ import Button from '@mui/material/Button';
5
+ import Typography from '@mui/material/Typography';
6
+ import Collapse from '@mui/material/Collapse';
7
+ import IconButton from '@mui/material/IconButton';
8
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
9
+
10
+ function parseStackFrame(line) {
11
+ const patterns = [
12
+ // Named function with file: at functionName (file:line:col)
13
+ // Also covers the bundler-rewritten form `(file?v=hash:line:col)`: the
14
+ // lazy `(.+?)` swallows the query string, which `cleanFilePath` strips.
15
+ /at\s+(?:async\s+)?([^\s(]+)\s+\((.+?):(\d+):(\d+)\)/,
16
+ // Anonymous at file: at file:line:col
17
+ /at\s+(.+?):(\d+):(\d+)/
18
+ ];
19
+ for (const pattern of patterns) {
20
+ const match = line.match(pattern);
21
+ if (match) {
22
+ const [, funcOrFile, file, lineStr, colStr] = match;
23
+ const hasFile = colStr !== void 0;
24
+ const functionName = hasFile ? funcOrFile : null;
25
+ const filePath = hasFile ? file : funcOrFile;
26
+ const lineNumber = parseInt(hasFile ? lineStr : file, 10);
27
+ const columnNumber = parseInt(hasFile ? colStr : lineStr, 10);
28
+ const isAppCode = !filePath.includes("node_modules") && filePath.includes("src/");
29
+ return {
30
+ functionName: functionName || null,
31
+ filePath: cleanFilePath(filePath),
32
+ lineNumber: isNaN(lineNumber) ? null : lineNumber,
33
+ columnNumber: isNaN(columnNumber) ? null : columnNumber,
34
+ isAppCode
35
+ };
36
+ }
37
+ }
38
+ return null;
39
+ }
40
+ function cleanFilePath(path) {
41
+ const cleaned = path.replace(/\?.*$/, "");
42
+ const srcIndex = cleaned.indexOf("/src/");
43
+ if (srcIndex !== -1) {
44
+ return cleaned.slice(srcIndex + 1);
45
+ }
46
+ const parts = cleaned.split("/");
47
+ if (parts.length > 3) {
48
+ return parts.slice(-3).join("/");
49
+ }
50
+ return cleaned;
51
+ }
52
+ function parseStackTrace(stack) {
53
+ if (!stack) {
54
+ return { primary: null, frames: [], raw: "" };
55
+ }
56
+ const lines = stack.split("\n");
57
+ const frames = [];
58
+ for (const line of lines) {
59
+ const frame = parseStackFrame(line.trim());
60
+ if (frame) {
61
+ frames.push(frame);
62
+ }
63
+ }
64
+ const primary = frames.find((f) => f.isAppCode) ?? frames[0] ?? null;
65
+ return { primary, frames, raw: stack };
66
+ }
67
+ function getErrorLocation(error) {
68
+ const parsed = parseStackTrace(error.stack);
69
+ const { primary } = parsed;
70
+ if (!primary) {
71
+ return "Unknown location";
72
+ }
73
+ const parts = [];
74
+ if (primary.functionName) {
75
+ parts.push(`in ${primary.functionName}`);
76
+ }
77
+ if (primary.filePath) {
78
+ const location = primary.lineNumber ? `${primary.filePath}:${primary.lineNumber}` : primary.filePath;
79
+ parts.push(`(${location})`);
80
+ }
81
+ return parts.join(" ") || "Unknown location";
82
+ }
83
+ function DefaultErrorFallback({
84
+ error,
85
+ parsedStack,
86
+ resetErrorBoundary,
87
+ sx,
88
+ showDetails
89
+ }) {
90
+ const [expanded, setExpanded] = useState(false);
91
+ const [copied, setCopied] = useState(false);
92
+ const shouldShowDetails = showDetails ?? (typeof process !== "undefined" && process.env.NODE_ENV === "development");
93
+ const handleCopyStack = async () => {
94
+ try {
95
+ const text = [
96
+ `Error: ${error.message}`,
97
+ `Location: ${getErrorLocation(error)}`,
98
+ "",
99
+ "Stack Trace:",
100
+ parsedStack.raw
101
+ ].join("\n");
102
+ await navigator.clipboard.writeText(text);
103
+ setCopied(true);
104
+ setTimeout(() => setCopied(false), 2e3);
105
+ } catch {
106
+ }
107
+ };
108
+ return /* @__PURE__ */ jsxs(
109
+ Box,
110
+ {
111
+ sx: {
112
+ display: "flex",
113
+ flexDirection: "column",
114
+ alignItems: "center",
115
+ justifyContent: "center",
116
+ minHeight: 200,
117
+ p: 3,
118
+ textAlign: "center",
119
+ ...sx
120
+ },
121
+ children: [
122
+ /* @__PURE__ */ jsx(Typography, { variant: "h6", color: "error", gutterBottom: true, children: "Something went wrong" }),
123
+ /* @__PURE__ */ jsx(
124
+ Typography,
125
+ {
126
+ variant: "body2",
127
+ sx: {
128
+ color: "text.secondary",
129
+ mb: 1,
130
+ maxWidth: 400
131
+ },
132
+ children: error.message || "An unexpected error occurred"
133
+ }
134
+ ),
135
+ shouldShowDetails && parsedStack.primary && /* @__PURE__ */ jsxs(
136
+ Typography,
137
+ {
138
+ variant: "caption",
139
+ sx: {
140
+ color: "text.secondary",
141
+ mb: 2,
142
+ fontFamily: "monospace"
143
+ },
144
+ children: [
145
+ parsedStack.primary.filePath,
146
+ parsedStack.primary.lineNumber && `:${parsedStack.primary.lineNumber}`,
147
+ parsedStack.primary.functionName && ` (${parsedStack.primary.functionName})`
148
+ ]
149
+ }
150
+ ),
151
+ /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", gap: 1, mb: 2 }, children: [
152
+ /* @__PURE__ */ jsx(Button, { variant: "outlined", onClick: resetErrorBoundary, children: "Try Again" }),
153
+ shouldShowDetails && /* @__PURE__ */ jsxs(Fragment, { children: [
154
+ /* @__PURE__ */ jsx(
155
+ IconButton,
156
+ {
157
+ size: "small",
158
+ onClick: () => setExpanded(!expanded),
159
+ "aria-label": expanded ? "Hide stack trace" : "Show stack trace",
160
+ "aria-expanded": expanded,
161
+ sx: {
162
+ transform: expanded ? "rotate(180deg)" : "rotate(0deg)",
163
+ transition: "transform 0.2s"
164
+ },
165
+ children: /* @__PURE__ */ jsx(ChevronDownIcon, {})
166
+ }
167
+ ),
168
+ /* @__PURE__ */ jsx(IconButton, { size: "small", onClick: handleCopyStack, title: "Copy error details", children: /* @__PURE__ */ jsx(CopyIcon, { fontSize: "small" }) }),
169
+ copied && /* @__PURE__ */ jsx(
170
+ Typography,
171
+ {
172
+ variant: "caption",
173
+ sx: {
174
+ color: "success.main",
175
+ alignSelf: "center"
176
+ },
177
+ children: "Copied!"
178
+ }
179
+ )
180
+ ] })
181
+ ] }),
182
+ shouldShowDetails && /* @__PURE__ */ jsx(Collapse, { in: expanded, children: /* @__PURE__ */ jsx(
183
+ Box,
184
+ {
185
+ sx: {
186
+ mt: 1,
187
+ p: 2,
188
+ // Theme-aware: `grey.100` is a light value in both modes,
189
+ // which put dark text on a near-white block in dark mode.
190
+ bgcolor: "action.hover",
191
+ borderRadius: 1,
192
+ maxWidth: 600,
193
+ maxHeight: 300,
194
+ overflow: "auto",
195
+ textAlign: "left"
196
+ },
197
+ children: /* @__PURE__ */ jsx(Typography, { variant: "caption", component: "pre", sx: { fontFamily: "monospace", m: 0 }, children: parsedStack.frames.map((frame, i) => /* @__PURE__ */ jsxs(
198
+ Box,
199
+ {
200
+ component: "span",
201
+ sx: {
202
+ display: "block",
203
+ color: frame.isAppCode ? "error.main" : "text.secondary",
204
+ fontWeight: frame.isAppCode ? 600 : 400
205
+ },
206
+ children: [
207
+ frame.functionName || "(anonymous)",
208
+ " at ",
209
+ frame.filePath || "unknown",
210
+ frame.lineNumber && `:${frame.lineNumber}`
211
+ ]
212
+ },
213
+ i
214
+ )) })
215
+ }
216
+ ) })
217
+ ]
218
+ }
219
+ );
220
+ }
221
+ var ErrorBoundary = class extends Component {
222
+ constructor(props) {
223
+ super(props);
224
+ this.state = {
225
+ hasError: false,
226
+ error: null,
227
+ errorInfo: null
228
+ };
229
+ }
230
+ static getDerivedStateFromError(error) {
231
+ return {
232
+ hasError: true,
233
+ error
234
+ };
235
+ }
236
+ componentDidCatch(error, errorInfo) {
237
+ const parsedStack = parseStackTrace(error.stack);
238
+ this.setState({ errorInfo });
239
+ this.props.onError?.(error, errorInfo, parsedStack);
240
+ }
241
+ componentDidUpdate(prevProps) {
242
+ const { resetKeys } = this.props;
243
+ const { hasError } = this.state;
244
+ if (hasError && resetKeys) {
245
+ const previous = prevProps.resetKeys;
246
+ const hasKeyChanged = previous === void 0 || previous.length !== resetKeys.length || resetKeys.some((key, index) => key !== previous[index]);
247
+ if (hasKeyChanged) {
248
+ this.resetErrorBoundary();
249
+ }
250
+ }
251
+ }
252
+ resetErrorBoundary = () => {
253
+ this.props.onReset?.();
254
+ this.setState({
255
+ hasError: false,
256
+ error: null,
257
+ errorInfo: null
258
+ });
259
+ };
260
+ render() {
261
+ const { hasError, error, errorInfo } = this.state;
262
+ const { children, fallback, sx, showDetails } = this.props;
263
+ if (hasError && error) {
264
+ const parsedStack = parseStackTrace(error.stack);
265
+ const fallbackProps = {
266
+ error,
267
+ errorInfo,
268
+ parsedStack,
269
+ resetErrorBoundary: this.resetErrorBoundary
270
+ };
271
+ if (typeof fallback === "function") {
272
+ return fallback(fallbackProps);
273
+ }
274
+ if (fallback) {
275
+ return fallback;
276
+ }
277
+ return /* @__PURE__ */ jsx(DefaultErrorFallback, { ...fallbackProps, sx, showDetails });
278
+ }
279
+ return children;
280
+ }
281
+ };
282
+ function useErrorBoundary() {
283
+ const [, setError] = useState(null);
284
+ return (error) => {
285
+ setError(() => {
286
+ throw error;
287
+ });
288
+ };
289
+ }
290
+
291
+ export { ErrorBoundary, getErrorLocation, parseStackTrace, useErrorBoundary };
292
+ //# sourceMappingURL=chunk-I6DILPFE.js.map
293
+ //# sourceMappingURL=chunk-I6DILPFE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/error-boundary/error-boundary.tsx"],"names":[],"mappings":"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","file":"chunk-I6DILPFE.js","sourcesContent":["'use client';\n\n/**\n * Error Boundary Component\n *\n * React error boundary for graceful error handling.\n * Includes stack trace parsing for improved debugging.\n *\n * @module components/error-boundary\n */\n\nimport { Component, useState, type ReactNode, type ErrorInfo } from 'react';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Typography from '@mui/material/Typography';\nimport Collapse from '@mui/material/Collapse';\nimport IconButton from '@mui/material/IconButton';\nimport { ChevronDownIcon as ExpandMoreIcon } from '../../icons/controls.js';\nimport { CopyIcon as ContentCopyIcon } from '../../icons/controls.js';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n// =============================================================================\n// STACK TRACE PARSING\n// =============================================================================\n\n/**\n * Parsed stack frame information.\n */\nexport interface StackFrame {\n /** Function or method name */\n functionName: string | null;\n /** Source file path */\n filePath: string | null;\n /** Line number in the file */\n lineNumber: number | null;\n /** Column number in the file */\n columnNumber: number | null;\n /** Whether this frame is from app code (src/) vs node_modules */\n isAppCode: boolean;\n}\n\n/**\n * Parsed stack trace result.\n */\nexport interface ParsedStackTrace {\n /** Primary error location (first app code frame) */\n primary: StackFrame | null;\n /** All parsed frames */\n frames: StackFrame[];\n /** Original stack trace string */\n raw: string;\n}\n\n/**\n * Parse a single stack frame line.\n *\n * @param line - Stack trace line\n * @returns Parsed stack frame or null if couldn't parse\n */\nfunction parseStackFrame(line: string): StackFrame | null {\n // Match patterns like:\n // \"at functionName (file.tsx:123:45)\"\n // \"at Object.functionName (file.tsx:123:45)\"\n // \"at file.tsx:123:45\"\n // \"at async functionName (file.tsx:123:45)\"\n const patterns = [\n // Named function with file: at functionName (file:line:col)\n // Also covers the bundler-rewritten form `(file?v=hash:line:col)`: the\n // lazy `(.+?)` swallows the query string, which `cleanFilePath` strips.\n /at\\s+(?:async\\s+)?([^\\s(]+)\\s+\\((.+?):(\\d+):(\\d+)\\)/,\n // Anonymous at file: at file:line:col\n /at\\s+(.+?):(\\d+):(\\d+)/,\n ];\n\n for (const pattern of patterns) {\n const match = line.match(pattern);\n if (match) {\n const [, funcOrFile, file, lineStr, colStr] = match;\n\n // Which shape matched is decided by the LAST capture, not the second:\n // the anonymous pattern has three groups, so its second group holds a\n // line number — a defined value — and testing `file !== undefined`\n // called every anonymous frame a named one. The result was a frame\n // whose every field was wrong: the path read as the function name, the\n // line number as the path, the column as the line. Minified production\n // stacks are anonymous almost throughout, so that was the normal case\n // in the build where this component matters most.\n const hasFile = colStr !== undefined;\n const functionName = hasFile ? funcOrFile : null;\n const filePath = hasFile ? file : funcOrFile;\n const lineNumber = parseInt(hasFile ? lineStr : (file as string), 10);\n const columnNumber = parseInt(hasFile ? colStr : lineStr, 10);\n\n // App code vs library code. `node_modules` has to lose in BOTH\n // branches: a dependency shipping its own sources sits at\n // `node_modules/pkg/src/…`, which contains `/src/`, and it would\n // otherwise be picked as the error's primary location ahead of the\n // application frame that actually called it.\n const isAppCode = !filePath.includes('node_modules') && filePath.includes('src/');\n\n return {\n functionName: functionName || null,\n filePath: cleanFilePath(filePath),\n lineNumber: isNaN(lineNumber) ? null : lineNumber,\n columnNumber: isNaN(columnNumber) ? null : columnNumber,\n isAppCode,\n };\n }\n }\n\n return null;\n}\n\n/**\n * Clean file path for display.\n */\nfunction cleanFilePath(path: string): string {\n // Remove webpack/vite query strings\n const cleaned = path.replace(/\\?.*$/, '');\n\n // Try to extract relative path from src/\n const srcIndex = cleaned.indexOf('/src/');\n if (srcIndex !== -1) {\n return cleaned.slice(srcIndex + 1);\n }\n\n // Try to get a reasonable path from the end\n const parts = cleaned.split('/');\n if (parts.length > 3) {\n return parts.slice(-3).join('/');\n }\n\n return cleaned;\n}\n\n/**\n * Parse an error stack trace into structured data.\n *\n * Extracts function names, file paths, and line numbers from stack traces.\n * Identifies app code vs library code for better debugging.\n *\n * @param stack - Error stack trace string\n * @returns Parsed stack trace with frames\n *\n * @example\n * ```tsx\n * try {\n * throw new Error('Something went wrong');\n * } catch (error) {\n * const parsed = parseStackTrace(error.stack);\n * console.log('Error in:', parsed.primary?.filePath);\n * console.log('Function:', parsed.primary?.functionName);\n * console.log('Line:', parsed.primary?.lineNumber);\n * }\n * ```\n */\nexport function parseStackTrace(stack?: string): ParsedStackTrace {\n if (!stack) {\n return { primary: null, frames: [], raw: '' };\n }\n\n const lines = stack.split('\\n');\n const frames: StackFrame[] = [];\n\n for (const line of lines) {\n const frame = parseStackFrame(line.trim());\n if (frame) {\n frames.push(frame);\n }\n }\n\n // Find the first app code frame as the primary location\n const primary = frames.find((f) => f.isAppCode) ?? frames[0] ?? null;\n\n return { primary, frames, raw: stack };\n}\n\n/**\n * Get a summary of the error location.\n *\n * @param error - Error object\n * @returns Human-readable error location\n */\nexport function getErrorLocation(error: Error): string {\n const parsed = parseStackTrace(error.stack);\n const { primary } = parsed;\n\n if (!primary) {\n return 'Unknown location';\n }\n\n const parts: string[] = [];\n\n if (primary.functionName) {\n parts.push(`in ${primary.functionName}`);\n }\n\n if (primary.filePath) {\n const location = primary.lineNumber ? `${primary.filePath}:${primary.lineNumber}` : primary.filePath;\n parts.push(`(${location})`);\n }\n\n return parts.join(' ') || 'Unknown location';\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Error fallback component props.\n */\nexport interface FallbackProps {\n /** The error that was caught */\n error: Error;\n /** Error info from React */\n errorInfo: ErrorInfo | null;\n /** Parsed stack trace for debugging */\n parsedStack: ParsedStackTrace;\n /** Reset error boundary state */\n resetErrorBoundary: () => void;\n}\n\n/**\n * Error boundary props.\n */\nexport interface ErrorBoundaryProps {\n /** Child components to render */\n children: ReactNode;\n /** Custom fallback component */\n fallback?: ReactNode | ((props: FallbackProps) => ReactNode);\n /** Callback when error is caught */\n onError?: (error: Error, errorInfo: ErrorInfo, parsedStack: ParsedStackTrace) => void;\n /** Callback when error is reset */\n onReset?: () => void;\n /** Reset keys - boundary resets when these change */\n resetKeys?: unknown[];\n /** Custom sx props for default fallback */\n sx?: SxProps<Theme>;\n /** Show detailed stack info in default fallback (auto-detects dev mode if not set) */\n showDetails?: boolean;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n errorInfo: ErrorInfo | null;\n}\n\n// =============================================================================\n// DEFAULT FALLBACK\n// =============================================================================\n\ninterface DefaultFallbackProps extends FallbackProps {\n sx?: SxProps<Theme>;\n /** Show detailed stack info (auto-detected in dev) */\n showDetails?: boolean;\n}\n\nfunction DefaultErrorFallback({\n error,\n parsedStack,\n resetErrorBoundary,\n sx,\n showDetails,\n}: DefaultFallbackProps): ReactNode {\n const [expanded, setExpanded] = useState(false);\n const [copied, setCopied] = useState(false);\n\n // Auto-detect dev mode if not specified\n const shouldShowDetails = showDetails ?? (typeof process !== 'undefined' && process.env.NODE_ENV === 'development');\n\n const handleCopyStack = async () => {\n try {\n const text = [\n `Error: ${error.message}`,\n `Location: ${getErrorLocation(error)}`,\n '',\n 'Stack Trace:',\n parsedStack.raw,\n ].join('\\n');\n\n await navigator.clipboard.writeText(text);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Clipboard API not available\n }\n };\n\n return (\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 200,\n p: 3,\n textAlign: 'center',\n ...sx,\n }}\n >\n <Typography variant=\"h6\" color=\"error\" gutterBottom>\n Something went wrong\n </Typography>\n <Typography\n variant=\"body2\"\n sx={{\n color: 'text.secondary',\n mb: 1,\n maxWidth: 400,\n }}\n >\n {error.message || 'An unexpected error occurred'}\n </Typography>\n {shouldShowDetails && parsedStack.primary && (\n <Typography\n variant=\"caption\"\n sx={{\n color: 'text.secondary',\n mb: 2,\n fontFamily: 'monospace',\n }}\n >\n {parsedStack.primary.filePath}\n {parsedStack.primary.lineNumber && `:${parsedStack.primary.lineNumber}`}\n {parsedStack.primary.functionName && ` (${parsedStack.primary.functionName})`}\n </Typography>\n )}\n <Box sx={{ display: 'flex', gap: 1, mb: 2 }}>\n <Button variant=\"outlined\" onClick={resetErrorBoundary}>\n Try Again\n </Button>\n\n {shouldShowDetails && (\n <>\n <IconButton\n size=\"small\"\n onClick={() => setExpanded(!expanded)}\n aria-label={expanded ? 'Hide stack trace' : 'Show stack trace'}\n aria-expanded={expanded}\n sx={{\n transform: expanded ? 'rotate(180deg)' : 'rotate(0deg)',\n transition: 'transform 0.2s',\n }}\n >\n <ExpandMoreIcon />\n </IconButton>\n\n <IconButton size=\"small\" onClick={handleCopyStack} title=\"Copy error details\">\n <ContentCopyIcon fontSize=\"small\" />\n </IconButton>\n {copied && (\n <Typography\n variant=\"caption\"\n sx={{\n color: 'success.main',\n alignSelf: 'center',\n }}\n >\n Copied!\n </Typography>\n )}\n </>\n )}\n </Box>\n {shouldShowDetails && (\n <Collapse in={expanded}>\n <Box\n sx={{\n mt: 1,\n p: 2,\n // Theme-aware: `grey.100` is a light value in both modes,\n // which put dark text on a near-white block in dark mode.\n bgcolor: 'action.hover',\n borderRadius: 1,\n maxWidth: 600,\n maxHeight: 300,\n overflow: 'auto',\n textAlign: 'left',\n }}\n >\n <Typography variant=\"caption\" component=\"pre\" sx={{ fontFamily: 'monospace', m: 0 }}>\n {parsedStack.frames.map((frame, i) => (\n <Box\n key={i}\n component=\"span\"\n sx={{\n display: 'block',\n color: frame.isAppCode ? 'error.main' : 'text.secondary',\n fontWeight: frame.isAppCode ? 600 : 400,\n }}\n >\n {frame.functionName || '(anonymous)'} at {frame.filePath || 'unknown'}\n {frame.lineNumber && `:${frame.lineNumber}`}\n </Box>\n ))}\n </Typography>\n </Box>\n </Collapse>\n )}\n </Box>\n );\n}\n\n// =============================================================================\n// ERROR BOUNDARY\n// =============================================================================\n\n/**\n * Error Boundary - Catches JavaScript errors in child components.\n *\n * @example\n * ```tsx\n * <ErrorBoundary\n * fallback={({ error, resetErrorBoundary }) => (\n * <div>\n * <p>Error: {error.message}</p>\n * <button onClick={resetErrorBoundary}>Retry</button>\n * </div>\n * )}\n * onError={(error, info) => logErrorToService(error, info)}\n * >\n * <MyComponent />\n * </ErrorBoundary>\n * ```\n *\n * @example\n * ```tsx\n * // With reset keys\n * <ErrorBoundary resetKeys={[userId, postId]}>\n * <UserPost userId={userId} postId={postId} />\n * </ErrorBoundary>\n * ```\n */\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = {\n hasError: false,\n error: null,\n errorInfo: null,\n };\n }\n\n static getDerivedStateFromError(error: Error): Partial<ErrorBoundaryState> {\n return {\n hasError: true,\n error,\n };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n const parsedStack = parseStackTrace(error.stack);\n this.setState({ errorInfo });\n this.props.onError?.(error, errorInfo, parsedStack);\n }\n\n componentDidUpdate(prevProps: ErrorBoundaryProps): void {\n const { resetKeys } = this.props;\n const { hasError } = this.state;\n\n if (hasError && resetKeys) {\n const previous = prevProps.resetKeys;\n // Length first: `some` walks the CURRENT array, so a key list that\n // shrinks — `[userId, postId]` to `[userId]` — compares only the keys\n // that remain, finds them equal, and never resets. Growing it reset\n // correctly, which is what made the asymmetry easy to miss.\n const hasKeyChanged =\n previous === undefined ||\n previous.length !== resetKeys.length ||\n resetKeys.some((key, index) => key !== previous[index]);\n\n if (hasKeyChanged) {\n this.resetErrorBoundary();\n }\n }\n }\n\n resetErrorBoundary = (): void => {\n this.props.onReset?.();\n this.setState({\n hasError: false,\n error: null,\n errorInfo: null,\n });\n };\n\n render(): ReactNode {\n const { hasError, error, errorInfo } = this.state;\n const { children, fallback, sx, showDetails } = this.props;\n\n if (hasError && error) {\n const parsedStack = parseStackTrace(error.stack);\n\n const fallbackProps: FallbackProps = {\n error,\n errorInfo,\n parsedStack,\n resetErrorBoundary: this.resetErrorBoundary,\n };\n\n if (typeof fallback === 'function') {\n return fallback(fallbackProps);\n }\n\n if (fallback) {\n return fallback;\n }\n\n return <DefaultErrorFallback {...fallbackProps} sx={sx} showDetails={showDetails} />;\n }\n\n return children;\n }\n}\n\n// =============================================================================\n// HOOK FOR THROWING ERRORS\n// =============================================================================\n\n/**\n * Hook to throw errors from event handlers.\n * Useful for triggering error boundary from async code.\n *\n * @returns Function to throw an error\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const throwError = useErrorBoundary();\n *\n * const handleClick = async () => {\n * try {\n * await fetchData();\n * } catch (error) {\n * throwError(error as Error);\n * }\n * };\n *\n * return <button onClick={handleClick}>Fetch</button>;\n * }\n * ```\n */\nexport function useErrorBoundary(): (error: Error) => void {\n const [, setError] = useState<Error | null>(null);\n\n return (error: Error) => {\n setError(() => {\n throw error;\n });\n };\n}\n"]}
@@ -569,5 +569,5 @@ var glassMixin = {
569
569
  };
570
570
 
571
571
  export { createPaletteColorFromScale, cssVarRgba, customScrollbarMixin, darken, focusRingMixin, generateColorScale, generateColorScaleWithChannels, generatePaletteColorWithChannels, getContrastRatio, getContrastText, getLuminance, glassMixin, hexToHsl, hexToRgb, hexToRgbChannel, hideScrollbarMixin, hslToHex, invertColorScale, isLightColor, lighten, mix, mixins, multiLineEllipsisMixin, rgbToHex, rgba, scrollbarStyles, textEllipsisMixin, varAlpha };
572
- //# sourceMappingURL=chunk-HOXFSQUV.js.map
573
- //# sourceMappingURL=chunk-HOXFSQUV.js.map
572
+ //# sourceMappingURL=chunk-IRYU3NTG.js.map
573
+ //# sourceMappingURL=chunk-IRYU3NTG.js.map