@banzamel/mineralui 2.3.1 → 2.4.1
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 +2 -2
- package/dist/{MAvatar-bUWENcq-.cjs → MAvatar-Capz5Gbc.cjs} +2 -2
- package/dist/{MAvatar-bUWENcq-.cjs.map → MAvatar-Capz5Gbc.cjs.map} +1 -1
- package/dist/{MButton-R08y1HCT.cjs → MButton-sTKnano6.cjs} +2 -2
- package/dist/{MButton-R08y1HCT.cjs.map → MButton-sTKnano6.cjs.map} +1 -1
- package/dist/{MButtonGroup-C-LiXWRC.cjs → MButtonGroup-iPv14c0V.cjs} +2 -2
- package/dist/{MButtonGroup-C-LiXWRC.cjs.map → MButtonGroup-iPv14c0V.cjs.map} +1 -1
- package/dist/{MCard-1OVOl4Ql.cjs → MCard-DK-_FkpE.cjs} +2 -2
- package/dist/{MCard-1OVOl4Ql.cjs.map → MCard-DK-_FkpE.cjs.map} +1 -1
- package/dist/{MCheckbox-CM5HJQWW.cjs → MCheckbox-CIX7wp41.cjs} +2 -2
- package/dist/{MCheckbox-CM5HJQWW.cjs.map → MCheckbox-CIX7wp41.cjs.map} +1 -1
- package/dist/{MConflictIllustration-Drsm8_8C.js → MConflictIllustration-3K0lCAsD.js} +3 -3
- package/dist/MConflictIllustration-3K0lCAsD.js.map +1 -0
- package/dist/MConflictIllustration-BuK6cSsc.cjs +2 -0
- package/dist/MConflictIllustration-BuK6cSsc.cjs.map +1 -0
- package/dist/{MDetailList-DTLU7HQZ.cjs → MDetailList-Ce7KzUKC.cjs} +2 -2
- package/dist/{MDetailList-DTLU7HQZ.cjs.map → MDetailList-Ce7KzUKC.cjs.map} +1 -1
- package/dist/MDropdownMenu-B_QWQhxy.cjs +2 -0
- package/dist/MDropdownMenu-B_QWQhxy.cjs.map +1 -0
- package/dist/MDropdownMenu-C4CuKMRZ.js +172 -0
- package/dist/MDropdownMenu-C4CuKMRZ.js.map +1 -0
- package/dist/{MGrid-B_0kFUws.cjs → MGrid-fTx6wFq_.cjs} +2 -2
- package/dist/{MGrid-B_0kFUws.cjs.map → MGrid-fTx6wFq_.cjs.map} +1 -1
- package/dist/{MHeading-BLnb3dNv.cjs → MHeading-KDSpnCof.cjs} +2 -2
- package/dist/{MHeading-BLnb3dNv.cjs.map → MHeading-KDSpnCof.cjs.map} +1 -1
- package/dist/{MI18nProvider-Cg-vxV6j.cjs → MI18nProvider-DXRbB0VY.cjs} +2 -2
- package/dist/{MI18nProvider-Cg-vxV6j.cjs.map → MI18nProvider-DXRbB0VY.cjs.map} +1 -1
- package/dist/{MInput-BpTlP8GE.cjs → MInput-CGl2Q-rM.cjs} +2 -2
- package/dist/{MInput-BpTlP8GE.cjs.map → MInput-CGl2Q-rM.cjs.map} +1 -1
- package/dist/{MInputCVC-B4V0QI5h.js → MInputCVC-Blv5PeyS.js} +2 -2
- package/dist/{MInputCVC-B4V0QI5h.js.map → MInputCVC-Blv5PeyS.js.map} +1 -1
- package/dist/{MInputCVC-BlY5OrVn.cjs → MInputCVC-lAFKTV6y.cjs} +2 -2
- package/dist/{MInputCVC-BlY5OrVn.cjs.map → MInputCVC-lAFKTV6y.cjs.map} +1 -1
- package/dist/{MInputSearch-9wcXlY8-.cjs → MInputSearch-BZDnbFB4.cjs} +2 -2
- package/dist/{MInputSearch-9wcXlY8-.cjs.map → MInputSearch-BZDnbFB4.cjs.map} +1 -1
- package/dist/{MKbd-n4fhKIxb.cjs → MKbd-DqMnZ7Iv.cjs} +2 -2
- package/dist/{MKbd-n4fhKIxb.cjs.map → MKbd-DqMnZ7Iv.cjs.map} +1 -1
- package/dist/{MLink-Biipj7xz.cjs → MLink-U24G6KJj.cjs} +2 -2
- package/dist/{MLink-Biipj7xz.cjs.map → MLink-U24G6KJj.cjs.map} +1 -1
- package/dist/{MLoader-XcpKlLrd.cjs → MLoader-CvFIvytw.cjs} +2 -2
- package/dist/{MLoader-XcpKlLrd.cjs.map → MLoader-CvFIvytw.cjs.map} +1 -1
- package/dist/{MPagination-CgmNEAZX.js → MPagination-BkvOEZpp.js} +1 -1
- package/dist/{MPagination-CgmNEAZX.js.map → MPagination-BkvOEZpp.js.map} +1 -1
- package/dist/{MPagination-C6QQdEj_.cjs → MPagination-DgQta29Q.cjs} +2 -2
- package/dist/{MPagination-C6QQdEj_.cjs.map → MPagination-DgQta29Q.cjs.map} +1 -1
- package/dist/MPopover-C-e1CoV0.cjs +2 -0
- package/dist/MPopover-C-e1CoV0.cjs.map +1 -0
- package/dist/{MPopover-C5aaGhma.js → MPopover-Dd-GIBU6.js} +10 -5
- package/dist/MPopover-Dd-GIBU6.js.map +1 -0
- package/dist/{MPortal-BciZHNDC.cjs → MPortal-DUSIuINN.cjs} +2 -2
- package/dist/{MPortal-BciZHNDC.cjs.map → MPortal-DUSIuINN.cjs.map} +1 -1
- package/dist/{MSimpleGrid-BwNfaxQP.cjs → MSimpleGrid-BzlIitcJ.cjs} +2 -2
- package/dist/{MSimpleGrid-BwNfaxQP.cjs.map → MSimpleGrid-BzlIitcJ.cjs.map} +1 -1
- package/dist/{MSkeleton-CLSU5pL6.cjs → MSkeleton-BoFpowFU.cjs} +2 -2
- package/dist/{MSkeleton-CLSU5pL6.cjs.map → MSkeleton-BoFpowFU.cjs.map} +1 -1
- package/dist/{MSlider-DZnMB49q.cjs → MSlider-BTDBqF8t.cjs} +2 -2
- package/dist/{MSlider-DZnMB49q.cjs.map → MSlider-BTDBqF8t.cjs.map} +1 -1
- package/dist/{MStack-BP_BUeCc.cjs → MStack-B3Ldqsc-.cjs} +2 -2
- package/dist/{MStack-BP_BUeCc.cjs.map → MStack-B3Ldqsc-.cjs.map} +1 -1
- package/dist/{MSubText-VHsgFsv2.cjs → MSubText-47PsgE8T.cjs} +2 -2
- package/dist/{MSubText-VHsgFsv2.cjs.map → MSubText-47PsgE8T.cjs.map} +1 -1
- package/dist/{MSurface-CYeVFOw_.cjs → MSurface-QYEygc_0.cjs} +2 -2
- package/dist/{MSurface-CYeVFOw_.cjs.map → MSurface-QYEygc_0.cjs.map} +1 -1
- package/dist/{MTag-BzTp1crT.cjs → MTag-BjV-dXkk.cjs} +2 -2
- package/dist/{MTag-BzTp1crT.cjs.map → MTag-BjV-dXkk.cjs.map} +1 -1
- package/dist/{MText-j6Zbbj5Y.cjs → MText-Dni707tS.cjs} +2 -2
- package/dist/{MText-j6Zbbj5Y.cjs.map → MText-Dni707tS.cjs.map} +1 -1
- package/dist/{MTooltip-BEfO9jTe.cjs → MTooltip-ChvuN4Ow.cjs} +2 -2
- package/dist/{MTooltip-BEfO9jTe.cjs.map → MTooltip-ChvuN4Ow.cjs.map} +1 -1
- package/dist/{MTooltip-BTJkzOah.js → MTooltip-H3we0a7w.js} +1 -1
- package/dist/{MTooltip-BTJkzOah.js.map → MTooltip-H3we0a7w.js.map} +1 -1
- package/dist/{MTreeView-DuQkm0ZV.cjs → MTreeView-VYp0eErQ.cjs} +2 -2
- package/dist/{MTreeView-DuQkm0ZV.cjs.map → MTreeView-VYp0eErQ.cjs.map} +1 -1
- package/dist/{arduino-DdDHMIWB.cjs → arduino-BdpdaLwK.cjs} +1 -1
- package/dist/{arduino-DdDHMIWB.cjs.map → arduino-BdpdaLwK.cjs.map} +1 -1
- package/dist/{arduino-UeOrXakL.js → arduino-DDDlP9Yt.js} +1 -1
- package/dist/{arduino-UeOrXakL.js.map → arduino-DDDlP9Yt.js.map} +1 -1
- package/dist/{bash-CrHemXky.js → bash-D8WbAmuA.js} +1 -1
- package/dist/{bash-CrHemXky.js.map → bash-D8WbAmuA.js.map} +1 -1
- package/dist/{bash-B17_F5Sw.cjs → bash-eOUFh3S1.cjs} +1 -1
- package/dist/{bash-B17_F5Sw.cjs.map → bash-eOUFh3S1.cjs.map} +1 -1
- package/dist/{c-ODLxeMV_.cjs → c-Bur7Mn-u.cjs} +1 -1
- package/dist/{c-ODLxeMV_.cjs.map → c-Bur7Mn-u.cjs.map} +1 -1
- package/dist/{c-D9302r2r.js → c-CTKNfUJI.js} +1 -1
- package/dist/{c-D9302r2r.js.map → c-CTKNfUJI.js.map} +1 -1
- package/dist/calendar-P7MwKfWS.cjs +2 -0
- package/dist/calendar-P7MwKfWS.cjs.map +1 -0
- package/dist/calendar-bzeZRst9.js +193 -0
- package/dist/calendar-bzeZRst9.js.map +1 -0
- package/dist/calendar.cjs +3 -0
- package/dist/calendar.d.ts +1 -0
- package/dist/calendar.js +4 -0
- package/dist/calendarDates-AnlGcvZM.cjs +2 -0
- package/dist/calendarDates-AnlGcvZM.cjs.map +1 -0
- package/dist/calendarDates-CYkJqcnp.js +50 -0
- package/dist/calendarDates-CYkJqcnp.js.map +1 -0
- package/dist/{cards-Cpr9B8Mu.js → cards-CFDJsdxR.js} +5 -5
- package/dist/{cards-Cpr9B8Mu.js.map → cards-CFDJsdxR.js.map} +1 -1
- package/dist/{cards-CQSYgH9U.cjs → cards-DeA7I2KC.cjs} +2 -2
- package/dist/{cards-CQSYgH9U.cjs.map → cards-DeA7I2KC.cjs.map} +1 -1
- package/dist/cards.cjs +1 -1
- package/dist/cards.js +1 -1
- package/dist/components/calendar/MMiniCalendar/MMiniCalendar.d.ts +6 -0
- package/dist/components/calendar/MMiniCalendar/MMiniCalendar.types.d.ts +35 -0
- package/dist/components/calendar/MMiniCalendar/index.d.ts +2 -0
- package/dist/components/calendar/index.d.ts +2 -0
- package/dist/components/data/MWeekGrid/MWeekGrid.types.d.ts +9 -4
- package/dist/components/dropdowns/MSelect/MSelect.d.ts +1 -1
- package/dist/components/dropdowns/MSelect/MSelect.types.d.ts +2 -0
- package/dist/components/overlays/MDropdownMenu/MDropdownMenu.d.ts +1 -1
- package/dist/components/overlays/MDropdownMenu/MDropdownMenu.types.d.ts +7 -0
- package/dist/components/overlays/MDropdownMenu/index.d.ts +1 -1
- package/dist/components/overlays/index.d.ts +1 -1
- package/dist/{controls-CT_0lIPr.cjs → controls-KK-TyUTT.cjs} +2 -2
- package/dist/{controls-CT_0lIPr.cjs.map → controls-KK-TyUTT.cjs.map} +1 -1
- package/dist/controls.cjs +1 -1
- package/dist/{core-yRqh2XLu.js → core-D5-SQcs8.js} +1 -1
- package/dist/{core-yRqh2XLu.js.map → core-D5-SQcs8.js.map} +1 -1
- package/dist/{core-DBpQf3uY.cjs → core-D66c1_Wo.cjs} +1 -1
- package/dist/{core-DBpQf3uY.cjs.map → core-D66c1_Wo.cjs.map} +1 -1
- package/dist/{cpp-DuTgLZC1.cjs → cpp-BMULAf-B.cjs} +1 -1
- package/dist/{cpp-DuTgLZC1.cjs.map → cpp-BMULAf-B.cjs.map} +1 -1
- package/dist/{cpp-CLYSpJBB.js → cpp-DAzz2TpY.js} +1 -1
- package/dist/{cpp-CLYSpJBB.js.map → cpp-DAzz2TpY.js.map} +1 -1
- package/dist/{css-D0f-qByc.cjs → css-9M03GzKO.cjs} +1 -1
- package/dist/{css-D0f-qByc.cjs.map → css-9M03GzKO.cjs.map} +1 -1
- package/dist/{css-BgGh0eG1.js → css-EGOXTWIl.js} +1 -1
- package/dist/{css-BgGh0eG1.js.map → css-EGOXTWIl.js.map} +1 -1
- package/dist/{data-C-6DP7iY.js → data-CgLutFxU.js} +246 -231
- package/dist/data-CgLutFxU.js.map +1 -0
- package/dist/data-DFrkJTlF.cjs +2 -0
- package/dist/data-DFrkJTlF.cjs.map +1 -0
- package/dist/data.cjs +1 -1
- package/dist/data.js +1 -1
- package/dist/{display-DMix8BmD.cjs → display--E7rI0tk.cjs} +2 -2
- package/dist/{display-DMix8BmD.cjs.map → display--E7rI0tk.cjs.map} +1 -1
- package/dist/{display-BF4jASt9.js → display-BnkHKW1n.js} +12 -12
- package/dist/{display-BF4jASt9.js.map → display-BnkHKW1n.js.map} +1 -1
- package/dist/display.cjs +1 -1
- package/dist/display.js +1 -1
- package/dist/dropdowns-DGYg9zIh.cjs +2 -0
- package/dist/dropdowns-DGYg9zIh.cjs.map +1 -0
- package/dist/dropdowns-Dq-xAplH.js +1698 -0
- package/dist/dropdowns-Dq-xAplH.js.map +1 -0
- package/dist/dropdowns.cjs +1 -1
- package/dist/dropdowns.js +1 -1
- package/dist/{feedback-BeJpXoKd.cjs → feedback-CA77ShtB.cjs} +2 -2
- package/dist/{feedback-BeJpXoKd.cjs.map → feedback-CA77ShtB.cjs.map} +1 -1
- package/dist/feedback.cjs +1 -1
- package/dist/{form-CgH1hioG.js → form-CAFcvmUS.js} +1 -1
- package/dist/{form-CgH1hioG.js.map → form-CAFcvmUS.js.map} +1 -1
- package/dist/{form-BWGLrCPi.cjs → form-DpfzLUOn.cjs} +2 -2
- package/dist/{form-BWGLrCPi.cjs.map → form-DpfzLUOn.cjs.map} +1 -1
- package/dist/form.cjs +1 -1
- package/dist/form.js +1 -1
- package/dist/frameworkTexts-DH0Xp-Vx.js +78 -0
- package/dist/frameworkTexts-DH0Xp-Vx.js.map +1 -0
- package/dist/frameworkTexts-iDXhcW6k.cjs +2 -0
- package/dist/frameworkTexts-iDXhcW6k.cjs.map +1 -0
- package/dist/i18n/frameworkTexts.d.ts +96 -0
- package/dist/i18n.cjs +1 -1
- package/dist/{icons-D675Im0B.cjs → icons-D_NB67he.cjs} +2 -2
- package/dist/{icons-D675Im0B.cjs.map → icons-D_NB67he.cjs.map} +1 -1
- package/dist/icons.cjs +1 -1
- package/dist/illustrations.cjs +1 -1
- package/dist/illustrations.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +15 -14
- package/dist/{inputs-x6vjAGCq.cjs → inputs-Clenc4Rm.cjs} +2 -2
- package/dist/{inputs-x6vjAGCq.cjs.map → inputs-Clenc4Rm.cjs.map} +1 -1
- package/dist/inputs.cjs +1 -1
- package/dist/inputs.js +1 -1
- package/dist/{javascript-CX3JhsYu.js → javascript-CHSg4NGc.js} +1 -1
- package/dist/{javascript-CX3JhsYu.js.map → javascript-CHSg4NGc.js.map} +1 -1
- package/dist/{javascript-CGjvHPZ1.cjs → javascript-CastOQF5.cjs} +1 -1
- package/dist/{javascript-CGjvHPZ1.cjs.map → javascript-CastOQF5.cjs.map} +1 -1
- package/dist/{json-BPIcVdlp.js → json-Bejy9Rlg.js} +1 -1
- package/dist/{json-BPIcVdlp.js.map → json-Bejy9Rlg.js.map} +1 -1
- package/dist/{json-B8svQsK0.cjs → json-DCkJ-m-p.cjs} +1 -1
- package/dist/{json-B8svQsK0.cjs.map → json-DCkJ-m-p.cjs.map} +1 -1
- package/dist/{layout-Ddo7HUPu.cjs → layout-CNoZdeXw.cjs} +2 -2
- package/dist/{layout-Ddo7HUPu.cjs.map → layout-CNoZdeXw.cjs.map} +1 -1
- package/dist/{layout-CdSpVJuK.js → layout-DsE4zfpg.js} +3 -3
- package/dist/{layout-CdSpVJuK.js.map → layout-DsE4zfpg.js.map} +1 -1
- package/dist/layout.cjs +1 -1
- package/dist/layout.js +2 -2
- package/dist/{licensing-DysMClel.cjs → licensing-DGIdtfNg.cjs} +2 -2
- package/dist/licensing-DGIdtfNg.cjs.map +1 -0
- package/dist/licensing-f5KYVz7D.js.map +1 -1
- package/dist/{locale-CbnstsMH.cjs → locale-DRRl_s5-.cjs} +2 -2
- package/dist/{locale-CbnstsMH.cjs.map → locale-DRRl_s5-.cjs.map} +1 -1
- package/dist/{media-DRz3JZfr.cjs → media-DRTBXDnn.cjs} +2 -2
- package/dist/{media-DRz3JZfr.cjs.map → media-DRTBXDnn.cjs.map} +1 -1
- package/dist/media.cjs +1 -1
- package/dist/{overlays-C1vO_A2I.js → overlays-BKk_ZXue.js} +3 -3
- package/dist/{overlays-C1vO_A2I.js.map → overlays-BKk_ZXue.js.map} +1 -1
- package/dist/{overlays-BUZEaZaJ.cjs → overlays-Qbp4d596.cjs} +2 -2
- package/dist/{overlays-BUZEaZaJ.cjs.map → overlays-Qbp4d596.cjs.map} +1 -1
- package/dist/overlays.cjs +1 -1
- package/dist/overlays.js +3 -3
- package/dist/{php-CKyelegh.cjs → php-BdVXegqn.cjs} +1 -1
- package/dist/{php-CKyelegh.cjs.map → php-BdVXegqn.cjs.map} +1 -1
- package/dist/{php-CBRzjinf.js → php-Cb_S1hXT.js} +1 -1
- package/dist/{php-CBRzjinf.js.map → php-Cb_S1hXT.js.map} +1 -1
- package/dist/primitives.cjs +1 -1
- package/dist/primitives.js +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-BfNZicWk.cjs → theme-DgaM4CjM.cjs} +2 -2
- package/dist/{theme-BfNZicWk.cjs.map → theme-DgaM4CjM.cjs.map} +1 -1
- package/dist/theme.cjs +1 -1
- package/dist/{typescript-Xt3Sotw5.js → typescript-0VHxrxf2.js} +1 -1
- package/dist/{typescript-Xt3Sotw5.js.map → typescript-0VHxrxf2.js.map} +1 -1
- package/dist/{typescript-D6PDzwkM.cjs → typescript-CcGBfzlS.cjs} +1 -1
- package/dist/{typescript-D6PDzwkM.cjs.map → typescript-CcGBfzlS.cjs.map} +1 -1
- package/dist/{typography-Dk9kIORI.cjs → typography-C4_O8len.cjs} +2 -2
- package/dist/{typography-Dk9kIORI.cjs.map → typography-C4_O8len.cjs.map} +1 -1
- package/dist/typography.cjs +1 -1
- package/dist/{useGhostText-Dmkw3Am8.cjs → useGhostText-Dlemg1vw.cjs} +2 -2
- package/dist/{useGhostText-Dmkw3Am8.cjs.map → useGhostText-Dlemg1vw.cjs.map} +1 -1
- package/dist/{useInteractionEffect-DFTdcWHl.cjs → useInteractionEffect-CFwDX5UF.cjs} +2 -2
- package/dist/{useInteractionEffect-DFTdcWHl.cjs.map → useInteractionEffect-CFwDX5UF.cjs.map} +1 -1
- package/dist/{useKeyboardNav-HVG9JFD2.cjs → useKeyboardNav-Bm-dxVq-.cjs} +2 -2
- package/dist/{useKeyboardNav-HVG9JFD2.cjs.map → useKeyboardNav-Bm-dxVq-.cjs.map} +1 -1
- package/dist/utils/calendarDates.d.ts +51 -0
- package/dist/utils/licensing.d.ts +1 -1
- package/dist/utils/useControllableState.d.ts +5 -0
- package/dist/utils/useElementWidth.d.ts +10 -0
- package/dist/utils.cjs +1 -1
- package/dist/{xml-CrpWqcDk.js → xml-8GjNy8SM.js} +1 -1
- package/dist/{xml-CrpWqcDk.js.map → xml-8GjNy8SM.js.map} +1 -1
- package/dist/{xml-4YlaGgjP.cjs → xml-Dbm3mobK.cjs} +1 -1
- package/dist/{xml-4YlaGgjP.cjs.map → xml-Dbm3mobK.cjs.map} +1 -1
- package/package.json +16 -3
- package/dist/MConflictIllustration-B2AtfpYO.cjs +0 -2
- package/dist/MConflictIllustration-B2AtfpYO.cjs.map +0 -1
- package/dist/MConflictIllustration-Drsm8_8C.js.map +0 -1
- package/dist/MDropdownMenu-BvN5grK5.cjs +0 -2
- package/dist/MDropdownMenu-BvN5grK5.cjs.map +0 -1
- package/dist/MDropdownMenu-CFoKJ7V6.js +0 -157
- package/dist/MDropdownMenu-CFoKJ7V6.js.map +0 -1
- package/dist/MPopover-C5aaGhma.js.map +0 -1
- package/dist/MPopover-CV-9MArH.cjs +0 -2
- package/dist/MPopover-CV-9MArH.cjs.map +0 -1
- package/dist/data-BZ92hzXx.cjs +0 -2
- package/dist/data-BZ92hzXx.cjs.map +0 -1
- package/dist/data-C-6DP7iY.js.map +0 -1
- package/dist/dropdowns-BwAVoncd.js +0 -1752
- package/dist/dropdowns-BwAVoncd.js.map +0 -1
- package/dist/dropdowns-D5IF0TK7.cjs +0 -2
- package/dist/dropdowns-D5IF0TK7.cjs.map +0 -1
- package/dist/licensing-DysMClel.cjs.map +0 -1
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require(`./cn-CU5TNITO.cjs`),t=require(`./useKeyboardNav-HVG9JFD2.cjs`),n=require(`./MPopover-CV-9MArH.cjs`);require(`./core-DBpQf3uY.cjs`);let r=require(`react`),i=require(`react/jsx-runtime`);function a(e){return e.props}function o(e){return!!e.type.__dropdownItem}function s(e){return!!e.type.__dropdownGroup}function c(e){let t=[];return r.Children.forEach(e,e=>{(0,r.isValidElement)(e)&&(o(e)?t.push(e):s(e)&&r.Children.forEach(a(e).children,e=>{(0,r.isValidElement)(e)&&o(e)&&t.push(e)}))}),t}function l({trigger:l,placement:u=`bottom-start`,closeOnSelect:d=!0,openOn:f=`click`,onOpenChange:p,isolateClick:m=!1,className:h,style:g,popoverClassName:_,popoverStyle:v,children:y}){let[b,x]=(0,r.useState)(!1),S=(0,r.useRef)(null),C=(0,r.useRef)(null),w=c(y),T=w.filter(e=>!a(e).disabled).length,E=(0,r.useCallback)(e=>{x(t=>{let n=typeof e==`function`?e(t):e;return p?.(n),n})},[p]),{activeIndex:D,setActiveIndex:O,onKeyDown:k}=t.t({itemCount:T,onSelect:(0,r.useCallback)(e=>{let t=0;for(let n of w){let r=a(n);if(!r.disabled){if(t===e){r.onClick?.();break}t++}}d&&E(!1)},[w,d,E]),onClose:()=>x(!1),isOpen:b}),A=e=>{m&&(e.stopPropagation(),e.preventDefault()),E(e=>!e)},j=e=>{(e.key===`ArrowDown`||e.key===`Enter`||e.key===` `)&&(e.preventDefault(),m&&e.stopPropagation(),E(!0)),b&&k(e)},M=0,N=e=>{if(!(0,r.isValidElement)(e))return e;if(o(e)){let t=a(e).disabled,n=t?-1:M++;return(0,r.cloneElement)(e,{_active:n===D,_onHover:t?void 0:()=>O(n),_onClick:()=>{t||d&&E(!1)}})}return s(e)?(0,r.cloneElement)(e,{children:r.Children.map(a(e).children,N)}):e},P=f===`hover`?{onMouseEnter:()=>{C.current&&clearTimeout(C.current),E(!0)},onMouseLeave:()=>{C.current=setTimeout(()=>E(!1),150)}}:{},F=m?e=>{e.stopPropagation(),e.preventDefault()}:void 0;return(0,i.jsxs)(`div`,{className:e.t(`dropdown menu anchor`,h),style:g,onClick:F,...P,children:[(0,i.jsx)(`div`,{ref:S,onClick:f===`click`?A:void 0,onKeyDown:j,role:`button`,tabIndex:0,className:`dropdown menu trigger`,children:l}),(0,i.jsx)(n.t,{open:b,anchorRef:S,onClose:()=>E(!1),placement:u,className:e.t(`dropdown menu popover`,_),style:v,children:(0,i.jsx)(`div`,{className:`dropdown menu list`,role:`menu`,...P,children:r.Children.map(y,N)})})]})}function u({icon:t,label:n,href:r,to:a,onClick:o,color:s,disabled:c=!1,active:l=!1,component:u,className:d,_active:f,_onHover:p,_onClick:m}){let h=f??l,g=(0,i.jsxs)(i.Fragment,{children:[t&&(0,i.jsx)(`span`,{className:`dropdown menu icon`,children:t}),(0,i.jsx)(`span`,{className:`dropdown menu label`,children:n})]}),_=e.t(`dropdown menu item`,h&&`active`,c&&`disabled`,s,d),v=e=>{if(c){e.preventDefault();return}o?.(),m?.()},y=u??(r||a?`a`:`button`),b=u?{...r?{href:r}:{},...a?{to:a}:{}}:r?{href:r}:a?{href:a}:{};return(0,i.jsx)(y,{className:_,role:`menuitem`,tabIndex:-1,onClick:v,onMouseEnter:p,"aria-disabled":c||void 0,...b,children:g})}u.__dropdownItem=!0;function d({label:e,children:t}){return(0,i.jsxs)(`div`,{className:`dropdown menu group`,role:`group`,children:[(0,i.jsx)(`div`,{className:`dropdown menu group-label`,children:e}),t]})}d.__dropdownGroup=!0;function f({className:t}){return(0,i.jsx)(`div`,{className:e.t(`dropdown menu divider`,t),role:`separator`})}Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return f}});
|
|
2
|
-
//# sourceMappingURL=MDropdownMenu-BvN5grK5.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MDropdownMenu-BvN5grK5.cjs","names":[],"sources":["../src/components/overlays/MDropdownMenu/MDropdownMenu.tsx"],"sourcesContent":["import {useState, useRef, useCallback, Children, isValidElement, cloneElement} from 'react'\nimport type * as React from 'react'\nimport {MPopover} from '../../primitives'\nimport {useKeyboardNav} from '../../../utils/useKeyboardNav'\nimport {cn} from '../../../utils/cn'\nimport type {\n MDropdownMenuProps,\n MDropdownItemProps,\n MDropdownGroupProps,\n MDropdownDividerProps,\n} from './MDropdownMenu.types'\nimport './MDropdownMenu.css'\n\ntype AnyProps = Record<string, any>\n\nfunction getProps(el: React.ReactElement): AnyProps {\n return el.props as AnyProps\n}\n\nfunction isItem(child: React.ReactElement): boolean {\n return !!(child.type as any).__dropdownItem\n}\n\nfunction isGroup(child: React.ReactElement): boolean {\n return !!(child.type as any).__dropdownGroup\n}\n\n// Collect all MDropdownItem elements from children (including inside groups).\nfunction collectItems(children: React.ReactNode): React.ReactElement[] {\n const items: React.ReactElement[] = []\n Children.forEach(children, (child) => {\n if (!isValidElement(child)) return\n if (isItem(child)) {\n items.push(child)\n } else if (isGroup(child)) {\n Children.forEach(getProps(child).children, (gc: React.ReactNode) => {\n if (isValidElement(gc) && isItem(gc)) {\n items.push(gc)\n }\n })\n }\n })\n return items\n}\n\nexport function MDropdownMenu({\n trigger,\n placement = 'bottom-start',\n closeOnSelect = true,\n openOn = 'click',\n onOpenChange,\n isolateClick = false,\n className,\n style,\n popoverClassName,\n popoverStyle,\n children,\n}: MDropdownMenuProps) {\n const [open, setOpen] = useState(false)\n const anchorRef = useRef<HTMLDivElement>(null)\n const hoverTimeout = useRef<ReturnType<typeof setTimeout>>(null)\n\n const items = collectItems(children)\n const enabledCount = items.filter((i) => !getProps(i).disabled).length\n\n const setMenuOpen = useCallback(\n (next: boolean | ((prev: boolean) => boolean)) => {\n setOpen((prev) => {\n const resolved = typeof next === 'function' ? next(prev) : next\n onOpenChange?.(resolved)\n return resolved\n })\n },\n [onOpenChange]\n )\n\n const handleSelect = useCallback(\n (index: number) => {\n let enabledIdx = 0\n for (const item of items) {\n const p = getProps(item)\n if (p.disabled) continue\n if (enabledIdx === index) {\n p.onClick?.()\n break\n }\n enabledIdx++\n }\n if (closeOnSelect) setMenuOpen(false)\n },\n [items, closeOnSelect, setMenuOpen]\n )\n\n const {activeIndex, setActiveIndex, onKeyDown} = useKeyboardNav({\n itemCount: enabledCount,\n onSelect: handleSelect,\n onClose: () => setOpen(false),\n isOpen: open,\n })\n\n const handleTriggerClick = (e: React.MouseEvent) => {\n if (isolateClick) {\n e.stopPropagation()\n e.preventDefault()\n }\n setMenuOpen((o) => !o)\n }\n\n const handleTriggerKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n if (isolateClick) e.stopPropagation()\n setMenuOpen(true)\n }\n if (open) onKeyDown(e as any)\n }\n\n // Map active index back to flat child rendering with enabled-only tracking.\n let enabledIdx = 0\n const renderChild = (child: React.ReactNode): React.ReactNode => {\n if (!isValidElement(child)) return child\n\n if (isItem(child)) {\n const p = getProps(child)\n const isDisabled = p.disabled\n const idx = isDisabled ? -1 : enabledIdx++\n return cloneElement(child, {\n _active: idx === activeIndex,\n _onHover: isDisabled ? undefined : () => setActiveIndex(idx),\n _onClick: () => {\n if (isDisabled) return\n if (closeOnSelect) setMenuOpen(false)\n },\n } as AnyProps)\n }\n\n if (isGroup(child)) {\n return cloneElement(child, {\n children: Children.map(getProps(child).children, renderChild),\n } as AnyProps)\n }\n\n return child\n }\n\n const hoverHandlers =\n openOn === 'hover'\n ? {\n onMouseEnter: () => {\n if (hoverTimeout.current) clearTimeout(hoverTimeout.current)\n setMenuOpen(true)\n },\n onMouseLeave: () => {\n hoverTimeout.current = setTimeout(() => setMenuOpen(false), 150)\n },\n }\n : {}\n\n /**\n * When `isolateClick` is set, every click bubbling out of the menu\n * (trigger AND items) must be stopped — otherwise selecting an action\n * also fires the click handler on a clickable parent (Link, MCard with\n * onClick, MDataTable row link). Trigger click itself is handled by\n * `handleTriggerClick`; this wrapper catches the bubbled item clicks\n * before they leave the anchor. `preventDefault` is needed too — when the\n * dropdown is rendered inside an `<a href>` (MCard component={Link}),\n * stopping propagation alone does not block native link navigation.\n *\n * Caveat: MDropdownItem with `href` will not navigate while inside an\n * `isolateClick` menu — use programmatic navigation (onClick + navigate)\n * in those contexts instead.\n */\n const isolateAnchorClick = isolateClick\n ? (e: React.MouseEvent) => {\n e.stopPropagation()\n e.preventDefault()\n }\n : undefined\n\n return (\n <div\n className={cn('dropdown menu anchor', className)}\n style={style}\n onClick={isolateAnchorClick}\n {...hoverHandlers}\n >\n <div\n ref={anchorRef}\n onClick={openOn === 'click' ? handleTriggerClick : undefined}\n onKeyDown={handleTriggerKeyDown}\n role=\"button\"\n tabIndex={0}\n className=\"dropdown menu trigger\"\n >\n {trigger}\n </div>\n <MPopover\n open={open}\n anchorRef={anchorRef}\n onClose={() => setMenuOpen(false)}\n placement={placement}\n className={cn('dropdown menu popover', popoverClassName)}\n style={popoverStyle}\n >\n <div className=\"dropdown menu list\" role=\"menu\" {...hoverHandlers}>\n {Children.map(children, renderChild)}\n </div>\n </MPopover>\n </div>\n )\n}\n\nexport function MDropdownItem({\n icon,\n label,\n href,\n to,\n onClick,\n color,\n disabled = false,\n active = false,\n component,\n className,\n _active,\n _onHover,\n _onClick,\n}: MDropdownItemProps & {_active?: boolean; _onHover?: () => void; _onClick?: () => void}) {\n const isHighlighted = _active ?? active\n\n const content = (\n <>\n {icon && <span className=\"dropdown menu icon\">{icon}</span>}\n <span className=\"dropdown menu label\">{label}</span>\n </>\n )\n\n const cls = cn('dropdown menu item', isHighlighted && 'active', disabled && 'disabled', color, className)\n\n const handleClick = (e: React.MouseEvent) => {\n if (disabled) {\n e.preventDefault()\n return\n }\n onClick?.()\n _onClick?.()\n }\n\n const Tag = component ?? (href || to ? 'a' : 'button')\n const linkProps = component ? {...(href ? {href} : {}), ...(to ? {to} : {})} : href ? {href} : to ? {href: to} : {}\n\n return (\n <Tag\n className={cls}\n role=\"menuitem\"\n tabIndex={-1}\n onClick={handleClick}\n onMouseEnter={_onHover}\n aria-disabled={disabled || undefined}\n {...linkProps}\n >\n {content}\n </Tag>\n )\n}\n;(MDropdownItem as any).__dropdownItem = true\n\nexport function MDropdownGroup({label, children}: MDropdownGroupProps) {\n return (\n <div className=\"dropdown menu group\" role=\"group\">\n <div className=\"dropdown menu group-label\">{label}</div>\n {children}\n </div>\n )\n}\n;(MDropdownGroup as any).__dropdownGroup = true\n\nexport function MDropdownDivider({className}: MDropdownDividerProps) {\n return <div className={cn('dropdown menu divider', className)} role=\"separator\" />\n}\n"],"mappings":"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"}
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
import { t as e } from "./cn-YER3QsV1.js";
|
|
2
|
-
import { t } from "./useKeyboardNav-iEXOdEMB.js";
|
|
3
|
-
import { t as n } from "./MPopover-C5aaGhma.js";
|
|
4
|
-
import { Children as r, cloneElement as i, isValidElement as a, useCallback as o, useRef as s, useState as c } from "react";
|
|
5
|
-
import { Fragment as l, jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
6
|
-
//#region src/components/overlays/MDropdownMenu/MDropdownMenu.tsx
|
|
7
|
-
function f(e) {
|
|
8
|
-
return e.props;
|
|
9
|
-
}
|
|
10
|
-
function p(e) {
|
|
11
|
-
return !!e.type.__dropdownItem;
|
|
12
|
-
}
|
|
13
|
-
function m(e) {
|
|
14
|
-
return !!e.type.__dropdownGroup;
|
|
15
|
-
}
|
|
16
|
-
function h(e) {
|
|
17
|
-
let t = [];
|
|
18
|
-
return r.forEach(e, (e) => {
|
|
19
|
-
a(e) && (p(e) ? t.push(e) : m(e) && r.forEach(f(e).children, (e) => {
|
|
20
|
-
a(e) && p(e) && t.push(e);
|
|
21
|
-
}));
|
|
22
|
-
}), t;
|
|
23
|
-
}
|
|
24
|
-
function g({ trigger: l, placement: g = "bottom-start", closeOnSelect: _ = !0, openOn: v = "click", onOpenChange: y, isolateClick: b = !1, className: x, style: S, popoverClassName: C, popoverStyle: w, children: T }) {
|
|
25
|
-
let [E, D] = c(!1), O = s(null), k = s(null), A = h(T), j = A.filter((e) => !f(e).disabled).length, M = o((e) => {
|
|
26
|
-
D((t) => {
|
|
27
|
-
let n = typeof e == "function" ? e(t) : e;
|
|
28
|
-
return y?.(n), n;
|
|
29
|
-
});
|
|
30
|
-
}, [y]), { activeIndex: N, setActiveIndex: P, onKeyDown: F } = t({
|
|
31
|
-
itemCount: j,
|
|
32
|
-
onSelect: o((e) => {
|
|
33
|
-
let t = 0;
|
|
34
|
-
for (let n of A) {
|
|
35
|
-
let r = f(n);
|
|
36
|
-
if (!r.disabled) {
|
|
37
|
-
if (t === e) {
|
|
38
|
-
r.onClick?.();
|
|
39
|
-
break;
|
|
40
|
-
}
|
|
41
|
-
t++;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
_ && M(!1);
|
|
45
|
-
}, [
|
|
46
|
-
A,
|
|
47
|
-
_,
|
|
48
|
-
M
|
|
49
|
-
]),
|
|
50
|
-
onClose: () => D(!1),
|
|
51
|
-
isOpen: E
|
|
52
|
-
}), I = (e) => {
|
|
53
|
-
b && (e.stopPropagation(), e.preventDefault()), M((e) => !e);
|
|
54
|
-
}, L = (e) => {
|
|
55
|
-
(e.key === "ArrowDown" || e.key === "Enter" || e.key === " ") && (e.preventDefault(), b && e.stopPropagation(), M(!0)), E && F(e);
|
|
56
|
-
}, R = 0, z = (e) => {
|
|
57
|
-
if (!a(e)) return e;
|
|
58
|
-
if (p(e)) {
|
|
59
|
-
let t = f(e).disabled, n = t ? -1 : R++;
|
|
60
|
-
return i(e, {
|
|
61
|
-
_active: n === N,
|
|
62
|
-
_onHover: t ? void 0 : () => P(n),
|
|
63
|
-
_onClick: () => {
|
|
64
|
-
t || _ && M(!1);
|
|
65
|
-
}
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
return m(e) ? i(e, { children: r.map(f(e).children, z) }) : e;
|
|
69
|
-
}, B = v === "hover" ? {
|
|
70
|
-
onMouseEnter: () => {
|
|
71
|
-
k.current && clearTimeout(k.current), M(!0);
|
|
72
|
-
},
|
|
73
|
-
onMouseLeave: () => {
|
|
74
|
-
k.current = setTimeout(() => M(!1), 150);
|
|
75
|
-
}
|
|
76
|
-
} : {}, V = b ? (e) => {
|
|
77
|
-
e.stopPropagation(), e.preventDefault();
|
|
78
|
-
} : void 0;
|
|
79
|
-
return /* @__PURE__ */ d("div", {
|
|
80
|
-
className: e("dropdown menu anchor", x),
|
|
81
|
-
style: S,
|
|
82
|
-
onClick: V,
|
|
83
|
-
...B,
|
|
84
|
-
children: [/* @__PURE__ */ u("div", {
|
|
85
|
-
ref: O,
|
|
86
|
-
onClick: v === "click" ? I : void 0,
|
|
87
|
-
onKeyDown: L,
|
|
88
|
-
role: "button",
|
|
89
|
-
tabIndex: 0,
|
|
90
|
-
className: "dropdown menu trigger",
|
|
91
|
-
children: l
|
|
92
|
-
}), /* @__PURE__ */ u(n, {
|
|
93
|
-
open: E,
|
|
94
|
-
anchorRef: O,
|
|
95
|
-
onClose: () => M(!1),
|
|
96
|
-
placement: g,
|
|
97
|
-
className: e("dropdown menu popover", C),
|
|
98
|
-
style: w,
|
|
99
|
-
children: /* @__PURE__ */ u("div", {
|
|
100
|
-
className: "dropdown menu list",
|
|
101
|
-
role: "menu",
|
|
102
|
-
...B,
|
|
103
|
-
children: r.map(T, z)
|
|
104
|
-
})
|
|
105
|
-
})]
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
function _({ icon: t, label: n, href: r, to: i, onClick: a, color: o, disabled: s = !1, active: c = !1, component: f, className: p, _active: m, _onHover: h, _onClick: g }) {
|
|
109
|
-
let _ = m ?? c, v = /* @__PURE__ */ d(l, { children: [t && /* @__PURE__ */ u("span", {
|
|
110
|
-
className: "dropdown menu icon",
|
|
111
|
-
children: t
|
|
112
|
-
}), /* @__PURE__ */ u("span", {
|
|
113
|
-
className: "dropdown menu label",
|
|
114
|
-
children: n
|
|
115
|
-
})] }), y = e("dropdown menu item", _ && "active", s && "disabled", o, p), b = (e) => {
|
|
116
|
-
if (s) {
|
|
117
|
-
e.preventDefault();
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
120
|
-
a?.(), g?.();
|
|
121
|
-
}, x = f ?? (r || i ? "a" : "button"), S = f ? {
|
|
122
|
-
...r ? { href: r } : {},
|
|
123
|
-
...i ? { to: i } : {}
|
|
124
|
-
} : r ? { href: r } : i ? { href: i } : {};
|
|
125
|
-
return /* @__PURE__ */ u(x, {
|
|
126
|
-
className: y,
|
|
127
|
-
role: "menuitem",
|
|
128
|
-
tabIndex: -1,
|
|
129
|
-
onClick: b,
|
|
130
|
-
onMouseEnter: h,
|
|
131
|
-
"aria-disabled": s || void 0,
|
|
132
|
-
...S,
|
|
133
|
-
children: v
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
_.__dropdownItem = !0;
|
|
137
|
-
function v({ label: e, children: t }) {
|
|
138
|
-
return /* @__PURE__ */ d("div", {
|
|
139
|
-
className: "dropdown menu group",
|
|
140
|
-
role: "group",
|
|
141
|
-
children: [/* @__PURE__ */ u("div", {
|
|
142
|
-
className: "dropdown menu group-label",
|
|
143
|
-
children: e
|
|
144
|
-
}), t]
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
v.__dropdownGroup = !0;
|
|
148
|
-
function y({ className: t }) {
|
|
149
|
-
return /* @__PURE__ */ u("div", {
|
|
150
|
-
className: e("dropdown menu divider", t),
|
|
151
|
-
role: "separator"
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
//#endregion
|
|
155
|
-
export { g as i, v as n, _ as r, y as t };
|
|
156
|
-
|
|
157
|
-
//# sourceMappingURL=MDropdownMenu-CFoKJ7V6.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MDropdownMenu-CFoKJ7V6.js","names":[],"sources":["../src/components/overlays/MDropdownMenu/MDropdownMenu.tsx"],"sourcesContent":["import {useState, useRef, useCallback, Children, isValidElement, cloneElement} from 'react'\nimport type * as React from 'react'\nimport {MPopover} from '../../primitives'\nimport {useKeyboardNav} from '../../../utils/useKeyboardNav'\nimport {cn} from '../../../utils/cn'\nimport type {\n MDropdownMenuProps,\n MDropdownItemProps,\n MDropdownGroupProps,\n MDropdownDividerProps,\n} from './MDropdownMenu.types'\nimport './MDropdownMenu.css'\n\ntype AnyProps = Record<string, any>\n\nfunction getProps(el: React.ReactElement): AnyProps {\n return el.props as AnyProps\n}\n\nfunction isItem(child: React.ReactElement): boolean {\n return !!(child.type as any).__dropdownItem\n}\n\nfunction isGroup(child: React.ReactElement): boolean {\n return !!(child.type as any).__dropdownGroup\n}\n\n// Collect all MDropdownItem elements from children (including inside groups).\nfunction collectItems(children: React.ReactNode): React.ReactElement[] {\n const items: React.ReactElement[] = []\n Children.forEach(children, (child) => {\n if (!isValidElement(child)) return\n if (isItem(child)) {\n items.push(child)\n } else if (isGroup(child)) {\n Children.forEach(getProps(child).children, (gc: React.ReactNode) => {\n if (isValidElement(gc) && isItem(gc)) {\n items.push(gc)\n }\n })\n }\n })\n return items\n}\n\nexport function MDropdownMenu({\n trigger,\n placement = 'bottom-start',\n closeOnSelect = true,\n openOn = 'click',\n onOpenChange,\n isolateClick = false,\n className,\n style,\n popoverClassName,\n popoverStyle,\n children,\n}: MDropdownMenuProps) {\n const [open, setOpen] = useState(false)\n const anchorRef = useRef<HTMLDivElement>(null)\n const hoverTimeout = useRef<ReturnType<typeof setTimeout>>(null)\n\n const items = collectItems(children)\n const enabledCount = items.filter((i) => !getProps(i).disabled).length\n\n const setMenuOpen = useCallback(\n (next: boolean | ((prev: boolean) => boolean)) => {\n setOpen((prev) => {\n const resolved = typeof next === 'function' ? next(prev) : next\n onOpenChange?.(resolved)\n return resolved\n })\n },\n [onOpenChange]\n )\n\n const handleSelect = useCallback(\n (index: number) => {\n let enabledIdx = 0\n for (const item of items) {\n const p = getProps(item)\n if (p.disabled) continue\n if (enabledIdx === index) {\n p.onClick?.()\n break\n }\n enabledIdx++\n }\n if (closeOnSelect) setMenuOpen(false)\n },\n [items, closeOnSelect, setMenuOpen]\n )\n\n const {activeIndex, setActiveIndex, onKeyDown} = useKeyboardNav({\n itemCount: enabledCount,\n onSelect: handleSelect,\n onClose: () => setOpen(false),\n isOpen: open,\n })\n\n const handleTriggerClick = (e: React.MouseEvent) => {\n if (isolateClick) {\n e.stopPropagation()\n e.preventDefault()\n }\n setMenuOpen((o) => !o)\n }\n\n const handleTriggerKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n if (isolateClick) e.stopPropagation()\n setMenuOpen(true)\n }\n if (open) onKeyDown(e as any)\n }\n\n // Map active index back to flat child rendering with enabled-only tracking.\n let enabledIdx = 0\n const renderChild = (child: React.ReactNode): React.ReactNode => {\n if (!isValidElement(child)) return child\n\n if (isItem(child)) {\n const p = getProps(child)\n const isDisabled = p.disabled\n const idx = isDisabled ? -1 : enabledIdx++\n return cloneElement(child, {\n _active: idx === activeIndex,\n _onHover: isDisabled ? undefined : () => setActiveIndex(idx),\n _onClick: () => {\n if (isDisabled) return\n if (closeOnSelect) setMenuOpen(false)\n },\n } as AnyProps)\n }\n\n if (isGroup(child)) {\n return cloneElement(child, {\n children: Children.map(getProps(child).children, renderChild),\n } as AnyProps)\n }\n\n return child\n }\n\n const hoverHandlers =\n openOn === 'hover'\n ? {\n onMouseEnter: () => {\n if (hoverTimeout.current) clearTimeout(hoverTimeout.current)\n setMenuOpen(true)\n },\n onMouseLeave: () => {\n hoverTimeout.current = setTimeout(() => setMenuOpen(false), 150)\n },\n }\n : {}\n\n /**\n * When `isolateClick` is set, every click bubbling out of the menu\n * (trigger AND items) must be stopped — otherwise selecting an action\n * also fires the click handler on a clickable parent (Link, MCard with\n * onClick, MDataTable row link). Trigger click itself is handled by\n * `handleTriggerClick`; this wrapper catches the bubbled item clicks\n * before they leave the anchor. `preventDefault` is needed too — when the\n * dropdown is rendered inside an `<a href>` (MCard component={Link}),\n * stopping propagation alone does not block native link navigation.\n *\n * Caveat: MDropdownItem with `href` will not navigate while inside an\n * `isolateClick` menu — use programmatic navigation (onClick + navigate)\n * in those contexts instead.\n */\n const isolateAnchorClick = isolateClick\n ? (e: React.MouseEvent) => {\n e.stopPropagation()\n e.preventDefault()\n }\n : undefined\n\n return (\n <div\n className={cn('dropdown menu anchor', className)}\n style={style}\n onClick={isolateAnchorClick}\n {...hoverHandlers}\n >\n <div\n ref={anchorRef}\n onClick={openOn === 'click' ? handleTriggerClick : undefined}\n onKeyDown={handleTriggerKeyDown}\n role=\"button\"\n tabIndex={0}\n className=\"dropdown menu trigger\"\n >\n {trigger}\n </div>\n <MPopover\n open={open}\n anchorRef={anchorRef}\n onClose={() => setMenuOpen(false)}\n placement={placement}\n className={cn('dropdown menu popover', popoverClassName)}\n style={popoverStyle}\n >\n <div className=\"dropdown menu list\" role=\"menu\" {...hoverHandlers}>\n {Children.map(children, renderChild)}\n </div>\n </MPopover>\n </div>\n )\n}\n\nexport function MDropdownItem({\n icon,\n label,\n href,\n to,\n onClick,\n color,\n disabled = false,\n active = false,\n component,\n className,\n _active,\n _onHover,\n _onClick,\n}: MDropdownItemProps & {_active?: boolean; _onHover?: () => void; _onClick?: () => void}) {\n const isHighlighted = _active ?? active\n\n const content = (\n <>\n {icon && <span className=\"dropdown menu icon\">{icon}</span>}\n <span className=\"dropdown menu label\">{label}</span>\n </>\n )\n\n const cls = cn('dropdown menu item', isHighlighted && 'active', disabled && 'disabled', color, className)\n\n const handleClick = (e: React.MouseEvent) => {\n if (disabled) {\n e.preventDefault()\n return\n }\n onClick?.()\n _onClick?.()\n }\n\n const Tag = component ?? (href || to ? 'a' : 'button')\n const linkProps = component ? {...(href ? {href} : {}), ...(to ? {to} : {})} : href ? {href} : to ? {href: to} : {}\n\n return (\n <Tag\n className={cls}\n role=\"menuitem\"\n tabIndex={-1}\n onClick={handleClick}\n onMouseEnter={_onHover}\n aria-disabled={disabled || undefined}\n {...linkProps}\n >\n {content}\n </Tag>\n )\n}\n;(MDropdownItem as any).__dropdownItem = true\n\nexport function MDropdownGroup({label, children}: MDropdownGroupProps) {\n return (\n <div className=\"dropdown menu group\" role=\"group\">\n <div className=\"dropdown menu group-label\">{label}</div>\n {children}\n </div>\n )\n}\n;(MDropdownGroup as any).__dropdownGroup = true\n\nexport function MDropdownDivider({className}: MDropdownDividerProps) {\n return <div className={cn('dropdown menu divider', className)} role=\"separator\" />\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MPopover-C5aaGhma.js","names":[],"sources":["../src/components/primitives/MPopover/popoverStack.ts","../src/components/primitives/MPopover/MPopover.tsx"],"sourcesContent":["/**\n * Registry of currently-open MPopover instances.\n *\n * Every popover portals its content to `document.body`, so a popover opened\n * from inside another popover is NOT a DOM descendant of its parent. That\n * breaks the naive outside-click test (`parent.contains(target)`): pressing a\n * nested dropdown item looks like an outside click to the parent, the parent\n * closes, React unmounts the nested menu mid-gesture, and the browser never\n * gets to fire `click` because mousedown and mouseup landed on different\n * elements. The action silently does nothing.\n *\n * This registry restores the nesting relation the DOM lost. Nesting is derived\n * from where each popover's ANCHOR lives, not from open order: a popover whose\n * anchor sits inside another popover's element is that popover's child. Open\n * order would misclassify two independent popovers that happen to be open at\n * the same time — clicking the newer one must still close the older one.\n */\n\nexport interface PopoverRegistration {\n id: number\n getPopoverEl: () => HTMLElement | null\n getAnchorEl: () => HTMLElement | null\n}\n\nconst registrations: PopoverRegistration[] = []\nlet nextId = 1\n\nexport function nextPopoverId(): number {\n return nextId++\n}\n\nexport function registerPopover(registration: PopoverRegistration): () => void {\n registrations.push(registration)\n return () => {\n const index = registrations.indexOf(registration)\n if (index !== -1) registrations.splice(index, 1)\n }\n}\n\n/** The registered popover whose element contains `entry`'s anchor, if any. */\nfunction parentIdOf(entry: PopoverRegistration): number | null {\n const anchor = entry.getAnchorEl()\n if (!anchor) return null\n\n for (const other of registrations) {\n if (other.id === entry.id) continue\n const element = other.getPopoverEl()\n if (element && element.contains(anchor)) return other.id\n }\n\n return null\n}\n\n/**\n * True when `target` lies inside a popover that is nested (at any depth) within\n * the popover identified by `id`. Callers use it to keep a parent open while\n * the interaction belongs to one of its descendants.\n */\nexport function isInsideDescendantPopover(id: number, target: Node | null): boolean {\n if (!target) return false\n\n for (const entry of registrations) {\n if (entry.id === id) continue\n\n const element = entry.getPopoverEl()\n if (!element || !element.contains(target)) continue\n\n // Walk the ancestor chain of the popover that was actually hit.\n // `seen` guards against a cycle if a malformed tree ever produces one.\n const seen = new Set<number>()\n let cursor = parentIdOf(entry)\n\n while (cursor !== null && !seen.has(cursor)) {\n if (cursor === id) return true\n seen.add(cursor)\n const parent = registrations.find((candidate) => candidate.id === cursor)\n cursor = parent ? parentIdOf(parent) : null\n }\n }\n\n return false\n}\n\n/** Test-only helper — the registry is module state that outlives a render. */\nexport function __resetPopoverStack(): void {\n registrations.length = 0\n nextId = 1\n}\n","import {useState, useEffect, useRef, useCallback} from 'react'\nimport {MPortal} from '../MPortal'\nimport {cn} from '../../../utils/cn'\nimport {isInsideDescendantPopover, nextPopoverId, registerPopover} from './popoverStack'\nimport type {MPopoverProps} from './MPopover.types'\nimport './MPopover.css'\n\n// Position floating content relative to an anchor with viewport-aware flipping.\nexport function MPopover({\n open,\n anchorRef,\n onClose,\n placement = 'bottom-start',\n matchWidth = false,\n offset = 4,\n zIndex,\n children,\n className,\n style,\n}: MPopoverProps) {\n const popoverRef = useRef<HTMLDivElement>(null)\n const popoverIdRef = useRef<number>(null)\n if (popoverIdRef.current === null) popoverIdRef.current = nextPopoverId()\n const popoverId = popoverIdRef.current\n const [position, setPosition] = useState<{top: number; left: number; width?: number} | null>(null)\n const [flipped, setFlipped] = useState(false)\n const [layerZ, setLayerZ] = useState<number | string | null>(null)\n\n // Lift popovers above drawers, modals and mobile sidebars when the anchor sits inside them.\n const updateLayer = useCallback(() => {\n if (zIndex !== undefined) {\n setLayerZ(zIndex)\n return\n }\n\n const anchor = anchorRef.current\n if (!anchor || typeof window === 'undefined') {\n setLayerZ(null)\n return\n }\n\n const layerHost = anchor.closest(\n '.drawer-backdrop, .modal-backdrop, .sheet-backdrop, .sidebar.mobile-open, .popover'\n )\n if (!layerHost) {\n setLayerZ(null)\n return\n }\n\n const computedZ = window.getComputedStyle(layerHost).zIndex\n const parsedZ = Number.parseInt(computedZ, 10)\n setLayerZ(Number.isFinite(parsedZ) ? parsedZ + 1 : null)\n }, [anchorRef, zIndex])\n\n // Recalculate popover position whenever layout or viewport constraints change.\n const updatePosition = useCallback(() => {\n if (!anchorRef.current || !popoverRef.current) return\n\n const anchor = anchorRef.current.getBoundingClientRect()\n const popover = popoverRef.current.getBoundingClientRect()\n const viewport = {\n width: window.innerWidth,\n height: window.innerHeight,\n }\n\n const isTop = placement.startsWith('top')\n const isRight = placement.startsWith('right')\n const isLeft = placement.startsWith('left')\n const isHorizontal = isRight || isLeft\n const isEnd = placement.endsWith('end')\n\n let top: number\n let left: number\n\n if (isHorizontal) {\n // Horizontal placement: position to the right or left of the anchor\n const spaceRight = viewport.width - anchor.right - offset\n const spaceLeft = anchor.left - offset\n const shouldFlip = isRight\n ? spaceRight < popover.width && spaceLeft > spaceRight\n : spaceLeft < popover.width && spaceRight > spaceLeft\n\n setFlipped(shouldFlip)\n\n const showOnRight = isRight ? !shouldFlip : shouldFlip\n\n if (showOnRight) {\n left = anchor.right + offset + window.scrollX\n } else {\n left = anchor.left - popover.width - offset + window.scrollX\n }\n\n if (isEnd) {\n top = anchor.bottom - popover.height + window.scrollY\n } else {\n top = anchor.top + window.scrollY\n }\n } else {\n // Vertical placement: position above or below the anchor\n const spaceBelow = viewport.height - anchor.bottom - offset\n const spaceAbove = anchor.top - offset\n const shouldFlip = isTop\n ? spaceAbove < popover.height && spaceBelow > spaceAbove\n : spaceBelow < popover.height && spaceAbove > spaceBelow\n\n setFlipped(shouldFlip)\n\n const showOnTop = isTop ? !shouldFlip : shouldFlip\n\n if (showOnTop) {\n top = anchor.top - popover.height - offset + window.scrollY\n } else {\n top = anchor.bottom + offset + window.scrollY\n }\n\n if (isEnd) {\n left = anchor.right - popover.width + window.scrollX\n } else {\n left = anchor.left + window.scrollX\n }\n }\n\n // Clamp to viewport\n left = Math.max(8, Math.min(left, viewport.width - popover.width - 8))\n top = Math.max(8 + window.scrollY, top)\n\n setPosition({\n top,\n left,\n width: matchWidth ? anchor.width : undefined,\n })\n }, [anchorRef, placement, offset, matchWidth])\n\n useEffect(() => {\n if (!open) {\n setPosition(null)\n setLayerZ(null)\n return\n }\n\n updateLayer()\n // Wait one frame so the rendered popover can be measured accurately.\n requestAnimationFrame(updatePosition)\n\n // `scroll` does not bubble, so a window listener only ever sees the\n // document scrolling. Anchors living inside a scrollable ancestor — an\n // app shell with a scrolling main region, MStickyPanel, an overflowing\n // card — would leave the popover stranded at its opening coordinates\n // while the anchor moved away underneath it. Scroll events do capture,\n // so a capture-phase listener on the document catches scrolling from\n // ANY container, including the document itself.\n document.addEventListener('scroll', updatePosition, {capture: true, passive: true})\n window.addEventListener('resize', updatePosition, {passive: true})\n return () => {\n document.removeEventListener('scroll', updatePosition, {capture: true})\n window.removeEventListener('resize', updatePosition)\n }\n }, [open, updateLayer, updatePosition])\n\n // Close the popover with the standard Escape key interaction.\n useEffect(() => {\n if (!open) return\n const handleKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n }\n document.addEventListener('keydown', handleKey)\n return () => document.removeEventListener('keydown', handleKey)\n }, [open, onClose])\n\n // Publish this instance while it is open so nested popovers can be related\n // back to it — see popoverStack.ts for why the DOM alone cannot answer this.\n useEffect(() => {\n if (!open) return\n return registerPopover({\n id: popoverId,\n getPopoverEl: () => popoverRef.current,\n getAnchorEl: () => anchorRef.current,\n })\n }, [open, popoverId, anchorRef])\n\n // Close when the user interacts outside both the popover and its anchor.\n useEffect(() => {\n if (!open) return\n const handleClick = (e: MouseEvent) => {\n const target = e.target as Node\n\n if (popoverRef.current?.contains(target) || anchorRef.current?.contains(target)) {\n return\n }\n\n // A popover nested inside this one is portaled to `document.body`,\n // so it fails the `contains` checks above even though the click\n // belongs to this popover's own subtree. Closing here would unmount\n // that child between mousedown and mouseup and swallow its click.\n if (isInsideDescendantPopover(popoverId, target)) {\n return\n }\n\n onClose()\n }\n document.addEventListener('mousedown', handleClick)\n return () => document.removeEventListener('mousedown', handleClick)\n }, [open, onClose, anchorRef, popoverId])\n\n if (!open) return null\n\n return (\n <MPortal>\n <div\n ref={popoverRef}\n className={cn('popover', flipped ? 'flipped' : 'normal', className)}\n style={{\n position: 'absolute',\n top: position?.top ?? 0,\n left: position?.left ?? 0,\n width: position?.width,\n zIndex: layerZ ?? undefined,\n visibility: position ? 'visible' : 'hidden',\n ...style,\n }}\n role=\"listbox\"\n >\n {children}\n </div>\n </MPortal>\n )\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require(`./cn-CU5TNITO.cjs`),t=require(`./MPortal-BciZHNDC.cjs`);require(`./core-DBpQf3uY.cjs`);let n=require(`react`),r=require(`react/jsx-runtime`);var i=[],a=1;function o(){return a++}function s(e){return i.push(e),()=>{let t=i.indexOf(e);t!==-1&&i.splice(t,1)}}function c(e){let t=e.getAnchorEl();if(!t)return null;for(let n of i){if(n.id===e.id)continue;let r=n.getPopoverEl();if(r&&r.contains(t))return n.id}return null}function l(e,t){if(!t)return!1;for(let n of i){if(n.id===e)continue;let r=n.getPopoverEl();if(!r||!r.contains(t))continue;let a=new Set,o=c(n);for(;o!==null&&!a.has(o);){if(o===e)return!0;a.add(o);let t=i.find(e=>e.id===o);o=t?c(t):null}}return!1}function u({open:i,anchorRef:a,onClose:c,placement:u=`bottom-start`,matchWidth:d=!1,offset:f=4,zIndex:p,children:m,className:h,style:g}){let _=(0,n.useRef)(null),v=(0,n.useRef)(null);v.current===null&&(v.current=o());let y=v.current,[b,x]=(0,n.useState)(null),[S,C]=(0,n.useState)(!1),[w,T]=(0,n.useState)(null),E=(0,n.useCallback)(()=>{if(p!==void 0){T(p);return}let e=a.current;if(!e||typeof window>`u`){T(null);return}let t=e.closest(`.drawer-backdrop, .modal-backdrop, .sheet-backdrop, .sidebar.mobile-open, .popover`);if(!t){T(null);return}let n=window.getComputedStyle(t).zIndex,r=Number.parseInt(n,10);T(Number.isFinite(r)?r+1:null)},[a,p]),D=(0,n.useCallback)(()=>{if(!a.current||!_.current)return;let e=a.current.getBoundingClientRect(),t=_.current.getBoundingClientRect(),n={width:window.innerWidth,height:window.innerHeight},r=u.startsWith(`top`),i=u.startsWith(`right`),o=u.startsWith(`left`),s=i||o,c=u.endsWith(`end`),l,p;if(s){let r=n.width-e.right-f,a=e.left-f,o=i?r<t.width&&a>r:a<t.width&&r>a;C(o),p=(i?!o:o)?e.right+f+window.scrollX:e.left-t.width-f+window.scrollX,l=c?e.bottom-t.height+window.scrollY:e.top+window.scrollY}else{let i=n.height-e.bottom-f,a=e.top-f,o=r?a<t.height&&i>a:i<t.height&&a>i;C(o),l=(r?!o:o)?e.top-t.height-f+window.scrollY:e.bottom+f+window.scrollY,p=c?e.right-t.width+window.scrollX:e.left+window.scrollX}p=Math.max(8,Math.min(p,n.width-t.width-8)),l=Math.max(8+window.scrollY,l),x({top:l,left:p,width:d?e.width:void 0})},[a,u,f,d]);return(0,n.useEffect)(()=>{if(!i){x(null),T(null);return}return E(),requestAnimationFrame(D),document.addEventListener(`scroll`,D,{capture:!0,passive:!0}),window.addEventListener(`resize`,D,{passive:!0}),()=>{document.removeEventListener(`scroll`,D,{capture:!0}),window.removeEventListener(`resize`,D)}},[i,E,D]),(0,n.useEffect)(()=>{if(!i)return;let e=e=>{e.key===`Escape`&&c()};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[i,c]),(0,n.useEffect)(()=>{if(i)return s({id:y,getPopoverEl:()=>_.current,getAnchorEl:()=>a.current})},[i,y,a]),(0,n.useEffect)(()=>{if(!i)return;let e=e=>{let t=e.target;_.current?.contains(t)||a.current?.contains(t)||l(y,t)||c()};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[i,c,a,y]),i?(0,r.jsx)(t.t,{children:(0,r.jsx)(`div`,{ref:_,className:e.t(`popover`,S?`flipped`:`normal`,h),style:{position:`absolute`,top:b?.top??0,left:b?.left??0,width:b?.width,zIndex:w??void 0,visibility:b?`visible`:`hidden`,...g},role:`listbox`,children:m})}):null}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return u}});
|
|
2
|
-
//# sourceMappingURL=MPopover-CV-9MArH.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MPopover-CV-9MArH.cjs","names":[],"sources":["../src/components/primitives/MPopover/popoverStack.ts","../src/components/primitives/MPopover/MPopover.tsx"],"sourcesContent":["/**\n * Registry of currently-open MPopover instances.\n *\n * Every popover portals its content to `document.body`, so a popover opened\n * from inside another popover is NOT a DOM descendant of its parent. That\n * breaks the naive outside-click test (`parent.contains(target)`): pressing a\n * nested dropdown item looks like an outside click to the parent, the parent\n * closes, React unmounts the nested menu mid-gesture, and the browser never\n * gets to fire `click` because mousedown and mouseup landed on different\n * elements. The action silently does nothing.\n *\n * This registry restores the nesting relation the DOM lost. Nesting is derived\n * from where each popover's ANCHOR lives, not from open order: a popover whose\n * anchor sits inside another popover's element is that popover's child. Open\n * order would misclassify two independent popovers that happen to be open at\n * the same time — clicking the newer one must still close the older one.\n */\n\nexport interface PopoverRegistration {\n id: number\n getPopoverEl: () => HTMLElement | null\n getAnchorEl: () => HTMLElement | null\n}\n\nconst registrations: PopoverRegistration[] = []\nlet nextId = 1\n\nexport function nextPopoverId(): number {\n return nextId++\n}\n\nexport function registerPopover(registration: PopoverRegistration): () => void {\n registrations.push(registration)\n return () => {\n const index = registrations.indexOf(registration)\n if (index !== -1) registrations.splice(index, 1)\n }\n}\n\n/** The registered popover whose element contains `entry`'s anchor, if any. */\nfunction parentIdOf(entry: PopoverRegistration): number | null {\n const anchor = entry.getAnchorEl()\n if (!anchor) return null\n\n for (const other of registrations) {\n if (other.id === entry.id) continue\n const element = other.getPopoverEl()\n if (element && element.contains(anchor)) return other.id\n }\n\n return null\n}\n\n/**\n * True when `target` lies inside a popover that is nested (at any depth) within\n * the popover identified by `id`. Callers use it to keep a parent open while\n * the interaction belongs to one of its descendants.\n */\nexport function isInsideDescendantPopover(id: number, target: Node | null): boolean {\n if (!target) return false\n\n for (const entry of registrations) {\n if (entry.id === id) continue\n\n const element = entry.getPopoverEl()\n if (!element || !element.contains(target)) continue\n\n // Walk the ancestor chain of the popover that was actually hit.\n // `seen` guards against a cycle if a malformed tree ever produces one.\n const seen = new Set<number>()\n let cursor = parentIdOf(entry)\n\n while (cursor !== null && !seen.has(cursor)) {\n if (cursor === id) return true\n seen.add(cursor)\n const parent = registrations.find((candidate) => candidate.id === cursor)\n cursor = parent ? parentIdOf(parent) : null\n }\n }\n\n return false\n}\n\n/** Test-only helper — the registry is module state that outlives a render. */\nexport function __resetPopoverStack(): void {\n registrations.length = 0\n nextId = 1\n}\n","import {useState, useEffect, useRef, useCallback} from 'react'\nimport {MPortal} from '../MPortal'\nimport {cn} from '../../../utils/cn'\nimport {isInsideDescendantPopover, nextPopoverId, registerPopover} from './popoverStack'\nimport type {MPopoverProps} from './MPopover.types'\nimport './MPopover.css'\n\n// Position floating content relative to an anchor with viewport-aware flipping.\nexport function MPopover({\n open,\n anchorRef,\n onClose,\n placement = 'bottom-start',\n matchWidth = false,\n offset = 4,\n zIndex,\n children,\n className,\n style,\n}: MPopoverProps) {\n const popoverRef = useRef<HTMLDivElement>(null)\n const popoverIdRef = useRef<number>(null)\n if (popoverIdRef.current === null) popoverIdRef.current = nextPopoverId()\n const popoverId = popoverIdRef.current\n const [position, setPosition] = useState<{top: number; left: number; width?: number} | null>(null)\n const [flipped, setFlipped] = useState(false)\n const [layerZ, setLayerZ] = useState<number | string | null>(null)\n\n // Lift popovers above drawers, modals and mobile sidebars when the anchor sits inside them.\n const updateLayer = useCallback(() => {\n if (zIndex !== undefined) {\n setLayerZ(zIndex)\n return\n }\n\n const anchor = anchorRef.current\n if (!anchor || typeof window === 'undefined') {\n setLayerZ(null)\n return\n }\n\n const layerHost = anchor.closest(\n '.drawer-backdrop, .modal-backdrop, .sheet-backdrop, .sidebar.mobile-open, .popover'\n )\n if (!layerHost) {\n setLayerZ(null)\n return\n }\n\n const computedZ = window.getComputedStyle(layerHost).zIndex\n const parsedZ = Number.parseInt(computedZ, 10)\n setLayerZ(Number.isFinite(parsedZ) ? parsedZ + 1 : null)\n }, [anchorRef, zIndex])\n\n // Recalculate popover position whenever layout or viewport constraints change.\n const updatePosition = useCallback(() => {\n if (!anchorRef.current || !popoverRef.current) return\n\n const anchor = anchorRef.current.getBoundingClientRect()\n const popover = popoverRef.current.getBoundingClientRect()\n const viewport = {\n width: window.innerWidth,\n height: window.innerHeight,\n }\n\n const isTop = placement.startsWith('top')\n const isRight = placement.startsWith('right')\n const isLeft = placement.startsWith('left')\n const isHorizontal = isRight || isLeft\n const isEnd = placement.endsWith('end')\n\n let top: number\n let left: number\n\n if (isHorizontal) {\n // Horizontal placement: position to the right or left of the anchor\n const spaceRight = viewport.width - anchor.right - offset\n const spaceLeft = anchor.left - offset\n const shouldFlip = isRight\n ? spaceRight < popover.width && spaceLeft > spaceRight\n : spaceLeft < popover.width && spaceRight > spaceLeft\n\n setFlipped(shouldFlip)\n\n const showOnRight = isRight ? !shouldFlip : shouldFlip\n\n if (showOnRight) {\n left = anchor.right + offset + window.scrollX\n } else {\n left = anchor.left - popover.width - offset + window.scrollX\n }\n\n if (isEnd) {\n top = anchor.bottom - popover.height + window.scrollY\n } else {\n top = anchor.top + window.scrollY\n }\n } else {\n // Vertical placement: position above or below the anchor\n const spaceBelow = viewport.height - anchor.bottom - offset\n const spaceAbove = anchor.top - offset\n const shouldFlip = isTop\n ? spaceAbove < popover.height && spaceBelow > spaceAbove\n : spaceBelow < popover.height && spaceAbove > spaceBelow\n\n setFlipped(shouldFlip)\n\n const showOnTop = isTop ? !shouldFlip : shouldFlip\n\n if (showOnTop) {\n top = anchor.top - popover.height - offset + window.scrollY\n } else {\n top = anchor.bottom + offset + window.scrollY\n }\n\n if (isEnd) {\n left = anchor.right - popover.width + window.scrollX\n } else {\n left = anchor.left + window.scrollX\n }\n }\n\n // Clamp to viewport\n left = Math.max(8, Math.min(left, viewport.width - popover.width - 8))\n top = Math.max(8 + window.scrollY, top)\n\n setPosition({\n top,\n left,\n width: matchWidth ? anchor.width : undefined,\n })\n }, [anchorRef, placement, offset, matchWidth])\n\n useEffect(() => {\n if (!open) {\n setPosition(null)\n setLayerZ(null)\n return\n }\n\n updateLayer()\n // Wait one frame so the rendered popover can be measured accurately.\n requestAnimationFrame(updatePosition)\n\n // `scroll` does not bubble, so a window listener only ever sees the\n // document scrolling. Anchors living inside a scrollable ancestor — an\n // app shell with a scrolling main region, MStickyPanel, an overflowing\n // card — would leave the popover stranded at its opening coordinates\n // while the anchor moved away underneath it. Scroll events do capture,\n // so a capture-phase listener on the document catches scrolling from\n // ANY container, including the document itself.\n document.addEventListener('scroll', updatePosition, {capture: true, passive: true})\n window.addEventListener('resize', updatePosition, {passive: true})\n return () => {\n document.removeEventListener('scroll', updatePosition, {capture: true})\n window.removeEventListener('resize', updatePosition)\n }\n }, [open, updateLayer, updatePosition])\n\n // Close the popover with the standard Escape key interaction.\n useEffect(() => {\n if (!open) return\n const handleKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n }\n document.addEventListener('keydown', handleKey)\n return () => document.removeEventListener('keydown', handleKey)\n }, [open, onClose])\n\n // Publish this instance while it is open so nested popovers can be related\n // back to it — see popoverStack.ts for why the DOM alone cannot answer this.\n useEffect(() => {\n if (!open) return\n return registerPopover({\n id: popoverId,\n getPopoverEl: () => popoverRef.current,\n getAnchorEl: () => anchorRef.current,\n })\n }, [open, popoverId, anchorRef])\n\n // Close when the user interacts outside both the popover and its anchor.\n useEffect(() => {\n if (!open) return\n const handleClick = (e: MouseEvent) => {\n const target = e.target as Node\n\n if (popoverRef.current?.contains(target) || anchorRef.current?.contains(target)) {\n return\n }\n\n // A popover nested inside this one is portaled to `document.body`,\n // so it fails the `contains` checks above even though the click\n // belongs to this popover's own subtree. Closing here would unmount\n // that child between mousedown and mouseup and swallow its click.\n if (isInsideDescendantPopover(popoverId, target)) {\n return\n }\n\n onClose()\n }\n document.addEventListener('mousedown', handleClick)\n return () => document.removeEventListener('mousedown', handleClick)\n }, [open, onClose, anchorRef, popoverId])\n\n if (!open) return null\n\n return (\n <MPortal>\n <div\n ref={popoverRef}\n className={cn('popover', flipped ? 'flipped' : 'normal', className)}\n style={{\n position: 'absolute',\n top: position?.top ?? 0,\n left: position?.left ?? 0,\n width: position?.width,\n zIndex: layerZ ?? undefined,\n visibility: position ? 'visible' : 'hidden',\n ...style,\n }}\n role=\"listbox\"\n >\n {children}\n </div>\n </MPortal>\n )\n}\n"],"mappings":"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"}
|
package/dist/data-BZ92hzXx.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require(`./icons-D675Im0B.cjs`),t=require(`./cn-CU5TNITO.cjs`),n=require(`./MPopover-CV-9MArH.cjs`),r=require(`./MText-j6Zbbj5Y.cjs`),i=require(`./MHeading-BLnb3dNv.cjs`),a=require(`./MSubText-VHsgFsv2.cjs`),o=require(`./MButton-R08y1HCT.cjs`),s=require(`./MCheckbox-CM5HJQWW.cjs`),c=require(`./MLoader-XcpKlLrd.cjs`),l=require(`./MStack-BP_BUeCc.cjs`),u=require(`./MInputSearch-9wcXlY8-.cjs`),d=require(`./MTooltip-BEfO9jTe.cjs`),f=require(`./MPagination-C6QQdEj_.cjs`);require(`./core-DBpQf3uY.cjs`);let p=require(`react`),m=require(`react/jsx-runtime`);function h(e,t,n){return typeof n==`function`?n(e,t):String(typeof n==`string`?e[n]:e.id??t)}function g(e,t){let n=t.split(`.`),r=e;for(let e of n){if(typeof r!=`object`||!r)return;r=r[e]}return r}function _({columns:r,data:i,rowKey:a,sortable:l=!1,filterable:d=!1,selectable:_=!1,pagination:v=!1,pageSize:y=10,striped:b=!1,compact:x=!1,stickyHeader:S=!1,loading:C=!1,loadingLabel:w=`Loading`,scrollOffset:T,sort:E,onSortChange:D,search:O,onSearchChange:k,searchKeys:A,filterKeys:j=[],filters:M,onFiltersChange:N,sortKeys:P=[],page:F,onPageChange:ee,total:te,manualSearch:ne=!1,manualFilters:I=!1,manualSort:L=!1,manualPagination:R=!1,selectedKeys:z,onSelectionChange:B,emptyText:re=`No data`,filterPlaceholder:V=`Search...`,className:ie,style:H,...ae}){let[oe,se]=(0,p.useState)(null),[ce,le]=(0,p.useState)([]),[ue,de]=(0,p.useState)(``),[fe,pe]=(0,p.useState)({}),[me,U]=(0,p.useState)(1),[he,W]=(0,p.useState)(!1),[ge,G]=(0,p.useState)(!1),_e=(0,p.useRef)(null),ve=(0,p.useRef)(null),K=E===void 0?oe:E,q=O===void 0?ue:O,J=M===void 0?fe:M,Y=F===void 0?me:F,X=z??ce,ye=B??le,be=(0,p.useCallback)(e=>{O===void 0&&de(e),!R&&F===void 0&&U(1),k?.(e)},[O,F,R,k]),xe=(0,p.useCallback)(e=>{M===void 0&&pe(e),!R&&F===void 0&&U(1),N?.(e)},[M,F,R,N]),Se=(0,p.useCallback)(e=>{E===void 0&&se(e),!R&&F===void 0&&U(1),D?.(e)},[E,F,R,D]),Ce=(0,p.useRef)(null),we=(0,p.useCallback)(e=>{F===void 0&&U(e),ee?.(e),Ce.current?.scrollIntoView({block:`start`,behavior:`smooth`})},[F,ee]);function Te(e){let t;t=K?.key===e?K.dir===`asc`?{key:e,dir:`desc`}:null:{key:e,dir:`asc`},Se(t)}function Ee(e,t){let n=J[e]??[],r=n.includes(t)?n.filter(e=>e!==t):[...n,t];xe({...J,[e]:r})}let De=(0,p.useMemo)(()=>{let e={};for(let t of j){if(t.options){e[t.key]=t.options;continue}let n=new Set;for(let e of i){let r=g(e,t.key);r!=null&&n.add(String(r))}e[t.key]=Array.from(n).sort()}return e},[i,j]),Z=(0,p.useMemo)(()=>{let e=i;if(!ne&&d&&q.trim()){let t=q.toLowerCase();e=A&&A.length>0?e.filter(e=>A.some(n=>{let r=g(e,n);return r!=null&&String(r).toLowerCase().includes(t)})):e.filter(e=>r.some(n=>{if(n.filterable===!1)return!1;let r=e[n.key];return r!=null&&String(r).toLowerCase().includes(t)}))}if(!I)for(let[t,n]of Object.entries(J))!n||n.length===0||(e=e.filter(e=>{let r=g(e,t);return r!=null&&n.includes(String(r))}));return e},[i,ne,I,d,q,A,r,J]),Q=(0,p.useMemo)(()=>{if(L||!K)return Z;let e=r.find(e=>e.key===K.key),t=P.some(e=>e.key===K.key);if(!e?.sortable&&!l&&!t)return Z;let n=K.dir===`asc`?1:-1;return[...Z].sort((e,t)=>{let r=e[K.key],i=t[K.key];return r==null&&i==null?0:r==null?1:i==null?-1:typeof r==`number`&&typeof i==`number`?(r-i)*n:String(r).localeCompare(String(i))*n})},[Z,K,r,l,P,L]),Oe=R?te??Q.length:Q.length,ke=v?Math.max(1,Math.ceil(Oe/y)):1,Ae=(0,p.useMemo)(()=>{if(!v||R)return Q;let e=(Y-1)*y;return Q.slice(e,e+y)},[Q,v,R,Y,y]),$=Ae.map((e,t)=>h(e,(Y-1)*y+t,a)),je=$.length>0&&$.every(e=>X.includes(e));function Me(){ye(je?X.filter(e=>!$.includes(e)):[...new Set([...X,...$])])}function Ne(e){ye(X.includes(e)?X.filter(t=>t!==e):[...X,e])}function Pe(e,t){t.target.closest(`button, a, [data-no-row-select]`)||Ne(e)}let Fe=(0,p.useCallback)(()=>{W(e=>!e),G(!1)},[]),Ie=(0,p.useCallback)(()=>{G(e=>!e),W(!1)},[]),Le=P.find(e=>e.key===K?.key),Re=d||j.length>0||P.length>0;return(0,m.jsxs)(`div`,{ref:Ce,className:t.t(`data-table`,ie),style:T===void 0?H:{scrollMarginTop:T,...H},...ae,children:[Re&&(0,m.jsxs)(`div`,{className:`toolbar`,children:[d&&(0,m.jsx)(u.t,{className:`filter-search`,size:`sm`,fullWidth:!0,placeholder:V,value:q,onChange:e=>be(e.target.value),onClear:()=>be(``)}),(j.length>0||P.length>0)&&(0,m.jsxs)(`div`,{className:`toolbar-actions`,children:[j.length>0&&(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(o.t,{ref:_e,variant:`outlined`,size:`sm`,startIcon:(0,m.jsx)(e.Jn,{}),"aria-expanded":he,onClick:Fe,children:`Filter`}),(0,m.jsx)(n.t,{open:he,anchorRef:_e,onClose:()=>W(!1),placement:`bottom-end`,className:`data-table-dropdown`,children:j.map(e=>(0,m.jsxs)(`div`,{className:`data-table-filter-group`,children:[(0,m.jsx)(`span`,{className:`data-table-filter-label`,children:e.label}),(De[e.key]??[]).map(t=>(0,m.jsx)(`div`,{className:`data-table-filter-option`,children:(0,m.jsx)(s.t,{size:`sm`,clickEffect:`none`,checked:J[e.key]?.includes(t)??!1,onChange:()=>Ee(e.key,t),label:t})},t))]},e.key))})]}),P.length>0&&(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(o.t,{ref:ve,variant:`outlined`,size:`sm`,startIcon:K?K.dir===`asc`?(0,m.jsx)(e.Hi,{}):(0,m.jsx)(e.Vi,{}):(0,m.jsx)(e.qn,{}),"aria-expanded":ge,onClick:Ie,children:Le?`Sort: ${Le.label}`:`Sort`}),(0,m.jsx)(n.t,{open:ge,anchorRef:ve,onClose:()=>G(!1),placement:`bottom-end`,className:`data-table-dropdown`,children:P.map(n=>(0,m.jsxs)(`button`,{type:`button`,className:t.t(`data-table-sort-item`,K?.key===n.key&&`active`),onClick:()=>{K?.key===n.key?Se({key:n.key,dir:K.dir===`asc`?`desc`:`asc`}):Se({key:n.key,dir:`asc`})},children:[n.label,K?.key===n.key&&(0,m.jsx)(`span`,{className:`data-table-sort-dir`,children:K.dir===`asc`?(0,m.jsx)(e.Hi,{className:`data-table-sort-icon`}):(0,m.jsx)(e.Vi,{className:`data-table-sort-icon`})})]},n.key))})]})]})]}),(0,m.jsxs)(`div`,{className:t.t(`data-table-body`,C&&`loading`),"aria-busy":C||void 0,children:[(0,m.jsx)(`div`,{className:`scroll`,children:(0,m.jsxs)(`table`,{className:t.t(`root`,b&&`striped`,x&&`compact`),children:[(0,m.jsx)(`thead`,{className:t.t(`head`,S&&`sticky`),children:(0,m.jsxs)(`tr`,{children:[_&&(0,m.jsx)(`th`,{className:`th check-col`,children:(0,m.jsx)(s.t,{checked:je,onChange:Me,size:`sm`,clickEffect:`none`})}),r.map(n=>{let r=n.sortable??l,i=K?.key===n.key;return(0,m.jsx)(`th`,{className:t.t(`th`,r&&`sortable`,i&&`sorted-${K.dir}`),style:{width:n.width,textAlign:n.align},onClick:r?()=>Te(n.key):void 0,children:(0,m.jsxs)(`span`,{className:`th-content`,children:[n.label,r&&(0,m.jsx)(`span`,{className:`sort-icon`,children:i?K.dir===`asc`?(0,m.jsx)(e.Hi,{"aria-hidden":`true`}):(0,m.jsx)(e.Vi,{"aria-hidden":`true`}):(0,m.jsx)(e.Bi,{"aria-hidden":`true`})})]})},n.key)})]})}),(0,m.jsxs)(`tbody`,{children:[Ae.length===0&&(0,m.jsx)(`tr`,{children:(0,m.jsx)(`td`,{className:`empty`,colSpan:r.length+ +!!_,children:re})}),Ae.map((e,n)=>{let i=h(e,(Y-1)*y+n,a),o=X.includes(i);return(0,m.jsxs)(`tr`,{className:t.t(`row`,o&&`selected`,_&&`selectable`),onClick:_?e=>Pe(i,e):void 0,children:[_&&(0,m.jsx)(`td`,{className:`td check-col`,children:(0,m.jsx)(s.t,{checked:o,onChange:()=>{},size:`sm`,clickEffect:`none`})}),r.map(t=>(0,m.jsx)(`td`,{className:`td`,style:{textAlign:t.align},children:t.render?t.render(e[t.key],e,(Y-1)*y+n):e[t.key]},t.key))]},i)})]})]})}),C&&(0,m.jsx)(`div`,{className:`data-table-loading`,role:`status`,"aria-live":`polite`,children:(0,m.jsx)(c.t,{center:!1,minHeight:`auto`,label:w})})]}),v&&ke>1&&(0,m.jsx)(f.t,{total:Oe,page:Y,pageSize:y,onChange:we})]})}function v({items:e,color:n=`primary`,size:r=`md`,strikethrough:i=!0,onChange:a,className:o,...c}){return(0,m.jsx)(`div`,{className:t.t(`task list`,`color-${n}`,`size-${r}`,o),role:`list`,...c,children:e.map(e=>(0,m.jsxs)(`div`,{className:t.t(`task item`,e.checked&&`checked`,e.disabled&&`disabled`),role:`listitem`,onClick:t=>{e.disabled||t.target.closest(`.checkbox`)||a?.(e.id,!(e.checked??!1))},children:[(0,m.jsx)(s.t,{className:`task control`,checked:e.checked??!1,color:n,size:r,disabled:e.disabled,onChange:t=>a?.(e.id,t.target.checked),clickEffect:`ripple`}),(0,m.jsx)(`span`,{className:t.t(`task label`,e.checked&&i&&`done`),children:e.label})]},e.id))})}var y=7,b=24,x=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`],S=[`None`,`Few`,`Some`,`Many`];function C(e,t){if(t<=0||e<=0)return 0;let n=e/t;return n>=.66?3:n>=.33?2:1}function w(e,t,n){let r=Array.from({length:t},()=>Array.from({length:n},()=>0));if(Array.isArray(e)&&e.length>0&&Array.isArray(e[0])){let i=e;for(let e=0;e<Math.min(t,i.length);e+=1){let t=i[e];if(t)for(let i=0;i<Math.min(n,t.length);i+=1)r[e][i]=t[i]??0}return r}for(let i of e)i.day<0||i.day>=t||i.slot<0||i.slot>=n||(r[i.day][i.slot]=i.value);return r}function T(e,t){if(typeof t==`number`)return t;let n=0;for(let t of e)for(let e of t)e>n&&(n=e);return n}function E(e,t,n){return n&&n.length>=e?Array.from({length:e},(e,t)=>({label:n[t],calendarDay:t})):e===7?(t===1?[1,2,3,4,5,6,0]:[0,1,2,3,4,5,6]).map(e=>({label:x[e],calendarDay:e})):Array.from({length:e},(e,t)=>({label:String(t+1),calendarDay:t}))}function D(e,t){return t&&t.length>=e?t.slice(0,e):e===24?Array.from({length:24},(e,t)=>t.toString().padStart(2,`0`)):Array.from({length:e},(e,t)=>String(t+1))}function O(e){return e.value>0?e.value:``}function k(e,t,n){return`${t} ${n} — ${e.value}`}function A({data:e,max:n,days:o=y,slots:s=b,dayLabels:c,slotLabels:u,weekStart:f=1,color:h=`warning`,title:g,description:_,hint:v,peakLabel:x,renderCell:A,renderTooltip:j,onCellClick:M,showLegend:N=!0,bandLabels:P=S,legendUnit:F,rowLabelWidth:ee=48,cellHeight:te=24,cellMinWidth:ne=24,className:I,style:L,...R}){let z=(0,p.useMemo)(()=>w(e,o,s),[e,o,s]),B=(0,p.useMemo)(()=>T(z,n),[z,n]),re=(0,p.useMemo)(()=>E(o,f,c),[o,f,c]),V=(0,p.useMemo)(()=>D(s,u),[s,u]),ie={gridTemplateColumns:`${ee}px repeat(${s}, minmax(${ne}px, 1fr))`},H={"--mineral-week-grid-color":`var(--mineral-${h})`,...L},ae=g!=null||_!=null||v!=null||x!=null;return(0,m.jsxs)(`div`,{className:t.t(`mineral-week-grid`,I),style:H,...R,children:[ae&&(0,m.jsxs)(l.t,{spacing:`xs`,children:[(0,m.jsxs)(`div`,{className:`mineral-week-grid__title-row`,children:[(0,m.jsxs)(`div`,{className:`mineral-week-grid__title-text`,children:[g!=null&&(typeof g==`string`?(0,m.jsx)(i.t,{level:5,children:g}):g),_!=null&&(typeof _==`string`?(0,m.jsx)(a.t,{tone:`muted`,children:_}):_)]}),x!=null&&(0,m.jsx)(r.t,{size:`sm`,tone:`muted`,children:x})]}),v!=null&&(0,m.jsx)(a.t,{size:`xs`,tone:`muted`,children:v})]}),(0,m.jsxs)(`div`,{className:`mineral-week-grid__matrix`,style:ie,children:[(0,m.jsx)(`div`,{}),V.map((e,t)=>(0,m.jsx)(`div`,{className:`mineral-week-grid__col-header`,children:(0,m.jsx)(a.t,{size:`xs`,tone:`muted`,children:e})},`col-${t}`)),re.map(({label:e,calendarDay:n},r)=>(0,m.jsxs)(p.Fragment,{children:[(0,m.jsx)(`div`,{className:`mineral-week-grid__row-label`,children:(0,m.jsx)(a.t,{size:`xs`,tone:`muted`,children:e})}),V.map((i,a)=>{let o=z[n]?.[a]??0,s=C(o,B),c={day:n,slot:a,value:o,band:s},l=A?A(c):O(c),u=j?j(c):k(c,e,i),f=(0,m.jsx)(`div`,{className:t.t(`mineral-week-grid__cell`,`mineral-week-grid__cell--band-${s}`,M&&`mineral-week-grid__cell--interactive`,!M&&u!=null&&`mineral-week-grid__cell--tooltip`),style:{height:te},onClick:M?()=>M(c):void 0,role:M?`button`:void 0,tabIndex:M?0:void 0,children:l});return u==null?(0,m.jsx)(p.Fragment,{children:f},`cell-${r}-${a}`):(0,m.jsx)(d.t,{content:u,children:f},`cell-${r}-${a}`)})]},`row-${r}-${n}`))]}),N&&(0,m.jsxs)(`div`,{className:`mineral-week-grid__legend`,children:[(0,m.jsx)(a.t,{size:`xs`,tone:`muted`,children:`Scale: 0 — ${B}${F?` ${F}`:``}`}),(0,m.jsx)(`div`,{className:`mineral-week-grid__legend-bands`,children:[0,1,2,3].map(e=>(0,m.jsxs)(`div`,{className:`mineral-week-grid__legend-band`,children:[(0,m.jsx)(`span`,{className:t.t(`mineral-week-grid__legend-swatch`,`mineral-week-grid__cell--band-${e}`)}),(0,m.jsx)(a.t,{size:`xs`,tone:`muted`,children:P[e]})]},`legend-${e}`))})]})]})}function j(e,t={}){let{perPage:n=20,initialPage:r=1,initialSearch:i=``,initialFilters:a,initialSort:o=null,invalidationKey:s}=t,[c,l]=(0,p.useState)([]),[u,d]=(0,p.useState)(0),[f,m]=(0,p.useState)(r),[h,g]=(0,p.useState)(i),[_,v]=(0,p.useState)(a??{}),[y,b]=(0,p.useState)(o),[x,S]=(0,p.useState)(!1),[C,w]=(0,p.useState)(null),[T,E]=(0,p.useState)(0),D=(0,p.useRef)(e);D.current=e;let O=(0,p.useMemo)(()=>({page:f,perPage:n,search:h,filters:_,sort:y}),[f,n,h,_,y]);(0,p.useEffect)(()=>{let e=typeof AbortController<`u`?new AbortController:void 0,t=!1;return S(!0),w(null),D.current(O,e?.signal).then(e=>{t||(l(e.data),d(e.meta.total))}).catch(e=>{t||e instanceof Error&&e.name===`AbortError`||w(e instanceof Error?e:Error(String(e)))}).finally(()=>{t||S(!1)}),()=>{t=!0,e?.abort()}},[O,s,T]);let k=(0,p.useCallback)(e=>{g(e),m(1)},[]),A=(0,p.useCallback)(e=>{v(e),m(1)},[]),j=(0,p.useCallback)(e=>{b(e),m(1)},[]),M=(0,p.useCallback)(()=>E(e=>e+1),[]);return{tableProps:{data:c,total:u,page:f,onPageChange:m,sort:y,onSortChange:j,search:h,onSearchChange:k,filters:_,onFiltersChange:A,manualSearch:!0,manualFilters:!0,manualSort:!0,manualPagination:!0,pageSize:n,loading:x},isLoading:x,error:C,refetch:M}}function M(e){return e?{key:e.key,dir:e.direction}:null}function N(e,t={}){let{perPage:n=12,initialPage:r=1,initialSearch:i=``,initialFilters:a,initialSort:o=null,invalidationKey:s}=t,[c,l]=(0,p.useState)([]),[u,d]=(0,p.useState)(0),[f,m]=(0,p.useState)(r),[h,g]=(0,p.useState)(i),[_,v]=(0,p.useState)(a??{}),[y,b]=(0,p.useState)(o??null),[x,S]=(0,p.useState)(!1),[C,w]=(0,p.useState)(null),[T,E]=(0,p.useState)(0),D=(0,p.useRef)(e);D.current=e;let O=(0,p.useMemo)(()=>({page:f,perPage:n,search:h,filters:_,sort:M(y)}),[f,n,h,_,y]);(0,p.useEffect)(()=>{let e=typeof AbortController<`u`?new AbortController:void 0,t=!1;return S(!0),w(null),D.current(O,e?.signal).then(e=>{t||(l(e.data),d(e.meta.total))}).catch(e=>{t||e instanceof Error&&e.name===`AbortError`||w(e instanceof Error?e:Error(String(e)))}).finally(()=>{t||S(!1)}),()=>{t=!0,e?.abort()}},[O,s,T]);let k=(0,p.useCallback)(e=>{g(e),m(1)},[]),A=(0,p.useCallback)(e=>{v(e),m(1)},[]),j=(0,p.useCallback)(e=>{b(e),m(1)},[]),N=(0,p.useCallback)(()=>E(e=>e+1),[]);return{gridProps:{items:c,total:u,page:f,onPageChange:m,sort:y,onSortChange:j,search:h,onSearchChange:k,filters:_,onFiltersChange:A,manualSearch:!0,manualFilters:!0,manualSort:!0,manualPagination:!0,pageSize:n,loading:x},isLoading:x,error:C,refetch:N}}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return N}});
|
|
2
|
-
//# sourceMappingURL=data-BZ92hzXx.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"data-BZ92hzXx.cjs","names":[],"sources":["../src/components/data/MDataTable/MDataTable.tsx","../src/components/data/MTaskList/MTaskList.tsx","../src/components/data/MWeekGrid/MWeekGrid.tsx","../src/components/data/useMTable.ts","../src/components/data/useMCardGrid.ts"],"sourcesContent":["import {useCallback, useMemo, useRef, useState} from 'react'\nimport type * as React from 'react'\nimport type {MDataTableProps, MDataTableSort} from './MDataTable.types'\nimport {MButton, MCheckbox} from '../../controls'\nimport {MInputSearch} from '../../inputs'\nimport {MPagination} from '../../layout'\nimport {MPopover} from '../../primitives'\nimport {MLoader} from '../../feedback'\nimport {MArrowDownIcon, MArrowUpDownIcon, MArrowUpIcon, MFilterIcon, MSortIcon} from '../../../icons'\nimport {cn} from '../../../utils/cn'\nimport './MDataTable.css'\n\nfunction getRowKey<T>(row: T, index: number, rowKey?: string | ((row: T, index: number) => string)): string {\n if (typeof rowKey === 'function') return rowKey(row, index)\n if (typeof rowKey === 'string') return String((row as any)[rowKey])\n return String((row as any).id ?? index)\n}\n\nfunction getNestedValue(obj: unknown, key: string): unknown {\n const parts = key.split('.')\n let val: unknown = obj\n\n for (const p of parts) {\n if (val == null || typeof val !== 'object') return undefined\n val = (val as Record<string, unknown>)[p]\n }\n\n return val\n}\n\nexport function MDataTable<T = any>({\n columns,\n data,\n rowKey,\n sortable = false,\n filterable = false,\n selectable = false,\n pagination = false,\n pageSize = 10,\n striped = false,\n compact = false,\n stickyHeader = false,\n loading = false,\n loadingLabel = 'Loading',\n scrollOffset,\n sort: controlledSort,\n onSortChange,\n search: controlledSearch,\n onSearchChange,\n searchKeys,\n filterKeys = [],\n filters: controlledFilters,\n onFiltersChange,\n sortKeys = [],\n page: controlledPage,\n onPageChange,\n total,\n manualSearch = false,\n manualFilters = false,\n manualSort = false,\n manualPagination = false,\n selectedKeys: controlledSelected,\n onSelectionChange,\n emptyText = 'No data',\n filterPlaceholder = 'Search...',\n className,\n style,\n ...rest\n}: MDataTableProps<T>) {\n const [internalSort, setInternalSort] = useState<MDataTableSort | null>(null)\n const [internalSelected, setInternalSelected] = useState<string[]>([])\n const [internalSearch, setInternalSearch] = useState('')\n const [internalFilters, setInternalFilters] = useState<Record<string, string[]>>({})\n const [internalPage, setInternalPage] = useState(1)\n const [filterOpen, setFilterOpen] = useState(false)\n const [sortOpen, setSortOpen] = useState(false)\n const filterBtnRef = useRef<HTMLElement>(null)\n const sortBtnRef = useRef<HTMLElement>(null)\n\n const activeSort = controlledSort !== undefined ? controlledSort : internalSort\n const search = controlledSearch !== undefined ? controlledSearch : internalSearch\n const filters = controlledFilters !== undefined ? controlledFilters : internalFilters\n const page = controlledPage !== undefined ? controlledPage : internalPage\n const selected = controlledSelected ?? internalSelected\n const setSelected = onSelectionChange ?? setInternalSelected\n\n const setSearch = useCallback(\n (next: string) => {\n if (controlledSearch === undefined) setInternalSearch(next)\n if (!manualPagination && controlledPage === undefined) setInternalPage(1)\n onSearchChange?.(next)\n },\n [controlledSearch, controlledPage, manualPagination, onSearchChange]\n )\n\n const setFilters = useCallback(\n (next: Record<string, string[]>) => {\n if (controlledFilters === undefined) setInternalFilters(next)\n if (!manualPagination && controlledPage === undefined) setInternalPage(1)\n onFiltersChange?.(next)\n },\n [controlledFilters, controlledPage, manualPagination, onFiltersChange]\n )\n\n const setSort = useCallback(\n (next: MDataTableSort | null) => {\n if (controlledSort === undefined) setInternalSort(next)\n if (!manualPagination && controlledPage === undefined) setInternalPage(1)\n onSortChange?.(next)\n },\n [controlledSort, controlledPage, manualPagination, onSortChange]\n )\n\n const rootRef = useRef<HTMLDivElement>(null)\n\n const setPage = useCallback(\n (next: number) => {\n if (controlledPage === undefined) setInternalPage(next)\n onPageChange?.(next)\n // After page change, bring the top of the table back into view so\n // the user does not stay scrolled deep into the previous page's rows.\n rootRef.current?.scrollIntoView({block: 'start', behavior: 'smooth'})\n },\n [controlledPage, onPageChange]\n )\n\n function handleSort(key: string) {\n let next: MDataTableSort | null\n\n if (activeSort?.key === key) {\n next = activeSort.dir === 'asc' ? {key, dir: 'desc'} : null\n } else {\n next = {key, dir: 'asc'}\n }\n\n setSort(next)\n }\n\n function toggleFilterValue(key: string, value: string) {\n const current = filters[key] ?? []\n const next = current.includes(value) ? current.filter((item) => item !== value) : [...current, value]\n setFilters({...filters, [key]: next})\n }\n\n const filterOptions = useMemo(() => {\n const map: Record<string, string[]> = {}\n\n for (const filterKey of filterKeys) {\n if (filterKey.options) {\n map[filterKey.key] = filterKey.options\n continue\n }\n\n const values = new Set<string>()\n\n for (const row of data) {\n const value = getNestedValue(row, filterKey.key)\n if (value != null) values.add(String(value))\n }\n\n map[filterKey.key] = Array.from(values).sort()\n }\n\n return map\n }, [data, filterKeys])\n\n const filtered = useMemo(() => {\n let result: T[] = data\n\n if (!manualSearch && filterable && search.trim()) {\n const query = search.toLowerCase()\n\n if (searchKeys && searchKeys.length > 0) {\n result = result.filter((row) =>\n searchKeys.some((key) => {\n const value = getNestedValue(row, key)\n return value != null && String(value).toLowerCase().includes(query)\n })\n )\n } else {\n result = result.filter((row) =>\n columns.some((col) => {\n if (col.filterable === false) return false\n const value = (row as any)[col.key]\n return value != null && String(value).toLowerCase().includes(query)\n })\n )\n }\n }\n\n if (!manualFilters) {\n for (const [key, selectedValues] of Object.entries(filters)) {\n if (!selectedValues || selectedValues.length === 0) continue\n\n result = result.filter((row) => {\n const value = getNestedValue(row, key)\n return value != null && selectedValues.includes(String(value))\n })\n }\n }\n\n return result\n }, [data, manualSearch, manualFilters, filterable, search, searchKeys, columns, filters])\n\n const sorted = useMemo(() => {\n if (manualSort || !activeSort) return filtered\n\n const col = columns.find((item) => item.key === activeSort.key)\n const sortKeyAllowed = sortKeys.some((item) => item.key === activeSort.key)\n if (!col?.sortable && !sortable && !sortKeyAllowed) return filtered\n\n const dir = activeSort.dir === 'asc' ? 1 : -1\n\n return [...filtered].sort((a, b) => {\n const va = (a as any)[activeSort.key]\n const vb = (b as any)[activeSort.key]\n\n if (va == null && vb == null) return 0\n if (va == null) return 1\n if (vb == null) return -1\n if (typeof va === 'number' && typeof vb === 'number') return (va - vb) * dir\n\n return String(va).localeCompare(String(vb)) * dir\n })\n }, [filtered, activeSort, columns, sortable, sortKeys, manualSort])\n\n const totalItems = manualPagination ? (total ?? sorted.length) : sorted.length\n const totalPages = pagination ? Math.max(1, Math.ceil(totalItems / pageSize)) : 1\n const pageData = useMemo(() => {\n if (!pagination || manualPagination) return sorted\n const start = (page - 1) * pageSize\n return sorted.slice(start, start + pageSize)\n }, [sorted, pagination, manualPagination, page, pageSize])\n\n const allKeys = pageData.map((row, index) => getRowKey(row, (page - 1) * pageSize + index, rowKey))\n const allSelected = allKeys.length > 0 && allKeys.every((key) => selected.includes(key))\n\n function toggleAll() {\n if (allSelected) {\n setSelected(selected.filter((key) => !allKeys.includes(key)))\n } else {\n setSelected([...new Set([...selected, ...allKeys])])\n }\n }\n\n function toggleRow(key: string) {\n setSelected(selected.includes(key) ? selected.filter((item) => item !== key) : [...selected, key])\n }\n\n function handleRowClick(key: string, event: React.MouseEvent) {\n const target = event.target as HTMLElement\n if (target.closest('button, a, [data-no-row-select]')) return\n toggleRow(key)\n }\n\n const openFilter = useCallback(() => {\n setFilterOpen((v) => !v)\n setSortOpen(false)\n }, [])\n\n const openSort = useCallback(() => {\n setSortOpen((v) => !v)\n setFilterOpen(false)\n }, [])\n\n const activeSortMenuItem = sortKeys.find((item) => item.key === activeSort?.key)\n const showToolbar = filterable || filterKeys.length > 0 || sortKeys.length > 0\n\n return (\n <div\n ref={rootRef}\n className={cn('data-table', className)}\n style={scrollOffset !== undefined ? {scrollMarginTop: scrollOffset, ...style} : style}\n {...rest}\n >\n {showToolbar && (\n <div className=\"toolbar\">\n {filterable && (\n <MInputSearch\n className=\"filter-search\"\n size=\"sm\"\n fullWidth\n placeholder={filterPlaceholder}\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n onClear={() => setSearch('')}\n />\n )}\n\n {(filterKeys.length > 0 || sortKeys.length > 0) && (\n <div className=\"toolbar-actions\">\n {filterKeys.length > 0 && (\n <>\n <MButton\n ref={filterBtnRef}\n variant=\"outlined\"\n size=\"sm\"\n startIcon={<MFilterIcon />}\n aria-expanded={filterOpen}\n onClick={openFilter}\n >\n Filter\n </MButton>\n <MPopover\n open={filterOpen}\n anchorRef={filterBtnRef}\n onClose={() => setFilterOpen(false)}\n placement=\"bottom-end\"\n className=\"data-table-dropdown\"\n >\n {filterKeys.map((filterKey) => (\n <div key={filterKey.key} className=\"data-table-filter-group\">\n <span className=\"data-table-filter-label\">{filterKey.label}</span>\n {(filterOptions[filterKey.key] ?? []).map((option) => (\n <div key={option} className=\"data-table-filter-option\">\n <MCheckbox\n size=\"sm\"\n clickEffect=\"none\"\n checked={filters[filterKey.key]?.includes(option) ?? false}\n onChange={() => toggleFilterValue(filterKey.key, option)}\n label={option}\n />\n </div>\n ))}\n </div>\n ))}\n </MPopover>\n </>\n )}\n\n {sortKeys.length > 0 && (\n <>\n <MButton\n ref={sortBtnRef}\n variant=\"outlined\"\n size=\"sm\"\n startIcon={\n activeSort ? (\n activeSort.dir === 'asc' ? (\n <MArrowUpIcon />\n ) : (\n <MArrowDownIcon />\n )\n ) : (\n <MSortIcon />\n )\n }\n aria-expanded={sortOpen}\n onClick={openSort}\n >\n {activeSortMenuItem ? `Sort: ${activeSortMenuItem.label}` : 'Sort'}\n </MButton>\n <MPopover\n open={sortOpen}\n anchorRef={sortBtnRef}\n onClose={() => setSortOpen(false)}\n placement=\"bottom-end\"\n className=\"data-table-dropdown\"\n >\n {sortKeys.map((sortItem) => (\n <button\n key={sortItem.key}\n type=\"button\"\n className={cn(\n 'data-table-sort-item',\n activeSort?.key === sortItem.key && 'active'\n )}\n onClick={() => {\n if (activeSort?.key === sortItem.key) {\n setSort({\n key: sortItem.key,\n dir: activeSort.dir === 'asc' ? 'desc' : 'asc',\n })\n } else {\n setSort({key: sortItem.key, dir: 'asc'})\n }\n }}\n >\n {sortItem.label}\n {activeSort?.key === sortItem.key && (\n <span className=\"data-table-sort-dir\">\n {activeSort.dir === 'asc' ? (\n <MArrowUpIcon className=\"data-table-sort-icon\" />\n ) : (\n <MArrowDownIcon className=\"data-table-sort-icon\" />\n )}\n </span>\n )}\n </button>\n ))}\n </MPopover>\n </>\n )}\n </div>\n )}\n </div>\n )}\n <div className={cn('data-table-body', loading && 'loading')} aria-busy={loading || undefined}>\n <div className=\"scroll\">\n <table className={cn('root', striped && 'striped', compact && 'compact')}>\n <thead className={cn('head', stickyHeader && 'sticky')}>\n <tr>\n {selectable && (\n <th className=\"th check-col\">\n <MCheckbox\n checked={allSelected}\n onChange={toggleAll}\n size=\"sm\"\n clickEffect=\"none\"\n />\n </th>\n )}\n {columns.map((col) => {\n const isSortable = col.sortable ?? sortable\n const isSorted = activeSort?.key === col.key\n\n return (\n <th\n key={col.key}\n className={cn(\n 'th',\n isSortable && 'sortable',\n isSorted && `sorted-${activeSort!.dir}`\n )}\n style={{\n width: col.width,\n textAlign: col.align,\n }}\n onClick={isSortable ? () => handleSort(col.key) : undefined}\n >\n <span className=\"th-content\">\n {col.label}\n {isSortable && (\n <span className=\"sort-icon\">\n {isSorted ? (\n activeSort!.dir === 'asc' ? (\n <MArrowUpIcon aria-hidden=\"true\" />\n ) : (\n <MArrowDownIcon aria-hidden=\"true\" />\n )\n ) : (\n <MArrowUpDownIcon aria-hidden=\"true\" />\n )}\n </span>\n )}\n </span>\n </th>\n )\n })}\n </tr>\n </thead>\n <tbody>\n {pageData.length === 0 && (\n <tr>\n <td className=\"empty\" colSpan={columns.length + (selectable ? 1 : 0)}>\n {emptyText}\n </td>\n </tr>\n )}\n {pageData.map((row, index) => {\n const key = getRowKey(row, (page - 1) * pageSize + index, rowKey)\n const isSelected = selected.includes(key)\n\n return (\n <tr\n key={key}\n className={cn('row', isSelected && 'selected', selectable && 'selectable')}\n onClick={selectable ? (event) => handleRowClick(key, event) : undefined}\n >\n {selectable && (\n <td className=\"td check-col\">\n <MCheckbox\n checked={isSelected}\n onChange={() => {}}\n size=\"sm\"\n clickEffect=\"none\"\n />\n </td>\n )}\n {columns.map((col) => (\n <td key={col.key} className=\"td\" style={{textAlign: col.align}}>\n {col.render\n ? col.render(\n (row as any)[col.key],\n row,\n (page - 1) * pageSize + index\n )\n : (row as any)[col.key]}\n </td>\n ))}\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n {loading && (\n <div className=\"data-table-loading\" role=\"status\" aria-live=\"polite\">\n <MLoader center={false} minHeight=\"auto\" label={loadingLabel} />\n </div>\n )}\n </div>\n {pagination && totalPages > 1 && (\n <MPagination total={totalItems} page={page} pageSize={pageSize} onChange={setPage} />\n )}\n </div>\n )\n}\n","import type {MTaskListProps} from './MTaskList.types'\nimport {MCheckbox} from '../../controls'\nimport {cn} from '../../../utils/cn'\nimport './MTaskList.css'\n\n// Render an interactive checklist with toggleable task items.\nexport function MTaskList({\n items,\n color = 'primary',\n size = 'md',\n strikethrough = true,\n onChange,\n className,\n ...rest\n}: MTaskListProps) {\n return (\n <div className={cn('task list', `color-${color}`, `size-${size}`, className)} role=\"list\" {...rest}>\n {items.map((item) => (\n <div\n key={item.id}\n className={cn('task item', item.checked && 'checked', item.disabled && 'disabled')}\n role=\"listitem\"\n onClick={(event) => {\n if (item.disabled) return\n if ((event.target as HTMLElement).closest('.checkbox')) return\n onChange?.(item.id, !(item.checked ?? false))\n }}\n >\n <MCheckbox\n className=\"task control\"\n checked={item.checked ?? false}\n color={color}\n size={size}\n disabled={item.disabled}\n onChange={(e) => onChange?.(item.id, e.target.checked)}\n clickEffect=\"ripple\"\n />\n <span className={cn('task label', item.checked && strikethrough && 'done')}>{item.label}</span>\n </div>\n ))}\n </div>\n )\n}\n","import {Fragment, useMemo, type CSSProperties, type ReactNode} from 'react'\n\nimport {MStack} from '../../layout'\nimport {MTooltip} from '../../overlays'\nimport {MHeading, MSubText, MText} from '../../typography'\nimport {cn} from '../../../utils/cn'\n\nimport type {\n MWeekGridBand,\n MWeekGridCell,\n MWeekGridCellContext,\n MWeekGridProps,\n} from './MWeekGrid.types'\n\nimport './MWeekGrid.css'\n\nconst DEFAULT_DAYS = 7\nconst DEFAULT_SLOTS = 24\n\nconst DEFAULT_DAY_LABELS_FROM_SUNDAY = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']\n\nconst DEFAULT_BAND_LABELS: [string, string, string, string] = ['None', 'Few', 'Some', 'Many']\n\nfunction densityBand(value: number, max: number): MWeekGridBand {\n if (max <= 0 || value <= 0) return 0\n const ratio = value / max\n if (ratio >= 0.66) return 3\n if (ratio >= 0.33) return 2\n return 1\n}\n\nfunction buildGrid(data: MWeekGridProps['data'], days: number, slots: number): number[][] {\n const grid: number[][] = Array.from({length: days}, () => Array.from({length: slots}, () => 0))\n\n if (Array.isArray(data) && data.length > 0 && Array.isArray(data[0])) {\n const matrix = data as number[][]\n for (let day = 0; day < Math.min(days, matrix.length); day += 1) {\n const row = matrix[day]\n if (!row) continue\n for (let slot = 0; slot < Math.min(slots, row.length); slot += 1) {\n grid[day][slot] = row[slot] ?? 0\n }\n }\n return grid\n }\n\n for (const cell of data as MWeekGridCell[]) {\n if (cell.day < 0 || cell.day >= days) continue\n if (cell.slot < 0 || cell.slot >= slots) continue\n grid[cell.day][cell.slot] = cell.value\n }\n return grid\n}\n\nfunction resolveMax(grid: number[][], max?: number): number {\n if (typeof max === 'number') return max\n let best = 0\n for (const row of grid) {\n for (const value of row) {\n if (value > best) best = value\n }\n }\n return best\n}\n\nfunction resolveDayLabels(\n days: number,\n weekStart: 0 | 1,\n custom?: string[]\n): {label: string; calendarDay: number}[] {\n if (custom && custom.length >= days) {\n return Array.from({length: days}, (_, index) => ({label: custom[index], calendarDay: index}))\n }\n\n if (days === 7) {\n const order = weekStart === 1 ? [1, 2, 3, 4, 5, 6, 0] : [0, 1, 2, 3, 4, 5, 6]\n return order.map((calendarDay) => ({\n label: DEFAULT_DAY_LABELS_FROM_SUNDAY[calendarDay],\n calendarDay,\n }))\n }\n\n return Array.from({length: days}, (_, index) => ({\n label: String(index + 1),\n calendarDay: index,\n }))\n}\n\nfunction resolveSlotLabels(slots: number, custom?: string[]): string[] {\n if (custom && custom.length >= slots) return custom.slice(0, slots)\n if (slots === 24) {\n return Array.from({length: 24}, (_, hour) => hour.toString().padStart(2, '0'))\n }\n return Array.from({length: slots}, (_, slot) => String(slot + 1))\n}\n\nfunction defaultRenderCell(ctx: MWeekGridCellContext): ReactNode {\n return ctx.value > 0 ? ctx.value : ''\n}\n\nfunction defaultRenderTooltip(ctx: MWeekGridCellContext, dayLabel: string, slotLabel: string): ReactNode {\n return `${dayLabel} ${slotLabel} — ${ctx.value}`\n}\n\n/**\n * Week-grid heatmap — rows = days, columns = hours (or any fixed slot range).\n * Cells colour-shade by density (four discrete bands) and accept tooltips,\n * custom renderers and click handlers. Common use cases: availability /\n * attendance maps, booking density, opening hours, peak-load views.\n */\nexport function MWeekGrid({\n data,\n max,\n days = DEFAULT_DAYS,\n slots = DEFAULT_SLOTS,\n dayLabels,\n slotLabels,\n weekStart = 1,\n color = 'warning',\n title,\n description,\n hint,\n peakLabel,\n renderCell,\n renderTooltip,\n onCellClick,\n showLegend = true,\n bandLabels = DEFAULT_BAND_LABELS,\n legendUnit,\n rowLabelWidth = 48,\n cellHeight = 24,\n cellMinWidth = 24,\n className,\n style,\n ...rest\n}: MWeekGridProps) {\n const grid = useMemo(() => buildGrid(data, days, slots), [data, days, slots])\n const resolvedMax = useMemo(() => resolveMax(grid, max), [grid, max])\n const rows = useMemo(\n () => resolveDayLabels(days, weekStart, dayLabels),\n [days, weekStart, dayLabels]\n )\n const cols = useMemo(() => resolveSlotLabels(slots, slotLabels), [slots, slotLabels])\n\n const matrixStyle: CSSProperties = {\n gridTemplateColumns: `${rowLabelWidth}px repeat(${slots}, minmax(${cellMinWidth}px, 1fr))`,\n }\n\n const wrapperStyle: CSSProperties = {\n ['--mineral-week-grid-color' as never]: `var(--mineral-${color})`,\n ...style,\n }\n\n const hasHeader = title != null || description != null || hint != null || peakLabel != null\n\n return (\n <div className={cn('mineral-week-grid', className)} style={wrapperStyle} {...rest}>\n {hasHeader && (\n <MStack spacing={'xs'}>\n <div className={'mineral-week-grid__title-row'}>\n <div className={'mineral-week-grid__title-text'}>\n {title != null && (\n typeof title === 'string' ? <MHeading level={5}>{title}</MHeading> : title\n )}\n {description != null && (\n typeof description === 'string' ? (\n <MSubText tone={'muted'}>{description}</MSubText>\n ) : (\n description\n )\n )}\n </div>\n {peakLabel != null && (\n <MText size={'sm'} tone={'muted'}>\n {peakLabel}\n </MText>\n )}\n </div>\n {hint != null && (\n <MSubText size={'xs'} tone={'muted'}>\n {hint}\n </MSubText>\n )}\n </MStack>\n )}\n\n <div className={'mineral-week-grid__matrix'} style={matrixStyle}>\n <div />\n {cols.map((label, slot) => (\n <div key={`col-${slot}`} className={'mineral-week-grid__col-header'}>\n <MSubText size={'xs'} tone={'muted'}>\n {label}\n </MSubText>\n </div>\n ))}\n\n {rows.map(({label: dayLabel, calendarDay}, rowIndex) => (\n <Fragment key={`row-${rowIndex}-${calendarDay}`}>\n <div className={'mineral-week-grid__row-label'}>\n <MSubText size={'xs'} tone={'muted'}>\n {dayLabel}\n </MSubText>\n </div>\n {cols.map((slotLabel, slot) => {\n const value = grid[calendarDay]?.[slot] ?? 0\n const band = densityBand(value, resolvedMax)\n const ctx: MWeekGridCellContext = {day: calendarDay, slot, value, band}\n const cellContent = renderCell ? renderCell(ctx) : defaultRenderCell(ctx)\n const tooltipContent = renderTooltip\n ? renderTooltip(ctx)\n : defaultRenderTooltip(ctx, dayLabel, slotLabel)\n\n const cellClasses = cn(\n 'mineral-week-grid__cell',\n `mineral-week-grid__cell--band-${band}`,\n onCellClick && 'mineral-week-grid__cell--interactive',\n !onCellClick && tooltipContent != null && 'mineral-week-grid__cell--tooltip'\n )\n\n const cellNode = (\n <div\n className={cellClasses}\n style={{height: cellHeight}}\n onClick={onCellClick ? () => onCellClick(ctx) : undefined}\n role={onCellClick ? 'button' : undefined}\n tabIndex={onCellClick ? 0 : undefined}\n >\n {cellContent}\n </div>\n )\n\n if (tooltipContent == null) {\n return <Fragment key={`cell-${rowIndex}-${slot}`}>{cellNode}</Fragment>\n }\n\n return (\n <MTooltip key={`cell-${rowIndex}-${slot}`} content={tooltipContent}>\n {cellNode}\n </MTooltip>\n )\n })}\n </Fragment>\n ))}\n </div>\n\n {showLegend && (\n <div className={'mineral-week-grid__legend'}>\n <MSubText size={'xs'} tone={'muted'}>\n {`Scale: 0 — ${resolvedMax}${legendUnit ? ` ${legendUnit}` : ''}`}\n </MSubText>\n <div className={'mineral-week-grid__legend-bands'}>\n {([0, 1, 2, 3] as const).map((band) => (\n <div key={`legend-${band}`} className={'mineral-week-grid__legend-band'}>\n <span\n className={cn(\n 'mineral-week-grid__legend-swatch',\n `mineral-week-grid__cell--band-${band}`\n )}\n />\n <MSubText size={'xs'} tone={'muted'}>\n {bandLabels[band]}\n </MSubText>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n}\n","import {useCallback, useEffect, useMemo, useRef, useState} from 'react'\n\nimport type {MDataTableSort} from './MDataTable'\n\n/**\n * Generic query shape that backend lists can satisfy. Drop-in adapter between\n * `useMTable` and the API call. The framework does not assume axios/fetch/swr —\n * the consumer plugs whatever fetcher they want.\n */\nexport interface MTableQuery {\n page?: number\n perPage?: number\n search?: string\n filters?: Record<string, string[]>\n sort?: MDataTableSort | null\n}\n\n/**\n * Standard list response. Mirrors the most common server convention\n * (data + meta with pagination total). Adapt your fetcher to this shape if your\n * backend uses different envelope keys.\n */\nexport interface MTableResponse<T> {\n data: T[]\n meta: {\n total: number\n page: number\n perPage: number\n totalPages: number\n }\n}\n\nexport type MTableFetcher<T> = (query: MTableQuery, signal?: AbortSignal) => Promise<MTableResponse<T>>\n\nexport interface MTableOptions {\n perPage?: number\n initialPage?: number\n initialSearch?: string\n initialFilters?: Record<string, string[]>\n initialSort?: MDataTableSort | null\n /** Bump to force a refetch (e.g. after a mutation invalidates the list). */\n invalidationKey?: number | string\n}\n\nexport interface MTableProps<T> {\n data: T[]\n total: number\n page: number\n onPageChange: (page: number) => void\n sort: MDataTableSort | null\n onSortChange: (sort: MDataTableSort | null) => void\n search: string\n onSearchChange: (search: string) => void\n filters: Record<string, string[]>\n onFiltersChange: (filters: Record<string, string[]>) => void\n manualSearch: true\n manualFilters: true\n manualSort: true\n manualPagination: true\n pageSize: number\n /** Mirrors `isLoading`; drives `MDataTable`'s loading scrim when `tableProps` is spread. */\n loading: boolean\n}\n\nexport interface MTableHandle<T> {\n /** Spread directly onto `<MDataTable>` — wires up all manual* + state props. */\n tableProps: MTableProps<T>\n isLoading: boolean\n error: Error | null\n /** Trigger a fresh fetch with current query. */\n refetch: () => void\n}\n\n/**\n * Adapter hook that bridges a fetcher returning `MTableResponse<T>` with\n * `MDataTable` in manual mode. Owns the search / filters / sort / page state,\n * debounces nothing on its own (fetcher decides), and aborts in-flight\n * requests when the query changes. Spread `tableProps` onto your table.\n */\nexport function useMTable<T>(fetcher: MTableFetcher<T>, options: MTableOptions = {}): MTableHandle<T> {\n const {\n perPage = 20,\n initialPage = 1,\n initialSearch = '',\n initialFilters,\n initialSort = null,\n invalidationKey,\n } = options\n\n const [data, setData] = useState<T[]>([])\n const [total, setTotal] = useState(0)\n const [page, setPage] = useState(initialPage)\n const [search, setSearch] = useState(initialSearch)\n const [filters, setFilters] = useState<Record<string, string[]>>(initialFilters ?? {})\n const [sort, setSort] = useState<MDataTableSort | null>(initialSort)\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n const [bump, setBump] = useState(0)\n\n const fetcherRef = useRef(fetcher)\n fetcherRef.current = fetcher\n\n const query = useMemo<MTableQuery>(\n () => ({page, perPage, search, filters, sort}),\n [page, perPage, search, filters, sort]\n )\n\n useEffect(() => {\n const controller = typeof AbortController !== 'undefined' ? new AbortController() : undefined\n let cancelled = false\n setIsLoading(true)\n setError(null)\n fetcherRef\n .current(query, controller?.signal)\n .then((response) => {\n if (cancelled) return\n setData(response.data)\n setTotal(response.meta.total)\n })\n .catch((err: unknown) => {\n if (cancelled) return\n if (err instanceof Error && err.name === 'AbortError') return\n setError(err instanceof Error ? err : new Error(String(err)))\n })\n .finally(() => {\n if (!cancelled) setIsLoading(false)\n })\n return () => {\n cancelled = true\n controller?.abort()\n }\n }, [query, invalidationKey, bump])\n\n // Reset to page 1 when search/filters/sort change.\n const handleSearchChange = useCallback((next: string) => {\n setSearch(next)\n setPage(1)\n }, [])\n const handleFiltersChange = useCallback((next: Record<string, string[]>) => {\n setFilters(next)\n setPage(1)\n }, [])\n const handleSortChange = useCallback((next: MDataTableSort | null) => {\n setSort(next)\n setPage(1)\n }, [])\n\n const refetch = useCallback(() => setBump((value) => value + 1), [])\n\n const tableProps: MTableProps<T> = {\n data,\n total,\n page,\n onPageChange: setPage,\n sort,\n onSortChange: handleSortChange,\n search,\n onSearchChange: handleSearchChange,\n filters,\n onFiltersChange: handleFiltersChange,\n manualSearch: true,\n manualFilters: true,\n manualSort: true,\n manualPagination: true,\n pageSize: perPage,\n loading: isLoading,\n }\n\n return {tableProps, isLoading, error, refetch}\n}\n","import {useCallback, useEffect, useMemo, useRef, useState} from 'react'\n\nimport type {MCardGridSort} from '../cards/MCardGrid'\nimport type {MTableQuery, MTableResponse, MTableFetcher, MTableOptions} from './useMTable'\n\n/**\n * Card-grid analog of `useMTable`. Same fetcher-agnostic pattern; returns props\n * spreadable onto `<MCardGrid>` in manual mode. Note that `MCardGridSort` uses\n * `direction` (vs `MDataTableSort.dir`) — convert if you reuse a fetcher.\n */\nexport interface MCardGridProps<T> {\n items: T[]\n total: number\n page: number\n onPageChange: (page: number) => void\n sort: MCardGridSort<T> | null\n onSortChange: (sort: MCardGridSort<T> | null) => void\n search: string\n onSearchChange: (search: string) => void\n filters: Record<string, string[]>\n onFiltersChange: (filters: Record<string, string[]>) => void\n manualSearch: true\n manualFilters: true\n manualSort: true\n manualPagination: true\n pageSize: number\n /** Mirrors `isLoading`; drives `MCardGrid`'s loading scrim when `gridProps` is spread. */\n loading: boolean\n}\n\nexport interface MCardGridHandle<T> {\n /** Spread directly onto `<MCardGrid>`. */\n gridProps: MCardGridProps<T>\n isLoading: boolean\n error: Error | null\n refetch: () => void\n}\n\nfunction toTableSort<T>(sort: MCardGridSort<T> | null): MTableQuery['sort'] {\n if (!sort) return null\n return {key: sort.key, dir: sort.direction}\n}\n\n/**\n * Adapter hook for `MCardGrid` in manual mode. Owns search / filters / sort /\n * page state, calls a generic `MTableFetcher`, returns `gridProps` to spread.\n */\nexport function useMCardGrid<T>(fetcher: MTableFetcher<T>, options: MTableOptions = {}): MCardGridHandle<T> {\n const {\n perPage = 12,\n initialPage = 1,\n initialSearch = '',\n initialFilters,\n initialSort = null,\n invalidationKey,\n } = options\n\n const [items, setItems] = useState<T[]>([])\n const [total, setTotal] = useState(0)\n const [page, setPage] = useState(initialPage)\n const [search, setSearch] = useState(initialSearch)\n const [filters, setFilters] = useState<Record<string, string[]>>(initialFilters ?? {})\n const [sort, setSort] = useState<MCardGridSort<T> | null>(\n (initialSort as MCardGridSort<T> | null | undefined) ?? null\n )\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n const [bump, setBump] = useState(0)\n\n const fetcherRef = useRef(fetcher)\n fetcherRef.current = fetcher\n\n const query = useMemo<MTableQuery>(\n () => ({page, perPage, search, filters, sort: toTableSort(sort)}),\n [page, perPage, search, filters, sort]\n )\n\n useEffect(() => {\n const controller = typeof AbortController !== 'undefined' ? new AbortController() : undefined\n let cancelled = false\n setIsLoading(true)\n setError(null)\n fetcherRef\n .current(query, controller?.signal)\n .then((response: MTableResponse<T>) => {\n if (cancelled) return\n setItems(response.data)\n setTotal(response.meta.total)\n })\n .catch((err: unknown) => {\n if (cancelled) return\n if (err instanceof Error && err.name === 'AbortError') return\n setError(err instanceof Error ? err : new Error(String(err)))\n })\n .finally(() => {\n if (!cancelled) setIsLoading(false)\n })\n return () => {\n cancelled = true\n controller?.abort()\n }\n }, [query, invalidationKey, bump])\n\n const handleSearchChange = useCallback((next: string) => {\n setSearch(next)\n setPage(1)\n }, [])\n const handleFiltersChange = useCallback((next: Record<string, string[]>) => {\n setFilters(next)\n setPage(1)\n }, [])\n const handleSortChange = useCallback((next: MCardGridSort<T> | null) => {\n setSort(next)\n setPage(1)\n }, [])\n\n const refetch = useCallback(() => setBump((value) => value + 1), [])\n\n const gridProps: MCardGridProps<T> = {\n items,\n total,\n page,\n onPageChange: setPage,\n sort,\n onSortChange: handleSortChange,\n search,\n onSearchChange: handleSearchChange,\n filters,\n onFiltersChange: handleFiltersChange,\n manualSearch: true,\n manualFilters: true,\n manualSort: true,\n manualPagination: true,\n pageSize: perPage,\n loading: isLoading,\n }\n\n return {gridProps, isLoading, error, refetch}\n}\n"],"mappings":"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"}
|