@banzamel/mineralui 2.4.3 → 2.5.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 (545) hide show
  1. package/README.md +1 -1
  2. package/dist/MAvatar-CvQuiGvT.cjs +2 -0
  3. package/dist/MAvatar-CvQuiGvT.cjs.map +1 -0
  4. package/dist/MAvatar-EkOBrEtS.js +73 -0
  5. package/dist/MAvatar-EkOBrEtS.js.map +1 -0
  6. package/dist/MButton-BxEky3xQ.cjs +2 -0
  7. package/dist/MButton-BxEky3xQ.cjs.map +1 -0
  8. package/dist/MButton-KELyyBw1.js +123 -0
  9. package/dist/MButton-KELyyBw1.js.map +1 -0
  10. package/dist/{MButtonGroup-BEJxXZ8u.js → MButtonGroup-DDnn8Wfy.js} +3 -3
  11. package/dist/{MButtonGroup-BEJxXZ8u.js.map → MButtonGroup-DDnn8Wfy.js.map} +1 -1
  12. package/dist/{MButtonGroup-DO1Tq3Za.cjs → MButtonGroup-Dz8Fm-oA.cjs} +2 -2
  13. package/dist/{MButtonGroup-DO1Tq3Za.cjs.map → MButtonGroup-Dz8Fm-oA.cjs.map} +1 -1
  14. package/dist/{MCard-P8OoswWM.cjs → MCard-Bqm4BjK_.cjs} +2 -2
  15. package/dist/MCard-Bqm4BjK_.cjs.map +1 -0
  16. package/dist/{MCard-BqSkGAgf.js → MCard-CqZYGaS2.js} +4 -4
  17. package/dist/MCard-CqZYGaS2.js.map +1 -0
  18. package/dist/MCheckbox-CaWgyUn5.js +72 -0
  19. package/dist/MCheckbox-CaWgyUn5.js.map +1 -0
  20. package/dist/MCheckbox-DpKJpnFF.cjs +2 -0
  21. package/dist/MCheckbox-DpKJpnFF.cjs.map +1 -0
  22. package/dist/{MConflictIllustration-znC7ijmP.js → MConflictIllustration-dwZS44ye.js} +1517 -1515
  23. package/dist/MConflictIllustration-dwZS44ye.js.map +1 -0
  24. package/dist/MConflictIllustration-vfHs-jad.cjs +2 -0
  25. package/dist/MConflictIllustration-vfHs-jad.cjs.map +1 -0
  26. package/dist/MDetailList-C3othNs3.js +127 -0
  27. package/dist/MDetailList-C3othNs3.js.map +1 -0
  28. package/dist/MDetailList-DkDHLdJ8.cjs +2 -0
  29. package/dist/MDetailList-DkDHLdJ8.cjs.map +1 -0
  30. package/dist/MDropdownMenu-C4-r7UZM.cjs +2 -0
  31. package/dist/MDropdownMenu-C4-r7UZM.cjs.map +1 -0
  32. package/dist/MDropdownMenu-Dvg9UsHB.js +219 -0
  33. package/dist/MDropdownMenu-Dvg9UsHB.js.map +1 -0
  34. package/dist/MGrid-CQqT8nHi.js +271 -0
  35. package/dist/MGrid-CQqT8nHi.js.map +1 -0
  36. package/dist/MGrid-tBsqShLG.cjs +2 -0
  37. package/dist/MGrid-tBsqShLG.cjs.map +1 -0
  38. package/dist/MHeading-DQSQ8c7L.js +21 -0
  39. package/dist/MHeading-DQSQ8c7L.js.map +1 -0
  40. package/dist/MHeading-DiGYs1FJ.cjs +2 -0
  41. package/dist/MHeading-DiGYs1FJ.cjs.map +1 -0
  42. package/dist/MInput-BeEGufZG.cjs +2 -0
  43. package/dist/MInput-BeEGufZG.cjs.map +1 -0
  44. package/dist/MInput-QnQV9L8U.js +190 -0
  45. package/dist/MInput-QnQV9L8U.js.map +1 -0
  46. package/dist/MInputCVC-CCNRAqHw.cjs +2 -0
  47. package/dist/MInputCVC-CCNRAqHw.cjs.map +1 -0
  48. package/dist/MInputCVC-IXIYZwex.js +410 -0
  49. package/dist/MInputCVC-IXIYZwex.js.map +1 -0
  50. package/dist/MInputSearch-BSIc6m2P.cjs +2 -0
  51. package/dist/MInputSearch-BSIc6m2P.cjs.map +1 -0
  52. package/dist/MInputSearch-CNuTAbYs.js +44 -0
  53. package/dist/MInputSearch-CNuTAbYs.js.map +1 -0
  54. package/dist/{MKbd-BR1GX5oK.cjs → MKbd-CnW3NUIu.cjs} +2 -2
  55. package/dist/{MKbd-BR1GX5oK.cjs.map → MKbd-CnW3NUIu.cjs.map} +1 -1
  56. package/dist/{MKbd-COb7oh_k.js → MKbd-DjfGyajR.js} +2 -2
  57. package/dist/{MKbd-COb7oh_k.js.map → MKbd-DjfGyajR.js.map} +1 -1
  58. package/dist/MLink-C6uwA6db.cjs +2 -0
  59. package/dist/MLink-C6uwA6db.cjs.map +1 -0
  60. package/dist/MLink-ixg0xFFI.js +31 -0
  61. package/dist/MLink-ixg0xFFI.js.map +1 -0
  62. package/dist/MLoader-CViA3zBo.js +44 -0
  63. package/dist/MLoader-CViA3zBo.js.map +1 -0
  64. package/dist/MLoader-DUOoOoNE.cjs +2 -0
  65. package/dist/MLoader-DUOoOoNE.cjs.map +1 -0
  66. package/dist/MPagination-BTGenxWW.js +122 -0
  67. package/dist/MPagination-BTGenxWW.js.map +1 -0
  68. package/dist/MPagination-DitmdtCc.cjs +2 -0
  69. package/dist/MPagination-DitmdtCc.cjs.map +1 -0
  70. package/dist/MPopover-CBDbUOW6.js +183 -0
  71. package/dist/MPopover-CBDbUOW6.js.map +1 -0
  72. package/dist/MPopover-ZeoU9hb5.cjs +2 -0
  73. package/dist/MPopover-ZeoU9hb5.cjs.map +1 -0
  74. package/dist/{MSimpleGrid-Ui8cI0ho.js → MSimpleGrid-C_QvLmck.js} +3 -3
  75. package/dist/MSimpleGrid-C_QvLmck.js.map +1 -0
  76. package/dist/MSimpleGrid-wgvjnxwM.cjs +2 -0
  77. package/dist/MSimpleGrid-wgvjnxwM.cjs.map +1 -0
  78. package/dist/{MSkeleton-Dhu-loDO.js → MSkeleton-BpcpBBJq.js} +12 -10
  79. package/dist/MSkeleton-BpcpBBJq.js.map +1 -0
  80. package/dist/MSkeleton-DuAN8Vcv.cjs +2 -0
  81. package/dist/MSkeleton-DuAN8Vcv.cjs.map +1 -0
  82. package/dist/MSlider-CLASUc2H.js +134 -0
  83. package/dist/MSlider-CLASUc2H.js.map +1 -0
  84. package/dist/MSlider-hONQBulE.cjs +2 -0
  85. package/dist/MSlider-hONQBulE.cjs.map +1 -0
  86. package/dist/MStack-BwAFeGGg.js +39 -0
  87. package/dist/MStack-BwAFeGGg.js.map +1 -0
  88. package/dist/MStack-CGII4A-q.cjs +2 -0
  89. package/dist/MStack-CGII4A-q.cjs.map +1 -0
  90. package/dist/MSubText-BeZk-fhz.js +17 -0
  91. package/dist/MSubText-BeZk-fhz.js.map +1 -0
  92. package/dist/MSubText-Dl1PfToZ.cjs +2 -0
  93. package/dist/MSubText-Dl1PfToZ.cjs.map +1 -0
  94. package/dist/MSurface-B_QnRLr5.js +74 -0
  95. package/dist/MSurface-B_QnRLr5.js.map +1 -0
  96. package/dist/MSurface-BrFo-JMJ.cjs +2 -0
  97. package/dist/MSurface-BrFo-JMJ.cjs.map +1 -0
  98. package/dist/MTag-BZrKN_DS.js +41 -0
  99. package/dist/MTag-BZrKN_DS.js.map +1 -0
  100. package/dist/MTag-DCE1vRJM.cjs +2 -0
  101. package/dist/MTag-DCE1vRJM.cjs.map +1 -0
  102. package/dist/MText-BUWQPoBM.js +45 -0
  103. package/dist/MText-BUWQPoBM.js.map +1 -0
  104. package/dist/MText-nsvLFsSv.cjs +2 -0
  105. package/dist/MText-nsvLFsSv.cjs.map +1 -0
  106. package/dist/MTooltip-BRSPJ3RY.js +100 -0
  107. package/dist/MTooltip-BRSPJ3RY.js.map +1 -0
  108. package/dist/MTooltip-Cj2Fxmzc.cjs +2 -0
  109. package/dist/MTooltip-Cj2Fxmzc.cjs.map +1 -0
  110. package/dist/MTreeView-BWCTlsU-.cjs +2 -0
  111. package/dist/MTreeView-BWCTlsU-.cjs.map +1 -0
  112. package/dist/MTreeView-CWcMwE-Z.js +554 -0
  113. package/dist/MTreeView-CWcMwE-Z.js.map +1 -0
  114. package/dist/calendar-2yhnCkGW.cjs +2 -0
  115. package/dist/calendar-2yhnCkGW.cjs.map +1 -0
  116. package/dist/calendar-DcNYDTVb.js +195 -0
  117. package/dist/calendar-DcNYDTVb.js.map +1 -0
  118. package/dist/calendar.cjs +1 -1
  119. package/dist/calendar.js +1 -1
  120. package/dist/{calendarDates-M_Dawj0j.js → calendarDates-Bpw_G_QR.js} +30 -19
  121. package/dist/calendarDates-Bpw_G_QR.js.map +1 -0
  122. package/dist/calendarDates-Cg0nm69Y.cjs +2 -0
  123. package/dist/calendarDates-Cg0nm69Y.cjs.map +1 -0
  124. package/dist/cards-Bp886TRb.cjs +2 -0
  125. package/dist/cards-Bp886TRb.cjs.map +1 -0
  126. package/dist/cards-BvER6Gx0.js +1277 -0
  127. package/dist/cards-BvER6Gx0.js.map +1 -0
  128. package/dist/cards.cjs +1 -1
  129. package/dist/cards.js +2 -2
  130. package/dist/{cn-YER3QsV1.js → cn-CUSXNnjF.js} +1 -1
  131. package/dist/{cn-YER3QsV1.js.map → cn-CUSXNnjF.js.map} +1 -1
  132. package/dist/{cn-CU5TNITO.cjs → cn-DYFxgzi2.cjs} +1 -1
  133. package/dist/{cn-CU5TNITO.cjs.map → cn-DYFxgzi2.cjs.map} +1 -1
  134. package/dist/components/cards/MCardDaySchedule/MCardDaySchedule.d.ts +1 -1
  135. package/dist/components/cards/MCardDocumentTree/MCardDocumentTree.d.ts +1 -1
  136. package/dist/components/cards/MCardGrid/MCardGrid.d.ts +1 -1
  137. package/dist/components/cards/MCardPayment/MCardPayment.d.ts +1 -1
  138. package/dist/components/cards/MCardPayment/MCardPayment.types.d.ts +4 -0
  139. package/dist/components/cards/MCardPaymentMethod/MCardPaymentMethod.d.ts +1 -1
  140. package/dist/components/cards/MStatCard/MStatCard.d.ts +1 -1
  141. package/dist/components/controls/MCheckbox/MCheckbox.types.d.ts +6 -0
  142. package/dist/components/controls/MLoadMore/MLoadMore.d.ts +1 -1
  143. package/dist/components/controls/MSlider/MSlider.d.ts +1 -1
  144. package/dist/components/controls/MSlider/MSlider.types.d.ts +5 -0
  145. package/dist/components/data/MTreeView/MTreeView.d.ts +1 -1
  146. package/dist/components/data/MTreeView/MTreeView.types.d.ts +6 -0
  147. package/dist/components/data/MWeekGrid/MWeekGrid.d.ts +1 -1
  148. package/dist/components/data/MWeekGrid/MWeekGrid.types.d.ts +9 -3
  149. package/dist/components/display/MCodeBlock/MCodeBlock.d.ts +1 -1
  150. package/dist/components/dropdowns/MAutocomplete/MAutocomplete.d.ts +1 -1
  151. package/dist/components/dropdowns/MAutocomplete/MAutocomplete.types.d.ts +8 -2
  152. package/dist/components/dropdowns/MSelect/MSelect.d.ts +1 -1
  153. package/dist/components/dropdowns/shared/TimeColumnListbox.d.ts +20 -0
  154. package/dist/components/feedback/MAlert/MAlert.d.ts +1 -1
  155. package/dist/components/feedback/MBadge/MBadge.d.ts +1 -1
  156. package/dist/components/feedback/MBanner/MBanner.d.ts +1 -1
  157. package/dist/components/feedback/MLoader/MLoader.d.ts +1 -1
  158. package/dist/components/feedback/MSpinner/MSpinner.d.ts +1 -1
  159. package/dist/components/feedback/MTag/MTag.d.ts +1 -1
  160. package/dist/components/inputs/MInput/MInput.types.d.ts +6 -1
  161. package/dist/components/inputs/MInput/useFormatCaret.d.ts +8 -0
  162. package/dist/components/layout/MCanvasGrid/MCanvasGrid.types.d.ts +5 -0
  163. package/dist/components/layout/MContainer/MContainer.d.ts +1 -1
  164. package/dist/components/layout/MDivider/MDivider.d.ts +1 -1
  165. package/dist/components/layout/MFooter/MFooter.d.ts +1 -1
  166. package/dist/components/layout/MHeader/MHeader.d.ts +1 -1
  167. package/dist/components/layout/MInline/MInline.d.ts +1 -1
  168. package/dist/components/layout/MNavbar/MNavbar.d.ts +1 -1
  169. package/dist/components/layout/MNavbar/MNavbar.types.d.ts +2 -0
  170. package/dist/components/layout/MSection/MSection.d.ts +1 -1
  171. package/dist/components/layout/MStack/MStack.d.ts +1 -1
  172. package/dist/components/layout/MStickyPanel/MStickyPanel.types.d.ts +4 -0
  173. package/dist/components/layout/MSurface/MSurface.d.ts +1 -1
  174. package/dist/components/media/MAvatar/MAvatar.d.ts +1 -1
  175. package/dist/components/media/MAvatar/MAvatar.types.d.ts +10 -0
  176. package/dist/components/media/MCarousel/MCarousel.d.ts +1 -1
  177. package/dist/components/media/MImage/MImage.d.ts +1 -1
  178. package/dist/components/media/carouselA11y.d.ts +9 -0
  179. package/dist/components/overlays/MCommandPalette/MCommandPalette.d.ts +1 -1
  180. package/dist/components/overlays/MDropdownMenu/MDropdownMenu.d.ts +4 -2
  181. package/dist/components/overlays/MDropdownMenu/MDropdownMenu.types.d.ts +3 -1
  182. package/dist/components/overlays/MPopconfirm/MPopconfirm.d.ts +1 -1
  183. package/dist/components/overlays/scrollLock.d.ts +14 -0
  184. package/dist/components/primitives/MPopover/MPopover.d.ts +1 -1
  185. package/dist/components/primitives/MPopover/MPopover.types.d.ts +32 -1
  186. package/dist/components/primitives/MPopover/popoverStack.d.ts +6 -0
  187. package/dist/components/typography/MHeading/MHeading.d.ts +2 -3
  188. package/dist/components/typography/MSubText/MSubText.d.ts +1 -1
  189. package/dist/components/typography/MText/MText.d.ts +1 -1
  190. package/dist/controls-B4Dxaab4.js +491 -0
  191. package/dist/controls-B4Dxaab4.js.map +1 -0
  192. package/dist/controls-CyXEIOXD.cjs +2 -0
  193. package/dist/controls-CyXEIOXD.cjs.map +1 -0
  194. package/dist/controls.cjs +1 -1
  195. package/dist/controls.js +5 -5
  196. package/dist/creditCards-Bo2mrc53.cjs +2 -0
  197. package/dist/creditCards-Bo2mrc53.cjs.map +1 -0
  198. package/dist/{creditCards-D_iWmtG6.js → creditCards-DmDOyvcw.js} +20 -31
  199. package/dist/creditCards-DmDOyvcw.js.map +1 -0
  200. package/dist/data-BM3KG8oN.cjs +2 -0
  201. package/dist/data-BM3KG8oN.cjs.map +1 -0
  202. package/dist/data-qnR8OBmj.js +808 -0
  203. package/dist/data-qnR8OBmj.js.map +1 -0
  204. package/dist/data.cjs +1 -1
  205. package/dist/data.js +2 -2
  206. package/dist/{dateUtils-CUY6CRCf.js → dateUtils-B-ToNZq_.js} +5 -6
  207. package/dist/dateUtils-B-ToNZq_.js.map +1 -0
  208. package/dist/dateUtils-z2L7ZaxA.cjs +2 -0
  209. package/dist/dateUtils-z2L7ZaxA.cjs.map +1 -0
  210. package/dist/display-BLMOBofj.cjs +3 -0
  211. package/dist/display-BLMOBofj.cjs.map +1 -0
  212. package/dist/display-Dlb79lkA.js +968 -0
  213. package/dist/display-Dlb79lkA.js.map +1 -0
  214. package/dist/display.cjs +1 -1
  215. package/dist/display.js +2 -2
  216. package/dist/dropdowns-2_7VMEDo.js +2009 -0
  217. package/dist/dropdowns-2_7VMEDo.js.map +1 -0
  218. package/dist/dropdowns-DN7j8J-V.cjs +2 -0
  219. package/dist/dropdowns-DN7j8J-V.cjs.map +1 -0
  220. package/dist/dropdowns.cjs +1 -1
  221. package/dist/dropdowns.js +1 -1
  222. package/dist/feedback-CECayytY.js +335 -0
  223. package/dist/feedback-CECayytY.js.map +1 -0
  224. package/dist/feedback-paV8Ls-h.cjs +2 -0
  225. package/dist/feedback-paV8Ls-h.cjs.map +1 -0
  226. package/dist/feedback.cjs +1 -1
  227. package/dist/feedback.js +5 -5
  228. package/dist/form-Br56h5EF.cjs +2 -0
  229. package/dist/form-Br56h5EF.cjs.map +1 -0
  230. package/dist/form-CJmMZgsH.js +165 -0
  231. package/dist/form-CJmMZgsH.js.map +1 -0
  232. package/dist/form.cjs +1 -1
  233. package/dist/form.js +1 -1
  234. package/dist/{formatters-CNjg_h7-.cjs → formatters-CauWlsnM.cjs} +1 -1
  235. package/dist/{formatters-CNjg_h7-.cjs.map → formatters-CauWlsnM.cjs.map} +1 -1
  236. package/dist/{formatters-T0vvjMtB.js → formatters-Doqdu_w1.js} +1 -1
  237. package/dist/{formatters-T0vvjMtB.js.map → formatters-Doqdu_w1.js.map} +1 -1
  238. package/dist/frameworkTexts-CaqdiKHW.cjs +2 -0
  239. package/dist/frameworkTexts-CaqdiKHW.cjs.map +1 -0
  240. package/dist/frameworkTexts-o43FqY1A.js +505 -0
  241. package/dist/frameworkTexts-o43FqY1A.js.map +1 -0
  242. package/dist/i18n/MI18nProvider.d.ts +6 -1
  243. package/dist/i18n/frameworkTexts.d.ts +511 -0
  244. package/dist/i18n/index.d.ts +1 -0
  245. package/dist/i18n.cjs +1 -1
  246. package/dist/i18n.js +2 -2
  247. package/dist/icons-Bp8bB9TP.cjs +2 -0
  248. package/dist/icons-Bp8bB9TP.cjs.map +1 -0
  249. package/dist/{icons-CBMl-kOM.js → icons-IqEBmGh3.js} +1223 -1220
  250. package/dist/icons-IqEBmGh3.js.map +1 -0
  251. package/dist/icons.cjs +1 -1
  252. package/dist/icons.js +1 -1
  253. package/dist/illustrations.cjs +1 -1
  254. package/dist/illustrations.js +1 -1
  255. package/dist/index.cjs +1 -1
  256. package/dist/index.d.ts +4 -2
  257. package/dist/index.js +56 -56
  258. package/dist/inputs-C0BJzlA-.js +1923 -0
  259. package/dist/inputs-C0BJzlA-.js.map +1 -0
  260. package/dist/inputs-CvNBBLFA.cjs +2 -0
  261. package/dist/inputs-CvNBBLFA.cjs.map +1 -0
  262. package/dist/inputs.cjs +1 -1
  263. package/dist/inputs.js +4 -4
  264. package/dist/layout-BSFqGXLZ.js +1101 -0
  265. package/dist/layout-BSFqGXLZ.js.map +1 -0
  266. package/dist/layout-MKqvUkPv.cjs +2 -0
  267. package/dist/layout-MKqvUkPv.cjs.map +1 -0
  268. package/dist/layout.cjs +1 -1
  269. package/dist/layout.js +6 -6
  270. package/dist/{layoutProps-Ck4VtGm9.cjs → layoutProps-B8y2XwHy.cjs} +1 -1
  271. package/dist/{layoutProps-Ck4VtGm9.cjs.map → layoutProps-B8y2XwHy.cjs.map} +1 -1
  272. package/dist/{layoutProps-Cl6d1KmH.js → layoutProps-CE5-ghKw.js} +1 -1
  273. package/dist/{layoutProps-Cl6d1KmH.js.map → layoutProps-CE5-ghKw.js.map} +1 -1
  274. package/dist/{licensing-f5KYVz7D.js → licensing-BKmoAdfr.js} +5 -4
  275. package/dist/licensing-BKmoAdfr.js.map +1 -0
  276. package/dist/licensing-DVgjkw-s.cjs +2 -0
  277. package/dist/licensing-DVgjkw-s.cjs.map +1 -0
  278. package/dist/media-fiasAbBv.js +485 -0
  279. package/dist/media-fiasAbBv.js.map +1 -0
  280. package/dist/media-tr1s386v.cjs +2 -0
  281. package/dist/media-tr1s386v.cjs.map +1 -0
  282. package/dist/media.cjs +1 -1
  283. package/dist/media.js +2 -2
  284. package/dist/overlays-Df-NpmkW.cjs +2 -0
  285. package/dist/overlays-Df-NpmkW.cjs.map +1 -0
  286. package/dist/overlays-W0WW3fn7.js +607 -0
  287. package/dist/overlays-W0WW3fn7.js.map +1 -0
  288. package/dist/overlays.cjs +1 -1
  289. package/dist/overlays.js +3 -3
  290. package/dist/primitives.cjs +1 -1
  291. package/dist/primitives.js +2 -2
  292. package/dist/radioGroupKeys-Bm-Qeh8G.js +28 -0
  293. package/dist/radioGroupKeys-Bm-Qeh8G.js.map +1 -0
  294. package/dist/radioGroupKeys-COL8uXbH.cjs +2 -0
  295. package/dist/radioGroupKeys-COL8uXbH.cjs.map +1 -0
  296. package/dist/{relativeTime-Cr-NVzij.js → relativeTime-BqCuaBqb.js} +1 -1
  297. package/dist/{relativeTime-Cr-NVzij.js.map → relativeTime-BqCuaBqb.js.map} +1 -1
  298. package/dist/{relativeTime-DgYBUaVm.cjs → relativeTime-DUbW4O44.cjs} +1 -1
  299. package/dist/{relativeTime-DgYBUaVm.cjs.map → relativeTime-DUbW4O44.cjs.map} +1 -1
  300. package/dist/scrollLock-C9P9o6wH.cjs +2 -0
  301. package/dist/scrollLock-C9P9o6wH.cjs.map +1 -0
  302. package/dist/scrollLock-D27VmgPV.js +14 -0
  303. package/dist/scrollLock-D27VmgPV.js.map +1 -0
  304. package/dist/style-runtime.cjs +1 -1
  305. package/dist/style-runtime.js +1 -1
  306. package/dist/styles.css +1 -1
  307. package/dist/theme/MThemeProvider.d.ts +18 -1
  308. package/dist/theme/index.d.ts +2 -2
  309. package/dist/{theme-DAOU1aPs.js → theme-B_juOenJ.js} +71 -61
  310. package/dist/theme-B_juOenJ.js.map +1 -0
  311. package/dist/theme-ByPZH0dh.cjs +2 -0
  312. package/dist/theme-ByPZH0dh.cjs.map +1 -0
  313. package/dist/theme.cjs +1 -1
  314. package/dist/theme.js +2 -2
  315. package/dist/{typography-C806GYT4.js → typography-DNcB8dOy.js} +3 -3
  316. package/dist/{typography-C806GYT4.js.map → typography-DNcB8dOy.js.map} +1 -1
  317. package/dist/{typography-4v01oNWx.cjs → typography-I7aeG8pH.cjs} +2 -2
  318. package/dist/{typography-4v01oNWx.cjs.map → typography-I7aeG8pH.cjs.map} +1 -1
  319. package/dist/typography.cjs +1 -1
  320. package/dist/typography.js +6 -6
  321. package/dist/useGhostText-CKsb8Ufa.js +240 -0
  322. package/dist/useGhostText-CKsb8Ufa.js.map +1 -0
  323. package/dist/useGhostText-DO-tfxS0.cjs +2 -0
  324. package/dist/useGhostText-DO-tfxS0.cjs.map +1 -0
  325. package/dist/useModalLayer-CpOPSDbf.js +128 -0
  326. package/dist/useModalLayer-CpOPSDbf.js.map +1 -0
  327. package/dist/useModalLayer-Cyt93Prs.cjs +2 -0
  328. package/dist/useModalLayer-Cyt93Prs.cjs.map +1 -0
  329. package/dist/utils/calendarDates.d.ts +5 -0
  330. package/dist/utils/radioGroupKeys.d.ts +9 -0
  331. package/dist/utils/useDateGridNav.d.ts +39 -0
  332. package/dist/utils/useGhostText.d.ts +2 -1
  333. package/dist/utils/useKeyboardNav.d.ts +51 -5
  334. package/dist/utils/useModalLayer.d.ts +4 -0
  335. package/dist/utils/useRovingToolbar.d.ts +26 -0
  336. package/dist/utils/validationMessages.d.ts +15 -0
  337. package/dist/utils.cjs +1 -1
  338. package/dist/utils.entry.d.ts +3 -1
  339. package/dist/utils.js +11 -11
  340. package/dist/validationMessages-BFimXxlT.js +23 -0
  341. package/dist/validationMessages-BFimXxlT.js.map +1 -0
  342. package/dist/validationMessages-iHu7apWr.cjs +2 -0
  343. package/dist/validationMessages-iHu7apWr.cjs.map +1 -0
  344. package/dist/validators-SZmLxnir.cjs +2 -0
  345. package/dist/validators-SZmLxnir.cjs.map +1 -0
  346. package/dist/{validators-DVYOtFnw.js → validators-ULebNme2.js} +107 -106
  347. package/dist/validators-ULebNme2.js.map +1 -0
  348. package/package.json +1 -1
  349. package/dist/MAvatar-DHNB3829.cjs +0 -2
  350. package/dist/MAvatar-DHNB3829.cjs.map +0 -1
  351. package/dist/MAvatar-GeRL-CNO.js +0 -63
  352. package/dist/MAvatar-GeRL-CNO.js.map +0 -1
  353. package/dist/MButton-CEwo8lUB.js +0 -115
  354. package/dist/MButton-CEwo8lUB.js.map +0 -1
  355. package/dist/MButton-CnAr77Za.cjs +0 -2
  356. package/dist/MButton-CnAr77Za.cjs.map +0 -1
  357. package/dist/MCard-BqSkGAgf.js.map +0 -1
  358. package/dist/MCard-P8OoswWM.cjs.map +0 -1
  359. package/dist/MCheckbox-BxFBADcE.js +0 -59
  360. package/dist/MCheckbox-BxFBADcE.js.map +0 -1
  361. package/dist/MCheckbox-DozwF2ai.cjs +0 -2
  362. package/dist/MCheckbox-DozwF2ai.cjs.map +0 -1
  363. package/dist/MConflictIllustration-2QL-BHYv.cjs +0 -2
  364. package/dist/MConflictIllustration-2QL-BHYv.cjs.map +0 -1
  365. package/dist/MConflictIllustration-znC7ijmP.js.map +0 -1
  366. package/dist/MDetailList-CThQvoyf.cjs +0 -2
  367. package/dist/MDetailList-CThQvoyf.cjs.map +0 -1
  368. package/dist/MDetailList-Cx9H81xT.js +0 -98
  369. package/dist/MDetailList-Cx9H81xT.js.map +0 -1
  370. package/dist/MDropdownMenu-DnKcCyW6.cjs +0 -2
  371. package/dist/MDropdownMenu-DnKcCyW6.cjs.map +0 -1
  372. package/dist/MDropdownMenu-DxbKN7Ui.js +0 -172
  373. package/dist/MDropdownMenu-DxbKN7Ui.js.map +0 -1
  374. package/dist/MGrid-BkRSGN2t.cjs +0 -2
  375. package/dist/MGrid-BkRSGN2t.cjs.map +0 -1
  376. package/dist/MGrid-CIz-2i6X.js +0 -265
  377. package/dist/MGrid-CIz-2i6X.js.map +0 -1
  378. package/dist/MHeading-AYQ8_GFP.cjs +0 -2
  379. package/dist/MHeading-AYQ8_GFP.cjs.map +0 -1
  380. package/dist/MHeading-DcGxUMwC.js +0 -21
  381. package/dist/MHeading-DcGxUMwC.js.map +0 -1
  382. package/dist/MI18nProvider-CqAwaswx.cjs +0 -2
  383. package/dist/MI18nProvider-CqAwaswx.cjs.map +0 -1
  384. package/dist/MI18nProvider-VH14CI8u.js +0 -72
  385. package/dist/MI18nProvider-VH14CI8u.js.map +0 -1
  386. package/dist/MInput-BYj2BdUe.cjs +0 -2
  387. package/dist/MInput-BYj2BdUe.cjs.map +0 -1
  388. package/dist/MInput-nodE-CZF.js +0 -188
  389. package/dist/MInput-nodE-CZF.js.map +0 -1
  390. package/dist/MInputCVC-9XWryaTz.cjs +0 -2
  391. package/dist/MInputCVC-9XWryaTz.cjs.map +0 -1
  392. package/dist/MInputCVC-CrDTaUXm.js +0 -321
  393. package/dist/MInputCVC-CrDTaUXm.js.map +0 -1
  394. package/dist/MInputSearch-BMgCHjFk.js +0 -43
  395. package/dist/MInputSearch-BMgCHjFk.js.map +0 -1
  396. package/dist/MInputSearch-BiVI1jNc.cjs +0 -2
  397. package/dist/MInputSearch-BiVI1jNc.cjs.map +0 -1
  398. package/dist/MLink-CAl6N6_z.js +0 -31
  399. package/dist/MLink-CAl6N6_z.js.map +0 -1
  400. package/dist/MLink-Dk_ReE6i.cjs +0 -2
  401. package/dist/MLink-Dk_ReE6i.cjs.map +0 -1
  402. package/dist/MLoader-CYp0OJU_.js +0 -41
  403. package/dist/MLoader-CYp0OJU_.js.map +0 -1
  404. package/dist/MLoader-DvmFle31.cjs +0 -2
  405. package/dist/MLoader-DvmFle31.cjs.map +0 -1
  406. package/dist/MPagination-E7IixIeo.js +0 -113
  407. package/dist/MPagination-E7IixIeo.js.map +0 -1
  408. package/dist/MPagination-reDU9xTW.cjs +0 -2
  409. package/dist/MPagination-reDU9xTW.cjs.map +0 -1
  410. package/dist/MPopover-8gYD3Ogq.js +0 -118
  411. package/dist/MPopover-8gYD3Ogq.js.map +0 -1
  412. package/dist/MPopover-B3npyAkL.cjs +0 -2
  413. package/dist/MPopover-B3npyAkL.cjs.map +0 -1
  414. package/dist/MPortal-Ba2Sxset.js +0 -10
  415. package/dist/MPortal-Ba2Sxset.js.map +0 -1
  416. package/dist/MPortal-CuBXhhl_.cjs +0 -2
  417. package/dist/MPortal-CuBXhhl_.cjs.map +0 -1
  418. package/dist/MSimpleGrid-BchGYPMi.cjs +0 -2
  419. package/dist/MSimpleGrid-BchGYPMi.cjs.map +0 -1
  420. package/dist/MSimpleGrid-Ui8cI0ho.js.map +0 -1
  421. package/dist/MSkeleton-DPa_G_2X.cjs +0 -2
  422. package/dist/MSkeleton-DPa_G_2X.cjs.map +0 -1
  423. package/dist/MSkeleton-Dhu-loDO.js.map +0 -1
  424. package/dist/MSlider-BRjhyBSc.js +0 -75
  425. package/dist/MSlider-BRjhyBSc.js.map +0 -1
  426. package/dist/MSlider-w5214a-W.cjs +0 -2
  427. package/dist/MSlider-w5214a-W.cjs.map +0 -1
  428. package/dist/MStack-Dt-rWvg3.js +0 -39
  429. package/dist/MStack-Dt-rWvg3.js.map +0 -1
  430. package/dist/MStack-nc6Y_9K3.cjs +0 -2
  431. package/dist/MStack-nc6Y_9K3.cjs.map +0 -1
  432. package/dist/MSubText-B0tXiuAp.js +0 -17
  433. package/dist/MSubText-B0tXiuAp.js.map +0 -1
  434. package/dist/MSubText-C6v6Exa2.cjs +0 -2
  435. package/dist/MSubText-C6v6Exa2.cjs.map +0 -1
  436. package/dist/MSurface-BjE-mL1L.cjs +0 -2
  437. package/dist/MSurface-BjE-mL1L.cjs.map +0 -1
  438. package/dist/MSurface-CpDJCdb5.js +0 -74
  439. package/dist/MSurface-CpDJCdb5.js.map +0 -1
  440. package/dist/MTag-BgOxiahL.cjs +0 -2
  441. package/dist/MTag-BgOxiahL.cjs.map +0 -1
  442. package/dist/MTag-cw3cIGHX.js +0 -41
  443. package/dist/MTag-cw3cIGHX.js.map +0 -1
  444. package/dist/MText-BDI4mdw8.cjs +0 -2
  445. package/dist/MText-BDI4mdw8.cjs.map +0 -1
  446. package/dist/MText-DhbAjtUE.js +0 -45
  447. package/dist/MText-DhbAjtUE.js.map +0 -1
  448. package/dist/MTooltip-BAgHlv5I.cjs +0 -2
  449. package/dist/MTooltip-BAgHlv5I.cjs.map +0 -1
  450. package/dist/MTooltip-CJxvlkOX.js +0 -92
  451. package/dist/MTooltip-CJxvlkOX.js.map +0 -1
  452. package/dist/MTreeView-DsBnYQMT.js +0 -315
  453. package/dist/MTreeView-DsBnYQMT.js.map +0 -1
  454. package/dist/MTreeView-LiJ5o-zy.cjs +0 -2
  455. package/dist/MTreeView-LiJ5o-zy.cjs.map +0 -1
  456. package/dist/calendar-Bq6NMNnS.js +0 -193
  457. package/dist/calendar-Bq6NMNnS.js.map +0 -1
  458. package/dist/calendar-C57BH8Nd.cjs +0 -2
  459. package/dist/calendar-C57BH8Nd.cjs.map +0 -1
  460. package/dist/calendarDates-M_Dawj0j.js.map +0 -1
  461. package/dist/calendarDates-qm047RW2.cjs +0 -2
  462. package/dist/calendarDates-qm047RW2.cjs.map +0 -1
  463. package/dist/cards-D4xJVd4q.js +0 -1227
  464. package/dist/cards-D4xJVd4q.js.map +0 -1
  465. package/dist/cards-Du6dbZSQ.cjs +0 -2
  466. package/dist/cards-Du6dbZSQ.cjs.map +0 -1
  467. package/dist/controls-BKoc_yel.js +0 -475
  468. package/dist/controls-BKoc_yel.js.map +0 -1
  469. package/dist/controls-Ck-PMt__.cjs +0 -2
  470. package/dist/controls-Ck-PMt__.cjs.map +0 -1
  471. package/dist/creditCards-D_HwRUBz.cjs +0 -2
  472. package/dist/creditCards-D_HwRUBz.cjs.map +0 -1
  473. package/dist/creditCards-D_iWmtG6.js.map +0 -1
  474. package/dist/data-CdQximqm.js +0 -689
  475. package/dist/data-CdQximqm.js.map +0 -1
  476. package/dist/data-PS4ygCyj.cjs +0 -2
  477. package/dist/data-PS4ygCyj.cjs.map +0 -1
  478. package/dist/dateUtils-CUY6CRCf.js.map +0 -1
  479. package/dist/dateUtils-Dq1vaA-D.cjs +0 -2
  480. package/dist/dateUtils-Dq1vaA-D.cjs.map +0 -1
  481. package/dist/display-YC1fVpXA.js +0 -782
  482. package/dist/display-YC1fVpXA.js.map +0 -1
  483. package/dist/display-slIo1bQI.cjs +0 -3
  484. package/dist/display-slIo1bQI.cjs.map +0 -1
  485. package/dist/dropdowns-DFbUoZ8Q.cjs +0 -2
  486. package/dist/dropdowns-DFbUoZ8Q.cjs.map +0 -1
  487. package/dist/dropdowns-nW3MY5XG.js +0 -1715
  488. package/dist/dropdowns-nW3MY5XG.js.map +0 -1
  489. package/dist/feedback-6MNb2Xyk.cjs +0 -2
  490. package/dist/feedback-6MNb2Xyk.cjs.map +0 -1
  491. package/dist/feedback-CPwJaQHY.js +0 -259
  492. package/dist/feedback-CPwJaQHY.js.map +0 -1
  493. package/dist/form-CMsZo6Dm.cjs +0 -2
  494. package/dist/form-CMsZo6Dm.cjs.map +0 -1
  495. package/dist/form-WU6DcQGD.js +0 -164
  496. package/dist/form-WU6DcQGD.js.map +0 -1
  497. package/dist/frameworkTexts-BSXUtXOp.cjs +0 -2
  498. package/dist/frameworkTexts-BSXUtXOp.cjs.map +0 -1
  499. package/dist/frameworkTexts-DP5RUl19.js +0 -131
  500. package/dist/frameworkTexts-DP5RUl19.js.map +0 -1
  501. package/dist/icons-CBMl-kOM.js.map +0 -1
  502. package/dist/icons-D3n9-919.cjs +0 -2
  503. package/dist/icons-D3n9-919.cjs.map +0 -1
  504. package/dist/inputs-B7rGMLMr.js +0 -1753
  505. package/dist/inputs-B7rGMLMr.js.map +0 -1
  506. package/dist/inputs-BiN62hgH.cjs +0 -2
  507. package/dist/inputs-BiN62hgH.cjs.map +0 -1
  508. package/dist/layout-BMggJ_qO.cjs +0 -2
  509. package/dist/layout-BMggJ_qO.cjs.map +0 -1
  510. package/dist/layout-DBYHyCTr.js +0 -883
  511. package/dist/layout-DBYHyCTr.js.map +0 -1
  512. package/dist/licensing-Be3g-PJt.cjs +0 -2
  513. package/dist/licensing-Be3g-PJt.cjs.map +0 -1
  514. package/dist/licensing-f5KYVz7D.js.map +0 -1
  515. package/dist/media-BPzMgzqE.js +0 -405
  516. package/dist/media-BPzMgzqE.js.map +0 -1
  517. package/dist/media-D63hxCAJ.cjs +0 -2
  518. package/dist/media-D63hxCAJ.cjs.map +0 -1
  519. package/dist/overlays-CCeYD6hT.js +0 -555
  520. package/dist/overlays-CCeYD6hT.js.map +0 -1
  521. package/dist/overlays-CsRN5OG8.cjs +0 -2
  522. package/dist/overlays-CsRN5OG8.cjs.map +0 -1
  523. package/dist/popoverStack--0r2oJCD.js +0 -44
  524. package/dist/popoverStack--0r2oJCD.js.map +0 -1
  525. package/dist/popoverStack-BmMk-VZJ.cjs +0 -2
  526. package/dist/popoverStack-BmMk-VZJ.cjs.map +0 -1
  527. package/dist/theme-CJuqObWL.cjs +0 -2
  528. package/dist/theme-CJuqObWL.cjs.map +0 -1
  529. package/dist/theme-DAOU1aPs.js.map +0 -1
  530. package/dist/useGhostText-DG0bzcao.js +0 -68
  531. package/dist/useGhostText-DG0bzcao.js.map +0 -1
  532. package/dist/useGhostText-mibV4s1-.cjs +0 -2
  533. package/dist/useGhostText-mibV4s1-.cjs.map +0 -1
  534. package/dist/useKeyboardNav-CCUoRMgm.cjs +0 -2
  535. package/dist/useKeyboardNav-CCUoRMgm.cjs.map +0 -1
  536. package/dist/useKeyboardNav-iEXOdEMB.js +0 -43
  537. package/dist/useKeyboardNav-iEXOdEMB.js.map +0 -1
  538. package/dist/useModalLayer-Bf4TcEz-.js +0 -58
  539. package/dist/useModalLayer-Bf4TcEz-.js.map +0 -1
  540. package/dist/useModalLayer-DxYhhgRO.cjs +0 -2
  541. package/dist/useModalLayer-DxYhhgRO.cjs.map +0 -1
  542. package/dist/utils/proActivationWarning.d.ts +0 -7
  543. package/dist/validators-B6yWdsu2.cjs +0 -2
  544. package/dist/validators-B6yWdsu2.cjs.map +0 -1
  545. package/dist/validators-DVYOtFnw.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-qnR8OBmj.js","names":[],"sources":["../src/components/data/MDataTable/MDataTable.tsx","../src/components/data/MTaskList/MTaskList.tsx","../src/components/data/MWeekGrid/MWeekGrid.tsx","../src/components/data/useMTable.ts","../src/components/data/useMCardGrid.ts"],"sourcesContent":["import {useCallback, useId, useMemo, useRef, useState} from 'react'\nimport type * as React from 'react'\nimport type {MDataTableProps, MDataTableSort} from './MDataTable.types'\nimport {MButton, MCheckbox} from '../../controls'\nimport {MInputSearch} from '../../inputs'\nimport {MPagination} from '../../layout'\nimport {MPopover} from '../../primitives'\nimport {MLoader} from '../../feedback'\nimport {MArrowDownIcon, MArrowUpDownIcon, MArrowUpIcon, MFilterIcon, MSortIcon} from '../../../icons'\nimport {cn} from '../../../utils/cn'\nimport {formatMText, useMCommonTexts, useMDataTableTexts, useMDataViewTexts} from '../../../i18n/frameworkTexts'\nimport './MDataTable.css'\n\nfunction getRowKey<T>(row: T, index: number, rowKey?: string | ((row: T, index: number) => string)): string {\n if (typeof rowKey === 'function') return rowKey(row, index)\n if (typeof rowKey === 'string') return String((row as any)[rowKey])\n return String((row as any).id ?? index)\n}\n\nfunction getNestedValue(obj: unknown, key: string): unknown {\n const parts = key.split('.')\n let val: unknown = obj\n\n for (const p of parts) {\n if (val == null || typeof val !== 'object') return undefined\n val = (val as Record<string, unknown>)[p]\n }\n\n return val\n}\n\nexport function MDataTable<T = any>({\n columns,\n data,\n rowKey,\n sortable = false,\n filterable = false,\n selectable = false,\n pagination = false,\n pageSize = 10,\n striped = false,\n compact = false,\n stickyHeader = false,\n loading = false,\n loadingLabel,\n scrollOffset,\n sort: controlledSort,\n onSortChange,\n search: controlledSearch,\n onSearchChange,\n searchKeys,\n filterKeys = [],\n filters: controlledFilters,\n onFiltersChange,\n sortKeys = [],\n page: controlledPage,\n onPageChange,\n total,\n manualSearch = false,\n manualFilters = false,\n manualSort = false,\n manualPagination = false,\n selectedKeys: controlledSelected,\n onSelectionChange,\n emptyText,\n filterPlaceholder,\n className,\n style,\n ...rest\n}: MDataTableProps<T>) {\n const commonTexts = useMCommonTexts()\n const viewTexts = useMDataViewTexts()\n const tableTexts = useMDataTableTexts()\n const [internalSort, setInternalSort] = useState<MDataTableSort | null>(null)\n const [internalSelected, setInternalSelected] = useState<string[]>([])\n const [internalSearch, setInternalSearch] = useState('')\n const [internalFilters, setInternalFilters] = useState<Record<string, string[]>>({})\n const [internalPage, setInternalPage] = useState(1)\n const [filterOpen, setFilterOpen] = useState(false)\n const [sortOpen, setSortOpen] = useState(false)\n const filterBtnRef = useRef<HTMLElement>(null)\n const sortBtnRef = useRef<HTMLElement>(null)\n const toolbarId = useId()\n const filterPopoverId = `${toolbarId}-filter`\n const sortPopoverId = `${toolbarId}-sort`\n\n const activeSort = controlledSort !== undefined ? controlledSort : internalSort\n const search = controlledSearch !== undefined ? controlledSearch : internalSearch\n const filters = controlledFilters !== undefined ? controlledFilters : internalFilters\n const page = controlledPage !== undefined ? controlledPage : internalPage\n const selected = controlledSelected ?? internalSelected\n const setSelected = onSelectionChange ?? setInternalSelected\n\n const setSearch = useCallback(\n (next: string) => {\n if (controlledSearch === undefined) setInternalSearch(next)\n if (!manualPagination && controlledPage === undefined) setInternalPage(1)\n onSearchChange?.(next)\n },\n [controlledSearch, controlledPage, manualPagination, onSearchChange]\n )\n\n const setFilters = useCallback(\n (next: Record<string, string[]>) => {\n if (controlledFilters === undefined) setInternalFilters(next)\n if (!manualPagination && controlledPage === undefined) setInternalPage(1)\n onFiltersChange?.(next)\n },\n [controlledFilters, controlledPage, manualPagination, onFiltersChange]\n )\n\n const setSort = useCallback(\n (next: MDataTableSort | null) => {\n if (controlledSort === undefined) setInternalSort(next)\n if (!manualPagination && controlledPage === undefined) setInternalPage(1)\n onSortChange?.(next)\n },\n [controlledSort, controlledPage, manualPagination, onSortChange]\n )\n\n const rootRef = useRef<HTMLDivElement>(null)\n\n const setPage = useCallback(\n (next: number) => {\n if (controlledPage === undefined) setInternalPage(next)\n onPageChange?.(next)\n // After page change, bring the top of the table back into view so\n // the user does not stay scrolled deep into the previous page's rows.\n rootRef.current?.scrollIntoView({block: 'start', behavior: 'smooth'})\n },\n [controlledPage, onPageChange]\n )\n\n function handleSort(key: string) {\n let next: MDataTableSort | null\n\n if (activeSort?.key === key) {\n next = activeSort.dir === 'asc' ? {key, dir: 'desc'} : null\n } else {\n next = {key, dir: 'asc'}\n }\n\n setSort(next)\n }\n\n function toggleFilterValue(key: string, value: string) {\n const current = filters[key] ?? []\n const next = current.includes(value) ? current.filter((item) => item !== value) : [...current, value]\n setFilters({...filters, [key]: next})\n }\n\n const filterOptions = useMemo(() => {\n const map: Record<string, string[]> = {}\n\n for (const filterKey of filterKeys) {\n if (filterKey.options) {\n map[filterKey.key] = filterKey.options\n continue\n }\n\n const values = new Set<string>()\n\n for (const row of data) {\n const value = getNestedValue(row, filterKey.key)\n if (value != null) values.add(String(value))\n }\n\n map[filterKey.key] = Array.from(values).sort()\n }\n\n return map\n }, [data, filterKeys])\n\n const filtered = useMemo(() => {\n let result: T[] = data\n\n if (!manualSearch && filterable && search.trim()) {\n const query = search.toLowerCase()\n\n if (searchKeys && searchKeys.length > 0) {\n result = result.filter((row) =>\n searchKeys.some((key) => {\n const value = getNestedValue(row, key)\n return value != null && String(value).toLowerCase().includes(query)\n })\n )\n } else {\n result = result.filter((row) =>\n columns.some((col) => {\n if (col.filterable === false) return false\n const value = (row as any)[col.key]\n return value != null && String(value).toLowerCase().includes(query)\n })\n )\n }\n }\n\n if (!manualFilters) {\n for (const [key, selectedValues] of Object.entries(filters)) {\n if (!selectedValues || selectedValues.length === 0) continue\n\n result = result.filter((row) => {\n const value = getNestedValue(row, key)\n return value != null && selectedValues.includes(String(value))\n })\n }\n }\n\n return result\n }, [data, manualSearch, manualFilters, filterable, search, searchKeys, columns, filters])\n\n const sorted = useMemo(() => {\n if (manualSort || !activeSort) return filtered\n\n const col = columns.find((item) => item.key === activeSort.key)\n const sortKeyAllowed = sortKeys.some((item) => item.key === activeSort.key)\n if (!col?.sortable && !sortable && !sortKeyAllowed) return filtered\n\n const dir = activeSort.dir === 'asc' ? 1 : -1\n\n return [...filtered].sort((a, b) => {\n const va = (a as any)[activeSort.key]\n const vb = (b as any)[activeSort.key]\n\n if (va == null && vb == null) return 0\n if (va == null) return 1\n if (vb == null) return -1\n if (typeof va === 'number' && typeof vb === 'number') return (va - vb) * dir\n\n return String(va).localeCompare(String(vb)) * dir\n })\n }, [filtered, activeSort, columns, sortable, sortKeys, manualSort])\n\n const totalItems = manualPagination ? (total ?? sorted.length) : sorted.length\n const totalPages = pagination ? Math.max(1, Math.ceil(totalItems / pageSize)) : 1\n const pageData = useMemo(() => {\n if (!pagination || manualPagination) return sorted\n const start = (page - 1) * pageSize\n return sorted.slice(start, start + pageSize)\n }, [sorted, pagination, manualPagination, page, pageSize])\n\n const allKeys = pageData.map((row, index) => getRowKey(row, (page - 1) * pageSize + index, rowKey))\n const allSelected = allKeys.length > 0 && allKeys.every((key) => selected.includes(key))\n\n function toggleAll() {\n if (allSelected) {\n setSelected(selected.filter((key) => !allKeys.includes(key)))\n } else {\n setSelected([...new Set([...selected, ...allKeys])])\n }\n }\n\n function toggleRow(key: string) {\n setSelected(selected.includes(key) ? selected.filter((item) => item !== key) : [...selected, key])\n }\n\n function handleRowClick(key: string, event: React.MouseEvent) {\n const target = event.target as HTMLElement\n if (target.closest('button, a, [data-no-row-select]')) return\n toggleRow(key)\n }\n\n const openFilter = useCallback(() => {\n setFilterOpen((v) => !v)\n setSortOpen(false)\n }, [])\n\n const openSort = useCallback(() => {\n setSortOpen((v) => !v)\n setFilterOpen(false)\n }, [])\n\n const activeSortMenuItem = sortKeys.find((item) => item.key === activeSort?.key)\n const showToolbar = filterable || filterKeys.length > 0 || sortKeys.length > 0\n\n return (\n <div\n ref={rootRef}\n className={cn('data-table', className)}\n style={scrollOffset !== undefined ? {scrollMarginTop: scrollOffset, ...style} : style}\n {...rest}\n >\n {showToolbar && (\n <div className=\"toolbar\">\n {filterable && (\n <MInputSearch\n className=\"filter-search\"\n size=\"sm\"\n fullWidth\n placeholder={filterPlaceholder ?? viewTexts.searchPlaceholder}\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n onClear={() => setSearch('')}\n />\n )}\n\n {(filterKeys.length > 0 || sortKeys.length > 0) && (\n <div className=\"toolbar-actions\">\n {filterKeys.length > 0 && (\n <>\n <MButton\n ref={filterBtnRef}\n variant=\"outlined\"\n size=\"sm\"\n startIcon={<MFilterIcon />}\n aria-haspopup=\"dialog\"\n aria-expanded={filterOpen}\n aria-controls={filterOpen ? filterPopoverId : undefined}\n onClick={openFilter}\n >\n {viewTexts.filter}\n </MButton>\n <MPopover\n open={filterOpen}\n anchorRef={filterBtnRef}\n onClose={() => setFilterOpen(false)}\n placement=\"bottom-end\"\n role=\"dialog\"\n id={filterPopoverId}\n aria-label={viewTexts.filter}\n initialFocus=\"first\"\n closeOnTabOut\n className=\"data-table-dropdown\"\n >\n {filterKeys.map((filterKey, groupIndex) => (\n <div\n key={filterKey.key}\n className=\"data-table-filter-group\"\n role=\"group\"\n aria-labelledby={`${filterPopoverId}-group-${groupIndex}`}\n >\n <span\n id={`${filterPopoverId}-group-${groupIndex}`}\n className=\"data-table-filter-label\"\n >\n {filterKey.label}\n </span>\n {(filterOptions[filterKey.key] ?? []).map((option) => (\n <div key={option} className=\"data-table-filter-option\">\n <MCheckbox\n size=\"sm\"\n clickEffect=\"none\"\n checked={filters[filterKey.key]?.includes(option) ?? false}\n onChange={() => toggleFilterValue(filterKey.key, option)}\n label={option}\n />\n </div>\n ))}\n </div>\n ))}\n </MPopover>\n </>\n )}\n\n {sortKeys.length > 0 && (\n <>\n <MButton\n ref={sortBtnRef}\n variant=\"outlined\"\n size=\"sm\"\n startIcon={\n activeSort ? (\n activeSort.dir === 'asc' ? (\n <MArrowUpIcon />\n ) : (\n <MArrowDownIcon />\n )\n ) : (\n <MSortIcon />\n )\n }\n aria-haspopup=\"dialog\"\n aria-expanded={sortOpen}\n aria-controls={sortOpen ? sortPopoverId : undefined}\n onClick={openSort}\n >\n {activeSortMenuItem\n ? formatMText(viewTexts.sortBy, {label: activeSortMenuItem.label})\n : viewTexts.sort}\n {activeSortMenuItem && activeSort && (\n <span className=\"data-table-sr-only\">\n {', '}\n {activeSort.dir === 'asc'\n ? viewTexts.sortAscending\n : viewTexts.sortDescending}\n </span>\n )}\n </MButton>\n <MPopover\n open={sortOpen}\n anchorRef={sortBtnRef}\n onClose={() => setSortOpen(false)}\n placement=\"bottom-end\"\n role=\"dialog\"\n id={sortPopoverId}\n aria-label={viewTexts.sort}\n initialFocus=\"first\"\n closeOnTabOut\n className=\"data-table-dropdown\"\n >\n {sortKeys.map((sortItem) => (\n <button\n key={sortItem.key}\n type=\"button\"\n className={cn(\n 'data-table-sort-item',\n activeSort?.key === sortItem.key && 'active'\n )}\n aria-pressed={activeSort?.key === sortItem.key}\n onClick={() => {\n if (activeSort?.key === sortItem.key) {\n setSort({\n key: sortItem.key,\n dir: activeSort.dir === 'asc' ? 'desc' : 'asc',\n })\n } else {\n setSort({key: sortItem.key, dir: 'asc'})\n }\n }}\n >\n {sortItem.label}\n {activeSort?.key === sortItem.key && (\n <span className=\"data-table-sort-dir\">\n {activeSort.dir === 'asc' ? (\n <MArrowUpIcon className=\"data-table-sort-icon\" />\n ) : (\n <MArrowDownIcon className=\"data-table-sort-icon\" />\n )}\n <span className=\"data-table-sr-only\">\n {', '}\n {activeSort.dir === 'asc'\n ? viewTexts.sortAscending\n : viewTexts.sortDescending}\n </span>\n </span>\n )}\n </button>\n ))}\n </MPopover>\n </>\n )}\n </div>\n )}\n </div>\n )}\n <div className={cn('data-table-body', loading && 'loading')}>\n <div className=\"scroll\" aria-busy={loading || undefined}>\n <table className={cn('root', striped && 'striped', compact && 'compact')}>\n <thead className={cn('head', stickyHeader && 'sticky')}>\n <tr>\n {selectable && (\n <th className=\"th check-col\" scope=\"col\">\n <MCheckbox\n checked={allSelected}\n onChange={toggleAll}\n size=\"sm\"\n clickEffect=\"none\"\n label={\n <span className=\"data-table-sr-only\">{tableTexts.selectAllRows}</span>\n }\n />\n </th>\n )}\n {columns.map((col) => {\n const isSortable = col.sortable ?? sortable\n const isSorted = activeSort?.key === col.key\n\n return (\n <th\n key={col.key}\n scope=\"col\"\n aria-sort={\n isSorted\n ? activeSort!.dir === 'asc'\n ? 'ascending'\n : 'descending'\n : undefined\n }\n className={cn(\n 'th',\n isSortable && 'sortable',\n isSorted && `sorted-${activeSort!.dir}`\n )}\n style={{\n width: col.width,\n textAlign: col.align,\n }}\n onClick={isSortable ? () => handleSort(col.key) : undefined}\n >\n {isSortable ? (\n // The header cell owns the click (so its padding sorts too);\n // the button makes the header reachable and operable by keyboard.\n <button type=\"button\" className=\"th-sort-button\">\n <span className=\"th-content\">\n {col.label}\n <span className=\"sort-icon\">\n {isSorted ? (\n activeSort!.dir === 'asc' ? (\n <MArrowUpIcon aria-hidden=\"true\" />\n ) : (\n <MArrowDownIcon aria-hidden=\"true\" />\n )\n ) : (\n <MArrowUpDownIcon aria-hidden=\"true\" />\n )}\n </span>\n </span>\n </button>\n ) : (\n <span className=\"th-content\">{col.label}</span>\n )}\n </th>\n )\n })}\n </tr>\n </thead>\n <tbody>\n {pageData.length === 0 && (\n <tr>\n <td className=\"empty\" colSpan={columns.length + (selectable ? 1 : 0)}>\n {emptyText ?? tableTexts.empty}\n </td>\n </tr>\n )}\n {pageData.map((row, index) => {\n const key = getRowKey(row, (page - 1) * pageSize + index, rowKey)\n const isSelected = selected.includes(key)\n\n return (\n <tr\n key={key}\n className={cn('row', isSelected && 'selected', selectable && 'selectable')}\n onClick={selectable ? (event) => handleRowClick(key, event) : undefined}\n >\n {selectable && (\n <td className=\"td check-col\">\n <MCheckbox\n checked={isSelected}\n onChange={() => {}}\n size=\"sm\"\n clickEffect=\"none\"\n label={\n <span className=\"data-table-sr-only\">\n {formatMText(tableTexts.selectRow, {\n index: (page - 1) * pageSize + index + 1,\n })}\n </span>\n }\n />\n </td>\n )}\n {columns.map((col) => (\n <td key={col.key} className=\"td\" style={{textAlign: col.align}}>\n {col.render\n ? col.render(\n (row as any)[col.key],\n row,\n (page - 1) * pageSize + index\n )\n : (row as any)[col.key]}\n </td>\n ))}\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n {loading && (\n <div className=\"data-table-loading\">\n <MLoader center={false} minHeight=\"auto\" label={loadingLabel ?? commonTexts.loading} />\n </div>\n )}\n </div>\n {pagination && totalPages > 1 && (\n <MPagination total={totalItems} page={page} pageSize={pageSize} onChange={setPage} />\n )}\n </div>\n )\n}\n","import type {MTaskListProps} from './MTaskList.types'\nimport {MCheckbox} from '../../controls'\nimport {cn} from '../../../utils/cn'\nimport './MTaskList.css'\n\n// Render an interactive checklist with toggleable task items.\nexport function MTaskList({\n items,\n color = 'primary',\n size = 'md',\n strikethrough = true,\n onChange,\n className,\n ...rest\n}: MTaskListProps) {\n return (\n <div className={cn('task list', `color-${color}`, `size-${size}`, className)} role=\"list\" {...rest}>\n {items.map((item) => (\n <div\n key={item.id}\n className={cn('task item', item.checked && 'checked', item.disabled && 'disabled')}\n role=\"listitem\"\n onClick={(event) => {\n if (item.disabled) return\n if ((event.target as HTMLElement).closest('.checkbox')) return\n onChange?.(item.id, !(item.checked ?? false))\n }}\n >\n <MCheckbox\n className=\"task control\"\n checked={item.checked ?? false}\n color={color}\n size={size}\n disabled={item.disabled}\n onChange={(e) => onChange?.(item.id, e.target.checked)}\n clickEffect=\"ripple\"\n />\n <span className={cn('task label', item.checked && strikethrough && 'done')}>{item.label}</span>\n </div>\n ))}\n </div>\n )\n}\n","import {Fragment, useId, useMemo, useRef, useState, type CSSProperties, type KeyboardEvent, type ReactNode} from 'react'\n\nimport {MStack} from '../../layout'\nimport {MTooltip} from '../../overlays'\nimport {MHeading, MSubText, MText} from '../../typography'\nimport {cn} from '../../../utils/cn'\nimport {formatMText, useMWeekGridTexts} from '../../../i18n/frameworkTexts'\nimport {isRtlElement} from '../../../utils/radioGroupKeys'\n\nimport type {MWeekGridBand, MWeekGridCell, MWeekGridCellContext, MWeekGridProps} from './MWeekGrid.types'\n\nimport './MWeekGrid.css'\n\nconst DEFAULT_DAYS = 7\nconst DEFAULT_SLOTS = 24\n\nconst ALL_BANDS: MWeekGridBand[] = [0, 1, 2, 3]\n\n// Largest integer max for which the reachable bands are enumerated value by value.\nconst ENUMERABLE_MAX = 100\n\nfunction densityBand(value: number, max: number): MWeekGridBand {\n if (max <= 0 || value <= 0) return 0\n const ratio = value / max\n if (ratio >= 0.66) return 3\n if (ratio >= 0.33) return 2\n return 1\n}\n\n/**\n * Bands a cell can actually land in. On an integer grid only `1..max` can occur,\n * so e.g. `max = 1` (on/off data) reaches bands 0 and 3 only. Fractional data\n * or a large max can hit every band.\n */\nfunction reachableBands(grid: number[][], max: number): MWeekGridBand[] {\n if (max <= 0) return [0]\n const integral = Number.isInteger(max) && grid.every((row) => row.every((value) => Number.isInteger(value)))\n if (!integral || max > ENUMERABLE_MAX) return ALL_BANDS\n const bands = new Set<MWeekGridBand>([0])\n for (let value = 1; value <= max; value += 1) bands.add(densityBand(value, max))\n return ALL_BANDS.filter((band) => bands.has(band))\n}\n\nfunction buildGrid(data: MWeekGridProps['data'], days: number, slots: number): number[][] {\n const grid: number[][] = Array.from({length: days}, () => Array.from({length: slots}, () => 0))\n\n if (Array.isArray(data) && data.length > 0 && Array.isArray(data[0])) {\n const matrix = data as number[][]\n for (let day = 0; day < Math.min(days, matrix.length); day += 1) {\n const row = matrix[day]\n if (!row) continue\n for (let slot = 0; slot < Math.min(slots, row.length); slot += 1) {\n grid[day][slot] = row[slot] ?? 0\n }\n }\n return grid\n }\n\n for (const cell of data as MWeekGridCell[]) {\n if (cell.day < 0 || cell.day >= days) continue\n if (cell.slot < 0 || cell.slot >= slots) continue\n grid[cell.day][cell.slot] = cell.value\n }\n return grid\n}\n\nfunction resolveMax(grid: number[][], max?: number): number {\n if (typeof max === 'number') return max\n let best = 0\n for (const row of grid) {\n for (const value of row) {\n if (value > best) best = value\n }\n }\n return best\n}\n\nfunction resolveDayLabels(\n days: number,\n weekStart: 0 | 1,\n defaultLabelsFromSunday: readonly string[],\n custom?: string[]\n): {label: string; calendarDay: number}[] {\n if (custom && custom.length >= days) {\n return Array.from({length: days}, (_, index) => ({label: custom[index], calendarDay: index}))\n }\n\n if (days === 7) {\n const order = weekStart === 1 ? [1, 2, 3, 4, 5, 6, 0] : [0, 1, 2, 3, 4, 5, 6]\n return order.map((calendarDay) => ({\n label: defaultLabelsFromSunday[calendarDay],\n calendarDay,\n }))\n }\n\n return Array.from({length: days}, (_, index) => ({\n label: String(index + 1),\n calendarDay: index,\n }))\n}\n\nfunction resolveSlotLabels(slots: number, custom?: string[]): string[] {\n if (custom && custom.length >= slots) return custom.slice(0, slots)\n if (slots === 24) {\n return Array.from({length: 24}, (_, hour) => hour.toString().padStart(2, '0'))\n }\n return Array.from({length: slots}, (_, slot) => String(slot + 1))\n}\n\n/**\n * Next cell for an APG grid key, or `null` when the key does not move.\n * Rows and columns clamp at the edges (no wrapping), as in the APG data grid.\n */\nfunction gridKeyTarget(\n key: string,\n ctrl: boolean,\n row: number,\n col: number,\n rowCount: number,\n colCount: number,\n rtl: boolean\n): {row: number; col: number} | null {\n const lastRow = rowCount - 1\n const lastCol = colCount - 1\n switch (key) {\n case 'ArrowRight':\n return {row, col: rtl ? Math.max(col - 1, 0) : Math.min(col + 1, lastCol)}\n case 'ArrowLeft':\n return {row, col: rtl ? Math.min(col + 1, lastCol) : Math.max(col - 1, 0)}\n case 'ArrowDown':\n return {row: Math.min(row + 1, lastRow), col}\n case 'ArrowUp':\n return {row: Math.max(row - 1, 0), col}\n case 'Home':\n return ctrl ? {row: 0, col: 0} : {row, col: 0}\n case 'End':\n return ctrl ? {row: lastRow, col: lastCol} : {row, col: lastCol}\n case 'PageUp':\n return {row: 0, col}\n case 'PageDown':\n return {row: lastRow, col}\n default:\n return null\n }\n}\n\nfunction defaultRenderCell(ctx: MWeekGridCellContext): ReactNode {\n return ctx.value > 0 ? ctx.value : ''\n}\n\nfunction defaultRenderTooltip(ctx: MWeekGridCellContext, dayLabel: string, slotLabel: string): ReactNode {\n return `${dayLabel} ${slotLabel} — ${ctx.value}`\n}\n\n/**\n * Week-grid heatmap — rows = days, columns = hours (or any fixed slot range).\n * Cells colour-shade by density (four discrete bands) and accept tooltips,\n * custom renderers and click handlers. Common use cases: availability /\n * attendance maps, booking density, opening hours, peak-load views.\n */\nexport function MWeekGrid({\n data,\n max,\n days = DEFAULT_DAYS,\n slots = DEFAULT_SLOTS,\n dayLabels,\n slotLabels,\n weekStart = 1,\n color = 'warning',\n title,\n description,\n hint,\n peakLabel,\n renderCell,\n renderTooltip,\n onCellClick,\n showLegend = true,\n bandLabels,\n legendUnit,\n rowLabelWidth = 48,\n cellHeight = 24,\n cellMinWidth = 24,\n interactive,\n className,\n style,\n ...rest\n}: MWeekGridProps) {\n // Grid mode: one tab stop and APG grid arrow keys instead of a tab stop per cell.\n const gridMode = interactive ?? !!onCellClick\n const legacyButtons = !gridMode && !!onCellClick\n const [activeCell, setActiveCell] = useState({row: 0, col: 0})\n const matrixRef = useRef<HTMLDivElement>(null)\n const titleId = `${useId()}-title`\n const grid = useMemo(() => buildGrid(data, days, slots), [data, days, slots])\n const resolvedMax = useMemo(() => resolveMax(grid, max), [grid, max])\n const cols = useMemo(() => resolveSlotLabels(slots, slotLabels), [slots, slotLabels])\n const legendBands = useMemo(() => reachableBands(grid, resolvedMax), [grid, resolvedMax])\n const texts = useMWeekGridTexts()\n const rows = useMemo(\n () => resolveDayLabels(days, weekStart, texts.days, dayLabels),\n [days, weekStart, texts.days, dayLabels]\n )\n const resolvedBandLabels = bandLabels ?? texts.bands\n\n const matrixStyle: CSSProperties = {\n gridTemplateColumns: `${rowLabelWidth}px repeat(${slots}, minmax(${cellMinWidth}px, 1fr))`,\n }\n\n const wrapperStyle: CSSProperties = {\n ['--mineral-week-grid-color' as never]: `var(--mineral-${color})`,\n ...style,\n }\n\n const hasHeader = title != null || description != null || hint != null || peakLabel != null\n const rowCount = rows.length\n const colCount = cols.length\n const active = {\n row: Math.min(activeCell.row, Math.max(rowCount - 1, 0)),\n col: Math.min(activeCell.col, Math.max(colCount - 1, 0)),\n }\n const labelledByTitle = gridMode && typeof title === 'string' && !rest['aria-label'] && !rest['aria-labelledby']\n\n function focusCell(row: number, col: number) {\n setActiveCell({row, col})\n matrixRef.current?.querySelector<HTMLElement>(`[data-week-grid-cell=\"${row}-${col}\"]`)?.focus()\n }\n\n function handleGridKeyDown(\n event: KeyboardEvent<HTMLDivElement>,\n row: number,\n col: number,\n ctx: MWeekGridCellContext\n ) {\n if (event.key === 'Enter' || event.key === ' ') {\n if (!onCellClick) return\n event.preventDefault()\n onCellClick(ctx)\n return\n }\n const rtl = isRtlElement(matrixRef.current)\n const target = gridKeyTarget(event.key, event.ctrlKey || event.metaKey, row, col, rowCount, colCount, rtl)\n if (!target) return\n event.preventDefault()\n focusCell(target.row, target.col)\n }\n\n return (\n <div className={cn('mineral-week-grid', className)} style={wrapperStyle} {...rest}>\n {hasHeader && (\n <MStack spacing={'xs'}>\n <div className={'mineral-week-grid__title-row'}>\n <div className={'mineral-week-grid__title-text'}>\n {title != null &&\n (typeof title === 'string' ? (\n <MHeading level={5} id={labelledByTitle ? titleId : undefined}>\n {title}\n </MHeading>\n ) : (\n title\n ))}\n {description != null &&\n (typeof description === 'string' ? (\n <MSubText tone={'muted'}>{description}</MSubText>\n ) : (\n description\n ))}\n </div>\n {peakLabel != null && (\n <MText size={'sm'} tone={'muted'}>\n {peakLabel}\n </MText>\n )}\n </div>\n {hint != null && (\n <MSubText size={'xs'} tone={'muted'}>\n {hint}\n </MSubText>\n )}\n </MStack>\n )}\n\n <div\n ref={matrixRef}\n className={cn('mineral-week-grid__matrix', gridMode && 'mineral-week-grid__matrix--grid')}\n style={matrixStyle}\n role={gridMode ? 'grid' : undefined}\n aria-labelledby={labelledByTitle ? titleId : undefined}\n >\n <GridRow enabled={gridMode}>\n <div role={gridMode ? 'columnheader' : undefined} />\n {cols.map((label, slot) => (\n <div\n key={`col-${slot}`}\n className={'mineral-week-grid__col-header'}\n role={gridMode ? 'columnheader' : undefined}\n >\n <MSubText size={'xs'} tone={'muted'}>\n {label}\n </MSubText>\n </div>\n ))}\n </GridRow>\n\n {rows.map(({label: dayLabel, calendarDay}, rowIndex) => (\n <GridRow enabled={gridMode} key={`row-${rowIndex}-${calendarDay}`}>\n <div className={'mineral-week-grid__row-label'} role={gridMode ? 'rowheader' : undefined}>\n <MSubText size={'xs'} tone={'muted'}>\n {dayLabel}\n </MSubText>\n </div>\n {cols.map((slotLabel, slot) => {\n const value = grid[calendarDay]?.[slot] ?? 0\n const band = densityBand(value, resolvedMax)\n const ctx: MWeekGridCellContext = {day: calendarDay, slot, value, band}\n const cellContent = renderCell ? renderCell(ctx) : defaultRenderCell(ctx)\n const tooltipContent = renderTooltip\n ? renderTooltip(ctx)\n : defaultRenderTooltip(ctx, dayLabel, slotLabel)\n\n const cellClasses = cn(\n 'mineral-week-grid__cell',\n `mineral-week-grid__cell--band-${band}`,\n onCellClick && 'mineral-week-grid__cell--interactive',\n !onCellClick && tooltipContent != null && 'mineral-week-grid__cell--tooltip',\n gridMode && 'mineral-week-grid__cell--grid'\n )\n const isActive = active.row === rowIndex && active.col === slot\n\n const handleKeyDown = gridMode\n ? (event: KeyboardEvent<HTMLDivElement>) =>\n handleGridKeyDown(event, rowIndex, slot, ctx)\n : onCellClick\n ? (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key !== 'Enter' && event.key !== ' ') return\n event.preventDefault()\n onCellClick(ctx)\n }\n : undefined\n\n const cellNode = (\n <div\n className={cellClasses}\n style={{height: cellHeight}}\n onClick={onCellClick ? () => onCellClick(ctx) : undefined}\n onKeyDown={handleKeyDown}\n onFocus={gridMode ? () => setActiveCell({row: rowIndex, col: slot}) : undefined}\n data-week-grid-cell={gridMode ? `${rowIndex}-${slot}` : undefined}\n role={gridMode ? 'gridcell' : legacyButtons ? 'button' : undefined}\n tabIndex={gridMode ? (isActive ? 0 : -1) : legacyButtons ? 0 : undefined}\n aria-label={\n gridMode || legacyButtons\n ? formatMText(texts.cellLabel, {day: dayLabel, slot: slotLabel, value})\n : undefined\n }\n >\n {cellContent}\n </div>\n )\n\n if (tooltipContent == null) {\n return <Fragment key={`cell-${rowIndex}-${slot}`}>{cellNode}</Fragment>\n }\n\n return (\n <MTooltip key={`cell-${rowIndex}-${slot}`} content={tooltipContent}>\n {cellNode}\n </MTooltip>\n )\n })}\n </GridRow>\n ))}\n </div>\n\n {showLegend && (\n <div className={'mineral-week-grid__legend'}>\n <MSubText size={'xs'} tone={'muted'}>\n {formatMText(texts.scale, {\n min: 0,\n max: resolvedMax,\n unit: legendUnit ? ` ${legendUnit}` : '',\n })}\n </MSubText>\n <div className={'mineral-week-grid__legend-bands'}>\n {legendBands.map((band) => (\n <div key={`legend-${band}`} className={'mineral-week-grid__legend-band'}>\n <span\n className={cn(\n 'mineral-week-grid__legend-swatch',\n `mineral-week-grid__cell--band-${band}`\n )}\n />\n <MSubText size={'xs'} tone={'muted'}>\n {resolvedBandLabels[band]}\n </MSubText>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n}\n\n/** A `role=\"row\"` wrapper in grid mode (`display: contents`, so the CSS grid is untouched). */\nfunction GridRow({enabled, children}: {enabled: boolean; children: ReactNode}) {\n if (!enabled) return <>{children}</>\n return (\n <div role={'row'} className={'mineral-week-grid__row'}>\n {children}\n </div>\n )\n}\n","import {useCallback, useEffect, useMemo, useRef, useState} from 'react'\n\nimport type {MDataTableSort} from './MDataTable'\n\n/**\n * Generic query shape that backend lists can satisfy. Drop-in adapter between\n * `useMTable` and the API call. The framework does not assume axios/fetch/swr —\n * the consumer plugs whatever fetcher they want.\n */\nexport interface MTableQuery {\n page?: number\n perPage?: number\n search?: string\n filters?: Record<string, string[]>\n sort?: MDataTableSort | null\n}\n\n/**\n * Standard list response. Mirrors the most common server convention\n * (data + meta with pagination total). Adapt your fetcher to this shape if your\n * backend uses different envelope keys.\n */\nexport interface MTableResponse<T> {\n data: T[]\n meta: {\n total: number\n page: number\n perPage: number\n totalPages: number\n }\n}\n\nexport type MTableFetcher<T> = (query: MTableQuery, signal?: AbortSignal) => Promise<MTableResponse<T>>\n\nexport interface MTableOptions {\n perPage?: number\n initialPage?: number\n initialSearch?: string\n initialFilters?: Record<string, string[]>\n initialSort?: MDataTableSort | null\n /** Bump to force a refetch (e.g. after a mutation invalidates the list). */\n invalidationKey?: number | string\n}\n\nexport interface MTableProps<T> {\n data: T[]\n total: number\n page: number\n onPageChange: (page: number) => void\n sort: MDataTableSort | null\n onSortChange: (sort: MDataTableSort | null) => void\n search: string\n onSearchChange: (search: string) => void\n filters: Record<string, string[]>\n onFiltersChange: (filters: Record<string, string[]>) => void\n manualSearch: true\n manualFilters: true\n manualSort: true\n manualPagination: true\n pageSize: number\n /** Mirrors `isLoading`; drives `MDataTable`'s loading scrim when `tableProps` is spread. */\n loading: boolean\n}\n\nexport interface MTableHandle<T> {\n /** Spread directly onto `<MDataTable>` — wires up all manual* + state props. */\n tableProps: MTableProps<T>\n isLoading: boolean\n error: Error | null\n /** Trigger a fresh fetch with current query. */\n refetch: () => void\n}\n\n/**\n * Adapter hook that bridges a fetcher returning `MTableResponse<T>` with\n * `MDataTable` in manual mode. Owns the search / filters / sort / page state,\n * debounces nothing on its own (fetcher decides), and aborts in-flight\n * requests when the query changes. Spread `tableProps` onto your table.\n */\nexport function useMTable<T>(fetcher: MTableFetcher<T>, options: MTableOptions = {}): MTableHandle<T> {\n const {\n perPage = 20,\n initialPage = 1,\n initialSearch = '',\n initialFilters,\n initialSort = null,\n invalidationKey,\n } = options\n\n const [data, setData] = useState<T[]>([])\n const [total, setTotal] = useState(0)\n const [page, setPage] = useState(initialPage)\n const [search, setSearch] = useState(initialSearch)\n const [filters, setFilters] = useState<Record<string, string[]>>(initialFilters ?? {})\n const [sort, setSort] = useState<MDataTableSort | null>(initialSort)\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n const [bump, setBump] = useState(0)\n\n const fetcherRef = useRef(fetcher)\n fetcherRef.current = fetcher\n\n const query = useMemo<MTableQuery>(\n () => ({page, perPage, search, filters, sort}),\n [page, perPage, search, filters, sort]\n )\n\n useEffect(() => {\n const controller = typeof AbortController !== 'undefined' ? new AbortController() : undefined\n let cancelled = false\n setIsLoading(true)\n setError(null)\n fetcherRef\n .current(query, controller?.signal)\n .then((response) => {\n if (cancelled) return\n setData(response.data)\n setTotal(response.meta.total)\n })\n .catch((err: unknown) => {\n if (cancelled) return\n if (err instanceof Error && err.name === 'AbortError') return\n setError(err instanceof Error ? err : new Error(String(err)))\n })\n .finally(() => {\n if (!cancelled) setIsLoading(false)\n })\n return () => {\n cancelled = true\n controller?.abort()\n }\n }, [query, invalidationKey, bump])\n\n // Reset to page 1 when search/filters/sort change.\n const handleSearchChange = useCallback((next: string) => {\n setSearch(next)\n setPage(1)\n }, [])\n const handleFiltersChange = useCallback((next: Record<string, string[]>) => {\n setFilters(next)\n setPage(1)\n }, [])\n const handleSortChange = useCallback((next: MDataTableSort | null) => {\n setSort(next)\n setPage(1)\n }, [])\n\n const refetch = useCallback(() => setBump((value) => value + 1), [])\n\n const tableProps: MTableProps<T> = {\n data,\n total,\n page,\n onPageChange: setPage,\n sort,\n onSortChange: handleSortChange,\n search,\n onSearchChange: handleSearchChange,\n filters,\n onFiltersChange: handleFiltersChange,\n manualSearch: true,\n manualFilters: true,\n manualSort: true,\n manualPagination: true,\n pageSize: perPage,\n loading: isLoading,\n }\n\n return {tableProps, isLoading, error, refetch}\n}\n","import {useCallback, useEffect, useMemo, useRef, useState} from 'react'\n\nimport type {MCardGridSort} from '../cards/MCardGrid'\nimport type {MTableQuery, MTableResponse, MTableFetcher, MTableOptions} from './useMTable'\n\n/**\n * Card-grid analog of `useMTable`. Same fetcher-agnostic pattern; returns props\n * spreadable onto `<MCardGrid>` in manual mode. Note that `MCardGridSort` uses\n * `direction` (vs `MDataTableSort.dir`) — convert if you reuse a fetcher.\n */\nexport interface MCardGridProps<T> {\n items: T[]\n total: number\n page: number\n onPageChange: (page: number) => void\n sort: MCardGridSort<T> | null\n onSortChange: (sort: MCardGridSort<T> | null) => void\n search: string\n onSearchChange: (search: string) => void\n filters: Record<string, string[]>\n onFiltersChange: (filters: Record<string, string[]>) => void\n manualSearch: true\n manualFilters: true\n manualSort: true\n manualPagination: true\n pageSize: number\n /** Mirrors `isLoading`; drives `MCardGrid`'s loading scrim when `gridProps` is spread. */\n loading: boolean\n}\n\nexport interface MCardGridHandle<T> {\n /** Spread directly onto `<MCardGrid>`. */\n gridProps: MCardGridProps<T>\n isLoading: boolean\n error: Error | null\n refetch: () => void\n}\n\nfunction toTableSort<T>(sort: MCardGridSort<T> | null): MTableQuery['sort'] {\n if (!sort) return null\n return {key: sort.key, dir: sort.direction}\n}\n\n/**\n * Adapter hook for `MCardGrid` in manual mode. Owns search / filters / sort /\n * page state, calls a generic `MTableFetcher`, returns `gridProps` to spread.\n */\nexport function useMCardGrid<T>(fetcher: MTableFetcher<T>, options: MTableOptions = {}): MCardGridHandle<T> {\n const {\n perPage = 12,\n initialPage = 1,\n initialSearch = '',\n initialFilters,\n initialSort = null,\n invalidationKey,\n } = options\n\n const [items, setItems] = useState<T[]>([])\n const [total, setTotal] = useState(0)\n const [page, setPage] = useState(initialPage)\n const [search, setSearch] = useState(initialSearch)\n const [filters, setFilters] = useState<Record<string, string[]>>(initialFilters ?? {})\n const [sort, setSort] = useState<MCardGridSort<T> | null>(\n (initialSort as MCardGridSort<T> | null | undefined) ?? null\n )\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n const [bump, setBump] = useState(0)\n\n const fetcherRef = useRef(fetcher)\n fetcherRef.current = fetcher\n\n const query = useMemo<MTableQuery>(\n () => ({page, perPage, search, filters, sort: toTableSort(sort)}),\n [page, perPage, search, filters, sort]\n )\n\n useEffect(() => {\n const controller = typeof AbortController !== 'undefined' ? new AbortController() : undefined\n let cancelled = false\n setIsLoading(true)\n setError(null)\n fetcherRef\n .current(query, controller?.signal)\n .then((response: MTableResponse<T>) => {\n if (cancelled) return\n setItems(response.data)\n setTotal(response.meta.total)\n })\n .catch((err: unknown) => {\n if (cancelled) return\n if (err instanceof Error && err.name === 'AbortError') return\n setError(err instanceof Error ? err : new Error(String(err)))\n })\n .finally(() => {\n if (!cancelled) setIsLoading(false)\n })\n return () => {\n cancelled = true\n controller?.abort()\n }\n }, [query, invalidationKey, bump])\n\n const handleSearchChange = useCallback((next: string) => {\n setSearch(next)\n setPage(1)\n }, [])\n const handleFiltersChange = useCallback((next: Record<string, string[]>) => {\n setFilters(next)\n setPage(1)\n }, [])\n const handleSortChange = useCallback((next: MCardGridSort<T> | null) => {\n setSort(next)\n setPage(1)\n }, [])\n\n const refetch = useCallback(() => setBump((value) => value + 1), [])\n\n const gridProps: MCardGridProps<T> = {\n items,\n total,\n page,\n onPageChange: setPage,\n sort,\n onSortChange: handleSortChange,\n search,\n onSearchChange: handleSearchChange,\n filters,\n onFiltersChange: handleFiltersChange,\n manualSearch: true,\n manualFilters: true,\n manualSort: true,\n manualPagination: true,\n pageSize: perPage,\n loading: isLoading,\n }\n\n return {gridProps, isLoading, error, refetch}\n}\n"],"mappings":"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"}
package/dist/data.cjs CHANGED
@@ -1,3 +1,3 @@
1
1
  const {ensureStyles}=require('./style-runtime.cjs')
2
2
  ensureStyles()
3
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./data-PS4ygCyj.cjs`),t=require(`./MTreeView-LiJ5o-zy.cjs`);exports.MDataTable=e.a,exports.MTaskList=e.i,exports.MTreeView=t.t,exports.MWeekGrid=e.r,exports.useMCardGrid=e.t,exports.useMTable=e.n;
3
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./data-BM3KG8oN.cjs`),t=require(`./MTreeView-BWCTlsU-.cjs`);exports.MDataTable=e.a,exports.MTaskList=e.i,exports.MTreeView=t.t,exports.MWeekGrid=e.r,exports.useMCardGrid=e.t,exports.useMTable=e.n;
package/dist/data.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import {ensureStyles} from './style-runtime.js'
2
2
  ensureStyles()
3
- import { a as e, i as t, n, r, t as i } from "./data-CdQximqm.js";
4
- import { t as a } from "./MTreeView-DsBnYQMT.js";
3
+ import { a as e, i as t, n, r, t as i } from "./data-qnR8OBmj.js";
4
+ import { t as a } from "./MTreeView-CWcMwE-Z.js";
5
5
  export { e as MDataTable, t as MTaskList, a as MTreeView, r as MWeekGrid, i as useMCardGrid, n as useMTable };
@@ -14,13 +14,12 @@ function r(e, t, n) {
14
14
  function i(e) {
15
15
  return new Date(e.getFullYear(), e.getMonth(), e.getDate());
16
16
  }
17
- function a(e, t) {
18
- let n = new Date(e);
19
- return n.setMonth(n.getMonth() + t), n;
17
+ function a(t, n) {
18
+ let r = new Date(t), i = r.getDate();
19
+ return r.setDate(1), r.setMonth(r.getMonth() + n), r.setDate(Math.min(i, e(r.getFullYear(), r.getMonth()))), r;
20
20
  }
21
21
  function o(e, t) {
22
- let n = new Date(e);
23
- return n.setFullYear(n.getFullYear() + t), n;
22
+ return a(e, t * 12);
24
23
  }
25
24
  var s = (e) => e.toString().padStart(2, "0");
26
25
  function c(e, t = "dd.MM.yyyy") {
@@ -104,4 +103,4 @@ function b(e, t = !1, n = !1) {
104
103
  //#endregion
105
104
  export { i as _, t as a, m as c, f as d, r as f, _ as g, p as h, e as i, v as l, l as m, o as n, c as o, n as p, y as r, b as s, a as t, d as u };
106
105
 
107
- //# sourceMappingURL=dateUtils-CUY6CRCf.js.map
106
+ //# sourceMappingURL=dateUtils-B-ToNZq_.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dateUtils-B-ToNZq_.js","names":[],"sources":["../src/utils/dateUtils.ts"],"sourcesContent":["// Return the number of days for a month in a given year.\nexport function daysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate()\n}\n\n// Return the first weekday index for the given month.\nexport function firstDayOfMonth(year: number, month: number): number {\n return new Date(year, month, 1).getDay()\n}\n\n// Compare two dates using only the calendar day.\nexport function isSameDay(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate()\n}\n\n// Check whether a date falls inside optional min and max boundaries.\nexport function isDateInRange(date: Date, min?: Date | null, max?: Date | null): boolean {\n return (!min || date >= stripTime(min)) && (!max || date <= stripTime(max))\n}\n\n// Drop the time portion to make date comparisons predictable.\nexport function stripTime(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate())\n}\n\n// Shift a date by a number of whole months, clamping the day to the target month length\n// (31 Jan + 1 month = 28/29 Feb, not 3 Mar). The time of day is preserved.\nexport function addMonths(date: Date, count: number): Date {\n const result = new Date(date)\n const day = result.getDate()\n result.setDate(1)\n result.setMonth(result.getMonth() + count)\n result.setDate(Math.min(day, daysInMonth(result.getFullYear(), result.getMonth())))\n return result\n}\n\n// Shift a date by a number of whole years, clamping 29 Feb to 28 Feb in non-leap years.\nexport function addYears(date: Date, count: number): Date {\n return addMonths(date, count * 12)\n}\n\n// Pad numeric date parts to two digits.\nconst pad = (n: number): string => n.toString().padStart(2, '0')\n\n// Format a date with a lightweight token format.\nexport function formatDate(date: Date, format: string = 'dd.MM.yyyy'): string {\n const day = pad(date.getDate())\n const month = pad(date.getMonth() + 1)\n const year = date.getFullYear().toString()\n\n return format.replace('dd', day).replace('MM', month).replace('yyyy', year)\n}\n\n// Parse a date string according to the provided lightweight token format.\nexport function parseDate(value: string, format: string = 'dd.MM.yyyy'): Date | null {\n const dayIdx = format.indexOf('dd')\n const monthIdx = format.indexOf('MM')\n const yearIdx = format.indexOf('yyyy')\n\n if (dayIdx === -1 || monthIdx === -1 || yearIdx === -1) return null\n\n const day = parseInt(value.slice(dayIdx, dayIdx + 2), 10)\n const month = parseInt(value.slice(monthIdx, monthIdx + 2), 10)\n const year = parseInt(value.slice(yearIdx, yearIdx + 4), 10)\n\n if (isNaN(day) || isNaN(month) || isNaN(year)) return null\n if (month < 1 || month > 12) return null\n if (day < 1 || day > daysInMonth(year, month - 1)) return null\n\n return new Date(year, month - 1, day)\n}\n\nfunction normalizeWeekdayLabel(label: string): string {\n return label.replace(/\\.$/u, '')\n}\n\n// Return localized short day names for calendar headers.\nexport function getDayNames(locale: string = 'en', firstDayOfWeek: 0 | 1 = 1): string[] {\n const formatter = new Intl.DateTimeFormat(locale, {weekday: 'short'})\n const sunday = new Date(Date.UTC(2021, 7, 1))\n const dayNames = Array.from({length: 7}, (_, index) => {\n const date = new Date(sunday)\n date.setUTCDate(sunday.getUTCDate() + index)\n return normalizeWeekdayLabel(formatter.format(date))\n })\n\n return firstDayOfWeek === 1 ? [...dayNames.slice(1), dayNames[0]] : dayNames\n}\n\n// Return localized month names for pickers and headers.\nexport function getMonthNames(locale: string = 'en'): string[] {\n const formatter = new Intl.DateTimeFormat(locale, {month: 'long'})\n\n return Array.from({length: 12}, (_, month) => formatter.format(new Date(Date.UTC(2021, month, 1))))\n}\n\n// Parse a time string into numeric hour, minute and second parts.\nexport function parseTime(value: string): {hours: number; minutes: number; seconds: number} | null {\n const parts = value.split(':')\n if (parts.length < 2) return null\n\n const hours = parseInt(parts[0], 10)\n const minutes = parseInt(parts[1], 10)\n const seconds = parts.length > 2 ? parseInt(parts[2], 10) : 0\n\n if (isNaN(hours) || isNaN(minutes) || isNaN(seconds)) return null\n if (hours < 0 || hours > 23 || minutes < 0 || minutes > 59 || seconds < 0 || seconds > 59) return null\n\n return {hours, minutes, seconds}\n}\n\n// Format time values with optional seconds output.\nexport function formatTime(hours: number, minutes: number, seconds?: number, showSeconds: boolean = false): string {\n const base = `${pad(hours)}:${pad(minutes)}`\n return showSeconds ? `${base}:${pad(seconds ?? 0)}` : base\n}\n\ntype Meridiem = 'AM' | 'PM'\n\nfunction to12HourParts(value: {hours: number; minutes: number; seconds: number}) {\n const meridiem: Meridiem = value.hours >= 12 ? 'PM' : 'AM'\n const hours = value.hours % 12 || 12\n return {hours, minutes: value.minutes, seconds: value.seconds, meridiem}\n}\n\nfunction to24HourValue(hours: number, meridiem: Meridiem): number {\n if (meridiem === 'AM') {\n return hours === 12 ? 0 : hours\n }\n\n return hours === 12 ? 12 : hours + 12\n}\n\n// Parse a time string in either 24h or 12h format.\nexport function parseTimeWithFormat(\n value: string,\n format: '24h' | '12h' = '24h'\n): {hours: number; minutes: number; seconds: number} | null {\n if (format === '24h') {\n return parseTime(value)\n }\n\n const normalized = value.trim().toUpperCase()\n const match = normalized.match(/^(\\d{1,2}):(\\d{2})(?::(\\d{2}))?\\s*(AM|PM)$/)\n\n if (!match) {\n return parseTime(value)\n }\n\n const hours = parseInt(match[1], 10)\n const minutes = parseInt(match[2], 10)\n const seconds = match[3] ? parseInt(match[3], 10) : 0\n const meridiem = match[4] as Meridiem\n\n if (hours < 1 || hours > 12 || minutes > 59 || seconds > 59) {\n return null\n }\n\n return {hours: to24HourValue(hours, meridiem), minutes, seconds}\n}\n\n// Format a time string in either 24h or 12h format.\nexport function formatTimeWithFormat(\n hours: number,\n minutes: number,\n seconds: number = 0,\n showSeconds: boolean = false,\n format: '24h' | '12h' = '24h'\n): string {\n if (format === '24h') {\n return formatTime(hours, minutes, seconds, showSeconds)\n }\n\n const parts = to12HourParts({hours, minutes, seconds})\n const base = `${pad(parts.hours)}:${pad(parts.minutes)}`\n const withSeconds = showSeconds ? `${base}:${pad(parts.seconds)}` : base\n\n return `${withSeconds} ${parts.meridiem}`\n}\n\n// Combine a calendar date with an optional time string into one Date value.\nexport function combineDateAndTime(\n date: Date,\n timeValue?: string | null,\n options: {format?: '24h' | '12h'; showSeconds?: boolean} = {}\n): Date {\n const {format = '24h', showSeconds = false} = options\n const parsedTime = timeValue ? parseTimeWithFormat(timeValue, format) : null\n\n return new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n parsedTime?.hours ?? 0,\n parsedTime?.minutes ?? 0,\n showSeconds ? (parsedTime?.seconds ?? 0) : 0\n )\n}\n\n// Format the hidden input value without applying a timezone conversion.\nexport function formatHiddenDateValue(date: Date, withTime: boolean = false, showSeconds: boolean = false): string {\n const datePart = formatDate(date, 'yyyy-MM-dd')\n\n if (!withTime) {\n return datePart\n }\n\n return `${datePart}T${formatTime(date.getHours(), date.getMinutes(), date.getSeconds(), showSeconds)}`\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ function e(e,t){return new Date(e,t+1,0).getDate()}function t(e,t){return new Date(e,t,1).getDay()}function n(e,t){return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate()}function r(e,t,n){return(!t||e>=i(t))&&(!n||e<=i(n))}function i(e){return new Date(e.getFullYear(),e.getMonth(),e.getDate())}function a(t,n){let r=new Date(t),i=r.getDate();return r.setDate(1),r.setMonth(r.getMonth()+n),r.setDate(Math.min(i,e(r.getFullYear(),r.getMonth()))),r}function o(e,t){return a(e,t*12)}var s=e=>e.toString().padStart(2,`0`);function c(e,t=`dd.MM.yyyy`){let n=s(e.getDate()),r=s(e.getMonth()+1),i=e.getFullYear().toString();return t.replace(`dd`,n).replace(`MM`,r).replace(`yyyy`,i)}function l(t,n=`dd.MM.yyyy`){let r=n.indexOf(`dd`),i=n.indexOf(`MM`),a=n.indexOf(`yyyy`);if(r===-1||i===-1||a===-1)return null;let o=parseInt(t.slice(r,r+2),10),s=parseInt(t.slice(i,i+2),10),c=parseInt(t.slice(a,a+4),10);return isNaN(o)||isNaN(s)||isNaN(c)||s<1||s>12||o<1||o>e(c,s-1)?null:new Date(c,s-1,o)}function u(e){return e.replace(/\.$/u,``)}function d(e=`en`,t=1){let n=new Intl.DateTimeFormat(e,{weekday:`short`}),r=new Date(Date.UTC(2021,7,1)),i=Array.from({length:7},(e,t)=>{let i=new Date(r);return i.setUTCDate(r.getUTCDate()+t),u(n.format(i))});return t===1?[...i.slice(1),i[0]]:i}function f(e=`en`){let t=new Intl.DateTimeFormat(e,{month:`long`});return Array.from({length:12},(e,n)=>t.format(new Date(Date.UTC(2021,n,1))))}function p(e){let t=e.split(`:`);if(t.length<2)return null;let n=parseInt(t[0],10),r=parseInt(t[1],10),i=t.length>2?parseInt(t[2],10):0;return isNaN(n)||isNaN(r)||isNaN(i)||n<0||n>23||r<0||r>59||i<0||i>59?null:{hours:n,minutes:r,seconds:i}}function m(e,t,n,r=!1){let i=`${s(e)}:${s(t)}`;return r?`${i}:${s(n??0)}`:i}function h(e){let t=e.hours>=12?`PM`:`AM`;return{hours:e.hours%12||12,minutes:e.minutes,seconds:e.seconds,meridiem:t}}function g(e,t){return t===`AM`?e===12?0:e:e===12?12:e+12}function _(e,t=`24h`){if(t===`24h`)return p(e);let n=e.trim().toUpperCase().match(/^(\d{1,2}):(\d{2})(?::(\d{2}))?\s*(AM|PM)$/);if(!n)return p(e);let r=parseInt(n[1],10),i=parseInt(n[2],10),a=n[3]?parseInt(n[3],10):0,o=n[4];return r<1||r>12||i>59||a>59?null:{hours:g(r,o),minutes:i,seconds:a}}function v(e,t,n=0,r=!1,i=`24h`){if(i===`24h`)return m(e,t,n,r);let a=h({hours:e,minutes:t,seconds:n}),o=`${s(a.hours)}:${s(a.minutes)}`;return`${r?`${o}:${s(a.seconds)}`:o} ${a.meridiem}`}function y(e,t,n={}){let{format:r=`24h`,showSeconds:i=!1}=n,a=t?_(t,r):null;return new Date(e.getFullYear(),e.getMonth(),e.getDate(),a?.hours??0,a?.minutes??0,i?a?.seconds??0:0)}function b(e,t=!1,n=!1){let r=c(e,`yyyy-MM-dd`);return t?`${r}T${m(e.getHours(),e.getMinutes(),e.getSeconds(),n)}`:r}Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return t}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return e}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return d}});
2
+ //# sourceMappingURL=dateUtils-z2L7ZaxA.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dateUtils-z2L7ZaxA.cjs","names":[],"sources":["../src/utils/dateUtils.ts"],"sourcesContent":["// Return the number of days for a month in a given year.\nexport function daysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate()\n}\n\n// Return the first weekday index for the given month.\nexport function firstDayOfMonth(year: number, month: number): number {\n return new Date(year, month, 1).getDay()\n}\n\n// Compare two dates using only the calendar day.\nexport function isSameDay(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate()\n}\n\n// Check whether a date falls inside optional min and max boundaries.\nexport function isDateInRange(date: Date, min?: Date | null, max?: Date | null): boolean {\n return (!min || date >= stripTime(min)) && (!max || date <= stripTime(max))\n}\n\n// Drop the time portion to make date comparisons predictable.\nexport function stripTime(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate())\n}\n\n// Shift a date by a number of whole months, clamping the day to the target month length\n// (31 Jan + 1 month = 28/29 Feb, not 3 Mar). The time of day is preserved.\nexport function addMonths(date: Date, count: number): Date {\n const result = new Date(date)\n const day = result.getDate()\n result.setDate(1)\n result.setMonth(result.getMonth() + count)\n result.setDate(Math.min(day, daysInMonth(result.getFullYear(), result.getMonth())))\n return result\n}\n\n// Shift a date by a number of whole years, clamping 29 Feb to 28 Feb in non-leap years.\nexport function addYears(date: Date, count: number): Date {\n return addMonths(date, count * 12)\n}\n\n// Pad numeric date parts to two digits.\nconst pad = (n: number): string => n.toString().padStart(2, '0')\n\n// Format a date with a lightweight token format.\nexport function formatDate(date: Date, format: string = 'dd.MM.yyyy'): string {\n const day = pad(date.getDate())\n const month = pad(date.getMonth() + 1)\n const year = date.getFullYear().toString()\n\n return format.replace('dd', day).replace('MM', month).replace('yyyy', year)\n}\n\n// Parse a date string according to the provided lightweight token format.\nexport function parseDate(value: string, format: string = 'dd.MM.yyyy'): Date | null {\n const dayIdx = format.indexOf('dd')\n const monthIdx = format.indexOf('MM')\n const yearIdx = format.indexOf('yyyy')\n\n if (dayIdx === -1 || monthIdx === -1 || yearIdx === -1) return null\n\n const day = parseInt(value.slice(dayIdx, dayIdx + 2), 10)\n const month = parseInt(value.slice(monthIdx, monthIdx + 2), 10)\n const year = parseInt(value.slice(yearIdx, yearIdx + 4), 10)\n\n if (isNaN(day) || isNaN(month) || isNaN(year)) return null\n if (month < 1 || month > 12) return null\n if (day < 1 || day > daysInMonth(year, month - 1)) return null\n\n return new Date(year, month - 1, day)\n}\n\nfunction normalizeWeekdayLabel(label: string): string {\n return label.replace(/\\.$/u, '')\n}\n\n// Return localized short day names for calendar headers.\nexport function getDayNames(locale: string = 'en', firstDayOfWeek: 0 | 1 = 1): string[] {\n const formatter = new Intl.DateTimeFormat(locale, {weekday: 'short'})\n const sunday = new Date(Date.UTC(2021, 7, 1))\n const dayNames = Array.from({length: 7}, (_, index) => {\n const date = new Date(sunday)\n date.setUTCDate(sunday.getUTCDate() + index)\n return normalizeWeekdayLabel(formatter.format(date))\n })\n\n return firstDayOfWeek === 1 ? [...dayNames.slice(1), dayNames[0]] : dayNames\n}\n\n// Return localized month names for pickers and headers.\nexport function getMonthNames(locale: string = 'en'): string[] {\n const formatter = new Intl.DateTimeFormat(locale, {month: 'long'})\n\n return Array.from({length: 12}, (_, month) => formatter.format(new Date(Date.UTC(2021, month, 1))))\n}\n\n// Parse a time string into numeric hour, minute and second parts.\nexport function parseTime(value: string): {hours: number; minutes: number; seconds: number} | null {\n const parts = value.split(':')\n if (parts.length < 2) return null\n\n const hours = parseInt(parts[0], 10)\n const minutes = parseInt(parts[1], 10)\n const seconds = parts.length > 2 ? parseInt(parts[2], 10) : 0\n\n if (isNaN(hours) || isNaN(minutes) || isNaN(seconds)) return null\n if (hours < 0 || hours > 23 || minutes < 0 || minutes > 59 || seconds < 0 || seconds > 59) return null\n\n return {hours, minutes, seconds}\n}\n\n// Format time values with optional seconds output.\nexport function formatTime(hours: number, minutes: number, seconds?: number, showSeconds: boolean = false): string {\n const base = `${pad(hours)}:${pad(minutes)}`\n return showSeconds ? `${base}:${pad(seconds ?? 0)}` : base\n}\n\ntype Meridiem = 'AM' | 'PM'\n\nfunction to12HourParts(value: {hours: number; minutes: number; seconds: number}) {\n const meridiem: Meridiem = value.hours >= 12 ? 'PM' : 'AM'\n const hours = value.hours % 12 || 12\n return {hours, minutes: value.minutes, seconds: value.seconds, meridiem}\n}\n\nfunction to24HourValue(hours: number, meridiem: Meridiem): number {\n if (meridiem === 'AM') {\n return hours === 12 ? 0 : hours\n }\n\n return hours === 12 ? 12 : hours + 12\n}\n\n// Parse a time string in either 24h or 12h format.\nexport function parseTimeWithFormat(\n value: string,\n format: '24h' | '12h' = '24h'\n): {hours: number; minutes: number; seconds: number} | null {\n if (format === '24h') {\n return parseTime(value)\n }\n\n const normalized = value.trim().toUpperCase()\n const match = normalized.match(/^(\\d{1,2}):(\\d{2})(?::(\\d{2}))?\\s*(AM|PM)$/)\n\n if (!match) {\n return parseTime(value)\n }\n\n const hours = parseInt(match[1], 10)\n const minutes = parseInt(match[2], 10)\n const seconds = match[3] ? parseInt(match[3], 10) : 0\n const meridiem = match[4] as Meridiem\n\n if (hours < 1 || hours > 12 || minutes > 59 || seconds > 59) {\n return null\n }\n\n return {hours: to24HourValue(hours, meridiem), minutes, seconds}\n}\n\n// Format a time string in either 24h or 12h format.\nexport function formatTimeWithFormat(\n hours: number,\n minutes: number,\n seconds: number = 0,\n showSeconds: boolean = false,\n format: '24h' | '12h' = '24h'\n): string {\n if (format === '24h') {\n return formatTime(hours, minutes, seconds, showSeconds)\n }\n\n const parts = to12HourParts({hours, minutes, seconds})\n const base = `${pad(parts.hours)}:${pad(parts.minutes)}`\n const withSeconds = showSeconds ? `${base}:${pad(parts.seconds)}` : base\n\n return `${withSeconds} ${parts.meridiem}`\n}\n\n// Combine a calendar date with an optional time string into one Date value.\nexport function combineDateAndTime(\n date: Date,\n timeValue?: string | null,\n options: {format?: '24h' | '12h'; showSeconds?: boolean} = {}\n): Date {\n const {format = '24h', showSeconds = false} = options\n const parsedTime = timeValue ? parseTimeWithFormat(timeValue, format) : null\n\n return new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n parsedTime?.hours ?? 0,\n parsedTime?.minutes ?? 0,\n showSeconds ? (parsedTime?.seconds ?? 0) : 0\n )\n}\n\n// Format the hidden input value without applying a timezone conversion.\nexport function formatHiddenDateValue(date: Date, withTime: boolean = false, showSeconds: boolean = false): string {\n const datePart = formatDate(date, 'yyyy-MM-dd')\n\n if (!withTime) {\n return datePart\n }\n\n return `${datePart}T${formatTime(date.getHours(), date.getMinutes(), date.getSeconds(), showSeconds)}`\n}\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ const e=require(`./frameworkTexts-CaqdiKHW.cjs`),t=require(`./icons-Bp8bB9TP.cjs`),n=require(`./cn-DYFxgzi2.cjs`),r=require(`./relativeTime-DUbW4O44.cjs`),i=require(`./MSurface-BrFo-JMJ.cjs`),a=require(`./MText-nsvLFsSv.cjs`),o=require(`./MButton-BxEky3xQ.cjs`),s=require(`./MSkeleton-DuAN8Vcv.cjs`),c=require(`./radioGroupKeys-COL8uXbH.cjs`),l=require(`./MStack-CGII4A-q.cjs`),u=require(`./MCard-Bqm4BjK_.cjs`),d=require(`./locale-C08q7FjE.cjs`);require(`./core-w629c4ND.cjs`);let f=require(`react`),p=require(`react/jsx-runtime`);function m({title:e,defaultOpen:r=!1,open:i,onToggle:a,color:s=`primary`,className:c,children:u,...d}){let[m,h]=(0,f.useState)(r),g=i??m,_=(0,f.useId)(),v=()=>{let e=!g;i===void 0&&h(e),a?.(e)},y=(0,p.jsx)(`span`,{className:n.t(`chevron`,g&&`open`),"aria-hidden":`true`,children:(0,p.jsx)(t.Ki,{})});return(0,p.jsxs)(`div`,{className:n.t(`collapsible`,c),...d,children:[(0,p.jsx)(o.t,{variant:`ghost`,color:s,className:`trigger`,"aria-expanded":g,"aria-controls":_,onClick:v,endIcon:y,children:e}),(0,p.jsx)(`div`,{id:_,className:n.t(`content-wrap`,g&&`open`),"aria-hidden":!g,inert:!g,children:(0,p.jsx)(`div`,{className:`collapsible-clip`,children:(0,p.jsx)(l.t,{className:`content`,children:u})})})]})}function h(e){return null}function g({multiple:e=!1,defaultOpen:t,onChange:r,bordered:i=!1,color:a,className:o,children:s,...c}){let[l,u]=(0,f.useState)(Array.isArray(t)?t:t?[t]:[]),d=(0,f.useCallback)((t,n)=>{u(i=>{let a;return a=n?e?[...i,t]:[t]:i.filter(e=>e!==t),r?.(a),a})},[e,r]),g=f.Children.toArray(s).filter(e=>(0,f.isValidElement)(e)&&e.type===h);return(0,p.jsx)(`div`,{className:n.t(`accordion`,i&&`bordered`,o),...c,children:g.map(e=>{if(!(0,f.isValidElement)(e))return null;let{id:t,title:r,children:i,disabled:o,color:s}=e.props,c=l.includes(t);return(0,p.jsx)(`div`,{className:n.t(`accordion-item`,o&&`disabled`),children:(0,p.jsx)(m,{title:r,open:c,onToggle:o?void 0:e=>d(t,e),color:s??a,children:i})},t)})})}var _=800;function v(e){return 1-(1-e)**3}function y({value:e,max:t=100,color:r=`primary`,size:i=`md`,label:a,showValue:o=!1,animated:s=!1,striped:c=!1,className:l,...u}){let d=Math.min(100,Math.max(0,e/t*100)),[m,h]=(0,f.useState)(0),[g,y]=(0,f.useState)(0),b=(0,f.useRef)(0),x=(0,f.useRef)(0),S=(0,f.useCallback)((e,t)=>{if(cancelAnimationFrame(x.current),typeof window.matchMedia==`function`&&window.matchMedia(`(prefers-reduced-motion: reduce)`).matches){y(t),h(t);return}let n=performance.now(),r=i=>{let a=i-n,o=Math.min(a/_,1),s=v(o);h(e+(t-e)*s),o<1&&(x.current=requestAnimationFrame(r))};y(t),x.current=requestAnimationFrame(r)},[]);return(0,f.useEffect)(()=>(S(b.current,d),b.current=d,()=>cancelAnimationFrame(x.current)),[d,S]),(0,p.jsxs)(`div`,{className:n.t(`progress-bar`,`color-${r}`,i,l),role:`progressbar`,"aria-valuenow":e,"aria-valuemin":0,"aria-valuemax":t,"aria-label":a,...u,children:[(a||o)&&(0,p.jsxs)(`div`,{className:`progress-bar-header`,children:[a&&(0,p.jsx)(`span`,{className:`progress-bar-label`,children:a}),o&&(0,p.jsxs)(`span`,{className:`progress-bar-value`,children:[Math.round(m),`%`]})]}),(0,p.jsx)(`div`,{className:`progress-bar-track`,children:(0,p.jsx)(`div`,{className:n.t(`progress-bar-fill`,s&&`animated`,c&&`striped`),style:{width:`${g}%`}})})]})}function b({value:e,from:t=0,duration:r=1e3,decimals:i=0,prefix:a=``,suffix:o=``,separator:s=``,className:c,...l}){let[u,d]=(0,f.useState)(t),m=(0,f.useRef)(0),h=(0,f.useRef)(null);(0,f.useEffect)(()=>{let t=u;h.current=null;let n=i=>{h.current===null&&(h.current=i);let a=i-h.current,o=Math.min(a/r,1),s=1-(1-o)**3;d(t+(e-t)*s),o<1&&(m.current=requestAnimationFrame(n))};return m.current=requestAnimationFrame(n),()=>cancelAnimationFrame(m.current)},[e,r]);let g=x(u,i,s);return(0,p.jsxs)(`span`,{className:n.t(`count-up`,c),...l,children:[a,g,o]})}function x(e,t,n){let r=e.toFixed(t);if(!n)return r;let[i,a]=r.split(`.`),o=i.replace(/\B(?=(\d{3})+(?!\d))/g,n);return a===void 0?o:`${o}.${a}`}var S=typeof window<`u`?f.useLayoutEffect:f.useEffect;function C(){return typeof window<`u`&&typeof window.matchMedia==`function`&&window.matchMedia(`(prefers-reduced-motion: reduce)`).matches}var w={c:`c`,cpp:`cpp`,"c++":`cpp`,arduino:`arduino`,ino:`arduino`,ts:`typescript`,typescript:`typescript`,tsx:`tsx`,js:`javascript`,javascript:`javascript`,jsx:`jsx`,json:`json`,css:`css`,html:`html`,markup:`html`,bash:`bash`,shell:`bash`,shellscript:`bash`,php:`php`},T={xml:()=>Promise.resolve().then(()=>require(`./xml-DEtyywwU.cjs`)),css:()=>Promise.resolve().then(()=>require(`./css-D6fGBtGV.cjs`)),javascript:()=>Promise.resolve().then(()=>require(`./javascript-Oy5hkezl.cjs`)),typescript:()=>Promise.resolve().then(()=>require(`./typescript-QKlfKtex.cjs`)),json:()=>Promise.resolve().then(()=>require(`./json-BP8eqPWc.cjs`)),bash:()=>Promise.resolve().then(()=>require(`./bash-wzZkpJC-.cjs`)),c:()=>Promise.resolve().then(()=>require(`./c-BSPjDa0P.cjs`)),cpp:()=>Promise.resolve().then(()=>require(`./cpp-LIcuHkFj.cjs`)),arduino:()=>Promise.resolve().then(()=>require(`./arduino-C1gw-z1N.cjs`)),php:()=>Promise.resolve().then(()=>require(`./php-Cwjc-ZYq.cjs`))},E=null,D=42,O=200;function k(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`)}function A(e){return w[e]??e}async function j(){return E||=(async()=>{let e=(await Promise.resolve().then(()=>require(`./core-w629c4ND.cjs`))).default.newInstance();for(let[t,n]of Object.entries(T)){let r=await n();e.registerLanguage(t,r.default)}return e.registerAliases([`shell`,`shellscript`],{languageName:`bash`}),e.registerAliases(`markup`,{languageName:`xml`}),e})(),E}function M({code:r,language:c=`tsx`,title:l,showHeader:d=!0,showLanguage:m=!0,showCopyButton:h=!0,copyLabel:g,copiedLabel:_,maxHeight:v,stretch:y=!1,animated:b=!1,lineNumbers:x=!1,className:w,...T}){let E=e.i(),M=g??E.copy,N=_??E.copied,P=(0,f.useMemo)(()=>A(c.trim().toLowerCase()),[c]),[F,I]=(0,f.useState)(()=>r.length),[L,R]=(0,f.useState)(!1),z=L?r.slice(0,F):r,[B,V]=(0,f.useState)(()=>k(z)),[H,U]=(0,f.useState)(!1),W=(0,f.useRef)(null),G=(0,f.useRef)(null),K=(0,f.useRef)(null),q=typeof navigator<`u`&&typeof navigator.clipboard?.writeText==`function`,J=d&&(!!l||m||h),Y=(0,f.useMemo)(()=>Math.max(1,z.split(`
2
+ `).length),[z]);S(()=>{G.current!==null&&(window.clearTimeout(G.current),G.current=null);let e=b&&!C();R(e),I(e?0:r.length),e&&V(``)},[b,r]),(0,f.useEffect)(()=>{if(!(!L||r.length===0))return F<r.length&&(G.current=window.setTimeout(()=>{I(e=>Math.min(e+1,r.length)),G.current=null},F===0?O:D)),()=>{G.current!==null&&(window.clearTimeout(G.current),G.current=null)}},[L,r.length,F]),(0,f.useEffect)(()=>{let e=!0;async function t(){try{let t=await j(),n=t.getLanguage(P)?t.highlight(z,{language:P,ignoreIllegals:!0}).value:k(z);e&&V(n)}catch{e&&V(k(z))}}return t(),()=>{e=!1}},[P,z]),(0,f.useEffect)(()=>()=>{W.current!==null&&window.clearTimeout(W.current),G.current!==null&&window.clearTimeout(G.current)},[]),(0,f.useEffect)(()=>{!L||!K.current||(K.current.scrollTop=K.current.scrollHeight)},[L,F]);async function X(){if(q)try{await navigator.clipboard.writeText(r),U(!0),W.current!==null&&window.clearTimeout(W.current),W.current=window.setTimeout(()=>{U(!1),W.current=null},1200)}catch{U(!1)}}return(0,p.jsxs)(u.t,{className:n.t(`code-block-card`,w),...T,padded:!1,stretch:y,children:[J&&(0,p.jsx)(u.i,{className:`code-block-header`,children:(0,p.jsxs)(i.n,{className:`code-block-header-layout`,align:`center`,justify:`between`,wrap:`nowrap`,px:`lg`,py:`md`,children:[(0,p.jsxs)(i.n,{className:`code-block-header-meta`,align:`center`,wrap:`wrap`,children:[l&&(0,p.jsx)(a.t,{as:`span`,className:`code-block-title`,size:`sm`,weight:`semibold`,children:l}),m&&c&&(0,p.jsx)(s.n,{color:`info`,size:`sm`,children:c})]}),h&&(0,p.jsx)(o.t,{variant:`ghost`,size:`sm`,color:`neutral`,startIcon:(0,p.jsx)(t.Kn,{size:`sm`,"aria-hidden":`true`}),onClick:X,disabled:!q,children:H?N:M}),h&&(0,p.jsx)(`span`,{className:`code-block-status`,role:`status`,children:H?N:``})]})}),(0,p.jsx)(u.n,{className:`code-block-body`,children:(0,p.jsx)(`div`,{ref:K,className:`code-block-scroll`,style:v?{maxHeight:v,overflowY:`auto`}:void 0,role:`region`,tabIndex:0,"aria-label":typeof l==`string`&&l.trim()!==``?l:E.label,children:(0,p.jsxs)(`pre`,{className:n.t(`code-block-pre`,x&&`with-line-numbers`,`language-${P}`),children:[x&&(0,p.jsx)(`span`,{className:`code-block-line-numbers`,"aria-hidden":`true`,children:Array.from({length:Y},(e,t)=>(0,p.jsx)(`span`,{className:`code-block-line-number`,children:t+1},t+1))}),(0,p.jsx)(`span`,{className:`code-block-code-shell`,children:(0,p.jsx)(`code`,{className:n.t(`code-block-code`,`hljs`,`language-${P}`),dangerouslySetInnerHTML:{__html:B}})})]})})})]})}function N(e,t){switch(e){case`down`:return{x:0,y:-t};case`left`:return{x:t,y:0};case`right`:return{x:-t,y:0};case`none`:return{x:0,y:0};default:return{x:0,y:t}}}function P({children:e,direction:t=`up`,delay:r=0,duration:i=.46,distance:a=20,once:o=!0,trigger:s=`view`,className:c,style:l,...u}){let d=(0,f.useRef)(null);(0,f.useEffect)(()=>{let e=d.current;if(!e)return;let t=window.matchMedia(`(prefers-reduced-motion: reduce)`).matches;if(e.classList.remove(`revealed`),t){e.classList.add(`revealed`);return}if(s===`mount`){let t=window.requestAnimationFrame(()=>{e.classList.add(`revealed`)});return()=>window.cancelAnimationFrame(t)}let n=new IntersectionObserver(t=>{for(let r of t)r.isIntersecting?(e.classList.add(`revealed`),o&&n.disconnect()):o||e.classList.remove(`revealed`)},{threshold:.2});return n.observe(e),()=>n.disconnect()},[r,t,a,i,o,s]);let m=N(t,a),h={minWidth:0,maxWidth:`100%`,"--reveal-delay":`${r}s`,"--reveal-duration":`${i}s`,"--reveal-translate-x":`${m.x}px`,"--reveal-translate-y":`${m.y}px`,...l};return(0,p.jsx)(`div`,{ref:d,className:n.t(`reveal`,c),style:h,...u,children:e})}function F(e,t,n){return e===`none`?null:e===`minute`?60*1e3:e===`hour`?3600*1e3:e===`day`?1440*60*1e3:r.r(t,n)}function I({value:e,locale:t,maxRelative:i,fallbackFormat:a=`date`,titleAbsolute:o=!0,update:s=`auto`,className:c,...l}){let u=d.t(t),[m,h]=(0,f.useState)(()=>Date.now()),g=(0,f.useMemo)(()=>F(s,e,m),[m,s,e]);(0,f.useEffect)(()=>{if(!g)return;let e=window.setInterval(()=>h(Date.now()),g);return()=>window.clearInterval(e)},[g]);let _=(0,f.useMemo)(()=>r.o(e),[e]),v=(0,f.useMemo)(()=>r.a(i),[i]),y=(0,f.useMemo)(()=>r.t(e,u,a),[e,u,a]),b=(0,f.useMemo)(()=>{if(!_)return String(e);let t=Math.abs(_.getTime()-m);return v!=null&&t>v?y??String(e):r.n(_,{locale:u,now:m})??y??String(e)},[y,_,u,v,m,e]);return(0,p.jsx)(`time`,{className:n.t(`time ago`,c),dateTime:_?.toISOString(),title:o?y??void 0:void 0,...l,children:b})}function L(e,t,n){let r=r=>{let i=(r+e/60)%6;return n-n*t*Math.max(0,Math.min(i,4-i,1))};return`#${[Math.round(r(5)*255),Math.round(r(3)*255),Math.round(r(1)*255)].map(e=>e.toString(16).padStart(2,`0`)).join(``)}`}function R(e){let t=e.replace(`#`,``).match(/.{2}/g);if(!t)return[0,0,1];let[n,r,i]=t.map(e=>parseInt(e,16)/255),a=Math.max(n,r,i),o=a-Math.min(n,r,i),s=0;o!==0&&(s=a===n?((r-i)/o+6)%6:a===r?(i-n)/o+2:(n-r)/o+4,s*=60);let c=a===0?0:o/a;return[s,c,a]}function z(e){let t=e.replace(`#`,``).match(/.{2}/g);if(!t)return`rgb(0, 0, 0)`;let[n,r,i]=t.map(e=>parseInt(e,16));return`rgb(${n}, ${r}, ${i})`}function B(e){let t=e.replace(`#`,``).match(/.{2}/g);if(!t)return`hsl(0, 0%, 0%)`;let[n,r,i]=t.map(e=>parseInt(e,16)/255),a=Math.max(n,r,i),o=Math.min(n,r,i),s=(a+o)/2,c=0,l=0;if(a!==o){let e=a-o;l=s>.5?e/(2-a-o):e/(a+o),c=a===n?((r-i)/e+6)%6:a===r?(i-n)/e+2:(n-r)/e+4,c*=60}return`hsl(${Math.round(c)}, ${Math.round(l*100)}%, ${Math.round(s*100)}%)`}function V(e,t){return t===`rgb`?z(e):t===`hsl`?B(e):e}function H(e){return Math.round(Math.max(0,Math.min(255,e))).toString(16).padStart(2,`0`)}function U(e,t,n){let r=(e%360+360)%360,i=Math.max(0,Math.min(1,t)),a=Math.max(0,Math.min(1,n)),o=i*Math.min(a,1-a),s=e=>{let t=(e+r/30)%12;return a-o*Math.max(-1,Math.min(t-3,9-t,1))};return`#${H(s(0)*255)}${H(s(8)*255)}${H(s(4)*255)}`}function W(e){let t=e.trim().toLowerCase();if(!t)return null;let n=t.match(/^#([0-9a-f]{3}|[0-9a-f]{6})$/);if(n){let e=n[1];return e.length===3?`#${e.split(``).map(e=>e+e).join(``)}`:`#${e}`}let r=t.match(/^rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*[\d.]+\s*)?\)$/);if(r){let e=[r[1],r[2],r[3]].map(Number);return e.some(e=>e>255)?null:`#${e.map(H).join(``)}`}let i=t.match(/^hsla?\(\s*(-?[\d.]+)(?:deg)?\s*,\s*([\d.]+)%\s*,\s*([\d.]+)%\s*(?:,\s*[\d.]+\s*)?\)$/);if(i){let[e,t,n]=[i[1],i[2],i[3]].map(Number);return[e,t,n].some(e=>!Number.isFinite(e))||t>100||n>100?null:U(e,t/100,n/100)}return null}function G(e){return W(e)??`#000000`}var K=[`#ef4444`,`#f97316`,`#eab308`,`#22c55e`,`#06b6d4`,`#3b82f6`,`#8b5cf6`,`#ec4899`,`#000000`,`#ffffff`];function q({value:t,onChange:r,swatches:i=K,format:a=`hex`,size:o=`md`,label:s,disabled:l=!1,className:u,...d}){let m=e.a(),h=(0,f.useId)(),g=G(t??`#3b82f6`),[_,v]=(0,f.useState)(()=>R(g)),[y,b]=(0,f.useState)(V(g,a)),x=(0,f.useRef)(null),S=(0,f.useRef)(null),C=(0,f.useRef)([]),w=(0,f.useRef)(null),T=(0,f.useRef)(null),E=(0,f.useRef)(a);(0,f.useEffect)(()=>{let e=E.current!==a;E.current=a;let n=G(t??`#3b82f6`);v(e=>L(e[0],e[1],e[2])===n?e:R(n)),(e||t!==T.current)&&b(V(n,a))},[t,a]);let D=(0,f.useCallback)((e,t,n)=>{let i=V(L(e,t,n),a);v([e,t,n]),b(i),T.current=i,r?.(i)},[r,a]);function O(e){let t=x.current?.getBoundingClientRect();if(!t)return;let n=Math.max(0,Math.min(1,(e.clientX-t.left)/t.width)),r=Math.max(0,Math.min(1,1-(e.clientY-t.top)/t.height));D(_[0],n,r)}function k(e){let t=S.current?.getBoundingClientRect();t&&D(Math.max(0,Math.min(360,(e.clientX-t.left)/t.width*360)),_[1],_[2])}(0,f.useEffect)(()=>{function e(e){w.current===`area`?O(e):w.current===`hue`&&k(e)}function t(){w.current=null}return window.addEventListener(`pointermove`,e),window.addEventListener(`pointerup`,t),()=>{window.removeEventListener(`pointermove`,e),window.removeEventListener(`pointerup`,t)}});function A(e){b(e);let t=W(e);if(t){let e=V(t,a);v(e=>L(e[0],e[1],e[2])===t?e:R(t)),T.current=e,r?.(e)}}let j=L(_[0],_[1],_[2]);function M(e){if(l)return;let t=e.shiftKey?.1:.01,n=_[1],r=_[2];switch(e.key){case`ArrowRight`:n+=t;break;case`ArrowLeft`:n-=t;break;case`ArrowUp`:r+=t;break;case`ArrowDown`:r-=t;break;case`PageUp`:r+=.1;break;case`PageDown`:r-=.1;break;case`Home`:n=0;break;case`End`:n=1;break;default:return}e.preventDefault();let i=e=>Math.round(Math.max(0,Math.min(1,e))*100)/100;D(_[0],i(n),i(r))}function N(e){if(l)return;let t=e.shiftKey?10:1,n=Math.round(_[0]);switch(e.key){case`ArrowRight`:case`ArrowUp`:n+=t;break;case`ArrowLeft`:case`ArrowDown`:n-=t;break;case`PageUp`:n+=10;break;case`PageDown`:n-=10;break;case`Home`:n=0;break;case`End`:n=360;break;default:return}e.preventDefault(),D(Math.max(0,Math.min(360,n)),_[1],_[2])}let P=i.findIndex(e=>j.toLowerCase()===e.toLowerCase()),F=P>=0?P:0;function I(e){if(l)return;let[t,n,r]=R(e);D(t,n,r)}function z(e){if(l||e.altKey||e.ctrlKey||e.metaKey)return;let t=C.current.findIndex(t=>t===e.target);if(t<0)return;let n=c.t(e.key,t,i.length,c.n(e.currentTarget));n!==null&&(e.preventDefault(),C.current[n]?.focus(),I(i[n]))}let B=Math.round(_[1]*100),H=Math.round(_[2]*100),U=Math.round(_[0]);return(0,p.jsxs)(`div`,{className:n.t(`color-picker`,o,l&&`disabled`,u),...d,children:[s&&(0,p.jsx)(`label`,{className:`label`,htmlFor:h,children:s}),(0,p.jsxs)(`div`,{ref:x,className:`area`,style:{background:`hsl(${_[0]}, 100%, 50%)`},role:`slider`,tabIndex:l?-1:0,"aria-label":m.area,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":B,"aria-valuetext":e.t(m.areaValue,{saturation:B,brightness:H}),"aria-disabled":l||void 0,onKeyDown:M,onPointerDown:e=>{l||(e.currentTarget.focus({preventScroll:!0}),w.current=`area`,O(e))},children:[(0,p.jsx)(`div`,{className:`white`}),(0,p.jsx)(`div`,{className:`black`}),(0,p.jsx)(`div`,{className:`cursor`,style:{left:`${_[1]*100}%`,top:`${(1-_[2])*100}%`,background:j}})]}),(0,p.jsx)(`div`,{ref:S,className:`hue`,role:`slider`,tabIndex:l?-1:0,"aria-label":m.hue,"aria-valuemin":0,"aria-valuemax":360,"aria-valuenow":U,"aria-valuetext":e.t(m.hueValue,{value:U}),"aria-orientation":`horizontal`,"aria-disabled":l||void 0,onKeyDown:N,onPointerDown:e=>{l||(e.currentTarget.focus({preventScroll:!0}),w.current=`hue`,k(e))},children:(0,p.jsx)(`div`,{className:`hue-thumb`,style:{left:`${_[0]/360*100}%`}})}),(0,p.jsxs)(`div`,{className:`controls`,children:[(0,p.jsx)(`div`,{className:`preview`,style:{background:j}}),(0,p.jsx)(`input`,{id:h,type:`text`,"aria-label":s?void 0:m.input,className:`input`,value:y,onChange:e=>A(e.target.value),disabled:l})]}),i.length>0&&(0,p.jsx)(`div`,{className:`swatches`,role:`radiogroup`,"aria-label":m.swatches,"aria-disabled":l||void 0,onKeyDown:z,children:i.map((t,r)=>(0,p.jsx)(`button`,{ref:e=>{C.current[r]=e},type:`button`,role:`radio`,className:n.t(`swatch`,r===P&&`active`),style:{background:t},"aria-label":e.t(m.swatch,{color:t}),"aria-checked":r===P,tabIndex:!l&&r===F?0:-1,onClick:()=>I(t)},t))})]})}var J={xs:`xs`,sm:`sm`,md:`sm`,lg:`md`,xl:`lg`};function Y({icon:e,illustration:t,title:r,description:i,buttonText:a,onAction:s,color:c=`neutral`,size:l=`md`,className:u,children:d,...m}){return(0,p.jsxs)(`div`,{className:n.t(`empty-state`,`color-${c}`,l,u),...m,children:[t&&(0,p.jsx)(`div`,{className:`empty-state-illustration`,children:(0,f.isValidElement)(t)?(0,f.cloneElement)(t,{color:c}):t}),!t&&e&&(0,p.jsx)(`div`,{className:`empty-state-icon`,children:e}),(0,p.jsxs)(`div`,{className:`empty-state-content`,children:[(0,p.jsx)(`div`,{className:`empty-state-title`,children:r}),i&&(0,p.jsx)(`div`,{className:`empty-state-description`,children:i})]}),a&&s&&(0,p.jsx)(`div`,{className:`empty-state-action`,children:(0,p.jsx)(o.t,{size:J[l],variant:`outlined`,color:c,onClick:s,children:a})}),d]})}function X({children:e,amount:t=6,reveal:r=`hover`,revealed:i,defaultRevealed:a=!1,onToggle:o,inline:s=!0,className:c,style:l,onClick:u,onKeyDown:d,...m}){let h=i!==void 0,[g,_]=(0,f.useState)(a),v=h?i:g,y=r!==`none`,b=(0,f.useCallback)(e=>{h||_(e),o?.(e)},[h,o]),x=e=>{r===`click`&&b(!v),u?.(e)},S=e=>{r===`click`&&(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),b(!v)),d?.(e)},C={...l,"--mineral-blur-amount":`${t}px`};return(0,p.jsx)(`span`,{className:n.t(`blur`,s?`inline`:`block`,`reveal-${r}`,v&&`revealed`,c),style:C,tabIndex:y&&r===`click`?0:void 0,role:r===`click`?`button`:void 0,"aria-pressed":r===`click`?v:void 0,onClick:x,onKeyDown:S,...m,children:(0,p.jsx)(`span`,{className:`blur-inner`,"aria-hidden":!v,children:e})})}var Z={xs:10,sm:14,md:18,lg:22,xl:28};function Q(e){return null}function ee({activeStep:r,variant:i=`horizontal`,color:a=`primary`,size:o=`md`,clickable:s=!1,onChange:c,className:l,children:u,...d}){let m=e.w(),h=(0,f.useId)(),g=f.Children.toArray(u).filter(e=>(0,f.isValidElement)(e)&&e.type===Q);return(0,p.jsx)(`div`,{className:n.t(`stepper`,i,`color-${a}`,o,l),role:`list`,...d,children:g.map((e,i)=>{if(!(0,f.isValidElement)(e))return null;let{id:a,title:l,description:u,icon:d,disabled:g,optional:_,error:v}=e.props,y=i===r,b=i<r,x=s&&!g,S=()=>{x&&c&&c(i)},C=v?m.error:b?m.completed:null,w=`${h}-${i}-title`,T=`${h}-${i}-state`,E=v?`!`:b?d??(0,p.jsx)(t.Yi,{size:Z[o]}):d??i+1;return(0,p.jsxs)(`div`,{className:n.t(`stepper-step`,y&&`active`,b&&`completed`,g&&`disabled`,v&&`error`,x&&`clickable`),role:`listitem`,"aria-current":y?`step`:void 0,children:[x?(0,p.jsx)(`button`,{type:`button`,className:`stepper-indicator`,onClick:S,"aria-labelledby":C?`${w} ${T}`:w,"aria-current":y?`step`:void 0,children:(0,p.jsx)(`span`,{className:`stepper-indicator-content`,"aria-hidden":`true`,children:E})}):(0,p.jsx)(`div`,{className:`stepper-indicator`,"aria-hidden":v||b?!0:void 0,children:E}),(0,p.jsxs)(`div`,{className:`stepper-content`,children:[(0,p.jsx)(`span`,{id:w,className:`stepper-title`,children:l}),C&&(0,p.jsx)(`span`,{id:T,className:`stepper-state`,children:C}),u&&(0,p.jsx)(`span`,{className:`stepper-description`,children:u}),_&&(0,p.jsx)(`span`,{className:`stepper-optional`,children:m.optional})]})]},a)})})}function $(e){return null}function te({align:e=`left`,color:t=`primary`,size:r=`md`,className:i,children:a,...o}){let s=f.Children.toArray(a).filter(e=>(0,f.isValidElement)(e)&&e.type===$);return(0,p.jsx)(`div`,{className:n.t(`timeline`,`align-${e}`,`color-${t}`,r,i),...o,children:s.map((t,r)=>{if(!(0,f.isValidElement)(t))return null;let{id:i,title:a,description:o,date:s,icon:c,color:l}=t.props,u=e===`alternate`?r%2==0?`left`:`right`:void 0;return(0,p.jsxs)(`div`,{className:n.t(`timeline-item`,u&&`side-${u}`),children:[(0,p.jsx)(`div`,{className:n.t(`timeline-dot`,l&&`color-${l}`),children:c}),(0,p.jsxs)(`div`,{className:`timeline-content`,children:[(0,p.jsx)(`span`,{className:`timeline-title`,children:a}),o&&(0,p.jsx)(`span`,{className:`timeline-description`,children:o}),s&&(0,p.jsx)(`span`,{className:`timeline-date`,children:s})]})]},i)})})}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return ee}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return te}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return M}});
3
+ //# sourceMappingURL=display-BLMOBofj.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display-BLMOBofj.cjs","names":[],"sources":["../src/components/display/MCollapsible/MCollapsible.tsx","../src/components/display/MAccordion/MAccordion.tsx","../src/components/display/MProgressBar/MProgressBar.tsx","../src/components/display/MCountUp/MCountUp.tsx","../src/components/display/MCodeBlock/MCodeBlock.tsx","../src/components/display/MReveal/MReveal.tsx","../src/components/display/MTimeAgo/MTimeAgo.tsx","../src/components/display/MColorPicker/MColorPicker.tsx","../src/components/display/MEmptyState/MEmptyState.tsx","../src/components/display/MBlur/MBlur.tsx","../src/components/display/MStepper/MStepper.tsx","../src/components/display/MTimeline/MTimeline.tsx"],"sourcesContent":["import {useId, useState} from 'react'\nimport {MButton} from '../../controls'\nimport {MStack} from '../../layout'\nimport {cn} from '../../../utils/cn'\nimport type {MCollapsibleProps} from './MCollapsible.types'\nimport {MChevronDownIcon} from '../../../icons'\nimport './MCollapsible.css'\n\n// MToggle a section of content with a built-in trigger and disclosure state.\nexport function MCollapsible({\n title,\n defaultOpen = false,\n open: controlledOpen,\n onToggle,\n color = 'primary',\n className,\n children,\n ...rest\n}: MCollapsibleProps) {\n const [internalOpen, setInternalOpen] = useState(defaultOpen)\n const open = controlledOpen ?? internalOpen\n const panelId = useId()\n\n const handleToggle = () => {\n const nextOpen = !open\n\n if (controlledOpen === undefined) {\n setInternalOpen(nextOpen)\n }\n\n onToggle?.(nextOpen)\n }\n\n const chevronIcon = (\n <span className={cn('chevron', open && 'open')} aria-hidden=\"true\">\n <MChevronDownIcon />\n </span>\n )\n\n return (\n <div className={cn('collapsible', className)} {...rest}>\n <MButton\n variant=\"ghost\"\n color={color}\n className=\"trigger\"\n aria-expanded={open}\n aria-controls={panelId}\n onClick={handleToggle}\n endIcon={chevronIcon}\n >\n {title}\n </MButton>\n {/* A closed panel is inert: its content leaves the Tab order, not just the a11y tree. */}\n <div id={panelId} className={cn('content-wrap', open && 'open')} aria-hidden={!open} inert={!open}>\n {/* The clip row carries no padding, so the collapsed 0fr track really is 0px tall. */}\n <div className=\"collapsible-clip\">\n <MStack className=\"content\">{children}</MStack>\n </div>\n </div>\n </div>\n )\n}\n","import {useState, useCallback, Children, isValidElement} from 'react'\nimport {MCollapsible} from '../MCollapsible'\nimport {cn} from '../../../utils/cn'\nimport type {MAccordionProps, MAccordionItemProps} from './MAccordion.types'\nimport './MAccordion.css'\n\nexport function MAccordionItem(_props: MAccordionItemProps) {\n return null\n}\n\nexport function MAccordion({\n multiple = false,\n defaultOpen,\n onChange,\n bordered = false,\n color,\n className,\n children,\n ...rest\n}: MAccordionProps) {\n const initialOpen = Array.isArray(defaultOpen) ? defaultOpen : defaultOpen ? [defaultOpen] : []\n\n const [openIds, setOpenIds] = useState<string[]>(initialOpen)\n\n const handleToggle = useCallback(\n (id: string, isOpen: boolean) => {\n setOpenIds((prev) => {\n let next: string[]\n if (isOpen) {\n next = multiple ? [...prev, id] : [id]\n } else {\n next = prev.filter((v) => v !== id)\n }\n onChange?.(next)\n return next\n })\n },\n [multiple, onChange]\n )\n\n const items = Children.toArray(children).filter(\n (child) => isValidElement(child) && (child.type as any) === MAccordionItem\n )\n\n return (\n <div className={cn('accordion', bordered && 'bordered', className)} {...rest}>\n {items.map((child) => {\n if (!isValidElement<MAccordionItemProps>(child)) return null\n const {id, title, children: content, disabled, color: itemColor} = child.props\n const isOpen = openIds.includes(id)\n\n return (\n <div key={id} className={cn('accordion-item', disabled && 'disabled')}>\n <MCollapsible\n title={title}\n open={isOpen}\n onToggle={disabled ? undefined : (open) => handleToggle(id, open)}\n color={itemColor ?? color}\n >\n {content}\n </MCollapsible>\n </div>\n )\n })}\n </div>\n )\n}\n","import {useState, useEffect, useRef, useCallback} from 'react'\nimport type {MProgressBarProps} from './MProgressBar.types'\nimport {cn} from '../../../utils/cn'\nimport './MProgressBar.css'\n\nconst DURATION = 800\n\nfunction easeOutCubic(t: number) {\n return 1 - Math.pow(1 - t, 3)\n}\n\n// Render a horizontal bar that fills to represent progress as a percentage.\nexport function MProgressBar({\n value,\n max = 100,\n color = 'primary',\n size = 'md',\n label,\n showValue = false,\n animated = false,\n striped = false,\n className,\n ...rest\n}: MProgressBarProps) {\n const percent = Math.min(100, Math.max(0, (value / max) * 100))\n const [displayPercent, setDisplayPercent] = useState(0)\n const [barPercent, setBarPercent] = useState(0)\n const prevPercent = useRef(0)\n const rafRef = useRef(0)\n\n const animate = useCallback((from: number, to: number) => {\n cancelAnimationFrame(rafRef.current)\n\n // Reduced motion: jump straight to the value instead of counting up.\n if (typeof window.matchMedia === 'function' && window.matchMedia('(prefers-reduced-motion: reduce)').matches) {\n setBarPercent(to)\n setDisplayPercent(to)\n return\n }\n const start = performance.now()\n\n const step = (now: number) => {\n const elapsed = now - start\n const progress = Math.min(elapsed / DURATION, 1)\n const eased = easeOutCubic(progress)\n const current = from + (to - from) * eased\n\n setDisplayPercent(current)\n if (progress < 1) {\n rafRef.current = requestAnimationFrame(step)\n }\n }\n\n // Set bar width immediately for CSS transition\n setBarPercent(to)\n rafRef.current = requestAnimationFrame(step)\n }, [])\n\n useEffect(() => {\n animate(prevPercent.current, percent)\n prevPercent.current = percent\n return () => cancelAnimationFrame(rafRef.current)\n }, [percent, animate])\n\n return (\n <div\n className={cn('progress-bar', `color-${color}`, size, className)}\n role=\"progressbar\"\n aria-valuenow={value}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-label={label}\n {...rest}\n >\n {(label || showValue) && (\n <div className=\"progress-bar-header\">\n {label && <span className=\"progress-bar-label\">{label}</span>}\n {showValue && <span className=\"progress-bar-value\">{Math.round(displayPercent)}%</span>}\n </div>\n )}\n <div className=\"progress-bar-track\">\n <div\n className={cn('progress-bar-fill', animated && 'animated', striped && 'striped')}\n style={{width: `${barPercent}%`}}\n />\n </div>\n </div>\n )\n}\n","import {useState, useEffect, useRef} from 'react'\nimport type {MCountUpProps} from './MCountUp.types'\nimport {cn} from '../../../utils/cn'\n\n// Animate a number from a start value to a target, with an easing curve.\nexport function MCountUp({\n value,\n from = 0,\n duration = 1000,\n decimals = 0,\n prefix = '',\n suffix = '',\n separator = '',\n className,\n ...rest\n}: MCountUpProps) {\n const [display, setDisplay] = useState(from)\n const rafRef = useRef<number>(0)\n const startRef = useRef<number | null>(null)\n\n useEffect(() => {\n const startValue = display\n startRef.current = null\n\n const step = (timestamp: number) => {\n if (startRef.current === null) startRef.current = timestamp\n const elapsed = timestamp - startRef.current\n const progress = Math.min(elapsed / duration, 1)\n const eased = 1 - Math.pow(1 - progress, 3)\n const current = startValue + (value - startValue) * eased\n\n setDisplay(current)\n\n if (progress < 1) {\n rafRef.current = requestAnimationFrame(step)\n }\n }\n\n rafRef.current = requestAnimationFrame(step)\n return () => cancelAnimationFrame(rafRef.current)\n }, [value, duration])\n\n const formatted = formatNumber(display, decimals, separator)\n\n return (\n <span className={cn('count-up', className)} {...rest}>\n {prefix}\n {formatted}\n {suffix}\n </span>\n )\n}\n\nfunction formatNumber(num: number, decimals: number, separator: string): string {\n const fixed = num.toFixed(decimals)\n if (!separator) return fixed\n\n const [int, dec] = fixed.split('.')\n const withSep = int.replace(/\\B(?=(\\d{3})+(?!\\d))/g, separator)\n return dec !== undefined ? `${withSep}.${dec}` : withSep\n}\n","import {useEffect, useLayoutEffect, useMemo, useRef, useState} from 'react'\nimport type {MCodeBlockProps} from './MCodeBlock.types'\nimport {MCard, MCardBody, MCardHeader} from '../../cards'\nimport {MButton} from '../../controls'\nimport {MBadge} from '../../feedback'\nimport {MInline} from '../../layout'\nimport {MText} from '../../typography'\nimport {MCopyIcon} from '../../../icons'\nimport {cn} from '../../../utils/cn'\nimport './MCodeBlock.css'\nimport type {HLJSApi, LanguageFn} from 'highlight.js'\nimport {useMCodeBlockTexts} from '../../../i18n/frameworkTexts'\n\n// Layout effect in the browser (no flash of the full code before typing starts), plain effect on the server.\nconst useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect\n\nfunction prefersReducedMotion(): boolean {\n return (\n typeof window !== 'undefined' &&\n typeof window.matchMedia === 'function' &&\n window.matchMedia('(prefers-reduced-motion: reduce)').matches\n )\n}\n\nconst languageMap: Record<string, string> = {\n c: 'c',\n cpp: 'cpp',\n 'c++': 'cpp',\n arduino: 'arduino',\n ino: 'arduino',\n ts: 'typescript',\n typescript: 'typescript',\n tsx: 'tsx',\n js: 'javascript',\n javascript: 'javascript',\n jsx: 'jsx',\n json: 'json',\n css: 'css',\n html: 'html',\n markup: 'html',\n bash: 'bash',\n shell: 'bash',\n shellscript: 'bash',\n php: 'php',\n}\n\nconst languageLoaders: Record<string, () => Promise<{default: LanguageFn}>> = {\n xml: () => import('highlight.js/lib/languages/xml'),\n css: () => import('highlight.js/lib/languages/css'),\n javascript: () => import('highlight.js/lib/languages/javascript'),\n typescript: () => import('highlight.js/lib/languages/typescript'),\n json: () => import('highlight.js/lib/languages/json'),\n bash: () => import('highlight.js/lib/languages/bash'),\n c: () => import('highlight.js/lib/languages/c'),\n cpp: () => import('highlight.js/lib/languages/cpp'),\n arduino: () => import('highlight.js/lib/languages/arduino'),\n php: () => import('highlight.js/lib/languages/php'),\n}\n\nlet highlightJsPromise: Promise<HLJSApi> | null = null\nconst codeBlockTypingSpeed = 42\nconst codeBlockTypingStartDelay = 200\n\nfunction escapeHtml(value: string): string {\n return value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')\n}\n\nfunction resolveLanguage(language: string): string {\n return languageMap[language] ?? language\n}\n\nasync function getHighlightJs(): Promise<HLJSApi> {\n if (!highlightJsPromise) {\n highlightJsPromise = (async () => {\n const highlightJsCore = (await import('highlight.js/lib/core')).default\n const highlightJs = highlightJsCore.newInstance()\n\n for (const [language, loadLanguage] of Object.entries(languageLoaders)) {\n const definition = await loadLanguage()\n highlightJs.registerLanguage(language, definition.default)\n }\n\n highlightJs.registerAliases(['shell', 'shellscript'], {languageName: 'bash'})\n highlightJs.registerAliases('markup', {languageName: 'xml'})\n\n return highlightJs\n })()\n }\n\n return highlightJsPromise\n}\n\n// Render a syntax-highlighted code block with optional card header and copy action.\nexport function MCodeBlock({\n code,\n language = 'tsx',\n title,\n showHeader = true,\n showLanguage = true,\n showCopyButton = true,\n copyLabel: copyLabelProp,\n copiedLabel: copiedLabelProp,\n maxHeight,\n stretch = false,\n animated = false,\n lineNumbers = false,\n className,\n ...rest\n}: MCodeBlockProps) {\n const texts = useMCodeBlockTexts()\n const copyLabel = copyLabelProp ?? texts.copy\n const copiedLabel = copiedLabelProp ?? texts.copied\n const normalizedLanguage = useMemo(() => resolveLanguage(language.trim().toLowerCase()), [language])\n // The server (and the first client render) always gets the full code; typing starts in the browser.\n const [visibleLength, setVisibleLength] = useState(() => code.length)\n const [typing, setTyping] = useState(false)\n const renderedCode = typing ? code.slice(0, visibleLength) : code\n const [highlightedCode, setHighlightedCode] = useState(() => escapeHtml(renderedCode))\n const [copied, setCopied] = useState(false)\n const copyTimeoutRef = useRef<number | null>(null)\n const typingTimeoutRef = useRef<number | null>(null)\n const scrollRef = useRef<HTMLDivElement | null>(null)\n const canCopy = typeof navigator !== 'undefined' && typeof navigator.clipboard?.writeText === 'function'\n const hasHeader = showHeader && (Boolean(title) || showLanguage || showCopyButton)\n const lineCount = useMemo(() => Math.max(1, renderedCode.split('\\n').length), [renderedCode])\n\n useIsomorphicLayoutEffect(() => {\n if (typingTimeoutRef.current !== null) {\n window.clearTimeout(typingTimeoutRef.current)\n typingTimeoutRef.current = null\n }\n\n // Reduced motion shows the finished code straight away.\n const shouldType = animated && !prefersReducedMotion()\n setTyping(shouldType)\n setVisibleLength(shouldType ? 0 : code.length)\n if (shouldType) {\n setHighlightedCode('')\n }\n }, [animated, code])\n\n useEffect(() => {\n if (!typing || code.length === 0) {\n return\n }\n\n if (visibleLength < code.length) {\n typingTimeoutRef.current = window.setTimeout(\n () => {\n setVisibleLength((current) => Math.min(current + 1, code.length))\n typingTimeoutRef.current = null\n },\n visibleLength === 0 ? codeBlockTypingStartDelay : codeBlockTypingSpeed\n )\n }\n\n return () => {\n if (typingTimeoutRef.current !== null) {\n window.clearTimeout(typingTimeoutRef.current)\n typingTimeoutRef.current = null\n }\n }\n }, [typing, code.length, visibleLength])\n\n useEffect(() => {\n let active = true\n\n async function highlightCode() {\n try {\n const highlightJs = await getHighlightJs()\n const languageDefinition = highlightJs.getLanguage(normalizedLanguage)\n const html = languageDefinition\n ? highlightJs.highlight(renderedCode, {\n language: normalizedLanguage,\n ignoreIllegals: true,\n }).value\n : escapeHtml(renderedCode)\n\n if (active) {\n setHighlightedCode(html)\n }\n } catch {\n if (active) {\n setHighlightedCode(escapeHtml(renderedCode))\n }\n }\n }\n\n void highlightCode()\n\n return () => {\n active = false\n }\n }, [normalizedLanguage, renderedCode])\n\n useEffect(() => {\n return () => {\n if (copyTimeoutRef.current !== null) {\n window.clearTimeout(copyTimeoutRef.current)\n }\n\n if (typingTimeoutRef.current !== null) {\n window.clearTimeout(typingTimeoutRef.current)\n }\n }\n }, [])\n\n useEffect(() => {\n if (!typing || !scrollRef.current) {\n return\n }\n\n scrollRef.current.scrollTop = scrollRef.current.scrollHeight\n }, [typing, visibleLength])\n\n async function handleCopy() {\n if (!canCopy) {\n return\n }\n\n try {\n await navigator.clipboard.writeText(code)\n setCopied(true)\n\n if (copyTimeoutRef.current !== null) {\n window.clearTimeout(copyTimeoutRef.current)\n }\n\n copyTimeoutRef.current = window.setTimeout(() => {\n setCopied(false)\n copyTimeoutRef.current = null\n }, 1200)\n } catch {\n setCopied(false)\n }\n }\n\n return (\n <MCard className={cn('code-block-card', className)} {...rest} padded={false} stretch={stretch}>\n {hasHeader && (\n <MCardHeader className=\"code-block-header\">\n <MInline\n className=\"code-block-header-layout\"\n align=\"center\"\n justify=\"between\"\n wrap=\"nowrap\"\n px=\"lg\"\n py=\"md\"\n >\n <MInline className=\"code-block-header-meta\" align=\"center\" wrap=\"wrap\">\n {title && (\n <MText as=\"span\" className=\"code-block-title\" size=\"sm\" weight=\"semibold\">\n {title}\n </MText>\n )}\n {showLanguage && language && (\n <MBadge color=\"info\" size=\"sm\">\n {language}\n </MBadge>\n )}\n </MInline>\n {showCopyButton && (\n <MButton\n variant=\"ghost\"\n size=\"sm\"\n color=\"neutral\"\n startIcon={<MCopyIcon size=\"sm\" aria-hidden=\"true\" />}\n onClick={handleCopy}\n disabled={!canCopy}\n >\n {copied ? copiedLabel : copyLabel}\n </MButton>\n )}\n {showCopyButton && (\n <span className=\"code-block-status\" role=\"status\">\n {copied ? copiedLabel : ''}\n </span>\n )}\n </MInline>\n </MCardHeader>\n )}\n\n <MCardBody className=\"code-block-body\">\n {/* Scrollable region: focusable so keyboard users can scroll it (WCAG 2.1.1). */}\n <div\n ref={scrollRef}\n className=\"code-block-scroll\"\n style={maxHeight ? {maxHeight, overflowY: 'auto'} : undefined}\n role=\"region\"\n tabIndex={0}\n aria-label={typeof title === 'string' && title.trim() !== '' ? title : texts.label}\n >\n <pre\n className={cn(\n 'code-block-pre',\n lineNumbers && 'with-line-numbers',\n `language-${normalizedLanguage}`\n )}\n >\n {lineNumbers && (\n <span className=\"code-block-line-numbers\" aria-hidden=\"true\">\n {Array.from({length: lineCount}, (_, index) => (\n <span key={index + 1} className=\"code-block-line-number\">\n {index + 1}\n </span>\n ))}\n </span>\n )}\n <span className=\"code-block-code-shell\">\n <code\n className={cn('code-block-code', 'hljs', `language-${normalizedLanguage}`)}\n dangerouslySetInnerHTML={{__html: highlightedCode}}\n />\n </span>\n </pre>\n </div>\n </MCardBody>\n </MCard>\n )\n}\n","import {useEffect, useRef} from 'react'\nimport type {CSSProperties} from 'react'\nimport type {MRevealProps} from './MReveal.types'\nimport {cn} from '../../../utils/cn'\n\nfunction getRevealOffset(direction: MRevealProps['direction'], distance: number) {\n switch (direction) {\n case 'down':\n return {x: 0, y: -distance}\n case 'left':\n return {x: distance, y: 0}\n case 'right':\n return {x: -distance, y: 0}\n case 'none':\n return {x: 0, y: 0}\n case 'up':\n default:\n return {x: 0, y: distance}\n }\n}\n\nexport function MReveal({\n children,\n direction = 'up',\n delay = 0,\n duration = 0.46,\n distance = 20,\n once = true,\n trigger = 'view',\n className,\n style,\n ...rest\n}: MRevealProps) {\n const revealRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const node = revealRef.current\n if (!node) {\n return\n }\n\n const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches\n\n node.classList.remove('revealed')\n\n if (prefersReducedMotion) {\n node.classList.add('revealed')\n return\n }\n\n if (trigger === 'mount') {\n const frame = window.requestAnimationFrame(() => {\n node.classList.add('revealed')\n })\n\n return () => window.cancelAnimationFrame(frame)\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n node.classList.add('revealed')\n if (once) {\n observer.disconnect()\n }\n } else if (!once) {\n node.classList.remove('revealed')\n }\n }\n },\n {threshold: 0.2}\n )\n\n observer.observe(node)\n\n return () => observer.disconnect()\n }, [delay, direction, distance, duration, once, trigger])\n\n const offset = getRevealOffset(direction, distance)\n const revealStyle = {\n minWidth: 0,\n maxWidth: '100%',\n '--reveal-delay': `${delay}s`,\n '--reveal-duration': `${duration}s`,\n '--reveal-translate-x': `${offset.x}px`,\n '--reveal-translate-y': `${offset.y}px`,\n ...style,\n } as CSSProperties\n\n return (\n <div ref={revealRef} className={cn('reveal', className)} style={revealStyle} {...rest}>\n {children}\n </div>\n )\n}\n","import {useEffect, useMemo, useState} from 'react'\nimport type {MTimeAgoProps, MTimeAgoUpdate} from './MTimeAgo.types'\nimport {cn} from '../../../utils/cn'\nimport {useDocumentLocale} from '../../../utils/locale'\nimport {\n formatAbsoluteTime,\n formatRelativeTime,\n getAutoUpdateInterval,\n parseRelativeThreshold,\n toDate,\n} from '../../../utils/relativeTime'\nimport './MTimeAgo.css'\n\nfunction getUpdateInterval(update: MTimeAgoUpdate, value: Date | string | number, now: number): number | null {\n if (update === 'none') return null\n if (update === 'minute') return 60 * 1000\n if (update === 'hour') return 60 * 60 * 1000\n if (update === 'day') return 24 * 60 * 60 * 1000\n return getAutoUpdateInterval(value, now)\n}\n\nexport function MTimeAgo({\n value,\n locale: localeOverride,\n maxRelative,\n fallbackFormat = 'date',\n titleAbsolute = true,\n update = 'auto',\n className,\n ...rest\n}: MTimeAgoProps) {\n const locale = useDocumentLocale(localeOverride)\n const [now, setNow] = useState(() => Date.now())\n const interval = useMemo(() => getUpdateInterval(update, value, now), [now, update, value])\n\n useEffect(() => {\n if (!interval) return\n\n const id = window.setInterval(() => setNow(Date.now()), interval)\n return () => window.clearInterval(id)\n }, [interval])\n\n const date = useMemo(() => toDate(value), [value])\n const maxRelativeMs = useMemo(() => parseRelativeThreshold(maxRelative), [maxRelative])\n\n const absolute = useMemo(() => formatAbsoluteTime(value, locale, fallbackFormat), [value, locale, fallbackFormat])\n\n const content = useMemo(() => {\n if (!date) return String(value)\n\n const diff = Math.abs(date.getTime() - now)\n if (maxRelativeMs != null && diff > maxRelativeMs) {\n return absolute ?? String(value)\n }\n\n return formatRelativeTime(date, {locale, now}) ?? absolute ?? String(value)\n }, [absolute, date, locale, maxRelativeMs, now, value])\n\n return (\n <time\n className={cn('time ago', className)}\n dateTime={date?.toISOString()}\n title={titleAbsolute ? (absolute ?? undefined) : undefined}\n {...rest}\n >\n {content}\n </time>\n )\n}\n","import {useCallback, useEffect, useId, useRef, useState} from 'react'\nimport type * as React from 'react'\nimport type {MColorPickerProps} from './MColorPicker.types'\nimport {cn} from '../../../utils/cn'\nimport './MColorPicker.css'\nimport {formatMText, useMColorPickerTexts} from '../../../i18n/frameworkTexts'\nimport {getRadioGroupTarget, isRtlElement} from '../../../utils/radioGroupKeys'\n\nfunction hsvToHex(h: number, s: number, v: number): string {\n const f = (n: number) => {\n const k = (n + h / 60) % 6\n return v - v * s * Math.max(0, Math.min(k, 4 - k, 1))\n }\n const r = Math.round(f(5) * 255)\n const g = Math.round(f(3) * 255)\n const b = Math.round(f(1) * 255)\n return `#${[r, g, b].map((c) => c.toString(16).padStart(2, '0')).join('')}`\n}\n\nfunction hexToHsv(hex: string): [number, number, number] {\n const m = hex.replace('#', '').match(/.{2}/g)\n if (!m) return [0, 0, 1]\n const [r, g, b] = m.map((c) => parseInt(c, 16) / 255)\n const max = Math.max(r, g, b)\n const min = Math.min(r, g, b)\n const d = max - min\n let h = 0\n if (d !== 0) {\n if (max === r) h = ((g - b) / d + 6) % 6\n else if (max === g) h = (b - r) / d + 2\n else h = (r - g) / d + 4\n h *= 60\n }\n const s = max === 0 ? 0 : d / max\n return [h, s, max]\n}\n\nfunction hexToRgb(hex: string): string {\n const m = hex.replace('#', '').match(/.{2}/g)\n if (!m) return 'rgb(0, 0, 0)'\n const [r, g, b] = m.map((c) => parseInt(c, 16))\n return `rgb(${r}, ${g}, ${b})`\n}\n\nfunction hexToHsl(hex: string): string {\n const m = hex.replace('#', '').match(/.{2}/g)\n if (!m) return 'hsl(0, 0%, 0%)'\n const [r, g, b] = m.map((c) => parseInt(c, 16) / 255)\n const max = Math.max(r, g, b)\n const min = Math.min(r, g, b)\n const l = (max + min) / 2\n let h = 0\n let s = 0\n if (max !== min) {\n const d = max - min\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min)\n if (max === r) h = ((g - b) / d + 6) % 6\n else if (max === g) h = (b - r) / d + 2\n else h = (r - g) / d + 4\n h *= 60\n }\n return `hsl(${Math.round(h)}, ${Math.round(s * 100)}%, ${Math.round(l * 100)}%)`\n}\n\nfunction formatOutput(hex: string, format: string): string {\n if (format === 'rgb') return hexToRgb(hex)\n if (format === 'hsl') return hexToHsl(hex)\n return hex\n}\n\nfunction toHexByte(value: number): string {\n return Math.round(Math.max(0, Math.min(255, value)))\n .toString(16)\n .padStart(2, '0')\n}\n\nfunction hslToHex(h: number, s: number, l: number): string {\n const hue = ((h % 360) + 360) % 360\n const sat = Math.max(0, Math.min(1, s))\n const light = Math.max(0, Math.min(1, l))\n const a = sat * Math.min(light, 1 - light)\n const f = (n: number) => {\n const k = (n + hue / 30) % 12\n return light - a * Math.max(-1, Math.min(k - 3, 9 - k, 1))\n }\n return `#${toHexByte(f(0) * 255)}${toHexByte(f(8) * 255)}${toHexByte(f(4) * 255)}`\n}\n\n// Parse #rgb, #rrggbb, rgb() and hsl() into #rrggbb; null when the text is not a colour (yet).\nfunction parseColor(value: string): string | null {\n const text = value.trim().toLowerCase()\n if (!text) return null\n\n const hexMatch = text.match(/^#([0-9a-f]{3}|[0-9a-f]{6})$/)\n if (hexMatch) {\n const digits = hexMatch[1]\n return digits.length === 3\n ? `#${digits\n .split('')\n .map((c) => c + c)\n .join('')}`\n : `#${digits}`\n }\n\n const rgbMatch = text.match(/^rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(?:,\\s*[\\d.]+\\s*)?\\)$/)\n if (rgbMatch) {\n const channels = [rgbMatch[1], rgbMatch[2], rgbMatch[3]].map(Number)\n if (channels.some((c) => c > 255)) return null\n return `#${channels.map(toHexByte).join('')}`\n }\n\n const hslMatch = text.match(/^hsla?\\(\\s*(-?[\\d.]+)(?:deg)?\\s*,\\s*([\\d.]+)%\\s*,\\s*([\\d.]+)%\\s*(?:,\\s*[\\d.]+\\s*)?\\)$/)\n if (hslMatch) {\n const [h, s, l] = [hslMatch[1], hslMatch[2], hslMatch[3]].map(Number)\n if ([h, s, l].some((n) => !Number.isFinite(n)) || s > 100 || l > 100) return null\n return hslToHex(h, s / 100, l / 100)\n }\n\n return null\n}\n\nfunction normalizeToHex(value: string): string {\n return parseColor(value) ?? '#000000'\n}\n\nconst DEFAULT_SWATCHES = [\n '#ef4444',\n '#f97316',\n '#eab308',\n '#22c55e',\n '#06b6d4',\n '#3b82f6',\n '#8b5cf6',\n '#ec4899',\n '#000000',\n '#ffffff',\n]\n\nexport function MColorPicker({\n value,\n onChange,\n swatches = DEFAULT_SWATCHES,\n format = 'hex',\n size = 'md',\n label,\n disabled = false,\n className,\n ...rest\n}: MColorPickerProps) {\n const texts = useMColorPickerTexts()\n const inputId = useId()\n const hex = normalizeToHex(value ?? '#3b82f6')\n const [hsv, setHsv] = useState<[number, number, number]>(() => hexToHsv(hex))\n const [inputValue, setInputValue] = useState(formatOutput(hex, format))\n const areaRef = useRef<HTMLDivElement>(null)\n const hueRef = useRef<HTMLDivElement>(null)\n const swatchRefs = useRef<(HTMLButtonElement | null)[]>([])\n const dragging = useRef<'area' | 'hue' | null>(null)\n // Value this picker last sent through onChange, so its echo does not reset local state.\n const lastEmittedRef = useRef<string | null>(null)\n const formatRef = useRef(format)\n\n useEffect(() => {\n const formatChanged = formatRef.current !== format\n formatRef.current = format\n const newHex = normalizeToHex(value ?? '#3b82f6')\n // Black / greys carry no hue (s = 0 or v = 0): keep the current HSV when it already\n // produces this colour, otherwise the hue snaps back to 0 mid-drag.\n setHsv((prev) => (hsvToHex(prev[0], prev[1], prev[2]) === newHex ? prev : hexToHsv(newHex)))\n if (formatChanged || value !== lastEmittedRef.current) {\n setInputValue(formatOutput(newHex, format))\n }\n }, [value, format])\n\n const emit = useCallback(\n (h: number, s: number, v: number) => {\n const newHex = hsvToHex(h, s, v)\n const output = formatOutput(newHex, format)\n setHsv([h, s, v])\n setInputValue(output)\n lastEmittedRef.current = output\n onChange?.(output)\n },\n [onChange, format]\n )\n\n function handleAreaPointer(e: React.PointerEvent | PointerEvent) {\n const rect = areaRef.current?.getBoundingClientRect()\n if (!rect) return\n const s = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width))\n const v = Math.max(0, Math.min(1, 1 - (e.clientY - rect.top) / rect.height))\n emit(hsv[0], s, v)\n }\n\n function handleHuePointer(e: React.PointerEvent | PointerEvent) {\n const rect = hueRef.current?.getBoundingClientRect()\n if (!rect) return\n const h = Math.max(0, Math.min(360, ((e.clientX - rect.left) / rect.width) * 360))\n emit(h, hsv[1], hsv[2])\n }\n\n useEffect(() => {\n function onMove(e: PointerEvent) {\n if (dragging.current === 'area') handleAreaPointer(e)\n else if (dragging.current === 'hue') handleHuePointer(e)\n }\n function onUp() {\n dragging.current = null\n }\n window.addEventListener('pointermove', onMove)\n window.addEventListener('pointerup', onUp)\n return () => {\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', onUp)\n }\n })\n\n function handleInputChange(val: string) {\n setInputValue(val)\n const parsed = parseColor(val)\n // Incomplete text while typing is kept as-is and not emitted.\n if (parsed) {\n const output = formatOutput(parsed, format)\n setHsv((prev) => (hsvToHex(prev[0], prev[1], prev[2]) === parsed ? prev : hexToHsv(parsed)))\n lastEmittedRef.current = output\n onChange?.(output)\n }\n }\n\n const currentHex = hsvToHex(hsv[0], hsv[1], hsv[2])\n\n // Keyboard for the saturation / brightness area (2D slider): Left / Right change saturation,\n // Up / Down brightness, PageUp / PageDown brightness by 10 %, Home / End saturation 0 / 100 %.\n // Shift multiplies the arrow step by 10.\n function handleAreaKeyDown(e: React.KeyboardEvent<HTMLDivElement>) {\n if (disabled) return\n const unit = e.shiftKey ? 0.1 : 0.01\n let s = hsv[1]\n let v = hsv[2]\n switch (e.key) {\n case 'ArrowRight':\n s += unit\n break\n case 'ArrowLeft':\n s -= unit\n break\n case 'ArrowUp':\n v += unit\n break\n case 'ArrowDown':\n v -= unit\n break\n case 'PageUp':\n v += 0.1\n break\n case 'PageDown':\n v -= 0.1\n break\n case 'Home':\n s = 0\n break\n case 'End':\n s = 1\n break\n default:\n return\n }\n e.preventDefault()\n const round = (n: number) => Math.round(Math.max(0, Math.min(1, n)) * 100) / 100\n emit(hsv[0], round(s), round(v))\n }\n\n // APG slider keys for the hue: arrows 1 degree, Shift + arrows / PageUp / PageDown 10, Home / End.\n function handleHueKeyDown(e: React.KeyboardEvent<HTMLDivElement>) {\n if (disabled) return\n const unit = e.shiftKey ? 10 : 1\n let h = Math.round(hsv[0])\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowUp':\n h += unit\n break\n case 'ArrowLeft':\n case 'ArrowDown':\n h -= unit\n break\n case 'PageUp':\n h += 10\n break\n case 'PageDown':\n h -= 10\n break\n case 'Home':\n h = 0\n break\n case 'End':\n h = 360\n break\n default:\n return\n }\n e.preventDefault()\n emit(Math.max(0, Math.min(360, h)), hsv[1], hsv[2])\n }\n\n const selectedSwatch = swatches.findIndex((swatch) => currentHex.toLowerCase() === swatch.toLowerCase())\n const tabbableSwatch = selectedSwatch >= 0 ? selectedSwatch : 0\n\n function selectSwatch(swatch: string) {\n if (disabled) return\n const [h, s, v] = hexToHsv(swatch)\n emit(h, s, v)\n }\n\n // APG radio group: arrows move focus and select, wrapping; Home / End jump to the ends.\n function handleSwatchesKeyDown(e: React.KeyboardEvent<HTMLDivElement>) {\n if (disabled || e.altKey || e.ctrlKey || e.metaKey) return\n const current = swatchRefs.current.findIndex((el) => el === e.target)\n if (current < 0) return\n const target = getRadioGroupTarget(e.key, current, swatches.length, isRtlElement(e.currentTarget))\n if (target === null) return\n e.preventDefault()\n swatchRefs.current[target]?.focus()\n selectSwatch(swatches[target])\n }\n\n const saturationPercent = Math.round(hsv[1] * 100)\n const brightnessPercent = Math.round(hsv[2] * 100)\n const hueDegrees = Math.round(hsv[0])\n\n return (\n <div className={cn('color-picker', size, disabled && 'disabled', className)} {...rest}>\n {label && (\n <label className=\"label\" htmlFor={inputId}>\n {label}\n </label>\n )}\n\n <div\n ref={areaRef}\n className=\"area\"\n style={{background: `hsl(${hsv[0]}, 100%, 50%)`}}\n role=\"slider\"\n tabIndex={disabled ? -1 : 0}\n aria-label={texts.area}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={saturationPercent}\n aria-valuetext={formatMText(texts.areaValue, {\n saturation: saturationPercent,\n brightness: brightnessPercent,\n })}\n aria-disabled={disabled || undefined}\n onKeyDown={handleAreaKeyDown}\n onPointerDown={(e) => {\n if (disabled) return\n // Pointer presses focus the area so the keyboard continues from there.\n e.currentTarget.focus({preventScroll: true})\n dragging.current = 'area'\n handleAreaPointer(e)\n }}\n >\n <div className=\"white\" />\n <div className=\"black\" />\n <div\n className=\"cursor\"\n style={{\n left: `${hsv[1] * 100}%`,\n top: `${(1 - hsv[2]) * 100}%`,\n background: currentHex,\n }}\n />\n </div>\n\n <div\n ref={hueRef}\n className=\"hue\"\n role=\"slider\"\n tabIndex={disabled ? -1 : 0}\n aria-label={texts.hue}\n aria-valuemin={0}\n aria-valuemax={360}\n aria-valuenow={hueDegrees}\n aria-valuetext={formatMText(texts.hueValue, {value: hueDegrees})}\n aria-orientation=\"horizontal\"\n aria-disabled={disabled || undefined}\n onKeyDown={handleHueKeyDown}\n onPointerDown={(e) => {\n if (disabled) return\n e.currentTarget.focus({preventScroll: true})\n dragging.current = 'hue'\n handleHuePointer(e)\n }}\n >\n <div className=\"hue-thumb\" style={{left: `${(hsv[0] / 360) * 100}%`}} />\n </div>\n\n <div className=\"controls\">\n <div className=\"preview\" style={{background: currentHex}} />\n <input\n id={inputId}\n type=\"text\"\n aria-label={label ? undefined : texts.input}\n className=\"input\"\n value={inputValue}\n onChange={(e) => handleInputChange(e.target.value)}\n disabled={disabled}\n />\n </div>\n\n {swatches.length > 0 && (\n <div\n className=\"swatches\"\n role=\"radiogroup\"\n aria-label={texts.swatches}\n aria-disabled={disabled || undefined}\n onKeyDown={handleSwatchesKeyDown}\n >\n {swatches.map((swatch, index) => (\n <button\n key={swatch}\n ref={(el) => {\n swatchRefs.current[index] = el\n }}\n type=\"button\"\n role=\"radio\"\n className={cn('swatch', index === selectedSwatch && 'active')}\n style={{background: swatch}}\n aria-label={formatMText(texts.swatch, {color: swatch})}\n aria-checked={index === selectedSwatch}\n tabIndex={!disabled && index === tabbableSwatch ? 0 : -1}\n onClick={() => selectSwatch(swatch)}\n />\n ))}\n </div>\n )}\n </div>\n )\n}\n","import {isValidElement, cloneElement} from 'react'\nimport type {MEmptyStateProps} from './MEmptyState.types'\nimport {MButton} from '../../controls/MButton'\nimport {cn} from '../../../utils/cn'\nimport './MEmptyState.css'\n\nconst BUTTON_SIZE_MAP = {xs: 'xs', sm: 'sm', md: 'sm', lg: 'md', xl: 'lg'} as const\n\nexport function MEmptyState({\n icon,\n illustration,\n title,\n description,\n buttonText,\n onAction,\n color = 'neutral',\n size = 'md',\n className,\n children,\n ...rest\n}: MEmptyStateProps) {\n return (\n <div className={cn('empty-state', `color-${color}`, size, className)} {...rest}>\n {illustration && (\n <div className=\"empty-state-illustration\">\n {isValidElement(illustration) ? cloneElement(illustration, {color} as any) : illustration}\n </div>\n )}\n {!illustration && icon && <div className=\"empty-state-icon\">{icon}</div>}\n <div className=\"empty-state-content\">\n <div className=\"empty-state-title\">{title}</div>\n {description && <div className=\"empty-state-description\">{description}</div>}\n </div>\n {buttonText && onAction && (\n <div className=\"empty-state-action\">\n <MButton size={BUTTON_SIZE_MAP[size]} variant=\"outlined\" color={color} onClick={onAction}>\n {buttonText}\n </MButton>\n </div>\n )}\n {children}\n </div>\n )\n}\n","import {useCallback, useState} from 'react'\nimport type {CSSProperties, KeyboardEvent, MouseEvent} from 'react'\nimport type {MBlurProps} from './MBlur.types'\nimport {cn} from '../../../utils/cn'\nimport './MBlur.css'\n\n// Obscure inline content with a CSS blur filter until the viewer opts in to reveal it.\nexport function MBlur({\n children,\n amount = 6,\n reveal = 'hover',\n revealed,\n defaultRevealed = false,\n onToggle,\n inline = true,\n className,\n style,\n onClick,\n onKeyDown,\n ...rest\n}: MBlurProps) {\n const controlled = revealed !== undefined\n const [internal, setInternal] = useState(defaultRevealed)\n const isRevealed = controlled ? revealed : internal\n const interactive = reveal !== 'none'\n\n const setRevealed = useCallback(\n (next: boolean) => {\n if (!controlled) {\n setInternal(next)\n }\n onToggle?.(next)\n },\n [controlled, onToggle]\n )\n\n const handleClick = (event: MouseEvent<HTMLSpanElement>) => {\n if (reveal === 'click') {\n setRevealed(!isRevealed)\n }\n onClick?.(event)\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLSpanElement>) => {\n if (reveal === 'click' && (event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault()\n setRevealed(!isRevealed)\n }\n onKeyDown?.(event)\n }\n\n const mergedStyle: CSSProperties = {\n ...style,\n ['--mineral-blur-amount' as string]: `${amount}px`,\n }\n\n return (\n <span\n className={cn('blur', inline ? 'inline' : 'block', `reveal-${reveal}`, isRevealed && 'revealed', className)}\n style={mergedStyle}\n tabIndex={interactive && reveal === 'click' ? 0 : undefined}\n role={reveal === 'click' ? 'button' : undefined}\n aria-pressed={reveal === 'click' ? isRevealed : undefined}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n <span className={'blur-inner'} aria-hidden={!isRevealed}>\n {children}\n </span>\n </span>\n )\n}\n","import {Children, isValidElement, useId} from 'react'\nimport type {MStepperProps, MStepProps} from './MStepper.types'\nimport type {MSize} from '../../../theme'\nimport {cn} from '../../../utils/cn'\nimport {MCheckIcon} from '../../../icons'\nimport './MStepper.css'\nimport {useMStepperTexts} from '../../../i18n/frameworkTexts'\n\nconst CHECK_SIZE: Record<MSize, number> = {xs: 10, sm: 14, md: 18, lg: 22, xl: 28}\n\nexport function MStep(_props: MStepProps) {\n return null\n}\n\nexport function MStepper({\n activeStep,\n variant = 'horizontal',\n color = 'primary',\n size = 'md',\n clickable = false,\n onChange,\n className,\n children,\n ...rest\n}: MStepperProps) {\n const texts = useMStepperTexts()\n const baseId = useId()\n const steps = Children.toArray(children).filter((child) => isValidElement(child) && (child.type as any) === MStep)\n\n return (\n <div className={cn('stepper', variant, `color-${color}`, size, className)} role=\"list\" {...rest}>\n {steps.map((child, index) => {\n if (!isValidElement<MStepProps>(child)) return null\n const {id, title, description, icon, disabled, optional, error} = child.props\n const isActive = index === activeStep\n const isCompleted = index < activeStep\n const isClickable = clickable && !disabled\n\n const handleClick = () => {\n if (isClickable && onChange) {\n onChange(index)\n }\n }\n\n // State is spoken as text, not only shown as a ✓ / ! glyph.\n const stateText = error ? texts.error : isCompleted ? texts.completed : null\n const titleId = `${baseId}-${index}-title`\n const stateId = `${baseId}-${index}-state`\n const indicatorContent = error\n ? '!'\n : isCompleted\n ? (icon ?? <MCheckIcon size={CHECK_SIZE[size]} />)\n : (icon ?? index + 1)\n\n return (\n <div\n key={id}\n className={cn(\n 'stepper-step',\n isActive && 'active',\n isCompleted && 'completed',\n disabled && 'disabled',\n error && 'error',\n isClickable && 'clickable'\n )}\n role=\"listitem\"\n aria-current={isActive ? 'step' : undefined}\n >\n {isClickable ? (\n <button\n type=\"button\"\n className=\"stepper-indicator\"\n onClick={handleClick}\n aria-labelledby={stateText ? `${titleId} ${stateId}` : titleId}\n aria-current={isActive ? 'step' : undefined}\n >\n <span className=\"stepper-indicator-content\" aria-hidden=\"true\">\n {indicatorContent}\n </span>\n </button>\n ) : (\n <div className=\"stepper-indicator\" aria-hidden={error || isCompleted ? true : undefined}>\n {indicatorContent}\n </div>\n )}\n <div className=\"stepper-content\">\n <span id={titleId} className=\"stepper-title\">\n {title}\n </span>\n {stateText && (\n <span id={stateId} className=\"stepper-state\">\n {stateText}\n </span>\n )}\n {description && <span className=\"stepper-description\">{description}</span>}\n {optional && <span className=\"stepper-optional\">{texts.optional}</span>}\n </div>\n </div>\n )\n })}\n </div>\n )\n}\n","import {Children, isValidElement} from 'react'\nimport type {MTimelineProps, MTimelineItemProps} from './MTimeline.types'\nimport {cn} from '../../../utils/cn'\nimport './MTimeline.css'\n\nexport function MTimelineItem(_props: MTimelineItemProps) {\n return null\n}\n\nexport function MTimeline({\n align = 'left',\n color = 'primary',\n size = 'md',\n className,\n children,\n ...rest\n}: MTimelineProps) {\n const items = Children.toArray(children).filter(\n (child) => isValidElement(child) && (child.type as any) === MTimelineItem\n )\n\n return (\n <div className={cn('timeline', `align-${align}`, `color-${color}`, size, className)} {...rest}>\n {items.map((child, index) => {\n if (!isValidElement<MTimelineItemProps>(child)) return null\n const {id, title, description, date, icon, color: itemColor} = child.props\n const side = align === 'alternate' ? (index % 2 === 0 ? 'left' : 'right') : undefined\n\n return (\n <div key={id} className={cn('timeline-item', side && `side-${side}`)}>\n <div className={cn('timeline-dot', itemColor && `color-${itemColor}`)}>{icon}</div>\n <div className=\"timeline-content\">\n <span className=\"timeline-title\">{title}</span>\n {description && <span className=\"timeline-description\">{description}</span>}\n {date && <span className=\"timeline-date\">{date}</span>}\n </div>\n </div>\n )\n })}\n </div>\n )\n}\n"],"mappings":"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"}