@banzamel/mineralui 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/MAvatar-B4Y9P5ua.js +57 -0
- package/dist/MAvatar-B4Y9P5ua.js.map +1 -0
- package/dist/MAvatar-D4ZC9wml.cjs +2 -0
- package/dist/MAvatar-D4ZC9wml.cjs.map +1 -0
- package/dist/MBadge-BaeeIRhu.js +19 -0
- package/dist/MBadge-BaeeIRhu.js.map +1 -0
- package/dist/MBadge-DJuqtMP7.cjs +2 -0
- package/dist/MBadge-DJuqtMP7.cjs.map +1 -0
- package/dist/MButton-Rg85cgO1.cjs +2 -0
- package/dist/{MButton-B8rXmFX9.cjs.map → MButton-Rg85cgO1.cjs.map} +1 -1
- package/dist/MButton-pSNx-6UK.js +113 -0
- package/dist/{MButton-BmTDe5Oa.js.map → MButton-pSNx-6UK.js.map} +1 -1
- package/dist/{MDataTable-Cqwkiq7A.js → MDataTable-D5SnGm3D.js} +3 -3
- package/dist/{MDataTable-Cqwkiq7A.js.map → MDataTable-D5SnGm3D.js.map} +1 -1
- package/dist/{MDataTable-BI7wFZYN.cjs → MDataTable-_afEvx2S.cjs} +2 -2
- package/dist/{MDataTable-BI7wFZYN.cjs.map → MDataTable-_afEvx2S.cjs.map} +1 -1
- package/dist/{MDrawer-CSvjLrhB.cjs → MDrawer-2NDNRU77.cjs} +2 -2
- package/dist/{MDrawer-CSvjLrhB.cjs.map → MDrawer-2NDNRU77.cjs.map} +1 -1
- package/dist/{MDrawer-DXHtAckQ.js → MDrawer-CHvOVWPw.js} +2 -2
- package/dist/{MDrawer-DXHtAckQ.js.map → MDrawer-CHvOVWPw.js.map} +1 -1
- package/dist/MHeading-C5s-kb2D.js +21 -0
- package/dist/MHeading-C5s-kb2D.js.map +1 -0
- package/dist/MHeading-CvAYmqMN.cjs +2 -0
- package/dist/MHeading-CvAYmqMN.cjs.map +1 -0
- package/dist/MImage-DqAx0_B0.cjs +2 -0
- package/dist/MImage-DqAx0_B0.cjs.map +1 -0
- package/dist/MImage-F34N1nhB.js +53 -0
- package/dist/MImage-F34N1nhB.js.map +1 -0
- package/dist/MInline-BKY7arDg.js +41 -0
- package/dist/MInline-BKY7arDg.js.map +1 -0
- package/dist/MInline-FgdIt6kv.cjs +2 -0
- package/dist/MInline-FgdIt6kv.cjs.map +1 -0
- package/dist/{MInput-W7DJQ_ng.cjs → MInput-C_Prnehc.cjs} +2 -2
- package/dist/{MInput-W7DJQ_ng.cjs.map → MInput-C_Prnehc.cjs.map} +1 -1
- package/dist/{MInput-BSaKw0Uc.js → MInput-DI066RK9.js} +2 -2
- package/dist/{MInput-BSaKw0Uc.js.map → MInput-DI066RK9.js.map} +1 -1
- package/dist/{MInputCVC-DH_bjV5R.cjs → MInputCVC-B75iBIRt.cjs} +2 -2
- package/dist/{MInputCVC-DH_bjV5R.cjs.map → MInputCVC-B75iBIRt.cjs.map} +1 -1
- package/dist/{MInputCVC-Dqbl1zG9.js → MInputCVC-BlBZjRft.js} +2 -2
- package/dist/{MInputCVC-Dqbl1zG9.js.map → MInputCVC-BlBZjRft.js.map} +1 -1
- package/dist/{MInputSearch-C7betxTa.cjs → MInputSearch-BKQnKS-9.cjs} +2 -2
- package/dist/{MInputSearch-C7betxTa.cjs.map → MInputSearch-BKQnKS-9.cjs.map} +1 -1
- package/dist/{MInputSearch-CH5ZcjLq.js → MInputSearch-CBsBsuqu.js} +2 -2
- package/dist/{MInputSearch-CH5ZcjLq.js.map → MInputSearch-CBsBsuqu.js.map} +1 -1
- package/dist/MLink-BgYBHhce.js +31 -0
- package/dist/{MLink-ODytrwne.js.map → MLink-BgYBHhce.js.map} +1 -1
- package/dist/MLink-DmB3rcWB.cjs +2 -0
- package/dist/{MLink-DHryXq_D.cjs.map → MLink-DmB3rcWB.cjs.map} +1 -1
- package/dist/{MModal-pMcPs3pw.cjs → MModal-BaA098nr.cjs} +2 -2
- package/dist/{MModal-pMcPs3pw.cjs.map → MModal-BaA098nr.cjs.map} +1 -1
- package/dist/{MModal-DShADuLw.js → MModal-DXZ2SrJt.js} +2 -2
- package/dist/{MModal-DShADuLw.js.map → MModal-DXZ2SrJt.js.map} +1 -1
- package/dist/{MPagination-B7aho7rQ.js → MPagination-BFI_z3y6.js} +2 -2
- package/dist/{MPagination-B7aho7rQ.js.map → MPagination-BFI_z3y6.js.map} +1 -1
- package/dist/{MPagination-BWHAVgWN.cjs → MPagination-C6hnhbTp.cjs} +2 -2
- package/dist/{MPagination-BWHAVgWN.cjs.map → MPagination-C6hnhbTp.cjs.map} +1 -1
- package/dist/{MQrCode-6Cz9B7Qy.js → MQrCode-DfZwkhZV.js} +2 -2
- package/dist/{MQrCode-6Cz9B7Qy.js.map → MQrCode-DfZwkhZV.js.map} +1 -1
- package/dist/{MQrCode-Bp2CWpmX.cjs → MQrCode-L0trT6n3.cjs} +2 -2
- package/dist/{MQrCode-Bp2CWpmX.cjs.map → MQrCode-L0trT6n3.cjs.map} +1 -1
- package/dist/{MSkeleton-BfRBJ6ku.cjs → MSkeleton-BEdflu0F.cjs} +2 -2
- package/dist/{MSkeleton-BfRBJ6ku.cjs.map → MSkeleton-BEdflu0F.cjs.map} +1 -1
- package/dist/{MSkeleton-CauCfkzj.js → MSkeleton-DX9gJ311.js} +2 -2
- package/dist/{MSkeleton-CauCfkzj.js.map → MSkeleton-DX9gJ311.js.map} +1 -1
- package/dist/MStack-BgwBqm-V.cjs +2 -0
- package/dist/MStack-BgwBqm-V.cjs.map +1 -0
- package/dist/MStack-Dk0GNVBT.js +41 -0
- package/dist/MStack-Dk0GNVBT.js.map +1 -0
- package/dist/MSubText-D8VxE877.cjs +2 -0
- package/dist/MSubText-D8VxE877.cjs.map +1 -0
- package/dist/MSubText-DwNeDGYg.js +17 -0
- package/dist/MSubText-DwNeDGYg.js.map +1 -0
- package/dist/MSurface-CFbX5C63.cjs +2 -0
- package/dist/MSurface-CFbX5C63.cjs.map +1 -0
- package/dist/MSurface-COlEjDyo.js +41 -0
- package/dist/MSurface-COlEjDyo.js.map +1 -0
- package/dist/MTag-DZjcHYn0.cjs +2 -0
- package/dist/MTag-DZjcHYn0.cjs.map +1 -0
- package/dist/MTag-wsCYRndK.js +39 -0
- package/dist/MTag-wsCYRndK.js.map +1 -0
- package/dist/MText-CexZuJgV.js +45 -0
- package/dist/MText-CexZuJgV.js.map +1 -0
- package/dist/MText-YIBipYLh.cjs +2 -0
- package/dist/MText-YIBipYLh.cjs.map +1 -0
- package/dist/{cards-BE77zKTI.js → cards-BguCbFp7.js} +10 -10
- package/dist/{cards-BE77zKTI.js.map → cards-BguCbFp7.js.map} +1 -1
- package/dist/{cards-BINs-dmS.cjs → cards-DgOG2sWk.cjs} +2 -2
- package/dist/{cards-BINs-dmS.cjs.map → cards-DgOG2sWk.cjs.map} +1 -1
- package/dist/cards.cjs +1 -1
- package/dist/cards.js +2 -2
- package/dist/components/controls/MButton/MButton.types.d.ts +2 -2
- package/dist/components/feedback/MAlert/MAlert.d.ts +1 -1
- package/dist/components/feedback/MAlert/MAlert.types.d.ts +2 -2
- package/dist/components/feedback/MBadge/MBadge.d.ts +1 -1
- package/dist/components/feedback/MBadge/MBadge.types.d.ts +2 -2
- package/dist/components/feedback/MBanner/MBanner.d.ts +1 -1
- package/dist/components/feedback/MBanner/MBanner.types.d.ts +2 -2
- package/dist/components/feedback/MTag/MTag.d.ts +1 -1
- package/dist/components/feedback/MTag/MTag.types.d.ts +2 -2
- package/dist/components/layout/MContainer/MContainer.d.ts +1 -1
- package/dist/components/layout/MContainer/MContainer.types.d.ts +2 -1
- package/dist/components/layout/MDivider/MDivider.d.ts +1 -1
- package/dist/components/layout/MDivider/MDivider.types.d.ts +2 -1
- package/dist/components/layout/MFooter/MFooter.d.ts +1 -1
- package/dist/components/layout/MFooter/MFooter.types.d.ts +2 -1
- package/dist/components/layout/MGrid/MGrid.d.ts +2 -2
- package/dist/components/layout/MGrid/MGrid.types.d.ts +4 -2
- package/dist/components/layout/MHeader/MHeader.d.ts +1 -1
- package/dist/components/layout/MHeader/MHeader.types.d.ts +2 -1
- package/dist/components/layout/MInline/MInline.d.ts +1 -1
- package/dist/components/layout/MInline/MInline.types.d.ts +2 -1
- package/dist/components/layout/MNavbar/MNavbar.d.ts +1 -1
- package/dist/components/layout/MNavbar/MNavbar.types.d.ts +2 -1
- package/dist/components/layout/MNavs/index.d.ts +1 -1
- package/dist/components/layout/MSection/MSection.d.ts +1 -1
- package/dist/components/layout/MSection/MSection.types.d.ts +2 -1
- package/dist/components/layout/MStack/MStack.d.ts +1 -1
- package/dist/components/layout/MStack/MStack.types.d.ts +2 -1
- package/dist/components/layout/MSurface/MSurface.d.ts +1 -1
- package/dist/components/layout/MSurface/MSurface.types.d.ts +2 -1
- package/dist/components/layout/MTopbar/MTopbar.d.ts +1 -1
- package/dist/components/layout/MTopbar/MTopbar.types.d.ts +2 -2
- package/dist/components/media/MAvatar/MAvatar.d.ts +1 -1
- package/dist/components/media/MAvatar/MAvatar.types.d.ts +2 -2
- package/dist/components/media/MAvatarStack/MAvatarStack.d.ts +1 -1
- package/dist/components/media/MAvatarStack/MAvatarStack.types.d.ts +2 -2
- package/dist/components/media/MImage/MImage.d.ts +1 -1
- package/dist/components/media/MImage/MImage.types.d.ts +2 -1
- package/dist/components/typography/MHeading/MHeading.d.ts +563 -2
- package/dist/components/typography/MHeading/MHeading.types.d.ts +2 -2
- package/dist/components/typography/MLink/MLink.types.d.ts +2 -1
- package/dist/components/typography/MSubText/MSubText.d.ts +1 -1
- package/dist/components/typography/MSubText/MSubText.types.d.ts +2 -2
- package/dist/components/typography/MText/MText.d.ts +1 -1
- package/dist/components/typography/MText/MText.types.d.ts +2 -2
- package/dist/controls-CN5d1q6e.cjs +2 -0
- package/dist/{controls-DwL1-nVC.cjs.map → controls-CN5d1q6e.cjs.map} +1 -1
- package/dist/{controls-BMwQ3C1R.js → controls-CVdInuMI.js} +145 -143
- package/dist/{controls-BMwQ3C1R.js.map → controls-CVdInuMI.js.map} +1 -1
- package/dist/controls.cjs +1 -1
- package/dist/controls.js +2 -2
- package/dist/data-BZ3Uio4Z.cjs +2 -0
- package/dist/data-BZ3Uio4Z.cjs.map +1 -0
- package/dist/{data-s8Hkht1B.js → data-BpGAUxCL.js} +751 -750
- package/dist/data-BpGAUxCL.js.map +1 -0
- package/dist/data.cjs +1 -1
- package/dist/data.js +2 -2
- package/dist/{display-B0lpgApV.cjs → display-CCG1eb0m.cjs} +2 -2
- package/dist/{display-B0lpgApV.cjs.map → display-CCG1eb0m.cjs.map} +1 -1
- package/dist/{display-DuBRiEKr.js → display-gwrOWH2c.js} +3 -3
- package/dist/{display-DuBRiEKr.js.map → display-gwrOWH2c.js.map} +1 -1
- package/dist/display.cjs +1 -1
- package/dist/display.js +2 -2
- package/dist/{dropdowns-BcVrUMPE.js → dropdowns-CNKEy6vf.js} +4 -4
- package/dist/{dropdowns-BcVrUMPE.js.map → dropdowns-CNKEy6vf.js.map} +1 -1
- package/dist/{dropdowns-CK-oxd62.cjs → dropdowns-HY56LZkp.cjs} +2 -2
- package/dist/{dropdowns-CK-oxd62.cjs.map → dropdowns-HY56LZkp.cjs.map} +1 -1
- package/dist/dropdowns.cjs +1 -1
- package/dist/dropdowns.js +1 -1
- package/dist/{feedback-D3LLKNlY.js → feedback-BfSdnvUS.js} +304 -301
- package/dist/feedback-BfSdnvUS.js.map +1 -0
- package/dist/feedback-DkQNQVdK.cjs +2 -0
- package/dist/feedback-DkQNQVdK.cjs.map +1 -0
- package/dist/feedback.cjs +1 -1
- package/dist/feedback.js +5 -5
- package/dist/index.cjs +1 -1
- package/dist/index.js +59 -59
- package/dist/{inputs-bCxSLz-U.js → inputs-BO7bjvyf.js} +3 -3
- package/dist/{inputs-bCxSLz-U.js.map → inputs-BO7bjvyf.js.map} +1 -1
- package/dist/{inputs-Dcj6C_Fn.cjs → inputs-vov7Kj6q.cjs} +2 -2
- package/dist/{inputs-Dcj6C_Fn.cjs.map → inputs-vov7Kj6q.cjs.map} +1 -1
- package/dist/inputs.cjs +1 -1
- package/dist/inputs.js +4 -4
- package/dist/layout-BvKpFxol.js +905 -0
- package/dist/layout-BvKpFxol.js.map +1 -0
- package/dist/layout-TFV-1uoQ.cjs +2 -0
- package/dist/layout-TFV-1uoQ.cjs.map +1 -0
- package/dist/layout.cjs +1 -1
- package/dist/layout.js +5 -5
- package/dist/media-BhRjHzpA.cjs +2 -0
- package/dist/{media-D5YGOTm7.cjs.map → media-BhRjHzpA.cjs.map} +1 -1
- package/dist/{media-8aMOtckF.js → media-BuIEAgV-.js} +145 -143
- package/dist/{media-8aMOtckF.js.map → media-BuIEAgV-.js.map} +1 -1
- package/dist/media.cjs +1 -1
- package/dist/media.js +3 -3
- package/dist/{overlays-DCj-oV2H.cjs → overlays-CjEh_HWn.cjs} +2 -2
- package/dist/{overlays-DCj-oV2H.cjs.map → overlays-CjEh_HWn.cjs.map} +1 -1
- package/dist/{overlays-gjg00CAf.js → overlays-D1SAF1F_.js} +3 -3
- package/dist/{overlays-gjg00CAf.js.map → overlays-D1SAF1F_.js.map} +1 -1
- package/dist/overlays.cjs +1 -1
- package/dist/overlays.js +3 -3
- package/dist/style-runtime.cjs +1 -1
- package/dist/style-runtime.js +1 -1
- package/dist/styles.css +1 -1
- package/dist/theme/MTheme.types.d.ts +5 -0
- package/dist/theme/index.d.ts +2 -1
- package/dist/theme/responsive.d.ts +18 -0
- package/dist/{theme-DLorpkJc.cjs → theme-CyIOdO9W.cjs} +2 -2
- package/dist/theme-CyIOdO9W.cjs.map +1 -0
- package/dist/{theme-BV4qkzZU.js → theme-Dl4EpdnW.js} +14 -2
- package/dist/theme-Dl4EpdnW.js.map +1 -0
- package/dist/theme.cjs +1 -1
- package/dist/theme.js +2 -2
- package/dist/{typography-DKdr1Tds.js → typography-BrIbvz08.js} +2 -2
- package/dist/{typography-DKdr1Tds.js.map → typography-BrIbvz08.js.map} +1 -1
- package/dist/{typography-qbFGv1gA.cjs → typography-DHjL4YTH.cjs} +2 -2
- package/dist/{typography-qbFGv1gA.cjs.map → typography-DHjL4YTH.cjs.map} +1 -1
- package/dist/typography.cjs +1 -1
- package/dist/typography.js +5 -5
- package/package.json +1 -1
- package/dist/MAvatar-BoO51a6m.js +0 -55
- package/dist/MAvatar-BoO51a6m.js.map +0 -1
- package/dist/MAvatar-DJKtca9j.cjs +0 -2
- package/dist/MAvatar-DJKtca9j.cjs.map +0 -1
- package/dist/MBadge-CexVV675.cjs +0 -2
- package/dist/MBadge-CexVV675.cjs.map +0 -1
- package/dist/MBadge-Y1JnZiIC.js +0 -17
- package/dist/MBadge-Y1JnZiIC.js.map +0 -1
- package/dist/MButton-B8rXmFX9.cjs +0 -2
- package/dist/MButton-BmTDe5Oa.js +0 -111
- package/dist/MHeading-C3IgV22T.js +0 -19
- package/dist/MHeading-C3IgV22T.js.map +0 -1
- package/dist/MHeading-DqvWKia1.cjs +0 -2
- package/dist/MHeading-DqvWKia1.cjs.map +0 -1
- package/dist/MImage-BDcrV6IC.js +0 -49
- package/dist/MImage-BDcrV6IC.js.map +0 -1
- package/dist/MImage-BsQJ_eYf.cjs +0 -2
- package/dist/MImage-BsQJ_eYf.cjs.map +0 -1
- package/dist/MInline-BAhu2zT-.cjs +0 -2
- package/dist/MInline-BAhu2zT-.cjs.map +0 -1
- package/dist/MInline-Dfy3Lrjs.js +0 -39
- package/dist/MInline-Dfy3Lrjs.js.map +0 -1
- package/dist/MLink-DHryXq_D.cjs +0 -2
- package/dist/MLink-ODytrwne.js +0 -29
- package/dist/MStack-Cifiqeb2.js +0 -39
- package/dist/MStack-Cifiqeb2.js.map +0 -1
- package/dist/MStack-lrvy7l3w.cjs +0 -2
- package/dist/MStack-lrvy7l3w.cjs.map +0 -1
- package/dist/MSubText-78oYdJQy.cjs +0 -2
- package/dist/MSubText-78oYdJQy.cjs.map +0 -1
- package/dist/MSubText-C2oxXwKT.js +0 -15
- package/dist/MSubText-C2oxXwKT.js.map +0 -1
- package/dist/MSurface-B1LXFczo.js +0 -39
- package/dist/MSurface-B1LXFczo.js.map +0 -1
- package/dist/MSurface-BgZ86iYn.cjs +0 -2
- package/dist/MSurface-BgZ86iYn.cjs.map +0 -1
- package/dist/MTag-C4_rBj4b.cjs +0 -2
- package/dist/MTag-C4_rBj4b.cjs.map +0 -1
- package/dist/MTag-DOcKm3c2.js +0 -37
- package/dist/MTag-DOcKm3c2.js.map +0 -1
- package/dist/MText-CxSZ2md0.cjs +0 -2
- package/dist/MText-CxSZ2md0.cjs.map +0 -1
- package/dist/MText-DX9O7gh7.js +0 -43
- package/dist/MText-DX9O7gh7.js.map +0 -1
- package/dist/controls-DwL1-nVC.cjs +0 -2
- package/dist/data-BESfox0z.cjs +0 -2
- package/dist/data-BESfox0z.cjs.map +0 -1
- package/dist/data-s8Hkht1B.js.map +0 -1
- package/dist/feedback-D3LLKNlY.js.map +0 -1
- package/dist/feedback-DYjg0Dbp.cjs +0 -2
- package/dist/feedback-DYjg0Dbp.cjs.map +0 -1
- package/dist/layout-Cb94o3oU.js +0 -891
- package/dist/layout-Cb94o3oU.js.map +0 -1
- package/dist/layout-DgfsQ-Tn.cjs +0 -2
- package/dist/layout-DgfsQ-Tn.cjs.map +0 -1
- package/dist/media-D5YGOTm7.cjs +0 -2
- package/dist/theme-BV4qkzZU.js.map +0 -1
- package/dist/theme-DLorpkJc.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"layout-Cb94o3oU.js","names":[],"sources":["../src/components/layout/MContainer/MContainer.tsx","../src/components/layout/MHeader/MHeader.tsx","../src/components/layout/MFooter/MFooter.tsx","../src/components/layout/MNavs/MNavs.tsx","../src/components/layout/MNavbar/MNavbar.tsx","../src/components/layout/MTopbar/MTopbar.tsx","../src/components/layout/MTabs/MTabs.tsx","../src/components/layout/MSection/MSection.tsx","../src/components/layout/MSimpleGrid/MSimpleGrid.tsx","../src/components/layout/MGrid/MGrid.tsx","../src/components/layout/MDivider/MDivider.tsx","../src/components/layout/MSidebar/MSidebar.tsx","../src/components/layout/MBreadcrumb/MBreadcrumb.tsx","../src/components/layout/MAppShell/MAppShell.tsx"],"sourcesContent":["import type {MContainerProps} from './MContainer.types'\nimport {cn} from '../../../utils/cn'\nimport {getLayoutUtilityClassNames, getLayoutUtilityStyles} from '../../../utils/layoutProps'\nimport './MContainer.css'\n\n// Constrain page content widths and apply shared spacing utilities.\nexport function MContainer({\n size = 'content',\n padded = true,\n spacing,\n padding,\n fsize,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n className,\n style,\n children,\n ...rest\n}: MContainerProps) {\n const utilityStyle = getLayoutUtilityStyles({fsize})\n\n return (\n <div\n className={cn(\n 'container',\n size,\n padded && 'padded',\n ...getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n }),\n className\n )}\n style={{...utilityStyle, ...style}}\n {...rest}\n >\n {children}\n </div>\n )\n}\n","import type {MHeaderProps} from './MHeader.types'\nimport {cn} from '../../../utils/cn'\nimport {MContainer} from '../MContainer'\nimport './MHeader.css'\n\n// Render a reusable page header shell aligned to a shared container.\nexport function MHeader({\n container = 'wide',\n padded = true,\n bordered = true,\n sticky = false,\n tone = 'surface',\n layout = 'split',\n className,\n children,\n ...rest\n}: MHeaderProps) {\n return (\n <header className={cn('header', tone, bordered && 'bordered', sticky && 'sticky', className)} {...rest}>\n <MContainer size={container} padded={padded} className={cn('inner', `layout-${layout}`)}>\n {children}\n </MContainer>\n </header>\n )\n}\n","import type {MFooterProps} from './MFooter.types'\nimport {cn} from '../../../utils/cn'\nimport {getLayoutUtilityClassNames, getLayoutUtilityStyles} from '../../../utils/layoutProps'\nimport {MContainer} from '../MContainer'\nimport './MFooter.css'\n\n// Render a reusable page footer shell with shared spacing utilities.\nexport function MFooter({\n container = 'wide',\n padded = true,\n bordered = true,\n tone = 'surface',\n spacing,\n padding,\n fsize,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n className,\n style,\n children,\n ...rest\n}: MFooterProps) {\n const utilityStyle = getLayoutUtilityStyles({fsize})\n\n return (\n <footer\n className={cn(\n 'footer',\n tone,\n bordered && 'bordered',\n ...getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n }),\n className\n )}\n style={{...utilityStyle, ...style}}\n {...rest}\n >\n <MContainer size={container} padded={padded} className=\"inner\" fullWidth>\n {children}\n </MContainer>\n </footer>\n )\n}\n","import type {MNavsProps} from './MNavs.types'\nimport {cn} from '../../../utils/cn'\nimport {MLink} from '../../typography'\nimport './MNavs.css'\n\n// Render a lightweight navigation list from data or custom children.\nexport function MNavs({items, orientation = 'horizontal', wrap = false, className, children, ...rest}: MNavsProps) {\n return (\n <div className={cn('navs', orientation, wrap && 'wrap', className)} {...rest}>\n {items\n ? items.map((item) => {\n const Icon = item.icon\n const hideLabel = item.iconOnly === true && Icon != null\n const labelAsString = typeof item.label === 'string' ? item.label : undefined\n const ariaLabel = hideLabel ? labelAsString : undefined\n const linkTitle = item.title ?? (hideLabel ? labelAsString : undefined)\n\n return (\n <MLink\n key={\n item.key ??\n item.href ??\n item.title?.toString() ??\n (labelAsString ?? '')\n }\n component={item.component}\n href={item.href}\n to={item.to}\n target={item.target}\n rel={item.rel}\n title={linkTitle}\n current={item.current}\n disabled={item.disabled}\n className={cn('link', hideLabel && 'icon-only', item.className)}\n aria-label={ariaLabel}\n >\n {Icon ? (\n <span className='icon' aria-hidden={!hideLabel || undefined}>\n <Icon size={item.iconSize} />\n </span>\n ) : null}\n {!hideLabel ? item.label : null}\n </MLink>\n )\n })\n : children}\n </div>\n )\n}\n","import {Children, cloneElement, isValidElement, useEffect, useId, useRef, useState} from 'react'\nimport type {MouseEvent as ReactMouseEvent, ReactElement} from 'react'\nimport type {MNavbarProps} from './MNavbar.types'\nimport {cn} from '../../../utils/cn'\nimport {MContainer} from '../MContainer'\nimport {MInline} from '../MInline'\nimport type {MInlineProps} from '../MInline'\nimport {MNavs} from '../MNavs'\nimport type {MNavsProps} from '../MNavs'\nimport {MButton} from '../../controls/MButton'\nimport {MMenuIcon} from '../../../icons'\nimport './MNavbar.css'\n\n// Render a horizontal app or site navigation shell with container alignment.\n// Below the md breakpoint MNavs children are collapsed behind a hamburger toggle\n// that opens either a dropdown panel or a side drawer with the navigation items.\nexport function MNavbar({\n container = 'content',\n padded = true,\n bordered = true,\n sticky = false,\n tone = 'surface',\n justify = 'between',\n wrap = false,\n mobileMenu = 'dropdown',\n mobileMenuContent,\n mobileMenuLabel = 'Open navigation',\n className,\n children,\n ...rest\n}: MNavbarProps) {\n const [open, setOpen] = useState(false)\n const rootRef = useRef<HTMLElement | null>(null)\n const menuId = useId()\n\n const childArray = Children.toArray(children)\n\n const mobileNavs = childArray\n .filter((child): child is ReactElement<MNavsProps> => isValidElement(child) && child.type === MNavs)\n .map((child, index) =>\n cloneElement(child, {\n key: `mnavbar-mobile-navs-${index}`,\n orientation: 'vertical',\n }),\n )\n\n const toggleButton = (\n <MButton\n key=\"mnavbar-toggle\"\n type=\"button\"\n variant=\"ghost\"\n size=\"md\"\n iconOnly\n className=\"navbar-toggle\"\n aria-label={mobileMenuLabel}\n aria-expanded={open}\n aria-controls={menuId}\n onClick={handleToggleClick}\n >\n <MMenuIcon />\n </MButton>\n )\n\n let lastInlineIndex = -1\n for (let index = childArray.length - 1; index >= 0; index -= 1) {\n const child = childArray[index]\n if (isValidElement(child) && child.type === MInline) {\n lastInlineIndex = index\n break\n }\n }\n\n const renderedChildren = lastInlineIndex === -1\n ? [...childArray, toggleButton]\n : childArray.map((child, index) => {\n if (index !== lastInlineIndex) return child\n const inlineChild = child as ReactElement<MInlineProps>\n const inlineChildren = Children.toArray(inlineChild.props.children)\n return cloneElement(inlineChild, {\n key: inlineChild.key ?? `mnavbar-inline-${index}`,\n children: [...inlineChildren, toggleButton],\n })\n })\n\n useEffect(() => {\n if (!open) return\n\n function handlePointerDown(event: PointerEvent) {\n const root = rootRef.current\n if (!root) return\n if (event.target instanceof Node && root.contains(event.target)) return\n setOpen(false)\n }\n\n function handleKeydown(event: KeyboardEvent) {\n if (event.key === 'Escape') setOpen(false)\n }\n\n document.addEventListener('pointerdown', handlePointerDown)\n document.addEventListener('keydown', handleKeydown)\n return () => {\n document.removeEventListener('pointerdown', handlePointerDown)\n document.removeEventListener('keydown', handleKeydown)\n }\n }, [open])\n\n function handleToggleClick() {\n setOpen((previous) => !previous)\n }\n\n function handleMenuClick(event: ReactMouseEvent<HTMLDivElement>) {\n const target = event.target as HTMLElement | null\n if (!target) return\n if (target.closest('a, [role=\"menuitem\"]')) {\n setOpen(false)\n }\n }\n\n return (\n <nav\n ref={rootRef}\n className={cn(\n 'navbar',\n tone,\n bordered && 'bordered',\n sticky && 'sticky',\n open && 'mobile-open',\n `mobile-${mobileMenu}`,\n className,\n )}\n {...rest}\n >\n <MContainer size={container} padded={padded} className=\"container\">\n <div className={cn('inner', justify, wrap && 'wrap')}>\n {renderedChildren}\n </div>\n </MContainer>\n\n {mobileMenu === 'drawer' && <div className={cn('mobile-backdrop', open && 'visible')} aria-hidden />}\n\n <div\n id={menuId}\n className={cn('mobile-menu', mobileMenu, open && 'open')}\n role=\"menu\"\n aria-hidden={!open || undefined}\n onClick={handleMenuClick}\n >\n {mobileNavs}\n {mobileMenuContent}\n </div>\n </nav>\n )\n}\n","import {useEffect, useMemo, useRef, useState} from 'react'\nimport type {ReactNode} from 'react'\nimport type {MTopbarItem, MTopbarProps} from './MTopbar.types'\nimport {cn} from '../../../utils/cn'\nimport {MContainer} from '../MContainer'\nimport {MButton} from '../../controls'\nimport {MLink} from '../../typography'\nimport {MChevronDownIcon, MChevronLeftIcon, MChevronRightIcon} from '../../../icons'\nimport {MDropdownGroup, MDropdownItem, MDropdownMenu} from '../../overlays/MDropdownMenu'\nimport './MTopbar.css'\n\nfunction getItemKey(item: MTopbarItem): string {\n return item.key ?? item.to ?? item.href ?? String(item.label)\n}\n\nfunction itemHasActiveDescendant(item: MTopbarItem): boolean {\n if (item.active) return true\n return (item.children ?? []).some(itemHasActiveDescendant)\n}\n\nfunction renderItemContent(item: MTopbarItem, withChevron = false, isOpen = false): ReactNode {\n return (\n <>\n {item.icon ? <span className=\"topbar-icon\">{item.icon}</span> : null}\n <span>{item.label}</span>\n {item.badge ? <span className=\"topbar-badge\">{item.badge}</span> : null}\n {withChevron ? (\n <span className={cn('topbar-chevron', isOpen && 'open')} aria-hidden=\"true\">\n <MChevronDownIcon size=\"sm\" />\n </span>\n ) : null}\n </>\n )\n}\n\nfunction renderDropdownChildren(children: MTopbarItem[]): ReactNode {\n return children.map((child) => {\n if (child.children?.length) {\n return (\n <MDropdownGroup key={getItemKey(child)} label={String(child.label)}>\n {renderDropdownChildren(child.children)}\n </MDropdownGroup>\n )\n }\n\n return (\n <MDropdownItem\n key={getItemKey(child)}\n icon={child.icon}\n label={child.label}\n href={child.href}\n to={child.to}\n onClick={child.onClick}\n color={child.color}\n disabled={child.disabled}\n active={child.active}\n component={child.component}\n className={child.className}\n />\n )\n })\n}\n\nexport function MTopbar({\n items,\n container = 'full',\n padded = true,\n bordered = true,\n sticky = false,\n tone = 'surface',\n justify = 'left',\n size = 'md',\n openOn = 'hover',\n dropdownPlacement = 'bottom-start',\n className,\n style,\n ...rest\n}: MTopbarProps) {\n const [coarsePointer, setCoarsePointer] = useState(false)\n const [openMap, setOpenMap] = useState<Record<string, boolean>>({})\n const [hasOverflow, setHasOverflow] = useState(false)\n const [canScrollLeft, setCanScrollLeft] = useState(false)\n const [canScrollRight, setCanScrollRight] = useState(false)\n const viewportRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const media = window.matchMedia('(pointer: coarse)')\n const sync = () => setCoarsePointer(media.matches)\n\n sync()\n\n if (typeof media.addEventListener === 'function') {\n media.addEventListener('change', sync)\n return () => media.removeEventListener('change', sync)\n }\n\n media.addListener(sync)\n return () => media.removeListener(sync)\n }, [])\n\n useEffect(() => {\n const viewport = viewportRef.current\n if (!viewport) return\n\n const updateOverflow = () => {\n const nextHasOverflow = viewport.scrollWidth > viewport.clientWidth + 1\n setHasOverflow(nextHasOverflow)\n setCanScrollLeft(viewport.scrollLeft > 4)\n setCanScrollRight(viewport.scrollLeft + viewport.clientWidth < viewport.scrollWidth - 4)\n }\n\n updateOverflow()\n\n viewport.addEventListener('scroll', updateOverflow, {passive: true})\n\n const observer = new ResizeObserver(updateOverflow)\n observer.observe(viewport)\n Array.from(viewport.children).forEach((child) => observer.observe(child))\n\n return () => {\n viewport.removeEventListener('scroll', updateOverflow)\n observer.disconnect()\n }\n }, [items, justify, size, tone, bordered, padded, container])\n\n const resolvedOpenOn = useMemo(() => (coarsePointer ? 'click' : openOn), [coarsePointer, openOn])\n\n const scrollByAmount = (direction: 'left' | 'right') => {\n const viewport = viewportRef.current\n if (!viewport) return\n\n const amount = Math.max(180, Math.floor(viewport.clientWidth * 0.45))\n viewport.scrollBy({\n left: direction === 'left' ? -amount : amount,\n behavior: 'smooth',\n })\n }\n\n return (\n <nav\n className={cn('topbar', tone, size, bordered && 'bordered', sticky && 'sticky', className)}\n style={style}\n {...rest}\n >\n <MContainer size={container} padded={padded} className=\"topbar-container\">\n <div className={cn('topbar-scroll-shell', hasOverflow && 'overflowing')}>\n {hasOverflow && (\n <MButton\n variant=\"ghost\"\n color=\"neutral\"\n iconOnly\n shape=\"circle\"\n className={cn('topbar-scroll-button', 'left', !canScrollLeft && 'hidden')}\n onClick={() => scrollByAmount('left')}\n aria-label=\"Scroll topbar left\"\n >\n <MChevronLeftIcon />\n </MButton>\n )}\n\n <div ref={viewportRef} className=\"topbar-viewport\">\n <div className={cn('topbar-list', `justify-${justify}`, hasOverflow && 'overflowing')}>\n {items.map((item) => {\n const itemKey = getItemKey(item)\n const isActive = itemHasActiveDescendant(item)\n const isOpen = !!openMap[itemKey]\n\n if (item.children?.length) {\n if (item.disabled) {\n return (\n <div\n key={itemKey}\n className={cn('topbar-trigger', item.color, 'disabled', item.className)}\n aria-disabled=\"true\"\n >\n {renderItemContent(item, true)}\n </div>\n )\n }\n\n return (\n <MDropdownMenu\n key={itemKey}\n trigger={\n <div\n className={cn(\n 'topbar-trigger',\n item.color,\n isActive && 'active',\n isOpen && 'open',\n item.disabled && 'disabled',\n item.className\n )}\n >\n {renderItemContent(item, true, isOpen)}\n </div>\n }\n openOn={item.openOn ?? resolvedOpenOn}\n onOpenChange={(nextOpen) =>\n setOpenMap((prev) => ({...prev, [itemKey]: nextOpen}))\n }\n placement={dropdownPlacement}\n popoverClassName=\"topbar-dropdown-popover\"\n >\n {renderDropdownChildren(item.children)}\n </MDropdownMenu>\n )\n }\n\n return (\n <MLink\n key={itemKey}\n component={item.component}\n href={item.href}\n to={item.to}\n onClick={item.onClick}\n current={item.active}\n disabled={item.disabled}\n underline=\"none\"\n tone=\"inherit\"\n className={cn(\n 'topbar-link',\n item.color,\n item.className,\n item.active && 'active'\n )}\n >\n {renderItemContent(item)}\n </MLink>\n )\n })}\n </div>\n </div>\n\n {hasOverflow && (\n <MButton\n variant=\"ghost\"\n color=\"neutral\"\n iconOnly\n shape=\"circle\"\n className={cn('topbar-scroll-button', 'right', !canScrollRight && 'hidden')}\n onClick={() => scrollByAmount('right')}\n aria-label=\"Scroll topbar right\"\n >\n <MChevronRightIcon />\n </MButton>\n )}\n </div>\n </MContainer>\n </nav>\n )\n}\n","import {useId, useMemo, useState} from 'react'\nimport type {KeyboardEvent} from 'react'\nimport type {MTabsItem, MTabsProps} from './MTabs.types'\nimport {cn} from '../../../utils/cn'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport './MTabs.css'\n\ninterface MTabsTriggerProps {\n item: MTabsItem\n isActive: boolean\n tabId: string\n panelId: string\n clickEffect: MTabsProps['clickEffect']\n rippleColor: string | undefined\n onSelect: (value: string) => void\n}\n\n// Keep the tab trigger behavior isolated from the list and panel rendering.\nfunction MTabsTrigger({item, isActive, tabId, panelId, clickEffect, rippleColor, onSelect}: MTabsTriggerProps) {\n const {effectClassName, effectLayer, handlePointerDown, triggerEffect} = useInteractionEffect<HTMLButtonElement>({\n effect: clickEffect,\n disabled: item.disabled,\n centered: true,\n color: rippleColor,\n })\n\n return (\n <button\n type=\"button\"\n id={tabId}\n role=\"tab\"\n aria-selected={isActive}\n aria-controls={panelId}\n tabIndex={isActive ? 0 : -1}\n disabled={item.disabled}\n className={cn('tabs-trigger', isActive && 'active', item.disabled && 'disabled', effectClassName)}\n onPointerDown={handlePointerDown}\n onKeyDown={(event) => {\n if (event.key === ' ' || event.key === 'Enter') {\n triggerEffect(event.currentTarget)\n }\n }}\n onClick={() => onSelect(item.value)}\n >\n {effectLayer}\n {item.icon && <span className=\"tabs-icon\">{item.icon}</span>}\n <span className=\"tabs-label\">{item.label}</span>\n </button>\n )\n}\n\nexport function MTabs({\n items,\n value,\n defaultValue,\n onValueChange,\n variant = 'underline',\n orientation = 'horizontal',\n size = 'md',\n fullWidth = false,\n showPanels = true,\n panelClassName,\n clickEffect = 'ripple',\n rippleColor,\n className,\n ...rest\n}: MTabsProps) {\n // Pick the first enabled item when the caller does not control the active tab.\n const fallbackValue = useMemo(\n () => defaultValue ?? items.find((item) => !item.disabled)?.value ?? '',\n [defaultValue, items]\n )\n const [internalValue, setInternalValue] = useState(fallbackValue)\n const activeValue = value ?? internalValue\n const activeItem = items.find((item) => item.value === activeValue) ?? items[0]\n const baseId = useId()\n\n // Support both controlled and uncontrolled tab state.\n function selectTab(nextValue: string) {\n if (value === undefined) {\n setInternalValue(nextValue)\n }\n onValueChange?.(nextValue)\n }\n\n // Re-map keyboard navigation depending on the rendered orientation.\n function handleKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n const enabledItems = items.filter((item) => !item.disabled)\n const currentIndex = enabledItems.findIndex((item) => item.value === activeItem?.value)\n\n if (currentIndex === -1) {\n return\n }\n\n const nextKeys = orientation === 'vertical' ? ['ArrowDown'] : ['ArrowRight', 'ArrowDown']\n const previousKeys = orientation === 'vertical' ? ['ArrowUp'] : ['ArrowLeft', 'ArrowUp']\n\n if (nextKeys.includes(event.key)) {\n event.preventDefault()\n const nextItem = enabledItems[(currentIndex + 1) % enabledItems.length]\n selectTab(nextItem.value)\n }\n\n if (previousKeys.includes(event.key)) {\n event.preventDefault()\n const nextItem = enabledItems[(currentIndex - 1 + enabledItems.length) % enabledItems.length]\n selectTab(nextItem.value)\n }\n }\n\n return (\n <div className={cn('tabs', variant, orientation, size, fullWidth && 'full-width', className)} {...rest}>\n <div className=\"tabs-list\" role=\"tablist\" aria-orientation={orientation} onKeyDown={handleKeyDown}>\n {items.map((item) => {\n const isActive = item.value === activeItem?.value\n const tabId = `${baseId}-${item.value}-tab`\n const panelId = `${baseId}-${item.value}-panel`\n\n return (\n <MTabsTrigger\n key={item.value}\n item={item}\n isActive={isActive}\n tabId={tabId}\n panelId={panelId}\n clickEffect={clickEffect}\n rippleColor={rippleColor}\n onSelect={selectTab}\n />\n )\n })}\n </div>\n\n {showPanels && activeItem?.content !== undefined && (\n <div\n key={activeItem.value}\n id={`${baseId}-${activeItem.value}-panel`}\n role=\"tabpanel\"\n aria-labelledby={`${baseId}-${activeItem.value}-tab`}\n className={cn('tabs-panel', panelClassName)}\n >\n {activeItem.content}\n </div>\n )}\n </div>\n )\n}\n","import type React from 'react'\nimport type {MSectionProps} from './MSection.types'\nimport {cn} from '../../../utils/cn'\nimport {useReveal} from '../../../utils/useReveal'\nimport './MSection.css'\n\n// Render a semantic page section with predefined spacing and tone.\nexport function MSection({\n as = 'section',\n spacing = 'lg',\n tone = 'default',\n reveal,\n className,\n style,\n children,\n ...rest\n}: MSectionProps) {\n const Component = as\n const revealRef = useReveal(reveal)\n const hasReveal = reveal !== undefined && reveal !== false\n\n return (\n <Component\n ref={hasReveal ? (revealRef as React.RefObject<never>) : undefined}\n className={cn('section', spacing, tone, hasReveal && 'reveal', className)}\n style={style}\n {...rest}\n >\n {children}\n </Component>\n )\n}\n","import type {MSimpleGridProps} from './MSimpleGrid.types'\nimport {cn} from '../../../utils/cn'\nimport './MSimpleGrid.css'\n\n// Render a simple equal-column grid with a shared default spacing.\nexport function MSimpleGrid({columns = 2, minItemWidth, className, style, children, ...rest}: MSimpleGridProps) {\n return (\n <div\n className={cn('grid', `columns-${columns}`, className)}\n style={{\n ...(minItemWidth ? {'--grid-min-item-width': minItemWidth} : {}),\n ...style,\n }}\n {...rest}\n >\n {children}\n </div>\n )\n}\n","import {Children, cloneElement, isValidElement} from 'react'\nimport type {ReactElement} from 'react'\nimport type {MGridColumns, MGridItemProps, MGridProps} from './MGrid.types'\nimport {cn} from '../../../utils/cn'\nimport {getLayoutUtilityClassNames, getLayoutUtilityStyles} from '../../../utils/layoutProps'\nimport './MGrid.css'\n\ntype GridBreakpoint = 'span' | 'xl' | 'lg' | 'md' | 'sm'\n\nfunction isGridColumnElement(child: unknown): child is ReactElement<MGridProps | MGridItemProps> {\n if (!isValidElement(child)) {\n return false\n }\n\n if (child.type === MGridItem) {\n return true\n }\n\n return child.type === MGrid && (child.props as MGridProps).type === 'col'\n}\n\nfunction getNormalizedSpans(props: Partial<MGridProps>) {\n return {\n span: props.span ?? props.xl ?? props.lg ?? props.md ?? props.sm,\n xl: props.xl ?? props.lg ?? props.md ?? props.sm,\n lg: props.lg ?? props.md ?? props.sm,\n md: props.md ?? props.sm,\n sm: props.sm,\n }\n}\n\nfunction distributeRemainingColumns(remaining: number, count: number): Array<MGridColumns | undefined> {\n if (count <= 0) {\n return []\n }\n\n if (remaining <= 0) {\n return Array.from({length: count}, () => undefined)\n }\n\n const base = Math.floor(remaining / count)\n const extra = remaining % count\n\n return Array.from({length: count}, (_, index) => {\n const value = base + (index < extra ? 1 : 0)\n return value >= 1 ? (value as MGridColumns) : undefined\n })\n}\n\nfunction resolveAutoSpans(columnProps: Array<Partial<MGridProps>>) {\n const breakpoints: GridBreakpoint[] = ['span', 'xl', 'lg', 'md', 'sm']\n const normalized = columnProps.map((props) => getNormalizedSpans(props))\n const resolved = normalized.map((spans) => ({...spans}))\n\n for (const breakpoint of breakpoints) {\n const autoIndexes: number[] = []\n let usedColumns = 0\n\n normalized.forEach((spans, index) => {\n const value = spans[breakpoint]\n\n if (value) {\n usedColumns += value\n return\n }\n\n autoIndexes.push(index)\n })\n\n const distributed = distributeRemainingColumns(Math.max(12 - usedColumns, 0), autoIndexes.length)\n\n autoIndexes.forEach((columnIndex, autoIndex) => {\n resolved[columnIndex][breakpoint] = distributed[autoIndex]\n })\n }\n\n return resolved\n}\n\n// Render either a responsive row or a responsive column using one shared grid API.\nexport function MGrid({\n type = 'row',\n span,\n sm,\n md,\n lg,\n xl,\n spacing,\n padding,\n fsize,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n className,\n style,\n children,\n ...rest\n}: MGridProps) {\n const utilityStyle = getLayoutUtilityStyles({fsize})\n const baseSpan = span ?? xl ?? lg\n\n if (type === 'col') {\n return (\n <div\n className={cn(\n 'grid',\n 'col',\n baseSpan ? `span-${baseSpan}` : 'span-auto',\n xl && `xl-${xl}`,\n lg && `lg-${lg}`,\n md && `md-${md}`,\n sm && `sm-${sm}`,\n ...getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n }),\n className\n )}\n style={{...utilityStyle, ...style}}\n {...rest}\n >\n {children}\n </div>\n )\n }\n\n const childArray = Children.toArray(children)\n const columnEntries = childArray.flatMap((child, index) => (isGridColumnElement(child) ? [{child, index}] : []))\n const autoColumns = Math.min(Math.max(columnEntries.length || childArray.length, 1), 12)\n const hasTrackedSizing = columnEntries.some(({child}) => {\n const p = child.props as MGridProps\n return Boolean(p.span || p.xl || p.lg || p.md || p.sm)\n })\n const resolvedSpans = hasTrackedSizing\n ? resolveAutoSpans(columnEntries.map(({child}) => child.props as Partial<MGridProps>))\n : null\n const resolvedChildren =\n hasTrackedSizing && resolvedSpans\n ? childArray.map((child, childIndex) => {\n const columnIndex = columnEntries.findIndex((entry) => entry.index === childIndex)\n\n if (columnIndex === -1 || !isGridColumnElement(child)) {\n return child\n }\n\n const spans = resolvedSpans[columnIndex]\n\n return cloneElement(child, {\n span: spans.span,\n xl: spans.xl,\n lg: spans.lg,\n md: spans.md,\n sm: spans.sm,\n })\n })\n : childArray\n\n return (\n <div\n className={cn(\n 'grid',\n 'row',\n hasTrackedSizing ? 'tracked' : `auto-cols-${autoColumns}`,\n ...getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth: fullWidth ?? true,\n }),\n className\n )}\n style={{...utilityStyle, ...style}}\n {...rest}\n >\n {resolvedChildren}\n </div>\n )\n}\n\n// Keep MGridItem as a compatibility alias for explicit column declarations.\nexport function MGridItem({span, sm, md, lg, xl, ...rest}: MGridItemProps) {\n return <MGrid type=\"col\" span={span} sm={sm} md={md} lg={lg} xl={xl} {...rest} />\n}\n","import type {MDividerProps} from './MDivider.types'\nimport {cn} from '../../../utils/cn'\nimport './MDivider.css'\n\n// Render a semantic divider line between related content blocks.\nexport function MDivider({orientation = 'horizontal', variant = 'solid', className, style, ...rest}: MDividerProps) {\n return (\n <div\n role=\"separator\"\n aria-orientation={orientation}\n className={cn('divider', orientation, variant, className)}\n style={style}\n {...rest}\n />\n )\n}\n","import {createContext, useContext, useState, useEffect, useCallback, useMemo} from 'react'\nimport {cn} from '../../../utils/cn'\nimport {MButton} from '../../controls'\nimport {MChevronRightIcon, MMenuIcon} from '../../../icons'\nimport {MDropdownMenu, MTooltip} from '../../overlays'\nimport type {\n MSidebarProps,\n MSidebarHeaderProps,\n MSidebarBodyProps,\n MSidebarNavProps,\n MSidebarItemProps,\n MSidebarGroupProps,\n MSidebarFooterProps,\n MSidebarDividerProps,\n MSidebarMode,\n} from './MSidebar.types'\nimport './MSidebar.css'\n\nconst STORAGE_KEY = 'mineralui-sidebar'\n\ninterface SidebarContextValue {\n mode: MSidebarMode\n mobile: boolean\n mobileOpen: boolean\n canToggle: boolean\n toggleMode: () => void\n}\n\nconst SidebarCtx = createContext<SidebarContextValue>({\n mode: 'expanded',\n mobile: false,\n mobileOpen: false,\n canToggle: false,\n toggleMode: () => {},\n})\n\n// Read shared sidebar state inside slot components.\nfunction useSidebar() {\n return useContext(SidebarCtx)\n}\n\n// Track the responsive breakpoint once for the whole sidebar tree.\nfunction useIsMobile(breakpoint: number): boolean {\n const [mobile, setMobile] = useState(() => (typeof window !== 'undefined' ? window.innerWidth < breakpoint : false))\n\n useEffect(() => {\n const mq = window.matchMedia(`(max-width: ${breakpoint - 1}px)`)\n const handler = (e: MediaQueryListEvent) => setMobile(e.matches)\n\n setMobile(mq.matches)\n mq.addEventListener('change', handler)\n return () => mq.removeEventListener('change', handler)\n }, [breakpoint])\n\n return mobile\n}\n\n// Render the sidebar shell and coordinate desktop and mobile behavior.\nexport function MSidebar({\n mode: modeProp = 'auto',\n defaultMode = 'expanded',\n onModeChange,\n persist = false,\n side = 'left',\n tone = 'subtle',\n bordered = true,\n mobileBreakpoint = 768,\n className,\n style,\n children,\n}: MSidebarProps) {\n const mobile = useIsMobile(mobileBreakpoint)\n const [mobileOpen, setMobileOpen] = useState(false)\n\n const [internalMode, setInternalMode] = useState<MSidebarMode>(() => {\n if (persist) {\n try {\n const v = localStorage.getItem(STORAGE_KEY)\n if (v === 'expanded' || v === 'collapsed') return v\n } catch {\n /* noop */\n }\n }\n\n return defaultMode\n })\n\n const resolvedMode: MSidebarMode =\n modeProp === 'auto' ? internalMode : modeProp === 'collapsed' ? 'collapsed' : 'expanded'\n\n // MToggle only the desktop width state. Mobile uses its own overlay flow.\n const toggleMode = useCallback(() => {\n const next: MSidebarMode = resolvedMode === 'expanded' ? 'collapsed' : 'expanded'\n\n setInternalMode(next)\n onModeChange?.(next)\n\n if (persist) {\n try {\n localStorage.setItem(STORAGE_KEY, next)\n } catch {\n /* noop */\n }\n }\n }, [resolvedMode, onModeChange, persist])\n\n const closeMobile = useCallback(() => setMobileOpen(false), [])\n\n // Let Escape close the temporary mobile drawer.\n useEffect(() => {\n if (!mobileOpen) return\n\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setMobileOpen(false)\n }\n\n document.addEventListener('keydown', handler)\n return () => document.removeEventListener('keydown', handler)\n }, [mobileOpen])\n\n const canToggle = !mobile && modeProp === 'auto'\n\n const ctx = useMemo<SidebarContextValue>(\n () => ({mode: resolvedMode, mobile, mobileOpen, canToggle, toggleMode}),\n [resolvedMode, mobile, mobileOpen, canToggle, toggleMode]\n )\n\n const isCollapsed = !mobile && resolvedMode === 'collapsed'\n\n const sidebarCls = cn(\n 'sidebar',\n tone,\n side,\n isCollapsed && 'collapsed',\n bordered && 'bordered',\n mobile && 'mobile',\n mobile && mobileOpen && 'mobile-open',\n className\n )\n\n return (\n <SidebarCtx.Provider value={ctx}>\n {mobile && mobileOpen && <div className=\"sidebar-backdrop\" onClick={closeMobile} />}\n\n <aside className={sidebarCls} style={style}>\n {children}\n </aside>\n\n {mobile && !mobileOpen && (\n <button\n className={cn('sidebar-hamburger', side)}\n onClick={() => setMobileOpen(true)}\n aria-label=\"Open menu\"\n >\n <span className=\"sidebar-hamburger-icon\" aria-hidden=\"true\">\n <MMenuIcon />\n </span>\n </button>\n )}\n </SidebarCtx.Provider>\n )\n}\n\n// Render the top area with branding and an optional collapse toggle.\nexport function MSidebarHeader({bordered = false, className, children}: MSidebarHeaderProps) {\n const {mode, mobile, canToggle, toggleMode} = useSidebar()\n const isCollapsed = !mobile && mode === 'collapsed'\n\n return (\n <div className={cn('sidebar-header', bordered && 'bordered', className)}>\n <div className=\"sidebar-header-content\">{children}</div>\n {canToggle && (\n <MButton\n variant=\"outlined\"\n color=\"neutral\"\n iconOnly\n size=\"sm\"\n onClick={toggleMode}\n aria-label={isCollapsed ? 'Expand sidebar' : 'Collapse sidebar'}\n className=\"sidebar-toggle\"\n >\n <span className={cn('sidebar-chevron', isCollapsed && 'flipped')}>\n <MChevronRightIcon />\n </span>\n </MButton>\n )}\n </div>\n )\n}\n\n// Wrap the scrollable middle area between header and footer.\nexport function MSidebarBody({className, children}: MSidebarBodyProps) {\n return <div className={cn('sidebar-body', className)}>{children}</div>\n}\n\n// Wrap sidebar links in a navigation landmark.\nexport function MSidebarNav({className, children}: MSidebarNavProps) {\n return <nav className={cn('sidebar-nav', className)}>{children}</nav>\n}\n\n// Render one clickable sidebar row as a link, button or custom component.\nexport function MSidebarItem({\n icon,\n label,\n href,\n to,\n onClick,\n active = false,\n disabled = false,\n badge,\n color,\n component,\n className,\n}: MSidebarItemProps) {\n const {mode, mobile} = useSidebar()\n const isCollapsed = !mobile && mode === 'collapsed'\n\n const Tag = component ?? (href || to ? 'a' : 'button')\n const linkProps = component ? (to ? {to} : href ? {href} : {}) : href ? {href} : to ? {href: to} : {}\n const cls = cn('sidebar-item', active && 'active', disabled && 'disabled', color, className)\n\n return (\n <Tag\n className={cls}\n onClick={disabled ? undefined : onClick}\n aria-disabled={disabled || undefined}\n title={isCollapsed ? label : undefined}\n {...linkProps}\n >\n {icon && <span className=\"sidebar-item-icon\">{icon}</span>}\n {!isCollapsed && (\n <MTooltip content={label} placement=\"top\" className=\"sidebar-item-label-tooltip\">\n <span className=\"sidebar-item-label\">{label}</span>\n </MTooltip>\n )}\n {!isCollapsed && badge && <span className=\"sidebar-item-badge\">{badge}</span>}\n </Tag>\n )\n}\n\n// Group related sidebar items and swap to a dropdown when collapsed.\nexport function MSidebarGroup({\n label,\n icon,\n active = false,\n defaultOpen = true,\n collapsible = true,\n children,\n className,\n}: MSidebarGroupProps) {\n const sidebarCtx = useSidebar()\n const {mode, mobile} = sidebarCtx\n const isCollapsed = !mobile && mode === 'collapsed'\n const [open, setOpen] = useState(defaultOpen)\n\n const expandedCtx = useMemo<SidebarContextValue>(() => ({...sidebarCtx, mode: 'expanded'}), [sidebarCtx])\n\n // Keep expand/collapse local to this group.\n const toggle = () => {\n if (collapsible) setOpen((o) => !o)\n }\n\n if (isCollapsed) {\n const trigger = (\n <span className={cn('sidebar-group-icon collapsed', active && 'active')} title={label}>\n {icon}\n </span>\n )\n\n return (\n <div className={cn('sidebar-group', className)}>\n <MDropdownMenu trigger={trigger} placement=\"right-start\" closeOnSelect openOn=\"hover\">\n <SidebarCtx.Provider value={expandedCtx}>{children}</SidebarCtx.Provider>\n </MDropdownMenu>\n </div>\n )\n }\n\n return (\n <div className={cn('sidebar-group', className)}>\n <button className={cn('sidebar-group-header', active && 'active')} onClick={toggle} aria-expanded={open}>\n {icon && <span className=\"sidebar-group-icon\">{icon}</span>}\n <span className=\"sidebar-group-label\">{label}</span>\n {collapsible && (\n <span className={cn('sidebar-group-arrow', open && 'open')}>\n <MChevronRightIcon />\n </span>\n )}\n </button>\n {open && <div className=\"sidebar-group-items\">{children}</div>}\n </div>\n )\n}\n\n// Render the bottom slot for version info or quick actions.\nexport function MSidebarFooter({bordered = false, className, children}: MSidebarFooterProps) {\n return <div className={cn('sidebar-footer', bordered && 'bordered', className)}>{children}</div>\n}\n\n// Render a spacing-aware divider between sidebar regions.\nexport function MSidebarDivider({className, spacing = 'md'}: MSidebarDividerProps) {\n return <hr className={cn('sidebar-divider', spacing, className)} />\n}\n","import {useMemo} from 'react'\nimport {cn} from '../../../utils/cn'\nimport type {MBreadcrumbProps} from './MBreadcrumb.types'\nimport './MBreadcrumb.css'\n\n// Render a compact path and collapse the middle when needed.\nexport function MBreadcrumb({items, separator = '/', maxItems, className, ...rest}: MBreadcrumbProps) {\n // Keep the current page visible while shortening deep paths.\n const visible = useMemo(() => {\n if (!maxItems || maxItems >= items.length) return items\n if (maxItems < 2) return [items[items.length - 1]]\n const head = items.slice(0, 1)\n const tail = items.slice(-(maxItems - 1))\n return [...head, null, ...tail]\n }, [items, maxItems])\n\n return (\n <nav aria-label=\"breadcrumb\" className={cn('breadcrumb', className)} {...rest}>\n <ol className=\"trail\">\n {visible.map((item, i) => {\n if (item === null) {\n return (\n <li key=\"ellipsis\" className=\"crumb dots\">\n <span className=\"sep\">{separator}</span>\n <span>…</span>\n </li>\n )\n }\n\n const isLast = i === visible.length - 1\n\n return (\n <li key={i} className={cn('crumb', isLast && 'active')}>\n {i > 0 && <span className=\"sep\">{separator}</span>}\n {item.href && !isLast ? (\n <a href={item.href} className=\"link\" onClick={item.onClick}>\n {item.label}\n </a>\n ) : item.onClick && !isLast ? (\n <button type=\"button\" className=\"link btn\" onClick={item.onClick}>\n {item.label}\n </button>\n ) : (\n <span className=\"current\" aria-current={isLast ? 'page' : undefined}>\n {item.label}\n </span>\n )}\n </li>\n )\n })}\n </ol>\n </nav>\n )\n}\n","import {forwardRef, Children, isValidElement} from 'react'\nimport type * as React from 'react'\nimport type {MAppShellProps, MBodyProps} from './MAppShell.types'\nimport {cn} from '../../../utils/cn'\nimport {MSidebar} from '../MSidebar'\nimport './MAppShell.css'\n\nexport const MAppShell = forwardRef<HTMLDivElement, MAppShellProps>(function MAppShell(\n {className, children, ...rest},\n ref\n) {\n const sidebarElements: React.ReactNode[] = []\n const otherElements: React.ReactNode[] = []\n\n Children.forEach(children, (child) => {\n if (isValidElement(child) && child.type === MSidebar) {\n sidebarElements.push(child)\n } else {\n otherElements.push(child)\n }\n })\n\n return (\n <div ref={ref} className={cn('app-shell', className)} {...rest}>\n {sidebarElements}\n <div className=\"app-main\">{otherElements}</div>\n </div>\n )\n})\n\nexport const MBody = forwardRef<HTMLDivElement, MBodyProps>(function MBody({className, children, ...rest}, ref) {\n return (\n <div ref={ref} className={cn('app-body', className)} {...rest}>\n {children}\n </div>\n )\n})\n"],"mappings":"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"}
|
package/dist/layout-DgfsQ-Tn.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require(`./icons-Dv1T-cF4.cjs`),t=require(`./cn-CU5TNITO.cjs`),n=require(`./useInteractionEffect-DnEfbCrX.cjs`),r=require(`./useReveal-B_17PI89.cjs`),i=require(`./layoutProps-Ck4VtGm9.cjs`),a=require(`./MInline-BAhu2zT-.cjs`),o=require(`./MLink-DHryXq_D.cjs`),s=require(`./MButton-B8rXmFX9.cjs`),c=require(`./MTooltip-CNXoyQEN.cjs`),l=require(`./MDropdownMenu-X7ywPqth.cjs`);let u=require(`react`),d=require(`react/jsx-runtime`);function f({size:e=`content`,padded:n=!0,spacing:r,padding:a,fsize:o,mt:s,mb:c,ml:l,mr:u,mx:f,my:p,pt:m,pb:h,pl:g,pr:_,px:v,py:y,fullWidth:b,className:x,style:S,children:C,...w}){let T=i.n({fsize:o});return(0,d.jsx)(`div`,{className:t.t(`container`,e,n&&`padded`,...i.t({spacing:r,padding:a,fsize:o,mt:s,mb:c,ml:l,mr:u,mx:f,my:p,pt:m,pb:h,pl:g,pr:_,px:v,py:y,fullWidth:b}),x),style:{...T,...S},...w,children:C})}function p({container:e=`wide`,padded:n=!0,bordered:r=!0,sticky:i=!1,tone:a=`surface`,layout:o=`split`,className:s,children:c,...l}){return(0,d.jsx)(`header`,{className:t.t(`header`,a,r&&`bordered`,i&&`sticky`,s),...l,children:(0,d.jsx)(f,{size:e,padded:n,className:t.t(`inner`,`layout-${o}`),children:c})})}function m({container:e=`wide`,padded:n=!0,bordered:r=!0,tone:a=`surface`,spacing:o,padding:s,fsize:c,mt:l,mb:u,ml:p,mr:m,mx:h,my:g,pt:_,pb:v,pl:y,pr:b,px:x,py:S,fullWidth:C,className:w,style:T,children:E,...D}){let O=i.n({fsize:c});return(0,d.jsx)(`footer`,{className:t.t(`footer`,a,r&&`bordered`,...i.t({spacing:o,padding:s,fsize:c,mt:l,mb:u,ml:p,mr:m,mx:h,my:g,pt:_,pb:v,pl:y,pr:b,px:x,py:S,fullWidth:C}),w),style:{...O,...T},...D,children:(0,d.jsx)(f,{size:e,padded:n,className:`inner`,fullWidth:!0,children:E})})}function h({items:e,orientation:n=`horizontal`,wrap:r=!1,className:i,children:a,...s}){return(0,d.jsx)(`div`,{className:t.t(`navs`,n,r&&`wrap`,i),...s,children:e?e.map(e=>{let n=e.icon,r=e.iconOnly===!0&&n!=null,i=typeof e.label==`string`?e.label:void 0,a=r?i:void 0,s=e.title??(r?i:void 0);return(0,d.jsxs)(o.t,{component:e.component,href:e.href,to:e.to,target:e.target,rel:e.rel,title:s,current:e.current,disabled:e.disabled,className:t.t(`link`,r&&`icon-only`,e.className),"aria-label":a,children:[n?(0,d.jsx)(`span`,{className:`icon`,"aria-hidden":!r||void 0,children:(0,d.jsx)(n,{size:e.iconSize})}):null,r?null:e.label]},e.key??e.href??e.title?.toString()??i??``)}):a})}function g({container:n=`content`,padded:r=!0,bordered:i=!0,sticky:o=!1,tone:c=`surface`,justify:l=`between`,wrap:p=!1,mobileMenu:m=`dropdown`,mobileMenuContent:g,mobileMenuLabel:_=`Open navigation`,className:v,children:y,...b}){let[x,S]=(0,u.useState)(!1),C=(0,u.useRef)(null),w=(0,u.useId)(),T=u.Children.toArray(y),E=T.filter(e=>(0,u.isValidElement)(e)&&e.type===h).map((e,t)=>(0,u.cloneElement)(e,{key:`mnavbar-mobile-navs-${t}`,orientation:`vertical`})),D=(0,d.jsx)(s.t,{type:`button`,variant:`ghost`,size:`md`,iconOnly:!0,className:`navbar-toggle`,"aria-label":_,"aria-expanded":x,"aria-controls":w,onClick:A,children:(0,d.jsx)(e.cn,{})},`mnavbar-toggle`),O=-1;for(let e=T.length-1;e>=0;--e){let t=T[e];if((0,u.isValidElement)(t)&&t.type===a.t){O=e;break}}let k=O===-1?[...T,D]:T.map((e,t)=>{if(t!==O)return e;let n=e,r=u.Children.toArray(n.props.children);return(0,u.cloneElement)(n,{key:n.key??`mnavbar-inline-${t}`,children:[...r,D]})});(0,u.useEffect)(()=>{if(!x)return;function e(e){let t=C.current;t&&(e.target instanceof Node&&t.contains(e.target)||S(!1))}function t(e){e.key===`Escape`&&S(!1)}return document.addEventListener(`pointerdown`,e),document.addEventListener(`keydown`,t),()=>{document.removeEventListener(`pointerdown`,e),document.removeEventListener(`keydown`,t)}},[x]);function A(){S(e=>!e)}function j(e){let t=e.target;t&&t.closest(`a, [role="menuitem"]`)&&S(!1)}return(0,d.jsxs)(`nav`,{ref:C,className:t.t(`navbar`,c,i&&`bordered`,o&&`sticky`,x&&`mobile-open`,`mobile-${m}`,v),...b,children:[(0,d.jsx)(f,{size:n,padded:r,className:`container`,children:(0,d.jsx)(`div`,{className:t.t(`inner`,l,p&&`wrap`),children:k})}),m===`drawer`&&(0,d.jsx)(`div`,{className:t.t(`mobile-backdrop`,x&&`visible`),"aria-hidden":!0}),(0,d.jsxs)(`div`,{id:w,className:t.t(`mobile-menu`,m,x&&`open`),role:`menu`,"aria-hidden":!x||void 0,onClick:j,children:[E,g]})]})}function _(e){return e.key??e.to??e.href??String(e.label)}function v(e){return e.active?!0:(e.children??[]).some(v)}function y(n,r=!1,i=!1){return(0,d.jsxs)(d.Fragment,{children:[n.icon?(0,d.jsx)(`span`,{className:`topbar-icon`,children:n.icon}):null,(0,d.jsx)(`span`,{children:n.label}),n.badge?(0,d.jsx)(`span`,{className:`topbar-badge`,children:n.badge}):null,r?(0,d.jsx)(`span`,{className:t.t(`topbar-chevron`,i&&`open`),"aria-hidden":`true`,children:(0,d.jsx)(e.Mi,{size:`sm`})}):null]})}function b(e){return e.map(e=>e.children?.length?(0,d.jsx)(l.n,{label:String(e.label),children:b(e.children)},_(e)):(0,d.jsx)(l.r,{icon:e.icon,label:e.label,href:e.href,to:e.to,onClick:e.onClick,color:e.color,disabled:e.disabled,active:e.active,component:e.component,className:e.className},_(e)))}function x({items:n,container:r=`full`,padded:i=!0,bordered:a=!0,sticky:c=!1,tone:p=`surface`,justify:m=`left`,size:h=`md`,openOn:g=`hover`,dropdownPlacement:x=`bottom-start`,className:S,style:C,...w}){let[T,E]=(0,u.useState)(!1),[D,O]=(0,u.useState)({}),[k,A]=(0,u.useState)(!1),[j,M]=(0,u.useState)(!1),[N,P]=(0,u.useState)(!1),F=(0,u.useRef)(null);(0,u.useEffect)(()=>{let e=window.matchMedia(`(pointer: coarse)`),t=()=>E(e.matches);return t(),typeof e.addEventListener==`function`?(e.addEventListener(`change`,t),()=>e.removeEventListener(`change`,t)):(e.addListener(t),()=>e.removeListener(t))},[]),(0,u.useEffect)(()=>{let e=F.current;if(!e)return;let t=()=>{A(e.scrollWidth>e.clientWidth+1),M(e.scrollLeft>4),P(e.scrollLeft+e.clientWidth<e.scrollWidth-4)};t(),e.addEventListener(`scroll`,t,{passive:!0});let n=new ResizeObserver(t);return n.observe(e),Array.from(e.children).forEach(e=>n.observe(e)),()=>{e.removeEventListener(`scroll`,t),n.disconnect()}},[n,m,h,p,a,i,r]);let I=(0,u.useMemo)(()=>T?`click`:g,[T,g]),L=e=>{let t=F.current;if(!t)return;let n=Math.max(180,Math.floor(t.clientWidth*.45));t.scrollBy({left:e===`left`?-n:n,behavior:`smooth`})};return(0,d.jsx)(`nav`,{className:t.t(`topbar`,p,h,a&&`bordered`,c&&`sticky`,S),style:C,...w,children:(0,d.jsx)(f,{size:r,padded:i,className:`topbar-container`,children:(0,d.jsxs)(`div`,{className:t.t(`topbar-scroll-shell`,k&&`overflowing`),children:[k&&(0,d.jsx)(s.t,{variant:`ghost`,color:`neutral`,iconOnly:!0,shape:`circle`,className:t.t(`topbar-scroll-button`,`left`,!j&&`hidden`),onClick:()=>L(`left`),"aria-label":`Scroll topbar left`,children:(0,d.jsx)(e.Pi,{})}),(0,d.jsx)(`div`,{ref:F,className:`topbar-viewport`,children:(0,d.jsx)(`div`,{className:t.t(`topbar-list`,`justify-${m}`,k&&`overflowing`),children:n.map(e=>{let n=_(e),r=v(e),i=!!D[n];return e.children?.length?e.disabled?(0,d.jsx)(`div`,{className:t.t(`topbar-trigger`,e.color,`disabled`,e.className),"aria-disabled":`true`,children:y(e,!0)},n):(0,d.jsx)(l.i,{trigger:(0,d.jsx)(`div`,{className:t.t(`topbar-trigger`,e.color,r&&`active`,i&&`open`,e.disabled&&`disabled`,e.className),children:y(e,!0,i)}),openOn:e.openOn??I,onOpenChange:e=>O(t=>({...t,[n]:e})),placement:x,popoverClassName:`topbar-dropdown-popover`,children:b(e.children)},n):(0,d.jsx)(o.t,{component:e.component,href:e.href,to:e.to,onClick:e.onClick,current:e.active,disabled:e.disabled,underline:`none`,tone:`inherit`,className:t.t(`topbar-link`,e.color,e.className,e.active&&`active`),children:y(e)},n)})})}),k&&(0,d.jsx)(s.t,{variant:`ghost`,color:`neutral`,iconOnly:!0,shape:`circle`,className:t.t(`topbar-scroll-button`,`right`,!N&&`hidden`),onClick:()=>L(`right`),"aria-label":`Scroll topbar right`,children:(0,d.jsx)(e.Ni,{})})]})})})}function S({item:e,isActive:r,tabId:i,panelId:a,clickEffect:o,rippleColor:s,onSelect:c}){let{effectClassName:l,effectLayer:u,handlePointerDown:f,triggerEffect:p}=n.t({effect:o,disabled:e.disabled,centered:!0,color:s});return(0,d.jsxs)(`button`,{type:`button`,id:i,role:`tab`,"aria-selected":r,"aria-controls":a,tabIndex:r?0:-1,disabled:e.disabled,className:t.t(`tabs-trigger`,r&&`active`,e.disabled&&`disabled`,l),onPointerDown:f,onKeyDown:e=>{(e.key===` `||e.key===`Enter`)&&p(e.currentTarget)},onClick:()=>c(e.value),children:[u,e.icon&&(0,d.jsx)(`span`,{className:`tabs-icon`,children:e.icon}),(0,d.jsx)(`span`,{className:`tabs-label`,children:e.label})]})}function C({items:e,value:n,defaultValue:r,onValueChange:i,variant:a=`underline`,orientation:o=`horizontal`,size:s=`md`,fullWidth:c=!1,showPanels:l=!0,panelClassName:f,clickEffect:p=`ripple`,rippleColor:m,className:h,...g}){let[_,v]=(0,u.useState)((0,u.useMemo)(()=>r??e.find(e=>!e.disabled)?.value??``,[r,e])),y=n??_,b=e.find(e=>e.value===y)??e[0],x=(0,u.useId)();function C(e){n===void 0&&v(e),i?.(e)}function w(t){let n=e.filter(e=>!e.disabled),r=n.findIndex(e=>e.value===b?.value);if(r===-1)return;let i=o===`vertical`?[`ArrowDown`]:[`ArrowRight`,`ArrowDown`],a=o===`vertical`?[`ArrowUp`]:[`ArrowLeft`,`ArrowUp`];if(i.includes(t.key)){t.preventDefault();let e=n[(r+1)%n.length];C(e.value)}if(a.includes(t.key)){t.preventDefault();let e=n[(r-1+n.length)%n.length];C(e.value)}}return(0,d.jsxs)(`div`,{className:t.t(`tabs`,a,o,s,c&&`full-width`,h),...g,children:[(0,d.jsx)(`div`,{className:`tabs-list`,role:`tablist`,"aria-orientation":o,onKeyDown:w,children:e.map(e=>(0,d.jsx)(S,{item:e,isActive:e.value===b?.value,tabId:`${x}-${e.value}-tab`,panelId:`${x}-${e.value}-panel`,clickEffect:p,rippleColor:m,onSelect:C},e.value))}),l&&b?.content!==void 0&&(0,d.jsx)(`div`,{id:`${x}-${b.value}-panel`,role:`tabpanel`,"aria-labelledby":`${x}-${b.value}-tab`,className:t.t(`tabs-panel`,f),children:b.content},b.value)]})}function w({as:e=`section`,spacing:n=`lg`,tone:i=`default`,reveal:a,className:o,style:s,children:c,...l}){let u=e,f=r.t(a),p=a!==void 0&&a!==!1;return(0,d.jsx)(u,{ref:p?f:void 0,className:t.t(`section`,n,i,p&&`reveal`,o),style:s,...l,children:c})}function T({columns:e=2,minItemWidth:n,className:r,style:i,children:a,...o}){return(0,d.jsx)(`div`,{className:t.t(`grid`,`columns-${e}`,r),style:{...n?{"--grid-min-item-width":n}:{},...i},...o,children:a})}function E(e){return(0,u.isValidElement)(e)?e.type===j?!0:e.type===A&&e.props.type===`col`:!1}function D(e){return{span:e.span??e.xl??e.lg??e.md??e.sm,xl:e.xl??e.lg??e.md??e.sm,lg:e.lg??e.md??e.sm,md:e.md??e.sm,sm:e.sm}}function O(e,t){if(t<=0)return[];if(e<=0)return Array.from({length:t},()=>void 0);let n=Math.floor(e/t),r=e%t;return Array.from({length:t},(e,t)=>{let i=n+ +(t<r);return i>=1?i:void 0})}function k(e){let t=[`span`,`xl`,`lg`,`md`,`sm`],n=e.map(e=>D(e)),r=n.map(e=>({...e}));for(let e of t){let t=[],i=0;n.forEach((n,r)=>{let a=n[e];if(a){i+=a;return}t.push(r)});let a=O(Math.max(12-i,0),t.length);t.forEach((t,n)=>{r[t][e]=a[n]})}return r}function A({type:e=`row`,span:n,sm:r,md:a,lg:o,xl:s,spacing:c,padding:l,fsize:f,mt:p,mb:m,ml:h,mr:g,mx:_,my:v,pt:y,pb:b,pl:x,pr:S,px:C,py:w,fullWidth:T,className:D,style:O,children:A,...j}){let M=i.n({fsize:f}),N=n??s??o;if(e===`col`)return(0,d.jsx)(`div`,{className:t.t(`grid`,`col`,N?`span-${N}`:`span-auto`,s&&`xl-${s}`,o&&`lg-${o}`,a&&`md-${a}`,r&&`sm-${r}`,...i.t({spacing:c,padding:l,fsize:f,mt:p,mb:m,ml:h,mr:g,mx:_,my:v,pt:y,pb:b,pl:x,pr:S,px:C,py:w,fullWidth:T}),D),style:{...M,...O},...j,children:A});let P=u.Children.toArray(A),F=P.flatMap((e,t)=>E(e)?[{child:e,index:t}]:[]),I=Math.min(Math.max(F.length||P.length,1),12),L=F.some(({child:e})=>{let t=e.props;return!!(t.span||t.xl||t.lg||t.md||t.sm)}),R=L?k(F.map(({child:e})=>e.props)):null,z=L&&R?P.map((e,t)=>{let n=F.findIndex(e=>e.index===t);if(n===-1||!E(e))return e;let r=R[n];return(0,u.cloneElement)(e,{span:r.span,xl:r.xl,lg:r.lg,md:r.md,sm:r.sm})}):P;return(0,d.jsx)(`div`,{className:t.t(`grid`,`row`,L?`tracked`:`auto-cols-${I}`,...i.t({spacing:c,padding:l,fsize:f,mt:p,mb:m,ml:h,mr:g,mx:_,my:v,pt:y,pb:b,pl:x,pr:S,px:C,py:w,fullWidth:T??!0}),D),style:{...M,...O},...j,children:z})}function j({span:e,sm:t,md:n,lg:r,xl:i,...a}){return(0,d.jsx)(A,{type:`col`,span:e,sm:t,md:n,lg:r,xl:i,...a})}function M({orientation:e=`horizontal`,variant:n=`solid`,className:r,style:i,...a}){return(0,d.jsx)(`div`,{role:`separator`,"aria-orientation":e,className:t.t(`divider`,e,n,r),style:i,...a})}var N=`mineralui-sidebar`,P=(0,u.createContext)({mode:`expanded`,mobile:!1,mobileOpen:!1,canToggle:!1,toggleMode:()=>{}});function F(){return(0,u.useContext)(P)}function I(e){let[t,n]=(0,u.useState)(()=>typeof window<`u`?window.innerWidth<e:!1);return(0,u.useEffect)(()=>{let t=window.matchMedia(`(max-width: ${e-1}px)`),r=e=>n(e.matches);return n(t.matches),t.addEventListener(`change`,r),()=>t.removeEventListener(`change`,r)},[e]),t}function L({mode:n=`auto`,defaultMode:r=`expanded`,onModeChange:i,persist:a=!1,side:o=`left`,tone:s=`subtle`,bordered:c=!0,mobileBreakpoint:l=768,className:f,style:p,children:m}){let h=I(l),[g,_]=(0,u.useState)(!1),[v,y]=(0,u.useState)(()=>{if(a)try{let e=localStorage.getItem(N);if(e===`expanded`||e===`collapsed`)return e}catch{}return r}),b=n===`auto`?v:n===`collapsed`?`collapsed`:`expanded`,x=(0,u.useCallback)(()=>{let e=b===`expanded`?`collapsed`:`expanded`;if(y(e),i?.(e),a)try{localStorage.setItem(N,e)}catch{}},[b,i,a]),S=(0,u.useCallback)(()=>_(!1),[]);(0,u.useEffect)(()=>{if(!g)return;let e=e=>{e.key===`Escape`&&_(!1)};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[g]);let C=!h&&n===`auto`,w=(0,u.useMemo)(()=>({mode:b,mobile:h,mobileOpen:g,canToggle:C,toggleMode:x}),[b,h,g,C,x]),T=t.t(`sidebar`,s,o,!h&&b===`collapsed`&&`collapsed`,c&&`bordered`,h&&`mobile`,h&&g&&`mobile-open`,f);return(0,d.jsxs)(P.Provider,{value:w,children:[h&&g&&(0,d.jsx)(`div`,{className:`sidebar-backdrop`,onClick:S}),(0,d.jsx)(`aside`,{className:T,style:p,children:m}),h&&!g&&(0,d.jsx)(`button`,{className:t.t(`sidebar-hamburger`,o),onClick:()=>_(!0),"aria-label":`Open menu`,children:(0,d.jsx)(`span`,{className:`sidebar-hamburger-icon`,"aria-hidden":`true`,children:(0,d.jsx)(e.cn,{})})})]})}function R({bordered:n=!1,className:r,children:i}){let{mode:a,mobile:o,canToggle:c,toggleMode:l}=F(),u=!o&&a===`collapsed`;return(0,d.jsxs)(`div`,{className:t.t(`sidebar-header`,n&&`bordered`,r),children:[(0,d.jsx)(`div`,{className:`sidebar-header-content`,children:i}),c&&(0,d.jsx)(s.t,{variant:`outlined`,color:`neutral`,iconOnly:!0,size:`sm`,onClick:l,"aria-label":u?`Expand sidebar`:`Collapse sidebar`,className:`sidebar-toggle`,children:(0,d.jsx)(`span`,{className:t.t(`sidebar-chevron`,u&&`flipped`),children:(0,d.jsx)(e.Ni,{})})})]})}function z({className:e,children:n}){return(0,d.jsx)(`div`,{className:t.t(`sidebar-body`,e),children:n})}function B({className:e,children:n}){return(0,d.jsx)(`nav`,{className:t.t(`sidebar-nav`,e),children:n})}function V({icon:e,label:n,href:r,to:i,onClick:a,active:o=!1,disabled:s=!1,badge:l,color:u,component:f,className:p}){let{mode:m,mobile:h}=F(),g=!h&&m===`collapsed`,_=f??(r||i?`a`:`button`),v=f?i?{to:i}:r?{href:r}:{}:r?{href:r}:i?{href:i}:{};return(0,d.jsxs)(_,{className:t.t(`sidebar-item`,o&&`active`,s&&`disabled`,u,p),onClick:s?void 0:a,"aria-disabled":s||void 0,title:g?n:void 0,...v,children:[e&&(0,d.jsx)(`span`,{className:`sidebar-item-icon`,children:e}),!g&&(0,d.jsx)(c.t,{content:n,placement:`top`,className:`sidebar-item-label-tooltip`,children:(0,d.jsx)(`span`,{className:`sidebar-item-label`,children:n})}),!g&&l&&(0,d.jsx)(`span`,{className:`sidebar-item-badge`,children:l})]})}function H({label:n,icon:r,active:i=!1,defaultOpen:a=!0,collapsible:o=!0,children:s,className:c}){let f=F(),{mode:p,mobile:m}=f,h=!m&&p===`collapsed`,[g,_]=(0,u.useState)(a),v=(0,u.useMemo)(()=>({...f,mode:`expanded`}),[f]),y=()=>{o&&_(e=>!e)};if(h){let e=(0,d.jsx)(`span`,{className:t.t(`sidebar-group-icon collapsed`,i&&`active`),title:n,children:r});return(0,d.jsx)(`div`,{className:t.t(`sidebar-group`,c),children:(0,d.jsx)(l.i,{trigger:e,placement:`right-start`,closeOnSelect:!0,openOn:`hover`,children:(0,d.jsx)(P.Provider,{value:v,children:s})})})}return(0,d.jsxs)(`div`,{className:t.t(`sidebar-group`,c),children:[(0,d.jsxs)(`button`,{className:t.t(`sidebar-group-header`,i&&`active`),onClick:y,"aria-expanded":g,children:[r&&(0,d.jsx)(`span`,{className:`sidebar-group-icon`,children:r}),(0,d.jsx)(`span`,{className:`sidebar-group-label`,children:n}),o&&(0,d.jsx)(`span`,{className:t.t(`sidebar-group-arrow`,g&&`open`),children:(0,d.jsx)(e.Ni,{})})]}),g&&(0,d.jsx)(`div`,{className:`sidebar-group-items`,children:s})]})}function U({bordered:e=!1,className:n,children:r}){return(0,d.jsx)(`div`,{className:t.t(`sidebar-footer`,e&&`bordered`,n),children:r})}function W({className:e,spacing:n=`md`}){return(0,d.jsx)(`hr`,{className:t.t(`sidebar-divider`,n,e)})}function G({items:e,separator:n=`/`,maxItems:r,className:i,...a}){let o=(0,u.useMemo)(()=>{if(!r||r>=e.length)return e;if(r<2)return[e[e.length-1]];let t=e.slice(0,1),n=e.slice(-(r-1));return[...t,null,...n]},[e,r]);return(0,d.jsx)(`nav`,{"aria-label":`breadcrumb`,className:t.t(`breadcrumb`,i),...a,children:(0,d.jsx)(`ol`,{className:`trail`,children:o.map((e,r)=>{if(e===null)return(0,d.jsxs)(`li`,{className:`crumb dots`,children:[(0,d.jsx)(`span`,{className:`sep`,children:n}),(0,d.jsx)(`span`,{children:`…`})]},`ellipsis`);let i=r===o.length-1;return(0,d.jsxs)(`li`,{className:t.t(`crumb`,i&&`active`),children:[r>0&&(0,d.jsx)(`span`,{className:`sep`,children:n}),e.href&&!i?(0,d.jsx)(`a`,{href:e.href,className:`link`,onClick:e.onClick,children:e.label}):e.onClick&&!i?(0,d.jsx)(`button`,{type:`button`,className:`link btn`,onClick:e.onClick,children:e.label}):(0,d.jsx)(`span`,{className:`current`,"aria-current":i?`page`:void 0,children:e.label})]},r)})})})}var K=(0,u.forwardRef)(function({className:e,children:n,...r},i){let a=[],o=[];return u.Children.forEach(n,e=>{(0,u.isValidElement)(e)&&e.type===L?a.push(e):o.push(e)}),(0,d.jsxs)(`div`,{ref:i,className:t.t(`app-shell`,e),...r,children:[a,(0,d.jsx)(`div`,{className:`app-main`,children:o})]})}),q=(0,u.forwardRef)(function({className:e,children:n,...r},i){return(0,d.jsx)(`div`,{ref:i,className:t.t(`app-body`,e),...r,children:n})});Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return H}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return G}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return K}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return V}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return g}});
|
|
2
|
-
//# sourceMappingURL=layout-DgfsQ-Tn.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"layout-DgfsQ-Tn.cjs","names":[],"sources":["../src/components/layout/MContainer/MContainer.tsx","../src/components/layout/MHeader/MHeader.tsx","../src/components/layout/MFooter/MFooter.tsx","../src/components/layout/MNavs/MNavs.tsx","../src/components/layout/MNavbar/MNavbar.tsx","../src/components/layout/MTopbar/MTopbar.tsx","../src/components/layout/MTabs/MTabs.tsx","../src/components/layout/MSection/MSection.tsx","../src/components/layout/MSimpleGrid/MSimpleGrid.tsx","../src/components/layout/MGrid/MGrid.tsx","../src/components/layout/MDivider/MDivider.tsx","../src/components/layout/MSidebar/MSidebar.tsx","../src/components/layout/MBreadcrumb/MBreadcrumb.tsx","../src/components/layout/MAppShell/MAppShell.tsx"],"sourcesContent":["import type {MContainerProps} from './MContainer.types'\nimport {cn} from '../../../utils/cn'\nimport {getLayoutUtilityClassNames, getLayoutUtilityStyles} from '../../../utils/layoutProps'\nimport './MContainer.css'\n\n// Constrain page content widths and apply shared spacing utilities.\nexport function MContainer({\n size = 'content',\n padded = true,\n spacing,\n padding,\n fsize,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n className,\n style,\n children,\n ...rest\n}: MContainerProps) {\n const utilityStyle = getLayoutUtilityStyles({fsize})\n\n return (\n <div\n className={cn(\n 'container',\n size,\n padded && 'padded',\n ...getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n }),\n className\n )}\n style={{...utilityStyle, ...style}}\n {...rest}\n >\n {children}\n </div>\n )\n}\n","import type {MHeaderProps} from './MHeader.types'\nimport {cn} from '../../../utils/cn'\nimport {MContainer} from '../MContainer'\nimport './MHeader.css'\n\n// Render a reusable page header shell aligned to a shared container.\nexport function MHeader({\n container = 'wide',\n padded = true,\n bordered = true,\n sticky = false,\n tone = 'surface',\n layout = 'split',\n className,\n children,\n ...rest\n}: MHeaderProps) {\n return (\n <header className={cn('header', tone, bordered && 'bordered', sticky && 'sticky', className)} {...rest}>\n <MContainer size={container} padded={padded} className={cn('inner', `layout-${layout}`)}>\n {children}\n </MContainer>\n </header>\n )\n}\n","import type {MFooterProps} from './MFooter.types'\nimport {cn} from '../../../utils/cn'\nimport {getLayoutUtilityClassNames, getLayoutUtilityStyles} from '../../../utils/layoutProps'\nimport {MContainer} from '../MContainer'\nimport './MFooter.css'\n\n// Render a reusable page footer shell with shared spacing utilities.\nexport function MFooter({\n container = 'wide',\n padded = true,\n bordered = true,\n tone = 'surface',\n spacing,\n padding,\n fsize,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n className,\n style,\n children,\n ...rest\n}: MFooterProps) {\n const utilityStyle = getLayoutUtilityStyles({fsize})\n\n return (\n <footer\n className={cn(\n 'footer',\n tone,\n bordered && 'bordered',\n ...getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n }),\n className\n )}\n style={{...utilityStyle, ...style}}\n {...rest}\n >\n <MContainer size={container} padded={padded} className=\"inner\" fullWidth>\n {children}\n </MContainer>\n </footer>\n )\n}\n","import type {MNavsProps} from './MNavs.types'\nimport {cn} from '../../../utils/cn'\nimport {MLink} from '../../typography'\nimport './MNavs.css'\n\n// Render a lightweight navigation list from data or custom children.\nexport function MNavs({items, orientation = 'horizontal', wrap = false, className, children, ...rest}: MNavsProps) {\n return (\n <div className={cn('navs', orientation, wrap && 'wrap', className)} {...rest}>\n {items\n ? items.map((item) => {\n const Icon = item.icon\n const hideLabel = item.iconOnly === true && Icon != null\n const labelAsString = typeof item.label === 'string' ? item.label : undefined\n const ariaLabel = hideLabel ? labelAsString : undefined\n const linkTitle = item.title ?? (hideLabel ? labelAsString : undefined)\n\n return (\n <MLink\n key={\n item.key ??\n item.href ??\n item.title?.toString() ??\n (labelAsString ?? '')\n }\n component={item.component}\n href={item.href}\n to={item.to}\n target={item.target}\n rel={item.rel}\n title={linkTitle}\n current={item.current}\n disabled={item.disabled}\n className={cn('link', hideLabel && 'icon-only', item.className)}\n aria-label={ariaLabel}\n >\n {Icon ? (\n <span className='icon' aria-hidden={!hideLabel || undefined}>\n <Icon size={item.iconSize} />\n </span>\n ) : null}\n {!hideLabel ? item.label : null}\n </MLink>\n )\n })\n : children}\n </div>\n )\n}\n","import {Children, cloneElement, isValidElement, useEffect, useId, useRef, useState} from 'react'\nimport type {MouseEvent as ReactMouseEvent, ReactElement} from 'react'\nimport type {MNavbarProps} from './MNavbar.types'\nimport {cn} from '../../../utils/cn'\nimport {MContainer} from '../MContainer'\nimport {MInline} from '../MInline'\nimport type {MInlineProps} from '../MInline'\nimport {MNavs} from '../MNavs'\nimport type {MNavsProps} from '../MNavs'\nimport {MButton} from '../../controls/MButton'\nimport {MMenuIcon} from '../../../icons'\nimport './MNavbar.css'\n\n// Render a horizontal app or site navigation shell with container alignment.\n// Below the md breakpoint MNavs children are collapsed behind a hamburger toggle\n// that opens either a dropdown panel or a side drawer with the navigation items.\nexport function MNavbar({\n container = 'content',\n padded = true,\n bordered = true,\n sticky = false,\n tone = 'surface',\n justify = 'between',\n wrap = false,\n mobileMenu = 'dropdown',\n mobileMenuContent,\n mobileMenuLabel = 'Open navigation',\n className,\n children,\n ...rest\n}: MNavbarProps) {\n const [open, setOpen] = useState(false)\n const rootRef = useRef<HTMLElement | null>(null)\n const menuId = useId()\n\n const childArray = Children.toArray(children)\n\n const mobileNavs = childArray\n .filter((child): child is ReactElement<MNavsProps> => isValidElement(child) && child.type === MNavs)\n .map((child, index) =>\n cloneElement(child, {\n key: `mnavbar-mobile-navs-${index}`,\n orientation: 'vertical',\n }),\n )\n\n const toggleButton = (\n <MButton\n key=\"mnavbar-toggle\"\n type=\"button\"\n variant=\"ghost\"\n size=\"md\"\n iconOnly\n className=\"navbar-toggle\"\n aria-label={mobileMenuLabel}\n aria-expanded={open}\n aria-controls={menuId}\n onClick={handleToggleClick}\n >\n <MMenuIcon />\n </MButton>\n )\n\n let lastInlineIndex = -1\n for (let index = childArray.length - 1; index >= 0; index -= 1) {\n const child = childArray[index]\n if (isValidElement(child) && child.type === MInline) {\n lastInlineIndex = index\n break\n }\n }\n\n const renderedChildren = lastInlineIndex === -1\n ? [...childArray, toggleButton]\n : childArray.map((child, index) => {\n if (index !== lastInlineIndex) return child\n const inlineChild = child as ReactElement<MInlineProps>\n const inlineChildren = Children.toArray(inlineChild.props.children)\n return cloneElement(inlineChild, {\n key: inlineChild.key ?? `mnavbar-inline-${index}`,\n children: [...inlineChildren, toggleButton],\n })\n })\n\n useEffect(() => {\n if (!open) return\n\n function handlePointerDown(event: PointerEvent) {\n const root = rootRef.current\n if (!root) return\n if (event.target instanceof Node && root.contains(event.target)) return\n setOpen(false)\n }\n\n function handleKeydown(event: KeyboardEvent) {\n if (event.key === 'Escape') setOpen(false)\n }\n\n document.addEventListener('pointerdown', handlePointerDown)\n document.addEventListener('keydown', handleKeydown)\n return () => {\n document.removeEventListener('pointerdown', handlePointerDown)\n document.removeEventListener('keydown', handleKeydown)\n }\n }, [open])\n\n function handleToggleClick() {\n setOpen((previous) => !previous)\n }\n\n function handleMenuClick(event: ReactMouseEvent<HTMLDivElement>) {\n const target = event.target as HTMLElement | null\n if (!target) return\n if (target.closest('a, [role=\"menuitem\"]')) {\n setOpen(false)\n }\n }\n\n return (\n <nav\n ref={rootRef}\n className={cn(\n 'navbar',\n tone,\n bordered && 'bordered',\n sticky && 'sticky',\n open && 'mobile-open',\n `mobile-${mobileMenu}`,\n className,\n )}\n {...rest}\n >\n <MContainer size={container} padded={padded} className=\"container\">\n <div className={cn('inner', justify, wrap && 'wrap')}>\n {renderedChildren}\n </div>\n </MContainer>\n\n {mobileMenu === 'drawer' && <div className={cn('mobile-backdrop', open && 'visible')} aria-hidden />}\n\n <div\n id={menuId}\n className={cn('mobile-menu', mobileMenu, open && 'open')}\n role=\"menu\"\n aria-hidden={!open || undefined}\n onClick={handleMenuClick}\n >\n {mobileNavs}\n {mobileMenuContent}\n </div>\n </nav>\n )\n}\n","import {useEffect, useMemo, useRef, useState} from 'react'\nimport type {ReactNode} from 'react'\nimport type {MTopbarItem, MTopbarProps} from './MTopbar.types'\nimport {cn} from '../../../utils/cn'\nimport {MContainer} from '../MContainer'\nimport {MButton} from '../../controls'\nimport {MLink} from '../../typography'\nimport {MChevronDownIcon, MChevronLeftIcon, MChevronRightIcon} from '../../../icons'\nimport {MDropdownGroup, MDropdownItem, MDropdownMenu} from '../../overlays/MDropdownMenu'\nimport './MTopbar.css'\n\nfunction getItemKey(item: MTopbarItem): string {\n return item.key ?? item.to ?? item.href ?? String(item.label)\n}\n\nfunction itemHasActiveDescendant(item: MTopbarItem): boolean {\n if (item.active) return true\n return (item.children ?? []).some(itemHasActiveDescendant)\n}\n\nfunction renderItemContent(item: MTopbarItem, withChevron = false, isOpen = false): ReactNode {\n return (\n <>\n {item.icon ? <span className=\"topbar-icon\">{item.icon}</span> : null}\n <span>{item.label}</span>\n {item.badge ? <span className=\"topbar-badge\">{item.badge}</span> : null}\n {withChevron ? (\n <span className={cn('topbar-chevron', isOpen && 'open')} aria-hidden=\"true\">\n <MChevronDownIcon size=\"sm\" />\n </span>\n ) : null}\n </>\n )\n}\n\nfunction renderDropdownChildren(children: MTopbarItem[]): ReactNode {\n return children.map((child) => {\n if (child.children?.length) {\n return (\n <MDropdownGroup key={getItemKey(child)} label={String(child.label)}>\n {renderDropdownChildren(child.children)}\n </MDropdownGroup>\n )\n }\n\n return (\n <MDropdownItem\n key={getItemKey(child)}\n icon={child.icon}\n label={child.label}\n href={child.href}\n to={child.to}\n onClick={child.onClick}\n color={child.color}\n disabled={child.disabled}\n active={child.active}\n component={child.component}\n className={child.className}\n />\n )\n })\n}\n\nexport function MTopbar({\n items,\n container = 'full',\n padded = true,\n bordered = true,\n sticky = false,\n tone = 'surface',\n justify = 'left',\n size = 'md',\n openOn = 'hover',\n dropdownPlacement = 'bottom-start',\n className,\n style,\n ...rest\n}: MTopbarProps) {\n const [coarsePointer, setCoarsePointer] = useState(false)\n const [openMap, setOpenMap] = useState<Record<string, boolean>>({})\n const [hasOverflow, setHasOverflow] = useState(false)\n const [canScrollLeft, setCanScrollLeft] = useState(false)\n const [canScrollRight, setCanScrollRight] = useState(false)\n const viewportRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const media = window.matchMedia('(pointer: coarse)')\n const sync = () => setCoarsePointer(media.matches)\n\n sync()\n\n if (typeof media.addEventListener === 'function') {\n media.addEventListener('change', sync)\n return () => media.removeEventListener('change', sync)\n }\n\n media.addListener(sync)\n return () => media.removeListener(sync)\n }, [])\n\n useEffect(() => {\n const viewport = viewportRef.current\n if (!viewport) return\n\n const updateOverflow = () => {\n const nextHasOverflow = viewport.scrollWidth > viewport.clientWidth + 1\n setHasOverflow(nextHasOverflow)\n setCanScrollLeft(viewport.scrollLeft > 4)\n setCanScrollRight(viewport.scrollLeft + viewport.clientWidth < viewport.scrollWidth - 4)\n }\n\n updateOverflow()\n\n viewport.addEventListener('scroll', updateOverflow, {passive: true})\n\n const observer = new ResizeObserver(updateOverflow)\n observer.observe(viewport)\n Array.from(viewport.children).forEach((child) => observer.observe(child))\n\n return () => {\n viewport.removeEventListener('scroll', updateOverflow)\n observer.disconnect()\n }\n }, [items, justify, size, tone, bordered, padded, container])\n\n const resolvedOpenOn = useMemo(() => (coarsePointer ? 'click' : openOn), [coarsePointer, openOn])\n\n const scrollByAmount = (direction: 'left' | 'right') => {\n const viewport = viewportRef.current\n if (!viewport) return\n\n const amount = Math.max(180, Math.floor(viewport.clientWidth * 0.45))\n viewport.scrollBy({\n left: direction === 'left' ? -amount : amount,\n behavior: 'smooth',\n })\n }\n\n return (\n <nav\n className={cn('topbar', tone, size, bordered && 'bordered', sticky && 'sticky', className)}\n style={style}\n {...rest}\n >\n <MContainer size={container} padded={padded} className=\"topbar-container\">\n <div className={cn('topbar-scroll-shell', hasOverflow && 'overflowing')}>\n {hasOverflow && (\n <MButton\n variant=\"ghost\"\n color=\"neutral\"\n iconOnly\n shape=\"circle\"\n className={cn('topbar-scroll-button', 'left', !canScrollLeft && 'hidden')}\n onClick={() => scrollByAmount('left')}\n aria-label=\"Scroll topbar left\"\n >\n <MChevronLeftIcon />\n </MButton>\n )}\n\n <div ref={viewportRef} className=\"topbar-viewport\">\n <div className={cn('topbar-list', `justify-${justify}`, hasOverflow && 'overflowing')}>\n {items.map((item) => {\n const itemKey = getItemKey(item)\n const isActive = itemHasActiveDescendant(item)\n const isOpen = !!openMap[itemKey]\n\n if (item.children?.length) {\n if (item.disabled) {\n return (\n <div\n key={itemKey}\n className={cn('topbar-trigger', item.color, 'disabled', item.className)}\n aria-disabled=\"true\"\n >\n {renderItemContent(item, true)}\n </div>\n )\n }\n\n return (\n <MDropdownMenu\n key={itemKey}\n trigger={\n <div\n className={cn(\n 'topbar-trigger',\n item.color,\n isActive && 'active',\n isOpen && 'open',\n item.disabled && 'disabled',\n item.className\n )}\n >\n {renderItemContent(item, true, isOpen)}\n </div>\n }\n openOn={item.openOn ?? resolvedOpenOn}\n onOpenChange={(nextOpen) =>\n setOpenMap((prev) => ({...prev, [itemKey]: nextOpen}))\n }\n placement={dropdownPlacement}\n popoverClassName=\"topbar-dropdown-popover\"\n >\n {renderDropdownChildren(item.children)}\n </MDropdownMenu>\n )\n }\n\n return (\n <MLink\n key={itemKey}\n component={item.component}\n href={item.href}\n to={item.to}\n onClick={item.onClick}\n current={item.active}\n disabled={item.disabled}\n underline=\"none\"\n tone=\"inherit\"\n className={cn(\n 'topbar-link',\n item.color,\n item.className,\n item.active && 'active'\n )}\n >\n {renderItemContent(item)}\n </MLink>\n )\n })}\n </div>\n </div>\n\n {hasOverflow && (\n <MButton\n variant=\"ghost\"\n color=\"neutral\"\n iconOnly\n shape=\"circle\"\n className={cn('topbar-scroll-button', 'right', !canScrollRight && 'hidden')}\n onClick={() => scrollByAmount('right')}\n aria-label=\"Scroll topbar right\"\n >\n <MChevronRightIcon />\n </MButton>\n )}\n </div>\n </MContainer>\n </nav>\n )\n}\n","import {useId, useMemo, useState} from 'react'\nimport type {KeyboardEvent} from 'react'\nimport type {MTabsItem, MTabsProps} from './MTabs.types'\nimport {cn} from '../../../utils/cn'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport './MTabs.css'\n\ninterface MTabsTriggerProps {\n item: MTabsItem\n isActive: boolean\n tabId: string\n panelId: string\n clickEffect: MTabsProps['clickEffect']\n rippleColor: string | undefined\n onSelect: (value: string) => void\n}\n\n// Keep the tab trigger behavior isolated from the list and panel rendering.\nfunction MTabsTrigger({item, isActive, tabId, panelId, clickEffect, rippleColor, onSelect}: MTabsTriggerProps) {\n const {effectClassName, effectLayer, handlePointerDown, triggerEffect} = useInteractionEffect<HTMLButtonElement>({\n effect: clickEffect,\n disabled: item.disabled,\n centered: true,\n color: rippleColor,\n })\n\n return (\n <button\n type=\"button\"\n id={tabId}\n role=\"tab\"\n aria-selected={isActive}\n aria-controls={panelId}\n tabIndex={isActive ? 0 : -1}\n disabled={item.disabled}\n className={cn('tabs-trigger', isActive && 'active', item.disabled && 'disabled', effectClassName)}\n onPointerDown={handlePointerDown}\n onKeyDown={(event) => {\n if (event.key === ' ' || event.key === 'Enter') {\n triggerEffect(event.currentTarget)\n }\n }}\n onClick={() => onSelect(item.value)}\n >\n {effectLayer}\n {item.icon && <span className=\"tabs-icon\">{item.icon}</span>}\n <span className=\"tabs-label\">{item.label}</span>\n </button>\n )\n}\n\nexport function MTabs({\n items,\n value,\n defaultValue,\n onValueChange,\n variant = 'underline',\n orientation = 'horizontal',\n size = 'md',\n fullWidth = false,\n showPanels = true,\n panelClassName,\n clickEffect = 'ripple',\n rippleColor,\n className,\n ...rest\n}: MTabsProps) {\n // Pick the first enabled item when the caller does not control the active tab.\n const fallbackValue = useMemo(\n () => defaultValue ?? items.find((item) => !item.disabled)?.value ?? '',\n [defaultValue, items]\n )\n const [internalValue, setInternalValue] = useState(fallbackValue)\n const activeValue = value ?? internalValue\n const activeItem = items.find((item) => item.value === activeValue) ?? items[0]\n const baseId = useId()\n\n // Support both controlled and uncontrolled tab state.\n function selectTab(nextValue: string) {\n if (value === undefined) {\n setInternalValue(nextValue)\n }\n onValueChange?.(nextValue)\n }\n\n // Re-map keyboard navigation depending on the rendered orientation.\n function handleKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n const enabledItems = items.filter((item) => !item.disabled)\n const currentIndex = enabledItems.findIndex((item) => item.value === activeItem?.value)\n\n if (currentIndex === -1) {\n return\n }\n\n const nextKeys = orientation === 'vertical' ? ['ArrowDown'] : ['ArrowRight', 'ArrowDown']\n const previousKeys = orientation === 'vertical' ? ['ArrowUp'] : ['ArrowLeft', 'ArrowUp']\n\n if (nextKeys.includes(event.key)) {\n event.preventDefault()\n const nextItem = enabledItems[(currentIndex + 1) % enabledItems.length]\n selectTab(nextItem.value)\n }\n\n if (previousKeys.includes(event.key)) {\n event.preventDefault()\n const nextItem = enabledItems[(currentIndex - 1 + enabledItems.length) % enabledItems.length]\n selectTab(nextItem.value)\n }\n }\n\n return (\n <div className={cn('tabs', variant, orientation, size, fullWidth && 'full-width', className)} {...rest}>\n <div className=\"tabs-list\" role=\"tablist\" aria-orientation={orientation} onKeyDown={handleKeyDown}>\n {items.map((item) => {\n const isActive = item.value === activeItem?.value\n const tabId = `${baseId}-${item.value}-tab`\n const panelId = `${baseId}-${item.value}-panel`\n\n return (\n <MTabsTrigger\n key={item.value}\n item={item}\n isActive={isActive}\n tabId={tabId}\n panelId={panelId}\n clickEffect={clickEffect}\n rippleColor={rippleColor}\n onSelect={selectTab}\n />\n )\n })}\n </div>\n\n {showPanels && activeItem?.content !== undefined && (\n <div\n key={activeItem.value}\n id={`${baseId}-${activeItem.value}-panel`}\n role=\"tabpanel\"\n aria-labelledby={`${baseId}-${activeItem.value}-tab`}\n className={cn('tabs-panel', panelClassName)}\n >\n {activeItem.content}\n </div>\n )}\n </div>\n )\n}\n","import type React from 'react'\nimport type {MSectionProps} from './MSection.types'\nimport {cn} from '../../../utils/cn'\nimport {useReveal} from '../../../utils/useReveal'\nimport './MSection.css'\n\n// Render a semantic page section with predefined spacing and tone.\nexport function MSection({\n as = 'section',\n spacing = 'lg',\n tone = 'default',\n reveal,\n className,\n style,\n children,\n ...rest\n}: MSectionProps) {\n const Component = as\n const revealRef = useReveal(reveal)\n const hasReveal = reveal !== undefined && reveal !== false\n\n return (\n <Component\n ref={hasReveal ? (revealRef as React.RefObject<never>) : undefined}\n className={cn('section', spacing, tone, hasReveal && 'reveal', className)}\n style={style}\n {...rest}\n >\n {children}\n </Component>\n )\n}\n","import type {MSimpleGridProps} from './MSimpleGrid.types'\nimport {cn} from '../../../utils/cn'\nimport './MSimpleGrid.css'\n\n// Render a simple equal-column grid with a shared default spacing.\nexport function MSimpleGrid({columns = 2, minItemWidth, className, style, children, ...rest}: MSimpleGridProps) {\n return (\n <div\n className={cn('grid', `columns-${columns}`, className)}\n style={{\n ...(minItemWidth ? {'--grid-min-item-width': minItemWidth} : {}),\n ...style,\n }}\n {...rest}\n >\n {children}\n </div>\n )\n}\n","import {Children, cloneElement, isValidElement} from 'react'\nimport type {ReactElement} from 'react'\nimport type {MGridColumns, MGridItemProps, MGridProps} from './MGrid.types'\nimport {cn} from '../../../utils/cn'\nimport {getLayoutUtilityClassNames, getLayoutUtilityStyles} from '../../../utils/layoutProps'\nimport './MGrid.css'\n\ntype GridBreakpoint = 'span' | 'xl' | 'lg' | 'md' | 'sm'\n\nfunction isGridColumnElement(child: unknown): child is ReactElement<MGridProps | MGridItemProps> {\n if (!isValidElement(child)) {\n return false\n }\n\n if (child.type === MGridItem) {\n return true\n }\n\n return child.type === MGrid && (child.props as MGridProps).type === 'col'\n}\n\nfunction getNormalizedSpans(props: Partial<MGridProps>) {\n return {\n span: props.span ?? props.xl ?? props.lg ?? props.md ?? props.sm,\n xl: props.xl ?? props.lg ?? props.md ?? props.sm,\n lg: props.lg ?? props.md ?? props.sm,\n md: props.md ?? props.sm,\n sm: props.sm,\n }\n}\n\nfunction distributeRemainingColumns(remaining: number, count: number): Array<MGridColumns | undefined> {\n if (count <= 0) {\n return []\n }\n\n if (remaining <= 0) {\n return Array.from({length: count}, () => undefined)\n }\n\n const base = Math.floor(remaining / count)\n const extra = remaining % count\n\n return Array.from({length: count}, (_, index) => {\n const value = base + (index < extra ? 1 : 0)\n return value >= 1 ? (value as MGridColumns) : undefined\n })\n}\n\nfunction resolveAutoSpans(columnProps: Array<Partial<MGridProps>>) {\n const breakpoints: GridBreakpoint[] = ['span', 'xl', 'lg', 'md', 'sm']\n const normalized = columnProps.map((props) => getNormalizedSpans(props))\n const resolved = normalized.map((spans) => ({...spans}))\n\n for (const breakpoint of breakpoints) {\n const autoIndexes: number[] = []\n let usedColumns = 0\n\n normalized.forEach((spans, index) => {\n const value = spans[breakpoint]\n\n if (value) {\n usedColumns += value\n return\n }\n\n autoIndexes.push(index)\n })\n\n const distributed = distributeRemainingColumns(Math.max(12 - usedColumns, 0), autoIndexes.length)\n\n autoIndexes.forEach((columnIndex, autoIndex) => {\n resolved[columnIndex][breakpoint] = distributed[autoIndex]\n })\n }\n\n return resolved\n}\n\n// Render either a responsive row or a responsive column using one shared grid API.\nexport function MGrid({\n type = 'row',\n span,\n sm,\n md,\n lg,\n xl,\n spacing,\n padding,\n fsize,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n className,\n style,\n children,\n ...rest\n}: MGridProps) {\n const utilityStyle = getLayoutUtilityStyles({fsize})\n const baseSpan = span ?? xl ?? lg\n\n if (type === 'col') {\n return (\n <div\n className={cn(\n 'grid',\n 'col',\n baseSpan ? `span-${baseSpan}` : 'span-auto',\n xl && `xl-${xl}`,\n lg && `lg-${lg}`,\n md && `md-${md}`,\n sm && `sm-${sm}`,\n ...getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n }),\n className\n )}\n style={{...utilityStyle, ...style}}\n {...rest}\n >\n {children}\n </div>\n )\n }\n\n const childArray = Children.toArray(children)\n const columnEntries = childArray.flatMap((child, index) => (isGridColumnElement(child) ? [{child, index}] : []))\n const autoColumns = Math.min(Math.max(columnEntries.length || childArray.length, 1), 12)\n const hasTrackedSizing = columnEntries.some(({child}) => {\n const p = child.props as MGridProps\n return Boolean(p.span || p.xl || p.lg || p.md || p.sm)\n })\n const resolvedSpans = hasTrackedSizing\n ? resolveAutoSpans(columnEntries.map(({child}) => child.props as Partial<MGridProps>))\n : null\n const resolvedChildren =\n hasTrackedSizing && resolvedSpans\n ? childArray.map((child, childIndex) => {\n const columnIndex = columnEntries.findIndex((entry) => entry.index === childIndex)\n\n if (columnIndex === -1 || !isGridColumnElement(child)) {\n return child\n }\n\n const spans = resolvedSpans[columnIndex]\n\n return cloneElement(child, {\n span: spans.span,\n xl: spans.xl,\n lg: spans.lg,\n md: spans.md,\n sm: spans.sm,\n })\n })\n : childArray\n\n return (\n <div\n className={cn(\n 'grid',\n 'row',\n hasTrackedSizing ? 'tracked' : `auto-cols-${autoColumns}`,\n ...getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth: fullWidth ?? true,\n }),\n className\n )}\n style={{...utilityStyle, ...style}}\n {...rest}\n >\n {resolvedChildren}\n </div>\n )\n}\n\n// Keep MGridItem as a compatibility alias for explicit column declarations.\nexport function MGridItem({span, sm, md, lg, xl, ...rest}: MGridItemProps) {\n return <MGrid type=\"col\" span={span} sm={sm} md={md} lg={lg} xl={xl} {...rest} />\n}\n","import type {MDividerProps} from './MDivider.types'\nimport {cn} from '../../../utils/cn'\nimport './MDivider.css'\n\n// Render a semantic divider line between related content blocks.\nexport function MDivider({orientation = 'horizontal', variant = 'solid', className, style, ...rest}: MDividerProps) {\n return (\n <div\n role=\"separator\"\n aria-orientation={orientation}\n className={cn('divider', orientation, variant, className)}\n style={style}\n {...rest}\n />\n )\n}\n","import {createContext, useContext, useState, useEffect, useCallback, useMemo} from 'react'\nimport {cn} from '../../../utils/cn'\nimport {MButton} from '../../controls'\nimport {MChevronRightIcon, MMenuIcon} from '../../../icons'\nimport {MDropdownMenu, MTooltip} from '../../overlays'\nimport type {\n MSidebarProps,\n MSidebarHeaderProps,\n MSidebarBodyProps,\n MSidebarNavProps,\n MSidebarItemProps,\n MSidebarGroupProps,\n MSidebarFooterProps,\n MSidebarDividerProps,\n MSidebarMode,\n} from './MSidebar.types'\nimport './MSidebar.css'\n\nconst STORAGE_KEY = 'mineralui-sidebar'\n\ninterface SidebarContextValue {\n mode: MSidebarMode\n mobile: boolean\n mobileOpen: boolean\n canToggle: boolean\n toggleMode: () => void\n}\n\nconst SidebarCtx = createContext<SidebarContextValue>({\n mode: 'expanded',\n mobile: false,\n mobileOpen: false,\n canToggle: false,\n toggleMode: () => {},\n})\n\n// Read shared sidebar state inside slot components.\nfunction useSidebar() {\n return useContext(SidebarCtx)\n}\n\n// Track the responsive breakpoint once for the whole sidebar tree.\nfunction useIsMobile(breakpoint: number): boolean {\n const [mobile, setMobile] = useState(() => (typeof window !== 'undefined' ? window.innerWidth < breakpoint : false))\n\n useEffect(() => {\n const mq = window.matchMedia(`(max-width: ${breakpoint - 1}px)`)\n const handler = (e: MediaQueryListEvent) => setMobile(e.matches)\n\n setMobile(mq.matches)\n mq.addEventListener('change', handler)\n return () => mq.removeEventListener('change', handler)\n }, [breakpoint])\n\n return mobile\n}\n\n// Render the sidebar shell and coordinate desktop and mobile behavior.\nexport function MSidebar({\n mode: modeProp = 'auto',\n defaultMode = 'expanded',\n onModeChange,\n persist = false,\n side = 'left',\n tone = 'subtle',\n bordered = true,\n mobileBreakpoint = 768,\n className,\n style,\n children,\n}: MSidebarProps) {\n const mobile = useIsMobile(mobileBreakpoint)\n const [mobileOpen, setMobileOpen] = useState(false)\n\n const [internalMode, setInternalMode] = useState<MSidebarMode>(() => {\n if (persist) {\n try {\n const v = localStorage.getItem(STORAGE_KEY)\n if (v === 'expanded' || v === 'collapsed') return v\n } catch {\n /* noop */\n }\n }\n\n return defaultMode\n })\n\n const resolvedMode: MSidebarMode =\n modeProp === 'auto' ? internalMode : modeProp === 'collapsed' ? 'collapsed' : 'expanded'\n\n // MToggle only the desktop width state. Mobile uses its own overlay flow.\n const toggleMode = useCallback(() => {\n const next: MSidebarMode = resolvedMode === 'expanded' ? 'collapsed' : 'expanded'\n\n setInternalMode(next)\n onModeChange?.(next)\n\n if (persist) {\n try {\n localStorage.setItem(STORAGE_KEY, next)\n } catch {\n /* noop */\n }\n }\n }, [resolvedMode, onModeChange, persist])\n\n const closeMobile = useCallback(() => setMobileOpen(false), [])\n\n // Let Escape close the temporary mobile drawer.\n useEffect(() => {\n if (!mobileOpen) return\n\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setMobileOpen(false)\n }\n\n document.addEventListener('keydown', handler)\n return () => document.removeEventListener('keydown', handler)\n }, [mobileOpen])\n\n const canToggle = !mobile && modeProp === 'auto'\n\n const ctx = useMemo<SidebarContextValue>(\n () => ({mode: resolvedMode, mobile, mobileOpen, canToggle, toggleMode}),\n [resolvedMode, mobile, mobileOpen, canToggle, toggleMode]\n )\n\n const isCollapsed = !mobile && resolvedMode === 'collapsed'\n\n const sidebarCls = cn(\n 'sidebar',\n tone,\n side,\n isCollapsed && 'collapsed',\n bordered && 'bordered',\n mobile && 'mobile',\n mobile && mobileOpen && 'mobile-open',\n className\n )\n\n return (\n <SidebarCtx.Provider value={ctx}>\n {mobile && mobileOpen && <div className=\"sidebar-backdrop\" onClick={closeMobile} />}\n\n <aside className={sidebarCls} style={style}>\n {children}\n </aside>\n\n {mobile && !mobileOpen && (\n <button\n className={cn('sidebar-hamburger', side)}\n onClick={() => setMobileOpen(true)}\n aria-label=\"Open menu\"\n >\n <span className=\"sidebar-hamburger-icon\" aria-hidden=\"true\">\n <MMenuIcon />\n </span>\n </button>\n )}\n </SidebarCtx.Provider>\n )\n}\n\n// Render the top area with branding and an optional collapse toggle.\nexport function MSidebarHeader({bordered = false, className, children}: MSidebarHeaderProps) {\n const {mode, mobile, canToggle, toggleMode} = useSidebar()\n const isCollapsed = !mobile && mode === 'collapsed'\n\n return (\n <div className={cn('sidebar-header', bordered && 'bordered', className)}>\n <div className=\"sidebar-header-content\">{children}</div>\n {canToggle && (\n <MButton\n variant=\"outlined\"\n color=\"neutral\"\n iconOnly\n size=\"sm\"\n onClick={toggleMode}\n aria-label={isCollapsed ? 'Expand sidebar' : 'Collapse sidebar'}\n className=\"sidebar-toggle\"\n >\n <span className={cn('sidebar-chevron', isCollapsed && 'flipped')}>\n <MChevronRightIcon />\n </span>\n </MButton>\n )}\n </div>\n )\n}\n\n// Wrap the scrollable middle area between header and footer.\nexport function MSidebarBody({className, children}: MSidebarBodyProps) {\n return <div className={cn('sidebar-body', className)}>{children}</div>\n}\n\n// Wrap sidebar links in a navigation landmark.\nexport function MSidebarNav({className, children}: MSidebarNavProps) {\n return <nav className={cn('sidebar-nav', className)}>{children}</nav>\n}\n\n// Render one clickable sidebar row as a link, button or custom component.\nexport function MSidebarItem({\n icon,\n label,\n href,\n to,\n onClick,\n active = false,\n disabled = false,\n badge,\n color,\n component,\n className,\n}: MSidebarItemProps) {\n const {mode, mobile} = useSidebar()\n const isCollapsed = !mobile && mode === 'collapsed'\n\n const Tag = component ?? (href || to ? 'a' : 'button')\n const linkProps = component ? (to ? {to} : href ? {href} : {}) : href ? {href} : to ? {href: to} : {}\n const cls = cn('sidebar-item', active && 'active', disabled && 'disabled', color, className)\n\n return (\n <Tag\n className={cls}\n onClick={disabled ? undefined : onClick}\n aria-disabled={disabled || undefined}\n title={isCollapsed ? label : undefined}\n {...linkProps}\n >\n {icon && <span className=\"sidebar-item-icon\">{icon}</span>}\n {!isCollapsed && (\n <MTooltip content={label} placement=\"top\" className=\"sidebar-item-label-tooltip\">\n <span className=\"sidebar-item-label\">{label}</span>\n </MTooltip>\n )}\n {!isCollapsed && badge && <span className=\"sidebar-item-badge\">{badge}</span>}\n </Tag>\n )\n}\n\n// Group related sidebar items and swap to a dropdown when collapsed.\nexport function MSidebarGroup({\n label,\n icon,\n active = false,\n defaultOpen = true,\n collapsible = true,\n children,\n className,\n}: MSidebarGroupProps) {\n const sidebarCtx = useSidebar()\n const {mode, mobile} = sidebarCtx\n const isCollapsed = !mobile && mode === 'collapsed'\n const [open, setOpen] = useState(defaultOpen)\n\n const expandedCtx = useMemo<SidebarContextValue>(() => ({...sidebarCtx, mode: 'expanded'}), [sidebarCtx])\n\n // Keep expand/collapse local to this group.\n const toggle = () => {\n if (collapsible) setOpen((o) => !o)\n }\n\n if (isCollapsed) {\n const trigger = (\n <span className={cn('sidebar-group-icon collapsed', active && 'active')} title={label}>\n {icon}\n </span>\n )\n\n return (\n <div className={cn('sidebar-group', className)}>\n <MDropdownMenu trigger={trigger} placement=\"right-start\" closeOnSelect openOn=\"hover\">\n <SidebarCtx.Provider value={expandedCtx}>{children}</SidebarCtx.Provider>\n </MDropdownMenu>\n </div>\n )\n }\n\n return (\n <div className={cn('sidebar-group', className)}>\n <button className={cn('sidebar-group-header', active && 'active')} onClick={toggle} aria-expanded={open}>\n {icon && <span className=\"sidebar-group-icon\">{icon}</span>}\n <span className=\"sidebar-group-label\">{label}</span>\n {collapsible && (\n <span className={cn('sidebar-group-arrow', open && 'open')}>\n <MChevronRightIcon />\n </span>\n )}\n </button>\n {open && <div className=\"sidebar-group-items\">{children}</div>}\n </div>\n )\n}\n\n// Render the bottom slot for version info or quick actions.\nexport function MSidebarFooter({bordered = false, className, children}: MSidebarFooterProps) {\n return <div className={cn('sidebar-footer', bordered && 'bordered', className)}>{children}</div>\n}\n\n// Render a spacing-aware divider between sidebar regions.\nexport function MSidebarDivider({className, spacing = 'md'}: MSidebarDividerProps) {\n return <hr className={cn('sidebar-divider', spacing, className)} />\n}\n","import {useMemo} from 'react'\nimport {cn} from '../../../utils/cn'\nimport type {MBreadcrumbProps} from './MBreadcrumb.types'\nimport './MBreadcrumb.css'\n\n// Render a compact path and collapse the middle when needed.\nexport function MBreadcrumb({items, separator = '/', maxItems, className, ...rest}: MBreadcrumbProps) {\n // Keep the current page visible while shortening deep paths.\n const visible = useMemo(() => {\n if (!maxItems || maxItems >= items.length) return items\n if (maxItems < 2) return [items[items.length - 1]]\n const head = items.slice(0, 1)\n const tail = items.slice(-(maxItems - 1))\n return [...head, null, ...tail]\n }, [items, maxItems])\n\n return (\n <nav aria-label=\"breadcrumb\" className={cn('breadcrumb', className)} {...rest}>\n <ol className=\"trail\">\n {visible.map((item, i) => {\n if (item === null) {\n return (\n <li key=\"ellipsis\" className=\"crumb dots\">\n <span className=\"sep\">{separator}</span>\n <span>…</span>\n </li>\n )\n }\n\n const isLast = i === visible.length - 1\n\n return (\n <li key={i} className={cn('crumb', isLast && 'active')}>\n {i > 0 && <span className=\"sep\">{separator}</span>}\n {item.href && !isLast ? (\n <a href={item.href} className=\"link\" onClick={item.onClick}>\n {item.label}\n </a>\n ) : item.onClick && !isLast ? (\n <button type=\"button\" className=\"link btn\" onClick={item.onClick}>\n {item.label}\n </button>\n ) : (\n <span className=\"current\" aria-current={isLast ? 'page' : undefined}>\n {item.label}\n </span>\n )}\n </li>\n )\n })}\n </ol>\n </nav>\n )\n}\n","import {forwardRef, Children, isValidElement} from 'react'\nimport type * as React from 'react'\nimport type {MAppShellProps, MBodyProps} from './MAppShell.types'\nimport {cn} from '../../../utils/cn'\nimport {MSidebar} from '../MSidebar'\nimport './MAppShell.css'\n\nexport const MAppShell = forwardRef<HTMLDivElement, MAppShellProps>(function MAppShell(\n {className, children, ...rest},\n ref\n) {\n const sidebarElements: React.ReactNode[] = []\n const otherElements: React.ReactNode[] = []\n\n Children.forEach(children, (child) => {\n if (isValidElement(child) && child.type === MSidebar) {\n sidebarElements.push(child)\n } else {\n otherElements.push(child)\n }\n })\n\n return (\n <div ref={ref} className={cn('app-shell', className)} {...rest}>\n {sidebarElements}\n <div className=\"app-main\">{otherElements}</div>\n </div>\n )\n})\n\nexport const MBody = forwardRef<HTMLDivElement, MBodyProps>(function MBody({className, children, ...rest}, ref) {\n return (\n <div ref={ref} className={cn('app-body', className)} {...rest}>\n {children}\n </div>\n )\n})\n"],"mappings":"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"}
|
package/dist/media-D5YGOTm7.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require(`./icons-Dv1T-cF4.cjs`),t=require(`./cn-CU5TNITO.cjs`),n=require(`./useInteractionEffect-DnEfbCrX.cjs`),r=require(`./MButton-B8rXmFX9.cjs`),i=require(`./MSkeleton-BfRBJ6ku.cjs`),a=require(`./MImage-BsQJ_eYf.cjs`),o=require(`./MAvatar-DJKtca9j.cjs`);let s=require(`react`),c=require(`react/jsx-runtime`);function l({items:e,columns:n=3,rounded:r=!0,clickEffect:i=`ripple`,className:a,...o}){return(0,c.jsx)(`div`,{className:t.t(`gallery`,`columns-${n}`,a),...o,children:e.map((e,t)=>(0,c.jsx)(u,{item:e,rounded:r,clickEffect:i},t))})}function u({item:e,rounded:r,clickEffect:i}){let{effectClassName:a,effectLayer:o,handlePointerDown:s}=n.t({effect:i});return(0,c.jsxs)(`figure`,{className:t.t(`gallery-item`,r&&`rounded`,a),onPointerDown:s,children:[(0,c.jsx)(`img`,{className:`gallery-image`,src:e.src,alt:e.alt||``,loading:`lazy`}),e.caption&&(0,c.jsx)(`figcaption`,{className:`gallery-caption`,children:e.caption}),o]})}function d({autoPlay:n=!1,interval:i=5e3,showDots:a=!0,showArrows:o=!0,loop:l=!0,draggable:u=!0,transition:d=`slide`,className:f,children:p,...m}){let h=s.Children.toArray(p),g=h.length,[_,v]=(0,s.useState)(0),[y,b]=(0,s.useState)(0),[x,S]=(0,s.useState)(!1),C=(0,s.useRef)(0),w=(0,s.useRef)(null),T=(0,s.useCallback)(e=>{v(l?(e+g)%g:Math.max(0,Math.min(e,g-1)))},[g,l]),E=(0,s.useCallback)(()=>T(_-1),[_,T]),D=(0,s.useCallback)(()=>T(_+1),[_,T]);(0,s.useEffect)(()=>{if(!n||g<=1||x)return;let e=setInterval(D,i);return()=>clearInterval(e)},[n,i,D,g,x]);let O=e=>{u&&(S(!0),C.current=e,b(0))},k=e=>{x&&b(e-C.current)},A=()=>{x&&(S(!1),y<-50?D():y>50&&E(),b(0))},j=e=>{u&&(e.currentTarget.setPointerCapture(e.pointerId),O(e.clientX))},M=e=>{k(e.clientX)},N=()=>{A()};if(g===0)return null;let P=d===`fade`,F=P?void 0:{transform:`translateX(calc(-${_*100}% + ${x?y:0}px))`};return(0,c.jsxs)(`div`,{className:t.t(`carousel`,P&&`fade`,f),...m,children:[(0,c.jsx)(`div`,{className:`carousel-viewport`,onPointerDown:j,onPointerMove:M,onPointerUp:N,onPointerCancel:N,style:{touchAction:u?`pan-y`:void 0,cursor:u?x?`grabbing`:`grab`:void 0},children:(0,c.jsx)(`div`,{ref:w,className:t.t(`carousel-track`,x&&`dragging`),style:F,children:h.map((e,n)=>(0,c.jsx)(`div`,{className:t.t(`carousel-slide`,P&&n===_&&`active`,P&&n!==_&&`hidden`),children:e},n))})}),o&&g>1&&(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(r.t,{variant:`ghost`,color:`primary`,iconOnly:!0,shape:`circle`,onClick:E,"aria-label":`Previous slide`,className:`carousel-arrow carousel-arrow-prev`,children:(0,c.jsx)(e.Pi,{})}),(0,c.jsx)(r.t,{variant:`ghost`,color:`primary`,iconOnly:!0,shape:`circle`,onClick:D,"aria-label":`Next slide`,className:`carousel-arrow carousel-arrow-next`,children:(0,c.jsx)(e.Ni,{})})]}),a&&g>1&&(0,c.jsx)(`div`,{className:`carousel-dots`,children:h.map((e,n)=>(0,c.jsx)(`button`,{className:t.t(`carousel-dot`,n===_&&`active`),onClick:()=>T(n),"aria-label":`Slide ${n+1}`,type:`button`},n))})]})}function f(e){return e===`ripple`||e===`zoom-ripple`}function p(e){return e===`zoom`||e===`zoom-ripple`}function m(e){return e===`dim`}function h({src:e,alt:n=``,media:r,mediaHeight:o,overlay:s,body:l,footer:u,interactive:d=!1,imageClickEffect:h=`ripple`,ratio:g=`16:9`,fit:_=`cover`,imgProps:v,children:y}){let b=l??y,x=f(h),S=o?{"--media-height":typeof o==`number`?`${o}px`:o}:void 0,C=!!(r||e);return(0,c.jsxs)(i.n,{interactive:d,clickEffect:h===`none`?void 0:`none`,className:t.t(`showcase card`,d&&`interactive`),style:S,children:[C?(0,c.jsxs)(`div`,{className:t.t(`showcase media`,p(h)&&`effect-zoom`,m(h)&&`effect-dim`),children:[r?(0,c.jsx)(`div`,{className:`showcase media-content`,children:r}):(0,c.jsx)(a.t,{...v,src:e,alt:n,ratio:g,fit:_,rounded:!0,shadow:!0,clickEffect:x?`ripple`:`none`}),s?(0,c.jsx)(`div`,{className:`showcase overlay`,children:s}):null]}):null,b?(0,c.jsx)(i.r,{className:`showcase body`,children:b}):null,u?(0,c.jsx)(i.i,{className:`showcase footer`,children:u}):null]})}function g(e,t,n){return Math.min(Math.max(e,t),n)}function _(e){return e instanceof Element?!!e.closest(`button, a, input, select, textarea, label, summary, [role="button"], [role="link"], [data-carousel-ignore-drag="true"]`):!1}function v(e,t,n){return e&&t?e.map((e,n)=>t(e,n)):e?e.map((e,t)=>y(e)?(0,c.jsx)(b,{item:e},t):null).filter(Boolean):s.Children.toArray(n)}function y(e){let t=e;return!!e&&typeof e==`object`&&`src`in e&&typeof t.src==`string`}function b({item:e}){return(0,c.jsx)(h,{src:e.src,alt:e.alt||``,overlay:e.overlay})}function x({items:n,renderItem:i,initialIndex:a,showButtons:o=!0,loop:l=!0,draggable:u=!0,wheel:d=!0,itemMinWidth:f=220,itemMaxWidth:p=520,itemWidthRatio:m=.56,className:h,children:y,style:b,...x}){let S=(0,s.useMemo)(()=>v(n,i,y),[y,n,i]),C=S.length,[w,T]=(0,s.useState)(0),[E,D]=(0,s.useState)(0),[O,k]=(0,s.useState)(!1),[A,j]=(0,s.useState)(0),M=(0,s.useRef)(null),N=(0,s.useRef)(0),P=(0,s.useRef)(!1),F=g(A*(A<640?Math.max(m,.78):A<960?Math.max(m,.66):m)||f,f,p),I=g(A*.022||16,10,24);(0,s.useEffect)(()=>{let e=M.current;if(!e)return;let t=()=>j(e.clientWidth);t();let n=new ResizeObserver(t);return n.observe(e),()=>n.disconnect()},[]),(0,s.useEffect)(()=>{C&&T(g(a??Math.floor((C-1)/2),0,C-1))},[C,a]);let L=(0,s.useCallback)(e=>{if(!(C<1)){if(l){T((e+C)%C);return}T(g(e,0,C-1))}},[C,l]),R=(0,s.useCallback)(()=>L(w-1),[w,L]),z=(0,s.useCallback)(()=>L(w+1),[w,L]),B=e=>{!u||C<=1||_(e.target)||(e.currentTarget.setPointerCapture(e.pointerId),k(!0),N.current=e.clientX,D(0))},V=e=>{O&&D(e.clientX-N.current)},H=()=>{if(!O)return;let e=Math.max(56,F*.12);E<=-e?z():E>=e&&R(),k(!1),D(0)};if((0,s.useEffect)(()=>{let e=M.current;if(!e)return;let t=e=>{if(!d||C<=1||P.current)return;let t=Math.abs(e.deltaX)>Math.abs(e.deltaY)?e.deltaX:e.deltaY;Math.abs(t)<28||(e.preventDefault(),e.stopPropagation(),P.current=!0,window.setTimeout(()=>{P.current=!1},260),t>0?z():R())};return e.addEventListener(`wheel`,t,{passive:!1}),()=>e.removeEventListener(`wheel`,t)},[C,z,R,d]),!C)return null;let U=A/2-w*(F+I)-F/2+E;return(0,c.jsxs)(`div`,{className:t.t(`showcase`,h),style:{...b,"--item-width":`${F}px`},...x,children:[(0,c.jsx)(`div`,{ref:M,className:`showcase-stage`,onPointerDown:B,onPointerMove:V,onPointerUp:H,onPointerCancel:H,onPointerLeave:H,style:{cursor:u&&C>1?O?`grabbing`:`grab`:void 0},children:(0,c.jsx)(`div`,{className:t.t(`showcase-track`,O&&`dragging`),style:{transform:`translateX(${U}px)`,gap:`${I}px`},children:S.map((e,n)=>{let r=Math.abs(n-w);return(0,c.jsx)(`div`,{className:t.t(`showcase-item`,n===w&&`active`,r===1&&`near`,r>=2&&`far`),style:{zIndex:Math.max(1,C-r)},children:e},n)})})}),o&&C>1&&(0,c.jsxs)(`div`,{className:`showcase-actions`,children:[(0,c.jsx)(r.t,{type:`button`,variant:`secondary`,className:`showcase-btn`,startIcon:(0,c.jsx)(e.Pi,{}),onClick:R,children:`Previous`}),(0,c.jsx)(r.t,{type:`button`,className:`showcase-btn`,endIcon:(0,c.jsx)(e.Ni,{}),onClick:z,children:`Next`})]})]})}function S(e,t,n){return e&&t?e.map((e,n)=>t(e,n)):s.Children.toArray(n)}function C({items:e,renderItem:n,columns:r=3,className:i,children:a,style:o,...s}){let l=S(e,n,a);return l.length?(0,c.jsx)(`div`,{className:t.t(`masonry`,i),style:{...o,columnCount:r},...s,children:l.map((e,t)=>(0,c.jsx)(`div`,{className:`masonry item`,children:e},t))}):null}function w({src:e,alt:r=``,height:a,overlay:o,body:s,footer:l,interactive:u=!1,imageClickEffect:d=`none`,imgProps:h,children:g}){let _=a?{...h?.style,height:a}:h?.style,v=s??g,{effectClassName:y,effectLayer:b,handlePointerDown:x}=n.t({effect:f(d)?`ripple`:`none`});return(0,c.jsxs)(i.n,{interactive:u,clickEffect:d===`none`?void 0:`none`,className:t.t(`masonry card`,u&&`interactive`),children:[(0,c.jsxs)(`div`,{className:t.t(`masonry media`,y,p(d)&&`effect-zoom`,m(d)&&`effect-dim`),onPointerDown:e=>{e.target.closest(`.masonry.overlay`)||x(e)},children:[(0,c.jsx)(`img`,{...h,src:e,alt:r,className:`masonry img`,style:_}),o?(0,c.jsx)(`div`,{className:`masonry overlay`,children:o}):null,b]}),v?(0,c.jsx)(i.r,{className:`masonry body`,children:v}):null,l?(0,c.jsx)(i.i,{className:`masonry footer`,children:l}):null]})}function T({items:e,max:n=5,size:r=`sm`,color:i=`primary`,overlap:a=10,className:s,style:l,...u}){if(!e||e.length===0)return null;let d=e.slice(0,n),f=e.length-n,p=typeof r==`number`?r:{xs:20,sm:28,md:40,lg:56,xl:72}[r]??28;return(0,c.jsxs)(`div`,{className:t.t(`avatar-stack`,s),style:{"--avatar-stack-overlap":`-${a}px`,...l},...u,children:[d.map((e,t)=>(0,c.jsx)(o.t,{src:e.avatar,name:e.name,size:r,color:i,className:`avatar-stack-item`,style:{zIndex:t+1}},t)),f>0&&(0,c.jsxs)(`span`,{className:`avatar-stack-overflow`,style:{width:p,height:p,fontSize:p*.38,zIndex:d.length+1},children:[`+`,f]})]})}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return T}});
|
|
2
|
-
//# sourceMappingURL=media-D5YGOTm7.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"theme-BV4qkzZU.js","names":[],"sources":["../src/theme/MThemeProvider.tsx"],"sourcesContent":["import {createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, type ReactNode} from 'react'\nimport type {MTheme, MMode, MModePreference} from './MTheme.types'\n\nconst STORAGE_KEY = 'mineralui-theme'\n\n// Resolve the final mode once 'system' is allowed.\nfunction resolveMode(pref: MModePreference): MMode {\n if (pref !== 'system') return pref\n if (typeof window === 'undefined') return 'dark'\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n}\n\n// Read a persisted mode safely when storage is available.\nfunction readStored(): MModePreference | null {\n try {\n const v = localStorage.getItem(STORAGE_KEY)\n if (v === 'dark' || v === 'light' || v === 'system') return v\n } catch {\n /* SSR / blocked storage */\n }\n return null\n}\n\nexport interface MThemeContextValue {\n theme: MTheme\n mode: MModePreference\n resolvedMode: MMode\n setMode: (next: MModePreference) => void\n toggleMode: () => void\n}\n\nconst ThemeContext = createContext<MThemeContextValue>({\n theme: {},\n mode: 'dark',\n resolvedMode: 'dark',\n setMode: () => {},\n toggleMode: () => {},\n})\n\n// Map JS theme keys to CSS custom properties.\nconst varMap: Record<keyof MTheme, string> = {\n primaryRgb: '--mineral-primary-rgb',\n primary: '--mineral-primary',\n primaryDark: '--mineral-primary-dark',\n primaryLight: '--mineral-primary-light',\n neutralRgb: '--mineral-neutral-rgb',\n neutral: '--mineral-neutral',\n dark: '--mineral-dark',\n darkLight: '--mineral-dark-light',\n surface: '--mineral-surface',\n surfaceContrast: '--mineral-surface-contrast',\n pageBg: '--mineral-page-bg',\n pageText: '--mineral-page-text',\n text: '--mineral-text',\n textSecondary: '--mineral-text-secondary',\n textHeading: '--mineral-text-heading',\n border: '--mineral-border',\n borderHover: '--mineral-border-hover',\n borderFocus: '--mineral-border-focus',\n successRgb: '--mineral-success-rgb',\n success: '--mineral-success',\n errorRgb: '--mineral-error-rgb',\n error: '--mineral-error',\n warningRgb: '--mineral-warning-rgb',\n warning: '--mineral-warning',\n infoRgb: '--mineral-info-rgb',\n info: '--mineral-info',\n fontFamily: '--mineral-font-family-sans',\n fontFamilySans: '--mineral-font-family-sans',\n fontFamilyMono: '--mineral-font-family-mono',\n fontFamilyHeading: '--mineral-font-family-heading',\n fontColorDefault: '--mineral-fcolor-default',\n fontColorMuted: '--mineral-fcolor-muted',\n fontColorHeading: '--mineral-fcolor-heading',\n fontColorInverted: '--mineral-fcolor-inverted',\n fontColorPrimary: '--mineral-fcolor-primary',\n fontColorNeutral: '--mineral-fcolor-neutral',\n fontColorSuccess: '--mineral-fcolor-success',\n fontColorError: '--mineral-fcolor-error',\n fontColorWarning: '--mineral-fcolor-warning',\n fontColorInfo: '--mineral-fcolor-info',\n radiusSm: '--mineral-radius-sm',\n radiusMd: '--mineral-radius-md',\n radiusLg: '--mineral-radius-lg',\n}\n\nexport type MThemeScope = 'body' | 'wrapper'\n\nexport interface MThemeProviderProps {\n theme?: MTheme\n mode?: MModePreference\n persist?: boolean\n scope?: MThemeScope\n children: ReactNode\n}\n\n// Sync theme tokens and mode classes with either the body or a local wrapper.\nexport function MThemeProvider({\n theme,\n mode: modeProp = 'dark',\n persist = true,\n scope = 'body',\n children,\n}: MThemeProviderProps) {\n const ref = useRef<HTMLDivElement>(null)\n const safeTheme = useMemo(() => theme ?? {}, [theme])\n\n const [mode, setModeState] = useState<MModePreference>(() => {\n if (persist) {\n const stored = readStored()\n if (stored) return stored\n }\n return modeProp\n })\n\n const resolved = resolveMode(mode)\n\n const setMode = useCallback(\n (next: MModePreference) => {\n setModeState(next)\n if (persist) {\n try {\n localStorage.setItem(STORAGE_KEY, next)\n } catch {\n /* noop */\n }\n }\n },\n [persist]\n )\n\n const toggleMode = useCallback(() => {\n setMode(resolved === 'dark' ? 'light' : 'dark')\n }, [resolved, setMode])\n\n // Listen for system theme changes when mode is 'system'.\n useEffect(() => {\n if (mode !== 'system') return\n const mq = window.matchMedia('(prefers-color-scheme: dark)')\n const handler = () => setModeState('system')\n mq.addEventListener('change', handler)\n return () => mq.removeEventListener('change', handler)\n }, [mode])\n\n // Apply token overrides and light/dark class.\n useEffect(() => {\n const target = scope === 'body' ? document.body : ref.current\n if (!target) return\n\n for (const [key, value] of Object.entries(safeTheme)) {\n const cssVar = varMap[key as keyof MTheme]\n if (cssVar && value) {\n target.style.setProperty(cssVar, value)\n if (cssVar === '--mineral-font-family-sans') {\n target.style.setProperty('--mineral-font-family', value)\n }\n }\n }\n\n target.classList.toggle('theme-light', resolved === 'light')\n\n return () => {\n for (const key of Object.keys(safeTheme)) {\n const cssVar = varMap[key as keyof MTheme]\n if (cssVar) {\n target.style.removeProperty(cssVar)\n if (cssVar === '--mineral-font-family-sans') {\n target.style.removeProperty('--mineral-font-family')\n }\n }\n }\n target.classList.remove('theme-light')\n }\n }, [resolved, safeTheme, scope])\n\n const ctx = useMemo<MThemeContextValue>(\n () => ({\n theme: safeTheme,\n mode,\n resolvedMode: resolved,\n setMode,\n toggleMode,\n }),\n [safeTheme, mode, resolved, setMode, toggleMode]\n )\n\n return (\n <ThemeContext.Provider value={ctx}>\n {scope === 'wrapper' ? (\n <div ref={ref} className={resolved === 'light' ? 'theme-light' : undefined}>\n {children}\n </div>\n ) : (\n children\n )}\n </ThemeContext.Provider>\n )\n}\n\nexport function useMTheme(): MThemeContextValue {\n return useContext(ThemeContext)\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"theme-DLorpkJc.cjs","names":[],"sources":["../src/theme/MThemeProvider.tsx"],"sourcesContent":["import {createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, type ReactNode} from 'react'\nimport type {MTheme, MMode, MModePreference} from './MTheme.types'\n\nconst STORAGE_KEY = 'mineralui-theme'\n\n// Resolve the final mode once 'system' is allowed.\nfunction resolveMode(pref: MModePreference): MMode {\n if (pref !== 'system') return pref\n if (typeof window === 'undefined') return 'dark'\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n}\n\n// Read a persisted mode safely when storage is available.\nfunction readStored(): MModePreference | null {\n try {\n const v = localStorage.getItem(STORAGE_KEY)\n if (v === 'dark' || v === 'light' || v === 'system') return v\n } catch {\n /* SSR / blocked storage */\n }\n return null\n}\n\nexport interface MThemeContextValue {\n theme: MTheme\n mode: MModePreference\n resolvedMode: MMode\n setMode: (next: MModePreference) => void\n toggleMode: () => void\n}\n\nconst ThemeContext = createContext<MThemeContextValue>({\n theme: {},\n mode: 'dark',\n resolvedMode: 'dark',\n setMode: () => {},\n toggleMode: () => {},\n})\n\n// Map JS theme keys to CSS custom properties.\nconst varMap: Record<keyof MTheme, string> = {\n primaryRgb: '--mineral-primary-rgb',\n primary: '--mineral-primary',\n primaryDark: '--mineral-primary-dark',\n primaryLight: '--mineral-primary-light',\n neutralRgb: '--mineral-neutral-rgb',\n neutral: '--mineral-neutral',\n dark: '--mineral-dark',\n darkLight: '--mineral-dark-light',\n surface: '--mineral-surface',\n surfaceContrast: '--mineral-surface-contrast',\n pageBg: '--mineral-page-bg',\n pageText: '--mineral-page-text',\n text: '--mineral-text',\n textSecondary: '--mineral-text-secondary',\n textHeading: '--mineral-text-heading',\n border: '--mineral-border',\n borderHover: '--mineral-border-hover',\n borderFocus: '--mineral-border-focus',\n successRgb: '--mineral-success-rgb',\n success: '--mineral-success',\n errorRgb: '--mineral-error-rgb',\n error: '--mineral-error',\n warningRgb: '--mineral-warning-rgb',\n warning: '--mineral-warning',\n infoRgb: '--mineral-info-rgb',\n info: '--mineral-info',\n fontFamily: '--mineral-font-family-sans',\n fontFamilySans: '--mineral-font-family-sans',\n fontFamilyMono: '--mineral-font-family-mono',\n fontFamilyHeading: '--mineral-font-family-heading',\n fontColorDefault: '--mineral-fcolor-default',\n fontColorMuted: '--mineral-fcolor-muted',\n fontColorHeading: '--mineral-fcolor-heading',\n fontColorInverted: '--mineral-fcolor-inverted',\n fontColorPrimary: '--mineral-fcolor-primary',\n fontColorNeutral: '--mineral-fcolor-neutral',\n fontColorSuccess: '--mineral-fcolor-success',\n fontColorError: '--mineral-fcolor-error',\n fontColorWarning: '--mineral-fcolor-warning',\n fontColorInfo: '--mineral-fcolor-info',\n radiusSm: '--mineral-radius-sm',\n radiusMd: '--mineral-radius-md',\n radiusLg: '--mineral-radius-lg',\n}\n\nexport type MThemeScope = 'body' | 'wrapper'\n\nexport interface MThemeProviderProps {\n theme?: MTheme\n mode?: MModePreference\n persist?: boolean\n scope?: MThemeScope\n children: ReactNode\n}\n\n// Sync theme tokens and mode classes with either the body or a local wrapper.\nexport function MThemeProvider({\n theme,\n mode: modeProp = 'dark',\n persist = true,\n scope = 'body',\n children,\n}: MThemeProviderProps) {\n const ref = useRef<HTMLDivElement>(null)\n const safeTheme = useMemo(() => theme ?? {}, [theme])\n\n const [mode, setModeState] = useState<MModePreference>(() => {\n if (persist) {\n const stored = readStored()\n if (stored) return stored\n }\n return modeProp\n })\n\n const resolved = resolveMode(mode)\n\n const setMode = useCallback(\n (next: MModePreference) => {\n setModeState(next)\n if (persist) {\n try {\n localStorage.setItem(STORAGE_KEY, next)\n } catch {\n /* noop */\n }\n }\n },\n [persist]\n )\n\n const toggleMode = useCallback(() => {\n setMode(resolved === 'dark' ? 'light' : 'dark')\n }, [resolved, setMode])\n\n // Listen for system theme changes when mode is 'system'.\n useEffect(() => {\n if (mode !== 'system') return\n const mq = window.matchMedia('(prefers-color-scheme: dark)')\n const handler = () => setModeState('system')\n mq.addEventListener('change', handler)\n return () => mq.removeEventListener('change', handler)\n }, [mode])\n\n // Apply token overrides and light/dark class.\n useEffect(() => {\n const target = scope === 'body' ? document.body : ref.current\n if (!target) return\n\n for (const [key, value] of Object.entries(safeTheme)) {\n const cssVar = varMap[key as keyof MTheme]\n if (cssVar && value) {\n target.style.setProperty(cssVar, value)\n if (cssVar === '--mineral-font-family-sans') {\n target.style.setProperty('--mineral-font-family', value)\n }\n }\n }\n\n target.classList.toggle('theme-light', resolved === 'light')\n\n return () => {\n for (const key of Object.keys(safeTheme)) {\n const cssVar = varMap[key as keyof MTheme]\n if (cssVar) {\n target.style.removeProperty(cssVar)\n if (cssVar === '--mineral-font-family-sans') {\n target.style.removeProperty('--mineral-font-family')\n }\n }\n }\n target.classList.remove('theme-light')\n }\n }, [resolved, safeTheme, scope])\n\n const ctx = useMemo<MThemeContextValue>(\n () => ({\n theme: safeTheme,\n mode,\n resolvedMode: resolved,\n setMode,\n toggleMode,\n }),\n [safeTheme, mode, resolved, setMode, toggleMode]\n )\n\n return (\n <ThemeContext.Provider value={ctx}>\n {scope === 'wrapper' ? (\n <div ref={ref} className={resolved === 'light' ? 'theme-light' : undefined}>\n {children}\n </div>\n ) : (\n children\n )}\n </ThemeContext.Provider>\n )\n}\n\nexport function useMTheme(): MThemeContextValue {\n return useContext(ThemeContext)\n}\n"],"mappings":"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"}
|