@banzamel/mineralui 1.1.1 → 1.2.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-tpFpLFPO.js → MAvatar-BoO51a6m.js} +2 -2
- package/dist/{MAvatar-tpFpLFPO.js.map → MAvatar-BoO51a6m.js.map} +1 -1
- package/dist/{MAvatar-nLlGAprq.cjs → MAvatar-DJKtca9j.cjs} +2 -2
- package/dist/{MAvatar-nLlGAprq.cjs.map → MAvatar-DJKtca9j.cjs.map} +1 -1
- package/dist/{MBadge-imAk1gYn.cjs → MBadge-CexVV675.cjs} +1 -1
- package/dist/{MBadge-imAk1gYn.cjs.map → MBadge-CexVV675.cjs.map} +1 -1
- package/dist/{MBadge-UTUlEAik.js → MBadge-Y1JnZiIC.js} +1 -1
- package/dist/{MBadge-UTUlEAik.js.map → MBadge-Y1JnZiIC.js.map} +1 -1
- package/dist/{MButton-CX8SV1m0.cjs → MButton-B8rXmFX9.cjs} +1 -1
- package/dist/{MButton-CX8SV1m0.cjs.map → MButton-B8rXmFX9.cjs.map} +1 -1
- package/dist/{MButton-BJdrNg2I.js → MButton-BmTDe5Oa.js} +1 -1
- package/dist/{MButton-BJdrNg2I.js.map → MButton-BmTDe5Oa.js.map} +1 -1
- package/dist/{MCheckbox-DfCD0EtS.js → MCheckbox-B7SpcD4H.js} +1 -1
- package/dist/{MCheckbox-DfCD0EtS.js.map → MCheckbox-B7SpcD4H.js.map} +1 -1
- package/dist/{MCheckbox-CAZA97h7.cjs → MCheckbox-Bea3orrs.cjs} +1 -1
- package/dist/{MCheckbox-CAZA97h7.cjs.map → MCheckbox-Bea3orrs.cjs.map} +1 -1
- package/dist/{MCookieBootstrap-BhTMPs8T.js → MCookieBootstrap-CNYLvKjW.js} +1 -1
- package/dist/{MCookieBootstrap-BhTMPs8T.js.map → MCookieBootstrap-CNYLvKjW.js.map} +1 -1
- package/dist/{MCookieBootstrap-Fxpem-gF.cjs → MCookieBootstrap-DSOT4FQo.cjs} +1 -1
- package/dist/{MCookieBootstrap-Fxpem-gF.cjs.map → MCookieBootstrap-DSOT4FQo.cjs.map} +1 -1
- package/dist/{MDataTable-BZs6Cn9e.cjs → MDataTable-BI7wFZYN.cjs} +2 -2
- package/dist/{MDataTable-BZs6Cn9e.cjs.map → MDataTable-BI7wFZYN.cjs.map} +1 -1
- package/dist/{MDataTable-D-ASD4g3.js → MDataTable-Cqwkiq7A.js} +10 -10
- package/dist/{MDataTable-D-ASD4g3.js.map → MDataTable-Cqwkiq7A.js.map} +1 -1
- package/dist/{MDrawer-CTVEF34p.cjs → MDrawer-CSvjLrhB.cjs} +2 -2
- package/dist/{MDrawer-CTVEF34p.cjs.map → MDrawer-CSvjLrhB.cjs.map} +1 -1
- package/dist/{MDrawer-CscOMXBg.js → MDrawer-DXHtAckQ.js} +2 -2
- package/dist/{MDrawer-CscOMXBg.js.map → MDrawer-DXHtAckQ.js.map} +1 -1
- package/dist/{MDropdownMenu-B1eOmM7u.js → MDropdownMenu-CxBhYxQb.js} +1 -1
- package/dist/{MDropdownMenu-B1eOmM7u.js.map → MDropdownMenu-CxBhYxQb.js.map} +1 -1
- package/dist/{MDropdownMenu-CiJ_7DQ2.cjs → MDropdownMenu-X7ywPqth.cjs} +1 -1
- package/dist/{MDropdownMenu-CiJ_7DQ2.cjs.map → MDropdownMenu-X7ywPqth.cjs.map} +1 -1
- package/dist/{MHeading-CMGPJwul.js → MHeading-C3IgV22T.js} +2 -2
- package/dist/{MHeading-CMGPJwul.js.map → MHeading-C3IgV22T.js.map} +1 -1
- package/dist/{MHeading-sW0j7ssI.cjs → MHeading-DqvWKia1.cjs} +2 -2
- package/dist/{MHeading-sW0j7ssI.cjs.map → MHeading-DqvWKia1.cjs.map} +1 -1
- package/dist/{MImage-3UVzZIgA.js → MImage-BDcrV6IC.js} +2 -2
- package/dist/{MImage-3UVzZIgA.js.map → MImage-BDcrV6IC.js.map} +1 -1
- package/dist/{MImage-BHgzEHMO.cjs → MImage-BsQJ_eYf.cjs} +2 -2
- package/dist/{MImage-BHgzEHMO.cjs.map → MImage-BsQJ_eYf.cjs.map} +1 -1
- package/dist/{MInline-DUzpnZoB.cjs → MInline-BAhu2zT-.cjs} +1 -1
- package/dist/{MInline-DUzpnZoB.cjs.map → MInline-BAhu2zT-.cjs.map} +1 -1
- package/dist/{MInline-cTj903A4.js → MInline-Dfy3Lrjs.js} +1 -1
- package/dist/{MInline-cTj903A4.js.map → MInline-Dfy3Lrjs.js.map} +1 -1
- package/dist/{MInput-B8RPS-wr.js → MInput-BSaKw0Uc.js} +2 -2
- package/dist/{MInput-B8RPS-wr.js.map → MInput-BSaKw0Uc.js.map} +1 -1
- package/dist/{MInput-BZ1ZPuk3.cjs → MInput-W7DJQ_ng.cjs} +2 -2
- package/dist/{MInput-BZ1ZPuk3.cjs.map → MInput-W7DJQ_ng.cjs.map} +1 -1
- package/dist/{MInputCVC-DOBmGhJL.cjs → MInputCVC-DH_bjV5R.cjs} +2 -2
- package/dist/{MInputCVC-DOBmGhJL.cjs.map → MInputCVC-DH_bjV5R.cjs.map} +1 -1
- package/dist/{MInputCVC-BJQWuuwR.js → MInputCVC-Dqbl1zG9.js} +3 -3
- package/dist/{MInputCVC-BJQWuuwR.js.map → MInputCVC-Dqbl1zG9.js.map} +1 -1
- package/dist/{MInputSearch-DAAg9FXv.cjs → MInputSearch-C7betxTa.cjs} +2 -2
- package/dist/{MInputSearch-DAAg9FXv.cjs.map → MInputSearch-C7betxTa.cjs.map} +1 -1
- package/dist/{MInputSearch-PMHykVrc.js → MInputSearch-CH5ZcjLq.js} +2 -2
- package/dist/{MInputSearch-PMHykVrc.js.map → MInputSearch-CH5ZcjLq.js.map} +1 -1
- package/dist/{MLink-D10DD8oX.cjs → MLink-DHryXq_D.cjs} +1 -1
- package/dist/{MLink-D10DD8oX.cjs.map → MLink-DHryXq_D.cjs.map} +1 -1
- package/dist/{MLink-CBmT8zaD.js → MLink-ODytrwne.js} +1 -1
- package/dist/{MLink-CBmT8zaD.js.map → MLink-ODytrwne.js.map} +1 -1
- package/dist/{MModal-BogYYyZE.js → MModal-DShADuLw.js} +2 -2
- package/dist/{MModal-BogYYyZE.js.map → MModal-DShADuLw.js.map} +1 -1
- package/dist/{MModal-CfzduXaI.cjs → MModal-pMcPs3pw.cjs} +2 -2
- package/dist/{MModal-CfzduXaI.cjs.map → MModal-pMcPs3pw.cjs.map} +1 -1
- package/dist/{MPagination-CgvjKhLN.js → MPagination-B7aho7rQ.js} +2 -2
- package/dist/{MPagination-CgvjKhLN.js.map → MPagination-B7aho7rQ.js.map} +1 -1
- package/dist/{MPagination-vg2EqB8z.cjs → MPagination-BWHAVgWN.cjs} +2 -2
- package/dist/{MPagination-vg2EqB8z.cjs.map → MPagination-BWHAVgWN.cjs.map} +1 -1
- package/dist/{MQrCode-l0FzrNCq.js → MQrCode-6Cz9B7Qy.js} +2 -2
- package/dist/{MQrCode-l0FzrNCq.js.map → MQrCode-6Cz9B7Qy.js.map} +1 -1
- package/dist/{MQrCode-DB9vELHq.cjs → MQrCode-Bp2CWpmX.cjs} +2 -2
- package/dist/{MQrCode-DB9vELHq.cjs.map → MQrCode-Bp2CWpmX.cjs.map} +1 -1
- package/dist/{MSkeleton-D7wnoEE8.cjs → MSkeleton-BfRBJ6ku.cjs} +1 -1
- package/dist/{MSkeleton-D7wnoEE8.cjs.map → MSkeleton-BfRBJ6ku.cjs.map} +1 -1
- package/dist/{MSkeleton-Bh9cCe49.js → MSkeleton-CauCfkzj.js} +1 -1
- package/dist/{MSkeleton-Bh9cCe49.js.map → MSkeleton-CauCfkzj.js.map} +1 -1
- package/dist/{MSlider-YDSrVUQ8.cjs → MSlider-BCMJkvcA.cjs} +1 -1
- package/dist/{MSlider-YDSrVUQ8.cjs.map → MSlider-BCMJkvcA.cjs.map} +1 -1
- package/dist/{MSlider-BlgzLtHa.js → MSlider-CqrusKJQ.js} +1 -1
- package/dist/{MSlider-BlgzLtHa.js.map → MSlider-CqrusKJQ.js.map} +1 -1
- package/dist/{MSparkline-Bl5-EHJr.cjs → MSparkline-BOaNmbeB.cjs} +1 -1
- package/dist/{MSparkline-Bl5-EHJr.cjs.map → MSparkline-BOaNmbeB.cjs.map} +1 -1
- package/dist/{MSparkline-C8tnqhJm.js → MSparkline-Cb_EwR-E.js} +1 -1
- package/dist/{MSparkline-C8tnqhJm.js.map → MSparkline-Cb_EwR-E.js.map} +1 -1
- package/dist/{MStack-XTsT_kLJ.js → MStack-Cifiqeb2.js} +1 -1
- package/dist/{MStack-XTsT_kLJ.js.map → MStack-Cifiqeb2.js.map} +1 -1
- package/dist/{MStack-BKDsNitR.cjs → MStack-lrvy7l3w.cjs} +1 -1
- package/dist/{MStack-BKDsNitR.cjs.map → MStack-lrvy7l3w.cjs.map} +1 -1
- package/dist/{MSubText-BIaYgtU4.cjs → MSubText-78oYdJQy.cjs} +2 -2
- package/dist/{MSubText-BIaYgtU4.cjs.map → MSubText-78oYdJQy.cjs.map} +1 -1
- package/dist/{MSubText-uoh7Qx7S.js → MSubText-C2oxXwKT.js} +2 -2
- package/dist/{MSubText-uoh7Qx7S.js.map → MSubText-C2oxXwKT.js.map} +1 -1
- package/dist/{MTag-BVo9zFIj.cjs → MTag-C4_rBj4b.cjs} +2 -2
- package/dist/{MTag-BVo9zFIj.cjs.map → MTag-C4_rBj4b.cjs.map} +1 -1
- package/dist/{MTag-Bq9b51kE.js → MTag-DOcKm3c2.js} +2 -2
- package/dist/{MTag-Bq9b51kE.js.map → MTag-DOcKm3c2.js.map} +1 -1
- package/dist/{MText-B4koGfYi.cjs → MText-CxSZ2md0.cjs} +1 -1
- package/dist/{MText-B4koGfYi.cjs.map → MText-CxSZ2md0.cjs.map} +1 -1
- package/dist/{MText-CKyns1SE.js → MText-DX9O7gh7.js} +1 -1
- package/dist/{MText-CKyns1SE.js.map → MText-DX9O7gh7.js.map} +1 -1
- package/dist/{MTimeAgo-LWntwbKg.cjs → MTimeAgo-91_ndjxU.cjs} +2 -2
- package/dist/{MTimeAgo-LWntwbKg.cjs.map → MTimeAgo-91_ndjxU.cjs.map} +1 -1
- package/dist/{MTimeAgo-irsvTFAY.js → MTimeAgo-xxl53mct.js} +2 -2
- package/dist/{MTimeAgo-irsvTFAY.js.map → MTimeAgo-xxl53mct.js.map} +1 -1
- package/dist/{MToggle-BbSDIAJq.js → MToggle-B6emKoKq.js} +1 -1
- package/dist/{MToggle-BbSDIAJq.js.map → MToggle-B6emKoKq.js.map} +1 -1
- package/dist/{MToggle-GhhAJgUa.cjs → MToggle-CsGS_W3X.cjs} +1 -1
- package/dist/{MToggle-GhhAJgUa.cjs.map → MToggle-CsGS_W3X.cjs.map} +1 -1
- package/dist/{MTooltip-eTM5DKtM.cjs → MTooltip-CNXoyQEN.cjs} +1 -1
- package/dist/{MTooltip-eTM5DKtM.cjs.map → MTooltip-CNXoyQEN.cjs.map} +1 -1
- package/dist/{MTooltip-BVQ7wBrO.js → MTooltip-UYOjDBOu.js} +1 -1
- package/dist/{MTooltip-BVQ7wBrO.js.map → MTooltip-UYOjDBOu.js.map} +1 -1
- package/dist/{cards-JqA2VWit.js → cards-BE77zKTI.js} +64 -64
- package/dist/{cards-JqA2VWit.js.map → cards-BE77zKTI.js.map} +1 -1
- package/dist/{cards-QoMhQlao.cjs → cards-BINs-dmS.cjs} +2 -2
- package/dist/{cards-QoMhQlao.cjs.map → cards-BINs-dmS.cjs.map} +1 -1
- package/dist/cards.cjs +1 -1
- package/dist/cards.js +2 -2
- package/dist/components/feedback/MCookie/MCookieBootstrap/MCookieBootstrap.script.d.ts +4 -0
- package/dist/components/layout/MNavbar/MNavbar.d.ts +1 -1
- package/dist/components/layout/MNavbar/MNavbar.types.d.ts +4 -0
- package/dist/components/layout/MNavbar/index.d.ts +1 -1
- package/dist/components/layout/MNavs/MNavs.types.d.ts +12 -2
- package/dist/components/layout/MNavs/index.d.ts +1 -1
- package/dist/{controls-Dbev0qSy.js → controls-BMwQ3C1R.js} +2 -2
- package/dist/{controls-Dbev0qSy.js.map → controls-BMwQ3C1R.js.map} +1 -1
- package/dist/{controls-BFmZuejK.cjs → controls-DwL1-nVC.cjs} +2 -2
- package/dist/{controls-BFmZuejK.cjs.map → controls-DwL1-nVC.cjs.map} +1 -1
- package/dist/controls.cjs +1 -1
- package/dist/controls.js +6 -6
- package/dist/cookie-consent-bootstrap.cjs +1 -1
- package/dist/cookie-consent-bootstrap.cjs.map +1 -1
- package/dist/cookie-consent-bootstrap.js +45 -32
- package/dist/cookie-consent-bootstrap.js.map +1 -1
- package/dist/{data-BooVW8q_.cjs → data-BESfox0z.cjs} +2 -2
- package/dist/{data-BooVW8q_.cjs.map → data-BESfox0z.cjs.map} +1 -1
- package/dist/{data-B1hbWMzU.js → data-s8Hkht1B.js} +608 -608
- package/dist/{data-B1hbWMzU.js.map → data-s8Hkht1B.js.map} +1 -1
- package/dist/data.cjs +1 -1
- package/dist/data.js +3 -3
- package/dist/{display-B-zP1BEz.cjs → display-B0lpgApV.cjs} +2 -2
- package/dist/{display-B-zP1BEz.cjs.map → display-B0lpgApV.cjs.map} +1 -1
- package/dist/{display-DC0d-nPm.js → display-DuBRiEKr.js} +3 -3
- package/dist/{display-DC0d-nPm.js.map → display-DuBRiEKr.js.map} +1 -1
- package/dist/display.cjs +1 -1
- package/dist/display.js +3 -3
- package/dist/{dropdowns-Vo7Oo_ii.js → dropdowns-BcVrUMPE.js} +43 -43
- package/dist/{dropdowns-Vo7Oo_ii.js.map → dropdowns-BcVrUMPE.js.map} +1 -1
- package/dist/dropdowns-CK-oxd62.cjs +2 -0
- package/dist/{dropdowns-CMt9-Jpa.cjs.map → dropdowns-CK-oxd62.cjs.map} +1 -1
- package/dist/dropdowns.cjs +1 -1
- package/dist/dropdowns.js +1 -1
- package/dist/{feedback-D29Er-TD.js → feedback-D3LLKNlY.js} +196 -196
- package/dist/{feedback-D29Er-TD.js.map → feedback-D3LLKNlY.js.map} +1 -1
- package/dist/{feedback-B-PVXL68.cjs → feedback-DYjg0Dbp.cjs} +2 -2
- package/dist/{feedback-B-PVXL68.cjs.map → feedback-DYjg0Dbp.cjs.map} +1 -1
- package/dist/feedback.cjs +1 -1
- package/dist/feedback.js +6 -6
- package/dist/{frameworkTexts-BgzNvcs2.js → frameworkTexts-B6oE8pMk.js} +1 -1
- package/dist/{frameworkTexts-BgzNvcs2.js.map → frameworkTexts-B6oE8pMk.js.map} +1 -1
- package/dist/{frameworkTexts-r4jSfpMt.cjs → frameworkTexts-C_9KZK_A.cjs} +1 -1
- package/dist/{frameworkTexts-r4jSfpMt.cjs.map → frameworkTexts-C_9KZK_A.cjs.map} +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +40 -40
- package/dist/{inputs-Dw9Uv8f4.cjs → inputs-Dcj6C_Fn.cjs} +2 -2
- package/dist/{inputs-Dw9Uv8f4.cjs.map → inputs-Dcj6C_Fn.cjs.map} +1 -1
- package/dist/{inputs-Bl7ssV3Q.js → inputs-bCxSLz-U.js} +115 -115
- package/dist/{inputs-Bl7ssV3Q.js.map → inputs-bCxSLz-U.js.map} +1 -1
- package/dist/inputs.cjs +1 -1
- package/dist/inputs.js +4 -4
- package/dist/{layout-UP_12LRD.js → layout-Cb94o3oU.js} +282 -208
- package/dist/layout-Cb94o3oU.js.map +1 -0
- package/dist/layout-DgfsQ-Tn.cjs +2 -0
- package/dist/layout-DgfsQ-Tn.cjs.map +1 -0
- package/dist/layout.cjs +1 -1
- package/dist/layout.js +5 -5
- package/dist/{locale-uMMj57KX.js → locale-BNyzqXAU.js} +1 -1
- package/dist/{locale-uMMj57KX.js.map → locale-BNyzqXAU.js.map} +1 -1
- package/dist/{locale-LCAQDJCd.cjs → locale-BltrWJtd.cjs} +1 -1
- package/dist/{locale-LCAQDJCd.cjs.map → locale-BltrWJtd.cjs.map} +1 -1
- package/dist/{media-D5zF3vH6.js → media-8aMOtckF.js} +5 -5
- package/dist/{media-D5zF3vH6.js.map → media-8aMOtckF.js.map} +1 -1
- package/dist/{media-C4WtzWxU.cjs → media-D5YGOTm7.cjs} +2 -2
- package/dist/{media-C4WtzWxU.cjs.map → media-D5YGOTm7.cjs.map} +1 -1
- package/dist/media.cjs +1 -1
- package/dist/media.js +3 -3
- package/dist/{overlays-D9_8GEse.cjs → overlays-DCj-oV2H.cjs} +2 -2
- package/dist/{overlays-D9_8GEse.cjs.map → overlays-DCj-oV2H.cjs.map} +1 -1
- package/dist/{overlays-BahWPCPW.js → overlays-gjg00CAf.js} +3 -3
- package/dist/{overlays-BahWPCPW.js.map → overlays-gjg00CAf.js.map} +1 -1
- package/dist/overlays.cjs +1 -1
- package/dist/overlays.js +5 -5
- package/dist/style-runtime.cjs +1 -1
- package/dist/style-runtime.js +1 -1
- package/dist/styles.css +1 -1
- package/dist/{typography-BR2o3w3X.js → typography-DKdr1Tds.js} +2 -2
- package/dist/{typography-BR2o3w3X.js.map → typography-DKdr1Tds.js.map} +1 -1
- package/dist/{typography-BobOsDbn.cjs → typography-qbFGv1gA.cjs} +2 -2
- package/dist/{typography-BobOsDbn.cjs.map → typography-qbFGv1gA.cjs.map} +1 -1
- package/dist/typography.cjs +1 -1
- package/dist/typography.js +5 -5
- package/package.json +1 -1
- package/dist/dropdowns-CMt9-Jpa.cjs +0 -2
- package/dist/layout-C1QKiv2J.cjs +0 -2
- package/dist/layout-C1QKiv2J.cjs.map +0 -1
- package/dist/layout-UP_12LRD.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media-D5zF3vH6.js","names":[],"sources":["../src/components/media/MGallery/MGallery.tsx","../src/components/media/MCarousel/MCarousel.tsx","../src/components/media/mediaInteraction.ts","../src/components/media/MShowcaseCarouselItem/MShowcaseCarouselItem.tsx","../src/components/media/MShowcaseCarousel/MShowcaseCarousel.tsx","../src/components/media/MMasonry/MMasonry.tsx","../src/components/media/MMasonryItem/MMasonryItem.tsx","../src/components/media/MAvatarStack/MAvatarStack.tsx"],"sourcesContent":["import type {MGalleryProps} from './MGallery.types'\nimport {cn} from '../../../utils/cn'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport './MGallery.css'\n\n// Render a responsive image grid gallery.\nexport function MGallery({\n items,\n columns = 3,\n rounded = true,\n clickEffect = 'ripple',\n className,\n ...rest\n}: MGalleryProps) {\n return (\n <div className={cn('gallery', `columns-${columns}`, className)} {...rest}>\n {items.map((item, i) => (\n <GalleryFigure key={i} item={item} rounded={rounded} clickEffect={clickEffect} />\n ))}\n </div>\n )\n}\n\nfunction GalleryFigure({\n item,\n rounded,\n clickEffect,\n}: {\n item: {src: string; alt?: string; caption?: string}\n rounded: boolean\n clickEffect: 'none' | 'ripple'\n}) {\n const {effectClassName, effectLayer, handlePointerDown} = useInteractionEffect<HTMLElement>({\n effect: clickEffect,\n })\n\n return (\n <figure className={cn('gallery-item', rounded && 'rounded', effectClassName)} onPointerDown={handlePointerDown}>\n <img className=\"gallery-image\" src={item.src} alt={item.alt || ''} loading=\"lazy\" />\n {item.caption && <figcaption className=\"gallery-caption\">{item.caption}</figcaption>}\n {effectLayer}\n </figure>\n )\n}\n","import {useState, useEffect, useCallback, useRef, Children} from 'react'\nimport type * as React from 'react'\nimport type {MCarouselProps} from './MCarousel.types'\nimport {cn} from '../../../utils/cn'\nimport {MButton} from '../../controls'\nimport {MChevronLeftIcon, MChevronRightIcon} from '../../../icons'\nimport './MCarousel.css'\n\n// Render a swipeable content slider with arrows, dots and transition modes.\nexport function MCarousel({\n autoPlay = false,\n interval = 5000,\n showDots = true,\n showArrows = true,\n loop = true,\n draggable = true,\n transition = 'slide',\n className,\n children,\n ...rest\n}: MCarouselProps) {\n const slides = Children.toArray(children)\n const count = slides.length\n const [active, setActive] = useState(0)\n const [dragOffset, setDragOffset] = useState(0)\n const [isDragging, setIsDragging] = useState(false)\n const dragStartX = useRef(0)\n const trackRef = useRef<HTMLDivElement>(null)\n\n const goTo = useCallback(\n (index: number) => {\n if (loop) {\n setActive((index + count) % count)\n } else {\n setActive(Math.max(0, Math.min(index, count - 1)))\n }\n },\n [count, loop]\n )\n\n const prev = useCallback(() => goTo(active - 1), [active, goTo])\n const next = useCallback(() => goTo(active + 1), [active, goTo])\n\n useEffect(() => {\n if (!autoPlay || count <= 1 || isDragging) return\n const timer = setInterval(next, interval)\n return () => clearInterval(timer)\n }, [autoPlay, interval, next, count, isDragging])\n\n const handleDragStart = (clientX: number) => {\n if (!draggable) return\n setIsDragging(true)\n dragStartX.current = clientX\n setDragOffset(0)\n }\n\n const handleDragMove = (clientX: number) => {\n if (!isDragging) return\n const diff = clientX - dragStartX.current\n setDragOffset(diff)\n }\n\n const handleDragEnd = () => {\n if (!isDragging) return\n setIsDragging(false)\n const threshold = 50\n if (dragOffset < -threshold) {\n next()\n } else if (dragOffset > threshold) {\n prev()\n }\n setDragOffset(0)\n }\n\n const onPointerDown = (e: React.PointerEvent) => {\n if (!draggable) return\n e.currentTarget.setPointerCapture(e.pointerId)\n handleDragStart(e.clientX)\n }\n\n const onPointerMove = (e: React.PointerEvent) => {\n handleDragMove(e.clientX)\n }\n\n const onPointerUp = () => {\n handleDragEnd()\n }\n\n if (count === 0) return null\n\n const isFade = transition === 'fade'\n const trackStyle = !isFade\n ? {transform: `translateX(calc(-${active * 100}% + ${isDragging ? dragOffset : 0}px))`}\n : undefined\n\n return (\n <div className={cn('carousel', isFade && 'fade', className)} {...rest}>\n <div\n className=\"carousel-viewport\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerUp}\n style={{\n touchAction: draggable ? 'pan-y' : undefined,\n cursor: draggable ? (isDragging ? 'grabbing' : 'grab') : undefined,\n }}\n >\n <div ref={trackRef} className={cn('carousel-track', isDragging && 'dragging')} style={trackStyle}>\n {slides.map((slide, i) => (\n <div\n key={i}\n className={cn(\n 'carousel-slide',\n isFade && i === active && 'active',\n isFade && i !== active && 'hidden'\n )}\n >\n {slide}\n </div>\n ))}\n </div>\n </div>\n\n {showArrows && count > 1 && (\n <>\n <MButton\n variant=\"ghost\"\n color=\"primary\"\n iconOnly\n shape=\"circle\"\n onClick={prev}\n aria-label=\"Previous slide\"\n className=\"carousel-arrow carousel-arrow-prev\"\n >\n <MChevronLeftIcon />\n </MButton>\n <MButton\n variant=\"ghost\"\n color=\"primary\"\n iconOnly\n shape=\"circle\"\n onClick={next}\n aria-label=\"Next slide\"\n className=\"carousel-arrow carousel-arrow-next\"\n >\n <MChevronRightIcon />\n </MButton>\n </>\n )}\n\n {showDots && count > 1 && (\n <div className=\"carousel-dots\">\n {slides.map((_, i) => (\n <button\n key={i}\n className={cn('carousel-dot', i === active && 'active')}\n onClick={() => goTo(i)}\n aria-label={`Slide ${i + 1}`}\n type=\"button\"\n />\n ))}\n </div>\n )}\n </div>\n )\n}\n","import type {MClickEffect} from '../../utils/useInteractionEffect'\n\nexport type MMediaInteractionEffect = MClickEffect | 'zoom' | 'dim' | 'zoom-ripple'\n\nexport function usesRipple(effect: MMediaInteractionEffect): boolean {\n return effect === 'ripple' || effect === 'zoom-ripple'\n}\n\nexport function usesZoom(effect: MMediaInteractionEffect): boolean {\n return effect === 'zoom' || effect === 'zoom-ripple'\n}\n\nexport function usesDim(effect: MMediaInteractionEffect): boolean {\n return effect === 'dim'\n}\n","import type {CSSProperties} from 'react'\nimport {MCard, MCardBody, MCardFooter} from '../../cards'\nimport {MImage} from '../MImage'\nimport {cn} from '../../../utils/cn'\nimport {usesDim, usesRipple, usesZoom} from '../mediaInteraction'\nimport type {MShowcaseCarouselItemProps} from './MShowcaseCarouselItem.types'\nimport './MShowcaseCarouselItem.css'\n\nexport function MShowcaseCarouselItem({\n src,\n alt = '',\n media,\n mediaHeight,\n overlay,\n body,\n footer,\n interactive = false,\n imageClickEffect = 'ripple',\n ratio = '16:9',\n fit = 'cover',\n imgProps,\n children,\n}: MShowcaseCarouselItemProps) {\n const content = body ?? children\n const shouldRipple = usesRipple(imageClickEffect)\n const cardStyle = mediaHeight\n ? ({\n '--media-height': typeof mediaHeight === 'number' ? `${mediaHeight}px` : mediaHeight,\n } as CSSProperties)\n : undefined\n const hasMedia = Boolean(media || src)\n\n return (\n <MCard\n interactive={interactive}\n clickEffect={imageClickEffect !== 'none' ? 'none' : undefined}\n className={cn('showcase card', interactive && 'interactive')}\n style={cardStyle}\n >\n {hasMedia ? (\n <div\n className={cn(\n 'showcase media',\n usesZoom(imageClickEffect) && 'effect-zoom',\n usesDim(imageClickEffect) && 'effect-dim'\n )}\n >\n {media ? (\n <div className=\"showcase media-content\">{media}</div>\n ) : (\n <MImage\n {...imgProps}\n src={src}\n alt={alt}\n ratio={ratio}\n fit={fit}\n rounded\n shadow\n clickEffect={shouldRipple ? 'ripple' : 'none'}\n />\n )}\n {overlay ? <div className=\"showcase overlay\">{overlay}</div> : null}\n </div>\n ) : null}\n {content ? <MCardBody className=\"showcase body\">{content}</MCardBody> : null}\n {footer ? <MCardFooter className=\"showcase footer\">{footer}</MCardFooter> : null}\n </MCard>\n )\n}\n","import {Children, useCallback, useEffect, useMemo, useRef, useState} from 'react'\nimport type {CSSProperties, PointerEvent as ReactPointerEvent, ReactNode} from 'react'\nimport {MButton} from '../../controls'\nimport {MShowcaseCarouselItem} from '../MShowcaseCarouselItem'\nimport {MChevronLeftIcon, MChevronRightIcon} from '../../../icons'\nimport {cn} from '../../../utils/cn'\nimport type {MShowcaseCarouselProps, MShowcaseCarouselSlide} from './MShowcaseCarousel.types'\nimport './MShowcaseCarousel.css'\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.min(Math.max(value, min), max)\n}\n\nfunction isInteractiveTarget(target: EventTarget | null) {\n if (!(target instanceof Element)) {\n return false\n }\n\n return !!target.closest(\n 'button, a, input, select, textarea, label, summary, [role=\"button\"], [role=\"link\"], [data-carousel-ignore-drag=\"true\"]'\n )\n}\n\nfunction getSlides<T>(items?: T[], renderItem?: (item: T, index: number) => ReactNode, children?: ReactNode) {\n if (items && renderItem) {\n return items.map((item, index) => renderItem(item, index))\n }\n\n if (items) {\n return items\n .map((item, index) => {\n if (!isShowcaseItem(item)) {\n return null\n }\n\n return <ShowcaseMediaSlide key={index} item={item} />\n })\n .filter(Boolean)\n }\n\n return Children.toArray(children)\n}\n\nfunction isShowcaseItem(value: unknown): value is MShowcaseCarouselSlide {\n const slide = value as {src?: unknown}\n return !!value && typeof value === 'object' && 'src' in value && typeof slide.src === 'string'\n}\n\nfunction ShowcaseMediaSlide({item}: {item: MShowcaseCarouselSlide}) {\n return <MShowcaseCarouselItem src={item.src} alt={item.alt || ''} overlay={item.overlay} />\n}\n\n// Show a centered, mouse-driven carousel with partial side previews.\nexport function MShowcaseCarousel<T = unknown>({\n items,\n renderItem,\n initialIndex,\n showButtons = true,\n loop = true,\n draggable = true,\n wheel = true,\n itemMinWidth = 220,\n itemMaxWidth = 520,\n itemWidthRatio = 0.56,\n className,\n children,\n style,\n ...rest\n}: MShowcaseCarouselProps<T>) {\n const slides = useMemo(() => getSlides(items, renderItem, children), [children, items, renderItem])\n const count = slides.length\n const [active, setActive] = useState(0)\n const [drag, setDrag] = useState(0)\n const [dragging, setDragging] = useState(false)\n const [stageWidth, setStageWidth] = useState(0)\n const stageRef = useRef<HTMLDivElement>(null)\n const startX = useRef(0)\n const wheelLock = useRef(false)\n\n const widthRatio =\n stageWidth < 640\n ? Math.max(itemWidthRatio, 0.78)\n : stageWidth < 960\n ? Math.max(itemWidthRatio, 0.66)\n : itemWidthRatio\n const itemWidth = clamp(stageWidth * widthRatio || itemMinWidth, itemMinWidth, itemMaxWidth)\n const itemGap = clamp(stageWidth * 0.022 || 16, 10, 24)\n\n useEffect(() => {\n const node = stageRef.current\n if (!node) return\n\n const update = () => setStageWidth(node.clientWidth)\n update()\n\n const observer = new ResizeObserver(update)\n observer.observe(node)\n\n return () => observer.disconnect()\n }, [])\n\n useEffect(() => {\n if (!count) return\n\n const defaultIndex = initialIndex ?? Math.floor((count - 1) / 2)\n setActive(clamp(defaultIndex, 0, count - 1))\n }, [count, initialIndex])\n\n const goTo = useCallback(\n (nextIndex: number) => {\n if (count < 1) return\n\n if (loop) {\n setActive((nextIndex + count) % count)\n return\n }\n\n setActive(clamp(nextIndex, 0, count - 1))\n },\n [count, loop]\n )\n\n const prev = useCallback(() => goTo(active - 1), [active, goTo])\n const next = useCallback(() => goTo(active + 1), [active, goTo])\n\n const onPointerDown = (event: ReactPointerEvent<HTMLDivElement>) => {\n if (!draggable || count <= 1) return\n if (isInteractiveTarget(event.target)) return\n event.currentTarget.setPointerCapture(event.pointerId)\n setDragging(true)\n startX.current = event.clientX\n setDrag(0)\n }\n\n const onPointerMove = (event: ReactPointerEvent<HTMLDivElement>) => {\n if (!dragging) return\n setDrag(event.clientX - startX.current)\n }\n\n const stopDrag = () => {\n if (!dragging) return\n\n const limit = Math.max(56, itemWidth * 0.12)\n\n if (drag <= -limit) {\n next()\n } else if (drag >= limit) {\n prev()\n }\n\n setDragging(false)\n setDrag(0)\n }\n\n useEffect(() => {\n const node = stageRef.current\n if (!node) return\n\n const handleWheel = (event: WheelEvent) => {\n if (!wheel || count <= 1 || wheelLock.current) return\n\n const axis = Math.abs(event.deltaX) > Math.abs(event.deltaY) ? event.deltaX : event.deltaY\n if (Math.abs(axis) < 28) return\n\n event.preventDefault()\n event.stopPropagation()\n\n wheelLock.current = true\n window.setTimeout(() => {\n wheelLock.current = false\n }, 260)\n\n if (axis > 0) {\n next()\n } else {\n prev()\n }\n }\n\n node.addEventListener('wheel', handleWheel, {passive: false})\n return () => node.removeEventListener('wheel', handleWheel)\n }, [count, next, prev, wheel])\n\n if (!count) return null\n\n const offset = stageWidth / 2 - active * (itemWidth + itemGap) - itemWidth / 2 + drag\n\n return (\n <div\n className={cn('showcase', className)}\n style={{...style, '--item-width': `${itemWidth}px`} as CSSProperties}\n {...rest}\n >\n <div\n ref={stageRef}\n className=\"showcase-stage\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={stopDrag}\n onPointerCancel={stopDrag}\n onPointerLeave={stopDrag}\n style={{\n cursor: draggable && count > 1 ? (dragging ? 'grabbing' : 'grab') : undefined,\n }}\n >\n <div\n className={cn('showcase-track', dragging && 'dragging')}\n style={{\n transform: `translateX(${offset}px)`,\n gap: `${itemGap}px`,\n }}\n >\n {slides.map((slide, index) => {\n const dist = Math.abs(index - active)\n\n return (\n <div\n key={index}\n className={cn(\n 'showcase-item',\n index === active && 'active',\n dist === 1 && 'near',\n dist >= 2 && 'far'\n )}\n style={{zIndex: Math.max(1, count - dist)}}\n >\n {slide}\n </div>\n )\n })}\n </div>\n </div>\n\n {showButtons && count > 1 && (\n <div className=\"showcase-actions\">\n <MButton\n type=\"button\"\n variant=\"secondary\"\n className=\"showcase-btn\"\n startIcon={<MChevronLeftIcon />}\n onClick={prev}\n >\n Previous\n </MButton>\n <MButton type=\"button\" className=\"showcase-btn\" endIcon={<MChevronRightIcon />} onClick={next}>\n Next\n </MButton>\n </div>\n )}\n </div>\n )\n}\n","import {Children} from 'react'\nimport type {ReactNode} from 'react'\nimport {cn} from '../../../utils/cn'\nimport type {MMasonryProps} from './MMasonry.types'\nimport './MMasonry.css'\n\nfunction getItems<T>(items?: T[], renderItem?: (item: T, index: number) => ReactNode, children?: ReactNode) {\n if (items && renderItem) {\n return items.map((item, index) => renderItem(item, index))\n }\n\n return Children.toArray(children)\n}\n\n// Render a responsive masonry wall for images, cards and uneven content.\nexport function MMasonry<T = unknown>({\n items,\n renderItem,\n columns = 3,\n className,\n children,\n style,\n ...rest\n}: MMasonryProps<T>) {\n const content = getItems(items, renderItem, children)\n\n if (!content.length) return null\n\n return (\n <div className={cn('masonry', className)} style={{...style, columnCount: columns}} {...rest}>\n {content.map((item, index) => (\n <div key={index} className=\"masonry item\">\n {item}\n </div>\n ))}\n </div>\n )\n}\n","import {MCard, MCardBody, MCardFooter} from '../../cards'\nimport {cn} from '../../../utils/cn'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport {usesDim, usesRipple, usesZoom} from '../mediaInteraction'\nimport './MMasonryItem.css'\nimport type {MMasonryItemProps} from './MMasonryItem.types'\n\nexport function MMasonryItem({\n src,\n alt = '',\n height,\n overlay,\n body,\n footer,\n interactive = false,\n imageClickEffect = 'none',\n imgProps,\n children,\n}: MMasonryItemProps) {\n const imgStyle = height ? {...imgProps?.style, height} : imgProps?.style\n const content = body ?? children\n const shouldRipple = usesRipple(imageClickEffect)\n const {effectClassName, effectLayer, handlePointerDown} = useInteractionEffect<HTMLDivElement>({\n effect: shouldRipple ? 'ripple' : 'none',\n })\n\n return (\n <MCard\n interactive={interactive}\n clickEffect={imageClickEffect !== 'none' ? 'none' : undefined}\n className={cn('masonry card', interactive && 'interactive')}\n >\n <div\n className={cn(\n 'masonry media',\n effectClassName,\n usesZoom(imageClickEffect) && 'effect-zoom',\n usesDim(imageClickEffect) && 'effect-dim'\n )}\n onPointerDown={(event) => {\n const target = event.target as HTMLElement\n\n if (target.closest('.masonry.overlay')) {\n return\n }\n\n handlePointerDown(event)\n }}\n >\n <img {...imgProps} src={src} alt={alt} className=\"masonry img\" style={imgStyle} />\n {overlay ? <div className=\"masonry overlay\">{overlay}</div> : null}\n {effectLayer}\n </div>\n {content ? <MCardBody className=\"masonry body\">{content}</MCardBody> : null}\n {footer ? <MCardFooter className=\"masonry footer\">{footer}</MCardFooter> : null}\n </MCard>\n )\n}\n","import type {MAvatarStackProps} from './MAvatarStack.types'\nimport {cn} from '../../../utils/cn'\nimport {MAvatar} from '../MAvatar'\nimport './MAvatarStack.css'\n\nexport function MAvatarStack({\n items,\n max = 5,\n size = 'sm',\n color = 'primary',\n overlap = 10,\n className,\n style,\n ...rest\n}: MAvatarStackProps) {\n if (!items || items.length === 0) return null\n\n const visible = items.slice(0, max)\n const overflowCount = items.length - max\n const avatarPx = typeof size === 'number' ? size : ({xs: 20, sm: 28, md: 40, lg: 56, xl: 72}[size] ?? 28)\n\n return (\n <div\n className={cn('avatar-stack', className)}\n style={{'--avatar-stack-overlap': `-${overlap}px`, ...style} as React.CSSProperties}\n {...rest}\n >\n {visible.map((item, i) => (\n <MAvatar\n key={i}\n src={item.avatar}\n name={item.name}\n size={size}\n color={color}\n className=\"avatar-stack-item\"\n style={{zIndex: i + 1}}\n />\n ))}\n {overflowCount > 0 && (\n <span\n className=\"avatar-stack-overflow\"\n style={{\n width: avatarPx,\n height: avatarPx,\n fontSize: avatarPx * 0.38,\n zIndex: visible.length + 1,\n }}\n >\n +{overflowCount}\n </span>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"media-8aMOtckF.js","names":[],"sources":["../src/components/media/MGallery/MGallery.tsx","../src/components/media/MCarousel/MCarousel.tsx","../src/components/media/mediaInteraction.ts","../src/components/media/MShowcaseCarouselItem/MShowcaseCarouselItem.tsx","../src/components/media/MShowcaseCarousel/MShowcaseCarousel.tsx","../src/components/media/MMasonry/MMasonry.tsx","../src/components/media/MMasonryItem/MMasonryItem.tsx","../src/components/media/MAvatarStack/MAvatarStack.tsx"],"sourcesContent":["import type {MGalleryProps} from './MGallery.types'\nimport {cn} from '../../../utils/cn'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport './MGallery.css'\n\n// Render a responsive image grid gallery.\nexport function MGallery({\n items,\n columns = 3,\n rounded = true,\n clickEffect = 'ripple',\n className,\n ...rest\n}: MGalleryProps) {\n return (\n <div className={cn('gallery', `columns-${columns}`, className)} {...rest}>\n {items.map((item, i) => (\n <GalleryFigure key={i} item={item} rounded={rounded} clickEffect={clickEffect} />\n ))}\n </div>\n )\n}\n\nfunction GalleryFigure({\n item,\n rounded,\n clickEffect,\n}: {\n item: {src: string; alt?: string; caption?: string}\n rounded: boolean\n clickEffect: 'none' | 'ripple'\n}) {\n const {effectClassName, effectLayer, handlePointerDown} = useInteractionEffect<HTMLElement>({\n effect: clickEffect,\n })\n\n return (\n <figure className={cn('gallery-item', rounded && 'rounded', effectClassName)} onPointerDown={handlePointerDown}>\n <img className=\"gallery-image\" src={item.src} alt={item.alt || ''} loading=\"lazy\" />\n {item.caption && <figcaption className=\"gallery-caption\">{item.caption}</figcaption>}\n {effectLayer}\n </figure>\n )\n}\n","import {useState, useEffect, useCallback, useRef, Children} from 'react'\nimport type * as React from 'react'\nimport type {MCarouselProps} from './MCarousel.types'\nimport {cn} from '../../../utils/cn'\nimport {MButton} from '../../controls'\nimport {MChevronLeftIcon, MChevronRightIcon} from '../../../icons'\nimport './MCarousel.css'\n\n// Render a swipeable content slider with arrows, dots and transition modes.\nexport function MCarousel({\n autoPlay = false,\n interval = 5000,\n showDots = true,\n showArrows = true,\n loop = true,\n draggable = true,\n transition = 'slide',\n className,\n children,\n ...rest\n}: MCarouselProps) {\n const slides = Children.toArray(children)\n const count = slides.length\n const [active, setActive] = useState(0)\n const [dragOffset, setDragOffset] = useState(0)\n const [isDragging, setIsDragging] = useState(false)\n const dragStartX = useRef(0)\n const trackRef = useRef<HTMLDivElement>(null)\n\n const goTo = useCallback(\n (index: number) => {\n if (loop) {\n setActive((index + count) % count)\n } else {\n setActive(Math.max(0, Math.min(index, count - 1)))\n }\n },\n [count, loop]\n )\n\n const prev = useCallback(() => goTo(active - 1), [active, goTo])\n const next = useCallback(() => goTo(active + 1), [active, goTo])\n\n useEffect(() => {\n if (!autoPlay || count <= 1 || isDragging) return\n const timer = setInterval(next, interval)\n return () => clearInterval(timer)\n }, [autoPlay, interval, next, count, isDragging])\n\n const handleDragStart = (clientX: number) => {\n if (!draggable) return\n setIsDragging(true)\n dragStartX.current = clientX\n setDragOffset(0)\n }\n\n const handleDragMove = (clientX: number) => {\n if (!isDragging) return\n const diff = clientX - dragStartX.current\n setDragOffset(diff)\n }\n\n const handleDragEnd = () => {\n if (!isDragging) return\n setIsDragging(false)\n const threshold = 50\n if (dragOffset < -threshold) {\n next()\n } else if (dragOffset > threshold) {\n prev()\n }\n setDragOffset(0)\n }\n\n const onPointerDown = (e: React.PointerEvent) => {\n if (!draggable) return\n e.currentTarget.setPointerCapture(e.pointerId)\n handleDragStart(e.clientX)\n }\n\n const onPointerMove = (e: React.PointerEvent) => {\n handleDragMove(e.clientX)\n }\n\n const onPointerUp = () => {\n handleDragEnd()\n }\n\n if (count === 0) return null\n\n const isFade = transition === 'fade'\n const trackStyle = !isFade\n ? {transform: `translateX(calc(-${active * 100}% + ${isDragging ? dragOffset : 0}px))`}\n : undefined\n\n return (\n <div className={cn('carousel', isFade && 'fade', className)} {...rest}>\n <div\n className=\"carousel-viewport\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerUp}\n style={{\n touchAction: draggable ? 'pan-y' : undefined,\n cursor: draggable ? (isDragging ? 'grabbing' : 'grab') : undefined,\n }}\n >\n <div ref={trackRef} className={cn('carousel-track', isDragging && 'dragging')} style={trackStyle}>\n {slides.map((slide, i) => (\n <div\n key={i}\n className={cn(\n 'carousel-slide',\n isFade && i === active && 'active',\n isFade && i !== active && 'hidden'\n )}\n >\n {slide}\n </div>\n ))}\n </div>\n </div>\n\n {showArrows && count > 1 && (\n <>\n <MButton\n variant=\"ghost\"\n color=\"primary\"\n iconOnly\n shape=\"circle\"\n onClick={prev}\n aria-label=\"Previous slide\"\n className=\"carousel-arrow carousel-arrow-prev\"\n >\n <MChevronLeftIcon />\n </MButton>\n <MButton\n variant=\"ghost\"\n color=\"primary\"\n iconOnly\n shape=\"circle\"\n onClick={next}\n aria-label=\"Next slide\"\n className=\"carousel-arrow carousel-arrow-next\"\n >\n <MChevronRightIcon />\n </MButton>\n </>\n )}\n\n {showDots && count > 1 && (\n <div className=\"carousel-dots\">\n {slides.map((_, i) => (\n <button\n key={i}\n className={cn('carousel-dot', i === active && 'active')}\n onClick={() => goTo(i)}\n aria-label={`Slide ${i + 1}`}\n type=\"button\"\n />\n ))}\n </div>\n )}\n </div>\n )\n}\n","import type {MClickEffect} from '../../utils/useInteractionEffect'\n\nexport type MMediaInteractionEffect = MClickEffect | 'zoom' | 'dim' | 'zoom-ripple'\n\nexport function usesRipple(effect: MMediaInteractionEffect): boolean {\n return effect === 'ripple' || effect === 'zoom-ripple'\n}\n\nexport function usesZoom(effect: MMediaInteractionEffect): boolean {\n return effect === 'zoom' || effect === 'zoom-ripple'\n}\n\nexport function usesDim(effect: MMediaInteractionEffect): boolean {\n return effect === 'dim'\n}\n","import type {CSSProperties} from 'react'\nimport {MCard, MCardBody, MCardFooter} from '../../cards'\nimport {MImage} from '../MImage'\nimport {cn} from '../../../utils/cn'\nimport {usesDim, usesRipple, usesZoom} from '../mediaInteraction'\nimport type {MShowcaseCarouselItemProps} from './MShowcaseCarouselItem.types'\nimport './MShowcaseCarouselItem.css'\n\nexport function MShowcaseCarouselItem({\n src,\n alt = '',\n media,\n mediaHeight,\n overlay,\n body,\n footer,\n interactive = false,\n imageClickEffect = 'ripple',\n ratio = '16:9',\n fit = 'cover',\n imgProps,\n children,\n}: MShowcaseCarouselItemProps) {\n const content = body ?? children\n const shouldRipple = usesRipple(imageClickEffect)\n const cardStyle = mediaHeight\n ? ({\n '--media-height': typeof mediaHeight === 'number' ? `${mediaHeight}px` : mediaHeight,\n } as CSSProperties)\n : undefined\n const hasMedia = Boolean(media || src)\n\n return (\n <MCard\n interactive={interactive}\n clickEffect={imageClickEffect !== 'none' ? 'none' : undefined}\n className={cn('showcase card', interactive && 'interactive')}\n style={cardStyle}\n >\n {hasMedia ? (\n <div\n className={cn(\n 'showcase media',\n usesZoom(imageClickEffect) && 'effect-zoom',\n usesDim(imageClickEffect) && 'effect-dim'\n )}\n >\n {media ? (\n <div className=\"showcase media-content\">{media}</div>\n ) : (\n <MImage\n {...imgProps}\n src={src}\n alt={alt}\n ratio={ratio}\n fit={fit}\n rounded\n shadow\n clickEffect={shouldRipple ? 'ripple' : 'none'}\n />\n )}\n {overlay ? <div className=\"showcase overlay\">{overlay}</div> : null}\n </div>\n ) : null}\n {content ? <MCardBody className=\"showcase body\">{content}</MCardBody> : null}\n {footer ? <MCardFooter className=\"showcase footer\">{footer}</MCardFooter> : null}\n </MCard>\n )\n}\n","import {Children, useCallback, useEffect, useMemo, useRef, useState} from 'react'\nimport type {CSSProperties, PointerEvent as ReactPointerEvent, ReactNode} from 'react'\nimport {MButton} from '../../controls'\nimport {MShowcaseCarouselItem} from '../MShowcaseCarouselItem'\nimport {MChevronLeftIcon, MChevronRightIcon} from '../../../icons'\nimport {cn} from '../../../utils/cn'\nimport type {MShowcaseCarouselProps, MShowcaseCarouselSlide} from './MShowcaseCarousel.types'\nimport './MShowcaseCarousel.css'\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.min(Math.max(value, min), max)\n}\n\nfunction isInteractiveTarget(target: EventTarget | null) {\n if (!(target instanceof Element)) {\n return false\n }\n\n return !!target.closest(\n 'button, a, input, select, textarea, label, summary, [role=\"button\"], [role=\"link\"], [data-carousel-ignore-drag=\"true\"]'\n )\n}\n\nfunction getSlides<T>(items?: T[], renderItem?: (item: T, index: number) => ReactNode, children?: ReactNode) {\n if (items && renderItem) {\n return items.map((item, index) => renderItem(item, index))\n }\n\n if (items) {\n return items\n .map((item, index) => {\n if (!isShowcaseItem(item)) {\n return null\n }\n\n return <ShowcaseMediaSlide key={index} item={item} />\n })\n .filter(Boolean)\n }\n\n return Children.toArray(children)\n}\n\nfunction isShowcaseItem(value: unknown): value is MShowcaseCarouselSlide {\n const slide = value as {src?: unknown}\n return !!value && typeof value === 'object' && 'src' in value && typeof slide.src === 'string'\n}\n\nfunction ShowcaseMediaSlide({item}: {item: MShowcaseCarouselSlide}) {\n return <MShowcaseCarouselItem src={item.src} alt={item.alt || ''} overlay={item.overlay} />\n}\n\n// Show a centered, mouse-driven carousel with partial side previews.\nexport function MShowcaseCarousel<T = unknown>({\n items,\n renderItem,\n initialIndex,\n showButtons = true,\n loop = true,\n draggable = true,\n wheel = true,\n itemMinWidth = 220,\n itemMaxWidth = 520,\n itemWidthRatio = 0.56,\n className,\n children,\n style,\n ...rest\n}: MShowcaseCarouselProps<T>) {\n const slides = useMemo(() => getSlides(items, renderItem, children), [children, items, renderItem])\n const count = slides.length\n const [active, setActive] = useState(0)\n const [drag, setDrag] = useState(0)\n const [dragging, setDragging] = useState(false)\n const [stageWidth, setStageWidth] = useState(0)\n const stageRef = useRef<HTMLDivElement>(null)\n const startX = useRef(0)\n const wheelLock = useRef(false)\n\n const widthRatio =\n stageWidth < 640\n ? Math.max(itemWidthRatio, 0.78)\n : stageWidth < 960\n ? Math.max(itemWidthRatio, 0.66)\n : itemWidthRatio\n const itemWidth = clamp(stageWidth * widthRatio || itemMinWidth, itemMinWidth, itemMaxWidth)\n const itemGap = clamp(stageWidth * 0.022 || 16, 10, 24)\n\n useEffect(() => {\n const node = stageRef.current\n if (!node) return\n\n const update = () => setStageWidth(node.clientWidth)\n update()\n\n const observer = new ResizeObserver(update)\n observer.observe(node)\n\n return () => observer.disconnect()\n }, [])\n\n useEffect(() => {\n if (!count) return\n\n const defaultIndex = initialIndex ?? Math.floor((count - 1) / 2)\n setActive(clamp(defaultIndex, 0, count - 1))\n }, [count, initialIndex])\n\n const goTo = useCallback(\n (nextIndex: number) => {\n if (count < 1) return\n\n if (loop) {\n setActive((nextIndex + count) % count)\n return\n }\n\n setActive(clamp(nextIndex, 0, count - 1))\n },\n [count, loop]\n )\n\n const prev = useCallback(() => goTo(active - 1), [active, goTo])\n const next = useCallback(() => goTo(active + 1), [active, goTo])\n\n const onPointerDown = (event: ReactPointerEvent<HTMLDivElement>) => {\n if (!draggable || count <= 1) return\n if (isInteractiveTarget(event.target)) return\n event.currentTarget.setPointerCapture(event.pointerId)\n setDragging(true)\n startX.current = event.clientX\n setDrag(0)\n }\n\n const onPointerMove = (event: ReactPointerEvent<HTMLDivElement>) => {\n if (!dragging) return\n setDrag(event.clientX - startX.current)\n }\n\n const stopDrag = () => {\n if (!dragging) return\n\n const limit = Math.max(56, itemWidth * 0.12)\n\n if (drag <= -limit) {\n next()\n } else if (drag >= limit) {\n prev()\n }\n\n setDragging(false)\n setDrag(0)\n }\n\n useEffect(() => {\n const node = stageRef.current\n if (!node) return\n\n const handleWheel = (event: WheelEvent) => {\n if (!wheel || count <= 1 || wheelLock.current) return\n\n const axis = Math.abs(event.deltaX) > Math.abs(event.deltaY) ? event.deltaX : event.deltaY\n if (Math.abs(axis) < 28) return\n\n event.preventDefault()\n event.stopPropagation()\n\n wheelLock.current = true\n window.setTimeout(() => {\n wheelLock.current = false\n }, 260)\n\n if (axis > 0) {\n next()\n } else {\n prev()\n }\n }\n\n node.addEventListener('wheel', handleWheel, {passive: false})\n return () => node.removeEventListener('wheel', handleWheel)\n }, [count, next, prev, wheel])\n\n if (!count) return null\n\n const offset = stageWidth / 2 - active * (itemWidth + itemGap) - itemWidth / 2 + drag\n\n return (\n <div\n className={cn('showcase', className)}\n style={{...style, '--item-width': `${itemWidth}px`} as CSSProperties}\n {...rest}\n >\n <div\n ref={stageRef}\n className=\"showcase-stage\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={stopDrag}\n onPointerCancel={stopDrag}\n onPointerLeave={stopDrag}\n style={{\n cursor: draggable && count > 1 ? (dragging ? 'grabbing' : 'grab') : undefined,\n }}\n >\n <div\n className={cn('showcase-track', dragging && 'dragging')}\n style={{\n transform: `translateX(${offset}px)`,\n gap: `${itemGap}px`,\n }}\n >\n {slides.map((slide, index) => {\n const dist = Math.abs(index - active)\n\n return (\n <div\n key={index}\n className={cn(\n 'showcase-item',\n index === active && 'active',\n dist === 1 && 'near',\n dist >= 2 && 'far'\n )}\n style={{zIndex: Math.max(1, count - dist)}}\n >\n {slide}\n </div>\n )\n })}\n </div>\n </div>\n\n {showButtons && count > 1 && (\n <div className=\"showcase-actions\">\n <MButton\n type=\"button\"\n variant=\"secondary\"\n className=\"showcase-btn\"\n startIcon={<MChevronLeftIcon />}\n onClick={prev}\n >\n Previous\n </MButton>\n <MButton type=\"button\" className=\"showcase-btn\" endIcon={<MChevronRightIcon />} onClick={next}>\n Next\n </MButton>\n </div>\n )}\n </div>\n )\n}\n","import {Children} from 'react'\nimport type {ReactNode} from 'react'\nimport {cn} from '../../../utils/cn'\nimport type {MMasonryProps} from './MMasonry.types'\nimport './MMasonry.css'\n\nfunction getItems<T>(items?: T[], renderItem?: (item: T, index: number) => ReactNode, children?: ReactNode) {\n if (items && renderItem) {\n return items.map((item, index) => renderItem(item, index))\n }\n\n return Children.toArray(children)\n}\n\n// Render a responsive masonry wall for images, cards and uneven content.\nexport function MMasonry<T = unknown>({\n items,\n renderItem,\n columns = 3,\n className,\n children,\n style,\n ...rest\n}: MMasonryProps<T>) {\n const content = getItems(items, renderItem, children)\n\n if (!content.length) return null\n\n return (\n <div className={cn('masonry', className)} style={{...style, columnCount: columns}} {...rest}>\n {content.map((item, index) => (\n <div key={index} className=\"masonry item\">\n {item}\n </div>\n ))}\n </div>\n )\n}\n","import {MCard, MCardBody, MCardFooter} from '../../cards'\nimport {cn} from '../../../utils/cn'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport {usesDim, usesRipple, usesZoom} from '../mediaInteraction'\nimport './MMasonryItem.css'\nimport type {MMasonryItemProps} from './MMasonryItem.types'\n\nexport function MMasonryItem({\n src,\n alt = '',\n height,\n overlay,\n body,\n footer,\n interactive = false,\n imageClickEffect = 'none',\n imgProps,\n children,\n}: MMasonryItemProps) {\n const imgStyle = height ? {...imgProps?.style, height} : imgProps?.style\n const content = body ?? children\n const shouldRipple = usesRipple(imageClickEffect)\n const {effectClassName, effectLayer, handlePointerDown} = useInteractionEffect<HTMLDivElement>({\n effect: shouldRipple ? 'ripple' : 'none',\n })\n\n return (\n <MCard\n interactive={interactive}\n clickEffect={imageClickEffect !== 'none' ? 'none' : undefined}\n className={cn('masonry card', interactive && 'interactive')}\n >\n <div\n className={cn(\n 'masonry media',\n effectClassName,\n usesZoom(imageClickEffect) && 'effect-zoom',\n usesDim(imageClickEffect) && 'effect-dim'\n )}\n onPointerDown={(event) => {\n const target = event.target as HTMLElement\n\n if (target.closest('.masonry.overlay')) {\n return\n }\n\n handlePointerDown(event)\n }}\n >\n <img {...imgProps} src={src} alt={alt} className=\"masonry img\" style={imgStyle} />\n {overlay ? <div className=\"masonry overlay\">{overlay}</div> : null}\n {effectLayer}\n </div>\n {content ? <MCardBody className=\"masonry body\">{content}</MCardBody> : null}\n {footer ? <MCardFooter className=\"masonry footer\">{footer}</MCardFooter> : null}\n </MCard>\n )\n}\n","import type {MAvatarStackProps} from './MAvatarStack.types'\nimport {cn} from '../../../utils/cn'\nimport {MAvatar} from '../MAvatar'\nimport './MAvatarStack.css'\n\nexport function MAvatarStack({\n items,\n max = 5,\n size = 'sm',\n color = 'primary',\n overlap = 10,\n className,\n style,\n ...rest\n}: MAvatarStackProps) {\n if (!items || items.length === 0) return null\n\n const visible = items.slice(0, max)\n const overflowCount = items.length - max\n const avatarPx = typeof size === 'number' ? size : ({xs: 20, sm: 28, md: 40, lg: 56, xl: 72}[size] ?? 28)\n\n return (\n <div\n className={cn('avatar-stack', className)}\n style={{'--avatar-stack-overlap': `-${overlap}px`, ...style} as React.CSSProperties}\n {...rest}\n >\n {visible.map((item, i) => (\n <MAvatar\n key={i}\n src={item.avatar}\n name={item.name}\n size={size}\n color={color}\n className=\"avatar-stack-item\"\n style={{zIndex: i + 1}}\n />\n ))}\n {overflowCount > 0 && (\n <span\n className=\"avatar-stack-overflow\"\n style={{\n width: avatarPx,\n height: avatarPx,\n fontSize: avatarPx * 0.38,\n zIndex: visible.length + 1,\n }}\n >\n +{overflowCount}\n </span>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require(`./icons-Dv1T-cF4.cjs`),t=require(`./cn-CU5TNITO.cjs`),n=require(`./useInteractionEffect-DnEfbCrX.cjs`),r=require(`./MButton-
|
|
2
|
-
//# sourceMappingURL=media-
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media-C4WtzWxU.cjs","names":[],"sources":["../src/components/media/MGallery/MGallery.tsx","../src/components/media/MCarousel/MCarousel.tsx","../src/components/media/mediaInteraction.ts","../src/components/media/MShowcaseCarouselItem/MShowcaseCarouselItem.tsx","../src/components/media/MShowcaseCarousel/MShowcaseCarousel.tsx","../src/components/media/MMasonry/MMasonry.tsx","../src/components/media/MMasonryItem/MMasonryItem.tsx","../src/components/media/MAvatarStack/MAvatarStack.tsx"],"sourcesContent":["import type {MGalleryProps} from './MGallery.types'\nimport {cn} from '../../../utils/cn'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport './MGallery.css'\n\n// Render a responsive image grid gallery.\nexport function MGallery({\n items,\n columns = 3,\n rounded = true,\n clickEffect = 'ripple',\n className,\n ...rest\n}: MGalleryProps) {\n return (\n <div className={cn('gallery', `columns-${columns}`, className)} {...rest}>\n {items.map((item, i) => (\n <GalleryFigure key={i} item={item} rounded={rounded} clickEffect={clickEffect} />\n ))}\n </div>\n )\n}\n\nfunction GalleryFigure({\n item,\n rounded,\n clickEffect,\n}: {\n item: {src: string; alt?: string; caption?: string}\n rounded: boolean\n clickEffect: 'none' | 'ripple'\n}) {\n const {effectClassName, effectLayer, handlePointerDown} = useInteractionEffect<HTMLElement>({\n effect: clickEffect,\n })\n\n return (\n <figure className={cn('gallery-item', rounded && 'rounded', effectClassName)} onPointerDown={handlePointerDown}>\n <img className=\"gallery-image\" src={item.src} alt={item.alt || ''} loading=\"lazy\" />\n {item.caption && <figcaption className=\"gallery-caption\">{item.caption}</figcaption>}\n {effectLayer}\n </figure>\n )\n}\n","import {useState, useEffect, useCallback, useRef, Children} from 'react'\nimport type * as React from 'react'\nimport type {MCarouselProps} from './MCarousel.types'\nimport {cn} from '../../../utils/cn'\nimport {MButton} from '../../controls'\nimport {MChevronLeftIcon, MChevronRightIcon} from '../../../icons'\nimport './MCarousel.css'\n\n// Render a swipeable content slider with arrows, dots and transition modes.\nexport function MCarousel({\n autoPlay = false,\n interval = 5000,\n showDots = true,\n showArrows = true,\n loop = true,\n draggable = true,\n transition = 'slide',\n className,\n children,\n ...rest\n}: MCarouselProps) {\n const slides = Children.toArray(children)\n const count = slides.length\n const [active, setActive] = useState(0)\n const [dragOffset, setDragOffset] = useState(0)\n const [isDragging, setIsDragging] = useState(false)\n const dragStartX = useRef(0)\n const trackRef = useRef<HTMLDivElement>(null)\n\n const goTo = useCallback(\n (index: number) => {\n if (loop) {\n setActive((index + count) % count)\n } else {\n setActive(Math.max(0, Math.min(index, count - 1)))\n }\n },\n [count, loop]\n )\n\n const prev = useCallback(() => goTo(active - 1), [active, goTo])\n const next = useCallback(() => goTo(active + 1), [active, goTo])\n\n useEffect(() => {\n if (!autoPlay || count <= 1 || isDragging) return\n const timer = setInterval(next, interval)\n return () => clearInterval(timer)\n }, [autoPlay, interval, next, count, isDragging])\n\n const handleDragStart = (clientX: number) => {\n if (!draggable) return\n setIsDragging(true)\n dragStartX.current = clientX\n setDragOffset(0)\n }\n\n const handleDragMove = (clientX: number) => {\n if (!isDragging) return\n const diff = clientX - dragStartX.current\n setDragOffset(diff)\n }\n\n const handleDragEnd = () => {\n if (!isDragging) return\n setIsDragging(false)\n const threshold = 50\n if (dragOffset < -threshold) {\n next()\n } else if (dragOffset > threshold) {\n prev()\n }\n setDragOffset(0)\n }\n\n const onPointerDown = (e: React.PointerEvent) => {\n if (!draggable) return\n e.currentTarget.setPointerCapture(e.pointerId)\n handleDragStart(e.clientX)\n }\n\n const onPointerMove = (e: React.PointerEvent) => {\n handleDragMove(e.clientX)\n }\n\n const onPointerUp = () => {\n handleDragEnd()\n }\n\n if (count === 0) return null\n\n const isFade = transition === 'fade'\n const trackStyle = !isFade\n ? {transform: `translateX(calc(-${active * 100}% + ${isDragging ? dragOffset : 0}px))`}\n : undefined\n\n return (\n <div className={cn('carousel', isFade && 'fade', className)} {...rest}>\n <div\n className=\"carousel-viewport\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerUp}\n style={{\n touchAction: draggable ? 'pan-y' : undefined,\n cursor: draggable ? (isDragging ? 'grabbing' : 'grab') : undefined,\n }}\n >\n <div ref={trackRef} className={cn('carousel-track', isDragging && 'dragging')} style={trackStyle}>\n {slides.map((slide, i) => (\n <div\n key={i}\n className={cn(\n 'carousel-slide',\n isFade && i === active && 'active',\n isFade && i !== active && 'hidden'\n )}\n >\n {slide}\n </div>\n ))}\n </div>\n </div>\n\n {showArrows && count > 1 && (\n <>\n <MButton\n variant=\"ghost\"\n color=\"primary\"\n iconOnly\n shape=\"circle\"\n onClick={prev}\n aria-label=\"Previous slide\"\n className=\"carousel-arrow carousel-arrow-prev\"\n >\n <MChevronLeftIcon />\n </MButton>\n <MButton\n variant=\"ghost\"\n color=\"primary\"\n iconOnly\n shape=\"circle\"\n onClick={next}\n aria-label=\"Next slide\"\n className=\"carousel-arrow carousel-arrow-next\"\n >\n <MChevronRightIcon />\n </MButton>\n </>\n )}\n\n {showDots && count > 1 && (\n <div className=\"carousel-dots\">\n {slides.map((_, i) => (\n <button\n key={i}\n className={cn('carousel-dot', i === active && 'active')}\n onClick={() => goTo(i)}\n aria-label={`Slide ${i + 1}`}\n type=\"button\"\n />\n ))}\n </div>\n )}\n </div>\n )\n}\n","import type {MClickEffect} from '../../utils/useInteractionEffect'\n\nexport type MMediaInteractionEffect = MClickEffect | 'zoom' | 'dim' | 'zoom-ripple'\n\nexport function usesRipple(effect: MMediaInteractionEffect): boolean {\n return effect === 'ripple' || effect === 'zoom-ripple'\n}\n\nexport function usesZoom(effect: MMediaInteractionEffect): boolean {\n return effect === 'zoom' || effect === 'zoom-ripple'\n}\n\nexport function usesDim(effect: MMediaInteractionEffect): boolean {\n return effect === 'dim'\n}\n","import type {CSSProperties} from 'react'\nimport {MCard, MCardBody, MCardFooter} from '../../cards'\nimport {MImage} from '../MImage'\nimport {cn} from '../../../utils/cn'\nimport {usesDim, usesRipple, usesZoom} from '../mediaInteraction'\nimport type {MShowcaseCarouselItemProps} from './MShowcaseCarouselItem.types'\nimport './MShowcaseCarouselItem.css'\n\nexport function MShowcaseCarouselItem({\n src,\n alt = '',\n media,\n mediaHeight,\n overlay,\n body,\n footer,\n interactive = false,\n imageClickEffect = 'ripple',\n ratio = '16:9',\n fit = 'cover',\n imgProps,\n children,\n}: MShowcaseCarouselItemProps) {\n const content = body ?? children\n const shouldRipple = usesRipple(imageClickEffect)\n const cardStyle = mediaHeight\n ? ({\n '--media-height': typeof mediaHeight === 'number' ? `${mediaHeight}px` : mediaHeight,\n } as CSSProperties)\n : undefined\n const hasMedia = Boolean(media || src)\n\n return (\n <MCard\n interactive={interactive}\n clickEffect={imageClickEffect !== 'none' ? 'none' : undefined}\n className={cn('showcase card', interactive && 'interactive')}\n style={cardStyle}\n >\n {hasMedia ? (\n <div\n className={cn(\n 'showcase media',\n usesZoom(imageClickEffect) && 'effect-zoom',\n usesDim(imageClickEffect) && 'effect-dim'\n )}\n >\n {media ? (\n <div className=\"showcase media-content\">{media}</div>\n ) : (\n <MImage\n {...imgProps}\n src={src}\n alt={alt}\n ratio={ratio}\n fit={fit}\n rounded\n shadow\n clickEffect={shouldRipple ? 'ripple' : 'none'}\n />\n )}\n {overlay ? <div className=\"showcase overlay\">{overlay}</div> : null}\n </div>\n ) : null}\n {content ? <MCardBody className=\"showcase body\">{content}</MCardBody> : null}\n {footer ? <MCardFooter className=\"showcase footer\">{footer}</MCardFooter> : null}\n </MCard>\n )\n}\n","import {Children, useCallback, useEffect, useMemo, useRef, useState} from 'react'\nimport type {CSSProperties, PointerEvent as ReactPointerEvent, ReactNode} from 'react'\nimport {MButton} from '../../controls'\nimport {MShowcaseCarouselItem} from '../MShowcaseCarouselItem'\nimport {MChevronLeftIcon, MChevronRightIcon} from '../../../icons'\nimport {cn} from '../../../utils/cn'\nimport type {MShowcaseCarouselProps, MShowcaseCarouselSlide} from './MShowcaseCarousel.types'\nimport './MShowcaseCarousel.css'\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.min(Math.max(value, min), max)\n}\n\nfunction isInteractiveTarget(target: EventTarget | null) {\n if (!(target instanceof Element)) {\n return false\n }\n\n return !!target.closest(\n 'button, a, input, select, textarea, label, summary, [role=\"button\"], [role=\"link\"], [data-carousel-ignore-drag=\"true\"]'\n )\n}\n\nfunction getSlides<T>(items?: T[], renderItem?: (item: T, index: number) => ReactNode, children?: ReactNode) {\n if (items && renderItem) {\n return items.map((item, index) => renderItem(item, index))\n }\n\n if (items) {\n return items\n .map((item, index) => {\n if (!isShowcaseItem(item)) {\n return null\n }\n\n return <ShowcaseMediaSlide key={index} item={item} />\n })\n .filter(Boolean)\n }\n\n return Children.toArray(children)\n}\n\nfunction isShowcaseItem(value: unknown): value is MShowcaseCarouselSlide {\n const slide = value as {src?: unknown}\n return !!value && typeof value === 'object' && 'src' in value && typeof slide.src === 'string'\n}\n\nfunction ShowcaseMediaSlide({item}: {item: MShowcaseCarouselSlide}) {\n return <MShowcaseCarouselItem src={item.src} alt={item.alt || ''} overlay={item.overlay} />\n}\n\n// Show a centered, mouse-driven carousel with partial side previews.\nexport function MShowcaseCarousel<T = unknown>({\n items,\n renderItem,\n initialIndex,\n showButtons = true,\n loop = true,\n draggable = true,\n wheel = true,\n itemMinWidth = 220,\n itemMaxWidth = 520,\n itemWidthRatio = 0.56,\n className,\n children,\n style,\n ...rest\n}: MShowcaseCarouselProps<T>) {\n const slides = useMemo(() => getSlides(items, renderItem, children), [children, items, renderItem])\n const count = slides.length\n const [active, setActive] = useState(0)\n const [drag, setDrag] = useState(0)\n const [dragging, setDragging] = useState(false)\n const [stageWidth, setStageWidth] = useState(0)\n const stageRef = useRef<HTMLDivElement>(null)\n const startX = useRef(0)\n const wheelLock = useRef(false)\n\n const widthRatio =\n stageWidth < 640\n ? Math.max(itemWidthRatio, 0.78)\n : stageWidth < 960\n ? Math.max(itemWidthRatio, 0.66)\n : itemWidthRatio\n const itemWidth = clamp(stageWidth * widthRatio || itemMinWidth, itemMinWidth, itemMaxWidth)\n const itemGap = clamp(stageWidth * 0.022 || 16, 10, 24)\n\n useEffect(() => {\n const node = stageRef.current\n if (!node) return\n\n const update = () => setStageWidth(node.clientWidth)\n update()\n\n const observer = new ResizeObserver(update)\n observer.observe(node)\n\n return () => observer.disconnect()\n }, [])\n\n useEffect(() => {\n if (!count) return\n\n const defaultIndex = initialIndex ?? Math.floor((count - 1) / 2)\n setActive(clamp(defaultIndex, 0, count - 1))\n }, [count, initialIndex])\n\n const goTo = useCallback(\n (nextIndex: number) => {\n if (count < 1) return\n\n if (loop) {\n setActive((nextIndex + count) % count)\n return\n }\n\n setActive(clamp(nextIndex, 0, count - 1))\n },\n [count, loop]\n )\n\n const prev = useCallback(() => goTo(active - 1), [active, goTo])\n const next = useCallback(() => goTo(active + 1), [active, goTo])\n\n const onPointerDown = (event: ReactPointerEvent<HTMLDivElement>) => {\n if (!draggable || count <= 1) return\n if (isInteractiveTarget(event.target)) return\n event.currentTarget.setPointerCapture(event.pointerId)\n setDragging(true)\n startX.current = event.clientX\n setDrag(0)\n }\n\n const onPointerMove = (event: ReactPointerEvent<HTMLDivElement>) => {\n if (!dragging) return\n setDrag(event.clientX - startX.current)\n }\n\n const stopDrag = () => {\n if (!dragging) return\n\n const limit = Math.max(56, itemWidth * 0.12)\n\n if (drag <= -limit) {\n next()\n } else if (drag >= limit) {\n prev()\n }\n\n setDragging(false)\n setDrag(0)\n }\n\n useEffect(() => {\n const node = stageRef.current\n if (!node) return\n\n const handleWheel = (event: WheelEvent) => {\n if (!wheel || count <= 1 || wheelLock.current) return\n\n const axis = Math.abs(event.deltaX) > Math.abs(event.deltaY) ? event.deltaX : event.deltaY\n if (Math.abs(axis) < 28) return\n\n event.preventDefault()\n event.stopPropagation()\n\n wheelLock.current = true\n window.setTimeout(() => {\n wheelLock.current = false\n }, 260)\n\n if (axis > 0) {\n next()\n } else {\n prev()\n }\n }\n\n node.addEventListener('wheel', handleWheel, {passive: false})\n return () => node.removeEventListener('wheel', handleWheel)\n }, [count, next, prev, wheel])\n\n if (!count) return null\n\n const offset = stageWidth / 2 - active * (itemWidth + itemGap) - itemWidth / 2 + drag\n\n return (\n <div\n className={cn('showcase', className)}\n style={{...style, '--item-width': `${itemWidth}px`} as CSSProperties}\n {...rest}\n >\n <div\n ref={stageRef}\n className=\"showcase-stage\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={stopDrag}\n onPointerCancel={stopDrag}\n onPointerLeave={stopDrag}\n style={{\n cursor: draggable && count > 1 ? (dragging ? 'grabbing' : 'grab') : undefined,\n }}\n >\n <div\n className={cn('showcase-track', dragging && 'dragging')}\n style={{\n transform: `translateX(${offset}px)`,\n gap: `${itemGap}px`,\n }}\n >\n {slides.map((slide, index) => {\n const dist = Math.abs(index - active)\n\n return (\n <div\n key={index}\n className={cn(\n 'showcase-item',\n index === active && 'active',\n dist === 1 && 'near',\n dist >= 2 && 'far'\n )}\n style={{zIndex: Math.max(1, count - dist)}}\n >\n {slide}\n </div>\n )\n })}\n </div>\n </div>\n\n {showButtons && count > 1 && (\n <div className=\"showcase-actions\">\n <MButton\n type=\"button\"\n variant=\"secondary\"\n className=\"showcase-btn\"\n startIcon={<MChevronLeftIcon />}\n onClick={prev}\n >\n Previous\n </MButton>\n <MButton type=\"button\" className=\"showcase-btn\" endIcon={<MChevronRightIcon />} onClick={next}>\n Next\n </MButton>\n </div>\n )}\n </div>\n )\n}\n","import {Children} from 'react'\nimport type {ReactNode} from 'react'\nimport {cn} from '../../../utils/cn'\nimport type {MMasonryProps} from './MMasonry.types'\nimport './MMasonry.css'\n\nfunction getItems<T>(items?: T[], renderItem?: (item: T, index: number) => ReactNode, children?: ReactNode) {\n if (items && renderItem) {\n return items.map((item, index) => renderItem(item, index))\n }\n\n return Children.toArray(children)\n}\n\n// Render a responsive masonry wall for images, cards and uneven content.\nexport function MMasonry<T = unknown>({\n items,\n renderItem,\n columns = 3,\n className,\n children,\n style,\n ...rest\n}: MMasonryProps<T>) {\n const content = getItems(items, renderItem, children)\n\n if (!content.length) return null\n\n return (\n <div className={cn('masonry', className)} style={{...style, columnCount: columns}} {...rest}>\n {content.map((item, index) => (\n <div key={index} className=\"masonry item\">\n {item}\n </div>\n ))}\n </div>\n )\n}\n","import {MCard, MCardBody, MCardFooter} from '../../cards'\nimport {cn} from '../../../utils/cn'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport {usesDim, usesRipple, usesZoom} from '../mediaInteraction'\nimport './MMasonryItem.css'\nimport type {MMasonryItemProps} from './MMasonryItem.types'\n\nexport function MMasonryItem({\n src,\n alt = '',\n height,\n overlay,\n body,\n footer,\n interactive = false,\n imageClickEffect = 'none',\n imgProps,\n children,\n}: MMasonryItemProps) {\n const imgStyle = height ? {...imgProps?.style, height} : imgProps?.style\n const content = body ?? children\n const shouldRipple = usesRipple(imageClickEffect)\n const {effectClassName, effectLayer, handlePointerDown} = useInteractionEffect<HTMLDivElement>({\n effect: shouldRipple ? 'ripple' : 'none',\n })\n\n return (\n <MCard\n interactive={interactive}\n clickEffect={imageClickEffect !== 'none' ? 'none' : undefined}\n className={cn('masonry card', interactive && 'interactive')}\n >\n <div\n className={cn(\n 'masonry media',\n effectClassName,\n usesZoom(imageClickEffect) && 'effect-zoom',\n usesDim(imageClickEffect) && 'effect-dim'\n )}\n onPointerDown={(event) => {\n const target = event.target as HTMLElement\n\n if (target.closest('.masonry.overlay')) {\n return\n }\n\n handlePointerDown(event)\n }}\n >\n <img {...imgProps} src={src} alt={alt} className=\"masonry img\" style={imgStyle} />\n {overlay ? <div className=\"masonry overlay\">{overlay}</div> : null}\n {effectLayer}\n </div>\n {content ? <MCardBody className=\"masonry body\">{content}</MCardBody> : null}\n {footer ? <MCardFooter className=\"masonry footer\">{footer}</MCardFooter> : null}\n </MCard>\n )\n}\n","import type {MAvatarStackProps} from './MAvatarStack.types'\nimport {cn} from '../../../utils/cn'\nimport {MAvatar} from '../MAvatar'\nimport './MAvatarStack.css'\n\nexport function MAvatarStack({\n items,\n max = 5,\n size = 'sm',\n color = 'primary',\n overlap = 10,\n className,\n style,\n ...rest\n}: MAvatarStackProps) {\n if (!items || items.length === 0) return null\n\n const visible = items.slice(0, max)\n const overflowCount = items.length - max\n const avatarPx = typeof size === 'number' ? size : ({xs: 20, sm: 28, md: 40, lg: 56, xl: 72}[size] ?? 28)\n\n return (\n <div\n className={cn('avatar-stack', className)}\n style={{'--avatar-stack-overlap': `-${overlap}px`, ...style} as React.CSSProperties}\n {...rest}\n >\n {visible.map((item, i) => (\n <MAvatar\n key={i}\n src={item.avatar}\n name={item.name}\n size={size}\n color={color}\n className=\"avatar-stack-item\"\n style={{zIndex: i + 1}}\n />\n ))}\n {overflowCount > 0 && (\n <span\n className=\"avatar-stack-overflow\"\n style={{\n width: avatarPx,\n height: avatarPx,\n fontSize: avatarPx * 0.38,\n zIndex: visible.length + 1,\n }}\n >\n +{overflowCount}\n </span>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"media-D5YGOTm7.cjs","names":[],"sources":["../src/components/media/MGallery/MGallery.tsx","../src/components/media/MCarousel/MCarousel.tsx","../src/components/media/mediaInteraction.ts","../src/components/media/MShowcaseCarouselItem/MShowcaseCarouselItem.tsx","../src/components/media/MShowcaseCarousel/MShowcaseCarousel.tsx","../src/components/media/MMasonry/MMasonry.tsx","../src/components/media/MMasonryItem/MMasonryItem.tsx","../src/components/media/MAvatarStack/MAvatarStack.tsx"],"sourcesContent":["import type {MGalleryProps} from './MGallery.types'\nimport {cn} from '../../../utils/cn'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport './MGallery.css'\n\n// Render a responsive image grid gallery.\nexport function MGallery({\n items,\n columns = 3,\n rounded = true,\n clickEffect = 'ripple',\n className,\n ...rest\n}: MGalleryProps) {\n return (\n <div className={cn('gallery', `columns-${columns}`, className)} {...rest}>\n {items.map((item, i) => (\n <GalleryFigure key={i} item={item} rounded={rounded} clickEffect={clickEffect} />\n ))}\n </div>\n )\n}\n\nfunction GalleryFigure({\n item,\n rounded,\n clickEffect,\n}: {\n item: {src: string; alt?: string; caption?: string}\n rounded: boolean\n clickEffect: 'none' | 'ripple'\n}) {\n const {effectClassName, effectLayer, handlePointerDown} = useInteractionEffect<HTMLElement>({\n effect: clickEffect,\n })\n\n return (\n <figure className={cn('gallery-item', rounded && 'rounded', effectClassName)} onPointerDown={handlePointerDown}>\n <img className=\"gallery-image\" src={item.src} alt={item.alt || ''} loading=\"lazy\" />\n {item.caption && <figcaption className=\"gallery-caption\">{item.caption}</figcaption>}\n {effectLayer}\n </figure>\n )\n}\n","import {useState, useEffect, useCallback, useRef, Children} from 'react'\nimport type * as React from 'react'\nimport type {MCarouselProps} from './MCarousel.types'\nimport {cn} from '../../../utils/cn'\nimport {MButton} from '../../controls'\nimport {MChevronLeftIcon, MChevronRightIcon} from '../../../icons'\nimport './MCarousel.css'\n\n// Render a swipeable content slider with arrows, dots and transition modes.\nexport function MCarousel({\n autoPlay = false,\n interval = 5000,\n showDots = true,\n showArrows = true,\n loop = true,\n draggable = true,\n transition = 'slide',\n className,\n children,\n ...rest\n}: MCarouselProps) {\n const slides = Children.toArray(children)\n const count = slides.length\n const [active, setActive] = useState(0)\n const [dragOffset, setDragOffset] = useState(0)\n const [isDragging, setIsDragging] = useState(false)\n const dragStartX = useRef(0)\n const trackRef = useRef<HTMLDivElement>(null)\n\n const goTo = useCallback(\n (index: number) => {\n if (loop) {\n setActive((index + count) % count)\n } else {\n setActive(Math.max(0, Math.min(index, count - 1)))\n }\n },\n [count, loop]\n )\n\n const prev = useCallback(() => goTo(active - 1), [active, goTo])\n const next = useCallback(() => goTo(active + 1), [active, goTo])\n\n useEffect(() => {\n if (!autoPlay || count <= 1 || isDragging) return\n const timer = setInterval(next, interval)\n return () => clearInterval(timer)\n }, [autoPlay, interval, next, count, isDragging])\n\n const handleDragStart = (clientX: number) => {\n if (!draggable) return\n setIsDragging(true)\n dragStartX.current = clientX\n setDragOffset(0)\n }\n\n const handleDragMove = (clientX: number) => {\n if (!isDragging) return\n const diff = clientX - dragStartX.current\n setDragOffset(diff)\n }\n\n const handleDragEnd = () => {\n if (!isDragging) return\n setIsDragging(false)\n const threshold = 50\n if (dragOffset < -threshold) {\n next()\n } else if (dragOffset > threshold) {\n prev()\n }\n setDragOffset(0)\n }\n\n const onPointerDown = (e: React.PointerEvent) => {\n if (!draggable) return\n e.currentTarget.setPointerCapture(e.pointerId)\n handleDragStart(e.clientX)\n }\n\n const onPointerMove = (e: React.PointerEvent) => {\n handleDragMove(e.clientX)\n }\n\n const onPointerUp = () => {\n handleDragEnd()\n }\n\n if (count === 0) return null\n\n const isFade = transition === 'fade'\n const trackStyle = !isFade\n ? {transform: `translateX(calc(-${active * 100}% + ${isDragging ? dragOffset : 0}px))`}\n : undefined\n\n return (\n <div className={cn('carousel', isFade && 'fade', className)} {...rest}>\n <div\n className=\"carousel-viewport\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerUp}\n style={{\n touchAction: draggable ? 'pan-y' : undefined,\n cursor: draggable ? (isDragging ? 'grabbing' : 'grab') : undefined,\n }}\n >\n <div ref={trackRef} className={cn('carousel-track', isDragging && 'dragging')} style={trackStyle}>\n {slides.map((slide, i) => (\n <div\n key={i}\n className={cn(\n 'carousel-slide',\n isFade && i === active && 'active',\n isFade && i !== active && 'hidden'\n )}\n >\n {slide}\n </div>\n ))}\n </div>\n </div>\n\n {showArrows && count > 1 && (\n <>\n <MButton\n variant=\"ghost\"\n color=\"primary\"\n iconOnly\n shape=\"circle\"\n onClick={prev}\n aria-label=\"Previous slide\"\n className=\"carousel-arrow carousel-arrow-prev\"\n >\n <MChevronLeftIcon />\n </MButton>\n <MButton\n variant=\"ghost\"\n color=\"primary\"\n iconOnly\n shape=\"circle\"\n onClick={next}\n aria-label=\"Next slide\"\n className=\"carousel-arrow carousel-arrow-next\"\n >\n <MChevronRightIcon />\n </MButton>\n </>\n )}\n\n {showDots && count > 1 && (\n <div className=\"carousel-dots\">\n {slides.map((_, i) => (\n <button\n key={i}\n className={cn('carousel-dot', i === active && 'active')}\n onClick={() => goTo(i)}\n aria-label={`Slide ${i + 1}`}\n type=\"button\"\n />\n ))}\n </div>\n )}\n </div>\n )\n}\n","import type {MClickEffect} from '../../utils/useInteractionEffect'\n\nexport type MMediaInteractionEffect = MClickEffect | 'zoom' | 'dim' | 'zoom-ripple'\n\nexport function usesRipple(effect: MMediaInteractionEffect): boolean {\n return effect === 'ripple' || effect === 'zoom-ripple'\n}\n\nexport function usesZoom(effect: MMediaInteractionEffect): boolean {\n return effect === 'zoom' || effect === 'zoom-ripple'\n}\n\nexport function usesDim(effect: MMediaInteractionEffect): boolean {\n return effect === 'dim'\n}\n","import type {CSSProperties} from 'react'\nimport {MCard, MCardBody, MCardFooter} from '../../cards'\nimport {MImage} from '../MImage'\nimport {cn} from '../../../utils/cn'\nimport {usesDim, usesRipple, usesZoom} from '../mediaInteraction'\nimport type {MShowcaseCarouselItemProps} from './MShowcaseCarouselItem.types'\nimport './MShowcaseCarouselItem.css'\n\nexport function MShowcaseCarouselItem({\n src,\n alt = '',\n media,\n mediaHeight,\n overlay,\n body,\n footer,\n interactive = false,\n imageClickEffect = 'ripple',\n ratio = '16:9',\n fit = 'cover',\n imgProps,\n children,\n}: MShowcaseCarouselItemProps) {\n const content = body ?? children\n const shouldRipple = usesRipple(imageClickEffect)\n const cardStyle = mediaHeight\n ? ({\n '--media-height': typeof mediaHeight === 'number' ? `${mediaHeight}px` : mediaHeight,\n } as CSSProperties)\n : undefined\n const hasMedia = Boolean(media || src)\n\n return (\n <MCard\n interactive={interactive}\n clickEffect={imageClickEffect !== 'none' ? 'none' : undefined}\n className={cn('showcase card', interactive && 'interactive')}\n style={cardStyle}\n >\n {hasMedia ? (\n <div\n className={cn(\n 'showcase media',\n usesZoom(imageClickEffect) && 'effect-zoom',\n usesDim(imageClickEffect) && 'effect-dim'\n )}\n >\n {media ? (\n <div className=\"showcase media-content\">{media}</div>\n ) : (\n <MImage\n {...imgProps}\n src={src}\n alt={alt}\n ratio={ratio}\n fit={fit}\n rounded\n shadow\n clickEffect={shouldRipple ? 'ripple' : 'none'}\n />\n )}\n {overlay ? <div className=\"showcase overlay\">{overlay}</div> : null}\n </div>\n ) : null}\n {content ? <MCardBody className=\"showcase body\">{content}</MCardBody> : null}\n {footer ? <MCardFooter className=\"showcase footer\">{footer}</MCardFooter> : null}\n </MCard>\n )\n}\n","import {Children, useCallback, useEffect, useMemo, useRef, useState} from 'react'\nimport type {CSSProperties, PointerEvent as ReactPointerEvent, ReactNode} from 'react'\nimport {MButton} from '../../controls'\nimport {MShowcaseCarouselItem} from '../MShowcaseCarouselItem'\nimport {MChevronLeftIcon, MChevronRightIcon} from '../../../icons'\nimport {cn} from '../../../utils/cn'\nimport type {MShowcaseCarouselProps, MShowcaseCarouselSlide} from './MShowcaseCarousel.types'\nimport './MShowcaseCarousel.css'\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.min(Math.max(value, min), max)\n}\n\nfunction isInteractiveTarget(target: EventTarget | null) {\n if (!(target instanceof Element)) {\n return false\n }\n\n return !!target.closest(\n 'button, a, input, select, textarea, label, summary, [role=\"button\"], [role=\"link\"], [data-carousel-ignore-drag=\"true\"]'\n )\n}\n\nfunction getSlides<T>(items?: T[], renderItem?: (item: T, index: number) => ReactNode, children?: ReactNode) {\n if (items && renderItem) {\n return items.map((item, index) => renderItem(item, index))\n }\n\n if (items) {\n return items\n .map((item, index) => {\n if (!isShowcaseItem(item)) {\n return null\n }\n\n return <ShowcaseMediaSlide key={index} item={item} />\n })\n .filter(Boolean)\n }\n\n return Children.toArray(children)\n}\n\nfunction isShowcaseItem(value: unknown): value is MShowcaseCarouselSlide {\n const slide = value as {src?: unknown}\n return !!value && typeof value === 'object' && 'src' in value && typeof slide.src === 'string'\n}\n\nfunction ShowcaseMediaSlide({item}: {item: MShowcaseCarouselSlide}) {\n return <MShowcaseCarouselItem src={item.src} alt={item.alt || ''} overlay={item.overlay} />\n}\n\n// Show a centered, mouse-driven carousel with partial side previews.\nexport function MShowcaseCarousel<T = unknown>({\n items,\n renderItem,\n initialIndex,\n showButtons = true,\n loop = true,\n draggable = true,\n wheel = true,\n itemMinWidth = 220,\n itemMaxWidth = 520,\n itemWidthRatio = 0.56,\n className,\n children,\n style,\n ...rest\n}: MShowcaseCarouselProps<T>) {\n const slides = useMemo(() => getSlides(items, renderItem, children), [children, items, renderItem])\n const count = slides.length\n const [active, setActive] = useState(0)\n const [drag, setDrag] = useState(0)\n const [dragging, setDragging] = useState(false)\n const [stageWidth, setStageWidth] = useState(0)\n const stageRef = useRef<HTMLDivElement>(null)\n const startX = useRef(0)\n const wheelLock = useRef(false)\n\n const widthRatio =\n stageWidth < 640\n ? Math.max(itemWidthRatio, 0.78)\n : stageWidth < 960\n ? Math.max(itemWidthRatio, 0.66)\n : itemWidthRatio\n const itemWidth = clamp(stageWidth * widthRatio || itemMinWidth, itemMinWidth, itemMaxWidth)\n const itemGap = clamp(stageWidth * 0.022 || 16, 10, 24)\n\n useEffect(() => {\n const node = stageRef.current\n if (!node) return\n\n const update = () => setStageWidth(node.clientWidth)\n update()\n\n const observer = new ResizeObserver(update)\n observer.observe(node)\n\n return () => observer.disconnect()\n }, [])\n\n useEffect(() => {\n if (!count) return\n\n const defaultIndex = initialIndex ?? Math.floor((count - 1) / 2)\n setActive(clamp(defaultIndex, 0, count - 1))\n }, [count, initialIndex])\n\n const goTo = useCallback(\n (nextIndex: number) => {\n if (count < 1) return\n\n if (loop) {\n setActive((nextIndex + count) % count)\n return\n }\n\n setActive(clamp(nextIndex, 0, count - 1))\n },\n [count, loop]\n )\n\n const prev = useCallback(() => goTo(active - 1), [active, goTo])\n const next = useCallback(() => goTo(active + 1), [active, goTo])\n\n const onPointerDown = (event: ReactPointerEvent<HTMLDivElement>) => {\n if (!draggable || count <= 1) return\n if (isInteractiveTarget(event.target)) return\n event.currentTarget.setPointerCapture(event.pointerId)\n setDragging(true)\n startX.current = event.clientX\n setDrag(0)\n }\n\n const onPointerMove = (event: ReactPointerEvent<HTMLDivElement>) => {\n if (!dragging) return\n setDrag(event.clientX - startX.current)\n }\n\n const stopDrag = () => {\n if (!dragging) return\n\n const limit = Math.max(56, itemWidth * 0.12)\n\n if (drag <= -limit) {\n next()\n } else if (drag >= limit) {\n prev()\n }\n\n setDragging(false)\n setDrag(0)\n }\n\n useEffect(() => {\n const node = stageRef.current\n if (!node) return\n\n const handleWheel = (event: WheelEvent) => {\n if (!wheel || count <= 1 || wheelLock.current) return\n\n const axis = Math.abs(event.deltaX) > Math.abs(event.deltaY) ? event.deltaX : event.deltaY\n if (Math.abs(axis) < 28) return\n\n event.preventDefault()\n event.stopPropagation()\n\n wheelLock.current = true\n window.setTimeout(() => {\n wheelLock.current = false\n }, 260)\n\n if (axis > 0) {\n next()\n } else {\n prev()\n }\n }\n\n node.addEventListener('wheel', handleWheel, {passive: false})\n return () => node.removeEventListener('wheel', handleWheel)\n }, [count, next, prev, wheel])\n\n if (!count) return null\n\n const offset = stageWidth / 2 - active * (itemWidth + itemGap) - itemWidth / 2 + drag\n\n return (\n <div\n className={cn('showcase', className)}\n style={{...style, '--item-width': `${itemWidth}px`} as CSSProperties}\n {...rest}\n >\n <div\n ref={stageRef}\n className=\"showcase-stage\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={stopDrag}\n onPointerCancel={stopDrag}\n onPointerLeave={stopDrag}\n style={{\n cursor: draggable && count > 1 ? (dragging ? 'grabbing' : 'grab') : undefined,\n }}\n >\n <div\n className={cn('showcase-track', dragging && 'dragging')}\n style={{\n transform: `translateX(${offset}px)`,\n gap: `${itemGap}px`,\n }}\n >\n {slides.map((slide, index) => {\n const dist = Math.abs(index - active)\n\n return (\n <div\n key={index}\n className={cn(\n 'showcase-item',\n index === active && 'active',\n dist === 1 && 'near',\n dist >= 2 && 'far'\n )}\n style={{zIndex: Math.max(1, count - dist)}}\n >\n {slide}\n </div>\n )\n })}\n </div>\n </div>\n\n {showButtons && count > 1 && (\n <div className=\"showcase-actions\">\n <MButton\n type=\"button\"\n variant=\"secondary\"\n className=\"showcase-btn\"\n startIcon={<MChevronLeftIcon />}\n onClick={prev}\n >\n Previous\n </MButton>\n <MButton type=\"button\" className=\"showcase-btn\" endIcon={<MChevronRightIcon />} onClick={next}>\n Next\n </MButton>\n </div>\n )}\n </div>\n )\n}\n","import {Children} from 'react'\nimport type {ReactNode} from 'react'\nimport {cn} from '../../../utils/cn'\nimport type {MMasonryProps} from './MMasonry.types'\nimport './MMasonry.css'\n\nfunction getItems<T>(items?: T[], renderItem?: (item: T, index: number) => ReactNode, children?: ReactNode) {\n if (items && renderItem) {\n return items.map((item, index) => renderItem(item, index))\n }\n\n return Children.toArray(children)\n}\n\n// Render a responsive masonry wall for images, cards and uneven content.\nexport function MMasonry<T = unknown>({\n items,\n renderItem,\n columns = 3,\n className,\n children,\n style,\n ...rest\n}: MMasonryProps<T>) {\n const content = getItems(items, renderItem, children)\n\n if (!content.length) return null\n\n return (\n <div className={cn('masonry', className)} style={{...style, columnCount: columns}} {...rest}>\n {content.map((item, index) => (\n <div key={index} className=\"masonry item\">\n {item}\n </div>\n ))}\n </div>\n )\n}\n","import {MCard, MCardBody, MCardFooter} from '../../cards'\nimport {cn} from '../../../utils/cn'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport {usesDim, usesRipple, usesZoom} from '../mediaInteraction'\nimport './MMasonryItem.css'\nimport type {MMasonryItemProps} from './MMasonryItem.types'\n\nexport function MMasonryItem({\n src,\n alt = '',\n height,\n overlay,\n body,\n footer,\n interactive = false,\n imageClickEffect = 'none',\n imgProps,\n children,\n}: MMasonryItemProps) {\n const imgStyle = height ? {...imgProps?.style, height} : imgProps?.style\n const content = body ?? children\n const shouldRipple = usesRipple(imageClickEffect)\n const {effectClassName, effectLayer, handlePointerDown} = useInteractionEffect<HTMLDivElement>({\n effect: shouldRipple ? 'ripple' : 'none',\n })\n\n return (\n <MCard\n interactive={interactive}\n clickEffect={imageClickEffect !== 'none' ? 'none' : undefined}\n className={cn('masonry card', interactive && 'interactive')}\n >\n <div\n className={cn(\n 'masonry media',\n effectClassName,\n usesZoom(imageClickEffect) && 'effect-zoom',\n usesDim(imageClickEffect) && 'effect-dim'\n )}\n onPointerDown={(event) => {\n const target = event.target as HTMLElement\n\n if (target.closest('.masonry.overlay')) {\n return\n }\n\n handlePointerDown(event)\n }}\n >\n <img {...imgProps} src={src} alt={alt} className=\"masonry img\" style={imgStyle} />\n {overlay ? <div className=\"masonry overlay\">{overlay}</div> : null}\n {effectLayer}\n </div>\n {content ? <MCardBody className=\"masonry body\">{content}</MCardBody> : null}\n {footer ? <MCardFooter className=\"masonry footer\">{footer}</MCardFooter> : null}\n </MCard>\n )\n}\n","import type {MAvatarStackProps} from './MAvatarStack.types'\nimport {cn} from '../../../utils/cn'\nimport {MAvatar} from '../MAvatar'\nimport './MAvatarStack.css'\n\nexport function MAvatarStack({\n items,\n max = 5,\n size = 'sm',\n color = 'primary',\n overlap = 10,\n className,\n style,\n ...rest\n}: MAvatarStackProps) {\n if (!items || items.length === 0) return null\n\n const visible = items.slice(0, max)\n const overflowCount = items.length - max\n const avatarPx = typeof size === 'number' ? size : ({xs: 20, sm: 28, md: 40, lg: 56, xl: 72}[size] ?? 28)\n\n return (\n <div\n className={cn('avatar-stack', className)}\n style={{'--avatar-stack-overlap': `-${overlap}px`, ...style} as React.CSSProperties}\n {...rest}\n >\n {visible.map((item, i) => (\n <MAvatar\n key={i}\n src={item.avatar}\n name={item.name}\n size={size}\n color={color}\n className=\"avatar-stack-item\"\n style={{zIndex: i + 1}}\n />\n ))}\n {overflowCount > 0 && (\n <span\n className=\"avatar-stack-overflow\"\n style={{\n width: avatarPx,\n height: avatarPx,\n fontSize: avatarPx * 0.38,\n zIndex: visible.length + 1,\n }}\n >\n +{overflowCount}\n </span>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
|
package/dist/media.cjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
const {ensureStyles}=require('./style-runtime.cjs')
|
|
2
2
|
ensureStyles()
|
|
3
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./MImage-
|
|
3
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./MImage-BsQJ_eYf.cjs`),t=require(`./media-D5YGOTm7.cjs`),n=require(`./MAvatar-DJKtca9j.cjs`);exports.MAvatar=n.t,exports.MAvatarStack=t.t,exports.MCarousel=t.o,exports.MGallery=t.s,exports.MImage=e.t,exports.MMasonry=t.r,exports.MMasonryItem=t.n,exports.MShowcaseCarousel=t.i,exports.MShowcaseCarouselItem=t.a;
|
package/dist/media.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {ensureStyles} from './style-runtime.js'
|
|
2
2
|
ensureStyles()
|
|
3
|
-
import { t as e } from "./MImage-
|
|
4
|
-
import { a as t, i as n, n as r, o as i, r as a, s as o, t as s } from "./media-
|
|
5
|
-
import { t as c } from "./MAvatar-
|
|
3
|
+
import { t as e } from "./MImage-BDcrV6IC.js";
|
|
4
|
+
import { a as t, i as n, n as r, o as i, r as a, s as o, t as s } from "./media-8aMOtckF.js";
|
|
5
|
+
import { t as c } from "./MAvatar-BoO51a6m.js";
|
|
6
6
|
export { c as MAvatar, s as MAvatarStack, i as MCarousel, o as MGallery, e as MImage, a as MMasonry, r as MMasonryItem, n as MShowcaseCarousel, t as MShowcaseCarouselItem };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require(`./icons-Dv1T-cF4.cjs`),t=require(`./cn-CU5TNITO.cjs`),n=require(`./MPortal-PyRKsZxc.cjs`),r=require(`./MPopover-C3-fGAke.cjs`),i=require(`./MButton-
|
|
2
|
-
//# sourceMappingURL=overlays-
|
|
1
|
+
const e=require(`./icons-Dv1T-cF4.cjs`),t=require(`./cn-CU5TNITO.cjs`),n=require(`./MPortal-PyRKsZxc.cjs`),r=require(`./MPopover-C3-fGAke.cjs`),i=require(`./MButton-B8rXmFX9.cjs`),a=require(`./MSkeleton-BfRBJ6ku.cjs`);let o=require(`react`),s=require(`react/jsx-runtime`);var c=540,l=72,u={sm:`32vh`,md:`52vh`,lg:`72vh`,full:`92vh`};function d({open:r,onClose:d,title:f,description:p,footer:m,size:h=`md`,closeOnBackdrop:g=!0,closeOnEscape:_=!0,className:v,children:y,style:b,...x}){let S=(0,o.useId)(),[C,w]=(0,o.useState)(!1),[T,E]=(0,o.useState)(!1),[D,O]=(0,o.useState)(0),k=(0,o.useRef)(null),A=(0,o.useRef)(0);(0,o.useEffect)(()=>{r&&(w(!0),E(!1),O(0),A.current=0)},[r]),(0,o.useEffect)(()=>{if(!r&&C){E(!0);let e=window.setTimeout(()=>{w(!1),E(!1)},c);return()=>window.clearTimeout(e)}},[r,C]),(0,o.useEffect)(()=>{if(!C)return;let e=document.body.style.overflow;return document.body.style.overflow=`hidden`,()=>{document.body.style.overflow=e}},[C]),(0,o.useEffect)(()=>{if(!r||!_)return;let e=e=>{e.key===`Escape`&&d()};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[_,d,r]);function j(e){g&&e.target===e.currentTarget&&d()}function M(e){e.preventDefault(),e.currentTarget.setPointerCapture(e.pointerId),k.current={pointerId:e.pointerId,startY:e.clientY},O(0),A.current=0}function N(e){let t=k.current;if(!t||t.pointerId!==e.pointerId)return;let n=Math.max(e.clientY-t.startY,0);A.current=n,O(n)}function P(e){let t=k.current;if(!(!t||t.pointerId!==e)){if(k.current=null,A.current>l){O(0),A.current=0,d();return}O(0),A.current=0}}if(!C)return null;let F=u[h],I=D>0?`translateY(${D}px)`:void 0;return(0,s.jsx)(n.t,{children:(0,s.jsx)(`div`,{className:t.t(`mineral-backdrop`,`sheet-backdrop`,T&&`closing`),onMouseDown:j,children:(0,s.jsx)(`div`,{className:`sheet-shell`,style:{transform:I},children:(0,s.jsxs)(a.n,{className:t.t(`sheet`,`size-${h}`,v),role:`dialog`,"aria-modal":`true`,"aria-labelledby":f?S:void 0,style:{...b,height:h===`full`?F:void 0,maxHeight:F},...x,children:[(0,s.jsx)(`button`,{type:`button`,className:`sheet-grabber`,onPointerDown:M,onPointerMove:N,onPointerUp:e=>P(e.pointerId),onPointerCancel:e=>P(e.pointerId),"aria-label":`Drag down to close`,children:(0,s.jsx)(`span`,{className:`sheet-handle`})}),(f||p)&&(0,s.jsxs)(a.a,{className:`sheet-header`,children:[(0,s.jsxs)(`div`,{className:`sheet-copy`,children:[f&&(0,s.jsx)(`div`,{id:S,className:`sheet-title`,children:f}),p&&(0,s.jsx)(`div`,{className:`sheet-description`,children:p})]}),(0,s.jsx)(i.t,{variant:`link`,color:`neutral`,iconOnly:!0,size:`sm`,onClick:d,"aria-label":`Close`,className:`sheet-close`,children:(0,s.jsx)(e.Ii,{})})]}),(0,s.jsx)(a.r,{className:`sheet-body`,children:y}),m&&(0,s.jsx)(a.i,{className:`sheet-footer`,children:m})]})})})})}function f({title:e,description:n,onConfirm:a,onCancel:c,confirmText:l=`Yes`,cancelText:u=`No`,color:d=`warning`,icon:f,placement:p=`top-start`,open:m,onOpenChange:h,anchorRef:g,className:_}){let v=(0,o.useCallback)(()=>{h(!1),c?.()},[h,c]),y=(0,o.useCallback)(()=>{h(!1),a()},[h,a]);return(0,s.jsxs)(r.t,{open:m,anchorRef:g,onClose:v,placement:p,className:t.t(`popconfirm`,`color-${d}`,_),children:[(0,s.jsxs)(`div`,{className:`body`,children:[f&&(0,s.jsx)(`div`,{className:`icon`,children:f}),(0,s.jsxs)(`div`,{className:`content`,children:[(0,s.jsx)(`div`,{className:`title`,children:e}),n&&(0,s.jsx)(`div`,{className:`description`,children:n})]})]}),(0,s.jsxs)(`div`,{className:`actions`,children:[(0,s.jsx)(i.t,{variant:`ghost`,size:`sm`,color:`neutral`,onClick:v,children:u}),(0,s.jsx)(i.t,{variant:`ghost`,size:`sm`,color:d,onClick:y,children:l})]})]})}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return f}});
|
|
2
|
+
//# sourceMappingURL=overlays-DCj-oV2H.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overlays-D9_8GEse.cjs","names":[],"sources":["../src/components/overlays/MSheet/MSheet.tsx","../src/components/overlays/MPopconfirm/MPopconfirm.tsx"],"sourcesContent":["import {useEffect, useId, useRef, useState} from 'react'\nimport type {PointerEvent as ReactPointerEvent, MouseEvent} from 'react'\nimport type {MSheetProps, MSheetSize} from './MSheet.types'\nimport {MCard, MCardBody, MCardFooter, MCardHeader} from '../../cards'\nimport {MButton} from '../../controls'\nimport {MPortal} from '../../primitives'\nimport {MCloseIcon} from '../../../icons'\nimport {cn} from '../../../utils/cn'\nimport './MSheet.css'\n\nconst EXIT_DURATION = 540\nconst CLOSE_DRAG_THRESHOLD = 72\n\nconst SHEET_HEIGHTS: Record<MSheetSize, string> = {\n sm: '32vh',\n md: '52vh',\n lg: '72vh',\n full: '92vh',\n}\n\nexport function MSheet({\n open,\n onClose,\n title,\n description,\n footer,\n size = 'md',\n closeOnBackdrop = true,\n closeOnEscape = true,\n className,\n children,\n style,\n ...rest\n}: MSheetProps) {\n const titleId = useId()\n const [mounted, setMounted] = useState(false)\n const [closing, setClosing] = useState(false)\n const [dragOffset, setDragOffset] = useState(0)\n\n const dragStateRef = useRef<{pointerId: number; startY: number} | null>(null)\n const dragOffsetRef = useRef(0)\n\n useEffect(() => {\n if (open) {\n setMounted(true)\n setClosing(false)\n setDragOffset(0)\n dragOffsetRef.current = 0\n }\n }, [open])\n\n useEffect(() => {\n if (!open && mounted) {\n setClosing(true)\n const timer = window.setTimeout(() => {\n setMounted(false)\n setClosing(false)\n }, EXIT_DURATION)\n return () => window.clearTimeout(timer)\n }\n }, [open, mounted])\n\n useEffect(() => {\n if (!mounted) return\n\n const previousOverflow = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n\n return () => {\n document.body.style.overflow = previousOverflow\n }\n }, [mounted])\n\n useEffect(() => {\n if (!open || !closeOnEscape) return\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') onClose()\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [closeOnEscape, onClose, open])\n\n function handleBackdropClick(event: MouseEvent<HTMLDivElement>) {\n if (closeOnBackdrop && event.target === event.currentTarget) {\n onClose()\n }\n }\n\n function handleHandlePointerDown(event: ReactPointerEvent<HTMLButtonElement>) {\n event.preventDefault()\n event.currentTarget.setPointerCapture(event.pointerId)\n\n dragStateRef.current = {\n pointerId: event.pointerId,\n startY: event.clientY,\n }\n setDragOffset(0)\n dragOffsetRef.current = 0\n }\n\n function handleHandlePointerMove(event: ReactPointerEvent<HTMLButtonElement>) {\n const dragState = dragStateRef.current\n if (!dragState || dragState.pointerId !== event.pointerId) {\n return\n }\n\n const nextOffset = Math.max(event.clientY - dragState.startY, 0)\n dragOffsetRef.current = nextOffset\n setDragOffset(nextOffset)\n }\n\n function finishDrag(pointerId: number) {\n const dragState = dragStateRef.current\n if (!dragState || dragState.pointerId !== pointerId) {\n return\n }\n\n dragStateRef.current = null\n\n if (dragOffsetRef.current > CLOSE_DRAG_THRESHOLD) {\n setDragOffset(0)\n dragOffsetRef.current = 0\n onClose()\n return\n }\n\n setDragOffset(0)\n dragOffsetRef.current = 0\n }\n\n if (!mounted) return null\n\n const resolvedHeight = SHEET_HEIGHTS[size]\n const transformStyle = dragOffset > 0 ? `translateY(${dragOffset}px)` : undefined\n\n return (\n <MPortal>\n <div\n className={cn('mineral-backdrop', 'sheet-backdrop', closing && 'closing')}\n onMouseDown={handleBackdropClick}\n >\n <div className=\"sheet-shell\" style={{transform: transformStyle}}>\n <MCard\n className={cn('sheet', `size-${size}`, className)}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n style={{\n ...style,\n height: size === 'full' ? resolvedHeight : undefined,\n maxHeight: resolvedHeight,\n }}\n {...rest}\n >\n <button\n type=\"button\"\n className=\"sheet-grabber\"\n onPointerDown={handleHandlePointerDown}\n onPointerMove={handleHandlePointerMove}\n onPointerUp={(event) => finishDrag(event.pointerId)}\n onPointerCancel={(event) => finishDrag(event.pointerId)}\n aria-label=\"Drag down to close\"\n >\n <span className=\"sheet-handle\" />\n </button>\n\n {(title || description) && (\n <MCardHeader className=\"sheet-header\">\n <div className=\"sheet-copy\">\n {title && (\n <div id={titleId} className=\"sheet-title\">\n {title}\n </div>\n )}\n {description && <div className=\"sheet-description\">{description}</div>}\n </div>\n <MButton\n variant=\"link\"\n color=\"neutral\"\n iconOnly\n size=\"sm\"\n onClick={onClose}\n aria-label=\"Close\"\n className=\"sheet-close\"\n >\n <MCloseIcon />\n </MButton>\n </MCardHeader>\n )}\n\n <MCardBody className=\"sheet-body\">{children}</MCardBody>\n\n {footer && <MCardFooter className=\"sheet-footer\">{footer}</MCardFooter>}\n </MCard>\n </div>\n </div>\n </MPortal>\n )\n}\n","import {useCallback} from 'react'\nimport type {MPopconfirmProps} from './MPopconfirm.types'\nimport {MPopover} from '../../primitives'\nimport {MButton} from '../../controls'\nimport {cn} from '../../../utils/cn'\nimport './MPopconfirm.css'\n\nexport function MPopconfirm({\n title,\n description,\n onConfirm,\n onCancel,\n confirmText = 'Yes',\n cancelText = 'No',\n color = 'warning',\n icon,\n placement = 'top-start',\n open,\n onOpenChange,\n anchorRef,\n className,\n}: MPopconfirmProps) {\n const handleCancel = useCallback(() => {\n onOpenChange(false)\n onCancel?.()\n }, [onOpenChange, onCancel])\n\n const handleConfirm = useCallback(() => {\n onOpenChange(false)\n onConfirm()\n }, [onOpenChange, onConfirm])\n\n return (\n <MPopover\n open={open}\n anchorRef={anchorRef}\n onClose={handleCancel}\n placement={placement}\n className={cn('popconfirm', `color-${color}`, className)}\n >\n <div className=\"body\">\n {icon && <div className=\"icon\">{icon}</div>}\n <div className=\"content\">\n <div className=\"title\">{title}</div>\n {description && <div className=\"description\">{description}</div>}\n </div>\n </div>\n <div className=\"actions\">\n <MButton variant=\"ghost\" size=\"sm\" color=\"neutral\" onClick={handleCancel}>\n {cancelText}\n </MButton>\n <MButton variant=\"ghost\" size=\"sm\" color={color} onClick={handleConfirm}>\n {confirmText}\n </MButton>\n </div>\n </MPopover>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"overlays-DCj-oV2H.cjs","names":[],"sources":["../src/components/overlays/MSheet/MSheet.tsx","../src/components/overlays/MPopconfirm/MPopconfirm.tsx"],"sourcesContent":["import {useEffect, useId, useRef, useState} from 'react'\nimport type {PointerEvent as ReactPointerEvent, MouseEvent} from 'react'\nimport type {MSheetProps, MSheetSize} from './MSheet.types'\nimport {MCard, MCardBody, MCardFooter, MCardHeader} from '../../cards'\nimport {MButton} from '../../controls'\nimport {MPortal} from '../../primitives'\nimport {MCloseIcon} from '../../../icons'\nimport {cn} from '../../../utils/cn'\nimport './MSheet.css'\n\nconst EXIT_DURATION = 540\nconst CLOSE_DRAG_THRESHOLD = 72\n\nconst SHEET_HEIGHTS: Record<MSheetSize, string> = {\n sm: '32vh',\n md: '52vh',\n lg: '72vh',\n full: '92vh',\n}\n\nexport function MSheet({\n open,\n onClose,\n title,\n description,\n footer,\n size = 'md',\n closeOnBackdrop = true,\n closeOnEscape = true,\n className,\n children,\n style,\n ...rest\n}: MSheetProps) {\n const titleId = useId()\n const [mounted, setMounted] = useState(false)\n const [closing, setClosing] = useState(false)\n const [dragOffset, setDragOffset] = useState(0)\n\n const dragStateRef = useRef<{pointerId: number; startY: number} | null>(null)\n const dragOffsetRef = useRef(0)\n\n useEffect(() => {\n if (open) {\n setMounted(true)\n setClosing(false)\n setDragOffset(0)\n dragOffsetRef.current = 0\n }\n }, [open])\n\n useEffect(() => {\n if (!open && mounted) {\n setClosing(true)\n const timer = window.setTimeout(() => {\n setMounted(false)\n setClosing(false)\n }, EXIT_DURATION)\n return () => window.clearTimeout(timer)\n }\n }, [open, mounted])\n\n useEffect(() => {\n if (!mounted) return\n\n const previousOverflow = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n\n return () => {\n document.body.style.overflow = previousOverflow\n }\n }, [mounted])\n\n useEffect(() => {\n if (!open || !closeOnEscape) return\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') onClose()\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [closeOnEscape, onClose, open])\n\n function handleBackdropClick(event: MouseEvent<HTMLDivElement>) {\n if (closeOnBackdrop && event.target === event.currentTarget) {\n onClose()\n }\n }\n\n function handleHandlePointerDown(event: ReactPointerEvent<HTMLButtonElement>) {\n event.preventDefault()\n event.currentTarget.setPointerCapture(event.pointerId)\n\n dragStateRef.current = {\n pointerId: event.pointerId,\n startY: event.clientY,\n }\n setDragOffset(0)\n dragOffsetRef.current = 0\n }\n\n function handleHandlePointerMove(event: ReactPointerEvent<HTMLButtonElement>) {\n const dragState = dragStateRef.current\n if (!dragState || dragState.pointerId !== event.pointerId) {\n return\n }\n\n const nextOffset = Math.max(event.clientY - dragState.startY, 0)\n dragOffsetRef.current = nextOffset\n setDragOffset(nextOffset)\n }\n\n function finishDrag(pointerId: number) {\n const dragState = dragStateRef.current\n if (!dragState || dragState.pointerId !== pointerId) {\n return\n }\n\n dragStateRef.current = null\n\n if (dragOffsetRef.current > CLOSE_DRAG_THRESHOLD) {\n setDragOffset(0)\n dragOffsetRef.current = 0\n onClose()\n return\n }\n\n setDragOffset(0)\n dragOffsetRef.current = 0\n }\n\n if (!mounted) return null\n\n const resolvedHeight = SHEET_HEIGHTS[size]\n const transformStyle = dragOffset > 0 ? `translateY(${dragOffset}px)` : undefined\n\n return (\n <MPortal>\n <div\n className={cn('mineral-backdrop', 'sheet-backdrop', closing && 'closing')}\n onMouseDown={handleBackdropClick}\n >\n <div className=\"sheet-shell\" style={{transform: transformStyle}}>\n <MCard\n className={cn('sheet', `size-${size}`, className)}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n style={{\n ...style,\n height: size === 'full' ? resolvedHeight : undefined,\n maxHeight: resolvedHeight,\n }}\n {...rest}\n >\n <button\n type=\"button\"\n className=\"sheet-grabber\"\n onPointerDown={handleHandlePointerDown}\n onPointerMove={handleHandlePointerMove}\n onPointerUp={(event) => finishDrag(event.pointerId)}\n onPointerCancel={(event) => finishDrag(event.pointerId)}\n aria-label=\"Drag down to close\"\n >\n <span className=\"sheet-handle\" />\n </button>\n\n {(title || description) && (\n <MCardHeader className=\"sheet-header\">\n <div className=\"sheet-copy\">\n {title && (\n <div id={titleId} className=\"sheet-title\">\n {title}\n </div>\n )}\n {description && <div className=\"sheet-description\">{description}</div>}\n </div>\n <MButton\n variant=\"link\"\n color=\"neutral\"\n iconOnly\n size=\"sm\"\n onClick={onClose}\n aria-label=\"Close\"\n className=\"sheet-close\"\n >\n <MCloseIcon />\n </MButton>\n </MCardHeader>\n )}\n\n <MCardBody className=\"sheet-body\">{children}</MCardBody>\n\n {footer && <MCardFooter className=\"sheet-footer\">{footer}</MCardFooter>}\n </MCard>\n </div>\n </div>\n </MPortal>\n )\n}\n","import {useCallback} from 'react'\nimport type {MPopconfirmProps} from './MPopconfirm.types'\nimport {MPopover} from '../../primitives'\nimport {MButton} from '../../controls'\nimport {cn} from '../../../utils/cn'\nimport './MPopconfirm.css'\n\nexport function MPopconfirm({\n title,\n description,\n onConfirm,\n onCancel,\n confirmText = 'Yes',\n cancelText = 'No',\n color = 'warning',\n icon,\n placement = 'top-start',\n open,\n onOpenChange,\n anchorRef,\n className,\n}: MPopconfirmProps) {\n const handleCancel = useCallback(() => {\n onOpenChange(false)\n onCancel?.()\n }, [onOpenChange, onCancel])\n\n const handleConfirm = useCallback(() => {\n onOpenChange(false)\n onConfirm()\n }, [onOpenChange, onConfirm])\n\n return (\n <MPopover\n open={open}\n anchorRef={anchorRef}\n onClose={handleCancel}\n placement={placement}\n className={cn('popconfirm', `color-${color}`, className)}\n >\n <div className=\"body\">\n {icon && <div className=\"icon\">{icon}</div>}\n <div className=\"content\">\n <div className=\"title\">{title}</div>\n {description && <div className=\"description\">{description}</div>}\n </div>\n </div>\n <div className=\"actions\">\n <MButton variant=\"ghost\" size=\"sm\" color=\"neutral\" onClick={handleCancel}>\n {cancelText}\n </MButton>\n <MButton variant=\"ghost\" size=\"sm\" color={color} onClick={handleConfirm}>\n {confirmText}\n </MButton>\n </div>\n </MPopover>\n )\n}\n"],"mappings":"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"}
|
|
@@ -2,8 +2,8 @@ import { Ii as e } from "./icons-D5DK-J2C.js";
|
|
|
2
2
|
import { t } from "./cn-YER3QsV1.js";
|
|
3
3
|
import { t as n } from "./MPortal-Dqlkh3hw.js";
|
|
4
4
|
import { t as r } from "./MPopover-BC9C5967.js";
|
|
5
|
-
import { t as i } from "./MButton-
|
|
6
|
-
import { a, i as o, n as s, r as c } from "./MSkeleton-
|
|
5
|
+
import { t as i } from "./MButton-BmTDe5Oa.js";
|
|
6
|
+
import { a, i as o, n as s, r as c } from "./MSkeleton-CauCfkzj.js";
|
|
7
7
|
import { useCallback as l, useEffect as u, useId as d, useRef as f, useState as p } from "react";
|
|
8
8
|
import { jsx as m, jsxs as h } from "react/jsx-runtime";
|
|
9
9
|
//#region src/components/overlays/MSheet/MSheet.tsx
|
|
@@ -183,4 +183,4 @@ function b({ title: e, description: n, onConfirm: a, onCancel: o, confirmText: s
|
|
|
183
183
|
//#endregion
|
|
184
184
|
export { y as n, b as t };
|
|
185
185
|
|
|
186
|
-
//# sourceMappingURL=overlays-
|
|
186
|
+
//# sourceMappingURL=overlays-gjg00CAf.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overlays-BahWPCPW.js","names":[],"sources":["../src/components/overlays/MSheet/MSheet.tsx","../src/components/overlays/MPopconfirm/MPopconfirm.tsx"],"sourcesContent":["import {useEffect, useId, useRef, useState} from 'react'\nimport type {PointerEvent as ReactPointerEvent, MouseEvent} from 'react'\nimport type {MSheetProps, MSheetSize} from './MSheet.types'\nimport {MCard, MCardBody, MCardFooter, MCardHeader} from '../../cards'\nimport {MButton} from '../../controls'\nimport {MPortal} from '../../primitives'\nimport {MCloseIcon} from '../../../icons'\nimport {cn} from '../../../utils/cn'\nimport './MSheet.css'\n\nconst EXIT_DURATION = 540\nconst CLOSE_DRAG_THRESHOLD = 72\n\nconst SHEET_HEIGHTS: Record<MSheetSize, string> = {\n sm: '32vh',\n md: '52vh',\n lg: '72vh',\n full: '92vh',\n}\n\nexport function MSheet({\n open,\n onClose,\n title,\n description,\n footer,\n size = 'md',\n closeOnBackdrop = true,\n closeOnEscape = true,\n className,\n children,\n style,\n ...rest\n}: MSheetProps) {\n const titleId = useId()\n const [mounted, setMounted] = useState(false)\n const [closing, setClosing] = useState(false)\n const [dragOffset, setDragOffset] = useState(0)\n\n const dragStateRef = useRef<{pointerId: number; startY: number} | null>(null)\n const dragOffsetRef = useRef(0)\n\n useEffect(() => {\n if (open) {\n setMounted(true)\n setClosing(false)\n setDragOffset(0)\n dragOffsetRef.current = 0\n }\n }, [open])\n\n useEffect(() => {\n if (!open && mounted) {\n setClosing(true)\n const timer = window.setTimeout(() => {\n setMounted(false)\n setClosing(false)\n }, EXIT_DURATION)\n return () => window.clearTimeout(timer)\n }\n }, [open, mounted])\n\n useEffect(() => {\n if (!mounted) return\n\n const previousOverflow = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n\n return () => {\n document.body.style.overflow = previousOverflow\n }\n }, [mounted])\n\n useEffect(() => {\n if (!open || !closeOnEscape) return\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') onClose()\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [closeOnEscape, onClose, open])\n\n function handleBackdropClick(event: MouseEvent<HTMLDivElement>) {\n if (closeOnBackdrop && event.target === event.currentTarget) {\n onClose()\n }\n }\n\n function handleHandlePointerDown(event: ReactPointerEvent<HTMLButtonElement>) {\n event.preventDefault()\n event.currentTarget.setPointerCapture(event.pointerId)\n\n dragStateRef.current = {\n pointerId: event.pointerId,\n startY: event.clientY,\n }\n setDragOffset(0)\n dragOffsetRef.current = 0\n }\n\n function handleHandlePointerMove(event: ReactPointerEvent<HTMLButtonElement>) {\n const dragState = dragStateRef.current\n if (!dragState || dragState.pointerId !== event.pointerId) {\n return\n }\n\n const nextOffset = Math.max(event.clientY - dragState.startY, 0)\n dragOffsetRef.current = nextOffset\n setDragOffset(nextOffset)\n }\n\n function finishDrag(pointerId: number) {\n const dragState = dragStateRef.current\n if (!dragState || dragState.pointerId !== pointerId) {\n return\n }\n\n dragStateRef.current = null\n\n if (dragOffsetRef.current > CLOSE_DRAG_THRESHOLD) {\n setDragOffset(0)\n dragOffsetRef.current = 0\n onClose()\n return\n }\n\n setDragOffset(0)\n dragOffsetRef.current = 0\n }\n\n if (!mounted) return null\n\n const resolvedHeight = SHEET_HEIGHTS[size]\n const transformStyle = dragOffset > 0 ? `translateY(${dragOffset}px)` : undefined\n\n return (\n <MPortal>\n <div\n className={cn('mineral-backdrop', 'sheet-backdrop', closing && 'closing')}\n onMouseDown={handleBackdropClick}\n >\n <div className=\"sheet-shell\" style={{transform: transformStyle}}>\n <MCard\n className={cn('sheet', `size-${size}`, className)}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n style={{\n ...style,\n height: size === 'full' ? resolvedHeight : undefined,\n maxHeight: resolvedHeight,\n }}\n {...rest}\n >\n <button\n type=\"button\"\n className=\"sheet-grabber\"\n onPointerDown={handleHandlePointerDown}\n onPointerMove={handleHandlePointerMove}\n onPointerUp={(event) => finishDrag(event.pointerId)}\n onPointerCancel={(event) => finishDrag(event.pointerId)}\n aria-label=\"Drag down to close\"\n >\n <span className=\"sheet-handle\" />\n </button>\n\n {(title || description) && (\n <MCardHeader className=\"sheet-header\">\n <div className=\"sheet-copy\">\n {title && (\n <div id={titleId} className=\"sheet-title\">\n {title}\n </div>\n )}\n {description && <div className=\"sheet-description\">{description}</div>}\n </div>\n <MButton\n variant=\"link\"\n color=\"neutral\"\n iconOnly\n size=\"sm\"\n onClick={onClose}\n aria-label=\"Close\"\n className=\"sheet-close\"\n >\n <MCloseIcon />\n </MButton>\n </MCardHeader>\n )}\n\n <MCardBody className=\"sheet-body\">{children}</MCardBody>\n\n {footer && <MCardFooter className=\"sheet-footer\">{footer}</MCardFooter>}\n </MCard>\n </div>\n </div>\n </MPortal>\n )\n}\n","import {useCallback} from 'react'\nimport type {MPopconfirmProps} from './MPopconfirm.types'\nimport {MPopover} from '../../primitives'\nimport {MButton} from '../../controls'\nimport {cn} from '../../../utils/cn'\nimport './MPopconfirm.css'\n\nexport function MPopconfirm({\n title,\n description,\n onConfirm,\n onCancel,\n confirmText = 'Yes',\n cancelText = 'No',\n color = 'warning',\n icon,\n placement = 'top-start',\n open,\n onOpenChange,\n anchorRef,\n className,\n}: MPopconfirmProps) {\n const handleCancel = useCallback(() => {\n onOpenChange(false)\n onCancel?.()\n }, [onOpenChange, onCancel])\n\n const handleConfirm = useCallback(() => {\n onOpenChange(false)\n onConfirm()\n }, [onOpenChange, onConfirm])\n\n return (\n <MPopover\n open={open}\n anchorRef={anchorRef}\n onClose={handleCancel}\n placement={placement}\n className={cn('popconfirm', `color-${color}`, className)}\n >\n <div className=\"body\">\n {icon && <div className=\"icon\">{icon}</div>}\n <div className=\"content\">\n <div className=\"title\">{title}</div>\n {description && <div className=\"description\">{description}</div>}\n </div>\n </div>\n <div className=\"actions\">\n <MButton variant=\"ghost\" size=\"sm\" color=\"neutral\" onClick={handleCancel}>\n {cancelText}\n </MButton>\n <MButton variant=\"ghost\" size=\"sm\" color={color} onClick={handleConfirm}>\n {confirmText}\n </MButton>\n </div>\n </MPopover>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"overlays-gjg00CAf.js","names":[],"sources":["../src/components/overlays/MSheet/MSheet.tsx","../src/components/overlays/MPopconfirm/MPopconfirm.tsx"],"sourcesContent":["import {useEffect, useId, useRef, useState} from 'react'\nimport type {PointerEvent as ReactPointerEvent, MouseEvent} from 'react'\nimport type {MSheetProps, MSheetSize} from './MSheet.types'\nimport {MCard, MCardBody, MCardFooter, MCardHeader} from '../../cards'\nimport {MButton} from '../../controls'\nimport {MPortal} from '../../primitives'\nimport {MCloseIcon} from '../../../icons'\nimport {cn} from '../../../utils/cn'\nimport './MSheet.css'\n\nconst EXIT_DURATION = 540\nconst CLOSE_DRAG_THRESHOLD = 72\n\nconst SHEET_HEIGHTS: Record<MSheetSize, string> = {\n sm: '32vh',\n md: '52vh',\n lg: '72vh',\n full: '92vh',\n}\n\nexport function MSheet({\n open,\n onClose,\n title,\n description,\n footer,\n size = 'md',\n closeOnBackdrop = true,\n closeOnEscape = true,\n className,\n children,\n style,\n ...rest\n}: MSheetProps) {\n const titleId = useId()\n const [mounted, setMounted] = useState(false)\n const [closing, setClosing] = useState(false)\n const [dragOffset, setDragOffset] = useState(0)\n\n const dragStateRef = useRef<{pointerId: number; startY: number} | null>(null)\n const dragOffsetRef = useRef(0)\n\n useEffect(() => {\n if (open) {\n setMounted(true)\n setClosing(false)\n setDragOffset(0)\n dragOffsetRef.current = 0\n }\n }, [open])\n\n useEffect(() => {\n if (!open && mounted) {\n setClosing(true)\n const timer = window.setTimeout(() => {\n setMounted(false)\n setClosing(false)\n }, EXIT_DURATION)\n return () => window.clearTimeout(timer)\n }\n }, [open, mounted])\n\n useEffect(() => {\n if (!mounted) return\n\n const previousOverflow = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n\n return () => {\n document.body.style.overflow = previousOverflow\n }\n }, [mounted])\n\n useEffect(() => {\n if (!open || !closeOnEscape) return\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') onClose()\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [closeOnEscape, onClose, open])\n\n function handleBackdropClick(event: MouseEvent<HTMLDivElement>) {\n if (closeOnBackdrop && event.target === event.currentTarget) {\n onClose()\n }\n }\n\n function handleHandlePointerDown(event: ReactPointerEvent<HTMLButtonElement>) {\n event.preventDefault()\n event.currentTarget.setPointerCapture(event.pointerId)\n\n dragStateRef.current = {\n pointerId: event.pointerId,\n startY: event.clientY,\n }\n setDragOffset(0)\n dragOffsetRef.current = 0\n }\n\n function handleHandlePointerMove(event: ReactPointerEvent<HTMLButtonElement>) {\n const dragState = dragStateRef.current\n if (!dragState || dragState.pointerId !== event.pointerId) {\n return\n }\n\n const nextOffset = Math.max(event.clientY - dragState.startY, 0)\n dragOffsetRef.current = nextOffset\n setDragOffset(nextOffset)\n }\n\n function finishDrag(pointerId: number) {\n const dragState = dragStateRef.current\n if (!dragState || dragState.pointerId !== pointerId) {\n return\n }\n\n dragStateRef.current = null\n\n if (dragOffsetRef.current > CLOSE_DRAG_THRESHOLD) {\n setDragOffset(0)\n dragOffsetRef.current = 0\n onClose()\n return\n }\n\n setDragOffset(0)\n dragOffsetRef.current = 0\n }\n\n if (!mounted) return null\n\n const resolvedHeight = SHEET_HEIGHTS[size]\n const transformStyle = dragOffset > 0 ? `translateY(${dragOffset}px)` : undefined\n\n return (\n <MPortal>\n <div\n className={cn('mineral-backdrop', 'sheet-backdrop', closing && 'closing')}\n onMouseDown={handleBackdropClick}\n >\n <div className=\"sheet-shell\" style={{transform: transformStyle}}>\n <MCard\n className={cn('sheet', `size-${size}`, className)}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n style={{\n ...style,\n height: size === 'full' ? resolvedHeight : undefined,\n maxHeight: resolvedHeight,\n }}\n {...rest}\n >\n <button\n type=\"button\"\n className=\"sheet-grabber\"\n onPointerDown={handleHandlePointerDown}\n onPointerMove={handleHandlePointerMove}\n onPointerUp={(event) => finishDrag(event.pointerId)}\n onPointerCancel={(event) => finishDrag(event.pointerId)}\n aria-label=\"Drag down to close\"\n >\n <span className=\"sheet-handle\" />\n </button>\n\n {(title || description) && (\n <MCardHeader className=\"sheet-header\">\n <div className=\"sheet-copy\">\n {title && (\n <div id={titleId} className=\"sheet-title\">\n {title}\n </div>\n )}\n {description && <div className=\"sheet-description\">{description}</div>}\n </div>\n <MButton\n variant=\"link\"\n color=\"neutral\"\n iconOnly\n size=\"sm\"\n onClick={onClose}\n aria-label=\"Close\"\n className=\"sheet-close\"\n >\n <MCloseIcon />\n </MButton>\n </MCardHeader>\n )}\n\n <MCardBody className=\"sheet-body\">{children}</MCardBody>\n\n {footer && <MCardFooter className=\"sheet-footer\">{footer}</MCardFooter>}\n </MCard>\n </div>\n </div>\n </MPortal>\n )\n}\n","import {useCallback} from 'react'\nimport type {MPopconfirmProps} from './MPopconfirm.types'\nimport {MPopover} from '../../primitives'\nimport {MButton} from '../../controls'\nimport {cn} from '../../../utils/cn'\nimport './MPopconfirm.css'\n\nexport function MPopconfirm({\n title,\n description,\n onConfirm,\n onCancel,\n confirmText = 'Yes',\n cancelText = 'No',\n color = 'warning',\n icon,\n placement = 'top-start',\n open,\n onOpenChange,\n anchorRef,\n className,\n}: MPopconfirmProps) {\n const handleCancel = useCallback(() => {\n onOpenChange(false)\n onCancel?.()\n }, [onOpenChange, onCancel])\n\n const handleConfirm = useCallback(() => {\n onOpenChange(false)\n onConfirm()\n }, [onOpenChange, onConfirm])\n\n return (\n <MPopover\n open={open}\n anchorRef={anchorRef}\n onClose={handleCancel}\n placement={placement}\n className={cn('popconfirm', `color-${color}`, className)}\n >\n <div className=\"body\">\n {icon && <div className=\"icon\">{icon}</div>}\n <div className=\"content\">\n <div className=\"title\">{title}</div>\n {description && <div className=\"description\">{description}</div>}\n </div>\n </div>\n <div className=\"actions\">\n <MButton variant=\"ghost\" size=\"sm\" color=\"neutral\" onClick={handleCancel}>\n {cancelText}\n </MButton>\n <MButton variant=\"ghost\" size=\"sm\" color={color} onClick={handleConfirm}>\n {confirmText}\n </MButton>\n </div>\n </MPopover>\n )\n}\n"],"mappings":"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"}
|