@banzamel/mineralui 2.4.0 → 2.4.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 (227) hide show
  1. package/README.md +1 -1
  2. package/dist/{MAvatar-xI5aZ-bP.cjs → MAvatar-Capz5Gbc.cjs} +2 -2
  3. package/dist/{MAvatar-xI5aZ-bP.cjs.map → MAvatar-Capz5Gbc.cjs.map} +1 -1
  4. package/dist/{MButton-CMbmWmMI.cjs → MButton-sTKnano6.cjs} +2 -2
  5. package/dist/{MButton-CMbmWmMI.cjs.map → MButton-sTKnano6.cjs.map} +1 -1
  6. package/dist/{MButtonGroup-agnKWUPy.cjs → MButtonGroup-iPv14c0V.cjs} +2 -2
  7. package/dist/{MButtonGroup-agnKWUPy.cjs.map → MButtonGroup-iPv14c0V.cjs.map} +1 -1
  8. package/dist/{MCard-CADu7UUA.cjs → MCard-DK-_FkpE.cjs} +2 -2
  9. package/dist/{MCard-CADu7UUA.cjs.map → MCard-DK-_FkpE.cjs.map} +1 -1
  10. package/dist/{MCheckbox-stBujis6.cjs → MCheckbox-CIX7wp41.cjs} +2 -2
  11. package/dist/{MCheckbox-stBujis6.cjs.map → MCheckbox-CIX7wp41.cjs.map} +1 -1
  12. package/dist/MConflictIllustration-CZ3Md38Z.cjs +2 -0
  13. package/dist/MConflictIllustration-CZ3Md38Z.cjs.map +1 -0
  14. package/dist/{MConflictIllustration-Drsm8_8C.js → MConflictIllustration-znC7ijmP.js} +70 -70
  15. package/dist/MConflictIllustration-znC7ijmP.js.map +1 -0
  16. package/dist/{MDetailList-CQ2sJ7Jl.cjs → MDetailList-Ce7KzUKC.cjs} +2 -2
  17. package/dist/{MDetailList-CQ2sJ7Jl.cjs.map → MDetailList-Ce7KzUKC.cjs.map} +1 -1
  18. package/dist/{MDropdownMenu-DAzieAOs.cjs → MDropdownMenu-B_QWQhxy.cjs} +2 -2
  19. package/dist/{MDropdownMenu-DAzieAOs.cjs.map → MDropdownMenu-B_QWQhxy.cjs.map} +1 -1
  20. package/dist/{MDropdownMenu-B7RR8d8x.js → MDropdownMenu-C4CuKMRZ.js} +1 -1
  21. package/dist/{MDropdownMenu-B7RR8d8x.js.map → MDropdownMenu-C4CuKMRZ.js.map} +1 -1
  22. package/dist/{MGrid-LHi7TY5J.cjs → MGrid-fTx6wFq_.cjs} +2 -2
  23. package/dist/{MGrid-LHi7TY5J.cjs.map → MGrid-fTx6wFq_.cjs.map} +1 -1
  24. package/dist/{MHeading-7yt1C6oS.cjs → MHeading-KDSpnCof.cjs} +2 -2
  25. package/dist/{MHeading-7yt1C6oS.cjs.map → MHeading-KDSpnCof.cjs.map} +1 -1
  26. package/dist/{MI18nProvider-Cx4ZaFtv.cjs → MI18nProvider-DXRbB0VY.cjs} +2 -2
  27. package/dist/{MI18nProvider-Cx4ZaFtv.cjs.map → MI18nProvider-DXRbB0VY.cjs.map} +1 -1
  28. package/dist/{MInput-BSeWCsPi.cjs → MInput-CGl2Q-rM.cjs} +2 -2
  29. package/dist/{MInput-BSeWCsPi.cjs.map → MInput-CGl2Q-rM.cjs.map} +1 -1
  30. package/dist/{MInputCVC-CtHPCx_r.js → MInputCVC-Blv5PeyS.js} +2 -2
  31. package/dist/{MInputCVC-CtHPCx_r.js.map → MInputCVC-Blv5PeyS.js.map} +1 -1
  32. package/dist/{MInputCVC-rNs8w4gH.cjs → MInputCVC-lAFKTV6y.cjs} +2 -2
  33. package/dist/{MInputCVC-rNs8w4gH.cjs.map → MInputCVC-lAFKTV6y.cjs.map} +1 -1
  34. package/dist/{MInputSearch-BfPPgEGZ.cjs → MInputSearch-BZDnbFB4.cjs} +2 -2
  35. package/dist/{MInputSearch-BfPPgEGZ.cjs.map → MInputSearch-BZDnbFB4.cjs.map} +1 -1
  36. package/dist/{MKbd-C6XHWlmE.cjs → MKbd-DqMnZ7Iv.cjs} +2 -2
  37. package/dist/{MKbd-C6XHWlmE.cjs.map → MKbd-DqMnZ7Iv.cjs.map} +1 -1
  38. package/dist/{MLink-CbaDlP5I.cjs → MLink-U24G6KJj.cjs} +2 -2
  39. package/dist/{MLink-CbaDlP5I.cjs.map → MLink-U24G6KJj.cjs.map} +1 -1
  40. package/dist/{MLoader-DELAIhz5.cjs → MLoader-CvFIvytw.cjs} +2 -2
  41. package/dist/{MLoader-DELAIhz5.cjs.map → MLoader-CvFIvytw.cjs.map} +1 -1
  42. package/dist/{MPagination-CgmNEAZX.js → MPagination-BkvOEZpp.js} +1 -1
  43. package/dist/{MPagination-CgmNEAZX.js.map → MPagination-BkvOEZpp.js.map} +1 -1
  44. package/dist/{MPagination-C2lpvPqC.cjs → MPagination-DgQta29Q.cjs} +2 -2
  45. package/dist/{MPagination-C2lpvPqC.cjs.map → MPagination-DgQta29Q.cjs.map} +1 -1
  46. package/dist/{MPopover-DI_7niwe.cjs → MPopover-C-e1CoV0.cjs} +2 -2
  47. package/dist/{MPopover-DI_7niwe.cjs.map → MPopover-C-e1CoV0.cjs.map} +1 -1
  48. package/dist/{MPortal-C9Ucq8Um.cjs → MPortal-DUSIuINN.cjs} +2 -2
  49. package/dist/{MPortal-C9Ucq8Um.cjs.map → MPortal-DUSIuINN.cjs.map} +1 -1
  50. package/dist/{MSimpleGrid-K-8Qg9em.cjs → MSimpleGrid-BzlIitcJ.cjs} +2 -2
  51. package/dist/{MSimpleGrid-K-8Qg9em.cjs.map → MSimpleGrid-BzlIitcJ.cjs.map} +1 -1
  52. package/dist/{MSkeleton-DgU8aktI.cjs → MSkeleton-BoFpowFU.cjs} +2 -2
  53. package/dist/{MSkeleton-DgU8aktI.cjs.map → MSkeleton-BoFpowFU.cjs.map} +1 -1
  54. package/dist/{MSlider-0ApojrDC.cjs → MSlider-BTDBqF8t.cjs} +2 -2
  55. package/dist/{MSlider-0ApojrDC.cjs.map → MSlider-BTDBqF8t.cjs.map} +1 -1
  56. package/dist/{MStack-BOOciEts.cjs → MStack-B3Ldqsc-.cjs} +2 -2
  57. package/dist/{MStack-BOOciEts.cjs.map → MStack-B3Ldqsc-.cjs.map} +1 -1
  58. package/dist/{MSubText-WixraICV.cjs → MSubText-47PsgE8T.cjs} +2 -2
  59. package/dist/{MSubText-WixraICV.cjs.map → MSubText-47PsgE8T.cjs.map} +1 -1
  60. package/dist/{MSurface-CF8BFFn4.cjs → MSurface-QYEygc_0.cjs} +2 -2
  61. package/dist/{MSurface-CF8BFFn4.cjs.map → MSurface-QYEygc_0.cjs.map} +1 -1
  62. package/dist/{MTag-CgXh2PQC.cjs → MTag-BjV-dXkk.cjs} +2 -2
  63. package/dist/{MTag-CgXh2PQC.cjs.map → MTag-BjV-dXkk.cjs.map} +1 -1
  64. package/dist/{MText-CDDEGjBx.cjs → MText-Dni707tS.cjs} +2 -2
  65. package/dist/{MText-CDDEGjBx.cjs.map → MText-Dni707tS.cjs.map} +1 -1
  66. package/dist/{MTooltip-BWqyv6QU.cjs → MTooltip-ChvuN4Ow.cjs} +2 -2
  67. package/dist/{MTooltip-BWqyv6QU.cjs.map → MTooltip-ChvuN4Ow.cjs.map} +1 -1
  68. package/dist/{MTooltip-BTJkzOah.js → MTooltip-H3we0a7w.js} +1 -1
  69. package/dist/{MTooltip-BTJkzOah.js.map → MTooltip-H3we0a7w.js.map} +1 -1
  70. package/dist/{MTreeView-BcVw0Bgz.cjs → MTreeView-VYp0eErQ.cjs} +2 -2
  71. package/dist/{MTreeView-BcVw0Bgz.cjs.map → MTreeView-VYp0eErQ.cjs.map} +1 -1
  72. package/dist/{arduino-Bedph8hQ.cjs → arduino-BdpdaLwK.cjs} +1 -1
  73. package/dist/{arduino-Bedph8hQ.cjs.map → arduino-BdpdaLwK.cjs.map} +1 -1
  74. package/dist/{arduino-BHobW-W2.js → arduino-DDDlP9Yt.js} +1 -1
  75. package/dist/{arduino-BHobW-W2.js.map → arduino-DDDlP9Yt.js.map} +1 -1
  76. package/dist/{bash-oKnFbgn1.js → bash-D8WbAmuA.js} +1 -1
  77. package/dist/{bash-oKnFbgn1.js.map → bash-D8WbAmuA.js.map} +1 -1
  78. package/dist/{bash-CK4DSkpy.cjs → bash-eOUFh3S1.cjs} +1 -1
  79. package/dist/{bash-CK4DSkpy.cjs.map → bash-eOUFh3S1.cjs.map} +1 -1
  80. package/dist/{c-9Uw9QchT.cjs → c-Bur7Mn-u.cjs} +1 -1
  81. package/dist/{c-9Uw9QchT.cjs.map → c-Bur7Mn-u.cjs.map} +1 -1
  82. package/dist/{c-Bjn-r6WZ.js → c-CTKNfUJI.js} +1 -1
  83. package/dist/{c-Bjn-r6WZ.js.map → c-CTKNfUJI.js.map} +1 -1
  84. package/dist/calendar-P7MwKfWS.cjs +2 -0
  85. package/dist/{calendar-BFfeWRa0.cjs.map → calendar-P7MwKfWS.cjs.map} +1 -1
  86. package/dist/{calendar-DhRP5_mS.js → calendar-bzeZRst9.js} +59 -58
  87. package/dist/{calendar-DhRP5_mS.js.map → calendar-bzeZRst9.js.map} +1 -1
  88. package/dist/calendar.cjs +1 -1
  89. package/dist/calendar.js +1 -1
  90. package/dist/calendarDates-AnlGcvZM.cjs +2 -0
  91. package/dist/calendarDates-AnlGcvZM.cjs.map +1 -0
  92. package/dist/calendarDates-CYkJqcnp.js +50 -0
  93. package/dist/calendarDates-CYkJqcnp.js.map +1 -0
  94. package/dist/{cards-Dus8TmSD.js → cards-CFDJsdxR.js} +4 -4
  95. package/dist/{cards-Dus8TmSD.js.map → cards-CFDJsdxR.js.map} +1 -1
  96. package/dist/{cards-Bwos44EP.cjs → cards-DeA7I2KC.cjs} +2 -2
  97. package/dist/{cards-Bwos44EP.cjs.map → cards-DeA7I2KC.cjs.map} +1 -1
  98. package/dist/cards.cjs +1 -1
  99. package/dist/cards.js +1 -1
  100. package/dist/components/data/MWeekGrid/MWeekGrid.types.d.ts +9 -4
  101. package/dist/{controls-CeHdKaQv.cjs → controls-KK-TyUTT.cjs} +2 -2
  102. package/dist/{controls-CeHdKaQv.cjs.map → controls-KK-TyUTT.cjs.map} +1 -1
  103. package/dist/controls.cjs +1 -1
  104. package/dist/{core-CMHNXulE.js → core-D5-SQcs8.js} +1 -1
  105. package/dist/{core-CMHNXulE.js.map → core-D5-SQcs8.js.map} +1 -1
  106. package/dist/{core-CLRD6sG4.cjs → core-D66c1_Wo.cjs} +1 -1
  107. package/dist/{core-CLRD6sG4.cjs.map → core-D66c1_Wo.cjs.map} +1 -1
  108. package/dist/{cpp-BWqMcMeX.cjs → cpp-BMULAf-B.cjs} +1 -1
  109. package/dist/{cpp-BWqMcMeX.cjs.map → cpp-BMULAf-B.cjs.map} +1 -1
  110. package/dist/{cpp-b3FmFTKl.js → cpp-DAzz2TpY.js} +1 -1
  111. package/dist/{cpp-b3FmFTKl.js.map → cpp-DAzz2TpY.js.map} +1 -1
  112. package/dist/{css-B4MkxW0b.cjs → css-9M03GzKO.cjs} +1 -1
  113. package/dist/{css-B4MkxW0b.cjs.map → css-9M03GzKO.cjs.map} +1 -1
  114. package/dist/{css-8EzLAJKV.js → css-EGOXTWIl.js} +1 -1
  115. package/dist/{css-8EzLAJKV.js.map → css-EGOXTWIl.js.map} +1 -1
  116. package/dist/{data-Dh3C_VTi.js → data-CgLutFxU.js} +245 -230
  117. package/dist/data-CgLutFxU.js.map +1 -0
  118. package/dist/data-DFrkJTlF.cjs +2 -0
  119. package/dist/data-DFrkJTlF.cjs.map +1 -0
  120. package/dist/data.cjs +1 -1
  121. package/dist/data.js +1 -1
  122. package/dist/{display-DU9E_18w.cjs → display--E7rI0tk.cjs} +2 -2
  123. package/dist/{display-DU9E_18w.cjs.map → display--E7rI0tk.cjs.map} +1 -1
  124. package/dist/{display-CYC1AImx.js → display-BnkHKW1n.js} +12 -12
  125. package/dist/{display-CYC1AImx.js.map → display-BnkHKW1n.js.map} +1 -1
  126. package/dist/display.cjs +1 -1
  127. package/dist/display.js +1 -1
  128. package/dist/dropdowns-DGYg9zIh.cjs +2 -0
  129. package/dist/{dropdowns-vaj6vhl6.cjs.map → dropdowns-DGYg9zIh.cjs.map} +1 -1
  130. package/dist/{dropdowns-ByDu8Wbt.js → dropdowns-Dq-xAplH.js} +12 -11
  131. package/dist/{dropdowns-ByDu8Wbt.js.map → dropdowns-Dq-xAplH.js.map} +1 -1
  132. package/dist/dropdowns.cjs +1 -1
  133. package/dist/dropdowns.js +1 -1
  134. package/dist/{feedback-CUGuh4QZ.cjs → feedback-CA77ShtB.cjs} +2 -2
  135. package/dist/{feedback-CUGuh4QZ.cjs.map → feedback-CA77ShtB.cjs.map} +1 -1
  136. package/dist/feedback.cjs +1 -1
  137. package/dist/{form-Dri4AzY9.js → form-CAFcvmUS.js} +1 -1
  138. package/dist/{form-Dri4AzY9.js.map → form-CAFcvmUS.js.map} +1 -1
  139. package/dist/{form-DICGXS6_.cjs → form-DpfzLUOn.cjs} +2 -2
  140. package/dist/{form-DICGXS6_.cjs.map → form-DpfzLUOn.cjs.map} +1 -1
  141. package/dist/form.cjs +1 -1
  142. package/dist/form.js +1 -1
  143. package/dist/{frameworkTexts-C1yvIVm4.js → frameworkTexts-DH0Xp-Vx.js} +30 -61
  144. package/dist/frameworkTexts-DH0Xp-Vx.js.map +1 -0
  145. package/dist/frameworkTexts-iDXhcW6k.cjs +2 -0
  146. package/dist/frameworkTexts-iDXhcW6k.cjs.map +1 -0
  147. package/dist/i18n/frameworkTexts.d.ts +13 -0
  148. package/dist/i18n.cjs +1 -1
  149. package/dist/{icons-BxurYyW-.cjs → icons-D_NB67he.cjs} +2 -2
  150. package/dist/{icons-BxurYyW-.cjs.map → icons-D_NB67he.cjs.map} +1 -1
  151. package/dist/icons.cjs +1 -1
  152. package/dist/illustrations.cjs +1 -1
  153. package/dist/illustrations.js +1 -1
  154. package/dist/index.cjs +1 -1
  155. package/dist/index.js +13 -13
  156. package/dist/{inputs-GCUfD923.cjs → inputs-Clenc4Rm.cjs} +2 -2
  157. package/dist/{inputs-GCUfD923.cjs.map → inputs-Clenc4Rm.cjs.map} +1 -1
  158. package/dist/inputs.cjs +1 -1
  159. package/dist/inputs.js +1 -1
  160. package/dist/{javascript-CH9YvIk2.js → javascript-CHSg4NGc.js} +1 -1
  161. package/dist/{javascript-CH9YvIk2.js.map → javascript-CHSg4NGc.js.map} +1 -1
  162. package/dist/{javascript-BGrveJJw.cjs → javascript-CastOQF5.cjs} +1 -1
  163. package/dist/{javascript-BGrveJJw.cjs.map → javascript-CastOQF5.cjs.map} +1 -1
  164. package/dist/{json-CPWARxtL.js → json-Bejy9Rlg.js} +1 -1
  165. package/dist/{json-CPWARxtL.js.map → json-Bejy9Rlg.js.map} +1 -1
  166. package/dist/{json-D6oa0Lra.cjs → json-DCkJ-m-p.cjs} +1 -1
  167. package/dist/{json-D6oa0Lra.cjs.map → json-DCkJ-m-p.cjs.map} +1 -1
  168. package/dist/{layout-Gr99WWTA.cjs → layout-CNoZdeXw.cjs} +2 -2
  169. package/dist/{layout-Gr99WWTA.cjs.map → layout-CNoZdeXw.cjs.map} +1 -1
  170. package/dist/{layout-CS_dHOLM.js → layout-DsE4zfpg.js} +3 -3
  171. package/dist/{layout-CS_dHOLM.js.map → layout-DsE4zfpg.js.map} +1 -1
  172. package/dist/layout.cjs +1 -1
  173. package/dist/layout.js +2 -2
  174. package/dist/{licensing-DXCHcZd1.cjs → licensing-DGIdtfNg.cjs} +2 -2
  175. package/dist/{licensing-DXCHcZd1.cjs.map → licensing-DGIdtfNg.cjs.map} +1 -1
  176. package/dist/{locale-BGLDTJSi.cjs → locale-DRRl_s5-.cjs} +2 -2
  177. package/dist/{locale-BGLDTJSi.cjs.map → locale-DRRl_s5-.cjs.map} +1 -1
  178. package/dist/{media-CE59IEdY.cjs → media-DRTBXDnn.cjs} +2 -2
  179. package/dist/{media-CE59IEdY.cjs.map → media-DRTBXDnn.cjs.map} +1 -1
  180. package/dist/media.cjs +1 -1
  181. package/dist/{overlays-DCXP_KsX.js → overlays-BKk_ZXue.js} +2 -2
  182. package/dist/{overlays-DCXP_KsX.js.map → overlays-BKk_ZXue.js.map} +1 -1
  183. package/dist/{overlays--Pe-H5TW.cjs → overlays-Qbp4d596.cjs} +2 -2
  184. package/dist/{overlays--Pe-H5TW.cjs.map → overlays-Qbp4d596.cjs.map} +1 -1
  185. package/dist/overlays.cjs +1 -1
  186. package/dist/overlays.js +3 -3
  187. package/dist/{php-DJ1nTQpr.cjs → php-BdVXegqn.cjs} +1 -1
  188. package/dist/{php-DJ1nTQpr.cjs.map → php-BdVXegqn.cjs.map} +1 -1
  189. package/dist/{php-DeBdikHj.js → php-Cb_S1hXT.js} +1 -1
  190. package/dist/{php-DeBdikHj.js.map → php-Cb_S1hXT.js.map} +1 -1
  191. package/dist/primitives.cjs +1 -1
  192. package/dist/style-runtime.cjs +1 -1
  193. package/dist/style-runtime.js +1 -1
  194. package/dist/styles.css +1 -1
  195. package/dist/{theme-Bjs11y3s.cjs → theme-DgaM4CjM.cjs} +2 -2
  196. package/dist/{theme-Bjs11y3s.cjs.map → theme-DgaM4CjM.cjs.map} +1 -1
  197. package/dist/theme.cjs +1 -1
  198. package/dist/{typescript-B5GRzMtL.js → typescript-0VHxrxf2.js} +1 -1
  199. package/dist/{typescript-B5GRzMtL.js.map → typescript-0VHxrxf2.js.map} +1 -1
  200. package/dist/{typescript-qNh_eaB0.cjs → typescript-CcGBfzlS.cjs} +1 -1
  201. package/dist/{typescript-qNh_eaB0.cjs.map → typescript-CcGBfzlS.cjs.map} +1 -1
  202. package/dist/{typography-D4PUdtMV.cjs → typography-C4_O8len.cjs} +2 -2
  203. package/dist/{typography-D4PUdtMV.cjs.map → typography-C4_O8len.cjs.map} +1 -1
  204. package/dist/typography.cjs +1 -1
  205. package/dist/{useGhostText-BTPneo4u.cjs → useGhostText-Dlemg1vw.cjs} +2 -2
  206. package/dist/{useGhostText-BTPneo4u.cjs.map → useGhostText-Dlemg1vw.cjs.map} +1 -1
  207. package/dist/{useInteractionEffect-q_9csNj7.cjs → useInteractionEffect-CFwDX5UF.cjs} +2 -2
  208. package/dist/{useInteractionEffect-q_9csNj7.cjs.map → useInteractionEffect-CFwDX5UF.cjs.map} +1 -1
  209. package/dist/{useKeyboardNav-D_OwIEZp.cjs → useKeyboardNav-Bm-dxVq-.cjs} +2 -2
  210. package/dist/{useKeyboardNav-D_OwIEZp.cjs.map → useKeyboardNav-Bm-dxVq-.cjs.map} +1 -1
  211. package/dist/utils.cjs +1 -1
  212. package/dist/{xml-BTZ6XeQ9.js → xml-8GjNy8SM.js} +1 -1
  213. package/dist/{xml-BTZ6XeQ9.js.map → xml-8GjNy8SM.js.map} +1 -1
  214. package/dist/{xml-_Z3NZw2H.cjs → xml-Dbm3mobK.cjs} +1 -1
  215. package/dist/{xml-_Z3NZw2H.cjs.map → xml-Dbm3mobK.cjs.map} +1 -1
  216. package/package.json +1 -1
  217. package/dist/MConflictIllustration-CWWnskbi.cjs +0 -2
  218. package/dist/MConflictIllustration-CWWnskbi.cjs.map +0 -1
  219. package/dist/MConflictIllustration-Drsm8_8C.js.map +0 -1
  220. package/dist/calendar-BFfeWRa0.cjs +0 -2
  221. package/dist/data-Dh3C_VTi.js.map +0 -1
  222. package/dist/data-Dl6U8Uct.cjs +0 -2
  223. package/dist/data-Dl6U8Uct.cjs.map +0 -1
  224. package/dist/dropdowns-vaj6vhl6.cjs +0 -2
  225. package/dist/frameworkTexts-C1yvIVm4.js.map +0 -1
  226. package/dist/frameworkTexts-D3wbwWCu.cjs +0 -2
  227. package/dist/frameworkTexts-D3wbwWCu.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-CgLutFxU.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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"}
