@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
@@ -1 +0,0 @@
1
- {"version":3,"file":"data-CdQximqm.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, 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 './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 = 'Loading',\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 = 'No data',\n filterPlaceholder = 'Search...',\n className,\n style,\n ...rest\n}: MDataTableProps<T>) {\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\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}\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-expanded={filterOpen}\n onClick={openFilter}\n >\n Filter\n </MButton>\n <MPopover\n open={filterOpen}\n anchorRef={filterBtnRef}\n onClose={() => setFilterOpen(false)}\n placement=\"bottom-end\"\n className=\"data-table-dropdown\"\n >\n {filterKeys.map((filterKey) => (\n <div key={filterKey.key} className=\"data-table-filter-group\">\n <span className=\"data-table-filter-label\">{filterKey.label}</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-expanded={sortOpen}\n onClick={openSort}\n >\n {activeSortMenuItem ? `Sort: ${activeSortMenuItem.label}` : 'Sort'}\n </MButton>\n <MPopover\n open={sortOpen}\n anchorRef={sortBtnRef}\n onClose={() => setSortOpen(false)}\n placement=\"bottom-end\"\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 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>\n )}\n </button>\n ))}\n </MPopover>\n </>\n )}\n </div>\n )}\n </div>\n )}\n <div className={cn('data-table-body', loading && 'loading')} aria-busy={loading || undefined}>\n <div className=\"scroll\">\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\">\n <MCheckbox\n checked={allSelected}\n onChange={toggleAll}\n size=\"sm\"\n clickEffect=\"none\"\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 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 <span className=\"th-content\">\n {col.label}\n {isSortable && (\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 )}\n </span>\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}\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 />\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\" role=\"status\" aria-live=\"polite\">\n <MLoader center={false} minHeight=\"auto\" label={loadingLabel} />\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, useMemo, 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'\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 DEFAULT_DAY_LABELS_FROM_SUNDAY = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']\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(days: number, weekStart: 0 | 1, custom?: string[]): {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: DEFAULT_DAY_LABELS_FROM_SUNDAY[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\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 className,\n style,\n ...rest\n}: MWeekGridProps) {\n const grid = useMemo(() => buildGrid(data, days, slots), [data, days, slots])\n const resolvedMax = useMemo(() => resolveMax(grid, max), [grid, max])\n const rows = useMemo(() => resolveDayLabels(days, weekStart, dayLabels), [days, weekStart, dayLabels])\n const cols = useMemo(() => resolveSlotLabels(slots, slotLabels), [slots, slotLabels])\n const legendBands = useMemo(() => reachableBands(grid, resolvedMax), [grid, resolvedMax])\n const texts = useMWeekGridTexts()\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\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' ? <MHeading level={5}>{title}</MHeading> : title)}\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 className={'mineral-week-grid__matrix'} style={matrixStyle}>\n <div />\n {cols.map((label, slot) => (\n <div key={`col-${slot}`} className={'mineral-week-grid__col-header'}>\n <MSubText size={'xs'} tone={'muted'}>\n {label}\n </MSubText>\n </div>\n ))}\n\n {rows.map(({label: dayLabel, calendarDay}, rowIndex) => (\n <Fragment key={`row-${rowIndex}-${calendarDay}`}>\n <div className={'mineral-week-grid__row-label'}>\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 )\n\n const handleKeyDown = 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 role={onCellClick ? 'button' : undefined}\n tabIndex={onCellClick ? 0 : undefined}\n aria-label={\n onCellClick\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 </Fragment>\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","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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"}
@@ -1,2 +0,0 @@
1
- const e=require(`./icons-D3n9-919.cjs`),t=require(`./cn-CU5TNITO.cjs`),n=require(`./MPopover-B3npyAkL.cjs`),r=require(`./MText-BDI4mdw8.cjs`),i=require(`./MHeading-AYQ8_GFP.cjs`),a=require(`./MSubText-C6v6Exa2.cjs`),o=require(`./MButton-CnAr77Za.cjs`),s=require(`./MCheckbox-DozwF2ai.cjs`),c=require(`./frameworkTexts-BSXUtXOp.cjs`),l=require(`./MLoader-DvmFle31.cjs`),u=require(`./MStack-nc6Y_9K3.cjs`),d=require(`./MInputSearch-BiVI1jNc.cjs`),f=require(`./MTooltip-BAgHlv5I.cjs`),p=require(`./MPagination-reDU9xTW.cjs`);require(`./core-w629c4ND.cjs`);let m=require(`react`),h=require(`react/jsx-runtime`);function g(e,t,n){return typeof n==`function`?n(e,t):String(typeof n==`string`?e[n]:e.id??t)}function _(e,t){let n=t.split(`.`),r=e;for(let e of n){if(typeof r!=`object`||!r)return;r=r[e]}return r}function v({columns:r,data:i,rowKey:a,sortable:c=!1,filterable:u=!1,selectable:f=!1,pagination:v=!1,pageSize:y=10,striped:b=!1,compact:x=!1,stickyHeader:S=!1,loading:C=!1,loadingLabel:w=`Loading`,scrollOffset:T,sort:E,onSortChange:D,search:O,onSearchChange:k,searchKeys:A,filterKeys:j=[],filters:M,onFiltersChange:N,sortKeys:P=[],page:F,onPageChange:I,total:ee,manualSearch:te=!1,manualFilters:L=!1,manualSort:ne=!1,manualPagination:R=!1,selectedKeys:re,onSelectionChange:z,emptyText:B=`No data`,filterPlaceholder:ie=`Search...`,className:V,style:H,...U}){let[ae,oe]=(0,m.useState)(null),[se,ce]=(0,m.useState)([]),[le,ue]=(0,m.useState)(``),[de,fe]=(0,m.useState)({}),[pe,W]=(0,m.useState)(1),[me,G]=(0,m.useState)(!1),[he,ge]=(0,m.useState)(!1),_e=(0,m.useRef)(null),ve=(0,m.useRef)(null),K=E===void 0?ae:E,q=O===void 0?le:O,J=M===void 0?de:M,Y=F===void 0?pe:F,X=re??se,ye=z??ce,be=(0,m.useCallback)(e=>{O===void 0&&ue(e),!R&&F===void 0&&W(1),k?.(e)},[O,F,R,k]),xe=(0,m.useCallback)(e=>{M===void 0&&fe(e),!R&&F===void 0&&W(1),N?.(e)},[M,F,R,N]),Se=(0,m.useCallback)(e=>{E===void 0&&oe(e),!R&&F===void 0&&W(1),D?.(e)},[E,F,R,D]),Ce=(0,m.useRef)(null),we=(0,m.useCallback)(e=>{F===void 0&&W(e),I?.(e),Ce.current?.scrollIntoView({block:`start`,behavior:`smooth`})},[F,I]);function Te(e){let t;t=K?.key===e?K.dir===`asc`?{key:e,dir:`desc`}:null:{key:e,dir:`asc`},Se(t)}function Ee(e,t){let n=J[e]??[],r=n.includes(t)?n.filter(e=>e!==t):[...n,t];xe({...J,[e]:r})}let De=(0,m.useMemo)(()=>{let e={};for(let t of j){if(t.options){e[t.key]=t.options;continue}let n=new Set;for(let e of i){let r=_(e,t.key);r!=null&&n.add(String(r))}e[t.key]=Array.from(n).sort()}return e},[i,j]),Z=(0,m.useMemo)(()=>{let e=i;if(!te&&u&&q.trim()){let t=q.toLowerCase();e=A&&A.length>0?e.filter(e=>A.some(n=>{let r=_(e,n);return r!=null&&String(r).toLowerCase().includes(t)})):e.filter(e=>r.some(n=>{if(n.filterable===!1)return!1;let r=e[n.key];return r!=null&&String(r).toLowerCase().includes(t)}))}if(!L)for(let[t,n]of Object.entries(J))!n||n.length===0||(e=e.filter(e=>{let r=_(e,t);return r!=null&&n.includes(String(r))}));return e},[i,te,L,u,q,A,r,J]),Q=(0,m.useMemo)(()=>{if(ne||!K)return Z;let e=r.find(e=>e.key===K.key),t=P.some(e=>e.key===K.key);if(!e?.sortable&&!c&&!t)return Z;let n=K.dir===`asc`?1:-1;return[...Z].sort((e,t)=>{let r=e[K.key],i=t[K.key];return r==null&&i==null?0:r==null?1:i==null?-1:typeof r==`number`&&typeof i==`number`?(r-i)*n:String(r).localeCompare(String(i))*n})},[Z,K,r,c,P,ne]),Oe=R?ee??Q.length:Q.length,ke=v?Math.max(1,Math.ceil(Oe/y)):1,Ae=(0,m.useMemo)(()=>{if(!v||R)return Q;let e=(Y-1)*y;return Q.slice(e,e+y)},[Q,v,R,Y,y]),$=Ae.map((e,t)=>g(e,(Y-1)*y+t,a)),je=$.length>0&&$.every(e=>X.includes(e));function Me(){ye(je?X.filter(e=>!$.includes(e)):[...new Set([...X,...$])])}function Ne(e){ye(X.includes(e)?X.filter(t=>t!==e):[...X,e])}function Pe(e,t){t.target.closest(`button, a, [data-no-row-select]`)||Ne(e)}let Fe=(0,m.useCallback)(()=>{G(e=>!e),ge(!1)},[]),Ie=(0,m.useCallback)(()=>{ge(e=>!e),G(!1)},[]),Le=P.find(e=>e.key===K?.key),Re=u||j.length>0||P.length>0;return(0,h.jsxs)(`div`,{ref:Ce,className:t.t(`data-table`,V),style:T===void 0?H:{scrollMarginTop:T,...H},...U,children:[Re&&(0,h.jsxs)(`div`,{className:`toolbar`,children:[u&&(0,h.jsx)(d.t,{className:`filter-search`,size:`sm`,fullWidth:!0,placeholder:ie,value:q,onChange:e=>be(e.target.value),onClear:()=>be(``)}),(j.length>0||P.length>0)&&(0,h.jsxs)(`div`,{className:`toolbar-actions`,children:[j.length>0&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(o.t,{ref:_e,variant:`outlined`,size:`sm`,startIcon:(0,h.jsx)(e.Jn,{}),"aria-expanded":me,onClick:Fe,children:`Filter`}),(0,h.jsx)(n.t,{open:me,anchorRef:_e,onClose:()=>G(!1),placement:`bottom-end`,className:`data-table-dropdown`,children:j.map(e=>(0,h.jsxs)(`div`,{className:`data-table-filter-group`,children:[(0,h.jsx)(`span`,{className:`data-table-filter-label`,children:e.label}),(De[e.key]??[]).map(t=>(0,h.jsx)(`div`,{className:`data-table-filter-option`,children:(0,h.jsx)(s.t,{size:`sm`,clickEffect:`none`,checked:J[e.key]?.includes(t)??!1,onChange:()=>Ee(e.key,t),label:t})},t))]},e.key))})]}),P.length>0&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(o.t,{ref:ve,variant:`outlined`,size:`sm`,startIcon:K?K.dir===`asc`?(0,h.jsx)(e.Hi,{}):(0,h.jsx)(e.Vi,{}):(0,h.jsx)(e.qn,{}),"aria-expanded":he,onClick:Ie,children:Le?`Sort: ${Le.label}`:`Sort`}),(0,h.jsx)(n.t,{open:he,anchorRef:ve,onClose:()=>ge(!1),placement:`bottom-end`,className:`data-table-dropdown`,children:P.map(n=>(0,h.jsxs)(`button`,{type:`button`,className:t.t(`data-table-sort-item`,K?.key===n.key&&`active`),onClick:()=>{K?.key===n.key?Se({key:n.key,dir:K.dir===`asc`?`desc`:`asc`}):Se({key:n.key,dir:`asc`})},children:[n.label,K?.key===n.key&&(0,h.jsx)(`span`,{className:`data-table-sort-dir`,children:K.dir===`asc`?(0,h.jsx)(e.Hi,{className:`data-table-sort-icon`}):(0,h.jsx)(e.Vi,{className:`data-table-sort-icon`})})]},n.key))})]})]})]}),(0,h.jsxs)(`div`,{className:t.t(`data-table-body`,C&&`loading`),"aria-busy":C||void 0,children:[(0,h.jsx)(`div`,{className:`scroll`,children:(0,h.jsxs)(`table`,{className:t.t(`root`,b&&`striped`,x&&`compact`),children:[(0,h.jsx)(`thead`,{className:t.t(`head`,S&&`sticky`),children:(0,h.jsxs)(`tr`,{children:[f&&(0,h.jsx)(`th`,{className:`th check-col`,children:(0,h.jsx)(s.t,{checked:je,onChange:Me,size:`sm`,clickEffect:`none`})}),r.map(n=>{let r=n.sortable??c,i=K?.key===n.key;return(0,h.jsx)(`th`,{className:t.t(`th`,r&&`sortable`,i&&`sorted-${K.dir}`),style:{width:n.width,textAlign:n.align},onClick:r?()=>Te(n.key):void 0,children:(0,h.jsxs)(`span`,{className:`th-content`,children:[n.label,r&&(0,h.jsx)(`span`,{className:`sort-icon`,children:i?K.dir===`asc`?(0,h.jsx)(e.Hi,{"aria-hidden":`true`}):(0,h.jsx)(e.Vi,{"aria-hidden":`true`}):(0,h.jsx)(e.Bi,{"aria-hidden":`true`})})]})},n.key)})]})}),(0,h.jsxs)(`tbody`,{children:[Ae.length===0&&(0,h.jsx)(`tr`,{children:(0,h.jsx)(`td`,{className:`empty`,colSpan:r.length+ +!!f,children:B})}),Ae.map((e,n)=>{let i=g(e,(Y-1)*y+n,a),o=X.includes(i);return(0,h.jsxs)(`tr`,{className:t.t(`row`,o&&`selected`,f&&`selectable`),onClick:f?e=>Pe(i,e):void 0,children:[f&&(0,h.jsx)(`td`,{className:`td check-col`,children:(0,h.jsx)(s.t,{checked:o,onChange:()=>{},size:`sm`,clickEffect:`none`})}),r.map(t=>(0,h.jsx)(`td`,{className:`td`,style:{textAlign:t.align},children:t.render?t.render(e[t.key],e,(Y-1)*y+n):e[t.key]},t.key))]},i)})]})]})}),C&&(0,h.jsx)(`div`,{className:`data-table-loading`,role:`status`,"aria-live":`polite`,children:(0,h.jsx)(l.t,{center:!1,minHeight:`auto`,label:w})})]}),v&&ke>1&&(0,h.jsx)(p.t,{total:Oe,page:Y,pageSize:y,onChange:we})]})}function y({items:e,color:n=`primary`,size:r=`md`,strikethrough:i=!0,onChange:a,className:o,...c}){return(0,h.jsx)(`div`,{className:t.t(`task list`,`color-${n}`,`size-${r}`,o),role:`list`,...c,children:e.map(e=>(0,h.jsxs)(`div`,{className:t.t(`task item`,e.checked&&`checked`,e.disabled&&`disabled`),role:`listitem`,onClick:t=>{e.disabled||t.target.closest(`.checkbox`)||a?.(e.id,!(e.checked??!1))},children:[(0,h.jsx)(s.t,{className:`task control`,checked:e.checked??!1,color:n,size:r,disabled:e.disabled,onChange:t=>a?.(e.id,t.target.checked),clickEffect:`ripple`}),(0,h.jsx)(`span`,{className:t.t(`task label`,e.checked&&i&&`done`),children:e.label})]},e.id))})}var b=7,x=24,S=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`],C=[0,1,2,3],w=100;function T(e,t){if(t<=0||e<=0)return 0;let n=e/t;return n>=.66?3:n>=.33?2:1}function E(e,t){if(t<=0)return[0];if(!(Number.isInteger(t)&&e.every(e=>e.every(e=>Number.isInteger(e))))||t>w)return C;let n=new Set([0]);for(let e=1;e<=t;e+=1)n.add(T(e,t));return C.filter(e=>n.has(e))}function D(e,t,n){let r=Array.from({length:t},()=>Array.from({length:n},()=>0));if(Array.isArray(e)&&e.length>0&&Array.isArray(e[0])){let i=e;for(let e=0;e<Math.min(t,i.length);e+=1){let t=i[e];if(t)for(let i=0;i<Math.min(n,t.length);i+=1)r[e][i]=t[i]??0}return r}for(let i of e)i.day<0||i.day>=t||i.slot<0||i.slot>=n||(r[i.day][i.slot]=i.value);return r}function O(e,t){if(typeof t==`number`)return t;let n=0;for(let t of e)for(let e of t)e>n&&(n=e);return n}function k(e,t,n){return n&&n.length>=e?Array.from({length:e},(e,t)=>({label:n[t],calendarDay:t})):e===7?(t===1?[1,2,3,4,5,6,0]:[0,1,2,3,4,5,6]).map(e=>({label:S[e],calendarDay:e})):Array.from({length:e},(e,t)=>({label:String(t+1),calendarDay:t}))}function A(e,t){return t&&t.length>=e?t.slice(0,e):e===24?Array.from({length:24},(e,t)=>t.toString().padStart(2,`0`)):Array.from({length:e},(e,t)=>String(t+1))}function j(e){return e.value>0?e.value:``}function M(e,t,n){return`${t} ${n} — ${e.value}`}function N({data:e,max:n,days:o=b,slots:s=x,dayLabels:l,slotLabels:d,weekStart:p=1,color:g=`warning`,title:_,description:v,hint:y,peakLabel:S,renderCell:C,renderTooltip:w,onCellClick:N,showLegend:P=!0,bandLabels:F,legendUnit:I,rowLabelWidth:ee=48,cellHeight:te=24,cellMinWidth:L=24,className:ne,style:R,...re}){let z=(0,m.useMemo)(()=>D(e,o,s),[e,o,s]),B=(0,m.useMemo)(()=>O(z,n),[z,n]),ie=(0,m.useMemo)(()=>k(o,p,l),[o,p,l]),V=(0,m.useMemo)(()=>A(s,d),[s,d]),H=(0,m.useMemo)(()=>E(z,B),[z,B]),U=c.o(),ae=F??U.bands,oe={gridTemplateColumns:`${ee}px repeat(${s}, minmax(${L}px, 1fr))`},se={"--mineral-week-grid-color":`var(--mineral-${g})`,...R},ce=_!=null||v!=null||y!=null||S!=null;return(0,h.jsxs)(`div`,{className:t.t(`mineral-week-grid`,ne),style:se,...re,children:[ce&&(0,h.jsxs)(u.t,{spacing:`xs`,children:[(0,h.jsxs)(`div`,{className:`mineral-week-grid__title-row`,children:[(0,h.jsxs)(`div`,{className:`mineral-week-grid__title-text`,children:[_!=null&&(typeof _==`string`?(0,h.jsx)(i.t,{level:5,children:_}):_),v!=null&&(typeof v==`string`?(0,h.jsx)(a.t,{tone:`muted`,children:v}):v)]}),S!=null&&(0,h.jsx)(r.t,{size:`sm`,tone:`muted`,children:S})]}),y!=null&&(0,h.jsx)(a.t,{size:`xs`,tone:`muted`,children:y})]}),(0,h.jsxs)(`div`,{className:`mineral-week-grid__matrix`,style:oe,children:[(0,h.jsx)(`div`,{}),V.map((e,t)=>(0,h.jsx)(`div`,{className:`mineral-week-grid__col-header`,children:(0,h.jsx)(a.t,{size:`xs`,tone:`muted`,children:e})},`col-${t}`)),ie.map(({label:e,calendarDay:n},r)=>(0,h.jsxs)(m.Fragment,{children:[(0,h.jsx)(`div`,{className:`mineral-week-grid__row-label`,children:(0,h.jsx)(a.t,{size:`xs`,tone:`muted`,children:e})}),V.map((i,a)=>{let o=z[n]?.[a]??0,s=T(o,B),l={day:n,slot:a,value:o,band:s},u=C?C(l):j(l),d=w?w(l):M(l,e,i),p=(0,h.jsx)(`div`,{className:t.t(`mineral-week-grid__cell`,`mineral-week-grid__cell--band-${s}`,N&&`mineral-week-grid__cell--interactive`,!N&&d!=null&&`mineral-week-grid__cell--tooltip`),style:{height:te},onClick:N?()=>N(l):void 0,onKeyDown:N?e=>{e.key!==`Enter`&&e.key!==` `||(e.preventDefault(),N(l))}:void 0,role:N?`button`:void 0,tabIndex:N?0:void 0,"aria-label":N?c.t(U.cellLabel,{day:e,slot:i,value:o}):void 0,children:u});return d==null?(0,h.jsx)(m.Fragment,{children:p},`cell-${r}-${a}`):(0,h.jsx)(f.t,{content:d,children:p},`cell-${r}-${a}`)})]},`row-${r}-${n}`))]}),P&&(0,h.jsxs)(`div`,{className:`mineral-week-grid__legend`,children:[(0,h.jsx)(a.t,{size:`xs`,tone:`muted`,children:c.t(U.scale,{min:0,max:B,unit:I?` ${I}`:``})}),(0,h.jsx)(`div`,{className:`mineral-week-grid__legend-bands`,children:H.map(e=>(0,h.jsxs)(`div`,{className:`mineral-week-grid__legend-band`,children:[(0,h.jsx)(`span`,{className:t.t(`mineral-week-grid__legend-swatch`,`mineral-week-grid__cell--band-${e}`)}),(0,h.jsx)(a.t,{size:`xs`,tone:`muted`,children:ae[e]})]},`legend-${e}`))})]})]})}function P(e,t={}){let{perPage:n=20,initialPage:r=1,initialSearch:i=``,initialFilters:a,initialSort:o=null,invalidationKey:s}=t,[c,l]=(0,m.useState)([]),[u,d]=(0,m.useState)(0),[f,p]=(0,m.useState)(r),[h,g]=(0,m.useState)(i),[_,v]=(0,m.useState)(a??{}),[y,b]=(0,m.useState)(o),[x,S]=(0,m.useState)(!1),[C,w]=(0,m.useState)(null),[T,E]=(0,m.useState)(0),D=(0,m.useRef)(e);D.current=e;let O=(0,m.useMemo)(()=>({page:f,perPage:n,search:h,filters:_,sort:y}),[f,n,h,_,y]);(0,m.useEffect)(()=>{let e=typeof AbortController<`u`?new AbortController:void 0,t=!1;return S(!0),w(null),D.current(O,e?.signal).then(e=>{t||(l(e.data),d(e.meta.total))}).catch(e=>{t||e instanceof Error&&e.name===`AbortError`||w(e instanceof Error?e:Error(String(e)))}).finally(()=>{t||S(!1)}),()=>{t=!0,e?.abort()}},[O,s,T]);let k=(0,m.useCallback)(e=>{g(e),p(1)},[]),A=(0,m.useCallback)(e=>{v(e),p(1)},[]),j=(0,m.useCallback)(e=>{b(e),p(1)},[]),M=(0,m.useCallback)(()=>E(e=>e+1),[]);return{tableProps:{data:c,total:u,page:f,onPageChange:p,sort:y,onSortChange:j,search:h,onSearchChange:k,filters:_,onFiltersChange:A,manualSearch:!0,manualFilters:!0,manualSort:!0,manualPagination:!0,pageSize:n,loading:x},isLoading:x,error:C,refetch:M}}function F(e){return e?{key:e.key,dir:e.direction}:null}function I(e,t={}){let{perPage:n=12,initialPage:r=1,initialSearch:i=``,initialFilters:a,initialSort:o=null,invalidationKey:s}=t,[c,l]=(0,m.useState)([]),[u,d]=(0,m.useState)(0),[f,p]=(0,m.useState)(r),[h,g]=(0,m.useState)(i),[_,v]=(0,m.useState)(a??{}),[y,b]=(0,m.useState)(o??null),[x,S]=(0,m.useState)(!1),[C,w]=(0,m.useState)(null),[T,E]=(0,m.useState)(0),D=(0,m.useRef)(e);D.current=e;let O=(0,m.useMemo)(()=>({page:f,perPage:n,search:h,filters:_,sort:F(y)}),[f,n,h,_,y]);(0,m.useEffect)(()=>{let e=typeof AbortController<`u`?new AbortController:void 0,t=!1;return S(!0),w(null),D.current(O,e?.signal).then(e=>{t||(l(e.data),d(e.meta.total))}).catch(e=>{t||e instanceof Error&&e.name===`AbortError`||w(e instanceof Error?e:Error(String(e)))}).finally(()=>{t||S(!1)}),()=>{t=!0,e?.abort()}},[O,s,T]);let k=(0,m.useCallback)(e=>{g(e),p(1)},[]),A=(0,m.useCallback)(e=>{v(e),p(1)},[]),j=(0,m.useCallback)(e=>{b(e),p(1)},[]),M=(0,m.useCallback)(()=>E(e=>e+1),[]);return{gridProps:{items:c,total:u,page:f,onPageChange:p,sort:y,onSortChange:j,search:h,onSearchChange:k,filters:_,onFiltersChange:A,manualSearch:!0,manualFilters:!0,manualSort:!0,manualPagination:!0,pageSize:n,loading:x},isLoading:x,error:C,refetch:M}}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return I}});
2
- //# sourceMappingURL=data-PS4ygCyj.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"data-PS4ygCyj.cjs","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, 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 './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 = 'Loading',\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 = 'No data',\n filterPlaceholder = 'Search...',\n className,\n style,\n ...rest\n}: MDataTableProps<T>) {\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\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}\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-expanded={filterOpen}\n onClick={openFilter}\n >\n Filter\n </MButton>\n <MPopover\n open={filterOpen}\n anchorRef={filterBtnRef}\n onClose={() => setFilterOpen(false)}\n placement=\"bottom-end\"\n className=\"data-table-dropdown\"\n >\n {filterKeys.map((filterKey) => (\n <div key={filterKey.key} className=\"data-table-filter-group\">\n <span className=\"data-table-filter-label\">{filterKey.label}</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-expanded={sortOpen}\n onClick={openSort}\n >\n {activeSortMenuItem ? `Sort: ${activeSortMenuItem.label}` : 'Sort'}\n </MButton>\n <MPopover\n open={sortOpen}\n anchorRef={sortBtnRef}\n onClose={() => setSortOpen(false)}\n placement=\"bottom-end\"\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 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>\n )}\n </button>\n ))}\n </MPopover>\n </>\n )}\n </div>\n )}\n </div>\n )}\n <div className={cn('data-table-body', loading && 'loading')} aria-busy={loading || undefined}>\n <div className=\"scroll\">\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\">\n <MCheckbox\n checked={allSelected}\n onChange={toggleAll}\n size=\"sm\"\n clickEffect=\"none\"\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 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 <span className=\"th-content\">\n {col.label}\n {isSortable && (\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 )}\n </span>\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}\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 />\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\" role=\"status\" aria-live=\"polite\">\n <MLoader center={false} minHeight=\"auto\" label={loadingLabel} />\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, useMemo, 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'\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 DEFAULT_DAY_LABELS_FROM_SUNDAY = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']\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(days: number, weekStart: 0 | 1, custom?: string[]): {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: DEFAULT_DAY_LABELS_FROM_SUNDAY[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\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 className,\n style,\n ...rest\n}: MWeekGridProps) {\n const grid = useMemo(() => buildGrid(data, days, slots), [data, days, slots])\n const resolvedMax = useMemo(() => resolveMax(grid, max), [grid, max])\n const rows = useMemo(() => resolveDayLabels(days, weekStart, dayLabels), [days, weekStart, dayLabels])\n const cols = useMemo(() => resolveSlotLabels(slots, slotLabels), [slots, slotLabels])\n const legendBands = useMemo(() => reachableBands(grid, resolvedMax), [grid, resolvedMax])\n const texts = useMWeekGridTexts()\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\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' ? <MHeading level={5}>{title}</MHeading> : title)}\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 className={'mineral-week-grid__matrix'} style={matrixStyle}>\n <div />\n {cols.map((label, slot) => (\n <div key={`col-${slot}`} className={'mineral-week-grid__col-header'}>\n <MSubText size={'xs'} tone={'muted'}>\n {label}\n </MSubText>\n </div>\n ))}\n\n {rows.map(({label: dayLabel, calendarDay}, rowIndex) => (\n <Fragment key={`row-${rowIndex}-${calendarDay}`}>\n <div className={'mineral-week-grid__row-label'}>\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 )\n\n const handleKeyDown = 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 role={onCellClick ? 'button' : undefined}\n tabIndex={onCellClick ? 0 : undefined}\n aria-label={\n onCellClick\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 </Fragment>\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","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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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"dateUtils-CUY6CRCf.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.\nexport function addMonths(date: Date, count: number): Date {\n const result = new Date(date)\n result.setMonth(result.getMonth() + count)\n return result\n}\n\n// Shift a date by a number of whole years.\nexport function addYears(date: Date, count: number): Date {\n const result = new Date(date)\n result.setFullYear(result.getFullYear() + count)\n return result\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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"}
@@ -1,2 +0,0 @@
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(e,t){let n=new Date(e);return n.setMonth(n.getMonth()+t),n}function o(e,t){let n=new Date(e);return n.setFullYear(n.getFullYear()+t),n}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-Dq1vaA-D.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dateUtils-Dq1vaA-D.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.\nexport function addMonths(date: Date, count: number): Date {\n const result = new Date(date)\n result.setMonth(result.getMonth() + count)\n return result\n}\n\n// Shift a date by a number of whole years.\nexport function addYears(date: Date, count: number): Date {\n const result = new Date(date)\n result.setFullYear(result.getFullYear() + count)\n return result\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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"}