@omnitron-dev/prism 0.3.1 → 0.3.2

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
@@ -1,227 +1,12 @@
1
- import { TipTapRenderer } from './chunk-GUGTDURV.js';
2
- import { ChevronDownIcon } from './chunk-PGHEP4JD.js';
3
- import { fromMarkdown } from 'mdast-util-from-markdown';
4
- import { gfm } from 'micromark-extension-gfm';
5
- import { gfmFromMarkdown } from 'mdast-util-gfm';
6
- import { directive } from 'micromark-extension-directive';
7
- import { directiveFromMarkdown } from 'mdast-util-directive';
8
- import { math } from 'micromark-extension-math';
9
- import { mathFromMarkdown } from 'mdast-util-math';
1
+ import { parseResearchMarkdown, researchLimits } from './chunk-TEIGUOWN.js';
2
+ import { TipTapRenderer } from './chunk-4B2LTPK2.js';
3
+ import { ChevronDownIcon } from './chunk-VQVVHMPG.js';
10
4
  import { useId, useMemo, Component, useRef, useState, useEffect } from 'react';
11
5
  import katex from 'katex';
12
6
  import { Box, Accordion, AccordionSummary, Typography, AccordionDetails } from '@mui/material';
13
7
  import { useTheme } from '@mui/material/styles';
14
8
  import { jsx, jsxs } from 'react/jsx-runtime';
15
9
 
