@banzamel/mineralui 1.6.2 → 1.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/{MAvatar-CnBVN71i.js → MAvatar-BHASnoyu.js} +5 -5
- package/dist/{MAvatar-CnBVN71i.js.map → MAvatar-BHASnoyu.js.map} +1 -1
- package/dist/MAvatar-BVJh6kgW.cjs +2 -0
- package/dist/{MAvatar-DGEQqUss.cjs.map → MAvatar-BVJh6kgW.cjs.map} +1 -1
- package/dist/MBadge-B4x-Lx7e.cjs +2 -0
- package/dist/{MBadge-DcIPfPH1.cjs.map → MBadge-B4x-Lx7e.cjs.map} +1 -1
- package/dist/{MBadge-C_vK2JdM.js → MBadge-_BggwkrM.js} +3 -3
- package/dist/{MBadge-C_vK2JdM.js.map → MBadge-_BggwkrM.js.map} +1 -1
- package/dist/MButton-DrkVdRDy.cjs +2 -0
- package/dist/{MButton-LUNWBBOV.cjs.map → MButton-DrkVdRDy.cjs.map} +1 -1
- package/dist/{MButton-BpSZUhpY.js → MButton-y9qXhhGt.js} +4 -4
- package/dist/{MButton-BpSZUhpY.js.map → MButton-y9qXhhGt.js.map} +1 -1
- package/dist/{MCheckbox-CNz73bQC.js → MCheckbox-B-nT2OBE.js} +3 -3
- package/dist/{MCheckbox-CNz73bQC.js.map → MCheckbox-B-nT2OBE.js.map} +1 -1
- package/dist/MCheckbox-C40ESQRe.cjs +2 -0
- package/dist/{MCheckbox-PzknJeM2.cjs.map → MCheckbox-C40ESQRe.cjs.map} +1 -1
- package/dist/{MCookieBootstrap-DSOT4FQo.cjs → MCookieBootstrap-3-wyz3Dk.cjs} +1 -1
- package/dist/{MCookieBootstrap-DSOT4FQo.cjs.map → MCookieBootstrap-3-wyz3Dk.cjs.map} +1 -1
- package/dist/{MCookieBootstrap-CNYLvKjW.js → MCookieBootstrap-CGvYxIK8.js} +1 -1
- package/dist/{MCookieBootstrap-CNYLvKjW.js.map → MCookieBootstrap-CGvYxIK8.js.map} +1 -1
- package/dist/MDataTable-Bx7W-Ari.cjs +2 -0
- package/dist/{MDataTable-Bq6UoNJX.cjs.map → MDataTable-Bx7W-Ari.cjs.map} +1 -1
- package/dist/{MDataTable-AH5Tnirs.js → MDataTable-ByvNQqNP.js} +6 -6
- package/dist/{MDataTable-AH5Tnirs.js.map → MDataTable-ByvNQqNP.js.map} +1 -1
- package/dist/MDrawer-DFkrFrnD.cjs +2 -0
- package/dist/{MDrawer-DRqMsjMt.cjs.map → MDrawer-DFkrFrnD.cjs.map} +1 -1
- package/dist/{MDrawer-C08QXXC4.js → MDrawer-W2WQs1sM.js} +5 -5
- package/dist/{MDrawer-C08QXXC4.js.map → MDrawer-W2WQs1sM.js.map} +1 -1
- package/dist/MDropdownMenu-BmfXSc46.cjs +2 -0
- package/dist/{MDropdownMenu-CymCQqyP.cjs.map → MDropdownMenu-BmfXSc46.cjs.map} +1 -1
- package/dist/{MDropdownMenu-CMnBt-wO.js → MDropdownMenu-D79Cm5aS.js} +4 -4
- package/dist/{MDropdownMenu-CMnBt-wO.js.map → MDropdownMenu-D79Cm5aS.js.map} +1 -1
- package/dist/MGalleryIllustration-BB3DoCl_.cjs +2 -0
- package/dist/{MGalleryIllustration-BHtRFizZ.cjs.map → MGalleryIllustration-BB3DoCl_.cjs.map} +1 -1
- package/dist/{MGalleryIllustration-DhOtXwhC.js → MGalleryIllustration-D7CVMSwO.js} +2 -2
- package/dist/{MGalleryIllustration-DhOtXwhC.js.map → MGalleryIllustration-D7CVMSwO.js.map} +1 -1
- package/dist/MHeading-BhCNoJeW.cjs +2 -0
- package/dist/{MHeading-DHT1gORD.cjs.map → MHeading-BhCNoJeW.cjs.map} +1 -1
- package/dist/{MHeading-BvpWyvjj.js → MHeading-MPh8Qm9q.js} +4 -4
- package/dist/{MHeading-BvpWyvjj.js.map → MHeading-MPh8Qm9q.js.map} +1 -1
- package/dist/MI18nProvider-B2sE0x5D.cjs +2 -0
- package/dist/{MI18nProvider-Bml7Vs2-.cjs.map → MI18nProvider-B2sE0x5D.cjs.map} +1 -1
- package/dist/{MI18nProvider-BRZxEMqL.js → MI18nProvider-VH14CI8u.js} +1 -1
- package/dist/{MI18nProvider-BRZxEMqL.js.map → MI18nProvider-VH14CI8u.js.map} +1 -1
- package/dist/{MImage-BQs91GK-.js → MImage-BKX-xBm3.js} +82 -76
- package/dist/MImage-BKX-xBm3.js.map +1 -0
- package/dist/MImage-YbDKE-1t.cjs +2 -0
- package/dist/MImage-YbDKE-1t.cjs.map +1 -0
- package/dist/MInline-CHrh3PHH.cjs +2 -0
- package/dist/{MInline-D9p9Sazp.cjs.map → MInline-CHrh3PHH.cjs.map} +1 -1
- package/dist/{MInline-DA_ehefx.js → MInline-CoMhfX5V.js} +4 -4
- package/dist/{MInline-DA_ehefx.js.map → MInline-CoMhfX5V.js.map} +1 -1
- package/dist/MInput-DYqV3-rQ.cjs +2 -0
- package/dist/{MInput-DDZ71Qqn.cjs.map → MInput-DYqV3-rQ.cjs.map} +1 -1
- package/dist/{MInput-l3MY93Su.js → MInput-bzSwK880.js} +6 -6
- package/dist/{MInput-l3MY93Su.js.map → MInput-bzSwK880.js.map} +1 -1
- package/dist/MInputCVC-5NkYSxV8.cjs +2 -0
- package/dist/{MInputCVC-Sp2uZ5aO.cjs.map → MInputCVC-5NkYSxV8.cjs.map} +1 -1
- package/dist/{MInputCVC-CN91scmw.js → MInputCVC-BHpMHTO5.js} +5 -5
- package/dist/{MInputCVC-CN91scmw.js.map → MInputCVC-BHpMHTO5.js.map} +1 -1
- package/dist/MInputSearch-DfoenJIm.cjs +2 -0
- package/dist/{MInputSearch-30o4bcDC.cjs.map → MInputSearch-DfoenJIm.cjs.map} +1 -1
- package/dist/{MInputSearch-CdPfJ4v_.js → MInputSearch-Dh4C3Tz5.js} +4 -4
- package/dist/{MInputSearch-CdPfJ4v_.js.map → MInputSearch-Dh4C3Tz5.js.map} +1 -1
- package/dist/MLink-CY45UR_j.cjs +2 -0
- package/dist/{MLink-U_wAUuz1.cjs.map → MLink-CY45UR_j.cjs.map} +1 -1
- package/dist/{MLink-CRUWGES-.js → MLink-rFKN1mcM.js} +3 -3
- package/dist/{MLink-CRUWGES-.js.map → MLink-rFKN1mcM.js.map} +1 -1
- package/dist/{MModal-CHSo5gKE.js → MModal-BDTAgnrm.js} +4 -4
- package/dist/{MModal-CHSo5gKE.js.map → MModal-BDTAgnrm.js.map} +1 -1
- package/dist/MModal-DT5BBgNZ.cjs +2 -0
- package/dist/{MModal-Czy-rR--.cjs.map → MModal-DT5BBgNZ.cjs.map} +1 -1
- package/dist/{MPagination-DdT1uNzD.js → MPagination-CTnaW5AW.js} +4 -4
- package/dist/{MPagination-DdT1uNzD.js.map → MPagination-CTnaW5AW.js.map} +1 -1
- package/dist/MPagination-CZEJMJzZ.cjs +2 -0
- package/dist/{MPagination-73z0sQvf.cjs.map → MPagination-CZEJMJzZ.cjs.map} +1 -1
- package/dist/MPopover-B4IUb9f0.cjs +2 -0
- package/dist/{MPopover-BW23_1Dl.cjs.map → MPopover-B4IUb9f0.cjs.map} +1 -1
- package/dist/{MPopover-3tjz5lKh.js → MPopover-Cqz5TsHg.js} +3 -3
- package/dist/{MPopover-3tjz5lKh.js.map → MPopover-Cqz5TsHg.js.map} +1 -1
- package/dist/{MPortal-Dqlkh3hw.js → MPortal-Ba2Sxset.js} +1 -1
- package/dist/{MPortal-Dqlkh3hw.js.map → MPortal-Ba2Sxset.js.map} +1 -1
- package/dist/MPortal-Bi24xTGW.cjs +2 -0
- package/dist/{MPortal-DE3pL2Xl.cjs.map → MPortal-Bi24xTGW.cjs.map} +1 -1
- package/dist/MQrCode-ByfmG33y.cjs +2 -0
- package/dist/{MQrCode-CMoru4dD.cjs.map → MQrCode-ByfmG33y.cjs.map} +1 -1
- package/dist/{MQrCode-DK5-SBhN.js → MQrCode-CCtTkkv9.js} +4 -4
- package/dist/{MQrCode-DK5-SBhN.js.map → MQrCode-CCtTkkv9.js.map} +1 -1
- package/dist/MSkeleton-5j1h9s95.cjs +2 -0
- package/dist/{MSkeleton-B0Mxe3L7.cjs.map → MSkeleton-5j1h9s95.cjs.map} +1 -1
- package/dist/{MSkeleton-Bqq_XJn8.js → MSkeleton-DGhtNmpI.js} +4 -4
- package/dist/{MSkeleton-Bqq_XJn8.js.map → MSkeleton-DGhtNmpI.js.map} +1 -1
- package/dist/{MSlider-ByVuoFFc.js → MSlider-5141rKeH.js} +2 -2
- package/dist/{MSlider-ByVuoFFc.js.map → MSlider-5141rKeH.js.map} +1 -1
- package/dist/MSlider-Ch3VjAJC.cjs +2 -0
- package/dist/{MSlider-sH2Vt9Lw.cjs.map → MSlider-Ch3VjAJC.cjs.map} +1 -1
- package/dist/MSparkline-B6qpt5WM.cjs +2 -0
- package/dist/{MSparkline-B-ld7hJu.cjs.map → MSparkline-B6qpt5WM.cjs.map} +1 -1
- package/dist/{MSparkline-DbtdM0W6.js → MSparkline-voNWOLNz.js} +2 -2
- package/dist/{MSparkline-DbtdM0W6.js.map → MSparkline-voNWOLNz.js.map} +1 -1
- package/dist/MStack-Bh-R2opf.cjs +2 -0
- package/dist/{MStack-Cy2GplIA.cjs.map → MStack-Bh-R2opf.cjs.map} +1 -1
- package/dist/{MStack-BWarX5O9.js → MStack-CSaEbepM.js} +4 -4
- package/dist/{MStack-BWarX5O9.js.map → MStack-CSaEbepM.js.map} +1 -1
- package/dist/{MSubText-C9VizSn9.js → MSubText-BFdfBlpS.js} +4 -4
- package/dist/{MSubText-C9VizSn9.js.map → MSubText-BFdfBlpS.js.map} +1 -1
- package/dist/MSubText-C-70zn0m.cjs +2 -0
- package/dist/{MSubText-DP9WYlwz.cjs.map → MSubText-C-70zn0m.cjs.map} +1 -1
- package/dist/MSurface-CpiV1-7f.cjs +2 -0
- package/dist/{MSurface-C467dVMQ.cjs.map → MSurface-CpiV1-7f.cjs.map} +1 -1
- package/dist/{MSurface-DfZ1Zy1-.js → MSurface-DJYSftdM.js} +4 -4
- package/dist/{MSurface-DfZ1Zy1-.js.map → MSurface-DJYSftdM.js.map} +1 -1
- package/dist/{MTag-N-tYZ915.js → MTag-CH5nMbm7.js} +5 -5
- package/dist/{MTag-N-tYZ915.js.map → MTag-CH5nMbm7.js.map} +1 -1
- package/dist/MTag-Y4Tswmli.cjs +2 -0
- package/dist/{MTag-DXqkBvqx.cjs.map → MTag-Y4Tswmli.cjs.map} +1 -1
- package/dist/MText-DEJddMB5.cjs +2 -0
- package/dist/{MText-COzub3y4.cjs.map → MText-DEJddMB5.cjs.map} +1 -1
- package/dist/{MText-B7_HjPym.js → MText-DcB1GAt-.js} +4 -4
- package/dist/{MText-B7_HjPym.js.map → MText-DcB1GAt-.js.map} +1 -1
- package/dist/{MTimeAgo-D1G2yovw.js → MTimeAgo-C4p80NvI.js} +4 -4
- package/dist/{MTimeAgo-D1G2yovw.js.map → MTimeAgo-C4p80NvI.js.map} +1 -1
- package/dist/MTimeAgo-DxZGVo2Y.cjs +2 -0
- package/dist/{MTimeAgo-DWwXs48z.cjs.map → MTimeAgo-DxZGVo2Y.cjs.map} +1 -1
- package/dist/MToggle-C8vYRzpC.cjs +2 -0
- package/dist/{MToggle-Cm3f6gm4.cjs.map → MToggle-C8vYRzpC.cjs.map} +1 -1
- package/dist/{MToggle-D0DrQirB.js → MToggle-Dt1Ctr5e.js} +3 -3
- package/dist/{MToggle-D0DrQirB.js.map → MToggle-Dt1Ctr5e.js.map} +1 -1
- package/dist/{MTooltip-w6Aj044c.js → MTooltip-C43aUKMP.js} +3 -3
- package/dist/{MTooltip-w6Aj044c.js.map → MTooltip-C43aUKMP.js.map} +1 -1
- package/dist/MTooltip-kSTMMpvu.cjs +2 -0
- package/dist/{MTooltip-C3PeHgV3.cjs.map → MTooltip-kSTMMpvu.cjs.map} +1 -1
- package/dist/arduino-CXUo7Bjy.cjs +2 -0
- package/dist/arduino-CXUo7Bjy.cjs.map +1 -0
- package/dist/arduino-Eif5KI8O.js +261 -0
- package/dist/arduino-Eif5KI8O.js.map +1 -0
- package/dist/bash-CCF_TYbb.js +171 -0
- package/dist/bash-CCF_TYbb.js.map +1 -0
- package/dist/bash-W4h3o_nx.cjs +2 -0
- package/dist/bash-W4h3o_nx.cjs.map +1 -0
- package/dist/c-DVgkp6T3.js +178 -0
- package/dist/c-DVgkp6T3.js.map +1 -0
- package/dist/c-Dm60JY-W.cjs +2 -0
- package/dist/c-Dm60JY-W.cjs.map +1 -0
- package/dist/cards-BiYdorB0.cjs +2 -0
- package/dist/{cards-B75QM9JW.cjs.map → cards-BiYdorB0.cjs.map} +1 -1
- package/dist/{cards-BKi8MxNx.js → cards-fn61xD_5.js} +17 -17
- package/dist/{cards-BKi8MxNx.js.map → cards-fn61xD_5.js.map} +1 -1
- package/dist/cards.cjs +1 -1
- package/dist/cards.js +2 -2
- package/dist/{cn-DYFxgzi2.cjs → cn-CU5TNITO.cjs} +1 -1
- package/dist/{cn-DYFxgzi2.cjs.map → cn-CU5TNITO.cjs.map} +1 -1
- package/dist/{cn-CUSXNnjF.js → cn-YER3QsV1.js} +1 -1
- package/dist/{cn-CUSXNnjF.js.map → cn-YER3QsV1.js.map} +1 -1
- package/dist/components/media/MImage/MImage.d.ts +1 -1
- package/dist/components/media/MImage/MImage.types.d.ts +6 -1
- package/dist/controls-C5PtrGZf.cjs +2 -0
- package/dist/{controls-B7wV_kjJ.cjs.map → controls-C5PtrGZf.cjs.map} +1 -1
- package/dist/{controls-BEi-0mf4.js → controls-DCtMOoQe.js} +6 -6
- package/dist/{controls-BEi-0mf4.js.map → controls-DCtMOoQe.js.map} +1 -1
- package/dist/controls.cjs +1 -1
- package/dist/controls.js +5 -5
- package/dist/cookie-consent-bootstrap.cjs +1 -1
- package/dist/cookie-consent-bootstrap.js +1 -1
- package/dist/core-AKWkE8Bx.cjs +4 -0
- package/dist/core-AKWkE8Bx.cjs.map +1 -0
- package/dist/core-CB9-PTLK.js +854 -0
- package/dist/core-CB9-PTLK.js.map +1 -0
- package/dist/cpp-DyKt1H8n.cjs +2 -0
- package/dist/cpp-DyKt1H8n.cjs.map +1 -0
- package/dist/cpp-OOenfB17.js +227 -0
- package/dist/cpp-OOenfB17.js.map +1 -0
- package/dist/{creditCards-BB11bW7D.js → creditCards-CCysEwry.js} +1 -1
- package/dist/{creditCards-BB11bW7D.js.map → creditCards-CCysEwry.js.map} +1 -1
- package/dist/{creditCards-198KJN0s.cjs → creditCards-ljs044xt.cjs} +1 -1
- package/dist/{creditCards-198KJN0s.cjs.map → creditCards-ljs044xt.cjs.map} +1 -1
- package/dist/css-DxVbPJLu.cjs +2 -0
- package/dist/css-DxVbPJLu.cjs.map +1 -0
- package/dist/css-u5LSEAra.js +142 -0
- package/dist/css-u5LSEAra.js.map +1 -0
- package/dist/{data-DKrj_Hx6.js → data-BiwK5rfx.js} +24 -24
- package/dist/{data-DKrj_Hx6.js.map → data-BiwK5rfx.js.map} +1 -1
- package/dist/data-DOuPqg8d.cjs +2 -0
- package/dist/{data-DHkccnSN.cjs.map → data-DOuPqg8d.cjs.map} +1 -1
- package/dist/data.cjs +1 -1
- package/dist/data.js +3 -3
- package/dist/{dateUtils-Ben8lfvV.js → dateUtils-CUY6CRCf.js} +1 -1
- package/dist/{dateUtils-Ben8lfvV.js.map → dateUtils-CUY6CRCf.js.map} +1 -1
- package/dist/{dateUtils-vT9rOf1J.cjs → dateUtils-Dq1vaA-D.cjs} +1 -1
- package/dist/{dateUtils-vT9rOf1J.cjs.map → dateUtils-Dq1vaA-D.cjs.map} +1 -1
- package/dist/display-BafEcBK_.cjs +3 -0
- package/dist/display-BafEcBK_.cjs.map +1 -0
- package/dist/{display-rQqBLjAN.js → display-Zxj9YHu_.js} +196 -179
- package/dist/display-Zxj9YHu_.js.map +1 -0
- package/dist/display.cjs +1 -1
- package/dist/display.js +3 -3
- package/dist/{dropdowns-BKnXb1XJ.js → dropdowns-Bw8obCYl.js} +15 -15
- package/dist/{dropdowns-BKnXb1XJ.js.map → dropdowns-Bw8obCYl.js.map} +1 -1
- package/dist/dropdowns-DN7j1HhE.cjs +2 -0
- package/dist/{dropdowns-cRrLY8FG.cjs.map → dropdowns-DN7j1HhE.cjs.map} +1 -1
- package/dist/dropdowns.cjs +1 -1
- package/dist/dropdowns.js +1 -1
- package/dist/{feedback-CIXmm0XT.js → feedback-8H3bmQw5.js} +18 -18
- package/dist/{feedback-CIXmm0XT.js.map → feedback-8H3bmQw5.js.map} +1 -1
- package/dist/feedback-Di0SEpRe.cjs +2 -0
- package/dist/{feedback-DiMptPJy.cjs.map → feedback-Di0SEpRe.cjs.map} +1 -1
- package/dist/feedback.cjs +1 -1
- package/dist/feedback.js +6 -6
- package/dist/form-BYz99Py5.cjs +2 -0
- package/dist/{form-DABPazeN.cjs.map → form-BYz99Py5.cjs.map} +1 -1
- package/dist/{form-DZJxDW59.js → form-JHlvtP9r.js} +2 -2
- package/dist/{form-DZJxDW59.js.map → form-JHlvtP9r.js.map} +1 -1
- package/dist/form.cjs +1 -1
- package/dist/form.js +1 -1
- package/dist/{formatters-CauWlsnM.cjs → formatters-CNjg_h7-.cjs} +1 -1
- package/dist/{formatters-CauWlsnM.cjs.map → formatters-CNjg_h7-.cjs.map} +1 -1
- package/dist/{formatters-Doqdu_w1.js → formatters-T0vvjMtB.js} +1 -1
- package/dist/{formatters-Doqdu_w1.js.map → formatters-T0vvjMtB.js.map} +1 -1
- package/dist/{frameworkTexts-DzujbRBe.js → frameworkTexts-CvxcWRXp.js} +2 -2
- package/dist/{frameworkTexts-DzujbRBe.js.map → frameworkTexts-CvxcWRXp.js.map} +1 -1
- package/dist/frameworkTexts-abkS5XZK.cjs +2 -0
- package/dist/{frameworkTexts-DPX5T2x3.cjs.map → frameworkTexts-abkS5XZK.cjs.map} +1 -1
- package/dist/i18n.cjs +1 -1
- package/dist/i18n.js +1 -1
- package/dist/{icons-DlNO04xH.js → icons-CfpYxnfg.js} +1 -1
- package/dist/{icons-DlNO04xH.js.map → icons-CfpYxnfg.js.map} +1 -1
- package/dist/icons-DWMgDKgt.cjs +2 -0
- package/dist/{icons-BJCV7W0L.cjs.map → icons-DWMgDKgt.cjs.map} +1 -1
- package/dist/icons.cjs +1 -1
- package/dist/icons.js +1 -1
- package/dist/illustrations.cjs +1 -1
- package/dist/illustrations.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +57 -57
- package/dist/{inputs-CmpB6eyB.js → inputs-Bcwd_UTr.js} +12 -12
- package/dist/{inputs-CmpB6eyB.js.map → inputs-Bcwd_UTr.js.map} +1 -1
- package/dist/inputs-FP545Yri.cjs +2 -0
- package/dist/{inputs-EZBwxk7j.cjs.map → inputs-FP545Yri.cjs.map} +1 -1
- package/dist/inputs.cjs +1 -1
- package/dist/inputs.js +4 -4
- package/dist/javascript-CXjsxb-I.js +438 -0
- package/dist/javascript-CXjsxb-I.js.map +1 -0
- package/dist/javascript-CzjCTQxn.cjs +2 -0
- package/dist/javascript-CzjCTQxn.cjs.map +1 -0
- package/dist/json-9Qq5guN0.cjs +2 -0
- package/dist/json-9Qq5guN0.cjs.map +1 -0
- package/dist/json-CyV5VF8D.js +38 -0
- package/dist/json-CyV5VF8D.js.map +1 -0
- package/dist/{layout-D72Y7VcW.js → layout-BpEnTocp.js} +11 -11
- package/dist/{layout-D72Y7VcW.js.map → layout-BpEnTocp.js.map} +1 -1
- package/dist/layout-rtlHrjDb.cjs +2 -0
- package/dist/{layout-DZiWboju.cjs.map → layout-rtlHrjDb.cjs.map} +1 -1
- package/dist/layout.cjs +1 -1
- package/dist/layout.js +5 -5
- package/dist/{layoutProps-Ck4VtGm9.cjs → layoutProps-B8y2XwHy.cjs} +1 -1
- package/dist/{layoutProps-Ck4VtGm9.cjs.map → layoutProps-B8y2XwHy.cjs.map} +1 -1
- package/dist/{layoutProps-Cl6d1KmH.js → layoutProps-CE5-ghKw.js} +1 -1
- package/dist/{layoutProps-Cl6d1KmH.js.map → layoutProps-CE5-ghKw.js.map} +1 -1
- package/dist/{licensing-Cbpi1toF.js → licensing-CwzqhHH9.js} +1 -1
- package/dist/{licensing-Cbpi1toF.js.map → licensing-CwzqhHH9.js.map} +1 -1
- package/dist/licensing-ezfo7ZTh.cjs +2 -0
- package/dist/{licensing-JchPJhVY.cjs.map → licensing-ezfo7ZTh.cjs.map} +1 -1
- package/dist/locale-CZyqh3ON.cjs +2 -0
- package/dist/{locale-DIwV_GfN.cjs.map → locale-CZyqh3ON.cjs.map} +1 -1
- package/dist/{locale-BNyzqXAU.js → locale-JX_gX03k.js} +1 -1
- package/dist/{locale-BNyzqXAU.js.map → locale-JX_gX03k.js.map} +1 -1
- package/dist/media-CiHsgOmu.cjs +2 -0
- package/dist/{media-p643cb02.cjs.map → media-CiHsgOmu.cjs.map} +1 -1
- package/dist/{media-BlGY91Na.js → media-IM9mfVAn.js} +9 -9
- package/dist/{media-BlGY91Na.js.map → media-IM9mfVAn.js.map} +1 -1
- package/dist/media.cjs +1 -1
- package/dist/media.js +3 -3
- package/dist/{overlays-51pBvlf9.js → overlays-CGlqD3rl.js} +7 -7
- package/dist/{overlays-51pBvlf9.js.map → overlays-CGlqD3rl.js.map} +1 -1
- package/dist/overlays-DrSGzbbA.cjs +2 -0
- package/dist/{overlays-8htlWp07.cjs.map → overlays-DrSGzbbA.cjs.map} +1 -1
- package/dist/overlays.cjs +1 -1
- package/dist/overlays.js +5 -5
- package/dist/php-Br75m0HU.cjs +3 -0
- package/dist/php-Br75m0HU.cjs.map +1 -0
- package/dist/php-deNqvHeU.js +296 -0
- package/dist/php-deNqvHeU.js.map +1 -0
- package/dist/primitives.cjs +1 -1
- package/dist/primitives.js +2 -2
- package/dist/{relativeTime-BqCuaBqb.js → relativeTime-Cr-NVzij.js} +1 -1
- package/dist/{relativeTime-BqCuaBqb.js.map → relativeTime-Cr-NVzij.js.map} +1 -1
- package/dist/{relativeTime-DUbW4O44.cjs → relativeTime-DgYBUaVm.cjs} +1 -1
- package/dist/{relativeTime-DUbW4O44.cjs.map → relativeTime-DgYBUaVm.cjs.map} +1 -1
- package/dist/style-runtime.cjs +1 -1
- package/dist/style-runtime.js +1 -1
- package/dist/styles.css +1 -1
- package/dist/theme-CgS-bND3.cjs +2 -0
- package/dist/{theme-Bnwe-wvr.cjs.map → theme-CgS-bND3.cjs.map} +1 -1
- package/dist/{theme-KYwqDZxJ.js → theme-D_f-cmSA.js} +1 -1
- package/dist/{theme-KYwqDZxJ.js.map → theme-D_f-cmSA.js.map} +1 -1
- package/dist/theme.cjs +1 -1
- package/dist/theme.js +1 -1
- package/dist/typescript-CRgqVaw_.cjs +2 -0
- package/dist/typescript-CRgqVaw_.cjs.map +1 -0
- package/dist/typescript-jNfCpQvl.js +523 -0
- package/dist/typescript-jNfCpQvl.js.map +1 -0
- package/dist/{typography-FCWA0UOB.js → typography-BSBsn0f8.js} +3 -3
- package/dist/{typography-FCWA0UOB.js.map → typography-BSBsn0f8.js.map} +1 -1
- package/dist/typography-Zo4Usx9I.cjs +2 -0
- package/dist/{typography-D1s-QFlb.cjs.map → typography-Zo4Usx9I.cjs.map} +1 -1
- package/dist/typography.cjs +1 -1
- package/dist/typography.js +5 -5
- package/dist/{useGhostText-BJZKdZpw.js → useGhostText-DG0bzcao.js} +1 -1
- package/dist/{useGhostText-BJZKdZpw.js.map → useGhostText-DG0bzcao.js.map} +1 -1
- package/dist/useGhostText-tv1LiSPs.cjs +2 -0
- package/dist/{useGhostText-D1DbIs-n.cjs.map → useGhostText-tv1LiSPs.cjs.map} +1 -1
- package/dist/useInteractionEffect-D1ZdNbKU.cjs +2 -0
- package/dist/{useInteractionEffect-CYHGHV1e.cjs.map → useInteractionEffect-D1ZdNbKU.cjs.map} +1 -1
- package/dist/{useInteractionEffect-ClkU3aH5.js → useInteractionEffect-DtpbVd77.js} +1 -1
- package/dist/{useInteractionEffect-ClkU3aH5.js.map → useInteractionEffect-DtpbVd77.js.map} +1 -1
- package/dist/useKeyboardNav-CkIlAagq.cjs +2 -0
- package/dist/{useKeyboardNav-BoibrRUF.cjs.map → useKeyboardNav-CkIlAagq.cjs.map} +1 -1
- package/dist/{useKeyboardNav-CBOdeTFM.js → useKeyboardNav-iEXOdEMB.js} +1 -1
- package/dist/{useKeyboardNav-CBOdeTFM.js.map → useKeyboardNav-iEXOdEMB.js.map} +1 -1
- package/dist/utils.cjs +1 -1
- package/dist/utils.js +10 -10
- package/dist/{validators-D4aTeaH0.cjs → validators-BeNTD8mf.cjs} +1 -1
- package/dist/{validators-D4aTeaH0.cjs.map → validators-BeNTD8mf.cjs.map} +1 -1
- package/dist/{validators-YZyyyLvE.js → validators-H8tNxb8O.js} +1 -1
- package/dist/{validators-YZyyyLvE.js.map → validators-H8tNxb8O.js.map} +1 -1
- package/dist/xml-0Th6YIDv.js +168 -0
- package/dist/xml-0Th6YIDv.js.map +1 -0
- package/dist/xml-C_ksWBRH.cjs +2 -0
- package/dist/xml-C_ksWBRH.cjs.map +1 -0
- package/package.json +2 -2
- package/dist/MAvatar-DGEQqUss.cjs +0 -2
- package/dist/MBadge-DcIPfPH1.cjs +0 -2
- package/dist/MButton-LUNWBBOV.cjs +0 -2
- package/dist/MCheckbox-PzknJeM2.cjs +0 -2
- package/dist/MDataTable-Bq6UoNJX.cjs +0 -2
- package/dist/MDrawer-DRqMsjMt.cjs +0 -2
- package/dist/MDropdownMenu-CymCQqyP.cjs +0 -2
- package/dist/MGalleryIllustration-BHtRFizZ.cjs +0 -2
- package/dist/MHeading-DHT1gORD.cjs +0 -2
- package/dist/MI18nProvider-Bml7Vs2-.cjs +0 -2
- package/dist/MImage-BQs91GK-.js.map +0 -1
- package/dist/MImage-CxeuH-cT.cjs +0 -2
- package/dist/MImage-CxeuH-cT.cjs.map +0 -1
- package/dist/MInline-D9p9Sazp.cjs +0 -2
- package/dist/MInput-DDZ71Qqn.cjs +0 -2
- package/dist/MInputCVC-Sp2uZ5aO.cjs +0 -2
- package/dist/MInputSearch-30o4bcDC.cjs +0 -2
- package/dist/MLink-U_wAUuz1.cjs +0 -2
- package/dist/MModal-Czy-rR--.cjs +0 -2
- package/dist/MPagination-73z0sQvf.cjs +0 -2
- package/dist/MPopover-BW23_1Dl.cjs +0 -2
- package/dist/MPortal-DE3pL2Xl.cjs +0 -2
- package/dist/MQrCode-CMoru4dD.cjs +0 -2
- package/dist/MSkeleton-B0Mxe3L7.cjs +0 -2
- package/dist/MSlider-sH2Vt9Lw.cjs +0 -2
- package/dist/MSparkline-B-ld7hJu.cjs +0 -2
- package/dist/MStack-Cy2GplIA.cjs +0 -2
- package/dist/MSubText-DP9WYlwz.cjs +0 -2
- package/dist/MSurface-C467dVMQ.cjs +0 -2
- package/dist/MTag-DXqkBvqx.cjs +0 -2
- package/dist/MText-COzub3y4.cjs +0 -2
- package/dist/MTimeAgo-DWwXs48z.cjs +0 -2
- package/dist/MToggle-Cm3f6gm4.cjs +0 -2
- package/dist/MTooltip-C3PeHgV3.cjs +0 -2
- package/dist/cards-B75QM9JW.cjs +0 -2
- package/dist/chunk-350yNsax.cjs +0 -1
- package/dist/chunk-efA98nb6.js +0 -13
- package/dist/controls-B7wV_kjJ.cjs +0 -2
- package/dist/data-DHkccnSN.cjs +0 -2
- package/dist/display-DKJ6Hp3A.cjs +0 -3
- package/dist/display-DKJ6Hp3A.cjs.map +0 -1
- package/dist/display-rQqBLjAN.js.map +0 -1
- package/dist/dropdowns-cRrLY8FG.cjs +0 -2
- package/dist/feedback-DiMptPJy.cjs +0 -2
- package/dist/form-DABPazeN.cjs +0 -2
- package/dist/frameworkTexts-DPX5T2x3.cjs +0 -2
- package/dist/icons-BJCV7W0L.cjs +0 -2
- package/dist/inputs-EZBwxk7j.cjs +0 -2
- package/dist/layout-DZiWboju.cjs +0 -2
- package/dist/licensing-JchPJhVY.cjs +0 -2
- package/dist/locale-DIwV_GfN.cjs +0 -2
- package/dist/media-p643cb02.cjs +0 -2
- package/dist/overlays-8htlWp07.cjs +0 -2
- package/dist/prism-bash-DSVvpDwH.cjs +0 -2
- package/dist/prism-bash-DSVvpDwH.cjs.map +0 -1
- package/dist/prism-bash-GQKgVScr.js +0 -177
- package/dist/prism-bash-GQKgVScr.js.map +0 -1
- package/dist/prism-c-DBlZetAm.js +0 -56
- package/dist/prism-c-DBlZetAm.js.map +0 -1
- package/dist/prism-c-DwJ0sL1f.cjs +0 -2
- package/dist/prism-c-DwJ0sL1f.cjs.map +0 -1
- package/dist/prism-clike-BHy7LBAZ.cjs +0 -2
- package/dist/prism-clike-BHy7LBAZ.cjs.map +0 -1
- package/dist/prism-clike-CrtZga9r.js +0 -30
- package/dist/prism-clike-CrtZga9r.js.map +0 -1
- package/dist/prism-core-DsZQ3wSm.js +0 -299
- package/dist/prism-core-DsZQ3wSm.js.map +0 -1
- package/dist/prism-core-Z2NDHfPM.cjs +0 -2
- package/dist/prism-core-Z2NDHfPM.cjs.map +0 -1
- package/dist/prism-cpp-CXyjGEks.cjs +0 -2
- package/dist/prism-cpp-CXyjGEks.cjs.map +0 -1
- package/dist/prism-cpp-DerVaWjZ.js +0 -65
- package/dist/prism-cpp-DerVaWjZ.js.map +0 -1
- package/dist/prism-css-Bx_bUmkm.js +0 -57
- package/dist/prism-css-Bx_bUmkm.js.map +0 -1
- package/dist/prism-css-q8i9Tl0Y.cjs +0 -2
- package/dist/prism-css-q8i9Tl0Y.cjs.map +0 -1
- package/dist/prism-javascript-CC_WcCH4.cjs +0 -2
- package/dist/prism-javascript-CC_WcCH4.cjs.map +0 -1
- package/dist/prism-javascript-uSHTlCK6.js +0 -103
- package/dist/prism-javascript-uSHTlCK6.js.map +0 -1
- package/dist/prism-json-CRpBxccA.js +0 -27
- package/dist/prism-json-CRpBxccA.js.map +0 -1
- package/dist/prism-json-CvwHQDim.cjs +0 -2
- package/dist/prism-json-CvwHQDim.cjs.map +0 -1
- package/dist/prism-jsx-CSsxTxi5.js +0 -48
- package/dist/prism-jsx-CSsxTxi5.js.map +0 -1
- package/dist/prism-jsx-ZJAX6mJe.cjs +0 -2
- package/dist/prism-jsx-ZJAX6mJe.cjs.map +0 -1
- package/dist/prism-markup-Cc4COxfn.js +0 -118
- package/dist/prism-markup-Cc4COxfn.js.map +0 -1
- package/dist/prism-markup-RTw80xRC.cjs +0 -2
- package/dist/prism-markup-RTw80xRC.cjs.map +0 -1
- package/dist/prism-markup-templating-CylI3Gpj.cjs +0 -2
- package/dist/prism-markup-templating-CylI3Gpj.cjs.map +0 -1
- package/dist/prism-markup-templating-D4w8OHUw.js +0 -41
- package/dist/prism-markup-templating-D4w8OHUw.js.map +0 -1
- package/dist/prism-php-CMZ7fRp0.cjs +0 -2
- package/dist/prism-php-CMZ7fRp0.cjs.map +0 -1
- package/dist/prism-php-nJ_CzHXP.js +0 -279
- package/dist/prism-php-nJ_CzHXP.js.map +0 -1
- package/dist/prism-tsx-CvHlXV3S.cjs +0 -2
- package/dist/prism-tsx-CvHlXV3S.cjs.map +0 -1
- package/dist/prism-tsx-UlwV29L3.js +0 -10
- package/dist/prism-tsx-UlwV29L3.js.map +0 -1
- package/dist/prism-typescript-BA7hsZPZ.js +0 -40
- package/dist/prism-typescript-BA7hsZPZ.js.map +0 -1
- package/dist/prism-typescript-CDAVIXup.cjs +0 -2
- package/dist/prism-typescript-CDAVIXup.cjs.map +0 -1
- package/dist/theme-Bnwe-wvr.cjs +0 -2
- package/dist/typography-D1s-QFlb.cjs +0 -2
- package/dist/useGhostText-D1DbIs-n.cjs +0 -2
- package/dist/useInteractionEffect-CYHGHV1e.cjs +0 -2
- package/dist/useKeyboardNav-BoibrRUF.cjs +0 -2
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { Li as e } from "./icons-
|
|
2
|
-
import { t } from "./cn-
|
|
3
|
-
import { t as n } from "./useGhostText-
|
|
4
|
-
import { t as r } from "./useInteractionEffect-
|
|
5
|
-
import { r as i } from "./MButton-
|
|
1
|
+
import { Li as e } from "./icons-CfpYxnfg.js";
|
|
2
|
+
import { t } from "./cn-YER3QsV1.js";
|
|
3
|
+
import { t as n } from "./useGhostText-DG0bzcao.js";
|
|
4
|
+
import { t as r } from "./useInteractionEffect-DtpbVd77.js";
|
|
5
|
+
import { r as i } from "./MButton-y9qXhhGt.js";
|
|
6
6
|
import { forwardRef as a, useCallback as o, useRef as ee, useState as s } from "react";
|
|
7
7
|
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
8
8
|
//#region src/utils/useControllableString.ts
|
|
@@ -183,4 +183,4 @@ var f = a(function({ type: a = "text", value: u, defaultValue: f, name: p, id: m
|
|
|
183
183
|
//#endregion
|
|
184
184
|
export { d as n, f as t };
|
|
185
185
|
|
|
186
|
-
//# sourceMappingURL=MInput-
|
|
186
|
+
//# sourceMappingURL=MInput-bzSwK880.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MInput-l3MY93Su.js","names":[],"sources":["../src/utils/useControllableString.ts","../src/components/inputs/MInput/MInput.tsx"],"sourcesContent":["import {useCallback, useState} from 'react'\n\ntype ControllableStringLike = string | number | readonly string[] | null | undefined\n\n// Normalize mixed input values so text-like controls always work with strings.\nfunction normalizeStringValue(value: ControllableStringLike) {\n if (value === null || value === undefined) {\n return ''\n }\n\n return value.toString()\n}\n\n// Share controlled and uncontrolled string state logic between text-like primitives.\nexport function useControllableString(value: ControllableStringLike, defaultValue?: ControllableStringLike) {\n const [internalValue, setInternalValue] = useState(() => normalizeStringValue(defaultValue))\n const isControlled = value !== undefined\n const currentValue = isControlled ? normalizeStringValue(value) : internalValue\n\n const setCurrentValue = useCallback(\n (nextValue: string) => {\n if (!isControlled) {\n setInternalValue(nextValue)\n }\n },\n [isControlled]\n )\n\n return {\n isControlled,\n currentValue,\n setCurrentValue,\n }\n}\n","import {forwardRef, useCallback, useRef, useState} from 'react'\nimport type * as React from 'react'\nimport type {MInputProps} from './MInput.types'\nimport {cn} from '../../../utils/cn'\nimport {useControllableString} from '../../../utils/useControllableString'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport {useGhostText} from '../../../utils/useGhostText'\nimport {MSpinner} from '../../feedback'\nimport {MCloseIcon} from '../../../icons'\nimport './MInput.css'\n\n// Render the base text input used by all specialized input wrappers.\nexport const MInput = forwardRef<HTMLInputElement, MInputProps>(function MInput(\n {\n type = 'text',\n value,\n defaultValue,\n name,\n id,\n placeholder,\n disabled = false,\n readOnly = false,\n required = false,\n autoFocus = false,\n autoComplete,\n inputMode,\n variant = 'outlined',\n size = 'md',\n color,\n fullWidth = false,\n rounded = false,\n label,\n helperText,\n errorText,\n startIcon,\n endIcon,\n clearable = false,\n error = false,\n success = false,\n maxLength,\n showCharCount = false,\n onChange,\n onFocus,\n onBlur,\n onKeyDown,\n onClear,\n ghostOptions,\n ghostMinChars = 2,\n onGhostAccept,\n loading = false,\n clickEffect = 'ripple',\n rippleColor,\n className,\n style,\n inputClassName,\n labelClassName,\n },\n ref\n) {\n const [focused, setFocused] = useState(false)\n const inputRef = useRef<HTMLInputElement>(null)\n const {effectClassName, effectLayer, handlePointerDown} = useInteractionEffect<HTMLDivElement>({\n effect: clickEffect,\n disabled: disabled || readOnly,\n color: rippleColor,\n })\n\n const {isControlled, currentValue, setCurrentValue} = useControllableString(value, defaultValue)\n const ghost = useGhostText({\n options: ghostOptions ?? [],\n value: currentValue,\n minChars: ghostMinChars,\n })\n const hasError = error || !!errorText\n const hasContent = currentValue.length > 0\n const resolvedColorClass = hasError ? 'color-error' : color ? `color-${color}` : undefined\n\n // Mirror focus state so the wrapper can style the input consistently.\n const handleFocus = useCallback(\n (event: React.FocusEvent<HTMLInputElement>) => {\n setFocused(true)\n onFocus?.(event)\n },\n [onFocus]\n )\n\n // Clear focus styles before delegating to the caller.\n const handleBlur = useCallback(\n (event: React.FocusEvent<HTMLInputElement>) => {\n setFocused(false)\n onBlur?.(event)\n },\n [onBlur]\n )\n\n // Keep uncontrolled usage working without blocking controlled integrations.\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n setCurrentValue(event.target.value)\n onChange?.(event)\n ghost.reset()\n },\n [onChange, setCurrentValue, ghost.reset]\n )\n\n // Intercept keyboard events for ghost text acceptance before delegating.\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (ghostOptions && ghost.hint) {\n const accepted = ghost.onKeyDown(event)\n if (accepted) {\n const result = ghost.accept()\n setCurrentValue(result.value)\n onGhostAccept?.(result.value)\n // Fire synthetic change so controlled parents stay in sync.\n const input = (ref as React.RefObject<HTMLInputElement>)?.current ?? inputRef.current\n if (input) {\n const nativeSet = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')?.set\n nativeSet?.call(input, result.value)\n input.dispatchEvent(new Event('input', {bubbles: true}))\n }\n return\n }\n }\n onKeyDown?.(event)\n },\n [ghostOptions, ghost, setCurrentValue, onGhostAccept, onKeyDown, ref]\n )\n\n // Reset the visible value while preserving focus for quick repeated input.\n const handleClear = useCallback(() => {\n setCurrentValue('')\n\n const input = (ref as React.RefObject<HTMLInputElement>)?.current ?? inputRef.current\n if (input) {\n const nativeSet = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')?.set\n nativeSet?.call(input, '')\n input.dispatchEvent(new Event('input', {bubbles: true}))\n }\n\n onClear?.()\n input?.focus()\n }, [onClear, ref, setCurrentValue])\n\n const containerClasses = cn(\n 'container',\n `field-${variant}`,\n `field-${size}`,\n focused && 'focused',\n hasError && 'input-error',\n success && !hasError && 'input-success',\n resolvedColorClass,\n disabled && 'disabled',\n rounded && 'rounded',\n effectClassName\n )\n\n return (\n <div className={cn('input', resolvedColorClass, fullWidth && 'full-width', className)} style={style}>\n {label && (\n <label\n htmlFor={id}\n className={cn(\n 'field-label',\n focused && 'focused',\n hasError && 'error',\n success && !hasError && 'success',\n required && 'required',\n labelClassName\n )}\n >\n {label}\n </label>\n )}\n\n <div className={containerClasses} onPointerDown={handlePointerDown}>\n {effectLayer}\n {startIcon && <span className=\"start-icon\">{startIcon}</span>}\n\n {ghostOptions ? (\n <div className=\"ghost-text-field\">\n <input\n ref={ref ?? inputRef}\n type={type}\n value={currentValue}\n name={name}\n id={id}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n autoFocus={autoFocus}\n autoComplete={autoComplete ?? 'off'}\n inputMode={inputMode}\n maxLength={maxLength}\n className={cn('field', inputClassName)}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n aria-invalid={hasError || undefined}\n aria-describedby={errorText ? `${id}-error` : helperText ? `${id}-helper` : undefined}\n />\n {focused && ghost.hint && (\n <span className=\"ghost-text-overlay\" aria-hidden=\"true\">\n <span className=\"ghost-text-typed\">{currentValue}</span>\n <span className=\"ghost-text-hint\">{ghost.hint}</span>\n </span>\n )}\n </div>\n ) : (\n <input\n ref={ref ?? inputRef}\n type={type}\n value={currentValue}\n name={name}\n id={id}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n autoFocus={autoFocus}\n autoComplete={autoComplete}\n inputMode={inputMode}\n maxLength={maxLength}\n className={cn('field', inputClassName)}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={onKeyDown}\n aria-invalid={hasError || undefined}\n aria-describedby={errorText ? `${id}-error` : helperText ? `${id}-helper` : undefined}\n />\n )}\n\n {loading && <MSpinner size=\"sm\" color={color} />}\n\n {clearable && hasContent && !loading && !disabled && (\n <button\n type=\"button\"\n className=\"clear-btn clear-btn-base\"\n onClick={handleClear}\n tabIndex={-1}\n aria-label=\"Clear input\"\n >\n <MCloseIcon />\n </button>\n )}\n\n {endIcon && !loading && <span className=\"end-icon\">{endIcon}</span>}\n </div>\n\n {(errorText || helperText || showCharCount) && (\n <div className=\"bottom-row\">\n <span>\n {errorText && (\n <span id={id ? `${id}-error` : undefined} className=\"field-error\" role=\"alert\">\n {errorText}\n </span>\n )}\n {!errorText && helperText && (\n <span id={id ? `${id}-helper` : undefined} className=\"field-helper\">\n {helperText}\n </span>\n )}\n </span>\n {showCharCount && maxLength && (\n <span className={cn('char-count', currentValue.length > maxLength && 'over')}>\n {currentValue.length}/{maxLength}\n </span>\n )}\n </div>\n )}\n </div>\n )\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MInput-bzSwK880.js","names":[],"sources":["../src/utils/useControllableString.ts","../src/components/inputs/MInput/MInput.tsx"],"sourcesContent":["import {useCallback, useState} from 'react'\n\ntype ControllableStringLike = string | number | readonly string[] | null | undefined\n\n// Normalize mixed input values so text-like controls always work with strings.\nfunction normalizeStringValue(value: ControllableStringLike) {\n if (value === null || value === undefined) {\n return ''\n }\n\n return value.toString()\n}\n\n// Share controlled and uncontrolled string state logic between text-like primitives.\nexport function useControllableString(value: ControllableStringLike, defaultValue?: ControllableStringLike) {\n const [internalValue, setInternalValue] = useState(() => normalizeStringValue(defaultValue))\n const isControlled = value !== undefined\n const currentValue = isControlled ? normalizeStringValue(value) : internalValue\n\n const setCurrentValue = useCallback(\n (nextValue: string) => {\n if (!isControlled) {\n setInternalValue(nextValue)\n }\n },\n [isControlled]\n )\n\n return {\n isControlled,\n currentValue,\n setCurrentValue,\n }\n}\n","import {forwardRef, useCallback, useRef, useState} from 'react'\nimport type * as React from 'react'\nimport type {MInputProps} from './MInput.types'\nimport {cn} from '../../../utils/cn'\nimport {useControllableString} from '../../../utils/useControllableString'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport {useGhostText} from '../../../utils/useGhostText'\nimport {MSpinner} from '../../feedback'\nimport {MCloseIcon} from '../../../icons'\nimport './MInput.css'\n\n// Render the base text input used by all specialized input wrappers.\nexport const MInput = forwardRef<HTMLInputElement, MInputProps>(function MInput(\n {\n type = 'text',\n value,\n defaultValue,\n name,\n id,\n placeholder,\n disabled = false,\n readOnly = false,\n required = false,\n autoFocus = false,\n autoComplete,\n inputMode,\n variant = 'outlined',\n size = 'md',\n color,\n fullWidth = false,\n rounded = false,\n label,\n helperText,\n errorText,\n startIcon,\n endIcon,\n clearable = false,\n error = false,\n success = false,\n maxLength,\n showCharCount = false,\n onChange,\n onFocus,\n onBlur,\n onKeyDown,\n onClear,\n ghostOptions,\n ghostMinChars = 2,\n onGhostAccept,\n loading = false,\n clickEffect = 'ripple',\n rippleColor,\n className,\n style,\n inputClassName,\n labelClassName,\n },\n ref\n) {\n const [focused, setFocused] = useState(false)\n const inputRef = useRef<HTMLInputElement>(null)\n const {effectClassName, effectLayer, handlePointerDown} = useInteractionEffect<HTMLDivElement>({\n effect: clickEffect,\n disabled: disabled || readOnly,\n color: rippleColor,\n })\n\n const {isControlled, currentValue, setCurrentValue} = useControllableString(value, defaultValue)\n const ghost = useGhostText({\n options: ghostOptions ?? [],\n value: currentValue,\n minChars: ghostMinChars,\n })\n const hasError = error || !!errorText\n const hasContent = currentValue.length > 0\n const resolvedColorClass = hasError ? 'color-error' : color ? `color-${color}` : undefined\n\n // Mirror focus state so the wrapper can style the input consistently.\n const handleFocus = useCallback(\n (event: React.FocusEvent<HTMLInputElement>) => {\n setFocused(true)\n onFocus?.(event)\n },\n [onFocus]\n )\n\n // Clear focus styles before delegating to the caller.\n const handleBlur = useCallback(\n (event: React.FocusEvent<HTMLInputElement>) => {\n setFocused(false)\n onBlur?.(event)\n },\n [onBlur]\n )\n\n // Keep uncontrolled usage working without blocking controlled integrations.\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n setCurrentValue(event.target.value)\n onChange?.(event)\n ghost.reset()\n },\n [onChange, setCurrentValue, ghost.reset]\n )\n\n // Intercept keyboard events for ghost text acceptance before delegating.\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (ghostOptions && ghost.hint) {\n const accepted = ghost.onKeyDown(event)\n if (accepted) {\n const result = ghost.accept()\n setCurrentValue(result.value)\n onGhostAccept?.(result.value)\n // Fire synthetic change so controlled parents stay in sync.\n const input = (ref as React.RefObject<HTMLInputElement>)?.current ?? inputRef.current\n if (input) {\n const nativeSet = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')?.set\n nativeSet?.call(input, result.value)\n input.dispatchEvent(new Event('input', {bubbles: true}))\n }\n return\n }\n }\n onKeyDown?.(event)\n },\n [ghostOptions, ghost, setCurrentValue, onGhostAccept, onKeyDown, ref]\n )\n\n // Reset the visible value while preserving focus for quick repeated input.\n const handleClear = useCallback(() => {\n setCurrentValue('')\n\n const input = (ref as React.RefObject<HTMLInputElement>)?.current ?? inputRef.current\n if (input) {\n const nativeSet = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')?.set\n nativeSet?.call(input, '')\n input.dispatchEvent(new Event('input', {bubbles: true}))\n }\n\n onClear?.()\n input?.focus()\n }, [onClear, ref, setCurrentValue])\n\n const containerClasses = cn(\n 'container',\n `field-${variant}`,\n `field-${size}`,\n focused && 'focused',\n hasError && 'input-error',\n success && !hasError && 'input-success',\n resolvedColorClass,\n disabled && 'disabled',\n rounded && 'rounded',\n effectClassName\n )\n\n return (\n <div className={cn('input', resolvedColorClass, fullWidth && 'full-width', className)} style={style}>\n {label && (\n <label\n htmlFor={id}\n className={cn(\n 'field-label',\n focused && 'focused',\n hasError && 'error',\n success && !hasError && 'success',\n required && 'required',\n labelClassName\n )}\n >\n {label}\n </label>\n )}\n\n <div className={containerClasses} onPointerDown={handlePointerDown}>\n {effectLayer}\n {startIcon && <span className=\"start-icon\">{startIcon}</span>}\n\n {ghostOptions ? (\n <div className=\"ghost-text-field\">\n <input\n ref={ref ?? inputRef}\n type={type}\n value={currentValue}\n name={name}\n id={id}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n autoFocus={autoFocus}\n autoComplete={autoComplete ?? 'off'}\n inputMode={inputMode}\n maxLength={maxLength}\n className={cn('field', inputClassName)}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n aria-invalid={hasError || undefined}\n aria-describedby={errorText ? `${id}-error` : helperText ? `${id}-helper` : undefined}\n />\n {focused && ghost.hint && (\n <span className=\"ghost-text-overlay\" aria-hidden=\"true\">\n <span className=\"ghost-text-typed\">{currentValue}</span>\n <span className=\"ghost-text-hint\">{ghost.hint}</span>\n </span>\n )}\n </div>\n ) : (\n <input\n ref={ref ?? inputRef}\n type={type}\n value={currentValue}\n name={name}\n id={id}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n autoFocus={autoFocus}\n autoComplete={autoComplete}\n inputMode={inputMode}\n maxLength={maxLength}\n className={cn('field', inputClassName)}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={onKeyDown}\n aria-invalid={hasError || undefined}\n aria-describedby={errorText ? `${id}-error` : helperText ? `${id}-helper` : undefined}\n />\n )}\n\n {loading && <MSpinner size=\"sm\" color={color} />}\n\n {clearable && hasContent && !loading && !disabled && (\n <button\n type=\"button\"\n className=\"clear-btn clear-btn-base\"\n onClick={handleClear}\n tabIndex={-1}\n aria-label=\"Clear input\"\n >\n <MCloseIcon />\n </button>\n )}\n\n {endIcon && !loading && <span className=\"end-icon\">{endIcon}</span>}\n </div>\n\n {(errorText || helperText || showCharCount) && (\n <div className=\"bottom-row\">\n <span>\n {errorText && (\n <span id={id ? `${id}-error` : undefined} className=\"field-error\" role=\"alert\">\n {errorText}\n </span>\n )}\n {!errorText && helperText && (\n <span id={id ? `${id}-helper` : undefined} className=\"field-helper\">\n {helperText}\n </span>\n )}\n </span>\n {showCharCount && maxLength && (\n <span className={cn('char-count', currentValue.length > maxLength && 'over')}>\n {currentValue.length}/{maxLength}\n </span>\n )}\n </div>\n )}\n </div>\n )\n})\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`./icons-DWMgDKgt.cjs`),t=require(`./cn-CU5TNITO.cjs`),n=require(`./MInput-DYqV3-rQ.cjs`),r=require(`./MDropdownMenu-BmfXSc46.cjs`);require(`./core-AKWkE8Bx.cjs`);let i=require(`react`),a=require(`react/jsx-runtime`);var o={valid:!0};function s(e){return e.replace(/\D/g,``)}function c(e){return e?e.padStart(2,`0`).slice(0,2):``}function l(e,t){let n=c(e),r=t?.slice(0,4)??``;return!n&&!r?``:r?`${n}/${r}`:n}function u(e){let t=s(e).slice(0,6);return{month:t.slice(0,2),year:t.slice(2,6)}}function d(e,t){let n=new Date().getFullYear(),r=Math.max(e??n,n);return{resolvedMinYear:r,resolvedMaxYear:Math.max(t??n+20,r)}}function f(e,{minYear:t,maxYear:n}){if(!e)return o;let{month:r,year:i}=u(e);if(r.length!==2||i.length!==4)return{valid:!1,error:`Expiration date is incomplete`};let a=parseInt(r,10),s=parseInt(i,10),{resolvedMinYear:c,resolvedMaxYear:l}=d(t,n);if(Number.isNaN(a)||a<1||a>12)return{valid:!1,error:`Use a valid month`};if(Number.isNaN(s))return{valid:!1,error:`Use a valid year`};if(s<c)return{valid:!1,error:`Year must be ${c} or later`};if(s>l)return{valid:!1,error:`Year must be ${l} or earlier`};let f=new Date,p=f.getMonth()+1,m=f.getFullYear();return s<m||s===m&&a<p?{valid:!1,error:`Card has expired`}:o}var p=(0,i.forwardRef)(function({validateOnBlur:c=!0,validateOnChange:p=!1,minYear:m,maxYear:h,onValidationChange:g,onValueChange:_,value:ee,defaultValue:v,name:y,id:b,disabled:x=!1,readOnly:te=!1,required:S=!1,autoFocus:ne=!1,variant:re=`outlined`,size:ie=`md`,color:C,fullWidth:ae=!1,rounded:w=!1,label:T,helperText:E,errorText:D,startIcon:O,endIcon:k,clearable:oe=!1,error:A=!1,success:j,onChange:M,onFocus:N,onBlur:P,onClear:se,className:ce,style:le,labelClassName:ue},F){let I=(0,i.useRef)(null),de=(0,i.useRef)(null),{currentValue:L,setCurrentValue:fe}=n.n(ee,v),[R,z]=(0,i.useState)(o),[B,V]=(0,i.useState)(!1),[H,U]=(0,i.useState)(!1),[pe,me]=(0,i.useState)(!1),[he,ge]=(0,i.useState)(!1),{month:W,year:G}=u(L),_e=!!(W||G),K=x||te,{resolvedMinYear:q,resolvedMaxYear:ve}=d(m,h),ye=(0,i.useMemo)(()=>Array.from({length:ve-q+1},(e,t)=>q+t),[ve,q]),J=(0,i.useCallback)(e=>{let t=f(e,{minYear:m,maxYear:h});return z(t),g?.(t),t},[h,m,g]),Y=(0,i.useCallback)(e=>{fe(e),_?.(s(e),e);let t=F?.current??I.current;t&&((Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,`value`)?.set)?.call(t,e),t.dispatchEvent(new Event(`input`,{bubbles:!0})))},[_,F,fe]),X=(0,i.useCallback)((e,t)=>{let n=l(e,t);Y(n),p&&B&&J(n)},[J,Y,B,p]),Z=(0,i.useCallback)(()=>{(F?.current??I.current)?.focus()},[F]),be=(0,i.useCallback)(e=>{if(H)return;U(!0);let t=F?.current??I.current;t&&e.target!==t&&N?.(e)},[H,N,F]),xe=(0,i.useCallback)(e=>{let t=e.relatedTarget;t&&de.current?.contains(t)||(U(!1),V(!0),c&&L&&J(L),P?.(e))},[L,P,J,c]),Se=(0,i.useCallback)(e=>{Z(),X(e,G)},[Z,X,G]),Ce=(0,i.useCallback)(e=>{Z(),X(W,e)},[Z,W,X]),we=(0,i.useCallback)(()=>{Y(``),V(!1),z(o),g?.(o),se?.(),Z()},[Z,se,g,Y]),Q=A||B&&!R.valid,$=D||(B&&!R.valid?R.error:void 0),Te=!Q&&(j===void 0?B&&R.valid&&!!(W&&G):j),Ee=Q?`color-error`:C?`color-${C}`:void 0,De=t.t(`container`,`field-${re}`,`field-${ie}`,H&&`focused`,Q&&`input-error`,Te&&!Q&&`input-success`,Ee,x&&`disabled`,w&&`rounded`),Oe=W||`MM`,ke=G||`YYYY`;return(0,a.jsxs)(`div`,{ref:de,className:t.t(`input`,`input-exp-date`,Ee,ae&&`full-width`,ce),style:le,onFocusCapture:be,onBlurCapture:xe,children:[T&&(0,a.jsx)(`label`,{htmlFor:b,className:t.t(`field-label`,H&&`focused`,Q&&`error`,Te&&!Q&&`success`,S&&`required`,ue),children:T}),(0,a.jsxs)(`div`,{className:De,onClick:Z,children:[O&&(0,a.jsx)(`span`,{className:`start-icon`,children:O}),(0,a.jsx)(`input`,{ref:F??I,type:`text`,value:L,name:y,id:b,readOnly:!0,required:S,autoFocus:ne,className:`input-exp-date-native`,tabIndex:-1,"aria-hidden":`true`,onChange:M,onFocus:N,onBlur:P}),(0,a.jsxs)(`div`,{className:`input-exp-date-segments`,"aria-label":`Expiration date`,children:[K?(0,a.jsx)(`span`,{className:t.t(`input-exp-date-trigger`,!W&&`placeholder`,`static`),children:(0,a.jsx)(`span`,{children:Oe})}):(0,a.jsx)(r.i,{trigger:(0,a.jsxs)(`span`,{className:t.t(`input-exp-date-trigger`,pe&&`open`,!W&&`placeholder`),onMouseDown:Z,children:[(0,a.jsx)(`span`,{children:Oe}),(0,a.jsx)(e.Ni,{size:16})]}),openOn:`click`,closeOnSelect:!0,onOpenChange:me,popoverClassName:`input-exp-date-popover`,children:Array.from({length:12},(e,t)=>{let n=String(t+1).padStart(2,`0`);return(0,a.jsx)(r.r,{label:n,active:W===n,onClick:()=>Se(n)},n)})}),(0,a.jsx)(`span`,{className:`input-exp-date-separator`,children:`/`}),K?(0,a.jsx)(`span`,{className:t.t(`input-exp-date-trigger`,!G&&`placeholder`,`static`),children:(0,a.jsx)(`span`,{children:ke})}):(0,a.jsx)(r.i,{trigger:(0,a.jsxs)(`span`,{className:t.t(`input-exp-date-trigger`,he&&`open`,!G&&`placeholder`),onMouseDown:Z,children:[(0,a.jsx)(`span`,{children:ke}),(0,a.jsx)(e.Ni,{size:16})]}),openOn:`click`,closeOnSelect:!0,onOpenChange:ge,popoverClassName:`input-exp-date-popover`,children:ye.map(e=>(0,a.jsx)(r.r,{label:String(e),active:G===String(e),onClick:()=>Ce(String(e))},e))})]}),oe&&_e&&!K&&(0,a.jsx)(`button`,{type:`button`,className:`clear-btn clear-btn-base`,onClick:e=>{e.stopPropagation(),we()},tabIndex:-1,"aria-label":`Clear input`,children:(0,a.jsx)(e.Li,{})}),k&&(0,a.jsx)(`span`,{className:`end-icon`,children:k})]}),($||E)&&(0,a.jsx)(`div`,{className:`bottom-row`,children:(0,a.jsxs)(`span`,{children:[$&&(0,a.jsx)(`span`,{id:b?`${b}-error`:void 0,className:`field-error`,role:`alert`,children:$}),!$&&E&&(0,a.jsx)(`span`,{id:b?`${b}-helper`:void 0,className:`field-helper`,children:E})]})})]})}),m={valid:!0};function h(e){return e.replace(/\D/g,``)}function g(e,t){return e?h(e).length===t?m:{valid:!1,error:`Security code must have ${t} digits`}:m}var _=(0,i.forwardRef)(function({length:r=3,validateOnBlur:o=!0,validateOnChange:s=!1,onValidationChange:c,onValueChange:l,value:u,defaultValue:d,onChange:f,onBlur:p,onKeyDown:_,error:ee,errorText:v,success:y,placeholder:b,className:x,inputClassName:te,...S},ne){let[re,ie]=(0,i.useState)(()=>h(d?.toString()??``).slice(0,r)),[C,ae]=(0,i.useState)(m),[w,T]=(0,i.useState)(!1),E=u===void 0?re:h(u.toString()).slice(0,r),D=(0,i.useCallback)(e=>{let t=g(e,r);return ae(t),c?.(t),t},[r,c]),O=(0,i.useCallback)(e=>{let t=h(e.target.value).slice(0,r);u===void 0&&ie(t),l?.(t),s&&w&&D(t),f?.(e)},[r,f,l,D,w,s,u]),k=(0,i.useCallback)(e=>{T(!0),o&&E&&D(E),p?.(e)},[E,p,D,o]),oe=(0,i.useCallback)(e=>{if([`Backspace`,`Delete`,`Tab`,`ArrowLeft`,`ArrowRight`,`Home`,`End`].includes(e.key)){_?.(e);return}if(e.ctrlKey||e.metaKey){_?.(e);return}/^\d$/.test(e.key)||e.preventDefault(),_?.(e)},[_]),A=ee||w&&!C.valid,j=v||(w&&!C.valid?C.error:void 0),M=!A&&(y===void 0?w&&E.length===r:y),N=M?(0,a.jsx)(e.Ii,{}):void 0;return(0,a.jsx)(n.t,{...S,ref:ne,type:`text`,inputMode:`numeric`,value:E,onChange:O,onBlur:k,onKeyDown:oe,error:A,errorText:j,success:M,placeholder:b??``.padEnd(r,`0`),maxLength:r,endIcon:N,inputClassName:t.t(`input-cvc-field`,te),className:x})});Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return _}});
|
|
2
|
+
//# sourceMappingURL=MInputCVC-5NkYSxV8.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MInputCVC-Sp2uZ5aO.cjs","names":[],"sources":["../src/components/inputs/MInputExpDate/MInputExpDate.tsx","../src/components/inputs/MInputCVC/MInputCVC.tsx"],"sourcesContent":["import {forwardRef, useCallback, useMemo, useRef, useState} from 'react'\nimport type * as React from 'react'\nimport type {MInputExpDateProps} from './MInputExpDate.types'\nimport {cn} from '../../../utils/cn'\nimport {useControllableString} from '../../../utils/useControllableString'\nimport type {ValidationResult} from '../../../utils/validators'\nimport {MCloseIcon, MChevronDownIcon} from '../../../icons'\nimport {MDropdownItem, MDropdownMenu} from '../../overlays'\nimport '../MInput/MInput.css'\nimport './MInputExpDate.css'\n\nconst OK: ValidationResult = {valid: true}\n\nfunction stripDigits(value: string) {\n return value.replace(/\\D/g, '')\n}\n\nfunction padMonth(value?: string) {\n if (!value) {\n return ''\n }\n\n return value.padStart(2, '0').slice(0, 2)\n}\n\nfunction formatValue(month?: string, year?: string) {\n const resolvedMonth = padMonth(month)\n const resolvedYear = year?.slice(0, 4) ?? ''\n\n if (!resolvedMonth && !resolvedYear) {\n return ''\n }\n\n if (!resolvedYear) {\n return resolvedMonth\n }\n\n return `${resolvedMonth}/${resolvedYear}`\n}\n\nfunction parseValue(value: string) {\n const digits = stripDigits(value).slice(0, 6)\n\n return {\n month: digits.slice(0, 2),\n year: digits.slice(2, 6),\n }\n}\n\nfunction resolveYearBounds(minYear?: number, maxYear?: number) {\n const currentYear = new Date().getFullYear()\n const resolvedMinYear = Math.max(minYear ?? currentYear, currentYear)\n const resolvedMaxYear = Math.max(maxYear ?? currentYear + 20, resolvedMinYear)\n\n return {\n resolvedMinYear,\n resolvedMaxYear,\n }\n}\n\nfunction validateExpDate(\n value: string,\n {minYear, maxYear}: Pick<MInputExpDateProps, 'minYear' | 'maxYear'>\n): ValidationResult {\n if (!value) {\n return OK\n }\n\n const {month: monthValue, year: yearValue} = parseValue(value)\n\n if (monthValue.length !== 2 || yearValue.length !== 4) {\n return {valid: false, error: 'Expiration date is incomplete'}\n }\n\n const month = parseInt(monthValue, 10)\n const year = parseInt(yearValue, 10)\n const {resolvedMinYear, resolvedMaxYear} = resolveYearBounds(minYear, maxYear)\n\n if (Number.isNaN(month) || month < 1 || month > 12) {\n return {valid: false, error: 'Use a valid month'}\n }\n\n if (Number.isNaN(year)) {\n return {valid: false, error: 'Use a valid year'}\n }\n\n if (year < resolvedMinYear) {\n return {valid: false, error: `Year must be ${resolvedMinYear} or later`}\n }\n\n if (year > resolvedMaxYear) {\n return {valid: false, error: `Year must be ${resolvedMaxYear} or earlier`}\n }\n\n const now = new Date()\n const currentMonth = now.getMonth() + 1\n const currentYear = now.getFullYear()\n\n if (year < currentYear || (year === currentYear && month < currentMonth)) {\n return {valid: false, error: 'Card has expired'}\n }\n\n return OK\n}\n\nexport const MInputExpDate = forwardRef<HTMLInputElement, MInputExpDateProps>(function MInputExpDate(\n {\n validateOnBlur = true,\n validateOnChange = false,\n minYear,\n maxYear,\n onValidationChange,\n onValueChange,\n value,\n defaultValue,\n name,\n id,\n disabled = false,\n readOnly = false,\n required = false,\n autoFocus = false,\n variant = 'outlined',\n size = 'md',\n color,\n fullWidth = false,\n rounded = false,\n label,\n helperText,\n errorText,\n startIcon,\n endIcon,\n clearable = false,\n error = false,\n success,\n onChange,\n onFocus,\n onBlur,\n onClear,\n className,\n style,\n labelClassName,\n },\n ref\n) {\n const inputRef = useRef<HTMLInputElement>(null)\n const rootRef = useRef<HTMLDivElement>(null)\n const {currentValue, setCurrentValue} = useControllableString(value, defaultValue)\n const [validation, setValidation] = useState<ValidationResult>(OK)\n const [touched, setTouched] = useState(false)\n const [focused, setFocused] = useState(false)\n const [monthMenuOpen, setMonthMenuOpen] = useState(false)\n const [yearMenuOpen, setYearMenuOpen] = useState(false)\n\n const {month, year} = parseValue(currentValue)\n const hasContent = Boolean(month || year)\n const segmentDisabled = disabled || readOnly\n const {resolvedMinYear, resolvedMaxYear} = resolveYearBounds(minYear, maxYear)\n const yearOptions = useMemo(\n () => Array.from({length: resolvedMaxYear - resolvedMinYear + 1}, (_, index) => resolvedMinYear + index),\n [resolvedMaxYear, resolvedMinYear]\n )\n\n const runValidation = useCallback(\n (formattedValue: string) => {\n const result = validateExpDate(formattedValue, {minYear, maxYear})\n setValidation(result)\n onValidationChange?.(result)\n return result\n },\n [maxYear, minYear, onValidationChange]\n )\n\n const syncValue = useCallback(\n (formattedValue: string) => {\n setCurrentValue(formattedValue)\n onValueChange?.(stripDigits(formattedValue), formattedValue)\n\n const input = (ref as React.RefObject<HTMLInputElement>)?.current ?? inputRef.current\n if (input) {\n const nativeSet = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')?.set\n nativeSet?.call(input, formattedValue)\n input.dispatchEvent(new Event('input', {bubbles: true}))\n }\n },\n [onValueChange, ref, setCurrentValue]\n )\n\n const updateValue = useCallback(\n (nextMonth?: string, nextYear?: string) => {\n const formattedValue = formatValue(nextMonth, nextYear)\n syncValue(formattedValue)\n\n if (validateOnChange && touched) {\n runValidation(formattedValue)\n }\n },\n [runValidation, syncValue, touched, validateOnChange]\n )\n\n const focusHiddenInput = useCallback(() => {\n const input = (ref as React.RefObject<HTMLInputElement>)?.current ?? inputRef.current\n input?.focus()\n }, [ref])\n\n const handleRootFocus = useCallback(\n (event: React.FocusEvent<HTMLDivElement>) => {\n if (focused) {\n return\n }\n\n setFocused(true)\n const input = (ref as React.RefObject<HTMLInputElement>)?.current ?? inputRef.current\n if (input && event.target !== input) {\n onFocus?.(event as unknown as React.FocusEvent<HTMLInputElement>)\n }\n },\n [focused, onFocus, ref]\n )\n\n const handleRootBlur = useCallback(\n (event: React.FocusEvent<HTMLDivElement>) => {\n const nextTarget = event.relatedTarget as Node | null\n\n if (nextTarget && rootRef.current?.contains(nextTarget)) {\n return\n }\n\n setFocused(false)\n setTouched(true)\n\n if (validateOnBlur && currentValue) {\n runValidation(currentValue)\n }\n\n onBlur?.(event as unknown as React.FocusEvent<HTMLInputElement>)\n },\n [currentValue, onBlur, runValidation, validateOnBlur]\n )\n\n const handleSelectMonth = useCallback(\n (nextMonth: string) => {\n focusHiddenInput()\n updateValue(nextMonth, year)\n },\n [focusHiddenInput, updateValue, year]\n )\n\n const handleSelectYear = useCallback(\n (nextYear: string) => {\n focusHiddenInput()\n updateValue(month, nextYear)\n },\n [focusHiddenInput, month, updateValue]\n )\n\n const handleClear = useCallback(() => {\n syncValue('')\n setTouched(false)\n setValidation(OK)\n onValidationChange?.(OK)\n onClear?.()\n focusHiddenInput()\n }, [focusHiddenInput, onClear, onValidationChange, syncValue])\n\n const hasError = error || (touched && !validation.valid)\n const resolvedErrorText = errorText || (touched && !validation.valid ? validation.error : undefined)\n const isSuccess =\n !hasError && (success !== undefined ? success : touched && validation.valid && Boolean(month && year))\n const resolvedColorClass = hasError ? 'color-error' : color ? `color-${color}` : undefined\n\n const containerClasses = cn(\n 'container',\n `field-${variant}`,\n `field-${size}`,\n focused && 'focused',\n hasError && 'input-error',\n isSuccess && !hasError && 'input-success',\n resolvedColorClass,\n disabled && 'disabled',\n rounded && 'rounded'\n )\n\n const monthLabel = month || 'MM'\n const yearLabel = year || 'YYYY'\n\n return (\n <div\n ref={rootRef}\n className={cn('input', 'input-exp-date', resolvedColorClass, fullWidth && 'full-width', className)}\n style={style}\n onFocusCapture={handleRootFocus}\n onBlurCapture={handleRootBlur}\n >\n {label && (\n <label\n htmlFor={id}\n className={cn(\n 'field-label',\n focused && 'focused',\n hasError && 'error',\n isSuccess && !hasError && 'success',\n required && 'required',\n labelClassName\n )}\n >\n {label}\n </label>\n )}\n\n <div className={containerClasses} onClick={focusHiddenInput}>\n {startIcon && <span className=\"start-icon\">{startIcon}</span>}\n\n <input\n ref={ref ?? inputRef}\n type=\"text\"\n value={currentValue}\n name={name}\n id={id}\n readOnly\n required={required}\n autoFocus={autoFocus}\n className=\"input-exp-date-native\"\n tabIndex={-1}\n aria-hidden=\"true\"\n onChange={onChange}\n onFocus={onFocus}\n onBlur={onBlur}\n />\n\n <div className=\"input-exp-date-segments\" aria-label=\"Expiration date\">\n {segmentDisabled ? (\n <span className={cn('input-exp-date-trigger', !month && 'placeholder', 'static')}>\n <span>{monthLabel}</span>\n </span>\n ) : (\n <MDropdownMenu\n trigger={\n <span\n className={cn(\n 'input-exp-date-trigger',\n monthMenuOpen && 'open',\n !month && 'placeholder'\n )}\n onMouseDown={focusHiddenInput}\n >\n <span>{monthLabel}</span>\n <MChevronDownIcon size={16} />\n </span>\n }\n openOn=\"click\"\n closeOnSelect\n onOpenChange={setMonthMenuOpen}\n popoverClassName=\"input-exp-date-popover\"\n >\n {Array.from({length: 12}, (_, index) => {\n const option = String(index + 1).padStart(2, '0')\n\n return (\n <MDropdownItem\n key={option}\n label={option}\n active={month === option}\n onClick={() => handleSelectMonth(option)}\n />\n )\n })}\n </MDropdownMenu>\n )}\n\n <span className=\"input-exp-date-separator\">/</span>\n\n {segmentDisabled ? (\n <span className={cn('input-exp-date-trigger', !year && 'placeholder', 'static')}>\n <span>{yearLabel}</span>\n </span>\n ) : (\n <MDropdownMenu\n trigger={\n <span\n className={cn(\n 'input-exp-date-trigger',\n yearMenuOpen && 'open',\n !year && 'placeholder'\n )}\n onMouseDown={focusHiddenInput}\n >\n <span>{yearLabel}</span>\n <MChevronDownIcon size={16} />\n </span>\n }\n openOn=\"click\"\n closeOnSelect\n onOpenChange={setYearMenuOpen}\n popoverClassName=\"input-exp-date-popover\"\n >\n {yearOptions.map((option) => (\n <MDropdownItem\n key={option}\n label={String(option)}\n active={year === String(option)}\n onClick={() => handleSelectYear(String(option))}\n />\n ))}\n </MDropdownMenu>\n )}\n </div>\n\n {clearable && hasContent && !segmentDisabled && (\n <button\n type=\"button\"\n className=\"clear-btn clear-btn-base\"\n onClick={(event) => {\n event.stopPropagation()\n handleClear()\n }}\n tabIndex={-1}\n aria-label=\"Clear input\"\n >\n <MCloseIcon />\n </button>\n )}\n\n {endIcon && <span className=\"end-icon\">{endIcon}</span>}\n </div>\n\n {(resolvedErrorText || helperText) && (\n <div className=\"bottom-row\">\n <span>\n {resolvedErrorText && (\n <span id={id ? `${id}-error` : undefined} className=\"field-error\" role=\"alert\">\n {resolvedErrorText}\n </span>\n )}\n {!resolvedErrorText && helperText && (\n <span id={id ? `${id}-helper` : undefined} className=\"field-helper\">\n {helperText}\n </span>\n )}\n </span>\n </div>\n )}\n </div>\n )\n})\n","import {forwardRef, useCallback, useState} from 'react'\nimport type * as React from 'react'\nimport type {MInputCVCProps} from './MInputCVC.types'\nimport {MInput} from '../MInput'\nimport type {ValidationResult} from '../../../utils/validators'\nimport {MCheckIcon} from '../../../icons'\nimport {cn} from '../../../utils/cn'\nimport './MInputCVC.css'\n\nconst OK: ValidationResult = {valid: true}\n\nfunction stripDigits(value: string) {\n return value.replace(/\\D/g, '')\n}\n\nfunction validateCvc(value: string, length: 3 | 4): ValidationResult {\n if (!value) {\n return OK\n }\n\n const digits = stripDigits(value)\n\n if (digits.length !== length) {\n return {valid: false, error: `Security code must have ${length} digits`}\n }\n\n return OK\n}\n\nexport const MInputCVC = forwardRef<HTMLInputElement, MInputCVCProps>(function MInputCVC(\n {\n length = 3,\n validateOnBlur = true,\n validateOnChange = false,\n onValidationChange,\n onValueChange,\n value,\n defaultValue,\n onChange,\n onBlur,\n onKeyDown,\n error,\n errorText,\n success,\n placeholder,\n className,\n inputClassName,\n ...rest\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(() =>\n stripDigits(defaultValue?.toString() ?? '').slice(0, length)\n )\n const [validation, setValidation] = useState<ValidationResult>(OK)\n const [touched, setTouched] = useState(false)\n\n const currentValue = value !== undefined ? stripDigits(value.toString()).slice(0, length) : internalValue\n\n const runValidation = useCallback(\n (nextValue: string) => {\n const result = validateCvc(nextValue, length)\n setValidation(result)\n onValidationChange?.(result)\n return result\n },\n [length, onValidationChange]\n )\n\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const nextValue = stripDigits(event.target.value).slice(0, length)\n\n if (value === undefined) {\n setInternalValue(nextValue)\n }\n\n onValueChange?.(nextValue)\n\n if (validateOnChange && touched) {\n runValidation(nextValue)\n }\n\n onChange?.(event)\n },\n [length, onChange, onValueChange, runValidation, touched, validateOnChange, value]\n )\n\n const handleBlur = useCallback(\n (event: React.FocusEvent<HTMLInputElement>) => {\n setTouched(true)\n\n if (validateOnBlur && currentValue) {\n runValidation(currentValue)\n }\n\n onBlur?.(event)\n },\n [currentValue, onBlur, runValidation, validateOnBlur]\n )\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (['Backspace', 'Delete', 'Tab', 'ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(event.key)) {\n onKeyDown?.(event)\n return\n }\n\n if (event.ctrlKey || event.metaKey) {\n onKeyDown?.(event)\n return\n }\n\n if (!/^\\d$/.test(event.key)) {\n event.preventDefault()\n }\n\n onKeyDown?.(event)\n },\n [onKeyDown]\n )\n\n const isError = error || (touched && !validation.valid)\n const resolvedErrorText = errorText || (touched && !validation.valid ? validation.error : undefined)\n const isSuccess = !isError && (success !== undefined ? success : touched && currentValue.length === length)\n const endIcon = isSuccess ? <MCheckIcon /> : undefined\n\n return (\n <MInput\n {...rest}\n ref={ref}\n type=\"text\"\n inputMode=\"numeric\"\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n error={isError}\n errorText={resolvedErrorText}\n success={isSuccess}\n placeholder={placeholder ?? ''.padEnd(length, '0')}\n maxLength={length}\n endIcon={endIcon}\n inputClassName={cn('input-cvc-field', inputClassName)}\n className={className}\n />\n )\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MInputCVC-5NkYSxV8.cjs","names":[],"sources":["../src/components/inputs/MInputExpDate/MInputExpDate.tsx","../src/components/inputs/MInputCVC/MInputCVC.tsx"],"sourcesContent":["import {forwardRef, useCallback, useMemo, useRef, useState} from 'react'\nimport type * as React from 'react'\nimport type {MInputExpDateProps} from './MInputExpDate.types'\nimport {cn} from '../../../utils/cn'\nimport {useControllableString} from '../../../utils/useControllableString'\nimport type {ValidationResult} from '../../../utils/validators'\nimport {MCloseIcon, MChevronDownIcon} from '../../../icons'\nimport {MDropdownItem, MDropdownMenu} from '../../overlays'\nimport '../MInput/MInput.css'\nimport './MInputExpDate.css'\n\nconst OK: ValidationResult = {valid: true}\n\nfunction stripDigits(value: string) {\n return value.replace(/\\D/g, '')\n}\n\nfunction padMonth(value?: string) {\n if (!value) {\n return ''\n }\n\n return value.padStart(2, '0').slice(0, 2)\n}\n\nfunction formatValue(month?: string, year?: string) {\n const resolvedMonth = padMonth(month)\n const resolvedYear = year?.slice(0, 4) ?? ''\n\n if (!resolvedMonth && !resolvedYear) {\n return ''\n }\n\n if (!resolvedYear) {\n return resolvedMonth\n }\n\n return `${resolvedMonth}/${resolvedYear}`\n}\n\nfunction parseValue(value: string) {\n const digits = stripDigits(value).slice(0, 6)\n\n return {\n month: digits.slice(0, 2),\n year: digits.slice(2, 6),\n }\n}\n\nfunction resolveYearBounds(minYear?: number, maxYear?: number) {\n const currentYear = new Date().getFullYear()\n const resolvedMinYear = Math.max(minYear ?? currentYear, currentYear)\n const resolvedMaxYear = Math.max(maxYear ?? currentYear + 20, resolvedMinYear)\n\n return {\n resolvedMinYear,\n resolvedMaxYear,\n }\n}\n\nfunction validateExpDate(\n value: string,\n {minYear, maxYear}: Pick<MInputExpDateProps, 'minYear' | 'maxYear'>\n): ValidationResult {\n if (!value) {\n return OK\n }\n\n const {month: monthValue, year: yearValue} = parseValue(value)\n\n if (monthValue.length !== 2 || yearValue.length !== 4) {\n return {valid: false, error: 'Expiration date is incomplete'}\n }\n\n const month = parseInt(monthValue, 10)\n const year = parseInt(yearValue, 10)\n const {resolvedMinYear, resolvedMaxYear} = resolveYearBounds(minYear, maxYear)\n\n if (Number.isNaN(month) || month < 1 || month > 12) {\n return {valid: false, error: 'Use a valid month'}\n }\n\n if (Number.isNaN(year)) {\n return {valid: false, error: 'Use a valid year'}\n }\n\n if (year < resolvedMinYear) {\n return {valid: false, error: `Year must be ${resolvedMinYear} or later`}\n }\n\n if (year > resolvedMaxYear) {\n return {valid: false, error: `Year must be ${resolvedMaxYear} or earlier`}\n }\n\n const now = new Date()\n const currentMonth = now.getMonth() + 1\n const currentYear = now.getFullYear()\n\n if (year < currentYear || (year === currentYear && month < currentMonth)) {\n return {valid: false, error: 'Card has expired'}\n }\n\n return OK\n}\n\nexport const MInputExpDate = forwardRef<HTMLInputElement, MInputExpDateProps>(function MInputExpDate(\n {\n validateOnBlur = true,\n validateOnChange = false,\n minYear,\n maxYear,\n onValidationChange,\n onValueChange,\n value,\n defaultValue,\n name,\n id,\n disabled = false,\n readOnly = false,\n required = false,\n autoFocus = false,\n variant = 'outlined',\n size = 'md',\n color,\n fullWidth = false,\n rounded = false,\n label,\n helperText,\n errorText,\n startIcon,\n endIcon,\n clearable = false,\n error = false,\n success,\n onChange,\n onFocus,\n onBlur,\n onClear,\n className,\n style,\n labelClassName,\n },\n ref\n) {\n const inputRef = useRef<HTMLInputElement>(null)\n const rootRef = useRef<HTMLDivElement>(null)\n const {currentValue, setCurrentValue} = useControllableString(value, defaultValue)\n const [validation, setValidation] = useState<ValidationResult>(OK)\n const [touched, setTouched] = useState(false)\n const [focused, setFocused] = useState(false)\n const [monthMenuOpen, setMonthMenuOpen] = useState(false)\n const [yearMenuOpen, setYearMenuOpen] = useState(false)\n\n const {month, year} = parseValue(currentValue)\n const hasContent = Boolean(month || year)\n const segmentDisabled = disabled || readOnly\n const {resolvedMinYear, resolvedMaxYear} = resolveYearBounds(minYear, maxYear)\n const yearOptions = useMemo(\n () => Array.from({length: resolvedMaxYear - resolvedMinYear + 1}, (_, index) => resolvedMinYear + index),\n [resolvedMaxYear, resolvedMinYear]\n )\n\n const runValidation = useCallback(\n (formattedValue: string) => {\n const result = validateExpDate(formattedValue, {minYear, maxYear})\n setValidation(result)\n onValidationChange?.(result)\n return result\n },\n [maxYear, minYear, onValidationChange]\n )\n\n const syncValue = useCallback(\n (formattedValue: string) => {\n setCurrentValue(formattedValue)\n onValueChange?.(stripDigits(formattedValue), formattedValue)\n\n const input = (ref as React.RefObject<HTMLInputElement>)?.current ?? inputRef.current\n if (input) {\n const nativeSet = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')?.set\n nativeSet?.call(input, formattedValue)\n input.dispatchEvent(new Event('input', {bubbles: true}))\n }\n },\n [onValueChange, ref, setCurrentValue]\n )\n\n const updateValue = useCallback(\n (nextMonth?: string, nextYear?: string) => {\n const formattedValue = formatValue(nextMonth, nextYear)\n syncValue(formattedValue)\n\n if (validateOnChange && touched) {\n runValidation(formattedValue)\n }\n },\n [runValidation, syncValue, touched, validateOnChange]\n )\n\n const focusHiddenInput = useCallback(() => {\n const input = (ref as React.RefObject<HTMLInputElement>)?.current ?? inputRef.current\n input?.focus()\n }, [ref])\n\n const handleRootFocus = useCallback(\n (event: React.FocusEvent<HTMLDivElement>) => {\n if (focused) {\n return\n }\n\n setFocused(true)\n const input = (ref as React.RefObject<HTMLInputElement>)?.current ?? inputRef.current\n if (input && event.target !== input) {\n onFocus?.(event as unknown as React.FocusEvent<HTMLInputElement>)\n }\n },\n [focused, onFocus, ref]\n )\n\n const handleRootBlur = useCallback(\n (event: React.FocusEvent<HTMLDivElement>) => {\n const nextTarget = event.relatedTarget as Node | null\n\n if (nextTarget && rootRef.current?.contains(nextTarget)) {\n return\n }\n\n setFocused(false)\n setTouched(true)\n\n if (validateOnBlur && currentValue) {\n runValidation(currentValue)\n }\n\n onBlur?.(event as unknown as React.FocusEvent<HTMLInputElement>)\n },\n [currentValue, onBlur, runValidation, validateOnBlur]\n )\n\n const handleSelectMonth = useCallback(\n (nextMonth: string) => {\n focusHiddenInput()\n updateValue(nextMonth, year)\n },\n [focusHiddenInput, updateValue, year]\n )\n\n const handleSelectYear = useCallback(\n (nextYear: string) => {\n focusHiddenInput()\n updateValue(month, nextYear)\n },\n [focusHiddenInput, month, updateValue]\n )\n\n const handleClear = useCallback(() => {\n syncValue('')\n setTouched(false)\n setValidation(OK)\n onValidationChange?.(OK)\n onClear?.()\n focusHiddenInput()\n }, [focusHiddenInput, onClear, onValidationChange, syncValue])\n\n const hasError = error || (touched && !validation.valid)\n const resolvedErrorText = errorText || (touched && !validation.valid ? validation.error : undefined)\n const isSuccess =\n !hasError && (success !== undefined ? success : touched && validation.valid && Boolean(month && year))\n const resolvedColorClass = hasError ? 'color-error' : color ? `color-${color}` : undefined\n\n const containerClasses = cn(\n 'container',\n `field-${variant}`,\n `field-${size}`,\n focused && 'focused',\n hasError && 'input-error',\n isSuccess && !hasError && 'input-success',\n resolvedColorClass,\n disabled && 'disabled',\n rounded && 'rounded'\n )\n\n const monthLabel = month || 'MM'\n const yearLabel = year || 'YYYY'\n\n return (\n <div\n ref={rootRef}\n className={cn('input', 'input-exp-date', resolvedColorClass, fullWidth && 'full-width', className)}\n style={style}\n onFocusCapture={handleRootFocus}\n onBlurCapture={handleRootBlur}\n >\n {label && (\n <label\n htmlFor={id}\n className={cn(\n 'field-label',\n focused && 'focused',\n hasError && 'error',\n isSuccess && !hasError && 'success',\n required && 'required',\n labelClassName\n )}\n >\n {label}\n </label>\n )}\n\n <div className={containerClasses} onClick={focusHiddenInput}>\n {startIcon && <span className=\"start-icon\">{startIcon}</span>}\n\n <input\n ref={ref ?? inputRef}\n type=\"text\"\n value={currentValue}\n name={name}\n id={id}\n readOnly\n required={required}\n autoFocus={autoFocus}\n className=\"input-exp-date-native\"\n tabIndex={-1}\n aria-hidden=\"true\"\n onChange={onChange}\n onFocus={onFocus}\n onBlur={onBlur}\n />\n\n <div className=\"input-exp-date-segments\" aria-label=\"Expiration date\">\n {segmentDisabled ? (\n <span className={cn('input-exp-date-trigger', !month && 'placeholder', 'static')}>\n <span>{monthLabel}</span>\n </span>\n ) : (\n <MDropdownMenu\n trigger={\n <span\n className={cn(\n 'input-exp-date-trigger',\n monthMenuOpen && 'open',\n !month && 'placeholder'\n )}\n onMouseDown={focusHiddenInput}\n >\n <span>{monthLabel}</span>\n <MChevronDownIcon size={16} />\n </span>\n }\n openOn=\"click\"\n closeOnSelect\n onOpenChange={setMonthMenuOpen}\n popoverClassName=\"input-exp-date-popover\"\n >\n {Array.from({length: 12}, (_, index) => {\n const option = String(index + 1).padStart(2, '0')\n\n return (\n <MDropdownItem\n key={option}\n label={option}\n active={month === option}\n onClick={() => handleSelectMonth(option)}\n />\n )\n })}\n </MDropdownMenu>\n )}\n\n <span className=\"input-exp-date-separator\">/</span>\n\n {segmentDisabled ? (\n <span className={cn('input-exp-date-trigger', !year && 'placeholder', 'static')}>\n <span>{yearLabel}</span>\n </span>\n ) : (\n <MDropdownMenu\n trigger={\n <span\n className={cn(\n 'input-exp-date-trigger',\n yearMenuOpen && 'open',\n !year && 'placeholder'\n )}\n onMouseDown={focusHiddenInput}\n >\n <span>{yearLabel}</span>\n <MChevronDownIcon size={16} />\n </span>\n }\n openOn=\"click\"\n closeOnSelect\n onOpenChange={setYearMenuOpen}\n popoverClassName=\"input-exp-date-popover\"\n >\n {yearOptions.map((option) => (\n <MDropdownItem\n key={option}\n label={String(option)}\n active={year === String(option)}\n onClick={() => handleSelectYear(String(option))}\n />\n ))}\n </MDropdownMenu>\n )}\n </div>\n\n {clearable && hasContent && !segmentDisabled && (\n <button\n type=\"button\"\n className=\"clear-btn clear-btn-base\"\n onClick={(event) => {\n event.stopPropagation()\n handleClear()\n }}\n tabIndex={-1}\n aria-label=\"Clear input\"\n >\n <MCloseIcon />\n </button>\n )}\n\n {endIcon && <span className=\"end-icon\">{endIcon}</span>}\n </div>\n\n {(resolvedErrorText || helperText) && (\n <div className=\"bottom-row\">\n <span>\n {resolvedErrorText && (\n <span id={id ? `${id}-error` : undefined} className=\"field-error\" role=\"alert\">\n {resolvedErrorText}\n </span>\n )}\n {!resolvedErrorText && helperText && (\n <span id={id ? `${id}-helper` : undefined} className=\"field-helper\">\n {helperText}\n </span>\n )}\n </span>\n </div>\n )}\n </div>\n )\n})\n","import {forwardRef, useCallback, useState} from 'react'\nimport type * as React from 'react'\nimport type {MInputCVCProps} from './MInputCVC.types'\nimport {MInput} from '../MInput'\nimport type {ValidationResult} from '../../../utils/validators'\nimport {MCheckIcon} from '../../../icons'\nimport {cn} from '../../../utils/cn'\nimport './MInputCVC.css'\n\nconst OK: ValidationResult = {valid: true}\n\nfunction stripDigits(value: string) {\n return value.replace(/\\D/g, '')\n}\n\nfunction validateCvc(value: string, length: 3 | 4): ValidationResult {\n if (!value) {\n return OK\n }\n\n const digits = stripDigits(value)\n\n if (digits.length !== length) {\n return {valid: false, error: `Security code must have ${length} digits`}\n }\n\n return OK\n}\n\nexport const MInputCVC = forwardRef<HTMLInputElement, MInputCVCProps>(function MInputCVC(\n {\n length = 3,\n validateOnBlur = true,\n validateOnChange = false,\n onValidationChange,\n onValueChange,\n value,\n defaultValue,\n onChange,\n onBlur,\n onKeyDown,\n error,\n errorText,\n success,\n placeholder,\n className,\n inputClassName,\n ...rest\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(() =>\n stripDigits(defaultValue?.toString() ?? '').slice(0, length)\n )\n const [validation, setValidation] = useState<ValidationResult>(OK)\n const [touched, setTouched] = useState(false)\n\n const currentValue = value !== undefined ? stripDigits(value.toString()).slice(0, length) : internalValue\n\n const runValidation = useCallback(\n (nextValue: string) => {\n const result = validateCvc(nextValue, length)\n setValidation(result)\n onValidationChange?.(result)\n return result\n },\n [length, onValidationChange]\n )\n\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const nextValue = stripDigits(event.target.value).slice(0, length)\n\n if (value === undefined) {\n setInternalValue(nextValue)\n }\n\n onValueChange?.(nextValue)\n\n if (validateOnChange && touched) {\n runValidation(nextValue)\n }\n\n onChange?.(event)\n },\n [length, onChange, onValueChange, runValidation, touched, validateOnChange, value]\n )\n\n const handleBlur = useCallback(\n (event: React.FocusEvent<HTMLInputElement>) => {\n setTouched(true)\n\n if (validateOnBlur && currentValue) {\n runValidation(currentValue)\n }\n\n onBlur?.(event)\n },\n [currentValue, onBlur, runValidation, validateOnBlur]\n )\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (['Backspace', 'Delete', 'Tab', 'ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(event.key)) {\n onKeyDown?.(event)\n return\n }\n\n if (event.ctrlKey || event.metaKey) {\n onKeyDown?.(event)\n return\n }\n\n if (!/^\\d$/.test(event.key)) {\n event.preventDefault()\n }\n\n onKeyDown?.(event)\n },\n [onKeyDown]\n )\n\n const isError = error || (touched && !validation.valid)\n const resolvedErrorText = errorText || (touched && !validation.valid ? validation.error : undefined)\n const isSuccess = !isError && (success !== undefined ? success : touched && currentValue.length === length)\n const endIcon = isSuccess ? <MCheckIcon /> : undefined\n\n return (\n <MInput\n {...rest}\n ref={ref}\n type=\"text\"\n inputMode=\"numeric\"\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n error={isError}\n errorText={resolvedErrorText}\n success={isSuccess}\n placeholder={placeholder ?? ''.padEnd(length, '0')}\n maxLength={length}\n endIcon={endIcon}\n inputClassName={cn('input-cvc-field', inputClassName)}\n className={className}\n />\n )\n})\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { Ii as e, Li as t, Ni as n } from "./icons-
|
|
2
|
-
import { t as r } from "./cn-
|
|
3
|
-
import { n as i, t as a } from "./MInput-
|
|
4
|
-
import { i as o, r as s } from "./MDropdownMenu-
|
|
1
|
+
import { Ii as e, Li as t, Ni as n } from "./icons-CfpYxnfg.js";
|
|
2
|
+
import { t as r } from "./cn-YER3QsV1.js";
|
|
3
|
+
import { n as i, t as a } from "./MInput-bzSwK880.js";
|
|
4
|
+
import { i as o, r as s } from "./MDropdownMenu-D79Cm5aS.js";
|
|
5
5
|
import { forwardRef as c, useCallback as l, useMemo as u, useRef as d, useState as f } from "react";
|
|
6
6
|
import { jsx as p, jsxs as m } from "react/jsx-runtime";
|
|
7
7
|
//#region src/components/inputs/MInputExpDate/MInputExpDate.tsx
|
|
@@ -317,4 +317,4 @@ var w = c(function({ length: t = 3, validateOnBlur: n = !0, validateOnChange: i
|
|
|
317
317
|
//#endregion
|
|
318
318
|
export { x as n, w as t };
|
|
319
319
|
|
|
320
|
-
//# sourceMappingURL=MInputCVC-
|
|
320
|
+
//# sourceMappingURL=MInputCVC-BHpMHTO5.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MInputCVC-CN91scmw.js","names":[],"sources":["../src/components/inputs/MInputExpDate/MInputExpDate.tsx","../src/components/inputs/MInputCVC/MInputCVC.tsx"],"sourcesContent":["import {forwardRef, useCallback, useMemo, useRef, useState} from 'react'\nimport type * as React from 'react'\nimport type {MInputExpDateProps} from './MInputExpDate.types'\nimport {cn} from '../../../utils/cn'\nimport {useControllableString} from '../../../utils/useControllableString'\nimport type {ValidationResult} from '../../../utils/validators'\nimport {MCloseIcon, MChevronDownIcon} from '../../../icons'\nimport {MDropdownItem, MDropdownMenu} from '../../overlays'\nimport '../MInput/MInput.css'\nimport './MInputExpDate.css'\n\nconst OK: ValidationResult = {valid: true}\n\nfunction stripDigits(value: string) {\n return value.replace(/\\D/g, '')\n}\n\nfunction padMonth(value?: string) {\n if (!value) {\n return ''\n }\n\n return value.padStart(2, '0').slice(0, 2)\n}\n\nfunction formatValue(month?: string, year?: string) {\n const resolvedMonth = padMonth(month)\n const resolvedYear = year?.slice(0, 4) ?? ''\n\n if (!resolvedMonth && !resolvedYear) {\n return ''\n }\n\n if (!resolvedYear) {\n return resolvedMonth\n }\n\n return `${resolvedMonth}/${resolvedYear}`\n}\n\nfunction parseValue(value: string) {\n const digits = stripDigits(value).slice(0, 6)\n\n return {\n month: digits.slice(0, 2),\n year: digits.slice(2, 6),\n }\n}\n\nfunction resolveYearBounds(minYear?: number, maxYear?: number) {\n const currentYear = new Date().getFullYear()\n const resolvedMinYear = Math.max(minYear ?? currentYear, currentYear)\n const resolvedMaxYear = Math.max(maxYear ?? currentYear + 20, resolvedMinYear)\n\n return {\n resolvedMinYear,\n resolvedMaxYear,\n }\n}\n\nfunction validateExpDate(\n value: string,\n {minYear, maxYear}: Pick<MInputExpDateProps, 'minYear' | 'maxYear'>\n): ValidationResult {\n if (!value) {\n return OK\n }\n\n const {month: monthValue, year: yearValue} = parseValue(value)\n\n if (monthValue.length !== 2 || yearValue.length !== 4) {\n return {valid: false, error: 'Expiration date is incomplete'}\n }\n\n const month = parseInt(monthValue, 10)\n const year = parseInt(yearValue, 10)\n const {resolvedMinYear, resolvedMaxYear} = resolveYearBounds(minYear, maxYear)\n\n if (Number.isNaN(month) || month < 1 || month > 12) {\n return {valid: false, error: 'Use a valid month'}\n }\n\n if (Number.isNaN(year)) {\n return {valid: false, error: 'Use a valid year'}\n }\n\n if (year < resolvedMinYear) {\n return {valid: false, error: `Year must be ${resolvedMinYear} or later`}\n }\n\n if (year > resolvedMaxYear) {\n return {valid: false, error: `Year must be ${resolvedMaxYear} or earlier`}\n }\n\n const now = new Date()\n const currentMonth = now.getMonth() + 1\n const currentYear = now.getFullYear()\n\n if (year < currentYear || (year === currentYear && month < currentMonth)) {\n return {valid: false, error: 'Card has expired'}\n }\n\n return OK\n}\n\nexport const MInputExpDate = forwardRef<HTMLInputElement, MInputExpDateProps>(function MInputExpDate(\n {\n validateOnBlur = true,\n validateOnChange = false,\n minYear,\n maxYear,\n onValidationChange,\n onValueChange,\n value,\n defaultValue,\n name,\n id,\n disabled = false,\n readOnly = false,\n required = false,\n autoFocus = false,\n variant = 'outlined',\n size = 'md',\n color,\n fullWidth = false,\n rounded = false,\n label,\n helperText,\n errorText,\n startIcon,\n endIcon,\n clearable = false,\n error = false,\n success,\n onChange,\n onFocus,\n onBlur,\n onClear,\n className,\n style,\n labelClassName,\n },\n ref\n) {\n const inputRef = useRef<HTMLInputElement>(null)\n const rootRef = useRef<HTMLDivElement>(null)\n const {currentValue, setCurrentValue} = useControllableString(value, defaultValue)\n const [validation, setValidation] = useState<ValidationResult>(OK)\n const [touched, setTouched] = useState(false)\n const [focused, setFocused] = useState(false)\n const [monthMenuOpen, setMonthMenuOpen] = useState(false)\n const [yearMenuOpen, setYearMenuOpen] = useState(false)\n\n const {month, year} = parseValue(currentValue)\n const hasContent = Boolean(month || year)\n const segmentDisabled = disabled || readOnly\n const {resolvedMinYear, resolvedMaxYear} = resolveYearBounds(minYear, maxYear)\n const yearOptions = useMemo(\n () => Array.from({length: resolvedMaxYear - resolvedMinYear + 1}, (_, index) => resolvedMinYear + index),\n [resolvedMaxYear, resolvedMinYear]\n )\n\n const runValidation = useCallback(\n (formattedValue: string) => {\n const result = validateExpDate(formattedValue, {minYear, maxYear})\n setValidation(result)\n onValidationChange?.(result)\n return result\n },\n [maxYear, minYear, onValidationChange]\n )\n\n const syncValue = useCallback(\n (formattedValue: string) => {\n setCurrentValue(formattedValue)\n onValueChange?.(stripDigits(formattedValue), formattedValue)\n\n const input = (ref as React.RefObject<HTMLInputElement>)?.current ?? inputRef.current\n if (input) {\n const nativeSet = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')?.set\n nativeSet?.call(input, formattedValue)\n input.dispatchEvent(new Event('input', {bubbles: true}))\n }\n },\n [onValueChange, ref, setCurrentValue]\n )\n\n const updateValue = useCallback(\n (nextMonth?: string, nextYear?: string) => {\n const formattedValue = formatValue(nextMonth, nextYear)\n syncValue(formattedValue)\n\n if (validateOnChange && touched) {\n runValidation(formattedValue)\n }\n },\n [runValidation, syncValue, touched, validateOnChange]\n )\n\n const focusHiddenInput = useCallback(() => {\n const input = (ref as React.RefObject<HTMLInputElement>)?.current ?? inputRef.current\n input?.focus()\n }, [ref])\n\n const handleRootFocus = useCallback(\n (event: React.FocusEvent<HTMLDivElement>) => {\n if (focused) {\n return\n }\n\n setFocused(true)\n const input = (ref as React.RefObject<HTMLInputElement>)?.current ?? inputRef.current\n if (input && event.target !== input) {\n onFocus?.(event as unknown as React.FocusEvent<HTMLInputElement>)\n }\n },\n [focused, onFocus, ref]\n )\n\n const handleRootBlur = useCallback(\n (event: React.FocusEvent<HTMLDivElement>) => {\n const nextTarget = event.relatedTarget as Node | null\n\n if (nextTarget && rootRef.current?.contains(nextTarget)) {\n return\n }\n\n setFocused(false)\n setTouched(true)\n\n if (validateOnBlur && currentValue) {\n runValidation(currentValue)\n }\n\n onBlur?.(event as unknown as React.FocusEvent<HTMLInputElement>)\n },\n [currentValue, onBlur, runValidation, validateOnBlur]\n )\n\n const handleSelectMonth = useCallback(\n (nextMonth: string) => {\n focusHiddenInput()\n updateValue(nextMonth, year)\n },\n [focusHiddenInput, updateValue, year]\n )\n\n const handleSelectYear = useCallback(\n (nextYear: string) => {\n focusHiddenInput()\n updateValue(month, nextYear)\n },\n [focusHiddenInput, month, updateValue]\n )\n\n const handleClear = useCallback(() => {\n syncValue('')\n setTouched(false)\n setValidation(OK)\n onValidationChange?.(OK)\n onClear?.()\n focusHiddenInput()\n }, [focusHiddenInput, onClear, onValidationChange, syncValue])\n\n const hasError = error || (touched && !validation.valid)\n const resolvedErrorText = errorText || (touched && !validation.valid ? validation.error : undefined)\n const isSuccess =\n !hasError && (success !== undefined ? success : touched && validation.valid && Boolean(month && year))\n const resolvedColorClass = hasError ? 'color-error' : color ? `color-${color}` : undefined\n\n const containerClasses = cn(\n 'container',\n `field-${variant}`,\n `field-${size}`,\n focused && 'focused',\n hasError && 'input-error',\n isSuccess && !hasError && 'input-success',\n resolvedColorClass,\n disabled && 'disabled',\n rounded && 'rounded'\n )\n\n const monthLabel = month || 'MM'\n const yearLabel = year || 'YYYY'\n\n return (\n <div\n ref={rootRef}\n className={cn('input', 'input-exp-date', resolvedColorClass, fullWidth && 'full-width', className)}\n style={style}\n onFocusCapture={handleRootFocus}\n onBlurCapture={handleRootBlur}\n >\n {label && (\n <label\n htmlFor={id}\n className={cn(\n 'field-label',\n focused && 'focused',\n hasError && 'error',\n isSuccess && !hasError && 'success',\n required && 'required',\n labelClassName\n )}\n >\n {label}\n </label>\n )}\n\n <div className={containerClasses} onClick={focusHiddenInput}>\n {startIcon && <span className=\"start-icon\">{startIcon}</span>}\n\n <input\n ref={ref ?? inputRef}\n type=\"text\"\n value={currentValue}\n name={name}\n id={id}\n readOnly\n required={required}\n autoFocus={autoFocus}\n className=\"input-exp-date-native\"\n tabIndex={-1}\n aria-hidden=\"true\"\n onChange={onChange}\n onFocus={onFocus}\n onBlur={onBlur}\n />\n\n <div className=\"input-exp-date-segments\" aria-label=\"Expiration date\">\n {segmentDisabled ? (\n <span className={cn('input-exp-date-trigger', !month && 'placeholder', 'static')}>\n <span>{monthLabel}</span>\n </span>\n ) : (\n <MDropdownMenu\n trigger={\n <span\n className={cn(\n 'input-exp-date-trigger',\n monthMenuOpen && 'open',\n !month && 'placeholder'\n )}\n onMouseDown={focusHiddenInput}\n >\n <span>{monthLabel}</span>\n <MChevronDownIcon size={16} />\n </span>\n }\n openOn=\"click\"\n closeOnSelect\n onOpenChange={setMonthMenuOpen}\n popoverClassName=\"input-exp-date-popover\"\n >\n {Array.from({length: 12}, (_, index) => {\n const option = String(index + 1).padStart(2, '0')\n\n return (\n <MDropdownItem\n key={option}\n label={option}\n active={month === option}\n onClick={() => handleSelectMonth(option)}\n />\n )\n })}\n </MDropdownMenu>\n )}\n\n <span className=\"input-exp-date-separator\">/</span>\n\n {segmentDisabled ? (\n <span className={cn('input-exp-date-trigger', !year && 'placeholder', 'static')}>\n <span>{yearLabel}</span>\n </span>\n ) : (\n <MDropdownMenu\n trigger={\n <span\n className={cn(\n 'input-exp-date-trigger',\n yearMenuOpen && 'open',\n !year && 'placeholder'\n )}\n onMouseDown={focusHiddenInput}\n >\n <span>{yearLabel}</span>\n <MChevronDownIcon size={16} />\n </span>\n }\n openOn=\"click\"\n closeOnSelect\n onOpenChange={setYearMenuOpen}\n popoverClassName=\"input-exp-date-popover\"\n >\n {yearOptions.map((option) => (\n <MDropdownItem\n key={option}\n label={String(option)}\n active={year === String(option)}\n onClick={() => handleSelectYear(String(option))}\n />\n ))}\n </MDropdownMenu>\n )}\n </div>\n\n {clearable && hasContent && !segmentDisabled && (\n <button\n type=\"button\"\n className=\"clear-btn clear-btn-base\"\n onClick={(event) => {\n event.stopPropagation()\n handleClear()\n }}\n tabIndex={-1}\n aria-label=\"Clear input\"\n >\n <MCloseIcon />\n </button>\n )}\n\n {endIcon && <span className=\"end-icon\">{endIcon}</span>}\n </div>\n\n {(resolvedErrorText || helperText) && (\n <div className=\"bottom-row\">\n <span>\n {resolvedErrorText && (\n <span id={id ? `${id}-error` : undefined} className=\"field-error\" role=\"alert\">\n {resolvedErrorText}\n </span>\n )}\n {!resolvedErrorText && helperText && (\n <span id={id ? `${id}-helper` : undefined} className=\"field-helper\">\n {helperText}\n </span>\n )}\n </span>\n </div>\n )}\n </div>\n )\n})\n","import {forwardRef, useCallback, useState} from 'react'\nimport type * as React from 'react'\nimport type {MInputCVCProps} from './MInputCVC.types'\nimport {MInput} from '../MInput'\nimport type {ValidationResult} from '../../../utils/validators'\nimport {MCheckIcon} from '../../../icons'\nimport {cn} from '../../../utils/cn'\nimport './MInputCVC.css'\n\nconst OK: ValidationResult = {valid: true}\n\nfunction stripDigits(value: string) {\n return value.replace(/\\D/g, '')\n}\n\nfunction validateCvc(value: string, length: 3 | 4): ValidationResult {\n if (!value) {\n return OK\n }\n\n const digits = stripDigits(value)\n\n if (digits.length !== length) {\n return {valid: false, error: `Security code must have ${length} digits`}\n }\n\n return OK\n}\n\nexport const MInputCVC = forwardRef<HTMLInputElement, MInputCVCProps>(function MInputCVC(\n {\n length = 3,\n validateOnBlur = true,\n validateOnChange = false,\n onValidationChange,\n onValueChange,\n value,\n defaultValue,\n onChange,\n onBlur,\n onKeyDown,\n error,\n errorText,\n success,\n placeholder,\n className,\n inputClassName,\n ...rest\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(() =>\n stripDigits(defaultValue?.toString() ?? '').slice(0, length)\n )\n const [validation, setValidation] = useState<ValidationResult>(OK)\n const [touched, setTouched] = useState(false)\n\n const currentValue = value !== undefined ? stripDigits(value.toString()).slice(0, length) : internalValue\n\n const runValidation = useCallback(\n (nextValue: string) => {\n const result = validateCvc(nextValue, length)\n setValidation(result)\n onValidationChange?.(result)\n return result\n },\n [length, onValidationChange]\n )\n\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const nextValue = stripDigits(event.target.value).slice(0, length)\n\n if (value === undefined) {\n setInternalValue(nextValue)\n }\n\n onValueChange?.(nextValue)\n\n if (validateOnChange && touched) {\n runValidation(nextValue)\n }\n\n onChange?.(event)\n },\n [length, onChange, onValueChange, runValidation, touched, validateOnChange, value]\n )\n\n const handleBlur = useCallback(\n (event: React.FocusEvent<HTMLInputElement>) => {\n setTouched(true)\n\n if (validateOnBlur && currentValue) {\n runValidation(currentValue)\n }\n\n onBlur?.(event)\n },\n [currentValue, onBlur, runValidation, validateOnBlur]\n )\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (['Backspace', 'Delete', 'Tab', 'ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(event.key)) {\n onKeyDown?.(event)\n return\n }\n\n if (event.ctrlKey || event.metaKey) {\n onKeyDown?.(event)\n return\n }\n\n if (!/^\\d$/.test(event.key)) {\n event.preventDefault()\n }\n\n onKeyDown?.(event)\n },\n [onKeyDown]\n )\n\n const isError = error || (touched && !validation.valid)\n const resolvedErrorText = errorText || (touched && !validation.valid ? validation.error : undefined)\n const isSuccess = !isError && (success !== undefined ? success : touched && currentValue.length === length)\n const endIcon = isSuccess ? <MCheckIcon /> : undefined\n\n return (\n <MInput\n {...rest}\n ref={ref}\n type=\"text\"\n inputMode=\"numeric\"\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n error={isError}\n errorText={resolvedErrorText}\n success={isSuccess}\n placeholder={placeholder ?? ''.padEnd(length, '0')}\n maxLength={length}\n endIcon={endIcon}\n inputClassName={cn('input-cvc-field', inputClassName)}\n className={className}\n />\n )\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MInputCVC-BHpMHTO5.js","names":[],"sources":["../src/components/inputs/MInputExpDate/MInputExpDate.tsx","../src/components/inputs/MInputCVC/MInputCVC.tsx"],"sourcesContent":["import {forwardRef, useCallback, useMemo, useRef, useState} from 'react'\nimport type * as React from 'react'\nimport type {MInputExpDateProps} from './MInputExpDate.types'\nimport {cn} from '../../../utils/cn'\nimport {useControllableString} from '../../../utils/useControllableString'\nimport type {ValidationResult} from '../../../utils/validators'\nimport {MCloseIcon, MChevronDownIcon} from '../../../icons'\nimport {MDropdownItem, MDropdownMenu} from '../../overlays'\nimport '../MInput/MInput.css'\nimport './MInputExpDate.css'\n\nconst OK: ValidationResult = {valid: true}\n\nfunction stripDigits(value: string) {\n return value.replace(/\\D/g, '')\n}\n\nfunction padMonth(value?: string) {\n if (!value) {\n return ''\n }\n\n return value.padStart(2, '0').slice(0, 2)\n}\n\nfunction formatValue(month?: string, year?: string) {\n const resolvedMonth = padMonth(month)\n const resolvedYear = year?.slice(0, 4) ?? ''\n\n if (!resolvedMonth && !resolvedYear) {\n return ''\n }\n\n if (!resolvedYear) {\n return resolvedMonth\n }\n\n return `${resolvedMonth}/${resolvedYear}`\n}\n\nfunction parseValue(value: string) {\n const digits = stripDigits(value).slice(0, 6)\n\n return {\n month: digits.slice(0, 2),\n year: digits.slice(2, 6),\n }\n}\n\nfunction resolveYearBounds(minYear?: number, maxYear?: number) {\n const currentYear = new Date().getFullYear()\n const resolvedMinYear = Math.max(minYear ?? currentYear, currentYear)\n const resolvedMaxYear = Math.max(maxYear ?? currentYear + 20, resolvedMinYear)\n\n return {\n resolvedMinYear,\n resolvedMaxYear,\n }\n}\n\nfunction validateExpDate(\n value: string,\n {minYear, maxYear}: Pick<MInputExpDateProps, 'minYear' | 'maxYear'>\n): ValidationResult {\n if (!value) {\n return OK\n }\n\n const {month: monthValue, year: yearValue} = parseValue(value)\n\n if (monthValue.length !== 2 || yearValue.length !== 4) {\n return {valid: false, error: 'Expiration date is incomplete'}\n }\n\n const month = parseInt(monthValue, 10)\n const year = parseInt(yearValue, 10)\n const {resolvedMinYear, resolvedMaxYear} = resolveYearBounds(minYear, maxYear)\n\n if (Number.isNaN(month) || month < 1 || month > 12) {\n return {valid: false, error: 'Use a valid month'}\n }\n\n if (Number.isNaN(year)) {\n return {valid: false, error: 'Use a valid year'}\n }\n\n if (year < resolvedMinYear) {\n return {valid: false, error: `Year must be ${resolvedMinYear} or later`}\n }\n\n if (year > resolvedMaxYear) {\n return {valid: false, error: `Year must be ${resolvedMaxYear} or earlier`}\n }\n\n const now = new Date()\n const currentMonth = now.getMonth() + 1\n const currentYear = now.getFullYear()\n\n if (year < currentYear || (year === currentYear && month < currentMonth)) {\n return {valid: false, error: 'Card has expired'}\n }\n\n return OK\n}\n\nexport const MInputExpDate = forwardRef<HTMLInputElement, MInputExpDateProps>(function MInputExpDate(\n {\n validateOnBlur = true,\n validateOnChange = false,\n minYear,\n maxYear,\n onValidationChange,\n onValueChange,\n value,\n defaultValue,\n name,\n id,\n disabled = false,\n readOnly = false,\n required = false,\n autoFocus = false,\n variant = 'outlined',\n size = 'md',\n color,\n fullWidth = false,\n rounded = false,\n label,\n helperText,\n errorText,\n startIcon,\n endIcon,\n clearable = false,\n error = false,\n success,\n onChange,\n onFocus,\n onBlur,\n onClear,\n className,\n style,\n labelClassName,\n },\n ref\n) {\n const inputRef = useRef<HTMLInputElement>(null)\n const rootRef = useRef<HTMLDivElement>(null)\n const {currentValue, setCurrentValue} = useControllableString(value, defaultValue)\n const [validation, setValidation] = useState<ValidationResult>(OK)\n const [touched, setTouched] = useState(false)\n const [focused, setFocused] = useState(false)\n const [monthMenuOpen, setMonthMenuOpen] = useState(false)\n const [yearMenuOpen, setYearMenuOpen] = useState(false)\n\n const {month, year} = parseValue(currentValue)\n const hasContent = Boolean(month || year)\n const segmentDisabled = disabled || readOnly\n const {resolvedMinYear, resolvedMaxYear} = resolveYearBounds(minYear, maxYear)\n const yearOptions = useMemo(\n () => Array.from({length: resolvedMaxYear - resolvedMinYear + 1}, (_, index) => resolvedMinYear + index),\n [resolvedMaxYear, resolvedMinYear]\n )\n\n const runValidation = useCallback(\n (formattedValue: string) => {\n const result = validateExpDate(formattedValue, {minYear, maxYear})\n setValidation(result)\n onValidationChange?.(result)\n return result\n },\n [maxYear, minYear, onValidationChange]\n )\n\n const syncValue = useCallback(\n (formattedValue: string) => {\n setCurrentValue(formattedValue)\n onValueChange?.(stripDigits(formattedValue), formattedValue)\n\n const input = (ref as React.RefObject<HTMLInputElement>)?.current ?? inputRef.current\n if (input) {\n const nativeSet = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')?.set\n nativeSet?.call(input, formattedValue)\n input.dispatchEvent(new Event('input', {bubbles: true}))\n }\n },\n [onValueChange, ref, setCurrentValue]\n )\n\n const updateValue = useCallback(\n (nextMonth?: string, nextYear?: string) => {\n const formattedValue = formatValue(nextMonth, nextYear)\n syncValue(formattedValue)\n\n if (validateOnChange && touched) {\n runValidation(formattedValue)\n }\n },\n [runValidation, syncValue, touched, validateOnChange]\n )\n\n const focusHiddenInput = useCallback(() => {\n const input = (ref as React.RefObject<HTMLInputElement>)?.current ?? inputRef.current\n input?.focus()\n }, [ref])\n\n const handleRootFocus = useCallback(\n (event: React.FocusEvent<HTMLDivElement>) => {\n if (focused) {\n return\n }\n\n setFocused(true)\n const input = (ref as React.RefObject<HTMLInputElement>)?.current ?? inputRef.current\n if (input && event.target !== input) {\n onFocus?.(event as unknown as React.FocusEvent<HTMLInputElement>)\n }\n },\n [focused, onFocus, ref]\n )\n\n const handleRootBlur = useCallback(\n (event: React.FocusEvent<HTMLDivElement>) => {\n const nextTarget = event.relatedTarget as Node | null\n\n if (nextTarget && rootRef.current?.contains(nextTarget)) {\n return\n }\n\n setFocused(false)\n setTouched(true)\n\n if (validateOnBlur && currentValue) {\n runValidation(currentValue)\n }\n\n onBlur?.(event as unknown as React.FocusEvent<HTMLInputElement>)\n },\n [currentValue, onBlur, runValidation, validateOnBlur]\n )\n\n const handleSelectMonth = useCallback(\n (nextMonth: string) => {\n focusHiddenInput()\n updateValue(nextMonth, year)\n },\n [focusHiddenInput, updateValue, year]\n )\n\n const handleSelectYear = useCallback(\n (nextYear: string) => {\n focusHiddenInput()\n updateValue(month, nextYear)\n },\n [focusHiddenInput, month, updateValue]\n )\n\n const handleClear = useCallback(() => {\n syncValue('')\n setTouched(false)\n setValidation(OK)\n onValidationChange?.(OK)\n onClear?.()\n focusHiddenInput()\n }, [focusHiddenInput, onClear, onValidationChange, syncValue])\n\n const hasError = error || (touched && !validation.valid)\n const resolvedErrorText = errorText || (touched && !validation.valid ? validation.error : undefined)\n const isSuccess =\n !hasError && (success !== undefined ? success : touched && validation.valid && Boolean(month && year))\n const resolvedColorClass = hasError ? 'color-error' : color ? `color-${color}` : undefined\n\n const containerClasses = cn(\n 'container',\n `field-${variant}`,\n `field-${size}`,\n focused && 'focused',\n hasError && 'input-error',\n isSuccess && !hasError && 'input-success',\n resolvedColorClass,\n disabled && 'disabled',\n rounded && 'rounded'\n )\n\n const monthLabel = month || 'MM'\n const yearLabel = year || 'YYYY'\n\n return (\n <div\n ref={rootRef}\n className={cn('input', 'input-exp-date', resolvedColorClass, fullWidth && 'full-width', className)}\n style={style}\n onFocusCapture={handleRootFocus}\n onBlurCapture={handleRootBlur}\n >\n {label && (\n <label\n htmlFor={id}\n className={cn(\n 'field-label',\n focused && 'focused',\n hasError && 'error',\n isSuccess && !hasError && 'success',\n required && 'required',\n labelClassName\n )}\n >\n {label}\n </label>\n )}\n\n <div className={containerClasses} onClick={focusHiddenInput}>\n {startIcon && <span className=\"start-icon\">{startIcon}</span>}\n\n <input\n ref={ref ?? inputRef}\n type=\"text\"\n value={currentValue}\n name={name}\n id={id}\n readOnly\n required={required}\n autoFocus={autoFocus}\n className=\"input-exp-date-native\"\n tabIndex={-1}\n aria-hidden=\"true\"\n onChange={onChange}\n onFocus={onFocus}\n onBlur={onBlur}\n />\n\n <div className=\"input-exp-date-segments\" aria-label=\"Expiration date\">\n {segmentDisabled ? (\n <span className={cn('input-exp-date-trigger', !month && 'placeholder', 'static')}>\n <span>{monthLabel}</span>\n </span>\n ) : (\n <MDropdownMenu\n trigger={\n <span\n className={cn(\n 'input-exp-date-trigger',\n monthMenuOpen && 'open',\n !month && 'placeholder'\n )}\n onMouseDown={focusHiddenInput}\n >\n <span>{monthLabel}</span>\n <MChevronDownIcon size={16} />\n </span>\n }\n openOn=\"click\"\n closeOnSelect\n onOpenChange={setMonthMenuOpen}\n popoverClassName=\"input-exp-date-popover\"\n >\n {Array.from({length: 12}, (_, index) => {\n const option = String(index + 1).padStart(2, '0')\n\n return (\n <MDropdownItem\n key={option}\n label={option}\n active={month === option}\n onClick={() => handleSelectMonth(option)}\n />\n )\n })}\n </MDropdownMenu>\n )}\n\n <span className=\"input-exp-date-separator\">/</span>\n\n {segmentDisabled ? (\n <span className={cn('input-exp-date-trigger', !year && 'placeholder', 'static')}>\n <span>{yearLabel}</span>\n </span>\n ) : (\n <MDropdownMenu\n trigger={\n <span\n className={cn(\n 'input-exp-date-trigger',\n yearMenuOpen && 'open',\n !year && 'placeholder'\n )}\n onMouseDown={focusHiddenInput}\n >\n <span>{yearLabel}</span>\n <MChevronDownIcon size={16} />\n </span>\n }\n openOn=\"click\"\n closeOnSelect\n onOpenChange={setYearMenuOpen}\n popoverClassName=\"input-exp-date-popover\"\n >\n {yearOptions.map((option) => (\n <MDropdownItem\n key={option}\n label={String(option)}\n active={year === String(option)}\n onClick={() => handleSelectYear(String(option))}\n />\n ))}\n </MDropdownMenu>\n )}\n </div>\n\n {clearable && hasContent && !segmentDisabled && (\n <button\n type=\"button\"\n className=\"clear-btn clear-btn-base\"\n onClick={(event) => {\n event.stopPropagation()\n handleClear()\n }}\n tabIndex={-1}\n aria-label=\"Clear input\"\n >\n <MCloseIcon />\n </button>\n )}\n\n {endIcon && <span className=\"end-icon\">{endIcon}</span>}\n </div>\n\n {(resolvedErrorText || helperText) && (\n <div className=\"bottom-row\">\n <span>\n {resolvedErrorText && (\n <span id={id ? `${id}-error` : undefined} className=\"field-error\" role=\"alert\">\n {resolvedErrorText}\n </span>\n )}\n {!resolvedErrorText && helperText && (\n <span id={id ? `${id}-helper` : undefined} className=\"field-helper\">\n {helperText}\n </span>\n )}\n </span>\n </div>\n )}\n </div>\n )\n})\n","import {forwardRef, useCallback, useState} from 'react'\nimport type * as React from 'react'\nimport type {MInputCVCProps} from './MInputCVC.types'\nimport {MInput} from '../MInput'\nimport type {ValidationResult} from '../../../utils/validators'\nimport {MCheckIcon} from '../../../icons'\nimport {cn} from '../../../utils/cn'\nimport './MInputCVC.css'\n\nconst OK: ValidationResult = {valid: true}\n\nfunction stripDigits(value: string) {\n return value.replace(/\\D/g, '')\n}\n\nfunction validateCvc(value: string, length: 3 | 4): ValidationResult {\n if (!value) {\n return OK\n }\n\n const digits = stripDigits(value)\n\n if (digits.length !== length) {\n return {valid: false, error: `Security code must have ${length} digits`}\n }\n\n return OK\n}\n\nexport const MInputCVC = forwardRef<HTMLInputElement, MInputCVCProps>(function MInputCVC(\n {\n length = 3,\n validateOnBlur = true,\n validateOnChange = false,\n onValidationChange,\n onValueChange,\n value,\n defaultValue,\n onChange,\n onBlur,\n onKeyDown,\n error,\n errorText,\n success,\n placeholder,\n className,\n inputClassName,\n ...rest\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(() =>\n stripDigits(defaultValue?.toString() ?? '').slice(0, length)\n )\n const [validation, setValidation] = useState<ValidationResult>(OK)\n const [touched, setTouched] = useState(false)\n\n const currentValue = value !== undefined ? stripDigits(value.toString()).slice(0, length) : internalValue\n\n const runValidation = useCallback(\n (nextValue: string) => {\n const result = validateCvc(nextValue, length)\n setValidation(result)\n onValidationChange?.(result)\n return result\n },\n [length, onValidationChange]\n )\n\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const nextValue = stripDigits(event.target.value).slice(0, length)\n\n if (value === undefined) {\n setInternalValue(nextValue)\n }\n\n onValueChange?.(nextValue)\n\n if (validateOnChange && touched) {\n runValidation(nextValue)\n }\n\n onChange?.(event)\n },\n [length, onChange, onValueChange, runValidation, touched, validateOnChange, value]\n )\n\n const handleBlur = useCallback(\n (event: React.FocusEvent<HTMLInputElement>) => {\n setTouched(true)\n\n if (validateOnBlur && currentValue) {\n runValidation(currentValue)\n }\n\n onBlur?.(event)\n },\n [currentValue, onBlur, runValidation, validateOnBlur]\n )\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (['Backspace', 'Delete', 'Tab', 'ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(event.key)) {\n onKeyDown?.(event)\n return\n }\n\n if (event.ctrlKey || event.metaKey) {\n onKeyDown?.(event)\n return\n }\n\n if (!/^\\d$/.test(event.key)) {\n event.preventDefault()\n }\n\n onKeyDown?.(event)\n },\n [onKeyDown]\n )\n\n const isError = error || (touched && !validation.valid)\n const resolvedErrorText = errorText || (touched && !validation.valid ? validation.error : undefined)\n const isSuccess = !isError && (success !== undefined ? success : touched && currentValue.length === length)\n const endIcon = isSuccess ? <MCheckIcon /> : undefined\n\n return (\n <MInput\n {...rest}\n ref={ref}\n type=\"text\"\n inputMode=\"numeric\"\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n error={isError}\n errorText={resolvedErrorText}\n success={isSuccess}\n placeholder={placeholder ?? ''.padEnd(length, '0')}\n maxLength={length}\n endIcon={endIcon}\n inputClassName={cn('input-cvc-field', inputClassName)}\n className={className}\n />\n )\n})\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`./icons-DWMgDKgt.cjs`),t=require(`./useGhostText-tv1LiSPs.cjs`),n=require(`./MInput-DYqV3-rQ.cjs`);require(`./core-AKWkE8Bx.cjs`);let r=require(`react`),i=require(`react/jsx-runtime`);var a=(0,r.forwardRef)(function({debounceMs:a=300,onSearch:o,value:s,defaultValue:c,onChange:l,onKeyDown:u,onClear:d,clearable:f=!0,placeholder:p=`Search...`,...m},h){let[g,_]=(0,r.useState)(c?.toString()??``),v=s===void 0?g:s.toString(),y=t.r(e=>o?.(e),a),b=(0,r.useCallback)(e=>{s===void 0&&_(e.target.value),y(e.target.value),l?.(e)},[l,s,y]),x=(0,r.useCallback)(e=>{e.key===`Enter`&&o?.(v),u?.(e)},[v,o,u]),S=(0,r.useCallback)(()=>{s===void 0&&_(``),o?.(``),d?.()},[s,o,d]);return(0,i.jsx)(n.t,{...m,ref:h,type:`text`,value:v,onChange:b,onKeyDown:x,onClear:S,clearable:f,placeholder:p,startIcon:(0,i.jsx)(e.Ri,{})})});Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return a}});
|
|
2
|
+
//# sourceMappingURL=MInputSearch-DfoenJIm.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MInputSearch-
|
|
1
|
+
{"version":3,"file":"MInputSearch-DfoenJIm.cjs","names":[],"sources":["../src/components/inputs/MInputSearch/MInputSearch.tsx"],"sourcesContent":["import {useState, useCallback, forwardRef} from 'react'\nimport type * as React from 'react'\nimport type {MInputSearchProps} from './MInputSearch.types'\nimport {MInput} from '../MInput'\nimport {useDebouncedCallback} from '../../../utils/useDebounce'\nimport {MSearchIcon} from '../../../icons'\n\n// Extend the base input with debounced search callbacks and an inline clear action.\nexport const MInputSearch = forwardRef<HTMLInputElement, MInputSearchProps>(function MInputSearch(\n {\n debounceMs = 300,\n onSearch,\n value,\n defaultValue,\n onChange,\n onKeyDown,\n onClear,\n clearable = true,\n placeholder = 'Search...',\n ...rest\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(defaultValue?.toString() ?? '')\n const currentValue = value !== undefined ? value.toString() : internalValue\n\n const debouncedSearch = useDebouncedCallback((val: string) => onSearch?.(val), debounceMs)\n\n // Update local state and debounce search notifications while typing.\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n if (value === undefined) {\n setInternalValue(e.target.value)\n }\n debouncedSearch(e.target.value)\n onChange?.(e)\n },\n [onChange, value, debouncedSearch]\n )\n\n // Run search immediately when the user confirms with Enter.\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n onSearch?.(currentValue)\n }\n onKeyDown?.(e)\n },\n [currentValue, onSearch, onKeyDown]\n )\n\n // Clear both the visible field and the emitted search query.\n const handleClear = useCallback(() => {\n if (value === undefined) {\n setInternalValue('')\n }\n onSearch?.('')\n onClear?.()\n }, [value, onSearch, onClear])\n\n return (\n <MInput\n {...rest}\n ref={ref}\n type=\"text\"\n value={currentValue}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onClear={handleClear}\n clearable={clearable}\n placeholder={placeholder}\n startIcon={<MSearchIcon />}\n />\n )\n})\n"],"mappings":"yMAQA,IAAa,GAAA,EAAA,EAAA,YAA+D,SACxE,CACI,aAAa,IACb,WACA,QACA,eACA,WACA,YACA,UACA,YAAY,GACZ,cAAc,YACd,GAAG,GAEP,EACF,CACE,GAAM,CAAC,EAAe,IAAA,EAAA,EAAA,UAA6B,GAAc,UAAU,EAAI,GAAG,CAC5E,EAAe,IAAU,IAAA,GAA+B,EAAnB,EAAM,UAAU,CAErD,EAAkB,EAAA,EAAsB,GAAgB,IAAW,EAAI,CAAE,EAAW,CAGpF,GAAA,EAAA,EAAA,aACD,GAA2C,CACpC,IAAU,IAAA,IACV,EAAiB,EAAE,OAAO,MAAM,CAEpC,EAAgB,EAAE,OAAO,MAAM,CAC/B,IAAW,EAAE,EAEjB,CAAC,EAAU,EAAO,EAAgB,CACrC,CAGK,GAAA,EAAA,EAAA,aACD,GAA6C,CACtC,EAAE,MAAQ,SACV,IAAW,EAAa,CAE5B,IAAY,EAAE,EAElB,CAAC,EAAc,EAAU,EAAU,CACtC,CAGK,GAAA,EAAA,EAAA,iBAAgC,CAC9B,IAAU,IAAA,IACV,EAAiB,GAAG,CAExB,IAAW,GAAG,CACd,KAAW,EACZ,CAAC,EAAO,EAAU,EAAQ,CAAC,CAE9B,OACI,EAAA,EAAA,KAAC,EAAA,EAAD,CACI,GAAI,EACC,MACL,KAAK,OACL,MAAO,EACP,SAAU,EACV,UAAW,EACX,QAAS,EACE,YACE,cACb,WAAW,EAAA,EAAA,KAAC,EAAA,GAAD,EAAe,CAAA,CAC5B,CAAA,EAER"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { Ri as e } from "./icons-
|
|
2
|
-
import { r as t } from "./useGhostText-
|
|
3
|
-
import { t as n } from "./MInput-
|
|
1
|
+
import { Ri as e } from "./icons-CfpYxnfg.js";
|
|
2
|
+
import { r as t } from "./useGhostText-DG0bzcao.js";
|
|
3
|
+
import { t as n } from "./MInput-bzSwK880.js";
|
|
4
4
|
import { forwardRef as r, useCallback as i, useState as a } from "react";
|
|
5
5
|
import { jsx as o } from "react/jsx-runtime";
|
|
6
6
|
//#region src/components/inputs/MInputSearch/MInputSearch.tsx
|
|
@@ -40,4 +40,4 @@ var s = r(function({ debounceMs: r = 300, onSearch: s, value: c, defaultValue: l
|
|
|
40
40
|
//#endregion
|
|
41
41
|
export { s as t };
|
|
42
42
|
|
|
43
|
-
//# sourceMappingURL=MInputSearch-
|
|
43
|
+
//# sourceMappingURL=MInputSearch-Dh4C3Tz5.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MInputSearch-
|
|
1
|
+
{"version":3,"file":"MInputSearch-Dh4C3Tz5.js","names":[],"sources":["../src/components/inputs/MInputSearch/MInputSearch.tsx"],"sourcesContent":["import {useState, useCallback, forwardRef} from 'react'\nimport type * as React from 'react'\nimport type {MInputSearchProps} from './MInputSearch.types'\nimport {MInput} from '../MInput'\nimport {useDebouncedCallback} from '../../../utils/useDebounce'\nimport {MSearchIcon} from '../../../icons'\n\n// Extend the base input with debounced search callbacks and an inline clear action.\nexport const MInputSearch = forwardRef<HTMLInputElement, MInputSearchProps>(function MInputSearch(\n {\n debounceMs = 300,\n onSearch,\n value,\n defaultValue,\n onChange,\n onKeyDown,\n onClear,\n clearable = true,\n placeholder = 'Search...',\n ...rest\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(defaultValue?.toString() ?? '')\n const currentValue = value !== undefined ? value.toString() : internalValue\n\n const debouncedSearch = useDebouncedCallback((val: string) => onSearch?.(val), debounceMs)\n\n // Update local state and debounce search notifications while typing.\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n if (value === undefined) {\n setInternalValue(e.target.value)\n }\n debouncedSearch(e.target.value)\n onChange?.(e)\n },\n [onChange, value, debouncedSearch]\n )\n\n // Run search immediately when the user confirms with Enter.\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n onSearch?.(currentValue)\n }\n onKeyDown?.(e)\n },\n [currentValue, onSearch, onKeyDown]\n )\n\n // Clear both the visible field and the emitted search query.\n const handleClear = useCallback(() => {\n if (value === undefined) {\n setInternalValue('')\n }\n onSearch?.('')\n onClear?.()\n }, [value, onSearch, onClear])\n\n return (\n <MInput\n {...rest}\n ref={ref}\n type=\"text\"\n value={currentValue}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onClear={handleClear}\n clearable={clearable}\n placeholder={placeholder}\n startIcon={<MSearchIcon />}\n />\n )\n})\n"],"mappings":";;;;;;AAQA,IAAa,IAAe,EAAgD,SACxE,EACI,gBAAa,KACb,aACA,UACA,iBACA,aACA,cACA,YACA,eAAY,IACZ,iBAAc,aACd,GAAG,KAEP,GACF;CACE,IAAM,CAAC,GAAe,KAAoB,EAAS,GAAc,UAAU,IAAI,GAAG,EAC5E,IAAe,MAAU,KAAA,IAA+B,IAAnB,EAAM,UAAU,EAErD,IAAkB,GAAsB,MAAgB,IAAW,EAAI,EAAE,EAAW,EAGpF,IAAe,GAChB,MAA2C;AAKxC,EAJI,MAAU,KAAA,KACV,EAAiB,EAAE,OAAO,MAAM,EAEpC,EAAgB,EAAE,OAAO,MAAM,EAC/B,IAAW,EAAE;IAEjB;EAAC;EAAU;EAAO;EAAgB,CACrC,EAGK,IAAgB,GACjB,MAA6C;AAI1C,EAHI,EAAE,QAAQ,WACV,IAAW,EAAa,EAE5B,IAAY,EAAE;IAElB;EAAC;EAAc;EAAU;EAAU,CACtC,EAGK,IAAc,QAAkB;AAKlC,EAJI,MAAU,KAAA,KACV,EAAiB,GAAG,EAExB,IAAW,GAAG,EACd,KAAW;IACZ;EAAC;EAAO;EAAU;EAAQ,CAAC;AAE9B,QACI,kBAAC,GAAD;EACI,GAAI;EACC;EACL,MAAK;EACL,OAAO;EACP,UAAU;EACV,WAAW;EACX,SAAS;EACE;EACE;EACb,WAAW,kBAAC,GAAD,EAAe,CAAA;EAC5B,CAAA;EAER"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`./theme-CgS-bND3.cjs`),t=require(`./cn-CU5TNITO.cjs`);require(`./core-AKWkE8Bx.cjs`);let n=require(`react`),r=require(`react/jsx-runtime`);var i=(0,n.forwardRef)(function({component:n,to:i,tone:a=`default`,underline:o=`hover`,hidden:s,current:c=!1,block:l=!1,disabled:u=!1,className:d,children:f,href:p,onClick:m,...h},g){let _=n??`a`;function v(e){if(u){e.preventDefault();return}m?.(e)}return(0,r.jsx)(_,{ref:g,href:n||u?void 0:p,to:n?i:void 0,className:t.t(`link`,a,o,c&&`current`,l&&`block`,u&&`disabled`,d),"aria-current":c?`page`:void 0,"aria-disabled":u||void 0,onClick:v,...e.r(s),...h,children:f})});Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return i}});
|
|
2
|
+
//# sourceMappingURL=MLink-CY45UR_j.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MLink-
|
|
1
|
+
{"version":3,"file":"MLink-CY45UR_j.cjs","names":[],"sources":["../src/components/typography/MLink/MLink.tsx"],"sourcesContent":["import {forwardRef} from 'react'\nimport type {MouseEvent} from 'react'\nimport type {MLinkProps} from './MLink.types'\nimport {getHiddenProps} from '../../../theme'\nimport {cn} from '../../../utils/cn'\nimport './MLink.css'\n\n// Render a semantic link that can target anchors or router link components.\nexport const MLink = forwardRef<HTMLElement, MLinkProps>(function MLink(\n {\n component,\n to,\n tone = 'default',\n underline = 'hover',\n hidden,\n current = false,\n block = false,\n disabled = false,\n className,\n children,\n href,\n onClick,\n ...rest\n },\n ref\n) {\n const Component = component ?? 'a'\n\n // Prevent disabled links from navigating while still exposing their content.\n function handleClick(event: MouseEvent<HTMLAnchorElement>) {\n if (disabled) {\n event.preventDefault()\n return\n }\n\n onClick?.(event)\n }\n\n return (\n <Component\n ref={ref}\n href={component ? undefined : disabled ? undefined : href}\n to={component ? to : undefined}\n className={cn(\n 'link',\n tone,\n underline,\n current && 'current',\n block && 'block',\n disabled && 'disabled',\n className\n )}\n aria-current={current ? 'page' : undefined}\n aria-disabled={disabled || undefined}\n onClick={handleClick}\n {...getHiddenProps(hidden)}\n {...rest}\n >\n {children}\n </Component>\n )\n})\n"],"mappings":"4JAQA,IAAa,GAAA,EAAA,EAAA,YAA4C,SACrD,CACI,YACA,KACA,OAAO,UACP,YAAY,QACZ,SACA,UAAU,GACV,QAAQ,GACR,WAAW,GACX,YACA,WACA,OACA,UACA,GAAG,GAEP,EACF,CACE,IAAM,EAAY,GAAa,IAG/B,SAAS,EAAY,EAAsC,CACvD,GAAI,EAAU,CACV,EAAM,gBAAgB,CACtB,OAGJ,IAAU,EAAM,CAGpB,OACI,EAAA,EAAA,KAAC,EAAD,CACS,MACL,KAAM,GAAwB,EAAZ,IAAA,GAAmC,EACrD,GAAI,EAAY,EAAK,IAAA,GACrB,UAAW,EAAA,EACP,OACA,EACA,EACA,GAAW,UACX,GAAS,QACT,GAAY,WACZ,EACH,CACD,eAAc,EAAU,OAAS,IAAA,GACjC,gBAAe,GAAY,IAAA,GAC3B,QAAS,EACT,GAAI,EAAA,EAAe,EAAO,CAC1B,GAAI,EAEH,WACO,CAAA,EAElB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { r as e } from "./theme-
|
|
2
|
-
import { t } from "./cn-
|
|
1
|
+
import { r as e } from "./theme-D_f-cmSA.js";
|
|
2
|
+
import { t } from "./cn-YER3QsV1.js";
|
|
3
3
|
import { forwardRef as n } from "react";
|
|
4
4
|
import { jsx as r } from "react/jsx-runtime";
|
|
5
5
|
//#region src/components/typography/MLink/MLink.tsx
|
|
@@ -28,4 +28,4 @@ var i = n(function({ component: n, to: i, tone: a = "default", underline: o = "h
|
|
|
28
28
|
//#endregion
|
|
29
29
|
export { i as t };
|
|
30
30
|
|
|
31
|
-
//# sourceMappingURL=MLink-
|
|
31
|
+
//# sourceMappingURL=MLink-rFKN1mcM.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MLink-
|
|
1
|
+
{"version":3,"file":"MLink-rFKN1mcM.js","names":[],"sources":["../src/components/typography/MLink/MLink.tsx"],"sourcesContent":["import {forwardRef} from 'react'\nimport type {MouseEvent} from 'react'\nimport type {MLinkProps} from './MLink.types'\nimport {getHiddenProps} from '../../../theme'\nimport {cn} from '../../../utils/cn'\nimport './MLink.css'\n\n// Render a semantic link that can target anchors or router link components.\nexport const MLink = forwardRef<HTMLElement, MLinkProps>(function MLink(\n {\n component,\n to,\n tone = 'default',\n underline = 'hover',\n hidden,\n current = false,\n block = false,\n disabled = false,\n className,\n children,\n href,\n onClick,\n ...rest\n },\n ref\n) {\n const Component = component ?? 'a'\n\n // Prevent disabled links from navigating while still exposing their content.\n function handleClick(event: MouseEvent<HTMLAnchorElement>) {\n if (disabled) {\n event.preventDefault()\n return\n }\n\n onClick?.(event)\n }\n\n return (\n <Component\n ref={ref}\n href={component ? undefined : disabled ? undefined : href}\n to={component ? to : undefined}\n className={cn(\n 'link',\n tone,\n underline,\n current && 'current',\n block && 'block',\n disabled && 'disabled',\n className\n )}\n aria-current={current ? 'page' : undefined}\n aria-disabled={disabled || undefined}\n onClick={handleClick}\n {...getHiddenProps(hidden)}\n {...rest}\n >\n {children}\n </Component>\n )\n})\n"],"mappings":";;;;;AAQA,IAAa,IAAQ,EAAoC,SACrD,EACI,cACA,OACA,UAAO,WACP,eAAY,SACZ,WACA,aAAU,IACV,WAAQ,IACR,cAAW,IACX,cACA,aACA,SACA,YACA,GAAG,KAEP,GACF;CACE,IAAM,IAAY,KAAa;CAG/B,SAAS,EAAY,GAAsC;AACvD,MAAI,GAAU;AACV,KAAM,gBAAgB;AACtB;;AAGJ,MAAU,EAAM;;AAGpB,QACI,kBAAC,GAAD;EACS;EACL,MAAM,KAAwB,IAAZ,KAAA,IAAmC;EACrD,IAAI,IAAY,IAAK,KAAA;EACrB,WAAW,EACP,QACA,GACA,GACA,KAAW,WACX,KAAS,SACT,KAAY,YACZ,EACH;EACD,gBAAc,IAAU,SAAS,KAAA;EACjC,iBAAe,KAAY,KAAA;EAC3B,SAAS;EACT,GAAI,EAAe,EAAO;EAC1B,GAAI;EAEH;EACO,CAAA;EAElB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { t as e } from "./cn-
|
|
2
|
-
import { t } from "./MPortal-
|
|
3
|
-
import { a as n, i as r, n as i, r as a } from "./MSkeleton-
|
|
1
|
+
import { t as e } from "./cn-YER3QsV1.js";
|
|
2
|
+
import { t } from "./MPortal-Ba2Sxset.js";
|
|
3
|
+
import { a as n, i as r, n as i, r as a } from "./MSkeleton-DGhtNmpI.js";
|
|
4
4
|
import { useEffect as o, useRef as s, useState as c } from "react";
|
|
5
5
|
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
6
6
|
//#region src/components/overlays/MModal/MModal.tsx
|
|
@@ -66,4 +66,4 @@ function f({ open: f, onClose: p, title: m, description: h, footer: g, size: _ =
|
|
|
66
66
|
//#endregion
|
|
67
67
|
export { f as t };
|
|
68
68
|
|
|
69
|
-
//# sourceMappingURL=MModal-
|
|
69
|
+
//# sourceMappingURL=MModal-BDTAgnrm.js.map
|