@banzamel/mineralui 2.1.1 → 2.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/{MAvatar-BcO8hMnU.js → MAvatar-DtJCj3dD.js} +1 -1
- package/dist/{MAvatar-BcO8hMnU.js.map → MAvatar-DtJCj3dD.js.map} +1 -1
- package/dist/{MAvatar-C4N2ztLf.cjs → MAvatar-bUWENcq-.cjs} +2 -2
- package/dist/{MAvatar-C4N2ztLf.cjs.map → MAvatar-bUWENcq-.cjs.map} +1 -1
- package/dist/{MButton-B8kFTOPJ.cjs → MButton-R08y1HCT.cjs} +2 -2
- package/dist/{MButton-B8kFTOPJ.cjs.map → MButton-R08y1HCT.cjs.map} +1 -1
- package/dist/{MButtonGroup-C3Ar0gfk.cjs → MButtonGroup-C-LiXWRC.cjs} +2 -2
- package/dist/{MButtonGroup-C3Ar0gfk.cjs.map → MButtonGroup-C-LiXWRC.cjs.map} +1 -1
- package/dist/{MCard-szs5kIek.cjs → MCard-1OVOl4Ql.cjs} +2 -2
- package/dist/{MCard-szs5kIek.cjs.map → MCard-1OVOl4Ql.cjs.map} +1 -1
- package/dist/{MCard-dLMQQ97e.js → MCard-azpp4YVD.js} +1 -1
- package/dist/{MCard-dLMQQ97e.js.map → MCard-azpp4YVD.js.map} +1 -1
- package/dist/{MCheckbox-CATWU11D.cjs → MCheckbox-CM5HJQWW.cjs} +2 -2
- package/dist/{MCheckbox-CATWU11D.cjs.map → MCheckbox-CM5HJQWW.cjs.map} +1 -1
- package/dist/{MConflictIllustration-Mnz1q7Ey.cjs → MConflictIllustration-B2AtfpYO.cjs} +2 -2
- package/dist/{MConflictIllustration-Mnz1q7Ey.cjs.map → MConflictIllustration-B2AtfpYO.cjs.map} +1 -1
- package/dist/{MDetailList-BBgUaSDJ.cjs → MDetailList-BhKBJwpd.cjs} +2 -2
- package/dist/{MDetailList-BBgUaSDJ.cjs.map → MDetailList-BhKBJwpd.cjs.map} +1 -1
- package/dist/{MDetailList-zlwdeA-r.js → MDetailList-BjvZUyNj.js} +2 -2
- package/dist/{MDetailList-zlwdeA-r.js.map → MDetailList-BjvZUyNj.js.map} +1 -1
- package/dist/{MDropdownMenu-omTEUh4V.js → MDropdownMenu-CZmU3uku.js} +1 -1
- package/dist/{MDropdownMenu-omTEUh4V.js.map → MDropdownMenu-CZmU3uku.js.map} +1 -1
- package/dist/{MDropdownMenu-1RqWjxHp.cjs → MDropdownMenu-hXaIMkAj.cjs} +2 -2
- package/dist/{MDropdownMenu-1RqWjxHp.cjs.map → MDropdownMenu-hXaIMkAj.cjs.map} +1 -1
- package/dist/{MGrid-B2qzYD6S.cjs → MGrid-B_0kFUws.cjs} +2 -2
- package/dist/{MGrid-B2qzYD6S.cjs.map → MGrid-B_0kFUws.cjs.map} +1 -1
- package/dist/{MGrid-Cy44dWyC.js → MGrid-CYL3cbUI.js} +1 -1
- package/dist/{MGrid-Cy44dWyC.js.map → MGrid-CYL3cbUI.js.map} +1 -1
- package/dist/{MHeading-CyuxSnhl.cjs → MHeading-BLnb3dNv.cjs} +2 -2
- package/dist/{MHeading-CyuxSnhl.cjs.map → MHeading-BLnb3dNv.cjs.map} +1 -1
- package/dist/{MI18nProvider-C90EVyFz.cjs → MI18nProvider-Cg-vxV6j.cjs} +2 -2
- package/dist/{MI18nProvider-C90EVyFz.cjs.map → MI18nProvider-Cg-vxV6j.cjs.map} +1 -1
- package/dist/{MInput-Cw9ZVcNO.cjs → MInput-BhTAfpYS.cjs} +2 -2
- package/dist/{MInput-Cw9ZVcNO.cjs.map → MInput-BhTAfpYS.cjs.map} +1 -1
- package/dist/{MInput-Baokf17V.js → MInput-CgtX0fUN.js} +1 -1
- package/dist/{MInput-Baokf17V.js.map → MInput-CgtX0fUN.js.map} +1 -1
- package/dist/{MInputCVC-DNzDAbfU.js → MInputCVC-BGYhUGDE.js} +3 -3
- package/dist/{MInputCVC-DNzDAbfU.js.map → MInputCVC-BGYhUGDE.js.map} +1 -1
- package/dist/{MInputCVC-Bqcp5Uu3.cjs → MInputCVC-E2Z2hYfy.cjs} +2 -2
- package/dist/{MInputCVC-Bqcp5Uu3.cjs.map → MInputCVC-E2Z2hYfy.cjs.map} +1 -1
- package/dist/{MInputSearch-D9bp1QAz.cjs → MInputSearch-DE9Jqp0i.cjs} +2 -2
- package/dist/{MInputSearch-D9bp1QAz.cjs.map → MInputSearch-DE9Jqp0i.cjs.map} +1 -1
- package/dist/{MInputSearch-Bswi-Kj0.js → MInputSearch-DEr5HBgw.js} +2 -2
- package/dist/{MInputSearch-Bswi-Kj0.js.map → MInputSearch-DEr5HBgw.js.map} +1 -1
- package/dist/{MKbd-CiwDwFwA.cjs → MKbd-n4fhKIxb.cjs} +2 -2
- package/dist/{MKbd-CiwDwFwA.cjs.map → MKbd-n4fhKIxb.cjs.map} +1 -1
- package/dist/{MLink-B7gXA8qY.cjs → MLink-Biipj7xz.cjs} +2 -2
- package/dist/{MLink-B7gXA8qY.cjs.map → MLink-Biipj7xz.cjs.map} +1 -1
- package/dist/MLoader-CnvWqFtA.js +41 -0
- package/dist/MLoader-CnvWqFtA.js.map +1 -0
- package/dist/MLoader-XcpKlLrd.cjs +2 -0
- package/dist/MLoader-XcpKlLrd.cjs.map +1 -0
- package/dist/{MPagination-DpUtB6t6.js → MPagination-7yTbB8dZ.js} +1 -1
- package/dist/{MPagination-DpUtB6t6.js.map → MPagination-7yTbB8dZ.js.map} +1 -1
- package/dist/{MPagination-C2GmGkVA.cjs → MPagination-DTqT33Mx.cjs} +2 -2
- package/dist/{MPagination-C2GmGkVA.cjs.map → MPagination-DTqT33Mx.cjs.map} +1 -1
- package/dist/{MPopover-BVBN5SJi.cjs → MPopover-hDqrn317.cjs} +2 -2
- package/dist/{MPopover-BVBN5SJi.cjs.map → MPopover-hDqrn317.cjs.map} +1 -1
- package/dist/{MPortal-Djrw2WhD.cjs → MPortal-BciZHNDC.cjs} +2 -2
- package/dist/{MPortal-Djrw2WhD.cjs.map → MPortal-BciZHNDC.cjs.map} +1 -1
- package/dist/{MSimpleGrid-BVeCK9Ci.js → MSimpleGrid-BWKurW6H.js} +1 -1
- package/dist/{MSimpleGrid-BVeCK9Ci.js.map → MSimpleGrid-BWKurW6H.js.map} +1 -1
- package/dist/{MSimpleGrid-BR352NiK.cjs → MSimpleGrid-BwNfaxQP.cjs} +2 -2
- package/dist/{MSimpleGrid-BR352NiK.cjs.map → MSimpleGrid-BwNfaxQP.cjs.map} +1 -1
- package/dist/{MSkeleton-DyQBeuVT.cjs → MSkeleton-CLSU5pL6.cjs} +2 -2
- package/dist/{MSkeleton-DyQBeuVT.cjs.map → MSkeleton-CLSU5pL6.cjs.map} +1 -1
- package/dist/{MSlider-Ds2Fls86.cjs → MSlider-DZnMB49q.cjs} +2 -2
- package/dist/{MSlider-Ds2Fls86.cjs.map → MSlider-DZnMB49q.cjs.map} +1 -1
- package/dist/{MStack-BdVvJN5S.cjs → MStack-BP_BUeCc.cjs} +2 -2
- package/dist/{MStack-BdVvJN5S.cjs.map → MStack-BP_BUeCc.cjs.map} +1 -1
- package/dist/{MStack-h11pHEmc.js → MStack-CSCw6to2.js} +1 -1
- package/dist/{MStack-h11pHEmc.js.map → MStack-CSCw6to2.js.map} +1 -1
- package/dist/{MSubText-DWNMJupD.cjs → MSubText-VHsgFsv2.cjs} +2 -2
- package/dist/{MSubText-DWNMJupD.cjs.map → MSubText-VHsgFsv2.cjs.map} +1 -1
- package/dist/{MSurface-BS9l7GDH.cjs → MSurface-CYeVFOw_.cjs} +2 -2
- package/dist/{MSurface-BS9l7GDH.cjs.map → MSurface-CYeVFOw_.cjs.map} +1 -1
- package/dist/{MTag-BwQbycZO.cjs → MTag-BtlOVMRl.cjs} +2 -2
- package/dist/{MTag-BwQbycZO.cjs.map → MTag-BtlOVMRl.cjs.map} +1 -1
- package/dist/{MText-Cjt1oTPr.cjs → MText-j6Zbbj5Y.cjs} +2 -2
- package/dist/{MText-Cjt1oTPr.cjs.map → MText-j6Zbbj5Y.cjs.map} +1 -1
- package/dist/{MTooltip-gpvKWQzD.cjs → MTooltip-BEfO9jTe.cjs} +2 -2
- package/dist/{MTooltip-gpvKWQzD.cjs.map → MTooltip-BEfO9jTe.cjs.map} +1 -1
- package/dist/{MTooltip-Ctyjwxv-.js → MTooltip-BTJkzOah.js} +1 -1
- package/dist/{MTooltip-Ctyjwxv-.js.map → MTooltip-BTJkzOah.js.map} +1 -1
- package/dist/{MTreeView-BS60bIj7.cjs → MTreeView-1IqmVPMv.cjs} +2 -2
- package/dist/{MTreeView-BS60bIj7.cjs.map → MTreeView-1IqmVPMv.cjs.map} +1 -1
- package/dist/{MTreeView-DTsi4bye.js → MTreeView-DQaRF0ty.js} +1 -1
- package/dist/{MTreeView-DTsi4bye.js.map → MTreeView-DQaRF0ty.js.map} +1 -1
- package/dist/{arduino-CA8n1Qq3.cjs → arduino-DdDHMIWB.cjs} +1 -1
- package/dist/{arduino-CA8n1Qq3.cjs.map → arduino-DdDHMIWB.cjs.map} +1 -1
- package/dist/{arduino-WKgN2ikT.js → arduino-UeOrXakL.js} +1 -1
- package/dist/{arduino-WKgN2ikT.js.map → arduino-UeOrXakL.js.map} +1 -1
- package/dist/{bash-DObE5DDq.cjs → bash-B17_F5Sw.cjs} +1 -1
- package/dist/{bash-DObE5DDq.cjs.map → bash-B17_F5Sw.cjs.map} +1 -1
- package/dist/{bash-vBtVVub9.js → bash-CrHemXky.js} +1 -1
- package/dist/{bash-vBtVVub9.js.map → bash-CrHemXky.js.map} +1 -1
- package/dist/{c-7RiNX--m.js → c-D9302r2r.js} +1 -1
- package/dist/{c-7RiNX--m.js.map → c-D9302r2r.js.map} +1 -1
- package/dist/{c-Bb-MtVny.cjs → c-ODLxeMV_.cjs} +1 -1
- package/dist/{c-Bb-MtVny.cjs.map → c-ODLxeMV_.cjs.map} +1 -1
- package/dist/cards-BBYh24NQ.cjs +2 -0
- package/dist/cards-BBYh24NQ.cjs.map +1 -0
- package/dist/{cards-BkRqUJ2V.js → cards-Du2kX3Br.js} +377 -359
- package/dist/{cards-BkRqUJ2V.js.map → cards-Du2kX3Br.js.map} +1 -1
- package/dist/cards.cjs +1 -1
- package/dist/cards.js +2 -2
- package/dist/components/cards/MCardGrid/MCardGrid.d.ts +1 -1
- package/dist/components/cards/MCardGrid/MCardGrid.types.d.ts +16 -0
- package/dist/components/data/MDataTable/MDataTable.d.ts +1 -1
- package/dist/components/data/MDataTable/MDataTable.types.d.ts +16 -0
- package/dist/components/data/useMCardGrid.d.ts +2 -0
- package/dist/components/data/useMTable.d.ts +2 -0
- package/dist/{controls-CSTIosnc.js → controls-Cbv4FmNq.js} +2 -2
- package/dist/{controls-CSTIosnc.js.map → controls-Cbv4FmNq.js.map} +1 -1
- package/dist/{controls-BopaNWb_.cjs → controls-DrdHBBtm.cjs} +2 -2
- package/dist/{controls-BopaNWb_.cjs.map → controls-DrdHBBtm.cjs.map} +1 -1
- package/dist/controls.cjs +1 -1
- package/dist/controls.js +1 -1
- package/dist/{core-o3cw16Db.cjs → core-DBpQf3uY.cjs} +1 -1
- package/dist/{core-o3cw16Db.cjs.map → core-DBpQf3uY.cjs.map} +1 -1
- package/dist/{core-DC6zSfZo.js → core-yRqh2XLu.js} +1 -1
- package/dist/{core-DC6zSfZo.js.map → core-yRqh2XLu.js.map} +1 -1
- package/dist/{cpp-CaNnFjgy.js → cpp-CLYSpJBB.js} +1 -1
- package/dist/{cpp-CaNnFjgy.js.map → cpp-CLYSpJBB.js.map} +1 -1
- package/dist/{cpp-BVKrJvso.cjs → cpp-DuTgLZC1.cjs} +1 -1
- package/dist/{cpp-BVKrJvso.cjs.map → cpp-DuTgLZC1.cjs.map} +1 -1
- package/dist/{css-NqBDP7ZC.js → css-BgGh0eG1.js} +1 -1
- package/dist/{css-NqBDP7ZC.js.map → css-BgGh0eG1.js.map} +1 -1
- package/dist/{css-C2sjPfLl.cjs → css-D0f-qByc.cjs} +1 -1
- package/dist/{css-C2sjPfLl.cjs.map → css-D0f-qByc.cjs.map} +1 -1
- package/dist/data-BgTkBMkP.js +674 -0
- package/dist/data-BgTkBMkP.js.map +1 -0
- package/dist/data-Csb03WFo.cjs +2 -0
- package/dist/data-Csb03WFo.cjs.map +1 -0
- package/dist/data.cjs +1 -1
- package/dist/data.js +2 -2
- package/dist/{display-B7Wh5nnM.js → display-D9H8MP8D.js} +15 -15
- package/dist/{display-B7Wh5nnM.js.map → display-D9H8MP8D.js.map} +1 -1
- package/dist/{display-BgZbdTDd.cjs → display-IMWtdmxS.cjs} +2 -2
- package/dist/{display-BgZbdTDd.cjs.map → display-IMWtdmxS.cjs.map} +1 -1
- package/dist/display.cjs +1 -1
- package/dist/display.js +2 -2
- package/dist/{dropdowns-Befc3lmC.cjs → dropdowns-D_nUdflh.cjs} +2 -2
- package/dist/{dropdowns-Befc3lmC.cjs.map → dropdowns-D_nUdflh.cjs.map} +1 -1
- package/dist/{dropdowns-DGvRs-VE.js → dropdowns-oj4--GbK.js} +3 -3
- package/dist/{dropdowns-DGvRs-VE.js.map → dropdowns-oj4--GbK.js.map} +1 -1
- package/dist/dropdowns.cjs +1 -1
- package/dist/dropdowns.js +1 -1
- package/dist/{feedback-C445FEHb.js → feedback-D7BTlioj.js} +79 -114
- package/dist/feedback-D7BTlioj.js.map +1 -0
- package/dist/feedback-u1ssUT7e.cjs +2 -0
- package/dist/{feedback-C8RfsfYJ.cjs.map → feedback-u1ssUT7e.cjs.map} +1 -1
- package/dist/feedback.cjs +1 -1
- package/dist/feedback.js +5 -4
- package/dist/{form-DSlAmTT1.cjs → form-BWGLrCPi.cjs} +2 -2
- package/dist/{form-DSlAmTT1.cjs.map → form-BWGLrCPi.cjs.map} +1 -1
- package/dist/{form-BWWLNji0.js → form-CgH1hioG.js} +1 -1
- package/dist/{form-BWWLNji0.js.map → form-CgH1hioG.js.map} +1 -1
- package/dist/form.cjs +1 -1
- package/dist/form.js +1 -1
- package/dist/i18n.cjs +1 -1
- package/dist/{icons-DX_cScBq.cjs → icons-BfdQ45F2.cjs} +2 -2
- package/dist/{icons-DX_cScBq.cjs.map → icons-BfdQ45F2.cjs.map} +1 -1
- package/dist/icons.cjs +1 -1
- package/dist/illustrations.cjs +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +31 -30
- package/dist/{inputs-BZxorlLv.js → inputs-DQrjGfwd.js} +2 -2
- package/dist/{inputs-BZxorlLv.js.map → inputs-DQrjGfwd.js.map} +1 -1
- package/dist/{inputs-BiZXyZSE.cjs → inputs-DsFdc0Io.cjs} +2 -2
- package/dist/{inputs-BiZXyZSE.cjs.map → inputs-DsFdc0Io.cjs.map} +1 -1
- package/dist/inputs.cjs +1 -1
- package/dist/inputs.js +4 -4
- package/dist/{javascript-BgwyrBZi.cjs → javascript-CGjvHPZ1.cjs} +1 -1
- package/dist/{javascript-BgwyrBZi.cjs.map → javascript-CGjvHPZ1.cjs.map} +1 -1
- package/dist/{javascript-BltQGQAn.js → javascript-CX3JhsYu.js} +1 -1
- package/dist/{javascript-BltQGQAn.js.map → javascript-CX3JhsYu.js.map} +1 -1
- package/dist/{json-DWmLrT_r.cjs → json-B8svQsK0.cjs} +1 -1
- package/dist/{json-DWmLrT_r.cjs.map → json-B8svQsK0.cjs.map} +1 -1
- package/dist/{json-DbCISZXi.js → json-BPIcVdlp.js} +1 -1
- package/dist/{json-DbCISZXi.js.map → json-BPIcVdlp.js.map} +1 -1
- package/dist/{layout-Ct6ViwDQ.cjs → layout-B_2yBP1M.cjs} +2 -2
- package/dist/{layout-Ct6ViwDQ.cjs.map → layout-B_2yBP1M.cjs.map} +1 -1
- package/dist/{layout-CnEOTJnJ.js → layout-BuvV-N9H.js} +4 -4
- package/dist/{layout-CnEOTJnJ.js.map → layout-BuvV-N9H.js.map} +1 -1
- package/dist/layout.cjs +1 -1
- package/dist/layout.js +5 -5
- package/dist/{licensing-hMT26Vnv.cjs → licensing-DysMClel.cjs} +2 -2
- package/dist/{licensing-hMT26Vnv.cjs.map → licensing-DysMClel.cjs.map} +1 -1
- package/dist/{locale-BNyzqXAU.js → locale-CS1-IY_I.js} +1 -1
- package/dist/{locale-BNyzqXAU.js.map → locale-CS1-IY_I.js.map} +1 -1
- package/dist/{locale-C5ik0c3d.cjs → locale-CbnstsMH.cjs} +2 -2
- package/dist/{locale-C5ik0c3d.cjs.map → locale-CbnstsMH.cjs.map} +1 -1
- package/dist/{media-DxnELIZO.js → media-5IsYrhIQ.js} +1 -1
- package/dist/{media-DxnELIZO.js.map → media-5IsYrhIQ.js.map} +1 -1
- package/dist/{media-DZaGKh5V.cjs → media-Xt6MkVhb.cjs} +2 -2
- package/dist/{media-DZaGKh5V.cjs.map → media-Xt6MkVhb.cjs.map} +1 -1
- package/dist/media.cjs +1 -1
- package/dist/media.js +2 -2
- package/dist/{overlays-WsQqxqk1.cjs → overlays-BAJDNT1m.cjs} +2 -2
- package/dist/{overlays-WsQqxqk1.cjs.map → overlays-BAJDNT1m.cjs.map} +1 -1
- package/dist/{overlays-BfIrSHDo.js → overlays-WA3jnWTG.js} +6 -6
- package/dist/{overlays-BfIrSHDo.js.map → overlays-WA3jnWTG.js.map} +1 -1
- package/dist/overlays.cjs +1 -1
- package/dist/overlays.js +3 -3
- package/dist/{php-dSXzrC_Z.js → php-CBRzjinf.js} +1 -1
- package/dist/{php-dSXzrC_Z.js.map → php-CBRzjinf.js.map} +1 -1
- package/dist/{php-CssmZWrI.cjs → php-CKyelegh.cjs} +1 -1
- package/dist/{php-CssmZWrI.cjs.map → php-CKyelegh.cjs.map} +1 -1
- package/dist/primitives.cjs +1 -1
- package/dist/style-runtime.cjs +1 -1
- package/dist/style-runtime.js +1 -1
- package/dist/styles.css +1 -1
- package/dist/{theme-DltOEniv.cjs → theme-BfNZicWk.cjs} +2 -2
- package/dist/{theme-DltOEniv.cjs.map → theme-BfNZicWk.cjs.map} +1 -1
- package/dist/theme.cjs +1 -1
- package/dist/{typescript-DeaMWtYF.cjs → typescript-D6PDzwkM.cjs} +1 -1
- package/dist/{typescript-DeaMWtYF.cjs.map → typescript-D6PDzwkM.cjs.map} +1 -1
- package/dist/{typescript-CxKdKTKz.js → typescript-Xt3Sotw5.js} +1 -1
- package/dist/{typescript-CxKdKTKz.js.map → typescript-Xt3Sotw5.js.map} +1 -1
- package/dist/{typography-vZwd5E5h.cjs → typography-Dk9kIORI.cjs} +2 -2
- package/dist/{typography-vZwd5E5h.cjs.map → typography-Dk9kIORI.cjs.map} +1 -1
- package/dist/typography.cjs +1 -1
- package/dist/{useGhostText-Nw9XCpWS.cjs → useGhostText-Dmkw3Am8.cjs} +2 -2
- package/dist/{useGhostText-Nw9XCpWS.cjs.map → useGhostText-Dmkw3Am8.cjs.map} +1 -1
- package/dist/{useInteractionEffect-Gs9HBi2T.cjs → useInteractionEffect-DFTdcWHl.cjs} +2 -2
- package/dist/{useInteractionEffect-Gs9HBi2T.cjs.map → useInteractionEffect-DFTdcWHl.cjs.map} +1 -1
- package/dist/{useKeyboardNav-DDN-oeqd.cjs → useKeyboardNav-HVG9JFD2.cjs} +2 -2
- package/dist/{useKeyboardNav-DDN-oeqd.cjs.map → useKeyboardNav-HVG9JFD2.cjs.map} +1 -1
- package/dist/utils.cjs +1 -1
- package/dist/{xml-BUuYcpx2.cjs → xml-4YlaGgjP.cjs} +1 -1
- package/dist/{xml-BUuYcpx2.cjs.map → xml-4YlaGgjP.cjs.map} +1 -1
- package/dist/{xml-BPoVPJlJ.js → xml-CrpWqcDk.js} +1 -1
- package/dist/{xml-BPoVPJlJ.js.map → xml-CrpWqcDk.js.map} +1 -1
- package/package.json +1 -1
- package/dist/cards-DK7j03NN.cjs +0 -2
- package/dist/cards-DK7j03NN.cjs.map +0 -1
- package/dist/data-CjVcevdT.js +0 -654
- package/dist/data-CjVcevdT.js.map +0 -1
- package/dist/data-D8qUIvWv.cjs +0 -2
- package/dist/data-D8qUIvWv.cjs.map +0 -1
- package/dist/feedback-C445FEHb.js.map +0 -1
- package/dist/feedback-C8RfsfYJ.cjs +0 -2
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"data-CjVcevdT.js","names":[],"sources":["../src/components/data/MDataTable/MDataTable.tsx","../src/components/data/MTaskList/MTaskList.tsx","../src/components/data/MWeekGrid/MWeekGrid.tsx","../src/components/data/useMTable.ts","../src/components/data/useMCardGrid.ts"],"sourcesContent":["import {useCallback, useMemo, useRef, useState} from 'react'\nimport type * as React from 'react'\nimport type {MDataTableProps, MDataTableSort} from './MDataTable.types'\nimport {MButton, MCheckbox} from '../../controls'\nimport {MInputSearch} from '../../inputs'\nimport {MPagination} from '../../layout'\nimport {MPopover} from '../../primitives'\nimport {MArrowDownIcon, MArrowUpDownIcon, MArrowUpIcon, MFilterIcon, MSortIcon} from '../../../icons'\nimport {cn} from '../../../utils/cn'\nimport './MDataTable.css'\n\nfunction getRowKey<T>(row: T, index: number, rowKey?: string | ((row: T, index: number) => string)): string {\n if (typeof rowKey === 'function') return rowKey(row, index)\n if (typeof rowKey === 'string') return String((row as any)[rowKey])\n return String((row as any).id ?? index)\n}\n\nfunction getNestedValue(obj: unknown, key: string): unknown {\n const parts = key.split('.')\n let val: unknown = obj\n\n for (const p of parts) {\n if (val == null || typeof val !== 'object') return undefined\n val = (val as Record<string, unknown>)[p]\n }\n\n return val\n}\n\nexport function MDataTable<T = any>({\n columns,\n data,\n rowKey,\n sortable = false,\n filterable = false,\n selectable = false,\n pagination = false,\n pageSize = 10,\n striped = false,\n compact = false,\n stickyHeader = false,\n sort: controlledSort,\n onSortChange,\n search: controlledSearch,\n onSearchChange,\n searchKeys,\n filterKeys = [],\n filters: controlledFilters,\n onFiltersChange,\n sortKeys = [],\n page: controlledPage,\n onPageChange,\n total,\n manualSearch = false,\n manualFilters = false,\n manualSort = false,\n manualPagination = false,\n selectedKeys: controlledSelected,\n onSelectionChange,\n emptyText = 'No data',\n filterPlaceholder = 'Search...',\n className,\n ...rest\n}: MDataTableProps<T>) {\n const [internalSort, setInternalSort] = useState<MDataTableSort | null>(null)\n const [internalSelected, setInternalSelected] = useState<string[]>([])\n const [internalSearch, setInternalSearch] = useState('')\n const [internalFilters, setInternalFilters] = useState<Record<string, string[]>>({})\n const [internalPage, setInternalPage] = useState(1)\n const [filterOpen, setFilterOpen] = useState(false)\n const [sortOpen, setSortOpen] = useState(false)\n const filterBtnRef = useRef<HTMLElement>(null)\n const sortBtnRef = useRef<HTMLElement>(null)\n\n const activeSort = controlledSort !== undefined ? controlledSort : internalSort\n const search = controlledSearch !== undefined ? controlledSearch : internalSearch\n const filters = controlledFilters !== undefined ? controlledFilters : internalFilters\n const page = controlledPage !== undefined ? controlledPage : internalPage\n const selected = controlledSelected ?? internalSelected\n const setSelected = onSelectionChange ?? setInternalSelected\n\n const setSearch = useCallback(\n (next: string) => {\n if (controlledSearch === undefined) setInternalSearch(next)\n if (!manualPagination && controlledPage === undefined) setInternalPage(1)\n onSearchChange?.(next)\n },\n [controlledSearch, controlledPage, manualPagination, onSearchChange]\n )\n\n const setFilters = useCallback(\n (next: Record<string, string[]>) => {\n if (controlledFilters === undefined) setInternalFilters(next)\n if (!manualPagination && controlledPage === undefined) setInternalPage(1)\n onFiltersChange?.(next)\n },\n [controlledFilters, controlledPage, manualPagination, onFiltersChange]\n )\n\n const setSort = useCallback(\n (next: MDataTableSort | null) => {\n if (controlledSort === undefined) setInternalSort(next)\n if (!manualPagination && controlledPage === undefined) setInternalPage(1)\n onSortChange?.(next)\n },\n [controlledSort, controlledPage, manualPagination, onSortChange]\n )\n\n const rootRef = useRef<HTMLDivElement>(null)\n\n const setPage = useCallback(\n (next: number) => {\n if (controlledPage === undefined) setInternalPage(next)\n onPageChange?.(next)\n // After page change, bring the top of the table back into view so\n // the user does not stay scrolled deep into the previous page's rows.\n rootRef.current?.scrollIntoView({block: 'start', behavior: 'smooth'})\n },\n [controlledPage, onPageChange]\n )\n\n function handleSort(key: string) {\n let next: MDataTableSort | null\n\n if (activeSort?.key === key) {\n next = activeSort.dir === 'asc' ? {key, dir: 'desc'} : null\n } else {\n next = {key, dir: 'asc'}\n }\n\n setSort(next)\n }\n\n function toggleFilterValue(key: string, value: string) {\n const current = filters[key] ?? []\n const next = current.includes(value) ? current.filter((item) => item !== value) : [...current, value]\n setFilters({...filters, [key]: next})\n }\n\n const filterOptions = useMemo(() => {\n const map: Record<string, string[]> = {}\n\n for (const filterKey of filterKeys) {\n if (filterKey.options) {\n map[filterKey.key] = filterKey.options\n continue\n }\n\n const values = new Set<string>()\n\n for (const row of data) {\n const value = getNestedValue(row, filterKey.key)\n if (value != null) values.add(String(value))\n }\n\n map[filterKey.key] = Array.from(values).sort()\n }\n\n return map\n }, [data, filterKeys])\n\n const filtered = useMemo(() => {\n let result: T[] = data\n\n if (!manualSearch && filterable && search.trim()) {\n const query = search.toLowerCase()\n\n if (searchKeys && searchKeys.length > 0) {\n result = result.filter((row) =>\n searchKeys.some((key) => {\n const value = getNestedValue(row, key)\n return value != null && String(value).toLowerCase().includes(query)\n })\n )\n } else {\n result = result.filter((row) =>\n columns.some((col) => {\n if (col.filterable === false) return false\n const value = (row as any)[col.key]\n return value != null && String(value).toLowerCase().includes(query)\n })\n )\n }\n }\n\n if (!manualFilters) {\n for (const [key, selectedValues] of Object.entries(filters)) {\n if (!selectedValues || selectedValues.length === 0) continue\n\n result = result.filter((row) => {\n const value = getNestedValue(row, key)\n return value != null && selectedValues.includes(String(value))\n })\n }\n }\n\n return result\n }, [data, manualSearch, manualFilters, filterable, search, searchKeys, columns, filters])\n\n const sorted = useMemo(() => {\n if (manualSort || !activeSort) return filtered\n\n const col = columns.find((item) => item.key === activeSort.key)\n const sortKeyAllowed = sortKeys.some((item) => item.key === activeSort.key)\n if (!col?.sortable && !sortable && !sortKeyAllowed) return filtered\n\n const dir = activeSort.dir === 'asc' ? 1 : -1\n\n return [...filtered].sort((a, b) => {\n const va = (a as any)[activeSort.key]\n const vb = (b as any)[activeSort.key]\n\n if (va == null && vb == null) return 0\n if (va == null) return 1\n if (vb == null) return -1\n if (typeof va === 'number' && typeof vb === 'number') return (va - vb) * dir\n\n return String(va).localeCompare(String(vb)) * dir\n })\n }, [filtered, activeSort, columns, sortable, sortKeys, manualSort])\n\n const totalItems = manualPagination ? (total ?? sorted.length) : sorted.length\n const totalPages = pagination ? Math.max(1, Math.ceil(totalItems / pageSize)) : 1\n const pageData = useMemo(() => {\n if (!pagination || manualPagination) return sorted\n const start = (page - 1) * pageSize\n return sorted.slice(start, start + pageSize)\n }, [sorted, pagination, manualPagination, page, pageSize])\n\n const allKeys = pageData.map((row, index) => getRowKey(row, (page - 1) * pageSize + index, rowKey))\n const allSelected = allKeys.length > 0 && allKeys.every((key) => selected.includes(key))\n\n function toggleAll() {\n if (allSelected) {\n setSelected(selected.filter((key) => !allKeys.includes(key)))\n } else {\n setSelected([...new Set([...selected, ...allKeys])])\n }\n }\n\n function toggleRow(key: string) {\n setSelected(selected.includes(key) ? selected.filter((item) => item !== key) : [...selected, key])\n }\n\n function handleRowClick(key: string, event: React.MouseEvent) {\n const target = event.target as HTMLElement\n if (target.closest('button, a, [data-no-row-select]')) return\n toggleRow(key)\n }\n\n const openFilter = useCallback(() => {\n setFilterOpen((v) => !v)\n setSortOpen(false)\n }, [])\n\n const openSort = useCallback(() => {\n setSortOpen((v) => !v)\n setFilterOpen(false)\n }, [])\n\n const activeSortMenuItem = sortKeys.find((item) => item.key === activeSort?.key)\n const showToolbar = filterable || filterKeys.length > 0 || sortKeys.length > 0\n\n return (\n <div ref={rootRef} className={cn('data-table', className)} {...rest}>\n {showToolbar && (\n <div className=\"toolbar\">\n {filterable && (\n <MInputSearch\n className=\"filter-search\"\n size=\"sm\"\n fullWidth\n placeholder={filterPlaceholder}\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n onClear={() => setSearch('')}\n />\n )}\n\n {(filterKeys.length > 0 || sortKeys.length > 0) && (\n <div className=\"toolbar-actions\">\n {filterKeys.length > 0 && (\n <>\n <MButton\n ref={filterBtnRef}\n variant=\"outlined\"\n size=\"sm\"\n startIcon={<MFilterIcon />}\n aria-expanded={filterOpen}\n onClick={openFilter}\n >\n Filter\n </MButton>\n <MPopover\n open={filterOpen}\n anchorRef={filterBtnRef}\n onClose={() => setFilterOpen(false)}\n placement=\"bottom-end\"\n className=\"data-table-dropdown\"\n >\n {filterKeys.map((filterKey) => (\n <div key={filterKey.key} className=\"data-table-filter-group\">\n <span className=\"data-table-filter-label\">{filterKey.label}</span>\n {(filterOptions[filterKey.key] ?? []).map((option) => (\n <div key={option} className=\"data-table-filter-option\">\n <MCheckbox\n size=\"sm\"\n clickEffect=\"none\"\n checked={filters[filterKey.key]?.includes(option) ?? false}\n onChange={() => toggleFilterValue(filterKey.key, option)}\n label={option}\n />\n </div>\n ))}\n </div>\n ))}\n </MPopover>\n </>\n )}\n\n {sortKeys.length > 0 && (\n <>\n <MButton\n ref={sortBtnRef}\n variant=\"outlined\"\n size=\"sm\"\n startIcon={\n activeSort ? (\n activeSort.dir === 'asc' ? (\n <MArrowUpIcon />\n ) : (\n <MArrowDownIcon />\n )\n ) : (\n <MSortIcon />\n )\n }\n aria-expanded={sortOpen}\n onClick={openSort}\n >\n {activeSortMenuItem ? `Sort: ${activeSortMenuItem.label}` : 'Sort'}\n </MButton>\n <MPopover\n open={sortOpen}\n anchorRef={sortBtnRef}\n onClose={() => setSortOpen(false)}\n placement=\"bottom-end\"\n className=\"data-table-dropdown\"\n >\n {sortKeys.map((sortItem) => (\n <button\n key={sortItem.key}\n type=\"button\"\n className={cn(\n 'data-table-sort-item',\n activeSort?.key === sortItem.key && 'active'\n )}\n onClick={() => {\n if (activeSort?.key === sortItem.key) {\n setSort({\n key: sortItem.key,\n dir: activeSort.dir === 'asc' ? 'desc' : 'asc',\n })\n } else {\n setSort({key: sortItem.key, dir: 'asc'})\n }\n }}\n >\n {sortItem.label}\n {activeSort?.key === sortItem.key && (\n <span className=\"data-table-sort-dir\">\n {activeSort.dir === 'asc' ? (\n <MArrowUpIcon className=\"data-table-sort-icon\" />\n ) : (\n <MArrowDownIcon className=\"data-table-sort-icon\" />\n )}\n </span>\n )}\n </button>\n ))}\n </MPopover>\n </>\n )}\n </div>\n )}\n </div>\n )}\n <div className=\"scroll\">\n <table className={cn('root', striped && 'striped', compact && 'compact')}>\n <thead className={cn('head', stickyHeader && 'sticky')}>\n <tr>\n {selectable && (\n <th className=\"th check-col\">\n <MCheckbox\n checked={allSelected}\n onChange={toggleAll}\n size=\"sm\"\n clickEffect=\"none\"\n />\n </th>\n )}\n {columns.map((col) => {\n const isSortable = col.sortable ?? sortable\n const isSorted = activeSort?.key === col.key\n\n return (\n <th\n key={col.key}\n className={cn(\n 'th',\n isSortable && 'sortable',\n isSorted && `sorted-${activeSort!.dir}`\n )}\n style={{\n width: col.width,\n textAlign: col.align,\n }}\n onClick={isSortable ? () => handleSort(col.key) : undefined}\n >\n <span className=\"th-content\">\n {col.label}\n {isSortable && (\n <span className=\"sort-icon\">\n {isSorted ? (\n activeSort!.dir === 'asc' ? (\n <MArrowUpIcon aria-hidden=\"true\" />\n ) : (\n <MArrowDownIcon aria-hidden=\"true\" />\n )\n ) : (\n <MArrowUpDownIcon aria-hidden=\"true\" />\n )}\n </span>\n )}\n </span>\n </th>\n )\n })}\n </tr>\n </thead>\n <tbody>\n {pageData.length === 0 && (\n <tr>\n <td className=\"empty\" colSpan={columns.length + (selectable ? 1 : 0)}>\n {emptyText}\n </td>\n </tr>\n )}\n {pageData.map((row, index) => {\n const key = getRowKey(row, (page - 1) * pageSize + index, rowKey)\n const isSelected = selected.includes(key)\n\n return (\n <tr\n key={key}\n className={cn('row', isSelected && 'selected', selectable && 'selectable')}\n onClick={selectable ? (event) => handleRowClick(key, event) : undefined}\n >\n {selectable && (\n <td className=\"td check-col\">\n <MCheckbox\n checked={isSelected}\n onChange={() => {}}\n size=\"sm\"\n clickEffect=\"none\"\n />\n </td>\n )}\n {columns.map((col) => (\n <td key={col.key} className=\"td\" style={{textAlign: col.align}}>\n {col.render\n ? col.render((row as any)[col.key], row, (page - 1) * pageSize + index)\n : (row as any)[col.key]}\n </td>\n ))}\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n {pagination && totalPages > 1 && (\n <MPagination total={totalItems} page={page} pageSize={pageSize} onChange={setPage} />\n )}\n </div>\n )\n}\n","import type {MTaskListProps} from './MTaskList.types'\nimport {MCheckbox} from '../../controls'\nimport {cn} from '../../../utils/cn'\nimport './MTaskList.css'\n\n// Render an interactive checklist with toggleable task items.\nexport function MTaskList({\n items,\n color = 'primary',\n size = 'md',\n strikethrough = true,\n onChange,\n className,\n ...rest\n}: MTaskListProps) {\n return (\n <div className={cn('task list', `color-${color}`, `size-${size}`, className)} role=\"list\" {...rest}>\n {items.map((item) => (\n <div\n key={item.id}\n className={cn('task item', item.checked && 'checked', item.disabled && 'disabled')}\n role=\"listitem\"\n onClick={(event) => {\n if (item.disabled) return\n if ((event.target as HTMLElement).closest('.checkbox')) return\n onChange?.(item.id, !(item.checked ?? false))\n }}\n >\n <MCheckbox\n className=\"task control\"\n checked={item.checked ?? false}\n color={color}\n size={size}\n disabled={item.disabled}\n onChange={(e) => onChange?.(item.id, e.target.checked)}\n clickEffect=\"ripple\"\n />\n <span className={cn('task label', item.checked && strikethrough && 'done')}>{item.label}</span>\n </div>\n ))}\n </div>\n )\n}\n","import {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}\n\nexport interface MTableHandle<T> {\n /** Spread directly onto `<MDataTable>` — wires up all manual* + state props. */\n tableProps: MTableProps<T>\n isLoading: boolean\n error: Error | null\n /** Trigger a fresh fetch with current query. */\n refetch: () => void\n}\n\n/**\n * Adapter hook that bridges a fetcher returning `MTableResponse<T>` with\n * `MDataTable` in manual mode. Owns the search / filters / sort / page state,\n * debounces nothing on its own (fetcher decides), and aborts in-flight\n * requests when the query changes. Spread `tableProps` onto your table.\n */\nexport function useMTable<T>(fetcher: MTableFetcher<T>, options: MTableOptions = {}): MTableHandle<T> {\n const {perPage = 20, initialPage = 1, initialSearch = '', initialFilters, initialSort = null, invalidationKey} = options\n\n const [data, setData] = useState<T[]>([])\n const [total, setTotal] = useState(0)\n const [page, setPage] = useState(initialPage)\n const [search, setSearch] = useState(initialSearch)\n const [filters, setFilters] = useState<Record<string, string[]>>(initialFilters ?? {})\n const [sort, setSort] = useState<MDataTableSort | null>(initialSort)\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n const [bump, setBump] = useState(0)\n\n const fetcherRef = useRef(fetcher)\n fetcherRef.current = fetcher\n\n const query = useMemo<MTableQuery>(\n () => ({page, perPage, search, filters, sort}),\n [page, perPage, search, filters, sort],\n )\n\n useEffect(() => {\n const controller = typeof AbortController !== 'undefined' ? new AbortController() : undefined\n let cancelled = false\n setIsLoading(true)\n setError(null)\n fetcherRef\n .current(query, controller?.signal)\n .then((response) => {\n if (cancelled) return\n setData(response.data)\n setTotal(response.meta.total)\n })\n .catch((err: unknown) => {\n if (cancelled) return\n if (err instanceof Error && err.name === 'AbortError') return\n setError(err instanceof Error ? err : new Error(String(err)))\n })\n .finally(() => {\n if (!cancelled) setIsLoading(false)\n })\n return () => {\n cancelled = true\n controller?.abort()\n }\n }, [query, invalidationKey, bump])\n\n // Reset to page 1 when search/filters/sort change.\n const handleSearchChange = useCallback((next: string) => {\n setSearch(next)\n setPage(1)\n }, [])\n const handleFiltersChange = useCallback((next: Record<string, string[]>) => {\n setFilters(next)\n setPage(1)\n }, [])\n const handleSortChange = useCallback((next: MDataTableSort | null) => {\n setSort(next)\n setPage(1)\n }, [])\n\n const refetch = useCallback(() => setBump((value) => value + 1), [])\n\n const tableProps: MTableProps<T> = {\n data,\n total,\n page,\n onPageChange: setPage,\n sort,\n onSortChange: handleSortChange,\n search,\n onSearchChange: handleSearchChange,\n filters,\n onFiltersChange: handleFiltersChange,\n manualSearch: true,\n manualFilters: true,\n manualSort: true,\n manualPagination: true,\n pageSize: perPage,\n }\n\n return {tableProps, isLoading, error, refetch}\n}\n","import {useCallback, useEffect, useMemo, useRef, useState} from 'react'\n\nimport type {MCardGridSort} from '../cards/MCardGrid'\nimport type {MTableQuery, MTableResponse, MTableFetcher, MTableOptions} from './useMTable'\n\n/**\n * Card-grid analog of `useMTable`. Same fetcher-agnostic pattern; returns props\n * spreadable onto `<MCardGrid>` in manual mode. Note that `MCardGridSort` uses\n * `direction` (vs `MDataTableSort.dir`) — convert if you reuse a fetcher.\n */\nexport interface MCardGridProps<T> {\n items: T[]\n total: number\n page: number\n onPageChange: (page: number) => void\n sort: MCardGridSort<T> | null\n onSortChange: (sort: MCardGridSort<T> | null) => void\n search: string\n onSearchChange: (search: string) => void\n filters: Record<string, string[]>\n onFiltersChange: (filters: Record<string, string[]>) => void\n manualSearch: true\n manualFilters: true\n manualSort: true\n manualPagination: true\n pageSize: number\n}\n\nexport interface MCardGridHandle<T> {\n /** Spread directly onto `<MCardGrid>`. */\n gridProps: MCardGridProps<T>\n isLoading: boolean\n error: Error | null\n refetch: () => void\n}\n\nfunction toTableSort<T>(sort: MCardGridSort<T> | null): MTableQuery['sort'] {\n if (!sort) return null\n return {key: sort.key, dir: sort.direction}\n}\n\n/**\n * Adapter hook for `MCardGrid` in manual mode. Owns search / filters / sort /\n * page state, calls a generic `MTableFetcher`, returns `gridProps` to spread.\n */\nexport function useMCardGrid<T>(fetcher: MTableFetcher<T>, options: MTableOptions = {}): MCardGridHandle<T> {\n const {perPage = 12, initialPage = 1, initialSearch = '', initialFilters, initialSort = null, invalidationKey} = options\n\n const [items, setItems] = useState<T[]>([])\n const [total, setTotal] = useState(0)\n const [page, setPage] = useState(initialPage)\n const [search, setSearch] = useState(initialSearch)\n const [filters, setFilters] = useState<Record<string, string[]>>(initialFilters ?? {})\n const [sort, setSort] = useState<MCardGridSort<T> | null>(\n (initialSort as MCardGridSort<T> | null | undefined) ?? null,\n )\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n const [bump, setBump] = useState(0)\n\n const fetcherRef = useRef(fetcher)\n fetcherRef.current = fetcher\n\n const query = useMemo<MTableQuery>(\n () => ({page, perPage, search, filters, sort: toTableSort(sort)}),\n [page, perPage, search, filters, sort],\n )\n\n useEffect(() => {\n const controller = typeof AbortController !== 'undefined' ? new AbortController() : undefined\n let cancelled = false\n setIsLoading(true)\n setError(null)\n fetcherRef\n .current(query, controller?.signal)\n .then((response: MTableResponse<T>) => {\n if (cancelled) return\n setItems(response.data)\n setTotal(response.meta.total)\n })\n .catch((err: unknown) => {\n if (cancelled) return\n if (err instanceof Error && err.name === 'AbortError') return\n setError(err instanceof Error ? err : new Error(String(err)))\n })\n .finally(() => {\n if (!cancelled) setIsLoading(false)\n })\n return () => {\n cancelled = true\n controller?.abort()\n }\n }, [query, invalidationKey, bump])\n\n const handleSearchChange = useCallback((next: string) => {\n setSearch(next)\n setPage(1)\n }, [])\n const handleFiltersChange = useCallback((next: Record<string, string[]>) => {\n setFilters(next)\n setPage(1)\n }, [])\n const handleSortChange = useCallback((next: MCardGridSort<T> | null) => {\n setSort(next)\n setPage(1)\n }, [])\n\n const refetch = useCallback(() => setBump((value) => value + 1), [])\n\n const gridProps: MCardGridProps<T> = {\n items,\n total,\n page,\n onPageChange: setPage,\n sort,\n onSortChange: handleSortChange,\n search,\n onSearchChange: handleSearchChange,\n filters,\n onFiltersChange: handleFiltersChange,\n manualSearch: true,\n manualFilters: true,\n manualSort: true,\n manualPagination: true,\n pageSize: perPage,\n }\n\n return {gridProps, isLoading, error, refetch}\n}\n"],"mappings":"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"}
|
package/dist/data-D8qUIvWv.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require(`./icons-DX_cScBq.cjs`),t=require(`./cn-CU5TNITO.cjs`),n=require(`./MPopover-BVBN5SJi.cjs`),r=require(`./MText-Cjt1oTPr.cjs`),i=require(`./MHeading-CyuxSnhl.cjs`),a=require(`./MSubText-DWNMJupD.cjs`),o=require(`./MButton-B8kFTOPJ.cjs`),s=require(`./MCheckbox-CATWU11D.cjs`),c=require(`./MStack-BdVvJN5S.cjs`),l=require(`./MInputSearch-D9bp1QAz.cjs`),u=require(`./MTooltip-gpvKWQzD.cjs`),d=require(`./MPagination-C2GmGkVA.cjs`);require(`./core-o3cw16Db.cjs`);let f=require(`react`),p=require(`react/jsx-runtime`);function m(e,t,n){return typeof n==`function`?n(e,t):String(typeof n==`string`?e[n]:e.id??t)}function h(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 g({columns:r,data:i,rowKey:a,sortable:c=!1,filterable:u=!1,selectable:g=!1,pagination:_=!1,pageSize:v=10,striped:y=!1,compact:b=!1,stickyHeader:x=!1,sort:S,onSortChange:C,search:w,onSearchChange:T,searchKeys:E,filterKeys:D=[],filters:O,onFiltersChange:k,sortKeys:A=[],page:j,onPageChange:M,total:N,manualSearch:P=!1,manualFilters:F=!1,manualSort:I=!1,manualPagination:L=!1,selectedKeys:ee,onSelectionChange:te,emptyText:ne=`No data`,filterPlaceholder:re=`Search...`,className:R,...z}){let[ie,B]=(0,f.useState)(null),[ae,oe]=(0,f.useState)([]),[se,ce]=(0,f.useState)(``),[le,ue]=(0,f.useState)({}),[de,V]=(0,f.useState)(1),[fe,H]=(0,f.useState)(!1),[pe,U]=(0,f.useState)(!1),me=(0,f.useRef)(null),he=(0,f.useRef)(null),W=S===void 0?ie:S,G=w===void 0?se:w,K=O===void 0?le:O,q=j===void 0?de:j,J=ee??ae,ge=te??oe,_e=(0,f.useCallback)(e=>{w===void 0&&ce(e),!L&&j===void 0&&V(1),T?.(e)},[w,j,L,T]),ve=(0,f.useCallback)(e=>{O===void 0&&ue(e),!L&&j===void 0&&V(1),k?.(e)},[O,j,L,k]),Y=(0,f.useCallback)(e=>{S===void 0&&B(e),!L&&j===void 0&&V(1),C?.(e)},[S,j,L,C]),ye=(0,f.useRef)(null),be=(0,f.useCallback)(e=>{j===void 0&&V(e),M?.(e),ye.current?.scrollIntoView({block:`start`,behavior:`smooth`})},[j,M]);function xe(e){let t;t=W?.key===e?W.dir===`asc`?{key:e,dir:`desc`}:null:{key:e,dir:`asc`},Y(t)}function Se(e,t){let n=K[e]??[],r=n.includes(t)?n.filter(e=>e!==t):[...n,t];ve({...K,[e]:r})}let Ce=(0,f.useMemo)(()=>{let e={};for(let t of D){if(t.options){e[t.key]=t.options;continue}let n=new Set;for(let e of i){let r=h(e,t.key);r!=null&&n.add(String(r))}e[t.key]=Array.from(n).sort()}return e},[i,D]),X=(0,f.useMemo)(()=>{let e=i;if(!P&&u&&G.trim()){let t=G.toLowerCase();e=E&&E.length>0?e.filter(e=>E.some(n=>{let r=h(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(!F)for(let[t,n]of Object.entries(K))!n||n.length===0||(e=e.filter(e=>{let r=h(e,t);return r!=null&&n.includes(String(r))}));return e},[i,P,F,u,G,E,r,K]),Z=(0,f.useMemo)(()=>{if(I||!W)return X;let e=r.find(e=>e.key===W.key),t=A.some(e=>e.key===W.key);if(!e?.sortable&&!c&&!t)return X;let n=W.dir===`asc`?1:-1;return[...X].sort((e,t)=>{let r=e[W.key],i=t[W.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})},[X,W,r,c,A,I]),we=L?N??Z.length:Z.length,Te=_?Math.max(1,Math.ceil(we/v)):1,Q=(0,f.useMemo)(()=>{if(!_||L)return Z;let e=(q-1)*v;return Z.slice(e,e+v)},[Z,_,L,q,v]),$=Q.map((e,t)=>m(e,(q-1)*v+t,a)),Ee=$.length>0&&$.every(e=>J.includes(e));function De(){ge(Ee?J.filter(e=>!$.includes(e)):[...new Set([...J,...$])])}function Oe(e){ge(J.includes(e)?J.filter(t=>t!==e):[...J,e])}function ke(e,t){t.target.closest(`button, a, [data-no-row-select]`)||Oe(e)}let Ae=(0,f.useCallback)(()=>{H(e=>!e),U(!1)},[]),je=(0,f.useCallback)(()=>{U(e=>!e),H(!1)},[]),Me=A.find(e=>e.key===W?.key),Ne=u||D.length>0||A.length>0;return(0,p.jsxs)(`div`,{ref:ye,className:t.t(`data-table`,R),...z,children:[Ne&&(0,p.jsxs)(`div`,{className:`toolbar`,children:[u&&(0,p.jsx)(l.t,{className:`filter-search`,size:`sm`,fullWidth:!0,placeholder:re,value:G,onChange:e=>_e(e.target.value),onClear:()=>_e(``)}),(D.length>0||A.length>0)&&(0,p.jsxs)(`div`,{className:`toolbar-actions`,children:[D.length>0&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(o.t,{ref:me,variant:`outlined`,size:`sm`,startIcon:(0,p.jsx)(e.Jn,{}),"aria-expanded":fe,onClick:Ae,children:`Filter`}),(0,p.jsx)(n.t,{open:fe,anchorRef:me,onClose:()=>H(!1),placement:`bottom-end`,className:`data-table-dropdown`,children:D.map(e=>(0,p.jsxs)(`div`,{className:`data-table-filter-group`,children:[(0,p.jsx)(`span`,{className:`data-table-filter-label`,children:e.label}),(Ce[e.key]??[]).map(t=>(0,p.jsx)(`div`,{className:`data-table-filter-option`,children:(0,p.jsx)(s.t,{size:`sm`,clickEffect:`none`,checked:K[e.key]?.includes(t)??!1,onChange:()=>Se(e.key,t),label:t})},t))]},e.key))})]}),A.length>0&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(o.t,{ref:he,variant:`outlined`,size:`sm`,startIcon:W?W.dir===`asc`?(0,p.jsx)(e.Ri,{}):(0,p.jsx)(e.Li,{}):(0,p.jsx)(e.qn,{}),"aria-expanded":pe,onClick:je,children:Me?`Sort: ${Me.label}`:`Sort`}),(0,p.jsx)(n.t,{open:pe,anchorRef:he,onClose:()=>U(!1),placement:`bottom-end`,className:`data-table-dropdown`,children:A.map(n=>(0,p.jsxs)(`button`,{type:`button`,className:t.t(`data-table-sort-item`,W?.key===n.key&&`active`),onClick:()=>{W?.key===n.key?Y({key:n.key,dir:W.dir===`asc`?`desc`:`asc`}):Y({key:n.key,dir:`asc`})},children:[n.label,W?.key===n.key&&(0,p.jsx)(`span`,{className:`data-table-sort-dir`,children:W.dir===`asc`?(0,p.jsx)(e.Ri,{className:`data-table-sort-icon`}):(0,p.jsx)(e.Li,{className:`data-table-sort-icon`})})]},n.key))})]})]})]}),(0,p.jsx)(`div`,{className:`scroll`,children:(0,p.jsxs)(`table`,{className:t.t(`root`,y&&`striped`,b&&`compact`),children:[(0,p.jsx)(`thead`,{className:t.t(`head`,x&&`sticky`),children:(0,p.jsxs)(`tr`,{children:[g&&(0,p.jsx)(`th`,{className:`th check-col`,children:(0,p.jsx)(s.t,{checked:Ee,onChange:De,size:`sm`,clickEffect:`none`})}),r.map(n=>{let r=n.sortable??c,i=W?.key===n.key;return(0,p.jsx)(`th`,{className:t.t(`th`,r&&`sortable`,i&&`sorted-${W.dir}`),style:{width:n.width,textAlign:n.align},onClick:r?()=>xe(n.key):void 0,children:(0,p.jsxs)(`span`,{className:`th-content`,children:[n.label,r&&(0,p.jsx)(`span`,{className:`sort-icon`,children:i?W.dir===`asc`?(0,p.jsx)(e.Ri,{"aria-hidden":`true`}):(0,p.jsx)(e.Li,{"aria-hidden":`true`}):(0,p.jsx)(e.Ii,{"aria-hidden":`true`})})]})},n.key)})]})}),(0,p.jsxs)(`tbody`,{children:[Q.length===0&&(0,p.jsx)(`tr`,{children:(0,p.jsx)(`td`,{className:`empty`,colSpan:r.length+ +!!g,children:ne})}),Q.map((e,n)=>{let i=m(e,(q-1)*v+n,a),o=J.includes(i);return(0,p.jsxs)(`tr`,{className:t.t(`row`,o&&`selected`,g&&`selectable`),onClick:g?e=>ke(i,e):void 0,children:[g&&(0,p.jsx)(`td`,{className:`td check-col`,children:(0,p.jsx)(s.t,{checked:o,onChange:()=>{},size:`sm`,clickEffect:`none`})}),r.map(t=>(0,p.jsx)(`td`,{className:`td`,style:{textAlign:t.align},children:t.render?t.render(e[t.key],e,(q-1)*v+n):e[t.key]},t.key))]},i)})]})]})}),_&&Te>1&&(0,p.jsx)(d.t,{total:we,page:q,pageSize:v,onChange:be})]})}function _({items:e,color:n=`primary`,size:r=`md`,strikethrough:i=!0,onChange:a,className:o,...c}){return(0,p.jsx)(`div`,{className:t.t(`task list`,`color-${n}`,`size-${r}`,o),role:`list`,...c,children:e.map(e=>(0,p.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,p.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,p.jsx)(`span`,{className:t.t(`task label`,e.checked&&i&&`done`),children:e.label})]},e.id))})}var v=7,y=24,b=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`],x=[`None`,`Few`,`Some`,`Many`];function S(e,t){if(t<=0||e<=0)return 0;let n=e/t;return n>=.66?3:n>=.33?2:1}function C(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 w(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 T(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:b[e],calendarDay:e})):Array.from({length:e},(e,t)=>({label:String(t+1),calendarDay:t}))}function E(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 D(e){return e.value>0?e.value:``}function O(e,t,n){return`${t} ${n} — ${e.value}`}function k({data:e,max:n,days:o=v,slots:s=y,dayLabels:l,slotLabels:d,weekStart:m=1,color:h=`warning`,title:g,description:_,hint:b,peakLabel:k,renderCell:A,renderTooltip:j,onCellClick:M,showLegend:N=!0,bandLabels:P=x,legendUnit:F,rowLabelWidth:I=48,cellHeight:L=24,cellMinWidth:ee=24,className:te,style:ne,...re}){let R=(0,f.useMemo)(()=>C(e,o,s),[e,o,s]),z=(0,f.useMemo)(()=>w(R,n),[R,n]),ie=(0,f.useMemo)(()=>T(o,m,l),[o,m,l]),B=(0,f.useMemo)(()=>E(s,d),[s,d]),ae={gridTemplateColumns:`${I}px repeat(${s}, minmax(${ee}px, 1fr))`},oe={"--mineral-week-grid-color":`var(--mineral-${h})`,...ne},se=g!=null||_!=null||b!=null||k!=null;return(0,p.jsxs)(`div`,{className:t.t(`mineral-week-grid`,te),style:oe,...re,children:[se&&(0,p.jsxs)(c.t,{spacing:`xs`,children:[(0,p.jsxs)(`div`,{className:`mineral-week-grid__title-row`,children:[(0,p.jsxs)(`div`,{className:`mineral-week-grid__title-text`,children:[g!=null&&(typeof g==`string`?(0,p.jsx)(i.t,{level:5,children:g}):g),_!=null&&(typeof _==`string`?(0,p.jsx)(a.t,{tone:`muted`,children:_}):_)]}),k!=null&&(0,p.jsx)(r.t,{size:`sm`,tone:`muted`,children:k})]}),b!=null&&(0,p.jsx)(a.t,{size:`xs`,tone:`muted`,children:b})]}),(0,p.jsxs)(`div`,{className:`mineral-week-grid__matrix`,style:ae,children:[(0,p.jsx)(`div`,{}),B.map((e,t)=>(0,p.jsx)(`div`,{className:`mineral-week-grid__col-header`,children:(0,p.jsx)(a.t,{size:`xs`,tone:`muted`,children:e})},`col-${t}`)),ie.map(({label:e,calendarDay:n},r)=>(0,p.jsxs)(f.Fragment,{children:[(0,p.jsx)(`div`,{className:`mineral-week-grid__row-label`,children:(0,p.jsx)(a.t,{size:`xs`,tone:`muted`,children:e})}),B.map((i,a)=>{let o=R[n]?.[a]??0,s=S(o,z),c={day:n,slot:a,value:o,band:s},l=A?A(c):D(c),d=j?j(c):O(c,e,i),m=(0,p.jsx)(`div`,{className:t.t(`mineral-week-grid__cell`,`mineral-week-grid__cell--band-${s}`,M&&`mineral-week-grid__cell--interactive`,!M&&d!=null&&`mineral-week-grid__cell--tooltip`),style:{height:L},onClick:M?()=>M(c):void 0,role:M?`button`:void 0,tabIndex:M?0:void 0,children:l});return d==null?(0,p.jsx)(f.Fragment,{children:m},`cell-${r}-${a}`):(0,p.jsx)(u.t,{content:d,children:m},`cell-${r}-${a}`)})]},`row-${r}-${n}`))]}),N&&(0,p.jsxs)(`div`,{className:`mineral-week-grid__legend`,children:[(0,p.jsx)(a.t,{size:`xs`,tone:`muted`,children:`Scale: 0 — ${z}${F?` ${F}`:``}`}),(0,p.jsx)(`div`,{className:`mineral-week-grid__legend-bands`,children:[0,1,2,3].map(e=>(0,p.jsxs)(`div`,{className:`mineral-week-grid__legend-band`,children:[(0,p.jsx)(`span`,{className:t.t(`mineral-week-grid__legend-swatch`,`mineral-week-grid__cell--band-${e}`)}),(0,p.jsx)(a.t,{size:`xs`,tone:`muted`,children:P[e]})]},`legend-${e}`))})]})]})}function A(e,t={}){let{perPage:n=20,initialPage:r=1,initialSearch:i=``,initialFilters:a,initialSort:o=null,invalidationKey:s}=t,[c,l]=(0,f.useState)([]),[u,d]=(0,f.useState)(0),[p,m]=(0,f.useState)(r),[h,g]=(0,f.useState)(i),[_,v]=(0,f.useState)(a??{}),[y,b]=(0,f.useState)(o),[x,S]=(0,f.useState)(!1),[C,w]=(0,f.useState)(null),[T,E]=(0,f.useState)(0),D=(0,f.useRef)(e);D.current=e;let O=(0,f.useMemo)(()=>({page:p,perPage:n,search:h,filters:_,sort:y}),[p,n,h,_,y]);(0,f.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,f.useCallback)(e=>{g(e),m(1)},[]),A=(0,f.useCallback)(e=>{v(e),m(1)},[]),j=(0,f.useCallback)(e=>{b(e),m(1)},[]),M=(0,f.useCallback)(()=>E(e=>e+1),[]);return{tableProps:{data:c,total:u,page:p,onPageChange:m,sort:y,onSortChange:j,search:h,onSearchChange:k,filters:_,onFiltersChange:A,manualSearch:!0,manualFilters:!0,manualSort:!0,manualPagination:!0,pageSize:n},isLoading:x,error:C,refetch:M}}function j(e){return e?{key:e.key,dir:e.direction}:null}function M(e,t={}){let{perPage:n=12,initialPage:r=1,initialSearch:i=``,initialFilters:a,initialSort:o=null,invalidationKey:s}=t,[c,l]=(0,f.useState)([]),[u,d]=(0,f.useState)(0),[p,m]=(0,f.useState)(r),[h,g]=(0,f.useState)(i),[_,v]=(0,f.useState)(a??{}),[y,b]=(0,f.useState)(o??null),[x,S]=(0,f.useState)(!1),[C,w]=(0,f.useState)(null),[T,E]=(0,f.useState)(0),D=(0,f.useRef)(e);D.current=e;let O=(0,f.useMemo)(()=>({page:p,perPage:n,search:h,filters:_,sort:j(y)}),[p,n,h,_,y]);(0,f.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,f.useCallback)(e=>{g(e),m(1)},[]),A=(0,f.useCallback)(e=>{v(e),m(1)},[]),M=(0,f.useCallback)(e=>{b(e),m(1)},[]),N=(0,f.useCallback)(()=>E(e=>e+1),[]);return{gridProps:{items:c,total:u,page:p,onPageChange:m,sort:y,onSortChange:M,search:h,onSearchChange:k,filters:_,onFiltersChange:A,manualSearch:!0,manualFilters:!0,manualSort:!0,manualPagination:!0,pageSize:n},isLoading:x,error:C,refetch:N}}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return M}});
|
|
2
|
-
//# sourceMappingURL=data-D8qUIvWv.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"data-D8qUIvWv.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 {MArrowDownIcon, MArrowUpDownIcon, MArrowUpIcon, MFilterIcon, MSortIcon} from '../../../icons'\nimport {cn} from '../../../utils/cn'\nimport './MDataTable.css'\n\nfunction getRowKey<T>(row: T, index: number, rowKey?: string | ((row: T, index: number) => string)): string {\n if (typeof rowKey === 'function') return rowKey(row, index)\n if (typeof rowKey === 'string') return String((row as any)[rowKey])\n return String((row as any).id ?? index)\n}\n\nfunction getNestedValue(obj: unknown, key: string): unknown {\n const parts = key.split('.')\n let val: unknown = obj\n\n for (const p of parts) {\n if (val == null || typeof val !== 'object') return undefined\n val = (val as Record<string, unknown>)[p]\n }\n\n return val\n}\n\nexport function MDataTable<T = any>({\n columns,\n data,\n rowKey,\n sortable = false,\n filterable = false,\n selectable = false,\n pagination = false,\n pageSize = 10,\n striped = false,\n compact = false,\n stickyHeader = false,\n sort: controlledSort,\n onSortChange,\n search: controlledSearch,\n onSearchChange,\n searchKeys,\n filterKeys = [],\n filters: controlledFilters,\n onFiltersChange,\n sortKeys = [],\n page: controlledPage,\n onPageChange,\n total,\n manualSearch = false,\n manualFilters = false,\n manualSort = false,\n manualPagination = false,\n selectedKeys: controlledSelected,\n onSelectionChange,\n emptyText = 'No data',\n filterPlaceholder = 'Search...',\n className,\n ...rest\n}: MDataTableProps<T>) {\n const [internalSort, setInternalSort] = useState<MDataTableSort | null>(null)\n const [internalSelected, setInternalSelected] = useState<string[]>([])\n const [internalSearch, setInternalSearch] = useState('')\n const [internalFilters, setInternalFilters] = useState<Record<string, string[]>>({})\n const [internalPage, setInternalPage] = useState(1)\n const [filterOpen, setFilterOpen] = useState(false)\n const [sortOpen, setSortOpen] = useState(false)\n const filterBtnRef = useRef<HTMLElement>(null)\n const sortBtnRef = useRef<HTMLElement>(null)\n\n const activeSort = controlledSort !== undefined ? controlledSort : internalSort\n const search = controlledSearch !== undefined ? controlledSearch : internalSearch\n const filters = controlledFilters !== undefined ? controlledFilters : internalFilters\n const page = controlledPage !== undefined ? controlledPage : internalPage\n const selected = controlledSelected ?? internalSelected\n const setSelected = onSelectionChange ?? setInternalSelected\n\n const setSearch = useCallback(\n (next: string) => {\n if (controlledSearch === undefined) setInternalSearch(next)\n if (!manualPagination && controlledPage === undefined) setInternalPage(1)\n onSearchChange?.(next)\n },\n [controlledSearch, controlledPage, manualPagination, onSearchChange]\n )\n\n const setFilters = useCallback(\n (next: Record<string, string[]>) => {\n if (controlledFilters === undefined) setInternalFilters(next)\n if (!manualPagination && controlledPage === undefined) setInternalPage(1)\n onFiltersChange?.(next)\n },\n [controlledFilters, controlledPage, manualPagination, onFiltersChange]\n )\n\n const setSort = useCallback(\n (next: MDataTableSort | null) => {\n if (controlledSort === undefined) setInternalSort(next)\n if (!manualPagination && controlledPage === undefined) setInternalPage(1)\n onSortChange?.(next)\n },\n [controlledSort, controlledPage, manualPagination, onSortChange]\n )\n\n const rootRef = useRef<HTMLDivElement>(null)\n\n const setPage = useCallback(\n (next: number) => {\n if (controlledPage === undefined) setInternalPage(next)\n onPageChange?.(next)\n // After page change, bring the top of the table back into view so\n // the user does not stay scrolled deep into the previous page's rows.\n rootRef.current?.scrollIntoView({block: 'start', behavior: 'smooth'})\n },\n [controlledPage, onPageChange]\n )\n\n function handleSort(key: string) {\n let next: MDataTableSort | null\n\n if (activeSort?.key === key) {\n next = activeSort.dir === 'asc' ? {key, dir: 'desc'} : null\n } else {\n next = {key, dir: 'asc'}\n }\n\n setSort(next)\n }\n\n function toggleFilterValue(key: string, value: string) {\n const current = filters[key] ?? []\n const next = current.includes(value) ? current.filter((item) => item !== value) : [...current, value]\n setFilters({...filters, [key]: next})\n }\n\n const filterOptions = useMemo(() => {\n const map: Record<string, string[]> = {}\n\n for (const filterKey of filterKeys) {\n if (filterKey.options) {\n map[filterKey.key] = filterKey.options\n continue\n }\n\n const values = new Set<string>()\n\n for (const row of data) {\n const value = getNestedValue(row, filterKey.key)\n if (value != null) values.add(String(value))\n }\n\n map[filterKey.key] = Array.from(values).sort()\n }\n\n return map\n }, [data, filterKeys])\n\n const filtered = useMemo(() => {\n let result: T[] = data\n\n if (!manualSearch && filterable && search.trim()) {\n const query = search.toLowerCase()\n\n if (searchKeys && searchKeys.length > 0) {\n result = result.filter((row) =>\n searchKeys.some((key) => {\n const value = getNestedValue(row, key)\n return value != null && String(value).toLowerCase().includes(query)\n })\n )\n } else {\n result = result.filter((row) =>\n columns.some((col) => {\n if (col.filterable === false) return false\n const value = (row as any)[col.key]\n return value != null && String(value).toLowerCase().includes(query)\n })\n )\n }\n }\n\n if (!manualFilters) {\n for (const [key, selectedValues] of Object.entries(filters)) {\n if (!selectedValues || selectedValues.length === 0) continue\n\n result = result.filter((row) => {\n const value = getNestedValue(row, key)\n return value != null && selectedValues.includes(String(value))\n })\n }\n }\n\n return result\n }, [data, manualSearch, manualFilters, filterable, search, searchKeys, columns, filters])\n\n const sorted = useMemo(() => {\n if (manualSort || !activeSort) return filtered\n\n const col = columns.find((item) => item.key === activeSort.key)\n const sortKeyAllowed = sortKeys.some((item) => item.key === activeSort.key)\n if (!col?.sortable && !sortable && !sortKeyAllowed) return filtered\n\n const dir = activeSort.dir === 'asc' ? 1 : -1\n\n return [...filtered].sort((a, b) => {\n const va = (a as any)[activeSort.key]\n const vb = (b as any)[activeSort.key]\n\n if (va == null && vb == null) return 0\n if (va == null) return 1\n if (vb == null) return -1\n if (typeof va === 'number' && typeof vb === 'number') return (va - vb) * dir\n\n return String(va).localeCompare(String(vb)) * dir\n })\n }, [filtered, activeSort, columns, sortable, sortKeys, manualSort])\n\n const totalItems = manualPagination ? (total ?? sorted.length) : sorted.length\n const totalPages = pagination ? Math.max(1, Math.ceil(totalItems / pageSize)) : 1\n const pageData = useMemo(() => {\n if (!pagination || manualPagination) return sorted\n const start = (page - 1) * pageSize\n return sorted.slice(start, start + pageSize)\n }, [sorted, pagination, manualPagination, page, pageSize])\n\n const allKeys = pageData.map((row, index) => getRowKey(row, (page - 1) * pageSize + index, rowKey))\n const allSelected = allKeys.length > 0 && allKeys.every((key) => selected.includes(key))\n\n function toggleAll() {\n if (allSelected) {\n setSelected(selected.filter((key) => !allKeys.includes(key)))\n } else {\n setSelected([...new Set([...selected, ...allKeys])])\n }\n }\n\n function toggleRow(key: string) {\n setSelected(selected.includes(key) ? selected.filter((item) => item !== key) : [...selected, key])\n }\n\n function handleRowClick(key: string, event: React.MouseEvent) {\n const target = event.target as HTMLElement\n if (target.closest('button, a, [data-no-row-select]')) return\n toggleRow(key)\n }\n\n const openFilter = useCallback(() => {\n setFilterOpen((v) => !v)\n setSortOpen(false)\n }, [])\n\n const openSort = useCallback(() => {\n setSortOpen((v) => !v)\n setFilterOpen(false)\n }, [])\n\n const activeSortMenuItem = sortKeys.find((item) => item.key === activeSort?.key)\n const showToolbar = filterable || filterKeys.length > 0 || sortKeys.length > 0\n\n return (\n <div ref={rootRef} className={cn('data-table', className)} {...rest}>\n {showToolbar && (\n <div className=\"toolbar\">\n {filterable && (\n <MInputSearch\n className=\"filter-search\"\n size=\"sm\"\n fullWidth\n placeholder={filterPlaceholder}\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n onClear={() => setSearch('')}\n />\n )}\n\n {(filterKeys.length > 0 || sortKeys.length > 0) && (\n <div className=\"toolbar-actions\">\n {filterKeys.length > 0 && (\n <>\n <MButton\n ref={filterBtnRef}\n variant=\"outlined\"\n size=\"sm\"\n startIcon={<MFilterIcon />}\n aria-expanded={filterOpen}\n onClick={openFilter}\n >\n Filter\n </MButton>\n <MPopover\n open={filterOpen}\n anchorRef={filterBtnRef}\n onClose={() => setFilterOpen(false)}\n placement=\"bottom-end\"\n className=\"data-table-dropdown\"\n >\n {filterKeys.map((filterKey) => (\n <div key={filterKey.key} className=\"data-table-filter-group\">\n <span className=\"data-table-filter-label\">{filterKey.label}</span>\n {(filterOptions[filterKey.key] ?? []).map((option) => (\n <div key={option} className=\"data-table-filter-option\">\n <MCheckbox\n size=\"sm\"\n clickEffect=\"none\"\n checked={filters[filterKey.key]?.includes(option) ?? false}\n onChange={() => toggleFilterValue(filterKey.key, option)}\n label={option}\n />\n </div>\n ))}\n </div>\n ))}\n </MPopover>\n </>\n )}\n\n {sortKeys.length > 0 && (\n <>\n <MButton\n ref={sortBtnRef}\n variant=\"outlined\"\n size=\"sm\"\n startIcon={\n activeSort ? (\n activeSort.dir === 'asc' ? (\n <MArrowUpIcon />\n ) : (\n <MArrowDownIcon />\n )\n ) : (\n <MSortIcon />\n )\n }\n aria-expanded={sortOpen}\n onClick={openSort}\n >\n {activeSortMenuItem ? `Sort: ${activeSortMenuItem.label}` : 'Sort'}\n </MButton>\n <MPopover\n open={sortOpen}\n anchorRef={sortBtnRef}\n onClose={() => setSortOpen(false)}\n placement=\"bottom-end\"\n className=\"data-table-dropdown\"\n >\n {sortKeys.map((sortItem) => (\n <button\n key={sortItem.key}\n type=\"button\"\n className={cn(\n 'data-table-sort-item',\n activeSort?.key === sortItem.key && 'active'\n )}\n onClick={() => {\n if (activeSort?.key === sortItem.key) {\n setSort({\n key: sortItem.key,\n dir: activeSort.dir === 'asc' ? 'desc' : 'asc',\n })\n } else {\n setSort({key: sortItem.key, dir: 'asc'})\n }\n }}\n >\n {sortItem.label}\n {activeSort?.key === sortItem.key && (\n <span className=\"data-table-sort-dir\">\n {activeSort.dir === 'asc' ? (\n <MArrowUpIcon className=\"data-table-sort-icon\" />\n ) : (\n <MArrowDownIcon className=\"data-table-sort-icon\" />\n )}\n </span>\n )}\n </button>\n ))}\n </MPopover>\n </>\n )}\n </div>\n )}\n </div>\n )}\n <div className=\"scroll\">\n <table className={cn('root', striped && 'striped', compact && 'compact')}>\n <thead className={cn('head', stickyHeader && 'sticky')}>\n <tr>\n {selectable && (\n <th className=\"th check-col\">\n <MCheckbox\n checked={allSelected}\n onChange={toggleAll}\n size=\"sm\"\n clickEffect=\"none\"\n />\n </th>\n )}\n {columns.map((col) => {\n const isSortable = col.sortable ?? sortable\n const isSorted = activeSort?.key === col.key\n\n return (\n <th\n key={col.key}\n className={cn(\n 'th',\n isSortable && 'sortable',\n isSorted && `sorted-${activeSort!.dir}`\n )}\n style={{\n width: col.width,\n textAlign: col.align,\n }}\n onClick={isSortable ? () => handleSort(col.key) : undefined}\n >\n <span className=\"th-content\">\n {col.label}\n {isSortable && (\n <span className=\"sort-icon\">\n {isSorted ? (\n activeSort!.dir === 'asc' ? (\n <MArrowUpIcon aria-hidden=\"true\" />\n ) : (\n <MArrowDownIcon aria-hidden=\"true\" />\n )\n ) : (\n <MArrowUpDownIcon aria-hidden=\"true\" />\n )}\n </span>\n )}\n </span>\n </th>\n )\n })}\n </tr>\n </thead>\n <tbody>\n {pageData.length === 0 && (\n <tr>\n <td className=\"empty\" colSpan={columns.length + (selectable ? 1 : 0)}>\n {emptyText}\n </td>\n </tr>\n )}\n {pageData.map((row, index) => {\n const key = getRowKey(row, (page - 1) * pageSize + index, rowKey)\n const isSelected = selected.includes(key)\n\n return (\n <tr\n key={key}\n className={cn('row', isSelected && 'selected', selectable && 'selectable')}\n onClick={selectable ? (event) => handleRowClick(key, event) : undefined}\n >\n {selectable && (\n <td className=\"td check-col\">\n <MCheckbox\n checked={isSelected}\n onChange={() => {}}\n size=\"sm\"\n clickEffect=\"none\"\n />\n </td>\n )}\n {columns.map((col) => (\n <td key={col.key} className=\"td\" style={{textAlign: col.align}}>\n {col.render\n ? col.render((row as any)[col.key], row, (page - 1) * pageSize + index)\n : (row as any)[col.key]}\n </td>\n ))}\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n {pagination && totalPages > 1 && (\n <MPagination total={totalItems} page={page} pageSize={pageSize} onChange={setPage} />\n )}\n </div>\n )\n}\n","import type {MTaskListProps} from './MTaskList.types'\nimport {MCheckbox} from '../../controls'\nimport {cn} from '../../../utils/cn'\nimport './MTaskList.css'\n\n// Render an interactive checklist with toggleable task items.\nexport function MTaskList({\n items,\n color = 'primary',\n size = 'md',\n strikethrough = true,\n onChange,\n className,\n ...rest\n}: MTaskListProps) {\n return (\n <div className={cn('task list', `color-${color}`, `size-${size}`, className)} role=\"list\" {...rest}>\n {items.map((item) => (\n <div\n key={item.id}\n className={cn('task item', item.checked && 'checked', item.disabled && 'disabled')}\n role=\"listitem\"\n onClick={(event) => {\n if (item.disabled) return\n if ((event.target as HTMLElement).closest('.checkbox')) return\n onChange?.(item.id, !(item.checked ?? false))\n }}\n >\n <MCheckbox\n className=\"task control\"\n checked={item.checked ?? false}\n color={color}\n size={size}\n disabled={item.disabled}\n onChange={(e) => onChange?.(item.id, e.target.checked)}\n clickEffect=\"ripple\"\n />\n <span className={cn('task label', item.checked && strikethrough && 'done')}>{item.label}</span>\n </div>\n ))}\n </div>\n )\n}\n","import {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}\n\nexport interface MTableHandle<T> {\n /** Spread directly onto `<MDataTable>` — wires up all manual* + state props. */\n tableProps: MTableProps<T>\n isLoading: boolean\n error: Error | null\n /** Trigger a fresh fetch with current query. */\n refetch: () => void\n}\n\n/**\n * Adapter hook that bridges a fetcher returning `MTableResponse<T>` with\n * `MDataTable` in manual mode. Owns the search / filters / sort / page state,\n * debounces nothing on its own (fetcher decides), and aborts in-flight\n * requests when the query changes. Spread `tableProps` onto your table.\n */\nexport function useMTable<T>(fetcher: MTableFetcher<T>, options: MTableOptions = {}): MTableHandle<T> {\n const {perPage = 20, initialPage = 1, initialSearch = '', initialFilters, initialSort = null, invalidationKey} = options\n\n const [data, setData] = useState<T[]>([])\n const [total, setTotal] = useState(0)\n const [page, setPage] = useState(initialPage)\n const [search, setSearch] = useState(initialSearch)\n const [filters, setFilters] = useState<Record<string, string[]>>(initialFilters ?? {})\n const [sort, setSort] = useState<MDataTableSort | null>(initialSort)\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n const [bump, setBump] = useState(0)\n\n const fetcherRef = useRef(fetcher)\n fetcherRef.current = fetcher\n\n const query = useMemo<MTableQuery>(\n () => ({page, perPage, search, filters, sort}),\n [page, perPage, search, filters, sort],\n )\n\n useEffect(() => {\n const controller = typeof AbortController !== 'undefined' ? new AbortController() : undefined\n let cancelled = false\n setIsLoading(true)\n setError(null)\n fetcherRef\n .current(query, controller?.signal)\n .then((response) => {\n if (cancelled) return\n setData(response.data)\n setTotal(response.meta.total)\n })\n .catch((err: unknown) => {\n if (cancelled) return\n if (err instanceof Error && err.name === 'AbortError') return\n setError(err instanceof Error ? err : new Error(String(err)))\n })\n .finally(() => {\n if (!cancelled) setIsLoading(false)\n })\n return () => {\n cancelled = true\n controller?.abort()\n }\n }, [query, invalidationKey, bump])\n\n // Reset to page 1 when search/filters/sort change.\n const handleSearchChange = useCallback((next: string) => {\n setSearch(next)\n setPage(1)\n }, [])\n const handleFiltersChange = useCallback((next: Record<string, string[]>) => {\n setFilters(next)\n setPage(1)\n }, [])\n const handleSortChange = useCallback((next: MDataTableSort | null) => {\n setSort(next)\n setPage(1)\n }, [])\n\n const refetch = useCallback(() => setBump((value) => value + 1), [])\n\n const tableProps: MTableProps<T> = {\n data,\n total,\n page,\n onPageChange: setPage,\n sort,\n onSortChange: handleSortChange,\n search,\n onSearchChange: handleSearchChange,\n filters,\n onFiltersChange: handleFiltersChange,\n manualSearch: true,\n manualFilters: true,\n manualSort: true,\n manualPagination: true,\n pageSize: perPage,\n }\n\n return {tableProps, isLoading, error, refetch}\n}\n","import {useCallback, useEffect, useMemo, useRef, useState} from 'react'\n\nimport type {MCardGridSort} from '../cards/MCardGrid'\nimport type {MTableQuery, MTableResponse, MTableFetcher, MTableOptions} from './useMTable'\n\n/**\n * Card-grid analog of `useMTable`. Same fetcher-agnostic pattern; returns props\n * spreadable onto `<MCardGrid>` in manual mode. Note that `MCardGridSort` uses\n * `direction` (vs `MDataTableSort.dir`) — convert if you reuse a fetcher.\n */\nexport interface MCardGridProps<T> {\n items: T[]\n total: number\n page: number\n onPageChange: (page: number) => void\n sort: MCardGridSort<T> | null\n onSortChange: (sort: MCardGridSort<T> | null) => void\n search: string\n onSearchChange: (search: string) => void\n filters: Record<string, string[]>\n onFiltersChange: (filters: Record<string, string[]>) => void\n manualSearch: true\n manualFilters: true\n manualSort: true\n manualPagination: true\n pageSize: number\n}\n\nexport interface MCardGridHandle<T> {\n /** Spread directly onto `<MCardGrid>`. */\n gridProps: MCardGridProps<T>\n isLoading: boolean\n error: Error | null\n refetch: () => void\n}\n\nfunction toTableSort<T>(sort: MCardGridSort<T> | null): MTableQuery['sort'] {\n if (!sort) return null\n return {key: sort.key, dir: sort.direction}\n}\n\n/**\n * Adapter hook for `MCardGrid` in manual mode. Owns search / filters / sort /\n * page state, calls a generic `MTableFetcher`, returns `gridProps` to spread.\n */\nexport function useMCardGrid<T>(fetcher: MTableFetcher<T>, options: MTableOptions = {}): MCardGridHandle<T> {\n const {perPage = 12, initialPage = 1, initialSearch = '', initialFilters, initialSort = null, invalidationKey} = options\n\n const [items, setItems] = useState<T[]>([])\n const [total, setTotal] = useState(0)\n const [page, setPage] = useState(initialPage)\n const [search, setSearch] = useState(initialSearch)\n const [filters, setFilters] = useState<Record<string, string[]>>(initialFilters ?? {})\n const [sort, setSort] = useState<MCardGridSort<T> | null>(\n (initialSort as MCardGridSort<T> | null | undefined) ?? null,\n )\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n const [bump, setBump] = useState(0)\n\n const fetcherRef = useRef(fetcher)\n fetcherRef.current = fetcher\n\n const query = useMemo<MTableQuery>(\n () => ({page, perPage, search, filters, sort: toTableSort(sort)}),\n [page, perPage, search, filters, sort],\n )\n\n useEffect(() => {\n const controller = typeof AbortController !== 'undefined' ? new AbortController() : undefined\n let cancelled = false\n setIsLoading(true)\n setError(null)\n fetcherRef\n .current(query, controller?.signal)\n .then((response: MTableResponse<T>) => {\n if (cancelled) return\n setItems(response.data)\n setTotal(response.meta.total)\n })\n .catch((err: unknown) => {\n if (cancelled) return\n if (err instanceof Error && err.name === 'AbortError') return\n setError(err instanceof Error ? err : new Error(String(err)))\n })\n .finally(() => {\n if (!cancelled) setIsLoading(false)\n })\n return () => {\n cancelled = true\n controller?.abort()\n }\n }, [query, invalidationKey, bump])\n\n const handleSearchChange = useCallback((next: string) => {\n setSearch(next)\n setPage(1)\n }, [])\n const handleFiltersChange = useCallback((next: Record<string, string[]>) => {\n setFilters(next)\n setPage(1)\n }, [])\n const handleSortChange = useCallback((next: MCardGridSort<T> | null) => {\n setSort(next)\n setPage(1)\n }, [])\n\n const refetch = useCallback(() => setBump((value) => value + 1), [])\n\n const gridProps: MCardGridProps<T> = {\n items,\n total,\n page,\n onPageChange: setPage,\n sort,\n onSortChange: handleSortChange,\n search,\n onSearchChange: handleSearchChange,\n filters,\n onFiltersChange: handleFiltersChange,\n manualSearch: true,\n manualFilters: true,\n manualSort: true,\n manualPagination: true,\n pageSize: perPage,\n }\n\n return {gridProps, isLoading, error, refetch}\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"feedback-C445FEHb.js","names":[],"sources":["../src/components/feedback/statusIcons.tsx","../src/components/feedback/MAlert/MAlert.tsx","../src/components/feedback/MBanner/MBanner.tsx","../src/components/feedback/MLoader/MLoader.tsx","../src/components/feedback/MProgressRing/MProgressRing.tsx","../src/components/feedback/MToast/MToastContext.ts","../src/components/feedback/MToast/MToastItem.tsx","../src/components/feedback/MToast/MToastProvider.tsx"],"sourcesContent":["import type {ReactNode} from 'react'\nimport {\n MBoltIcon,\n MErrorIcon,\n MInfoIcon,\n MMoonIcon,\n MNeutralIcon,\n MSunIcon,\n MSuccessIcon,\n MWarningIcon,\n} from '../../icons'\n\nconst statusIcons: Record<string, ReactNode> = {\n success: <MSuccessIcon />,\n warning: <MWarningIcon />,\n error: <MErrorIcon />,\n info: <MInfoIcon />,\n primary: <MInfoIcon />,\n neutral: <MNeutralIcon />,\n light: <MSunIcon />,\n dark: <MMoonIcon />,\n news: <MBoltIcon />,\n}\n\nexport function getStatusIcon(color?: string) {\n if (!color) {\n return statusIcons.info\n }\n\n return statusIcons[color] ?? statusIcons.info\n}\n","import type {MAlertProps} from './MAlert.types'\nimport {getHiddenProps} from '../../../theme'\nimport {cn} from '../../../utils/cn'\nimport {getStatusIcon} from '../statusIcons'\nimport './MAlert.css'\n\n// Render inline status messaging with optional heading content.\nexport function MAlert({color = 'info', icon = true, title, hidden, className, children, ...rest}: MAlertProps) {\n const iconView = icon === false ? null : icon === true ? getStatusIcon(color) : icon\n\n return (\n <div className={cn('alert', `color-${color}`, className)} role=\"status\" {...getHiddenProps(hidden)} {...rest}>\n {iconView && <span className=\"icon\">{iconView}</span>}\n <div className=\"main\">\n {title && <div className=\"title\">{title}</div>}\n {children && <div className=\"content\">{children}</div>}\n </div>\n </div>\n )\n}\n","import {useState, useRef} from 'react'\nimport type {MBannerProps} from './MBanner.types'\nimport {getHiddenProps} from '../../../theme'\nimport {cn} from '../../../utils/cn'\nimport {MButton} from '../../controls'\nimport {MCloseIcon} from '../../../icons'\nimport './MBanner.css'\n\n// Render a prominent banner for announcements, CTAs or dismissible messages.\nexport function MBanner({\n color = 'primary',\n variant = 'filled',\n icon,\n action,\n hidden,\n dismissible = false,\n onDismiss,\n className,\n children,\n ...rest\n}: MBannerProps) {\n const [visible, setVisible] = useState(true)\n const [dismissing, setDismissing] = useState(false)\n const wrapRef = useRef<HTMLDivElement>(null)\n\n if (!visible) return null\n\n const handleDismiss = () => {\n setDismissing(true)\n const el = wrapRef.current\n if (!el) {\n setVisible(false)\n onDismiss?.()\n return\n }\n const onEnd = () => {\n setVisible(false)\n setDismissing(false)\n onDismiss?.()\n }\n el.addEventListener('transitionend', onEnd, {once: true})\n setTimeout(onEnd, 1000)\n }\n\n return (\n <div ref={wrapRef} className={cn('banner-wrap', dismissing && 'dismissing')} {...getHiddenProps(hidden)}>\n <div className={cn('banner', `color-${color}`, variant, className)} role=\"banner\" {...rest}>\n {icon && <span className=\"banner-icon\">{icon}</span>}\n <div className=\"banner-content\">{children}</div>\n {action && <div className=\"banner-action\">{action}</div>}\n {dismissible && (\n <MButton\n variant=\"link\"\n color=\"neutral\"\n iconOnly\n size=\"sm\"\n className=\"banner-dismiss\"\n onClick={handleDismiss}\n aria-label=\"Dismiss\"\n >\n <MCloseIcon />\n </MButton>\n )}\n </div>\n </div>\n )\n}\n","import type {CSSProperties} from 'react'\nimport type {MSize} from '../../../theme'\nimport {MSpinner} from '../MSpinner'\nimport {MStack} from '../../layout'\nimport {MText} from '../../typography'\nimport {cn} from '../../../utils/cn'\nimport type {MLoaderProps} from './MLoader.types'\nimport './MLoader.css'\n\nconst TEXT_SIZE: Record<MSize, MSize> = {xs: 'xs', sm: 'sm', md: 'md', lg: 'lg', xl: 'xl'}\n\n// Keep loading feedback minimal so apps can reuse it without card or alert chrome.\nexport function MLoader({\n color = 'primary',\n size = 'lg',\n label = 'Loading',\n center = true,\n minHeight = '40vh',\n className,\n style,\n ...rest\n}: MLoaderProps) {\n const inlineStyle: CSSProperties = {\n minHeight: typeof minHeight === 'number' ? `${minHeight}px` : minHeight,\n ...style,\n }\n\n return (\n <div className={cn('loader', center && 'center', className)} style={inlineStyle} {...rest}>\n <MStack align={'center'}>\n <MSpinner size={size} color={color} label={label} />\n <MText tone={'muted'} align={'center'} size={typeof size === 'number' ? undefined : TEXT_SIZE[size]}>\n {label}\n </MText>\n </MStack>\n </div>\n )\n}\n","import type {CSSProperties} from 'react'\nimport type {MProgressRingProps} from './MProgressRing.types'\nimport {cn} from '../../../utils/cn'\nimport './MProgressRing.css'\n\nconst SIZE_PX: Record<string, number> = {xs: 24, sm: 36, md: 56, lg: 88, xl: 128}\nconst DEFAULT_THICKNESS: Record<string, number> = {xs: 2, sm: 3, md: 4, lg: 6, xl: 8}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value))\n}\n\nfunction resolveDiameter(size: MProgressRingProps['size']): number {\n if (typeof size === 'number') return size\n return SIZE_PX[size ?? 'md'] ?? SIZE_PX.md\n}\n\nfunction resolveThickness(thickness: number | undefined, size: MProgressRingProps['size']): number {\n if (typeof thickness === 'number') return thickness\n if (typeof size === 'number') return Math.max(2, Math.round(size / 14))\n return DEFAULT_THICKNESS[size ?? 'md'] ?? DEFAULT_THICKNESS.md\n}\n\n/**\n * Determinate ring progress — 0–100 with optional centered percent label.\n * Visually consistent with `MLoader`/`MSpinner`: same MColor palette, same\n * size tokens (xs/sm/md/lg/xl). Use a number for a custom diameter when the\n * design needs an off-token size.\n */\nexport function MProgressRing({\n value,\n size = 'md',\n color = 'primary',\n thickness,\n showPercent = true,\n label,\n ariaLabel,\n className,\n style,\n ...rest\n}: MProgressRingProps) {\n const clampedValue = clamp(Math.round(value), 0, 100)\n const diameter = resolveDiameter(size)\n const stroke = resolveThickness(thickness, size)\n const radius = (diameter - stroke) / 2\n const circumference = 2 * Math.PI * radius\n const dashOffset = circumference * (1 - clampedValue / 100)\n\n const inlineStyle: CSSProperties = {\n width: `${diameter}px`,\n height: `${diameter}px`,\n ...style,\n }\n\n const sizeClass = typeof size === 'string' ? size : 'custom'\n const accessibleLabel = ariaLabel ?? `Loading ${clampedValue}%`\n const showLabel = label !== undefined ? label !== null : showPercent\n\n return (\n <div\n className={cn('progress-ring', sizeClass, color && `color-${color}`, className)}\n style={inlineStyle}\n role=\"progressbar\"\n aria-valuenow={clampedValue}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={accessibleLabel}\n {...rest}\n >\n <svg className=\"progress-ring-svg\" width={diameter} height={diameter} viewBox={`0 0 ${diameter} ${diameter}`} aria-hidden=\"true\">\n <circle\n className=\"progress-ring-track\"\n cx={diameter / 2}\n cy={diameter / 2}\n r={radius}\n fill=\"none\"\n strokeWidth={stroke}\n />\n <circle\n className=\"progress-ring-indicator\"\n cx={diameter / 2}\n cy={diameter / 2}\n r={radius}\n fill=\"none\"\n strokeWidth={stroke}\n strokeDasharray={circumference}\n strokeDashoffset={dashOffset}\n strokeLinecap=\"round\"\n transform={`rotate(-90 ${diameter / 2} ${diameter / 2})`}\n />\n </svg>\n {showLabel ? (\n <span className=\"progress-ring-label\" aria-hidden=\"true\">\n {label !== undefined ? label : `${clampedValue}%`}\n </span>\n ) : null}\n </div>\n )\n}\n","import {createContext, useContext} from 'react'\nimport type {MToastContext as MToastContextType} from './MToast.types'\n\nconst ToastCtx = createContext<MToastContextType | null>(null)\n\nexport const MToastContextProvider = ToastCtx.Provider\n\nexport function useMToast(): MToastContextType {\n const ctx = useContext(ToastCtx)\n if (!ctx) throw new Error('useMToast must be used inside MToastProvider')\n return ctx\n}\n","import {useEffect, useState} from 'react'\nimport type {MToastEntry} from './MToast.types'\nimport {cn} from '../../../utils/cn'\nimport {MCloseIcon} from '../../../icons'\nimport {MButton} from '../../controls'\nimport {getStatusIcon} from '../statusIcons'\n\n// Single toast notification with enter/exit animation.\nexport function MToastItem({entry, onDismiss}: {entry: MToastEntry; onDismiss: (id: string) => void}) {\n const [exiting, setExiting] = useState(false)\n const duration = entry.duration ?? 4000\n\n useEffect(() => {\n if (duration <= 0) return\n const timer = setTimeout(() => setExiting(true), duration)\n return () => clearTimeout(timer)\n }, [duration])\n\n function handleEnd() {\n if (exiting) onDismiss(entry.id)\n }\n\n const color = entry.color || 'info'\n const icon =\n entry.icon === false\n ? null\n : entry.icon === undefined || entry.icon === true\n ? getStatusIcon(color)\n : entry.icon\n\n return (\n <div className={cn('toast item', `color-${color}`, exiting && 'exit')} role=\"status\" onAnimationEnd={handleEnd}>\n <div className=\"toast body\">\n {icon && <span className=\"toast icon\">{icon}</span>}\n <div className=\"toast content\">\n {entry.title && <div className=\"toast title\">{entry.title}</div>}\n <div className=\"toast message\">{entry.message}</div>\n </div>\n </div>\n <MButton\n variant=\"ghost\"\n color=\"neutral\"\n iconOnly\n size=\"xs\"\n className=\"toast close\"\n onClick={() => setExiting(true)}\n aria-label=\"Close\"\n >\n <MCloseIcon />\n </MButton>\n </div>\n )\n}\n","import {useCallback, useMemo, useRef, useState} from 'react'\nimport {MPortal} from '../../primitives'\nimport {MToastContextProvider, useMToast} from './MToastContext'\nimport {MToastItem} from './MToastItem'\nimport type {MToastEntry, MToastOptions, MToastProviderProps} from './MToast.types'\nimport {cn} from '../../../utils/cn'\nimport './MToast.css'\n\nlet counter = 0\n\n// Global toast container with auto-dismiss and stacking.\nexport function MToastProvider({position = 'top-right', duration = 4000, children}: MToastProviderProps) {\n const [toasts, setToasts] = useState<MToastEntry[]>([])\n const defaultDuration = useRef(duration)\n defaultDuration.current = duration\n\n const dismiss = useCallback((id: string) => {\n setToasts((prev) => prev.filter((t) => t.id !== id))\n }, [])\n\n const toast = useCallback((options: MToastOptions) => {\n const id = `toast-${++counter}`\n const entry: MToastEntry = {\n id,\n ...options,\n duration: options.duration ?? defaultDuration.current,\n }\n setToasts((prev) => [...prev, entry])\n return id\n }, [])\n\n const ctx = useMemo(() => ({toast, dismiss}), [toast, dismiss])\n\n return (\n <MToastContextProvider value={ctx}>\n {children}\n <MPortal>\n <div className={cn('toast container', position)}>\n {toasts.map((entry) => (\n <MToastItem key={entry.id} entry={entry} onDismiss={dismiss} />\n ))}\n </div>\n </MPortal>\n </MToastContextProvider>\n )\n}\n\nexport {useMToast}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require(`./theme-DltOEniv.cjs`),t=require(`./icons-DX_cScBq.cjs`),n=require(`./cn-CU5TNITO.cjs`),r=require(`./MPortal-Djrw2WhD.cjs`),i=require(`./MText-Cjt1oTPr.cjs`),a=require(`./MButton-B8kFTOPJ.cjs`),o=require(`./MStack-BdVvJN5S.cjs`);require(`./core-o3cw16Db.cjs`);let s=require(`react`),c=require(`react/jsx-runtime`);var l={success:(0,c.jsx)(t.yi,{}),warning:(0,c.jsx)(t.Si,{}),error:(0,c.jsx)(t.bi,{}),info:(0,c.jsx)(t.xi,{}),primary:(0,c.jsx)(t.xi,{}),neutral:(0,c.jsx)(t.vi,{}),light:(0,c.jsx)(t.Ln,{}),dark:(0,c.jsx)(t.In,{}),news:(0,c.jsx)(t.Pn,{})};function u(e){return e?l[e]??l.info:l.info}function d({color:t=`info`,icon:r=!0,title:i,hidden:a,className:o,children:s,...l}){let d=r===!1?null:r===!0?u(t):r;return(0,c.jsxs)(`div`,{className:n.t(`alert`,`color-${t}`,o),role:`status`,...e.r(a),...l,children:[d&&(0,c.jsx)(`span`,{className:`icon`,children:d}),(0,c.jsxs)(`div`,{className:`main`,children:[i&&(0,c.jsx)(`div`,{className:`title`,children:i}),s&&(0,c.jsx)(`div`,{className:`content`,children:s})]})]})}function f({color:r=`primary`,variant:i=`filled`,icon:o,action:l,hidden:u,dismissible:d=!1,onDismiss:f,className:p,children:m,...h}){let[g,_]=(0,s.useState)(!0),[v,y]=(0,s.useState)(!1),b=(0,s.useRef)(null);if(!g)return null;let x=()=>{y(!0);let e=b.current;if(!e){_(!1),f?.();return}let t=()=>{_(!1),y(!1),f?.()};e.addEventListener(`transitionend`,t,{once:!0}),setTimeout(t,1e3)};return(0,c.jsx)(`div`,{ref:b,className:n.t(`banner-wrap`,v&&`dismissing`),...e.r(u),children:(0,c.jsxs)(`div`,{className:n.t(`banner`,`color-${r}`,i,p),role:`banner`,...h,children:[o&&(0,c.jsx)(`span`,{className:`banner-icon`,children:o}),(0,c.jsx)(`div`,{className:`banner-content`,children:m}),l&&(0,c.jsx)(`div`,{className:`banner-action`,children:l}),d&&(0,c.jsx)(a.t,{variant:`link`,color:`neutral`,iconOnly:!0,size:`sm`,className:`banner-dismiss`,onClick:x,"aria-label":`Dismiss`,children:(0,c.jsx)(t.Ki,{})})]})})}var p={xs:`xs`,sm:`sm`,md:`md`,lg:`lg`,xl:`xl`};function m({color:e=`primary`,size:t=`lg`,label:r=`Loading`,center:s=!0,minHeight:l=`40vh`,className:u,style:d,...f}){let m={minHeight:typeof l==`number`?`${l}px`:l,...d};return(0,c.jsx)(`div`,{className:n.t(`loader`,s&&`center`,u),style:m,...f,children:(0,c.jsxs)(o.t,{align:`center`,children:[(0,c.jsx)(a.r,{size:t,color:e,label:r}),(0,c.jsx)(i.t,{tone:`muted`,align:`center`,size:typeof t==`number`?void 0:p[t],children:r})]})})}var h={xs:24,sm:36,md:56,lg:88,xl:128},g={xs:2,sm:3,md:4,lg:6,xl:8};function _(e,t,n){return Math.max(t,Math.min(n,e))}function v(e){return typeof e==`number`?e:h[e??`md`]??h.md}function y(e,t){return typeof e==`number`?e:typeof t==`number`?Math.max(2,Math.round(t/14)):g[t??`md`]??g.md}function b({value:e,size:t=`md`,color:r=`primary`,thickness:i,showPercent:a=!0,label:o,ariaLabel:s,className:l,style:u,...d}){let f=_(Math.round(e),0,100),p=v(t),m=y(i,t),h=(p-m)/2,g=2*Math.PI*h,b=g*(1-f/100),x={width:`${p}px`,height:`${p}px`,...u},S=typeof t==`string`?t:`custom`,C=s??`Loading ${f}%`,w=o===void 0?a:o!==null;return(0,c.jsxs)(`div`,{className:n.t(`progress-ring`,S,r&&`color-${r}`,l),style:x,role:`progressbar`,"aria-valuenow":f,"aria-valuemin":0,"aria-valuemax":100,"aria-label":C,...d,children:[(0,c.jsxs)(`svg`,{className:`progress-ring-svg`,width:p,height:p,viewBox:`0 0 ${p} ${p}`,"aria-hidden":`true`,children:[(0,c.jsx)(`circle`,{className:`progress-ring-track`,cx:p/2,cy:p/2,r:h,fill:`none`,strokeWidth:m}),(0,c.jsx)(`circle`,{className:`progress-ring-indicator`,cx:p/2,cy:p/2,r:h,fill:`none`,strokeWidth:m,strokeDasharray:g,strokeDashoffset:b,strokeLinecap:`round`,transform:`rotate(-90 ${p/2} ${p/2})`})]}),w?(0,c.jsx)(`span`,{className:`progress-ring-label`,"aria-hidden":`true`,children:o===void 0?`${f}%`:o}):null]})}var x=(0,s.createContext)(null),S=x.Provider;function C(){let e=(0,s.useContext)(x);if(!e)throw Error(`useMToast must be used inside MToastProvider`);return e}function w({entry:e,onDismiss:r}){let[i,o]=(0,s.useState)(!1),l=e.duration??4e3;(0,s.useEffect)(()=>{if(l<=0)return;let e=setTimeout(()=>o(!0),l);return()=>clearTimeout(e)},[l]);function d(){i&&r(e.id)}let f=e.color||`info`,p=e.icon===!1?null:e.icon===void 0||e.icon===!0?u(f):e.icon;return(0,c.jsxs)(`div`,{className:n.t(`toast item`,`color-${f}`,i&&`exit`),role:`status`,onAnimationEnd:d,children:[(0,c.jsxs)(`div`,{className:`toast body`,children:[p&&(0,c.jsx)(`span`,{className:`toast icon`,children:p}),(0,c.jsxs)(`div`,{className:`toast content`,children:[e.title&&(0,c.jsx)(`div`,{className:`toast title`,children:e.title}),(0,c.jsx)(`div`,{className:`toast message`,children:e.message})]})]}),(0,c.jsx)(a.t,{variant:`ghost`,color:`neutral`,iconOnly:!0,size:`xs`,className:`toast close`,onClick:()=>o(!0),"aria-label":`Close`,children:(0,c.jsx)(t.Ki,{})})]})}var T=0;function E({position:e=`top-right`,duration:t=4e3,children:i}){let[a,o]=(0,s.useState)([]),l=(0,s.useRef)(t);l.current=t;let u=(0,s.useCallback)(e=>{o(t=>t.filter(t=>t.id!==e))},[]),d=(0,s.useCallback)(e=>{let t=`toast-${++T}`,n={id:t,...e,duration:e.duration??l.current};return o(e=>[...e,n]),t},[]);return(0,c.jsxs)(S,{value:(0,s.useMemo)(()=>({toast:d,dismiss:u}),[d,u]),children:[i,(0,c.jsx)(r.t,{children:(0,c.jsx)(`div`,{className:n.t(`toast container`,e),children:a.map(e=>(0,c.jsx)(w,{entry:e,onDismiss:u},e.id))})})]})}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return E}});
|
|
2
|
-
//# sourceMappingURL=feedback-C8RfsfYJ.cjs.map
|