@customafk/lunas-ui 0.0.57 → 0.0.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/README.md +248 -99
- package/dist/{add-new-B9KK77jE.js → add-new-BrbEoynl.js} +1 -1
- package/dist/{add-new-B9KK77jE.js.map → add-new-BrbEoynl.js.map} +1 -1
- package/dist/{add-new-B9vW0r69.cjs → add-new-C9Gjd7QJ.cjs} +1 -1
- package/dist/{add-new-B9vW0r69.cjs.map → add-new-C9Gjd7QJ.cjs.map} +1 -1
- package/dist/alert-dialog-CnUUZRzI.js +2 -0
- package/dist/alert-dialog-CnUUZRzI.js.map +1 -0
- package/dist/{alert-dialog-Bc-61QzL.cjs → alert-dialog-csUZX4AP.cjs} +2 -2
- package/dist/alert-dialog-csUZX4AP.cjs.map +1 -0
- package/dist/{badge-1pcWNSLo.js → badge-gByXCsor.js} +2 -2
- package/dist/{badge-1pcWNSLo.js.map → badge-gByXCsor.js.map} +1 -1
- package/dist/{badge-xqIWOEbF.cjs → badge-i7tq2_AR.cjs} +2 -2
- package/dist/{badge-xqIWOEbF.cjs.map → badge-i7tq2_AR.cjs.map} +1 -1
- package/dist/{button-ChLnQHG9.d.ts → button-BHhyePyp.d.ts} +3 -3
- package/dist/button-ChpGfVjG.cjs.map +1 -1
- package/dist/button-DL_i4AVi.js.map +1 -1
- package/dist/{calendar-rpgciCA-.cjs → calendar-DtHmsN1p.cjs} +2 -2
- package/dist/calendar-DtHmsN1p.cjs.map +1 -0
- package/dist/{calendar-CB_hTeGT.js → calendar-aC4BQig6.js} +2 -2
- package/dist/calendar-aC4BQig6.js.map +1 -0
- package/dist/cards/simple-card.cjs +1 -1
- package/dist/cards/simple-card.cjs.map +1 -1
- package/dist/cards/simple-card.d.cts +0 -1
- package/dist/cards/simple-card.d.ts +0 -1
- package/dist/cards/simple-card.js +1 -1
- package/dist/cards/simple-card.js.map +1 -1
- package/dist/command-B3A4F1pB.js.map +1 -1
- package/dist/{command-CQ0BKof5.d.ts → command-C6YVs0fB.d.ts} +12 -12
- package/dist/command-D5rQByNQ.cjs.map +1 -1
- package/dist/{command-BkU08119.d.cts → command-Duxn64SV.d.cts} +12 -12
- package/dist/data-display/country.cjs +1 -1
- package/dist/data-display/country.cjs.map +1 -1
- package/dist/data-display/country.d.cts +0 -1
- package/dist/data-display/country.d.ts +1 -2
- package/dist/data-display/country.js +1 -1
- package/dist/data-display/country.js.map +1 -1
- package/dist/data-display/data-list.cjs +1 -1
- package/dist/data-display/data-list.js +1 -1
- package/dist/data-display/date-tooltip.cjs +1 -1
- package/dist/data-display/date-tooltip.js +1 -1
- package/dist/data-display/date.cjs +1 -1
- package/dist/data-display/date.d.cts +0 -2
- package/dist/data-display/date.d.ts +0 -2
- package/dist/data-display/date.js +1 -1
- package/dist/data-display/empty.cjs +1 -1
- package/dist/data-display/empty.d.ts +2 -2
- package/dist/data-display/empty.js +1 -1
- package/dist/data-display/name.cjs +1 -1
- package/dist/data-display/name.cjs.map +1 -1
- package/dist/data-display/name.d.cts +0 -2
- package/dist/data-display/name.d.ts +0 -2
- package/dist/data-display/name.js +1 -1
- package/dist/data-display/name.js.map +1 -1
- package/dist/data-display/phone-number.cjs +1 -1
- package/dist/data-display/phone-number.js +1 -1
- package/dist/data-display/role-badge.cjs +1 -1
- package/dist/data-display/role-badge.cjs.map +1 -1
- package/dist/data-display/role-badge.d.cts +0 -1
- package/dist/data-display/role-badge.d.ts +1 -2
- package/dist/data-display/role-badge.js +1 -1
- package/dist/data-display/role-badge.js.map +1 -1
- package/dist/data-display/statistic.cjs +1 -1
- package/dist/data-display/statistic.cjs.map +1 -1
- package/dist/data-display/statistic.d.cts +4 -4
- package/dist/data-display/statistic.d.ts +4 -4
- package/dist/data-display/statistic.js +1 -1
- package/dist/data-display/statistic.js.map +1 -1
- package/dist/date-Cbx2drzh.js +2 -0
- package/dist/date-Cbx2drzh.js.map +1 -0
- package/dist/date-qVDm6BT3.cjs +2 -0
- package/dist/date-qVDm6BT3.cjs.map +1 -0
- package/dist/dialog-BEJ3krbY.js.map +1 -1
- package/dist/{dialog-Dt7Z19tQ.d.ts → dialog-Dra_FGdL.d.ts} +12 -12
- package/dist/dialog-E5OYibMU.cjs.map +1 -1
- package/dist/{dialog-DBHKJa6T.d.cts → dialog-uj9sAbgt.d.cts} +12 -12
- package/dist/dialogs/confirm-dialog.cjs +1 -1
- package/dist/dialogs/confirm-dialog.js +1 -1
- package/dist/dialogs/detail-dialog/component/sidebar.cjs +1 -1
- package/dist/dialogs/detail-dialog/component/sidebar.d.cts +27 -28
- package/dist/dialogs/detail-dialog/component/sidebar.d.ts +4 -5
- package/dist/dialogs/detail-dialog/component/sidebar.js +1 -1
- package/dist/dialogs/detail-dialog/index.cjs +1 -1
- package/dist/dialogs/detail-dialog/index.cjs.map +1 -1
- package/dist/dialogs/detail-dialog/index.js +1 -1
- package/dist/dialogs/detail-dialog/index.js.map +1 -1
- package/dist/dialogs/error-dialog.cjs +1 -1
- package/dist/dialogs/error-dialog.d.cts +0 -2
- package/dist/dialogs/error-dialog.d.ts +0 -2
- package/dist/dialogs/error-dialog.js +1 -1
- package/dist/dialogs/form-dialog.cjs +1 -1
- package/dist/dialogs/form-dialog.cjs.map +1 -1
- package/dist/dialogs/form-dialog.d.cts +2 -2
- package/dist/dialogs/form-dialog.d.ts +2 -2
- package/dist/dialogs/form-dialog.js +1 -1
- package/dist/dialogs/form-dialog.js.map +1 -1
- package/dist/dialogs/loading-dialog.cjs +1 -1
- package/dist/dialogs/loading-dialog.cjs.map +1 -1
- package/dist/dialogs/loading-dialog.d.cts +0 -2
- package/dist/dialogs/loading-dialog.d.ts +0 -2
- package/dist/dialogs/loading-dialog.js +1 -1
- package/dist/dialogs/loading-dialog.js.map +1 -1
- package/dist/dropdown-menu-BF9QbIfo.js.map +1 -1
- package/dist/dropdown-menu-CIldv8D7.cjs.map +1 -1
- package/dist/error-dialog-Be_eV-D7.js +2 -0
- package/dist/error-dialog-Be_eV-D7.js.map +1 -0
- package/dist/error-dialog-CsZ9SHEm.cjs +2 -0
- package/dist/error-dialog-CsZ9SHEm.cjs.map +1 -0
- package/dist/{flex-uJ4bFSYt.js → flex-D_GSLR10.js} +2 -2
- package/dist/{flex-uJ4bFSYt.js.map → flex-D_GSLR10.js.map} +1 -1
- package/dist/{flex-DHnsdjKn.cjs → flex-DaTrJCBr.cjs} +2 -2
- package/dist/{flex-DHnsdjKn.cjs.map → flex-DaTrJCBr.cjs.map} +1 -1
- package/dist/form-Dcd2HzUB.cjs +2 -0
- package/dist/form-Dcd2HzUB.cjs.map +1 -0
- package/dist/form-RRTCXIG6.js +2 -0
- package/dist/form-RRTCXIG6.js.map +1 -0
- package/dist/form-wrapper-CjFQKRzY.cjs +2 -0
- package/dist/form-wrapper-CjFQKRzY.cjs.map +1 -0
- package/dist/form-wrapper-D-KkrCiZ.js +2 -0
- package/dist/form-wrapper-D-KkrCiZ.js.map +1 -0
- package/dist/forms/combobox-field.cjs +1 -1
- package/dist/forms/combobox-field.cjs.map +1 -1
- package/dist/forms/combobox-field.d.cts +2 -2
- package/dist/forms/combobox-field.d.ts +2 -2
- package/dist/forms/combobox-field.js +1 -1
- package/dist/forms/combobox-field.js.map +1 -1
- package/dist/forms/date-field.cjs +1 -1
- package/dist/forms/date-field.cjs.map +1 -1
- package/dist/forms/date-field.d.cts +2 -2
- package/dist/forms/date-field.d.ts +2 -2
- package/dist/forms/date-field.js +1 -1
- package/dist/forms/date-field.js.map +1 -1
- package/dist/forms/form-wrapper.cjs +1 -1
- package/dist/forms/form-wrapper.d.cts +2 -3
- package/dist/forms/form-wrapper.d.ts +2 -3
- package/dist/forms/form-wrapper.js +1 -1
- package/dist/forms/multi-select-field.cjs +1 -1
- package/dist/forms/multi-select-field.cjs.map +1 -1
- package/dist/forms/multi-select-field.d.cts +2 -2
- package/dist/forms/multi-select-field.js +1 -1
- package/dist/forms/multi-select-field.js.map +1 -1
- package/dist/forms/number-field.cjs +1 -1
- package/dist/forms/number-field.cjs.map +1 -1
- package/dist/forms/number-field.d.cts +2 -2
- package/dist/forms/number-field.d.ts +2 -2
- package/dist/forms/number-field.js +1 -1
- package/dist/forms/number-field.js.map +1 -1
- package/dist/forms/password-field.cjs +1 -1
- package/dist/forms/password-field.cjs.map +1 -1
- package/dist/forms/password-field.d.cts +2 -2
- package/dist/forms/password-field.d.ts +2 -2
- package/dist/forms/password-field.js +1 -1
- package/dist/forms/password-field.js.map +1 -1
- package/dist/forms/select-field.cjs +1 -1
- package/dist/forms/select-field.cjs.map +1 -1
- package/dist/forms/select-field.d.cts +2 -2
- package/dist/forms/select-field.d.ts +2 -2
- package/dist/forms/select-field.js +1 -1
- package/dist/forms/select-field.js.map +1 -1
- package/dist/forms/switch-field.cjs +1 -1
- package/dist/forms/switch-field.cjs.map +1 -1
- package/dist/forms/switch-field.d.cts +2 -2
- package/dist/forms/switch-field.d.ts +2 -2
- package/dist/forms/switch-field.js +1 -1
- package/dist/forms/switch-field.js.map +1 -1
- package/dist/forms/text-field.cjs +1 -1
- package/dist/forms/text-field.cjs.map +1 -1
- package/dist/forms/text-field.d.cts +2 -2
- package/dist/forms/text-field.d.ts +2 -2
- package/dist/forms/text-field.js +1 -1
- package/dist/forms/text-field.js.map +1 -1
- package/dist/forms/textarea-field.cjs +1 -1
- package/dist/forms/textarea-field.d.cts +2 -2
- package/dist/forms/textarea-field.d.ts +2 -2
- package/dist/forms/textarea-field.js +1 -1
- package/dist/{input-BQYGZywO.d.cts → input-6yLVoluZ.d.cts} +3 -3
- package/dist/{input-OWyLq45f.js → input-B2PP82lE.js} +2 -2
- package/dist/input-B2PP82lE.js.map +1 -0
- package/dist/{input-B8bT3wuo.cjs → input-DQF8Uxmk.cjs} +2 -2
- package/dist/input-DQF8Uxmk.cjs.map +1 -0
- package/dist/{input-B8FXpdwz.d.ts → input-MftSrRAM.d.ts} +3 -3
- package/dist/label-BpefWj7m.js +2 -0
- package/dist/{label-BQ52Pjw-.js.map → label-BpefWj7m.js.map} +1 -1
- package/dist/label-BvHMsK0O.cjs +2 -0
- package/dist/{label-3eYQRRYp.cjs.map → label-BvHMsK0O.cjs.map} +1 -1
- package/dist/layouts/app-layout/index.cjs +1 -1
- package/dist/layouts/app-layout/index.cjs.map +1 -1
- package/dist/layouts/app-layout/index.d.cts +25 -25
- package/dist/layouts/app-layout/index.d.ts +26 -26
- package/dist/layouts/app-layout/index.js +1 -1
- package/dist/layouts/app-layout/index.js.map +1 -1
- package/dist/layouts/flex.cjs +1 -1
- package/dist/layouts/flex.d.cts +2 -2
- package/dist/layouts/flex.d.ts +2 -2
- package/dist/layouts/flex.js +1 -1
- package/dist/{multi-select-DoV9aD32.cjs → multi-select-Ch4hJ1ZJ.cjs} +2 -2
- package/dist/multi-select-Ch4hJ1ZJ.cjs.map +1 -0
- package/dist/multi-select-l55hOOtW.js +2 -0
- package/dist/multi-select-l55hOOtW.js.map +1 -0
- package/dist/paragraph-BsEYXIR3.cjs.map +1 -1
- package/dist/paragraph-D4klQX4h.js.map +1 -1
- package/dist/popover-BAGWkHPy.js.map +1 -1
- package/dist/popover-sgf8XI5P.cjs.map +1 -1
- package/dist/progress-CMMXIQct.js +2 -0
- package/dist/{progress-DPisovgi.js.map → progress-CMMXIQct.js.map} +1 -1
- package/dist/progress-IkXemE6u.cjs +2 -0
- package/dist/{progress-MyGITZ3w.cjs.map → progress-IkXemE6u.cjs.map} +1 -1
- package/dist/{refresh-By25Z7zj.cjs → refresh-CAScDb8R.cjs} +1 -1
- package/dist/{refresh-By25Z7zj.cjs.map → refresh-CAScDb8R.cjs.map} +1 -1
- package/dist/{refresh-CMzmHeMf.js → refresh-D4LYYQln.js} +1 -1
- package/dist/{refresh-CMzmHeMf.js.map → refresh-D4LYYQln.js.map} +1 -1
- package/dist/scroll-area-CPQoJKt1.js.map +1 -1
- package/dist/scroll-area-D7O1NyZn.cjs.map +1 -1
- package/dist/{search-input-BmAoqcee.cjs → search-input-B1eWzWZj.cjs} +2 -2
- package/dist/{search-input-BmAoqcee.cjs.map → search-input-B1eWzWZj.cjs.map} +1 -1
- package/dist/{search-input-Ba8aUECr.js → search-input-BZtDbdjl.js} +2 -2
- package/dist/{search-input-Ba8aUECr.js.map → search-input-BZtDbdjl.js.map} +1 -1
- package/dist/select-C7na5CE5.cjs +2 -0
- package/dist/select-C7na5CE5.cjs.map +1 -0
- package/dist/select-VpccO3h2.js +2 -0
- package/dist/select-VpccO3h2.js.map +1 -0
- package/dist/{separator-DJ-8s4B1.d.cts → separator-C0YKWxkk.d.cts} +3 -3
- package/dist/{separator-CJHYnmH1.d.ts → separator-D6-cZUiB.d.ts} +3 -3
- package/dist/{separator-Bp3QE0oo.js → separator-DW2rRXaF.js} +1 -1
- package/dist/{separator-Bp3QE0oo.js.map → separator-DW2rRXaF.js.map} +1 -1
- package/dist/{separator-CECnaAdc.cjs → separator-DbcVW13X.cjs} +1 -1
- package/dist/{separator-CECnaAdc.cjs.map → separator-DbcVW13X.cjs.map} +1 -1
- package/dist/{sheet-CvstHEA7.cjs → sheet-BoPRwRzk.cjs} +1 -1
- package/dist/sheet-BoPRwRzk.cjs.map +1 -0
- package/dist/{sheet-B2CNJMzu.js → sheet-CJscm87z.js} +1 -1
- package/dist/sheet-CJscm87z.js.map +1 -0
- package/dist/sidebar-BCsgl6i1.cjs +2 -0
- package/dist/sidebar-BCsgl6i1.cjs.map +1 -0
- package/dist/sidebar-BEgx0ScE.js +2 -0
- package/dist/sidebar-BEgx0ScE.js.map +1 -0
- package/dist/{skeleton-DcRggqJa.cjs → skeleton-1syVaGRv.cjs} +1 -1
- package/dist/{skeleton-DcRggqJa.cjs.map → skeleton-1syVaGRv.cjs.map} +1 -1
- package/dist/{skeleton-BSWmwJUf.js → skeleton-D_7tekGk.js} +1 -1
- package/dist/{skeleton-BSWmwJUf.js.map → skeleton-D_7tekGk.js.map} +1 -1
- package/dist/{switch-FHFPaOds.js → switch-DxMWudiz.js} +2 -2
- package/dist/{switch-FHFPaOds.js.map → switch-DxMWudiz.js.map} +1 -1
- package/dist/{switch-ozERHRm5.cjs → switch-fR9s61cJ.cjs} +2 -2
- package/dist/{switch-ozERHRm5.cjs.map → switch-fR9s61cJ.cjs.map} +1 -1
- package/dist/table/index.cjs +1 -1
- package/dist/table/index.cjs.map +1 -1
- package/dist/table/index.d.cts +2 -2
- package/dist/table/index.d.ts +2 -2
- package/dist/table/index.js +1 -1
- package/dist/table/index.js.map +1 -1
- package/dist/{table-Dgk7z91H.cjs → table-DxHSASjm.cjs} +2 -2
- package/dist/{table-Dgk7z91H.cjs.map → table-DxHSASjm.cjs.map} +1 -1
- package/dist/{table-goPaI3yw.js → table-DxiQX7c8.js} +2 -2
- package/dist/{table-goPaI3yw.js.map → table-DxiQX7c8.js.map} +1 -1
- package/dist/{textarea-DSJO-BLA.js → textarea-BZu5g3z6.js} +2 -2
- package/dist/textarea-BZu5g3z6.js.map +1 -0
- package/dist/{textarea-CtdlfMIV.cjs → textarea-qcxhp2mg.cjs} +2 -2
- package/dist/textarea-qcxhp2mg.cjs.map +1 -0
- package/dist/title-DONX1fR6.cjs.map +1 -1
- package/dist/title-itXqz0us.js.map +1 -1
- package/dist/{toggle-06cycHir.js → toggle-Biu3ZQOw.js} +2 -2
- package/dist/{toggle-06cycHir.js.map → toggle-Biu3ZQOw.js.map} +1 -1
- package/dist/{toggle-D5tumZ8L.d.cts → toggle-BxWWejw5.d.ts} +4 -4
- package/dist/{toggle-BIHM3COb.cjs → toggle-C50tM61w.cjs} +2 -2
- package/dist/{toggle-BIHM3COb.cjs.map → toggle-C50tM61w.cjs.map} +1 -1
- package/dist/{toggle-Dd0rFKhT.d.ts → toggle-DvJddJPj.d.cts} +4 -4
- package/dist/tooltip-B7S7TrMj.js +2 -0
- package/dist/{tooltip-Ba2AdN_7.js.map → tooltip-B7S7TrMj.js.map} +1 -1
- package/dist/{tooltip-DRqQqSFW.cjs → tooltip-BX3D74kN.cjs} +2 -2
- package/dist/{tooltip-DRqQqSFW.cjs.map → tooltip-BX3D74kN.cjs.map} +1 -1
- package/dist/{tooltip-BnRE0jV2.d.ts → tooltip-CcNSIS_A.d.ts} +6 -6
- package/dist/{tooltip-Dkh_dieJ.d.cts → tooltip-Ccg2G_fB.d.cts} +6 -6
- package/dist/types-BN8HhYHR.cjs.map +1 -1
- package/dist/types-DDfAVYxf.js.map +1 -1
- package/dist/{types-CmcNT14g.d.ts → types-engjL0nN.d.ts} +1 -1
- package/dist/typography/paragraph.d.cts +2 -2
- package/dist/typography/paragraph.d.ts +2 -2
- package/dist/typography/title.d.cts +2 -2
- package/dist/typography/title.d.ts +2 -2
- package/dist/ui/alert-dialog.cjs +1 -1
- package/dist/ui/alert-dialog.d.cts +12 -12
- package/dist/ui/alert-dialog.d.ts +12 -12
- package/dist/ui/alert-dialog.js +1 -1
- package/dist/ui/alert.cjs +1 -1
- package/dist/ui/alert.cjs.map +1 -1
- package/dist/ui/alert.d.ts +6 -6
- package/dist/ui/alert.js +1 -1
- package/dist/ui/alert.js.map +1 -1
- package/dist/ui/aspect-ratio.cjs +1 -1
- package/dist/ui/aspect-ratio.cjs.map +1 -1
- package/dist/ui/aspect-ratio.d.cts +2 -2
- package/dist/ui/aspect-ratio.d.ts +2 -2
- package/dist/ui/aspect-ratio.js +1 -1
- package/dist/ui/aspect-ratio.js.map +1 -1
- package/dist/ui/avatar.cjs +1 -1
- package/dist/ui/avatar.cjs.map +1 -1
- package/dist/ui/avatar.d.cts +4 -4
- package/dist/ui/avatar.d.ts +4 -4
- package/dist/ui/avatar.js +1 -1
- package/dist/ui/avatar.js.map +1 -1
- package/dist/ui/badge.cjs +1 -1
- package/dist/ui/badge.d.cts +2 -2
- package/dist/ui/badge.d.ts +4 -4
- package/dist/ui/badge.js +1 -1
- package/dist/ui/breadcrumb.cjs +1 -1
- package/dist/ui/breadcrumb.cjs.map +1 -1
- package/dist/ui/breadcrumb.d.cts +8 -8
- package/dist/ui/breadcrumb.d.ts +8 -8
- package/dist/ui/breadcrumb.js +1 -1
- package/dist/ui/breadcrumb.js.map +1 -1
- package/dist/ui/button.d.ts +1 -1
- package/dist/ui/buttons/add-new.cjs +1 -1
- package/dist/ui/buttons/add-new.js +1 -1
- package/dist/ui/buttons/refresh.cjs +1 -1
- package/dist/ui/buttons/refresh.js +1 -1
- package/dist/ui/buttons/upload-image.cjs +1 -1
- package/dist/ui/buttons/upload-image.cjs.map +1 -1
- package/dist/ui/buttons/upload-image.js +1 -1
- package/dist/ui/buttons/upload-image.js.map +1 -1
- package/dist/ui/calendar.cjs +1 -1
- package/dist/ui/calendar.d.cts +3 -3
- package/dist/ui/calendar.d.ts +4 -4
- package/dist/ui/calendar.js +1 -1
- package/dist/ui/card.d.cts +8 -8
- package/dist/ui/card.d.ts +8 -8
- package/dist/ui/carousel.cjs +1 -1
- package/dist/ui/carousel.cjs.map +1 -1
- package/dist/ui/carousel.d.cts +6 -6
- package/dist/ui/carousel.d.ts +7 -7
- package/dist/ui/carousel.js +1 -1
- package/dist/ui/carousel.js.map +1 -1
- package/dist/ui/collapsible.cjs +1 -1
- package/dist/ui/collapsible.cjs.map +1 -1
- package/dist/ui/collapsible.d.cts +4 -4
- package/dist/ui/collapsible.d.ts +4 -4
- package/dist/ui/collapsible.js +1 -1
- package/dist/ui/collapsible.js.map +1 -1
- package/dist/ui/command.d.cts +2 -2
- package/dist/ui/command.d.ts +2 -2
- package/dist/ui/context-menu.cjs +1 -1
- package/dist/ui/context-menu.cjs.map +1 -1
- package/dist/ui/context-menu.d.cts +16 -16
- package/dist/ui/context-menu.d.ts +16 -16
- package/dist/ui/context-menu.js +1 -1
- package/dist/ui/context-menu.js.map +1 -1
- package/dist/ui/dialog.d.cts +1 -1
- package/dist/ui/dialog.d.ts +1 -1
- package/dist/ui/dropdown-menu.d.cts +16 -16
- package/dist/ui/dropdown-menu.d.ts +16 -16
- package/dist/ui/file-uploader.cjs +2 -2
- package/dist/ui/file-uploader.cjs.map +1 -1
- package/dist/ui/file-uploader.d.cts +2 -2
- package/dist/ui/file-uploader.d.ts +2 -2
- package/dist/ui/file-uploader.js +2 -2
- package/dist/ui/file-uploader.js.map +1 -1
- package/dist/ui/form.cjs +1 -1
- package/dist/ui/form.d.cts +7 -7
- package/dist/ui/form.d.ts +7 -7
- package/dist/ui/form.js +1 -1
- package/dist/ui/hover-card.cjs +1 -1
- package/dist/ui/hover-card.cjs.map +1 -1
- package/dist/ui/hover-card.d.cts +4 -4
- package/dist/ui/hover-card.d.ts +4 -4
- package/dist/ui/hover-card.js +1 -1
- package/dist/ui/hover-card.js.map +1 -1
- package/dist/ui/image.cjs +2 -0
- package/dist/ui/image.cjs.map +1 -0
- package/dist/ui/image.d.cts +14 -0
- package/dist/ui/image.d.ts +14 -0
- package/dist/ui/image.js +2 -0
- package/dist/ui/image.js.map +1 -0
- package/dist/ui/input-otp.cjs +1 -1
- package/dist/ui/input-otp.cjs.map +1 -1
- package/dist/ui/input-otp.d.cts +5 -5
- package/dist/ui/input-otp.d.ts +5 -5
- package/dist/ui/input-otp.js +1 -1
- package/dist/ui/input-otp.js.map +1 -1
- package/dist/ui/input.cjs +1 -1
- package/dist/ui/input.d.cts +1 -1
- package/dist/ui/input.d.ts +1 -1
- package/dist/ui/input.js +1 -1
- package/dist/ui/inputs/search-input.cjs +1 -1
- package/dist/ui/inputs/search-input.d.cts +3 -3
- package/dist/ui/inputs/search-input.d.ts +3 -3
- package/dist/ui/inputs/search-input.js +1 -1
- package/dist/ui/label.cjs +1 -1
- package/dist/ui/label.d.cts +2 -2
- package/dist/ui/label.d.ts +2 -2
- package/dist/ui/label.js +1 -1
- package/dist/ui/menubar.cjs +1 -1
- package/dist/ui/menubar.cjs.map +1 -1
- package/dist/ui/menubar.d.cts +17 -17
- package/dist/ui/menubar.d.ts +17 -17
- package/dist/ui/menubar.js +1 -1
- package/dist/ui/menubar.js.map +1 -1
- package/dist/ui/multi-select.cjs +1 -1
- package/dist/ui/multi-select.d.cts +2 -2
- package/dist/ui/multi-select.d.ts +2 -2
- package/dist/ui/multi-select.js +1 -1
- package/dist/ui/navigation-menu.cjs.map +1 -1
- package/dist/ui/navigation-menu.d.cts +9 -9
- package/dist/ui/navigation-menu.d.ts +9 -9
- package/dist/ui/navigation-menu.js.map +1 -1
- package/dist/ui/pagination.cjs +1 -1
- package/dist/ui/pagination.cjs.map +1 -1
- package/dist/ui/pagination.d.cts +8 -8
- package/dist/ui/pagination.d.ts +9 -9
- package/dist/ui/pagination.js +1 -1
- package/dist/ui/pagination.js.map +1 -1
- package/dist/ui/popover.d.cts +5 -5
- package/dist/ui/popover.d.ts +5 -5
- package/dist/ui/progress.cjs +1 -1
- package/dist/ui/progress.d.cts +2 -2
- package/dist/ui/progress.d.ts +2 -2
- package/dist/ui/progress.js +1 -1
- package/dist/ui/radio-group.cjs +1 -1
- package/dist/ui/radio-group.cjs.map +1 -1
- package/dist/ui/radio-group.d.cts +3 -3
- package/dist/ui/radio-group.d.ts +3 -3
- package/dist/ui/radio-group.js +1 -1
- package/dist/ui/radio-group.js.map +1 -1
- package/dist/ui/resizable.cjs +1 -1
- package/dist/ui/resizable.cjs.map +1 -1
- package/dist/ui/resizable.d.cts +4 -4
- package/dist/ui/resizable.d.ts +4 -4
- package/dist/ui/resizable.js +1 -1
- package/dist/ui/resizable.js.map +1 -1
- package/dist/ui/scroll-area.d.cts +3 -3
- package/dist/ui/scroll-area.d.ts +3 -3
- package/dist/ui/select.cjs +1 -1
- package/dist/ui/select.d.cts +11 -11
- package/dist/ui/select.d.ts +11 -11
- package/dist/ui/select.js +1 -1
- package/dist/ui/separator.cjs +1 -1
- package/dist/ui/separator.d.cts +1 -1
- package/dist/ui/separator.d.ts +1 -1
- package/dist/ui/separator.js +1 -1
- package/dist/ui/sheet.cjs +1 -1
- package/dist/ui/sheet.d.cts +9 -9
- package/dist/ui/sheet.d.ts +9 -9
- package/dist/ui/sheet.js +1 -1
- package/dist/ui/sidebar.cjs +2 -1
- package/dist/ui/sidebar.cjs.map +1 -0
- package/dist/ui/sidebar.d.cts +29 -29
- package/dist/ui/sidebar.d.ts +30 -30
- package/dist/ui/sidebar.js +2 -1
- package/dist/ui/sidebar.js.map +1 -0
- package/dist/ui/skeleton.cjs +1 -1
- package/dist/ui/skeleton.d.cts +2 -2
- package/dist/ui/skeleton.d.ts +2 -2
- package/dist/ui/skeleton.js +1 -1
- package/dist/ui/slider.cjs +1 -1
- package/dist/ui/slider.cjs.map +1 -1
- package/dist/ui/slider.d.cts +2 -2
- package/dist/ui/slider.d.ts +2 -2
- package/dist/ui/slider.js +1 -1
- package/dist/ui/slider.js.map +1 -1
- package/dist/ui/sonner.d.cts +2 -2
- package/dist/ui/sonner.d.ts +2 -2
- package/dist/ui/switch.cjs +1 -1
- package/dist/ui/switch.d.cts +2 -2
- package/dist/ui/switch.d.ts +2 -2
- package/dist/ui/switch.js +1 -1
- package/dist/ui/table.cjs +1 -1
- package/dist/ui/table.d.cts +9 -9
- package/dist/ui/table.d.ts +9 -9
- package/dist/ui/table.js +1 -1
- package/dist/ui/tabs.cjs.map +1 -1
- package/dist/ui/tabs.d.cts +5 -5
- package/dist/ui/tabs.d.ts +5 -5
- package/dist/ui/tabs.js.map +1 -1
- package/dist/ui/textarea.cjs +1 -1
- package/dist/ui/textarea.d.cts +2 -2
- package/dist/ui/textarea.d.ts +2 -2
- package/dist/ui/textarea.js +1 -1
- package/dist/ui/toggle-group.cjs +1 -1
- package/dist/ui/toggle-group.cjs.map +1 -1
- package/dist/ui/toggle-group.d.cts +4 -4
- package/dist/ui/toggle-group.d.ts +4 -4
- package/dist/ui/toggle-group.js +1 -1
- package/dist/ui/toggle-group.js.map +1 -1
- package/dist/ui/toggle.cjs +1 -1
- package/dist/ui/toggle.d.cts +1 -1
- package/dist/ui/toggle.d.ts +1 -1
- package/dist/ui/toggle.js +1 -1
- package/dist/ui/tooltip.cjs +1 -1
- package/dist/ui/tooltip.d.cts +1 -1
- package/dist/ui/tooltip.d.ts +1 -1
- package/dist/ui/tooltip.js +1 -1
- package/package.json +15 -5
- package/dist/alert-dialog-Bc-61QzL.cjs.map +0 -1
- package/dist/alert-dialog-kpuqvmVo.js +0 -2
- package/dist/alert-dialog-kpuqvmVo.js.map +0 -1
- package/dist/calendar-CB_hTeGT.js.map +0 -1
- package/dist/calendar-rpgciCA-.cjs.map +0 -1
- package/dist/date-D7i-nFOS.js +0 -2
- package/dist/date-D7i-nFOS.js.map +0 -1
- package/dist/date-DevNulgp.cjs +0 -2
- package/dist/date-DevNulgp.cjs.map +0 -1
- package/dist/error-dialog-DvTlwpSn.cjs +0 -2
- package/dist/error-dialog-DvTlwpSn.cjs.map +0 -1
- package/dist/error-dialog-e9mFaOuG.js +0 -2
- package/dist/error-dialog-e9mFaOuG.js.map +0 -1
- package/dist/form-BzvxUv0a.js +0 -2
- package/dist/form-BzvxUv0a.js.map +0 -1
- package/dist/form-CXu8t0VS.cjs +0 -2
- package/dist/form-CXu8t0VS.cjs.map +0 -1
- package/dist/form-wrapper-CZKtb1j5.cjs +0 -2
- package/dist/form-wrapper-CZKtb1j5.cjs.map +0 -1
- package/dist/form-wrapper-Cks4xmCV.js +0 -2
- package/dist/form-wrapper-Cks4xmCV.js.map +0 -1
- package/dist/input-B8bT3wuo.cjs.map +0 -1
- package/dist/input-OWyLq45f.js.map +0 -1
- package/dist/label-3eYQRRYp.cjs +0 -2
- package/dist/label-BQ52Pjw-.js +0 -2
- package/dist/layouts/main/index.cjs +0 -2
- package/dist/layouts/main/index.cjs.map +0 -1
- package/dist/layouts/main/index.d.cts +0 -17
- package/dist/layouts/main/index.d.ts +0 -17
- package/dist/layouts/main/index.js +0 -2
- package/dist/layouts/main/index.js.map +0 -1
- package/dist/multi-select-DkEzuDXi.js +0 -2
- package/dist/multi-select-DkEzuDXi.js.map +0 -1
- package/dist/multi-select-DoV9aD32.cjs.map +0 -1
- package/dist/progress-DPisovgi.js +0 -2
- package/dist/progress-MyGITZ3w.cjs +0 -2
- package/dist/select-BjTQmEN7.js +0 -2
- package/dist/select-BjTQmEN7.js.map +0 -1
- package/dist/select-BlPiYiG_.cjs +0 -2
- package/dist/select-BlPiYiG_.cjs.map +0 -1
- package/dist/sheet-B2CNJMzu.js.map +0 -1
- package/dist/sheet-CvstHEA7.cjs.map +0 -1
- package/dist/sidebar-BDefeoUz.js +0 -2
- package/dist/sidebar-BDefeoUz.js.map +0 -1
- package/dist/sidebar-C6MoqLW4.cjs +0 -2
- package/dist/sidebar-C6MoqLW4.cjs.map +0 -1
- package/dist/sidebar-CoAMlkou.js +0 -2
- package/dist/sidebar-CoAMlkou.js.map +0 -1
- package/dist/sidebar-Dzl9-lVV.cjs +0 -2
- package/dist/sidebar-Dzl9-lVV.cjs.map +0 -1
- package/dist/textarea-CtdlfMIV.cjs.map +0 -1
- package/dist/textarea-DSJO-BLA.js.map +0 -1
- package/dist/tooltip-Ba2AdN_7.js +0 -2
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{buttonVariants as e}from"./button-DL_i4AVi.js";import t from"react";import{cn as n}from"@customafk/react-toolkit/utils";import{jsx as r,jsxs as i}from"react/jsx-runtime";import{AlertDialog as a}from"radix-ui";function o({...e}){return r(a.Root,{"data-slot":`alert-dialog`,...e})}function s({...e}){return r(a.Trigger,{"data-slot":`alert-dialog-trigger`,...e})}function c({...e}){return r(a.Portal,{"data-slot":`alert-dialog-portal`,...e})}function l({className:e,...t}){return r(a.Overlay,{"data-slot":`alert-dialog-overlay`,className:n(`fixed inset-0 z-50 bg-black/50`,`data-[state=open]:animate-in`,`data-[state=closed]:animate-out`,`data-[state=closed]:fade-out-0`,`data-[state=open]:fade-in-0`,e),...t})}function u({className:e,...t}){return i(c,{children:[r(l,{}),r(a.Content,{"data-slot":`alert-dialog-content`,className:n(`bg-background`,`fixed z-50`,`top-1/2 left-1/2 -translate-1/2`,`grid w-full max-w-[calc(100%-2rem)] sm:max-w-lg`,`gap-4 rounded-lg p-6 shadow-lg duration-200`,`data-[state=open]:animate-in`,`data-[state=open]:fade-in-0`,`data-[state=open]:zoom-in-95`,`data-[state=closed]:animate-out`,`data-[state=closed]:fade-out-0`,`data-[state=closed]:zoom-out-95`,e),...t})]})}function d({className:e,...t}){return r(`div`,{"data-slot":`alert-dialog-header`,className:n(`flex flex-col gap-2 text-center sm:text-left`,e),...t})}function f({className:e,...t}){return r(`div`,{"data-slot":`alert-dialog-footer`,className:n(`flex flex-col-reverse gap-2 sm:flex-row sm:justify-end`,e),...t})}function p({className:e,...t}){return r(a.Title,{"data-slot":`alert-dialog-title`,className:n(`text-text-positive-strong text-lg font-semibold`,e),...t})}function m({className:e,...t}){return r(a.Description,{"data-slot":`alert-dialog-description`,className:n(`text-text-positive-weak text-sm`,e),...t})}function h({className:t,...i}){return r(a.Action,{className:n(e(),`min-w-24`,t),...i,autoFocus:!0,tabIndex:1})}function g({className:t,...i}){return r(a.Cancel,{className:n(e({variant:`outline`,color:`muted`}),`min-w-24`,t),...i})}export{o as AlertDialog,h as AlertDialogAction,g as AlertDialogCancel,u as AlertDialogContent,m as AlertDialogDescription,f as AlertDialogFooter,d as AlertDialogHeader,l as AlertDialogOverlay,c as AlertDialogPortal,p as AlertDialogTitle,s as AlertDialogTrigger};
|
|
2
|
-
//# sourceMappingURL=alert-dialog-kpuqvmVo.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"alert-dialog-kpuqvmVo.js","names":["AlertDialog","AlertDialogPrimitive"],"sources":["../packages/components/ui/alert-dialog.tsx"],"sourcesContent":["'use client'\nimport React from 'react'\nimport { AlertDialog as AlertDialogPrimitive } from 'radix-ui'\n\nimport { buttonVariants } from '@/components/ui/button'\nimport { cn } from '@customafk/react-toolkit/utils'\n\nfunction AlertDialog({ ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Root>) {\n return <AlertDialogPrimitive.Root data-slot=\"alert-dialog\" {...props} />\n}\n\nfunction AlertDialogTrigger({ ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Trigger>) {\n return <AlertDialogPrimitive.Trigger data-slot=\"alert-dialog-trigger\" {...props} />\n}\n\nfunction AlertDialogPortal({ ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Portal>) {\n return <AlertDialogPrimitive.Portal data-slot=\"alert-dialog-portal\" {...props} />\n}\n\nfunction AlertDialogOverlay({ className, ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Overlay>) {\n return (\n <AlertDialogPrimitive.Overlay\n data-slot=\"alert-dialog-overlay\"\n className={cn(\n 'fixed inset-0 z-50 bg-black/50',\n 'data-[state=open]:animate-in',\n 'data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0',\n 'data-[state=open]:fade-in-0',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogContent({ className, ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Content>) {\n return (\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n data-slot=\"alert-dialog-content\"\n className={cn(\n 'bg-background',\n 'fixed z-50',\n 'top-1/2 left-1/2 -translate-1/2',\n 'grid w-full max-w-[calc(100%-2rem)] sm:max-w-lg',\n 'gap-4 rounded-lg p-6 shadow-lg duration-200',\n 'data-[state=open]:animate-in',\n 'data-[state=open]:fade-in-0',\n 'data-[state=open]:zoom-in-95',\n 'data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0',\n 'data-[state=closed]:zoom-out-95',\n className,\n )}\n {...props}\n />\n </AlertDialogPortal>\n )\n}\n\nfunction AlertDialogHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"alert-dialog-header\" className={cn('flex flex-col gap-2 text-center sm:text-left', className)} {...props} />\n}\n\nfunction AlertDialogFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"alert-dialog-footer\" className={cn('flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', className)} {...props} />\n}\n\nfunction AlertDialogTitle({ className, ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Title>) {\n return <AlertDialogPrimitive.Title data-slot=\"alert-dialog-title\" className={cn('text-text-positive-strong text-lg font-semibold', className)} {...props} />\n}\n\nfunction AlertDialogDescription({ className, ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Description>) {\n return <AlertDialogPrimitive.Description data-slot=\"alert-dialog-description\" className={cn('text-text-positive-weak text-sm', className)} {...props} />\n}\n\nfunction AlertDialogAction({ className, ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Action>) {\n return <AlertDialogPrimitive.Action className={cn(buttonVariants(), 'min-w-24', className)} {...props} autoFocus tabIndex={1} />\n}\n\nfunction AlertDialogCancel({ className, ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Cancel>) {\n return <AlertDialogPrimitive.Cancel className={cn(buttonVariants({ variant: 'outline', color: 'muted' }), 'min-w-24', className)} {...props} />\n}\n\nexport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogOverlay,\n AlertDialogPortal,\n AlertDialogTitle,\n AlertDialogTrigger,\n}\n"],"mappings":"wNAOA,SAASA,EAAY,CAAE,GAAG,GAAiE,CACzF,OAAO,EAACC,EAAqB,KAAA,CAAK,YAAU,eAAe,GAAI,IAGjE,SAAS,EAAmB,CAAE,GAAG,GAAoE,CACnG,OAAO,EAACA,EAAqB,QAAA,CAAQ,YAAU,uBAAuB,GAAI,IAG5E,SAAS,EAAkB,CAAE,GAAG,GAAmE,CACjG,OAAO,EAACA,EAAqB,OAAA,CAAO,YAAU,sBAAsB,GAAI,IAG1E,SAAS,EAAmB,CAAE,YAAW,GAAG,GAAoE,CAC9G,OACE,EAACA,EAAqB,QAAA,CACpB,YAAU,uBACV,UAAW,EACT,iCACA,+BACA,kCACA,iCACA,8BACA,GAEF,GAAI,IAKV,SAAS,EAAmB,CAAE,YAAW,GAAG,GAAoE,CAC9G,OACE,EAAC,EAAA,CAAA,SAAA,CACC,EAAC,EAAA,IACD,EAACA,EAAqB,QAAA,CACpB,YAAU,uBACV,UAAW,EACT,gBACA,aACA,kCACA,kDACA,8CACA,+BACA,8BACA,+BACA,kCACA,iCACA,kCACA,GAEF,GAAI,OAMZ,SAAS,EAAkB,CAAE,YAAW,GAAG,GAAsC,CAC/E,OAAO,EAAC,MAAA,CAAI,YAAU,sBAAsB,UAAW,EAAG,+CAAgD,GAAY,GAAI,IAG5H,SAAS,EAAkB,CAAE,YAAW,GAAG,GAAsC,CAC/E,OAAO,EAAC,MAAA,CAAI,YAAU,sBAAsB,UAAW,EAAG,yDAA0D,GAAY,GAAI,IAGtI,SAAS,EAAiB,CAAE,YAAW,GAAG,GAAkE,CAC1G,OAAO,EAACA,EAAqB,MAAA,CAAM,YAAU,qBAAqB,UAAW,EAAG,kDAAmD,GAAY,GAAI,IAGrJ,SAAS,EAAuB,CAAE,YAAW,GAAG,GAAwE,CACtH,OAAO,EAACA,EAAqB,YAAA,CAAY,YAAU,2BAA2B,UAAW,EAAG,kCAAmC,GAAY,GAAI,IAGjJ,SAAS,EAAkB,CAAE,YAAW,GAAG,GAAmE,CAC5G,OAAO,EAACA,EAAqB,OAAA,CAAO,UAAW,EAAG,IAAkB,WAAY,GAAY,GAAI,EAAO,UAAA,GAAU,SAAU,IAG7H,SAAS,EAAkB,CAAE,YAAW,GAAG,GAAmE,CAC5G,OAAO,EAACA,EAAqB,OAAA,CAAO,UAAW,EAAG,EAAe,CAAE,QAAS,UAAW,MAAO,UAAY,WAAY,GAAY,GAAI"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"calendar-CB_hTeGT.js","names":["props","className"],"sources":["../packages/components/ui/calendar.tsx"],"sourcesContent":["'use client'\nimport React from 'react'\nimport { ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon } from 'lucide-react'\nimport { DayButton, DayPicker, getDefaultClassNames } from 'react-day-picker'\n\nimport { Button, buttonVariants } from '@/components/ui/button'\nimport { cn } from '@customafk/react-toolkit/utils'\n\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n captionLayout = 'label',\n buttonVariant = 'ghost',\n formatters,\n components,\n ...props\n}: React.ComponentProps<typeof DayPicker> & {\n buttonVariant?: React.ComponentProps<typeof Button>['variant']\n}) {\n const defaultClassNames = getDefaultClassNames()\n\n return (\n <DayPicker\n showOutsideDays={showOutsideDays}\n className={cn(\n 'bg-background group/calendar p-3',\n '[--cell-size:--spacing(8)]',\n '[[data-slot=card-content]_&]:bg-transparent',\n '[[data-slot=popover-content]_&]:bg-transparent',\n String.raw`rtl:**:[.rdp-button\\_next>svg]:rotate-180`,\n String.raw`rtl:**:[.rdp-button\\_previous>svg]:rotate-180`,\n className,\n )}\n captionLayout={captionLayout}\n formatters={{\n formatMonthDropdown: (date) => date.toLocaleString('default', { month: 'short' }),\n ...formatters,\n }}\n classNames={{\n root: cn('w-fit', defaultClassNames.root),\n months: cn('flex gap-4 flex-col md:flex-row relative', defaultClassNames.months),\n month: cn('flex flex-col w-full gap-4', defaultClassNames.month),\n nav: cn('flex items-center gap-1 w-full absolute top-0 inset-x-0 justify-between', defaultClassNames.nav),\n button_previous: cn(\n buttonVariants({ variant: buttonVariant }),\n 'size-(--cell-size) aria-disabled:opacity-50 p-0 select-none',\n defaultClassNames.button_previous,\n ),\n button_next: cn(\n buttonVariants({ variant: buttonVariant }),\n 'size-(--cell-size) aria-disabled:opacity-50 p-0 select-none',\n defaultClassNames.button_next,\n ),\n month_caption: cn('flex items-center justify-center h-(--cell-size) w-full px-(--cell-size)', defaultClassNames.month_caption),\n dropdowns: cn('w-full flex items-center text-sm font-medium justify-center h-(--cell-size) gap-1.5', defaultClassNames.dropdowns),\n dropdown_root: cn(\n 'relative has-focus:border-primary-strong border border-border-weak shadow-xs has-focus:ring-primary-weak has-focus:ring-[3px] rounded-md',\n defaultClassNames.dropdown_root,\n ),\n dropdown: cn('absolute inset-0 opacity-0', defaultClassNames.dropdown),\n caption_label: cn(\n 'select-none font-medium',\n captionLayout === 'label' ? 'text-sm' : 'rounded-md pl-2 pr-1 flex items-center gap-1 text-sm h-8 [&>svg]:text-text-positive [&>svg]:size-3.5',\n defaultClassNames.caption_label,\n ),\n table: 'w-full border-collapse',\n weekdays: cn('flex', defaultClassNames.weekdays),\n weekday: cn('text-text-positive rounded-md flex-1 font-normal text-[0.8rem] select-none', defaultClassNames.weekday),\n week: cn('flex w-full mt-2', defaultClassNames.week),\n week_number_header: cn('select-none w-(--cell-size)', defaultClassNames.week_number_header),\n week_number: cn('text-[0.8rem] select-none text-text-positive', defaultClassNames.week_number),\n day: cn(\n 'relative w-full h-full p-0 text-center [&:first-child[data-selected=true]_button]:rounded-l-md [&:last-child[data-selected=true]_button]:rounded-r-md group/day aspect-square select-none',\n defaultClassNames.day,\n ),\n range_start: cn('rounded-l-md bg-muted-muted', defaultClassNames.range_start),\n range_middle: cn('rounded-none', defaultClassNames.range_middle),\n range_end: cn('rounded-r-md bg-muted-muted', defaultClassNames.range_end),\n today: cn('bg-muted-muted text-text-positive rounded-md data-[selected=true]:rounded-none', defaultClassNames.today),\n outside: cn('text-text-positive aria-selected:text-text-positive', defaultClassNames.outside),\n disabled: cn('text-text-positive opacity-50', defaultClassNames.disabled),\n hidden: cn('invisible', defaultClassNames.hidden),\n ...classNames,\n }}\n components={{\n Root: ({ className, rootRef, ...props }) => {\n return <div data-slot=\"calendar\" ref={rootRef} className={cn(className)} {...props} />\n },\n Chevron: ({ className, orientation, ...props }) => {\n if (orientation === 'left') {\n return <ChevronLeftIcon className={cn('size-4', className)} {...props} />\n }\n\n if (orientation === 'right') {\n return <ChevronRightIcon className={cn('size-4', className)} {...props} />\n }\n\n return <ChevronDownIcon className={cn('size-4', className)} {...props} />\n },\n DayButton: CalendarDayButton,\n WeekNumber: ({ children, ...props }) => {\n return (\n <td {...props}>\n <div className=\"flex size-(--cell-size) items-center justify-center text-center\">{children}</div>\n </td>\n )\n },\n ...components,\n }}\n {...props}\n />\n )\n}\n\nfunction CalendarDayButton({ className, day, modifiers, ...props }: React.ComponentProps<typeof DayButton>) {\n const defaultClassNames = getDefaultClassNames()\n\n const ref = React.useRef<HTMLButtonElement>(null)\n React.useEffect(() => {\n if (modifiers.focused) ref.current?.focus()\n }, [modifiers.focused])\n\n return (\n <Button\n ref={ref}\n variant=\"ghost\"\n size=\"icon\"\n data-day={day.date.toLocaleDateString()}\n data-selected-single={modifiers.selected && !modifiers.range_start && !modifiers.range_end && !modifiers.range_middle}\n data-range-start={modifiers.range_start}\n data-range-end={modifiers.range_end}\n data-range-middle={modifiers.range_middle}\n className={cn(\n 'flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 leading-none font-normal',\n 'data-[selected-single=true]:bg-primary',\n 'data-[selected-single=true]:text-text-positive',\n 'data-[range-middle=true]:bg-muted-muted',\n 'data-[range-middle=true]:text-text-positive',\n 'data-[range-start=true]:bg-primary-muted',\n 'data-[range-start=true]:text-text-positive-strong',\n 'data-[range-end=true]:bg-primary',\n 'data-[range-end=true]:text-text-positive-strong',\n 'group-data-[focused=true]/day:border-primary-strong',\n 'group-data-[focused=true]/day:ring-primary-weak',\n 'group-data-[focused=true]/day:relative',\n 'group-data-[focused=true]/day:z-10',\n 'group-data-[focused=true]/day:ring-[3px]',\n 'data-[range-end=true]:rounded-md',\n 'data-[range-end=true]:rounded-r-md',\n 'data-[range-middle=true]:rounded-none',\n 'data-[range-start=true]:rounded-md',\n 'data-[range-start=true]:rounded-l-md',\n '[&>span]:text-xs [&>span]:opacity-70',\n defaultClassNames.day,\n className,\n )}\n {...props}\n color=\"secondary\"\n />\n )\n}\n\nexport { Calendar, CalendarDayButton }\n"],"mappings":"mWAQA,SAAS,EAAS,CAChB,YACA,aACA,kBAAkB,GAClB,gBAAgB,QAChB,gBAAgB,QAChB,aACA,aACA,GAAG,GAGF,CACD,IAAM,EAAoB,IAE1B,OACE,EAAC,EAAA,CACkB,kBACjB,UAAW,EACT,mCACA,6BACA,8CACA,iDACA,OAAO,GAAG,4CACV,OAAO,GAAG,gDACV,GAEa,gBACf,WAAY,CACV,oBAAsB,GAAS,EAAK,eAAe,UAAW,CAAE,MAAO,UACvE,GAAG,GAEL,WAAY,CACV,KAAM,EAAG,QAAS,EAAkB,MACpC,OAAQ,EAAG,2CAA4C,EAAkB,QACzE,MAAO,EAAG,6BAA8B,EAAkB,OAC1D,IAAK,EAAG,0EAA2E,EAAkB,KACrG,gBAAiB,EACf,EAAe,CAAE,QAAS,IAC1B,8DACA,EAAkB,iBAEpB,YAAa,EACX,EAAe,CAAE,QAAS,IAC1B,8DACA,EAAkB,aAEpB,cAAe,EAAG,2EAA4E,EAAkB,eAChH,UAAW,EAAG,sFAAuF,EAAkB,WACvH,cAAe,EACb,2IACA,EAAkB,eAEpB,SAAU,EAAG,6BAA8B,EAAkB,UAC7D,cAAe,EACb,0BACA,IAAkB,QAAU,UAAY,uGACxC,EAAkB,eAEpB,MAAO,yBACP,SAAU,EAAG,OAAQ,EAAkB,UACvC,QAAS,EAAG,6EAA8E,EAAkB,SAC5G,KAAM,EAAG,mBAAoB,EAAkB,MAC/C,mBAAoB,EAAG,8BAA+B,EAAkB,oBACxE,YAAa,EAAG,+CAAgD,EAAkB,aAClF,IAAK,EACH,4LACA,EAAkB,KAEpB,YAAa,EAAG,8BAA+B,EAAkB,aACjE,aAAc,EAAG,eAAgB,EAAkB,cACnD,UAAW,EAAG,8BAA+B,EAAkB,WAC/D,MAAO,EAAG,iFAAkF,EAAkB,OAC9G,QAAS,EAAG,sDAAuD,EAAkB,SACrF,SAAU,EAAG,gCAAiC,EAAkB,UAChE,OAAQ,EAAG,YAAa,EAAkB,QAC1C,GAAG,GAEL,WAAY,CACV,MAAO,CAAE,UAAA,EAAW,UAAS,GAAGA,KACvB,EAAC,MAAA,CAAI,YAAU,WAAW,IAAK,EAAS,UAAW,EAAGC,GAAY,GAAID,IAE/E,SAAU,CAAE,UAAA,EAAW,cAAa,GAAGA,KAE5B,EADL,IAAgB,OACV,EAGN,IAAgB,QACV,EAGF,EAPE,CAAgB,UAAW,EAAG,SAAUC,GAAY,GAAID,IASpE,UAAW,EACX,YAAa,CAAE,WAAU,GAAGA,KAExB,EAAC,KAAA,CAAG,GAAIA,WACN,EAAC,MAAA,CAAI,UAAU,kEAAmE,eAIxF,GAAG,GAEL,GAAI,IAKV,SAAS,EAAkB,CAAE,YAAW,MAAK,YAAW,GAAG,GAAiD,CAC1G,IAAM,EAAoB,IAEpB,EAAM,EAAM,OAA0B,MAK5C,OAJA,EAAM,cAAgB,CAChB,EAAU,SAAS,EAAI,SAAS,SACnC,CAAC,EAAU,UAGZ,EAAC,EAAA,CACM,MACL,QAAQ,QACR,KAAK,OACL,WAAU,EAAI,KAAK,qBACnB,uBAAsB,EAAU,UAAY,CAAC,EAAU,aAAe,CAAC,EAAU,WAAa,CAAC,EAAU,aACzG,mBAAkB,EAAU,YAC5B,iBAAgB,EAAU,UAC1B,oBAAmB,EAAU,aAC7B,UAAW,EACT,kGACA,yCACA,iDACA,0CACA,8CACA,2CACA,oDACA,mCACA,kDACA,sDACA,kDACA,yCACA,qCACA,2CACA,mCACA,qCACA,wCACA,qCACA,uCACA,uCACA,EAAkB,IAClB,GAEF,GAAI,EACJ,MAAM"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"calendar-rpgciCA-.cjs","names":["DayPicker","buttonVariants","props","className","ChevronLeftIcon","ChevronRightIcon","ChevronDownIcon","React","Button"],"sources":["../packages/components/ui/calendar.tsx"],"sourcesContent":["'use client'\nimport React from 'react'\nimport { ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon } from 'lucide-react'\nimport { DayButton, DayPicker, getDefaultClassNames } from 'react-day-picker'\n\nimport { Button, buttonVariants } from '@/components/ui/button'\nimport { cn } from '@customafk/react-toolkit/utils'\n\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n captionLayout = 'label',\n buttonVariant = 'ghost',\n formatters,\n components,\n ...props\n}: React.ComponentProps<typeof DayPicker> & {\n buttonVariant?: React.ComponentProps<typeof Button>['variant']\n}) {\n const defaultClassNames = getDefaultClassNames()\n\n return (\n <DayPicker\n showOutsideDays={showOutsideDays}\n className={cn(\n 'bg-background group/calendar p-3',\n '[--cell-size:--spacing(8)]',\n '[[data-slot=card-content]_&]:bg-transparent',\n '[[data-slot=popover-content]_&]:bg-transparent',\n String.raw`rtl:**:[.rdp-button\\_next>svg]:rotate-180`,\n String.raw`rtl:**:[.rdp-button\\_previous>svg]:rotate-180`,\n className,\n )}\n captionLayout={captionLayout}\n formatters={{\n formatMonthDropdown: (date) => date.toLocaleString('default', { month: 'short' }),\n ...formatters,\n }}\n classNames={{\n root: cn('w-fit', defaultClassNames.root),\n months: cn('flex gap-4 flex-col md:flex-row relative', defaultClassNames.months),\n month: cn('flex flex-col w-full gap-4', defaultClassNames.month),\n nav: cn('flex items-center gap-1 w-full absolute top-0 inset-x-0 justify-between', defaultClassNames.nav),\n button_previous: cn(\n buttonVariants({ variant: buttonVariant }),\n 'size-(--cell-size) aria-disabled:opacity-50 p-0 select-none',\n defaultClassNames.button_previous,\n ),\n button_next: cn(\n buttonVariants({ variant: buttonVariant }),\n 'size-(--cell-size) aria-disabled:opacity-50 p-0 select-none',\n defaultClassNames.button_next,\n ),\n month_caption: cn('flex items-center justify-center h-(--cell-size) w-full px-(--cell-size)', defaultClassNames.month_caption),\n dropdowns: cn('w-full flex items-center text-sm font-medium justify-center h-(--cell-size) gap-1.5', defaultClassNames.dropdowns),\n dropdown_root: cn(\n 'relative has-focus:border-primary-strong border border-border-weak shadow-xs has-focus:ring-primary-weak has-focus:ring-[3px] rounded-md',\n defaultClassNames.dropdown_root,\n ),\n dropdown: cn('absolute inset-0 opacity-0', defaultClassNames.dropdown),\n caption_label: cn(\n 'select-none font-medium',\n captionLayout === 'label' ? 'text-sm' : 'rounded-md pl-2 pr-1 flex items-center gap-1 text-sm h-8 [&>svg]:text-text-positive [&>svg]:size-3.5',\n defaultClassNames.caption_label,\n ),\n table: 'w-full border-collapse',\n weekdays: cn('flex', defaultClassNames.weekdays),\n weekday: cn('text-text-positive rounded-md flex-1 font-normal text-[0.8rem] select-none', defaultClassNames.weekday),\n week: cn('flex w-full mt-2', defaultClassNames.week),\n week_number_header: cn('select-none w-(--cell-size)', defaultClassNames.week_number_header),\n week_number: cn('text-[0.8rem] select-none text-text-positive', defaultClassNames.week_number),\n day: cn(\n 'relative w-full h-full p-0 text-center [&:first-child[data-selected=true]_button]:rounded-l-md [&:last-child[data-selected=true]_button]:rounded-r-md group/day aspect-square select-none',\n defaultClassNames.day,\n ),\n range_start: cn('rounded-l-md bg-muted-muted', defaultClassNames.range_start),\n range_middle: cn('rounded-none', defaultClassNames.range_middle),\n range_end: cn('rounded-r-md bg-muted-muted', defaultClassNames.range_end),\n today: cn('bg-muted-muted text-text-positive rounded-md data-[selected=true]:rounded-none', defaultClassNames.today),\n outside: cn('text-text-positive aria-selected:text-text-positive', defaultClassNames.outside),\n disabled: cn('text-text-positive opacity-50', defaultClassNames.disabled),\n hidden: cn('invisible', defaultClassNames.hidden),\n ...classNames,\n }}\n components={{\n Root: ({ className, rootRef, ...props }) => {\n return <div data-slot=\"calendar\" ref={rootRef} className={cn(className)} {...props} />\n },\n Chevron: ({ className, orientation, ...props }) => {\n if (orientation === 'left') {\n return <ChevronLeftIcon className={cn('size-4', className)} {...props} />\n }\n\n if (orientation === 'right') {\n return <ChevronRightIcon className={cn('size-4', className)} {...props} />\n }\n\n return <ChevronDownIcon className={cn('size-4', className)} {...props} />\n },\n DayButton: CalendarDayButton,\n WeekNumber: ({ children, ...props }) => {\n return (\n <td {...props}>\n <div className=\"flex size-(--cell-size) items-center justify-center text-center\">{children}</div>\n </td>\n )\n },\n ...components,\n }}\n {...props}\n />\n )\n}\n\nfunction CalendarDayButton({ className, day, modifiers, ...props }: React.ComponentProps<typeof DayButton>) {\n const defaultClassNames = getDefaultClassNames()\n\n const ref = React.useRef<HTMLButtonElement>(null)\n React.useEffect(() => {\n if (modifiers.focused) ref.current?.focus()\n }, [modifiers.focused])\n\n return (\n <Button\n ref={ref}\n variant=\"ghost\"\n size=\"icon\"\n data-day={day.date.toLocaleDateString()}\n data-selected-single={modifiers.selected && !modifiers.range_start && !modifiers.range_end && !modifiers.range_middle}\n data-range-start={modifiers.range_start}\n data-range-end={modifiers.range_end}\n data-range-middle={modifiers.range_middle}\n className={cn(\n 'flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 leading-none font-normal',\n 'data-[selected-single=true]:bg-primary',\n 'data-[selected-single=true]:text-text-positive',\n 'data-[range-middle=true]:bg-muted-muted',\n 'data-[range-middle=true]:text-text-positive',\n 'data-[range-start=true]:bg-primary-muted',\n 'data-[range-start=true]:text-text-positive-strong',\n 'data-[range-end=true]:bg-primary',\n 'data-[range-end=true]:text-text-positive-strong',\n 'group-data-[focused=true]/day:border-primary-strong',\n 'group-data-[focused=true]/day:ring-primary-weak',\n 'group-data-[focused=true]/day:relative',\n 'group-data-[focused=true]/day:z-10',\n 'group-data-[focused=true]/day:ring-[3px]',\n 'data-[range-end=true]:rounded-md',\n 'data-[range-end=true]:rounded-r-md',\n 'data-[range-middle=true]:rounded-none',\n 'data-[range-start=true]:rounded-md',\n 'data-[range-start=true]:rounded-l-md',\n '[&>span]:text-xs [&>span]:opacity-70',\n defaultClassNames.day,\n className,\n )}\n {...props}\n color=\"secondary\"\n />\n )\n}\n\nexport { Calendar, CalendarDayButton }\n"],"mappings":"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"}
|
package/dist/date-D7i-nFOS.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import e from"react";import{cn as t}from"@customafk/react-toolkit/utils";import{jsx as n}from"react/jsx-runtime";import{format as r,isThisMonth as i,isThisWeek as a,isThisYear as o,isToday as s,isTomorrow as c,isValid as l,isYesterday as u,parseISO as d}from"@customafk/react-toolkit/date-fns";const f={weekdays:[`Chủ Nhật`,`Thứ Hai`,`Thứ Ba`,`Thứ Tư`,`Thứ Năm`,`Thứ Sáu`,`Thứ Bảy`],weekdaysShort:[`CN`,`T2`,`T3`,`T4`,`T5`,`T6`,`T7`],months:[`Tháng 1`,`Tháng 2`,`Tháng 3`,`Tháng 4`,`Tháng 5`,`Tháng 6`,`Tháng 7`,`Tháng 8`,`Tháng 9`,`Tháng 10`,`Tháng 11`,`Tháng 12`],monthsShort:[`T1`,`T2`,`T3`,`T4`,`T5`,`T6`,`T7`,`T8`,`T9`,`T10`,`T11`,`T12`]},p={"01-01":`Tết Dương lịch`,"03-08":`Quốc tế Phụ nữ`,"04-30":`Ngày Giải phóng miền Nam`,"05-01":`Quốc tế Lao động`,"09-02":`Quốc khánh`,"10-20":`Ngày Phụ nữ Việt Nam`,"11-20":`Ngày Nhà giáo Việt Nam`};Object.freeze({SECOND:1e3,MINUTE:60*1e3,HOUR:3600*1e3,DAY:1440*60*1e3,WEEK:10080*60*1e3,MONTH:720*60*60*1e3,YEAR:365*24*60*60*1e3});const m=Object.freeze({MINUTE:60,HOUR:3600,DAY:1440*60,WEEK:10080*60,MONTH:720*60*60,YEAR:365*24*60*60});Object.freeze({HOUR:60,DAY:1440,WEEK:10080,MONTH:720*60});const h=({date:h,format:g=`medium`,showHoliday:_=!1,showTime:v=!1,className:y=``,title:b})=>{let x=e.useMemo(()=>{try{if(h instanceof Date)return l(h)?h:null;if(typeof h==`string`){let e=d(h);return l(e)?e:new Date(h)}if(typeof h==`number`){let e=new Date(h);return l(e)?e:null}return null}catch{return null}},[h]),S=e.useCallback(e=>{let t=new Date,n=Math.floor((t.getTime()-e.getTime())/1e3);return n<60?`Vừa xong`:n<3600?`${Math.floor(n/m.MINUTE)} phút trước`:n<86400?`${Math.floor(n/m.HOUR)} giờ trước`:n<604800?`${Math.floor(n/m.DAY)} ngày trước`:n<2592e3?`${Math.floor(n/m.WEEK)} tuần trước`:n<31536e3?`${Math.floor(n/m.MONTH)} tháng trước`:`${Math.floor(n/m.YEAR)} năm trước`},[]),C=e.useCallback((e,t=!1)=>{let n=e.getDay();return t?f.weekdaysShort[n]:f.weekdays[n]},[]),w=e.useCallback((e,t=!1)=>{let n=e.getMonth();return t?f.monthsShort[n]:f.months[n]},[]),T=e.useCallback(e=>{let t=r(e,`MM-dd`);return p[t]||null},[]),E=e.useCallback(e=>{if(s(e))return v?`Hôm nay ${r(e,`HH:mm`)}`:`Hôm nay`;if(u(e))return v?`Hôm qua ${r(e,`HH:mm`)}`:`Hôm qua`;if(c(e))return v?`Ngày mai ${r(e,`HH:mm`)}`:`Ngày mai`;if(a(e)){let t=C(e);return v?`${t} ${r(e,`HH:mm`)}`:t}if(i(e)){let t=r(e,`d`);return v?`${t}/${r(e,`M`)} ${r(e,`HH:mm`)}`:`${t}/${r(e,`M`)}`}return o(e)?v?r(e,`d/M HH:mm`):r(e,`d/M`):v?r(e,`d/M/yyyy HH:mm`):r(e,`d/M/yyyy`)},[C,v]),D=e.useCallback((e,t)=>{let n=v?r(e,`, HH:mm`):``;switch(t){case`short`:return r(e,`d/M/yy`)+n;case`medium`:return r(e,`dd/MM/yyyy`)+n;case`long`:return`${r(e,`d`)} ${w(e)} ${r(e,`yyyy`)}`+n;case`full`:{let t=`${C(e)}, ngày ${r(e,`d`)} ${w(e)} năm ${r(e,`yyyy`)}`;return t+n}case`relative`:return S(e);case`datetime`:return r(e,`d/M/yyyy HH:mm`);case`time`:return r(e,`HH:mm`);case`smart`:return E(e);default:return r(e,`d/M/yyyy`)+n}},[E,w,C,S,v]);if(!x)return n(`span`,{className:t(`text-muted-foreground text-sm`,y),children:`--/--/----`});let O=D(x,g),k=_?T(x):null,A=k?`${O} (${k})`:O,j=b||r(x,`EEEE, d MMMM yyyy HH:mm:ss`);return n(`time`,{dateTime:x.toISOString(),className:t(`text-accent-foreground font-number text-sm`,y),title:j,children:A})};export{h as DateDisplay};
|
|
2
|
-
//# sourceMappingURL=date-D7i-nFOS.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"date-D7i-nFOS.js","names":["DateDisplay: React.FC<Props>","date"],"sources":["../packages/constants.tsx","../packages/components/data-display/date.tsx"],"sourcesContent":["// Vietnamese locale configuration\nexport const vietnameseLocale = {\n weekdays: ['Chủ Nhật', 'Thứ Hai', 'Thứ Ba', 'Thứ Tư', 'Thứ Năm', 'Thứ Sáu', 'Thứ Bảy'],\n weekdaysShort: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],\n months: ['Tháng 1', 'Tháng 2', 'Tháng 3', 'Tháng 4', 'Tháng 5', 'Tháng 6', 'Tháng 7', 'Tháng 8', 'Tháng 9', 'Tháng 10', 'Tháng 11', 'Tháng 12'],\n monthsShort: ['T1', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7', 'T8', 'T9', 'T10', 'T11', 'T12'],\n}\n\n// Vietnamese holidays\nexport const vietnameseHolidays = {\n '01-01': 'Tết Dương lịch',\n '03-08': 'Quốc tế Phụ nữ',\n '04-30': 'Ngày Giải phóng miền Nam',\n '05-01': 'Quốc tế Lao động',\n '09-02': 'Quốc khánh',\n '10-20': 'Ngày Phụ nữ Việt Nam',\n '11-20': 'Ngày Nhà giáo Việt Nam',\n}\n\n// Time Constants in milliseconds, seconds, and minutes\nexport const TIME_IN_MS = Object.freeze({\n SECOND: 1000,\n MINUTE: 60 * 1000,\n HOUR: 60 * 60 * 1000,\n DAY: 24 * 60 * 60 * 1000,\n WEEK: 7 * 24 * 60 * 60 * 1000,\n MONTH: 30 * 24 * 60 * 60 * 1000, // Approximation for month length = 30 days\n YEAR: 365 * 24 * 60 * 60 * 1000,\n})\n\nexport const TIME_IN_SECONDS = Object.freeze({\n MINUTE: 60,\n HOUR: 60 * 60,\n DAY: 24 * 60 * 60,\n WEEK: 7 * 24 * 60 * 60,\n MONTH: 30 * 24 * 60 * 60,\n YEAR: 365 * 24 * 60 * 60,\n})\n\nexport const TIME_IN_MINUTES = Object.freeze({\n HOUR: 60,\n DAY: 24 * 60,\n WEEK: 7 * 24 * 60,\n MONTH: 30 * 24 * 60,\n})\n","import React from 'react'\nimport { format, isThisMonth, isThisWeek, isThisYear, isToday, isTomorrow, isValid, isYesterday, parseISO } from '@customafk/react-toolkit/date-fns'\n\nimport { TIME_IN_SECONDS, vietnameseHolidays, vietnameseLocale } from '@/constants'\nimport { cn } from '@customafk/react-toolkit/utils'\n\ninterface Props {\n date: Date | string | number\n format?:\n | 'short' // 15/03/24\n | 'medium' // 15/03/2024\n | 'long' // 15 tháng 3, 2024\n | 'full' // Thứ Sáu, ngày 15 tháng 3 năm 2024\n | 'relative' // 2 giờ trước\n | 'datetime' // 15/03/2024 14:30\n | 'time' // 14:30\n | 'smart' // Tự động chọn format phù hợp\n showHoliday?: boolean\n showTime?: boolean\n className?: string\n title?: string // Tooltip khi hover\n}\n\nexport const DateDisplay: React.FC<Props> = ({ date, format: formatType = 'medium', showHoliday = false, showTime = false, className = '', title }) => {\n const parsedDate = React.useMemo(() => {\n try {\n if (date instanceof Date) {\n return isValid(date) ? date : null\n }\n if (typeof date === 'string') {\n const parsed = parseISO(date)\n return isValid(parsed) ? parsed : new Date(date)\n }\n if (typeof date === 'number') {\n const parsed = new Date(date)\n return isValid(parsed) ? parsed : null\n }\n return null\n } catch {\n return null\n }\n }, [date])\n\n // Format relative time in Vietnamese\n const formatRelativeTime = React.useCallback((date: Date): string => {\n const now = new Date()\n const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000)\n\n if (diffInSeconds < 60) return 'Vừa xong'\n if (diffInSeconds < 3600) return `${Math.floor(diffInSeconds / TIME_IN_SECONDS.MINUTE)} phút trước`\n if (diffInSeconds < 86400) return `${Math.floor(diffInSeconds / TIME_IN_SECONDS.HOUR)} giờ trước`\n if (diffInSeconds < 604800) return `${Math.floor(diffInSeconds / TIME_IN_SECONDS.DAY)} ngày trước`\n if (diffInSeconds < 2592000) return `${Math.floor(diffInSeconds / TIME_IN_SECONDS.WEEK)} tuần trước`\n if (diffInSeconds < 31536000) return `${Math.floor(diffInSeconds / TIME_IN_SECONDS.MONTH)} tháng trước`\n return `${Math.floor(diffInSeconds / TIME_IN_SECONDS.YEAR)} năm trước`\n }, [])\n\n // Vietnamese weekday\n const getVietnameseWeekday = React.useCallback((date: Date, short: boolean = false): string => {\n const dayIndex = date.getDay()\n return short ? vietnameseLocale.weekdaysShort[dayIndex] : vietnameseLocale.weekdays[dayIndex]\n }, [])\n\n // Vietnamese month\n const getVietnameseMonth = React.useCallback((date: Date, short: boolean = false): string => {\n const monthIndex = date.getMonth()\n return short ? vietnameseLocale.monthsShort[monthIndex] : vietnameseLocale.months[monthIndex]\n }, [])\n\n // Check holiday\n const getHoliday = React.useCallback((date: Date): string | null => {\n const monthDay = format(date, 'MM-dd') as keyof typeof vietnameseHolidays\n return vietnameseHolidays[monthDay] || null\n }, [])\n\n // Smart format - choose appropriate format based on date\n const getSmartFormat = React.useCallback(\n (date: Date): string => {\n if (isToday(date)) {\n return showTime ? `Hôm nay ${format(date, 'HH:mm')}` : 'Hôm nay'\n }\n if (isYesterday(date)) {\n return showTime ? `Hôm qua ${format(date, 'HH:mm')}` : 'Hôm qua'\n }\n if (isTomorrow(date)) {\n return showTime ? `Ngày mai ${format(date, 'HH:mm')}` : 'Ngày mai'\n }\n if (isThisWeek(date)) {\n const weekday = getVietnameseWeekday(date)\n return showTime ? `${weekday} ${format(date, 'HH:mm')}` : weekday\n }\n if (isThisMonth(date)) {\n const day = format(date, 'd')\n return showTime ? `${day}/${format(date, 'M')} ${format(date, 'HH:mm')}` : `${day}/${format(date, 'M')}`\n }\n if (isThisYear(date)) {\n return showTime ? format(date, 'd/M HH:mm') : format(date, 'd/M')\n }\n return showTime ? format(date, 'd/M/yyyy HH:mm') : format(date, 'd/M/yyyy')\n },\n [getVietnameseWeekday, showTime],\n )\n\n // Main formatting function\n const formatDate = React.useCallback(\n (date: Date, type: string): string => {\n const timeStr = showTime ? format(date, ', HH:mm') : ''\n\n switch (type) {\n case 'short':\n return format(date, 'd/M/yy') + timeStr\n\n case 'medium':\n return format(date, 'dd/MM/yyyy') + timeStr\n\n case 'long':\n return `${format(date, 'd')} ${getVietnameseMonth(date)} ${format(date, 'yyyy')}` + timeStr\n\n case 'full': {\n const data = `${getVietnameseWeekday(date)}, ngày ${format(date, 'd')} ${getVietnameseMonth(date)} năm ${format(date, 'yyyy')}`\n return data + timeStr\n }\n\n case 'relative':\n return formatRelativeTime(date)\n\n case 'datetime':\n return format(date, 'd/M/yyyy HH:mm')\n\n case 'time':\n return format(date, 'HH:mm')\n\n case 'smart':\n return getSmartFormat(date)\n\n default:\n return format(date, 'd/M/yyyy') + timeStr\n }\n },\n [getSmartFormat, getVietnameseMonth, getVietnameseWeekday, formatRelativeTime, showTime],\n )\n\n if (!parsedDate) {\n return <span className={cn('text-muted-foreground text-sm', className)}>--/--/----</span>\n }\n\n const formattedDate = formatDate(parsedDate, formatType)\n const holiday = showHoliday ? getHoliday(parsedDate) : null\n const displayText = holiday ? `${formattedDate} (${holiday})` : formattedDate\n const tooltipTitle = title || format(parsedDate, 'EEEE, d MMMM yyyy HH:mm:ss')\n\n return (\n <time dateTime={parsedDate.toISOString()} className={cn('text-accent-foreground font-number text-sm', className)} title={tooltipTitle}>\n {displayText}\n </time>\n )\n}\n"],"mappings":"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"}
|
package/dist/date-DevNulgp.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require(`./chunk-CUT6urMc.cjs`),t=e.__toESM(require(`react`)),n=e.__toESM(require(`@customafk/react-toolkit/utils`)),r=e.__toESM(require(`react/jsx-runtime`)),i=e.__toESM(require(`@customafk/react-toolkit/date-fns`)),a={weekdays:[`Chủ Nhật`,`Thứ Hai`,`Thứ Ba`,`Thứ Tư`,`Thứ Năm`,`Thứ Sáu`,`Thứ Bảy`],weekdaysShort:[`CN`,`T2`,`T3`,`T4`,`T5`,`T6`,`T7`],months:[`Tháng 1`,`Tháng 2`,`Tháng 3`,`Tháng 4`,`Tháng 5`,`Tháng 6`,`Tháng 7`,`Tháng 8`,`Tháng 9`,`Tháng 10`,`Tháng 11`,`Tháng 12`],monthsShort:[`T1`,`T2`,`T3`,`T4`,`T5`,`T6`,`T7`,`T8`,`T9`,`T10`,`T11`,`T12`]},o={"01-01":`Tết Dương lịch`,"03-08":`Quốc tế Phụ nữ`,"04-30":`Ngày Giải phóng miền Nam`,"05-01":`Quốc tế Lao động`,"09-02":`Quốc khánh`,"10-20":`Ngày Phụ nữ Việt Nam`,"11-20":`Ngày Nhà giáo Việt Nam`},s=Object.freeze({SECOND:1e3,MINUTE:60*1e3,HOUR:3600*1e3,DAY:1440*60*1e3,WEEK:10080*60*1e3,MONTH:720*60*60*1e3,YEAR:365*24*60*60*1e3}),c=Object.freeze({MINUTE:60,HOUR:3600,DAY:1440*60,WEEK:10080*60,MONTH:720*60*60,YEAR:365*24*60*60}),l=Object.freeze({HOUR:60,DAY:1440,WEEK:10080,MONTH:720*60}),u=({date:e,format:s=`medium`,showHoliday:l=!1,showTime:u=!1,className:d=``,title:f})=>{let p=t.default.useMemo(()=>{try{if(e instanceof Date)return(0,i.isValid)(e)?e:null;if(typeof e==`string`){let t=(0,i.parseISO)(e);return(0,i.isValid)(t)?t:new Date(e)}if(typeof e==`number`){let t=new Date(e);return(0,i.isValid)(t)?t:null}return null}catch{return null}},[e]),m=t.default.useCallback(e=>{let t=new Date,n=Math.floor((t.getTime()-e.getTime())/1e3);return n<60?`Vừa xong`:n<3600?`${Math.floor(n/c.MINUTE)} phút trước`:n<86400?`${Math.floor(n/c.HOUR)} giờ trước`:n<604800?`${Math.floor(n/c.DAY)} ngày trước`:n<2592e3?`${Math.floor(n/c.WEEK)} tuần trước`:n<31536e3?`${Math.floor(n/c.MONTH)} tháng trước`:`${Math.floor(n/c.YEAR)} năm trước`},[]),h=t.default.useCallback((e,t=!1)=>{let n=e.getDay();return t?a.weekdaysShort[n]:a.weekdays[n]},[]),g=t.default.useCallback((e,t=!1)=>{let n=e.getMonth();return t?a.monthsShort[n]:a.months[n]},[]),_=t.default.useCallback(e=>{let t=(0,i.format)(e,`MM-dd`);return o[t]||null},[]),v=t.default.useCallback(e=>{if((0,i.isToday)(e))return u?`Hôm nay ${(0,i.format)(e,`HH:mm`)}`:`Hôm nay`;if((0,i.isYesterday)(e))return u?`Hôm qua ${(0,i.format)(e,`HH:mm`)}`:`Hôm qua`;if((0,i.isTomorrow)(e))return u?`Ngày mai ${(0,i.format)(e,`HH:mm`)}`:`Ngày mai`;if((0,i.isThisWeek)(e)){let t=h(e);return u?`${t} ${(0,i.format)(e,`HH:mm`)}`:t}if((0,i.isThisMonth)(e)){let t=(0,i.format)(e,`d`);return u?`${t}/${(0,i.format)(e,`M`)} ${(0,i.format)(e,`HH:mm`)}`:`${t}/${(0,i.format)(e,`M`)}`}return(0,i.isThisYear)(e)?u?(0,i.format)(e,`d/M HH:mm`):(0,i.format)(e,`d/M`):u?(0,i.format)(e,`d/M/yyyy HH:mm`):(0,i.format)(e,`d/M/yyyy`)},[h,u]),y=t.default.useCallback((e,t)=>{let n=u?(0,i.format)(e,`, HH:mm`):``;switch(t){case`short`:return(0,i.format)(e,`d/M/yy`)+n;case`medium`:return(0,i.format)(e,`dd/MM/yyyy`)+n;case`long`:return`${(0,i.format)(e,`d`)} ${g(e)} ${(0,i.format)(e,`yyyy`)}`+n;case`full`:{let t=`${h(e)}, ngày ${(0,i.format)(e,`d`)} ${g(e)} năm ${(0,i.format)(e,`yyyy`)}`;return t+n}case`relative`:return m(e);case`datetime`:return(0,i.format)(e,`d/M/yyyy HH:mm`);case`time`:return(0,i.format)(e,`HH:mm`);case`smart`:return v(e);default:return(0,i.format)(e,`d/M/yyyy`)+n}},[v,g,h,m,u]);if(!p)return(0,r.jsx)(`span`,{className:(0,n.cn)(`text-muted-foreground text-sm`,d),children:`--/--/----`});let b=y(p,s),x=l?_(p):null,S=x?`${b} (${x})`:b,C=f||(0,i.format)(p,`EEEE, d MMMM yyyy HH:mm:ss`);return(0,r.jsx)(`time`,{dateTime:p.toISOString(),className:(0,n.cn)(`text-accent-foreground font-number text-sm`,d),title:C,children:S})};Object.defineProperty(exports,`DateDisplay`,{enumerable:!0,get:function(){return u}});
|
|
2
|
-
//# sourceMappingURL=date-DevNulgp.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"date-DevNulgp.cjs","names":["DateDisplay: React.FC<Props>","React","date"],"sources":["../packages/constants.tsx","../packages/components/data-display/date.tsx"],"sourcesContent":["// Vietnamese locale configuration\nexport const vietnameseLocale = {\n weekdays: ['Chủ Nhật', 'Thứ Hai', 'Thứ Ba', 'Thứ Tư', 'Thứ Năm', 'Thứ Sáu', 'Thứ Bảy'],\n weekdaysShort: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],\n months: ['Tháng 1', 'Tháng 2', 'Tháng 3', 'Tháng 4', 'Tháng 5', 'Tháng 6', 'Tháng 7', 'Tháng 8', 'Tháng 9', 'Tháng 10', 'Tháng 11', 'Tháng 12'],\n monthsShort: ['T1', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7', 'T8', 'T9', 'T10', 'T11', 'T12'],\n}\n\n// Vietnamese holidays\nexport const vietnameseHolidays = {\n '01-01': 'Tết Dương lịch',\n '03-08': 'Quốc tế Phụ nữ',\n '04-30': 'Ngày Giải phóng miền Nam',\n '05-01': 'Quốc tế Lao động',\n '09-02': 'Quốc khánh',\n '10-20': 'Ngày Phụ nữ Việt Nam',\n '11-20': 'Ngày Nhà giáo Việt Nam',\n}\n\n// Time Constants in milliseconds, seconds, and minutes\nexport const TIME_IN_MS = Object.freeze({\n SECOND: 1000,\n MINUTE: 60 * 1000,\n HOUR: 60 * 60 * 1000,\n DAY: 24 * 60 * 60 * 1000,\n WEEK: 7 * 24 * 60 * 60 * 1000,\n MONTH: 30 * 24 * 60 * 60 * 1000, // Approximation for month length = 30 days\n YEAR: 365 * 24 * 60 * 60 * 1000,\n})\n\nexport const TIME_IN_SECONDS = Object.freeze({\n MINUTE: 60,\n HOUR: 60 * 60,\n DAY: 24 * 60 * 60,\n WEEK: 7 * 24 * 60 * 60,\n MONTH: 30 * 24 * 60 * 60,\n YEAR: 365 * 24 * 60 * 60,\n})\n\nexport const TIME_IN_MINUTES = Object.freeze({\n HOUR: 60,\n DAY: 24 * 60,\n WEEK: 7 * 24 * 60,\n MONTH: 30 * 24 * 60,\n})\n","import React from 'react'\nimport { format, isThisMonth, isThisWeek, isThisYear, isToday, isTomorrow, isValid, isYesterday, parseISO } from '@customafk/react-toolkit/date-fns'\n\nimport { TIME_IN_SECONDS, vietnameseHolidays, vietnameseLocale } from '@/constants'\nimport { cn } from '@customafk/react-toolkit/utils'\n\ninterface Props {\n date: Date | string | number\n format?:\n | 'short' // 15/03/24\n | 'medium' // 15/03/2024\n | 'long' // 15 tháng 3, 2024\n | 'full' // Thứ Sáu, ngày 15 tháng 3 năm 2024\n | 'relative' // 2 giờ trước\n | 'datetime' // 15/03/2024 14:30\n | 'time' // 14:30\n | 'smart' // Tự động chọn format phù hợp\n showHoliday?: boolean\n showTime?: boolean\n className?: string\n title?: string // Tooltip khi hover\n}\n\nexport const DateDisplay: React.FC<Props> = ({ date, format: formatType = 'medium', showHoliday = false, showTime = false, className = '', title }) => {\n const parsedDate = React.useMemo(() => {\n try {\n if (date instanceof Date) {\n return isValid(date) ? date : null\n }\n if (typeof date === 'string') {\n const parsed = parseISO(date)\n return isValid(parsed) ? parsed : new Date(date)\n }\n if (typeof date === 'number') {\n const parsed = new Date(date)\n return isValid(parsed) ? parsed : null\n }\n return null\n } catch {\n return null\n }\n }, [date])\n\n // Format relative time in Vietnamese\n const formatRelativeTime = React.useCallback((date: Date): string => {\n const now = new Date()\n const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000)\n\n if (diffInSeconds < 60) return 'Vừa xong'\n if (diffInSeconds < 3600) return `${Math.floor(diffInSeconds / TIME_IN_SECONDS.MINUTE)} phút trước`\n if (diffInSeconds < 86400) return `${Math.floor(diffInSeconds / TIME_IN_SECONDS.HOUR)} giờ trước`\n if (diffInSeconds < 604800) return `${Math.floor(diffInSeconds / TIME_IN_SECONDS.DAY)} ngày trước`\n if (diffInSeconds < 2592000) return `${Math.floor(diffInSeconds / TIME_IN_SECONDS.WEEK)} tuần trước`\n if (diffInSeconds < 31536000) return `${Math.floor(diffInSeconds / TIME_IN_SECONDS.MONTH)} tháng trước`\n return `${Math.floor(diffInSeconds / TIME_IN_SECONDS.YEAR)} năm trước`\n }, [])\n\n // Vietnamese weekday\n const getVietnameseWeekday = React.useCallback((date: Date, short: boolean = false): string => {\n const dayIndex = date.getDay()\n return short ? vietnameseLocale.weekdaysShort[dayIndex] : vietnameseLocale.weekdays[dayIndex]\n }, [])\n\n // Vietnamese month\n const getVietnameseMonth = React.useCallback((date: Date, short: boolean = false): string => {\n const monthIndex = date.getMonth()\n return short ? vietnameseLocale.monthsShort[monthIndex] : vietnameseLocale.months[monthIndex]\n }, [])\n\n // Check holiday\n const getHoliday = React.useCallback((date: Date): string | null => {\n const monthDay = format(date, 'MM-dd') as keyof typeof vietnameseHolidays\n return vietnameseHolidays[monthDay] || null\n }, [])\n\n // Smart format - choose appropriate format based on date\n const getSmartFormat = React.useCallback(\n (date: Date): string => {\n if (isToday(date)) {\n return showTime ? `Hôm nay ${format(date, 'HH:mm')}` : 'Hôm nay'\n }\n if (isYesterday(date)) {\n return showTime ? `Hôm qua ${format(date, 'HH:mm')}` : 'Hôm qua'\n }\n if (isTomorrow(date)) {\n return showTime ? `Ngày mai ${format(date, 'HH:mm')}` : 'Ngày mai'\n }\n if (isThisWeek(date)) {\n const weekday = getVietnameseWeekday(date)\n return showTime ? `${weekday} ${format(date, 'HH:mm')}` : weekday\n }\n if (isThisMonth(date)) {\n const day = format(date, 'd')\n return showTime ? `${day}/${format(date, 'M')} ${format(date, 'HH:mm')}` : `${day}/${format(date, 'M')}`\n }\n if (isThisYear(date)) {\n return showTime ? format(date, 'd/M HH:mm') : format(date, 'd/M')\n }\n return showTime ? format(date, 'd/M/yyyy HH:mm') : format(date, 'd/M/yyyy')\n },\n [getVietnameseWeekday, showTime],\n )\n\n // Main formatting function\n const formatDate = React.useCallback(\n (date: Date, type: string): string => {\n const timeStr = showTime ? format(date, ', HH:mm') : ''\n\n switch (type) {\n case 'short':\n return format(date, 'd/M/yy') + timeStr\n\n case 'medium':\n return format(date, 'dd/MM/yyyy') + timeStr\n\n case 'long':\n return `${format(date, 'd')} ${getVietnameseMonth(date)} ${format(date, 'yyyy')}` + timeStr\n\n case 'full': {\n const data = `${getVietnameseWeekday(date)}, ngày ${format(date, 'd')} ${getVietnameseMonth(date)} năm ${format(date, 'yyyy')}`\n return data + timeStr\n }\n\n case 'relative':\n return formatRelativeTime(date)\n\n case 'datetime':\n return format(date, 'd/M/yyyy HH:mm')\n\n case 'time':\n return format(date, 'HH:mm')\n\n case 'smart':\n return getSmartFormat(date)\n\n default:\n return format(date, 'd/M/yyyy') + timeStr\n }\n },\n [getSmartFormat, getVietnameseMonth, getVietnameseWeekday, formatRelativeTime, showTime],\n )\n\n if (!parsedDate) {\n return <span className={cn('text-muted-foreground text-sm', className)}>--/--/----</span>\n }\n\n const formattedDate = formatDate(parsedDate, formatType)\n const holiday = showHoliday ? getHoliday(parsedDate) : null\n const displayText = holiday ? `${formattedDate} (${holiday})` : formattedDate\n const tooltipTitle = title || format(parsedDate, 'EEEE, d MMMM yyyy HH:mm:ss')\n\n return (\n <time dateTime={parsedDate.toISOString()} className={cn('text-accent-foreground font-number text-sm', className)} title={tooltipTitle}>\n {displayText}\n </time>\n )\n}\n"],"mappings":"iOACa,EAAmB,CAC9B,SAAU,CAAC,WAAY,UAAW,SAAU,SAAU,UAAW,UAAW,WAC5E,cAAe,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MACpD,OAAQ,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,WAAY,WAAY,YACpI,YAAa,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAAO,MAAO,QAIvE,EAAqB,CAChC,QAAS,iBACT,QAAS,iBACT,QAAS,2BACT,QAAS,mBACT,QAAS,aACT,QAAS,uBACT,QAAS,0BAIE,EAAa,OAAO,OAAO,CACtC,OAAQ,IACR,OAAQ,GAAK,IACb,KAAM,KAAU,IAChB,IAAK,KAAU,GAAK,IACpB,KAAM,MAAc,GAAK,IACzB,MAAO,IAAU,GAAK,GAAK,IAC3B,KAAM,IAAM,GAAK,GAAK,GAAK,MAGhB,EAAkB,OAAO,OAAO,CAC3C,OAAQ,GACR,KAAM,KACN,IAAK,KAAU,GACf,KAAM,MAAc,GACpB,MAAO,IAAU,GAAK,GACtB,KAAM,IAAM,GAAK,GAAK,KAGX,EAAkB,OAAO,OAAO,CAC3C,KAAM,GACN,IAAK,KACL,KAAM,MACN,MAAO,IAAU,KCpBNA,GAAgC,CAAE,OAAM,OAAQ,EAAa,SAAU,cAAc,GAAO,WAAW,GAAO,YAAY,GAAI,WAAY,CACrJ,IAAM,EAAaC,EAAAA,QAAM,YAAc,CACrC,GAAI,CACF,GAAI,aAAgB,KAClB,OAAA,EAAA,EAAA,SAAe,GAAQ,EAAO,KAEhC,GAAI,OAAO,GAAS,SAAU,CAC5B,IAAM,GAAA,EAAA,EAAA,UAAkB,GACxB,OAAA,EAAA,EAAA,SAAe,GAAU,EAAS,IAAI,KAAK,GAE7C,GAAI,OAAO,GAAS,SAAU,CAC5B,IAAM,EAAS,IAAI,KAAK,GACxB,OAAA,EAAA,EAAA,SAAe,GAAU,EAAS,KAEpC,OAAO,UACD,CACN,OAAO,OAER,CAAC,IAGE,EAAqBA,EAAAA,QAAM,YAAa,GAAuB,CACnE,IAAM,EAAM,IAAI,KACV,EAAgB,KAAK,OAAO,EAAI,UAAYC,EAAK,WAAa,KAQpE,OANI,EAAgB,GAAW,WAC3B,EAAgB,KAAa,GAAG,KAAK,MAAM,EAAgB,EAAgB,QAAQ,aACnF,EAAgB,MAAc,GAAG,KAAK,MAAM,EAAgB,EAAgB,MAAM,YAClF,EAAgB,OAAe,GAAG,KAAK,MAAM,EAAgB,EAAgB,KAAK,aAClF,EAAgB,OAAgB,GAAG,KAAK,MAAM,EAAgB,EAAgB,MAAM,aACpF,EAAgB,QAAiB,GAAG,KAAK,MAAM,EAAgB,EAAgB,OAAO,cACnF,GAAG,KAAK,MAAM,EAAgB,EAAgB,MAAM,aAC1D,IAGG,EAAuBD,EAAAA,QAAM,aAAa,EAAY,EAAiB,KAAkB,CAC7F,IAAM,EAAWC,EAAK,SACtB,OAAO,EAAQ,EAAiB,cAAc,GAAY,EAAiB,SAAS,IACnF,IAGG,EAAqBD,EAAAA,QAAM,aAAa,EAAY,EAAiB,KAAkB,CAC3F,IAAM,EAAaC,EAAK,WACxB,OAAO,EAAQ,EAAiB,YAAY,GAAc,EAAiB,OAAO,IACjF,IAGG,EAAaD,EAAAA,QAAM,YAAa,GAA8B,CAClE,IAAM,GAAA,EAAA,EAAA,QAAkBC,EAAM,SAC9B,OAAO,EAAmB,IAAa,MACtC,IAGG,EAAiBD,EAAAA,QAAM,YAC1B,GAAuB,CACtB,IAAA,EAAA,EAAA,SAAYC,GACV,OAAO,EAAW,YAAA,EAAA,EAAA,QAAkBA,EAAM,WAAa,UAEzD,IAAA,EAAA,EAAA,aAAgBA,GACd,OAAO,EAAW,YAAA,EAAA,EAAA,QAAkBA,EAAM,WAAa,UAEzD,IAAA,EAAA,EAAA,YAAeA,GACb,OAAO,EAAW,aAAA,EAAA,EAAA,QAAmBA,EAAM,WAAa,WAE1D,IAAA,EAAA,EAAA,YAAeA,GAAO,CACpB,IAAM,EAAU,EAAqBA,GACrC,OAAO,EAAW,GAAG,EAAQ,IAAA,EAAA,EAAA,QAAUA,EAAM,WAAa,EAE5D,IAAA,EAAA,EAAA,aAAgBA,GAAO,CACrB,IAAM,GAAA,EAAA,EAAA,QAAaA,EAAM,KACzB,OAAO,EAAW,GAAG,EAAI,IAAA,EAAA,EAAA,QAAUA,EAAM,KAAK,IAAA,EAAA,EAAA,QAAUA,EAAM,WAAa,GAAG,EAAI,IAAA,EAAA,EAAA,QAAUA,EAAM,OAKpG,OAHA,EAAA,EAAA,YAAeA,GACN,GAAA,EAAA,EAAA,QAAkBA,EAAM,cAAA,EAAA,EAAA,QAAsBA,EAAM,OAEtD,GAAA,EAAA,EAAA,QAAkBA,EAAM,mBAAA,EAAA,EAAA,QAA2BA,EAAM,aAElE,CAAC,EAAsB,IAInB,EAAaD,EAAAA,QAAM,aACtB,EAAY,IAAyB,CACpC,IAAM,EAAU,GAAA,EAAA,EAAA,QAAkBC,EAAM,WAAa,GAErD,OAAQ,EAAR,CACE,IAAK,QACH,OAAA,EAAA,EAAA,QAAcA,EAAM,UAAY,EAElC,IAAK,SACH,OAAA,EAAA,EAAA,QAAcA,EAAM,cAAgB,EAEtC,IAAK,OACH,MAAO,IAAA,EAAA,EAAA,QAAUA,EAAM,KAAK,GAAG,EAAmBA,GAAM,IAAA,EAAA,EAAA,QAAUA,EAAM,UAAY,EAEtF,IAAK,OAAQ,CACX,IAAM,EAAO,GAAG,EAAqBA,GAAM,UAAA,EAAA,EAAA,QAAgBA,EAAM,KAAK,GAAG,EAAmBA,GAAM,QAAA,EAAA,EAAA,QAAcA,EAAM,UACtH,OAAO,EAAO,EAGhB,IAAK,WACH,OAAO,EAAmBA,GAE5B,IAAK,WACH,OAAA,EAAA,EAAA,QAAcA,EAAM,kBAEtB,IAAK,OACH,OAAA,EAAA,EAAA,QAAcA,EAAM,SAEtB,IAAK,QACH,OAAO,EAAeA,GAExB,QACE,OAAA,EAAA,EAAA,QAAcA,EAAM,YAAc,IAGxC,CAAC,EAAgB,EAAoB,EAAsB,EAAoB,IAGjF,GAAI,CAAC,EACH,OAAO,EAAA,EAAA,KAAC,OAAA,CAAK,WAAA,EAAA,EAAA,IAAc,gCAAiC,YAAY,eAG1E,IAAM,EAAgB,EAAW,EAAY,GACvC,EAAU,EAAc,EAAW,GAAc,KACjD,EAAc,EAAU,GAAG,EAAc,IAAI,EAAQ,GAAK,EAC1D,EAAe,IAAA,EAAA,EAAA,QAAgB,EAAY,8BAEjD,OACE,EAAA,EAAA,KAAC,OAAA,CAAK,SAAU,EAAW,cAAe,WAAA,EAAA,EAAA,IAAc,6CAA8C,GAAY,MAAO,WACtH"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require(`./chunk-CUT6urMc.cjs`),t=require(`./alert-dialog-Bc-61QzL.cjs`),n=e.__toESM(require(`react`)),r=e.__toESM(require(`react/jsx-runtime`)),i=e.__toESM(require(`lucide-react`)),a=({open:e,title:a,children:o,onOpenChange:s})=>{let c=n.default.useCallback(()=>{s?.(!1)},[s]);return(0,r.jsx)(t.AlertDialog,{open:e,onOpenChange:s,children:(0,r.jsxs)(t.AlertDialogContent,{className:`gap-8 p-4 sm:max-w-md`,children:[(0,r.jsx)(t.AlertDialogHeader,{children:(0,r.jsxs)(`div`,{className:`text-destructive flex flex-col items-center`,children:[(0,r.jsx)(i.AlertTriangleIcon,{size:42}),(0,r.jsx)(t.AlertDialogTitle,{className:`text-xl font-medium`,children:a||`An error occurred`})]})}),o,(0,r.jsx)(t.AlertDialogFooter,{children:(0,r.jsx)(t.AlertDialogAction,{className:`w-full sm:w-28`,onClick:c,children:`Close`})})]})})};Object.defineProperty(exports,`ErrorDialog`,{enumerable:!0,get:function(){return a}});
|
|
2
|
-
//# sourceMappingURL=error-dialog-DvTlwpSn.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"error-dialog-DvTlwpSn.cjs","names":["ErrorDialog: React.FC<React.PropsWithChildren<Props>>","React","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertTriangleIcon","AlertDialogTitle","AlertDialogFooter","AlertDialogAction"],"sources":["../packages/components/dialogs/error-dialog.tsx"],"sourcesContent":["import React from 'react'\nimport { AlertTriangleIcon } from 'lucide-react'\n\nimport { AlertDialog, AlertDialogAction, AlertDialogContent, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle } from '../ui/alert-dialog'\n\ntype Props = {\n open?: boolean\n title?: string\n description?: string\n onOpenChange?: (open: boolean) => void\n}\nexport const ErrorDialog: React.FC<React.PropsWithChildren<Props>> = ({ open, title, children, onOpenChange }) => {\n const handleClose = React.useCallback(() => {\n onOpenChange?.(false)\n }, [onOpenChange])\n return (\n <AlertDialog open={open} onOpenChange={onOpenChange}>\n <AlertDialogContent className=\"gap-8 p-4 sm:max-w-md\">\n <AlertDialogHeader>\n <div className=\"text-destructive flex flex-col items-center\">\n <AlertTriangleIcon size={42} />\n <AlertDialogTitle className=\"text-xl font-medium\">{title || 'An error occurred'}</AlertDialogTitle>\n </div>\n </AlertDialogHeader>\n {children}\n <AlertDialogFooter>\n <AlertDialogAction className=\"w-full sm:w-28\" onClick={handleClose}>\n Close\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n )\n}\n"],"mappings":"8LAWaA,GAAyD,CAAE,OAAM,QAAO,WAAU,kBAAmB,CAChH,IAAM,EAAcC,EAAAA,QAAM,gBAAkB,CAC1C,IAAe,KACd,CAAC,IACJ,OACE,EAAA,EAAA,KAACC,EAAAA,YAAAA,CAAkB,OAAoB,yBACrC,EAAA,EAAA,MAACC,EAAAA,mBAAAA,CAAmB,UAAU,mCAC5B,EAAA,EAAA,KAACC,EAAAA,kBAAAA,CAAAA,UACC,EAAA,EAAA,MAAC,MAAA,CAAI,UAAU,yDACb,EAAA,EAAA,KAACC,EAAAA,kBAAAA,CAAkB,KAAM,MACzB,EAAA,EAAA,KAACC,EAAAA,iBAAAA,CAAiB,UAAU,+BAAuB,GAAS,2BAG/D,GACD,EAAA,EAAA,KAACC,EAAAA,kBAAAA,CAAAA,UACC,EAAA,EAAA,KAACC,EAAAA,kBAAAA,CAAkB,UAAU,iBAAiB,QAAS,WAAa"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{AlertDialog as e,AlertDialogAction as t,AlertDialogContent as n,AlertDialogFooter as r,AlertDialogHeader as i,AlertDialogTitle as a}from"./alert-dialog-kpuqvmVo.js";import o from"react";import{jsx as s,jsxs as c}from"react/jsx-runtime";import{AlertTriangleIcon as l}from"lucide-react";const u=({open:u,title:d,children:f,onOpenChange:p})=>{let m=o.useCallback(()=>{p?.(!1)},[p]);return s(e,{open:u,onOpenChange:p,children:c(n,{className:`gap-8 p-4 sm:max-w-md`,children:[s(i,{children:c(`div`,{className:`text-destructive flex flex-col items-center`,children:[s(l,{size:42}),s(a,{className:`text-xl font-medium`,children:d||`An error occurred`})]})}),f,s(r,{children:s(t,{className:`w-full sm:w-28`,onClick:m,children:`Close`})})]})})};export{u as ErrorDialog};
|
|
2
|
-
//# sourceMappingURL=error-dialog-e9mFaOuG.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"error-dialog-e9mFaOuG.js","names":["ErrorDialog: React.FC<React.PropsWithChildren<Props>>"],"sources":["../packages/components/dialogs/error-dialog.tsx"],"sourcesContent":["import React from 'react'\nimport { AlertTriangleIcon } from 'lucide-react'\n\nimport { AlertDialog, AlertDialogAction, AlertDialogContent, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle } from '../ui/alert-dialog'\n\ntype Props = {\n open?: boolean\n title?: string\n description?: string\n onOpenChange?: (open: boolean) => void\n}\nexport const ErrorDialog: React.FC<React.PropsWithChildren<Props>> = ({ open, title, children, onOpenChange }) => {\n const handleClose = React.useCallback(() => {\n onOpenChange?.(false)\n }, [onOpenChange])\n return (\n <AlertDialog open={open} onOpenChange={onOpenChange}>\n <AlertDialogContent className=\"gap-8 p-4 sm:max-w-md\">\n <AlertDialogHeader>\n <div className=\"text-destructive flex flex-col items-center\">\n <AlertTriangleIcon size={42} />\n <AlertDialogTitle className=\"text-xl font-medium\">{title || 'An error occurred'}</AlertDialogTitle>\n </div>\n </AlertDialogHeader>\n {children}\n <AlertDialogFooter>\n <AlertDialogAction className=\"w-full sm:w-28\" onClick={handleClose}>\n Close\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n )\n}\n"],"mappings":"oSAWA,MAAaA,GAAyD,CAAE,OAAM,QAAO,WAAU,kBAAmB,CAChH,IAAM,EAAc,EAAM,gBAAkB,CAC1C,IAAe,KACd,CAAC,IACJ,OACE,EAAC,EAAA,CAAkB,OAAoB,wBACrC,EAAC,EAAA,CAAmB,UAAU,kCAC5B,EAAC,EAAA,CAAA,SACC,EAAC,MAAA,CAAI,UAAU,wDACb,EAAC,EAAA,CAAkB,KAAM,KACzB,EAAC,EAAA,CAAiB,UAAU,+BAAuB,GAAS,2BAG/D,EACD,EAAC,EAAA,CAAA,SACC,EAAC,EAAA,CAAkB,UAAU,iBAAiB,QAAS,WAAa"}
|
package/dist/form-BzvxUv0a.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{Label as e}from"./label-BQ52Pjw-.js";import t from"react";import{cn as n}from"@customafk/react-toolkit/utils";import{jsx as r}from"react/jsx-runtime";import{Label as i,Slot as a}from"radix-ui";import{Controller as o,FormProvider as s,useFormContext as c,useFormState as l}from"react-hook-form";const u=s,d=t.createContext({}),f=({...e})=>r(d.Provider,{value:{name:e.name},children:r(o,{...e})}),p=()=>{let e=t.useContext(d),n=t.useContext(m),{getFieldState:r,control:i,resetField:a}=c(),o=l({name:e.name}),s=r(e.name,o);if(!e)throw Error(`useFormField should be used within <FormField>`);let{id:u}=n;return{id:u,control:i,resetField:a,name:e.name,formItemId:`${u}-form-item`,formDescriptionId:`${u}-form-item-description`,formMessageId:`${u}-form-item-message`,...s}},m=t.createContext({});function h({className:e,...i}){let a=t.useId();return r(m.Provider,{value:{id:a},children:r(`div`,{"data-slot":`form-item`,className:n(`grid gap-1`,e),...i})})}function g({className:t,...i}){let{formItemId:a}=p();return r(e,{"data-slot":`form-label`,className:n(`text-xs`,t),htmlFor:a,...i})}function _({...e}){let{error:t,formItemId:n,formDescriptionId:i,formMessageId:o}=p();return r(a.Slot,{"data-slot":`form-control`,id:n,"aria-describedby":t?`${i} ${o}`:`${i}`,"aria-invalid":!!t,...e})}function v({className:e,...t}){let{formDescriptionId:i}=p();return r(`p`,{"data-slot":`form-description`,id:i,className:n(`text-text-positive-weak text-sm`,e),...t})}function y({className:e,children:t,...i}){let{error:a,formMessageId:o}=p();return r(`span`,{"data-slot":`form-message`,id:o,className:n(`text-danger text-xs`,e),...i,children:a?String(a?.message??``):t})}export{u as Form,_ as FormControl,v as FormDescription,f as FormField,h as FormItem,g as FormLabel,y as FormMessage,p as useFormField};
|
|
2
|
-
//# sourceMappingURL=form-BzvxUv0a.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"form-BzvxUv0a.js","names":["Label","SlotPrimitive"],"sources":["../packages/components/ui/form.tsx"],"sourcesContent":["'use client'\nimport React from 'react'\nimport { Controller, type ControllerProps, type FieldPath, type FieldValues, FormProvider, useFormContext, useFormState } from 'react-hook-form'\nimport { Label as LabelPrimitive, Slot as SlotPrimitive } from 'radix-ui'\n\nimport { Label } from '@/components/ui/label'\nimport { cn } from '@customafk/react-toolkit/utils'\n\nconst Form = FormProvider\n\ntype FormFieldContextValue<TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>> = {\n name: TName\n}\n\nconst FormFieldContext = React.createContext<FormFieldContextValue>({} as FormFieldContextValue)\n\nconst FormField = <TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>>({\n ...props\n}: ControllerProps<TFieldValues, TName>) => {\n return (\n <FormFieldContext.Provider value={{ name: props.name }}>\n <Controller {...props} />\n </FormFieldContext.Provider>\n )\n}\n\nconst useFormField = () => {\n const fieldContext = React.useContext(FormFieldContext)\n const itemContext = React.useContext(FormItemContext)\n const { getFieldState, control, resetField } = useFormContext()\n const formState = useFormState({ name: fieldContext.name })\n const fieldState = getFieldState(fieldContext.name, formState)\n\n if (!fieldContext) {\n throw new Error('useFormField should be used within <FormField>')\n }\n\n const { id } = itemContext\n\n return {\n id,\n control,\n resetField,\n name: fieldContext.name,\n formItemId: `${id}-form-item`,\n formDescriptionId: `${id}-form-item-description`,\n formMessageId: `${id}-form-item-message`,\n ...fieldState,\n }\n}\n\ntype FormItemContextValue = {\n id: string\n}\n\nconst FormItemContext = React.createContext<FormItemContextValue>({} as FormItemContextValue)\n\nfunction FormItem({ className, ...props }: React.ComponentProps<'div'>) {\n const id = React.useId()\n\n return (\n <FormItemContext.Provider value={{ id }}>\n <div data-slot=\"form-item\" className={cn('grid gap-1', className)} {...props} />\n </FormItemContext.Provider>\n )\n}\n\nfunction FormLabel({ className, ...props }: React.ComponentProps<typeof LabelPrimitive.Root>) {\n const { formItemId } = useFormField()\n return <Label data-slot=\"form-label\" className={cn('text-xs', className)} htmlFor={formItemId} {...props} />\n}\n\nfunction FormControl({ ...props }: React.ComponentProps<typeof SlotPrimitive.Slot>) {\n const { error, formItemId, formDescriptionId, formMessageId } = useFormField()\n\n return (\n <SlotPrimitive.Slot\n data-slot=\"form-control\"\n id={formItemId}\n aria-describedby={!error ? `${formDescriptionId}` : `${formDescriptionId} ${formMessageId}`}\n aria-invalid={!!error}\n {...props}\n />\n )\n}\n\nfunction FormDescription({ className, ...props }: React.ComponentProps<'p'>) {\n const { formDescriptionId } = useFormField()\n\n return <p data-slot=\"form-description\" id={formDescriptionId} className={cn('text-text-positive-weak text-sm', className)} {...props} />\n}\n\nfunction FormMessage({ className, children, ...props }: React.ComponentProps<'p'>) {\n const { error, formMessageId } = useFormField()\n\n return (\n <span data-slot=\"form-message\" id={formMessageId} className={cn('text-danger text-xs', className)} {...props}>\n {error ? String(error?.message ?? '') : children}\n </span>\n )\n}\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, useFormField }\n"],"mappings":"6SAQA,MAAM,EAAO,EAMP,EAAmB,EAAM,cAAqC,IAE9D,GAA8H,CAClI,GAAG,KAGD,EAAC,EAAiB,SAAA,CAAS,MAAO,CAAE,KAAM,EAAM,eAC9C,EAAC,EAAA,CAAW,GAAI,MAKhB,MAAqB,CACzB,IAAM,EAAe,EAAM,WAAW,GAChC,EAAc,EAAM,WAAW,GAC/B,CAAE,gBAAe,UAAS,cAAe,IACzC,EAAY,EAAa,CAAE,KAAM,EAAa,OAC9C,EAAa,EAAc,EAAa,KAAM,GAEpD,GAAI,CAAC,EACH,MAAU,MAAM,kDAGlB,GAAM,CAAE,MAAO,EAEf,MAAO,CACL,KACA,UACA,aACA,KAAM,EAAa,KACnB,WAAY,GAAG,EAAG,YAClB,kBAAmB,GAAG,EAAG,wBACzB,cAAe,GAAG,EAAG,oBACrB,GAAG,IAQD,EAAkB,EAAM,cAAoC,IAElE,SAAS,EAAS,CAAE,YAAW,GAAG,GAAsC,CACtE,IAAM,EAAK,EAAM,QAEjB,OACE,EAAC,EAAgB,SAAA,CAAS,MAAO,CAAE,eACjC,EAAC,MAAA,CAAI,YAAU,YAAY,UAAW,EAAG,aAAc,GAAY,GAAI,MAK7E,SAAS,EAAU,CAAE,YAAW,GAAG,GAA2D,CAC5F,GAAM,CAAE,cAAe,IACvB,OAAO,EAACA,EAAAA,CAAM,YAAU,aAAa,UAAW,EAAG,UAAW,GAAY,QAAS,EAAY,GAAI,IAGrG,SAAS,EAAY,CAAE,GAAG,GAA0D,CAClF,GAAM,CAAE,QAAO,aAAY,oBAAmB,iBAAkB,IAEhE,OACE,EAACC,EAAc,KAAA,CACb,YAAU,eACV,GAAI,EACJ,mBAAmB,EAAiC,GAAG,EAAkB,GAAG,IAAjD,GAAG,IAC9B,eAAc,CAAC,CAAC,EAChB,GAAI,IAKV,SAAS,EAAgB,CAAE,YAAW,GAAG,GAAoC,CAC3E,GAAM,CAAE,qBAAsB,IAE9B,OAAO,EAAC,IAAA,CAAE,YAAU,mBAAmB,GAAI,EAAmB,UAAW,EAAG,kCAAmC,GAAY,GAAI,IAGjI,SAAS,EAAY,CAAE,YAAW,WAAU,GAAG,GAAoC,CACjF,GAAM,CAAE,QAAO,iBAAkB,IAEjC,OACE,EAAC,OAAA,CAAK,YAAU,eAAe,GAAI,EAAe,UAAW,EAAG,sBAAuB,GAAY,GAAI,WACpG,EAAQ,OAAO,GAAO,SAAW,IAAM"}
|
package/dist/form-CXu8t0VS.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require(`./chunk-CUT6urMc.cjs`),t=require(`./label-3eYQRRYp.cjs`),n=e.__toESM(require(`react`)),r=e.__toESM(require(`@customafk/react-toolkit/utils`)),i=e.__toESM(require(`react/jsx-runtime`)),a=e.__toESM(require(`radix-ui`)),o=e.__toESM(require(`react-hook-form`)),s=o.FormProvider,c=n.default.createContext({}),l=({...e})=>(0,i.jsx)(c.Provider,{value:{name:e.name},children:(0,i.jsx)(o.Controller,{...e})}),u=()=>{let e=n.default.useContext(c),t=n.default.useContext(d),{getFieldState:r,control:i,resetField:a}=(0,o.useFormContext)(),s=(0,o.useFormState)({name:e.name}),l=r(e.name,s);if(!e)throw Error(`useFormField should be used within <FormField>`);let{id:u}=t;return{id:u,control:i,resetField:a,name:e.name,formItemId:`${u}-form-item`,formDescriptionId:`${u}-form-item-description`,formMessageId:`${u}-form-item-message`,...l}},d=n.default.createContext({});function f({className:e,...t}){let a=n.default.useId();return(0,i.jsx)(d.Provider,{value:{id:a},children:(0,i.jsx)(`div`,{"data-slot":`form-item`,className:(0,r.cn)(`grid gap-1`,e),...t})})}function p({className:e,...n}){let{formItemId:a}=u();return(0,i.jsx)(t.Label,{"data-slot":`form-label`,className:(0,r.cn)(`text-xs`,e),htmlFor:a,...n})}function m({...e}){let{error:t,formItemId:n,formDescriptionId:r,formMessageId:o}=u();return(0,i.jsx)(a.Slot.Slot,{"data-slot":`form-control`,id:n,"aria-describedby":t?`${r} ${o}`:`${r}`,"aria-invalid":!!t,...e})}function h({className:e,...t}){let{formDescriptionId:n}=u();return(0,i.jsx)(`p`,{"data-slot":`form-description`,id:n,className:(0,r.cn)(`text-text-positive-weak text-sm`,e),...t})}function g({className:e,children:t,...n}){let{error:a,formMessageId:o}=u();return(0,i.jsx)(`span`,{"data-slot":`form-message`,id:o,className:(0,r.cn)(`text-danger text-xs`,e),...n,children:a?String(a?.message??``):t})}Object.defineProperty(exports,`Form`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`FormControl`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`FormDescription`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`FormField`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`FormItem`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`FormLabel`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`FormMessage`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`useFormField`,{enumerable:!0,get:function(){return u}});
|
|
2
|
-
//# sourceMappingURL=form-CXu8t0VS.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"form-CXu8t0VS.cjs","names":["FormProvider","React","Controller","Label","SlotPrimitive"],"sources":["../packages/components/ui/form.tsx"],"sourcesContent":["'use client'\nimport React from 'react'\nimport { Controller, type ControllerProps, type FieldPath, type FieldValues, FormProvider, useFormContext, useFormState } from 'react-hook-form'\nimport { Label as LabelPrimitive, Slot as SlotPrimitive } from 'radix-ui'\n\nimport { Label } from '@/components/ui/label'\nimport { cn } from '@customafk/react-toolkit/utils'\n\nconst Form = FormProvider\n\ntype FormFieldContextValue<TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>> = {\n name: TName\n}\n\nconst FormFieldContext = React.createContext<FormFieldContextValue>({} as FormFieldContextValue)\n\nconst FormField = <TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>>({\n ...props\n}: ControllerProps<TFieldValues, TName>) => {\n return (\n <FormFieldContext.Provider value={{ name: props.name }}>\n <Controller {...props} />\n </FormFieldContext.Provider>\n )\n}\n\nconst useFormField = () => {\n const fieldContext = React.useContext(FormFieldContext)\n const itemContext = React.useContext(FormItemContext)\n const { getFieldState, control, resetField } = useFormContext()\n const formState = useFormState({ name: fieldContext.name })\n const fieldState = getFieldState(fieldContext.name, formState)\n\n if (!fieldContext) {\n throw new Error('useFormField should be used within <FormField>')\n }\n\n const { id } = itemContext\n\n return {\n id,\n control,\n resetField,\n name: fieldContext.name,\n formItemId: `${id}-form-item`,\n formDescriptionId: `${id}-form-item-description`,\n formMessageId: `${id}-form-item-message`,\n ...fieldState,\n }\n}\n\ntype FormItemContextValue = {\n id: string\n}\n\nconst FormItemContext = React.createContext<FormItemContextValue>({} as FormItemContextValue)\n\nfunction FormItem({ className, ...props }: React.ComponentProps<'div'>) {\n const id = React.useId()\n\n return (\n <FormItemContext.Provider value={{ id }}>\n <div data-slot=\"form-item\" className={cn('grid gap-1', className)} {...props} />\n </FormItemContext.Provider>\n )\n}\n\nfunction FormLabel({ className, ...props }: React.ComponentProps<typeof LabelPrimitive.Root>) {\n const { formItemId } = useFormField()\n return <Label data-slot=\"form-label\" className={cn('text-xs', className)} htmlFor={formItemId} {...props} />\n}\n\nfunction FormControl({ ...props }: React.ComponentProps<typeof SlotPrimitive.Slot>) {\n const { error, formItemId, formDescriptionId, formMessageId } = useFormField()\n\n return (\n <SlotPrimitive.Slot\n data-slot=\"form-control\"\n id={formItemId}\n aria-describedby={!error ? `${formDescriptionId}` : `${formDescriptionId} ${formMessageId}`}\n aria-invalid={!!error}\n {...props}\n />\n )\n}\n\nfunction FormDescription({ className, ...props }: React.ComponentProps<'p'>) {\n const { formDescriptionId } = useFormField()\n\n return <p data-slot=\"form-description\" id={formDescriptionId} className={cn('text-text-positive-weak text-sm', className)} {...props} />\n}\n\nfunction FormMessage({ className, children, ...props }: React.ComponentProps<'p'>) {\n const { error, formMessageId } = useFormField()\n\n return (\n <span data-slot=\"form-message\" id={formMessageId} className={cn('text-danger text-xs', className)} {...props}>\n {error ? String(error?.message ?? '') : children}\n </span>\n )\n}\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, useFormField }\n"],"mappings":"kRAQM,EAAOA,EAAAA,aAMP,EAAmBC,EAAAA,QAAM,cAAqC,IAE9D,GAA8H,CAClI,GAAG,MAGD,EAAA,EAAA,KAAC,EAAiB,SAAA,CAAS,MAAO,CAAE,KAAM,EAAM,gBAC9C,EAAA,EAAA,KAACC,EAAAA,WAAAA,CAAW,GAAI,MAKhB,MAAqB,CACzB,IAAM,EAAeD,EAAAA,QAAM,WAAW,GAChC,EAAcA,EAAAA,QAAM,WAAW,GAC/B,CAAE,gBAAe,UAAS,eAAA,EAAA,EAAA,kBAC1B,GAAA,EAAA,EAAA,cAAyB,CAAE,KAAM,EAAa,OAC9C,EAAa,EAAc,EAAa,KAAM,GAEpD,GAAI,CAAC,EACH,MAAU,MAAM,kDAGlB,GAAM,CAAE,MAAO,EAEf,MAAO,CACL,KACA,UACA,aACA,KAAM,EAAa,KACnB,WAAY,GAAG,EAAG,YAClB,kBAAmB,GAAG,EAAG,wBACzB,cAAe,GAAG,EAAG,oBACrB,GAAG,IAQD,EAAkBA,EAAAA,QAAM,cAAoC,IAElE,SAAS,EAAS,CAAE,YAAW,GAAG,GAAsC,CACtE,IAAM,EAAKA,EAAAA,QAAM,QAEjB,OACE,EAAA,EAAA,KAAC,EAAgB,SAAA,CAAS,MAAO,CAAE,gBACjC,EAAA,EAAA,KAAC,MAAA,CAAI,YAAU,YAAY,WAAA,EAAA,EAAA,IAAc,aAAc,GAAY,GAAI,MAK7E,SAAS,EAAU,CAAE,YAAW,GAAG,GAA2D,CAC5F,GAAM,CAAE,cAAe,IACvB,OAAO,EAAA,EAAA,KAACE,EAAAA,MAAAA,CAAM,YAAU,aAAa,WAAA,EAAA,EAAA,IAAc,UAAW,GAAY,QAAS,EAAY,GAAI,IAGrG,SAAS,EAAY,CAAE,GAAG,GAA0D,CAClF,GAAM,CAAE,QAAO,aAAY,oBAAmB,iBAAkB,IAEhE,OACE,EAAA,EAAA,KAACC,EAAAA,KAAc,KAAA,CACb,YAAU,eACV,GAAI,EACJ,mBAAmB,EAAiC,GAAG,EAAkB,GAAG,IAAjD,GAAG,IAC9B,eAAc,CAAC,CAAC,EAChB,GAAI,IAKV,SAAS,EAAgB,CAAE,YAAW,GAAG,GAAoC,CAC3E,GAAM,CAAE,qBAAsB,IAE9B,OAAO,EAAA,EAAA,KAAC,IAAA,CAAE,YAAU,mBAAmB,GAAI,EAAmB,WAAA,EAAA,EAAA,IAAc,kCAAmC,GAAY,GAAI,IAGjI,SAAS,EAAY,CAAE,YAAW,WAAU,GAAG,GAAoC,CACjF,GAAM,CAAE,QAAO,iBAAkB,IAEjC,OACE,EAAA,EAAA,KAAC,OAAA,CAAK,YAAU,eAAe,GAAI,EAAe,WAAA,EAAA,EAAA,IAAc,sBAAuB,GAAY,GAAI,WACpG,EAAQ,OAAO,GAAO,SAAW,IAAM"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require(`./chunk-CUT6urMc.cjs`),t=require(`./error-dialog-DvTlwpSn.cjs`),n=require(`./form-CXu8t0VS.cjs`),r=e.__toESM(require(`react`)),i=e.__toESM(require(`react/jsx-runtime`)),a=e.__toESM(require(`lucide-react`)),o=e.__toESM(require(`react-hook-form`)),s=e.__toESM(require(`@hookform/error-message`)),c=({form:e,isResetAfterSubmit:c=!0,className:l,onSubmit:u,onError:d,onSubcribe:f,children:p})=>{let m=(0,o.useForm)({...e,criteriaMode:`all`}),{formState:h,reset:g,handleSubmit:_,subscribe:v}=m,{dirtyFields:y}=h,[b,x]=r.default.useState(!1),S=r.default.useCallback(e=>{u(e,h,y),c&&g()},[y,h,c,u,g]),C=r.default.useCallback(e=>{let t=Object.keys(e);t.length!==0&&(d?.(e),x(!0))},[d]);return r.default.useEffect(()=>{if(!f)return;let e=v({formState:{values:!0},callback:({values:e})=>{f(e)}});return()=>e()},[f,v]),(0,i.jsxs)(n.Form,{...m,children:[(0,i.jsx)(`form`,{className:l,onSubmit:_(S,C),children:p}),(0,i.jsx)(t.ErrorDialog,{open:b,title:`Lỗi nhập dữ liệu`,description:`An unexpected error has occurred. Please check the errors below and try again.`,onOpenChange:x,children:b&&(0,i.jsx)(i.Fragment,{children:Object.keys(h.errors).length>0?(0,i.jsxs)(`div`,{className:`flex max-w-100 flex-col gap-2 px-4`,children:[(0,i.jsx)(`p`,{className:`text-muted-foreground text-sm font-semibold`,children:`Cảnh báo: Vui lòng kiểm tra các lỗi sau:`}),(0,i.jsx)(`div`,{className:`flex flex-col space-y-1`,children:Object.entries(h.errors).map(([e])=>(0,i.jsx)(s.ErrorMessage,{errors:h.errors,name:e,render:({messages:e})=>(0,i.jsx)(i.Fragment,{children:e?Object.entries(e).map(([e,t])=>(0,i.jsxs)(`div`,{className:`text-accent-foreground flex items-start gap-x-1 truncate text-sm font-normal`,children:[(0,i.jsx)(a.AlertCircleIcon,{size:16,className:`text-destructive mt-0.5 min-w-4 flex-0`}),(0,i.jsx)(`p`,{className:`line-clamp-2 flex-1 text-wrap`,children:t})]},e)):null})},e))})]}):(0,i.jsx)(`p`,{className:`text-muted-foreground text-sm`,children:`No errors found.`})})})]})};Object.defineProperty(exports,`FormWrapper`,{enumerable:!0,get:function(){return c}});
|
|
2
|
-
//# sourceMappingURL=form-wrapper-CZKtb1j5.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"form-wrapper-CZKtb1j5.cjs","names":["React","Form","ErrorDialog","ErrorMessage","AlertCircleIcon"],"sources":["../packages/components/forms/form-wrapper.tsx"],"sourcesContent":["import React from 'react'\nimport { type FieldValues, type FormState, type SubmitErrorHandler, type SubmitHandler, useForm, type UseFormProps } from 'react-hook-form'\nimport { AlertCircleIcon } from 'lucide-react'\n\nimport type { AnyEntity } from '@/types'\nimport { ErrorMessage } from '@hookform/error-message'\n\nimport { ErrorDialog } from '../dialogs/error-dialog'\nimport { Form } from '../ui/form'\n\ntype Props<TFieldValues extends FieldValues = FieldValues> = {\n form: UseFormProps<TFieldValues>\n isResetAfterSubmit?: boolean\n className?: string\n onSubmit: (data: TFieldValues, formState: FormState<FieldValues>, dirtyFields: FormState<FieldValues>['dirtyFields']) => void | Promise<void>\n onError?: SubmitErrorHandler<TFieldValues>\n onSubcribe?: (values: TFieldValues) => void\n}\n\nexport const FormWrapper = <TFieldValues extends FieldValues = FieldValues>({\n form: FormConfig,\n isResetAfterSubmit = true,\n className,\n onSubmit,\n onError,\n onSubcribe,\n children,\n}: React.PropsWithChildren<Props<TFieldValues>>) => {\n const form = useForm({\n ...FormConfig,\n criteriaMode: 'all',\n })\n\n const { formState, reset, handleSubmit, subscribe } = form\n const { dirtyFields } = formState\n\n const [errorOpen, setErrorOpen] = React.useState<boolean>(false)\n\n const handleFormSubmit = React.useCallback<SubmitHandler<TFieldValues>>(\n (data) => {\n onSubmit(data, formState, dirtyFields)\n if (isResetAfterSubmit) {\n reset()\n }\n },\n [dirtyFields, formState, isResetAfterSubmit, onSubmit, reset],\n )\n\n const handleFormError = React.useCallback<SubmitErrorHandler<TFieldValues>>(\n (errors) => {\n const errorKeys = Object.keys(errors)\n if (errorKeys.length === 0) return\n onError?.(errors)\n setErrorOpen(true)\n },\n [onError],\n )\n\n React.useEffect(() => {\n if (!onSubcribe) return\n const callback = subscribe({\n formState: { values: true },\n callback: ({ values }) => {\n onSubcribe(values)\n },\n })\n return () => callback()\n }, [onSubcribe, subscribe])\n\n return (\n <Form {...form}>\n <form className={className} onSubmit={handleSubmit(handleFormSubmit, handleFormError)}>\n {children}\n </form>\n <ErrorDialog\n open={errorOpen}\n title=\"Lỗi nhập dữ liệu\"\n description=\"An unexpected error has occurred. Please check the errors below and try again.\"\n onOpenChange={setErrorOpen}\n >\n {errorOpen && (\n <>\n {Object.keys(formState.errors).length > 0 ? (\n <div className=\"flex max-w-100 flex-col gap-2 px-4\">\n <p className=\"text-muted-foreground text-sm font-semibold\">Cảnh báo: Vui lòng kiểm tra các lỗi sau:</p>\n <div className=\"flex flex-col space-y-1\">\n {Object.entries(formState.errors).map(([key]) => (\n <ErrorMessage\n key={key}\n errors={formState.errors}\n name={key as AnyEntity}\n render={({ messages }) => {\n return (\n <>\n {messages\n ? Object.entries(messages).map(([type, message]) => {\n return (\n <div key={type} className=\"text-accent-foreground flex items-start gap-x-1 truncate text-sm font-normal\">\n <AlertCircleIcon size={16} className=\"text-destructive mt-0.5 min-w-4 flex-0\" />\n <p className=\"line-clamp-2 flex-1 text-wrap\">{message}</p>\n </div>\n )\n })\n : null}\n </>\n )\n }}\n />\n ))}\n </div>\n </div>\n ) : (\n <p className=\"text-muted-foreground text-sm\">No errors found.</p>\n )}\n </>\n )}\n </ErrorDialog>\n </Form>\n )\n}\n"],"mappings":"uTAmBa,GAA+D,CAC1E,KAAM,EACN,qBAAqB,GACrB,YACA,WACA,UACA,aACA,cACkD,CAClD,IAAM,GAAA,EAAA,EAAA,SAAe,CACnB,GAAG,EACH,aAAc,QAGV,CAAE,YAAW,QAAO,eAAc,aAAc,EAChD,CAAE,eAAgB,EAElB,CAAC,EAAW,GAAgBA,EAAAA,QAAM,SAAkB,IAEpD,EAAmBA,EAAAA,QAAM,YAC5B,GAAS,CACR,EAAS,EAAM,EAAW,GACtB,GACF,KAGJ,CAAC,EAAa,EAAW,EAAoB,EAAU,IAGnD,EAAkBA,EAAAA,QAAM,YAC3B,GAAW,CACV,IAAM,EAAY,OAAO,KAAK,GAC1B,EAAU,SAAW,IACzB,IAAU,GACV,EAAa,MAEf,CAAC,IAcH,OAXA,EAAA,QAAM,cAAgB,CACpB,GAAI,CAAC,EAAY,OACjB,IAAM,EAAW,EAAU,CACzB,UAAW,CAAE,OAAQ,IACrB,UAAW,CAAE,YAAa,CACxB,EAAW,MAGf,UAAa,KACZ,CAAC,EAAY,KAGd,EAAA,EAAA,MAACC,EAAAA,KAAAA,CAAK,GAAI,aACR,EAAA,EAAA,KAAC,OAAA,CAAgB,YAAW,SAAU,EAAa,EAAkB,GAClE,cAEH,EAAA,EAAA,KAACC,EAAAA,YAAAA,CACC,KAAM,EACN,MAAM,mBACN,YAAY,iFACZ,aAAc,WAEb,IACC,EAAA,EAAA,KAAA,EAAA,SAAA,CAAA,SACG,OAAO,KAAK,EAAU,QAAQ,OAAS,GACtC,EAAA,EAAA,MAAC,MAAA,CAAI,UAAU,gDACb,EAAA,EAAA,KAAC,IAAA,CAAE,UAAU,uDAA8C,8CAC3D,EAAA,EAAA,KAAC,MAAA,CAAI,UAAU,mCACZ,OAAO,QAAQ,EAAU,QAAQ,KAAK,CAAC,MACtC,EAAA,EAAA,KAACC,EAAAA,aAAAA,CAEC,OAAQ,EAAU,OAClB,KAAM,EACN,QAAS,CAAE,eAEP,EAAA,EAAA,KAAA,EAAA,SAAA,CAAA,SACG,EACG,OAAO,QAAQ,GAAU,KAAK,CAAC,EAAM,MAEjC,EAAA,EAAA,MAAC,MAAA,CAAe,UAAU,0FACxB,EAAA,EAAA,KAACC,EAAAA,gBAAAA,CAAgB,KAAM,GAAI,UAAU,4CACrC,EAAA,EAAA,KAAC,IAAA,CAAE,UAAU,yCAAiC,MAFtC,IAMd,QAfL,UAwBb,EAAA,EAAA,KAAC,IAAA,CAAE,UAAU,yCAAgC"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{ErrorDialog as e}from"./error-dialog-e9mFaOuG.js";import{Form as t}from"./form-BzvxUv0a.js";import n from"react";import{Fragment as r,jsx as i,jsxs as a}from"react/jsx-runtime";import{AlertCircleIcon as o}from"lucide-react";import{useForm as s}from"react-hook-form";import{ErrorMessage as c}from"@hookform/error-message";const l=({form:l,isResetAfterSubmit:u=!0,className:d,onSubmit:f,onError:p,onSubcribe:m,children:h})=>{let g=s({...l,criteriaMode:`all`}),{formState:_,reset:v,handleSubmit:y,subscribe:b}=g,{dirtyFields:x}=_,[S,C]=n.useState(!1),w=n.useCallback(e=>{f(e,_,x),u&&v()},[x,_,u,f,v]),T=n.useCallback(e=>{let t=Object.keys(e);t.length!==0&&(p?.(e),C(!0))},[p]);return n.useEffect(()=>{if(!m)return;let e=b({formState:{values:!0},callback:({values:e})=>{m(e)}});return()=>e()},[m,b]),a(t,{...g,children:[i(`form`,{className:d,onSubmit:y(w,T),children:h}),i(e,{open:S,title:`Lỗi nhập dữ liệu`,description:`An unexpected error has occurred. Please check the errors below and try again.`,onOpenChange:C,children:S&&i(r,{children:Object.keys(_.errors).length>0?a(`div`,{className:`flex max-w-100 flex-col gap-2 px-4`,children:[i(`p`,{className:`text-muted-foreground text-sm font-semibold`,children:`Cảnh báo: Vui lòng kiểm tra các lỗi sau:`}),i(`div`,{className:`flex flex-col space-y-1`,children:Object.entries(_.errors).map(([e])=>i(c,{errors:_.errors,name:e,render:({messages:e})=>i(r,{children:e?Object.entries(e).map(([e,t])=>a(`div`,{className:`text-accent-foreground flex items-start gap-x-1 truncate text-sm font-normal`,children:[i(o,{size:16,className:`text-destructive mt-0.5 min-w-4 flex-0`}),i(`p`,{className:`line-clamp-2 flex-1 text-wrap`,children:t})]},e)):null})},e))})]}):i(`p`,{className:`text-muted-foreground text-sm`,children:`No errors found.`})})})]})};export{l as FormWrapper};
|
|
2
|
-
//# sourceMappingURL=form-wrapper-Cks4xmCV.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"form-wrapper-Cks4xmCV.js","names":[],"sources":["../packages/components/forms/form-wrapper.tsx"],"sourcesContent":["import React from 'react'\nimport { type FieldValues, type FormState, type SubmitErrorHandler, type SubmitHandler, useForm, type UseFormProps } from 'react-hook-form'\nimport { AlertCircleIcon } from 'lucide-react'\n\nimport type { AnyEntity } from '@/types'\nimport { ErrorMessage } from '@hookform/error-message'\n\nimport { ErrorDialog } from '../dialogs/error-dialog'\nimport { Form } from '../ui/form'\n\ntype Props<TFieldValues extends FieldValues = FieldValues> = {\n form: UseFormProps<TFieldValues>\n isResetAfterSubmit?: boolean\n className?: string\n onSubmit: (data: TFieldValues, formState: FormState<FieldValues>, dirtyFields: FormState<FieldValues>['dirtyFields']) => void | Promise<void>\n onError?: SubmitErrorHandler<TFieldValues>\n onSubcribe?: (values: TFieldValues) => void\n}\n\nexport const FormWrapper = <TFieldValues extends FieldValues = FieldValues>({\n form: FormConfig,\n isResetAfterSubmit = true,\n className,\n onSubmit,\n onError,\n onSubcribe,\n children,\n}: React.PropsWithChildren<Props<TFieldValues>>) => {\n const form = useForm({\n ...FormConfig,\n criteriaMode: 'all',\n })\n\n const { formState, reset, handleSubmit, subscribe } = form\n const { dirtyFields } = formState\n\n const [errorOpen, setErrorOpen] = React.useState<boolean>(false)\n\n const handleFormSubmit = React.useCallback<SubmitHandler<TFieldValues>>(\n (data) => {\n onSubmit(data, formState, dirtyFields)\n if (isResetAfterSubmit) {\n reset()\n }\n },\n [dirtyFields, formState, isResetAfterSubmit, onSubmit, reset],\n )\n\n const handleFormError = React.useCallback<SubmitErrorHandler<TFieldValues>>(\n (errors) => {\n const errorKeys = Object.keys(errors)\n if (errorKeys.length === 0) return\n onError?.(errors)\n setErrorOpen(true)\n },\n [onError],\n )\n\n React.useEffect(() => {\n if (!onSubcribe) return\n const callback = subscribe({\n formState: { values: true },\n callback: ({ values }) => {\n onSubcribe(values)\n },\n })\n return () => callback()\n }, [onSubcribe, subscribe])\n\n return (\n <Form {...form}>\n <form className={className} onSubmit={handleSubmit(handleFormSubmit, handleFormError)}>\n {children}\n </form>\n <ErrorDialog\n open={errorOpen}\n title=\"Lỗi nhập dữ liệu\"\n description=\"An unexpected error has occurred. Please check the errors below and try again.\"\n onOpenChange={setErrorOpen}\n >\n {errorOpen && (\n <>\n {Object.keys(formState.errors).length > 0 ? (\n <div className=\"flex max-w-100 flex-col gap-2 px-4\">\n <p className=\"text-muted-foreground text-sm font-semibold\">Cảnh báo: Vui lòng kiểm tra các lỗi sau:</p>\n <div className=\"flex flex-col space-y-1\">\n {Object.entries(formState.errors).map(([key]) => (\n <ErrorMessage\n key={key}\n errors={formState.errors}\n name={key as AnyEntity}\n render={({ messages }) => {\n return (\n <>\n {messages\n ? Object.entries(messages).map(([type, message]) => {\n return (\n <div key={type} className=\"text-accent-foreground flex items-start gap-x-1 truncate text-sm font-normal\">\n <AlertCircleIcon size={16} className=\"text-destructive mt-0.5 min-w-4 flex-0\" />\n <p className=\"line-clamp-2 flex-1 text-wrap\">{message}</p>\n </div>\n )\n })\n : null}\n </>\n )\n }}\n />\n ))}\n </div>\n </div>\n ) : (\n <p className=\"text-muted-foreground text-sm\">No errors found.</p>\n )}\n </>\n )}\n </ErrorDialog>\n </Form>\n )\n}\n"],"mappings":"wUAmBA,MAAa,GAA+D,CAC1E,KAAM,EACN,qBAAqB,GACrB,YACA,WACA,UACA,aACA,cACkD,CAClD,IAAM,EAAO,EAAQ,CACnB,GAAG,EACH,aAAc,QAGV,CAAE,YAAW,QAAO,eAAc,aAAc,EAChD,CAAE,eAAgB,EAElB,CAAC,EAAW,GAAgB,EAAM,SAAkB,IAEpD,EAAmB,EAAM,YAC5B,GAAS,CACR,EAAS,EAAM,EAAW,GACtB,GACF,KAGJ,CAAC,EAAa,EAAW,EAAoB,EAAU,IAGnD,EAAkB,EAAM,YAC3B,GAAW,CACV,IAAM,EAAY,OAAO,KAAK,GAC1B,EAAU,SAAW,IACzB,IAAU,GACV,EAAa,MAEf,CAAC,IAcH,OAXA,EAAM,cAAgB,CACpB,GAAI,CAAC,EAAY,OACjB,IAAM,EAAW,EAAU,CACzB,UAAW,CAAE,OAAQ,IACrB,UAAW,CAAE,YAAa,CACxB,EAAW,MAGf,UAAa,KACZ,CAAC,EAAY,IAGd,EAAC,EAAA,CAAK,GAAI,YACR,EAAC,OAAA,CAAgB,YAAW,SAAU,EAAa,EAAkB,GAClE,aAEH,EAAC,EAAA,CACC,KAAM,EACN,MAAM,mBACN,YAAY,iFACZ,aAAc,WAEb,GACC,EAAA,EAAA,CAAA,SACG,OAAO,KAAK,EAAU,QAAQ,OAAS,EACtC,EAAC,MAAA,CAAI,UAAU,+CACb,EAAC,IAAA,CAAE,UAAU,uDAA8C,6CAC3D,EAAC,MAAA,CAAI,UAAU,mCACZ,OAAO,QAAQ,EAAU,QAAQ,KAAK,CAAC,KACtC,EAAC,EAAA,CAEC,OAAQ,EAAU,OAClB,KAAM,EACN,QAAS,CAAE,cAEP,EAAA,EAAA,CAAA,SACG,EACG,OAAO,QAAQ,GAAU,KAAK,CAAC,EAAM,KAEjC,EAAC,MAAA,CAAe,UAAU,yFACxB,EAAC,EAAA,CAAgB,KAAM,GAAI,UAAU,2CACrC,EAAC,IAAA,CAAE,UAAU,yCAAiC,MAFtC,IAMd,QAfL,SAwBb,EAAC,IAAA,CAAE,UAAU,yCAAgC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"input-B8bT3wuo.cjs","names":["React"],"sources":["../packages/components/ui/input.tsx"],"sourcesContent":["'use client'\nimport React from 'react'\n\nimport { cn } from '@customafk/react-toolkit/utils'\n\nfunction Input({\n className,\n onChange,\n onValueChange,\n ...props\n}: React.ComponentProps<'input'> & {\n onValueChange?: (value: string) => void\n}) {\n const handleChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange?.(e)\n onValueChange?.(e.target.value)\n },\n [onChange, onValueChange],\n )\n return (\n <input\n data-slot=\"input\"\n className={cn(\n 'flex h-9 w-full px-3 py-1',\n 'border-border-weak shadow-input rounded-md border',\n 'caret-primary bg-transparent text-sm',\n 'transition-[color,border,box-shadow] outline-none',\n 'placeholder:text-text-positive-muted',\n 'hover:border-border',\n 'disabled:pointer-events-none',\n 'disabled:cursor-not-allowed',\n 'disabled:opacity-50',\n 'focus-visible:ring-4',\n 'focus-visible:ring-primary-weak',\n 'focus-visible:border-primary-strong',\n 'aria-invalid:ring-danger-muted',\n 'aria-invalid:border-danger',\n className,\n )}\n {...props}\n onChange={handleChange}\n />\n )\n}\n\nexport { Input }\n"],"mappings":"uKAKA,SAAS,EAAM,CACb,YACA,WACA,gBACA,GAAG,GAGF,CACD,IAAM,EAAeA,EAAAA,QAAM,YACxB,GAA2C,CAC1C,IAAW,GACX,IAAgB,EAAE,OAAO,QAE3B,CAAC,EAAU,IAEb,OACE,EAAA,EAAA,KAAC,QAAA,CACC,YAAU,QACV,WAAA,EAAA,EAAA,IACE,4BACA,oDACA,uCACA,oDACA,uCACA,sBACA,+BACA,8BACA,sBACA,uBACA,kCACA,sCACA,iCACA,6BACA,GAEF,GAAI,EACJ,SAAU"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"input-OWyLq45f.js","names":[],"sources":["../packages/components/ui/input.tsx"],"sourcesContent":["'use client'\nimport React from 'react'\n\nimport { cn } from '@customafk/react-toolkit/utils'\n\nfunction Input({\n className,\n onChange,\n onValueChange,\n ...props\n}: React.ComponentProps<'input'> & {\n onValueChange?: (value: string) => void\n}) {\n const handleChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange?.(e)\n onValueChange?.(e.target.value)\n },\n [onChange, onValueChange],\n )\n return (\n <input\n data-slot=\"input\"\n className={cn(\n 'flex h-9 w-full px-3 py-1',\n 'border-border-weak shadow-input rounded-md border',\n 'caret-primary bg-transparent text-sm',\n 'transition-[color,border,box-shadow] outline-none',\n 'placeholder:text-text-positive-muted',\n 'hover:border-border',\n 'disabled:pointer-events-none',\n 'disabled:cursor-not-allowed',\n 'disabled:opacity-50',\n 'focus-visible:ring-4',\n 'focus-visible:ring-primary-weak',\n 'focus-visible:border-primary-strong',\n 'aria-invalid:ring-danger-muted',\n 'aria-invalid:border-danger',\n className,\n )}\n {...props}\n onChange={handleChange}\n />\n )\n}\n\nexport { Input }\n"],"mappings":"iHAKA,SAAS,EAAM,CACb,YACA,WACA,gBACA,GAAG,GAGF,CACD,IAAM,EAAe,EAAM,YACxB,GAA2C,CAC1C,IAAW,GACX,IAAgB,EAAE,OAAO,QAE3B,CAAC,EAAU,IAEb,OACE,EAAC,QAAA,CACC,YAAU,QACV,UAAW,EACT,4BACA,oDACA,uCACA,oDACA,uCACA,sBACA,+BACA,8BACA,sBACA,uBACA,kCACA,sCACA,iCACA,6BACA,GAEF,GAAI,EACJ,SAAU"}
|
package/dist/label-3eYQRRYp.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require(`./chunk-CUT6urMc.cjs`),t=e.__toESM(require(`react`)),n=e.__toESM(require(`@customafk/react-toolkit/utils`)),r=e.__toESM(require(`react/jsx-runtime`)),i=e.__toESM(require(`radix-ui`));function a({className:e,...t}){return(0,r.jsx)(i.Label.Root,{"data-slot":`label`,className:(0,n.cn)(`text-text-positive`,`flex items-center gap-2`,`text-sm leading-none font-medium select-none`,`group-data-[disabled=true]:pointer-events-none`,`group-data-[disabled=true]:opacity-50`,`peer-disabled:cursor-not-allowed`,`peer-disabled:opacity-50`,e),...t})}Object.defineProperty(exports,`Label`,{enumerable:!0,get:function(){return a}});
|
|
2
|
-
//# sourceMappingURL=label-3eYQRRYp.cjs.map
|
package/dist/label-BQ52Pjw-.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import e from"react";import{cn as t}from"@customafk/react-toolkit/utils";import{jsx as n}from"react/jsx-runtime";import{Label as r}from"radix-ui";function i({className:e,...i}){return n(r.Root,{"data-slot":`label`,className:t(`text-text-positive`,`flex items-center gap-2`,`text-sm leading-none font-medium select-none`,`group-data-[disabled=true]:pointer-events-none`,`group-data-[disabled=true]:opacity-50`,`peer-disabled:cursor-not-allowed`,`peer-disabled:opacity-50`,e),...i})}export{i as Label};
|
|
2
|
-
//# sourceMappingURL=label-BQ52Pjw-.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require(`../../chunk-CUT6urMc.cjs`);require(`../../tooltip-DRqQqSFW.cjs`);const t=require(`../../button-ChpGfVjG.cjs`);require(`../../input-B8bT3wuo.cjs`),require(`../../separator-CECnaAdc.cjs`),require(`../../sheet-CvstHEA7.cjs`),require(`../../skeleton-DcRggqJa.cjs`);const n=require(`../../sidebar-Dzl9-lVV.cjs`),r=e.__toESM(require(`@customafk/react-toolkit/utils`)),i=e.__toESM(require(`react/jsx-runtime`)),a=e.__toESM(require(`lucide-react`)),o=({children:e})=>(0,i.jsx)(n.SidebarProvider,{className:`w-svw`,children:e}),s=({children:e})=>(0,i.jsx)(n.SidebarInset,{children:(0,i.jsx)(`section`,{className:`relative size-full`,children:(0,i.jsx)(`div`,{className:`absolute inset-0`,children:e})})}),c=()=>(0,i.jsxs)(`header`,{className:(0,r.cn)(`bg-card`,`h-(--header-height)`,`absolute inset-x-0 top-0 z-20`,`flex items-center gap-2 border-b shadow-sm`,`transition-[width,height] ease-linear`,`group-has-data-[collapsible=icon]/sidebar-wrapper:h-(--header-height)`,`px-4`),children:[(0,i.jsx)(n.SidebarTrigger,{}),(0,i.jsxs)(`div`,{className:`ml-2.5 flex gap-x-2`,children:[(0,i.jsx)(`div`,{className:`bg-sidebar-primary text-sidebar-primary-foreground flex aspect-square size-8 items-center justify-center rounded-lg`,children:(0,i.jsx)(a.ShoppingCartIcon,{size:20})}),(0,i.jsxs)(`div`,{className:`grid flex-1 text-left text-sm leading-tight`,children:[(0,i.jsx)(`span`,{className:`truncate font-medium`,children:`Lunas Store`}),(0,i.jsx)(`span`,{className:`truncate text-xs`,children:`Established 2023`})]})]}),(0,i.jsxs)(`div`,{className:`flex flex-1 items-center justify-end`,children:[(0,i.jsx)(t.Button,{variant:`ghost`,size:`icon`,className:`text-muted-foreground rounded-full`,children:(0,i.jsx)(a.CircleQuestionMarkIcon,{})}),(0,i.jsx)(t.Button,{variant:`ghost`,size:`icon`,className:`text-muted-foreground rounded-full`,children:(0,i.jsx)(a.BellIcon,{})})]})]});exports.MainLayoutContent=s,exports.MainLayoutHeader=c,exports.MainLayoutWrapper=o;
|
|
2
|
-
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["SidebarProvider","SidebarInset","SidebarTrigger","ShoppingCartIcon","Button","CircleQuestionMarkIcon","BellIcon"],"sources":["../../../packages/components/layouts/main/wrapper.tsx","../../../packages/components/layouts/main/content.tsx","../../../packages/components/layouts/main/header.tsx"],"sourcesContent":["import { SidebarProvider } from '@/components/ui/sidebar'\n\nexport const MainLayoutWrapper = ({ children }: React.PropsWithChildren) => {\n return <SidebarProvider className=\"w-svw\">{children}</SidebarProvider>\n}\n","import { SidebarInset } from '@/components/ui/sidebar'\n\nexport const MainLayoutContent = ({ children }: React.PropsWithChildren) => {\n return (\n <SidebarInset>\n <section className=\"relative size-full\">\n <div className=\"absolute inset-0\">{children}</div>\n </section>\n </SidebarInset>\n )\n}\n","import { BellIcon, CircleQuestionMarkIcon, ShoppingCartIcon } from 'lucide-react'\n\nimport { Button } from '@/components/ui/button'\nimport { SidebarTrigger } from '@/components/ui/sidebar'\nimport { cn } from '@customafk/react-toolkit/utils'\n\nexport const MainLayoutHeader = () => {\n return (\n <header\n className={cn(\n 'bg-card',\n 'h-(--header-height)',\n 'absolute inset-x-0 top-0 z-20',\n 'flex items-center gap-2 border-b shadow-sm',\n 'transition-[width,height] ease-linear',\n 'group-has-data-[collapsible=icon]/sidebar-wrapper:h-(--header-height)',\n 'px-4',\n )}\n >\n <SidebarTrigger />\n\n <div className=\"ml-2.5 flex gap-x-2\">\n <div className=\"bg-sidebar-primary text-sidebar-primary-foreground flex aspect-square size-8 items-center justify-center rounded-lg\">\n <ShoppingCartIcon size={20} />\n </div>\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\n <span className=\"truncate font-medium\">Lunas Store</span>\n <span className=\"truncate text-xs\">Established 2023</span>\n </div>\n </div>\n <div className=\"flex flex-1 items-center justify-end\">\n <Button variant=\"ghost\" size=\"icon\" className=\"text-muted-foreground rounded-full\">\n <CircleQuestionMarkIcon />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"text-muted-foreground rounded-full\">\n <BellIcon />\n </Button>\n </div>\n </header>\n )\n}\n"],"mappings":"0cAEa,GAAqB,CAAE,eAC3B,EAAA,EAAA,KAACA,EAAAA,gBAAAA,CAAgB,UAAU,QAAS,aCDhC,GAAqB,CAAE,eAEhC,EAAA,EAAA,KAACC,EAAAA,aAAAA,CAAAA,UACC,EAAA,EAAA,KAAC,UAAA,CAAQ,UAAU,+BACjB,EAAA,EAAA,KAAC,MAAA,CAAI,UAAU,mBAAoB,iBCA9B,OAET,EAAA,EAAA,MAAC,SAAA,CACC,WAAA,EAAA,EAAA,IACE,UACA,sBACA,gCACA,6CACA,wCACA,wEACA,mBAGF,EAAA,EAAA,KAACC,EAAAA,eAAAA,KAED,EAAA,EAAA,MAAC,MAAA,CAAI,UAAU,iCACb,EAAA,EAAA,KAAC,MAAA,CAAI,UAAU,gIACb,EAAA,EAAA,KAACC,EAAAA,iBAAAA,CAAiB,KAAM,QAE1B,EAAA,EAAA,MAAC,MAAA,CAAI,UAAU,yDACb,EAAA,EAAA,KAAC,OAAA,CAAK,UAAU,gCAAuB,iBACvC,EAAA,EAAA,KAAC,OAAA,CAAK,UAAU,4BAAmB,4BAGvC,EAAA,EAAA,MAAC,MAAA,CAAI,UAAU,kDACb,EAAA,EAAA,KAACC,EAAAA,OAAAA,CAAO,QAAQ,QAAQ,KAAK,OAAO,UAAU,+CAC5C,EAAA,EAAA,KAACC,EAAAA,uBAAAA,OAEH,EAAA,EAAA,KAACD,EAAAA,OAAAA,CAAO,QAAQ,QAAQ,KAAK,OAAO,UAAU,+CAC5C,EAAA,EAAA,KAACE,EAAAA,SAAAA"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import * as react_jsx_runtime259 from "react/jsx-runtime";
|
|
2
|
-
|
|
3
|
-
//#region packages/components/layouts/main/wrapper.d.ts
|
|
4
|
-
declare const MainLayoutWrapper: ({
|
|
5
|
-
children
|
|
6
|
-
}: React.PropsWithChildren) => react_jsx_runtime259.JSX.Element;
|
|
7
|
-
//#endregion
|
|
8
|
-
//#region packages/components/layouts/main/content.d.ts
|
|
9
|
-
declare const MainLayoutContent: ({
|
|
10
|
-
children
|
|
11
|
-
}: React.PropsWithChildren) => react_jsx_runtime259.JSX.Element;
|
|
12
|
-
//#endregion
|
|
13
|
-
//#region packages/components/layouts/main/header.d.ts
|
|
14
|
-
declare const MainLayoutHeader: () => react_jsx_runtime259.JSX.Element;
|
|
15
|
-
//#endregion
|
|
16
|
-
export { MainLayoutContent, MainLayoutHeader, MainLayoutWrapper };
|
|
17
|
-
//# sourceMappingURL=index.d.cts.map
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import * as react_jsx_runtime259 from "react/jsx-runtime";
|
|
2
|
-
|
|
3
|
-
//#region packages/components/layouts/main/wrapper.d.ts
|
|
4
|
-
declare const MainLayoutWrapper: ({
|
|
5
|
-
children
|
|
6
|
-
}: React.PropsWithChildren) => react_jsx_runtime259.JSX.Element;
|
|
7
|
-
//#endregion
|
|
8
|
-
//#region packages/components/layouts/main/content.d.ts
|
|
9
|
-
declare const MainLayoutContent: ({
|
|
10
|
-
children
|
|
11
|
-
}: React.PropsWithChildren) => react_jsx_runtime259.JSX.Element;
|
|
12
|
-
//#endregion
|
|
13
|
-
//#region packages/components/layouts/main/header.d.ts
|
|
14
|
-
declare const MainLayoutHeader: () => react_jsx_runtime259.JSX.Element;
|
|
15
|
-
//#endregion
|
|
16
|
-
export { MainLayoutContent, MainLayoutHeader, MainLayoutWrapper };
|
|
17
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import"../../tooltip-Ba2AdN_7.js";import{Button as e}from"../../button-DL_i4AVi.js";import"../../input-OWyLq45f.js";import"../../separator-Bp3QE0oo.js";import"../../sheet-B2CNJMzu.js";import"../../skeleton-BSWmwJUf.js";import{SidebarInset as t,SidebarProvider as n,SidebarTrigger as r}from"../../sidebar-BDefeoUz.js";import{cn as i}from"@customafk/react-toolkit/utils";import{jsx as a,jsxs as o}from"react/jsx-runtime";import{BellIcon as s,CircleQuestionMarkIcon as c,ShoppingCartIcon as l}from"lucide-react";const u=({children:e})=>a(n,{className:`w-svw`,children:e}),d=({children:e})=>a(t,{children:a(`section`,{className:`relative size-full`,children:a(`div`,{className:`absolute inset-0`,children:e})})}),f=()=>o(`header`,{className:i(`bg-card`,`h-(--header-height)`,`absolute inset-x-0 top-0 z-20`,`flex items-center gap-2 border-b shadow-sm`,`transition-[width,height] ease-linear`,`group-has-data-[collapsible=icon]/sidebar-wrapper:h-(--header-height)`,`px-4`),children:[a(r,{}),o(`div`,{className:`ml-2.5 flex gap-x-2`,children:[a(`div`,{className:`bg-sidebar-primary text-sidebar-primary-foreground flex aspect-square size-8 items-center justify-center rounded-lg`,children:a(l,{size:20})}),o(`div`,{className:`grid flex-1 text-left text-sm leading-tight`,children:[a(`span`,{className:`truncate font-medium`,children:`Lunas Store`}),a(`span`,{className:`truncate text-xs`,children:`Established 2023`})]})]}),o(`div`,{className:`flex flex-1 items-center justify-end`,children:[a(e,{variant:`ghost`,size:`icon`,className:`text-muted-foreground rounded-full`,children:a(c,{})}),a(e,{variant:`ghost`,size:`icon`,className:`text-muted-foreground rounded-full`,children:a(s,{})})]})]});export{d as MainLayoutContent,f as MainLayoutHeader,u as MainLayoutWrapper};
|
|
2
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../packages/components/layouts/main/wrapper.tsx","../../../packages/components/layouts/main/content.tsx","../../../packages/components/layouts/main/header.tsx"],"sourcesContent":["import { SidebarProvider } from '@/components/ui/sidebar'\n\nexport const MainLayoutWrapper = ({ children }: React.PropsWithChildren) => {\n return <SidebarProvider className=\"w-svw\">{children}</SidebarProvider>\n}\n","import { SidebarInset } from '@/components/ui/sidebar'\n\nexport const MainLayoutContent = ({ children }: React.PropsWithChildren) => {\n return (\n <SidebarInset>\n <section className=\"relative size-full\">\n <div className=\"absolute inset-0\">{children}</div>\n </section>\n </SidebarInset>\n )\n}\n","import { BellIcon, CircleQuestionMarkIcon, ShoppingCartIcon } from 'lucide-react'\n\nimport { Button } from '@/components/ui/button'\nimport { SidebarTrigger } from '@/components/ui/sidebar'\nimport { cn } from '@customafk/react-toolkit/utils'\n\nexport const MainLayoutHeader = () => {\n return (\n <header\n className={cn(\n 'bg-card',\n 'h-(--header-height)',\n 'absolute inset-x-0 top-0 z-20',\n 'flex items-center gap-2 border-b shadow-sm',\n 'transition-[width,height] ease-linear',\n 'group-has-data-[collapsible=icon]/sidebar-wrapper:h-(--header-height)',\n 'px-4',\n )}\n >\n <SidebarTrigger />\n\n <div className=\"ml-2.5 flex gap-x-2\">\n <div className=\"bg-sidebar-primary text-sidebar-primary-foreground flex aspect-square size-8 items-center justify-center rounded-lg\">\n <ShoppingCartIcon size={20} />\n </div>\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\n <span className=\"truncate font-medium\">Lunas Store</span>\n <span className=\"truncate text-xs\">Established 2023</span>\n </div>\n </div>\n <div className=\"flex flex-1 items-center justify-end\">\n <Button variant=\"ghost\" size=\"icon\" className=\"text-muted-foreground rounded-full\">\n <CircleQuestionMarkIcon />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"text-muted-foreground rounded-full\">\n <BellIcon />\n </Button>\n </div>\n </header>\n )\n}\n"],"mappings":"6fAEA,MAAa,GAAqB,CAAE,cAC3B,EAAC,EAAA,CAAgB,UAAU,QAAS,aCDhC,GAAqB,CAAE,cAEhC,EAAC,EAAA,CAAA,SACC,EAAC,UAAA,CAAQ,UAAU,8BACjB,EAAC,MAAA,CAAI,UAAU,mBAAoB,iBCA9B,MAET,EAAC,SAAA,CACC,UAAW,EACT,UACA,sBACA,gCACA,6CACA,wCACA,wEACA,kBAGF,EAAC,EAAA,IAED,EAAC,MAAA,CAAI,UAAU,gCACb,EAAC,MAAA,CAAI,UAAU,+HACb,EAAC,EAAA,CAAiB,KAAM,OAE1B,EAAC,MAAA,CAAI,UAAU,wDACb,EAAC,OAAA,CAAK,UAAU,gCAAuB,gBACvC,EAAC,OAAA,CAAK,UAAU,4BAAmB,2BAGvC,EAAC,MAAA,CAAI,UAAU,iDACb,EAAC,EAAA,CAAO,QAAQ,QAAQ,KAAK,OAAO,UAAU,8CAC5C,EAAC,EAAA,MAEH,EAAC,EAAA,CAAO,QAAQ,QAAQ,KAAK,OAAO,UAAU,8CAC5C,EAAC,EAAA"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{Button as e}from"./button-DL_i4AVi.js";import{Command as t,CommandGroup as n,CommandItem as r,CommandList as i,CommandSeparator as ee}from"./command-B3A4F1pB.js";import a from"react";import{cn as o}from"@customafk/react-toolkit/utils";import{Fragment as s,jsx as c,jsxs as l}from"react/jsx-runtime";import{PlusIcon as te,X as u}from"lucide-react";import{Command as d,useCommandState as f}from"cmdk";function p(e,t){let[n,r]=a.useState(e);return a.useEffect(()=>{let n=setTimeout(()=>r(e),t||500);return()=>{clearTimeout(n)}},[e,t]),n}function m(e,t){if(e.length===0)return{};if(!t)return{"":e};let n={};return e.forEach(e=>{let r=e[t]||``;n[r]||(n[r]=[]),n[r].push(e)}),n}function ne(e,t){let n=JSON.parse(JSON.stringify(e));for(let[e,r]of Object.entries(n))n[e]=r.filter(e=>!t.find(t=>t.value===e.value));return n}function re(e,t){for(let[,n]of Object.entries(e))if(n.some(e=>t.find(t=>t.value===e.value)))return!0;return!1}const h=a.forwardRef(({className:e,...t},n)=>{let r=f(e=>e.filtered.count===0);return r?c(`div`,{ref:n,className:o(`px-2 py-4 text-center text-sm`,e),"cmdk-empty":``,role:`presentation`,...t}):null});h.displayName=`CommandEmpty`;const g=a.forwardRef(({value:f,onChange:g,placeholder:_,defaultOptions:v=[],options:y,delay:b,onSearch:x,onSearchSync:S,loadingIndicator:ie,emptyIndicator:C,maxSelected:w=9007199254740991,onMaxSelected:T,hidePlaceholderWhenSelected:E,disabled:D,groupBy:O,className:ae,badgeClassName:k,selectFirstItem:A=!0,creatable:j=!1,triggerSearchOnFocus:M=!1,commandProps:N,inputProps:P,hideClearAllButton:F=!1,onAddNewItem:I},L)=>{let R=a.useRef(null),z=a.useRef(null),[B,V]=a.useState(!1),[oe,H]=a.useState(!1),[U,W]=a.useState(!1),[G,K]=a.useState(f||[]),[q,J]=a.useState(m(v,O)),[Y,X]=a.useState(``),Z=p(Y,b||500);a.useImperativeHandle(L,()=>({selectedValue:[...G],input:R.current,focus:()=>R?.current?.focus(),reset:()=>K([])}),[G]);let Q=a.useCallback(e=>{z.current&&!z.current.contains(e.target)&&R.current&&!R.current.contains(e.target)&&(V(!1),R.current.blur())},[]),$=a.useCallback(e=>{let t=G.filter(t=>t.value!==e.value);K(t),g?.(t)},[g,G]),se=a.useCallback(e=>{let t=R.current;if(t){if((e.key===`Delete`||e.key===`Backspace`)&&t.value===``&&G.length>0){let e=G[G.length-1];e.fixed||$(G[G.length-1])}e.key===`Escape`&&t.blur()}},[$,G]);a.useEffect(()=>(B?(document.addEventListener(`mousedown`,Q),document.addEventListener(`touchend`,Q)):(document.removeEventListener(`mousedown`,Q),document.removeEventListener(`touchend`,Q)),()=>{document.removeEventListener(`mousedown`,Q),document.removeEventListener(`touchend`,Q)}),[B]),a.useEffect(()=>{f&&K(f)},[f]),a.useEffect(()=>{if(!y||x)return;let e=m(y||[],O);JSON.stringify(e)!==JSON.stringify(q)&&J(e)},[v,y,O,x,q]),a.useEffect(()=>{let e=()=>{let e=S?.(Z);J(m(e||[],O))},t=async()=>{!S||!B||(M&&e(),Z&&e())};t()},[Z,O,B,M]),a.useEffect(()=>{let e=async()=>{W(!0);let e=await x?.(Z);J(m(e||[],O)),W(!1)},t=async()=>{!x||!B||(M&&await e(),Z&&await e())};t()},[Z,O,B,M]);let ce=()=>{if(!j||re(q,[{value:Y,label:Y}])||G.find(e=>e.value===Y))return;let e=c(r,{value:Y,className:`cursor-pointer`,onMouseDown:e=>{e.preventDefault(),e.stopPropagation()},onSelect:e=>{if(G.length>=w){T?.(G.length);return}X(``);let t=[...G,{value:e,label:e}];K(t),g?.(t)},children:`Create "${Y}"`});if(!x&&Y.length>0||x&&Z.length>0&&!U)return e},le=a.useCallback(()=>{if(C)return x&&!j&&Object.keys(q).length===0?c(r,{value:`-`,disabled:!0,children:C}):c(h,{children:C})},[j,C,x,q]),ue=a.useMemo(()=>ne(q,G),[q,G]),de=a.useCallback(()=>{if(N?.filter)return N.filter;if(j)return(e,t)=>e.toLowerCase().includes(t.toLowerCase())?1:-1},[j,N?.filter]);return l(t,{ref:z,...N,onKeyDown:e=>{se(e),N?.onKeyDown?.(e)},className:o(`h-auto overflow-visible bg-transparent`,N?.className),shouldFilter:N?.shouldFilter===void 0?!x:N.shouldFilter,filter:de(),children:[c(`div`,{className:o(`border-border-weak relative rounded-md border text-sm transition-shadow`,`focus-within:border-primary`,`focus-within:ring-primary-weak`,`focus-within:ring-4`,`focus-within:outline-hidden`,`has-disabled:bg-muted`,`has-disabled:text-muted-foreground`,G.length!==0&&`p-1`,!D&&G.length!==0&&`cursor-text`,!F&&`pe-9`,ae),onClick:()=>{D||R?.current?.focus()},children:l(`div`,{className:`flex flex-wrap gap-1`,children:[G.map(e=>l(`div`,{className:o(`animate-fadeIn`,`bg-background`,`hover:bg-background`,`border-border-weak border border-solid`,`text-text-positive-weak relative inline-flex h-7 cursor-default items-center rounded-md ps-2 pe-7 pl-2 text-xs font-medium transition-all`,`disabled:cursor-not-allowed`,`disabled:opacity-50`,`data-fixed:pe-2`,k),"data-fixed":e.fixed,"data-disabled":D||void 0,children:[e.label,c(`button`,{type:`button`,disabled:D||e.fixed,className:o(`text-text-positive-muted absolute -inset-y-px -end-px flex size-7 items-center justify-center rounded-e-lg border border-transparent p-0 outline-0 transition-colors`,`hover:text-foreground`,`focus-visible:outline`,`focus-visible:outline-2`,`focus-visible:outline-primary-weak`,`disabled:hover:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50`),onKeyDown:t=>{t.key===`Enter`&&$(e)},onMouseDown:e=>{e.preventDefault(),e.stopPropagation()},onClick:()=>$(e),"aria-label":`Remove`,children:c(u,{size:14,strokeWidth:2,"aria-hidden":`true`})})]},e.value)),c(d.Input,{...P,ref:R,value:Y,disabled:D,onValueChange:e=>{X(e),P?.onValueChange?.(e)},onBlur:e=>{oe||V(!1),P?.onBlur?.(e)},onFocus:e=>{V(!0),M&&x?.(Z),P?.onFocus?.(e)},placeholder:E&&G.length!==0?``:_,className:o(`placeholder:text-text-positive-muted flex-1 bg-transparent outline-hidden`,`disabled:placeholder:text-transparent`,{"w-full":E,"px-3 py-2":G.length===0,"ml-1":G.length!==0},P?.className)}),c(`button`,{type:`button`,onClick:()=>{K(G.filter(e=>e.fixed)),g?.(G.filter(e=>e.fixed))},className:o(`text-muted-foreground/80`,`absolute end-0 top-0 flex size-9 items-center justify-center rounded-lg border border-transparent transition-colors`,`focus-visible:outline-2`,`hover:text-text-positive`,`focus-visible:outline-primary-weak`,(F||D||G.length<1||G.filter(({fixed:e})=>e).length===G.length)&&`hidden`),"aria-label":`Clear all`,children:c(u,{size:16,strokeWidth:2,"aria-hidden":`true`})})]})}),c(`div`,{className:`relative`,children:c(`div`,{className:o(`shadow-dropdown absolute top-2 z-10 w-full overflow-hidden rounded-lg`,`data-[state=open]:animate-in`,`data-[state=closed]:animate-out`,`data-[state=closed]:fade-out-0`,`data-[state=open]:fade-in-0`,`data-[state=closed]:zoom-out-95`,`data-[state=open]:zoom-in-95`,!B&&`hidden`),"data-state":B?`open`:`closed`,children:B&&l(i,{className:`shadow-lg outline-hidden`,onMouseLeave:()=>{H(!1)},onMouseEnter:()=>{H(!0)},onMouseUp:()=>{R?.current?.focus()},children:[I&&l(s,{children:[c(ee,{}),c(n,{children:l(e,{type:`button`,variant:`ghost`,className:`w-full font-normal [&_div]:justify-start`,onClick:I,children:[c(te,{size:14,className:`opacity-60`,"aria-hidden":`true`}),`Thêm mới`]})})]}),U?ie:l(a.Fragment,{children:[le(),ce(),!A&&c(r,{value:`-`,className:`hidden`}),Object.entries(ue).map(([e,t])=>c(n,{heading:e,className:`h-full overflow-auto`,children:t.map(e=>c(r,{value:e.value,disabled:e.disable,onMouseDown:e=>{e.preventDefault(),e.stopPropagation()},onSelect:()=>{if(G.length>=w){T?.(G.length);return}let t=[...G,e];X(``),K(t),g?.(t)},className:o(`cursor-pointer`,e.disable&&`cursor-not-allowed opacity-50`),children:e.label},e.value))},e))]})]})})})]})});g.displayName=`MultipleSelector`;export{g as MultipleSelector,p as useDebounce};
|
|
2
|
-
//# sourceMappingURL=multi-select-DkEzuDXi.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"multi-select-DkEzuDXi.js","names":["groupOption: GroupOption","value","Command","CommandPrimitive"],"sources":["../packages/components/ui/multi-select.tsx"],"sourcesContent":["'use client'\nimport React from 'react'\nimport { Command as CommandPrimitive, useCommandState } from 'cmdk'\nimport { PlusIcon, X } from 'lucide-react'\n\nimport { Command, CommandGroup, CommandItem, CommandList, CommandSeparator } from '@/components/ui/command'\nimport { Button } from '@/components/ui/button'\nimport { cn } from '@customafk/react-toolkit/utils'\n\nexport interface Option {\n value: string\n label: string\n disable?: boolean\n /** fixed option that can‘t be removed. */\n fixed?: boolean\n /** Group the options by providing key. */\n [key: string]: string | boolean | undefined\n}\ninterface GroupOption {\n [key: string]: Option[]\n}\n\ninterface MultipleSelectorProps {\n value?: Option[]\n defaultOptions?: Option[]\n /** manually controlled options */\n options?: Option[]\n placeholder?: string\n /** Loading component. */\n loadingIndicator?: React.ReactNode\n /** Empty component. */\n emptyIndicator?: React.ReactNode\n /** Debounce time for async search. Only work with `onSearch`. */\n delay?: number\n /**\n * Only work with `onSearch` prop. Trigger search when `onFocus`.\n * For example, when user click on the input, it will trigger the search to get initial options.\n **/\n triggerSearchOnFocus?: boolean\n /** async search */\n onSearch?: (value: string) => Promise<Option[]>\n /**\n * sync search. This search will not showing loadingIndicator.\n * The rest props are the same as async search.\n * i.e.: creatable, groupBy, delay.\n **/\n onSearchSync?: (value: string) => Option[]\n onChange?: (options: Option[]) => void\n /** Limit the maximum number of selected options. */\n maxSelected?: number\n /** When the number of selected options exceeds the limit, the onMaxSelected will be called. */\n onMaxSelected?: (maxLimit: number) => void\n /** Hide the placeholder when there are options selected. */\n hidePlaceholderWhenSelected?: boolean\n disabled?: boolean\n /** Group the options base on provided key. */\n groupBy?: string\n className?: string\n badgeClassName?: string\n /**\n * First item selected is a default behavior by cmdk. That is why the default is true.\n * This is a workaround solution by add a dummy item.\n *\n * @reference: https://github.com/pacocoursey/cmdk/issues/171\n */\n selectFirstItem?: boolean\n /** Allow user to create option when there is no option matched. */\n creatable?: boolean\n /** Props of `Command` */\n commandProps?: React.ComponentPropsWithoutRef<typeof Command>\n /** Props of `CommandInput` */\n inputProps?: Omit<React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>, 'value' | 'placeholder' | 'disabled'>\n /** hide the clear all button. */\n hideClearAllButton?: boolean\n\n /** Add new item event for select with search */\n onAddNewItem?: () => void\n}\n\nexport interface MultipleSelectorRef {\n selectedValue: Option[]\n input: HTMLInputElement\n focus: () => void\n reset: () => void\n}\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport function useDebounce<T>(value: T, delay?: number): T {\n const [debouncedValue, setDebouncedValue] = React.useState<T>(value)\n\n React.useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay || 500)\n\n return () => {\n clearTimeout(timer)\n }\n }, [value, delay])\n\n return debouncedValue\n}\n\nfunction transToGroupOption(options: Option[], groupBy?: string) {\n if (options.length === 0) {\n return {}\n }\n if (!groupBy) {\n return {\n '': options,\n }\n }\n\n const groupOption: GroupOption = {}\n options.forEach((option) => {\n const key = (option[groupBy] as string) || ''\n if (!groupOption[key]) {\n groupOption[key] = []\n }\n groupOption[key].push(option)\n })\n return groupOption\n}\n\nfunction removePickedOption(groupOption: GroupOption, picked: Option[]) {\n const cloneOption = JSON.parse(JSON.stringify(groupOption)) as GroupOption\n\n for (const [key, value] of Object.entries(cloneOption)) {\n cloneOption[key] = value.filter((val) => !picked.find((p) => p.value === val.value))\n }\n return cloneOption\n}\n\nfunction isOptionsExist(groupOption: GroupOption, targetOption: Option[]) {\n for (const [, value] of Object.entries(groupOption)) {\n if (value.some((option) => targetOption.find((p) => p.value === option.value))) {\n return true\n }\n }\n return false\n}\n\n/**\n * The `CommandEmpty` of shadcn/ui will cause the cmdk empty not rendering correctly.\n * So we create one and copy the `Empty` implementation from `cmdk`.\n *\n * @reference: https://github.com/hsuanyi-chou/shadcn-ui-expansions/issues/34#issuecomment-1949561607\n **/\nconst CommandEmpty = React.forwardRef<HTMLDivElement, React.ComponentProps<typeof CommandPrimitive.Empty>>(({ className, ...props }, forwardedRef) => {\n const render = useCommandState((state) => state.filtered.count === 0)\n\n if (!render) return null\n\n return <div ref={forwardedRef} className={cn('px-2 py-4 text-center text-sm', className)} cmdk-empty=\"\" role=\"presentation\" {...props} />\n})\n\nCommandEmpty.displayName = 'CommandEmpty'\n\nexport const MultipleSelector = React.forwardRef<MultipleSelectorRef, MultipleSelectorProps>(\n (\n {\n value,\n onChange,\n placeholder,\n defaultOptions: arrayDefaultOptions = [],\n options: arrayOptions,\n delay,\n onSearch,\n onSearchSync,\n loadingIndicator: LoadingIndicator,\n emptyIndicator,\n maxSelected = Number.MAX_SAFE_INTEGER,\n onMaxSelected,\n hidePlaceholderWhenSelected,\n disabled,\n groupBy,\n className,\n badgeClassName,\n selectFirstItem = true,\n creatable = false,\n triggerSearchOnFocus = false,\n commandProps,\n inputProps,\n hideClearAllButton = false,\n onAddNewItem,\n }: MultipleSelectorProps,\n ref: React.Ref<MultipleSelectorRef>,\n ) => {\n const inputRef = React.useRef<HTMLInputElement>(null)\n const dropdownRef = React.useRef<HTMLDivElement>(null) // Added this\n\n const [open, setOpen] = React.useState(false)\n const [onScrollbar, setOnScrollbar] = React.useState(false)\n const [isLoading, setIsLoading] = React.useState(false)\n\n const [selected, setSelected] = React.useState<Option[]>(value || [])\n const [options, setOptions] = React.useState<GroupOption>(transToGroupOption(arrayDefaultOptions, groupBy))\n const [inputValue, setInputValue] = React.useState('')\n\n const debouncedSearchTerm = useDebounce(inputValue, delay || 500)\n\n React.useImperativeHandle(\n ref,\n () => ({\n selectedValue: [...selected],\n input: inputRef.current as HTMLInputElement,\n focus: () => inputRef?.current?.focus(),\n reset: () => setSelected([]),\n }),\n [selected],\n )\n\n const handleClickOutside = React.useCallback((event: MouseEvent | TouchEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node) && inputRef.current && !inputRef.current.contains(event.target as Node)) {\n setOpen(false)\n inputRef.current.blur()\n }\n }, [])\n\n const handleUnselect = React.useCallback(\n (option: Option) => {\n const newOptions = selected.filter((s) => s.value !== option.value)\n setSelected(newOptions)\n onChange?.(newOptions)\n },\n [onChange, selected],\n )\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n const input = inputRef.current\n if (!input) return\n\n if (e.key === 'Delete' || e.key === 'Backspace') {\n if (input.value === '' && selected.length > 0) {\n const lastSelectOption = selected[selected.length - 1]\n // If last item is fixed, we should not remove it.\n if (!lastSelectOption.fixed) {\n handleUnselect(selected[selected.length - 1])\n }\n }\n }\n\n // This is not a default behavior of the <input /> field\n if (e.key === 'Escape') {\n input.blur()\n }\n },\n [handleUnselect, selected],\n )\n\n React.useEffect(() => {\n if (open) {\n document.addEventListener('mousedown', handleClickOutside)\n document.addEventListener('touchend', handleClickOutside)\n } else {\n document.removeEventListener('mousedown', handleClickOutside)\n document.removeEventListener('touchend', handleClickOutside)\n }\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n document.removeEventListener('touchend', handleClickOutside)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open])\n\n React.useEffect(() => {\n if (value) {\n setSelected(value)\n }\n }, [value])\n\n React.useEffect(() => {\n /** If `onSearch` is provided, do not trigger options updated. */\n if (!arrayOptions || onSearch) {\n return\n }\n const newOption = transToGroupOption(arrayOptions || [], groupBy)\n if (JSON.stringify(newOption) !== JSON.stringify(options)) {\n setOptions(newOption)\n }\n }, [arrayDefaultOptions, arrayOptions, groupBy, onSearch, options])\n\n React.useEffect(() => {\n /** sync search */\n\n const doSearchSync = () => {\n const res = onSearchSync?.(debouncedSearchTerm)\n setOptions(transToGroupOption(res || [], groupBy))\n }\n\n const exec = async () => {\n if (!onSearchSync || !open) return\n\n if (triggerSearchOnFocus) {\n doSearchSync()\n }\n\n if (debouncedSearchTerm) {\n doSearchSync()\n }\n }\n\n void exec()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [debouncedSearchTerm, groupBy, open, triggerSearchOnFocus])\n\n React.useEffect(() => {\n /** async search */\n\n const doSearch = async () => {\n setIsLoading(true)\n const res = await onSearch?.(debouncedSearchTerm)\n setOptions(transToGroupOption(res || [], groupBy))\n setIsLoading(false)\n }\n\n const exec = async () => {\n if (!onSearch || !open) return\n\n if (triggerSearchOnFocus) {\n await doSearch()\n }\n\n if (debouncedSearchTerm) {\n await doSearch()\n }\n }\n\n void exec()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [debouncedSearchTerm, groupBy, open, triggerSearchOnFocus])\n\n const CreatableItem = () => {\n if (!creatable) return undefined\n if (isOptionsExist(options, [{ value: inputValue, label: inputValue }]) || selected.find((s) => s.value === inputValue)) {\n return undefined\n }\n\n const Item = (\n <CommandItem\n value={inputValue}\n className=\"cursor-pointer\"\n onMouseDown={(e) => {\n e.preventDefault()\n e.stopPropagation()\n }}\n onSelect={(value: string) => {\n if (selected.length >= maxSelected) {\n onMaxSelected?.(selected.length)\n return\n }\n setInputValue('')\n const newOptions = [...selected, { value, label: value }]\n setSelected(newOptions)\n onChange?.(newOptions)\n }}\n >\n {`Create \"${inputValue}\"`}\n </CommandItem>\n )\n\n // For normal creatable\n if (!onSearch && inputValue.length > 0) {\n return Item\n }\n\n // For async search creatable. avoid showing creatable item before loading at first.\n if (onSearch && debouncedSearchTerm.length > 0 && !isLoading) {\n return Item\n }\n\n return undefined\n }\n\n const EmptyItem = React.useCallback(() => {\n if (!emptyIndicator) return undefined\n\n // For async search that showing emptyIndicator\n if (onSearch && !creatable && Object.keys(options).length === 0) {\n return (\n <CommandItem value=\"-\" disabled>\n {emptyIndicator}\n </CommandItem>\n )\n }\n\n return <CommandEmpty>{emptyIndicator}</CommandEmpty>\n }, [creatable, emptyIndicator, onSearch, options])\n\n const selectables = React.useMemo<GroupOption>(() => removePickedOption(options, selected), [options, selected])\n\n /** Avoid Creatable Selector freezing or lagging when paste a long string. */\n const commandFilter = React.useCallback(() => {\n if (commandProps?.filter) {\n return commandProps.filter\n }\n\n if (creatable) {\n return (value: string, search: string) => {\n return value.toLowerCase().includes(search.toLowerCase()) ? 1 : -1\n }\n }\n // Using default filter in `cmdk`. We don‘t have to provide it.\n return undefined\n }, [creatable, commandProps?.filter])\n\n return (\n <Command\n ref={dropdownRef}\n {...commandProps}\n onKeyDown={(e) => {\n handleKeyDown(e)\n commandProps?.onKeyDown?.(e)\n }}\n className={cn('h-auto overflow-visible bg-transparent', commandProps?.className)}\n shouldFilter={commandProps?.shouldFilter !== undefined ? commandProps.shouldFilter : !onSearch} // When onSearch is provided, we don‘t want to filter the options. You can still override it.\n filter={commandFilter()}\n >\n <div\n className={cn(\n 'border-border-weak relative rounded-md border text-sm transition-shadow',\n 'focus-within:border-primary',\n 'focus-within:ring-primary-weak',\n 'focus-within:ring-4',\n 'focus-within:outline-hidden',\n 'has-disabled:bg-muted',\n 'has-disabled:text-muted-foreground',\n selected.length !== 0 && 'p-1',\n !disabled && selected.length !== 0 && 'cursor-text',\n !hideClearAllButton && 'pe-9',\n className,\n )}\n onClick={() => {\n if (disabled) return\n inputRef?.current?.focus()\n }}\n >\n <div className=\"flex flex-wrap gap-1\">\n {selected.map((option) => {\n return (\n <div\n key={option.value}\n className={cn(\n 'animate-fadeIn',\n 'bg-background',\n 'hover:bg-background',\n 'border-border-weak border border-solid',\n 'text-text-positive-weak relative inline-flex h-7 cursor-default items-center rounded-md ps-2 pe-7 pl-2 text-xs font-medium transition-all',\n 'disabled:cursor-not-allowed',\n 'disabled:opacity-50',\n 'data-fixed:pe-2',\n badgeClassName,\n )}\n data-fixed={option.fixed}\n data-disabled={disabled || undefined}\n >\n {option.label}\n <button\n type=\"button\"\n disabled={disabled || option.fixed}\n className={cn(\n 'text-text-positive-muted absolute -inset-y-px -end-px flex size-7 items-center justify-center rounded-e-lg border border-transparent p-0 outline-0 transition-colors',\n 'hover:text-foreground',\n 'focus-visible:outline',\n 'focus-visible:outline-2',\n 'focus-visible:outline-primary-weak',\n 'disabled:hover:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50',\n )}\n onKeyDown={(e) => {\n if (e.key !== 'Enter') return\n handleUnselect(option)\n }}\n onMouseDown={(e) => {\n e.preventDefault()\n e.stopPropagation()\n }}\n onClick={() => handleUnselect(option)}\n aria-label=\"Remove\"\n >\n <X size={14} strokeWidth={2} aria-hidden=\"true\" />\n </button>\n </div>\n )\n })}\n {/* Avoid having the \"Search\" Icon */}\n <CommandPrimitive.Input\n {...inputProps}\n ref={inputRef}\n value={inputValue}\n disabled={disabled}\n onValueChange={(value) => {\n setInputValue(value)\n inputProps?.onValueChange?.(value)\n }}\n onBlur={(event) => {\n if (!onScrollbar) {\n setOpen(false)\n }\n inputProps?.onBlur?.(event)\n }}\n onFocus={(event) => {\n setOpen(true)\n if (triggerSearchOnFocus) {\n onSearch?.(debouncedSearchTerm)\n }\n inputProps?.onFocus?.(event)\n }}\n placeholder={hidePlaceholderWhenSelected && selected.length !== 0 ? '' : placeholder}\n className={cn(\n 'placeholder:text-text-positive-muted flex-1 bg-transparent outline-hidden',\n 'disabled:placeholder:text-transparent',\n {\n 'w-full': hidePlaceholderWhenSelected,\n 'px-3 py-2': selected.length === 0,\n 'ml-1': selected.length !== 0,\n },\n inputProps?.className,\n )}\n />\n <button\n type=\"button\"\n onClick={() => {\n setSelected(selected.filter((s) => s.fixed))\n onChange?.(selected.filter((s) => s.fixed))\n }}\n className={cn(\n 'text-muted-foreground/80',\n 'absolute end-0 top-0 flex size-9 items-center justify-center rounded-lg border border-transparent transition-colors',\n 'focus-visible:outline-2',\n 'hover:text-text-positive',\n 'focus-visible:outline-primary-weak',\n (hideClearAllButton || disabled || selected.length < 1 || selected.filter(({ fixed }) => fixed).length === selected.length) && 'hidden',\n )}\n aria-label=\"Clear all\"\n >\n <X size={16} strokeWidth={2} aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n <div className=\"relative\">\n <div\n className={cn(\n 'shadow-dropdown absolute top-2 z-10 w-full overflow-hidden rounded-lg',\n 'data-[state=open]:animate-in',\n 'data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0',\n 'data-[state=open]:fade-in-0',\n 'data-[state=closed]:zoom-out-95',\n 'data-[state=open]:zoom-in-95',\n !open && 'hidden',\n )}\n data-state={open ? 'open' : 'closed'}\n >\n {open && (\n <CommandList\n className=\"shadow-lg outline-hidden\"\n onMouseLeave={() => {\n setOnScrollbar(false)\n }}\n onMouseEnter={() => {\n setOnScrollbar(true)\n }}\n onMouseUp={() => {\n inputRef?.current?.focus()\n }}\n >\n {onAddNewItem && (\n <>\n <CommandSeparator />\n <CommandGroup>\n <Button type=\"button\" variant=\"ghost\" className=\"w-full font-normal [&_div]:justify-start\" onClick={onAddNewItem}>\n <PlusIcon size={14} className=\"opacity-60\" aria-hidden=\"true\" />\n Thêm mới\n </Button>\n </CommandGroup>\n </>\n )}\n {isLoading ? (\n LoadingIndicator\n ) : (\n <React.Fragment>\n {EmptyItem()}\n {CreatableItem()}\n {!selectFirstItem && <CommandItem value=\"-\" className=\"hidden\" />}\n {Object.entries(selectables).map(([key, dropdowns]) => (\n <CommandGroup key={key} heading={key} className=\"h-full overflow-auto\">\n {dropdowns.map((option) => {\n return (\n <CommandItem\n key={option.value}\n value={option.value}\n disabled={option.disable}\n onMouseDown={(e) => {\n e.preventDefault()\n e.stopPropagation()\n }}\n onSelect={() => {\n if (selected.length >= maxSelected) {\n onMaxSelected?.(selected.length)\n return\n }\n const newOptions = [...selected, option]\n setInputValue('')\n setSelected(newOptions)\n onChange?.(newOptions)\n }}\n className={cn('cursor-pointer', option.disable && 'cursor-not-allowed opacity-50')}\n >\n {option.label}\n </CommandItem>\n )\n })}\n </CommandGroup>\n ))}\n </React.Fragment>\n )}\n </CommandList>\n )}\n </div>\n </div>\n </Command>\n )\n },\n)\n\nMultipleSelector.displayName = 'MultipleSelector'\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"multi-select-DoV9aD32.cjs","names":["React","groupOption: GroupOption","CommandItem","value","Command","X","CommandPrimitive","CommandList","CommandSeparator","CommandGroup","Button","PlusIcon"],"sources":["../packages/components/ui/multi-select.tsx"],"sourcesContent":["'use client'\nimport React from 'react'\nimport { Command as CommandPrimitive, useCommandState } from 'cmdk'\nimport { PlusIcon, X } from 'lucide-react'\n\nimport { Command, CommandGroup, CommandItem, CommandList, CommandSeparator } from '@/components/ui/command'\nimport { Button } from '@/components/ui/button'\nimport { cn } from '@customafk/react-toolkit/utils'\n\nexport interface Option {\n value: string\n label: string\n disable?: boolean\n /** fixed option that can‘t be removed. */\n fixed?: boolean\n /** Group the options by providing key. */\n [key: string]: string | boolean | undefined\n}\ninterface GroupOption {\n [key: string]: Option[]\n}\n\ninterface MultipleSelectorProps {\n value?: Option[]\n defaultOptions?: Option[]\n /** manually controlled options */\n options?: Option[]\n placeholder?: string\n /** Loading component. */\n loadingIndicator?: React.ReactNode\n /** Empty component. */\n emptyIndicator?: React.ReactNode\n /** Debounce time for async search. Only work with `onSearch`. */\n delay?: number\n /**\n * Only work with `onSearch` prop. Trigger search when `onFocus`.\n * For example, when user click on the input, it will trigger the search to get initial options.\n **/\n triggerSearchOnFocus?: boolean\n /** async search */\n onSearch?: (value: string) => Promise<Option[]>\n /**\n * sync search. This search will not showing loadingIndicator.\n * The rest props are the same as async search.\n * i.e.: creatable, groupBy, delay.\n **/\n onSearchSync?: (value: string) => Option[]\n onChange?: (options: Option[]) => void\n /** Limit the maximum number of selected options. */\n maxSelected?: number\n /** When the number of selected options exceeds the limit, the onMaxSelected will be called. */\n onMaxSelected?: (maxLimit: number) => void\n /** Hide the placeholder when there are options selected. */\n hidePlaceholderWhenSelected?: boolean\n disabled?: boolean\n /** Group the options base on provided key. */\n groupBy?: string\n className?: string\n badgeClassName?: string\n /**\n * First item selected is a default behavior by cmdk. That is why the default is true.\n * This is a workaround solution by add a dummy item.\n *\n * @reference: https://github.com/pacocoursey/cmdk/issues/171\n */\n selectFirstItem?: boolean\n /** Allow user to create option when there is no option matched. */\n creatable?: boolean\n /** Props of `Command` */\n commandProps?: React.ComponentPropsWithoutRef<typeof Command>\n /** Props of `CommandInput` */\n inputProps?: Omit<React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>, 'value' | 'placeholder' | 'disabled'>\n /** hide the clear all button. */\n hideClearAllButton?: boolean\n\n /** Add new item event for select with search */\n onAddNewItem?: () => void\n}\n\nexport interface MultipleSelectorRef {\n selectedValue: Option[]\n input: HTMLInputElement\n focus: () => void\n reset: () => void\n}\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport function useDebounce<T>(value: T, delay?: number): T {\n const [debouncedValue, setDebouncedValue] = React.useState<T>(value)\n\n React.useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay || 500)\n\n return () => {\n clearTimeout(timer)\n }\n }, [value, delay])\n\n return debouncedValue\n}\n\nfunction transToGroupOption(options: Option[], groupBy?: string) {\n if (options.length === 0) {\n return {}\n }\n if (!groupBy) {\n return {\n '': options,\n }\n }\n\n const groupOption: GroupOption = {}\n options.forEach((option) => {\n const key = (option[groupBy] as string) || ''\n if (!groupOption[key]) {\n groupOption[key] = []\n }\n groupOption[key].push(option)\n })\n return groupOption\n}\n\nfunction removePickedOption(groupOption: GroupOption, picked: Option[]) {\n const cloneOption = JSON.parse(JSON.stringify(groupOption)) as GroupOption\n\n for (const [key, value] of Object.entries(cloneOption)) {\n cloneOption[key] = value.filter((val) => !picked.find((p) => p.value === val.value))\n }\n return cloneOption\n}\n\nfunction isOptionsExist(groupOption: GroupOption, targetOption: Option[]) {\n for (const [, value] of Object.entries(groupOption)) {\n if (value.some((option) => targetOption.find((p) => p.value === option.value))) {\n return true\n }\n }\n return false\n}\n\n/**\n * The `CommandEmpty` of shadcn/ui will cause the cmdk empty not rendering correctly.\n * So we create one and copy the `Empty` implementation from `cmdk`.\n *\n * @reference: https://github.com/hsuanyi-chou/shadcn-ui-expansions/issues/34#issuecomment-1949561607\n **/\nconst CommandEmpty = React.forwardRef<HTMLDivElement, React.ComponentProps<typeof CommandPrimitive.Empty>>(({ className, ...props }, forwardedRef) => {\n const render = useCommandState((state) => state.filtered.count === 0)\n\n if (!render) return null\n\n return <div ref={forwardedRef} className={cn('px-2 py-4 text-center text-sm', className)} cmdk-empty=\"\" role=\"presentation\" {...props} />\n})\n\nCommandEmpty.displayName = 'CommandEmpty'\n\nexport const MultipleSelector = React.forwardRef<MultipleSelectorRef, MultipleSelectorProps>(\n (\n {\n value,\n onChange,\n placeholder,\n defaultOptions: arrayDefaultOptions = [],\n options: arrayOptions,\n delay,\n onSearch,\n onSearchSync,\n loadingIndicator: LoadingIndicator,\n emptyIndicator,\n maxSelected = Number.MAX_SAFE_INTEGER,\n onMaxSelected,\n hidePlaceholderWhenSelected,\n disabled,\n groupBy,\n className,\n badgeClassName,\n selectFirstItem = true,\n creatable = false,\n triggerSearchOnFocus = false,\n commandProps,\n inputProps,\n hideClearAllButton = false,\n onAddNewItem,\n }: MultipleSelectorProps,\n ref: React.Ref<MultipleSelectorRef>,\n ) => {\n const inputRef = React.useRef<HTMLInputElement>(null)\n const dropdownRef = React.useRef<HTMLDivElement>(null) // Added this\n\n const [open, setOpen] = React.useState(false)\n const [onScrollbar, setOnScrollbar] = React.useState(false)\n const [isLoading, setIsLoading] = React.useState(false)\n\n const [selected, setSelected] = React.useState<Option[]>(value || [])\n const [options, setOptions] = React.useState<GroupOption>(transToGroupOption(arrayDefaultOptions, groupBy))\n const [inputValue, setInputValue] = React.useState('')\n\n const debouncedSearchTerm = useDebounce(inputValue, delay || 500)\n\n React.useImperativeHandle(\n ref,\n () => ({\n selectedValue: [...selected],\n input: inputRef.current as HTMLInputElement,\n focus: () => inputRef?.current?.focus(),\n reset: () => setSelected([]),\n }),\n [selected],\n )\n\n const handleClickOutside = React.useCallback((event: MouseEvent | TouchEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node) && inputRef.current && !inputRef.current.contains(event.target as Node)) {\n setOpen(false)\n inputRef.current.blur()\n }\n }, [])\n\n const handleUnselect = React.useCallback(\n (option: Option) => {\n const newOptions = selected.filter((s) => s.value !== option.value)\n setSelected(newOptions)\n onChange?.(newOptions)\n },\n [onChange, selected],\n )\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n const input = inputRef.current\n if (!input) return\n\n if (e.key === 'Delete' || e.key === 'Backspace') {\n if (input.value === '' && selected.length > 0) {\n const lastSelectOption = selected[selected.length - 1]\n // If last item is fixed, we should not remove it.\n if (!lastSelectOption.fixed) {\n handleUnselect(selected[selected.length - 1])\n }\n }\n }\n\n // This is not a default behavior of the <input /> field\n if (e.key === 'Escape') {\n input.blur()\n }\n },\n [handleUnselect, selected],\n )\n\n React.useEffect(() => {\n if (open) {\n document.addEventListener('mousedown', handleClickOutside)\n document.addEventListener('touchend', handleClickOutside)\n } else {\n document.removeEventListener('mousedown', handleClickOutside)\n document.removeEventListener('touchend', handleClickOutside)\n }\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n document.removeEventListener('touchend', handleClickOutside)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open])\n\n React.useEffect(() => {\n if (value) {\n setSelected(value)\n }\n }, [value])\n\n React.useEffect(() => {\n /** If `onSearch` is provided, do not trigger options updated. */\n if (!arrayOptions || onSearch) {\n return\n }\n const newOption = transToGroupOption(arrayOptions || [], groupBy)\n if (JSON.stringify(newOption) !== JSON.stringify(options)) {\n setOptions(newOption)\n }\n }, [arrayDefaultOptions, arrayOptions, groupBy, onSearch, options])\n\n React.useEffect(() => {\n /** sync search */\n\n const doSearchSync = () => {\n const res = onSearchSync?.(debouncedSearchTerm)\n setOptions(transToGroupOption(res || [], groupBy))\n }\n\n const exec = async () => {\n if (!onSearchSync || !open) return\n\n if (triggerSearchOnFocus) {\n doSearchSync()\n }\n\n if (debouncedSearchTerm) {\n doSearchSync()\n }\n }\n\n void exec()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [debouncedSearchTerm, groupBy, open, triggerSearchOnFocus])\n\n React.useEffect(() => {\n /** async search */\n\n const doSearch = async () => {\n setIsLoading(true)\n const res = await onSearch?.(debouncedSearchTerm)\n setOptions(transToGroupOption(res || [], groupBy))\n setIsLoading(false)\n }\n\n const exec = async () => {\n if (!onSearch || !open) return\n\n if (triggerSearchOnFocus) {\n await doSearch()\n }\n\n if (debouncedSearchTerm) {\n await doSearch()\n }\n }\n\n void exec()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [debouncedSearchTerm, groupBy, open, triggerSearchOnFocus])\n\n const CreatableItem = () => {\n if (!creatable) return undefined\n if (isOptionsExist(options, [{ value: inputValue, label: inputValue }]) || selected.find((s) => s.value === inputValue)) {\n return undefined\n }\n\n const Item = (\n <CommandItem\n value={inputValue}\n className=\"cursor-pointer\"\n onMouseDown={(e) => {\n e.preventDefault()\n e.stopPropagation()\n }}\n onSelect={(value: string) => {\n if (selected.length >= maxSelected) {\n onMaxSelected?.(selected.length)\n return\n }\n setInputValue('')\n const newOptions = [...selected, { value, label: value }]\n setSelected(newOptions)\n onChange?.(newOptions)\n }}\n >\n {`Create \"${inputValue}\"`}\n </CommandItem>\n )\n\n // For normal creatable\n if (!onSearch && inputValue.length > 0) {\n return Item\n }\n\n // For async search creatable. avoid showing creatable item before loading at first.\n if (onSearch && debouncedSearchTerm.length > 0 && !isLoading) {\n return Item\n }\n\n return undefined\n }\n\n const EmptyItem = React.useCallback(() => {\n if (!emptyIndicator) return undefined\n\n // For async search that showing emptyIndicator\n if (onSearch && !creatable && Object.keys(options).length === 0) {\n return (\n <CommandItem value=\"-\" disabled>\n {emptyIndicator}\n </CommandItem>\n )\n }\n\n return <CommandEmpty>{emptyIndicator}</CommandEmpty>\n }, [creatable, emptyIndicator, onSearch, options])\n\n const selectables = React.useMemo<GroupOption>(() => removePickedOption(options, selected), [options, selected])\n\n /** Avoid Creatable Selector freezing or lagging when paste a long string. */\n const commandFilter = React.useCallback(() => {\n if (commandProps?.filter) {\n return commandProps.filter\n }\n\n if (creatable) {\n return (value: string, search: string) => {\n return value.toLowerCase().includes(search.toLowerCase()) ? 1 : -1\n }\n }\n // Using default filter in `cmdk`. We don‘t have to provide it.\n return undefined\n }, [creatable, commandProps?.filter])\n\n return (\n <Command\n ref={dropdownRef}\n {...commandProps}\n onKeyDown={(e) => {\n handleKeyDown(e)\n commandProps?.onKeyDown?.(e)\n }}\n className={cn('h-auto overflow-visible bg-transparent', commandProps?.className)}\n shouldFilter={commandProps?.shouldFilter !== undefined ? commandProps.shouldFilter : !onSearch} // When onSearch is provided, we don‘t want to filter the options. You can still override it.\n filter={commandFilter()}\n >\n <div\n className={cn(\n 'border-border-weak relative rounded-md border text-sm transition-shadow',\n 'focus-within:border-primary',\n 'focus-within:ring-primary-weak',\n 'focus-within:ring-4',\n 'focus-within:outline-hidden',\n 'has-disabled:bg-muted',\n 'has-disabled:text-muted-foreground',\n selected.length !== 0 && 'p-1',\n !disabled && selected.length !== 0 && 'cursor-text',\n !hideClearAllButton && 'pe-9',\n className,\n )}\n onClick={() => {\n if (disabled) return\n inputRef?.current?.focus()\n }}\n >\n <div className=\"flex flex-wrap gap-1\">\n {selected.map((option) => {\n return (\n <div\n key={option.value}\n className={cn(\n 'animate-fadeIn',\n 'bg-background',\n 'hover:bg-background',\n 'border-border-weak border border-solid',\n 'text-text-positive-weak relative inline-flex h-7 cursor-default items-center rounded-md ps-2 pe-7 pl-2 text-xs font-medium transition-all',\n 'disabled:cursor-not-allowed',\n 'disabled:opacity-50',\n 'data-fixed:pe-2',\n badgeClassName,\n )}\n data-fixed={option.fixed}\n data-disabled={disabled || undefined}\n >\n {option.label}\n <button\n type=\"button\"\n disabled={disabled || option.fixed}\n className={cn(\n 'text-text-positive-muted absolute -inset-y-px -end-px flex size-7 items-center justify-center rounded-e-lg border border-transparent p-0 outline-0 transition-colors',\n 'hover:text-foreground',\n 'focus-visible:outline',\n 'focus-visible:outline-2',\n 'focus-visible:outline-primary-weak',\n 'disabled:hover:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50',\n )}\n onKeyDown={(e) => {\n if (e.key !== 'Enter') return\n handleUnselect(option)\n }}\n onMouseDown={(e) => {\n e.preventDefault()\n e.stopPropagation()\n }}\n onClick={() => handleUnselect(option)}\n aria-label=\"Remove\"\n >\n <X size={14} strokeWidth={2} aria-hidden=\"true\" />\n </button>\n </div>\n )\n })}\n {/* Avoid having the \"Search\" Icon */}\n <CommandPrimitive.Input\n {...inputProps}\n ref={inputRef}\n value={inputValue}\n disabled={disabled}\n onValueChange={(value) => {\n setInputValue(value)\n inputProps?.onValueChange?.(value)\n }}\n onBlur={(event) => {\n if (!onScrollbar) {\n setOpen(false)\n }\n inputProps?.onBlur?.(event)\n }}\n onFocus={(event) => {\n setOpen(true)\n if (triggerSearchOnFocus) {\n onSearch?.(debouncedSearchTerm)\n }\n inputProps?.onFocus?.(event)\n }}\n placeholder={hidePlaceholderWhenSelected && selected.length !== 0 ? '' : placeholder}\n className={cn(\n 'placeholder:text-text-positive-muted flex-1 bg-transparent outline-hidden',\n 'disabled:placeholder:text-transparent',\n {\n 'w-full': hidePlaceholderWhenSelected,\n 'px-3 py-2': selected.length === 0,\n 'ml-1': selected.length !== 0,\n },\n inputProps?.className,\n )}\n />\n <button\n type=\"button\"\n onClick={() => {\n setSelected(selected.filter((s) => s.fixed))\n onChange?.(selected.filter((s) => s.fixed))\n }}\n className={cn(\n 'text-muted-foreground/80',\n 'absolute end-0 top-0 flex size-9 items-center justify-center rounded-lg border border-transparent transition-colors',\n 'focus-visible:outline-2',\n 'hover:text-text-positive',\n 'focus-visible:outline-primary-weak',\n (hideClearAllButton || disabled || selected.length < 1 || selected.filter(({ fixed }) => fixed).length === selected.length) && 'hidden',\n )}\n aria-label=\"Clear all\"\n >\n <X size={16} strokeWidth={2} aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n <div className=\"relative\">\n <div\n className={cn(\n 'shadow-dropdown absolute top-2 z-10 w-full overflow-hidden rounded-lg',\n 'data-[state=open]:animate-in',\n 'data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0',\n 'data-[state=open]:fade-in-0',\n 'data-[state=closed]:zoom-out-95',\n 'data-[state=open]:zoom-in-95',\n !open && 'hidden',\n )}\n data-state={open ? 'open' : 'closed'}\n >\n {open && (\n <CommandList\n className=\"shadow-lg outline-hidden\"\n onMouseLeave={() => {\n setOnScrollbar(false)\n }}\n onMouseEnter={() => {\n setOnScrollbar(true)\n }}\n onMouseUp={() => {\n inputRef?.current?.focus()\n }}\n >\n {onAddNewItem && (\n <>\n <CommandSeparator />\n <CommandGroup>\n <Button type=\"button\" variant=\"ghost\" className=\"w-full font-normal [&_div]:justify-start\" onClick={onAddNewItem}>\n <PlusIcon size={14} className=\"opacity-60\" aria-hidden=\"true\" />\n Thêm mới\n </Button>\n </CommandGroup>\n </>\n )}\n {isLoading ? (\n LoadingIndicator\n ) : (\n <React.Fragment>\n {EmptyItem()}\n {CreatableItem()}\n {!selectFirstItem && <CommandItem value=\"-\" className=\"hidden\" />}\n {Object.entries(selectables).map(([key, dropdowns]) => (\n <CommandGroup key={key} heading={key} className=\"h-full overflow-auto\">\n {dropdowns.map((option) => {\n return (\n <CommandItem\n key={option.value}\n value={option.value}\n disabled={option.disable}\n onMouseDown={(e) => {\n e.preventDefault()\n e.stopPropagation()\n }}\n onSelect={() => {\n if (selected.length >= maxSelected) {\n onMaxSelected?.(selected.length)\n return\n }\n const newOptions = [...selected, option]\n setInputValue('')\n setSelected(newOptions)\n onChange?.(newOptions)\n }}\n className={cn('cursor-pointer', option.disable && 'cursor-not-allowed opacity-50')}\n >\n {option.label}\n </CommandItem>\n )\n })}\n </CommandGroup>\n ))}\n </React.Fragment>\n )}\n </CommandList>\n )}\n </div>\n </div>\n </Command>\n )\n },\n)\n\nMultipleSelector.displayName = 'MultipleSelector'\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import e from"react";import{cn as t}from"@customafk/react-toolkit/utils";import{jsx as n}from"react/jsx-runtime";import{Progress as r}from"radix-ui";function i({className:e,value:i,...a}){return n(r.Root,{"data-slot":`progress`,className:t(`bg-primary-weak relative h-2 w-full overflow-hidden rounded-full`,e),...a,children:n(r.Indicator,{"data-slot":`progress-indicator`,className:`bg-primary size-full flex-1 transition-all`,style:{transform:`translateX(-${100-(i||0)}%)`}})})}export{i as Progress};
|
|
2
|
-
//# sourceMappingURL=progress-DPisovgi.js.map
|