@@ -0,0 +1,2 @@
1
+ const e=require(`./icons-D_NB67he.cjs`),t=require(`./cn-CU5TNITO.cjs`),n=require(`./MPopover-C-e1CoV0.cjs`),r=require(`./MText-Dni707tS.cjs`),i=require(`./MHeading-KDSpnCof.cjs`),a=require(`./MSubText-47PsgE8T.cjs`),o=require(`./MButton-sTKnano6.cjs`),s=require(`./MCheckbox-CIX7wp41.cjs`),c=require(`./MLoader-CvFIvytw.cjs`),l=require(`./MStack-B3Ldqsc-.cjs`),u=require(`./MInputSearch-BZDnbFB4.cjs`),d=require(`./frameworkTexts-iDXhcW6k.cjs`),f=require(`./MTooltip-ChvuN4Ow.cjs`),p=require(`./MPagination-DgQta29Q.cjs`);require(`./core-D66c1_Wo.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:l=!1,filterable:d=!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&&d&&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,d,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&&!l&&!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,l,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=d||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:[d&&(0,h.jsx)(u.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??l,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)(c.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:c,slotLabels:u,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,c),[o,p,c]),V=(0,m.useMemo)(()=>A(s,u),[s,u]),H=(0,m.useMemo)(()=>E(z,B),[z,B]),U=d.a(),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)(l.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),c={day:n,slot:a,value:o,band:s},l=C?C(c):j(c),u=w?w(c):M(c,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&&u!=null&&`mineral-week-grid__cell--tooltip`),style:{height:te},onClick:N?()=>N(c):void 0,onKeyDown:N?e=>{e.key!==`Enter`&&e.key!==` `||(e.preventDefault(),N(c))}:void 0,role:N?`button`:void 0,tabIndex:N?0:void 0,"aria-label":N?d.t(U.cellLabel,{day:e,slot:i,value:o}):void 0,children:l});return u==null?(0,h.jsx)(m.Fragment,{children:p},`cell-${r}-${a}`):(0,h.jsx)(f.t,{content:u,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:d.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-DFrkJTlF.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-DFrkJTlF.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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"}
package/dist/data.cjs CHANGED
@@ -1,3 +1,3 @@
1
1
  const {ensureStyles}=require('./style-runtime.cjs')
2
2
  ensureStyles()
3
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./data-Dl6U8Uct.cjs`),t=require(`./MTreeView-BcVw0Bgz.cjs`);exports.MDataTable=e.a,exports.MTaskList=e.i,exports.MTreeView=t.t,exports.MWeekGrid=e.r,exports.useMCardGrid=e.t,exports.useMTable=e.n;
3
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./data-DFrkJTlF.cjs`),t=require(`./MTreeView-VYp0eErQ.cjs`);exports.MDataTable=e.a,exports.MTaskList=e.i,exports.MTreeView=t.t,exports.MWeekGrid=e.r,exports.useMCardGrid=e.t,exports.useMTable=e.n;
package/dist/data.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import {ensureStyles} from './style-runtime.js'
2
2
  ensureStyles()
3
- import { a as e, i as t, n, r, t as i } from "./data-Dh3C_VTi.js";
3
+ import { a as e, i as t, n, r, t as i } from "./data-CgLutFxU.js";
4
4
  import { t as a } from "./MTreeView-B1J7uqd1.js";
5
5
  export { e as MDataTable, t as MTaskList, a as MTreeView, r as MWeekGrid, i as useMCardGrid, n as useMTable };
@@ -1,3 +1,3 @@
1
- const e=require(`./icons-BxurYyW-.cjs`),t=require(`./cn-CU5TNITO.cjs`),n=require(`./relativeTime-DgYBUaVm.cjs`),r=require(`./MSurface-CF8BFFn4.cjs`),i=require(`./MText-CDDEGjBx.cjs`),a=require(`./MButton-CMbmWmMI.cjs`),o=require(`./MSkeleton-DgU8aktI.cjs`),s=require(`./MStack-BOOciEts.cjs`),c=require(`./MCard-CADu7UUA.cjs`),l=require(`./locale-BGLDTJSi.cjs`);require(`./core-CLRD6sG4.cjs`);let u=require(`react`),d=require(`react/jsx-runtime`);function f({title:n,defaultOpen:r=!1,open:i,onToggle:o,color:c=`primary`,className:l,children:f,...p}){let[m,h]=(0,u.useState)(r),g=i??m,_=()=>{let e=!g;i===void 0&&h(e),o?.(e)},v=(0,d.jsx)(`span`,{className:t.t(`chevron`,g&&`open`),"aria-hidden":`true`,children:(0,d.jsx)(e.Ki,{})});return(0,d.jsxs)(`div`,{className:t.t(`collapsible`,l),...p,children:[(0,d.jsx)(a.t,{variant:`ghost`,color:c,className:`trigger`,"aria-expanded":g,onClick:_,endIcon:v,children:n}),(0,d.jsx)(`div`,{className:t.t(`content-wrap`,g&&`open`),"aria-hidden":!g,children:(0,d.jsx)(s.t,{className:`content`,children:f})})]})}function p(e){return null}function m({multiple:e=!1,defaultOpen:n,onChange:r,bordered:i=!1,color:a,className:o,children:s,...c}){let[l,m]=(0,u.useState)(Array.isArray(n)?n:n?[n]:[]),h=(0,u.useCallback)((t,n)=>{m(i=>{let a;return a=n?e?[...i,t]:[t]:i.filter(e=>e!==t),r?.(a),a})},[e,r]),g=u.Children.toArray(s).filter(e=>(0,u.isValidElement)(e)&&e.type===p);return(0,d.jsx)(`div`,{className:t.t(`accordion`,i&&`bordered`,o),...c,children:g.map(e=>{if(!(0,u.isValidElement)(e))return null;let{id:n,title:r,children:i,disabled:o,color:s}=e.props,c=l.includes(n);return(0,d.jsx)(`div`,{className:t.t(`accordion-item`,o&&`disabled`),children:(0,d.jsx)(f,{title:r,open:c,onToggle:o?void 0:e=>h(n,e),color:s??a,children:i})},n)})})}var h=800;function g(e){return 1-(1-e)**3}function _({value:e,max:n=100,color:r=`primary`,size:i=`md`,label:a,showValue:o=!1,animated:s=!1,striped:c=!1,className:l,...f}){let p=Math.min(100,Math.max(0,e/n*100)),[m,_]=(0,u.useState)(0),[v,y]=(0,u.useState)(0),b=(0,u.useRef)(0),x=(0,u.useRef)(0),S=(0,u.useCallback)((e,t)=>{cancelAnimationFrame(x.current);let n=performance.now(),r=i=>{let a=i-n,o=Math.min(a/h,1),s=g(o);_(e+(t-e)*s),o<1&&(x.current=requestAnimationFrame(r))};y(t),x.current=requestAnimationFrame(r)},[]);return(0,u.useEffect)(()=>(S(b.current,p),b.current=p,()=>cancelAnimationFrame(x.current)),[p,S]),(0,d.jsxs)(`div`,{className:t.t(`progress-bar`,`color-${r}`,i,l),role:`progressbar`,"aria-valuenow":e,"aria-valuemin":0,"aria-valuemax":n,"aria-label":a,...f,children:[(a||o)&&(0,d.jsxs)(`div`,{className:`progress-bar-header`,children:[a&&(0,d.jsx)(`span`,{className:`progress-bar-label`,children:a}),o&&(0,d.jsxs)(`span`,{className:`progress-bar-value`,children:[Math.round(m),`%`]})]}),(0,d.jsx)(`div`,{className:`progress-bar-track`,children:(0,d.jsx)(`div`,{className:t.t(`progress-bar-fill`,s&&`animated`,c&&`striped`),style:{width:`${v}%`}})})]})}function v({value:e,from:n=0,duration:r=1e3,decimals:i=0,prefix:a=``,suffix:o=``,separator:s=``,className:c,...l}){let[f,p]=(0,u.useState)(n),m=(0,u.useRef)(0),h=(0,u.useRef)(null);(0,u.useEffect)(()=>{let t=f;h.current=null;let n=i=>{h.current===null&&(h.current=i);let a=i-h.current,o=Math.min(a/r,1),s=1-(1-o)**3;p(t+(e-t)*s),o<1&&(m.current=requestAnimationFrame(n))};return m.current=requestAnimationFrame(n),()=>cancelAnimationFrame(m.current)},[e,r]);let g=y(f,i,s);return(0,d.jsxs)(`span`,{className:t.t(`count-up`,c),...l,children:[a,g,o]})}function y(e,t,n){let r=e.toFixed(t);if(!n)return r;let[i,a]=r.split(`.`),o=i.replace(/\B(?=(\d{3})+(?!\d))/g,n);return a===void 0?o:`${o}.${a}`}var b={c:`c`,cpp:`cpp`,"c++":`cpp`,arduino:`arduino`,ino:`arduino`,ts:`typescript`,typescript:`typescript`,tsx:`tsx`,js:`javascript`,javascript:`javascript`,jsx:`jsx`,json:`json`,css:`css`,html:`html`,markup:`html`,bash:`bash`,shell:`bash`,shellscript:`bash`,php:`php`},x={xml:()=>Promise.resolve().then(()=>require(`./xml-_Z3NZw2H.cjs`)),css:()=>Promise.resolve().then(()=>require(`./css-B4MkxW0b.cjs`)),javascript:()=>Promise.resolve().then(()=>require(`./javascript-BGrveJJw.cjs`)),typescript:()=>Promise.resolve().then(()=>require(`./typescript-qNh_eaB0.cjs`)),json:()=>Promise.resolve().then(()=>require(`./json-D6oa0Lra.cjs`)),bash:()=>Promise.resolve().then(()=>require(`./bash-CK4DSkpy.cjs`)),c:()=>Promise.resolve().then(()=>require(`./c-9Uw9QchT.cjs`)),cpp:()=>Promise.resolve().then(()=>require(`./cpp-BWqMcMeX.cjs`)),arduino:()=>Promise.resolve().then(()=>require(`./arduino-Bedph8hQ.cjs`)),php:()=>Promise.resolve().then(()=>require(`./php-DJ1nTQpr.cjs`))},S=null,C=42,w=200;function T(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`)}function E(e){return b[e]??e}async function D(){return S||=(async()=>{let e=(await Promise.resolve().then(()=>require(`./core-CLRD6sG4.cjs`))).default.newInstance();for(let[t,n]of Object.entries(x)){let r=await n();e.registerLanguage(t,r.default)}return e.registerAliases([`shell`,`shellscript`],{languageName:`bash`}),e.registerAliases(`markup`,{languageName:`xml`}),e})(),S}function O({code:n,language:s=`tsx`,title:l,showHeader:f=!0,showLanguage:p=!0,showCopyButton:m=!0,copyLabel:h=`Copy`,copiedLabel:g=`Copied`,maxHeight:_,stretch:v=!1,animated:y=!1,lineNumbers:b=!1,className:x,...S}){let O=(0,u.useMemo)(()=>E(s.trim().toLowerCase()),[s]),[k,A]=(0,u.useState)(()=>y?0:n.length),j=y?n.slice(0,k):n,[M,N]=(0,u.useState)(()=>T(j)),[P,F]=(0,u.useState)(!1),I=(0,u.useRef)(null),L=(0,u.useRef)(null),R=(0,u.useRef)(null),z=typeof navigator<`u`&&typeof navigator.clipboard?.writeText==`function`,B=f&&(!!l||p||m),V=(0,u.useMemo)(()=>Math.max(1,j.split(`
1
+ const e=require(`./icons-D_NB67he.cjs`),t=require(`./cn-CU5TNITO.cjs`),n=require(`./relativeTime-DgYBUaVm.cjs`),r=require(`./MSurface-QYEygc_0.cjs`),i=require(`./MText-Dni707tS.cjs`),a=require(`./MButton-sTKnano6.cjs`),o=require(`./MSkeleton-BoFpowFU.cjs`),s=require(`./MStack-B3Ldqsc-.cjs`),c=require(`./MCard-DK-_FkpE.cjs`),l=require(`./locale-DRRl_s5-.cjs`);require(`./core-D66c1_Wo.cjs`);let u=require(`react`),d=require(`react/jsx-runtime`);function f({title:n,defaultOpen:r=!1,open:i,onToggle:o,color:c=`primary`,className:l,children:f,...p}){let[m,h]=(0,u.useState)(r),g=i??m,_=()=>{let e=!g;i===void 0&&h(e),o?.(e)},v=(0,d.jsx)(`span`,{className:t.t(`chevron`,g&&`open`),"aria-hidden":`true`,children:(0,d.jsx)(e.Ki,{})});return(0,d.jsxs)(`div`,{className:t.t(`collapsible`,l),...p,children:[(0,d.jsx)(a.t,{variant:`ghost`,color:c,className:`trigger`,"aria-expanded":g,onClick:_,endIcon:v,children:n}),(0,d.jsx)(`div`,{className:t.t(`content-wrap`,g&&`open`),"aria-hidden":!g,children:(0,d.jsx)(s.t,{className:`content`,children:f})})]})}function p(e){return null}function m({multiple:e=!1,defaultOpen:n,onChange:r,bordered:i=!1,color:a,className:o,children:s,...c}){let[l,m]=(0,u.useState)(Array.isArray(n)?n:n?[n]:[]),h=(0,u.useCallback)((t,n)=>{m(i=>{let a;return a=n?e?[...i,t]:[t]:i.filter(e=>e!==t),r?.(a),a})},[e,r]),g=u.Children.toArray(s).filter(e=>(0,u.isValidElement)(e)&&e.type===p);return(0,d.jsx)(`div`,{className:t.t(`accordion`,i&&`bordered`,o),...c,children:g.map(e=>{if(!(0,u.isValidElement)(e))return null;let{id:n,title:r,children:i,disabled:o,color:s}=e.props,c=l.includes(n);return(0,d.jsx)(`div`,{className:t.t(`accordion-item`,o&&`disabled`),children:(0,d.jsx)(f,{title:r,open:c,onToggle:o?void 0:e=>h(n,e),color:s??a,children:i})},n)})})}var h=800;function g(e){return 1-(1-e)**3}function _({value:e,max:n=100,color:r=`primary`,size:i=`md`,label:a,showValue:o=!1,animated:s=!1,striped:c=!1,className:l,...f}){let p=Math.min(100,Math.max(0,e/n*100)),[m,_]=(0,u.useState)(0),[v,y]=(0,u.useState)(0),b=(0,u.useRef)(0),x=(0,u.useRef)(0),S=(0,u.useCallback)((e,t)=>{cancelAnimationFrame(x.current);let n=performance.now(),r=i=>{let a=i-n,o=Math.min(a/h,1),s=g(o);_(e+(t-e)*s),o<1&&(x.current=requestAnimationFrame(r))};y(t),x.current=requestAnimationFrame(r)},[]);return(0,u.useEffect)(()=>(S(b.current,p),b.current=p,()=>cancelAnimationFrame(x.current)),[p,S]),(0,d.jsxs)(`div`,{className:t.t(`progress-bar`,`color-${r}`,i,l),role:`progressbar`,"aria-valuenow":e,"aria-valuemin":0,"aria-valuemax":n,"aria-label":a,...f,children:[(a||o)&&(0,d.jsxs)(`div`,{className:`progress-bar-header`,children:[a&&(0,d.jsx)(`span`,{className:`progress-bar-label`,children:a}),o&&(0,d.jsxs)(`span`,{className:`progress-bar-value`,children:[Math.round(m),`%`]})]}),(0,d.jsx)(`div`,{className:`progress-bar-track`,children:(0,d.jsx)(`div`,{className:t.t(`progress-bar-fill`,s&&`animated`,c&&`striped`),style:{width:`${v}%`}})})]})}function v({value:e,from:n=0,duration:r=1e3,decimals:i=0,prefix:a=``,suffix:o=``,separator:s=``,className:c,...l}){let[f,p]=(0,u.useState)(n),m=(0,u.useRef)(0),h=(0,u.useRef)(null);(0,u.useEffect)(()=>{let t=f;h.current=null;let n=i=>{h.current===null&&(h.current=i);let a=i-h.current,o=Math.min(a/r,1),s=1-(1-o)**3;p(t+(e-t)*s),o<1&&(m.current=requestAnimationFrame(n))};return m.current=requestAnimationFrame(n),()=>cancelAnimationFrame(m.current)},[e,r]);let g=y(f,i,s);return(0,d.jsxs)(`span`,{className:t.t(`count-up`,c),...l,children:[a,g,o]})}function y(e,t,n){let r=e.toFixed(t);if(!n)return r;let[i,a]=r.split(`.`),o=i.replace(/\B(?=(\d{3})+(?!\d))/g,n);return a===void 0?o:`${o}.${a}`}var b={c:`c`,cpp:`cpp`,"c++":`cpp`,arduino:`arduino`,ino:`arduino`,ts:`typescript`,typescript:`typescript`,tsx:`tsx`,js:`javascript`,javascript:`javascript`,jsx:`jsx`,json:`json`,css:`css`,html:`html`,markup:`html`,bash:`bash`,shell:`bash`,shellscript:`bash`,php:`php`},x={xml:()=>Promise.resolve().then(()=>require(`./xml-Dbm3mobK.cjs`)),css:()=>Promise.resolve().then(()=>require(`./css-9M03GzKO.cjs`)),javascript:()=>Promise.resolve().then(()=>require(`./javascript-CastOQF5.cjs`)),typescript:()=>Promise.resolve().then(()=>require(`./typescript-CcGBfzlS.cjs`)),json:()=>Promise.resolve().then(()=>require(`./json-DCkJ-m-p.cjs`)),bash:()=>Promise.resolve().then(()=>require(`./bash-eOUFh3S1.cjs`)),c:()=>Promise.resolve().then(()=>require(`./c-Bur7Mn-u.cjs`)),cpp:()=>Promise.resolve().then(()=>require(`./cpp-BMULAf-B.cjs`)),arduino:()=>Promise.resolve().then(()=>require(`./arduino-BdpdaLwK.cjs`)),php:()=>Promise.resolve().then(()=>require(`./php-BdVXegqn.cjs`))},S=null,C=42,w=200;function T(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`)}function E(e){return b[e]??e}async function D(){return S||=(async()=>{let e=(await Promise.resolve().then(()=>require(`./core-D66c1_Wo.cjs`))).default.newInstance();for(let[t,n]of Object.entries(x)){let r=await n();e.registerLanguage(t,r.default)}return e.registerAliases([`shell`,`shellscript`],{languageName:`bash`}),e.registerAliases(`markup`,{languageName:`xml`}),e})(),S}function O({code:n,language:s=`tsx`,title:l,showHeader:f=!0,showLanguage:p=!0,showCopyButton:m=!0,copyLabel:h=`Copy`,copiedLabel:g=`Copied`,maxHeight:_,stretch:v=!1,animated:y=!1,lineNumbers:b=!1,className:x,...S}){let O=(0,u.useMemo)(()=>E(s.trim().toLowerCase()),[s]),[k,A]=(0,u.useState)(()=>y?0:n.length),j=y?n.slice(0,k):n,[M,N]=(0,u.useState)(()=>T(j)),[P,F]=(0,u.useState)(!1),I=(0,u.useRef)(null),L=(0,u.useRef)(null),R=(0,u.useRef)(null),z=typeof navigator<`u`&&typeof navigator.clipboard?.writeText==`function`,B=f&&(!!l||p||m),V=(0,u.useMemo)(()=>Math.max(1,j.split(`
2
2
  `).length),[j]);(0,u.useEffect)(()=>{L.current!==null&&(window.clearTimeout(L.current),L.current=null),A(y?0:n.length)},[y,n]),(0,u.useEffect)(()=>{if(!(!y||n.length===0))return k<n.length&&(L.current=window.setTimeout(()=>{A(e=>Math.min(e+1,n.length)),L.current=null},k===0?w:C)),()=>{L.current!==null&&(window.clearTimeout(L.current),L.current=null)}},[y,n.length,k]),(0,u.useEffect)(()=>{let e=!0;async function t(){try{let t=await D(),n=t.getLanguage(O)?t.highlight(j,{language:O,ignoreIllegals:!0}).value:T(j);e&&N(n)}catch{e&&N(T(j))}}return t(),()=>{e=!1}},[O,j]),(0,u.useEffect)(()=>()=>{I.current!==null&&window.clearTimeout(I.current),L.current!==null&&window.clearTimeout(L.current)},[]),(0,u.useEffect)(()=>{!y||!R.current||(R.current.scrollTop=R.current.scrollHeight)},[y,k]);async function H(){if(z)try{await navigator.clipboard.writeText(n),F(!0),I.current!==null&&window.clearTimeout(I.current),I.current=window.setTimeout(()=>{F(!1),I.current=null},1200)}catch{F(!1)}}return(0,d.jsxs)(c.t,{className:t.t(`code-block-card`,x),...S,padded:!1,stretch:v,children:[B&&(0,d.jsx)(c.i,{className:`code-block-header`,children:(0,d.jsxs)(r.n,{className:`code-block-header-layout`,align:`center`,justify:`between`,wrap:`nowrap`,px:`lg`,py:`md`,children:[(0,d.jsxs)(r.n,{className:`code-block-header-meta`,align:`center`,wrap:`wrap`,children:[l&&(0,d.jsx)(i.t,{as:`span`,className:`code-block-title`,size:`sm`,weight:`semibold`,children:l}),p&&s&&(0,d.jsx)(o.n,{color:`info`,size:`sm`,children:s})]}),m&&(0,d.jsx)(a.t,{variant:`ghost`,size:`sm`,color:`neutral`,startIcon:(0,d.jsx)(e.Kn,{size:`sm`,"aria-hidden":`true`}),onClick:H,disabled:!z,children:P?g:h})]})}),(0,d.jsx)(c.n,{className:`code-block-body`,children:(0,d.jsx)(`div`,{ref:R,className:`code-block-scroll`,style:_?{maxHeight:_,overflowY:`auto`}:void 0,children:(0,d.jsxs)(`pre`,{className:t.t(`code-block-pre`,b&&`with-line-numbers`,`language-${O}`),children:[b&&(0,d.jsx)(`span`,{className:`code-block-line-numbers`,"aria-hidden":`true`,children:Array.from({length:V},(e,t)=>(0,d.jsx)(`span`,{className:`code-block-line-number`,children:t+1},t+1))}),(0,d.jsx)(`span`,{className:`code-block-code-shell`,children:(0,d.jsx)(`code`,{className:t.t(`code-block-code`,`hljs`,`language-${O}`),dangerouslySetInnerHTML:{__html:M}})})]})})})]})}function k(e,t){switch(e){case`down`:return{x:0,y:-t};case`left`:return{x:t,y:0};case`right`:return{x:-t,y:0};case`none`:return{x:0,y:0};default:return{x:0,y:t}}}function A({children:e,direction:n=`up`,delay:r=0,duration:i=.46,distance:a=20,once:o=!0,trigger:s=`view`,className:c,style:l,...f}){let p=(0,u.useRef)(null);(0,u.useEffect)(()=>{let e=p.current;if(!e)return;let t=window.matchMedia(`(prefers-reduced-motion: reduce)`).matches;if(e.classList.remove(`revealed`),t){e.classList.add(`revealed`);return}if(s===`mount`){let t=window.requestAnimationFrame(()=>{e.classList.add(`revealed`)});return()=>window.cancelAnimationFrame(t)}let n=new IntersectionObserver(t=>{for(let r of t)r.isIntersecting?(e.classList.add(`revealed`),o&&n.disconnect()):o||e.classList.remove(`revealed`)},{threshold:.2});return n.observe(e),()=>n.disconnect()},[r,n,a,i,o,s]);let m=k(n,a),h={minWidth:0,maxWidth:`100%`,"--reveal-delay":`${r}s`,"--reveal-duration":`${i}s`,"--reveal-translate-x":`${m.x}px`,"--reveal-translate-y":`${m.y}px`,...l};return(0,d.jsx)(`div`,{ref:p,className:t.t(`reveal`,c),style:h,...f,children:e})}function j(e,t,r){return e===`none`?null:e===`minute`?60*1e3:e===`hour`?3600*1e3:e===`day`?1440*60*1e3:n.r(t,r)}function M({value:e,locale:r,maxRelative:i,fallbackFormat:a=`date`,titleAbsolute:o=!0,update:s=`auto`,className:c,...f}){let p=l.t(r),[m,h]=(0,u.useState)(()=>Date.now()),g=(0,u.useMemo)(()=>j(s,e,m),[m,s,e]);(0,u.useEffect)(()=>{if(!g)return;let e=window.setInterval(()=>h(Date.now()),g);return()=>window.clearInterval(e)},[g]);let _=(0,u.useMemo)(()=>n.o(e),[e]),v=(0,u.useMemo)(()=>n.a(i),[i]),y=(0,u.useMemo)(()=>n.t(e,p,a),[e,p,a]),b=(0,u.useMemo)(()=>{if(!_)return String(e);let t=Math.abs(_.getTime()-m);return v!=null&&t>v?y??String(e):n.n(_,{locale:p,now:m})??y??String(e)},[y,_,p,v,m,e]);return(0,d.jsx)(`time`,{className:t.t(`time ago`,c),dateTime:_?.toISOString(),title:o?y??void 0:void 0,...f,children:b})}function N(e,t,n){let r=r=>{let i=(r+e/60)%6;return n-n*t*Math.max(0,Math.min(i,4-i,1))};return`#${[Math.round(r(5)*255),Math.round(r(3)*255),Math.round(r(1)*255)].map(e=>e.toString(16).padStart(2,`0`)).join(``)}`}function P(e){let t=e.replace(`#`,``).match(/.{2}/g);if(!t)return[0,0,1];let[n,r,i]=t.map(e=>parseInt(e,16)/255),a=Math.max(n,r,i),o=a-Math.min(n,r,i),s=0;o!==0&&(s=a===n?((r-i)/o+6)%6:a===r?(i-n)/o+2:(n-r)/o+4,s*=60);let c=a===0?0:o/a;return[s,c,a]}function F(e){let t=e.replace(`#`,``).match(/.{2}/g);if(!t)return`rgb(0, 0, 0)`;let[n,r,i]=t.map(e=>parseInt(e,16));return`rgb(${n}, ${r}, ${i})`}function I(e){let t=e.replace(`#`,``).match(/.{2}/g);if(!t)return`hsl(0, 0%, 0%)`;let[n,r,i]=t.map(e=>parseInt(e,16)/255),a=Math.max(n,r,i),o=Math.min(n,r,i),s=(a+o)/2,c=0,l=0;if(a!==o){let e=a-o;l=s>.5?e/(2-a-o):e/(a+o),c=a===n?((r-i)/e+6)%6:a===r?(i-n)/e+2:(n-r)/e+4,c*=60}return`hsl(${Math.round(c)}, ${Math.round(l*100)}%, ${Math.round(s*100)}%)`}function L(e,t){return t===`rgb`?F(e):t===`hsl`?I(e):e}function R(e){if(!e)return`#000000`;if(e.startsWith(`#`))return e.length===7?e:`#000000`;let t=e.match(/rgb\((\d+),\s*(\d+),\s*(\d+)\)/);return t?`#${[t[1],t[2],t[3]].map(e=>parseInt(e).toString(16).padStart(2,`0`)).join(``)}`:`#000000`}var z=[`#ef4444`,`#f97316`,`#eab308`,`#22c55e`,`#06b6d4`,`#3b82f6`,`#8b5cf6`,`#ec4899`,`#000000`,`#ffffff`];function B({value:e,onChange:n,swatches:r=z,format:i=`hex`,size:a=`md`,label:o,disabled:s=!1,className:c,...l}){let f=R(e??`#3b82f6`),[p,m]=(0,u.useState)(()=>P(f)),[h,g]=(0,u.useState)(L(f,i)),_=(0,u.useRef)(null),v=(0,u.useRef)(null),y=(0,u.useRef)(null);(0,u.useEffect)(()=>{let t=R(e??`#3b82f6`);m(P(t)),g(L(t,i))},[e,i]);let b=(0,u.useCallback)((e,t,r)=>{let a=N(e,t,r);m([e,t,r]),g(L(a,i)),n?.(L(a,i))},[n,i]);function x(e){let t=_.current?.getBoundingClientRect();if(!t)return;let n=Math.max(0,Math.min(1,(e.clientX-t.left)/t.width)),r=Math.max(0,Math.min(1,1-(e.clientY-t.top)/t.height));b(p[0],n,r)}function S(e){let t=v.current?.getBoundingClientRect();t&&b(Math.max(0,Math.min(360,(e.clientX-t.left)/t.width*360)),p[1],p[2])}(0,u.useEffect)(()=>{function e(e){y.current===`area`?x(e):y.current===`hue`&&S(e)}function t(){y.current=null}return window.addEventListener(`pointermove`,e),window.addEventListener(`pointerup`,t),()=>{window.removeEventListener(`pointermove`,e),window.removeEventListener(`pointerup`,t)}});function C(e){g(e);try{let t=R(e);(t!==`#000000`||e===`#000000`||e.toLowerCase()===`rgb(0, 0, 0)`)&&(m(P(t)),n?.(L(t,i)))}catch{}}let w=N(p[0],p[1],p[2]);return(0,d.jsxs)(`div`,{className:t.t(`color-picker`,a,s&&`disabled`,c),...l,children:[o&&(0,d.jsx)(`label`,{className:`label`,children:o}),(0,d.jsxs)(`div`,{ref:_,className:`area`,style:{background:`hsl(${p[0]}, 100%, 50%)`},onPointerDown:e=>{s||(y.current=`area`,x(e))},children:[(0,d.jsx)(`div`,{className:`white`}),(0,d.jsx)(`div`,{className:`black`}),(0,d.jsx)(`div`,{className:`cursor`,style:{left:`${p[1]*100}%`,top:`${(1-p[2])*100}%`,background:w}})]}),(0,d.jsx)(`div`,{ref:v,className:`hue`,onPointerDown:e=>{s||(y.current=`hue`,S(e))},children:(0,d.jsx)(`div`,{className:`hue-thumb`,style:{left:`${p[0]/360*100}%`}})}),(0,d.jsxs)(`div`,{className:`controls`,children:[(0,d.jsx)(`div`,{className:`preview`,style:{background:w}}),(0,d.jsx)(`input`,{type:`text`,className:`input`,value:h,onChange:e=>C(e.target.value),disabled:s})]}),r.length>0&&(0,d.jsx)(`div`,{className:`swatches`,children:r.map(e=>(0,d.jsx)(`button`,{type:`button`,className:t.t(`swatch`,w.toLowerCase()===e.toLowerCase()&&`active`),style:{background:e},onClick:()=>{if(s)return;let[t,n,r]=P(e);b(t,n,r)}},e))})]})}var V={xs:`xs`,sm:`sm`,md:`sm`,lg:`md`,xl:`lg`};function H({icon:e,illustration:n,title:r,description:i,buttonText:o,onAction:s,color:c=`neutral`,size:l=`md`,className:f,children:p,...m}){return(0,d.jsxs)(`div`,{className:t.t(`empty-state`,`color-${c}`,l,f),...m,children:[n&&(0,d.jsx)(`div`,{className:`empty-state-illustration`,children:(0,u.isValidElement)(n)?(0,u.cloneElement)(n,{color:c}):n}),!n&&e&&(0,d.jsx)(`div`,{className:`empty-state-icon`,children:e}),(0,d.jsxs)(`div`,{className:`empty-state-content`,children:[(0,d.jsx)(`div`,{className:`empty-state-title`,children:r}),i&&(0,d.jsx)(`div`,{className:`empty-state-description`,children:i})]}),o&&s&&(0,d.jsx)(`div`,{className:`empty-state-action`,children:(0,d.jsx)(a.t,{size:V[l],variant:`outlined`,color:c,onClick:s,children:o})}),p]})}function U({children:e,amount:n=6,reveal:r=`hover`,revealed:i,defaultRevealed:a=!1,onToggle:o,inline:s=!0,className:c,style:l,onClick:f,onKeyDown:p,...m}){let h=i!==void 0,[g,_]=(0,u.useState)(a),v=h?i:g,y=r!==`none`,b=(0,u.useCallback)(e=>{h||_(e),o?.(e)},[h,o]),x=e=>{r===`click`&&b(!v),f?.(e)},S=e=>{r===`click`&&(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),b(!v)),p?.(e)},C={...l,"--mineral-blur-amount":`${n}px`};return(0,d.jsx)(`span`,{className:t.t(`blur`,s?`inline`:`block`,`reveal-${r}`,v&&`revealed`,c),style:C,tabIndex:y&&r===`click`?0:void 0,role:r===`click`?`button`:void 0,"aria-pressed":r===`click`?v:void 0,onClick:x,onKeyDown:S,...m,children:(0,d.jsx)(`span`,{className:`blur-inner`,"aria-hidden":!v,children:e})})}var W={xs:10,sm:14,md:18,lg:22,xl:28};function G(e){return null}function K({activeStep:n,variant:r=`horizontal`,color:i=`primary`,size:a=`md`,clickable:o=!1,onChange:s,className:c,children:l,...f}){let p=u.Children.toArray(l).filter(e=>(0,u.isValidElement)(e)&&e.type===G);return(0,d.jsx)(`div`,{className:t.t(`stepper`,r,`color-${i}`,a,c),role:`list`,...f,children:p.map((r,i)=>{if(!(0,u.isValidElement)(r))return null;let{id:c,title:l,description:f,icon:p,disabled:m,optional:h,error:g}=r.props,_=i===n,v=i<n,y=o&&!m,b=()=>{y&&s&&s(i)};return(0,d.jsxs)(`div`,{className:t.t(`stepper-step`,_&&`active`,v&&`completed`,m&&`disabled`,g&&`error`,y&&`clickable`),role:`listitem`,"aria-current":_?`step`:void 0,children:[(0,d.jsx)(`div`,{className:`stepper-indicator`,onClick:y?b:void 0,role:y?`button`:void 0,tabIndex:y?0:void 0,onKeyDown:y?e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),b())}:void 0,children:g?`!`:v?p??(0,d.jsx)(e.Yi,{size:W[a]}):p??i+1}),(0,d.jsxs)(`div`,{className:`stepper-content`,children:[(0,d.jsx)(`span`,{className:`stepper-title`,children:l}),f&&(0,d.jsx)(`span`,{className:`stepper-description`,children:f}),h&&(0,d.jsx)(`span`,{className:`stepper-optional`,children:`Optional`})]})]},c)})})}function q(e){return null}function J({align:e=`left`,color:n=`primary`,size:r=`md`,className:i,children:a,...o}){let s=u.Children.toArray(a).filter(e=>(0,u.isValidElement)(e)&&e.type===q);return(0,d.jsx)(`div`,{className:t.t(`timeline`,`align-${e}`,`color-${n}`,r,i),...o,children:s.map((n,r)=>{if(!(0,u.isValidElement)(n))return null;let{id:i,title:a,description:o,date:s,icon:c,color:l}=n.props,f=e===`alternate`?r%2==0?`left`:`right`:void 0;return(0,d.jsxs)(`div`,{className:t.t(`timeline-item`,f&&`side-${f}`),children:[(0,d.jsx)(`div`,{className:t.t(`timeline-dot`,l&&`color-${l}`),children:c}),(0,d.jsxs)(`div`,{className:`timeline-content`,children:[(0,d.jsx)(`span`,{className:`timeline-title`,children:a}),o&&(0,d.jsx)(`span`,{className:`timeline-description`,children:o}),s&&(0,d.jsx)(`span`,{className:`timeline-date`,children:s})]})]},i)})})}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return K}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return H}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return G}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return O}});
3
- //# sourceMappingURL=display-DU9E_18w.cjs.map
3
+ //# sourceMappingURL=display--E7rI0tk.cjs.map