@mieweb/ui 0.2.2 → 0.3.0-dev.60
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/dist/ag-grid.cjs +6 -5
- package/dist/ag-grid.cjs.map +1 -1
- package/dist/ag-grid.js +2 -1
- package/dist/ag-grid.js.map +1 -1
- package/dist/brands/index.cjs +20 -20
- package/dist/brands/index.js +3 -3
- package/dist/brands/types.cjs +4 -4
- package/dist/brands/types.d.cts +14 -8
- package/dist/brands/types.d.ts +14 -8
- package/dist/brands/types.js +1 -1
- package/dist/{chunk-B7YGVKTE.cjs → chunk-2YFJ6A5V.cjs} +51 -24
- package/dist/chunk-2YFJ6A5V.cjs.map +1 -0
- package/dist/{chunk-2J2V4TMJ.cjs → chunk-35J4B3ZK.cjs} +41 -31
- package/dist/chunk-35J4B3ZK.cjs.map +1 -0
- package/dist/{chunk-B5364UWR.cjs → chunk-3DBRHYTN.cjs} +2 -2
- package/dist/{chunk-B5364UWR.cjs.map → chunk-3DBRHYTN.cjs.map} +1 -1
- package/dist/{chunk-JFAXLE2J.js → chunk-3DM6LMZG.js} +7 -4
- package/dist/chunk-3DM6LMZG.js.map +1 -0
- package/dist/{chunk-N3QTYHRZ.cjs → chunk-3GGET5LK.cjs} +40 -22
- package/dist/chunk-3GGET5LK.cjs.map +1 -0
- package/dist/{chunk-VV4N4WY6.cjs → chunk-3XK5GENF.cjs} +61 -35
- package/dist/chunk-3XK5GENF.cjs.map +1 -0
- package/dist/{chunk-OW2BWGST.js → chunk-4ASPCSWT.js} +48 -31
- package/dist/chunk-4ASPCSWT.js.map +1 -0
- package/dist/{chunk-EKIQE524.cjs → chunk-4FALCEJI.cjs} +3 -2
- package/dist/chunk-4FALCEJI.cjs.map +1 -0
- package/dist/{chunk-6OCIIIAI.js → chunk-4Z6ZZKIY.js} +40 -22
- package/dist/chunk-4Z6ZZKIY.js.map +1 -0
- package/dist/{chunk-QUA7WVHK.cjs → chunk-4ZU53GNR.cjs} +6 -14
- package/dist/{chunk-QUA7WVHK.cjs.map → chunk-4ZU53GNR.cjs.map} +1 -1
- package/dist/{chunk-6Q4SU72T.js → chunk-5NSURWMM.js} +49 -10
- package/dist/chunk-5NSURWMM.js.map +1 -0
- package/dist/{chunk-4MHTSFPX.js → chunk-6EN6ZIW3.js} +43 -18
- package/dist/chunk-6EN6ZIW3.js.map +1 -0
- package/dist/chunk-7CLHYU4Q.cjs +270 -0
- package/dist/chunk-7CLHYU4Q.cjs.map +1 -0
- package/dist/{chunk-RYQ5NEKH.js → chunk-7MX7MGSA.js} +2 -2
- package/dist/{chunk-RYQ5NEKH.js.map → chunk-7MX7MGSA.js.map} +1 -1
- package/dist/chunk-7XWPUWSL.js +328 -0
- package/dist/chunk-7XWPUWSL.js.map +1 -0
- package/dist/{chunk-PEH4ZOEM.cjs → chunk-A2QVQF54.cjs} +12 -6
- package/dist/chunk-A2QVQF54.cjs.map +1 -0
- package/dist/{chunk-4AWW5WPF.js → chunk-ATALZYST.js} +51 -24
- package/dist/chunk-ATALZYST.js.map +1 -0
- package/dist/{chunk-HRA4FUO6.cjs → chunk-AUXHRAID.cjs} +71 -44
- package/dist/chunk-AUXHRAID.cjs.map +1 -0
- package/dist/{chunk-I7L6CQXR.cjs → chunk-AWUADXYI.cjs} +58 -31
- package/dist/chunk-AWUADXYI.cjs.map +1 -0
- package/dist/chunk-B43FRU5R.js +247 -0
- package/dist/chunk-B43FRU5R.js.map +1 -0
- package/dist/{chunk-XXOBTAKA.js → chunk-BBQZNIB4.js} +71 -44
- package/dist/chunk-BBQZNIB4.js.map +1 -0
- package/dist/{chunk-PEFJAWNR.cjs → chunk-BWYYA3LQ.cjs} +26 -10
- package/dist/chunk-BWYYA3LQ.cjs.map +1 -0
- package/dist/{chunk-WH6I7CMP.cjs → chunk-CW75IKA6.cjs} +27 -2
- package/dist/chunk-CW75IKA6.cjs.map +1 -0
- package/dist/{chunk-QSMMFATL.js → chunk-DCDXOT3A.js} +178 -127
- package/dist/chunk-DCDXOT3A.js.map +1 -0
- package/dist/{chunk-3NJ72QU6.js → chunk-DCER2QQB.js} +3 -2
- package/dist/chunk-DCER2QQB.js.map +1 -0
- package/dist/{chunk-AWIULTJW.js → chunk-DNPRRYPQ.js} +18 -3
- package/dist/chunk-DNPRRYPQ.js.map +1 -0
- package/dist/{chunk-NAATBUHR.cjs → chunk-EMMQPDOY.cjs} +43 -18
- package/dist/chunk-EMMQPDOY.cjs.map +1 -0
- package/dist/{chunk-GHRQ3ZJH.js → chunk-EUHPVNWD.js} +51 -12
- package/dist/chunk-EUHPVNWD.js.map +1 -0
- package/dist/{chunk-UZUBLXVC.js → chunk-FZJBFJJR.js} +3 -2
- package/dist/chunk-FZJBFJJR.js.map +1 -0
- package/dist/{chunk-SSKI6VTW.cjs → chunk-G7ZHQA4O.cjs} +2 -2
- package/dist/chunk-G7ZHQA4O.cjs.map +1 -0
- package/dist/{chunk-B3L43JGH.js → chunk-HEH3QXOQ.js} +26 -10
- package/dist/chunk-HEH3QXOQ.js.map +1 -0
- package/dist/{chunk-TA6FVVCM.js → chunk-I56VBDSC.js} +3 -3
- package/dist/{chunk-TA6FVVCM.js.map → chunk-I56VBDSC.js.map} +1 -1
- package/dist/{chunk-SWMRCGL4.cjs → chunk-IKMR2ADM.cjs} +5 -4
- package/dist/chunk-IKMR2ADM.cjs.map +1 -0
- package/dist/{chunk-53K3KWXQ.cjs → chunk-IMNLYVXJ.cjs} +166 -136
- package/dist/chunk-IMNLYVXJ.cjs.map +1 -0
- package/dist/{chunk-FFJVCQ5R.cjs → chunk-J644FU54.cjs} +49 -19
- package/dist/chunk-J644FU54.cjs.map +1 -0
- package/dist/{chunk-KWDTTGH2.js → chunk-JDI45GEY.js} +4 -4
- package/dist/{chunk-KWDTTGH2.js.map → chunk-JDI45GEY.js.map} +1 -1
- package/dist/{chunk-EF46XW4Z.cjs → chunk-JE4AH2TZ.cjs} +160 -66
- package/dist/chunk-JE4AH2TZ.cjs.map +1 -0
- package/dist/{chunk-VDMQCSXT.cjs → chunk-JHPFOG2N.cjs} +4 -4
- package/dist/{chunk-VDMQCSXT.cjs.map → chunk-JHPFOG2N.cjs.map} +1 -1
- package/dist/{chunk-5T3AWNHG.cjs → chunk-K7IGBNZA.cjs} +70 -39
- package/dist/chunk-K7IGBNZA.cjs.map +1 -0
- package/dist/chunk-LEMY57MI.js +3 -0
- package/dist/{chunk-Y22SOAJM.js.map → chunk-LEMY57MI.js.map} +1 -1
- package/dist/{chunk-EYH7OUX5.js → chunk-LUVSO5LK.js} +2 -2
- package/dist/chunk-LUVSO5LK.js.map +1 -0
- package/dist/chunk-LXHPW2ZF.cjs +353 -0
- package/dist/chunk-LXHPW2ZF.cjs.map +1 -0
- package/dist/chunk-MOULJE34.js +334 -0
- package/dist/chunk-MOULJE34.js.map +1 -0
- package/dist/{chunk-B26RIQ5R.js → chunk-MV3MTHWQ.js} +6 -2
- package/dist/chunk-MV3MTHWQ.js.map +1 -0
- package/dist/{chunk-AU5ADTYD.cjs → chunk-ND75VHB7.cjs} +49 -10
- package/dist/chunk-ND75VHB7.cjs.map +1 -0
- package/dist/{chunk-GV5JQBPX.js → chunk-NDHW3ZRF.js} +8 -4
- package/dist/chunk-NDHW3ZRF.js.map +1 -0
- package/dist/{chunk-QL2YTVTR.js → chunk-O43QBXRX.js} +7 -2
- package/dist/chunk-O43QBXRX.js.map +1 -0
- package/dist/{chunk-4T2ZNPTC.js → chunk-OJ64Q3A5.js} +104 -62
- package/dist/chunk-OJ64Q3A5.js.map +1 -0
- package/dist/{chunk-OT36EMM5.js → chunk-OKBR6PX4.js} +5 -4
- package/dist/chunk-OKBR6PX4.js.map +1 -0
- package/dist/{chunk-LZEY55QZ.cjs → chunk-OYKS2JBB.cjs} +18 -3
- package/dist/chunk-OYKS2JBB.cjs.map +1 -0
- package/dist/{chunk-ORUPC5TV.cjs → chunk-PLIK3DN6.cjs} +7 -4
- package/dist/chunk-PLIK3DN6.cjs.map +1 -0
- package/dist/{chunk-PF3XWKE5.cjs → chunk-QEAIFTUL.cjs} +26 -9
- package/dist/chunk-QEAIFTUL.cjs.map +1 -0
- package/dist/chunk-QMQE4PDD.cjs +615 -0
- package/dist/chunk-QMQE4PDD.cjs.map +1 -0
- package/dist/{chunk-XVZ4SLQB.js → chunk-QVJBUWJQ.js} +70 -39
- package/dist/chunk-QVJBUWJQ.js.map +1 -0
- package/dist/{chunk-XHJGYBYG.cjs → chunk-QXJMKJJV.cjs} +48 -31
- package/dist/chunk-QXJMKJJV.cjs.map +1 -0
- package/dist/{chunk-TPGT236K.js → chunk-RC2YMOMS.js} +26 -3
- package/dist/chunk-RC2YMOMS.js.map +1 -0
- package/dist/{chunk-BXK5TNJE.cjs → chunk-RH43XBNV.cjs} +3 -2
- package/dist/chunk-RH43XBNV.cjs.map +1 -0
- package/dist/{chunk-NIHESA7O.js → chunk-T4AO7KYK.js} +41 -31
- package/dist/chunk-T4AO7KYK.js.map +1 -0
- package/dist/chunk-TF5OZDFU.js +588 -0
- package/dist/chunk-TF5OZDFU.js.map +1 -0
- package/dist/{chunk-BV75DAKO.cjs → chunk-TSZRR2ZK.cjs} +104 -62
- package/dist/chunk-TSZRR2ZK.cjs.map +1 -0
- package/dist/{chunk-ONWOB76P.js → chunk-V2O636JO.js} +26 -9
- package/dist/chunk-V2O636JO.js.map +1 -0
- package/dist/{chunk-G2DOD34H.js → chunk-VKTQQOUH.js} +82 -36
- package/dist/chunk-VKTQQOUH.js.map +1 -0
- package/dist/{chunk-RRQGH7C5.cjs → chunk-VQW36LLX.cjs} +7 -2
- package/dist/chunk-VQW36LLX.cjs.map +1 -0
- package/dist/{chunk-IY7UQPDO.cjs → chunk-WGPMTW36.cjs} +6 -2
- package/dist/chunk-WGPMTW36.cjs.map +1 -0
- package/dist/{chunk-SOFX4T7M.js → chunk-WOYUQ4AT.js} +49 -19
- package/dist/chunk-WOYUQ4AT.js.map +1 -0
- package/dist/{chunk-SD44QJIP.js → chunk-WTDCNXZO.js} +58 -31
- package/dist/chunk-WTDCNXZO.js.map +1 -0
- package/dist/chunk-XHESCAUE.js +124 -0
- package/dist/chunk-XHESCAUE.js.map +1 -0
- package/dist/{chunk-QZLRB3UG.js → chunk-YN3ZIUYC.js} +166 -136
- package/dist/chunk-YN3ZIUYC.js.map +1 -0
- package/dist/{chunk-VZUVYJFU.cjs → chunk-YR365F2H.cjs} +16 -16
- package/dist/{chunk-VZUVYJFU.cjs.map → chunk-YR365F2H.cjs.map} +1 -1
- package/dist/{chunk-5UUL5EEO.cjs → chunk-Z2ABQA5Z.cjs} +178 -127
- package/dist/chunk-Z2ABQA5Z.cjs.map +1 -0
- package/dist/{chunk-JYMQJ32S.cjs → chunk-Z4HZ35KX.cjs} +8 -4
- package/dist/chunk-Z4HZ35KX.cjs.map +1 -0
- package/dist/{chunk-INFSKLXE.cjs → chunk-ZAHQU7PQ.cjs} +51 -12
- package/dist/chunk-ZAHQU7PQ.cjs.map +1 -0
- package/dist/{chunk-QYJ7RQJ2.cjs → chunk-ZGSPFVGL.cjs} +82 -36
- package/dist/chunk-ZGSPFVGL.cjs.map +1 -0
- package/dist/{chunk-VBHPXSCV.js → chunk-ZVSW2KS6.js} +12 -6
- package/dist/chunk-ZVSW2KS6.js.map +1 -0
- package/dist/components/Alert/index.cjs +5 -5
- package/dist/components/Alert/index.js +1 -1
- package/dist/components/AudioPlayer/index.cjs +6 -6
- package/dist/components/AudioPlayer/index.js +1 -1
- package/dist/components/AudioRecorder/index.cjs +6 -6
- package/dist/components/AudioRecorder/index.js +1 -1
- package/dist/components/Avatar/index.cjs +5 -5
- package/dist/components/Avatar/index.js +1 -1
- package/dist/components/Badge/index.cjs +3 -3
- package/dist/components/Badge/index.js +1 -1
- package/dist/components/Breadcrumb/index.cjs +3 -3
- package/dist/components/Breadcrumb/index.js +1 -1
- package/dist/components/Button/index.cjs +3 -3
- package/dist/components/Button/index.js +1 -1
- package/dist/components/Card/index.cjs +15 -15
- package/dist/components/Card/index.js +1 -1
- package/dist/components/Checkbox/index.cjs +4 -4
- package/dist/components/Checkbox/index.js +1 -1
- package/dist/components/CountryCodeDropdown/index.cjs +23 -0
- package/dist/components/CountryCodeDropdown/index.cjs.map +1 -0
- package/dist/components/CountryCodeDropdown/index.d.cts +69 -0
- package/dist/components/CountryCodeDropdown/index.d.ts +69 -0
- package/dist/components/CountryCodeDropdown/index.js +6 -0
- package/dist/components/CountryCodeDropdown/index.js.map +1 -0
- package/dist/components/DateInput/index.cjs +4 -4
- package/dist/components/DateInput/index.js +3 -3
- package/dist/components/Dropdown/index.cjs +9 -8
- package/dist/components/Dropdown/index.d.cts +29 -1
- package/dist/components/Dropdown/index.d.ts +29 -1
- package/dist/components/Dropdown/index.js +3 -2
- package/dist/components/Input/index.cjs +3 -3
- package/dist/components/Input/index.js +1 -1
- package/dist/components/Modal/index.cjs +9 -9
- package/dist/components/Modal/index.js +1 -1
- package/dist/components/Pagination/index.cjs +4 -4
- package/dist/components/Pagination/index.js +1 -1
- package/dist/components/PhoneInput/index.cjs +4 -4
- package/dist/components/PhoneInput/index.js +2 -2
- package/dist/components/Progress/index.cjs +6 -6
- package/dist/components/Progress/index.js +1 -1
- package/dist/components/QuickAction/index.cjs +6 -6
- package/dist/components/QuickAction/index.js +1 -1
- package/dist/components/Radio/index.cjs +4 -4
- package/dist/components/Radio/index.js +1 -1
- package/dist/components/RecordButton/index.cjs +4 -4
- package/dist/components/RecordButton/index.js +1 -1
- package/dist/components/SchedulePicker/index.cjs +10 -10
- package/dist/components/SchedulePicker/index.js +1 -1
- package/dist/components/Select/index.cjs +3 -3
- package/dist/components/Select/index.js +1 -1
- package/dist/components/Skeleton/index.cjs +6 -6
- package/dist/components/Skeleton/index.d.cts +1 -1
- package/dist/components/Skeleton/index.d.ts +1 -1
- package/dist/components/Skeleton/index.js +1 -1
- package/dist/components/Slider/index.cjs +5 -5
- package/dist/components/Slider/index.js +1 -1
- package/dist/components/Spinner/index.cjs +5 -5
- package/dist/components/Spinner/index.js +1 -1
- package/dist/components/Switch/index.cjs +4 -4
- package/dist/components/Switch/index.js +1 -1
- package/dist/components/Table/index.cjs +9 -9
- package/dist/components/Table/index.js +1 -1
- package/dist/components/Tabs/index.cjs +7 -7
- package/dist/components/Tabs/index.js +1 -1
- package/dist/components/Textarea/index.cjs +3 -3
- package/dist/components/Textarea/index.js +1 -1
- package/dist/components/ThemeProvider/index.cjs +8 -8
- package/dist/components/ThemeProvider/index.js +2 -2
- package/dist/components/Tooltip/index.cjs +2 -2
- package/dist/components/Tooltip/index.js +1 -1
- package/dist/datavis.cjs +251 -0
- package/dist/datavis.cjs.map +1 -0
- package/dist/datavis.d.cts +47 -0
- package/dist/datavis.d.ts +47 -0
- package/dist/datavis.js +247 -0
- package/dist/datavis.js.map +1 -0
- package/dist/hooks/index.cjs +2 -2
- package/dist/hooks/index.d.cts +2 -2
- package/dist/hooks/index.d.ts +2 -2
- package/dist/hooks/index.js +1 -1
- package/dist/index.cjs +12815 -8821
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +43 -49
- package/dist/index.d.ts +43 -49
- package/dist/index.js +12183 -8208
- package/dist/index.js.map +1 -1
- package/dist/styles/init.css +326 -0
- package/dist/styles.css +1 -1
- package/dist/tailwind-preset.cjs +4 -4
- package/dist/tailwind-preset.d.cts +13 -2
- package/dist/tailwind-preset.d.ts +13 -2
- package/dist/tailwind-preset.js +1 -1
- package/dist/utils/index.cjs +30 -22
- package/dist/utils/index.d.cts +12 -1
- package/dist/utils/index.d.ts +12 -1
- package/dist/utils/index.js +1 -1
- package/package.json +24 -3
- package/dist/chunk-265CFCCX.js +0 -173
- package/dist/chunk-265CFCCX.js.map +0 -1
- package/dist/chunk-2J2V4TMJ.cjs.map +0 -1
- package/dist/chunk-3NJ72QU6.js.map +0 -1
- package/dist/chunk-4AWW5WPF.js.map +0 -1
- package/dist/chunk-4MHTSFPX.js.map +0 -1
- package/dist/chunk-4T2ZNPTC.js.map +0 -1
- package/dist/chunk-4YRAEFYW.js +0 -233
- package/dist/chunk-4YRAEFYW.js.map +0 -1
- package/dist/chunk-53K3KWXQ.cjs.map +0 -1
- package/dist/chunk-5T3AWNHG.cjs.map +0 -1
- package/dist/chunk-5UUL5EEO.cjs.map +0 -1
- package/dist/chunk-6OCIIIAI.js.map +0 -1
- package/dist/chunk-6Q4SU72T.js.map +0 -1
- package/dist/chunk-AU5ADTYD.cjs.map +0 -1
- package/dist/chunk-AWIULTJW.js.map +0 -1
- package/dist/chunk-B26RIQ5R.js.map +0 -1
- package/dist/chunk-B3L43JGH.js.map +0 -1
- package/dist/chunk-B7YGVKTE.cjs.map +0 -1
- package/dist/chunk-BV75DAKO.cjs.map +0 -1
- package/dist/chunk-BXK5TNJE.cjs.map +0 -1
- package/dist/chunk-CQCYXHCU.cjs +0 -256
- package/dist/chunk-CQCYXHCU.cjs.map +0 -1
- package/dist/chunk-DMA74PZ7.js +0 -240
- package/dist/chunk-DMA74PZ7.js.map +0 -1
- package/dist/chunk-EF46XW4Z.cjs.map +0 -1
- package/dist/chunk-EKIQE524.cjs.map +0 -1
- package/dist/chunk-EYH7OUX5.js.map +0 -1
- package/dist/chunk-FFJVCQ5R.cjs.map +0 -1
- package/dist/chunk-FIXAVBUA.cjs +0 -200
- package/dist/chunk-FIXAVBUA.cjs.map +0 -1
- package/dist/chunk-G2DOD34H.js.map +0 -1
- package/dist/chunk-GHRQ3ZJH.js.map +0 -1
- package/dist/chunk-GV5JQBPX.js.map +0 -1
- package/dist/chunk-HRA4FUO6.cjs.map +0 -1
- package/dist/chunk-I7L6CQXR.cjs.map +0 -1
- package/dist/chunk-INFSKLXE.cjs.map +0 -1
- package/dist/chunk-IY7UQPDO.cjs.map +0 -1
- package/dist/chunk-JFAXLE2J.js.map +0 -1
- package/dist/chunk-JYMQJ32S.cjs.map +0 -1
- package/dist/chunk-LZEY55QZ.cjs.map +0 -1
- package/dist/chunk-N3QTYHRZ.cjs.map +0 -1
- package/dist/chunk-NAATBUHR.cjs.map +0 -1
- package/dist/chunk-NIHESA7O.js.map +0 -1
- package/dist/chunk-NXRLGHEC.js +0 -98
- package/dist/chunk-NXRLGHEC.js.map +0 -1
- package/dist/chunk-ONWOB76P.js.map +0 -1
- package/dist/chunk-ORUPC5TV.cjs.map +0 -1
- package/dist/chunk-OT36EMM5.js.map +0 -1
- package/dist/chunk-OW2BWGST.js.map +0 -1
- package/dist/chunk-PEFJAWNR.cjs.map +0 -1
- package/dist/chunk-PEH4ZOEM.cjs.map +0 -1
- package/dist/chunk-PF3XWKE5.cjs.map +0 -1
- package/dist/chunk-QL2YTVTR.js.map +0 -1
- package/dist/chunk-QSMMFATL.js.map +0 -1
- package/dist/chunk-QYJ7RQJ2.cjs.map +0 -1
- package/dist/chunk-QZLRB3UG.js.map +0 -1
- package/dist/chunk-RRQGH7C5.cjs.map +0 -1
- package/dist/chunk-SD44QJIP.js.map +0 -1
- package/dist/chunk-SOFX4T7M.js.map +0 -1
- package/dist/chunk-SSKI6VTW.cjs.map +0 -1
- package/dist/chunk-SWMRCGL4.cjs.map +0 -1
- package/dist/chunk-TPGT236K.js.map +0 -1
- package/dist/chunk-UZUBLXVC.js.map +0 -1
- package/dist/chunk-VBHPXSCV.js.map +0 -1
- package/dist/chunk-VV4N4WY6.cjs.map +0 -1
- package/dist/chunk-WH6I7CMP.cjs.map +0 -1
- package/dist/chunk-XHJGYBYG.cjs.map +0 -1
- package/dist/chunk-XVZ4SLQB.js.map +0 -1
- package/dist/chunk-XXOBTAKA.js.map +0 -1
- package/dist/chunk-Y22SOAJM.js +0 -3
|
@@ -33,7 +33,7 @@ var scrollLockState = {
|
|
|
33
33
|
originalOverflow: null};
|
|
34
34
|
var modalOverlayVariants = classVarianceAuthority.cva(
|
|
35
35
|
[
|
|
36
|
-
"fixed inset-0
|
|
36
|
+
"fixed inset-0",
|
|
37
37
|
"bg-black/50 backdrop-blur-sm",
|
|
38
38
|
"data-[state=open]:animate-in data-[state=open]:fade-in-0",
|
|
39
39
|
"data-[state=closed]:animate-out data-[state=closed]:fade-out-0"
|
|
@@ -45,10 +45,17 @@ var modalOverlayVariants = classVarianceAuthority.cva(
|
|
|
45
45
|
);
|
|
46
46
|
var modalContentVariants = classVarianceAuthority.cva(
|
|
47
47
|
[
|
|
48
|
-
"
|
|
49
|
-
"-
|
|
50
|
-
|
|
51
|
-
"
|
|
48
|
+
"relative w-full bg-card text-card-foreground",
|
|
49
|
+
"border border-border shadow-lg",
|
|
50
|
+
// Full-screen on mobile, rounded on larger screens
|
|
51
|
+
"rounded-none sm:rounded-xl",
|
|
52
|
+
"flex flex-col",
|
|
53
|
+
// Full viewport height on mobile, constrained on larger screens
|
|
54
|
+
"max-h-dvh sm:max-h-[calc(100dvh-2rem)]",
|
|
55
|
+
"min-h-dvh sm:min-h-0",
|
|
56
|
+
// If a <form> is used as a direct child (wrapping ModalBody + ModalFooter),
|
|
57
|
+
// make it participate in the flex column layout so overflow constraints work.
|
|
58
|
+
"[&>form]:flex [&>form]:flex-col [&>form]:flex-1 [&>form]:min-h-0",
|
|
52
59
|
"focus:outline-none",
|
|
53
60
|
"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
|
|
54
61
|
"data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95",
|
|
@@ -57,13 +64,13 @@ var modalContentVariants = classVarianceAuthority.cva(
|
|
|
57
64
|
{
|
|
58
65
|
variants: {
|
|
59
66
|
size: {
|
|
60
|
-
sm: "max-w-sm",
|
|
61
|
-
md: "max-w-md",
|
|
62
|
-
lg: "max-w-lg",
|
|
63
|
-
xl: "max-w-xl",
|
|
64
|
-
"2xl": "max-w-2xl",
|
|
65
|
-
"3xl": "max-w-3xl",
|
|
66
|
-
"4xl": "max-w-4xl",
|
|
67
|
+
sm: "sm:max-w-sm",
|
|
68
|
+
md: "sm:max-w-md",
|
|
69
|
+
lg: "sm:max-w-lg",
|
|
70
|
+
xl: "sm:max-w-xl",
|
|
71
|
+
"2xl": "sm:max-w-2xl",
|
|
72
|
+
"3xl": "sm:max-w-3xl",
|
|
73
|
+
"4xl": "sm:max-w-4xl",
|
|
67
74
|
full: "max-w-[calc(100vw-2rem)]"
|
|
68
75
|
}
|
|
69
76
|
},
|
|
@@ -129,26 +136,34 @@ function Modal({
|
|
|
129
136
|
{
|
|
130
137
|
className: chunkOR5DRJCW_cjs.cn(modalOverlayVariants()),
|
|
131
138
|
"data-state": open ? "open" : "closed",
|
|
132
|
-
onClick: handleOverlayClick,
|
|
133
139
|
"aria-hidden": "true"
|
|
134
140
|
}
|
|
135
141
|
),
|
|
136
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
142
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "fixed inset-0 overflow-y-auto", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
137
143
|
"div",
|
|
138
144
|
{
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
145
|
+
className: "flex min-h-full items-center justify-center p-0 sm:p-4",
|
|
146
|
+
onClick: handleOverlayClick,
|
|
147
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
148
|
+
"div",
|
|
149
|
+
{
|
|
150
|
+
ref: focusTrapRef,
|
|
151
|
+
role: "dialog",
|
|
152
|
+
"aria-modal": "true",
|
|
153
|
+
"aria-label": ariaLabel,
|
|
154
|
+
"aria-labelledby": ariaLabelledBy || `${modalId}-title`,
|
|
155
|
+
"aria-describedby": ariaDescribedBy,
|
|
156
|
+
id: modalId,
|
|
157
|
+
tabIndex: -1,
|
|
158
|
+
"data-state": open ? "open" : "closed",
|
|
159
|
+
"data-slot": "modal",
|
|
160
|
+
className: chunkOR5DRJCW_cjs.cn(modalContentVariants({ size }), className),
|
|
161
|
+
onClick: (e) => e.stopPropagation(),
|
|
162
|
+
children
|
|
163
|
+
}
|
|
164
|
+
)
|
|
150
165
|
}
|
|
151
|
-
)
|
|
166
|
+
) })
|
|
152
167
|
] })
|
|
153
168
|
}
|
|
154
169
|
);
|
|
@@ -169,8 +184,9 @@ var ModalHeader = React__namespace.forwardRef(
|
|
|
169
184
|
"div",
|
|
170
185
|
{
|
|
171
186
|
ref,
|
|
187
|
+
"data-slot": "modal-header",
|
|
172
188
|
className: chunkOR5DRJCW_cjs.cn(
|
|
173
|
-
"flex items-center justify-between",
|
|
189
|
+
"flex shrink-0 items-center justify-between",
|
|
174
190
|
"border-border border-b px-6 py-4",
|
|
175
191
|
className
|
|
176
192
|
),
|
|
@@ -187,6 +203,7 @@ var ModalTitle = React__namespace.forwardRef(
|
|
|
187
203
|
{
|
|
188
204
|
ref,
|
|
189
205
|
id: `${modalId}-title`,
|
|
206
|
+
"data-slot": "modal-title",
|
|
190
207
|
className: chunkOR5DRJCW_cjs.cn(
|
|
191
208
|
"text-lg leading-none font-semibold tracking-tight",
|
|
192
209
|
className
|
|
@@ -216,6 +233,7 @@ var ModalClose = React__namespace.forwardRef(
|
|
|
216
233
|
ref,
|
|
217
234
|
type: "button",
|
|
218
235
|
onClick: handleClick,
|
|
236
|
+
"data-slot": "modal-close",
|
|
219
237
|
className: chunkOR5DRJCW_cjs.cn(
|
|
220
238
|
"inline-flex h-8 w-8 items-center justify-center rounded-lg",
|
|
221
239
|
"text-muted-foreground hover:text-foreground",
|
|
@@ -232,7 +250,15 @@ var ModalClose = React__namespace.forwardRef(
|
|
|
232
250
|
);
|
|
233
251
|
ModalClose.displayName = "ModalClose";
|
|
234
252
|
var ModalBody = React__namespace.forwardRef(
|
|
235
|
-
({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
253
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
254
|
+
"div",
|
|
255
|
+
{
|
|
256
|
+
ref,
|
|
257
|
+
"data-slot": "modal-body",
|
|
258
|
+
className: chunkOR5DRJCW_cjs.cn("min-h-0 flex-1 overflow-y-auto px-6 py-4", className),
|
|
259
|
+
...props
|
|
260
|
+
}
|
|
261
|
+
)
|
|
236
262
|
);
|
|
237
263
|
ModalBody.displayName = "ModalBody";
|
|
238
264
|
var ModalFooter = React__namespace.forwardRef(
|
|
@@ -240,8 +266,9 @@ var ModalFooter = React__namespace.forwardRef(
|
|
|
240
266
|
"div",
|
|
241
267
|
{
|
|
242
268
|
ref,
|
|
269
|
+
"data-slot": "modal-footer",
|
|
243
270
|
className: chunkOR5DRJCW_cjs.cn(
|
|
244
|
-
"flex items-center justify-end gap-3",
|
|
271
|
+
"flex shrink-0 items-center justify-end gap-3",
|
|
245
272
|
"border-border border-t px-6 py-4",
|
|
246
273
|
className
|
|
247
274
|
),
|
|
@@ -280,5 +307,5 @@ exports.ModalHeader = ModalHeader;
|
|
|
280
307
|
exports.ModalTitle = ModalTitle;
|
|
281
308
|
exports.modalContentVariants = modalContentVariants;
|
|
282
309
|
exports.modalOverlayVariants = modalOverlayVariants;
|
|
283
|
-
//# sourceMappingURL=chunk-
|
|
284
|
-
//# sourceMappingURL=chunk-
|
|
310
|
+
//# sourceMappingURL=chunk-AWUADXYI.cjs.map
|
|
311
|
+
//# sourceMappingURL=chunk-AWUADXYI.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Modal/Modal.tsx"],"names":["cva","React","useFocusTrap","useEscapeKey","isStorybookDocsMode","jsx","jsxs","cn"],"mappings":"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","file":"chunk-AWUADXYI.cjs","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { isStorybookDocsMode } from '../../utils/environment';\nimport { useFocusTrap } from '../../hooks/useFocusTrap';\nimport { useEscapeKey } from '../../hooks/useEscapeKey';\n\n/**\n * Modal scroll lock state manager.\n * Uses a singleton pattern with ref-like storage to track open modals\n * and manage body scroll locking across multiple modal instances.\n * Includes reset capability for testing environments.\n */\nconst scrollLockState = {\n count: 0,\n originalOverflow: null as string | null,\n reset() {\n this.count = 0;\n this.originalOverflow = null;\n },\n};\n\n// Export for testing environments\nexport const __resetScrollLockState = () => scrollLockState.reset();\n\nconst modalOverlayVariants = cva(\n [\n 'fixed inset-0',\n 'bg-black/50 backdrop-blur-sm',\n 'data-[state=open]:animate-in data-[state=open]:fade-in-0',\n 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0',\n ],\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\nconst modalContentVariants = cva(\n [\n 'relative w-full bg-card text-card-foreground',\n 'border border-border shadow-lg',\n // Full-screen on mobile, rounded on larger screens\n 'rounded-none sm:rounded-xl',\n 'flex flex-col',\n // Full viewport height on mobile, constrained on larger screens\n 'max-h-dvh sm:max-h-[calc(100dvh-2rem)]',\n 'min-h-dvh sm:min-h-0',\n // If a <form> is used as a direct child (wrapping ModalBody + ModalFooter),\n // make it participate in the flex column layout so overflow constraints work.\n '[&>form]:flex [&>form]:flex-col [&>form]:flex-1 [&>form]:min-h-0',\n 'focus:outline-none',\n 'data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95',\n 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95',\n 'duration-200',\n ],\n {\n variants: {\n size: {\n sm: 'sm:max-w-sm',\n md: 'sm:max-w-md',\n lg: 'sm:max-w-lg',\n xl: 'sm:max-w-xl',\n '2xl': 'sm:max-w-2xl',\n '3xl': 'sm:max-w-3xl',\n '4xl': 'sm:max-w-4xl',\n full: 'max-w-[calc(100vw-2rem)]',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n }\n);\n\nexport interface ModalProps extends VariantProps<typeof modalContentVariants> {\n /** Whether the modal is open */\n open: boolean;\n /** Callback when the modal should close */\n onOpenChange: (open: boolean) => void;\n /** Modal content */\n children: React.ReactNode;\n /** Whether to close when clicking the overlay */\n closeOnOverlayClick?: boolean;\n /** Whether to close when pressing Escape */\n closeOnEscape?: boolean;\n /** Additional class name for the modal content */\n className?: string;\n /** ID for the modal, used for accessibility */\n id?: string;\n /** Accessible label for the modal */\n 'aria-label'?: string;\n /** ID of the element that labels the modal */\n 'aria-labelledby'?: string;\n /** ID of the element that describes the modal */\n 'aria-describedby'?: string;\n}\n\n/**\n * An accessible modal/dialog component.\n *\n * @example\n * ```tsx\n * <Modal open={isOpen} onOpenChange={setIsOpen} size=\"lg\">\n * <ModalHeader>\n * <ModalTitle>Confirm Action</ModalTitle>\n * <ModalClose />\n * </ModalHeader>\n * <ModalBody>\n * Are you sure you want to continue?\n * </ModalBody>\n * <ModalFooter>\n * <Button variant=\"secondary\" onClick={() => setIsOpen(false)}>Cancel</Button>\n * <Button onClick={handleConfirm}>Confirm</Button>\n * </ModalFooter>\n * </Modal>\n * ```\n */\nfunction Modal({\n open,\n onOpenChange,\n children,\n size,\n closeOnOverlayClick = true,\n closeOnEscape = true,\n className,\n id,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n}: ModalProps) {\n const generatedId = React.useId();\n const modalId = id || generatedId;\n\n // Focus trap (only active when modal is open)\n const focusTrapRef = useFocusTrap<HTMLDivElement>(open);\n\n // Handle escape key\n useEscapeKey(() => {\n if (closeOnEscape && open) {\n onOpenChange(false);\n }\n }, open);\n\n // Handle overlay click\n const handleOverlayClick = React.useCallback(\n (e: React.MouseEvent) => {\n if (closeOnOverlayClick && e.target === e.currentTarget) {\n onOpenChange(false);\n }\n },\n [closeOnOverlayClick, onOpenChange]\n );\n\n // Prevent body scroll when modal is open (handles multiple modals)\n // Skip scroll lock in Storybook docs mode where multiple stories render inline\n React.useEffect(() => {\n // Skip scroll lock entirely in Storybook docs mode\n if (!open || isStorybookDocsMode()) {\n return undefined;\n }\n\n scrollLockState.count++;\n // Only capture and set overflow when first modal opens\n if (scrollLockState.count === 1) {\n scrollLockState.originalOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n }\n\n return () => {\n scrollLockState.count--;\n // Only restore overflow when last modal closes\n if (\n scrollLockState.count === 0 &&\n scrollLockState.originalOverflow !== null\n ) {\n document.body.style.overflow = scrollLockState.originalOverflow;\n scrollLockState.originalOverflow = null;\n }\n };\n }, [open]);\n\n if (!open) return null;\n\n return (\n <ModalContext.Provider\n value={{ onClose: () => onOpenChange(false), modalId }}\n >\n {/* Portal to body */}\n <div className=\"fixed inset-0 z-50\">\n {/* Overlay backdrop */}\n <div\n className={cn(modalOverlayVariants())}\n data-state={open ? 'open' : 'closed'}\n aria-hidden=\"true\"\n />\n {/* Scrollable centering container — click outside to close */}\n <div className=\"fixed inset-0 overflow-y-auto\">\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */}\n <div\n className=\"flex min-h-full items-center justify-center p-0 sm:p-4\"\n onClick={handleOverlayClick}\n >\n {/* Content */}\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-noninteractive-element-interactions */}\n <div\n ref={focusTrapRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy || `${modalId}-title`}\n aria-describedby={ariaDescribedBy}\n id={modalId}\n tabIndex={-1}\n data-state={open ? 'open' : 'closed'}\n data-slot=\"modal\"\n className={cn(modalContentVariants({ size }), className)}\n onClick={(e) => e.stopPropagation()}\n >\n {children}\n </div>\n </div>\n </div>\n </div>\n </ModalContext.Provider>\n );\n}\n\nModal.displayName = 'Modal';\n\n// ============================================================================\n// Modal Context\n// ============================================================================\n\ninterface ModalContextValue {\n onClose: () => void;\n modalId: string;\n}\n\nconst ModalContext = React.createContext<ModalContextValue | undefined>(\n undefined\n);\n\nfunction useModalContext() {\n const context = React.useContext(ModalContext);\n if (!context) {\n throw new Error('Modal components must be used within a Modal');\n }\n return context;\n}\n\n// ============================================================================\n// Modal Header\n// ============================================================================\n\nexport type ModalHeaderProps = React.HTMLAttributes<HTMLDivElement>;\n\n/**\n * Header section of a Modal.\n */\nconst ModalHeader = React.forwardRef<HTMLDivElement, ModalHeaderProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"modal-header\"\n className={cn(\n 'flex shrink-0 items-center justify-between',\n 'border-border border-b px-6 py-4',\n className\n )}\n {...props}\n />\n )\n);\n\nModalHeader.displayName = 'ModalHeader';\n\n// ============================================================================\n// Modal Title\n// ============================================================================\n\nexport type ModalTitleProps = React.HTMLAttributes<HTMLHeadingElement>;\n\n/**\n * Title for a Modal.\n */\nconst ModalTitle = React.forwardRef<HTMLHeadingElement, ModalTitleProps>(\n ({ className, children, ...props }, ref) => {\n const { modalId } = useModalContext();\n return (\n <h2\n ref={ref}\n id={`${modalId}-title`}\n data-slot=\"modal-title\"\n className={cn(\n 'text-lg leading-none font-semibold tracking-tight',\n className\n )}\n {...props}\n >\n {children}\n </h2>\n );\n }\n);\n\nModalTitle.displayName = 'ModalTitle';\n\n// ============================================================================\n// Modal Close Button\n// ============================================================================\n\nexport type ModalCloseProps = React.ButtonHTMLAttributes<HTMLButtonElement>;\n\n/**\n * Close button for a Modal.\n */\nconst ModalClose = React.forwardRef<HTMLButtonElement, ModalCloseProps>(\n ({ className, children, onClick, ...props }, ref) => {\n const { onClose } = useModalContext();\n\n const handleClick = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e);\n if (!e.defaultPrevented) {\n onClose();\n }\n },\n [onClick, onClose]\n );\n\n return (\n <button\n ref={ref}\n type=\"button\"\n onClick={handleClick}\n data-slot=\"modal-close\"\n className={cn(\n 'inline-flex h-8 w-8 items-center justify-center rounded-lg',\n 'text-muted-foreground hover:text-foreground',\n 'hover:bg-muted transition-colors',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none',\n className\n )}\n aria-label=\"Close\"\n {...props}\n >\n {children || <CloseIcon />}\n </button>\n );\n }\n);\n\nModalClose.displayName = 'ModalClose';\n\n// ============================================================================\n// Modal Body\n// ============================================================================\n\nexport type ModalBodyProps = React.HTMLAttributes<HTMLDivElement>;\n\n/**\n * Main content area of a Modal.\n */\nconst ModalBody = React.forwardRef<HTMLDivElement, ModalBodyProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"modal-body\"\n className={cn('min-h-0 flex-1 overflow-y-auto px-6 py-4', className)}\n {...props}\n />\n )\n);\n\nModalBody.displayName = 'ModalBody';\n\n// ============================================================================\n// Modal Footer\n// ============================================================================\n\nexport type ModalFooterProps = React.HTMLAttributes<HTMLDivElement>;\n\n/**\n * Footer section of a Modal, typically for action buttons.\n */\nconst ModalFooter = React.forwardRef<HTMLDivElement, ModalFooterProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"modal-footer\"\n className={cn(\n 'flex shrink-0 items-center justify-end gap-3',\n 'border-border border-t px-6 py-4',\n className\n )}\n {...props}\n />\n )\n);\n\nModalFooter.displayName = 'ModalFooter';\n\n// ============================================================================\n// Close Icon\n// ============================================================================\n\nfunction CloseIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n );\n}\n\nexport {\n Modal,\n ModalHeader,\n ModalTitle,\n ModalClose,\n ModalBody,\n ModalFooter,\n modalContentVariants,\n modalOverlayVariants,\n};\n"]}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import { Input } from './chunk-XHESCAUE.js';
|
|
2
|
+
import { formatPhoneNumber, unformatPhoneNumber, isValidPhoneNumber } from './chunk-CEHWXAAI.js';
|
|
3
|
+
import { cn } from './chunk-F3SOEIN2.js';
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var PhoneInput = React.forwardRef(
|
|
8
|
+
({
|
|
9
|
+
value = "",
|
|
10
|
+
onChange,
|
|
11
|
+
onFormattedChange,
|
|
12
|
+
validateOnBlur,
|
|
13
|
+
className,
|
|
14
|
+
onBlur,
|
|
15
|
+
hasError,
|
|
16
|
+
error,
|
|
17
|
+
...props
|
|
18
|
+
}, ref) => {
|
|
19
|
+
const [displayValue, setDisplayValue] = React.useState(
|
|
20
|
+
() => formatPhoneNumber(value)
|
|
21
|
+
);
|
|
22
|
+
const [localError, setLocalError] = React.useState();
|
|
23
|
+
React.useEffect(() => {
|
|
24
|
+
setDisplayValue(formatPhoneNumber(value));
|
|
25
|
+
}, [value]);
|
|
26
|
+
const handleChange = (e) => {
|
|
27
|
+
const formatted = formatPhoneNumber(e.target.value);
|
|
28
|
+
setDisplayValue(formatted);
|
|
29
|
+
const unformatted = unformatPhoneNumber(formatted);
|
|
30
|
+
onChange?.(unformatted);
|
|
31
|
+
onFormattedChange?.(formatted);
|
|
32
|
+
if (localError) {
|
|
33
|
+
setLocalError(void 0);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
const handleBlur = (e) => {
|
|
37
|
+
onBlur?.(e);
|
|
38
|
+
if (validateOnBlur) {
|
|
39
|
+
const unformatted = unformatPhoneNumber(displayValue);
|
|
40
|
+
if (unformatted.length > 0 && !isValidPhoneNumber(displayValue)) {
|
|
41
|
+
setLocalError("Please enter a valid 10-digit phone number");
|
|
42
|
+
} else {
|
|
43
|
+
setLocalError(void 0);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
return /* @__PURE__ */ jsx(
|
|
48
|
+
Input,
|
|
49
|
+
{
|
|
50
|
+
ref,
|
|
51
|
+
type: "tel",
|
|
52
|
+
inputMode: "numeric",
|
|
53
|
+
autoComplete: "tel-national",
|
|
54
|
+
placeholder: "(555) 555-5555",
|
|
55
|
+
value: displayValue,
|
|
56
|
+
onChange: handleChange,
|
|
57
|
+
onBlur: handleBlur,
|
|
58
|
+
hasError: hasError || !!localError,
|
|
59
|
+
error: error || localError,
|
|
60
|
+
className: cn(className),
|
|
61
|
+
...props
|
|
62
|
+
}
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
);
|
|
66
|
+
PhoneInput.displayName = "PhoneInput";
|
|
67
|
+
var PHONE_TYPES = [
|
|
68
|
+
{ value: "cell", label: "Cell" },
|
|
69
|
+
{ value: "landline", label: "Landline" },
|
|
70
|
+
{ value: "home", label: "Home" },
|
|
71
|
+
{ value: "work", label: "Work" },
|
|
72
|
+
{ value: "fax", label: "Fax" }
|
|
73
|
+
];
|
|
74
|
+
function PhoneInputGroup({
|
|
75
|
+
value,
|
|
76
|
+
onChange,
|
|
77
|
+
minEntries = 1,
|
|
78
|
+
maxEntries = 5,
|
|
79
|
+
required = false,
|
|
80
|
+
disabled = false,
|
|
81
|
+
validateOnBlur = false,
|
|
82
|
+
label,
|
|
83
|
+
typeLabels,
|
|
84
|
+
className
|
|
85
|
+
}) {
|
|
86
|
+
const phones = React.useMemo(() => {
|
|
87
|
+
if (value.length >= minEntries) return value;
|
|
88
|
+
const padding = Array(minEntries - value.length).fill(null).map(() => ({ number: "", type: "cell" }));
|
|
89
|
+
return [...value, ...padding];
|
|
90
|
+
}, [value, minEntries]);
|
|
91
|
+
const handlePhoneChange = (index, number) => {
|
|
92
|
+
const updated = [...phones];
|
|
93
|
+
updated[index] = { ...updated[index], number };
|
|
94
|
+
onChange(updated);
|
|
95
|
+
};
|
|
96
|
+
const handleTypeChange = (index, type) => {
|
|
97
|
+
const updated = [...phones];
|
|
98
|
+
updated[index] = { ...updated[index], type };
|
|
99
|
+
onChange(updated);
|
|
100
|
+
};
|
|
101
|
+
const handleAdd = () => {
|
|
102
|
+
if (phones.length < maxEntries) {
|
|
103
|
+
onChange([...phones, { number: "", type: "cell" }]);
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
const handleRemove = (index) => {
|
|
107
|
+
if (phones.length > minEntries) {
|
|
108
|
+
onChange(phones.filter((_, i) => i !== index));
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
const getTypeLabel = (type) => {
|
|
112
|
+
if (typeLabels?.[type]) return typeLabels[type];
|
|
113
|
+
return PHONE_TYPES.find((t) => t.value === type)?.label || type;
|
|
114
|
+
};
|
|
115
|
+
const canAdd = phones.length < maxEntries;
|
|
116
|
+
const canRemove = phones.length > minEntries;
|
|
117
|
+
return /* @__PURE__ */ jsx("div", { "data-slot": "phone-group", className: cn("space-y-3", className), children: phones.map((phone, index) => /* @__PURE__ */ jsxs(
|
|
118
|
+
"div",
|
|
119
|
+
{
|
|
120
|
+
"data-slot": "phone-row",
|
|
121
|
+
className: "flex items-start gap-2",
|
|
122
|
+
children: [
|
|
123
|
+
/* @__PURE__ */ jsx("div", { className: "flex-1", children: /* @__PURE__ */ jsx(
|
|
124
|
+
PhoneInput,
|
|
125
|
+
{
|
|
126
|
+
label: index === 0 ? label : void 0,
|
|
127
|
+
value: phone.number,
|
|
128
|
+
onChange: (num) => handlePhoneChange(index, num),
|
|
129
|
+
disabled,
|
|
130
|
+
validateOnBlur,
|
|
131
|
+
required: required && index === 0
|
|
132
|
+
}
|
|
133
|
+
) }),
|
|
134
|
+
/* @__PURE__ */ jsxs("div", { className: "w-24 shrink-0 sm:w-32", children: [
|
|
135
|
+
/* @__PURE__ */ jsx("label", { htmlFor: `phone-type-${index}`, className: "sr-only", children: "Phone type" }),
|
|
136
|
+
/* @__PURE__ */ jsx(
|
|
137
|
+
"select",
|
|
138
|
+
{
|
|
139
|
+
id: `phone-type-${index}`,
|
|
140
|
+
"data-slot": "phone-type-select",
|
|
141
|
+
value: phone.type,
|
|
142
|
+
onChange: (e) => handleTypeChange(index, e.target.value),
|
|
143
|
+
disabled,
|
|
144
|
+
className: cn(
|
|
145
|
+
"h-10 w-full rounded-md border px-3 py-2 text-sm",
|
|
146
|
+
"border-gray-300 bg-white text-gray-900",
|
|
147
|
+
"focus:border-brand-500 focus:ring-brand-500/20 focus:ring-2 focus:outline-none",
|
|
148
|
+
"disabled:cursor-not-allowed disabled:bg-gray-50 disabled:text-gray-500",
|
|
149
|
+
"dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100",
|
|
150
|
+
"dark:focus:border-brand-400 dark:focus:ring-brand-400/20",
|
|
151
|
+
index === 0 && label ? "mt-[26px]" : ""
|
|
152
|
+
),
|
|
153
|
+
children: PHONE_TYPES.map((type) => /* @__PURE__ */ jsx("option", { value: type.value, children: getTypeLabel(type.value) }, type.value))
|
|
154
|
+
}
|
|
155
|
+
)
|
|
156
|
+
] }),
|
|
157
|
+
/* @__PURE__ */ jsx(
|
|
158
|
+
"div",
|
|
159
|
+
{
|
|
160
|
+
"data-slot": "phone-action",
|
|
161
|
+
className: cn(
|
|
162
|
+
"flex shrink-0 items-center",
|
|
163
|
+
index === 0 && label ? "mt-[26px]" : ""
|
|
164
|
+
),
|
|
165
|
+
children: index === 0 ? /* @__PURE__ */ jsx(
|
|
166
|
+
"button",
|
|
167
|
+
{
|
|
168
|
+
type: "button",
|
|
169
|
+
"data-slot": "phone-add-btn",
|
|
170
|
+
onClick: handleAdd,
|
|
171
|
+
disabled: disabled || !canAdd,
|
|
172
|
+
className: cn(
|
|
173
|
+
"rounded-full p-2 transition-colors",
|
|
174
|
+
"text-brand-600 hover:bg-brand-50",
|
|
175
|
+
"disabled:cursor-not-allowed disabled:text-gray-300 disabled:hover:bg-transparent",
|
|
176
|
+
"dark:text-brand-400 dark:hover:bg-brand-900/20",
|
|
177
|
+
"dark:disabled:text-gray-600"
|
|
178
|
+
),
|
|
179
|
+
"aria-label": "Add phone number",
|
|
180
|
+
children: /* @__PURE__ */ jsx(
|
|
181
|
+
"svg",
|
|
182
|
+
{
|
|
183
|
+
"data-slot": "phone-add-icon",
|
|
184
|
+
className: "h-5 w-5",
|
|
185
|
+
fill: "none",
|
|
186
|
+
viewBox: "0 0 24 24",
|
|
187
|
+
stroke: "currentColor",
|
|
188
|
+
children: /* @__PURE__ */ jsx(
|
|
189
|
+
"path",
|
|
190
|
+
{
|
|
191
|
+
strokeLinecap: "round",
|
|
192
|
+
strokeLinejoin: "round",
|
|
193
|
+
strokeWidth: 2,
|
|
194
|
+
d: "M12 4v16m8-8H4"
|
|
195
|
+
}
|
|
196
|
+
)
|
|
197
|
+
}
|
|
198
|
+
)
|
|
199
|
+
}
|
|
200
|
+
) : /* @__PURE__ */ jsx(
|
|
201
|
+
"button",
|
|
202
|
+
{
|
|
203
|
+
type: "button",
|
|
204
|
+
"data-slot": "phone-remove-btn",
|
|
205
|
+
onClick: () => handleRemove(index),
|
|
206
|
+
disabled: disabled || !canRemove,
|
|
207
|
+
className: cn(
|
|
208
|
+
"rounded-full p-2 transition-colors",
|
|
209
|
+
"text-red-600 hover:bg-red-50",
|
|
210
|
+
"disabled:cursor-not-allowed disabled:text-gray-300 disabled:hover:bg-transparent",
|
|
211
|
+
"dark:text-red-400 dark:hover:bg-red-900/20",
|
|
212
|
+
"dark:disabled:text-gray-600"
|
|
213
|
+
),
|
|
214
|
+
"aria-label": "Remove phone number",
|
|
215
|
+
children: /* @__PURE__ */ jsx(
|
|
216
|
+
"svg",
|
|
217
|
+
{
|
|
218
|
+
"data-slot": "phone-remove-icon",
|
|
219
|
+
className: "h-5 w-5",
|
|
220
|
+
fill: "none",
|
|
221
|
+
viewBox: "0 0 24 24",
|
|
222
|
+
stroke: "currentColor",
|
|
223
|
+
children: /* @__PURE__ */ jsx(
|
|
224
|
+
"path",
|
|
225
|
+
{
|
|
226
|
+
strokeLinecap: "round",
|
|
227
|
+
strokeLinejoin: "round",
|
|
228
|
+
strokeWidth: 2,
|
|
229
|
+
d: "M20 12H4"
|
|
230
|
+
}
|
|
231
|
+
)
|
|
232
|
+
}
|
|
233
|
+
)
|
|
234
|
+
}
|
|
235
|
+
)
|
|
236
|
+
}
|
|
237
|
+
)
|
|
238
|
+
]
|
|
239
|
+
},
|
|
240
|
+
index
|
|
241
|
+
)) });
|
|
242
|
+
}
|
|
243
|
+
PhoneInputGroup.displayName = "PhoneInputGroup";
|
|
244
|
+
|
|
245
|
+
export { PhoneInput, PhoneInputGroup };
|
|
246
|
+
//# sourceMappingURL=chunk-B43FRU5R.js.map
|
|
247
|
+
//# sourceMappingURL=chunk-B43FRU5R.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/PhoneInput/PhoneInput.tsx"],"names":[],"mappings":"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","file":"chunk-B43FRU5R.js","sourcesContent":["import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport {\n formatPhoneNumber,\n unformatPhoneNumber,\n isValidPhoneNumber,\n} from '../../utils/phone';\nimport { Input, type InputProps } from '../Input';\n\nexport interface PhoneInputProps extends Omit<\n InputProps,\n 'type' | 'onChange' | 'value'\n> {\n /** The phone number value (can be formatted or unformatted) */\n value?: string;\n /** Callback fired when the value changes, receives the unformatted value */\n onChange?: (value: string) => void;\n /** Callback fired when the formatted value changes */\n onFormattedChange?: (formattedValue: string) => void;\n /** Whether to validate and show error state for incomplete phone numbers */\n validateOnBlur?: boolean;\n}\n\n/**\n * A phone number input that automatically formats to US format: (XXX) XXX-XXXX\n *\n * @example\n * ```tsx\n * const [phone, setPhone] = useState('');\n * <PhoneInput\n * label=\"Phone Number\"\n * value={phone}\n * onChange={setPhone}\n * validateOnBlur\n * />\n * ```\n */\nconst PhoneInput = React.forwardRef<HTMLInputElement, PhoneInputProps>(\n (\n {\n value = '',\n onChange,\n onFormattedChange,\n validateOnBlur,\n className,\n onBlur,\n hasError,\n error,\n ...props\n },\n ref\n ) => {\n const [displayValue, setDisplayValue] = React.useState(() =>\n formatPhoneNumber(value)\n );\n const [localError, setLocalError] = React.useState<string | undefined>();\n\n // Sync external value changes\n React.useEffect(() => {\n setDisplayValue(formatPhoneNumber(value));\n }, [value]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const formatted = formatPhoneNumber(e.target.value);\n setDisplayValue(formatted);\n\n const unformatted = unformatPhoneNumber(formatted);\n onChange?.(unformatted);\n onFormattedChange?.(formatted);\n\n // Clear error when user starts typing again\n if (localError) {\n setLocalError(undefined);\n }\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n onBlur?.(e);\n\n if (validateOnBlur) {\n const unformatted = unformatPhoneNumber(displayValue);\n if (unformatted.length > 0 && !isValidPhoneNumber(displayValue)) {\n setLocalError('Please enter a valid 10-digit phone number');\n } else {\n setLocalError(undefined);\n }\n }\n };\n\n return (\n <Input\n ref={ref}\n type=\"tel\"\n inputMode=\"numeric\"\n autoComplete=\"tel-national\"\n placeholder=\"(555) 555-5555\"\n value={displayValue}\n onChange={handleChange}\n onBlur={handleBlur}\n hasError={hasError || !!localError}\n error={error || localError}\n className={cn(className)}\n {...props}\n />\n );\n }\n);\n\nPhoneInput.displayName = 'PhoneInput';\n\n// =============================================================================\n// Phone Types\n// =============================================================================\n\nexport type PhoneType = 'cell' | 'landline' | 'home' | 'work' | 'fax';\n\nexport interface PhoneEntry {\n number: string;\n type: PhoneType;\n}\n\nconst PHONE_TYPES: { value: PhoneType; label: string }[] = [\n { value: 'cell', label: 'Cell' },\n { value: 'landline', label: 'Landline' },\n { value: 'home', label: 'Home' },\n { value: 'work', label: 'Work' },\n { value: 'fax', label: 'Fax' },\n];\n\n// =============================================================================\n// PhoneInputGroup\n// =============================================================================\n\nexport interface PhoneInputGroupProps {\n /** Array of phone entries */\n value: PhoneEntry[];\n /** Callback when phone entries change */\n onChange: (phones: PhoneEntry[]) => void;\n /** Minimum number of phone entries (default: 1) */\n minEntries?: number;\n /** Maximum number of phone entries (default: 5) */\n maxEntries?: number;\n /** Whether the first entry is required */\n required?: boolean;\n /** Whether all inputs are disabled */\n disabled?: boolean;\n /** Validate on blur */\n validateOnBlur?: boolean;\n /** Label for the phone input */\n label?: string;\n /** Labels for type options (for i18n) */\n typeLabels?: Record<PhoneType, string>;\n /** Custom className */\n className?: string;\n}\n\n/**\n * A group of phone inputs with type selection and add/remove functionality.\n *\n * @example\n * ```tsx\n * const [phones, setPhones] = useState<PhoneEntry[]>([\n * { number: '', type: 'cell' }\n * ]);\n *\n * <PhoneInputGroup\n * value={phones}\n * onChange={setPhones}\n * required\n * />\n * ```\n */\nfunction PhoneInputGroup({\n value,\n onChange,\n minEntries = 1,\n maxEntries = 5,\n required = false,\n disabled = false,\n validateOnBlur = false,\n label,\n typeLabels,\n className,\n}: PhoneInputGroupProps) {\n // Ensure we always have at least minEntries\n const phones = React.useMemo(() => {\n if (value.length >= minEntries) return value;\n const padding: PhoneEntry[] = Array(minEntries - value.length)\n .fill(null)\n .map(() => ({ number: '', type: 'cell' as PhoneType }));\n return [...value, ...padding];\n }, [value, minEntries]);\n\n const handlePhoneChange = (index: number, number: string) => {\n const updated = [...phones];\n updated[index] = { ...updated[index], number };\n onChange(updated);\n };\n\n const handleTypeChange = (index: number, type: PhoneType) => {\n const updated = [...phones];\n updated[index] = { ...updated[index], type };\n onChange(updated);\n };\n\n const handleAdd = () => {\n if (phones.length < maxEntries) {\n onChange([...phones, { number: '', type: 'cell' }]);\n }\n };\n\n const handleRemove = (index: number) => {\n if (phones.length > minEntries) {\n onChange(phones.filter((_, i) => i !== index));\n }\n };\n\n const getTypeLabel = (type: PhoneType): string => {\n if (typeLabels?.[type]) return typeLabels[type];\n return PHONE_TYPES.find((t) => t.value === type)?.label || type;\n };\n\n const canAdd = phones.length < maxEntries;\n const canRemove = phones.length > minEntries;\n\n return (\n <div data-slot=\"phone-group\" className={cn('space-y-3', className)}>\n {phones.map((phone, index) => (\n <div\n key={index}\n data-slot=\"phone-row\"\n className=\"flex items-start gap-2\"\n >\n {/* Phone number input */}\n <div className=\"flex-1\">\n <PhoneInput\n label={index === 0 ? label : undefined}\n value={phone.number}\n onChange={(num) => handlePhoneChange(index, num)}\n disabled={disabled}\n validateOnBlur={validateOnBlur}\n required={required && index === 0}\n />\n </div>\n\n {/* Type selector */}\n <div className=\"w-24 shrink-0 sm:w-32\">\n <label htmlFor={`phone-type-${index}`} className=\"sr-only\">\n Phone type\n </label>\n <select\n id={`phone-type-${index}`}\n data-slot=\"phone-type-select\"\n value={phone.type}\n onChange={(e) =>\n handleTypeChange(index, e.target.value as PhoneType)\n }\n disabled={disabled}\n className={cn(\n 'h-10 w-full rounded-md border px-3 py-2 text-sm',\n 'border-gray-300 bg-white text-gray-900',\n 'focus:border-brand-500 focus:ring-brand-500/20 focus:ring-2 focus:outline-none',\n 'disabled:cursor-not-allowed disabled:bg-gray-50 disabled:text-gray-500',\n 'dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100',\n 'dark:focus:border-brand-400 dark:focus:ring-brand-400/20',\n index === 0 && label ? 'mt-[26px]' : ''\n )}\n >\n {PHONE_TYPES.map((type) => (\n <option key={type.value} value={type.value}>\n {getTypeLabel(type.value)}\n </option>\n ))}\n </select>\n </div>\n\n {/* Add/Remove buttons */}\n <div\n data-slot=\"phone-action\"\n className={cn(\n 'flex shrink-0 items-center',\n index === 0 && label ? 'mt-[26px]' : ''\n )}\n >\n {index === 0 ? (\n <button\n type=\"button\"\n data-slot=\"phone-add-btn\"\n onClick={handleAdd}\n disabled={disabled || !canAdd}\n className={cn(\n 'rounded-full p-2 transition-colors',\n 'text-brand-600 hover:bg-brand-50',\n 'disabled:cursor-not-allowed disabled:text-gray-300 disabled:hover:bg-transparent',\n 'dark:text-brand-400 dark:hover:bg-brand-900/20',\n 'dark:disabled:text-gray-600'\n )}\n aria-label=\"Add phone number\"\n >\n <svg\n data-slot=\"phone-add-icon\"\n className=\"h-5 w-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 4v16m8-8H4\"\n />\n </svg>\n </button>\n ) : (\n <button\n type=\"button\"\n data-slot=\"phone-remove-btn\"\n onClick={() => handleRemove(index)}\n disabled={disabled || !canRemove}\n className={cn(\n 'rounded-full p-2 transition-colors',\n 'text-red-600 hover:bg-red-50',\n 'disabled:cursor-not-allowed disabled:text-gray-300 disabled:hover:bg-transparent',\n 'dark:text-red-400 dark:hover:bg-red-900/20',\n 'dark:disabled:text-gray-600'\n )}\n aria-label=\"Remove phone number\"\n >\n <svg\n data-slot=\"phone-remove-icon\"\n className=\"h-5 w-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M20 12H4\"\n />\n </svg>\n </button>\n )}\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nPhoneInputGroup.displayName = 'PhoneInputGroup';\n\nexport { PhoneInput, PhoneInputGroup };\n"]}
|