@banzamel/mineralui 1.6.2 → 1.6.3
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-CnBVN71i.js → MAvatar-BHASnoyu.js} +5 -5
- package/dist/{MAvatar-CnBVN71i.js.map → MAvatar-BHASnoyu.js.map} +1 -1
- package/dist/MAvatar-BVJh6kgW.cjs +2 -0
- package/dist/{MAvatar-DGEQqUss.cjs.map → MAvatar-BVJh6kgW.cjs.map} +1 -1
- package/dist/MBadge-B4x-Lx7e.cjs +2 -0
- package/dist/{MBadge-DcIPfPH1.cjs.map → MBadge-B4x-Lx7e.cjs.map} +1 -1
- package/dist/{MBadge-C_vK2JdM.js → MBadge-_BggwkrM.js} +3 -3
- package/dist/{MBadge-C_vK2JdM.js.map → MBadge-_BggwkrM.js.map} +1 -1
- package/dist/MButton-DrkVdRDy.cjs +2 -0
- package/dist/{MButton-LUNWBBOV.cjs.map → MButton-DrkVdRDy.cjs.map} +1 -1
- package/dist/{MButton-BpSZUhpY.js → MButton-y9qXhhGt.js} +4 -4
- package/dist/{MButton-BpSZUhpY.js.map → MButton-y9qXhhGt.js.map} +1 -1
- package/dist/{MCheckbox-CNz73bQC.js → MCheckbox-B-nT2OBE.js} +3 -3
- package/dist/{MCheckbox-CNz73bQC.js.map → MCheckbox-B-nT2OBE.js.map} +1 -1
- package/dist/MCheckbox-C40ESQRe.cjs +2 -0
- package/dist/{MCheckbox-PzknJeM2.cjs.map → MCheckbox-C40ESQRe.cjs.map} +1 -1
- package/dist/{MCookieBootstrap-DSOT4FQo.cjs → MCookieBootstrap-3-wyz3Dk.cjs} +1 -1
- package/dist/{MCookieBootstrap-DSOT4FQo.cjs.map → MCookieBootstrap-3-wyz3Dk.cjs.map} +1 -1
- package/dist/{MCookieBootstrap-CNYLvKjW.js → MCookieBootstrap-CGvYxIK8.js} +1 -1
- package/dist/{MCookieBootstrap-CNYLvKjW.js.map → MCookieBootstrap-CGvYxIK8.js.map} +1 -1
- package/dist/MDataTable-Bx7W-Ari.cjs +2 -0
- package/dist/{MDataTable-Bq6UoNJX.cjs.map → MDataTable-Bx7W-Ari.cjs.map} +1 -1
- package/dist/{MDataTable-AH5Tnirs.js → MDataTable-ByvNQqNP.js} +6 -6
- package/dist/{MDataTable-AH5Tnirs.js.map → MDataTable-ByvNQqNP.js.map} +1 -1
- package/dist/MDrawer-DFkrFrnD.cjs +2 -0
- package/dist/{MDrawer-DRqMsjMt.cjs.map → MDrawer-DFkrFrnD.cjs.map} +1 -1
- package/dist/{MDrawer-C08QXXC4.js → MDrawer-W2WQs1sM.js} +5 -5
- package/dist/{MDrawer-C08QXXC4.js.map → MDrawer-W2WQs1sM.js.map} +1 -1
- package/dist/MDropdownMenu-BmfXSc46.cjs +2 -0
- package/dist/{MDropdownMenu-CymCQqyP.cjs.map → MDropdownMenu-BmfXSc46.cjs.map} +1 -1
- package/dist/{MDropdownMenu-CMnBt-wO.js → MDropdownMenu-D79Cm5aS.js} +4 -4
- package/dist/{MDropdownMenu-CMnBt-wO.js.map → MDropdownMenu-D79Cm5aS.js.map} +1 -1
- package/dist/MGalleryIllustration-BB3DoCl_.cjs +2 -0
- package/dist/{MGalleryIllustration-BHtRFizZ.cjs.map → MGalleryIllustration-BB3DoCl_.cjs.map} +1 -1
- package/dist/{MGalleryIllustration-DhOtXwhC.js → MGalleryIllustration-D7CVMSwO.js} +2 -2
- package/dist/{MGalleryIllustration-DhOtXwhC.js.map → MGalleryIllustration-D7CVMSwO.js.map} +1 -1
- package/dist/MHeading-BhCNoJeW.cjs +2 -0
- package/dist/{MHeading-DHT1gORD.cjs.map → MHeading-BhCNoJeW.cjs.map} +1 -1
- package/dist/{MHeading-BvpWyvjj.js → MHeading-MPh8Qm9q.js} +4 -4
- package/dist/{MHeading-BvpWyvjj.js.map → MHeading-MPh8Qm9q.js.map} +1 -1
- package/dist/MI18nProvider-B2sE0x5D.cjs +2 -0
- package/dist/{MI18nProvider-Bml7Vs2-.cjs.map → MI18nProvider-B2sE0x5D.cjs.map} +1 -1
- package/dist/{MI18nProvider-BRZxEMqL.js → MI18nProvider-VH14CI8u.js} +1 -1
- package/dist/{MI18nProvider-BRZxEMqL.js.map → MI18nProvider-VH14CI8u.js.map} +1 -1
- package/dist/MImage-L_zgfWRY.cjs +2 -0
- package/dist/{MImage-CxeuH-cT.cjs.map → MImage-L_zgfWRY.cjs.map} +1 -1
- package/dist/{MImage-BQs91GK-.js → MImage-gwFphZk2.js} +9 -9
- package/dist/{MImage-BQs91GK-.js.map → MImage-gwFphZk2.js.map} +1 -1
- package/dist/MInline-CHrh3PHH.cjs +2 -0
- package/dist/{MInline-D9p9Sazp.cjs.map → MInline-CHrh3PHH.cjs.map} +1 -1
- package/dist/{MInline-DA_ehefx.js → MInline-CoMhfX5V.js} +4 -4
- package/dist/{MInline-DA_ehefx.js.map → MInline-CoMhfX5V.js.map} +1 -1
- package/dist/MInput-DYqV3-rQ.cjs +2 -0
- package/dist/{MInput-DDZ71Qqn.cjs.map → MInput-DYqV3-rQ.cjs.map} +1 -1
- package/dist/{MInput-l3MY93Su.js → MInput-bzSwK880.js} +6 -6
- package/dist/{MInput-l3MY93Su.js.map → MInput-bzSwK880.js.map} +1 -1
- package/dist/MInputCVC-5NkYSxV8.cjs +2 -0
- package/dist/{MInputCVC-Sp2uZ5aO.cjs.map → MInputCVC-5NkYSxV8.cjs.map} +1 -1
- package/dist/{MInputCVC-CN91scmw.js → MInputCVC-BHpMHTO5.js} +5 -5
- package/dist/{MInputCVC-CN91scmw.js.map → MInputCVC-BHpMHTO5.js.map} +1 -1
- package/dist/MInputSearch-DfoenJIm.cjs +2 -0
- package/dist/{MInputSearch-30o4bcDC.cjs.map → MInputSearch-DfoenJIm.cjs.map} +1 -1
- package/dist/{MInputSearch-CdPfJ4v_.js → MInputSearch-Dh4C3Tz5.js} +4 -4
- package/dist/{MInputSearch-CdPfJ4v_.js.map → MInputSearch-Dh4C3Tz5.js.map} +1 -1
- package/dist/MLink-CY45UR_j.cjs +2 -0
- package/dist/{MLink-U_wAUuz1.cjs.map → MLink-CY45UR_j.cjs.map} +1 -1
- package/dist/{MLink-CRUWGES-.js → MLink-rFKN1mcM.js} +3 -3
- package/dist/{MLink-CRUWGES-.js.map → MLink-rFKN1mcM.js.map} +1 -1
- package/dist/{MModal-CHSo5gKE.js → MModal-BDTAgnrm.js} +4 -4
- package/dist/{MModal-CHSo5gKE.js.map → MModal-BDTAgnrm.js.map} +1 -1
- package/dist/MModal-DT5BBgNZ.cjs +2 -0
- package/dist/{MModal-Czy-rR--.cjs.map → MModal-DT5BBgNZ.cjs.map} +1 -1
- package/dist/{MPagination-DdT1uNzD.js → MPagination-CTnaW5AW.js} +4 -4
- package/dist/{MPagination-DdT1uNzD.js.map → MPagination-CTnaW5AW.js.map} +1 -1
- package/dist/MPagination-CZEJMJzZ.cjs +2 -0
- package/dist/{MPagination-73z0sQvf.cjs.map → MPagination-CZEJMJzZ.cjs.map} +1 -1
- package/dist/MPopover-B4IUb9f0.cjs +2 -0
- package/dist/{MPopover-BW23_1Dl.cjs.map → MPopover-B4IUb9f0.cjs.map} +1 -1
- package/dist/{MPopover-3tjz5lKh.js → MPopover-Cqz5TsHg.js} +3 -3
- package/dist/{MPopover-3tjz5lKh.js.map → MPopover-Cqz5TsHg.js.map} +1 -1
- package/dist/{MPortal-Dqlkh3hw.js → MPortal-Ba2Sxset.js} +1 -1
- package/dist/{MPortal-Dqlkh3hw.js.map → MPortal-Ba2Sxset.js.map} +1 -1
- package/dist/MPortal-Bi24xTGW.cjs +2 -0
- package/dist/{MPortal-DE3pL2Xl.cjs.map → MPortal-Bi24xTGW.cjs.map} +1 -1
- package/dist/MQrCode-ByfmG33y.cjs +2 -0
- package/dist/{MQrCode-CMoru4dD.cjs.map → MQrCode-ByfmG33y.cjs.map} +1 -1
- package/dist/{MQrCode-DK5-SBhN.js → MQrCode-CCtTkkv9.js} +4 -4
- package/dist/{MQrCode-DK5-SBhN.js.map → MQrCode-CCtTkkv9.js.map} +1 -1
- package/dist/MSkeleton-5j1h9s95.cjs +2 -0
- package/dist/{MSkeleton-B0Mxe3L7.cjs.map → MSkeleton-5j1h9s95.cjs.map} +1 -1
- package/dist/{MSkeleton-Bqq_XJn8.js → MSkeleton-DGhtNmpI.js} +4 -4
- package/dist/{MSkeleton-Bqq_XJn8.js.map → MSkeleton-DGhtNmpI.js.map} +1 -1
- package/dist/{MSlider-ByVuoFFc.js → MSlider-5141rKeH.js} +2 -2
- package/dist/{MSlider-ByVuoFFc.js.map → MSlider-5141rKeH.js.map} +1 -1
- package/dist/MSlider-Ch3VjAJC.cjs +2 -0
- package/dist/{MSlider-sH2Vt9Lw.cjs.map → MSlider-Ch3VjAJC.cjs.map} +1 -1
- package/dist/MSparkline-B6qpt5WM.cjs +2 -0
- package/dist/{MSparkline-B-ld7hJu.cjs.map → MSparkline-B6qpt5WM.cjs.map} +1 -1
- package/dist/{MSparkline-DbtdM0W6.js → MSparkline-voNWOLNz.js} +2 -2
- package/dist/{MSparkline-DbtdM0W6.js.map → MSparkline-voNWOLNz.js.map} +1 -1
- package/dist/MStack-Bh-R2opf.cjs +2 -0
- package/dist/{MStack-Cy2GplIA.cjs.map → MStack-Bh-R2opf.cjs.map} +1 -1
- package/dist/{MStack-BWarX5O9.js → MStack-CSaEbepM.js} +4 -4
- package/dist/{MStack-BWarX5O9.js.map → MStack-CSaEbepM.js.map} +1 -1
- package/dist/{MSubText-C9VizSn9.js → MSubText-BFdfBlpS.js} +4 -4
- package/dist/{MSubText-C9VizSn9.js.map → MSubText-BFdfBlpS.js.map} +1 -1
- package/dist/MSubText-C-70zn0m.cjs +2 -0
- package/dist/{MSubText-DP9WYlwz.cjs.map → MSubText-C-70zn0m.cjs.map} +1 -1
- package/dist/MSurface-CpiV1-7f.cjs +2 -0
- package/dist/{MSurface-C467dVMQ.cjs.map → MSurface-CpiV1-7f.cjs.map} +1 -1
- package/dist/{MSurface-DfZ1Zy1-.js → MSurface-DJYSftdM.js} +4 -4
- package/dist/{MSurface-DfZ1Zy1-.js.map → MSurface-DJYSftdM.js.map} +1 -1
- package/dist/{MTag-N-tYZ915.js → MTag-CH5nMbm7.js} +5 -5
- package/dist/{MTag-N-tYZ915.js.map → MTag-CH5nMbm7.js.map} +1 -1
- package/dist/MTag-Y4Tswmli.cjs +2 -0
- package/dist/{MTag-DXqkBvqx.cjs.map → MTag-Y4Tswmli.cjs.map} +1 -1
- package/dist/MText-DEJddMB5.cjs +2 -0
- package/dist/{MText-COzub3y4.cjs.map → MText-DEJddMB5.cjs.map} +1 -1
- package/dist/{MText-B7_HjPym.js → MText-DcB1GAt-.js} +4 -4
- package/dist/{MText-B7_HjPym.js.map → MText-DcB1GAt-.js.map} +1 -1
- package/dist/{MTimeAgo-D1G2yovw.js → MTimeAgo-C4p80NvI.js} +4 -4
- package/dist/{MTimeAgo-D1G2yovw.js.map → MTimeAgo-C4p80NvI.js.map} +1 -1
- package/dist/MTimeAgo-DxZGVo2Y.cjs +2 -0
- package/dist/{MTimeAgo-DWwXs48z.cjs.map → MTimeAgo-DxZGVo2Y.cjs.map} +1 -1
- package/dist/MToggle-C8vYRzpC.cjs +2 -0
- package/dist/{MToggle-Cm3f6gm4.cjs.map → MToggle-C8vYRzpC.cjs.map} +1 -1
- package/dist/{MToggle-D0DrQirB.js → MToggle-Dt1Ctr5e.js} +3 -3
- package/dist/{MToggle-D0DrQirB.js.map → MToggle-Dt1Ctr5e.js.map} +1 -1
- package/dist/{MTooltip-w6Aj044c.js → MTooltip-C43aUKMP.js} +3 -3
- package/dist/{MTooltip-w6Aj044c.js.map → MTooltip-C43aUKMP.js.map} +1 -1
- package/dist/MTooltip-kSTMMpvu.cjs +2 -0
- package/dist/{MTooltip-C3PeHgV3.cjs.map → MTooltip-kSTMMpvu.cjs.map} +1 -1
- package/dist/arduino-CXUo7Bjy.cjs +2 -0
- package/dist/arduino-CXUo7Bjy.cjs.map +1 -0
- package/dist/arduino-Eif5KI8O.js +261 -0
- package/dist/arduino-Eif5KI8O.js.map +1 -0
- package/dist/bash-CCF_TYbb.js +171 -0
- package/dist/bash-CCF_TYbb.js.map +1 -0
- package/dist/bash-W4h3o_nx.cjs +2 -0
- package/dist/bash-W4h3o_nx.cjs.map +1 -0
- package/dist/c-DVgkp6T3.js +178 -0
- package/dist/c-DVgkp6T3.js.map +1 -0
- package/dist/c-Dm60JY-W.cjs +2 -0
- package/dist/c-Dm60JY-W.cjs.map +1 -0
- package/dist/cards-BiYdorB0.cjs +2 -0
- package/dist/{cards-B75QM9JW.cjs.map → cards-BiYdorB0.cjs.map} +1 -1
- package/dist/{cards-BKi8MxNx.js → cards-fn61xD_5.js} +17 -17
- package/dist/{cards-BKi8MxNx.js.map → cards-fn61xD_5.js.map} +1 -1
- package/dist/cards.cjs +1 -1
- package/dist/cards.js +2 -2
- package/dist/{cn-DYFxgzi2.cjs → cn-CU5TNITO.cjs} +1 -1
- package/dist/{cn-DYFxgzi2.cjs.map → cn-CU5TNITO.cjs.map} +1 -1
- package/dist/{cn-CUSXNnjF.js → cn-YER3QsV1.js} +1 -1
- package/dist/{cn-CUSXNnjF.js.map → cn-YER3QsV1.js.map} +1 -1
- package/dist/controls-C5PtrGZf.cjs +2 -0
- package/dist/{controls-B7wV_kjJ.cjs.map → controls-C5PtrGZf.cjs.map} +1 -1
- package/dist/{controls-BEi-0mf4.js → controls-DCtMOoQe.js} +6 -6
- package/dist/{controls-BEi-0mf4.js.map → controls-DCtMOoQe.js.map} +1 -1
- package/dist/controls.cjs +1 -1
- package/dist/controls.js +5 -5
- package/dist/cookie-consent-bootstrap.cjs +1 -1
- package/dist/cookie-consent-bootstrap.js +1 -1
- package/dist/core-AKWkE8Bx.cjs +4 -0
- package/dist/core-AKWkE8Bx.cjs.map +1 -0
- package/dist/core-CB9-PTLK.js +854 -0
- package/dist/core-CB9-PTLK.js.map +1 -0
- package/dist/cpp-DyKt1H8n.cjs +2 -0
- package/dist/cpp-DyKt1H8n.cjs.map +1 -0
- package/dist/cpp-OOenfB17.js +227 -0
- package/dist/cpp-OOenfB17.js.map +1 -0
- package/dist/{creditCards-BB11bW7D.js → creditCards-CCysEwry.js} +1 -1
- package/dist/{creditCards-BB11bW7D.js.map → creditCards-CCysEwry.js.map} +1 -1
- package/dist/{creditCards-198KJN0s.cjs → creditCards-ljs044xt.cjs} +1 -1
- package/dist/{creditCards-198KJN0s.cjs.map → creditCards-ljs044xt.cjs.map} +1 -1
- package/dist/css-DxVbPJLu.cjs +2 -0
- package/dist/css-DxVbPJLu.cjs.map +1 -0
- package/dist/css-u5LSEAra.js +142 -0
- package/dist/css-u5LSEAra.js.map +1 -0
- package/dist/data-Bw9FSZ80.cjs +2 -0
- package/dist/{data-DHkccnSN.cjs.map → data-Bw9FSZ80.cjs.map} +1 -1
- package/dist/{data-DKrj_Hx6.js → data-CMSIr_Ac.js} +24 -24
- package/dist/{data-DKrj_Hx6.js.map → data-CMSIr_Ac.js.map} +1 -1
- package/dist/data.cjs +1 -1
- package/dist/data.js +3 -3
- package/dist/{dateUtils-Ben8lfvV.js → dateUtils-CUY6CRCf.js} +1 -1
- package/dist/{dateUtils-Ben8lfvV.js.map → dateUtils-CUY6CRCf.js.map} +1 -1
- package/dist/{dateUtils-vT9rOf1J.cjs → dateUtils-Dq1vaA-D.cjs} +1 -1
- package/dist/{dateUtils-vT9rOf1J.cjs.map → dateUtils-Dq1vaA-D.cjs.map} +1 -1
- package/dist/display-BafEcBK_.cjs +3 -0
- package/dist/display-BafEcBK_.cjs.map +1 -0
- package/dist/{display-rQqBLjAN.js → display-Zxj9YHu_.js} +196 -179
- package/dist/display-Zxj9YHu_.js.map +1 -0
- package/dist/display.cjs +1 -1
- package/dist/display.js +3 -3
- package/dist/{dropdowns-BKnXb1XJ.js → dropdowns-Bw8obCYl.js} +15 -15
- package/dist/{dropdowns-BKnXb1XJ.js.map → dropdowns-Bw8obCYl.js.map} +1 -1
- package/dist/dropdowns-DN7j1HhE.cjs +2 -0
- package/dist/{dropdowns-cRrLY8FG.cjs.map → dropdowns-DN7j1HhE.cjs.map} +1 -1
- package/dist/dropdowns.cjs +1 -1
- package/dist/dropdowns.js +1 -1
- package/dist/{feedback-CIXmm0XT.js → feedback-8H3bmQw5.js} +18 -18
- package/dist/{feedback-CIXmm0XT.js.map → feedback-8H3bmQw5.js.map} +1 -1
- package/dist/feedback-Di0SEpRe.cjs +2 -0
- package/dist/{feedback-DiMptPJy.cjs.map → feedback-Di0SEpRe.cjs.map} +1 -1
- package/dist/feedback.cjs +1 -1
- package/dist/feedback.js +6 -6
- package/dist/form-BYz99Py5.cjs +2 -0
- package/dist/{form-DABPazeN.cjs.map → form-BYz99Py5.cjs.map} +1 -1
- package/dist/{form-DZJxDW59.js → form-JHlvtP9r.js} +2 -2
- package/dist/{form-DZJxDW59.js.map → form-JHlvtP9r.js.map} +1 -1
- package/dist/form.cjs +1 -1
- package/dist/form.js +1 -1
- package/dist/{formatters-CauWlsnM.cjs → formatters-CNjg_h7-.cjs} +1 -1
- package/dist/{formatters-CauWlsnM.cjs.map → formatters-CNjg_h7-.cjs.map} +1 -1
- package/dist/{formatters-Doqdu_w1.js → formatters-T0vvjMtB.js} +1 -1
- package/dist/{formatters-Doqdu_w1.js.map → formatters-T0vvjMtB.js.map} +1 -1
- package/dist/{frameworkTexts-DzujbRBe.js → frameworkTexts-CvxcWRXp.js} +2 -2
- package/dist/{frameworkTexts-DzujbRBe.js.map → frameworkTexts-CvxcWRXp.js.map} +1 -1
- package/dist/frameworkTexts-abkS5XZK.cjs +2 -0
- package/dist/{frameworkTexts-DPX5T2x3.cjs.map → frameworkTexts-abkS5XZK.cjs.map} +1 -1
- package/dist/i18n.cjs +1 -1
- package/dist/i18n.js +1 -1
- package/dist/{icons-DlNO04xH.js → icons-CfpYxnfg.js} +1 -1
- package/dist/{icons-DlNO04xH.js.map → icons-CfpYxnfg.js.map} +1 -1
- package/dist/icons-DWMgDKgt.cjs +2 -0
- package/dist/{icons-BJCV7W0L.cjs.map → icons-DWMgDKgt.cjs.map} +1 -1
- package/dist/icons.cjs +1 -1
- package/dist/icons.js +1 -1
- package/dist/illustrations.cjs +1 -1
- package/dist/illustrations.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +57 -57
- package/dist/{inputs-CmpB6eyB.js → inputs-Bcwd_UTr.js} +12 -12
- package/dist/{inputs-CmpB6eyB.js.map → inputs-Bcwd_UTr.js.map} +1 -1
- package/dist/inputs-FP545Yri.cjs +2 -0
- package/dist/{inputs-EZBwxk7j.cjs.map → inputs-FP545Yri.cjs.map} +1 -1
- package/dist/inputs.cjs +1 -1
- package/dist/inputs.js +4 -4
- package/dist/javascript-CXjsxb-I.js +438 -0
- package/dist/javascript-CXjsxb-I.js.map +1 -0
- package/dist/javascript-CzjCTQxn.cjs +2 -0
- package/dist/javascript-CzjCTQxn.cjs.map +1 -0
- package/dist/json-9Qq5guN0.cjs +2 -0
- package/dist/json-9Qq5guN0.cjs.map +1 -0
- package/dist/json-CyV5VF8D.js +38 -0
- package/dist/json-CyV5VF8D.js.map +1 -0
- package/dist/{layout-D72Y7VcW.js → layout-BpEnTocp.js} +11 -11
- package/dist/{layout-D72Y7VcW.js.map → layout-BpEnTocp.js.map} +1 -1
- package/dist/layout-rtlHrjDb.cjs +2 -0
- package/dist/{layout-DZiWboju.cjs.map → layout-rtlHrjDb.cjs.map} +1 -1
- package/dist/layout.cjs +1 -1
- package/dist/layout.js +5 -5
- package/dist/{layoutProps-Ck4VtGm9.cjs → layoutProps-B8y2XwHy.cjs} +1 -1
- package/dist/{layoutProps-Ck4VtGm9.cjs.map → layoutProps-B8y2XwHy.cjs.map} +1 -1
- package/dist/{layoutProps-Cl6d1KmH.js → layoutProps-CE5-ghKw.js} +1 -1
- package/dist/{layoutProps-Cl6d1KmH.js.map → layoutProps-CE5-ghKw.js.map} +1 -1
- package/dist/{licensing-Cbpi1toF.js → licensing-CwzqhHH9.js} +1 -1
- package/dist/{licensing-Cbpi1toF.js.map → licensing-CwzqhHH9.js.map} +1 -1
- package/dist/licensing-ezfo7ZTh.cjs +2 -0
- package/dist/{licensing-JchPJhVY.cjs.map → licensing-ezfo7ZTh.cjs.map} +1 -1
- package/dist/locale-CZyqh3ON.cjs +2 -0
- package/dist/{locale-DIwV_GfN.cjs.map → locale-CZyqh3ON.cjs.map} +1 -1
- package/dist/{locale-BNyzqXAU.js → locale-JX_gX03k.js} +1 -1
- package/dist/{locale-BNyzqXAU.js.map → locale-JX_gX03k.js.map} +1 -1
- package/dist/{media-BlGY91Na.js → media-C3M0npGW.js} +9 -9
- package/dist/{media-BlGY91Na.js.map → media-C3M0npGW.js.map} +1 -1
- package/dist/media-ClgUKDca.cjs +2 -0
- package/dist/{media-p643cb02.cjs.map → media-ClgUKDca.cjs.map} +1 -1
- package/dist/media.cjs +1 -1
- package/dist/media.js +3 -3
- package/dist/{overlays-51pBvlf9.js → overlays-CGlqD3rl.js} +7 -7
- package/dist/{overlays-51pBvlf9.js.map → overlays-CGlqD3rl.js.map} +1 -1
- package/dist/overlays-DrSGzbbA.cjs +2 -0
- package/dist/{overlays-8htlWp07.cjs.map → overlays-DrSGzbbA.cjs.map} +1 -1
- package/dist/overlays.cjs +1 -1
- package/dist/overlays.js +5 -5
- package/dist/php-Br75m0HU.cjs +3 -0
- package/dist/php-Br75m0HU.cjs.map +1 -0
- package/dist/php-deNqvHeU.js +296 -0
- package/dist/php-deNqvHeU.js.map +1 -0
- package/dist/primitives.cjs +1 -1
- package/dist/primitives.js +2 -2
- package/dist/{relativeTime-BqCuaBqb.js → relativeTime-Cr-NVzij.js} +1 -1
- package/dist/{relativeTime-BqCuaBqb.js.map → relativeTime-Cr-NVzij.js.map} +1 -1
- package/dist/{relativeTime-DUbW4O44.cjs → relativeTime-DgYBUaVm.cjs} +1 -1
- package/dist/{relativeTime-DUbW4O44.cjs.map → relativeTime-DgYBUaVm.cjs.map} +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-CgS-bND3.cjs +2 -0
- package/dist/{theme-Bnwe-wvr.cjs.map → theme-CgS-bND3.cjs.map} +1 -1
- package/dist/{theme-KYwqDZxJ.js → theme-D_f-cmSA.js} +1 -1
- package/dist/{theme-KYwqDZxJ.js.map → theme-D_f-cmSA.js.map} +1 -1
- package/dist/theme.cjs +1 -1
- package/dist/theme.js +1 -1
- package/dist/typescript-CRgqVaw_.cjs +2 -0
- package/dist/typescript-CRgqVaw_.cjs.map +1 -0
- package/dist/typescript-jNfCpQvl.js +523 -0
- package/dist/typescript-jNfCpQvl.js.map +1 -0
- package/dist/{typography-FCWA0UOB.js → typography-BSBsn0f8.js} +3 -3
- package/dist/{typography-FCWA0UOB.js.map → typography-BSBsn0f8.js.map} +1 -1
- package/dist/typography-Zo4Usx9I.cjs +2 -0
- package/dist/{typography-D1s-QFlb.cjs.map → typography-Zo4Usx9I.cjs.map} +1 -1
- package/dist/typography.cjs +1 -1
- package/dist/typography.js +5 -5
- package/dist/{useGhostText-BJZKdZpw.js → useGhostText-DG0bzcao.js} +1 -1
- package/dist/{useGhostText-BJZKdZpw.js.map → useGhostText-DG0bzcao.js.map} +1 -1
- package/dist/useGhostText-tv1LiSPs.cjs +2 -0
- package/dist/{useGhostText-D1DbIs-n.cjs.map → useGhostText-tv1LiSPs.cjs.map} +1 -1
- package/dist/useInteractionEffect-D1ZdNbKU.cjs +2 -0
- package/dist/{useInteractionEffect-CYHGHV1e.cjs.map → useInteractionEffect-D1ZdNbKU.cjs.map} +1 -1
- package/dist/{useInteractionEffect-ClkU3aH5.js → useInteractionEffect-DtpbVd77.js} +1 -1
- package/dist/{useInteractionEffect-ClkU3aH5.js.map → useInteractionEffect-DtpbVd77.js.map} +1 -1
- package/dist/useKeyboardNav-CkIlAagq.cjs +2 -0
- package/dist/{useKeyboardNav-BoibrRUF.cjs.map → useKeyboardNav-CkIlAagq.cjs.map} +1 -1
- package/dist/{useKeyboardNav-CBOdeTFM.js → useKeyboardNav-iEXOdEMB.js} +1 -1
- package/dist/{useKeyboardNav-CBOdeTFM.js.map → useKeyboardNav-iEXOdEMB.js.map} +1 -1
- package/dist/utils.cjs +1 -1
- package/dist/utils.js +10 -10
- package/dist/{validators-D4aTeaH0.cjs → validators-BeNTD8mf.cjs} +1 -1
- package/dist/{validators-D4aTeaH0.cjs.map → validators-BeNTD8mf.cjs.map} +1 -1
- package/dist/{validators-YZyyyLvE.js → validators-H8tNxb8O.js} +1 -1
- package/dist/{validators-YZyyyLvE.js.map → validators-H8tNxb8O.js.map} +1 -1
- package/dist/xml-0Th6YIDv.js +168 -0
- package/dist/xml-0Th6YIDv.js.map +1 -0
- package/dist/xml-C_ksWBRH.cjs +2 -0
- package/dist/xml-C_ksWBRH.cjs.map +1 -0
- package/package.json +2 -2
- package/dist/MAvatar-DGEQqUss.cjs +0 -2
- package/dist/MBadge-DcIPfPH1.cjs +0 -2
- package/dist/MButton-LUNWBBOV.cjs +0 -2
- package/dist/MCheckbox-PzknJeM2.cjs +0 -2
- package/dist/MDataTable-Bq6UoNJX.cjs +0 -2
- package/dist/MDrawer-DRqMsjMt.cjs +0 -2
- package/dist/MDropdownMenu-CymCQqyP.cjs +0 -2
- package/dist/MGalleryIllustration-BHtRFizZ.cjs +0 -2
- package/dist/MHeading-DHT1gORD.cjs +0 -2
- package/dist/MI18nProvider-Bml7Vs2-.cjs +0 -2
- package/dist/MImage-CxeuH-cT.cjs +0 -2
- package/dist/MInline-D9p9Sazp.cjs +0 -2
- package/dist/MInput-DDZ71Qqn.cjs +0 -2
- package/dist/MInputCVC-Sp2uZ5aO.cjs +0 -2
- package/dist/MInputSearch-30o4bcDC.cjs +0 -2
- package/dist/MLink-U_wAUuz1.cjs +0 -2
- package/dist/MModal-Czy-rR--.cjs +0 -2
- package/dist/MPagination-73z0sQvf.cjs +0 -2
- package/dist/MPopover-BW23_1Dl.cjs +0 -2
- package/dist/MPortal-DE3pL2Xl.cjs +0 -2
- package/dist/MQrCode-CMoru4dD.cjs +0 -2
- package/dist/MSkeleton-B0Mxe3L7.cjs +0 -2
- package/dist/MSlider-sH2Vt9Lw.cjs +0 -2
- package/dist/MSparkline-B-ld7hJu.cjs +0 -2
- package/dist/MStack-Cy2GplIA.cjs +0 -2
- package/dist/MSubText-DP9WYlwz.cjs +0 -2
- package/dist/MSurface-C467dVMQ.cjs +0 -2
- package/dist/MTag-DXqkBvqx.cjs +0 -2
- package/dist/MText-COzub3y4.cjs +0 -2
- package/dist/MTimeAgo-DWwXs48z.cjs +0 -2
- package/dist/MToggle-Cm3f6gm4.cjs +0 -2
- package/dist/MTooltip-C3PeHgV3.cjs +0 -2
- package/dist/cards-B75QM9JW.cjs +0 -2
- package/dist/chunk-350yNsax.cjs +0 -1
- package/dist/chunk-efA98nb6.js +0 -13
- package/dist/controls-B7wV_kjJ.cjs +0 -2
- package/dist/data-DHkccnSN.cjs +0 -2
- package/dist/display-DKJ6Hp3A.cjs +0 -3
- package/dist/display-DKJ6Hp3A.cjs.map +0 -1
- package/dist/display-rQqBLjAN.js.map +0 -1
- package/dist/dropdowns-cRrLY8FG.cjs +0 -2
- package/dist/feedback-DiMptPJy.cjs +0 -2
- package/dist/form-DABPazeN.cjs +0 -2
- package/dist/frameworkTexts-DPX5T2x3.cjs +0 -2
- package/dist/icons-BJCV7W0L.cjs +0 -2
- package/dist/inputs-EZBwxk7j.cjs +0 -2
- package/dist/layout-DZiWboju.cjs +0 -2
- package/dist/licensing-JchPJhVY.cjs +0 -2
- package/dist/locale-DIwV_GfN.cjs +0 -2
- package/dist/media-p643cb02.cjs +0 -2
- package/dist/overlays-8htlWp07.cjs +0 -2
- package/dist/prism-bash-DSVvpDwH.cjs +0 -2
- package/dist/prism-bash-DSVvpDwH.cjs.map +0 -1
- package/dist/prism-bash-GQKgVScr.js +0 -177
- package/dist/prism-bash-GQKgVScr.js.map +0 -1
- package/dist/prism-c-DBlZetAm.js +0 -56
- package/dist/prism-c-DBlZetAm.js.map +0 -1
- package/dist/prism-c-DwJ0sL1f.cjs +0 -2
- package/dist/prism-c-DwJ0sL1f.cjs.map +0 -1
- package/dist/prism-clike-BHy7LBAZ.cjs +0 -2
- package/dist/prism-clike-BHy7LBAZ.cjs.map +0 -1
- package/dist/prism-clike-CrtZga9r.js +0 -30
- package/dist/prism-clike-CrtZga9r.js.map +0 -1
- package/dist/prism-core-DsZQ3wSm.js +0 -299
- package/dist/prism-core-DsZQ3wSm.js.map +0 -1
- package/dist/prism-core-Z2NDHfPM.cjs +0 -2
- package/dist/prism-core-Z2NDHfPM.cjs.map +0 -1
- package/dist/prism-cpp-CXyjGEks.cjs +0 -2
- package/dist/prism-cpp-CXyjGEks.cjs.map +0 -1
- package/dist/prism-cpp-DerVaWjZ.js +0 -65
- package/dist/prism-cpp-DerVaWjZ.js.map +0 -1
- package/dist/prism-css-Bx_bUmkm.js +0 -57
- package/dist/prism-css-Bx_bUmkm.js.map +0 -1
- package/dist/prism-css-q8i9Tl0Y.cjs +0 -2
- package/dist/prism-css-q8i9Tl0Y.cjs.map +0 -1
- package/dist/prism-javascript-CC_WcCH4.cjs +0 -2
- package/dist/prism-javascript-CC_WcCH4.cjs.map +0 -1
- package/dist/prism-javascript-uSHTlCK6.js +0 -103
- package/dist/prism-javascript-uSHTlCK6.js.map +0 -1
- package/dist/prism-json-CRpBxccA.js +0 -27
- package/dist/prism-json-CRpBxccA.js.map +0 -1
- package/dist/prism-json-CvwHQDim.cjs +0 -2
- package/dist/prism-json-CvwHQDim.cjs.map +0 -1
- package/dist/prism-jsx-CSsxTxi5.js +0 -48
- package/dist/prism-jsx-CSsxTxi5.js.map +0 -1
- package/dist/prism-jsx-ZJAX6mJe.cjs +0 -2
- package/dist/prism-jsx-ZJAX6mJe.cjs.map +0 -1
- package/dist/prism-markup-Cc4COxfn.js +0 -118
- package/dist/prism-markup-Cc4COxfn.js.map +0 -1
- package/dist/prism-markup-RTw80xRC.cjs +0 -2
- package/dist/prism-markup-RTw80xRC.cjs.map +0 -1
- package/dist/prism-markup-templating-CylI3Gpj.cjs +0 -2
- package/dist/prism-markup-templating-CylI3Gpj.cjs.map +0 -1
- package/dist/prism-markup-templating-D4w8OHUw.js +0 -41
- package/dist/prism-markup-templating-D4w8OHUw.js.map +0 -1
- package/dist/prism-php-CMZ7fRp0.cjs +0 -2
- package/dist/prism-php-CMZ7fRp0.cjs.map +0 -1
- package/dist/prism-php-nJ_CzHXP.js +0 -279
- package/dist/prism-php-nJ_CzHXP.js.map +0 -1
- package/dist/prism-tsx-CvHlXV3S.cjs +0 -2
- package/dist/prism-tsx-CvHlXV3S.cjs.map +0 -1
- package/dist/prism-tsx-UlwV29L3.js +0 -10
- package/dist/prism-tsx-UlwV29L3.js.map +0 -1
- package/dist/prism-typescript-BA7hsZPZ.js +0 -40
- package/dist/prism-typescript-BA7hsZPZ.js.map +0 -1
- package/dist/prism-typescript-CDAVIXup.cjs +0 -2
- package/dist/prism-typescript-CDAVIXup.cjs.map +0 -1
- package/dist/theme-Bnwe-wvr.cjs +0 -2
- package/dist/typography-D1s-QFlb.cjs +0 -2
- package/dist/useGhostText-D1DbIs-n.cjs +0 -2
- package/dist/useInteractionEffect-CYHGHV1e.cjs +0 -2
- package/dist/useKeyboardNav-BoibrRUF.cjs +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-DKrj_Hx6.js","names":[],"sources":["../src/components/data/MChat/MChatContext.ts","../src/components/data/MChat/MChat.tsx","../src/components/data/MChat/MChatHeader.tsx","../src/components/data/MChat/MChatMessage.tsx","../src/components/data/MChat/MChatBody.tsx","../src/components/data/MChat/emojis.ts","../src/components/data/MChat/MChatInput.tsx","../src/components/data/MChat/MChatTypingIndicator.tsx","../src/components/data/MChat/MChatConversationList.tsx","../src/components/data/MChat/MChatConversationItem.tsx","../src/components/data/MTreeView/MTreeView.tsx","../src/components/data/MTaskList/MTaskList.tsx","../src/components/data/MFileManager/MFileManager.tsx","../src/components/data/MCalendarBoard/MCalendarBoard.tsx","../src/components/data/MChart/MChart.types.ts","../src/components/data/MChart/utils/formats.ts","../src/components/data/MChart/parts/ChartGrid.tsx","../src/components/data/MChart/parts/ChartAxis.tsx","../src/components/data/MChart/charts/MLineChart.tsx","../src/components/data/MChart/charts/MBarChart.tsx","../src/components/data/MChart/charts/MAreaChart.tsx","../src/components/data/MChart/charts/MPieChart.tsx","../src/components/data/MChart/parts/ChartDefs.tsx","../src/components/data/MChart/parts/ChartTooltip.tsx","../src/components/data/MChart/parts/ChartLegend.tsx","../src/components/data/MChart/MChart.tsx","../src/components/data/MChart/MLineChart.tsx","../src/components/data/MChart/MBarChart.tsx","../src/components/data/MChart/MAreaChart.tsx","../src/components/data/MChart/MPieChart.tsx"],"sourcesContent":["import {createContext, useContext} from 'react'\nimport type {MColor} from '../../../theme'\n\nexport interface MChatContextValue {\n color?: MColor\n}\n\nexport const MChatContext = createContext<MChatContextValue>({})\n\nexport function useMChatContext() {\n return useContext(MChatContext)\n}\n","import {Children, isValidElement, useMemo} from 'react'\nimport type {ReactNode} from 'react'\nimport type {MChatProps} from './MChat.types'\nimport {MChatContext} from './MChatContext'\nimport {MPortal} from '../../primitives'\nimport {MButton} from '../../controls'\nimport {MChatIcon} from '../../../icons'\nimport {cn} from '../../../utils/cn'\nimport './MChat.css'\n\nfunction isChatSlot(child: ReactNode, flag: string): boolean {\n return isValidElement(child) && !!(child.type as any)[flag]\n}\n\nexport function MChat({\n variant = 'inline',\n open,\n onToggle,\n unreadCount,\n color = 'primary',\n className,\n children,\n ...rest\n}: MChatProps) {\n let header: ReactNode = null\n let conversationList: ReactNode = null\n const body: ReactNode[] = []\n\n Children.forEach(children, (child) => {\n if (isChatSlot(child, '__chatHeader')) {\n header = child\n return\n }\n if (isChatSlot(child, '__chatConversationList')) {\n conversationList = child\n return\n }\n body.push(child)\n })\n\n const ctx = useMemo(() => ({color}), [color])\n\n const chatContent = (\n <MChatContext.Provider value={ctx}>\n <div\n className={cn('chat', variant, `color-${color}`, variant === 'floating' && open && 'open', className)}\n {...rest}\n >\n {conversationList && <div className=\"chat-sidebar\">{conversationList}</div>}\n <div className=\"chat-main\">\n {header}\n {body}\n </div>\n </div>\n </MChatContext.Provider>\n )\n\n if (variant === 'floating') {\n return (\n <MPortal>\n <div className={cn('chat-floating-wrapper', open && 'open')}>\n {open && chatContent}\n <MButton\n variant=\"filled\"\n color={color}\n shape=\"circle\"\n size=\"lg\"\n className=\"chat-floating-trigger\"\n onClick={onToggle}\n aria-label={open ? 'Close chat' : 'Open chat'}\n badge={!open && unreadCount ? unreadCount : undefined}\n badgeColor=\"error\"\n badgePulsing={!open && !!unreadCount}\n >\n <MChatIcon />\n </MButton>\n </div>\n </MPortal>\n )\n }\n\n return chatContent\n}\n","import type {MChatHeaderProps} from './MChat.types'\nimport {cn} from '../../../utils/cn'\n\nexport function MChatHeader({bordered = false, className, children, ...rest}: MChatHeaderProps) {\n return (\n <div className={cn('chat-header', bordered && 'bordered', className)} {...rest}>\n {children}\n </div>\n )\n}\n;(MChatHeader as any).__chatHeader = true\n","import type {MChatMessageProps} from './MChat.types'\nimport {MAvatar} from '../../media'\nimport {MImage} from '../../media'\nimport {MText, MSubText} from '../../typography'\nimport {MTimeAgo} from '../../display'\nimport {cn} from '../../../utils/cn'\n\nfunction StatusIcon({status}: {status?: string}) {\n if (!status) return null\n\n const double = status === 'delivered' || status === 'read'\n const colorClass = status === 'read' ? 'chat-status-read' : ''\n\n return (\n <span className={cn('chat-status', colorClass)} aria-label={status}>\n {double ? '✓✓' : '✓'}\n </span>\n )\n}\n\nexport function MChatMessage({\n message,\n showAvatar = true,\n showTimestamp = true,\n color,\n className,\n ...rest\n}: MChatMessageProps) {\n const {content, sender, timestamp, status, isOwn, images} = message\n const colorClass = color ? color : undefined\n\n return (\n <div className={cn('chat-message', isOwn && 'own', colorClass, className)} {...rest}>\n {showAvatar && !isOwn && (\n <MAvatar\n src={sender.avatar}\n name={sender.name}\n size=\"sm\"\n color={color}\n className=\"chat-message-avatar\"\n />\n )}\n <div className=\"chat-message-content\">\n {!isOwn && (\n <MText className=\"chat-message-sender\" color=\"neutral\">\n {sender.name}\n </MText>\n )}\n <div className=\"chat-message-bubble\">\n {content && <MText>{content}</MText>}\n {images && images.length > 0 && (\n <div className={cn('chat-message-images', images.length > 1 && 'grid')}>\n {images.map((src, i) => (\n <MImage key={i} src={src} alt=\"\" fit=\"cover\" rounded className=\"chat-message-image\" />\n ))}\n </div>\n )}\n </div>\n <div className=\"chat-message-meta\">\n {isOwn && <StatusIcon status={status} />}\n {showTimestamp && (\n <MSubText className=\"chat-message-time\">\n <MTimeAgo value={timestamp} />\n </MSubText>\n )}\n </div>\n </div>\n </div>\n )\n}\n","import {useRef, useEffect, useCallback} from 'react'\nimport type {MChatBodyProps} from './MChat.types'\nimport {useMChatContext} from './MChatContext'\nimport {MChatMessage} from './MChatMessage'\nimport {MSpinner} from '../../feedback'\nimport {cn} from '../../../utils/cn'\n\nexport function MChatBody({\n messages,\n onScrollTop,\n loading = false,\n color: colorProp,\n className,\n children,\n ...rest\n}: MChatBodyProps) {\n const {color: ctxColor} = useMChatContext()\n const color = colorProp ?? ctxColor\n\n const containerRef = useRef<HTMLDivElement>(null)\n const stickToBottom = useRef(true)\n const prevMessageCount = useRef(0)\n\n const scrollToBottom = useCallback(() => {\n const el = containerRef.current\n if (el) el.scrollTop = el.scrollHeight\n }, [])\n\n useEffect(() => {\n const count = messages?.length ?? 0\n if (count > prevMessageCount.current && stickToBottom.current) {\n scrollToBottom()\n }\n prevMessageCount.current = count\n }, [messages?.length, scrollToBottom])\n\n useEffect(() => {\n scrollToBottom()\n }, [scrollToBottom])\n\n const handleScroll = () => {\n const el = containerRef.current\n if (!el) return\n\n const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 40\n stickToBottom.current = atBottom\n\n if (el.scrollTop < 40 && onScrollTop && !loading) {\n onScrollTop()\n }\n }\n\n return (\n <div ref={containerRef} className={cn('chat-body', className)} onScroll={handleScroll} {...rest}>\n {loading && (\n <div className=\"chat-body-loader\">\n <MSpinner size=\"sm\" />\n </div>\n )}\n {messages?.map((msg) => (\n <MChatMessage key={msg.id} message={msg} color={color} />\n ))}\n {children}\n </div>\n )\n}\n","import type {MChatEmojiCategory} from './MChat.types'\n\nexport const chatEmojiCategories: MChatEmojiCategory[] = [\n {\n label: 'Smileys',\n emojis: [\n '😀',\n '😃',\n '😄',\n '😁',\n '😆',\n '😅',\n '🤣',\n '😂',\n '🙂',\n '😊',\n '😇',\n '🥰',\n '😍',\n '🤩',\n '😘',\n '😗',\n '😋',\n '😛',\n '😜',\n '🤪',\n '😝',\n '🤗',\n '🤔',\n '🫡',\n '🤐',\n '🤨',\n '😐',\n '😑',\n '😶',\n '🫠',\n '😏',\n '😒',\n '🙄',\n '😬',\n '😮💨',\n '🤥',\n '😌',\n '😔',\n '😪',\n '🤤',\n '😴',\n '😷',\n '🤒',\n '🤕',\n '🤢',\n '🤮',\n '🤧',\n '🥵',\n '🥶',\n '😵',\n '🤯',\n '🥳',\n '🥸',\n '😎',\n '🤓',\n '🧐',\n ],\n },\n {\n label: 'Gestures',\n emojis: [\n '👋',\n '🤚',\n '🖐️',\n '✋',\n '🖖',\n '🫱',\n '🫲',\n '👌',\n '🤌',\n '🤏',\n '✌️',\n '🤞',\n '🫰',\n '🤟',\n '🤘',\n '🤙',\n '👈',\n '👉',\n '👆',\n '👇',\n '☝️',\n '👍',\n '👎',\n '✊',\n '👊',\n '🤛',\n '🤜',\n '👏',\n '🙌',\n '🫶',\n '👐',\n '🤝',\n ],\n },\n {\n label: 'Hearts',\n emojis: [\n '❤️',\n '🧡',\n '💛',\n '💚',\n '💙',\n '💜',\n '🖤',\n '🤍',\n '🤎',\n '💔',\n '❤️🔥',\n '❤️🩹',\n '💕',\n '💞',\n '💓',\n '💗',\n '💖',\n '💘',\n '💝',\n '💟',\n ],\n },\n {\n label: 'Objects',\n emojis: [\n '🔥',\n '✨',\n '🌟',\n '💫',\n '⚡',\n '💥',\n '🎉',\n '🎊',\n '🏆',\n '🥇',\n '🎯',\n '💡',\n '📌',\n '📎',\n '✅',\n '❌',\n '⭐',\n '💬',\n '👁️🗨️',\n '🔔',\n ],\n },\n]\n","import {useState, useRef, useCallback, useEffect} from 'react'\nimport type {KeyboardEvent, DragEvent} from 'react'\nimport type {MChatInputProps} from './MChat.types'\nimport {useMChatContext} from './MChatContext'\nimport {MButton} from '../../controls'\nimport {MImage} from '../../media'\nimport {MPopover} from '../../primitives'\nimport {MAttachIcon, MCloseIcon, MSendIcon} from '../../../icons'\nimport {cn} from '../../../utils/cn'\nimport {chatEmojiCategories} from './emojis'\n\nconst ACCEPT_IMAGES = 'image/png,image/jpeg,image/gif,image/webp'\n\nexport function MChatInput({\n onSend,\n placeholder = 'Type a message…',\n disabled = false,\n showEmoji = true,\n showAttach = true,\n onTyping,\n color: colorProp,\n className,\n ...rest\n}: MChatInputProps) {\n const {color: ctxColor} = useMChatContext()\n const color = colorProp ?? ctxColor\n const [value, setValue] = useState('')\n const [emojiOpen, setEmojiOpen] = useState(false)\n const [attachedFiles, setAttachedFiles] = useState<File[]>([])\n const [previews, setPreviews] = useState<string[]>([])\n const [dragOver, setDragOver] = useState(false)\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n const emojiButtonRef = useRef<HTMLButtonElement>(null)\n const fileInputRef = useRef<HTMLInputElement>(null)\n const typingRef = useRef(false)\n const typingTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n\n const addFiles = useCallback((files: File[]) => {\n const imageFiles = files.filter((f) => f.type.startsWith('image/'))\n if (imageFiles.length === 0) return\n\n setAttachedFiles((prev) => [...prev, ...imageFiles])\n\n imageFiles.forEach((file) => {\n const url = URL.createObjectURL(file)\n setPreviews((prev) => [...prev, url])\n })\n }, [])\n\n const removeFile = useCallback((index: number) => {\n setPreviews((prev) => {\n URL.revokeObjectURL(prev[index])\n return prev.filter((_, i) => i !== index)\n })\n setAttachedFiles((prev) => prev.filter((_, i) => i !== index))\n }, [])\n\n useEffect(() => {\n return () => previews.forEach((url) => URL.revokeObjectURL(url))\n }, [])\n\n const send = useCallback(() => {\n const trimmed = value.trim()\n if (!trimmed && attachedFiles.length === 0) return\n if (disabled) return\n\n onSend?.(trimmed, attachedFiles.length > 0 ? attachedFiles : undefined)\n setValue('')\n setAttachedFiles([])\n setPreviews((prev) => {\n prev.forEach((url) => URL.revokeObjectURL(url))\n return []\n })\n if (textareaRef.current) {\n textareaRef.current.style.height = 'auto'\n }\n if (typingRef.current) {\n typingRef.current = false\n onTyping?.(false)\n }\n }, [value, attachedFiles, disabled, onSend, onTyping])\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n send()\n }\n }\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setValue(e.target.value)\n autoResize(e.target)\n\n if (onTyping) {\n if (!typingRef.current) {\n typingRef.current = true\n onTyping(true)\n }\n clearTimeout(typingTimerRef.current)\n typingTimerRef.current = setTimeout(() => {\n typingRef.current = false\n onTyping(false)\n }, 1500)\n }\n }\n\n const autoResize = (el: HTMLTextAreaElement) => {\n el.style.height = 'auto'\n el.style.height = Math.min(el.scrollHeight, 120) + 'px'\n }\n\n useEffect(() => {\n return () => clearTimeout(typingTimerRef.current)\n }, [])\n\n const insertEmoji = (emoji: string) => {\n setValue((prev) => prev + emoji)\n setEmojiOpen(false)\n textareaRef.current?.focus()\n }\n\n const handleDragOver = (e: DragEvent) => {\n e.preventDefault()\n setDragOver(true)\n }\n\n const handleDragLeave = (e: DragEvent) => {\n e.preventDefault()\n setDragOver(false)\n }\n\n const handleDrop = (e: DragEvent) => {\n e.preventDefault()\n setDragOver(false)\n const files = Array.from(e.dataTransfer.files)\n addFiles(files)\n }\n\n const handleFileSelect = () => {\n const files = fileInputRef.current?.files\n if (files) addFiles(Array.from(files))\n if (fileInputRef.current) fileInputRef.current.value = ''\n }\n\n const canSend = value.trim() || attachedFiles.length > 0\n\n return (\n <div\n className={cn('chat-input', dragOver && 'drag-over', className)}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n {...rest}\n >\n {previews.length > 0 && (\n <div className=\"chat-input-previews\">\n {previews.map((src, i) => (\n <div key={i} className=\"chat-input-preview\">\n <MImage src={src} alt=\"\" fit=\"cover\" rounded className=\"chat-input-preview-img\" />\n <button\n type=\"button\"\n className=\"chat-input-preview-remove\"\n onClick={() => removeFile(i)}\n aria-label=\"Remove image\"\n >\n <MCloseIcon />\n </button>\n </div>\n ))}\n </div>\n )}\n <div className=\"chat-input-field\">\n {showEmoji && (\n <>\n <button\n ref={emojiButtonRef}\n type=\"button\"\n className=\"chat-input-emoji-trigger\"\n onClick={() => setEmojiOpen((o) => !o)}\n aria-label=\"Emoji\"\n disabled={disabled}\n >\n 😊\n </button>\n <MPopover\n open={emojiOpen}\n anchorRef={emojiButtonRef as React.RefObject<HTMLElement>}\n onClose={() => setEmojiOpen(false)}\n placement=\"top-start\"\n >\n <div className=\"chat-emoji-picker\">\n {chatEmojiCategories.map((cat) => (\n <div key={cat.label} className=\"chat-emoji-category\">\n <div className=\"chat-emoji-category-label\">{cat.label}</div>\n <div className=\"chat-emoji-grid\">\n {cat.emojis.map((emoji) => (\n <button\n key={emoji}\n type=\"button\"\n className=\"chat-emoji-btn\"\n onClick={() => insertEmoji(emoji)}\n >\n {emoji}\n </button>\n ))}\n </div>\n </div>\n ))}\n </div>\n </MPopover>\n </>\n )}\n {showAttach && (\n <>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={ACCEPT_IMAGES}\n multiple\n className=\"chat-input-file-hidden\"\n onChange={handleFileSelect}\n tabIndex={-1}\n />\n <button\n type=\"button\"\n className=\"chat-input-attach-trigger\"\n onClick={() => fileInputRef.current?.click()}\n aria-label=\"Attach image\"\n disabled={disabled}\n >\n <MAttachIcon color=\"inherit\" />\n </button>\n </>\n )}\n <textarea\n ref={textareaRef}\n className=\"chat-input-textarea\"\n value={value}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n rows={1}\n />\n <MButton\n variant=\"filled\"\n size=\"sm\"\n color={color ?? 'primary'}\n iconOnly\n shape=\"circle\"\n className=\"chat-input-send\"\n onClick={send}\n disabled={disabled || !canSend}\n aria-label=\"Send\"\n >\n <MSendIcon />\n </MButton>\n </div>\n </div>\n )\n}\n","import type {MChatTypingIndicatorProps} from './MChat.types'\nimport {MAvatar} from '../../media'\nimport {cn} from '../../../utils/cn'\n\nexport function MChatTypingIndicator({users = [], visible = true, className, ...rest}: MChatTypingIndicatorProps) {\n if (!visible || users.length === 0) return null\n\n const label =\n users.length === 1\n ? `${users[0].name} is typing`\n : users.length === 2\n ? `${users[0].name} and ${users[1].name} are typing`\n : `${users[0].name} and ${users.length - 1} others are typing`\n\n return (\n <div className={cn('chat-typing', className)} aria-label={label} {...rest}>\n {users.length === 1 && (\n <MAvatar src={users[0].avatar} name={users[0].name} size=\"sm\" className=\"chat-typing-avatar\" />\n )}\n <div className=\"chat-typing-dots\">\n <span className=\"chat-typing-dot\" />\n <span className=\"chat-typing-dot\" />\n <span className=\"chat-typing-dot\" />\n </div>\n </div>\n )\n}\n","import type {MChatConversationListProps} from './MChat.types'\nimport {cn} from '../../../utils/cn'\n\nexport function MChatConversationList({className, children, ...rest}: MChatConversationListProps) {\n return (\n <div className={cn('chat-conversation-list', className)} {...rest}>\n {children}\n </div>\n )\n}\n;(MChatConversationList as any).__chatConversationList = true\n","import type {MChatConversationItemProps} from './MChat.types'\nimport {useMChatContext} from './MChatContext'\nimport {MAvatar} from '../../media'\nimport {MText, MSubText} from '../../typography'\nimport {MBadge} from '../../feedback'\nimport {MTimeAgo} from '../../display'\nimport {cn} from '../../../utils/cn'\n\nexport function MChatConversationItem({\n conversation,\n active = false,\n color: colorProp,\n onClick,\n className,\n ...rest\n}: MChatConversationItemProps) {\n const {color: ctxColor} = useMChatContext()\n const color = colorProp ?? ctxColor\n const {title, participants, lastMessage, unreadCount} = conversation\n const displayName = title ?? participants.map((p) => p.name).join(', ')\n const firstParticipant = participants[0]\n const hasOnline = participants.some((p) => p.online)\n\n return (\n <div\n className={cn('chat-conversation-item', active && 'active', className)}\n onClick={() => onClick?.(conversation)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onClick?.(conversation)\n }\n }}\n {...rest}\n >\n <MAvatar\n src={firstParticipant?.avatar}\n name={firstParticipant?.name}\n size=\"md\"\n color={color}\n badge={hasOnline}\n badgeColor=\"success\"\n className=\"chat-conversation-avatar\"\n />\n <div className=\"chat-conversation-info\">\n <div className=\"chat-conversation-top\">\n <MText className=\"chat-conversation-name\">{displayName}</MText>\n {lastMessage && (\n <MSubText className=\"chat-conversation-time\">\n <MTimeAgo value={lastMessage.timestamp} />\n </MSubText>\n )}\n </div>\n {lastMessage && (\n <div className=\"chat-conversation-bottom\">\n <MSubText className=\"chat-conversation-preview\">\n {lastMessage.isOwn ? 'You: ' : ''}\n {lastMessage.content}\n </MSubText>\n {!!unreadCount && unreadCount > 0 && (\n <MBadge color={color ?? 'primary'} size=\"sm\" rounded>\n {unreadCount}\n </MBadge>\n )}\n </div>\n )}\n </div>\n </div>\n )\n}\n","import {useEffect, useRef, useState} from 'react'\nimport type {CSSProperties, DragEvent, MouseEvent, ReactNode} from 'react'\nimport type {\n MTreeViewProps,\n MTreeItemProps,\n MTreeNode,\n MTreeViewContextMenuItem,\n MTreeViewMoveEvent,\n} from './MTreeView.types'\nimport {cn} from '../../../utils/cn'\nimport {MPortal} from '../../primitives'\nimport {\n MChevronRightIcon,\n MFileCodeIcon,\n MFileCsvIcon,\n MFileCssIcon,\n MFileExeIcon,\n MFileGifIcon,\n MFileHtmlIcon,\n MFileIcon,\n MFileImageIcon,\n MFileJpgIcon,\n MFileJsIcon,\n MFileJsonIcon,\n MFileMdIcon,\n MFileMp3Icon,\n MFileMp4Icon,\n MFileOdtIcon,\n MFilePdfIcon,\n MFilePhpIcon,\n MFilePngIcon,\n MFilePptIcon,\n MFileRarIcon,\n MFileSvgIcon,\n MFileTextIcon,\n MFileTsIcon,\n MFileTsxIcon,\n MFileTxtIcon,\n MFileWebpIcon,\n MFileXlsIcon,\n MFileXmlIcon,\n MFileZipIcon,\n MFolderIcon,\n MFolderOpenIcon,\n} from '../../../icons'\nimport './MTreeView.css'\nconst fileTypeMap: Record<string, ReactNode> = {\n pdf: <MFilePdfIcon />,\n ts: <MFileTsIcon />,\n tsx: <MFileTsxIcon />,\n js: <MFileJsIcon />,\n jsx: <MFileCodeIcon />,\n css: <MFileCssIcon />,\n scss: <MFileCssIcon />,\n html: <MFileHtmlIcon />,\n json: <MFileJsonIcon />,\n md: <MFileMdIcon />,\n txt: <MFileTxtIcon />,\n csv: <MFileCsvIcon />,\n zip: <MFileZipIcon />,\n rar: <MFileRarIcon />,\n svg: <MFileSvgIcon />,\n png: <MFilePngIcon />,\n jpg: <MFileJpgIcon />,\n jpeg: <MFileImageIcon />,\n gif: <MFileGifIcon />,\n webp: <MFileWebpIcon />,\n php: <MFilePhpIcon />,\n xml: <MFileXmlIcon />,\n xls: <MFileXlsIcon />,\n ppt: <MFilePptIcon />,\n odt: <MFileOdtIcon />,\n exe: <MFileExeIcon />,\n mp3: <MFileMp3Icon />,\n mp4: <MFileMp4Icon />,\n}\n\n// Read the file extension once so icon logic stays predictable.\nfunction getFileExtension(label: string): string | null {\n const dot = label.lastIndexOf('.')\n if (dot < 1) return null\n return label.slice(dot + 1).toLowerCase()\n}\n\n// Treat explicit folders and nodes with children as directory-like.\nfunction isFolderNode(node: MTreeNode) {\n return node.kind === 'folder' || Boolean(node.children?.length)\n}\n\n// Resolve the proper file icon by extension.\nfunction getFileIcon(label: string): ReactNode {\n const ext = getFileExtension(label)\n if (!ext) return <MFileIcon />\n\n return fileTypeMap[ext] ?? <MFileTextIcon />\n}\n\n// Prefer custom icons first, then fall back to folder or file visuals.\nfunction getDefaultIcon(node: MTreeNode, isExpanded: boolean, fileIcons: boolean) {\n if (node.icon) return node.icon\n if (!fileIcons) return null\n\n if (isFolderNode(node)) return isExpanded ? <MFolderOpenIcon /> : <MFolderIcon />\n\n return getFileIcon(node.label)\n}\n\n// Cache nodes and descendants so drag-drop validation stays fast.\nfunction buildTreeLookup(items: MTreeNode[]) {\n const nodeMap = new Map<string, MTreeNode>()\n const descendants = new Map<string, Set<string>>()\n\n function walk(node: MTreeNode) {\n nodeMap.set(node.id, node)\n\n const childIds = new Set<string>()\n\n for (const child of node.children ?? []) {\n childIds.add(child.id)\n\n const nestedIds = walk(child)\n nestedIds.forEach((id) => childIds.add(id))\n }\n\n descendants.set(node.id, childIds)\n return childIds\n }\n\n items.forEach(walk)\n\n return {nodeMap, descendants}\n}\n\n// Keep the context menu inside the viewport.\nfunction clampMenuPosition(x: number, y: number) {\n if (typeof window === 'undefined') {\n return {x, y}\n }\n\n return {\n x: Math.max(8, Math.min(x, window.innerWidth - 220)),\n y: Math.max(8, Math.min(y, window.innerHeight - 16)),\n }\n}\n\n// Render one visible row and recurse into children when expanded.\nfunction TreeItem({\n node,\n level,\n expandable,\n selectable,\n expandedIds,\n selectedId,\n draggedId,\n dropTargetId,\n onToggle,\n onSelect,\n indent,\n showLines,\n fileIcons,\n draggable,\n canDropOnNode,\n onContextMenu,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n}: MTreeItemProps) {\n const hasChildren = isFolderNode(node)\n const isExpanded = expandedIds.has(node.id)\n const isSelected = selectedId === node.id\n const isDragging = draggedId === node.id\n const isDropTarget = dropTargetId === node.id\n const canDrop = canDropOnNode?.(node)\n const icon = getDefaultIcon(node, isExpanded, !!fileIcons)\n\n return (\n <li role=\"treeitem\" aria-expanded={hasChildren ? isExpanded : undefined}>\n <div\n className={cn(\n 'item',\n isSelected && 'selected',\n node.disabled && 'disabled',\n selectable && !node.disabled && 'selectable',\n draggable && !node.disabled && 'draggable',\n isDragging && 'dragging',\n canDrop && 'can-drop',\n isDropTarget && 'drop-target'\n )}\n style={{paddingLeft: level * indent}}\n draggable={draggable && !node.disabled}\n onClick={() => {\n if (node.disabled) return\n if (hasChildren && expandable) onToggle(node.id)\n if (selectable) onSelect?.(node.id, node)\n }}\n onContextMenu={(event) => onContextMenu?.(event, node)}\n onDragStart={(event) => onDragStart?.(event, node)}\n onDragOver={(event) => onDragOver?.(event, node)}\n onDrop={(event) => onDrop?.(event, node)}\n onDragEnd={onDragEnd}\n >\n <span className=\"toggle\">\n {hasChildren && expandable ? (\n <span className={cn('arrow', isExpanded && 'expanded')}>\n <MChevronRightIcon />\n </span>\n ) : (\n <span className=\"spacer\" />\n )}\n </span>\n {icon && <span className=\"icon\">{icon}</span>}\n <span className=\"label\">{node.label}</span>\n </div>\n {hasChildren && isExpanded && (\n <ul\n className=\"list\"\n role=\"group\"\n style={showLines ? ({'--line-left': `${level * indent + 17}px`} as CSSProperties) : undefined}\n >\n {(node.children ?? []).map((child) => (\n <TreeItem\n key={child.id}\n node={child}\n level={level + 1}\n expandable={expandable}\n selectable={selectable}\n expandedIds={expandedIds}\n selectedId={selectedId}\n draggedId={draggedId}\n dropTargetId={dropTargetId}\n onToggle={onToggle}\n onSelect={onSelect}\n indent={indent}\n showLines={showLines}\n fileIcons={fileIcons}\n draggable={draggable}\n canDropOnNode={canDropOnNode}\n onContextMenu={onContextMenu}\n onDragStart={onDragStart}\n onDragOver={onDragOver}\n onDrop={onDrop}\n onDragEnd={onDragEnd}\n />\n ))}\n </ul>\n )}\n </li>\n )\n}\n\n// Render a file tree with selection, context actions and folder moves.\nexport function MTreeView({\n items,\n expandable = true,\n selectable = false,\n defaultExpanded = [],\n expanded: controlledExpanded,\n onExpandChange,\n selected: controlledSelected,\n onSelect,\n indent = 20,\n showLines = true,\n fileIcons = true,\n draggable = false,\n canDrop,\n onMove,\n contextMenuItems,\n onContextMenuAction,\n className,\n ...rest\n}: MTreeViewProps) {\n const [internalExpanded, setInternalExpanded] = useState<string[]>(defaultExpanded)\n const [internalSelected, setInternalSelected] = useState<string | null>(null)\n const [draggedId, setDraggedId] = useState<string | null>(null)\n const [dropTargetId, setDropTargetId] = useState<string | null>(null)\n const [menu, setMenu] = useState<{\n node: MTreeNode\n items: MTreeViewContextMenuItem[]\n x: number\n y: number\n } | null>(null)\n const menuRef = useRef<HTMLDivElement>(null)\n\n const expandedArr = controlledExpanded ?? internalExpanded\n const expandedIds = new Set(expandedArr)\n const selectedId = controlledSelected !== undefined ? controlledSelected : internalSelected\n const {nodeMap, descendants} = buildTreeLookup(items)\n const draggedNode = draggedId ? (nodeMap.get(draggedId) ?? null) : null\n\n useEffect(() => {\n if (!menu) return\n\n function closeMenu(event?: Event) {\n if (event && menuRef.current && menuRef.current.contains(event.target as Node)) {\n return\n }\n\n setMenu(null)\n }\n\n function handleKey(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n setMenu(null)\n }\n }\n\n document.addEventListener('mousedown', closeMenu)\n document.addEventListener('scroll', closeMenu, true)\n window.addEventListener('resize', closeMenu)\n document.addEventListener('keydown', handleKey)\n\n return () => {\n document.removeEventListener('mousedown', closeMenu)\n document.removeEventListener('scroll', closeMenu, true)\n window.removeEventListener('resize', closeMenu)\n document.removeEventListener('keydown', handleKey)\n }\n }, [menu])\n\n function handleToggle(id: string) {\n const next = expandedIds.has(id) ? expandedArr.filter((e) => e !== id) : [...expandedArr, id]\n if (onExpandChange) onExpandChange(next)\n else setInternalExpanded(next)\n }\n\n function handleSelect(id: string, node: MTreeNode) {\n if (onSelect) onSelect(id, node)\n else setInternalSelected(id)\n }\n\n function closeDrag() {\n setDraggedId(null)\n setDropTargetId(null)\n }\n\n function isValidDropTarget(targetNode: MTreeNode) {\n if (!draggedNode || !draggable || !onMove) return false\n if (targetNode.disabled || !isFolderNode(targetNode)) return false\n if (targetNode.id === draggedNode.id) return false\n if (descendants.get(draggedNode.id)?.has(targetNode.id)) return false\n\n return canDrop ? canDrop(draggedNode, targetNode) : true\n }\n\n function handleContextMenu(event: MouseEvent<HTMLDivElement>, node: MTreeNode) {\n if (!contextMenuItems || node.disabled) return\n\n const items = contextMenuItems(node).filter(Boolean)\n if (!items.length) return\n\n event.preventDefault()\n handleSelect(node.id, node)\n\n const pos = clampMenuPosition(event.clientX, event.clientY)\n setMenu({\n node,\n items,\n x: pos.x,\n y: pos.y,\n })\n }\n\n function handleDragStart(event: DragEvent<HTMLDivElement>, node: MTreeNode) {\n if (!draggable || node.disabled) return\n\n event.dataTransfer.effectAllowed = 'move'\n event.dataTransfer.setData('text/plain', node.id)\n setMenu(null)\n setDraggedId(node.id)\n }\n\n function handleDragOver(event: DragEvent<HTMLDivElement>, targetNode: MTreeNode) {\n if (!isValidDropTarget(targetNode)) return\n\n event.preventDefault()\n event.dataTransfer.dropEffect = 'move'\n setDropTargetId(targetNode.id)\n }\n\n function handleDrop(event: DragEvent<HTMLDivElement>, targetNode: MTreeNode) {\n event.preventDefault()\n\n if (!draggedNode || !isValidDropTarget(targetNode)) {\n closeDrag()\n return\n }\n\n onMove?.({\n draggedId: draggedNode.id,\n draggedNode,\n targetId: targetNode.id,\n targetNode,\n } satisfies MTreeViewMoveEvent)\n\n if (expandable && !expandedIds.has(targetNode.id)) {\n handleToggle(targetNode.id)\n }\n\n closeDrag()\n }\n\n return (\n <div className={cn('tree', showLines && 'lines', className)} {...rest}>\n <ul className=\"list\" role=\"tree\">\n {items.map((item) => (\n <TreeItem\n key={item.id}\n node={item}\n level={0}\n expandable={expandable}\n selectable={selectable}\n expandedIds={expandedIds}\n selectedId={selectedId}\n draggedId={draggedId}\n dropTargetId={dropTargetId}\n onToggle={handleToggle}\n onSelect={handleSelect}\n indent={indent}\n showLines={showLines}\n fileIcons={fileIcons}\n draggable={draggable}\n canDropOnNode={isValidDropTarget}\n onContextMenu={handleContextMenu}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n onDragEnd={closeDrag}\n />\n ))}\n </ul>\n {menu && (\n <MPortal>\n <div ref={menuRef} className=\"tree menu\" style={{top: menu.y, left: menu.x}} role=\"menu\">\n {menu.items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n className={cn('action', item.color, item.disabled && 'disabled')}\n role=\"menuitem\"\n disabled={item.disabled}\n onClick={() => {\n if (item.disabled) return\n onContextMenuAction?.(item.id, menu.node)\n setMenu(null)\n }}\n >\n {item.icon && <span className=\"icon\">{item.icon}</span>}\n <span>{item.label}</span>\n </button>\n ))}\n </div>\n </MPortal>\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 strikethrough = true,\n onChange,\n className,\n ...rest\n}: MTaskListProps) {\n return (\n <div className={cn('task list', `color-${color}`, 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=\"sm\"\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 {useMemo, useState} from 'react'\nimport type {ReactNode} from 'react'\nimport type {\n MFileManagerActionEvent,\n MFileManagerLocale,\n MFileManagerMoveEvent,\n MFileManagerNode,\n MFileManagerProps,\n MFileManagerSelectionEvent,\n MFileManagerView,\n} from './MFileManager.types'\nimport {MButton} from '../../controls'\nimport {MBadge} from '../../feedback'\nimport {MInputSearch} from '../../inputs'\nimport {MInline, MStack} from '../../layout'\nimport {MDropdownItem, MDropdownMenu} from '../../overlays'\nimport {MText} from '../../typography'\nimport {MTreeView} from '../MTreeView'\nimport {\n MArrowRightIcon,\n MDownloadIcon,\n MEditIcon,\n MEllipsisVerticalIcon,\n MFileCodeIcon,\n MFileCsvIcon,\n MFileCssIcon,\n MFileExeIcon,\n MFileGifIcon,\n MFileHtmlIcon,\n MFileIcon,\n MFileImageIcon,\n MFileJpgIcon,\n MFileJsIcon,\n MFileJsonIcon,\n MFileMdIcon,\n MFileMp3Icon,\n MFileMp4Icon,\n MFileOdtIcon,\n MFilePdfIcon,\n MFilePhpIcon,\n MFilePngIcon,\n MFilePptIcon,\n MFileRarIcon,\n MFileSvgIcon,\n MFileTextIcon,\n MFileTsIcon,\n MFileTsxIcon,\n MFileTxtIcon,\n MFileWebpIcon,\n MFileXlsIcon,\n MFileXmlIcon,\n MFileZipIcon,\n MFolderPlusIcon,\n MFolderIcon,\n MFolderOpenIcon,\n MHomeIcon,\n MTrashIcon,\n} from '../../../icons'\nimport {useMFileManagerTexts} from '../../../i18n/frameworkTexts'\nimport {cn} from '../../../utils/cn'\nimport {useDocumentLocale} from '../../../utils/locale'\nimport './MFileManager.css'\n\ninterface FileManagerMenuAction {\n id: string\n label: ReactNode\n icon?: ReactNode\n color?: 'primary' | 'error'\n}\n\nconst fileTypeMap: Record<string, ReactNode> = {\n pdf: <MFilePdfIcon />,\n ts: <MFileTsIcon />,\n tsx: <MFileTsxIcon />,\n js: <MFileJsIcon />,\n jsx: <MFileCodeIcon />,\n css: <MFileCssIcon />,\n scss: <MFileCssIcon />,\n html: <MFileHtmlIcon />,\n json: <MFileJsonIcon />,\n md: <MFileMdIcon />,\n txt: <MFileTxtIcon />,\n csv: <MFileCsvIcon />,\n zip: <MFileZipIcon />,\n rar: <MFileRarIcon />,\n svg: <MFileSvgIcon />,\n png: <MFilePngIcon />,\n jpg: <MFileJpgIcon />,\n jpeg: <MFileImageIcon />,\n gif: <MFileGifIcon />,\n webp: <MFileWebpIcon />,\n php: <MFilePhpIcon />,\n xml: <MFileXmlIcon />,\n xls: <MFileXlsIcon />,\n ppt: <MFilePptIcon />,\n odt: <MFileOdtIcon />,\n exe: <MFileExeIcon />,\n mp3: <MFileMp3Icon />,\n mp4: <MFileMp4Icon />,\n}\n\nfunction getFileExtension(label: string): string | null {\n const dot = label.lastIndexOf('.')\n if (dot < 1) return null\n return label.slice(dot + 1).toLowerCase()\n}\n\nfunction isFolderNode(node: MFileManagerNode | null | undefined) {\n return node?.kind === 'folder' || Boolean(node?.children?.length)\n}\n\nfunction getFileIcon(label: string): ReactNode {\n const ext = getFileExtension(label)\n if (!ext) return <MFileIcon />\n\n return fileTypeMap[ext] ?? <MFileTextIcon />\n}\n\nfunction getNodeIcon(node: MFileManagerNode, isExpanded = false): ReactNode {\n if (node.icon) return node.icon\n if (isFolderNode(node)) return isExpanded ? <MFolderOpenIcon /> : <MFolderIcon />\n return getFileIcon(node.label)\n}\n\nfunction formatBytes(value?: number) {\n if (!value || value < 1) return null\n\n const units = ['B', 'KB', 'MB', 'GB', 'TB']\n let current = value\n let index = 0\n\n while (current >= 1024 && index < units.length - 1) {\n current /= 1024\n index += 1\n }\n\n const digits = current >= 100 || index === 0 ? 0 : 1\n return `${current.toFixed(digits)} ${units[index]}`\n}\n\nfunction formatModifiedAt(value: Date | string | undefined, locale: MFileManagerLocale) {\n if (!value) return null\n\n const date = value instanceof Date ? value : new Date(value)\n if (Number.isNaN(date.getTime())) return null\n\n return new Intl.DateTimeFormat(locale, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n }).format(date)\n}\n\nfunction buildLookup(items: MFileManagerNode[]) {\n const nodeMap = new Map<string, MFileManagerNode>()\n const parentMap = new Map<string, string | null>()\n\n function walk(nodes: MFileManagerNode[], parentId: string | null) {\n for (const node of nodes) {\n nodeMap.set(node.id, node)\n parentMap.set(node.id, parentId)\n\n if (node.children?.length) {\n walk(node.children, node.id)\n }\n }\n }\n\n walk(items, null)\n\n return {nodeMap, parentMap}\n}\n\nfunction buildFolderTree(items: MFileManagerNode[]): MFileManagerNode[] {\n return items.flatMap((node) => {\n if (!isFolderNode(node)) return []\n\n return [\n {\n ...node,\n kind: 'folder',\n children: buildFolderTree(node.children ?? []),\n },\n ]\n })\n}\n\nfunction buildPath(id: string | null, nodeMap: Map<string, MFileManagerNode>, parentMap: Map<string, string | null>) {\n const path: MFileManagerNode[] = []\n let currentId = id\n\n while (currentId) {\n const node = nodeMap.get(currentId)\n if (!node) break\n path.unshift(node)\n currentId = parentMap.get(currentId) ?? null\n }\n\n return path\n}\n\nfunction resolveFolderId(\n value: string | null | undefined,\n nodeMap: Map<string, MFileManagerNode>,\n parentMap: Map<string, string | null>\n) {\n if (!value) return null\n\n const node = nodeMap.get(value)\n if (!node) return null\n if (isFolderNode(node)) return node.id\n\n return parentMap.get(node.id) ?? null\n}\n\nfunction getCurrentItems(activeFolder: MFileManagerNode | null, items: MFileManagerNode[]) {\n return activeFolder ? (activeFolder.children ?? []) : items\n}\n\nfunction makeSelectionEvent(\n id: string | null,\n nodeMap: Map<string, MFileManagerNode>,\n parentMap: Map<string, string | null>,\n activeFolderId: string | null,\n activeFolder: MFileManagerNode | null\n): MFileManagerSelectionEvent {\n const node = id ? (nodeMap.get(id) ?? null) : null\n const parentId = node ? (parentMap.get(node.id) ?? null) : null\n\n return {\n id,\n node,\n parentId,\n parentNode: parentId ? (nodeMap.get(parentId) ?? null) : null,\n activeFolderId,\n activeFolder,\n }\n}\n\nfunction getDefaultItemActions(\n node: MFileManagerNode,\n texts: ReturnType<typeof useMFileManagerTexts>\n): FileManagerMenuAction[] {\n return [\n ...(isFolderNode(node)\n ? []\n : [{id: 'download', label: texts.download, icon: <MDownloadIcon />, color: 'primary' as const}]),\n {id: 'rename', label: texts.rename, icon: <MEditIcon />},\n {id: 'move', label: texts.moveTo, icon: <MArrowRightIcon />},\n {id: 'delete', label: texts.delete, icon: <MTrashIcon />, color: 'error' as const},\n ]\n}\n\nfunction getDefaultContextMenuActions(\n node: MFileManagerNode,\n texts: ReturnType<typeof useMFileManagerTexts>\n): FileManagerMenuAction[] {\n return [\n ...(isFolderNode(node) ? [{id: 'new-folder', label: texts.newFolder, icon: <MFolderPlusIcon />}] : []),\n ...getDefaultItemActions(node, texts),\n ]\n}\n\nexport function MFileManager({\n items,\n locale: localeOverride,\n defaultExpanded = [],\n expanded,\n onExpandChange,\n folderId: controlledFolderId,\n defaultFolderId = null,\n onFolderChange,\n selectedId: controlledSelectedId,\n onSelectionChange,\n view: controlledView,\n defaultView = 'list',\n onViewChange,\n searchValue: controlledSearch,\n defaultSearchValue = '',\n onSearchChange,\n searchable = true,\n searchPlaceholder,\n showSidebar = true,\n showPreview = true,\n emptyText,\n toolbarActions = [],\n onToolbarAction,\n onOpenItem,\n onItemAction,\n onContextMenuAction,\n canDrop,\n onMove,\n renderPreview,\n className,\n ...rest\n}: MFileManagerProps) {\n const locale = useDocumentLocale(localeOverride)\n const texts = useMFileManagerTexts()\n const [internalFolderId, setInternalFolderId] = useState<string | null>(defaultFolderId)\n const [internalSelectedId, setInternalSelectedId] = useState<string | null>(null)\n const [internalView, setInternalView] = useState<MFileManagerView>(defaultView)\n const [internalSearch, setInternalSearch] = useState(defaultSearchValue)\n\n const {nodeMap, parentMap} = useMemo(() => buildLookup(items), [items])\n const folderTree = useMemo(() => buildFolderTree(items), [items])\n\n const rawFolderId = controlledFolderId !== undefined ? controlledFolderId : internalFolderId\n const activeFolderId = resolveFolderId(rawFolderId, nodeMap, parentMap)\n const activeFolder = activeFolderId ? (nodeMap.get(activeFolderId) ?? null) : null\n\n const rawSelectedId = controlledSelectedId !== undefined ? controlledSelectedId : internalSelectedId\n const selectedNode = rawSelectedId ? (nodeMap.get(rawSelectedId) ?? null) : null\n const selectedId = selectedNode ? selectedNode.id : null\n\n const activeView = controlledView ?? internalView\n const search = controlledSearch ?? internalSearch\n const currentItems = getCurrentItems(activeFolder, items)\n const query = search.trim().toLowerCase()\n const activePath = buildPath(activeFolderId, nodeMap, parentMap)\n const effectiveSearchPlaceholder = searchPlaceholder ?? texts.searchPlaceholder\n const effectiveEmptyText = emptyText ?? texts.emptyText\n const hasNodeActionHandler = Boolean(onItemAction || onContextMenuAction)\n\n const visibleItems = useMemo(() => {\n if (!query) return currentItems\n\n return currentItems.filter((item) => item.label.toLowerCase().includes(query))\n }, [currentItems, query])\n\n function changeFolder(nextId: string | null) {\n const nextFolderId = resolveFolderId(nextId, nodeMap, parentMap)\n const nextFolder = nextFolderId ? (nodeMap.get(nextFolderId) ?? null) : null\n\n if (onFolderChange) onFolderChange(nextFolderId, nextFolder)\n else setInternalFolderId(nextFolderId)\n }\n\n function changeSelection(\n nextId: string | null,\n nextActiveFolderId = activeFolderId,\n nextActiveFolder = activeFolder\n ) {\n const event = makeSelectionEvent(nextId, nodeMap, parentMap, nextActiveFolderId, nextActiveFolder)\n\n if (onSelectionChange) onSelectionChange(event)\n else setInternalSelectedId(nextId)\n }\n\n function changeView(nextView: MFileManagerView) {\n if (onViewChange) onViewChange(nextView)\n else setInternalView(nextView)\n }\n\n function changeSearch(nextSearch: string) {\n if (onSearchChange) onSearchChange(nextSearch)\n else setInternalSearch(nextSearch)\n }\n\n function handleFolderSelect(id: string, node: MFileManagerNode) {\n changeFolder(id)\n changeSelection(id, node.id, node)\n }\n\n function handleItemClick(node: MFileManagerNode) {\n if (isFolderNode(node)) {\n changeFolder(node.id)\n changeSelection(node.id, node.id, node)\n return\n }\n\n changeSelection(node.id)\n }\n\n function emitToolbarAction(actionId: string) {\n if (!onToolbarAction) return\n\n const baseEvent = makeSelectionEvent(selectedId, nodeMap, parentMap, activeFolderId, activeFolder)\n onToolbarAction({\n ...baseEvent,\n actionId,\n visibleItems,\n } satisfies MFileManagerActionEvent)\n }\n\n function emitItemAction(actionId: string, node: MFileManagerNode) {\n ;(onItemAction ?? onContextMenuAction)?.(actionId, node)\n }\n\n function emitContextMenuAction(actionId: string, node: MFileManagerNode) {\n ;(onContextMenuAction ?? onItemAction)?.(actionId, node)\n }\n\n function renderItemMeta(node: MFileManagerNode) {\n const details = []\n const size = formatBytes(node.size)\n const modifiedAt = formatModifiedAt(node.modifiedAt, locale)\n\n if (isFolderNode(node)) {\n details.push(texts.itemsCount(node.children?.length ?? 0))\n }\n\n if (size) {\n details.push(size)\n }\n\n if (modifiedAt) {\n details.push(modifiedAt)\n }\n\n return details.join(' / ')\n }\n\n return (\n <div\n className={cn('file-manager', !showSidebar && 'no-sidebar', !showPreview && 'no-preview', className)}\n {...rest}\n >\n <div className=\"toolbar\">\n <div className=\"toolbar-main\">\n <div className=\"breadcrumbs\">\n <button type=\"button\" className=\"breadcrumb root\" onClick={() => changeFolder(null)}>\n <MHomeIcon />\n <MText as=\"span\" weight=\"semibold\">\n {texts.home}\n </MText>\n </button>\n {activePath.map((node) => (\n <div key={node.id} className=\"breadcrumbs\">\n <span className=\"breadcrumb-separator\">/</span>\n <button type=\"button\" className=\"breadcrumb\" onClick={() => changeFolder(node.id)}>\n <MText as=\"span\">{node.label}</MText>\n </button>\n </div>\n ))}\n </div>\n {searchable && (\n <MInputSearch\n className=\"toolbar-search\"\n size=\"sm\"\n placeholder={effectiveSearchPlaceholder}\n value={search}\n onChange={(event) => changeSearch(event.target.value)}\n onClear={() => changeSearch('')}\n />\n )}\n </div>\n <div className=\"toolbar-actions\">\n {toolbarActions.map((action) => (\n <MButton\n key={action.id}\n size=\"sm\"\n variant={action.variant ?? 'ghost'}\n color={action.color}\n disabled={action.disabled}\n onClick={() => emitToolbarAction(action.id)}\n startIcon={action.icon}\n >\n {action.label}\n </MButton>\n ))}\n <div className=\"view-switch\">\n <MButton\n size=\"sm\"\n variant={activeView === 'list' ? 'secondary' : 'ghost'}\n onClick={() => changeView('list')}\n >\n {texts.listView}\n </MButton>\n <MButton\n size=\"sm\"\n variant={activeView === 'grid' ? 'secondary' : 'ghost'}\n onClick={() => changeView('grid')}\n >\n {texts.gridView}\n </MButton>\n </div>\n </div>\n </div>\n\n <div className=\"body\">\n {showSidebar && (\n <aside className=\"panel\">\n <div className=\"panel-header\">\n <MText weight=\"semibold\">{texts.folders}</MText>\n <MBadge size=\"sm\" color=\"info\">\n {folderTree.length}\n </MBadge>\n </div>\n <div className=\"panel-body sidebar-body\">\n {folderTree.length > 0 ? (\n <MTreeView\n items={folderTree}\n selectable\n fileIcons\n defaultExpanded={defaultExpanded}\n expanded={expanded}\n onExpandChange={onExpandChange}\n selected={activeFolderId}\n onSelect={(id, node) => handleFolderSelect(id, node as MFileManagerNode)}\n draggable={Boolean(onMove)}\n canDrop={\n canDrop\n ? (draggedNode, targetNode) =>\n canDrop(\n draggedNode as MFileManagerNode,\n targetNode as MFileManagerNode\n )\n : undefined\n }\n onMove={\n onMove\n ? (event) =>\n onMove({\n draggedId: event.draggedId,\n draggedNode: event.draggedNode as MFileManagerNode,\n targetId: event.targetId,\n targetNode: event.targetNode as MFileManagerNode,\n } satisfies MFileManagerMoveEvent)\n : undefined\n }\n contextMenuItems={\n hasNodeActionHandler\n ? (node) => getDefaultContextMenuActions(node as MFileManagerNode, texts)\n : undefined\n }\n onContextMenuAction={\n hasNodeActionHandler\n ? (actionId, node) =>\n emitContextMenuAction(actionId, node as MFileManagerNode)\n : undefined\n }\n />\n ) : (\n <div className=\"empty-state\">{texts.noFoldersAvailable}</div>\n )}\n </div>\n </aside>\n )}\n\n <section className=\"panel\">\n <div className=\"panel-header\">\n <MInline align=\"center\" wrap=\"wrap\">\n <MText weight=\"semibold\">{activeFolder?.label ?? texts.home}</MText>\n <MBadge size=\"sm\">{visibleItems.length}</MBadge>\n </MInline>\n <MText size=\"sm\" tone=\"muted\">\n {query ? texts.filteredBy(search) : texts.currentFolder}\n </MText>\n </div>\n <div className=\"panel-body\">\n {visibleItems.length > 0 ? (\n <div className={cn('content-items', activeView)}>\n {visibleItems.map((node) => {\n const isSelected = selectedId === node.id\n const itemMeta = renderItemMeta(node)\n const actions = hasNodeActionHandler ? getDefaultItemActions(node, texts) : []\n\n return (\n <div key={node.id} className={cn('item-card', isSelected && 'selected')}>\n <button\n type=\"button\"\n className=\"item-card-main\"\n onClick={() => handleItemClick(node)}\n onDoubleClick={() => onOpenItem?.(node)}\n >\n <span className=\"item-icon\">{getNodeIcon(node)}</span>\n <span className=\"item-text\">\n <MText as=\"span\" weight=\"semibold\" truncate>\n {node.label}\n </MText>\n {node.description ? (\n <MText as=\"span\" size=\"sm\" tone=\"muted\" truncate={2}>\n {node.description}\n </MText>\n ) : null}\n <span className=\"item-meta\">\n <MBadge\n size=\"sm\"\n color={isFolderNode(node) ? 'info' : 'primary'}\n >\n {isFolderNode(node) ? texts.folder : texts.file}\n </MBadge>\n {itemMeta ? (\n <MText as=\"span\" size=\"sm\" tone=\"muted\" truncate>\n {itemMeta}\n </MText>\n ) : null}\n </span>\n </span>\n </button>\n {actions.length > 0 ? (\n <div className=\"item-card-actions\">\n <MDropdownMenu\n placement=\"bottom-end\"\n trigger={\n <MButton\n aria-label={`${texts.preview}: ${node.label}`}\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n >\n <MEllipsisVerticalIcon />\n </MButton>\n }\n >\n {actions.map((action) => (\n <MDropdownItem\n key={action.id}\n icon={action.icon}\n label={action.label}\n color={action.color}\n onClick={() => emitItemAction(action.id, node)}\n />\n ))}\n </MDropdownMenu>\n </div>\n ) : null}\n </div>\n )\n })}\n </div>\n ) : (\n <div className=\"empty-state\">{effectiveEmptyText}</div>\n )}\n </div>\n </section>\n\n {showPreview && (\n <aside className=\"panel\">\n <div className=\"panel-header\">\n <MText weight=\"semibold\">{texts.preview}</MText>\n {selectedNode ? (\n <MBadge size=\"sm\" color={isFolderNode(selectedNode) ? 'info' : 'primary'}>\n {isFolderNode(selectedNode) ? texts.folder : texts.file}\n </MBadge>\n ) : null}\n </div>\n <div className=\"panel-body\">\n {selectedNode ? (\n <MStack>\n <div className=\"preview-visual\">\n {renderPreview ? (\n renderPreview(selectedNode)\n ) : selectedNode.preview ? (\n selectedNode.preview\n ) : (\n <span className=\"preview-icon\">{getNodeIcon(selectedNode, true)}</span>\n )}\n </div>\n <MText weight=\"semibold\">{selectedNode.label}</MText>\n {selectedNode.description ? (\n <MText size=\"sm\" tone=\"muted\">\n {selectedNode.description}\n </MText>\n ) : null}\n <div className=\"preview-meta\">\n <MBadge size=\"sm\" color={isFolderNode(selectedNode) ? 'info' : 'primary'}>\n {isFolderNode(selectedNode) ? texts.folder : texts.file}\n </MBadge>\n {formatBytes(selectedNode.size) ? (\n <MBadge size=\"sm\">{formatBytes(selectedNode.size)}</MBadge>\n ) : null}\n {formatModifiedAt(selectedNode.modifiedAt, locale) ? (\n <MBadge size=\"sm\" color=\"neutral\">\n {formatModifiedAt(selectedNode.modifiedAt, locale)}\n </MBadge>\n ) : null}\n </div>\n <MText size=\"sm\" tone=\"muted\">\n {texts.path}:{' '}\n {[\n texts.home,\n ...buildPath(selectedNode.id, nodeMap, parentMap).map((node) => node.label),\n ].join(' / ')}\n </MText>\n </MStack>\n ) : (\n <div className=\"preview-empty\">{texts.selectItemToInspect}</div>\n )}\n </div>\n </aside>\n )}\n </div>\n </div>\n )\n}\n","import {useEffect, useMemo, useRef, useState} from 'react'\nimport type {ReactNode, RefObject} from 'react'\nimport type {\n MCalendarBoardLocale,\n MCalendarBoardProps,\n MCalendarBoardView,\n MCalendarDayCellProps,\n MCalendarDetailsMode,\n MCalendarEvent,\n MCalendarEventItemProps,\n MCalendarEventListProps,\n MCalendarEventPopoverProps,\n MCalendarFilterOption,\n MCalendarTimelineProps,\n MCalendarTimelineSlotState,\n} from './MCalendarBoard.types'\nimport {cn} from '../../../utils/cn'\nimport {useMCalendarBoardTexts, useMDatePickerTexts} from '../../../i18n/frameworkTexts'\nimport {useDocumentLocale} from '../../../utils/locale'\nimport {MButton} from '../../controls'\nimport {MBadge} from '../../feedback'\nimport {MCard, MCardBody} from '../../cards'\nimport {MAvatar} from '../../media'\nimport {MModal} from '../../overlays'\nimport {MPopover} from '../../primitives'\nimport {MHeading, MText} from '../../typography'\nimport {MStack} from '../../layout'\nimport {MBreakpoints} from '../../../theme'\nimport './MCalendarBoard.css'\n\ninterface CalendarDetailsContentProps {\n date: Date | null\n events: MCalendarEvent[]\n locale: MCalendarBoardLocale\n timelineStartHour: number\n timelineEndHour: number\n showTimeline: boolean\n emptyStateText: string\n renderEventItem?: (event: MCalendarEvent) => ReactNode\n}\n\ninterface CalendarWeekViewProps {\n days: Date[]\n eventsByDay: Map<string, MCalendarEvent[]>\n selectedDate: Date | null\n activeDate: Date | null\n onDayInteract: (date: Date, target: HTMLElement, events: MCalendarEvent[]) => void\n onDayHover: (date: Date, target: HTMLElement, events: MCalendarEvent[]) => void\n onDayLeave: () => void\n dayBadge?: MCalendarBoardProps['dayBadge']\n renderDayCell?: MCalendarBoardProps['renderDayCell']\n}\n\nfunction stripTime(date: Date) {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate())\n}\n\nfunction normalizeDate(value?: Date | string | null) {\n if (!value) {\n return null\n }\n\n if (value instanceof Date) {\n return stripTime(value)\n }\n\n const parsed = new Date(value)\n if (Number.isNaN(parsed.getTime())) {\n return null\n }\n\n return stripTime(parsed)\n}\n\nfunction getDateKey(date: Date) {\n const year = date.getFullYear()\n const month = String(date.getMonth() + 1).padStart(2, '0')\n const day = String(date.getDate()).padStart(2, '0')\n\n return `${year}-${month}-${day}`\n}\n\nfunction getEventDate(event: MCalendarEvent) {\n return normalizeDate(event.date)\n}\n\nfunction addDays(date: Date, amount: number) {\n const nextDate = new Date(date)\n nextDate.setDate(nextDate.getDate() + amount)\n return stripTime(nextDate)\n}\n\nfunction startOfWeek(date: Date, weekStartsOn: 0 | 1) {\n const safeDate = stripTime(date)\n const day = safeDate.getDay()\n const delta = (day - weekStartsOn + 7) % 7\n return addDays(safeDate, -delta)\n}\n\nfunction sortEventsByTime(events: MCalendarEvent[]) {\n return [...events].sort((leftEvent, rightEvent) => {\n const leftTime = leftEvent.startTime ?? '99:99'\n const rightTime = rightEvent.startTime ?? '99:99'\n return leftTime.localeCompare(rightTime)\n })\n}\n\nfunction buildMonthGrid(month: Date, weekStartsOn: 0 | 1) {\n const monthStart = new Date(month.getFullYear(), month.getMonth(), 1)\n const gridStart = startOfWeek(monthStart, weekStartsOn)\n\n return Array.from({length: 42}, (_, index) => addDays(gridStart, index))\n}\n\nfunction getStatusColor(status?: MCalendarEvent['status']) {\n switch (status) {\n case 'active':\n return 'rgba(14, 165, 233, 1)'\n case 'done':\n return 'rgba(34, 197, 94, 1)'\n case 'cancelled':\n return 'rgba(239, 68, 68, 1)'\n default:\n return 'rgba(245, 158, 11, 1)'\n }\n}\n\nfunction formatBoardDate(date: Date, locale: MCalendarBoardLocale) {\n return new Intl.DateTimeFormat(locale, {\n weekday: 'long',\n day: 'numeric',\n month: 'long',\n year: 'numeric',\n }).format(date)\n}\n\nfunction formatWeekRange(startDate: Date, locale: MCalendarBoardLocale) {\n const endDate = addDays(startDate, 6)\n const formatter = new Intl.DateTimeFormat(locale, {\n day: 'numeric',\n month: 'short',\n })\n\n return `${formatter.format(startDate)} - ${formatter.format(endDate)}`\n}\n\nfunction formatEventTime(event: MCalendarEvent, texts: ReturnType<typeof useMCalendarBoardTexts>) {\n if (event.startTime && event.endTime) {\n return `${event.startTime} - ${event.endTime}`\n }\n\n if (event.startTime) {\n return event.startTime\n }\n\n return texts.allDay\n}\n\nfunction getTimelineSlotState(date: Date, hour: number): MCalendarTimelineSlotState {\n const now = new Date()\n const slotStart = new Date(date)\n slotStart.setHours(hour, 0, 0, 0)\n const slotEnd = new Date(slotStart)\n slotEnd.setHours(hour + 1, 0, 0, 0)\n\n if (slotEnd <= now) {\n return 'past'\n }\n\n if (slotStart <= now && slotEnd > now) {\n return 'active'\n }\n\n return 'upcoming'\n}\n\nfunction buildDayMarkers(events: MCalendarEvent[]) {\n return sortEventsByTime(events)\n .slice(0, 4)\n .map((event) => (\n <span\n key={event.id}\n className={'marker'}\n style={{background: event.color ?? getStatusColor(event.status)}}\n aria-hidden={'true'}\n />\n ))\n}\n\nfunction applyCalendarFilters(events: MCalendarEvent[], filters: MCalendarFilterOption[], activeFilterIds: string[]) {\n if (!filters.length || !activeFilterIds.length) {\n return events\n }\n\n const activeFilters = filters.filter((filterOption) => activeFilterIds.includes(filterOption.id))\n if (!activeFilters.length) {\n return events\n }\n\n return events.filter((event) => activeFilters.some((filterOption) => filterOption.predicate(event)))\n}\n\nfunction getViewTitle(month: Date, view: MCalendarBoardView, locale: MCalendarBoardLocale, weekStartsOn: 0 | 1) {\n if (view === 'week') {\n return formatWeekRange(startOfWeek(month, weekStartsOn), locale)\n }\n\n return new Intl.DateTimeFormat(locale, {\n month: 'long',\n year: 'numeric',\n }).format(month)\n}\n\nfunction getViewSubtitle(view: MCalendarBoardView, texts: ReturnType<typeof useMCalendarBoardTexts>) {\n return view === 'week' ? texts.weekView : texts.monthView\n}\n\nfunction CalendarDetailsContent({\n date,\n events,\n locale,\n timelineStartHour,\n timelineEndHour,\n showTimeline,\n emptyStateText,\n renderEventItem,\n}: CalendarDetailsContentProps) {\n if (!date) {\n return null\n }\n\n const texts = useMCalendarBoardTexts()\n\n return (\n <MStack>\n <MStack>\n <MHeading level={4}>{formatBoardDate(date, locale)}</MHeading>\n <MText tone={'muted'} size={'sm'}>\n {events.length > 0 ? texts.itemsCount(events.length) : emptyStateText}\n </MText>\n </MStack>\n <MCalendarEventList\n events={events}\n locale={locale}\n currentDate={date}\n emptyStateText={emptyStateText}\n renderEventItem={renderEventItem}\n />\n {showTimeline && (\n <MCalendarTimeline\n date={date}\n events={events}\n locale={locale}\n startHour={timelineStartHour}\n endHour={timelineEndHour}\n />\n )}\n </MStack>\n )\n}\n\nfunction CalendarFilters({\n filters,\n activeFilterIds,\n onToggle,\n}: {\n filters: MCalendarFilterOption[]\n activeFilterIds: string[]\n onToggle: (filterId: string) => void\n}) {\n if (!filters.length) {\n return null\n }\n\n return (\n <div className={'calendar filters'}>\n {filters.map((filterOption) => {\n const isActive = activeFilterIds.includes(filterOption.id)\n\n return (\n <MButton\n key={filterOption.id}\n type={'button'}\n size={'sm'}\n variant=\"outlined\"\n color={isActive ? 'primary' : 'neutral'}\n active={isActive}\n className={'calendar filter button'}\n onClick={() => onToggle(filterOption.id)}\n >\n {filterOption.label}\n </MButton>\n )\n })}\n </div>\n )\n}\nfunction CalendarWeekView({\n days,\n eventsByDay,\n selectedDate,\n activeDate,\n onDayInteract,\n onDayHover,\n onDayLeave,\n dayBadge,\n renderDayCell,\n}: CalendarWeekViewProps) {\n const todayKey = getDateKey(stripTime(new Date()))\n\n return (\n <div className={'calendar week'}>\n {days.map((day) => {\n const dayKey = getDateKey(day)\n const dayEvents = eventsByDay.get(dayKey) ?? []\n const badge =\n dayBadge?.(day, dayEvents) ??\n (dayEvents.length > 0 ? <MBadge size={'sm'}>{dayEvents.length}</MBadge> : null)\n const markers = buildDayMarkers(dayEvents)\n const isSelected = Boolean(selectedDate && getDateKey(selectedDate) === dayKey)\n const context = {\n date: day,\n events: dayEvents,\n badge,\n isToday: dayKey === todayKey,\n isSelected,\n isOutsideMonth: false,\n }\n\n return (\n <div key={dayKey} className={'calendar week column'}>\n <MCalendarDayCell\n date={day}\n events={dayEvents}\n badge={badge}\n markers={markers}\n isToday={context.isToday}\n isSelected={isSelected || Boolean(activeDate && getDateKey(activeDate) === dayKey)}\n isOutsideMonth={false}\n onClick={(event) => onDayInteract(day, event.currentTarget, dayEvents)}\n onMouseEnter={(event) => onDayHover(day, event.currentTarget, dayEvents)}\n onMouseLeave={onDayLeave}\n >\n {renderDayCell ? renderDayCell(day, context) : undefined}\n </MCalendarDayCell>\n </div>\n )\n })}\n </div>\n )\n}\n\nexport function MCalendarDayCell({\n date,\n events = [],\n badge,\n markers,\n isToday = false,\n isSelected = false,\n isOutsideMonth = false,\n className,\n children,\n ...rest\n}: MCalendarDayCellProps) {\n return (\n <button\n type={'button'}\n className={cn(\n 'calendar day cell',\n isToday && 'today',\n isSelected && 'selected',\n isOutsideMonth && 'outside-month',\n className\n )}\n {...rest}\n >\n {children ?? (\n <>\n <div className={'day header'}>\n <span className={'day number'}>{date.getDate()}</span>\n <div className={'day meta'}>{badge}</div>\n </div>\n <div className={'markers'}>{markers ?? buildDayMarkers(events)}</div>\n </>\n )}\n </button>\n )\n}\n\nexport function MCalendarEventItem({\n event,\n locale: localeOverride,\n className,\n currentDate,\n ...rest\n}: MCalendarEventItemProps) {\n const locale = useDocumentLocale(localeOverride)\n const texts = useMCalendarBoardTexts()\n const statusColor =\n event.status === 'cancelled'\n ? 'error'\n : event.status === 'done'\n ? 'success'\n : event.status === 'active'\n ? 'info'\n : 'warning'\n\n return (\n <div className={cn('calendar event item', className)} {...rest}>\n <div className={'event time'}>{formatEventTime(event, texts)}</div>\n <div className={'event content'}>\n <div className={'event title row'}>\n <MHeading level={5}>{event.title}</MHeading>\n {event.status && (\n <MBadge color={statusColor} size={'sm'}>\n {event.status}\n </MBadge>\n )}\n </div>\n {event.description && (\n <MText size={'sm'} tone={'muted'}>\n {event.description}\n </MText>\n )}\n <div className={'event details'}>\n {event.type && (\n <MBadge color={'neutral'} size={'sm'}>\n {event.type}\n </MBadge>\n )}\n {event.badgeLabel && <MBadge size={'sm'}>{event.badgeLabel}</MBadge>}\n {event.user && (\n <span className={'event user'}>\n <MAvatar\n size={'sm'}\n src={event.user.avatar}\n name={event.user.name}\n backgroundColor={event.user.color}\n />\n {event.user.name}\n </span>\n )}\n {!event.startTime && !event.endTime && currentDate && (\n <MText size={'sm'} tone={'muted'}>\n {formatBoardDate(currentDate, locale)}\n </MText>\n )}\n </div>\n </div>\n </div>\n )\n}\n\nexport function MCalendarEventList({\n events,\n locale: localeOverride,\n currentDate,\n emptyStateText,\n renderEventItem,\n className,\n ...rest\n}: MCalendarEventListProps) {\n const locale = useDocumentLocale(localeOverride)\n const texts = useMCalendarBoardTexts()\n\n if (!events.length) {\n return (\n <MText size={'sm'} tone={'muted'} className={cn('calendar event list', className)} {...rest}>\n {emptyStateText ?? texts.emptyStateText}\n </MText>\n )\n }\n\n return (\n <div className={cn('calendar event list', className)} {...rest}>\n <MStack>\n {sortEventsByTime(events).map((event) =>\n renderEventItem ? (\n <div key={event.id}>{renderEventItem(event)}</div>\n ) : (\n <MCalendarEventItem key={event.id} event={event} locale={locale} currentDate={currentDate} />\n )\n )}\n </MStack>\n </div>\n )\n}\nexport function MCalendarTimeline({\n date,\n events,\n locale: localeOverride,\n startHour = 6,\n endHour = 22,\n emptyStateText,\n className,\n ...rest\n}: MCalendarTimelineProps) {\n const locale = useDocumentLocale(localeOverride)\n const texts = useMCalendarBoardTexts()\n const hours = Array.from({length: Math.max(endHour - startHour + 1, 1)}, (_, index) => startHour + index)\n\n return (\n <div className={cn('calendar timeline', className)} {...rest}>\n <MStack>\n <MHeading level={5}>{texts.timelineTitle}</MHeading>\n <div className={'timeline slots'}>\n {hours.map((hour) => {\n const matchingEvents = events.filter((event) => {\n if (!event.startTime) {\n return false\n }\n\n return Number(event.startTime.split(':')[0]) === hour\n })\n const slotState = getTimelineSlotState(date, hour)\n\n return (\n <div key={hour} className={cn('timeline slot', slotState)}>\n <div className={'slot time'}>{`${String(hour).padStart(2, '0')}:00`}</div>\n <div className={'slot line'} />\n <div className={'slot content'}>\n {matchingEvents.length > 0 ? (\n <MStack>\n {matchingEvents.map((event) => (\n <div key={event.id} className={'slot event'}>\n <span\n className={'slot event dot'}\n style={{\n background: event.color ?? getStatusColor(event.status),\n }}\n />\n <MText size={'sm'}>{event.title}</MText>\n </div>\n ))}\n </MStack>\n ) : (\n <MText size={'sm'} tone={'muted'}>\n {emptyStateText ?? texts.timelineEmptyState}\n </MText>\n )}\n </div>\n </div>\n )\n })}\n </div>\n </MStack>\n </div>\n )\n}\n\nexport function MCalendarEventPopover({\n open,\n anchorRef,\n onClose,\n onPointerEnter,\n onPointerLeave,\n date,\n events,\n locale: localeOverride,\n timelineStartHour = 6,\n timelineEndHour = 22,\n showTimeline = true,\n emptyStateText,\n renderEventItem,\n className,\n style,\n}: MCalendarEventPopoverProps) {\n const locale = useDocumentLocale(localeOverride)\n const texts = useMCalendarBoardTexts()\n\n return (\n <MPopover\n open={open}\n anchorRef={anchorRef}\n onClose={onClose}\n placement={'bottom-start'}\n className={cn('calendar popover', className)}\n style={style}\n >\n <MCard className={'calendar event popover'} onPointerEnter={onPointerEnter} onPointerLeave={onPointerLeave}>\n <MCardBody>\n <CalendarDetailsContent\n date={date}\n events={events}\n locale={locale}\n timelineStartHour={timelineStartHour}\n timelineEndHour={timelineEndHour}\n showTimeline={showTimeline}\n emptyStateText={emptyStateText ?? texts.emptyStateText}\n renderEventItem={renderEventItem}\n />\n </MCardBody>\n </MCard>\n </MPopover>\n )\n}\n\nexport function MCalendarBoard({\n month,\n defaultMonth,\n onMonthChange,\n events = [],\n locale: localeOverride,\n weekStartsOn = 1,\n view,\n defaultView = 'month',\n views = ['month', 'week'],\n onViewChange,\n selectedDate,\n defaultSelectedDate,\n onDayClick,\n dayBadge,\n renderDayCell,\n renderEventItem,\n detailsTrigger = 'click',\n detailsMode = 'auto',\n showTimeline = true,\n timelineStartHour = 6,\n timelineEndHour = 22,\n emptyStateText,\n filters = [],\n activeFilters,\n defaultActiveFilters = [],\n onActiveFiltersChange,\n fullWidth = false,\n className,\n ...rest\n}: MCalendarBoardProps) {\n const locale = useDocumentLocale(localeOverride)\n const datePickerTexts = useMDatePickerTexts()\n const texts = useMCalendarBoardTexts()\n const today = stripTime(new Date())\n const [internalMonth, setInternalMonth] = useState(stripTime(defaultMonth ?? month ?? today))\n const [internalView, setInternalView] = useState<MCalendarBoardView>(defaultView)\n const [internalSelectedDate, setInternalSelectedDate] = useState<Date | null>(normalizeDate(defaultSelectedDate))\n const [internalActiveFilters, setInternalActiveFilters] = useState<string[]>(defaultActiveFilters)\n const [activeDate, setActiveDate] = useState<Date | null>(null)\n const [detailsOpen, setDetailsOpen] = useState(false)\n const [isCompact, setIsCompact] = useState(false)\n const activeAnchorRef = useRef<HTMLElement | null>(null)\n const closeTimeoutRef = useRef<number | null>(null)\n\n const isMonthControlled = month !== undefined && typeof onMonthChange === 'function'\n const visibleMonth = stripTime(isMonthControlled ? (month ?? internalMonth) : internalMonth)\n const currentView = view ?? internalView\n const resolvedSelectedDate = normalizeDate(selectedDate) ?? internalSelectedDate\n const resolvedActiveFilters = activeFilters ?? internalActiveFilters\n\n useEffect(() => {\n const mediaQuery = window.matchMedia(`(max-width: ${MBreakpoints.md}px)`)\n const updateCompactState = () => setIsCompact(mediaQuery.matches)\n\n updateCompactState()\n mediaQuery.addEventListener('change', updateCompactState)\n\n return () => mediaQuery.removeEventListener('change', updateCompactState)\n }, [])\n\n useEffect(() => {\n if (isMonthControlled && month) {\n setInternalMonth(stripTime(month))\n }\n }, [isMonthControlled, month])\n\n useEffect(() => {\n if (view) {\n setInternalView(view)\n }\n }, [view])\n\n useEffect(() => {\n if (selectedDate !== undefined) {\n setInternalSelectedDate(normalizeDate(selectedDate))\n }\n }, [selectedDate])\n\n useEffect(\n () => () => {\n if (closeTimeoutRef.current) {\n window.clearTimeout(closeTimeoutRef.current)\n }\n },\n []\n )\n\n const filteredEvents = useMemo(\n () => applyCalendarFilters(events, filters, resolvedActiveFilters),\n [events, filters, resolvedActiveFilters]\n )\n\n const eventsByDay = useMemo(() => {\n const nextMap = new Map<string, MCalendarEvent[]>()\n\n filteredEvents.forEach((event) => {\n const eventDate = getEventDate(event)\n if (!eventDate) {\n return\n }\n\n const key = getDateKey(eventDate)\n const currentEvents = nextMap.get(key) ?? []\n currentEvents.push(event)\n nextMap.set(key, currentEvents)\n })\n\n return nextMap\n }, [filteredEvents])\n const calendarDays = useMemo(() => {\n if (currentView === 'week') {\n const baseDate = resolvedSelectedDate ?? visibleMonth\n const weekStart = startOfWeek(baseDate, weekStartsOn)\n return Array.from({length: 7}, (_, index) => addDays(weekStart, index))\n }\n\n return buildMonthGrid(visibleMonth, weekStartsOn)\n }, [currentView, resolvedSelectedDate, visibleMonth, weekStartsOn])\n\n const effectiveDetailsMode: MCalendarDetailsMode =\n detailsMode === 'auto' ? (isCompact ? 'modal' : 'popover') : detailsMode\n const activeEvents = activeDate ? (eventsByDay.get(getDateKey(activeDate)) ?? []) : []\n const canShowMonthView = views.includes('month')\n const canShowWeekView = views.includes('week')\n\n const setMonthAndNotify = (nextMonth: Date) => {\n const normalizedMonth = stripTime(nextMonth)\n setInternalMonth(normalizedMonth)\n onMonthChange?.(normalizedMonth)\n }\n\n const navigateBy = (amount: number) => {\n if (currentView === 'week') {\n const nextAnchor = addDays(resolvedSelectedDate ?? visibleMonth, amount * 7)\n setMonthAndNotify(nextAnchor)\n setInternalSelectedDate(nextAnchor)\n setActiveDate(nextAnchor)\n setDetailsOpen(false)\n return\n }\n\n const nextMonth = new Date(visibleMonth.getFullYear(), visibleMonth.getMonth() + amount, 1)\n setMonthAndNotify(nextMonth)\n setDetailsOpen(false)\n setActiveDate(null)\n }\n\n const setViewAndNotify = (nextView: MCalendarBoardView) => {\n setInternalView(nextView)\n onViewChange?.(nextView)\n }\n\n const setSelectedDateAndNotify = (nextDate: Date, dayEvents: MCalendarEvent[]) => {\n const normalizedDate = stripTime(nextDate)\n setInternalSelectedDate(normalizedDate)\n onDayClick?.(normalizedDate, dayEvents)\n }\n\n const clearCloseTimeout = () => {\n if (closeTimeoutRef.current) {\n window.clearTimeout(closeTimeoutRef.current)\n closeTimeoutRef.current = null\n }\n }\n\n const scheduleClose = () => {\n clearCloseTimeout()\n closeTimeoutRef.current = window.setTimeout(() => {\n setDetailsOpen(false)\n }, 180)\n }\n\n const openDetails = (date: Date, target: HTMLElement, dayEvents: MCalendarEvent[]) => {\n activeAnchorRef.current = target\n setActiveDate(date)\n setSelectedDateAndNotify(date, dayEvents)\n setDetailsOpen(true)\n }\n\n const handleDayInteract = (date: Date, target: HTMLElement, dayEvents: MCalendarEvent[]) => {\n clearCloseTimeout()\n openDetails(date, target, dayEvents)\n\n if (currentView === 'month' && date.getMonth() !== visibleMonth.getMonth()) {\n setMonthAndNotify(new Date(date.getFullYear(), date.getMonth(), 1))\n }\n }\n\n const handleDayHover = (date: Date, target: HTMLElement, dayEvents: MCalendarEvent[]) => {\n if (detailsTrigger !== 'hover' || effectiveDetailsMode !== 'popover') {\n return\n }\n\n clearCloseTimeout()\n openDetails(date, target, dayEvents)\n }\n\n const handleFilterToggle = (filterId: string) => {\n const nextFilters = resolvedActiveFilters.includes(filterId)\n ? resolvedActiveFilters.filter((id) => id !== filterId)\n : [...resolvedActiveFilters, filterId]\n\n setInternalActiveFilters(nextFilters)\n onActiveFiltersChange?.(nextFilters)\n }\n\n const dayNameBase = startOfWeek(\n currentView === 'week' ? (resolvedSelectedDate ?? visibleMonth) : visibleMonth,\n weekStartsOn\n )\n\n return (\n <div className={cn('calendar board', fullWidth && 'full-width', className)} {...rest}>\n <div className={'calendar header'}>\n <MStack>\n <MHeading level={3}>{getViewTitle(visibleMonth, currentView, locale, weekStartsOn)}</MHeading>\n <MText size={'sm'} tone={'muted'}>\n {getViewSubtitle(currentView, texts)}\n </MText>\n </MStack>\n <MStack align={'end'}>\n <div className={'calendar actions'}>\n <MButton\n type={'button'}\n size={'sm'}\n variant={'outlined'}\n color={'neutral'}\n onClick={() => navigateBy(-1)}\n >\n {currentView === 'week' ? texts.previousWeek : datePickerTexts.previousMonth}\n </MButton>\n <MButton\n type={'button'}\n size={'sm'}\n variant={'outlined'}\n color={'neutral'}\n onClick={() => navigateBy(1)}\n >\n {currentView === 'week' ? texts.nextWeek : datePickerTexts.nextMonth}\n </MButton>\n </div>\n {(canShowMonthView || canShowWeekView) && (\n <div className={'calendar views'}>\n {canShowMonthView && (\n <MButton\n type={'button'}\n size={'sm'}\n variant=\"outlined\"\n color={currentView === 'month' ? 'primary' : 'neutral'}\n active={currentView === 'month'}\n onClick={() => setViewAndNotify('month')}\n >\n {texts.monthView}\n </MButton>\n )}\n {canShowWeekView && (\n <MButton\n type={'button'}\n size={'sm'}\n variant=\"outlined\"\n color={currentView === 'week' ? 'primary' : 'neutral'}\n active={currentView === 'week'}\n onClick={() => setViewAndNotify('week')}\n >\n {texts.weekView}\n </MButton>\n )}\n </div>\n )}\n </MStack>\n </div>\n\n <CalendarFilters filters={filters} activeFilterIds={resolvedActiveFilters} onToggle={handleFilterToggle} />\n\n <div className={'calendar days'}>\n {Array.from({length: 7}, (_, index) => addDays(dayNameBase, index)).map((day) => (\n <div key={getDateKey(day)} className={'calendar day'}>\n {new Intl.DateTimeFormat(locale, {weekday: 'short'}).format(day)}\n </div>\n ))}\n </div>\n\n {currentView === 'week' ? (\n <CalendarWeekView\n days={calendarDays}\n eventsByDay={eventsByDay}\n selectedDate={resolvedSelectedDate}\n activeDate={activeDate}\n onDayInteract={handleDayInteract}\n onDayHover={handleDayHover}\n onDayLeave={() => {\n if (detailsTrigger === 'hover' && effectiveDetailsMode === 'popover') {\n scheduleClose()\n }\n }}\n dayBadge={dayBadge}\n renderDayCell={renderDayCell}\n />\n ) : (\n <div className={'calendar grid'}>\n {calendarDays.map((day) => {\n const dayKey = getDateKey(day)\n const dayEvents = eventsByDay.get(dayKey) ?? []\n const badge =\n dayBadge?.(day, dayEvents) ??\n (dayEvents.length > 0 ? <MBadge size={'sm'}>{dayEvents.length}</MBadge> : null)\n const isToday = dayKey === getDateKey(today)\n const isSelected = Boolean(resolvedSelectedDate && dayKey === getDateKey(resolvedSelectedDate))\n const isOutsideMonth = day.getMonth() !== visibleMonth.getMonth()\n const markers = buildDayMarkers(dayEvents)\n const context = {\n date: day,\n events: dayEvents,\n badge,\n isToday,\n isSelected,\n isOutsideMonth,\n }\n\n return (\n <MCalendarDayCell\n key={dayKey}\n date={day}\n events={dayEvents}\n badge={badge}\n markers={markers}\n isToday={isToday}\n isSelected={isSelected || Boolean(activeDate && dayKey === getDateKey(activeDate))}\n isOutsideMonth={isOutsideMonth}\n onClick={(event) => handleDayInteract(day, event.currentTarget, dayEvents)}\n onMouseEnter={(event) => handleDayHover(day, event.currentTarget, dayEvents)}\n onMouseLeave={() => {\n if (detailsTrigger === 'hover' && effectiveDetailsMode === 'popover') {\n scheduleClose()\n }\n }}\n >\n {renderDayCell ? renderDayCell(day, context) : undefined}\n </MCalendarDayCell>\n )\n })}\n </div>\n )}\n\n {effectiveDetailsMode === 'popover' ? (\n <MCalendarEventPopover\n open={detailsOpen && Boolean(activeDate) && Boolean(activeAnchorRef.current)}\n anchorRef={activeAnchorRef as RefObject<HTMLElement | null>}\n onClose={() => setDetailsOpen(false)}\n onPointerEnter={() => clearCloseTimeout()}\n onPointerLeave={() => scheduleClose()}\n date={activeDate}\n events={activeEvents}\n locale={locale}\n timelineStartHour={timelineStartHour}\n timelineEndHour={timelineEndHour}\n showTimeline={showTimeline}\n emptyStateText={emptyStateText ?? texts.emptyStateText}\n renderEventItem={renderEventItem}\n />\n ) : (\n <MModal\n open={detailsOpen && Boolean(activeDate)}\n onClose={() => setDetailsOpen(false)}\n title={activeDate ? formatBoardDate(activeDate, locale) : undefined}\n description={activeDate ? texts.itemsCount(activeEvents.length) : undefined}\n size={'lg'}\n >\n <CalendarDetailsContent\n date={activeDate}\n events={activeEvents}\n locale={locale}\n timelineStartHour={timelineStartHour}\n timelineEndHour={timelineEndHour}\n showTimeline={showTimeline}\n emptyStateText={emptyStateText ?? texts.emptyStateText}\n renderEventItem={renderEventItem}\n />\n </MModal>\n )}\n </div>\n )\n}\n","import type {HTMLAttributes, ReactNode} from 'react'\nimport type {MColor} from '../../../theme/MTheme.types'\n\nexport type MChartType = 'line' | 'bar' | 'area' | 'pie'\n\nexport interface MChartDataset {\n label: string\n data: number[]\n color?: MColor\n}\n\nexport interface MChartAxisConfig {\n labels?: string[]\n min?: number\n max?: number\n ticks?: number\n formatter?: (value: number) => string\n title?: string\n}\n\nexport interface MChartProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n type: MChartType\n data: MChartDataset[]\n width?: number | string\n height?: number\n aspectRatio?: number\n xAxis?: MChartAxisConfig\n yAxis?: MChartAxisConfig\n showGrid?: boolean\n showXAxis?: boolean\n showYAxis?: boolean\n showLegend?: boolean\n showTooltip?: boolean\n animated?: boolean\n stacked?: boolean\n curved?: boolean\n donut?: boolean\n donutWidth?: number\n valueFormatter?: (value: number) => string\n labelFormatter?: (label: string) => string\n onDataClick?: (datasetIndex: number, dataIndex: number, value: number) => void\n}\n\nexport interface MChartTooltipData {\n label: string\n items: {name: string; value: number; color: MColor}[]\n x: number\n y: number\n}\n\nexport const CHART_DEFAULT_COLORS: MColor[] = [\n 'primary',\n 'info',\n 'success',\n 'warning',\n 'error',\n 'news',\n 'neutral',\n 'dark',\n]\n\n/* ── Per-type public prop interfaces ── */\n\ninterface MChartBaseProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n data: MChartDataset[]\n width?: number | string\n height?: number\n aspectRatio?: number\n xAxis?: MChartAxisConfig\n showLegend?: boolean\n showTooltip?: boolean\n animated?: boolean\n valueFormatter?: (value: number) => string\n labelFormatter?: (label: string) => string\n onDataClick?: (datasetIndex: number, dataIndex: number, value: number) => void\n}\n\ninterface MCartesianChartProps extends MChartBaseProps {\n yAxis?: MChartAxisConfig\n showGrid?: boolean\n showXAxis?: boolean\n showYAxis?: boolean\n}\n\nexport interface MLineChartProps extends MCartesianChartProps {\n curved?: boolean\n}\n\nexport interface MBarChartProps extends MCartesianChartProps {\n stacked?: boolean\n}\n\nexport interface MAreaChartProps extends MCartesianChartProps {\n curved?: boolean\n stacked?: boolean\n}\n\nexport interface MPieChartProps extends MChartBaseProps {\n donut?: boolean\n donutWidth?: number\n}\n\nexport const CHART_PADDING = {top: 20, right: 20, bottom: 40, left: 50}\nexport const CHART_PADDING_WITH_TITLE = {top: 20, right: 20, bottom: 55, left: 65}\n","export function defaultValueFormatter(value: number): string {\n if (Math.abs(value) >= 1_000_000) {\n return (value / 1_000_000).toFixed(1).replace(/\\.0$/, '') + 'M'\n }\n if (Math.abs(value) >= 1_000) {\n return (value / 1_000).toFixed(1).replace(/\\.0$/, '') + 'k'\n }\n if (Number.isInteger(value)) return String(value)\n return value.toFixed(1)\n}\n\nexport function defaultLabelFormatter(label: string): string {\n return label\n}\n\nexport function percentFormatter(value: number): string {\n return value.toFixed(0) + '%'\n}\n","interface ChartGridProps {\n x: number\n y: number\n width: number\n height: number\n horizontalLines: number[]\n verticalLines?: number[]\n}\n\nexport function ChartGrid({x, y, width, height, horizontalLines, verticalLines}: ChartGridProps) {\n return (\n <g className=\"chart-grid\">\n {horizontalLines.map((ly, i) => (\n <line key={`h${i}`} x1={x} y1={ly} x2={x + width} y2={ly} className=\"chart-grid-line\" />\n ))}\n {verticalLines?.map((lx, i) => (\n <line\n key={`v${i}`}\n x1={lx}\n y1={y}\n x2={lx}\n y2={y + height}\n className=\"chart-grid-line chart-grid-line-vertical\"\n />\n ))}\n </g>\n )\n}\n","interface ChartAxisProps {\n type: 'x' | 'y'\n x: number\n y: number\n length: number\n ticks: {position: number; label: string}[]\n title?: string\n}\n\nexport function ChartAxis({type, x, y, length, ticks, title}: ChartAxisProps) {\n const isX = type === 'x'\n\n return (\n <g className={`chart-axis chart-axis-${type}`}>\n <line x1={x} y1={y} x2={isX ? x + length : x} y2={isX ? y : y - length} className=\"chart-axis-line\" />\n {ticks.map((tick, i) => (\n <g key={i}>\n {isX ? (\n <text x={tick.position} y={y + 16} textAnchor=\"middle\" className=\"chart-axis-label\">\n {tick.label}\n </text>\n ) : (\n <text\n x={x - 8}\n y={tick.position}\n textAnchor=\"end\"\n dominantBaseline=\"middle\"\n className=\"chart-axis-label\"\n >\n {tick.label}\n </text>\n )}\n </g>\n ))}\n {title &&\n (isX ? (\n <text x={x + length / 2} y={y + 36} textAnchor=\"middle\" className=\"chart-axis-title\">\n {title}\n </text>\n ) : (\n <text\n x={x - 40}\n y={y - length / 2}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n transform={`rotate(-90, ${x - 40}, ${y - length / 2})`}\n className=\"chart-axis-title\"\n >\n {title}\n </text>\n ))}\n </g>\n )\n}\n","import {useMemo, useCallback, useState} from 'react'\nimport type {MChartDataset, MChartTooltipData} from '../MChart.types'\nimport type {MColor} from '../../../../theme/MTheme.types'\nimport {createLinearScale, generateTicks, getDataExtent, niceMin, niceMax} from '../utils/scales'\nimport {linePath, curvedPath} from '../utils/paths'\nimport type {Point} from '../utils/paths'\nimport {defaultValueFormatter} from '../utils/formats'\nimport {ChartGrid} from '../parts/ChartGrid'\nimport {ChartAxis} from '../parts/ChartAxis'\nimport type {MChartAxisConfig} from '../MChart.types'\n\ninterface MLineChartProps {\n data: MChartDataset[]\n colors: MColor[]\n innerWidth: number\n innerHeight: number\n padding: {top: number; right: number; bottom: number; left: number}\n xAxis?: MChartAxisConfig\n yAxis?: MChartAxisConfig\n showGrid: boolean\n showXAxis: boolean\n showYAxis: boolean\n curved: boolean\n animated: boolean\n valueFormatter: (value: number) => string\n onTooltip: (data: MChartTooltipData | null) => void\n onDataClick?: (datasetIndex: number, dataIndex: number, value: number) => void\n}\n\nexport function MLineChart({\n data,\n colors,\n innerWidth,\n innerHeight,\n padding,\n xAxis,\n yAxis,\n showGrid,\n showXAxis,\n showYAxis,\n curved,\n animated,\n valueFormatter = defaultValueFormatter,\n onTooltip,\n onDataClick,\n}: MLineChartProps) {\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null)\n\n const plotW = innerWidth - padding.left - padding.right\n const plotH = innerHeight - padding.top - padding.bottom\n\n const {yMin, yMax, yTicks, xLabels, seriesPoints} = useMemo(() => {\n const allData = data.map((d) => d.data)\n const [rawMin, rawMax] = getDataExtent(allData)\n const min = yAxis?.min ?? niceMin(rawMin)\n const max = yAxis?.max ?? niceMax(rawMax, rawMin)\n const ticks = generateTicks(min, max, yAxis?.ticks ?? 5)\n const maxLen = Math.max(...allData.map((d) => d.length), 1)\n const labels = xAxis?.labels ?? Array.from({length: maxLen}, (_, i) => String(i))\n\n const xScale = createLinearScale([0, Math.max(maxLen - 1, 1)], [0, plotW])\n const yScale = createLinearScale([min, max], [plotH, 0])\n\n const pts = allData.map((series) => series.map((v, i): Point => ({x: xScale(i), y: yScale(v)})))\n\n return {yMin: min, yMax: max, yTicks: ticks, xLabels: labels, seriesPoints: pts}\n }, [data, plotW, plotH, xAxis, yAxis])\n\n const yScale = createLinearScale([yMin, yMax], [plotH, 0])\n const xScale = createLinearScale([0, Math.max(xLabels.length - 1, 1)], [0, plotW])\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<SVGGElement>) => {\n const svg = e.currentTarget.closest('svg')\n if (!svg) return\n const rect = svg.getBoundingClientRect()\n const scale = innerWidth / rect.width\n const mx = (e.clientX - rect.left) * scale - padding.left\n const idx = Math.round((mx / plotW) * Math.max(xLabels.length - 1, 1))\n const clampedIdx = Math.max(0, Math.min(idx, xLabels.length - 1))\n\n setHoveredIndex(clampedIdx)\n onTooltip({\n label: xLabels[clampedIdx],\n items: data.map((ds, di) => ({\n name: ds.label,\n value: ds.data[clampedIdx] ?? 0,\n color: ds.color ?? colors[di % colors.length],\n })),\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n })\n },\n [data, colors, xLabels, plotW, padding.left, innerWidth, onTooltip]\n )\n\n const handleMouseLeave = useCallback(() => {\n setHoveredIndex(null)\n onTooltip(null)\n }, [onTooltip])\n\n const gridH = yTicks.map((t) => padding.top + yScale(t))\n const xTickPositions = xLabels.map((_, i) => padding.left + xScale(i))\n const yTickData = yTicks.map((t) => ({\n position: padding.top + yScale(t),\n label: (yAxis?.formatter ?? valueFormatter)(t),\n }))\n const xTickData = xLabels.map((l, i) => ({\n position: padding.left + xScale(i),\n label: l,\n }))\n\n return (\n <g>\n {showGrid && (\n <ChartGrid\n x={padding.left}\n y={padding.top}\n width={plotW}\n height={plotH}\n horizontalLines={gridH}\n verticalLines={xTickPositions}\n />\n )}\n {showYAxis && (\n <ChartAxis\n type=\"y\"\n x={padding.left}\n y={padding.top + plotH}\n length={plotH}\n ticks={yTickData}\n title={yAxis?.title}\n />\n )}\n {showXAxis && (\n <ChartAxis\n type=\"x\"\n x={padding.left}\n y={padding.top + plotH}\n length={plotW}\n ticks={xTickData}\n title={xAxis?.title}\n />\n )}\n <g onMouseMove={handleMouseMove} onMouseLeave={handleMouseLeave}>\n <rect x={padding.left} y={padding.top} width={plotW} height={plotH} fill=\"transparent\" />\n {seriesPoints.map((pts, di) => {\n const c = data[di].color ?? colors[di % colors.length]\n const d = curved\n ? curvedPath(pts.map((p) => ({x: p.x + padding.left, y: p.y + padding.top})))\n : linePath(pts.map((p) => ({x: p.x + padding.left, y: p.y + padding.top})))\n return (\n <g key={di}>\n <path className={`chart-line ${c} ${animated ? 'animated' : ''}`} d={d} />\n {pts.map((p, pi) => (\n <circle\n key={pi}\n className={`chart-dot ${c} ${hoveredIndex === pi ? 'active' : ''}`}\n cx={p.x + padding.left}\n cy={p.y + padding.top}\n r={hoveredIndex === pi ? 5 : 3}\n onClick={() => onDataClick?.(di, pi, data[di].data[pi])}\n style={{cursor: onDataClick ? 'pointer' : undefined}}\n />\n ))}\n </g>\n )\n })}\n {hoveredIndex !== null && (\n <line\n className=\"chart-crosshair\"\n x1={padding.left + xScale(hoveredIndex)}\n y1={padding.top}\n x2={padding.left + xScale(hoveredIndex)}\n y2={padding.top + plotH}\n />\n )}\n </g>\n </g>\n )\n}\n","import {useMemo, useCallback, useState} from 'react'\nimport type {MChartDataset, MChartTooltipData, MChartAxisConfig} from '../MChart.types'\nimport type {MColor} from '../../../../theme/MTheme.types'\nimport {createLinearScale, generateTicks, getDataExtent, getStackedExtent, niceMin, niceMax} from '../utils/scales'\nimport {defaultValueFormatter} from '../utils/formats'\nimport {ChartGrid} from '../parts/ChartGrid'\nimport {ChartAxis} from '../parts/ChartAxis'\n\ninterface MBarChartProps {\n data: MChartDataset[]\n colors: MColor[]\n innerWidth: number\n innerHeight: number\n padding: {top: number; right: number; bottom: number; left: number}\n xAxis?: MChartAxisConfig\n yAxis?: MChartAxisConfig\n showGrid: boolean\n showXAxis: boolean\n showYAxis: boolean\n stacked: boolean\n animated: boolean\n valueFormatter: (value: number) => string\n onTooltip: (data: MChartTooltipData | null) => void\n onDataClick?: (datasetIndex: number, dataIndex: number, value: number) => void\n}\n\nexport function MBarChart({\n data,\n colors,\n innerWidth,\n innerHeight,\n padding,\n xAxis,\n yAxis,\n showGrid,\n showXAxis,\n showYAxis,\n stacked,\n animated,\n valueFormatter = defaultValueFormatter,\n onTooltip,\n onDataClick,\n}: MBarChartProps) {\n const [hoveredBar, setHoveredBar] = useState<{di: number; pi: number} | null>(null)\n\n const plotW = innerWidth - padding.left - padding.right\n const plotH = innerHeight - padding.top - padding.bottom\n\n const {yMin, yMax, yTicks, xLabels, maxLen} = useMemo(() => {\n const allData = data.map((d) => d.data)\n const mLen = Math.max(...allData.map((d) => d.length), 1)\n\n let rawMin: number, rawMax: number\n if (stacked) {\n ;[rawMin, rawMax] = getStackedExtent(allData)\n } else {\n ;[rawMin, rawMax] = getDataExtent(allData)\n }\n\n const min = yAxis?.min ?? niceMin(rawMin)\n const max = yAxis?.max ?? niceMax(rawMax, rawMin)\n const ticks = generateTicks(min, max, yAxis?.ticks ?? 5)\n const labels = xAxis?.labels ?? Array.from({length: mLen}, (_, i) => String(i))\n\n return {yMin: min, yMax: max, yTicks: ticks, xLabels: labels, maxLen: mLen}\n }, [data, xAxis, yAxis, stacked])\n\n const yScale = createLinearScale([yMin, yMax], [plotH, 0])\n const groupWidth = plotW / maxLen\n const barGap = Math.max(groupWidth * 0.1, 2)\n const seriesCount = data.length\n\n const handleBarEnter = useCallback(\n (di: number, pi: number, e: React.MouseEvent) => {\n setHoveredBar({di, pi})\n const svg = e.currentTarget.closest('svg')\n if (!svg) return\n const rect = svg.getBoundingClientRect()\n onTooltip({\n label: xLabels[pi],\n items: stacked\n ? data.map((ds, dsi) => ({\n name: ds.label,\n value: ds.data[pi] ?? 0,\n color: ds.color ?? colors[dsi % colors.length],\n }))\n : [\n {\n name: data[di].label,\n value: data[di].data[pi],\n color: data[di].color ?? colors[di % colors.length],\n },\n ],\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n })\n },\n [data, colors, xLabels, stacked, onTooltip]\n )\n\n const handleMouseLeave = useCallback(() => {\n setHoveredBar(null)\n onTooltip(null)\n }, [onTooltip])\n\n const gridH = yTicks.map((t) => padding.top + yScale(t))\n const xTickData = xLabels.map((l, i) => ({\n position: padding.left + groupWidth * i + groupWidth / 2,\n label: l,\n }))\n const yTickData = yTicks.map((t) => ({\n position: padding.top + yScale(t),\n label: (yAxis?.formatter ?? valueFormatter)(t),\n }))\n\n const baselineY = yScale(0)\n\n return (\n <g>\n {showGrid && (\n <ChartGrid x={padding.left} y={padding.top} width={plotW} height={plotH} horizontalLines={gridH} />\n )}\n {showYAxis && (\n <ChartAxis\n type=\"y\"\n x={padding.left}\n y={padding.top + plotH}\n length={plotH}\n ticks={yTickData}\n title={yAxis?.title}\n />\n )}\n {showXAxis && (\n <ChartAxis\n type=\"x\"\n x={padding.left}\n y={padding.top + plotH}\n length={plotW}\n ticks={xTickData}\n title={xAxis?.title}\n />\n )}\n <g onMouseLeave={handleMouseLeave}>\n {stacked\n ? xLabels.map((_, pi) => {\n let cumY = baselineY\n const barW = groupWidth - barGap * 2\n const x = padding.left + groupWidth * pi + barGap\n\n return (\n <g key={pi}>\n {data.map((ds, di) => {\n const v = ds.data[pi] ?? 0\n const barH = baselineY - yScale(v)\n const y = cumY - barH\n cumY = y\n const c = ds.color ?? colors[di % colors.length]\n const isHovered = hoveredBar?.di === di && hoveredBar?.pi === pi\n return (\n <rect\n key={di}\n className={`chart-bar ${c} ${animated ? 'animated' : ''} ${isHovered ? 'active' : ''}`}\n x={x}\n y={padding.top + y}\n width={Math.max(barW, 1)}\n height={Math.max(barH, 0)}\n rx={di === data.length - 1 ? 3 : 0}\n onMouseEnter={(e) => handleBarEnter(di, pi, e)}\n onClick={() => onDataClick?.(di, pi, v)}\n style={{cursor: onDataClick ? 'pointer' : undefined}}\n />\n )\n })}\n </g>\n )\n })\n : data.map((ds, di) => {\n const barW = (groupWidth - barGap * 2) / seriesCount\n return (\n <g key={di}>\n {ds.data.map((v, pi) => {\n const barH = baselineY - yScale(v)\n const x = padding.left + groupWidth * pi + barGap + barW * di\n const y = Math.min(baselineY, yScale(v))\n const c = ds.color ?? colors[di % colors.length]\n const isHovered = hoveredBar?.di === di && hoveredBar?.pi === pi\n return (\n <rect\n key={pi}\n className={`chart-bar ${c} ${animated ? 'animated' : ''} ${isHovered ? 'active' : ''}`}\n x={x}\n y={padding.top + y}\n width={Math.max(barW, 1)}\n height={Math.max(Math.abs(barH), 0)}\n rx={3}\n onMouseEnter={(e) => handleBarEnter(di, pi, e)}\n onClick={() => onDataClick?.(di, pi, v)}\n style={{cursor: onDataClick ? 'pointer' : undefined}}\n />\n )\n })}\n </g>\n )\n })}\n </g>\n </g>\n )\n}\n","import {useMemo, useCallback, useState} from 'react'\nimport type {MChartDataset, MChartTooltipData, MChartAxisConfig} from '../MChart.types'\nimport type {MColor} from '../../../../theme/MTheme.types'\nimport {createLinearScale, generateTicks, getDataExtent, getStackedExtent, niceMin, niceMax} from '../utils/scales'\nimport {linePath, curvedPath, areaPath, stackedAreaPath} from '../utils/paths'\nimport type {Point} from '../utils/paths'\nimport {defaultValueFormatter} from '../utils/formats'\nimport {ChartGrid} from '../parts/ChartGrid'\nimport {ChartAxis} from '../parts/ChartAxis'\n\ninterface MAreaChartProps {\n data: MChartDataset[]\n colors: MColor[]\n innerWidth: number\n innerHeight: number\n padding: {top: number; right: number; bottom: number; left: number}\n xAxis?: MChartAxisConfig\n yAxis?: MChartAxisConfig\n showGrid: boolean\n showXAxis: boolean\n showYAxis: boolean\n curved: boolean\n stacked: boolean\n animated: boolean\n valueFormatter: (value: number) => string\n onTooltip: (data: MChartTooltipData | null) => void\n onDataClick?: (datasetIndex: number, dataIndex: number, value: number) => void\n}\n\nexport function MAreaChart({\n data,\n colors,\n innerWidth,\n innerHeight,\n padding,\n xAxis,\n yAxis,\n showGrid,\n showXAxis,\n showYAxis,\n curved,\n stacked,\n animated,\n valueFormatter = defaultValueFormatter,\n onTooltip,\n onDataClick,\n}: MAreaChartProps) {\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null)\n\n const plotW = innerWidth - padding.left - padding.right\n const plotH = innerHeight - padding.top - padding.bottom\n\n const {yMin, yMax, yTicks, xLabels, seriesPoints, stackedPaths} = useMemo(() => {\n const allData = data.map((d) => d.data)\n const maxLen = Math.max(...allData.map((d) => d.length), 1)\n\n let rawMin: number, rawMax: number\n if (stacked) {\n ;[rawMin, rawMax] = getStackedExtent(allData)\n } else {\n ;[rawMin, rawMax] = getDataExtent(allData)\n }\n\n const min = yAxis?.min ?? niceMin(rawMin)\n const max = yAxis?.max ?? niceMax(rawMax, rawMin)\n const ticks = generateTicks(min, max, yAxis?.ticks ?? 5)\n const labels = xAxis?.labels ?? Array.from({length: maxLen}, (_, i) => String(i))\n\n const xScale = createLinearScale([0, Math.max(maxLen - 1, 1)], [0, plotW])\n const yScale = createLinearScale([min, max], [plotH, 0])\n\n if (stacked) {\n const cumulative: number[][] = []\n for (let i = 0; i < allData.length; i++) {\n cumulative[i] = []\n for (let j = 0; j < maxLen; j++) {\n cumulative[i][j] = (allData[i][j] ?? 0) + (i > 0 ? cumulative[i - 1][j] : 0)\n }\n }\n\n const sPaths = cumulative.map((series, di) => {\n const topPts: Point[] = series.map((v, j) => ({\n x: padding.left + xScale(j),\n y: padding.top + yScale(v),\n }))\n const bottomPts: Point[] =\n di === 0\n ? series.map((_, j) => ({x: padding.left + xScale(j), y: padding.top + yScale(0)}))\n : cumulative[di - 1].map((v, j) => ({x: padding.left + xScale(j), y: padding.top + yScale(v)}))\n\n return {\n area: stackedAreaPath(topPts, bottomPts, curved),\n line: curved ? curvedPath(topPts) : linePath(topPts),\n topPts,\n }\n })\n\n return {\n yMin: min,\n yMax: max,\n yTicks: ticks,\n xLabels: labels,\n seriesPoints: [] as Point[][],\n stackedPaths: sPaths,\n }\n }\n\n const pts = allData.map((series) =>\n series.map((v, i): Point => ({x: padding.left + xScale(i), y: padding.top + yScale(v)}))\n )\n\n return {yMin: min, yMax: max, yTicks: ticks, xLabels: labels, seriesPoints: pts, stackedPaths: undefined}\n }, [data, plotW, plotH, xAxis, yAxis, stacked, curved, padding])\n\n const yScale = createLinearScale([yMin, yMax], [plotH, 0])\n const xScale = createLinearScale([0, Math.max(xLabels.length - 1, 1)], [0, plotW])\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<SVGGElement>) => {\n const svg = e.currentTarget.closest('svg')\n if (!svg) return\n const rect = svg.getBoundingClientRect()\n const scale = innerWidth / rect.width\n const mx = (e.clientX - rect.left) * scale - padding.left\n const idx = Math.round((mx / plotW) * Math.max(xLabels.length - 1, 1))\n const clampedIdx = Math.max(0, Math.min(idx, xLabels.length - 1))\n\n setHoveredIndex(clampedIdx)\n onTooltip({\n label: xLabels[clampedIdx],\n items: data.map((ds, di) => ({\n name: ds.label,\n value: ds.data[clampedIdx] ?? 0,\n color: ds.color ?? colors[di % colors.length],\n })),\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n })\n },\n [data, colors, xLabels, plotW, padding.left, innerWidth, onTooltip]\n )\n\n const handleMouseLeave = useCallback(() => {\n setHoveredIndex(null)\n onTooltip(null)\n }, [onTooltip])\n\n const gridH = yTicks.map((t) => padding.top + yScale(t))\n const yTickData = yTicks.map((t) => ({\n position: padding.top + yScale(t),\n label: (yAxis?.formatter ?? valueFormatter)(t),\n }))\n const xTickData = xLabels.map((l, i) => ({\n position: padding.left + xScale(i),\n label: l,\n }))\n\n return (\n <g>\n {showGrid && (\n <ChartGrid x={padding.left} y={padding.top} width={plotW} height={plotH} horizontalLines={gridH} />\n )}\n {showYAxis && (\n <ChartAxis\n type=\"y\"\n x={padding.left}\n y={padding.top + plotH}\n length={plotH}\n ticks={yTickData}\n title={yAxis?.title}\n />\n )}\n {showXAxis && (\n <ChartAxis\n type=\"x\"\n x={padding.left}\n y={padding.top + plotH}\n length={plotW}\n ticks={xTickData}\n title={xAxis?.title}\n />\n )}\n <g onMouseMove={handleMouseMove} onMouseLeave={handleMouseLeave}>\n <rect x={padding.left} y={padding.top} width={plotW} height={plotH} fill=\"transparent\" />\n {stacked && stackedPaths\n ? stackedPaths.map((sp, di) => {\n const c = data[di].color ?? colors[di % colors.length]\n return (\n <g key={di}>\n <path className={`chart-area-fill ${c}`} d={sp.area} />\n <path className={`chart-line ${c} ${animated ? 'animated' : ''}`} d={sp.line} />\n </g>\n )\n })\n : seriesPoints.map((pts, di) => {\n const c = data[di].color ?? colors[di % colors.length]\n const lineD = curved ? curvedPath(pts) : linePath(pts)\n const areaD = areaPath(pts, padding.top + plotH, curved)\n return (\n <g key={di}>\n <path className={`chart-area-fill ${c}`} d={areaD} />\n <path className={`chart-line ${c} ${animated ? 'animated' : ''}`} d={lineD} />\n {pts.map((p, pi) => (\n <circle\n key={pi}\n className={`chart-dot ${c} ${hoveredIndex === pi ? 'active' : ''}`}\n cx={p.x}\n cy={p.y}\n r={hoveredIndex === pi ? 5 : 3}\n onClick={() => onDataClick?.(di, pi, data[di].data[pi])}\n style={{cursor: onDataClick ? 'pointer' : undefined}}\n />\n ))}\n </g>\n )\n })}\n {hoveredIndex !== null && (\n <line\n className=\"chart-crosshair\"\n x1={padding.left + xScale(hoveredIndex)}\n y1={padding.top}\n x2={padding.left + xScale(hoveredIndex)}\n y2={padding.top + plotH}\n />\n )}\n </g>\n </g>\n )\n}\n","import {useMemo, useCallback, useState} from 'react'\nimport type {MChartDataset, MChartTooltipData} from '../MChart.types'\nimport type {MColor} from '../../../../theme/MTheme.types'\nimport {pieSector} from '../utils/paths'\nimport {defaultValueFormatter} from '../utils/formats'\n\ninterface MPieChartProps {\n data: MChartDataset[]\n colors: MColor[]\n innerWidth: number\n innerHeight: number\n donut: boolean\n donutWidth?: number\n animated: boolean\n valueFormatter: (value: number) => string\n xAxis?: {labels?: string[]}\n onTooltip: (data: MChartTooltipData | null) => void\n onDataClick?: (datasetIndex: number, dataIndex: number, value: number) => void\n}\n\nexport function MPieChart({\n data,\n colors,\n innerWidth,\n innerHeight,\n donut,\n donutWidth,\n animated,\n valueFormatter = defaultValueFormatter,\n xAxis,\n onTooltip,\n onDataClick,\n}: MPieChartProps) {\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null)\n\n const cx = innerWidth / 2\n const cy = innerHeight / 2\n const radius = Math.min(cx, cy) - 10\n const innerRadius = donut ? radius - (donutWidth ?? radius * 0.4) : 0\n\n const segments = useMemo(() => {\n const values = data.length === 1 ? data[0].data : data.map((d) => d.data[0] ?? 0)\n const labels =\n data.length === 1 ? (xAxis?.labels ?? values.map((_, i) => `Segment ${i + 1}`)) : data.map((d) => d.label)\n const total = values.reduce((s, v) => s + Math.max(v, 0), 0) || 1\n const startAngle = -Math.PI / 2\n\n let current = startAngle\n return values.map((v, i) => {\n const sweep = (Math.max(v, 0) / total) * Math.PI * 2\n const seg = {\n value: v,\n label: labels[i] ?? `Segment ${i + 1}`,\n color: (data.length === 1 ? undefined : data[i].color) ?? colors[i % colors.length],\n startAngle: current,\n endAngle: current + sweep,\n percentage: (Math.max(v, 0) / total) * 100,\n }\n current += sweep\n return seg\n })\n }, [data, colors, xAxis])\n\n const handleEnter = useCallback(\n (i: number, e: React.MouseEvent) => {\n setHoveredIndex(i)\n const svg = e.currentTarget.closest('svg')\n if (!svg) return\n const rect = svg.getBoundingClientRect()\n onTooltip({\n label: segments[i].label,\n items: [{name: segments[i].label, value: segments[i].value, color: segments[i].color}],\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n })\n },\n [segments, onTooltip]\n )\n\n const handleLeave = useCallback(() => {\n setHoveredIndex(null)\n onTooltip(null)\n }, [onTooltip])\n\n return (\n <g>\n {segments.map((seg, i) => {\n const isHovered = hoveredIndex === i\n const path = pieSector(\n cx,\n cy,\n isHovered ? radius + 4 : radius,\n innerRadius,\n seg.startAngle,\n seg.endAngle\n )\n return (\n <path\n key={i}\n className={`chart-pie-segment ${seg.color} ${animated ? 'animated' : ''} ${isHovered ? 'active' : ''}`}\n d={path}\n onMouseEnter={(e) => handleEnter(i, e)}\n onMouseLeave={handleLeave}\n onMouseMove={(e) => {\n const svg = e.currentTarget.closest('svg')\n if (!svg) return\n const rect = svg.getBoundingClientRect()\n onTooltip({\n label: seg.label,\n items: [{name: seg.label, value: seg.value, color: seg.color}],\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n })\n }}\n onClick={() => onDataClick?.(0, i, seg.value)}\n style={{cursor: onDataClick ? 'pointer' : undefined}}\n />\n )\n })}\n {donut && (\n <text x={cx} y={cy} textAnchor=\"middle\" dominantBaseline=\"middle\" className=\"chart-pie-center\">\n {hoveredIndex !== null\n ? valueFormatter(segments[hoveredIndex].value)\n : valueFormatter(segments.reduce((s, seg) => s + seg.value, 0))}\n </text>\n )}\n </g>\n )\n}\n","const COLORS = ['primary', 'info', 'success', 'warning', 'error', 'news', 'neutral', 'dark', 'light'] as const\n\nexport function ChartDefs() {\n return (\n <defs>\n {COLORS.map((c) => (\n <linearGradient key={`bar-${c}`} id={`chart-bar-grad-${c}`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" className={`chart-grad-stop-start ${c}`} />\n <stop offset=\"100%\" className={`chart-grad-stop-end ${c}`} />\n </linearGradient>\n ))}\n {COLORS.map((c) => (\n <linearGradient key={`pie-${c}`} id={`chart-pie-grad-${c}`} x1=\"0.3\" y1=\"0\" x2=\"0.7\" y2=\"1\">\n <stop offset=\"0%\" className={`chart-grad-stop-start ${c}`} />\n <stop offset=\"100%\" className={`chart-grad-stop-end ${c}`} />\n </linearGradient>\n ))}\n {COLORS.map((c) => (\n <linearGradient key={`area-${c}`} id={`chart-area-grad-${c}`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" className={`chart-grad-area-start ${c}`} />\n <stop offset=\"100%\" className={`chart-grad-area-end ${c}`} />\n </linearGradient>\n ))}\n </defs>\n )\n}\n","import type {MChartTooltipData} from '../MChart.types'\n\ninterface ChartTooltipProps {\n data: MChartTooltipData | null\n valueFormatter: (value: number) => string\n}\n\nexport function ChartTooltip({data, valueFormatter}: ChartTooltipProps) {\n if (!data) return null\n\n return (\n <div className=\"chart-tooltip\" style={{left: data.x, top: data.y}}>\n <div className=\"chart-tooltip-label\">{data.label}</div>\n {data.items.map((item, i) => (\n <div key={i} className=\"chart-tooltip-row\">\n <span className={`chart-tooltip-dot ${item.color}`} />\n <span className=\"chart-tooltip-name\">{item.name}</span>\n <span className=\"chart-tooltip-value\">{valueFormatter(item.value)}</span>\n </div>\n ))}\n </div>\n )\n}\n","import type {MColor} from '../../../../theme/MTheme.types'\n\ninterface ChartLegendProps {\n items: {label: string; color: MColor}[]\n}\n\nexport function ChartLegend({items}: ChartLegendProps) {\n if (items.length <= 1) return null\n\n return (\n <div className=\"chart-legend\">\n {items.map((item, i) => (\n <div key={i} className=\"chart-legend-item\">\n <span className={`chart-legend-dot ${item.color}`} />\n <span className=\"chart-legend-label\">{item.label}</span>\n </div>\n ))}\n </div>\n )\n}\n","import {useMemo, useCallback, useState, useRef} from 'react'\nimport type {MChartProps, MChartTooltipData} from './MChart.types'\nimport {CHART_DEFAULT_COLORS, CHART_PADDING, CHART_PADDING_WITH_TITLE} from './MChart.types'\nimport {defaultValueFormatter, defaultLabelFormatter} from './utils/formats'\nimport {cn} from '../../../utils/cn'\nimport {MLineChart} from './charts/MLineChart'\nimport {MBarChart} from './charts/MBarChart'\nimport {MAreaChart} from './charts/MAreaChart'\nimport {MPieChart} from './charts/MPieChart'\nimport {ChartDefs} from './parts/ChartDefs'\nimport {ChartTooltip} from './parts/ChartTooltip'\nimport {ChartLegend} from './parts/ChartLegend'\nimport './MChart.css'\n\nexport function MChart({\n type,\n data,\n width = '100%',\n height = 300,\n aspectRatio,\n xAxis,\n yAxis,\n showGrid = true,\n showXAxis = true,\n showYAxis = true,\n showLegend = true,\n showTooltip = true,\n animated = true,\n stacked = false,\n curved = false,\n donut = false,\n donutWidth,\n valueFormatter = defaultValueFormatter,\n labelFormatter = defaultLabelFormatter,\n onDataClick,\n className,\n style,\n ...rest\n}: MChartProps) {\n const containerRef = useRef<HTMLDivElement>(null)\n const [tooltip, setTooltip] = useState<MChartTooltipData | null>(null)\n\n const colors = CHART_DEFAULT_COLORS\n\n const hasTitles = !!(xAxis?.title || yAxis?.title)\n const padding = hasTitles ? CHART_PADDING_WITH_TITLE : CHART_PADDING\n\n const computedHeight = aspectRatio ? undefined : typeof height === 'number' ? height : 300\n\n const svgWidth = 600\n const svgHeight = computedHeight ?? 300\n\n const onTooltip = useCallback(\n (data: MChartTooltipData | null) => {\n if (showTooltip) setTooltip(data)\n },\n [showTooltip]\n )\n\n const legendItems = useMemo(() => {\n if (type === 'pie' && data.length === 1) {\n const labels = xAxis?.labels ?? data[0].data.map((_, i) => `Segment ${i + 1}`)\n return labels.map((l, i) => ({label: l, color: colors[i % colors.length]}))\n }\n return data.map((ds, i) => ({label: ds.label, color: ds.color ?? colors[i % colors.length]}))\n }, [data, colors, type, xAxis])\n\n const chartProps = {\n data,\n colors,\n innerWidth: svgWidth,\n innerHeight: svgHeight,\n padding,\n xAxis,\n yAxis,\n showGrid,\n showXAxis,\n showYAxis,\n animated,\n valueFormatter,\n onTooltip,\n onDataClick,\n }\n\n return (\n <div\n ref={containerRef}\n className={cn('chart', className)}\n style={{\n width,\n height: aspectRatio ? undefined : computedHeight,\n aspectRatio: aspectRatio ? String(aspectRatio) : undefined,\n ...style,\n }}\n {...rest}\n >\n <svg viewBox={`0 0 ${svgWidth} ${svgHeight}`} preserveAspectRatio=\"xMidYMid meet\" className=\"chart-svg\">\n <ChartDefs />\n {type === 'line' && <MLineChart {...chartProps} curved={curved} />}\n {type === 'bar' && <MBarChart {...chartProps} stacked={stacked} />}\n {type === 'area' && <MAreaChart {...chartProps} curved={curved} stacked={stacked} />}\n {type === 'pie' && <MPieChart {...chartProps} donut={donut} donutWidth={donutWidth} />}\n </svg>\n {showTooltip && <ChartTooltip data={tooltip} valueFormatter={valueFormatter} />}\n {showLegend && <ChartLegend items={legendItems} />}\n </div>\n )\n}\n","import type {MLineChartProps} from './MChart.types'\nimport {MChart} from './MChart'\n\nexport function MLineChart(props: MLineChartProps) {\n return <MChart type=\"line\" {...props} />\n}\n","import type {MBarChartProps} from './MChart.types'\nimport {MChart} from './MChart'\n\nexport function MBarChart(props: MBarChartProps) {\n return <MChart type=\"bar\" {...props} />\n}\n","import type {MAreaChartProps} from './MChart.types'\nimport {MChart} from './MChart'\n\nexport function MAreaChart(props: MAreaChartProps) {\n return <MChart type=\"area\" {...props} />\n}\n","import type {MPieChartProps} from './MChart.types'\nimport {MChart} from './MChart'\n\nexport function MPieChart(props: MPieChartProps) {\n return <MChart type=\"pie\" {...props} />\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"data-CMSIr_Ac.js","names":[],"sources":["../src/components/data/MChat/MChatContext.ts","../src/components/data/MChat/MChat.tsx","../src/components/data/MChat/MChatHeader.tsx","../src/components/data/MChat/MChatMessage.tsx","../src/components/data/MChat/MChatBody.tsx","../src/components/data/MChat/emojis.ts","../src/components/data/MChat/MChatInput.tsx","../src/components/data/MChat/MChatTypingIndicator.tsx","../src/components/data/MChat/MChatConversationList.tsx","../src/components/data/MChat/MChatConversationItem.tsx","../src/components/data/MTreeView/MTreeView.tsx","../src/components/data/MTaskList/MTaskList.tsx","../src/components/data/MFileManager/MFileManager.tsx","../src/components/data/MCalendarBoard/MCalendarBoard.tsx","../src/components/data/MChart/MChart.types.ts","../src/components/data/MChart/utils/formats.ts","../src/components/data/MChart/parts/ChartGrid.tsx","../src/components/data/MChart/parts/ChartAxis.tsx","../src/components/data/MChart/charts/MLineChart.tsx","../src/components/data/MChart/charts/MBarChart.tsx","../src/components/data/MChart/charts/MAreaChart.tsx","../src/components/data/MChart/charts/MPieChart.tsx","../src/components/data/MChart/parts/ChartDefs.tsx","../src/components/data/MChart/parts/ChartTooltip.tsx","../src/components/data/MChart/parts/ChartLegend.tsx","../src/components/data/MChart/MChart.tsx","../src/components/data/MChart/MLineChart.tsx","../src/components/data/MChart/MBarChart.tsx","../src/components/data/MChart/MAreaChart.tsx","../src/components/data/MChart/MPieChart.tsx"],"sourcesContent":["import {createContext, useContext} from 'react'\nimport type {MColor} from '../../../theme'\n\nexport interface MChatContextValue {\n color?: MColor\n}\n\nexport const MChatContext = createContext<MChatContextValue>({})\n\nexport function useMChatContext() {\n return useContext(MChatContext)\n}\n","import {Children, isValidElement, useMemo} from 'react'\nimport type {ReactNode} from 'react'\nimport type {MChatProps} from './MChat.types'\nimport {MChatContext} from './MChatContext'\nimport {MPortal} from '../../primitives'\nimport {MButton} from '../../controls'\nimport {MChatIcon} from '../../../icons'\nimport {cn} from '../../../utils/cn'\nimport './MChat.css'\n\nfunction isChatSlot(child: ReactNode, flag: string): boolean {\n return isValidElement(child) && !!(child.type as any)[flag]\n}\n\nexport function MChat({\n variant = 'inline',\n open,\n onToggle,\n unreadCount,\n color = 'primary',\n className,\n children,\n ...rest\n}: MChatProps) {\n let header: ReactNode = null\n let conversationList: ReactNode = null\n const body: ReactNode[] = []\n\n Children.forEach(children, (child) => {\n if (isChatSlot(child, '__chatHeader')) {\n header = child\n return\n }\n if (isChatSlot(child, '__chatConversationList')) {\n conversationList = child\n return\n }\n body.push(child)\n })\n\n const ctx = useMemo(() => ({color}), [color])\n\n const chatContent = (\n <MChatContext.Provider value={ctx}>\n <div\n className={cn('chat', variant, `color-${color}`, variant === 'floating' && open && 'open', className)}\n {...rest}\n >\n {conversationList && <div className=\"chat-sidebar\">{conversationList}</div>}\n <div className=\"chat-main\">\n {header}\n {body}\n </div>\n </div>\n </MChatContext.Provider>\n )\n\n if (variant === 'floating') {\n return (\n <MPortal>\n <div className={cn('chat-floating-wrapper', open && 'open')}>\n {open && chatContent}\n <MButton\n variant=\"filled\"\n color={color}\n shape=\"circle\"\n size=\"lg\"\n className=\"chat-floating-trigger\"\n onClick={onToggle}\n aria-label={open ? 'Close chat' : 'Open chat'}\n badge={!open && unreadCount ? unreadCount : undefined}\n badgeColor=\"error\"\n badgePulsing={!open && !!unreadCount}\n >\n <MChatIcon />\n </MButton>\n </div>\n </MPortal>\n )\n }\n\n return chatContent\n}\n","import type {MChatHeaderProps} from './MChat.types'\nimport {cn} from '../../../utils/cn'\n\nexport function MChatHeader({bordered = false, className, children, ...rest}: MChatHeaderProps) {\n return (\n <div className={cn('chat-header', bordered && 'bordered', className)} {...rest}>\n {children}\n </div>\n )\n}\n;(MChatHeader as any).__chatHeader = true\n","import type {MChatMessageProps} from './MChat.types'\nimport {MAvatar} from '../../media'\nimport {MImage} from '../../media'\nimport {MText, MSubText} from '../../typography'\nimport {MTimeAgo} from '../../display'\nimport {cn} from '../../../utils/cn'\n\nfunction StatusIcon({status}: {status?: string}) {\n if (!status) return null\n\n const double = status === 'delivered' || status === 'read'\n const colorClass = status === 'read' ? 'chat-status-read' : ''\n\n return (\n <span className={cn('chat-status', colorClass)} aria-label={status}>\n {double ? '✓✓' : '✓'}\n </span>\n )\n}\n\nexport function MChatMessage({\n message,\n showAvatar = true,\n showTimestamp = true,\n color,\n className,\n ...rest\n}: MChatMessageProps) {\n const {content, sender, timestamp, status, isOwn, images} = message\n const colorClass = color ? color : undefined\n\n return (\n <div className={cn('chat-message', isOwn && 'own', colorClass, className)} {...rest}>\n {showAvatar && !isOwn && (\n <MAvatar\n src={sender.avatar}\n name={sender.name}\n size=\"sm\"\n color={color}\n className=\"chat-message-avatar\"\n />\n )}\n <div className=\"chat-message-content\">\n {!isOwn && (\n <MText className=\"chat-message-sender\" color=\"neutral\">\n {sender.name}\n </MText>\n )}\n <div className=\"chat-message-bubble\">\n {content && <MText>{content}</MText>}\n {images && images.length > 0 && (\n <div className={cn('chat-message-images', images.length > 1 && 'grid')}>\n {images.map((src, i) => (\n <MImage key={i} src={src} alt=\"\" fit=\"cover\" rounded className=\"chat-message-image\" />\n ))}\n </div>\n )}\n </div>\n <div className=\"chat-message-meta\">\n {isOwn && <StatusIcon status={status} />}\n {showTimestamp && (\n <MSubText className=\"chat-message-time\">\n <MTimeAgo value={timestamp} />\n </MSubText>\n )}\n </div>\n </div>\n </div>\n )\n}\n","import {useRef, useEffect, useCallback} from 'react'\nimport type {MChatBodyProps} from './MChat.types'\nimport {useMChatContext} from './MChatContext'\nimport {MChatMessage} from './MChatMessage'\nimport {MSpinner} from '../../feedback'\nimport {cn} from '../../../utils/cn'\n\nexport function MChatBody({\n messages,\n onScrollTop,\n loading = false,\n color: colorProp,\n className,\n children,\n ...rest\n}: MChatBodyProps) {\n const {color: ctxColor} = useMChatContext()\n const color = colorProp ?? ctxColor\n\n const containerRef = useRef<HTMLDivElement>(null)\n const stickToBottom = useRef(true)\n const prevMessageCount = useRef(0)\n\n const scrollToBottom = useCallback(() => {\n const el = containerRef.current\n if (el) el.scrollTop = el.scrollHeight\n }, [])\n\n useEffect(() => {\n const count = messages?.length ?? 0\n if (count > prevMessageCount.current && stickToBottom.current) {\n scrollToBottom()\n }\n prevMessageCount.current = count\n }, [messages?.length, scrollToBottom])\n\n useEffect(() => {\n scrollToBottom()\n }, [scrollToBottom])\n\n const handleScroll = () => {\n const el = containerRef.current\n if (!el) return\n\n const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 40\n stickToBottom.current = atBottom\n\n if (el.scrollTop < 40 && onScrollTop && !loading) {\n onScrollTop()\n }\n }\n\n return (\n <div ref={containerRef} className={cn('chat-body', className)} onScroll={handleScroll} {...rest}>\n {loading && (\n <div className=\"chat-body-loader\">\n <MSpinner size=\"sm\" />\n </div>\n )}\n {messages?.map((msg) => (\n <MChatMessage key={msg.id} message={msg} color={color} />\n ))}\n {children}\n </div>\n )\n}\n","import type {MChatEmojiCategory} from './MChat.types'\n\nexport const chatEmojiCategories: MChatEmojiCategory[] = [\n {\n label: 'Smileys',\n emojis: [\n '😀',\n '😃',\n '😄',\n '😁',\n '😆',\n '😅',\n '🤣',\n '😂',\n '🙂',\n '😊',\n '😇',\n '🥰',\n '😍',\n '🤩',\n '😘',\n '😗',\n '😋',\n '😛',\n '😜',\n '🤪',\n '😝',\n '🤗',\n '🤔',\n '🫡',\n '🤐',\n '🤨',\n '😐',\n '😑',\n '😶',\n '🫠',\n '😏',\n '😒',\n '🙄',\n '😬',\n '😮💨',\n '🤥',\n '😌',\n '😔',\n '😪',\n '🤤',\n '😴',\n '😷',\n '🤒',\n '🤕',\n '🤢',\n '🤮',\n '🤧',\n '🥵',\n '🥶',\n '😵',\n '🤯',\n '🥳',\n '🥸',\n '😎',\n '🤓',\n '🧐',\n ],\n },\n {\n label: 'Gestures',\n emojis: [\n '👋',\n '🤚',\n '🖐️',\n '✋',\n '🖖',\n '🫱',\n '🫲',\n '👌',\n '🤌',\n '🤏',\n '✌️',\n '🤞',\n '🫰',\n '🤟',\n '🤘',\n '🤙',\n '👈',\n '👉',\n '👆',\n '👇',\n '☝️',\n '👍',\n '👎',\n '✊',\n '👊',\n '🤛',\n '🤜',\n '👏',\n '🙌',\n '🫶',\n '👐',\n '🤝',\n ],\n },\n {\n label: 'Hearts',\n emojis: [\n '❤️',\n '🧡',\n '💛',\n '💚',\n '💙',\n '💜',\n '🖤',\n '🤍',\n '🤎',\n '💔',\n '❤️🔥',\n '❤️🩹',\n '💕',\n '💞',\n '💓',\n '💗',\n '💖',\n '💘',\n '💝',\n '💟',\n ],\n },\n {\n label: 'Objects',\n emojis: [\n '🔥',\n '✨',\n '🌟',\n '💫',\n '⚡',\n '💥',\n '🎉',\n '🎊',\n '🏆',\n '🥇',\n '🎯',\n '💡',\n '📌',\n '📎',\n '✅',\n '❌',\n '⭐',\n '💬',\n '👁️🗨️',\n '🔔',\n ],\n },\n]\n","import {useState, useRef, useCallback, useEffect} from 'react'\nimport type {KeyboardEvent, DragEvent} from 'react'\nimport type {MChatInputProps} from './MChat.types'\nimport {useMChatContext} from './MChatContext'\nimport {MButton} from '../../controls'\nimport {MImage} from '../../media'\nimport {MPopover} from '../../primitives'\nimport {MAttachIcon, MCloseIcon, MSendIcon} from '../../../icons'\nimport {cn} from '../../../utils/cn'\nimport {chatEmojiCategories} from './emojis'\n\nconst ACCEPT_IMAGES = 'image/png,image/jpeg,image/gif,image/webp'\n\nexport function MChatInput({\n onSend,\n placeholder = 'Type a message…',\n disabled = false,\n showEmoji = true,\n showAttach = true,\n onTyping,\n color: colorProp,\n className,\n ...rest\n}: MChatInputProps) {\n const {color: ctxColor} = useMChatContext()\n const color = colorProp ?? ctxColor\n const [value, setValue] = useState('')\n const [emojiOpen, setEmojiOpen] = useState(false)\n const [attachedFiles, setAttachedFiles] = useState<File[]>([])\n const [previews, setPreviews] = useState<string[]>([])\n const [dragOver, setDragOver] = useState(false)\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n const emojiButtonRef = useRef<HTMLButtonElement>(null)\n const fileInputRef = useRef<HTMLInputElement>(null)\n const typingRef = useRef(false)\n const typingTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n\n const addFiles = useCallback((files: File[]) => {\n const imageFiles = files.filter((f) => f.type.startsWith('image/'))\n if (imageFiles.length === 0) return\n\n setAttachedFiles((prev) => [...prev, ...imageFiles])\n\n imageFiles.forEach((file) => {\n const url = URL.createObjectURL(file)\n setPreviews((prev) => [...prev, url])\n })\n }, [])\n\n const removeFile = useCallback((index: number) => {\n setPreviews((prev) => {\n URL.revokeObjectURL(prev[index])\n return prev.filter((_, i) => i !== index)\n })\n setAttachedFiles((prev) => prev.filter((_, i) => i !== index))\n }, [])\n\n useEffect(() => {\n return () => previews.forEach((url) => URL.revokeObjectURL(url))\n }, [])\n\n const send = useCallback(() => {\n const trimmed = value.trim()\n if (!trimmed && attachedFiles.length === 0) return\n if (disabled) return\n\n onSend?.(trimmed, attachedFiles.length > 0 ? attachedFiles : undefined)\n setValue('')\n setAttachedFiles([])\n setPreviews((prev) => {\n prev.forEach((url) => URL.revokeObjectURL(url))\n return []\n })\n if (textareaRef.current) {\n textareaRef.current.style.height = 'auto'\n }\n if (typingRef.current) {\n typingRef.current = false\n onTyping?.(false)\n }\n }, [value, attachedFiles, disabled, onSend, onTyping])\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n send()\n }\n }\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setValue(e.target.value)\n autoResize(e.target)\n\n if (onTyping) {\n if (!typingRef.current) {\n typingRef.current = true\n onTyping(true)\n }\n clearTimeout(typingTimerRef.current)\n typingTimerRef.current = setTimeout(() => {\n typingRef.current = false\n onTyping(false)\n }, 1500)\n }\n }\n\n const autoResize = (el: HTMLTextAreaElement) => {\n el.style.height = 'auto'\n el.style.height = Math.min(el.scrollHeight, 120) + 'px'\n }\n\n useEffect(() => {\n return () => clearTimeout(typingTimerRef.current)\n }, [])\n\n const insertEmoji = (emoji: string) => {\n setValue((prev) => prev + emoji)\n setEmojiOpen(false)\n textareaRef.current?.focus()\n }\n\n const handleDragOver = (e: DragEvent) => {\n e.preventDefault()\n setDragOver(true)\n }\n\n const handleDragLeave = (e: DragEvent) => {\n e.preventDefault()\n setDragOver(false)\n }\n\n const handleDrop = (e: DragEvent) => {\n e.preventDefault()\n setDragOver(false)\n const files = Array.from(e.dataTransfer.files)\n addFiles(files)\n }\n\n const handleFileSelect = () => {\n const files = fileInputRef.current?.files\n if (files) addFiles(Array.from(files))\n if (fileInputRef.current) fileInputRef.current.value = ''\n }\n\n const canSend = value.trim() || attachedFiles.length > 0\n\n return (\n <div\n className={cn('chat-input', dragOver && 'drag-over', className)}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n {...rest}\n >\n {previews.length > 0 && (\n <div className=\"chat-input-previews\">\n {previews.map((src, i) => (\n <div key={i} className=\"chat-input-preview\">\n <MImage src={src} alt=\"\" fit=\"cover\" rounded className=\"chat-input-preview-img\" />\n <button\n type=\"button\"\n className=\"chat-input-preview-remove\"\n onClick={() => removeFile(i)}\n aria-label=\"Remove image\"\n >\n <MCloseIcon />\n </button>\n </div>\n ))}\n </div>\n )}\n <div className=\"chat-input-field\">\n {showEmoji && (\n <>\n <button\n ref={emojiButtonRef}\n type=\"button\"\n className=\"chat-input-emoji-trigger\"\n onClick={() => setEmojiOpen((o) => !o)}\n aria-label=\"Emoji\"\n disabled={disabled}\n >\n 😊\n </button>\n <MPopover\n open={emojiOpen}\n anchorRef={emojiButtonRef as React.RefObject<HTMLElement>}\n onClose={() => setEmojiOpen(false)}\n placement=\"top-start\"\n >\n <div className=\"chat-emoji-picker\">\n {chatEmojiCategories.map((cat) => (\n <div key={cat.label} className=\"chat-emoji-category\">\n <div className=\"chat-emoji-category-label\">{cat.label}</div>\n <div className=\"chat-emoji-grid\">\n {cat.emojis.map((emoji) => (\n <button\n key={emoji}\n type=\"button\"\n className=\"chat-emoji-btn\"\n onClick={() => insertEmoji(emoji)}\n >\n {emoji}\n </button>\n ))}\n </div>\n </div>\n ))}\n </div>\n </MPopover>\n </>\n )}\n {showAttach && (\n <>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={ACCEPT_IMAGES}\n multiple\n className=\"chat-input-file-hidden\"\n onChange={handleFileSelect}\n tabIndex={-1}\n />\n <button\n type=\"button\"\n className=\"chat-input-attach-trigger\"\n onClick={() => fileInputRef.current?.click()}\n aria-label=\"Attach image\"\n disabled={disabled}\n >\n <MAttachIcon color=\"inherit\" />\n </button>\n </>\n )}\n <textarea\n ref={textareaRef}\n className=\"chat-input-textarea\"\n value={value}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n rows={1}\n />\n <MButton\n variant=\"filled\"\n size=\"sm\"\n color={color ?? 'primary'}\n iconOnly\n shape=\"circle\"\n className=\"chat-input-send\"\n onClick={send}\n disabled={disabled || !canSend}\n aria-label=\"Send\"\n >\n <MSendIcon />\n </MButton>\n </div>\n </div>\n )\n}\n","import type {MChatTypingIndicatorProps} from './MChat.types'\nimport {MAvatar} from '../../media'\nimport {cn} from '../../../utils/cn'\n\nexport function MChatTypingIndicator({users = [], visible = true, className, ...rest}: MChatTypingIndicatorProps) {\n if (!visible || users.length === 0) return null\n\n const label =\n users.length === 1\n ? `${users[0].name} is typing`\n : users.length === 2\n ? `${users[0].name} and ${users[1].name} are typing`\n : `${users[0].name} and ${users.length - 1} others are typing`\n\n return (\n <div className={cn('chat-typing', className)} aria-label={label} {...rest}>\n {users.length === 1 && (\n <MAvatar src={users[0].avatar} name={users[0].name} size=\"sm\" className=\"chat-typing-avatar\" />\n )}\n <div className=\"chat-typing-dots\">\n <span className=\"chat-typing-dot\" />\n <span className=\"chat-typing-dot\" />\n <span className=\"chat-typing-dot\" />\n </div>\n </div>\n )\n}\n","import type {MChatConversationListProps} from './MChat.types'\nimport {cn} from '../../../utils/cn'\n\nexport function MChatConversationList({className, children, ...rest}: MChatConversationListProps) {\n return (\n <div className={cn('chat-conversation-list', className)} {...rest}>\n {children}\n </div>\n )\n}\n;(MChatConversationList as any).__chatConversationList = true\n","import type {MChatConversationItemProps} from './MChat.types'\nimport {useMChatContext} from './MChatContext'\nimport {MAvatar} from '../../media'\nimport {MText, MSubText} from '../../typography'\nimport {MBadge} from '../../feedback'\nimport {MTimeAgo} from '../../display'\nimport {cn} from '../../../utils/cn'\n\nexport function MChatConversationItem({\n conversation,\n active = false,\n color: colorProp,\n onClick,\n className,\n ...rest\n}: MChatConversationItemProps) {\n const {color: ctxColor} = useMChatContext()\n const color = colorProp ?? ctxColor\n const {title, participants, lastMessage, unreadCount} = conversation\n const displayName = title ?? participants.map((p) => p.name).join(', ')\n const firstParticipant = participants[0]\n const hasOnline = participants.some((p) => p.online)\n\n return (\n <div\n className={cn('chat-conversation-item', active && 'active', className)}\n onClick={() => onClick?.(conversation)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onClick?.(conversation)\n }\n }}\n {...rest}\n >\n <MAvatar\n src={firstParticipant?.avatar}\n name={firstParticipant?.name}\n size=\"md\"\n color={color}\n badge={hasOnline}\n badgeColor=\"success\"\n className=\"chat-conversation-avatar\"\n />\n <div className=\"chat-conversation-info\">\n <div className=\"chat-conversation-top\">\n <MText className=\"chat-conversation-name\">{displayName}</MText>\n {lastMessage && (\n <MSubText className=\"chat-conversation-time\">\n <MTimeAgo value={lastMessage.timestamp} />\n </MSubText>\n )}\n </div>\n {lastMessage && (\n <div className=\"chat-conversation-bottom\">\n <MSubText className=\"chat-conversation-preview\">\n {lastMessage.isOwn ? 'You: ' : ''}\n {lastMessage.content}\n </MSubText>\n {!!unreadCount && unreadCount > 0 && (\n <MBadge color={color ?? 'primary'} size=\"sm\" rounded>\n {unreadCount}\n </MBadge>\n )}\n </div>\n )}\n </div>\n </div>\n )\n}\n","import {useEffect, useRef, useState} from 'react'\nimport type {CSSProperties, DragEvent, MouseEvent, ReactNode} from 'react'\nimport type {\n MTreeViewProps,\n MTreeItemProps,\n MTreeNode,\n MTreeViewContextMenuItem,\n MTreeViewMoveEvent,\n} from './MTreeView.types'\nimport {cn} from '../../../utils/cn'\nimport {MPortal} from '../../primitives'\nimport {\n MChevronRightIcon,\n MFileCodeIcon,\n MFileCsvIcon,\n MFileCssIcon,\n MFileExeIcon,\n MFileGifIcon,\n MFileHtmlIcon,\n MFileIcon,\n MFileImageIcon,\n MFileJpgIcon,\n MFileJsIcon,\n MFileJsonIcon,\n MFileMdIcon,\n MFileMp3Icon,\n MFileMp4Icon,\n MFileOdtIcon,\n MFilePdfIcon,\n MFilePhpIcon,\n MFilePngIcon,\n MFilePptIcon,\n MFileRarIcon,\n MFileSvgIcon,\n MFileTextIcon,\n MFileTsIcon,\n MFileTsxIcon,\n MFileTxtIcon,\n MFileWebpIcon,\n MFileXlsIcon,\n MFileXmlIcon,\n MFileZipIcon,\n MFolderIcon,\n MFolderOpenIcon,\n} from '../../../icons'\nimport './MTreeView.css'\nconst fileTypeMap: Record<string, ReactNode> = {\n pdf: <MFilePdfIcon />,\n ts: <MFileTsIcon />,\n tsx: <MFileTsxIcon />,\n js: <MFileJsIcon />,\n jsx: <MFileCodeIcon />,\n css: <MFileCssIcon />,\n scss: <MFileCssIcon />,\n html: <MFileHtmlIcon />,\n json: <MFileJsonIcon />,\n md: <MFileMdIcon />,\n txt: <MFileTxtIcon />,\n csv: <MFileCsvIcon />,\n zip: <MFileZipIcon />,\n rar: <MFileRarIcon />,\n svg: <MFileSvgIcon />,\n png: <MFilePngIcon />,\n jpg: <MFileJpgIcon />,\n jpeg: <MFileImageIcon />,\n gif: <MFileGifIcon />,\n webp: <MFileWebpIcon />,\n php: <MFilePhpIcon />,\n xml: <MFileXmlIcon />,\n xls: <MFileXlsIcon />,\n ppt: <MFilePptIcon />,\n odt: <MFileOdtIcon />,\n exe: <MFileExeIcon />,\n mp3: <MFileMp3Icon />,\n mp4: <MFileMp4Icon />,\n}\n\n// Read the file extension once so icon logic stays predictable.\nfunction getFileExtension(label: string): string | null {\n const dot = label.lastIndexOf('.')\n if (dot < 1) return null\n return label.slice(dot + 1).toLowerCase()\n}\n\n// Treat explicit folders and nodes with children as directory-like.\nfunction isFolderNode(node: MTreeNode) {\n return node.kind === 'folder' || Boolean(node.children?.length)\n}\n\n// Resolve the proper file icon by extension.\nfunction getFileIcon(label: string): ReactNode {\n const ext = getFileExtension(label)\n if (!ext) return <MFileIcon />\n\n return fileTypeMap[ext] ?? <MFileTextIcon />\n}\n\n// Prefer custom icons first, then fall back to folder or file visuals.\nfunction getDefaultIcon(node: MTreeNode, isExpanded: boolean, fileIcons: boolean) {\n if (node.icon) return node.icon\n if (!fileIcons) return null\n\n if (isFolderNode(node)) return isExpanded ? <MFolderOpenIcon /> : <MFolderIcon />\n\n return getFileIcon(node.label)\n}\n\n// Cache nodes and descendants so drag-drop validation stays fast.\nfunction buildTreeLookup(items: MTreeNode[]) {\n const nodeMap = new Map<string, MTreeNode>()\n const descendants = new Map<string, Set<string>>()\n\n function walk(node: MTreeNode) {\n nodeMap.set(node.id, node)\n\n const childIds = new Set<string>()\n\n for (const child of node.children ?? []) {\n childIds.add(child.id)\n\n const nestedIds = walk(child)\n nestedIds.forEach((id) => childIds.add(id))\n }\n\n descendants.set(node.id, childIds)\n return childIds\n }\n\n items.forEach(walk)\n\n return {nodeMap, descendants}\n}\n\n// Keep the context menu inside the viewport.\nfunction clampMenuPosition(x: number, y: number) {\n if (typeof window === 'undefined') {\n return {x, y}\n }\n\n return {\n x: Math.max(8, Math.min(x, window.innerWidth - 220)),\n y: Math.max(8, Math.min(y, window.innerHeight - 16)),\n }\n}\n\n// Render one visible row and recurse into children when expanded.\nfunction TreeItem({\n node,\n level,\n expandable,\n selectable,\n expandedIds,\n selectedId,\n draggedId,\n dropTargetId,\n onToggle,\n onSelect,\n indent,\n showLines,\n fileIcons,\n draggable,\n canDropOnNode,\n onContextMenu,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n}: MTreeItemProps) {\n const hasChildren = isFolderNode(node)\n const isExpanded = expandedIds.has(node.id)\n const isSelected = selectedId === node.id\n const isDragging = draggedId === node.id\n const isDropTarget = dropTargetId === node.id\n const canDrop = canDropOnNode?.(node)\n const icon = getDefaultIcon(node, isExpanded, !!fileIcons)\n\n return (\n <li role=\"treeitem\" aria-expanded={hasChildren ? isExpanded : undefined}>\n <div\n className={cn(\n 'item',\n isSelected && 'selected',\n node.disabled && 'disabled',\n selectable && !node.disabled && 'selectable',\n draggable && !node.disabled && 'draggable',\n isDragging && 'dragging',\n canDrop && 'can-drop',\n isDropTarget && 'drop-target'\n )}\n style={{paddingLeft: level * indent}}\n draggable={draggable && !node.disabled}\n onClick={() => {\n if (node.disabled) return\n if (hasChildren && expandable) onToggle(node.id)\n if (selectable) onSelect?.(node.id, node)\n }}\n onContextMenu={(event) => onContextMenu?.(event, node)}\n onDragStart={(event) => onDragStart?.(event, node)}\n onDragOver={(event) => onDragOver?.(event, node)}\n onDrop={(event) => onDrop?.(event, node)}\n onDragEnd={onDragEnd}\n >\n <span className=\"toggle\">\n {hasChildren && expandable ? (\n <span className={cn('arrow', isExpanded && 'expanded')}>\n <MChevronRightIcon />\n </span>\n ) : (\n <span className=\"spacer\" />\n )}\n </span>\n {icon && <span className=\"icon\">{icon}</span>}\n <span className=\"label\">{node.label}</span>\n </div>\n {hasChildren && isExpanded && (\n <ul\n className=\"list\"\n role=\"group\"\n style={showLines ? ({'--line-left': `${level * indent + 17}px`} as CSSProperties) : undefined}\n >\n {(node.children ?? []).map((child) => (\n <TreeItem\n key={child.id}\n node={child}\n level={level + 1}\n expandable={expandable}\n selectable={selectable}\n expandedIds={expandedIds}\n selectedId={selectedId}\n draggedId={draggedId}\n dropTargetId={dropTargetId}\n onToggle={onToggle}\n onSelect={onSelect}\n indent={indent}\n showLines={showLines}\n fileIcons={fileIcons}\n draggable={draggable}\n canDropOnNode={canDropOnNode}\n onContextMenu={onContextMenu}\n onDragStart={onDragStart}\n onDragOver={onDragOver}\n onDrop={onDrop}\n onDragEnd={onDragEnd}\n />\n ))}\n </ul>\n )}\n </li>\n )\n}\n\n// Render a file tree with selection, context actions and folder moves.\nexport function MTreeView({\n items,\n expandable = true,\n selectable = false,\n defaultExpanded = [],\n expanded: controlledExpanded,\n onExpandChange,\n selected: controlledSelected,\n onSelect,\n indent = 20,\n showLines = true,\n fileIcons = true,\n draggable = false,\n canDrop,\n onMove,\n contextMenuItems,\n onContextMenuAction,\n className,\n ...rest\n}: MTreeViewProps) {\n const [internalExpanded, setInternalExpanded] = useState<string[]>(defaultExpanded)\n const [internalSelected, setInternalSelected] = useState<string | null>(null)\n const [draggedId, setDraggedId] = useState<string | null>(null)\n const [dropTargetId, setDropTargetId] = useState<string | null>(null)\n const [menu, setMenu] = useState<{\n node: MTreeNode\n items: MTreeViewContextMenuItem[]\n x: number\n y: number\n } | null>(null)\n const menuRef = useRef<HTMLDivElement>(null)\n\n const expandedArr = controlledExpanded ?? internalExpanded\n const expandedIds = new Set(expandedArr)\n const selectedId = controlledSelected !== undefined ? controlledSelected : internalSelected\n const {nodeMap, descendants} = buildTreeLookup(items)\n const draggedNode = draggedId ? (nodeMap.get(draggedId) ?? null) : null\n\n useEffect(() => {\n if (!menu) return\n\n function closeMenu(event?: Event) {\n if (event && menuRef.current && menuRef.current.contains(event.target as Node)) {\n return\n }\n\n setMenu(null)\n }\n\n function handleKey(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n setMenu(null)\n }\n }\n\n document.addEventListener('mousedown', closeMenu)\n document.addEventListener('scroll', closeMenu, true)\n window.addEventListener('resize', closeMenu)\n document.addEventListener('keydown', handleKey)\n\n return () => {\n document.removeEventListener('mousedown', closeMenu)\n document.removeEventListener('scroll', closeMenu, true)\n window.removeEventListener('resize', closeMenu)\n document.removeEventListener('keydown', handleKey)\n }\n }, [menu])\n\n function handleToggle(id: string) {\n const next = expandedIds.has(id) ? expandedArr.filter((e) => e !== id) : [...expandedArr, id]\n if (onExpandChange) onExpandChange(next)\n else setInternalExpanded(next)\n }\n\n function handleSelect(id: string, node: MTreeNode) {\n if (onSelect) onSelect(id, node)\n else setInternalSelected(id)\n }\n\n function closeDrag() {\n setDraggedId(null)\n setDropTargetId(null)\n }\n\n function isValidDropTarget(targetNode: MTreeNode) {\n if (!draggedNode || !draggable || !onMove) return false\n if (targetNode.disabled || !isFolderNode(targetNode)) return false\n if (targetNode.id === draggedNode.id) return false\n if (descendants.get(draggedNode.id)?.has(targetNode.id)) return false\n\n return canDrop ? canDrop(draggedNode, targetNode) : true\n }\n\n function handleContextMenu(event: MouseEvent<HTMLDivElement>, node: MTreeNode) {\n if (!contextMenuItems || node.disabled) return\n\n const items = contextMenuItems(node).filter(Boolean)\n if (!items.length) return\n\n event.preventDefault()\n handleSelect(node.id, node)\n\n const pos = clampMenuPosition(event.clientX, event.clientY)\n setMenu({\n node,\n items,\n x: pos.x,\n y: pos.y,\n })\n }\n\n function handleDragStart(event: DragEvent<HTMLDivElement>, node: MTreeNode) {\n if (!draggable || node.disabled) return\n\n event.dataTransfer.effectAllowed = 'move'\n event.dataTransfer.setData('text/plain', node.id)\n setMenu(null)\n setDraggedId(node.id)\n }\n\n function handleDragOver(event: DragEvent<HTMLDivElement>, targetNode: MTreeNode) {\n if (!isValidDropTarget(targetNode)) return\n\n event.preventDefault()\n event.dataTransfer.dropEffect = 'move'\n setDropTargetId(targetNode.id)\n }\n\n function handleDrop(event: DragEvent<HTMLDivElement>, targetNode: MTreeNode) {\n event.preventDefault()\n\n if (!draggedNode || !isValidDropTarget(targetNode)) {\n closeDrag()\n return\n }\n\n onMove?.({\n draggedId: draggedNode.id,\n draggedNode,\n targetId: targetNode.id,\n targetNode,\n } satisfies MTreeViewMoveEvent)\n\n if (expandable && !expandedIds.has(targetNode.id)) {\n handleToggle(targetNode.id)\n }\n\n closeDrag()\n }\n\n return (\n <div className={cn('tree', showLines && 'lines', className)} {...rest}>\n <ul className=\"list\" role=\"tree\">\n {items.map((item) => (\n <TreeItem\n key={item.id}\n node={item}\n level={0}\n expandable={expandable}\n selectable={selectable}\n expandedIds={expandedIds}\n selectedId={selectedId}\n draggedId={draggedId}\n dropTargetId={dropTargetId}\n onToggle={handleToggle}\n onSelect={handleSelect}\n indent={indent}\n showLines={showLines}\n fileIcons={fileIcons}\n draggable={draggable}\n canDropOnNode={isValidDropTarget}\n onContextMenu={handleContextMenu}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n onDragEnd={closeDrag}\n />\n ))}\n </ul>\n {menu && (\n <MPortal>\n <div ref={menuRef} className=\"tree menu\" style={{top: menu.y, left: menu.x}} role=\"menu\">\n {menu.items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n className={cn('action', item.color, item.disabled && 'disabled')}\n role=\"menuitem\"\n disabled={item.disabled}\n onClick={() => {\n if (item.disabled) return\n onContextMenuAction?.(item.id, menu.node)\n setMenu(null)\n }}\n >\n {item.icon && <span className=\"icon\">{item.icon}</span>}\n <span>{item.label}</span>\n </button>\n ))}\n </div>\n </MPortal>\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 strikethrough = true,\n onChange,\n className,\n ...rest\n}: MTaskListProps) {\n return (\n <div className={cn('task list', `color-${color}`, 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=\"sm\"\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 {useMemo, useState} from 'react'\nimport type {ReactNode} from 'react'\nimport type {\n MFileManagerActionEvent,\n MFileManagerLocale,\n MFileManagerMoveEvent,\n MFileManagerNode,\n MFileManagerProps,\n MFileManagerSelectionEvent,\n MFileManagerView,\n} from './MFileManager.types'\nimport {MButton} from '../../controls'\nimport {MBadge} from '../../feedback'\nimport {MInputSearch} from '../../inputs'\nimport {MInline, MStack} from '../../layout'\nimport {MDropdownItem, MDropdownMenu} from '../../overlays'\nimport {MText} from '../../typography'\nimport {MTreeView} from '../MTreeView'\nimport {\n MArrowRightIcon,\n MDownloadIcon,\n MEditIcon,\n MEllipsisVerticalIcon,\n MFileCodeIcon,\n MFileCsvIcon,\n MFileCssIcon,\n MFileExeIcon,\n MFileGifIcon,\n MFileHtmlIcon,\n MFileIcon,\n MFileImageIcon,\n MFileJpgIcon,\n MFileJsIcon,\n MFileJsonIcon,\n MFileMdIcon,\n MFileMp3Icon,\n MFileMp4Icon,\n MFileOdtIcon,\n MFilePdfIcon,\n MFilePhpIcon,\n MFilePngIcon,\n MFilePptIcon,\n MFileRarIcon,\n MFileSvgIcon,\n MFileTextIcon,\n MFileTsIcon,\n MFileTsxIcon,\n MFileTxtIcon,\n MFileWebpIcon,\n MFileXlsIcon,\n MFileXmlIcon,\n MFileZipIcon,\n MFolderPlusIcon,\n MFolderIcon,\n MFolderOpenIcon,\n MHomeIcon,\n MTrashIcon,\n} from '../../../icons'\nimport {useMFileManagerTexts} from '../../../i18n/frameworkTexts'\nimport {cn} from '../../../utils/cn'\nimport {useDocumentLocale} from '../../../utils/locale'\nimport './MFileManager.css'\n\ninterface FileManagerMenuAction {\n id: string\n label: ReactNode\n icon?: ReactNode\n color?: 'primary' | 'error'\n}\n\nconst fileTypeMap: Record<string, ReactNode> = {\n pdf: <MFilePdfIcon />,\n ts: <MFileTsIcon />,\n tsx: <MFileTsxIcon />,\n js: <MFileJsIcon />,\n jsx: <MFileCodeIcon />,\n css: <MFileCssIcon />,\n scss: <MFileCssIcon />,\n html: <MFileHtmlIcon />,\n json: <MFileJsonIcon />,\n md: <MFileMdIcon />,\n txt: <MFileTxtIcon />,\n csv: <MFileCsvIcon />,\n zip: <MFileZipIcon />,\n rar: <MFileRarIcon />,\n svg: <MFileSvgIcon />,\n png: <MFilePngIcon />,\n jpg: <MFileJpgIcon />,\n jpeg: <MFileImageIcon />,\n gif: <MFileGifIcon />,\n webp: <MFileWebpIcon />,\n php: <MFilePhpIcon />,\n xml: <MFileXmlIcon />,\n xls: <MFileXlsIcon />,\n ppt: <MFilePptIcon />,\n odt: <MFileOdtIcon />,\n exe: <MFileExeIcon />,\n mp3: <MFileMp3Icon />,\n mp4: <MFileMp4Icon />,\n}\n\nfunction getFileExtension(label: string): string | null {\n const dot = label.lastIndexOf('.')\n if (dot < 1) return null\n return label.slice(dot + 1).toLowerCase()\n}\n\nfunction isFolderNode(node: MFileManagerNode | null | undefined) {\n return node?.kind === 'folder' || Boolean(node?.children?.length)\n}\n\nfunction getFileIcon(label: string): ReactNode {\n const ext = getFileExtension(label)\n if (!ext) return <MFileIcon />\n\n return fileTypeMap[ext] ?? <MFileTextIcon />\n}\n\nfunction getNodeIcon(node: MFileManagerNode, isExpanded = false): ReactNode {\n if (node.icon) return node.icon\n if (isFolderNode(node)) return isExpanded ? <MFolderOpenIcon /> : <MFolderIcon />\n return getFileIcon(node.label)\n}\n\nfunction formatBytes(value?: number) {\n if (!value || value < 1) return null\n\n const units = ['B', 'KB', 'MB', 'GB', 'TB']\n let current = value\n let index = 0\n\n while (current >= 1024 && index < units.length - 1) {\n current /= 1024\n index += 1\n }\n\n const digits = current >= 100 || index === 0 ? 0 : 1\n return `${current.toFixed(digits)} ${units[index]}`\n}\n\nfunction formatModifiedAt(value: Date | string | undefined, locale: MFileManagerLocale) {\n if (!value) return null\n\n const date = value instanceof Date ? value : new Date(value)\n if (Number.isNaN(date.getTime())) return null\n\n return new Intl.DateTimeFormat(locale, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n }).format(date)\n}\n\nfunction buildLookup(items: MFileManagerNode[]) {\n const nodeMap = new Map<string, MFileManagerNode>()\n const parentMap = new Map<string, string | null>()\n\n function walk(nodes: MFileManagerNode[], parentId: string | null) {\n for (const node of nodes) {\n nodeMap.set(node.id, node)\n parentMap.set(node.id, parentId)\n\n if (node.children?.length) {\n walk(node.children, node.id)\n }\n }\n }\n\n walk(items, null)\n\n return {nodeMap, parentMap}\n}\n\nfunction buildFolderTree(items: MFileManagerNode[]): MFileManagerNode[] {\n return items.flatMap((node) => {\n if (!isFolderNode(node)) return []\n\n return [\n {\n ...node,\n kind: 'folder',\n children: buildFolderTree(node.children ?? []),\n },\n ]\n })\n}\n\nfunction buildPath(id: string | null, nodeMap: Map<string, MFileManagerNode>, parentMap: Map<string, string | null>) {\n const path: MFileManagerNode[] = []\n let currentId = id\n\n while (currentId) {\n const node = nodeMap.get(currentId)\n if (!node) break\n path.unshift(node)\n currentId = parentMap.get(currentId) ?? null\n }\n\n return path\n}\n\nfunction resolveFolderId(\n value: string | null | undefined,\n nodeMap: Map<string, MFileManagerNode>,\n parentMap: Map<string, string | null>\n) {\n if (!value) return null\n\n const node = nodeMap.get(value)\n if (!node) return null\n if (isFolderNode(node)) return node.id\n\n return parentMap.get(node.id) ?? null\n}\n\nfunction getCurrentItems(activeFolder: MFileManagerNode | null, items: MFileManagerNode[]) {\n return activeFolder ? (activeFolder.children ?? []) : items\n}\n\nfunction makeSelectionEvent(\n id: string | null,\n nodeMap: Map<string, MFileManagerNode>,\n parentMap: Map<string, string | null>,\n activeFolderId: string | null,\n activeFolder: MFileManagerNode | null\n): MFileManagerSelectionEvent {\n const node = id ? (nodeMap.get(id) ?? null) : null\n const parentId = node ? (parentMap.get(node.id) ?? null) : null\n\n return {\n id,\n node,\n parentId,\n parentNode: parentId ? (nodeMap.get(parentId) ?? null) : null,\n activeFolderId,\n activeFolder,\n }\n}\n\nfunction getDefaultItemActions(\n node: MFileManagerNode,\n texts: ReturnType<typeof useMFileManagerTexts>\n): FileManagerMenuAction[] {\n return [\n ...(isFolderNode(node)\n ? []\n : [{id: 'download', label: texts.download, icon: <MDownloadIcon />, color: 'primary' as const}]),\n {id: 'rename', label: texts.rename, icon: <MEditIcon />},\n {id: 'move', label: texts.moveTo, icon: <MArrowRightIcon />},\n {id: 'delete', label: texts.delete, icon: <MTrashIcon />, color: 'error' as const},\n ]\n}\n\nfunction getDefaultContextMenuActions(\n node: MFileManagerNode,\n texts: ReturnType<typeof useMFileManagerTexts>\n): FileManagerMenuAction[] {\n return [\n ...(isFolderNode(node) ? [{id: 'new-folder', label: texts.newFolder, icon: <MFolderPlusIcon />}] : []),\n ...getDefaultItemActions(node, texts),\n ]\n}\n\nexport function MFileManager({\n items,\n locale: localeOverride,\n defaultExpanded = [],\n expanded,\n onExpandChange,\n folderId: controlledFolderId,\n defaultFolderId = null,\n onFolderChange,\n selectedId: controlledSelectedId,\n onSelectionChange,\n view: controlledView,\n defaultView = 'list',\n onViewChange,\n searchValue: controlledSearch,\n defaultSearchValue = '',\n onSearchChange,\n searchable = true,\n searchPlaceholder,\n showSidebar = true,\n showPreview = true,\n emptyText,\n toolbarActions = [],\n onToolbarAction,\n onOpenItem,\n onItemAction,\n onContextMenuAction,\n canDrop,\n onMove,\n renderPreview,\n className,\n ...rest\n}: MFileManagerProps) {\n const locale = useDocumentLocale(localeOverride)\n const texts = useMFileManagerTexts()\n const [internalFolderId, setInternalFolderId] = useState<string | null>(defaultFolderId)\n const [internalSelectedId, setInternalSelectedId] = useState<string | null>(null)\n const [internalView, setInternalView] = useState<MFileManagerView>(defaultView)\n const [internalSearch, setInternalSearch] = useState(defaultSearchValue)\n\n const {nodeMap, parentMap} = useMemo(() => buildLookup(items), [items])\n const folderTree = useMemo(() => buildFolderTree(items), [items])\n\n const rawFolderId = controlledFolderId !== undefined ? controlledFolderId : internalFolderId\n const activeFolderId = resolveFolderId(rawFolderId, nodeMap, parentMap)\n const activeFolder = activeFolderId ? (nodeMap.get(activeFolderId) ?? null) : null\n\n const rawSelectedId = controlledSelectedId !== undefined ? controlledSelectedId : internalSelectedId\n const selectedNode = rawSelectedId ? (nodeMap.get(rawSelectedId) ?? null) : null\n const selectedId = selectedNode ? selectedNode.id : null\n\n const activeView = controlledView ?? internalView\n const search = controlledSearch ?? internalSearch\n const currentItems = getCurrentItems(activeFolder, items)\n const query = search.trim().toLowerCase()\n const activePath = buildPath(activeFolderId, nodeMap, parentMap)\n const effectiveSearchPlaceholder = searchPlaceholder ?? texts.searchPlaceholder\n const effectiveEmptyText = emptyText ?? texts.emptyText\n const hasNodeActionHandler = Boolean(onItemAction || onContextMenuAction)\n\n const visibleItems = useMemo(() => {\n if (!query) return currentItems\n\n return currentItems.filter((item) => item.label.toLowerCase().includes(query))\n }, [currentItems, query])\n\n function changeFolder(nextId: string | null) {\n const nextFolderId = resolveFolderId(nextId, nodeMap, parentMap)\n const nextFolder = nextFolderId ? (nodeMap.get(nextFolderId) ?? null) : null\n\n if (onFolderChange) onFolderChange(nextFolderId, nextFolder)\n else setInternalFolderId(nextFolderId)\n }\n\n function changeSelection(\n nextId: string | null,\n nextActiveFolderId = activeFolderId,\n nextActiveFolder = activeFolder\n ) {\n const event = makeSelectionEvent(nextId, nodeMap, parentMap, nextActiveFolderId, nextActiveFolder)\n\n if (onSelectionChange) onSelectionChange(event)\n else setInternalSelectedId(nextId)\n }\n\n function changeView(nextView: MFileManagerView) {\n if (onViewChange) onViewChange(nextView)\n else setInternalView(nextView)\n }\n\n function changeSearch(nextSearch: string) {\n if (onSearchChange) onSearchChange(nextSearch)\n else setInternalSearch(nextSearch)\n }\n\n function handleFolderSelect(id: string, node: MFileManagerNode) {\n changeFolder(id)\n changeSelection(id, node.id, node)\n }\n\n function handleItemClick(node: MFileManagerNode) {\n if (isFolderNode(node)) {\n changeFolder(node.id)\n changeSelection(node.id, node.id, node)\n return\n }\n\n changeSelection(node.id)\n }\n\n function emitToolbarAction(actionId: string) {\n if (!onToolbarAction) return\n\n const baseEvent = makeSelectionEvent(selectedId, nodeMap, parentMap, activeFolderId, activeFolder)\n onToolbarAction({\n ...baseEvent,\n actionId,\n visibleItems,\n } satisfies MFileManagerActionEvent)\n }\n\n function emitItemAction(actionId: string, node: MFileManagerNode) {\n ;(onItemAction ?? onContextMenuAction)?.(actionId, node)\n }\n\n function emitContextMenuAction(actionId: string, node: MFileManagerNode) {\n ;(onContextMenuAction ?? onItemAction)?.(actionId, node)\n }\n\n function renderItemMeta(node: MFileManagerNode) {\n const details = []\n const size = formatBytes(node.size)\n const modifiedAt = formatModifiedAt(node.modifiedAt, locale)\n\n if (isFolderNode(node)) {\n details.push(texts.itemsCount(node.children?.length ?? 0))\n }\n\n if (size) {\n details.push(size)\n }\n\n if (modifiedAt) {\n details.push(modifiedAt)\n }\n\n return details.join(' / ')\n }\n\n return (\n <div\n className={cn('file-manager', !showSidebar && 'no-sidebar', !showPreview && 'no-preview', className)}\n {...rest}\n >\n <div className=\"toolbar\">\n <div className=\"toolbar-main\">\n <div className=\"breadcrumbs\">\n <button type=\"button\" className=\"breadcrumb root\" onClick={() => changeFolder(null)}>\n <MHomeIcon />\n <MText as=\"span\" weight=\"semibold\">\n {texts.home}\n </MText>\n </button>\n {activePath.map((node) => (\n <div key={node.id} className=\"breadcrumbs\">\n <span className=\"breadcrumb-separator\">/</span>\n <button type=\"button\" className=\"breadcrumb\" onClick={() => changeFolder(node.id)}>\n <MText as=\"span\">{node.label}</MText>\n </button>\n </div>\n ))}\n </div>\n {searchable && (\n <MInputSearch\n className=\"toolbar-search\"\n size=\"sm\"\n placeholder={effectiveSearchPlaceholder}\n value={search}\n onChange={(event) => changeSearch(event.target.value)}\n onClear={() => changeSearch('')}\n />\n )}\n </div>\n <div className=\"toolbar-actions\">\n {toolbarActions.map((action) => (\n <MButton\n key={action.id}\n size=\"sm\"\n variant={action.variant ?? 'ghost'}\n color={action.color}\n disabled={action.disabled}\n onClick={() => emitToolbarAction(action.id)}\n startIcon={action.icon}\n >\n {action.label}\n </MButton>\n ))}\n <div className=\"view-switch\">\n <MButton\n size=\"sm\"\n variant={activeView === 'list' ? 'secondary' : 'ghost'}\n onClick={() => changeView('list')}\n >\n {texts.listView}\n </MButton>\n <MButton\n size=\"sm\"\n variant={activeView === 'grid' ? 'secondary' : 'ghost'}\n onClick={() => changeView('grid')}\n >\n {texts.gridView}\n </MButton>\n </div>\n </div>\n </div>\n\n <div className=\"body\">\n {showSidebar && (\n <aside className=\"panel\">\n <div className=\"panel-header\">\n <MText weight=\"semibold\">{texts.folders}</MText>\n <MBadge size=\"sm\" color=\"info\">\n {folderTree.length}\n </MBadge>\n </div>\n <div className=\"panel-body sidebar-body\">\n {folderTree.length > 0 ? (\n <MTreeView\n items={folderTree}\n selectable\n fileIcons\n defaultExpanded={defaultExpanded}\n expanded={expanded}\n onExpandChange={onExpandChange}\n selected={activeFolderId}\n onSelect={(id, node) => handleFolderSelect(id, node as MFileManagerNode)}\n draggable={Boolean(onMove)}\n canDrop={\n canDrop\n ? (draggedNode, targetNode) =>\n canDrop(\n draggedNode as MFileManagerNode,\n targetNode as MFileManagerNode\n )\n : undefined\n }\n onMove={\n onMove\n ? (event) =>\n onMove({\n draggedId: event.draggedId,\n draggedNode: event.draggedNode as MFileManagerNode,\n targetId: event.targetId,\n targetNode: event.targetNode as MFileManagerNode,\n } satisfies MFileManagerMoveEvent)\n : undefined\n }\n contextMenuItems={\n hasNodeActionHandler\n ? (node) => getDefaultContextMenuActions(node as MFileManagerNode, texts)\n : undefined\n }\n onContextMenuAction={\n hasNodeActionHandler\n ? (actionId, node) =>\n emitContextMenuAction(actionId, node as MFileManagerNode)\n : undefined\n }\n />\n ) : (\n <div className=\"empty-state\">{texts.noFoldersAvailable}</div>\n )}\n </div>\n </aside>\n )}\n\n <section className=\"panel\">\n <div className=\"panel-header\">\n <MInline align=\"center\" wrap=\"wrap\">\n <MText weight=\"semibold\">{activeFolder?.label ?? texts.home}</MText>\n <MBadge size=\"sm\">{visibleItems.length}</MBadge>\n </MInline>\n <MText size=\"sm\" tone=\"muted\">\n {query ? texts.filteredBy(search) : texts.currentFolder}\n </MText>\n </div>\n <div className=\"panel-body\">\n {visibleItems.length > 0 ? (\n <div className={cn('content-items', activeView)}>\n {visibleItems.map((node) => {\n const isSelected = selectedId === node.id\n const itemMeta = renderItemMeta(node)\n const actions = hasNodeActionHandler ? getDefaultItemActions(node, texts) : []\n\n return (\n <div key={node.id} className={cn('item-card', isSelected && 'selected')}>\n <button\n type=\"button\"\n className=\"item-card-main\"\n onClick={() => handleItemClick(node)}\n onDoubleClick={() => onOpenItem?.(node)}\n >\n <span className=\"item-icon\">{getNodeIcon(node)}</span>\n <span className=\"item-text\">\n <MText as=\"span\" weight=\"semibold\" truncate>\n {node.label}\n </MText>\n {node.description ? (\n <MText as=\"span\" size=\"sm\" tone=\"muted\" truncate={2}>\n {node.description}\n </MText>\n ) : null}\n <span className=\"item-meta\">\n <MBadge\n size=\"sm\"\n color={isFolderNode(node) ? 'info' : 'primary'}\n >\n {isFolderNode(node) ? texts.folder : texts.file}\n </MBadge>\n {itemMeta ? (\n <MText as=\"span\" size=\"sm\" tone=\"muted\" truncate>\n {itemMeta}\n </MText>\n ) : null}\n </span>\n </span>\n </button>\n {actions.length > 0 ? (\n <div className=\"item-card-actions\">\n <MDropdownMenu\n placement=\"bottom-end\"\n trigger={\n <MButton\n aria-label={`${texts.preview}: ${node.label}`}\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n >\n <MEllipsisVerticalIcon />\n </MButton>\n }\n >\n {actions.map((action) => (\n <MDropdownItem\n key={action.id}\n icon={action.icon}\n label={action.label}\n color={action.color}\n onClick={() => emitItemAction(action.id, node)}\n />\n ))}\n </MDropdownMenu>\n </div>\n ) : null}\n </div>\n )\n })}\n </div>\n ) : (\n <div className=\"empty-state\">{effectiveEmptyText}</div>\n )}\n </div>\n </section>\n\n {showPreview && (\n <aside className=\"panel\">\n <div className=\"panel-header\">\n <MText weight=\"semibold\">{texts.preview}</MText>\n {selectedNode ? (\n <MBadge size=\"sm\" color={isFolderNode(selectedNode) ? 'info' : 'primary'}>\n {isFolderNode(selectedNode) ? texts.folder : texts.file}\n </MBadge>\n ) : null}\n </div>\n <div className=\"panel-body\">\n {selectedNode ? (\n <MStack>\n <div className=\"preview-visual\">\n {renderPreview ? (\n renderPreview(selectedNode)\n ) : selectedNode.preview ? (\n selectedNode.preview\n ) : (\n <span className=\"preview-icon\">{getNodeIcon(selectedNode, true)}</span>\n )}\n </div>\n <MText weight=\"semibold\">{selectedNode.label}</MText>\n {selectedNode.description ? (\n <MText size=\"sm\" tone=\"muted\">\n {selectedNode.description}\n </MText>\n ) : null}\n <div className=\"preview-meta\">\n <MBadge size=\"sm\" color={isFolderNode(selectedNode) ? 'info' : 'primary'}>\n {isFolderNode(selectedNode) ? texts.folder : texts.file}\n </MBadge>\n {formatBytes(selectedNode.size) ? (\n <MBadge size=\"sm\">{formatBytes(selectedNode.size)}</MBadge>\n ) : null}\n {formatModifiedAt(selectedNode.modifiedAt, locale) ? (\n <MBadge size=\"sm\" color=\"neutral\">\n {formatModifiedAt(selectedNode.modifiedAt, locale)}\n </MBadge>\n ) : null}\n </div>\n <MText size=\"sm\" tone=\"muted\">\n {texts.path}:{' '}\n {[\n texts.home,\n ...buildPath(selectedNode.id, nodeMap, parentMap).map((node) => node.label),\n ].join(' / ')}\n </MText>\n </MStack>\n ) : (\n <div className=\"preview-empty\">{texts.selectItemToInspect}</div>\n )}\n </div>\n </aside>\n )}\n </div>\n </div>\n )\n}\n","import {useEffect, useMemo, useRef, useState} from 'react'\nimport type {ReactNode, RefObject} from 'react'\nimport type {\n MCalendarBoardLocale,\n MCalendarBoardProps,\n MCalendarBoardView,\n MCalendarDayCellProps,\n MCalendarDetailsMode,\n MCalendarEvent,\n MCalendarEventItemProps,\n MCalendarEventListProps,\n MCalendarEventPopoverProps,\n MCalendarFilterOption,\n MCalendarTimelineProps,\n MCalendarTimelineSlotState,\n} from './MCalendarBoard.types'\nimport {cn} from '../../../utils/cn'\nimport {useMCalendarBoardTexts, useMDatePickerTexts} from '../../../i18n/frameworkTexts'\nimport {useDocumentLocale} from '../../../utils/locale'\nimport {MButton} from '../../controls'\nimport {MBadge} from '../../feedback'\nimport {MCard, MCardBody} from '../../cards'\nimport {MAvatar} from '../../media'\nimport {MModal} from '../../overlays'\nimport {MPopover} from '../../primitives'\nimport {MHeading, MText} from '../../typography'\nimport {MStack} from '../../layout'\nimport {MBreakpoints} from '../../../theme'\nimport './MCalendarBoard.css'\n\ninterface CalendarDetailsContentProps {\n date: Date | null\n events: MCalendarEvent[]\n locale: MCalendarBoardLocale\n timelineStartHour: number\n timelineEndHour: number\n showTimeline: boolean\n emptyStateText: string\n renderEventItem?: (event: MCalendarEvent) => ReactNode\n}\n\ninterface CalendarWeekViewProps {\n days: Date[]\n eventsByDay: Map<string, MCalendarEvent[]>\n selectedDate: Date | null\n activeDate: Date | null\n onDayInteract: (date: Date, target: HTMLElement, events: MCalendarEvent[]) => void\n onDayHover: (date: Date, target: HTMLElement, events: MCalendarEvent[]) => void\n onDayLeave: () => void\n dayBadge?: MCalendarBoardProps['dayBadge']\n renderDayCell?: MCalendarBoardProps['renderDayCell']\n}\n\nfunction stripTime(date: Date) {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate())\n}\n\nfunction normalizeDate(value?: Date | string | null) {\n if (!value) {\n return null\n }\n\n if (value instanceof Date) {\n return stripTime(value)\n }\n\n const parsed = new Date(value)\n if (Number.isNaN(parsed.getTime())) {\n return null\n }\n\n return stripTime(parsed)\n}\n\nfunction getDateKey(date: Date) {\n const year = date.getFullYear()\n const month = String(date.getMonth() + 1).padStart(2, '0')\n const day = String(date.getDate()).padStart(2, '0')\n\n return `${year}-${month}-${day}`\n}\n\nfunction getEventDate(event: MCalendarEvent) {\n return normalizeDate(event.date)\n}\n\nfunction addDays(date: Date, amount: number) {\n const nextDate = new Date(date)\n nextDate.setDate(nextDate.getDate() + amount)\n return stripTime(nextDate)\n}\n\nfunction startOfWeek(date: Date, weekStartsOn: 0 | 1) {\n const safeDate = stripTime(date)\n const day = safeDate.getDay()\n const delta = (day - weekStartsOn + 7) % 7\n return addDays(safeDate, -delta)\n}\n\nfunction sortEventsByTime(events: MCalendarEvent[]) {\n return [...events].sort((leftEvent, rightEvent) => {\n const leftTime = leftEvent.startTime ?? '99:99'\n const rightTime = rightEvent.startTime ?? '99:99'\n return leftTime.localeCompare(rightTime)\n })\n}\n\nfunction buildMonthGrid(month: Date, weekStartsOn: 0 | 1) {\n const monthStart = new Date(month.getFullYear(), month.getMonth(), 1)\n const gridStart = startOfWeek(monthStart, weekStartsOn)\n\n return Array.from({length: 42}, (_, index) => addDays(gridStart, index))\n}\n\nfunction getStatusColor(status?: MCalendarEvent['status']) {\n switch (status) {\n case 'active':\n return 'rgba(14, 165, 233, 1)'\n case 'done':\n return 'rgba(34, 197, 94, 1)'\n case 'cancelled':\n return 'rgba(239, 68, 68, 1)'\n default:\n return 'rgba(245, 158, 11, 1)'\n }\n}\n\nfunction formatBoardDate(date: Date, locale: MCalendarBoardLocale) {\n return new Intl.DateTimeFormat(locale, {\n weekday: 'long',\n day: 'numeric',\n month: 'long',\n year: 'numeric',\n }).format(date)\n}\n\nfunction formatWeekRange(startDate: Date, locale: MCalendarBoardLocale) {\n const endDate = addDays(startDate, 6)\n const formatter = new Intl.DateTimeFormat(locale, {\n day: 'numeric',\n month: 'short',\n })\n\n return `${formatter.format(startDate)} - ${formatter.format(endDate)}`\n}\n\nfunction formatEventTime(event: MCalendarEvent, texts: ReturnType<typeof useMCalendarBoardTexts>) {\n if (event.startTime && event.endTime) {\n return `${event.startTime} - ${event.endTime}`\n }\n\n if (event.startTime) {\n return event.startTime\n }\n\n return texts.allDay\n}\n\nfunction getTimelineSlotState(date: Date, hour: number): MCalendarTimelineSlotState {\n const now = new Date()\n const slotStart = new Date(date)\n slotStart.setHours(hour, 0, 0, 0)\n const slotEnd = new Date(slotStart)\n slotEnd.setHours(hour + 1, 0, 0, 0)\n\n if (slotEnd <= now) {\n return 'past'\n }\n\n if (slotStart <= now && slotEnd > now) {\n return 'active'\n }\n\n return 'upcoming'\n}\n\nfunction buildDayMarkers(events: MCalendarEvent[]) {\n return sortEventsByTime(events)\n .slice(0, 4)\n .map((event) => (\n <span\n key={event.id}\n className={'marker'}\n style={{background: event.color ?? getStatusColor(event.status)}}\n aria-hidden={'true'}\n />\n ))\n}\n\nfunction applyCalendarFilters(events: MCalendarEvent[], filters: MCalendarFilterOption[], activeFilterIds: string[]) {\n if (!filters.length || !activeFilterIds.length) {\n return events\n }\n\n const activeFilters = filters.filter((filterOption) => activeFilterIds.includes(filterOption.id))\n if (!activeFilters.length) {\n return events\n }\n\n return events.filter((event) => activeFilters.some((filterOption) => filterOption.predicate(event)))\n}\n\nfunction getViewTitle(month: Date, view: MCalendarBoardView, locale: MCalendarBoardLocale, weekStartsOn: 0 | 1) {\n if (view === 'week') {\n return formatWeekRange(startOfWeek(month, weekStartsOn), locale)\n }\n\n return new Intl.DateTimeFormat(locale, {\n month: 'long',\n year: 'numeric',\n }).format(month)\n}\n\nfunction getViewSubtitle(view: MCalendarBoardView, texts: ReturnType<typeof useMCalendarBoardTexts>) {\n return view === 'week' ? texts.weekView : texts.monthView\n}\n\nfunction CalendarDetailsContent({\n date,\n events,\n locale,\n timelineStartHour,\n timelineEndHour,\n showTimeline,\n emptyStateText,\n renderEventItem,\n}: CalendarDetailsContentProps) {\n if (!date) {\n return null\n }\n\n const texts = useMCalendarBoardTexts()\n\n return (\n <MStack>\n <MStack>\n <MHeading level={4}>{formatBoardDate(date, locale)}</MHeading>\n <MText tone={'muted'} size={'sm'}>\n {events.length > 0 ? texts.itemsCount(events.length) : emptyStateText}\n </MText>\n </MStack>\n <MCalendarEventList\n events={events}\n locale={locale}\n currentDate={date}\n emptyStateText={emptyStateText}\n renderEventItem={renderEventItem}\n />\n {showTimeline && (\n <MCalendarTimeline\n date={date}\n events={events}\n locale={locale}\n startHour={timelineStartHour}\n endHour={timelineEndHour}\n />\n )}\n </MStack>\n )\n}\n\nfunction CalendarFilters({\n filters,\n activeFilterIds,\n onToggle,\n}: {\n filters: MCalendarFilterOption[]\n activeFilterIds: string[]\n onToggle: (filterId: string) => void\n}) {\n if (!filters.length) {\n return null\n }\n\n return (\n <div className={'calendar filters'}>\n {filters.map((filterOption) => {\n const isActive = activeFilterIds.includes(filterOption.id)\n\n return (\n <MButton\n key={filterOption.id}\n type={'button'}\n size={'sm'}\n variant=\"outlined\"\n color={isActive ? 'primary' : 'neutral'}\n active={isActive}\n className={'calendar filter button'}\n onClick={() => onToggle(filterOption.id)}\n >\n {filterOption.label}\n </MButton>\n )\n })}\n </div>\n )\n}\nfunction CalendarWeekView({\n days,\n eventsByDay,\n selectedDate,\n activeDate,\n onDayInteract,\n onDayHover,\n onDayLeave,\n dayBadge,\n renderDayCell,\n}: CalendarWeekViewProps) {\n const todayKey = getDateKey(stripTime(new Date()))\n\n return (\n <div className={'calendar week'}>\n {days.map((day) => {\n const dayKey = getDateKey(day)\n const dayEvents = eventsByDay.get(dayKey) ?? []\n const badge =\n dayBadge?.(day, dayEvents) ??\n (dayEvents.length > 0 ? <MBadge size={'sm'}>{dayEvents.length}</MBadge> : null)\n const markers = buildDayMarkers(dayEvents)\n const isSelected = Boolean(selectedDate && getDateKey(selectedDate) === dayKey)\n const context = {\n date: day,\n events: dayEvents,\n badge,\n isToday: dayKey === todayKey,\n isSelected,\n isOutsideMonth: false,\n }\n\n return (\n <div key={dayKey} className={'calendar week column'}>\n <MCalendarDayCell\n date={day}\n events={dayEvents}\n badge={badge}\n markers={markers}\n isToday={context.isToday}\n isSelected={isSelected || Boolean(activeDate && getDateKey(activeDate) === dayKey)}\n isOutsideMonth={false}\n onClick={(event) => onDayInteract(day, event.currentTarget, dayEvents)}\n onMouseEnter={(event) => onDayHover(day, event.currentTarget, dayEvents)}\n onMouseLeave={onDayLeave}\n >\n {renderDayCell ? renderDayCell(day, context) : undefined}\n </MCalendarDayCell>\n </div>\n )\n })}\n </div>\n )\n}\n\nexport function MCalendarDayCell({\n date,\n events = [],\n badge,\n markers,\n isToday = false,\n isSelected = false,\n isOutsideMonth = false,\n className,\n children,\n ...rest\n}: MCalendarDayCellProps) {\n return (\n <button\n type={'button'}\n className={cn(\n 'calendar day cell',\n isToday && 'today',\n isSelected && 'selected',\n isOutsideMonth && 'outside-month',\n className\n )}\n {...rest}\n >\n {children ?? (\n <>\n <div className={'day header'}>\n <span className={'day number'}>{date.getDate()}</span>\n <div className={'day meta'}>{badge}</div>\n </div>\n <div className={'markers'}>{markers ?? buildDayMarkers(events)}</div>\n </>\n )}\n </button>\n )\n}\n\nexport function MCalendarEventItem({\n event,\n locale: localeOverride,\n className,\n currentDate,\n ...rest\n}: MCalendarEventItemProps) {\n const locale = useDocumentLocale(localeOverride)\n const texts = useMCalendarBoardTexts()\n const statusColor =\n event.status === 'cancelled'\n ? 'error'\n : event.status === 'done'\n ? 'success'\n : event.status === 'active'\n ? 'info'\n : 'warning'\n\n return (\n <div className={cn('calendar event item', className)} {...rest}>\n <div className={'event time'}>{formatEventTime(event, texts)}</div>\n <div className={'event content'}>\n <div className={'event title row'}>\n <MHeading level={5}>{event.title}</MHeading>\n {event.status && (\n <MBadge color={statusColor} size={'sm'}>\n {event.status}\n </MBadge>\n )}\n </div>\n {event.description && (\n <MText size={'sm'} tone={'muted'}>\n {event.description}\n </MText>\n )}\n <div className={'event details'}>\n {event.type && (\n <MBadge color={'neutral'} size={'sm'}>\n {event.type}\n </MBadge>\n )}\n {event.badgeLabel && <MBadge size={'sm'}>{event.badgeLabel}</MBadge>}\n {event.user && (\n <span className={'event user'}>\n <MAvatar\n size={'sm'}\n src={event.user.avatar}\n name={event.user.name}\n backgroundColor={event.user.color}\n />\n {event.user.name}\n </span>\n )}\n {!event.startTime && !event.endTime && currentDate && (\n <MText size={'sm'} tone={'muted'}>\n {formatBoardDate(currentDate, locale)}\n </MText>\n )}\n </div>\n </div>\n </div>\n )\n}\n\nexport function MCalendarEventList({\n events,\n locale: localeOverride,\n currentDate,\n emptyStateText,\n renderEventItem,\n className,\n ...rest\n}: MCalendarEventListProps) {\n const locale = useDocumentLocale(localeOverride)\n const texts = useMCalendarBoardTexts()\n\n if (!events.length) {\n return (\n <MText size={'sm'} tone={'muted'} className={cn('calendar event list', className)} {...rest}>\n {emptyStateText ?? texts.emptyStateText}\n </MText>\n )\n }\n\n return (\n <div className={cn('calendar event list', className)} {...rest}>\n <MStack>\n {sortEventsByTime(events).map((event) =>\n renderEventItem ? (\n <div key={event.id}>{renderEventItem(event)}</div>\n ) : (\n <MCalendarEventItem key={event.id} event={event} locale={locale} currentDate={currentDate} />\n )\n )}\n </MStack>\n </div>\n )\n}\nexport function MCalendarTimeline({\n date,\n events,\n locale: localeOverride,\n startHour = 6,\n endHour = 22,\n emptyStateText,\n className,\n ...rest\n}: MCalendarTimelineProps) {\n const locale = useDocumentLocale(localeOverride)\n const texts = useMCalendarBoardTexts()\n const hours = Array.from({length: Math.max(endHour - startHour + 1, 1)}, (_, index) => startHour + index)\n\n return (\n <div className={cn('calendar timeline', className)} {...rest}>\n <MStack>\n <MHeading level={5}>{texts.timelineTitle}</MHeading>\n <div className={'timeline slots'}>\n {hours.map((hour) => {\n const matchingEvents = events.filter((event) => {\n if (!event.startTime) {\n return false\n }\n\n return Number(event.startTime.split(':')[0]) === hour\n })\n const slotState = getTimelineSlotState(date, hour)\n\n return (\n <div key={hour} className={cn('timeline slot', slotState)}>\n <div className={'slot time'}>{`${String(hour).padStart(2, '0')}:00`}</div>\n <div className={'slot line'} />\n <div className={'slot content'}>\n {matchingEvents.length > 0 ? (\n <MStack>\n {matchingEvents.map((event) => (\n <div key={event.id} className={'slot event'}>\n <span\n className={'slot event dot'}\n style={{\n background: event.color ?? getStatusColor(event.status),\n }}\n />\n <MText size={'sm'}>{event.title}</MText>\n </div>\n ))}\n </MStack>\n ) : (\n <MText size={'sm'} tone={'muted'}>\n {emptyStateText ?? texts.timelineEmptyState}\n </MText>\n )}\n </div>\n </div>\n )\n })}\n </div>\n </MStack>\n </div>\n )\n}\n\nexport function MCalendarEventPopover({\n open,\n anchorRef,\n onClose,\n onPointerEnter,\n onPointerLeave,\n date,\n events,\n locale: localeOverride,\n timelineStartHour = 6,\n timelineEndHour = 22,\n showTimeline = true,\n emptyStateText,\n renderEventItem,\n className,\n style,\n}: MCalendarEventPopoverProps) {\n const locale = useDocumentLocale(localeOverride)\n const texts = useMCalendarBoardTexts()\n\n return (\n <MPopover\n open={open}\n anchorRef={anchorRef}\n onClose={onClose}\n placement={'bottom-start'}\n className={cn('calendar popover', className)}\n style={style}\n >\n <MCard className={'calendar event popover'} onPointerEnter={onPointerEnter} onPointerLeave={onPointerLeave}>\n <MCardBody>\n <CalendarDetailsContent\n date={date}\n events={events}\n locale={locale}\n timelineStartHour={timelineStartHour}\n timelineEndHour={timelineEndHour}\n showTimeline={showTimeline}\n emptyStateText={emptyStateText ?? texts.emptyStateText}\n renderEventItem={renderEventItem}\n />\n </MCardBody>\n </MCard>\n </MPopover>\n )\n}\n\nexport function MCalendarBoard({\n month,\n defaultMonth,\n onMonthChange,\n events = [],\n locale: localeOverride,\n weekStartsOn = 1,\n view,\n defaultView = 'month',\n views = ['month', 'week'],\n onViewChange,\n selectedDate,\n defaultSelectedDate,\n onDayClick,\n dayBadge,\n renderDayCell,\n renderEventItem,\n detailsTrigger = 'click',\n detailsMode = 'auto',\n showTimeline = true,\n timelineStartHour = 6,\n timelineEndHour = 22,\n emptyStateText,\n filters = [],\n activeFilters,\n defaultActiveFilters = [],\n onActiveFiltersChange,\n fullWidth = false,\n className,\n ...rest\n}: MCalendarBoardProps) {\n const locale = useDocumentLocale(localeOverride)\n const datePickerTexts = useMDatePickerTexts()\n const texts = useMCalendarBoardTexts()\n const today = stripTime(new Date())\n const [internalMonth, setInternalMonth] = useState(stripTime(defaultMonth ?? month ?? today))\n const [internalView, setInternalView] = useState<MCalendarBoardView>(defaultView)\n const [internalSelectedDate, setInternalSelectedDate] = useState<Date | null>(normalizeDate(defaultSelectedDate))\n const [internalActiveFilters, setInternalActiveFilters] = useState<string[]>(defaultActiveFilters)\n const [activeDate, setActiveDate] = useState<Date | null>(null)\n const [detailsOpen, setDetailsOpen] = useState(false)\n const [isCompact, setIsCompact] = useState(false)\n const activeAnchorRef = useRef<HTMLElement | null>(null)\n const closeTimeoutRef = useRef<number | null>(null)\n\n const isMonthControlled = month !== undefined && typeof onMonthChange === 'function'\n const visibleMonth = stripTime(isMonthControlled ? (month ?? internalMonth) : internalMonth)\n const currentView = view ?? internalView\n const resolvedSelectedDate = normalizeDate(selectedDate) ?? internalSelectedDate\n const resolvedActiveFilters = activeFilters ?? internalActiveFilters\n\n useEffect(() => {\n const mediaQuery = window.matchMedia(`(max-width: ${MBreakpoints.md}px)`)\n const updateCompactState = () => setIsCompact(mediaQuery.matches)\n\n updateCompactState()\n mediaQuery.addEventListener('change', updateCompactState)\n\n return () => mediaQuery.removeEventListener('change', updateCompactState)\n }, [])\n\n useEffect(() => {\n if (isMonthControlled && month) {\n setInternalMonth(stripTime(month))\n }\n }, [isMonthControlled, month])\n\n useEffect(() => {\n if (view) {\n setInternalView(view)\n }\n }, [view])\n\n useEffect(() => {\n if (selectedDate !== undefined) {\n setInternalSelectedDate(normalizeDate(selectedDate))\n }\n }, [selectedDate])\n\n useEffect(\n () => () => {\n if (closeTimeoutRef.current) {\n window.clearTimeout(closeTimeoutRef.current)\n }\n },\n []\n )\n\n const filteredEvents = useMemo(\n () => applyCalendarFilters(events, filters, resolvedActiveFilters),\n [events, filters, resolvedActiveFilters]\n )\n\n const eventsByDay = useMemo(() => {\n const nextMap = new Map<string, MCalendarEvent[]>()\n\n filteredEvents.forEach((event) => {\n const eventDate = getEventDate(event)\n if (!eventDate) {\n return\n }\n\n const key = getDateKey(eventDate)\n const currentEvents = nextMap.get(key) ?? []\n currentEvents.push(event)\n nextMap.set(key, currentEvents)\n })\n\n return nextMap\n }, [filteredEvents])\n const calendarDays = useMemo(() => {\n if (currentView === 'week') {\n const baseDate = resolvedSelectedDate ?? visibleMonth\n const weekStart = startOfWeek(baseDate, weekStartsOn)\n return Array.from({length: 7}, (_, index) => addDays(weekStart, index))\n }\n\n return buildMonthGrid(visibleMonth, weekStartsOn)\n }, [currentView, resolvedSelectedDate, visibleMonth, weekStartsOn])\n\n const effectiveDetailsMode: MCalendarDetailsMode =\n detailsMode === 'auto' ? (isCompact ? 'modal' : 'popover') : detailsMode\n const activeEvents = activeDate ? (eventsByDay.get(getDateKey(activeDate)) ?? []) : []\n const canShowMonthView = views.includes('month')\n const canShowWeekView = views.includes('week')\n\n const setMonthAndNotify = (nextMonth: Date) => {\n const normalizedMonth = stripTime(nextMonth)\n setInternalMonth(normalizedMonth)\n onMonthChange?.(normalizedMonth)\n }\n\n const navigateBy = (amount: number) => {\n if (currentView === 'week') {\n const nextAnchor = addDays(resolvedSelectedDate ?? visibleMonth, amount * 7)\n setMonthAndNotify(nextAnchor)\n setInternalSelectedDate(nextAnchor)\n setActiveDate(nextAnchor)\n setDetailsOpen(false)\n return\n }\n\n const nextMonth = new Date(visibleMonth.getFullYear(), visibleMonth.getMonth() + amount, 1)\n setMonthAndNotify(nextMonth)\n setDetailsOpen(false)\n setActiveDate(null)\n }\n\n const setViewAndNotify = (nextView: MCalendarBoardView) => {\n setInternalView(nextView)\n onViewChange?.(nextView)\n }\n\n const setSelectedDateAndNotify = (nextDate: Date, dayEvents: MCalendarEvent[]) => {\n const normalizedDate = stripTime(nextDate)\n setInternalSelectedDate(normalizedDate)\n onDayClick?.(normalizedDate, dayEvents)\n }\n\n const clearCloseTimeout = () => {\n if (closeTimeoutRef.current) {\n window.clearTimeout(closeTimeoutRef.current)\n closeTimeoutRef.current = null\n }\n }\n\n const scheduleClose = () => {\n clearCloseTimeout()\n closeTimeoutRef.current = window.setTimeout(() => {\n setDetailsOpen(false)\n }, 180)\n }\n\n const openDetails = (date: Date, target: HTMLElement, dayEvents: MCalendarEvent[]) => {\n activeAnchorRef.current = target\n setActiveDate(date)\n setSelectedDateAndNotify(date, dayEvents)\n setDetailsOpen(true)\n }\n\n const handleDayInteract = (date: Date, target: HTMLElement, dayEvents: MCalendarEvent[]) => {\n clearCloseTimeout()\n openDetails(date, target, dayEvents)\n\n if (currentView === 'month' && date.getMonth() !== visibleMonth.getMonth()) {\n setMonthAndNotify(new Date(date.getFullYear(), date.getMonth(), 1))\n }\n }\n\n const handleDayHover = (date: Date, target: HTMLElement, dayEvents: MCalendarEvent[]) => {\n if (detailsTrigger !== 'hover' || effectiveDetailsMode !== 'popover') {\n return\n }\n\n clearCloseTimeout()\n openDetails(date, target, dayEvents)\n }\n\n const handleFilterToggle = (filterId: string) => {\n const nextFilters = resolvedActiveFilters.includes(filterId)\n ? resolvedActiveFilters.filter((id) => id !== filterId)\n : [...resolvedActiveFilters, filterId]\n\n setInternalActiveFilters(nextFilters)\n onActiveFiltersChange?.(nextFilters)\n }\n\n const dayNameBase = startOfWeek(\n currentView === 'week' ? (resolvedSelectedDate ?? visibleMonth) : visibleMonth,\n weekStartsOn\n )\n\n return (\n <div className={cn('calendar board', fullWidth && 'full-width', className)} {...rest}>\n <div className={'calendar header'}>\n <MStack>\n <MHeading level={3}>{getViewTitle(visibleMonth, currentView, locale, weekStartsOn)}</MHeading>\n <MText size={'sm'} tone={'muted'}>\n {getViewSubtitle(currentView, texts)}\n </MText>\n </MStack>\n <MStack align={'end'}>\n <div className={'calendar actions'}>\n <MButton\n type={'button'}\n size={'sm'}\n variant={'outlined'}\n color={'neutral'}\n onClick={() => navigateBy(-1)}\n >\n {currentView === 'week' ? texts.previousWeek : datePickerTexts.previousMonth}\n </MButton>\n <MButton\n type={'button'}\n size={'sm'}\n variant={'outlined'}\n color={'neutral'}\n onClick={() => navigateBy(1)}\n >\n {currentView === 'week' ? texts.nextWeek : datePickerTexts.nextMonth}\n </MButton>\n </div>\n {(canShowMonthView || canShowWeekView) && (\n <div className={'calendar views'}>\n {canShowMonthView && (\n <MButton\n type={'button'}\n size={'sm'}\n variant=\"outlined\"\n color={currentView === 'month' ? 'primary' : 'neutral'}\n active={currentView === 'month'}\n onClick={() => setViewAndNotify('month')}\n >\n {texts.monthView}\n </MButton>\n )}\n {canShowWeekView && (\n <MButton\n type={'button'}\n size={'sm'}\n variant=\"outlined\"\n color={currentView === 'week' ? 'primary' : 'neutral'}\n active={currentView === 'week'}\n onClick={() => setViewAndNotify('week')}\n >\n {texts.weekView}\n </MButton>\n )}\n </div>\n )}\n </MStack>\n </div>\n\n <CalendarFilters filters={filters} activeFilterIds={resolvedActiveFilters} onToggle={handleFilterToggle} />\n\n <div className={'calendar days'}>\n {Array.from({length: 7}, (_, index) => addDays(dayNameBase, index)).map((day) => (\n <div key={getDateKey(day)} className={'calendar day'}>\n {new Intl.DateTimeFormat(locale, {weekday: 'short'}).format(day)}\n </div>\n ))}\n </div>\n\n {currentView === 'week' ? (\n <CalendarWeekView\n days={calendarDays}\n eventsByDay={eventsByDay}\n selectedDate={resolvedSelectedDate}\n activeDate={activeDate}\n onDayInteract={handleDayInteract}\n onDayHover={handleDayHover}\n onDayLeave={() => {\n if (detailsTrigger === 'hover' && effectiveDetailsMode === 'popover') {\n scheduleClose()\n }\n }}\n dayBadge={dayBadge}\n renderDayCell={renderDayCell}\n />\n ) : (\n <div className={'calendar grid'}>\n {calendarDays.map((day) => {\n const dayKey = getDateKey(day)\n const dayEvents = eventsByDay.get(dayKey) ?? []\n const badge =\n dayBadge?.(day, dayEvents) ??\n (dayEvents.length > 0 ? <MBadge size={'sm'}>{dayEvents.length}</MBadge> : null)\n const isToday = dayKey === getDateKey(today)\n const isSelected = Boolean(resolvedSelectedDate && dayKey === getDateKey(resolvedSelectedDate))\n const isOutsideMonth = day.getMonth() !== visibleMonth.getMonth()\n const markers = buildDayMarkers(dayEvents)\n const context = {\n date: day,\n events: dayEvents,\n badge,\n isToday,\n isSelected,\n isOutsideMonth,\n }\n\n return (\n <MCalendarDayCell\n key={dayKey}\n date={day}\n events={dayEvents}\n badge={badge}\n markers={markers}\n isToday={isToday}\n isSelected={isSelected || Boolean(activeDate && dayKey === getDateKey(activeDate))}\n isOutsideMonth={isOutsideMonth}\n onClick={(event) => handleDayInteract(day, event.currentTarget, dayEvents)}\n onMouseEnter={(event) => handleDayHover(day, event.currentTarget, dayEvents)}\n onMouseLeave={() => {\n if (detailsTrigger === 'hover' && effectiveDetailsMode === 'popover') {\n scheduleClose()\n }\n }}\n >\n {renderDayCell ? renderDayCell(day, context) : undefined}\n </MCalendarDayCell>\n )\n })}\n </div>\n )}\n\n {effectiveDetailsMode === 'popover' ? (\n <MCalendarEventPopover\n open={detailsOpen && Boolean(activeDate) && Boolean(activeAnchorRef.current)}\n anchorRef={activeAnchorRef as RefObject<HTMLElement | null>}\n onClose={() => setDetailsOpen(false)}\n onPointerEnter={() => clearCloseTimeout()}\n onPointerLeave={() => scheduleClose()}\n date={activeDate}\n events={activeEvents}\n locale={locale}\n timelineStartHour={timelineStartHour}\n timelineEndHour={timelineEndHour}\n showTimeline={showTimeline}\n emptyStateText={emptyStateText ?? texts.emptyStateText}\n renderEventItem={renderEventItem}\n />\n ) : (\n <MModal\n open={detailsOpen && Boolean(activeDate)}\n onClose={() => setDetailsOpen(false)}\n title={activeDate ? formatBoardDate(activeDate, locale) : undefined}\n description={activeDate ? texts.itemsCount(activeEvents.length) : undefined}\n size={'lg'}\n >\n <CalendarDetailsContent\n date={activeDate}\n events={activeEvents}\n locale={locale}\n timelineStartHour={timelineStartHour}\n timelineEndHour={timelineEndHour}\n showTimeline={showTimeline}\n emptyStateText={emptyStateText ?? texts.emptyStateText}\n renderEventItem={renderEventItem}\n />\n </MModal>\n )}\n </div>\n )\n}\n","import type {HTMLAttributes, ReactNode} from 'react'\nimport type {MColor} from '../../../theme/MTheme.types'\n\nexport type MChartType = 'line' | 'bar' | 'area' | 'pie'\n\nexport interface MChartDataset {\n label: string\n data: number[]\n color?: MColor\n}\n\nexport interface MChartAxisConfig {\n labels?: string[]\n min?: number\n max?: number\n ticks?: number\n formatter?: (value: number) => string\n title?: string\n}\n\nexport interface MChartProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n type: MChartType\n data: MChartDataset[]\n width?: number | string\n height?: number\n aspectRatio?: number\n xAxis?: MChartAxisConfig\n yAxis?: MChartAxisConfig\n showGrid?: boolean\n showXAxis?: boolean\n showYAxis?: boolean\n showLegend?: boolean\n showTooltip?: boolean\n animated?: boolean\n stacked?: boolean\n curved?: boolean\n donut?: boolean\n donutWidth?: number\n valueFormatter?: (value: number) => string\n labelFormatter?: (label: string) => string\n onDataClick?: (datasetIndex: number, dataIndex: number, value: number) => void\n}\n\nexport interface MChartTooltipData {\n label: string\n items: {name: string; value: number; color: MColor}[]\n x: number\n y: number\n}\n\nexport const CHART_DEFAULT_COLORS: MColor[] = [\n 'primary',\n 'info',\n 'success',\n 'warning',\n 'error',\n 'news',\n 'neutral',\n 'dark',\n]\n\n/* ── Per-type public prop interfaces ── */\n\ninterface MChartBaseProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n data: MChartDataset[]\n width?: number | string\n height?: number\n aspectRatio?: number\n xAxis?: MChartAxisConfig\n showLegend?: boolean\n showTooltip?: boolean\n animated?: boolean\n valueFormatter?: (value: number) => string\n labelFormatter?: (label: string) => string\n onDataClick?: (datasetIndex: number, dataIndex: number, value: number) => void\n}\n\ninterface MCartesianChartProps extends MChartBaseProps {\n yAxis?: MChartAxisConfig\n showGrid?: boolean\n showXAxis?: boolean\n showYAxis?: boolean\n}\n\nexport interface MLineChartProps extends MCartesianChartProps {\n curved?: boolean\n}\n\nexport interface MBarChartProps extends MCartesianChartProps {\n stacked?: boolean\n}\n\nexport interface MAreaChartProps extends MCartesianChartProps {\n curved?: boolean\n stacked?: boolean\n}\n\nexport interface MPieChartProps extends MChartBaseProps {\n donut?: boolean\n donutWidth?: number\n}\n\nexport const CHART_PADDING = {top: 20, right: 20, bottom: 40, left: 50}\nexport const CHART_PADDING_WITH_TITLE = {top: 20, right: 20, bottom: 55, left: 65}\n","export function defaultValueFormatter(value: number): string {\n if (Math.abs(value) >= 1_000_000) {\n return (value / 1_000_000).toFixed(1).replace(/\\.0$/, '') + 'M'\n }\n if (Math.abs(value) >= 1_000) {\n return (value / 1_000).toFixed(1).replace(/\\.0$/, '') + 'k'\n }\n if (Number.isInteger(value)) return String(value)\n return value.toFixed(1)\n}\n\nexport function defaultLabelFormatter(label: string): string {\n return label\n}\n\nexport function percentFormatter(value: number): string {\n return value.toFixed(0) + '%'\n}\n","interface ChartGridProps {\n x: number\n y: number\n width: number\n height: number\n horizontalLines: number[]\n verticalLines?: number[]\n}\n\nexport function ChartGrid({x, y, width, height, horizontalLines, verticalLines}: ChartGridProps) {\n return (\n <g className=\"chart-grid\">\n {horizontalLines.map((ly, i) => (\n <line key={`h${i}`} x1={x} y1={ly} x2={x + width} y2={ly} className=\"chart-grid-line\" />\n ))}\n {verticalLines?.map((lx, i) => (\n <line\n key={`v${i}`}\n x1={lx}\n y1={y}\n x2={lx}\n y2={y + height}\n className=\"chart-grid-line chart-grid-line-vertical\"\n />\n ))}\n </g>\n )\n}\n","interface ChartAxisProps {\n type: 'x' | 'y'\n x: number\n y: number\n length: number\n ticks: {position: number; label: string}[]\n title?: string\n}\n\nexport function ChartAxis({type, x, y, length, ticks, title}: ChartAxisProps) {\n const isX = type === 'x'\n\n return (\n <g className={`chart-axis chart-axis-${type}`}>\n <line x1={x} y1={y} x2={isX ? x + length : x} y2={isX ? y : y - length} className=\"chart-axis-line\" />\n {ticks.map((tick, i) => (\n <g key={i}>\n {isX ? (\n <text x={tick.position} y={y + 16} textAnchor=\"middle\" className=\"chart-axis-label\">\n {tick.label}\n </text>\n ) : (\n <text\n x={x - 8}\n y={tick.position}\n textAnchor=\"end\"\n dominantBaseline=\"middle\"\n className=\"chart-axis-label\"\n >\n {tick.label}\n </text>\n )}\n </g>\n ))}\n {title &&\n (isX ? (\n <text x={x + length / 2} y={y + 36} textAnchor=\"middle\" className=\"chart-axis-title\">\n {title}\n </text>\n ) : (\n <text\n x={x - 40}\n y={y - length / 2}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n transform={`rotate(-90, ${x - 40}, ${y - length / 2})`}\n className=\"chart-axis-title\"\n >\n {title}\n </text>\n ))}\n </g>\n )\n}\n","import {useMemo, useCallback, useState} from 'react'\nimport type {MChartDataset, MChartTooltipData} from '../MChart.types'\nimport type {MColor} from '../../../../theme/MTheme.types'\nimport {createLinearScale, generateTicks, getDataExtent, niceMin, niceMax} from '../utils/scales'\nimport {linePath, curvedPath} from '../utils/paths'\nimport type {Point} from '../utils/paths'\nimport {defaultValueFormatter} from '../utils/formats'\nimport {ChartGrid} from '../parts/ChartGrid'\nimport {ChartAxis} from '../parts/ChartAxis'\nimport type {MChartAxisConfig} from '../MChart.types'\n\ninterface MLineChartProps {\n data: MChartDataset[]\n colors: MColor[]\n innerWidth: number\n innerHeight: number\n padding: {top: number; right: number; bottom: number; left: number}\n xAxis?: MChartAxisConfig\n yAxis?: MChartAxisConfig\n showGrid: boolean\n showXAxis: boolean\n showYAxis: boolean\n curved: boolean\n animated: boolean\n valueFormatter: (value: number) => string\n onTooltip: (data: MChartTooltipData | null) => void\n onDataClick?: (datasetIndex: number, dataIndex: number, value: number) => void\n}\n\nexport function MLineChart({\n data,\n colors,\n innerWidth,\n innerHeight,\n padding,\n xAxis,\n yAxis,\n showGrid,\n showXAxis,\n showYAxis,\n curved,\n animated,\n valueFormatter = defaultValueFormatter,\n onTooltip,\n onDataClick,\n}: MLineChartProps) {\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null)\n\n const plotW = innerWidth - padding.left - padding.right\n const plotH = innerHeight - padding.top - padding.bottom\n\n const {yMin, yMax, yTicks, xLabels, seriesPoints} = useMemo(() => {\n const allData = data.map((d) => d.data)\n const [rawMin, rawMax] = getDataExtent(allData)\n const min = yAxis?.min ?? niceMin(rawMin)\n const max = yAxis?.max ?? niceMax(rawMax, rawMin)\n const ticks = generateTicks(min, max, yAxis?.ticks ?? 5)\n const maxLen = Math.max(...allData.map((d) => d.length), 1)\n const labels = xAxis?.labels ?? Array.from({length: maxLen}, (_, i) => String(i))\n\n const xScale = createLinearScale([0, Math.max(maxLen - 1, 1)], [0, plotW])\n const yScale = createLinearScale([min, max], [plotH, 0])\n\n const pts = allData.map((series) => series.map((v, i): Point => ({x: xScale(i), y: yScale(v)})))\n\n return {yMin: min, yMax: max, yTicks: ticks, xLabels: labels, seriesPoints: pts}\n }, [data, plotW, plotH, xAxis, yAxis])\n\n const yScale = createLinearScale([yMin, yMax], [plotH, 0])\n const xScale = createLinearScale([0, Math.max(xLabels.length - 1, 1)], [0, plotW])\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<SVGGElement>) => {\n const svg = e.currentTarget.closest('svg')\n if (!svg) return\n const rect = svg.getBoundingClientRect()\n const scale = innerWidth / rect.width\n const mx = (e.clientX - rect.left) * scale - padding.left\n const idx = Math.round((mx / plotW) * Math.max(xLabels.length - 1, 1))\n const clampedIdx = Math.max(0, Math.min(idx, xLabels.length - 1))\n\n setHoveredIndex(clampedIdx)\n onTooltip({\n label: xLabels[clampedIdx],\n items: data.map((ds, di) => ({\n name: ds.label,\n value: ds.data[clampedIdx] ?? 0,\n color: ds.color ?? colors[di % colors.length],\n })),\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n })\n },\n [data, colors, xLabels, plotW, padding.left, innerWidth, onTooltip]\n )\n\n const handleMouseLeave = useCallback(() => {\n setHoveredIndex(null)\n onTooltip(null)\n }, [onTooltip])\n\n const gridH = yTicks.map((t) => padding.top + yScale(t))\n const xTickPositions = xLabels.map((_, i) => padding.left + xScale(i))\n const yTickData = yTicks.map((t) => ({\n position: padding.top + yScale(t),\n label: (yAxis?.formatter ?? valueFormatter)(t),\n }))\n const xTickData = xLabels.map((l, i) => ({\n position: padding.left + xScale(i),\n label: l,\n }))\n\n return (\n <g>\n {showGrid && (\n <ChartGrid\n x={padding.left}\n y={padding.top}\n width={plotW}\n height={plotH}\n horizontalLines={gridH}\n verticalLines={xTickPositions}\n />\n )}\n {showYAxis && (\n <ChartAxis\n type=\"y\"\n x={padding.left}\n y={padding.top + plotH}\n length={plotH}\n ticks={yTickData}\n title={yAxis?.title}\n />\n )}\n {showXAxis && (\n <ChartAxis\n type=\"x\"\n x={padding.left}\n y={padding.top + plotH}\n length={plotW}\n ticks={xTickData}\n title={xAxis?.title}\n />\n )}\n <g onMouseMove={handleMouseMove} onMouseLeave={handleMouseLeave}>\n <rect x={padding.left} y={padding.top} width={plotW} height={plotH} fill=\"transparent\" />\n {seriesPoints.map((pts, di) => {\n const c = data[di].color ?? colors[di % colors.length]\n const d = curved\n ? curvedPath(pts.map((p) => ({x: p.x + padding.left, y: p.y + padding.top})))\n : linePath(pts.map((p) => ({x: p.x + padding.left, y: p.y + padding.top})))\n return (\n <g key={di}>\n <path className={`chart-line ${c} ${animated ? 'animated' : ''}`} d={d} />\n {pts.map((p, pi) => (\n <circle\n key={pi}\n className={`chart-dot ${c} ${hoveredIndex === pi ? 'active' : ''}`}\n cx={p.x + padding.left}\n cy={p.y + padding.top}\n r={hoveredIndex === pi ? 5 : 3}\n onClick={() => onDataClick?.(di, pi, data[di].data[pi])}\n style={{cursor: onDataClick ? 'pointer' : undefined}}\n />\n ))}\n </g>\n )\n })}\n {hoveredIndex !== null && (\n <line\n className=\"chart-crosshair\"\n x1={padding.left + xScale(hoveredIndex)}\n y1={padding.top}\n x2={padding.left + xScale(hoveredIndex)}\n y2={padding.top + plotH}\n />\n )}\n </g>\n </g>\n )\n}\n","import {useMemo, useCallback, useState} from 'react'\nimport type {MChartDataset, MChartTooltipData, MChartAxisConfig} from '../MChart.types'\nimport type {MColor} from '../../../../theme/MTheme.types'\nimport {createLinearScale, generateTicks, getDataExtent, getStackedExtent, niceMin, niceMax} from '../utils/scales'\nimport {defaultValueFormatter} from '../utils/formats'\nimport {ChartGrid} from '../parts/ChartGrid'\nimport {ChartAxis} from '../parts/ChartAxis'\n\ninterface MBarChartProps {\n data: MChartDataset[]\n colors: MColor[]\n innerWidth: number\n innerHeight: number\n padding: {top: number; right: number; bottom: number; left: number}\n xAxis?: MChartAxisConfig\n yAxis?: MChartAxisConfig\n showGrid: boolean\n showXAxis: boolean\n showYAxis: boolean\n stacked: boolean\n animated: boolean\n valueFormatter: (value: number) => string\n onTooltip: (data: MChartTooltipData | null) => void\n onDataClick?: (datasetIndex: number, dataIndex: number, value: number) => void\n}\n\nexport function MBarChart({\n data,\n colors,\n innerWidth,\n innerHeight,\n padding,\n xAxis,\n yAxis,\n showGrid,\n showXAxis,\n showYAxis,\n stacked,\n animated,\n valueFormatter = defaultValueFormatter,\n onTooltip,\n onDataClick,\n}: MBarChartProps) {\n const [hoveredBar, setHoveredBar] = useState<{di: number; pi: number} | null>(null)\n\n const plotW = innerWidth - padding.left - padding.right\n const plotH = innerHeight - padding.top - padding.bottom\n\n const {yMin, yMax, yTicks, xLabels, maxLen} = useMemo(() => {\n const allData = data.map((d) => d.data)\n const mLen = Math.max(...allData.map((d) => d.length), 1)\n\n let rawMin: number, rawMax: number\n if (stacked) {\n ;[rawMin, rawMax] = getStackedExtent(allData)\n } else {\n ;[rawMin, rawMax] = getDataExtent(allData)\n }\n\n const min = yAxis?.min ?? niceMin(rawMin)\n const max = yAxis?.max ?? niceMax(rawMax, rawMin)\n const ticks = generateTicks(min, max, yAxis?.ticks ?? 5)\n const labels = xAxis?.labels ?? Array.from({length: mLen}, (_, i) => String(i))\n\n return {yMin: min, yMax: max, yTicks: ticks, xLabels: labels, maxLen: mLen}\n }, [data, xAxis, yAxis, stacked])\n\n const yScale = createLinearScale([yMin, yMax], [plotH, 0])\n const groupWidth = plotW / maxLen\n const barGap = Math.max(groupWidth * 0.1, 2)\n const seriesCount = data.length\n\n const handleBarEnter = useCallback(\n (di: number, pi: number, e: React.MouseEvent) => {\n setHoveredBar({di, pi})\n const svg = e.currentTarget.closest('svg')\n if (!svg) return\n const rect = svg.getBoundingClientRect()\n onTooltip({\n label: xLabels[pi],\n items: stacked\n ? data.map((ds, dsi) => ({\n name: ds.label,\n value: ds.data[pi] ?? 0,\n color: ds.color ?? colors[dsi % colors.length],\n }))\n : [\n {\n name: data[di].label,\n value: data[di].data[pi],\n color: data[di].color ?? colors[di % colors.length],\n },\n ],\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n })\n },\n [data, colors, xLabels, stacked, onTooltip]\n )\n\n const handleMouseLeave = useCallback(() => {\n setHoveredBar(null)\n onTooltip(null)\n }, [onTooltip])\n\n const gridH = yTicks.map((t) => padding.top + yScale(t))\n const xTickData = xLabels.map((l, i) => ({\n position: padding.left + groupWidth * i + groupWidth / 2,\n label: l,\n }))\n const yTickData = yTicks.map((t) => ({\n position: padding.top + yScale(t),\n label: (yAxis?.formatter ?? valueFormatter)(t),\n }))\n\n const baselineY = yScale(0)\n\n return (\n <g>\n {showGrid && (\n <ChartGrid x={padding.left} y={padding.top} width={plotW} height={plotH} horizontalLines={gridH} />\n )}\n {showYAxis && (\n <ChartAxis\n type=\"y\"\n x={padding.left}\n y={padding.top + plotH}\n length={plotH}\n ticks={yTickData}\n title={yAxis?.title}\n />\n )}\n {showXAxis && (\n <ChartAxis\n type=\"x\"\n x={padding.left}\n y={padding.top + plotH}\n length={plotW}\n ticks={xTickData}\n title={xAxis?.title}\n />\n )}\n <g onMouseLeave={handleMouseLeave}>\n {stacked\n ? xLabels.map((_, pi) => {\n let cumY = baselineY\n const barW = groupWidth - barGap * 2\n const x = padding.left + groupWidth * pi + barGap\n\n return (\n <g key={pi}>\n {data.map((ds, di) => {\n const v = ds.data[pi] ?? 0\n const barH = baselineY - yScale(v)\n const y = cumY - barH\n cumY = y\n const c = ds.color ?? colors[di % colors.length]\n const isHovered = hoveredBar?.di === di && hoveredBar?.pi === pi\n return (\n <rect\n key={di}\n className={`chart-bar ${c} ${animated ? 'animated' : ''} ${isHovered ? 'active' : ''}`}\n x={x}\n y={padding.top + y}\n width={Math.max(barW, 1)}\n height={Math.max(barH, 0)}\n rx={di === data.length - 1 ? 3 : 0}\n onMouseEnter={(e) => handleBarEnter(di, pi, e)}\n onClick={() => onDataClick?.(di, pi, v)}\n style={{cursor: onDataClick ? 'pointer' : undefined}}\n />\n )\n })}\n </g>\n )\n })\n : data.map((ds, di) => {\n const barW = (groupWidth - barGap * 2) / seriesCount\n return (\n <g key={di}>\n {ds.data.map((v, pi) => {\n const barH = baselineY - yScale(v)\n const x = padding.left + groupWidth * pi + barGap + barW * di\n const y = Math.min(baselineY, yScale(v))\n const c = ds.color ?? colors[di % colors.length]\n const isHovered = hoveredBar?.di === di && hoveredBar?.pi === pi\n return (\n <rect\n key={pi}\n className={`chart-bar ${c} ${animated ? 'animated' : ''} ${isHovered ? 'active' : ''}`}\n x={x}\n y={padding.top + y}\n width={Math.max(barW, 1)}\n height={Math.max(Math.abs(barH), 0)}\n rx={3}\n onMouseEnter={(e) => handleBarEnter(di, pi, e)}\n onClick={() => onDataClick?.(di, pi, v)}\n style={{cursor: onDataClick ? 'pointer' : undefined}}\n />\n )\n })}\n </g>\n )\n })}\n </g>\n </g>\n )\n}\n","import {useMemo, useCallback, useState} from 'react'\nimport type {MChartDataset, MChartTooltipData, MChartAxisConfig} from '../MChart.types'\nimport type {MColor} from '../../../../theme/MTheme.types'\nimport {createLinearScale, generateTicks, getDataExtent, getStackedExtent, niceMin, niceMax} from '../utils/scales'\nimport {linePath, curvedPath, areaPath, stackedAreaPath} from '../utils/paths'\nimport type {Point} from '../utils/paths'\nimport {defaultValueFormatter} from '../utils/formats'\nimport {ChartGrid} from '../parts/ChartGrid'\nimport {ChartAxis} from '../parts/ChartAxis'\n\ninterface MAreaChartProps {\n data: MChartDataset[]\n colors: MColor[]\n innerWidth: number\n innerHeight: number\n padding: {top: number; right: number; bottom: number; left: number}\n xAxis?: MChartAxisConfig\n yAxis?: MChartAxisConfig\n showGrid: boolean\n showXAxis: boolean\n showYAxis: boolean\n curved: boolean\n stacked: boolean\n animated: boolean\n valueFormatter: (value: number) => string\n onTooltip: (data: MChartTooltipData | null) => void\n onDataClick?: (datasetIndex: number, dataIndex: number, value: number) => void\n}\n\nexport function MAreaChart({\n data,\n colors,\n innerWidth,\n innerHeight,\n padding,\n xAxis,\n yAxis,\n showGrid,\n showXAxis,\n showYAxis,\n curved,\n stacked,\n animated,\n valueFormatter = defaultValueFormatter,\n onTooltip,\n onDataClick,\n}: MAreaChartProps) {\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null)\n\n const plotW = innerWidth - padding.left - padding.right\n const plotH = innerHeight - padding.top - padding.bottom\n\n const {yMin, yMax, yTicks, xLabels, seriesPoints, stackedPaths} = useMemo(() => {\n const allData = data.map((d) => d.data)\n const maxLen = Math.max(...allData.map((d) => d.length), 1)\n\n let rawMin: number, rawMax: number\n if (stacked) {\n ;[rawMin, rawMax] = getStackedExtent(allData)\n } else {\n ;[rawMin, rawMax] = getDataExtent(allData)\n }\n\n const min = yAxis?.min ?? niceMin(rawMin)\n const max = yAxis?.max ?? niceMax(rawMax, rawMin)\n const ticks = generateTicks(min, max, yAxis?.ticks ?? 5)\n const labels = xAxis?.labels ?? Array.from({length: maxLen}, (_, i) => String(i))\n\n const xScale = createLinearScale([0, Math.max(maxLen - 1, 1)], [0, plotW])\n const yScale = createLinearScale([min, max], [plotH, 0])\n\n if (stacked) {\n const cumulative: number[][] = []\n for (let i = 0; i < allData.length; i++) {\n cumulative[i] = []\n for (let j = 0; j < maxLen; j++) {\n cumulative[i][j] = (allData[i][j] ?? 0) + (i > 0 ? cumulative[i - 1][j] : 0)\n }\n }\n\n const sPaths = cumulative.map((series, di) => {\n const topPts: Point[] = series.map((v, j) => ({\n x: padding.left + xScale(j),\n y: padding.top + yScale(v),\n }))\n const bottomPts: Point[] =\n di === 0\n ? series.map((_, j) => ({x: padding.left + xScale(j), y: padding.top + yScale(0)}))\n : cumulative[di - 1].map((v, j) => ({x: padding.left + xScale(j), y: padding.top + yScale(v)}))\n\n return {\n area: stackedAreaPath(topPts, bottomPts, curved),\n line: curved ? curvedPath(topPts) : linePath(topPts),\n topPts,\n }\n })\n\n return {\n yMin: min,\n yMax: max,\n yTicks: ticks,\n xLabels: labels,\n seriesPoints: [] as Point[][],\n stackedPaths: sPaths,\n }\n }\n\n const pts = allData.map((series) =>\n series.map((v, i): Point => ({x: padding.left + xScale(i), y: padding.top + yScale(v)}))\n )\n\n return {yMin: min, yMax: max, yTicks: ticks, xLabels: labels, seriesPoints: pts, stackedPaths: undefined}\n }, [data, plotW, plotH, xAxis, yAxis, stacked, curved, padding])\n\n const yScale = createLinearScale([yMin, yMax], [plotH, 0])\n const xScale = createLinearScale([0, Math.max(xLabels.length - 1, 1)], [0, plotW])\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<SVGGElement>) => {\n const svg = e.currentTarget.closest('svg')\n if (!svg) return\n const rect = svg.getBoundingClientRect()\n const scale = innerWidth / rect.width\n const mx = (e.clientX - rect.left) * scale - padding.left\n const idx = Math.round((mx / plotW) * Math.max(xLabels.length - 1, 1))\n const clampedIdx = Math.max(0, Math.min(idx, xLabels.length - 1))\n\n setHoveredIndex(clampedIdx)\n onTooltip({\n label: xLabels[clampedIdx],\n items: data.map((ds, di) => ({\n name: ds.label,\n value: ds.data[clampedIdx] ?? 0,\n color: ds.color ?? colors[di % colors.length],\n })),\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n })\n },\n [data, colors, xLabels, plotW, padding.left, innerWidth, onTooltip]\n )\n\n const handleMouseLeave = useCallback(() => {\n setHoveredIndex(null)\n onTooltip(null)\n }, [onTooltip])\n\n const gridH = yTicks.map((t) => padding.top + yScale(t))\n const yTickData = yTicks.map((t) => ({\n position: padding.top + yScale(t),\n label: (yAxis?.formatter ?? valueFormatter)(t),\n }))\n const xTickData = xLabels.map((l, i) => ({\n position: padding.left + xScale(i),\n label: l,\n }))\n\n return (\n <g>\n {showGrid && (\n <ChartGrid x={padding.left} y={padding.top} width={plotW} height={plotH} horizontalLines={gridH} />\n )}\n {showYAxis && (\n <ChartAxis\n type=\"y\"\n x={padding.left}\n y={padding.top + plotH}\n length={plotH}\n ticks={yTickData}\n title={yAxis?.title}\n />\n )}\n {showXAxis && (\n <ChartAxis\n type=\"x\"\n x={padding.left}\n y={padding.top + plotH}\n length={plotW}\n ticks={xTickData}\n title={xAxis?.title}\n />\n )}\n <g onMouseMove={handleMouseMove} onMouseLeave={handleMouseLeave}>\n <rect x={padding.left} y={padding.top} width={plotW} height={plotH} fill=\"transparent\" />\n {stacked && stackedPaths\n ? stackedPaths.map((sp, di) => {\n const c = data[di].color ?? colors[di % colors.length]\n return (\n <g key={di}>\n <path className={`chart-area-fill ${c}`} d={sp.area} />\n <path className={`chart-line ${c} ${animated ? 'animated' : ''}`} d={sp.line} />\n </g>\n )\n })\n : seriesPoints.map((pts, di) => {\n const c = data[di].color ?? colors[di % colors.length]\n const lineD = curved ? curvedPath(pts) : linePath(pts)\n const areaD = areaPath(pts, padding.top + plotH, curved)\n return (\n <g key={di}>\n <path className={`chart-area-fill ${c}`} d={areaD} />\n <path className={`chart-line ${c} ${animated ? 'animated' : ''}`} d={lineD} />\n {pts.map((p, pi) => (\n <circle\n key={pi}\n className={`chart-dot ${c} ${hoveredIndex === pi ? 'active' : ''}`}\n cx={p.x}\n cy={p.y}\n r={hoveredIndex === pi ? 5 : 3}\n onClick={() => onDataClick?.(di, pi, data[di].data[pi])}\n style={{cursor: onDataClick ? 'pointer' : undefined}}\n />\n ))}\n </g>\n )\n })}\n {hoveredIndex !== null && (\n <line\n className=\"chart-crosshair\"\n x1={padding.left + xScale(hoveredIndex)}\n y1={padding.top}\n x2={padding.left + xScale(hoveredIndex)}\n y2={padding.top + plotH}\n />\n )}\n </g>\n </g>\n )\n}\n","import {useMemo, useCallback, useState} from 'react'\nimport type {MChartDataset, MChartTooltipData} from '../MChart.types'\nimport type {MColor} from '../../../../theme/MTheme.types'\nimport {pieSector} from '../utils/paths'\nimport {defaultValueFormatter} from '../utils/formats'\n\ninterface MPieChartProps {\n data: MChartDataset[]\n colors: MColor[]\n innerWidth: number\n innerHeight: number\n donut: boolean\n donutWidth?: number\n animated: boolean\n valueFormatter: (value: number) => string\n xAxis?: {labels?: string[]}\n onTooltip: (data: MChartTooltipData | null) => void\n onDataClick?: (datasetIndex: number, dataIndex: number, value: number) => void\n}\n\nexport function MPieChart({\n data,\n colors,\n innerWidth,\n innerHeight,\n donut,\n donutWidth,\n animated,\n valueFormatter = defaultValueFormatter,\n xAxis,\n onTooltip,\n onDataClick,\n}: MPieChartProps) {\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null)\n\n const cx = innerWidth / 2\n const cy = innerHeight / 2\n const radius = Math.min(cx, cy) - 10\n const innerRadius = donut ? radius - (donutWidth ?? radius * 0.4) : 0\n\n const segments = useMemo(() => {\n const values = data.length === 1 ? data[0].data : data.map((d) => d.data[0] ?? 0)\n const labels =\n data.length === 1 ? (xAxis?.labels ?? values.map((_, i) => `Segment ${i + 1}`)) : data.map((d) => d.label)\n const total = values.reduce((s, v) => s + Math.max(v, 0), 0) || 1\n const startAngle = -Math.PI / 2\n\n let current = startAngle\n return values.map((v, i) => {\n const sweep = (Math.max(v, 0) / total) * Math.PI * 2\n const seg = {\n value: v,\n label: labels[i] ?? `Segment ${i + 1}`,\n color: (data.length === 1 ? undefined : data[i].color) ?? colors[i % colors.length],\n startAngle: current,\n endAngle: current + sweep,\n percentage: (Math.max(v, 0) / total) * 100,\n }\n current += sweep\n return seg\n })\n }, [data, colors, xAxis])\n\n const handleEnter = useCallback(\n (i: number, e: React.MouseEvent) => {\n setHoveredIndex(i)\n const svg = e.currentTarget.closest('svg')\n if (!svg) return\n const rect = svg.getBoundingClientRect()\n onTooltip({\n label: segments[i].label,\n items: [{name: segments[i].label, value: segments[i].value, color: segments[i].color}],\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n })\n },\n [segments, onTooltip]\n )\n\n const handleLeave = useCallback(() => {\n setHoveredIndex(null)\n onTooltip(null)\n }, [onTooltip])\n\n return (\n <g>\n {segments.map((seg, i) => {\n const isHovered = hoveredIndex === i\n const path = pieSector(\n cx,\n cy,\n isHovered ? radius + 4 : radius,\n innerRadius,\n seg.startAngle,\n seg.endAngle\n )\n return (\n <path\n key={i}\n className={`chart-pie-segment ${seg.color} ${animated ? 'animated' : ''} ${isHovered ? 'active' : ''}`}\n d={path}\n onMouseEnter={(e) => handleEnter(i, e)}\n onMouseLeave={handleLeave}\n onMouseMove={(e) => {\n const svg = e.currentTarget.closest('svg')\n if (!svg) return\n const rect = svg.getBoundingClientRect()\n onTooltip({\n label: seg.label,\n items: [{name: seg.label, value: seg.value, color: seg.color}],\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n })\n }}\n onClick={() => onDataClick?.(0, i, seg.value)}\n style={{cursor: onDataClick ? 'pointer' : undefined}}\n />\n )\n })}\n {donut && (\n <text x={cx} y={cy} textAnchor=\"middle\" dominantBaseline=\"middle\" className=\"chart-pie-center\">\n {hoveredIndex !== null\n ? valueFormatter(segments[hoveredIndex].value)\n : valueFormatter(segments.reduce((s, seg) => s + seg.value, 0))}\n </text>\n )}\n </g>\n )\n}\n","const COLORS = ['primary', 'info', 'success', 'warning', 'error', 'news', 'neutral', 'dark', 'light'] as const\n\nexport function ChartDefs() {\n return (\n <defs>\n {COLORS.map((c) => (\n <linearGradient key={`bar-${c}`} id={`chart-bar-grad-${c}`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" className={`chart-grad-stop-start ${c}`} />\n <stop offset=\"100%\" className={`chart-grad-stop-end ${c}`} />\n </linearGradient>\n ))}\n {COLORS.map((c) => (\n <linearGradient key={`pie-${c}`} id={`chart-pie-grad-${c}`} x1=\"0.3\" y1=\"0\" x2=\"0.7\" y2=\"1\">\n <stop offset=\"0%\" className={`chart-grad-stop-start ${c}`} />\n <stop offset=\"100%\" className={`chart-grad-stop-end ${c}`} />\n </linearGradient>\n ))}\n {COLORS.map((c) => (\n <linearGradient key={`area-${c}`} id={`chart-area-grad-${c}`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" className={`chart-grad-area-start ${c}`} />\n <stop offset=\"100%\" className={`chart-grad-area-end ${c}`} />\n </linearGradient>\n ))}\n </defs>\n )\n}\n","import type {MChartTooltipData} from '../MChart.types'\n\ninterface ChartTooltipProps {\n data: MChartTooltipData | null\n valueFormatter: (value: number) => string\n}\n\nexport function ChartTooltip({data, valueFormatter}: ChartTooltipProps) {\n if (!data) return null\n\n return (\n <div className=\"chart-tooltip\" style={{left: data.x, top: data.y}}>\n <div className=\"chart-tooltip-label\">{data.label}</div>\n {data.items.map((item, i) => (\n <div key={i} className=\"chart-tooltip-row\">\n <span className={`chart-tooltip-dot ${item.color}`} />\n <span className=\"chart-tooltip-name\">{item.name}</span>\n <span className=\"chart-tooltip-value\">{valueFormatter(item.value)}</span>\n </div>\n ))}\n </div>\n )\n}\n","import type {MColor} from '../../../../theme/MTheme.types'\n\ninterface ChartLegendProps {\n items: {label: string; color: MColor}[]\n}\n\nexport function ChartLegend({items}: ChartLegendProps) {\n if (items.length <= 1) return null\n\n return (\n <div className=\"chart-legend\">\n {items.map((item, i) => (\n <div key={i} className=\"chart-legend-item\">\n <span className={`chart-legend-dot ${item.color}`} />\n <span className=\"chart-legend-label\">{item.label}</span>\n </div>\n ))}\n </div>\n )\n}\n","import {useMemo, useCallback, useState, useRef} from 'react'\nimport type {MChartProps, MChartTooltipData} from './MChart.types'\nimport {CHART_DEFAULT_COLORS, CHART_PADDING, CHART_PADDING_WITH_TITLE} from './MChart.types'\nimport {defaultValueFormatter, defaultLabelFormatter} from './utils/formats'\nimport {cn} from '../../../utils/cn'\nimport {MLineChart} from './charts/MLineChart'\nimport {MBarChart} from './charts/MBarChart'\nimport {MAreaChart} from './charts/MAreaChart'\nimport {MPieChart} from './charts/MPieChart'\nimport {ChartDefs} from './parts/ChartDefs'\nimport {ChartTooltip} from './parts/ChartTooltip'\nimport {ChartLegend} from './parts/ChartLegend'\nimport './MChart.css'\n\nexport function MChart({\n type,\n data,\n width = '100%',\n height = 300,\n aspectRatio,\n xAxis,\n yAxis,\n showGrid = true,\n showXAxis = true,\n showYAxis = true,\n showLegend = true,\n showTooltip = true,\n animated = true,\n stacked = false,\n curved = false,\n donut = false,\n donutWidth,\n valueFormatter = defaultValueFormatter,\n labelFormatter = defaultLabelFormatter,\n onDataClick,\n className,\n style,\n ...rest\n}: MChartProps) {\n const containerRef = useRef<HTMLDivElement>(null)\n const [tooltip, setTooltip] = useState<MChartTooltipData | null>(null)\n\n const colors = CHART_DEFAULT_COLORS\n\n const hasTitles = !!(xAxis?.title || yAxis?.title)\n const padding = hasTitles ? CHART_PADDING_WITH_TITLE : CHART_PADDING\n\n const computedHeight = aspectRatio ? undefined : typeof height === 'number' ? height : 300\n\n const svgWidth = 600\n const svgHeight = computedHeight ?? 300\n\n const onTooltip = useCallback(\n (data: MChartTooltipData | null) => {\n if (showTooltip) setTooltip(data)\n },\n [showTooltip]\n )\n\n const legendItems = useMemo(() => {\n if (type === 'pie' && data.length === 1) {\n const labels = xAxis?.labels ?? data[0].data.map((_, i) => `Segment ${i + 1}`)\n return labels.map((l, i) => ({label: l, color: colors[i % colors.length]}))\n }\n return data.map((ds, i) => ({label: ds.label, color: ds.color ?? colors[i % colors.length]}))\n }, [data, colors, type, xAxis])\n\n const chartProps = {\n data,\n colors,\n innerWidth: svgWidth,\n innerHeight: svgHeight,\n padding,\n xAxis,\n yAxis,\n showGrid,\n showXAxis,\n showYAxis,\n animated,\n valueFormatter,\n onTooltip,\n onDataClick,\n }\n\n return (\n <div\n ref={containerRef}\n className={cn('chart', className)}\n style={{\n width,\n height: aspectRatio ? undefined : computedHeight,\n aspectRatio: aspectRatio ? String(aspectRatio) : undefined,\n ...style,\n }}\n {...rest}\n >\n <svg viewBox={`0 0 ${svgWidth} ${svgHeight}`} preserveAspectRatio=\"xMidYMid meet\" className=\"chart-svg\">\n <ChartDefs />\n {type === 'line' && <MLineChart {...chartProps} curved={curved} />}\n {type === 'bar' && <MBarChart {...chartProps} stacked={stacked} />}\n {type === 'area' && <MAreaChart {...chartProps} curved={curved} stacked={stacked} />}\n {type === 'pie' && <MPieChart {...chartProps} donut={donut} donutWidth={donutWidth} />}\n </svg>\n {showTooltip && <ChartTooltip data={tooltip} valueFormatter={valueFormatter} />}\n {showLegend && <ChartLegend items={legendItems} />}\n </div>\n )\n}\n","import type {MLineChartProps} from './MChart.types'\nimport {MChart} from './MChart'\n\nexport function MLineChart(props: MLineChartProps) {\n return <MChart type=\"line\" {...props} />\n}\n","import type {MBarChartProps} from './MChart.types'\nimport {MChart} from './MChart'\n\nexport function MBarChart(props: MBarChartProps) {\n return <MChart type=\"bar\" {...props} />\n}\n","import type {MAreaChartProps} from './MChart.types'\nimport {MChart} from './MChart'\n\nexport function MAreaChart(props: MAreaChartProps) {\n return <MChart type=\"area\" {...props} />\n}\n","import type {MPieChartProps} from './MChart.types'\nimport {MChart} from './MChart'\n\nexport function MPieChart(props: MPieChartProps) {\n return <MChart type=\"pie\" {...props} />\n}\n"],"mappings":"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"}
|