@banzamel/mineralui 1.12.0 → 2.1.0
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.
- package/README.md +1 -1
- package/dist/{MAvatar-CIvYzQV4.js → MAvatar-BcO8hMnU.js} +2 -2
- package/dist/{MAvatar-CIvYzQV4.js.map → MAvatar-BcO8hMnU.js.map} +1 -1
- package/dist/{MAvatar-BElYyQXH.cjs → MAvatar-C4N2ztLf.cjs} +2 -2
- package/dist/{MAvatar-BElYyQXH.cjs.map → MAvatar-C4N2ztLf.cjs.map} +1 -1
- package/dist/{MButton-ouB6903s.cjs → MButton-B8kFTOPJ.cjs} +2 -2
- package/dist/{MButton-ouB6903s.cjs.map → MButton-B8kFTOPJ.cjs.map} +1 -1
- package/dist/{MButton-C94fZ3l9.js → MButton-C1pnL4_j.js} +1 -1
- package/dist/{MButton-C94fZ3l9.js.map → MButton-C1pnL4_j.js.map} +1 -1
- package/dist/{MButtonGroup-BhGt-Yy1.js → MButtonGroup-BkNf7fzo.js} +2 -2
- package/dist/{MButtonGroup-BhGt-Yy1.js.map → MButtonGroup-BkNf7fzo.js.map} +1 -1
- package/dist/{MButtonGroup-yumQneDa.cjs → MButtonGroup-C3Ar0gfk.cjs} +2 -2
- package/dist/{MButtonGroup-yumQneDa.cjs.map → MButtonGroup-C3Ar0gfk.cjs.map} +1 -1
- package/dist/{MCard-9ucghJJs.js → MCard-dLMQQ97e.js} +2 -2
- package/dist/{MCard-9ucghJJs.js.map → MCard-dLMQQ97e.js.map} +1 -1
- package/dist/{MCard-Bg_R86Gr.cjs → MCard-szs5kIek.cjs} +2 -2
- package/dist/{MCard-Bg_R86Gr.cjs.map → MCard-szs5kIek.cjs.map} +1 -1
- package/dist/{MCheckbox-B-nT2OBE.js → MCheckbox-B7SpcD4H.js} +1 -1
- package/dist/{MCheckbox-B-nT2OBE.js.map → MCheckbox-B7SpcD4H.js.map} +1 -1
- package/dist/{MCheckbox-Cbk5hwzJ.cjs → MCheckbox-CATWU11D.cjs} +2 -2
- package/dist/{MCheckbox-Cbk5hwzJ.cjs.map → MCheckbox-CATWU11D.cjs.map} +1 -1
- package/dist/{MConflictIllustration-Ctggjn7z.js → MConflictIllustration-Drsm8_8C.js} +41 -99
- package/dist/MConflictIllustration-Drsm8_8C.js.map +1 -0
- package/dist/MConflictIllustration-Mnz1q7Ey.cjs +2 -0
- package/dist/MConflictIllustration-Mnz1q7Ey.cjs.map +1 -0
- package/dist/{MDetailList-t0ixZflO.cjs → MDetailList-BBgUaSDJ.cjs} +2 -2
- package/dist/{MDetailList-t0ixZflO.cjs.map → MDetailList-BBgUaSDJ.cjs.map} +1 -1
- package/dist/{MDetailList-CELXTmJw.js → MDetailList-zlwdeA-r.js} +2 -2
- package/dist/{MDetailList-CELXTmJw.js.map → MDetailList-zlwdeA-r.js.map} +1 -1
- package/dist/{MDropdownMenu-Coy-0Wee.cjs → MDropdownMenu-1RqWjxHp.cjs} +2 -2
- package/dist/{MDropdownMenu-Coy-0Wee.cjs.map → MDropdownMenu-1RqWjxHp.cjs.map} +1 -1
- package/dist/{MDropdownMenu-BgEtrL-T.js → MDropdownMenu-omTEUh4V.js} +1 -1
- package/dist/{MDropdownMenu-BgEtrL-T.js.map → MDropdownMenu-omTEUh4V.js.map} +1 -1
- package/dist/{MGrid-Di7laCq4.cjs → MGrid-B2qzYD6S.cjs} +2 -2
- package/dist/{MGrid-Di7laCq4.cjs.map → MGrid-B2qzYD6S.cjs.map} +1 -1
- package/dist/{MGrid-yLmEteNw.js → MGrid-Cy44dWyC.js} +1 -1
- package/dist/{MGrid-yLmEteNw.js.map → MGrid-Cy44dWyC.js.map} +1 -1
- package/dist/{MHeading-TJ5yvklz.cjs → MHeading-CyuxSnhl.cjs} +2 -2
- package/dist/{MHeading-TJ5yvklz.cjs.map → MHeading-CyuxSnhl.cjs.map} +1 -1
- package/dist/{MI18nProvider-bf1G7lTP.cjs → MI18nProvider-C90EVyFz.cjs} +2 -2
- package/dist/{MI18nProvider-bf1G7lTP.cjs.map → MI18nProvider-C90EVyFz.cjs.map} +1 -1
- package/dist/{MInput-CkbgK8eU.js → MInput-Baokf17V.js} +2 -2
- package/dist/{MInput-CkbgK8eU.js.map → MInput-Baokf17V.js.map} +1 -1
- package/dist/{MInput-ClHpIrDG.cjs → MInput-Cw9ZVcNO.cjs} +2 -2
- package/dist/{MInput-ClHpIrDG.cjs.map → MInput-Cw9ZVcNO.cjs.map} +1 -1
- package/dist/{MInputCVC-D1rSjwXj.cjs → MInputCVC-Bqcp5Uu3.cjs} +2 -2
- package/dist/{MInputCVC-D1rSjwXj.cjs.map → MInputCVC-Bqcp5Uu3.cjs.map} +1 -1
- package/dist/{MInputCVC-DFtAStrY.js → MInputCVC-DNzDAbfU.js} +3 -3
- package/dist/{MInputCVC-DFtAStrY.js.map → MInputCVC-DNzDAbfU.js.map} +1 -1
- package/dist/{MInputSearch-Dj55a3oO.js → MInputSearch-Bswi-Kj0.js} +2 -2
- package/dist/{MInputSearch-Dj55a3oO.js.map → MInputSearch-Bswi-Kj0.js.map} +1 -1
- package/dist/{MInputSearch-D2Fr_34s.cjs → MInputSearch-D9bp1QAz.cjs} +2 -2
- package/dist/{MInputSearch-D2Fr_34s.cjs.map → MInputSearch-D9bp1QAz.cjs.map} +1 -1
- package/dist/{MKbd-CGkzxJhi.cjs → MKbd-CiwDwFwA.cjs} +2 -2
- package/dist/{MKbd-CGkzxJhi.cjs.map → MKbd-CiwDwFwA.cjs.map} +1 -1
- package/dist/{MKbd-I4xDtsqc.js → MKbd-v6-tJ9sP.js} +1 -1
- package/dist/{MKbd-I4xDtsqc.js.map → MKbd-v6-tJ9sP.js.map} +1 -1
- package/dist/{MLink-CZ2FfQ0N.cjs → MLink-B7gXA8qY.cjs} +2 -2
- package/dist/{MLink-CZ2FfQ0N.cjs.map → MLink-B7gXA8qY.cjs.map} +1 -1
- package/dist/{MPagination-CAzIIP2o.cjs → MPagination-C2GmGkVA.cjs} +2 -2
- package/dist/{MPagination-CAzIIP2o.cjs.map → MPagination-C2GmGkVA.cjs.map} +1 -1
- package/dist/{MPagination-CnFI794t.js → MPagination-DpUtB6t6.js} +2 -2
- package/dist/{MPagination-CnFI794t.js.map → MPagination-DpUtB6t6.js.map} +1 -1
- package/dist/{MPopover-BbgAAM5Z.cjs → MPopover-BVBN5SJi.cjs} +2 -2
- package/dist/{MPopover-BbgAAM5Z.cjs.map → MPopover-BVBN5SJi.cjs.map} +1 -1
- package/dist/{MPortal-DokH9TfY.cjs → MPortal-Djrw2WhD.cjs} +2 -2
- package/dist/{MPortal-DokH9TfY.cjs.map → MPortal-Djrw2WhD.cjs.map} +1 -1
- package/dist/{MSimpleGrid-B6Uh1XJY.cjs → MSimpleGrid-BR352NiK.cjs} +2 -2
- package/dist/{MSimpleGrid-B6Uh1XJY.cjs.map → MSimpleGrid-BR352NiK.cjs.map} +1 -1
- package/dist/{MSimpleGrid-Ds14eBrD.js → MSimpleGrid-BVeCK9Ci.js} +1 -1
- package/dist/{MSimpleGrid-Ds14eBrD.js.map → MSimpleGrid-BVeCK9Ci.js.map} +1 -1
- package/dist/{MSkeleton-BpylRABV.js → MSkeleton-C5uD4Axo.js} +1 -1
- package/dist/{MSkeleton-BpylRABV.js.map → MSkeleton-C5uD4Axo.js.map} +1 -1
- package/dist/{MSkeleton-JMkJFzu9.cjs → MSkeleton-DyQBeuVT.cjs} +2 -2
- package/dist/{MSkeleton-JMkJFzu9.cjs.map → MSkeleton-DyQBeuVT.cjs.map} +1 -1
- package/dist/{MSlider-5141rKeH.js → MSlider-CqrusKJQ.js} +1 -1
- package/dist/{MSlider-5141rKeH.js.map → MSlider-CqrusKJQ.js.map} +1 -1
- package/dist/{MSlider-PyXLKckL.cjs → MSlider-Ds2Fls86.cjs} +2 -2
- package/dist/{MSlider-PyXLKckL.cjs.map → MSlider-Ds2Fls86.cjs.map} +1 -1
- package/dist/{MStack-DDn2bYBQ.cjs → MStack-BdVvJN5S.cjs} +2 -2
- package/dist/{MStack-DDn2bYBQ.cjs.map → MStack-BdVvJN5S.cjs.map} +1 -1
- package/dist/{MStack-B8JtyM10.js → MStack-h11pHEmc.js} +1 -1
- package/dist/{MStack-B8JtyM10.js.map → MStack-h11pHEmc.js.map} +1 -1
- package/dist/MSubText-C-N15d4Z.js +17 -0
- package/dist/MSubText-C-N15d4Z.js.map +1 -0
- package/dist/MSubText-DWNMJupD.cjs +2 -0
- package/dist/MSubText-DWNMJupD.cjs.map +1 -0
- package/dist/{MSurface-WsYGNGX5.cjs → MSurface-BS9l7GDH.cjs} +2 -2
- package/dist/{MSurface-WsYGNGX5.cjs.map → MSurface-BS9l7GDH.cjs.map} +1 -1
- package/dist/{MTag-CKM8lXD6.js → MTag-BF6htPr-.js} +2 -2
- package/dist/{MTag-CKM8lXD6.js.map → MTag-BF6htPr-.js.map} +1 -1
- package/dist/{MTag-Dez1GOX0.cjs → MTag-BwQbycZO.cjs} +2 -2
- package/dist/{MTag-Dez1GOX0.cjs.map → MTag-BwQbycZO.cjs.map} +1 -1
- package/dist/{MText-CAbqC2qZ.cjs → MText-Cjt1oTPr.cjs} +2 -2
- package/dist/{MText-CAbqC2qZ.cjs.map → MText-Cjt1oTPr.cjs.map} +1 -1
- package/dist/{MTooltip-Cbj80F3o.js → MTooltip-Ctyjwxv-.js} +1 -1
- package/dist/{MTooltip-Cbj80F3o.js.map → MTooltip-Ctyjwxv-.js.map} +1 -1
- package/dist/{MTooltip-C-x_SqMx.cjs → MTooltip-gpvKWQzD.cjs} +2 -2
- package/dist/{MTooltip-C-x_SqMx.cjs.map → MTooltip-gpvKWQzD.cjs.map} +1 -1
- package/dist/{MTreeView-B7IWHmGc.cjs → MTreeView-BS60bIj7.cjs} +2 -2
- package/dist/{MTreeView-B7IWHmGc.cjs.map → MTreeView-BS60bIj7.cjs.map} +1 -1
- package/dist/{MTreeView-DMTzRk6c.js → MTreeView-DTsi4bye.js} +2 -2
- package/dist/{MTreeView-DMTzRk6c.js.map → MTreeView-DTsi4bye.js.map} +1 -1
- package/dist/{arduino-CFZS94LP.cjs → arduino-CA8n1Qq3.cjs} +1 -1
- package/dist/{arduino-CFZS94LP.cjs.map → arduino-CA8n1Qq3.cjs.map} +1 -1
- package/dist/{arduino-DWEBiENP.js → arduino-WKgN2ikT.js} +1 -1
- package/dist/{arduino-DWEBiENP.js.map → arduino-WKgN2ikT.js.map} +1 -1
- package/dist/{bash-Dl1TvWHd.cjs → bash-DObE5DDq.cjs} +1 -1
- package/dist/{bash-Dl1TvWHd.cjs.map → bash-DObE5DDq.cjs.map} +1 -1
- package/dist/{bash-DQsQM8so.js → bash-vBtVVub9.js} +1 -1
- package/dist/{bash-DQsQM8so.js.map → bash-vBtVVub9.js.map} +1 -1
- package/dist/{c-BgkSGJWN.js → c-7RiNX--m.js} +1 -1
- package/dist/{c-BgkSGJWN.js.map → c-7RiNX--m.js.map} +1 -1
- package/dist/{c-PUMyVGnz.cjs → c-Bb-MtVny.cjs} +1 -1
- package/dist/{c-PUMyVGnz.cjs.map → c-Bb-MtVny.cjs.map} +1 -1
- package/dist/{cards-C2t-pM0r.js → cards-BkRqUJ2V.js} +14 -14
- package/dist/{cards-C2t-pM0r.js.map → cards-BkRqUJ2V.js.map} +1 -1
- package/dist/{cards-D7_hH3Q8.cjs → cards-DK7j03NN.cjs} +2 -2
- package/dist/{cards-D7_hH3Q8.cjs.map → cards-DK7j03NN.cjs.map} +1 -1
- package/dist/cards.cjs +1 -1
- package/dist/cards.js +2 -2
- package/dist/components/data/MWeekGrid/MWeekGrid.d.ts +8 -0
- package/dist/components/data/MWeekGrid/MWeekGrid.types.d.ts +74 -0
- package/dist/components/data/MWeekGrid/index.d.ts +2 -0
- package/dist/components/data/index.d.ts +2 -0
- package/dist/{controls-DwWfqfDX.cjs → controls-BopaNWb_.cjs} +2 -2
- package/dist/{controls-DwWfqfDX.cjs.map → controls-BopaNWb_.cjs.map} +1 -1
- package/dist/{controls-B3P4zKoA.js → controls-CSTIosnc.js} +4 -4
- package/dist/{controls-B3P4zKoA.js.map → controls-CSTIosnc.js.map} +1 -1
- package/dist/controls.cjs +1 -1
- package/dist/controls.js +5 -5
- package/dist/{core-BdOw9NlN.js → core-DC6zSfZo.js} +1 -1
- package/dist/{core-BdOw9NlN.js.map → core-DC6zSfZo.js.map} +1 -1
- package/dist/{core-B2klLGki.cjs → core-o3cw16Db.cjs} +1 -1
- package/dist/{core-B2klLGki.cjs.map → core-o3cw16Db.cjs.map} +1 -1
- package/dist/{cpp-C_DS-imi.cjs → cpp-BVKrJvso.cjs} +1 -1
- package/dist/{cpp-C_DS-imi.cjs.map → cpp-BVKrJvso.cjs.map} +1 -1
- package/dist/{cpp-ChrqJwqu.js → cpp-CaNnFjgy.js} +1 -1
- package/dist/{cpp-ChrqJwqu.js.map → cpp-CaNnFjgy.js.map} +1 -1
- package/dist/{css-Brdthutg.cjs → css-C2sjPfLl.cjs} +1 -1
- package/dist/{css-Brdthutg.cjs.map → css-C2sjPfLl.cjs.map} +1 -1
- package/dist/{css-DL_ID0lZ.js → css-NqBDP7ZC.js} +1 -1
- package/dist/{css-DL_ID0lZ.js.map → css-NqBDP7ZC.js.map} +1 -1
- package/dist/data-CjVcevdT.js +654 -0
- package/dist/data-CjVcevdT.js.map +1 -0
- package/dist/data-D8qUIvWv.cjs +2 -0
- package/dist/data-D8qUIvWv.cjs.map +1 -0
- package/dist/data.cjs +1 -1
- package/dist/data.js +3 -3
- package/dist/{display-ChhvaSPc.js → display-B7Wh5nnM.js} +17 -17
- package/dist/{display-ChhvaSPc.js.map → display-B7Wh5nnM.js.map} +1 -1
- package/dist/{display-2Vak-RyH.cjs → display-BgZbdTDd.cjs} +2 -2
- package/dist/{display-2Vak-RyH.cjs.map → display-BgZbdTDd.cjs.map} +1 -1
- package/dist/display.cjs +1 -1
- package/dist/display.js +2 -2
- package/dist/{dropdowns-BLd4lyr6.cjs → dropdowns-Befc3lmC.cjs} +2 -2
- package/dist/dropdowns-Befc3lmC.cjs.map +1 -0
- package/dist/{dropdowns-BJ8s18h2.js → dropdowns-DGvRs-VE.js} +6 -6
- package/dist/dropdowns-DGvRs-VE.js.map +1 -0
- package/dist/dropdowns.cjs +1 -1
- package/dist/dropdowns.js +1 -1
- package/dist/{feedback-urwS5wps.js → feedback-C445FEHb.js} +3 -3
- package/dist/{feedback-urwS5wps.js.map → feedback-C445FEHb.js.map} +1 -1
- package/dist/{feedback-DnuJtYUI.cjs → feedback-C8RfsfYJ.cjs} +2 -2
- package/dist/{feedback-DnuJtYUI.cjs.map → feedback-C8RfsfYJ.cjs.map} +1 -1
- package/dist/feedback.cjs +1 -1
- package/dist/feedback.js +4 -4
- package/dist/{form-CFhDAU18.js → form-BWWLNji0.js} +1 -1
- package/dist/{form-CFhDAU18.js.map → form-BWWLNji0.js.map} +1 -1
- package/dist/{form-Bni0Gf_s.cjs → form-DSlAmTT1.cjs} +2 -2
- package/dist/{form-Bni0Gf_s.cjs.map → form-DSlAmTT1.cjs.map} +1 -1
- package/dist/form.cjs +1 -1
- package/dist/form.js +1 -1
- package/dist/i18n/frameworkTexts.d.ts +0 -29
- package/dist/i18n.cjs +1 -1
- package/dist/{icons-BHFwX7ri.cjs → icons-DX_cScBq.cjs} +2 -2
- package/dist/{icons-BHFwX7ri.cjs.map → icons-DX_cScBq.cjs.map} +1 -1
- package/dist/icons.cjs +1 -1
- package/dist/illustrations/index.d.ts +0 -1
- package/dist/illustrations.cjs +1 -1
- package/dist/illustrations.js +2 -2
- package/dist/index.cjs +1 -1
- package/dist/index.js +50 -49
- package/dist/{inputs-CyDoEfL3.js → inputs-BZxorlLv.js} +5 -5
- package/dist/{inputs-CyDoEfL3.js.map → inputs-BZxorlLv.js.map} +1 -1
- package/dist/{inputs-BpdfT9Hp.cjs → inputs-BiZXyZSE.cjs} +2 -2
- package/dist/{inputs-BpdfT9Hp.cjs.map → inputs-BiZXyZSE.cjs.map} +1 -1
- package/dist/inputs.cjs +1 -1
- package/dist/inputs.js +4 -4
- package/dist/{javascript-DFYAIwfO.cjs → javascript-BgwyrBZi.cjs} +1 -1
- package/dist/{javascript-DFYAIwfO.cjs.map → javascript-BgwyrBZi.cjs.map} +1 -1
- package/dist/{javascript-B5hepBcv.js → javascript-BltQGQAn.js} +1 -1
- package/dist/{javascript-B5hepBcv.js.map → javascript-BltQGQAn.js.map} +1 -1
- package/dist/{json-BTHMevf2.cjs → json-DWmLrT_r.cjs} +1 -1
- package/dist/{json-BTHMevf2.cjs.map → json-DWmLrT_r.cjs.map} +1 -1
- package/dist/{json-DTBnkegk.js → json-DbCISZXi.js} +1 -1
- package/dist/{json-DTBnkegk.js.map → json-DbCISZXi.js.map} +1 -1
- package/dist/{layout-BT7KtJVE.js → layout-CnEOTJnJ.js} +6 -6
- package/dist/{layout-BT7KtJVE.js.map → layout-CnEOTJnJ.js.map} +1 -1
- package/dist/{layout-C0WsXFln.cjs → layout-Ct6ViwDQ.cjs} +2 -2
- package/dist/{layout-C0WsXFln.cjs.map → layout-Ct6ViwDQ.cjs.map} +1 -1
- package/dist/layout.cjs +1 -1
- package/dist/layout.js +5 -5
- package/dist/{licensing-sRHTvX0B.cjs → licensing-hMT26Vnv.cjs} +2 -2
- package/dist/{licensing-sRHTvX0B.cjs.map → licensing-hMT26Vnv.cjs.map} +1 -1
- package/dist/{locale-JX_gX03k.js → locale-BNyzqXAU.js} +1 -1
- package/dist/{locale-JX_gX03k.js.map → locale-BNyzqXAU.js.map} +1 -1
- package/dist/{locale-CJWWjFm-.cjs → locale-C5ik0c3d.cjs} +2 -2
- package/dist/{locale-CJWWjFm-.cjs.map → locale-C5ik0c3d.cjs.map} +1 -1
- package/dist/{media-CnjA4Ruo.cjs → media-DZaGKh5V.cjs} +2 -2
- package/dist/{media-CnjA4Ruo.cjs.map → media-DZaGKh5V.cjs.map} +1 -1
- package/dist/{media-CM-uEUrV.js → media-DxnELIZO.js} +3 -3
- package/dist/{media-CM-uEUrV.js.map → media-DxnELIZO.js.map} +1 -1
- package/dist/media.cjs +1 -1
- package/dist/media.js +2 -2
- package/dist/{overlays-NwVsvmlb.js → overlays-BfIrSHDo.js} +9 -9
- package/dist/{overlays-NwVsvmlb.js.map → overlays-BfIrSHDo.js.map} +1 -1
- package/dist/{overlays-BpDz9ddf.cjs → overlays-WsQqxqk1.cjs} +2 -2
- package/dist/{overlays-BpDz9ddf.cjs.map → overlays-WsQqxqk1.cjs.map} +1 -1
- package/dist/overlays.cjs +1 -1
- package/dist/overlays.js +3 -3
- package/dist/{php-ClxZCTCr.cjs → php-CssmZWrI.cjs} +1 -1
- package/dist/{php-ClxZCTCr.cjs.map → php-CssmZWrI.cjs.map} +1 -1
- package/dist/{php-DwgDg57J.js → php-dSXzrC_Z.js} +1 -1
- package/dist/{php-DwgDg57J.js.map → php-dSXzrC_Z.js.map} +1 -1
- package/dist/primitives.cjs +1 -1
- package/dist/style-runtime.cjs +1 -1
- package/dist/style-runtime.js +1 -1
- package/dist/styles.css +1 -1
- package/dist/{theme-yQQAPTkp.cjs → theme-DltOEniv.cjs} +2 -2
- package/dist/{theme-yQQAPTkp.cjs.map → theme-DltOEniv.cjs.map} +1 -1
- package/dist/theme.cjs +1 -1
- package/dist/{typescript-MSi2XC0t.js → typescript-CxKdKTKz.js} +1 -1
- package/dist/{typescript-MSi2XC0t.js.map → typescript-CxKdKTKz.js.map} +1 -1
- package/dist/{typescript-C8NJZXwD.cjs → typescript-DeaMWtYF.cjs} +1 -1
- package/dist/{typescript-C8NJZXwD.cjs.map → typescript-DeaMWtYF.cjs.map} +1 -1
- package/dist/typography-CAW17MDj.js +31 -0
- package/dist/typography-CAW17MDj.js.map +1 -0
- package/dist/typography-vZwd5E5h.cjs +2 -0
- package/dist/typography-vZwd5E5h.cjs.map +1 -0
- package/dist/typography.cjs +1 -1
- package/dist/typography.js +4 -3
- package/dist/{useGhostText-BFaUUKid.cjs → useGhostText-Nw9XCpWS.cjs} +2 -2
- package/dist/{useGhostText-BFaUUKid.cjs.map → useGhostText-Nw9XCpWS.cjs.map} +1 -1
- package/dist/{useInteractionEffect-BH2dgQla.cjs → useInteractionEffect-Gs9HBi2T.cjs} +2 -2
- package/dist/{useInteractionEffect-BH2dgQla.cjs.map → useInteractionEffect-Gs9HBi2T.cjs.map} +1 -1
- package/dist/{useKeyboardNav-CtGPfQX7.cjs → useKeyboardNav-DDN-oeqd.cjs} +2 -2
- package/dist/{useKeyboardNav-CtGPfQX7.cjs.map → useKeyboardNav-DDN-oeqd.cjs.map} +1 -1
- package/dist/utils.cjs +1 -1
- package/dist/{xml-CnKYdLjT.js → xml-BPoVPJlJ.js} +1 -1
- package/dist/{xml-CnKYdLjT.js.map → xml-BPoVPJlJ.js.map} +1 -1
- package/dist/{xml-jypnnWFn.cjs → xml-BUuYcpx2.cjs} +1 -1
- package/dist/{xml-jypnnWFn.cjs.map → xml-BUuYcpx2.cjs.map} +1 -1
- package/package.json +1 -1
- package/dist/MConflictIllustration-CfYeZVmf.cjs +0 -2
- package/dist/MConflictIllustration-CfYeZVmf.cjs.map +0 -1
- package/dist/MConflictIllustration-Ctggjn7z.js.map +0 -1
- package/dist/data-0_KXny56.cjs +0 -2
- package/dist/data-0_KXny56.cjs.map +0 -1
- package/dist/data-9Ej9tlwW.js +0 -463
- package/dist/data-9Ej9tlwW.js.map +0 -1
- package/dist/dropdowns-BJ8s18h2.js.map +0 -1
- package/dist/dropdowns-BLd4lyr6.cjs.map +0 -1
- package/dist/illustrations/scenes/MCookieConsentIllustration.d.ts +0 -2
- package/dist/typography-BHhyTO1V.js +0 -42
- package/dist/typography-BHhyTO1V.js.map +0 -1
- package/dist/typography-Qb1U4eiY.cjs +0 -2
- package/dist/typography-Qb1U4eiY.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"data-9Ej9tlwW.js","names":[],"sources":["../src/components/data/MDataTable/MDataTable.tsx","../src/components/data/MTaskList/MTaskList.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 {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 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 ...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 ref={rootRef} className={cn('data-table', className)} {...rest}>\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=\"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((row as any)[col.key], row, (page - 1) * pageSize + index)\n : (row as any)[col.key]}\n </td>\n ))}\n </tr>\n )\n })}\n </tbody>\n </table>\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 {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}\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 {perPage = 20, initialPage = 1, initialSearch = '', initialFilters, initialSort = null, invalidationKey} = 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 }\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}\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 {perPage = 12, initialPage = 1, initialSearch = '', initialFilters, initialSort = null, invalidationKey} = 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 }\n\n return {gridProps, isLoading, error, refetch}\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dropdowns-BJ8s18h2.js","names":[],"sources":["../src/components/dropdowns/MSelect/MSelect.tsx","../src/components/dropdowns/MAutocomplete/MAutocomplete.tsx","../src/i18n/frameworkTexts.ts","../src/utils/colorRgbVar.ts","../src/components/dropdowns/MDatePicker/MDatePicker.tsx","../src/components/dropdowns/MTimePicker/MTimePicker.tsx","../src/components/dropdowns/MDateRangePicker/MDateRangePicker.tsx"],"sourcesContent":["import {useState, useRef, useCallback, useMemo} from 'react'\nimport type * as React from 'react'\nimport type {MSelectProps, MSelectOption} from './MSelect.types'\nimport {MPopover} from '../../primitives'\nimport {cn} from '../../../utils/cn'\nimport {useKeyboardNav} from '../../../utils/useKeyboardNav'\nimport {MCheckbox} from '../../controls'\nimport {MSpinner, MTag} from '../../feedback'\nimport {MChevronDownIcon, MCloseIcon} from '../../../icons'\nimport './MSelect.css'\n\n// Render a selectable list with optional search, grouping and multi-select tags.\nexport function MSelect({\n options,\n value,\n defaultValue,\n onChange,\n multiple = false,\n searchable = false,\n placeholder = 'MSelect...',\n disabled = false,\n name,\n id,\n variant = 'outlined',\n size = 'md',\n color,\n fullWidth = false,\n label,\n helperText,\n errorText,\n error = false,\n required = false,\n loading = false,\n clearable = false,\n maxHeight = 300,\n noOptionsText = 'No options',\n renderOption,\n renderValue,\n className,\n style,\n}: MSelectProps) {\n const [open, setOpen] = useState(false)\n const [internalValue, setInternalValue] = useState<string | string[]>(defaultValue ?? (multiple ? [] : ''))\n const [search, setSearch] = useState('')\n const triggerRef = useRef<HTMLDivElement>(null)\n\n const currentValue = value !== undefined ? value : internalValue\n const hasError = error || !!errorText\n\n // Normalize the public value into a string array for rendering and selection logic.\n const selectedValues = useMemo(() => {\n if (Array.isArray(currentValue)) return currentValue\n return currentValue ? [currentValue] : []\n }, [currentValue])\n\n const selectedOptions = useMemo(\n () => options.filter((o) => selectedValues.includes(o.value)),\n [options, selectedValues]\n )\n\n // Filter options locally when the searchable mode is active.\n const filteredOptions = useMemo(() => {\n if (!searchable || !search) return options\n const lower = search.toLowerCase()\n return options.filter((o) => o.label.toLowerCase().includes(lower))\n }, [options, searchable, search])\n\n // Group options\n // Preserve group headers without changing the flat keyboard navigation index map.\n const groupedOptions = useMemo(() => {\n const groups = new Map<string, MSelectOption[]>()\n for (const opt of filteredOptions) {\n const key = opt.group ?? ''\n if (!groups.has(key)) groups.set(key, [])\n groups.get(key)!.push(opt)\n }\n return groups\n }, [filteredOptions])\n\n const flatFiltered = filteredOptions\n\n // MToggle or replace the current selection depending on the mode.\n const handleSelect = useCallback(\n (index: number) => {\n const opt = flatFiltered[index]\n if (!opt || opt.disabled) return\n\n if (multiple) {\n const arr = Array.isArray(currentValue) ? currentValue : []\n const newVal = arr.includes(opt.value) ? arr.filter((v) => v !== opt.value) : [...arr, opt.value]\n if (value === undefined) setInternalValue(newVal)\n onChange?.(newVal)\n } else {\n if (value === undefined) setInternalValue(opt.value)\n onChange?.(opt.value)\n setOpen(false)\n setSearch('')\n }\n },\n [flatFiltered, multiple, currentValue, value, onChange]\n )\n\n const {activeIndex, setActiveIndex, resetIndex, onKeyDown} = useKeyboardNav({\n itemCount: flatFiltered.length,\n onSelect: handleSelect,\n onClose: () => {\n setOpen(false)\n setSearch('')\n },\n isOpen: open,\n })\n\n // Open the popover and reset keyboard navigation when the trigger is used.\n const handleTriggerClick = useCallback(() => {\n if (disabled) return\n setOpen((v) => !v)\n resetIndex()\n }, [disabled, resetIndex])\n\n // Reset the current selection without closing the outer field wrapper.\n const handleClear = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation()\n const empty = multiple ? [] : ''\n if (value === undefined) setInternalValue(empty)\n onChange?.(empty)\n },\n [multiple, value, onChange]\n )\n\n // Render tags, labels or the placeholder based on the current selection state.\n const displayValue = useMemo(() => {\n if (renderValue && selectedOptions.length > 0) {\n return renderValue(multiple ? selectedOptions : selectedOptions[0])\n }\n if (multiple && selectedOptions.length > 0) {\n return (\n <span className=\"tags\">\n {selectedOptions.map((o) => (\n <MTag key={o.value} label={o.label} color={color} size={size} variant=\"solid\" />\n ))}\n </span>\n )\n }\n if (!multiple && selectedOptions.length > 0) {\n return selectedOptions[0].label\n }\n return <span className=\"placeholder\">{placeholder}</span>\n }, [selectedOptions, multiple, renderValue, placeholder, color, size])\n\n return (\n <div className={cn('select', color && `color-${color}`, fullWidth && 'full-width', className)} style={style}>\n {label && (\n <label\n htmlFor={id}\n className={cn('field-label', open && 'focused', hasError && 'error', required && 'required')}\n >\n {label}\n </label>\n )}\n\n <div\n ref={triggerRef}\n className={cn(\n 'trigger',\n `field-${variant}`,\n `field-${size}`,\n open && 'focused',\n hasError && 'error',\n disabled && 'disabled'\n )}\n onClick={handleTriggerClick}\n onKeyDown={onKeyDown as unknown as React.KeyboardEventHandler}\n tabIndex={disabled ? -1 : 0}\n role=\"combobox\"\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-invalid={hasError || undefined}\n id={id}\n >\n <span className=\"value\">{displayValue}</span>\n\n {loading && <MSpinner size=\"sm\" color={color} />}\n\n {clearable && selectedValues.length > 0 && !loading && !disabled && (\n <button\n type=\"button\"\n className=\"clear-btn clear-btn-base\"\n onClick={handleClear}\n tabIndex={-1}\n aria-label=\"Clear selection\"\n >\n <MCloseIcon />\n </button>\n )}\n\n <span className={cn('arrow', open && 'open')} aria-hidden=\"true\">\n <MChevronDownIcon />\n </span>\n </div>\n\n {/* Hidden input for form submission */}\n {name && (\n <input\n type=\"hidden\"\n name={name}\n value={Array.isArray(currentValue) ? currentValue.join(',') : currentValue}\n />\n )}\n\n <MPopover\n className={'select-popover'}\n open={open}\n anchorRef={triggerRef}\n onClose={() => {\n setOpen(false)\n setSearch('')\n }}\n matchWidth\n placement=\"bottom-start\"\n >\n <div style={{maxHeight}} className=\"dropdown\">\n {searchable && (\n <div className=\"search-box\">\n <input\n type=\"text\"\n className=\"search-input\"\n placeholder=\"Search...\"\n value={search}\n onChange={(e) => {\n setSearch(e.target.value)\n setActiveIndex(0)\n }}\n onKeyDown={onKeyDown as unknown as React.KeyboardEventHandler}\n autoFocus\n />\n </div>\n )}\n\n {flatFiltered.length === 0 ? (\n <div className=\"no-options\">{noOptionsText}</div>\n ) : (\n <div className=\"options-list\" role=\"listbox\">\n {[...groupedOptions.entries()].map(([group, opts]) => (\n <div key={group}>\n {group && <div className=\"group-header\">{group}</div>}\n {opts.map((opt) => {\n const flatIndex = flatFiltered.indexOf(opt)\n const isActive = flatIndex === activeIndex\n const isSelected = selectedValues.includes(opt.value)\n return (\n <div\n key={opt.value}\n className={cn(\n 'option',\n isActive && 'active',\n isSelected && 'selected',\n opt.disabled && 'disabled'\n )}\n onClick={() => !opt.disabled && handleSelect(flatIndex)}\n onMouseEnter={() => setActiveIndex(flatIndex)}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={opt.disabled}\n >\n {multiple && (\n <MCheckbox\n checked={isSelected}\n size=\"sm\"\n color={color}\n clickEffect=\"none\"\n className=\"select-check\"\n />\n )}\n {renderOption ? renderOption(opt, isActive, isSelected) : opt.label}\n </div>\n )\n })}\n </div>\n ))}\n </div>\n )}\n </div>\n </MPopover>\n\n {(errorText || helperText) && (\n <div className=\"bottom-row\">\n {errorText ? (\n <span className=\"field-error\" role=\"alert\">\n {errorText}\n </span>\n ) : (\n <span className=\"helper-text\">{helperText}</span>\n )}\n </div>\n )}\n </div>\n )\n}\n","import {useState, useRef, useCallback, useMemo} from 'react'\nimport type * as React from 'react'\nimport type {MAutocompleteProps} from './MAutocomplete.types'\nimport {MPopover} from '../../primitives'\nimport {cn} from '../../../utils/cn'\nimport {useKeyboardNav} from '../../../utils/useKeyboardNav'\nimport {useDebouncedCallback} from '../../../utils/useDebounce'\nimport {MSpinner, MTag} from '../../feedback'\nimport {MCloseIcon} from '../../../icons'\nimport './MAutocomplete.css'\n\n// Resolve labels for primitive string options without extra configuration.\nfunction defaultGetLabel<T>(option: T): string {\n if (typeof option === 'string') return option\n return String(option)\n}\n\n// Resolve values for primitive string options without extra configuration.\nfunction defaultGetValue<T>(option: T): string {\n if (typeof option === 'string') return option\n return String(option)\n}\n\n// Apply a basic case-insensitive filter when the caller does not provide one.\nfunction defaultFilter<T>(options: T[], input: string, getLabel: (o: T) => string): T[] {\n if (!input) return options\n const lower = input.toLowerCase()\n return options.filter((o) => getLabel(o).toLowerCase().includes(lower))\n}\n\n// Render a searchable suggestion list with optional multi-tag behavior.\nexport function MAutocomplete<T = string>({\n options,\n value,\n onChange,\n getOptionLabel = defaultGetLabel,\n getOptionValue = defaultGetValue,\n filterOptions,\n multiple = false,\n debounceMs = 0,\n onInputChange,\n loading = false,\n loadingText = 'Loading...',\n noOptionsText = 'No options',\n placeholder = 'Type to search...',\n disabled = false,\n name,\n id,\n variant = 'outlined',\n size = 'md',\n color,\n fullWidth = false,\n label,\n helperText,\n errorText,\n error = false,\n required = false,\n clearable = false,\n maxHeight = 300,\n renderOption,\n renderTags,\n className,\n style,\n}: MAutocompleteProps<T>) {\n const [open, setOpen] = useState(false)\n const [inputValue, setInputValue] = useState('')\n const wrapperRef = useRef<HTMLDivElement>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n\n const hasError = error || !!errorText\n\n // Normalize the public value into an array for tag and selection rendering.\n const selectedValues = useMemo(() => {\n if (value == null) return []\n return Array.isArray(value) ? value.filter((item) => item != null) : [value]\n }, [value])\n\n // Filter suggestions locally unless the caller owns that logic.\n const filtered = useMemo(() => {\n if (filterOptions) return filterOptions(options, inputValue)\n return defaultFilter(options, inputValue, getOptionLabel)\n }, [options, inputValue, filterOptions, getOptionLabel])\n\n const debouncedInputChange = useDebouncedCallback((val: string) => onInputChange?.(val), debounceMs)\n\n // Update the visible query and optionally notify async search logic.\n const handleInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value)\n debouncedInputChange(e.target.value)\n if (!open) setOpen(true)\n },\n [open, debouncedInputChange]\n )\n\n // Apply a selected option to single or multiple value modes.\n const handleSelect = useCallback(\n (index: number) => {\n const opt = filtered[index]\n if (!opt) return\n\n if (multiple) {\n const arr = [...selectedValues]\n const val = getOptionValue(opt)\n const existIdx = arr.findIndex((v) => getOptionValue(v) === val)\n if (existIdx >= 0) {\n arr.splice(existIdx, 1)\n } else {\n arr.push(opt)\n }\n onChange?.(arr)\n setInputValue('')\n inputRef.current?.focus()\n } else {\n onChange?.(opt)\n setInputValue(getOptionLabel(opt))\n setOpen(false)\n }\n },\n [filtered, multiple, selectedValues, getOptionValue, getOptionLabel, onChange]\n )\n\n // Remove a selected tag by index in multiple mode.\n const handleRemoveTag = useCallback(\n (index: number) => {\n const arr = [...selectedValues]\n arr.splice(index, 1)\n onChange?.(multiple ? arr : (arr[0] ?? ('' as unknown as T)))\n },\n [selectedValues, onChange, multiple]\n )\n\n const {\n activeIndex,\n setActiveIndex,\n resetIndex,\n onKeyDown: navKeyDown,\n } = useKeyboardNav({\n itemCount: filtered.length,\n onSelect: handleSelect,\n onClose: () => setOpen(false),\n isOpen: open,\n })\n\n // Combine tag removal and list navigation.\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n // Backspace removes last tag in multiple\n if (e.key === 'Backspace' && multiple && !inputValue && selectedValues.length > 0) {\n handleRemoveTag(selectedValues.length - 1)\n return\n }\n navKeyDown(e as unknown as React.KeyboardEvent)\n },\n [inputValue, multiple, selectedValues, navKeyDown, handleRemoveTag]\n )\n\n // Clear the input query and the selected value(s) together.\n const handleClear = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation()\n setInputValue('')\n onChange?.(multiple ? ([] as unknown as T) : ('' as unknown as T))\n inputRef.current?.focus()\n },\n [multiple, onChange]\n )\n\n return (\n <div\n className={cn('autocomplete', color && `color-${color}`, fullWidth && 'full-width', className)}\n style={style}\n >\n {label && (\n <label\n htmlFor={id}\n className={cn('field-label', open && 'focused', hasError && 'error', required && 'required')}\n >\n {label}\n </label>\n )}\n\n <div\n ref={wrapperRef}\n className={cn(\n 'input-wrapper',\n `field-${variant}`,\n `field-${size}`,\n open && 'focused',\n hasError && 'error',\n disabled && 'disabled'\n )}\n onClick={() => inputRef.current?.focus()}\n >\n {multiple &&\n selectedValues.length > 0 &&\n (renderTags ? (\n renderTags(selectedValues, handleRemoveTag)\n ) : (\n <span className=\"tags\">\n {selectedValues.map((v, i) => (\n <MTag\n key={getOptionValue(v)}\n label={getOptionLabel(v)}\n color={color}\n size={size}\n variant=\"solid\"\n closable\n onClose={() => handleRemoveTag(i)}\n />\n ))}\n </span>\n ))}\n\n <input\n ref={inputRef}\n type=\"text\"\n className=\"input\"\n value={inputValue}\n onChange={handleInputChange}\n onFocus={() => {\n setOpen(true)\n resetIndex()\n }}\n onKeyDown={handleKeyDown}\n placeholder={selectedValues.length > 0 ? '' : placeholder}\n disabled={disabled}\n id={id}\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-invalid={hasError || undefined}\n autoComplete=\"off\"\n />\n\n {loading && <MSpinner size=\"sm\" color={color} />}\n\n {clearable && (selectedValues.length > 0 || inputValue) && !loading && !disabled && (\n <button type=\"button\" className=\"clear-btn clear-btn-base\" onClick={handleClear} tabIndex={-1}>\n <MCloseIcon />\n </button>\n )}\n </div>\n\n {name && <input type=\"hidden\" name={name} value={selectedValues.map(getOptionValue).join(',')} />}\n\n <MPopover\n className={cn('autocomplete-popover', color && `color-${color}`)}\n open={open && (filtered.length > 0 || loading || !!inputValue)}\n anchorRef={wrapperRef}\n onClose={() => setOpen(false)}\n matchWidth\n placement=\"bottom-start\"\n >\n <div style={{maxHeight}} className=\"dropdown\">\n {loading ? (\n <div className=\"loading-msg\">{loadingText}</div>\n ) : filtered.length === 0 ? (\n <div className=\"no-options\">{noOptionsText}</div>\n ) : (\n <div className=\"options-list\" role=\"listbox\">\n {filtered.map((opt, i) => {\n const isActive = i === activeIndex\n const isSelected = selectedValues.some((v) => getOptionValue(v) === getOptionValue(opt))\n return (\n <div\n key={getOptionValue(opt)}\n className={cn('option', isActive && 'active', isSelected && 'selected')}\n onClick={() => handleSelect(i)}\n onMouseEnter={() => setActiveIndex(i)}\n role=\"option\"\n aria-selected={isSelected}\n >\n {renderOption ? renderOption(opt, isActive) : getOptionLabel(opt)}\n </div>\n )\n })}\n </div>\n )}\n </div>\n </MPopover>\n\n {(errorText || helperText) && (\n <div className=\"bottom-row\">\n {errorText ? (\n <span className=\"field-error\" role=\"alert\">\n {errorText}\n </span>\n ) : (\n <span className=\"helper-text\">{helperText}</span>\n )}\n </div>\n )}\n </div>\n )\n}\n","import {useCallback, useMemo} from 'react'\nimport {useOptionalMI18n} from './MI18nProvider'\n\nfunction useTranslate() {\n const i18n = useOptionalMI18n()\n\n return useCallback((key: string, fallback: string) => i18n?.t(key, fallback) ?? fallback, [i18n])\n}\n\nexport interface MDatePickerTexts {\n today: string\n clear: string\n previousMonth: string\n nextMonth: string\n}\n\nexport interface MDateRangePickerTexts extends MDatePickerTexts {\n rangeSubtitle: string\n defaultRangePlaceholder: string\n presets: {\n today: string\n days2: string\n days3: string\n days7: string\n days14: string\n days31: string\n thisMonth: string\n previousMonth: string\n months2: string\n months3: string\n months6: string\n year1: string\n }\n}\n\nexport interface MCalendarBoardTexts {\n monthView: string\n weekView: string\n previousWeek: string\n nextWeek: string\n emptyStateText: string\n timelineTitle: string\n timelineEmptyState: string\n allDay: string\n allDayTab: string\n timelineTab: string\n itemsCount: (count: number) => string\n}\n\nexport interface MFileManagerTexts {\n home: string\n searchPlaceholder: string\n emptyText: string\n folders: string\n noFoldersAvailable: string\n currentFolder: string\n filteredBy: (query: string) => string\n listView: string\n gridView: string\n folder: string\n file: string\n preview: string\n path: string\n selectItemToInspect: string\n itemsCount: (count: number) => string\n rename: string\n moveTo: string\n delete: string\n download: string\n newFolder: string\n}\n\nexport interface MCookieConsentTexts {\n bannerTitle: string\n bannerDescription: string\n manage: string\n preferencesTitle: string\n preferencesDescription: string\n acceptAll: string\n rejectAll: string\n preferences: string\n savePreferences: string\n close: string\n requiredLabel: string\n necessaryLabel: string\n necessaryDescription: string\n preferencesLabel: string\n preferencesDescriptionLabel: string\n analyticsLabel: string\n analyticsDescription: string\n marketingLabel: string\n marketingDescription: string\n declarationTitle: string\n declarationDescription: string\n noDeclarationItems: string\n searchDeclaration: string\n triggerLabel: string\n detectedCookiesLabel: string\n noDetectedCookies: string\n}\n\nexport function useMDatePickerTexts(): MDatePickerTexts {\n const t = useTranslate()\n\n return useMemo(\n () => ({\n today: t('mineralui.datePicker.today', 'Today'),\n clear: t('mineralui.datePicker.clear', 'Clear'),\n previousMonth: t('mineralui.datePicker.previousMonth', 'Previous month'),\n nextMonth: t('mineralui.datePicker.nextMonth', 'Next month'),\n }),\n [t]\n )\n}\n\nexport function useMDateRangePickerTexts(): MDateRangePickerTexts {\n const t = useTranslate()\n\n return useMemo(\n () => ({\n today: t('mineralui.dateRangePicker.today', 'Today'),\n clear: t('mineralui.dateRangePicker.clear', 'Clear'),\n previousMonth: t('mineralui.dateRangePicker.previousMonth', 'Previous month'),\n nextMonth: t('mineralui.dateRangePicker.nextMonth', 'Next month'),\n rangeSubtitle: t('mineralui.dateRangePicker.rangeSubtitle', 'Select start and end dates in one panel.'),\n defaultRangePlaceholder: t('mineralui.dateRangePicker.defaultRangePlaceholder', 'Select date range...'),\n presets: {\n today: t('mineralui.dateRangePicker.presets.today', 'Today'),\n days2: t('mineralui.dateRangePicker.presets.days2', '2 days'),\n days3: t('mineralui.dateRangePicker.presets.days3', '3 days'),\n days7: t('mineralui.dateRangePicker.presets.days7', '7 days'),\n days14: t('mineralui.dateRangePicker.presets.days14', '14 days'),\n days31: t('mineralui.dateRangePicker.presets.days31', '31 days'),\n thisMonth: t('mineralui.dateRangePicker.presets.thisMonth', 'This month'),\n previousMonth: t('mineralui.dateRangePicker.presets.previousMonth', 'Previous month'),\n months2: t('mineralui.dateRangePicker.presets.months2', '2 months'),\n months3: t('mineralui.dateRangePicker.presets.months3', '3 months'),\n months6: t('mineralui.dateRangePicker.presets.months6', '6 months'),\n year1: t('mineralui.dateRangePicker.presets.year1', '1 year'),\n },\n }),\n [t]\n )\n}\n\nexport function useMCalendarBoardTexts(): MCalendarBoardTexts {\n const t = useTranslate()\n\n return useMemo(\n () => ({\n monthView: t('mineralui.calendarBoard.monthView', 'Month'),\n weekView: t('mineralui.calendarBoard.weekView', 'Week'),\n previousWeek: t('mineralui.calendarBoard.previousWeek', 'Previous week'),\n nextWeek: t('mineralui.calendarBoard.nextWeek', 'Next week'),\n emptyStateText: t('mineralui.calendarBoard.emptyStateText', 'No events for the selected day.'),\n timelineTitle: t('mineralui.calendarBoard.timelineTitle', 'Daily timeline'),\n timelineEmptyState: t('mineralui.calendarBoard.timelineEmptyState', 'No events in this hour.'),\n allDay: t('mineralui.calendarBoard.allDay', 'All day'),\n allDayTab: t('mineralui.calendarBoard.allDayTab', 'All day'),\n timelineTab: t('mineralui.calendarBoard.timelineTab', 'Hourly timeline'),\n itemsCount: (count) =>\n t('mineralui.calendarBoard.itemsCount', '{count} items').replace('{count}', String(count)),\n }),\n [t]\n )\n}\n\nexport function useMFileManagerTexts(): MFileManagerTexts {\n const t = useTranslate()\n\n return useMemo(\n () => ({\n home: t('mineralui.fileManager.home', 'Home'),\n searchPlaceholder: t('mineralui.fileManager.searchPlaceholder', 'Search in folder...'),\n emptyText: t('mineralui.fileManager.emptyText', 'This folder is empty.'),\n folders: t('mineralui.fileManager.folders', 'Folders'),\n noFoldersAvailable: t('mineralui.fileManager.noFoldersAvailable', 'No folders available.'),\n currentFolder: t('mineralui.fileManager.currentFolder', 'Current folder'),\n filteredBy: (query) =>\n t('mineralui.fileManager.filteredBy', 'Filtered by \"{query}\"').replace('{query}', query),\n listView: t('mineralui.fileManager.listView', 'List'),\n gridView: t('mineralui.fileManager.gridView', 'Grid'),\n folder: t('mineralui.fileManager.folder', 'Folder'),\n file: t('mineralui.fileManager.file', 'File'),\n preview: t('mineralui.fileManager.preview', 'Preview'),\n path: t('mineralui.fileManager.path', 'Path'),\n selectItemToInspect: t(\n 'mineralui.fileManager.selectItemToInspect',\n 'Select a file or folder to inspect its details.'\n ),\n itemsCount: (count) =>\n t('mineralui.fileManager.itemsCount', '{count} items').replace('{count}', String(count)),\n rename: t('mineralui.fileManager.rename', 'Rename'),\n moveTo: t('mineralui.fileManager.moveTo', 'Move to...'),\n delete: t('mineralui.fileManager.delete', 'Delete'),\n download: t('mineralui.fileManager.download', 'Download'),\n newFolder: t('mineralui.fileManager.newFolder', 'New folder'),\n }),\n [t]\n )\n}\n\nexport function useMCookieConsentTexts(): MCookieConsentTexts {\n const t = useTranslate()\n\n return useMemo(\n () => ({\n bannerTitle: t('mineralui.cookieConsent.bannerTitle', 'We use cookies'),\n bannerDescription: t(\n 'mineralui.cookieConsent.bannerDescription',\n 'We use necessary cookies to keep the site working and optional cookies to improve experience, analytics and marketing.'\n ),\n manage: t('mineralui.cookieConsent.manage', 'Manage'),\n preferencesTitle: t('mineralui.cookieConsent.preferencesTitle', 'Cookie preferences'),\n preferencesDescription: t(\n 'mineralui.cookieConsent.preferencesDescription',\n 'Choose which optional cookie categories you allow. Necessary cookies are always active.'\n ),\n acceptAll: t('mineralui.cookieConsent.acceptAll', 'Accept all'),\n rejectAll: t('mineralui.cookieConsent.rejectAll', 'Reject optional'),\n preferences: t('mineralui.cookieConsent.preferences', 'Preferences'),\n savePreferences: t('mineralui.cookieConsent.savePreferences', 'Save preferences'),\n close: t('mineralui.cookieConsent.close', 'Close'),\n requiredLabel: t('mineralui.cookieConsent.requiredLabel', 'Required'),\n necessaryLabel: t('mineralui.cookieConsent.necessaryLabel', 'Necessary'),\n necessaryDescription: t(\n 'mineralui.cookieConsent.necessaryDescription',\n 'These cookies are required for core site functionality and cannot be disabled.'\n ),\n preferencesLabel: t('mineralui.cookieConsent.preferencesLabel', 'Preferences'),\n preferencesDescriptionLabel: t(\n 'mineralui.cookieConsent.preferencesDescriptionLabel',\n 'These cookies remember settings such as language, theme or saved interface choices.'\n ),\n analyticsLabel: t('mineralui.cookieConsent.analyticsLabel', 'Analytics'),\n analyticsDescription: t(\n 'mineralui.cookieConsent.analyticsDescription',\n 'These cookies help measure usage and improve content, performance and navigation.'\n ),\n marketingLabel: t('mineralui.cookieConsent.marketingLabel', 'Marketing'),\n marketingDescription: t(\n 'mineralui.cookieConsent.marketingDescription',\n 'These cookies support campaigns, advertising attribution and embedded marketing tools.'\n ),\n declarationTitle: t('mineralui.cookieConsent.declarationTitle', 'Cookie declaration'),\n declarationDescription: t(\n 'mineralui.cookieConsent.declarationDescription',\n 'Review the cookies and storage technologies used by this page, grouped by purpose.'\n ),\n noDeclarationItems: t('mineralui.cookieConsent.noDeclarationItems', 'No declaration items available.'),\n searchDeclaration: t('mineralui.cookieConsent.searchDeclaration', 'Search cookies...'),\n triggerLabel: t('mineralui.cookieConsent.triggerLabel', 'Cookie settings'),\n detectedCookiesLabel: t('mineralui.cookieConsent.detectedCookiesLabel', 'Detected storage and trackers'),\n noDetectedCookies: t(\n 'mineralui.cookieConsent.noDetectedCookies',\n 'No storage or trackers detected in this category yet.'\n ),\n }),\n [t]\n )\n}\n","const COLOR_MAP: Record<string, string> = {\n primary: 'var(--mineral-primary-rgb)',\n neutral: 'var(--mineral-neutral-rgb)',\n success: 'var(--mineral-success-rgb)',\n error: 'var(--mineral-error-rgb)',\n warning: 'var(--mineral-warning-rgb)',\n info: 'var(--mineral-info-rgb)',\n light: 'var(--mineral-light-rgb)',\n dark: 'var(--mineral-dark-color-rgb)',\n news: 'var(--mineral-news-rgb)',\n}\n\nexport function colorRgbVar(color: string | undefined): string {\n return COLOR_MAP[color ?? 'primary'] ?? COLOR_MAP.primary\n}\n","import {useState, useRef, useCallback, useMemo, useEffect} from 'react'\nimport type * as React from 'react'\nimport type {MDatePickerProps} from './MDatePicker.types'\nimport type {MDateFormat} from '../../inputs'\nimport {MInput} from '../../inputs'\nimport {MPopover} from '../../primitives'\nimport {cn} from '../../../utils/cn'\nimport {useMDatePickerTexts} from '../../../i18n/frameworkTexts'\nimport {useDocumentLocale} from '../../../utils/locale'\nimport type {ValidationResult} from '../../../utils/validators'\nimport {parseDateString, validateDate} from '../../../utils/validators'\nimport {stripNonDigits, formatDateInput} from '../../../utils/formatters'\nimport {colorRgbVar} from '../../../utils/colorRgbVar'\nimport {\n formatDate,\n daysInMonth,\n firstDayOfMonth,\n isSameDay,\n isDateInRange,\n getDayNames,\n getMonthNames,\n addMonths,\n stripTime,\n combineDateAndTime,\n formatHiddenDateValue,\n formatTimeWithFormat,\n parseTimeWithFormat,\n} from '../../../utils/dateUtils'\nimport {\n MCalendarIcon,\n MChevronLeftIcon as ChevronLeftGlyphIcon,\n MChevronRightIcon as ChevronRightGlyphIcon,\n} from '../../../icons'\nimport './MDatePicker.css'\n\nconst DATE_UNAVAILABLE_ERROR = 'Date is unavailable'\nconst INVALID_TIME_ERROR = 'Invalid time'\n\ntype Meridiem = 'AM' | 'PM'\n\ntype MDatePickerInputConfig = {\n inputFormat: MDateFormat\n separator: '/' | '.' | '-'\n}\n\ntype ParsedInputState =\n | {status: 'empty'}\n | {status: 'partial'; datePart: string; timePart: string}\n | {status: 'invalid'; datePart: string; timePart: string; result: ValidationResult}\n | {status: 'valid'; datePart: string; timePart: string; value: Date}\n\nfunction toDate(value: Date | string | undefined): Date | null {\n if (!value) return null\n if (value instanceof Date) return isNaN(value.getTime()) ? null : new Date(value.getTime())\n\n const date = new Date(value)\n return isNaN(date.getTime()) ? null : date\n}\n\nfunction normalizeDatePickerFormat(format: string): MDatePickerInputConfig {\n const normalizedFormat = format.replace(/DD/g, 'dd').replace(/YYYY/g, 'yyyy')\n const tokens = normalizedFormat.match(/dd|MM|yyyy/g)\n const detectedSeparator = normalizedFormat.match(/[^dMy]/)?.[0]\n const separator =\n detectedSeparator === '/' || detectedSeparator === '.' || detectedSeparator === '-' ? detectedSeparator : '.'\n const order = tokens?.join('/')\n\n switch (order) {\n case 'MM/dd/yyyy':\n return {inputFormat: 'MM/DD/YYYY', separator}\n case 'yyyy/MM/dd':\n return {inputFormat: 'YYYY/MM/DD', separator}\n case 'dd/MM/yyyy':\n default:\n return {inputFormat: 'DD/MM/YYYY', separator}\n }\n}\n\nfunction getDefaultTimePlaceholder(format: '24h' | '12h', showSeconds: boolean): string {\n if (format === '12h') {\n return showSeconds ? 'hh:mm:ss AM' : 'hh:mm AM'\n }\n\n return showSeconds ? 'HH:MM:SS' : 'HH:MM'\n}\n\nfunction getInputPlaceholder(\n basePlaceholder: string | undefined,\n dateFormat: string,\n withTime: boolean,\n timeFormat: '24h' | '12h',\n showSeconds: boolean,\n timePlaceholder?: string\n): string {\n if (basePlaceholder) {\n return basePlaceholder\n }\n\n if (!withTime) {\n return dateFormat\n }\n\n return `${dateFormat} ${timePlaceholder ?? getDefaultTimePlaceholder(timeFormat, showSeconds)}`\n}\n\nfunction formatDisplayValue(\n date: Date | null,\n options: {\n format: string\n withTime: boolean\n timeFormat: '24h' | '12h'\n showSeconds: boolean\n }\n): string {\n if (!date) return ''\n\n const datePart = formatDate(stripTime(date), options.format)\n\n if (!options.withTime) {\n return datePart\n }\n\n return `${datePart} ${formatTimeWithFormat(\n date.getHours(),\n date.getMinutes(),\n date.getSeconds(),\n options.showSeconds,\n options.timeFormat\n )}`\n}\n\nfunction formatTimeDraft(digits: string, showSeconds: boolean): string {\n if (!digits) return ''\n\n if (digits.length <= 2) return digits\n if (digits.length <= 4) return `${digits.slice(0, 2)}:${digits.slice(2)}`\n if (!showSeconds) return `${digits.slice(0, 2)}:${digits.slice(2, 4)}`\n return `${digits.slice(0, 2)}:${digits.slice(2, 4)}:${digits.slice(4, 6)}`\n}\n\nfunction normalizeMeridiemDraft(value: string): string {\n const letters = value.toUpperCase().replace(/[^APM]/g, '')\n\n if (!letters) return ''\n if (letters.startsWith('AM')) return 'AM'\n if (letters.startsWith('PM')) return 'PM'\n if (letters.startsWith('A')) return 'A'\n if (letters.startsWith('P')) return 'P'\n\n return ''\n}\n\nfunction splitInputValue(value: string, withTime: boolean) {\n const trimmed = value.trim()\n\n if (!trimmed) {\n return {datePart: '', timePart: ''}\n }\n\n if (!withTime) {\n return {datePart: trimmed, timePart: ''}\n }\n\n const firstSpaceIndex = trimmed.indexOf(' ')\n\n if (firstSpaceIndex === -1) {\n return {datePart: trimmed, timePart: ''}\n }\n\n return {\n datePart: trimmed.slice(0, firstSpaceIndex).trim(),\n timePart: trimmed.slice(firstSpaceIndex + 1).trim(),\n }\n}\n\nfunction formatTypedInput(\n rawValue: string,\n options: {\n inputFormat: MDateFormat\n separator: '/' | '.' | '-'\n withTime: boolean\n timeFormat: '24h' | '12h'\n showSeconds: boolean\n }\n) {\n const normalizedValue = rawValue.toUpperCase()\n const digits = stripNonDigits(normalizedValue)\n const dateDigits = digits.slice(0, 8)\n const timeDigits = options.withTime ? digits.slice(8, 8 + (options.showSeconds ? 6 : 4)) : ''\n const datePart = formatDateInput(dateDigits, options.inputFormat, options.separator)\n\n if (!options.withTime) {\n return {formatted: datePart, datePart, timePart: ''}\n }\n\n const timeBase = formatTimeDraft(timeDigits, options.showSeconds)\n const meridiem = options.timeFormat === '12h' ? normalizeMeridiemDraft(normalizedValue) : ''\n const timePart = `${timeBase}${meridiem ? `${timeBase ? ' ' : ''}${meridiem}` : ''}`.trim()\n\n if (!datePart) {\n return {formatted: timePart, datePart: '', timePart}\n }\n\n // Preserve the space delimiter once the date is complete so the user can keep typing the time.\n const dateComplete = dateDigits.length === 8\n const userTypedSpaceAfterDate = /\\s/.test(normalizedValue.slice(datePart.length))\n const showSpace = timePart || (dateComplete && userTypedSpaceAfterDate)\n\n return {\n formatted: showSpace ? `${datePart} ${timePart}` : datePart,\n datePart,\n timePart,\n }\n}\n\nfunction getTimeDraftFromDate(date: Date | null, showSeconds: boolean): string {\n if (!date) return ''\n return formatTimeWithFormat(date.getHours(), date.getMinutes(), date.getSeconds(), showSeconds, '24h')\n}\n\nfunction parseInputValue(\n value: string,\n options: {\n inputFormat: MDateFormat\n minDate: Date | null\n maxDate: Date | null\n withTime: boolean\n timeFormat: '24h' | '12h'\n showSeconds: boolean\n isDisabled: (date: Date) => boolean\n }\n): ParsedInputState {\n const {datePart, timePart} = splitInputValue(value, options.withTime)\n\n if (!datePart && !timePart) {\n return {status: 'empty'}\n }\n\n const validation = validateDate(datePart, {\n format: options.inputFormat,\n minDate: options.minDate ?? undefined,\n maxDate: options.maxDate ?? undefined,\n })\n\n if (!validation.valid) {\n return validation.error === 'Incomplete date'\n ? {status: 'partial', datePart, timePart}\n : {status: 'invalid', datePart, timePart, result: validation}\n }\n\n const parsedDate = parseDateString(datePart, options.inputFormat)\n\n if (!parsedDate) {\n return {status: 'invalid', datePart, timePart, result: {valid: false, error: 'Invalid date'}}\n }\n\n if (options.isDisabled(parsedDate)) {\n return {status: 'invalid', datePart, timePart, result: {valid: false, error: DATE_UNAVAILABLE_ERROR}}\n }\n\n if (!options.withTime) {\n return {status: 'valid', datePart, timePart: '', value: stripTime(parsedDate)}\n }\n\n if (!timePart) {\n return {\n status: 'valid',\n datePart,\n timePart: '',\n value: combineDateAndTime(parsedDate, '', {format: options.timeFormat, showSeconds: options.showSeconds}),\n }\n }\n\n const parsedTime = parseTimeWithFormat(timePart, options.timeFormat)\n\n if (!parsedTime) {\n return {status: 'invalid', datePart, timePart, result: {valid: false, error: INVALID_TIME_ERROR}}\n }\n\n return {\n status: 'valid',\n datePart,\n timePart,\n value: combineDateAndTime(parsedDate, timePart, {format: options.timeFormat, showSeconds: options.showSeconds}),\n }\n}\n\nfunction to12HourParts(value: {hours: number; minutes: number; seconds: number}) {\n const meridiem: Meridiem = value.hours >= 12 ? 'PM' : 'AM'\n const hours = value.hours % 12 || 12\n return {hours, minutes: value.minutes, seconds: value.seconds, meridiem}\n}\n\nfunction to24HourValue(hours: number, meridiem: Meridiem): number {\n if (meridiem === 'AM') {\n return hours === 12 ? 0 : hours\n }\n\n return hours === 12 ? 12 : hours + 12\n}\n\nexport function MDatePicker({\n value,\n defaultValue,\n onChange,\n format = 'dd.MM.yyyy',\n locale: localeOverride,\n min,\n max,\n disabledDates,\n placeholder,\n disabled = false,\n readOnly = false,\n name,\n id,\n variant = 'outlined',\n size = 'md',\n color,\n label,\n helperText,\n errorText,\n error = false,\n required = false,\n clearable = false,\n withTime = false,\n validateOnBlur = true,\n validateOnChange = false,\n onValidationChange,\n timeFormat = '24h',\n showSeconds = false,\n minuteStep = 1,\n timePlaceholder,\n inline = false,\n showTodayButton = true,\n firstDayOfWeek = 1,\n fullWidth = false,\n className,\n style,\n}: MDatePickerProps) {\n const locale = useDocumentLocale(localeOverride)\n const texts = useMDatePickerTexts()\n const {inputFormat, separator} = useMemo(() => normalizeDatePickerFormat(format), [format])\n const [open, setOpen] = useState(false)\n const [internalValue, setInternalValue] = useState<Date | null>(() => toDate(defaultValue))\n const [validationState, setValidationState] = useState<ValidationResult>({valid: true})\n const [touched, setTouched] = useState(false)\n const selectedValue = value !== undefined ? toDate(value) : internalValue\n const [inputValue, setInputValue] = useState(() =>\n formatDisplayValue(selectedValue, {format, withTime, timeFormat, showSeconds})\n )\n const [draftTimeValue, setDraftTimeValue] = useState(() => getTimeDraftFromDate(selectedValue, showSeconds))\n const [viewDate, setViewDate] = useState(() => {\n const baseDate = selectedValue ? stripTime(selectedValue) : new Date()\n return new Date(baseDate.getFullYear(), baseDate.getMonth(), 1)\n })\n const [viewMode, setViewMode] = useState<'days' | 'months'>('days')\n const anchorRef = useRef<HTMLDivElement>(null)\n const selectedValueKey = selectedValue?.getTime() ?? null\n const minDate = toDate(min)\n const maxDate = toDate(max)\n const hasError = error || (touched && !validationState.valid)\n const resolvedErrorText = errorText || (touched && !validationState.valid ? validationState.error : undefined)\n const dayNames = getDayNames(locale, firstDayOfWeek)\n const monthNames = getMonthNames(locale)\n\n useEffect(() => {\n setInputValue(formatDisplayValue(selectedValue, {format, withTime, timeFormat, showSeconds}))\n setDraftTimeValue(getTimeDraftFromDate(selectedValue, showSeconds))\n if (selectedValue) {\n const normalizedDate = stripTime(selectedValue)\n setViewDate(new Date(normalizedDate.getFullYear(), normalizedDate.getMonth(), 1))\n }\n }, [format, selectedValueKey, showSeconds, timeFormat, withTime])\n\n const isDisabled = useCallback(\n (date: Date): boolean => {\n if (!isDateInRange(date, minDate, maxDate)) return true\n if (Array.isArray(disabledDates)) {\n return disabledDates.some((disabledDate) => isSameDay(disabledDate, date))\n }\n if (typeof disabledDates === 'function') {\n return disabledDates(date)\n }\n return false\n },\n [disabledDates, maxDate, minDate]\n )\n\n const emitValidation = useCallback(\n (result: ValidationResult) => {\n setValidationState(result)\n onValidationChange?.(result)\n },\n [onValidationChange]\n )\n\n const commitValue = useCallback(\n (nextValue: Date | null) => {\n if (value === undefined) {\n setInternalValue(nextValue)\n }\n\n onChange?.(nextValue)\n },\n [onChange, value]\n )\n\n const parsedInputState = useMemo(\n () =>\n parseInputValue(inputValue, {\n inputFormat,\n minDate,\n maxDate,\n withTime,\n timeFormat,\n showSeconds,\n isDisabled,\n }),\n [inputFormat, inputValue, isDisabled, maxDate, minDate, showSeconds, timeFormat, withTime]\n )\n\n const currentDateForPanel = useMemo(() => {\n if (parsedInputState.status === 'valid') {\n return stripTime(parsedInputState.value)\n }\n\n return selectedValue ? stripTime(selectedValue) : null\n }, [parsedInputState, selectedValue])\n\n const currentTimeForPanel = useMemo(() => {\n if (!withTime) return null\n\n const timeSource =\n parsedInputState.status !== 'empty' && parsedInputState.timePart\n ? parsedInputState.timePart\n : draftTimeValue || getTimeDraftFromDate(selectedValue, showSeconds)\n\n return parseTimeWithFormat(timeSource, timeFormat) ?? {hours: 0, minutes: 0, seconds: 0}\n }, [draftTimeValue, parsedInputState, selectedValue, showSeconds, timeFormat, withTime])\n\n const handleInputChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const nextTyped = formatTypedInput(event.target.value, {\n inputFormat,\n separator,\n withTime,\n timeFormat,\n showSeconds,\n })\n\n setInputValue(nextTyped.formatted)\n setDraftTimeValue(nextTyped.timePart)\n\n const nextParsedState = parseInputValue(nextTyped.formatted, {\n inputFormat,\n minDate,\n maxDate,\n withTime,\n timeFormat,\n showSeconds,\n isDisabled,\n })\n\n if (nextParsedState.status === 'empty') {\n emitValidation({valid: true})\n commitValue(null)\n return\n }\n\n if (nextParsedState.status === 'invalid' && validateOnChange) {\n emitValidation(nextParsedState.result)\n } else if (nextParsedState.status === 'valid') {\n emitValidation({valid: true})\n setViewDate(new Date(nextParsedState.value.getFullYear(), nextParsedState.value.getMonth(), 1))\n // Hold the commit until the time is fully typed so the formatter doesn't pad\n // partial minutes/seconds (e.g. \"21:3\" → \"21:03\") and overwrite the cursor while typing.\n // Blur falls back to 00:00 via the INVALID_TIME_ERROR retry if the user never finishes.\n const requiredTimeDigits = showSeconds ? 6 : 4\n const typedTimeDigits = withTime ? stripNonDigits(event.target.value).slice(8).length : 0\n const timeComplete = !withTime || typedTimeDigits >= requiredTimeDigits\n if (timeComplete) {\n commitValue(nextParsedState.value)\n }\n }\n },\n [\n commitValue,\n emitValidation,\n inputFormat,\n isDisabled,\n maxDate,\n minDate,\n separator,\n showSeconds,\n timeFormat,\n validateOnChange,\n withTime,\n ]\n )\n\n const handleInputBlur = useCallback(() => {\n setTouched(true)\n\n const nextParsedState = parseInputValue(inputValue, {\n inputFormat,\n minDate,\n maxDate,\n withTime,\n timeFormat,\n showSeconds,\n isDisabled,\n })\n\n if (nextParsedState.status === 'empty') {\n emitValidation({valid: true})\n return\n }\n\n if (nextParsedState.status === 'partial') {\n if (validateOnBlur) {\n emitValidation({valid: false, error: 'Incomplete date'})\n }\n return\n }\n\n if (nextParsedState.status === 'invalid') {\n // Out-of-range time entry (e.g. 48:69) clamps to 00:00 on blur instead of staying invalid.\n if (withTime && nextParsedState.result.error === INVALID_TIME_ERROR && nextParsedState.datePart) {\n const fallbackTimePart = formatTimeWithFormat(0, 0, 0, showSeconds, timeFormat)\n const retry = parseInputValue(`${nextParsedState.datePart} ${fallbackTimePart}`, {\n inputFormat,\n minDate,\n maxDate,\n withTime,\n timeFormat,\n showSeconds,\n isDisabled,\n })\n\n if (retry.status === 'valid') {\n emitValidation({valid: true})\n setInputValue(formatDisplayValue(retry.value, {format, withTime, timeFormat, showSeconds}))\n setDraftTimeValue(getTimeDraftFromDate(retry.value, showSeconds))\n commitValue(retry.value)\n return\n }\n }\n\n if (validateOnBlur) {\n emitValidation(nextParsedState.result)\n }\n return\n }\n\n emitValidation({valid: true})\n setInputValue(formatDisplayValue(nextParsedState.value, {format, withTime, timeFormat, showSeconds}))\n setDraftTimeValue(getTimeDraftFromDate(nextParsedState.value, showSeconds))\n commitValue(nextParsedState.value)\n }, [\n commitValue,\n emitValidation,\n format,\n inputFormat,\n inputValue,\n isDisabled,\n maxDate,\n minDate,\n showSeconds,\n timeFormat,\n validateOnBlur,\n withTime,\n ])\n\n const handleInputKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (['Backspace', 'Delete', 'Tab', 'ArrowLeft', 'ArrowRight', 'Home', 'End', 'Enter'].includes(event.key)) {\n return\n }\n\n if (event.ctrlKey || event.metaKey) {\n return\n }\n\n const allowCharacter = withTime ? /^[0-9\\s:./-APMapm]$/ : /^[0-9./-]$/\n\n if (!allowCharacter.test(event.key)) {\n event.preventDefault()\n }\n },\n [withTime]\n )\n\n const handleClear = useCallback(() => {\n setInputValue('')\n setDraftTimeValue('')\n setTouched(false)\n emitValidation({valid: true})\n commitValue(null)\n }, [commitValue, emitValidation])\n\n const handleTogglePopover = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault()\n event.stopPropagation()\n\n if (disabled || readOnly || inline) return\n\n setOpen((current) => !current)\n },\n [disabled, inline, readOnly]\n )\n\n const handleSelectDate = useCallback(\n (date: Date) => {\n if (isDisabled(date)) return\n\n const nextTime = withTime ? draftTimeValue || formatTimeWithFormat(0, 0, 0, showSeconds, timeFormat) : ''\n const nextValue = withTime\n ? combineDateAndTime(date, nextTime, {format: timeFormat, showSeconds})\n : stripTime(date)\n\n setTouched(true)\n emitValidation({valid: true})\n setDraftTimeValue(nextTime)\n setInputValue(formatDisplayValue(nextValue, {format, withTime, timeFormat, showSeconds}))\n setViewDate(new Date(date.getFullYear(), date.getMonth(), 1))\n commitValue(nextValue)\n\n if (!withTime && !inline) {\n setOpen(false)\n }\n },\n [commitValue, draftTimeValue, emitValidation, format, inline, isDisabled, showSeconds, timeFormat, withTime]\n )\n\n const handleToday = useCallback(() => {\n const today = stripTime(new Date())\n\n if (isDisabled(today)) return\n\n handleSelectDate(today)\n }, [handleSelectDate, isDisabled])\n\n const hours = useMemo(() => {\n if (!withTime) return []\n\n const items: number[] = []\n const maxHour = timeFormat === '12h' ? 12 : 23\n const startHour = timeFormat === '12h' ? 1 : 0\n\n for (let index = startHour; index <= maxHour; index += 1) {\n items.push(index)\n }\n\n return items\n }, [timeFormat, withTime])\n\n const minutes = useMemo(() => {\n if (!withTime) return []\n\n const items: number[] = []\n\n for (let index = 0; index < 60; index += minuteStep) {\n items.push(index)\n }\n\n return items\n }, [minuteStep, withTime])\n\n const seconds = useMemo(() => {\n if (!withTime || !showSeconds) return []\n\n const items: number[] = []\n\n for (let index = 0; index < 60; index += 1) {\n items.push(index)\n }\n\n return items\n }, [showSeconds, withTime])\n\n const handleTimeSelection = useCallback(\n (hoursValue: number, minutesValue: number, secondsValue: number = 0) => {\n const formattedTime = formatTimeWithFormat(hoursValue, minutesValue, secondsValue, showSeconds, timeFormat)\n const nextDate = currentDateForPanel\n\n setTouched(true)\n setDraftTimeValue(formattedTime)\n\n if (!nextDate) {\n setInputValue(formattedTime)\n return\n }\n\n const nextValue = combineDateAndTime(nextDate, formattedTime, {format: timeFormat, showSeconds})\n\n emitValidation({valid: true})\n setInputValue(formatDisplayValue(nextValue, {format, withTime, timeFormat, showSeconds}))\n commitValue(nextValue)\n },\n [commitValue, currentDateForPanel, emitValidation, format, showSeconds, timeFormat, withTime]\n )\n\n const handleMeridiemChange = useCallback(\n (meridiem: Meridiem) => {\n const currentHours = currentTimeForPanel ? to12HourParts(currentTimeForPanel).hours : 12\n const nextHours = to24HourValue(currentHours, meridiem)\n\n handleTimeSelection(nextHours, currentTimeForPanel?.minutes ?? 0, currentTimeForPanel?.seconds ?? 0)\n },\n [currentTimeForPanel, handleTimeSelection]\n )\n\n const calendarDays = useMemo(() => {\n const year = viewDate.getFullYear()\n const month = viewDate.getMonth()\n const totalDays = daysInMonth(year, month)\n let startDay = firstDayOfMonth(year, month)\n\n if (firstDayOfWeek === 1) {\n startDay = startDay === 0 ? 6 : startDay - 1\n }\n\n const days: Array<{date: Date; currentMonth: boolean}> = []\n const prevMonth = month === 0 ? 11 : month - 1\n const prevYear = month === 0 ? year - 1 : year\n const prevDays = daysInMonth(prevYear, prevMonth)\n\n for (let index = startDay - 1; index >= 0; index -= 1) {\n days.push({date: new Date(prevYear, prevMonth, prevDays - index), currentMonth: false})\n }\n\n for (let day = 1; day <= totalDays; day += 1) {\n days.push({date: new Date(year, month, day), currentMonth: true})\n }\n\n const remaining = 42 - days.length\n const nextMonth = month === 11 ? 0 : month + 1\n const nextYear = month === 11 ? year + 1 : year\n\n for (let day = 1; day <= remaining; day += 1) {\n days.push({date: new Date(nextYear, nextMonth, day), currentMonth: false})\n }\n\n return days\n }, [firstDayOfWeek, viewDate])\n\n const today = stripTime(new Date())\n const selectedDate = selectedValue ? stripTime(selectedValue) : currentDateForPanel\n\n const renderCalendar = () => (\n <div className=\"calendar\">\n <div className=\"calendar-header\">\n <button\n type=\"button\"\n className=\"nav-btn\"\n onClick={() => setViewDate(addMonths(viewDate, -1))}\n aria-label={texts.previousMonth}\n >\n <ChevronLeftGlyphIcon />\n </button>\n <button\n type=\"button\"\n className=\"header-title\"\n onClick={() => setViewMode((current) => (current === 'days' ? 'months' : 'days'))}\n >\n {monthNames[viewDate.getMonth()]} {viewDate.getFullYear()}\n </button>\n <button\n type=\"button\"\n className=\"nav-btn\"\n onClick={() => setViewDate(addMonths(viewDate, 1))}\n aria-label={texts.nextMonth}\n >\n <ChevronRightGlyphIcon />\n </button>\n </div>\n\n {viewMode === 'days' ? (\n <>\n <div className=\"day-names\">\n {dayNames.map((dayName) => (\n <span key={dayName} className=\"day-name\">\n {dayName}\n </span>\n ))}\n </div>\n\n <div className=\"day-grid\">\n {calendarDays.map(({date, currentMonth}, index) => {\n const isSelected = selectedDate ? isSameDay(date, selectedDate) : false\n const isToday = isSameDay(date, today)\n const disabledDay = isDisabled(date)\n\n return (\n <button\n key={`${date.toISOString()}-${index}`}\n type=\"button\"\n className={cn(\n 'day',\n !currentMonth && 'other-month',\n isToday && 'today',\n isSelected && 'selected',\n disabledDay && 'disabled'\n )}\n onClick={() => handleSelectDate(date)}\n disabled={disabledDay}\n tabIndex={-1}\n >\n {date.getDate()}\n </button>\n )\n })}\n </div>\n </>\n ) : (\n <div className=\"month-grid\">\n {monthNames.map((monthName, index) => (\n <button\n key={monthName}\n type=\"button\"\n className={cn('month-cell', viewDate.getMonth() === index && 'selected')}\n onClick={() => {\n setViewDate(new Date(viewDate.getFullYear(), index, 1))\n setViewMode('days')\n }}\n >\n {monthName.slice(0, 3)}\n </button>\n ))}\n </div>\n )}\n\n {showTodayButton && (\n <div className=\"footer\">\n <button type=\"button\" className=\"today-btn\" onClick={handleToday}>\n {texts.today}\n </button>\n </div>\n )}\n </div>\n )\n\n const renderTimePanel = () => {\n if (!withTime) return null\n\n const displayTime = currentTimeForPanel ? to12HourParts(currentTimeForPanel) : null\n\n return (\n <div className=\"date-picker-time-panel\">\n <div className=\"date-picker-time-header\">Time</div>\n <div className=\"date-picker-time-columns\">\n <TimeColumn\n items={hours}\n selected={timeFormat === '12h' ? displayTime?.hours : currentTimeForPanel?.hours}\n onSelect={(hoursValue) =>\n handleTimeSelection(\n timeFormat === '12h'\n ? to24HourValue(hoursValue, displayTime?.meridiem ?? 'AM')\n : hoursValue,\n currentTimeForPanel?.minutes ?? 0,\n currentTimeForPanel?.seconds ?? 0\n )\n }\n label=\"Hr\"\n />\n <TimeColumn\n items={minutes}\n selected={currentTimeForPanel?.minutes}\n onSelect={(minutesValue) =>\n handleTimeSelection(\n currentTimeForPanel?.hours ?? 0,\n minutesValue,\n currentTimeForPanel?.seconds ?? 0\n )\n }\n label=\"Min\"\n />\n {showSeconds && (\n <TimeColumn\n items={seconds}\n selected={currentTimeForPanel?.seconds}\n onSelect={(secondsValue) =>\n handleTimeSelection(\n currentTimeForPanel?.hours ?? 0,\n currentTimeForPanel?.minutes ?? 0,\n secondsValue\n )\n }\n label=\"Sec\"\n />\n )}\n {timeFormat === '12h' && (\n <TimeColumn\n items={['AM', 'PM']}\n selected={displayTime?.meridiem}\n onSelect={handleMeridiemChange}\n label=\"AM/PM\"\n />\n )}\n </div>\n </div>\n )\n }\n\n const renderPopoverContent = () => (\n <div className={cn('date-picker-popover-content', withTime && 'with-time')}>\n {renderCalendar()}\n {renderTimePanel()}\n </div>\n )\n\n const maxLength = withTime ? (timeFormat === '12h' ? (showSeconds ? 22 : 19) : showSeconds ? 19 : 16) : 10\n const inputPlaceholder = getInputPlaceholder(\n placeholder,\n format,\n withTime,\n timeFormat,\n showSeconds,\n timePlaceholder\n )\n\n if (inline) {\n return (\n <div\n className={cn('date-picker', color && `color-${color}`, fullWidth && 'full-width', className)}\n style={style}\n >\n <MInput\n value={inputValue}\n onChange={handleInputChange}\n onBlur={handleInputBlur}\n onKeyDown={handleInputKeyDown}\n onClear={handleClear}\n type=\"text\"\n inputMode={withTime ? 'text' : 'numeric'}\n autoComplete=\"off\"\n maxLength={maxLength}\n placeholder={inputPlaceholder}\n disabled={disabled}\n readOnly={readOnly}\n id={id}\n variant={variant}\n size={size}\n color={color}\n label={label}\n helperText={helperText}\n error={hasError}\n errorText={resolvedErrorText}\n required={required}\n clearable={clearable}\n fullWidth={fullWidth}\n />\n {renderPopoverContent()}\n {name && selectedValue && (\n <input\n type=\"hidden\"\n name={name}\n value={formatHiddenDateValue(selectedValue, withTime, showSeconds)}\n />\n )}\n </div>\n )\n }\n\n return (\n <div\n className={cn('date-picker', color && `color-${color}`, fullWidth && 'full-width', className)}\n style={style}\n >\n <div ref={anchorRef} className=\"date-picker-input-anchor\">\n <MInput\n value={inputValue}\n onChange={handleInputChange}\n onBlur={handleInputBlur}\n onKeyDown={handleInputKeyDown}\n onClear={handleClear}\n type=\"text\"\n inputMode={withTime ? 'text' : 'numeric'}\n autoComplete=\"off\"\n maxLength={maxLength}\n placeholder={inputPlaceholder}\n disabled={disabled}\n readOnly={readOnly}\n id={id}\n variant={variant}\n size={size}\n color={color}\n label={label}\n helperText={helperText}\n error={hasError}\n errorText={resolvedErrorText}\n required={required}\n clearable={clearable}\n fullWidth={fullWidth}\n endIcon={\n <button\n type=\"button\"\n className=\"date-picker-toggle\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={handleTogglePopover}\n aria-label=\"Open calendar\"\n disabled={disabled || readOnly}\n >\n <MCalendarIcon />\n </button>\n }\n />\n </div>\n\n {name && selectedValue && (\n <input type=\"hidden\" name={name} value={formatHiddenDateValue(selectedValue, withTime, showSeconds)} />\n )}\n\n <MPopover\n className=\"date-picker-popover\"\n style={{'--color-rgb': colorRgbVar(color)} as React.CSSProperties}\n open={open}\n anchorRef={anchorRef}\n onClose={() => setOpen(false)}\n placement=\"bottom-start\"\n >\n {renderPopoverContent()}\n </MPopover>\n </div>\n )\n}\n\nfunction TimeColumn<T extends number | Meridiem>({\n items,\n selected,\n onSelect,\n label,\n}: {\n items: T[]\n selected?: T\n onSelect: (value: T) => void\n label: string\n}) {\n const listRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (selected === undefined || !listRef.current) return\n\n const element = listRef.current.querySelector(`[data-value=\"${selected}\"]`) as HTMLElement | null\n\n if (element) {\n const list = listRef.current\n list.scrollTop = element.offsetTop - list.clientHeight / 2 + element.offsetHeight / 2\n }\n }, [selected])\n\n const renderValue = (value: T) => (typeof value === 'number' ? value.toString().padStart(2, '0') : value)\n\n return (\n <div className=\"date-picker-time-column\">\n <div className=\"date-picker-time-column-label\">{label}</div>\n <div ref={listRef} className=\"date-picker-time-column-list\">\n {items.map((item) => (\n <button\n key={item}\n type=\"button\"\n data-value={item}\n className={cn('date-picker-time-column-item', item === selected && 'selected')}\n onClick={() => onSelect(item)}\n >\n {renderValue(item)}\n </button>\n ))}\n </div>\n </div>\n )\n}\n","import {useState, useRef, useCallback, useMemo, useEffect} from 'react'\nimport type * as React from 'react'\nimport type {MTimePickerProps} from './MTimePicker.types'\nimport {MPopover} from '../../primitives'\nimport {cn} from '../../../utils/cn'\nimport {MClockIcon, MCloseIcon} from '../../../icons'\nimport {formatTime, parseTime} from '../../../utils/dateUtils'\nimport './MTimePicker.css'\n\ntype ParsedTimeValue = {hours: number; minutes: number; seconds: number}\ntype Meridiem = 'AM' | 'PM'\n\nfunction to12HourParts(value: ParsedTimeValue) {\n const meridiem: Meridiem = value.hours >= 12 ? 'PM' : 'AM'\n const hours = value.hours % 12 || 12\n return {hours, minutes: value.minutes, seconds: value.seconds, meridiem}\n}\n\nfunction to24HourValue(hours: number, meridiem: Meridiem): number {\n if (meridiem === 'AM') {\n return hours === 12 ? 0 : hours\n }\n return hours === 12 ? 12 : hours + 12\n}\n\nfunction formatTimeValue(\n hours: number,\n minutes: number,\n seconds: number,\n showSeconds: boolean,\n format: '24h' | '12h'\n): string {\n if (format === '24h') {\n return formatTime(hours, minutes, seconds, showSeconds)\n }\n\n const parts = to12HourParts({hours, minutes, seconds})\n const base = `${parts.hours.toString().padStart(2, '0')}:${parts.minutes.toString().padStart(2, '0')}`\n const withSeconds = showSeconds ? `${base}:${parts.seconds.toString().padStart(2, '0')}` : base\n return `${withSeconds} ${parts.meridiem}`\n}\n\nfunction parseTimeValue(value: string, format: '24h' | '12h'): ParsedTimeValue | null {\n if (format === '24h') {\n return parseTime(value)\n }\n\n const normalized = value.trim().toUpperCase()\n const match = normalized.match(/^(\\d{1,2}):(\\d{2})(?::(\\d{2}))?\\s*(AM|PM)$/)\n if (match) {\n const hours = parseInt(match[1], 10)\n const minutes = parseInt(match[2], 10)\n const seconds = match[3] ? parseInt(match[3], 10) : 0\n const meridiem = match[4] as Meridiem\n\n if (hours < 1 || hours > 12 || minutes > 59 || seconds > 59) {\n return null\n }\n\n return {hours: to24HourValue(hours, meridiem), minutes, seconds}\n }\n\n return parseTime(value)\n}\n\n// Compare time tuples so min/max checks can stay string-format agnostic.\nfunction compareTimeParts(\n left: {hours: number; minutes: number; seconds: number},\n right: {hours: number; minutes: number; seconds: number}\n): number {\n if (left.hours !== right.hours) return left.hours - right.hours\n if (left.minutes !== right.minutes) return left.minutes - right.minutes\n return left.seconds - right.seconds\n}\n\n// Check whether a time falls within optional min and max boundaries.\nfunction isTimeInRange(\n value: {hours: number; minutes: number; seconds: number},\n min?: {hours: number; minutes: number; seconds: number} | null,\n max?: {hours: number; minutes: number; seconds: number} | null\n): boolean {\n return (!min || compareTimeParts(value, min) >= 0) && (!max || compareTimeParts(value, max) <= 0)\n}\n\n// Render a time input backed by scrollable hour, minute and second columns.\nexport function MTimePicker({\n value,\n defaultValue,\n onChange,\n format = '24h',\n showSeconds = false,\n minuteStep = 1,\n min,\n max,\n placeholder,\n disabled = false,\n readOnly = false,\n name,\n id,\n variant = 'outlined',\n size = 'md',\n color,\n label,\n helperText,\n errorText,\n error = false,\n required = false,\n clearable = false,\n fullWidth = false,\n className,\n style,\n}: MTimePickerProps) {\n const [open, setOpen] = useState(false)\n const [internalValue, setInternalValue] = useState(defaultValue ?? '')\n const triggerRef = useRef<HTMLDivElement>(null)\n\n const currentValue = value !== undefined ? value : internalValue\n const hasError = error || !!errorText\n const parsed = parseTimeValue(currentValue, format)\n const minTime = parseTimeValue(min ?? '', format)\n const maxTime = parseTimeValue(max ?? '', format)\n const displayTime = parsed ? to12HourParts(parsed) : null\n const displayValue = parsed\n ? formatTimeValue(parsed.hours, parsed.minutes, parsed.seconds, showSeconds, format)\n : currentValue\n\n // Build the visible hour list based on the selected time format.\n const hours = useMemo(() => {\n const items: number[] = []\n const maxHour = format === '12h' ? 12 : 23\n const startHour = format === '12h' ? 1 : 0\n for (let index = startHour; index <= maxHour; index++) {\n items.push(index)\n }\n return items\n }, [format])\n\n // Build the minute list using the configured step size.\n const minutes = useMemo(() => {\n const items: number[] = []\n for (let index = 0; index < 60; index += minuteStep) {\n items.push(index)\n }\n return items\n }, [minuteStep])\n\n // Build the seconds list only when the picker exposes seconds.\n const seconds = useMemo(() => {\n if (!showSeconds) return []\n const items: number[] = []\n for (let index = 0; index < 60; index++) {\n items.push(index)\n }\n return items\n }, [showSeconds])\n\n // Reuse range validation for list rendering and direct text input.\n const isSelectable = useCallback(\n (hoursValue: number, minutesValue: number, secondsValue: number = 0) => {\n return isTimeInRange({hours: hoursValue, minutes: minutesValue, seconds: secondsValue}, minTime, maxTime)\n },\n [maxTime, minTime]\n )\n\n // Apply the selected time and keep uncontrolled usage in sync.\n const handleSelect = useCallback(\n (hoursValue: number, minutesValue: number, secondsValue: number = 0) => {\n if (!isSelectable(hoursValue, minutesValue, secondsValue)) return\n const time = formatTimeValue(hoursValue, minutesValue, secondsValue, showSeconds, format)\n if (value === undefined) setInternalValue(time)\n onChange?.(time)\n },\n [format, isSelectable, onChange, showSeconds, value]\n )\n\n const handleInputChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const raw = event.target.value\n if (value === undefined) setInternalValue(raw)\n },\n [value]\n )\n\n // Normalize manual input once the user leaves the field.\n const handleInputBlur = useCallback(() => {\n const nextValue = parseTimeValue(currentValue, format)\n if (nextValue && isTimeInRange(nextValue, minTime, maxTime)) {\n const time = formatTimeValue(nextValue.hours, nextValue.minutes, nextValue.seconds, showSeconds, format)\n if (value === undefined) setInternalValue(time)\n onChange?.(time)\n }\n }, [currentValue, format, maxTime, minTime, onChange, showSeconds, value])\n\n const handleMeridiemChange = useCallback(\n (meridiem: Meridiem) => {\n const currentHours = displayTime?.hours ?? 12\n const minutesValue = parsed?.minutes ?? 0\n const secondsValue = parsed?.seconds ?? 0\n const nextHours = to24HourValue(currentHours, meridiem)\n handleSelect(nextHours, minutesValue, secondsValue)\n },\n [displayTime?.hours, handleSelect, parsed?.minutes, parsed?.seconds]\n )\n\n // Clear the current time without closing the trigger first.\n const handleClear = useCallback(\n (event: React.MouseEvent) => {\n event.stopPropagation()\n if (value === undefined) setInternalValue('')\n onChange?.('')\n },\n [onChange, value]\n )\n\n return (\n <div\n className={cn('time picker', color && `color-${color}`, fullWidth && 'full-width', className)}\n style={style}\n >\n {label && (\n <label\n htmlFor={id}\n className={cn('field-label', open && 'focused', hasError && 'error', required && 'required')}\n >\n {label}\n </label>\n )}\n\n <div\n ref={triggerRef}\n className={cn(\n 'time trigger',\n `field-${variant}`,\n `field-${size}`,\n open && 'focused',\n hasError && 'error',\n disabled && 'disabled'\n )}\n onClick={() => !disabled && !readOnly && setOpen(true)}\n >\n <span className=\"time icon\">\n <MClockIcon />\n </span>\n <input\n type=\"text\"\n className=\"time input\"\n value={displayValue}\n onChange={handleInputChange}\n onBlur={handleInputBlur}\n placeholder={\n placeholder ??\n (format === '12h'\n ? showSeconds\n ? 'hh:mm:ss AM'\n : 'hh:mm AM'\n : showSeconds\n ? 'HH:MM:SS'\n : 'HH:MM')\n }\n disabled={disabled}\n readOnly={readOnly}\n id={id}\n aria-invalid={hasError || undefined}\n />\n {clearable && currentValue && !disabled && (\n <button\n type=\"button\"\n className=\"time clear clear-btn-base\"\n onClick={handleClear}\n tabIndex={-1}\n aria-label=\"Clear time\"\n >\n <MCloseIcon />\n </button>\n )}\n </div>\n\n {name && <input type=\"hidden\" name={name} value={displayValue} />}\n\n <MPopover\n className=\"time picker popover\"\n open={open}\n anchorRef={triggerRef}\n onClose={() => setOpen(false)}\n placement=\"bottom-start\"\n >\n <div className=\"time columns\">\n <TimeColumn\n items={hours}\n selected={format === '12h' ? displayTime?.hours : parsed?.hours}\n onSelect={(hoursValue) =>\n handleSelect(\n format === '12h'\n ? to24HourValue(hoursValue, displayTime?.meridiem ?? 'AM')\n : hoursValue,\n parsed?.minutes ?? 0,\n parsed?.seconds ?? 0\n )\n }\n isDisabled={(hoursValue) =>\n !isSelectable(\n format === '12h'\n ? to24HourValue(hoursValue, displayTime?.meridiem ?? 'AM')\n : hoursValue,\n parsed?.minutes ?? 0,\n parsed?.seconds ?? 0\n )\n }\n label=\"Hr\"\n />\n <TimeColumn\n items={minutes}\n selected={parsed?.minutes}\n onSelect={(minutesValue) =>\n handleSelect(parsed?.hours ?? 0, minutesValue, parsed?.seconds ?? 0)\n }\n isDisabled={(minutesValue) =>\n !isSelectable(parsed?.hours ?? 0, minutesValue, parsed?.seconds ?? 0)\n }\n label=\"Min\"\n />\n {showSeconds && (\n <TimeColumn\n items={seconds}\n selected={parsed?.seconds}\n onSelect={(secondsValue) =>\n handleSelect(parsed?.hours ?? 0, parsed?.minutes ?? 0, secondsValue)\n }\n isDisabled={(secondsValue) =>\n !isSelectable(parsed?.hours ?? 0, parsed?.minutes ?? 0, secondsValue)\n }\n label=\"Sec\"\n />\n )}\n {format === '12h' && (\n <TimeColumn\n items={['AM', 'PM']}\n selected={displayTime?.meridiem}\n onSelect={handleMeridiemChange}\n label=\"AM/PM\"\n />\n )}\n </div>\n </MPopover>\n\n {(errorText || helperText) && (\n <div className=\"time bottom\">\n {errorText ? (\n <span className=\"field-error\" role=\"alert\">\n {errorText}\n </span>\n ) : (\n <span className=\"time helper\">{helperText}</span>\n )}\n </div>\n )}\n </div>\n )\n}\n\n// Render one scrollable time column and keep the selected value centered.\nfunction TimeColumn<T extends number | Meridiem>({\n items,\n selected,\n onSelect,\n isDisabled,\n label,\n}: {\n items: T[]\n selected?: T\n onSelect: (value: T) => void\n isDisabled?: (value: T) => boolean\n label: string\n}) {\n const listRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (selected === undefined || !listRef.current) return\n const element = listRef.current.querySelector(`[data-value=\"${selected}\"]`) as HTMLElement | null\n if (element) {\n const list = listRef.current\n list.scrollTop = element.offsetTop - list.clientHeight / 2 + element.offsetHeight / 2\n }\n }, [selected])\n\n const renderValue = (value: T) => (typeof value === 'number' ? value.toString().padStart(2, '0') : value)\n\n return (\n <div className=\"time column\">\n <div className=\"time column label\">{label}</div>\n <div ref={listRef} className=\"time column list\">\n {items.map((item) => {\n const disabled = isDisabled?.(item) ?? false\n return (\n <button\n key={item}\n type=\"button\"\n data-value={item}\n className={cn('time column item', item === selected && 'selected', disabled && 'disabled')}\n onClick={() => onSelect(item)}\n disabled={disabled}\n >\n {renderValue(item)}\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n","import {useCallback, useEffect, useMemo, useRef, useState} from 'react'\nimport type * as React from 'react'\nimport {MPopover} from '../../primitives'\nimport {cn} from '../../../utils/cn'\nimport {useMDateRangePickerTexts} from '../../../i18n/frameworkTexts'\nimport {useDocumentLocale} from '../../../utils/locale'\nimport {MCalendarIcon, MChevronLeftIcon, MChevronRightIcon, MCloseIcon} from '../../../icons'\nimport {\n addMonths,\n daysInMonth,\n firstDayOfMonth,\n formatDate,\n getDayNames,\n getMonthNames,\n isDateInRange,\n isSameDay,\n stripTime,\n} from '../../../utils/dateUtils'\nimport type {MDateRangePickerProps, MDateRangePreset} from './MDateRangePicker.types'\nimport {colorRgbVar} from '../../../utils/colorRgbVar'\nimport './MDateRangePicker.css'\n\nfunction toDate(value: Date | string | null | undefined): Date | null {\n if (!value) return null\n if (value instanceof Date) return stripTime(value)\n const date = new Date(value)\n return isNaN(date.getTime()) ? null : stripTime(date)\n}\n\nfunction sortRange(start: Date, end: Date) {\n return start.getTime() <= end.getTime() ? {start, end} : {start: end, end: start}\n}\n\nfunction isBetween(date: Date, start: Date | null, end: Date | null) {\n if (!start || !end) return false\n const time = date.getTime()\n return time > start.getTime() && time < end.getTime()\n}\n\nfunction formatRangeLabel(start: Date | null, end: Date | null, format: string) {\n if (start && end) {\n return `${formatDate(start, format)} - ${formatDate(end, format)}`\n }\n\n if (start) {\n return `${formatDate(start, format)} - ...`\n }\n\n return ''\n}\n\nfunction startOfMonth(date: Date) {\n return new Date(date.getFullYear(), date.getMonth(), 1)\n}\n\nfunction endOfMonth(date: Date) {\n return new Date(date.getFullYear(), date.getMonth() + 1, 0)\n}\n\nfunction daysAgo(days: number): Date {\n const date = stripTime(new Date())\n date.setDate(date.getDate() - (days - 1))\n return date\n}\n\nfunction monthsAgo(months: number): Date {\n const today = stripTime(new Date())\n return new Date(today.getFullYear(), today.getMonth() - months, today.getDate())\n}\n\nfunction getDefaultPresets(texts: ReturnType<typeof useMDateRangePickerTexts>): MDateRangePreset[] {\n const today = stripTime(new Date())\n const previousMonthDate = new Date(today.getFullYear(), today.getMonth() - 1, 1)\n\n return [\n {label: texts.presets.today, value: {start: today, end: today}},\n {label: texts.presets.days2, value: {start: daysAgo(2), end: today}},\n {label: texts.presets.days3, value: {start: daysAgo(3), end: today}},\n {label: texts.presets.days7, value: {start: daysAgo(7), end: today}},\n {label: texts.presets.days14, value: {start: daysAgo(14), end: today}},\n {label: texts.presets.days31, value: {start: daysAgo(31), end: today}},\n {label: texts.presets.thisMonth, value: {start: startOfMonth(today), end: endOfMonth(today)}},\n {\n label: texts.presets.previousMonth,\n value: {start: startOfMonth(previousMonthDate), end: endOfMonth(previousMonthDate)},\n },\n {label: texts.presets.months2, value: {start: monthsAgo(2), end: today}},\n {label: texts.presets.months3, value: {start: monthsAgo(3), end: today}},\n {label: texts.presets.months6, value: {start: monthsAgo(6), end: today}},\n {label: texts.presets.year1, value: {start: monthsAgo(12), end: today}},\n ]\n}\n\nfunction buildCalendarDays(viewDate: Date, firstDayOfWeek: 0 | 1) {\n const year = viewDate.getFullYear()\n const month = viewDate.getMonth()\n const totalDays = daysInMonth(year, month)\n let startDay = firstDayOfMonth(year, month)\n\n if (firstDayOfWeek === 1) {\n startDay = startDay === 0 ? 6 : startDay - 1\n }\n\n const days = [] as Array<{date: Date; currentMonth: boolean}>\n\n const previousMonth = month === 0 ? 11 : month - 1\n const previousYear = month === 0 ? year - 1 : year\n const previousMonthDays = daysInMonth(previousYear, previousMonth)\n\n for (let index = startDay - 1; index >= 0; index -= 1) {\n days.push({date: new Date(previousYear, previousMonth, previousMonthDays - index), currentMonth: false})\n }\n\n for (let day = 1; day <= totalDays; day += 1) {\n days.push({date: new Date(year, month, day), currentMonth: true})\n }\n\n const remaining = 42 - days.length\n const nextMonth = month === 11 ? 0 : month + 1\n const nextYear = month === 11 ? year + 1 : year\n\n for (let day = 1; day <= remaining; day += 1) {\n days.push({date: new Date(nextYear, nextMonth, day), currentMonth: false})\n }\n\n return days\n}\n\n// Render a single control for start and end date selection inside one calendar popover.\nexport function MDateRangePicker({\n value,\n defaultValue,\n onChange,\n format = 'dd.MM.yyyy',\n locale: localeOverride,\n min,\n max,\n disabledDates,\n placeholder,\n disabled = false,\n readOnly = false,\n name,\n id,\n variant = 'outlined',\n size = 'md',\n color,\n label,\n helperText,\n errorText,\n error = false,\n required = false,\n clearable = false,\n inline = false,\n showTodayButton = true,\n presets = false,\n presetsSidebar = false,\n firstDayOfWeek = 1,\n fullWidth = false,\n allowSameDay = true,\n className,\n style,\n}: MDateRangePickerProps) {\n const locale = useDocumentLocale(localeOverride)\n const controlledRange = value\n ? {\n start: toDate(value.start),\n end: toDate(value.end),\n }\n : null\n const [internalRange, setInternalRange] = useState(() => ({\n start: toDate(defaultValue?.start),\n end: toDate(defaultValue?.end),\n }))\n const [hoveredDate, setHoveredDate] = useState<Date | null>(null)\n const [open, setOpen] = useState(false)\n const triggerRef = useRef<HTMLDivElement>(null)\n\n const selectedRange = controlledRange ?? internalRange\n const startDate = selectedRange.start\n const endDate = selectedRange.end\n const minDate = toDate(min)\n const maxDate = toDate(max)\n const hasError = error || !!errorText\n const texts = useMDateRangePickerTexts()\n const dayNames = getDayNames(locale, firstDayOfWeek)\n const monthNames = getMonthNames(locale)\n const availablePresets = useMemo(() => {\n if (presets === true || (presetsSidebar && !presets)) {\n return getDefaultPresets(texts)\n }\n\n if (Array.isArray(presets)) {\n return presets\n }\n\n return []\n }, [presets, presetsSidebar, texts])\n\n const [viewDate, setViewDate] = useState(() => {\n const baseDate = startDate ?? new Date()\n return new Date(baseDate.getFullYear(), baseDate.getMonth(), 1)\n })\n\n const startTime = startDate?.getTime() ?? null\n useEffect(() => {\n if (!startTime) return\n const d = new Date(startTime)\n setViewDate(new Date(d.getFullYear(), d.getMonth(), 1))\n }, [startTime])\n\n const isDisabled = useCallback(\n (date: Date): boolean => {\n if (!isDateInRange(date, minDate, maxDate)) return true\n if (Array.isArray(disabledDates)) {\n return disabledDates.some((disabledDate) => isSameDay(disabledDate, date))\n }\n if (typeof disabledDates === 'function') {\n return disabledDates(date)\n }\n return false\n },\n [disabledDates, maxDate, minDate]\n )\n\n const commitRange = useCallback(\n (nextRange: {start: Date | null; end: Date | null}) => {\n if (value === undefined) {\n setInternalRange(nextRange)\n }\n onChange?.(nextRange)\n },\n [onChange, value]\n )\n\n const handleDayClick = useCallback(\n (date: Date) => {\n if (isDisabled(date)) return\n\n if (!startDate || (startDate && endDate)) {\n commitRange({start: date, end: null})\n setHoveredDate(null)\n return\n }\n\n if (!allowSameDay && isSameDay(date, startDate)) {\n return\n }\n\n const orderedRange = sortRange(startDate, date)\n commitRange(orderedRange)\n setHoveredDate(null)\n\n if (!inline) {\n setOpen(false)\n }\n },\n [allowSameDay, commitRange, endDate, inline, isDisabled, startDate]\n )\n\n const handleClear = useCallback(\n (event: React.MouseEvent) => {\n event.stopPropagation()\n commitRange({start: null, end: null})\n setHoveredDate(null)\n },\n [commitRange]\n )\n\n const handleToday = useCallback(() => {\n const today = stripTime(new Date())\n if (isDisabled(today)) return\n commitRange({start: today, end: today})\n setViewDate(new Date(today.getFullYear(), today.getMonth(), 1))\n setHoveredDate(null)\n if (!inline) {\n setOpen(false)\n }\n }, [commitRange, inline, isDisabled])\n\n const handlePresetClick = useCallback(\n (preset: MDateRangePreset) => {\n const start = toDate(preset.value.start)\n const end = toDate(preset.value.end)\n\n if (!start || !end) {\n return\n }\n\n const orderedRange = sortRange(start, end)\n\n if (isDisabled(orderedRange.start) || isDisabled(orderedRange.end)) {\n return\n }\n\n commitRange(orderedRange)\n setViewDate(new Date(orderedRange.start.getFullYear(), orderedRange.start.getMonth(), 1))\n setHoveredDate(null)\n\n if (!inline) {\n setOpen(false)\n }\n },\n [commitRange, inline, isDisabled]\n )\n\n const previewEnd = startDate && !endDate ? hoveredDate : null\n const firstMonth = viewDate\n const secondMonth = addMonths(viewDate, 1)\n const today = stripTime(new Date())\n\n const displayValue = useMemo(() => formatRangeLabel(startDate, endDate, format), [endDate, format, startDate])\n\n const calendarMonths = useMemo(\n () =>\n [firstMonth, secondMonth].map((monthDate) => ({\n monthDate,\n days: buildCalendarDays(monthDate, firstDayOfWeek),\n })),\n [firstDayOfWeek, firstMonth, secondMonth]\n )\n\n const summaryText =\n startDate && endDate\n ? `${formatDate(startDate, format)} - ${formatDate(endDate, format)}`\n : startDate\n ? `${formatDate(startDate, format)} - ...`\n : (placeholder ?? texts.defaultRangePlaceholder)\n\n const showSidebar = presetsSidebar && availablePresets.length > 0\n const showInlinePresets = !presetsSidebar && availablePresets.length > 0\n\n const renderPresetsSidebar = () => (\n <div className=\"presets-sidebar\">\n {availablePresets.map((preset) => (\n <button\n key={preset.label}\n type=\"button\"\n className=\"preset-sidebar-btn\"\n onClick={() => handlePresetClick(preset)}\n >\n {preset.label}\n </button>\n ))}\n </div>\n )\n\n const renderCalendarContent = () => (\n <div className=\"calendar-body\">\n <div className=\"calendar-top\">\n <div className=\"calendar-caption\">\n <span className=\"caption-title\">\n {monthNames[firstMonth.getMonth()]} {firstMonth.getFullYear()}\n </span>\n <span className=\"caption-subtitle\">{texts.rangeSubtitle}</span>\n </div>\n <div className=\"nav-actions\">\n <button\n type=\"button\"\n className=\"nav-btn\"\n onClick={() => setViewDate(addMonths(viewDate, -1))}\n aria-label={texts.previousMonth}\n >\n <MChevronLeftIcon />\n </button>\n <button\n type=\"button\"\n className=\"nav-btn\"\n onClick={() => setViewDate(addMonths(viewDate, 1))}\n aria-label={texts.nextMonth}\n >\n <MChevronRightIcon />\n </button>\n </div>\n </div>\n\n {showInlinePresets && (\n <div className=\"presets\">\n {availablePresets.map((preset) => (\n <button\n key={preset.label}\n type=\"button\"\n className=\"preset-btn\"\n onClick={() => handlePresetClick(preset)}\n >\n {preset.label}\n </button>\n ))}\n </div>\n )}\n\n <div className=\"months\">\n {calendarMonths.map(({monthDate, days}) => (\n <div key={monthDate.toISOString()} className=\"month-panel\">\n <div className=\"month-title\">\n {monthNames[monthDate.getMonth()]} {monthDate.getFullYear()}\n </div>\n <div className=\"day-names\">\n {dayNames.map((dayName) => (\n <span key={`${monthDate.toISOString()}-${dayName}`} className=\"day-name\">\n {dayName}\n </span>\n ))}\n </div>\n <div className=\"day-grid\">\n {days.map(({date, currentMonth}, index) => {\n const disabledDay = isDisabled(date)\n const selectedStart = startDate ? isSameDay(date, startDate) : false\n const selectedEnd = endDate ? isSameDay(date, endDate) : false\n const inRange = isBetween(date, startDate, endDate)\n const previewRangeData =\n !endDate && startDate && previewEnd ? sortRange(startDate, previewEnd) : null\n const previewRange = previewRangeData\n ? isBetween(date, previewRangeData.start, previewRangeData.end)\n : false\n const previewEdge = previewRangeData\n ? isSameDay(date, previewRangeData.start) || isSameDay(date, previewRangeData.end)\n : false\n\n return (\n <button\n key={`${monthDate.toISOString()}-${index}`}\n type=\"button\"\n className={cn(\n 'day',\n !currentMonth && 'other-month',\n isSameDay(date, today) && 'today',\n selectedStart && 'range-start selected',\n selectedEnd && 'range-end selected',\n inRange && 'in-range',\n previewRange && !previewEdge && 'preview-range',\n disabledDay && 'disabled'\n )}\n onClick={() => handleDayClick(date)}\n onMouseEnter={() => startDate && !endDate && setHoveredDate(date)}\n onFocus={() => startDate && !endDate && setHoveredDate(date)}\n disabled={disabledDay}\n tabIndex={-1}\n >\n {date.getDate()}\n </button>\n )\n })}\n </div>\n </div>\n ))}\n </div>\n\n <div className=\"footer\">\n <span className=\"summary\">{summaryText}</span>\n <div className=\"footer-actions\">\n {clearable && (startDate || endDate) && (\n <button\n type=\"button\"\n className=\"footer-btn\"\n onClick={(event) => {\n event.preventDefault()\n commitRange({start: null, end: null})\n setHoveredDate(null)\n }}\n >\n {texts.clear}\n </button>\n )}\n {showTodayButton && (\n <button type=\"button\" className=\"footer-btn\" onClick={handleToday}>\n {texts.today}\n </button>\n )}\n </div>\n </div>\n </div>\n )\n\n const renderCalendar = () => (\n <div className={cn('date-range-calendar', showSidebar && 'with-sidebar')}>\n {showSidebar && renderPresetsSidebar()}\n {renderCalendarContent()}\n </div>\n )\n\n if (inline) {\n return (\n <div\n className={cn('date-range-picker', color && `color-${color}`, fullWidth && 'full-width', className)}\n style={style}\n >\n {label && (\n <label className={cn('field-label', hasError && 'error', required && 'required')}>{label}</label>\n )}\n {renderCalendar()}\n </div>\n )\n }\n\n return (\n <div\n className={cn('date-range-picker', color && `color-${color}`, fullWidth && 'full-width', className)}\n style={style}\n >\n {label && (\n <label\n htmlFor={id}\n className={cn('field-label', open && 'focused', hasError && 'error', required && 'required')}\n >\n {label}\n </label>\n )}\n\n <div\n ref={triggerRef}\n className={cn(\n 'trigger',\n `field-${variant}`,\n `field-${size}`,\n open && 'focused',\n hasError && 'error',\n disabled && 'disabled'\n )}\n onClick={() => !disabled && !readOnly && setOpen(true)}\n >\n <span className=\"icon\">\n <MCalendarIcon />\n </span>\n <input\n type=\"text\"\n className=\"input\"\n value={displayValue}\n placeholder={placeholder ?? texts.defaultRangePlaceholder}\n disabled={disabled}\n readOnly\n id={id}\n aria-invalid={hasError || undefined}\n />\n {clearable && (startDate || endDate) && !disabled && (\n <button\n type=\"button\"\n className=\"clear-btn clear-btn-base\"\n onClick={handleClear}\n tabIndex={-1}\n aria-label={texts.clear}\n >\n <MCloseIcon />\n </button>\n )}\n </div>\n\n {name && startDate && endDate && (\n <input\n type=\"hidden\"\n name={name}\n value={`${startDate.toISOString().split('T')[0]}:${endDate.toISOString().split('T')[0]}`}\n />\n )}\n\n <MPopover\n className={'date-range-picker-popover'}\n style={{'--color-rgb': colorRgbVar(color)} as React.CSSProperties}\n open={open}\n anchorRef={triggerRef}\n onClose={() => {\n setOpen(false)\n setHoveredDate(null)\n }}\n placement=\"bottom-start\"\n >\n {renderCalendar()}\n </MPopover>\n\n {(errorText || helperText) && (\n <div className=\"bottom-row\">\n {errorText ? (\n <span className=\"field-error\" role=\"alert\">\n {errorText}\n </span>\n ) : (\n <span className=\"helper-text\">{helperText}</span>\n )}\n </div>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
|