16
- // src/components/research/frontmatter.ts
17
- function splitFrontmatter(source) {
18
- const opening = /^(?:\uFEFF)?---[ \t]*\r?\n/.exec(source);
19
- if (!opening) return { body: source, metadata: void 0 };
20
- let offset = opening[0].length;
21
- while (offset < source.length) {
22
- const newline = source.indexOf("\n", offset);
23
- const end = newline < 0 ? source.length : newline + 1;
24
- if (/^(?:---|\.\.\.)[ \t]*(?:\r?\n)?$/.test(source.slice(offset, end))) {
25
- const raw = source.slice(0, end);
26
- return {
27
- body: raw.replace(/[^\r\n]/g, " ") + source.slice(end),
28
- metadata: { format: "yaml", raw, start: 0, end }
29
- };
30
- }
31
- offset = end;
32
- }
33
- return { body: source, metadata: void 0 };
34
- }
35
- var researchLimits = { source: 262144, nodes: 2e4, depth: 64, block: 2e4 };
36
- var str = (v) => typeof v === "string" ? v : "";
37
- var plain = (n) => str(n.value) || (n.children ?? []).map(plain).join("");
38
- function parseResearchMarkdown(source, prefix = "research", sourceProfile = "research") {
39
- if (source.length > researchLimits.source) throw new Error("document_limit");
40
- if (!/^[a-zA-Z][\w-]{0,100}$/.test(prefix)) throw new Error("invalid_document_prefix");
41
- const { body, metadata } = splitFrontmatter(source);
42
- const tree = fromMarkdown(body, {
43
- extensions: [gfm(), directive(), math()],
44
- mdastExtensions: [gfmFromMarkdown(), directiveFromMarkdown(), mathFromMarkdown()]
45
- });
46
- const headings = [], diagnostics = [];
47
- const ids = /* @__PURE__ */ new Set();
48
- let count = 0;
49
- const definitions = /* @__PURE__ */ new Map();
50
- const collect = (n, depth) => {
51
- if (++count > researchLimits.nodes || depth > researchLimits.depth) throw new Error("structure_limit");
52
- if (n.type === "definition") definitions.set(str(n.identifier), n);
53
- for (const c of n.children ?? []) collect(c, depth + 1);
54
- };
55
- collect(tree, 0);
56
- const fallback = (n, code, inline = false) => {
57
- diagnostics.push({ code, line: n.position?.start.line ?? 1 });
58
- const raw = source.slice(n.position?.start.offset ?? 0, n.position?.end.offset ?? 0) || plain(n);
59
- return inline ? { type: "text", text: raw } : { type: "codeBlock", content: [{ type: "text", text: raw }] };
60
- };
61
- const convert = (n, marks = []) => {
62
- const children = () => (n.children ?? []).flatMap((c) => convert(c, marks));
63
- const node = (type, attrs, content = children()) => [
64
- {
65
- type,
66
- attrs: { ...attrs, source: n.position },
67
- content
68
- }
69
- ];
70
- switch (n.type) {
71
- case "root":
72
- return children();
73
- case "definition":
74
- return [];
75
- case "text":
76
- return [{ type: "text", text: str(n.value), marks }];
77
- case "inlineCode":
78
- return [{ type: "text", text: str(n.value), marks: [...marks, { type: "code" }] }];
79
- case "strong":
80
- case "emphasis":
81
- case "delete":
82
- return (n.children ?? []).flatMap(
83
- (c) => convert(c, [...marks, { type: { strong: "bold", emphasis: "italic", delete: "strike" }[n.type] }])
84
- );
85
- case "paragraph":
86
- return node("paragraph");
87
- case "heading": {
88
- const explicit = sourceProfile === "docusaurus" ? /\s*\{#([^\s{}]+)\}\s*$/.exec(plain(n)) : null;
89
- const title = explicit ? plain(n).slice(0, explicit.index) : plain(n);
90
- const base = `${prefix}-${explicit?.[1] ?? (title.normalize("NFKC").toLowerCase().replace(/[^\p{L}\p{N}]+/gu, "-").replace(/^-|-$/g, "") || "section")}`;
91
- let id = base, suffix = 1;
92
- while (ids.has(id)) id = `${base}-${++suffix}`;
93
- if (explicit && id !== base)
94
- diagnostics.push({ code: "duplicate_heading_id", line: n.position?.start.line ?? 1 });
95
- ids.add(id);
96
- headings.push({ id, title, level: Number(n.depth) });
97
- let content = n.children ?? [];
98
- if (explicit) {
99
- const last = content.at(-1);
100
- if (last?.type === "text")
101
- content = [
102
- ...content.slice(0, -1),
103
- { ...last, value: str(last.value).replace(/\s*\{#[^\s{}]+\}\s*$/, "") }
104
- ];
105
- }
106
- return node(
107
- "heading",
108
- { level: n.depth, id },
109
- content.flatMap((c) => convert(c, marks))
110
- );
111
- }
112
- case "linkReference":
113
- case "imageReference": {
114
- const def = definitions.get(str(n.identifier));
115
- if (!def) return [fallback(n, "unresolved_reference", true)];
116
- return convert(
117
- { ...n, type: n.type === "linkReference" ? "link" : "image", url: def.url, title: def.title },
118
- marks
119
- );
120
- }
121
- case "link":
122
- return (n.children ?? []).flatMap(
123
- (c) => convert(c, [
124
- ...marks,
125
- {
126
- type: "link",
127
- attrs: {
128
- href: sourceProfile === "docusaurus" && str(n.url).startsWith("#") ? `#${prefix}-${str(n.url).slice(1)}` : str(n.url)
129
- }
130
- }
131
- ])
132
- );
133
- case "image":
134
- return node("image", { src: str(n.url), alt: str(n.alt), title: str(n.title) }, []);
135
- case "break":
136
- return node("hardBreak", {}, []);
137
- case "blockquote":
138
- return node("blockquote");
139
- case "thematicBreak":
140
- return node("horizontalRule", {}, []);
141
- case "list":
142
- return node(
143
- (n.children ?? []).some((c) => typeof c.checked === "boolean") ? "taskList" : n.ordered ? "orderedList" : "bulletList",
144
- { start: n.start }
145
- );
146
- case "listItem":
147
- return node(typeof n.checked === "boolean" ? "taskItem" : "listItem", { checked: n.checked });
148
- case "table":
149
- return node(
150
- "table",
151
- {},
152
- (n.children ?? []).map((row, i) => ({
153
- type: "tableRow",
154
- content: (row.children ?? []).map((cell) => ({
155
- type: i === 0 ? "tableHeader" : "tableCell",
156
- content: [{ type: "paragraph", content: (cell.children ?? []).flatMap((c) => convert(c)) }]
157
- }))
158
- }))
159
- );
160
- case "inlineMath":
161
- case "math":
162
- return node(n.type === "math" ? "mathBlock" : "mathInline", { tex: str(n.value) }, []).map((n2) => ({
163
- ...n2,
164
- marks
165
- }));
166
- case "code": {
167
- const language = str(n.lang).toLowerCase(), body2 = str(n.value);
168
- if (["mermaid", "pintora", "prism"].includes(language) && body2.length > researchLimits.block)
169
- return [fallback(n, "block_limit")];
170
- if (language === "mermaid" || language === "pintora")
171
- return node("diagram", { engine: language, code: body2 }, []);
172
- if (language === "prism") {
173
- try {
174
- return node("researchWidget", { descriptor: JSON.parse(body2) }, []);
175
- } catch {
176
- return [fallback(n, "invalid_widget_json")];
177
- }
178
- }
179
- return node("codeBlock", { language, title: str(n.meta) }, [{ type: "text", text: body2 }]);
180
- }
181
- case "containerDirective":
182
- case "leafDirective": {
183
- const name = str(n.name), attrs = n.attributes ?? {};
184
- if (["note", "tip", "warning", "danger", "info", "caution"].includes(name))
185
- return node("admonition", { kind: name, title: attrs.title || name });
186
- if (name === "tabs") {
187
- if ((n.children ?? []).some((c) => c.type !== "containerDirective" || c.name !== "tab"))
188
- return [fallback(n, "invalid_tabs")];
189
- return node(
190
- "tabs",
191
- {},
192
- (n.children ?? []).flatMap((c) => convert(c))
193
- );
194
- }
195
- if (name === "tab") return node("tabItem", { label: attrs.label || attrs.value || "Tab" });
196
- if (name === "widget")
197
- return node(
198
- "researchWidget",
199
- {
200
- descriptor: {
201
- type: attrs.type,
202
- version: Number(attrs.version || 1),
203
- props: Object.fromEntries(Object.entries(attrs).filter(([key]) => key !== "type" && key !== "version"))
204
- }
205
- },
206
- []
207
- );
208
- return [fallback(n, "unknown_directive")];
209
- }
210
- case "html":
211
- return [fallback(n, "raw_html", true)];
212
- default:
213
- return [
214
- fallback(
215
- n,
216
- `unsupported_${n.type}`,
217
- n.type.startsWith("inline") || n.type === "textDirective" || n.type === "footnoteReference"
218
- )
219
- ];
220
- }
221
- };
222
- return { format: "prism-research/1", metadata, doc: { type: "doc", content: convert(tree) }, headings, diagnostics };
223
- }
224
-
225
10
  // src/components/research/diagram-image.ts
226
11
  function diagramImage(source, purify) {
227
12
  const fragment = purify.sanitize(source, {
@@ -310,9 +95,9 @@ function ResearchDiagram({
310
95
  ]
311
96
  });
312
97
  const result = await mermaid.render(id, source, scratch);
313
- const picture2 = diagramImage(result.svg, purify);
98
+ const renderedPicture = diagramImage(result.svg, purify);
314
99
  if (!cancelled) {
315
- setPicture(picture2);
100
+ setPicture(renderedPicture);
316
101
  setState("ready");
317
102
  }
318
103
  } catch {
@@ -326,7 +111,7 @@ function ResearchDiagram({
326
111
  cancelled = true;
327
112
  target?.replaceChildren();
328
113
  };
329
- }, [source, engine, id, theme]);
114
+ }, [source, engine, id, theme, mode]);
330
115
  return /* @__PURE__ */ jsxs("figure", { className: "prism-research__diagram", children: [
331
116
  state !== "ready" && /* @__PURE__ */ jsx("p", { role: "status", children: state === "error" ? labels.invalid : labels.loading }),
332
117
  /* @__PURE__ */ jsx("div", { ref: container, "aria-hidden": "true" }),
@@ -429,7 +214,7 @@ function ResearchDocument({
429
214
  }) {
430
215
  const uid = useId();
431
216
  const prefix = documentId ?? `research-${uid.replace(/[^\w-]/g, "")}`;
432
- const labels = { ...defaultResearchLabels, ...overrides };
217
+ const labels = useMemo(() => ({ ...defaultResearchLabels, ...overrides }), [overrides]);
433
218
  const parsed = useMemo(() => {
434
219
  try {
435
220
  return { data: parseResearchMarkdown(source, prefix, sourceProfile) };
@@ -454,7 +239,7 @@ function ResearchDocument({
454
239
  diagram: bounded((n) => /* @__PURE__ */ jsx(ResearchDiagram, { source: String(n.attrs?.code ?? ""), engine: String(n.attrs?.engine ?? ""), labels })),
455
240
  researchWidget: bounded((n) => /* @__PURE__ */ jsx(Widget, { node: n, widgets, labels }))
456
241
  };
457
- }, [widgets, labels.invalid, labels.unavailable, labels.loading, labels.source]);
242
+ }, [widgets, labels]);
458
243
  if (!parsed.data) return /* @__PURE__ */ jsx("p", { role: "alert", children: labels.invalid });
459
244
  return /* @__PURE__ */ jsxs(
460
245
  Box,
@@ -513,6 +298,6 @@ function ResearchDocument({
513
298
  );
514
299
  }
515
300
 
516
- export { ResearchDocument, defaultResearchLabels, defineResearchWidget, parseResearchMarkdown, researchLimits, splitFrontmatter };
517
- //# sourceMappingURL=chunk-SU3LVQ7N.js.map
518
- //# sourceMappingURL=chunk-SU3LVQ7N.js.map
301
+ export { ResearchDocument, defaultResearchLabels, defineResearchWidget };
302
+ //# sourceMappingURL=chunk-Q6JDNFSG.js.map
303
+ //# sourceMappingURL=chunk-Q6JDNFSG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/research/diagram-image.ts","../src/components/research/diagram.tsx","../src/components/research/document.tsx"],"names":["jsx","jsxs","useId"],"mappings":"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","file":"chunk-Q6JDNFSG.js","sourcesContent":["import type { DOMPurify } from 'dompurify';\n\n/** The returned SVG must be consumed only by <img>, never injected into HTML.\n * SVG image isolation preserves Mermaid's layout CSS without granting it DOM\n * capabilities or allowing its styles to affect the surrounding document.\n * https://developer.mozilla.org/en-US/docs/Web/SVG/Guides/SVG_as_an_image\n */\nexport function diagramImage(source: string, purify: DOMPurify) {\n const fragment = purify.sanitize(source, {\n USE_PROFILES: { svg: true, svgFilters: true },\n ADD_TAGS: ['style'],\n FORBID_TAGS: ['foreignObject', 'image', 'a', 'script', 'animate', 'animateMotion', 'animateTransform', 'set'],\n FORBID_ATTR: ['href', 'xlink:href'],\n RETURN_DOM_FRAGMENT: true,\n });\n const svg = fragment.querySelector('svg');\n if (!svg || !svg.getAttribute('viewBox')) throw new Error('invalid_diagram_svg');\n const title = svg.querySelector('title')?.textContent?.trim();\n const labels = [...svg.querySelectorAll('text')].map((node) => node.textContent?.trim()).filter(Boolean);\n const description = title || labels.join(' · ') || 'Diagram';\n return {\n src: 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(new XMLSerializer().serializeToString(svg)),\n description: description.slice(0, 2000),\n };\n}\n","'use client';\n\nimport { useEffect, useId, useRef, useState } from 'react';\nimport { useTheme } from '@mui/material/styles';\nimport type { ResearchLabels } from './document.js';\nimport { researchLimits } from './parse.js';\nimport { diagramImage } from './diagram-image.js';\n// Mermaid has mutable process-wide configuration. Serialise its configure/render\n// pair; document-local widgets and source code never get a configuration hook.\nlet pending: Promise<unknown> = Promise.resolve();\nexport function diagramSourceAllowed(source: string, engine: string) {\n return (\n engine === 'mermaid' && source.length <= researchLimits.block && !/^\\s*---/m.test(source) && !/%%\\s*\\{/.test(source)\n );\n}\nexport function ResearchDiagram({\n source,\n engine,\n labels,\n}: {\n source: string;\n engine: string;\n labels: ResearchLabels;\n}) {\n const id = `diagram-${useId().replace(/[^\\w-]/g, '')}`;\n const container = useRef<HTMLDivElement>(null);\n const [picture, setPicture] = useState<ReturnType<typeof diagramImage>>();\n const [state, setState] = useState<'loading' | 'ready' | 'error'>('loading');\n const theme = useTheme(),\n mode = theme.palette.mode;\n useEffect(() => {\n let cancelled = false;\n setState('loading');\n setPicture(undefined);\n const target = container.current;\n const run = async () => {\n if (cancelled || !target) return;\n if (!diagramSourceAllowed(source, engine)) {\n setState('error');\n return;\n }\n let scratch: HTMLDivElement | undefined;\n try {\n const [{ default: mermaid }, { default: purify }] = await Promise.all([import('mermaid'), import('dompurify')]);\n if (cancelled) return;\n scratch = document.createElement('div');\n scratch.style.cssText = 'position:absolute;visibility:hidden;pointer-events:none;width:1000px';\n target.append(scratch);\n mermaid.initialize({\n startOnLoad: false,\n securityLevel: 'strict',\n htmlLabels: false,\n maxTextSize: researchLimits.block,\n maxEdges: 256,\n suppressErrorRendering: true,\n look: 'classic',\n theme: 'base',\n fontFamily: 'system-ui, sans-serif',\n themeVariables: {\n darkMode: mode === 'dark',\n primaryColor: theme.palette.background.paper,\n primaryTextColor: theme.palette.text.primary,\n primaryBorderColor: theme.palette.text.secondary,\n secondaryColor: theme.palette.background.default,\n tertiaryColor: theme.palette.background.paper,\n lineColor: theme.palette.text.secondary,\n textColor: theme.palette.text.primary,\n fontFamily: 'system-ui, sans-serif',\n fontSize: '16px',\n },\n flowchart: { htmlLabels: false },\n secure: [\n 'securityLevel',\n 'startOnLoad',\n 'maxTextSize',\n 'maxEdges',\n 'htmlLabels',\n 'theme',\n 'look',\n 'fontFamily',\n 'themeCSS',\n 'themeVariables',\n ],\n });\n const result = await mermaid.render(id, source, scratch);\n const renderedPicture = diagramImage(result.svg, purify);\n if (!cancelled) {\n setPicture(renderedPicture);\n setState('ready');\n }\n } catch {\n if (!cancelled) setState('error');\n } finally {\n scratch?.remove();\n }\n };\n pending = pending.catch(() => undefined).then(run);\n return () => {\n cancelled = true;\n target?.replaceChildren();\n };\n }, [source, engine, id, theme, mode]);\n return (\n <figure className=\"prism-research__diagram\">\n {state !== 'ready' && <p role=\"status\">{state === 'error' ? labels.invalid : labels.loading}</p>}\n <div ref={container} aria-hidden=\"true\" />\n {picture && (\n <img\n className=\"prism-research__diagram-image\"\n src={picture.src}\n alt={picture.description}\n onError={() => setState('error')}\n />\n )}\n <details open={state === 'error'}>\n <summary>\n {labels.source} · {engine}\n </summary>\n <pre>{source}</pre>\n </details>\n </figure>\n );\n}\n","'use client';\n\nimport { ChevronDownIcon } from '../../icons/controls.js';\nimport { Component, useId, useMemo, type ReactNode, type ComponentType } from 'react';\nimport katex from 'katex';\nimport { Accordion, AccordionSummary, AccordionDetails, Box, Typography } from '@mui/material';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport { TipTapRenderer, type TipTapNode } from '../tiptap-renderer/index.js';\nimport { parseResearchMarkdown, researchLimits } from './parse.js';\nimport { ResearchDiagram } from './diagram.js';\nimport './research.css';\n\nexport interface ResearchWidget {\n version: number;\n render: (props: unknown) => ReactNode;\n}\nexport type ResearchWidgets = Readonly<Record<string, ResearchWidget>>;\nexport function defineResearchWidget<P>(\n version: number,\n parse: (input: unknown) => P,\n View: ComponentType<P & object>\n): ResearchWidget {\n return {\n version,\n render(input) {\n const props = parse(input);\n return <View {...(props as P & object)} />;\n },\n };\n}\nexport interface ResearchLabels {\n metadata: string;\n contents: string;\n source: string;\n unavailable: string;\n invalid: string;\n loading: string;\n diagnostics: string;\n}\nexport const defaultResearchLabels: ResearchLabels = {\n metadata: 'Source metadata',\n contents: 'On this page',\n source: 'Source',\n unavailable: 'This block is not available in this document.',\n invalid: 'This block could not be rendered. Its source is preserved.',\n loading: 'Rendering diagram…',\n diagnostics: 'Document diagnostics',\n};\nexport interface ResearchDocumentProps {\n /** Enables inert Docusaurus heading IDs and namespaced fragment links. */\n sourceProfile?: 'research' | 'docusaurus';\n source: string;\n /** Stable namespace for deep links. A revision identifier belongs to the host's document metadata. */\n documentId?: string;\n widgets?: ResearchWidgets;\n labels?: Partial<ResearchLabels>;\n contents?: boolean;\n className?: string;\n sx?: SxProps<Theme>;\n}\nclass BlockBoundary extends Component<{ children: ReactNode; fallback: ReactNode }, { failed: boolean }> {\n state = { failed: false };\n static getDerivedStateFromError() {\n return { failed: true };\n }\n render() {\n return this.state.failed ? this.props.fallback : this.props.children;\n }\n}\nfunction Formula({ node, labels }: { node: TipTapNode; labels: ResearchLabels }) {\n const tex = String(node.attrs?.tex ?? '');\n try {\n if (tex.length > researchLimits.block) throw new Error('formula_limit');\n const html = katex.renderToString(tex, {\n displayMode: node.type === 'mathBlock',\n trust: false,\n strict: 'error',\n throwOnError: true,\n maxExpand: 1000,\n maxSize: 20,\n output: 'htmlAndMathml',\n });\n return (\n <span\n className={node.type === 'mathBlock' ? 'prism-research__formula-block' : undefined}\n dangerouslySetInnerHTML={{ __html: html }}\n />\n );\n } catch {\n return (\n <code className=\"prism-research__invalid-math\" title={labels.invalid}>\n {tex}\n </code>\n );\n }\n}\nfunction Widget({ node, widgets, labels }: { node: TipTapNode; widgets: ResearchWidgets; labels: ResearchLabels }) {\n const d = node.attrs?.descriptor as { type?: unknown; version?: unknown; props?: unknown } | undefined;\n if (!d || typeof d.type !== 'string' || !Object.hasOwn(widgets, d.type) || widgets[d.type]?.version !== d.version)\n return (\n <details className=\"prism-research__failure\">\n <summary>{labels.unavailable}</summary>\n <pre>{JSON.stringify(d)}</pre>\n </details>\n );\n try {\n return widgets[d.type]!.render(d.props);\n } catch {\n return (\n <details className=\"prism-research__failure\">\n <summary>{labels.invalid}</summary>\n <pre>{JSON.stringify(d)}</pre>\n </details>\n );\n }\n}\nconst emptyWidgets: ResearchWidgets = Object.freeze({});\nexport function ResearchDocument({\n source,\n sourceProfile = 'research',\n documentId,\n widgets = emptyWidgets,\n labels: overrides,\n contents = false,\n className,\n sx,\n}: ResearchDocumentProps) {\n const uid = useId();\n const prefix = documentId ?? `research-${uid.replace(/[^\\w-]/g, '')}`;\n const labels = useMemo(() => ({ ...defaultResearchLabels, ...overrides }), [overrides]);\n const parsed = useMemo(() => {\n try {\n return { data: parseResearchMarkdown(source, prefix, sourceProfile) };\n } catch {\n return { error: true };\n }\n }, [source, prefix, sourceProfile]);\n const nodes = useMemo(() => {\n const failure = (raw: string) => (\n <details className=\"prism-research__failure\" open>\n <summary>{labels.invalid}</summary>\n <pre>{raw}</pre>\n </details>\n );\n const bounded = (render: (node: TipTapNode) => ReactNode) => (props: { node: TipTapNode }) => {\n const raw = String(\n props.node.attrs?.tex ?? props.node.attrs?.code ?? JSON.stringify(props.node.attrs?.descriptor ?? {})\n );\n return (\n <BlockBoundary key={raw} fallback={failure(raw)}>\n {render(props.node)}\n </BlockBoundary>\n );\n };\n return {\n mathInline: ({ node }: { node: TipTapNode }) => <Formula node={node} labels={labels} />,\n mathBlock: ({ node }: { node: TipTapNode }) => <Formula node={node} labels={labels} />,\n diagram: bounded((n) => (\n <ResearchDiagram source={String(n.attrs?.code ?? '')} engine={String(n.attrs?.engine ?? '')} labels={labels} />\n )),\n researchWidget: bounded((n) => <Widget node={n} widgets={widgets} labels={labels} />),\n };\n }, [widgets, labels]);\n if (!parsed.data) return <p role=\"alert\">{labels.invalid}</p>;\n return (\n <Box\n className={`prism-research ${className ?? ''}`}\n sx={(theme) => ({ '--prism-research-border': theme.palette.divider })}\n >\n {parsed.data.metadata && (\n <Accordion\n disableGutters\n elevation={0}\n sx={{ mb: 2, border: 1, borderColor: 'divider', '&:before': { display: 'none' } }}\n >\n <AccordionSummary expandIcon={<ChevronDownIcon fontSize=\"small\" />}>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {labels.metadata} · YAML\n </Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Box\n component=\"pre\"\n sx={{\n m: 0,\n maxHeight: 240,\n overflow: 'auto',\n whiteSpace: 'pre-wrap',\n overflowWrap: 'anywhere',\n fontSize: 12,\n }}\n >\n {parsed.data.metadata.raw}\n </Box>\n </AccordionDetails>\n </Accordion>\n )}\n {contents && parsed.data.headings.length > 0 && (\n <nav className=\"prism-research__contents\" aria-label={labels.contents}>\n <p>{labels.contents}</p>\n <ol>\n {parsed.data.headings.map((h) => (\n <li key={h.id}>\n <a href={`#${h.id}`}>{h.title}</a>\n </li>\n ))}\n </ol>\n </nav>\n )}\n <TipTapRenderer content={parsed.data.doc} nodeRenderers={nodes} inheritRegisteredNodes={false} sx={sx} />\n {parsed.data.diagnostics.length > 0 && (\n <details className=\"prism-research__diagnostics\">\n <summary>\n {labels.diagnostics} · {parsed.data.diagnostics.length}\n </summary>\n <ul>\n {parsed.data.diagnostics.map((d, i) => (\n <li key={i}>\n {d.line}: <code>{d.code}</code>\n </li>\n ))}\n </ul>\n </details>\n )}\n </Box>\n );\n}\n"]}
@@ -0,0 +1,115 @@
1
+ import { useState, useCallback } from 'react';
2
+ import MuiStepper from '@mui/material/Stepper';
3
+ import Step from '@mui/material/Step';
4
+ import StepLabel from '@mui/material/StepLabel';
5
+ import StepContent from '@mui/material/StepContent';
6
+ import Box from '@mui/material/Box';
7
+ import Button from '@mui/material/Button';
8
+ import { jsx, jsxs } from 'react/jsx-runtime';
9
+
10
+ // src/components/stepper/stepper.tsx
11
+ function Stepper({
12
+ steps,
13
+ activeStep = 0,
14
+ onStepChange,
15
+ orientation = "horizontal",
16
+ nonLinear = false,
17
+ alternativeLabel = false,
18
+ showContent = false,
19
+ ...other
20
+ }) {
21
+ const handleStepClick = (index) => {
22
+ if (nonLinear && onStepChange) {
23
+ onStepChange(index);
24
+ }
25
+ };
26
+ return /* @__PURE__ */ jsx(
27
+ MuiStepper,
28
+ {
29
+ activeStep,
30
+ orientation,
31
+ nonLinear,
32
+ alternativeLabel,
33
+ ...other,
34
+ children: steps.map((step, index) => /* @__PURE__ */ jsxs(Step, { completed: step.completed ?? index < activeStep, children: [
35
+ /* @__PURE__ */ jsx(
36
+ StepLabel,
37
+ {
38
+ optional: step.optional ? /* @__PURE__ */ jsx("span", { style: { fontSize: "0.75rem", color: "text.secondary" }, children: "Optional" }) : step.description ? /* @__PURE__ */ jsx("span", { style: { fontSize: "0.75rem", color: "text.secondary" }, children: step.description }) : void 0,
39
+ error: step.error,
40
+ icon: step.icon,
41
+ sx: {
42
+ cursor: nonLinear ? "pointer" : "default"
43
+ },
44
+ onClick: () => handleStepClick(index),
45
+ children: step.label
46
+ }
47
+ ),
48
+ orientation === "vertical" && showContent && step.content && /* @__PURE__ */ jsx(StepContent, { children: step.content })
49
+ ] }, index))
50
+ }
51
+ );
52
+ }
53
+ function useStepper({
54
+ initialStep = 0,
55
+ totalSteps,
56
+ onStepChange,
57
+ onComplete
58
+ }) {
59
+ const [activeStep, setActiveStep] = useState(initialStep);
60
+ const [isCompleted, setIsCompleted] = useState(false);
61
+ const goToStep = useCallback(
62
+ (step) => {
63
+ if (step >= 0 && step < totalSteps) {
64
+ setActiveStep(step);
65
+ onStepChange?.(step);
66
+ }
67
+ },
68
+ [totalSteps, onStepChange]
69
+ );
70
+ const nextStep = useCallback(() => {
71
+ if (activeStep === totalSteps - 1) {
72
+ setIsCompleted(true);
73
+ onComplete?.();
74
+ } else {
75
+ goToStep(activeStep + 1);
76
+ }
77
+ }, [activeStep, totalSteps, goToStep, onComplete]);
78
+ const prevStep = useCallback(() => {
79
+ goToStep(activeStep - 1);
80
+ }, [activeStep, goToStep]);
81
+ const reset = useCallback(() => {
82
+ setActiveStep(0);
83
+ setIsCompleted(false);
84
+ onStepChange?.(0);
85
+ }, [onStepChange]);
86
+ return {
87
+ activeStep,
88
+ nextStep,
89
+ prevStep,
90
+ goToStep,
91
+ reset,
92
+ isFirstStep: activeStep === 0,
93
+ isLastStep: activeStep === totalSteps - 1,
94
+ isCompleted
95
+ };
96
+ }
97
+ function StepperActions({
98
+ stepper,
99
+ backLabel = "Back",
100
+ nextLabel = "Next",
101
+ finishLabel = "Finish",
102
+ disableNext = false,
103
+ actions
104
+ }) {
105
+ return /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", gap: 2, mt: 3 }, children: [
106
+ /* @__PURE__ */ jsx(Button, { variant: "outlined", onClick: stepper.prevStep, disabled: stepper.isFirstStep, children: backLabel }),
107
+ /* @__PURE__ */ jsx(Box, { sx: { flex: 1 } }),
108
+ actions,
109
+ /* @__PURE__ */ jsx(Button, { variant: "contained", onClick: stepper.nextStep, disabled: disableNext, children: stepper.isLastStep ? finishLabel : nextLabel })
110
+ ] });
111
+ }
112
+
113
+ export { Stepper, StepperActions, useStepper };
114
+ //# sourceMappingURL=chunk-RPOGINR5.js.map
115
+ //# sourceMappingURL=chunk-RPOGINR5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/stepper/stepper.tsx"],"names":[],"mappings":"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","file":"chunk-RPOGINR5.js","sourcesContent":["'use client';\n\n/**\n * Stepper Component\n *\n * Multi-step wizard/stepper with custom styling.\n *\n * @module components/stepper\n */\n\nimport { useState, useCallback, type ReactNode } from 'react';\nimport MuiStepper from '@mui/material/Stepper';\nimport Step from '@mui/material/Step';\nimport StepLabel from '@mui/material/StepLabel';\nimport StepContent from '@mui/material/StepContent';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport type { StepperProps as MuiStepperProps } from '@mui/material/Stepper';\n\n/**\n * Step definition.\n */\nexport interface StepItem {\n /** Step label */\n label: string;\n /** Step description */\n description?: string;\n /** Step content */\n content?: ReactNode;\n /** Optional step (can be skipped) */\n optional?: boolean;\n /** Step icon */\n icon?: ReactNode;\n /** Step is completed */\n completed?: boolean;\n /** Step has error */\n error?: boolean;\n}\n\n/**\n * Props for Stepper component.\n */\nexport interface StepperProps extends Omit<MuiStepperProps, 'children'> {\n /** Steps to display */\n steps: StepItem[];\n /** Active step index */\n activeStep?: number;\n /** On step change */\n onStepChange?: (step: number) => void;\n /** Stepper orientation */\n orientation?: 'horizontal' | 'vertical';\n /** Allow non-linear navigation */\n nonLinear?: boolean;\n /** Alternative label placement (horizontal only) */\n alternativeLabel?: boolean;\n /** Show step content (vertical only) */\n showContent?: boolean;\n}\n\n/**\n * Stepper - Multi-step wizard/stepper.\n *\n * @example\n * ```tsx\n * <Stepper\n * steps={[\n * { label: 'Account', description: 'Create account' },\n * { label: 'Profile', description: 'Complete profile', optional: true },\n * { label: 'Verify', description: 'Verify email' },\n * ]}\n * activeStep={1}\n * onStepChange={(step) => setActiveStep(step)}\n * />\n * ```\n */\nexport function Stepper({\n steps,\n activeStep = 0,\n onStepChange,\n orientation = 'horizontal',\n nonLinear = false,\n alternativeLabel = false,\n showContent = false,\n ...other\n}: StepperProps): ReactNode {\n const handleStepClick = (index: number) => {\n if (nonLinear && onStepChange) {\n onStepChange(index);\n }\n };\n\n return (\n <MuiStepper\n activeStep={activeStep}\n orientation={orientation}\n nonLinear={nonLinear}\n alternativeLabel={alternativeLabel}\n {...other}\n >\n {steps.map((step, index) => (\n <Step key={index} completed={step.completed ?? index < activeStep}>\n <StepLabel\n optional={\n step.optional ? (\n <span style={{ fontSize: '0.75rem', color: 'text.secondary' }}>Optional</span>\n ) : step.description ? (\n <span style={{ fontSize: '0.75rem', color: 'text.secondary' }}>{step.description}</span>\n ) : undefined\n }\n error={step.error}\n icon={step.icon}\n sx={{\n cursor: nonLinear ? 'pointer' : 'default',\n }}\n onClick={() => handleStepClick(index)}\n >\n {step.label}\n </StepLabel>\n {orientation === 'vertical' && showContent && step.content && <StepContent>{step.content}</StepContent>}\n </Step>\n ))}\n </MuiStepper>\n );\n}\n\n/**\n * Return type for useStepper hook.\n */\nexport interface UseStepperReturn {\n /** Current active step */\n activeStep: number;\n /** Go to next step */\n nextStep: () => void;\n /** Go to previous step */\n prevStep: () => void;\n /** Go to specific step */\n goToStep: (step: number) => void;\n /** Reset to first step */\n reset: () => void;\n /** Is first step */\n isFirstStep: boolean;\n /** Is last step */\n isLastStep: boolean;\n /** Step is completed */\n isCompleted: boolean;\n}\n\n/**\n * Options for useStepper hook.\n */\nexport interface UseStepperOptions {\n /** Initial step */\n initialStep?: number;\n /** Total steps */\n totalSteps: number;\n /** On step change callback */\n onStepChange?: (step: number) => void;\n /** On complete callback */\n onComplete?: () => void;\n}\n\n/**\n * useStepper - Hook for managing stepper state.\n *\n * @example\n * ```tsx\n * const stepper = useStepper({\n * totalSteps: 3,\n * onComplete: () => console.log('Done!'),\n * });\n *\n * <Stepper steps={steps} activeStep={stepper.activeStep} />\n * <Button onClick={stepper.prevStep} disabled={stepper.isFirstStep}>\n * Back\n * </Button>\n * <Button onClick={stepper.nextStep}>\n * {stepper.isLastStep ? 'Finish' : 'Next'}\n * </Button>\n * ```\n */\nexport function useStepper({\n initialStep = 0,\n totalSteps,\n onStepChange,\n onComplete,\n}: UseStepperOptions): UseStepperReturn {\n const [activeStep, setActiveStep] = useState(initialStep);\n const [isCompleted, setIsCompleted] = useState(false);\n\n const goToStep = useCallback(\n (step: number) => {\n if (step >= 0 && step < totalSteps) {\n setActiveStep(step);\n onStepChange?.(step);\n }\n },\n [totalSteps, onStepChange]\n );\n\n const nextStep = useCallback(() => {\n if (activeStep === totalSteps - 1) {\n setIsCompleted(true);\n onComplete?.();\n } else {\n goToStep(activeStep + 1);\n }\n }, [activeStep, totalSteps, goToStep, onComplete]);\n\n const prevStep = useCallback(() => {\n goToStep(activeStep - 1);\n }, [activeStep, goToStep]);\n\n const reset = useCallback(() => {\n setActiveStep(0);\n setIsCompleted(false);\n onStepChange?.(0);\n }, [onStepChange]);\n\n return {\n activeStep,\n nextStep,\n prevStep,\n goToStep,\n reset,\n isFirstStep: activeStep === 0,\n isLastStep: activeStep === totalSteps - 1,\n isCompleted,\n };\n}\n\n/**\n * Props for StepperActions component.\n */\nexport interface StepperActionsProps {\n /** Stepper hook return */\n stepper: UseStepperReturn;\n /** Back button label */\n backLabel?: string;\n /** Next button label */\n nextLabel?: string;\n /** Finish button label */\n finishLabel?: string;\n /** Disable next button */\n disableNext?: boolean;\n /** Custom actions */\n actions?: ReactNode;\n}\n\n/**\n * StepperActions - Common action buttons for stepper.\n *\n * @example\n * ```tsx\n * <StepperActions stepper={stepper} />\n * ```\n */\nexport function StepperActions({\n stepper,\n backLabel = 'Back',\n nextLabel = 'Next',\n finishLabel = 'Finish',\n disableNext = false,\n actions,\n}: StepperActionsProps): ReactNode {\n return (\n <Box sx={{ display: 'flex', gap: 2, mt: 3 }}>\n <Button variant=\"outlined\" onClick={stepper.prevStep} disabled={stepper.isFirstStep}>\n {backLabel}\n </Button>\n <Box sx={{ flex: 1 }} />\n {actions}\n <Button variant=\"contained\" onClick={stepper.nextStep} disabled={disableNext}>\n {stepper.isLastStep ? finishLabel : nextLabel}\n </Button>\n </Box>\n );\n}\n"]}