@customafk/lunas-ui 0.2.44 → 0.2.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{alert-BbvPwf2x.mjs → alert-BzBDfGk2.js} +1 -1
- package/dist/alert-BzBDfGk2.js.map +1 -0
- package/dist/{alert-B02cVKWp.d.cts → alert-CNFuxKp7.d.cts} +6 -6
- package/dist/{alert-DHSm8bMn.d.mts → alert-EH6BsbAj.d.ts} +8 -8
- package/dist/{avatar-fltdRVsJ.mjs → avatar-Hpj8lmux.js} +1 -1
- package/dist/avatar-Hpj8lmux.js.map +1 -0
- package/dist/{badge-CDGBGq8X.mjs → badge-CRpRXSuO.js} +1 -1
- package/dist/badge-CRpRXSuO.js.map +1 -0
- package/dist/{badge-BxSbkHQL.d.mts → badge-Cca0AHjT.d.ts} +7 -7
- package/dist/{badge-zrAIDd-9.d.cts → badge-D0JnPurs.d.cts} +7 -7
- package/dist/{button-D3d7M90P.d.mts → button-Cr817M3U.d.cts} +6 -6
- package/dist/{button-D3QvCdr6.d.cts → button-DuZy_wDo.d.ts} +7 -7
- package/dist/button-LMMbL-uH.js +2 -0
- package/dist/button-LMMbL-uH.js.map +1 -0
- package/dist/{button.variants-DkMqWB8G.mjs → button.variants-CoSpd71B.js} +1 -1
- package/dist/button.variants-CoSpd71B.js.map +1 -0
- package/dist/calendar-DzPt7b6k.js +2 -0
- package/dist/calendar-DzPt7b6k.js.map +1 -0
- package/dist/cards/{grid-product-card.d.mts → grid-product-card.d.ts} +1 -1
- package/dist/cards/grid-product-card.js +2 -0
- package/dist/cards/grid-product-card.js.map +1 -0
- package/dist/cards/{product-card.d.mts → product-card.d.ts} +1 -1
- package/dist/cards/product-card.js +2 -0
- package/dist/cards/product-card.js.map +1 -0
- package/dist/cards/{simple-card.d.mts → simple-card.d.ts} +1 -1
- package/dist/cards/simple-card.js +2 -0
- package/dist/cards/simple-card.js.map +1 -0
- package/dist/{checkbox-Cat3i08X.mjs → checkbox-DLGDoU-1.js} +1 -1
- package/dist/checkbox-DLGDoU-1.js.map +1 -0
- package/dist/{close-_UHFeiLS.mjs → close-C0PdZGxr.js} +1 -1
- package/dist/close-C0PdZGxr.js.map +1 -0
- package/dist/cms-layout-tPwrgJZc.js +2 -0
- package/dist/cms-layout-tPwrgJZc.js.map +1 -0
- package/dist/command-2gUejA6g.js +2 -0
- package/dist/command-2gUejA6g.js.map +1 -0
- package/dist/data-display/{country.d.mts → country.d.ts} +2 -2
- package/dist/data-display/country.js +2 -0
- package/dist/data-display/country.js.map +1 -0
- package/dist/data-display/{data-list.d.mts → data-list.d.ts} +1 -1
- package/dist/data-display/{data-list.mjs → data-list.js} +1 -1
- package/dist/data-display/data-list.js.map +1 -0
- package/dist/data-display/{date-tooltip.d.mts → date-tooltip.d.ts} +1 -1
- package/dist/data-display/date-tooltip.js +2 -0
- package/dist/data-display/date-tooltip.js.map +1 -0
- package/dist/data-display/{date.d.mts → date.d.ts} +1 -1
- package/dist/data-display/date.js +1 -0
- package/dist/data-display/{empty.d.mts → empty.d.ts} +1 -1
- package/dist/data-display/{empty.mjs → empty.js} +1 -1
- package/dist/data-display/empty.js.map +1 -0
- package/dist/data-display/{name.d.mts → name.d.ts} +1 -1
- package/dist/data-display/name.js +2 -0
- package/dist/data-display/name.js.map +1 -0
- package/dist/data-display/{phone-number.d.mts → phone-number.d.ts} +1 -1
- package/dist/data-display/phone-number.js +2 -0
- package/dist/data-display/phone-number.js.map +1 -0
- package/dist/data-display/{role-badge.d.mts → role-badge.d.ts} +2 -2
- package/dist/data-display/role-badge.js +2 -0
- package/dist/data-display/role-badge.js.map +1 -0
- package/dist/data-display/statistic.d.cts +1 -1
- package/dist/data-display/{statistic.d.mts → statistic.d.ts} +7 -7
- package/dist/data-display/statistic.js +1 -0
- package/dist/data-display/{user.d.mts → user.d.ts} +1 -1
- package/dist/data-display/user.js +1 -0
- package/dist/{date-fY3sUcLp.mjs → date-BIqCFM1Z.js} +1 -1
- package/dist/date-BIqCFM1Z.js.map +1 -0
- package/dist/{dialog-Bd5cOZia.d.mts → dialog-C48T3MZN.d.cts} +12 -12
- package/dist/{dialog-DEmYNufN.d.cts → dialog-CQygxUtj.d.ts} +12 -12
- package/dist/dialog-CmutQ3rp.js +2 -0
- package/dist/dialog-CmutQ3rp.js.map +1 -0
- package/dist/dialogs/{confirm-dialog.d.mts → confirm-dialog.d.ts} +1 -1
- package/dist/dialogs/confirm-dialog.js +2 -0
- package/dist/dialogs/confirm-dialog.js.map +1 -0
- package/dist/dialogs/detail-dialog/components/sidebar.d.cts +27 -27
- package/dist/dialogs/detail-dialog/components/{sidebar.d.mts → sidebar.d.ts} +30 -30
- package/dist/dialogs/detail-dialog/components/sidebar.js +1 -0
- package/dist/dialogs/detail-dialog/{index.d.mts → index.d.ts} +1 -1
- package/dist/dialogs/detail-dialog/index.js +2 -0
- package/dist/dialogs/detail-dialog/index.js.map +1 -0
- package/dist/dialogs/{error-dialog.d.mts → error-dialog.d.ts} +1 -1
- package/dist/dialogs/error-dialog.js +2 -0
- package/dist/dialogs/error-dialog.js.map +1 -0
- package/dist/dialogs/{loading-dialog.d.mts → loading-dialog.d.ts} +1 -1
- package/dist/dialogs/loading-dialog.js +2 -0
- package/dist/dialogs/loading-dialog.js.map +1 -0
- package/dist/{dist-DVrfqn8H.mjs → dist-EPxjIRJp.js} +1 -1
- package/dist/dist-EPxjIRJp.js.map +1 -0
- package/dist/{drawer-CMD7JWH8.mjs → drawer-B3qXaN5p.js} +1 -1
- package/dist/drawer-B3qXaN5p.js.map +1 -0
- package/dist/{dropdown-menu-BWhiVsEf.mjs → dropdown-menu-DeHCVyby.js} +1 -1
- package/dist/dropdown-menu-DeHCVyby.js.map +1 -0
- package/dist/features/descriptions/index.d.cts +4 -4
- package/dist/features/descriptions/{index.d.mts → index.d.ts} +8 -8
- package/dist/features/descriptions/index.js +2 -0
- package/dist/features/descriptions/index.js.map +1 -0
- package/dist/features/search-modal/index.d.cts +2 -2
- package/dist/features/search-modal/{index.d.mts → index.d.ts} +3 -3
- package/dist/features/search-modal/index.js +1 -0
- package/dist/features/tables/index.d.cts +1 -1
- package/dist/features/tables/{index.d.mts → index.d.ts} +2 -2
- package/dist/features/tables/index.js +1 -0
- package/dist/features/tanstack-form/index.cjs +1 -1
- package/dist/features/tanstack-form/index.d.cts +2 -2
- package/dist/features/tanstack-form/index.d.ts +2 -0
- package/dist/features/tanstack-form/index.js +1 -0
- package/dist/features/text-editor/index.d.cts +1 -1
- package/dist/features/text-editor/{index.d.mts → index.d.ts} +1 -1
- package/dist/features/text-editor/index.js +1 -0
- package/dist/field-DpoKF1nY.js +2 -0
- package/dist/field-DpoKF1nY.js.map +1 -0
- package/dist/{flex-B6YSJzGe.mjs → flex-CinRrgEy.js} +1 -1
- package/dist/flex-CinRrgEy.js.map +1 -0
- package/dist/{heading-De4Pn3mZ.mjs → heading-Bz-hSatD.js} +1 -1
- package/dist/heading-Bz-hSatD.js.map +1 -0
- package/dist/image-BpTuF_1w.js +2 -0
- package/dist/image-BpTuF_1w.js.map +1 -0
- package/dist/{index-CiG1i12w.d.cts → index-Bc9X8pLk.d.cts} +7 -7
- package/dist/{index-Cm62M0Ft.d.mts → index-BlQGXGqt.d.ts} +1 -1
- package/dist/{index-DNozPoRR.d.mts → index-C1O2C-cg.d.ts} +7 -7
- package/dist/{index-BhiLHeUb.d.cts → index-CgH0tiiC.d.cts} +30 -30
- package/dist/{index-DSciiDhn.d.cts → index-D5u9CKyd.d.cts} +309 -950
- package/dist/{index-DriviV-i.d.mts → index-DFUF27Yy.d.ts} +31 -31
- package/dist/{index-Cl_7tlH_.d.mts → index-Ilj04YNO.d.ts} +309 -950
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +9 -9
- package/dist/index.d.ts +93 -0
- package/dist/index.js +1 -0
- package/dist/{input-BtuZm0BQ.d.mts → input-B_gst0eJ.d.cts} +7 -7
- package/dist/{input-CD4zf7t1.d.cts → input-BkHdaXGY.d.ts} +7 -7
- package/dist/{input-NJP2wQOm.mjs → input-DAfP6LZ7.js} +1 -1
- package/dist/input-DAfP6LZ7.js.map +1 -0
- package/dist/{label-CUCpwS5D.mjs → label-B8cAG2kc.js} +1 -1
- package/dist/label-B8cAG2kc.js.map +1 -0
- package/dist/layouts/cms-layout/index.d.ts +2 -0
- package/dist/layouts/cms-layout/index.js +1 -0
- package/dist/layouts/flex.d.cts +4 -4
- package/dist/layouts/{flex.d.mts → flex.d.ts} +5 -5
- package/dist/layouts/flex.js +1 -0
- package/dist/layouts/{grid.d.mts → grid.d.ts} +1 -1
- package/dist/layouts/{grid.mjs → grid.js} +1 -1
- package/dist/layouts/grid.js.map +1 -0
- package/dist/layouts/payment-layout/{index.d.mts → index.d.ts} +1 -1
- package/dist/layouts/payment-layout/index.js +1 -0
- package/dist/pages/FeatureDeveloping.d.cts +2 -2
- package/dist/pages/{FeatureDeveloping.d.mts → FeatureDeveloping.d.ts} +3 -3
- package/dist/pages/FeatureDeveloping.js +2 -0
- package/dist/pages/FeatureDeveloping.js.map +1 -0
- package/dist/pages/FeatureFixing.d.cts +2 -2
- package/dist/pages/{FeatureFixing.d.mts → FeatureFixing.d.ts} +3 -3
- package/dist/pages/FeatureFixing.js +2 -0
- package/dist/pages/FeatureFixing.js.map +1 -0
- package/dist/pages/LoginPage.d.cts +2 -2
- package/dist/pages/{LoginPage.d.mts → LoginPage.d.ts} +3 -3
- package/dist/pages/LoginPage.js +2 -0
- package/dist/pages/LoginPage.js.map +1 -0
- package/dist/pages/NotAuthorized.d.cts +2 -2
- package/dist/pages/{NotAuthorized.d.mts → NotAuthorized.d.ts} +3 -3
- package/dist/pages/NotAuthorized.js +2 -0
- package/dist/pages/NotAuthorized.js.map +1 -0
- package/dist/pages/NotFound.d.cts +2 -2
- package/dist/pages/{NotFound.d.mts → NotFound.d.ts} +3 -3
- package/dist/pages/NotFound.js +2 -0
- package/dist/pages/NotFound.js.map +1 -0
- package/dist/pages/RegisterPage.d.cts +2 -2
- package/dist/pages/{RegisterPage.d.mts → RegisterPage.d.ts} +3 -3
- package/dist/pages/RegisterPage.js +2 -0
- package/dist/pages/RegisterPage.js.map +1 -0
- package/dist/pages/VerifyEmailPage.d.cts +2 -2
- package/dist/pages/{VerifyEmailPage.d.mts → VerifyEmailPage.d.ts} +3 -3
- package/dist/pages/VerifyEmailPage.js +2 -0
- package/dist/pages/VerifyEmailPage.js.map +1 -0
- package/dist/{paragraph-DYLaQtTV.mjs → paragraph-Cc13ZI4d.js} +1 -1
- package/dist/paragraph-Cc13ZI4d.js.map +1 -0
- package/dist/payment-layout-giaGvs8T.js +2 -0
- package/dist/payment-layout-giaGvs8T.js.map +1 -0
- package/dist/popover-6233wU1s.js +2 -0
- package/dist/popover-6233wU1s.js.map +1 -0
- package/dist/{progress-CLeM0e7Z.mjs → progress-AYknlEgK.js} +1 -1
- package/dist/progress-AYknlEgK.js.map +1 -0
- package/dist/{radio-group-Y9bhdr55.mjs → radio-group-ImoBjpqZ.js} +1 -1
- package/dist/radio-group-ImoBjpqZ.js.map +1 -0
- package/dist/{resizable-CpCaSCFB.mjs → resizable-C-M-mu6b.js} +1 -1
- package/dist/resizable-C-M-mu6b.js.map +1 -0
- package/dist/search-modal-b2AE5WEW.js +2 -0
- package/dist/search-modal-b2AE5WEW.js.map +1 -0
- package/dist/{select-LlPCZFSF.mjs → select-CryLzZA0.js} +1 -1
- package/dist/select-CryLzZA0.js.map +1 -0
- package/dist/{separator-D3Gmkxzq.mjs → separator-BM8hA4DP.js} +1 -1
- package/dist/separator-BM8hA4DP.js.map +1 -0
- package/dist/{sheet-BFlIfNaA.mjs → sheet-DGXXYgWB.js} +1 -1
- package/dist/sheet-DGXXYgWB.js.map +1 -0
- package/dist/sidebar-BDrsbzo5.js +2 -0
- package/dist/sidebar-BDrsbzo5.js.map +1 -0
- package/dist/{skeleton-C51IdOfK.mjs → skeleton-DlRDNM97.js} +1 -1
- package/dist/skeleton-DlRDNM97.js.map +1 -0
- package/dist/{spinner-eClTgHjk.mjs → spinner-C1eamx3w.js} +1 -1
- package/dist/spinner-C1eamx3w.js.map +1 -0
- package/dist/{statistic-cwLwcukn.mjs → statistic-CYMqAYNc.js} +1 -1
- package/dist/statistic-CYMqAYNc.js.map +1 -0
- package/dist/{switch-BP7EPatj.mjs → switch-BLHmdRq2.js} +1 -1
- package/dist/switch-BLHmdRq2.js.map +1 -0
- package/dist/systems/{google.d.mts → google.d.ts} +1 -1
- package/dist/systems/{google.mjs → google.js} +1 -1
- package/dist/systems/google.js.map +1 -0
- package/dist/tables-DWQytYNm.js +4 -0
- package/dist/tables-DWQytYNm.js.map +1 -0
- package/dist/tanstack-form-CCDV-3Ml.js +12 -0
- package/dist/tanstack-form-CCDV-3Ml.js.map +1 -0
- package/dist/{tanstack-form-DatI41wz.cjs → tanstack-form-DoI86Ezs.cjs} +2 -2
- package/dist/{tanstack-form-DatI41wz.cjs.map → tanstack-form-DoI86Ezs.cjs.map} +1 -1
- package/dist/text-editor-WbS7pJJs.js +2 -0
- package/dist/text-editor-WbS7pJJs.js.map +1 -0
- package/dist/{textarea-7HDXcaK9.mjs → textarea-Bp6VvhiA.js} +1 -1
- package/dist/textarea-Bp6VvhiA.js.map +1 -0
- package/dist/{tooltip-Dxl5Wa8i.mjs → tooltip-CVIl6Hln.js} +1 -1
- package/dist/tooltip-CVIl6Hln.js.map +1 -0
- package/dist/{types-YLu40dXY.d.mts → types-BVSfF-1o.d.ts} +1 -1
- package/dist/{types-B5nyTWtO.mjs → types-BZqffRVJ.js} +1 -1
- package/dist/types-BZqffRVJ.js.map +1 -0
- package/dist/typography/paragraph.d.cts +5 -5
- package/dist/typography/{paragraph.d.mts → paragraph.d.ts} +6 -6
- package/dist/typography/paragraph.js +1 -0
- package/dist/typography/{title.d.mts → title.d.ts} +1 -1
- package/dist/typography/{title.mjs → title.js} +1 -1
- package/dist/typography/title.js.map +1 -0
- package/dist/ui/alert-dialog.d.cts +12 -12
- package/dist/ui/{alert-dialog.d.mts → alert-dialog.d.ts} +13 -13
- package/dist/ui/alert-dialog.js +2 -0
- package/dist/ui/alert-dialog.js.map +1 -0
- package/dist/ui/alert.d.cts +1 -1
- package/dist/ui/{alert.d.mts → alert.d.ts} +1 -1
- package/dist/ui/alert.js +1 -0
- package/dist/ui/aspect-ratio.d.cts +2 -2
- package/dist/ui/{aspect-ratio.d.mts → aspect-ratio.d.ts} +3 -3
- package/dist/ui/{aspect-ratio.mjs → aspect-ratio.js} +1 -1
- package/dist/ui/aspect-ratio.js.map +1 -0
- package/dist/ui/avatar.d.cts +4 -4
- package/dist/ui/{avatar.d.mts → avatar.d.ts} +5 -5
- package/dist/ui/avatar.js +1 -0
- package/dist/ui/badge.d.cts +1 -1
- package/dist/ui/badge.d.ts +2 -0
- package/dist/ui/badge.js +1 -0
- package/dist/ui/breadcrumb.d.cts +8 -8
- package/dist/ui/{breadcrumb.d.mts → breadcrumb.d.ts} +9 -9
- package/dist/ui/breadcrumb.js +2 -0
- package/dist/ui/breadcrumb.js.map +1 -0
- package/dist/ui/button-group.d.cts +6 -6
- package/dist/ui/{button-group.d.mts → button-group.d.ts} +8 -8
- package/dist/ui/button-group.js +2 -0
- package/dist/ui/button-group.js.map +1 -0
- package/dist/ui/button.d.cts +1 -1
- package/dist/ui/button.d.ts +2 -0
- package/dist/ui/button.js +1 -0
- package/dist/ui/buttons/{add-new.d.mts → add-new.d.ts} +1 -1
- package/dist/ui/buttons/add-new.js +2 -0
- package/dist/ui/buttons/add-new.js.map +1 -0
- package/dist/ui/buttons/{edit.d.mts → edit.d.ts} +1 -1
- package/dist/ui/buttons/edit.js +2 -0
- package/dist/ui/buttons/edit.js.map +1 -0
- package/dist/ui/buttons/{refresh.d.mts → refresh.d.ts} +1 -1
- package/dist/ui/buttons/refresh.js +2 -0
- package/dist/ui/buttons/refresh.js.map +1 -0
- package/dist/ui/buttons/{trash.d.mts → trash.d.ts} +1 -1
- package/dist/ui/buttons/trash.js +2 -0
- package/dist/ui/buttons/trash.js.map +1 -0
- package/dist/ui/buttons/{upload-image.d.mts → upload-image.d.ts} +1 -1
- package/dist/ui/buttons/upload-image.js +2 -0
- package/dist/ui/buttons/upload-image.js.map +1 -0
- package/dist/ui/calendar.d.cts +4 -4
- package/dist/ui/{calendar.d.mts → calendar.d.ts} +5 -5
- package/dist/ui/calendar.js +1 -0
- package/dist/ui/card.d.cts +8 -8
- package/dist/ui/{card.d.mts → card.d.ts} +9 -9
- package/dist/ui/card.js +2 -0
- package/dist/ui/card.js.map +1 -0
- package/dist/ui/carousel.d.cts +7 -7
- package/dist/ui/{carousel.d.mts → carousel.d.ts} +8 -8
- package/dist/ui/carousel.js +2 -0
- package/dist/ui/carousel.js.map +1 -0
- package/dist/ui/checkbox.d.cts +2 -2
- package/dist/ui/{checkbox.d.mts → checkbox.d.ts} +3 -3
- package/dist/ui/checkbox.js +1 -0
- package/dist/ui/collapsible.d.cts +4 -4
- package/dist/ui/{collapsible.d.mts → collapsible.d.ts} +5 -5
- package/dist/ui/{collapsible.mjs → collapsible.js} +1 -1
- package/dist/ui/collapsible.js.map +1 -0
- package/dist/ui/command.d.cts +11 -11
- package/dist/ui/{command.d.mts → command.d.ts} +12 -12
- package/dist/ui/command.js +1 -0
- package/dist/ui/context-menu.d.cts +16 -16
- package/dist/ui/{context-menu.d.mts → context-menu.d.ts} +17 -17
- package/dist/ui/{context-menu.mjs → context-menu.js} +1 -1
- package/dist/ui/context-menu.js.map +1 -0
- package/dist/ui/dialog.d.cts +1 -1
- package/dist/ui/{dialog.d.mts → dialog.d.ts} +1 -1
- package/dist/ui/dialog.js +1 -0
- package/dist/ui/drawer.d.cts +11 -11
- package/dist/ui/{drawer.d.mts → drawer.d.ts} +12 -12
- package/dist/ui/drawer.js +1 -0
- package/dist/ui/dropdown-menu.d.cts +16 -16
- package/dist/ui/{dropdown-menu.d.mts → dropdown-menu.d.ts} +17 -17
- package/dist/ui/dropdown-menu.js +1 -0
- package/dist/ui/empty.d.cts +9 -9
- package/dist/ui/{empty.d.mts → empty.d.ts} +10 -10
- package/dist/ui/{empty.mjs → empty.js} +1 -1
- package/dist/ui/empty.js.map +1 -0
- package/dist/ui/field.d.cts +23 -23
- package/dist/ui/field.d.ts +65 -0
- package/dist/ui/field.js +1 -0
- package/dist/ui/file-uploader.d.cts +2 -2
- package/dist/ui/{file-uploader.d.mts → file-uploader.d.ts} +3 -3
- package/dist/ui/file-uploader.js +3 -0
- package/dist/ui/file-uploader.js.map +1 -0
- package/dist/ui/form.d.cts +10 -10
- package/dist/ui/{form.d.mts → form.d.ts} +11 -11
- package/dist/ui/form.js +2 -0
- package/dist/ui/form.js.map +1 -0
- package/dist/ui/hover-card.d.cts +4 -4
- package/dist/ui/{hover-card.d.mts → hover-card.d.ts} +5 -5
- package/dist/ui/{hover-card.mjs → hover-card.js} +1 -1
- package/dist/ui/hover-card.js.map +1 -0
- package/dist/ui/{image.d.mts → image.d.ts} +1 -1
- package/dist/ui/image.js +1 -0
- package/dist/ui/input-otp.d.cts +5 -5
- package/dist/ui/{input-otp.d.mts → input-otp.d.ts} +6 -6
- package/dist/ui/{input-otp.mjs → input-otp.js} +1 -1
- package/dist/ui/input-otp.js.map +1 -0
- package/dist/ui/input.d.cts +1 -1
- package/dist/ui/input.d.ts +2 -0
- package/dist/ui/input.js +1 -0
- package/dist/ui/inputs/search-input.d.cts +3 -3
- package/dist/ui/inputs/{search-input.d.mts → search-input.d.ts} +4 -4
- package/dist/ui/inputs/search-input.js +2 -0
- package/dist/ui/inputs/search-input.js.map +1 -0
- package/dist/ui/item.d.cts +16 -16
- package/dist/ui/{item.d.mts → item.d.ts} +18 -18
- package/dist/ui/item.js +2 -0
- package/dist/ui/item.js.map +1 -0
- package/dist/ui/label.d.cts +2 -2
- package/dist/ui/{label.d.mts → label.d.ts} +3 -3
- package/dist/ui/label.js +1 -0
- package/dist/ui/menubar.d.cts +17 -17
- package/dist/ui/{menubar.d.mts → menubar.d.ts} +18 -18
- package/dist/ui/{menubar.mjs → menubar.js} +1 -1
- package/dist/ui/menubar.js.map +1 -0
- package/dist/ui/multi-select.d.cts +2 -2
- package/dist/ui/{multi-select.d.mts → multi-select.d.ts} +5 -5
- package/dist/ui/multi-select.js +2 -0
- package/dist/ui/multi-select.js.map +1 -0
- package/dist/ui/navigation-menu.d.cts +11 -11
- package/dist/ui/{navigation-menu.d.mts → navigation-menu.d.ts} +12 -12
- package/dist/ui/{navigation-menu.mjs → navigation-menu.js} +1 -1
- package/dist/ui/navigation-menu.js.map +1 -0
- package/dist/ui/pagination.d.cts +9 -9
- package/dist/ui/{pagination.d.mts → pagination.d.ts} +10 -10
- package/dist/ui/pagination.js +2 -0
- package/dist/ui/pagination.js.map +1 -0
- package/dist/ui/popover.d.cts +6 -6
- package/dist/ui/{popover.d.mts → popover.d.ts} +7 -7
- package/dist/ui/popover.js +1 -0
- package/dist/ui/progress.d.cts +2 -2
- package/dist/ui/{progress.d.mts → progress.d.ts} +3 -3
- package/dist/ui/progress.js +1 -0
- package/dist/ui/radio-group.d.cts +3 -3
- package/dist/ui/{radio-group.d.mts → radio-group.d.ts} +4 -4
- package/dist/ui/radio-group.js +1 -0
- package/dist/ui/resizable.d.cts +9 -9
- package/dist/ui/{resizable.d.mts → resizable.d.ts} +10 -10
- package/dist/ui/resizable.js +1 -0
- package/dist/ui/scroll-area.d.cts +5 -5
- package/dist/ui/{scroll-area.d.mts → scroll-area.d.ts} +6 -6
- package/dist/ui/{scroll-area.mjs → scroll-area.js} +1 -1
- package/dist/ui/scroll-area.js.map +1 -0
- package/dist/ui/select.d.cts +9 -9
- package/dist/ui/{select.d.mts → select.d.ts} +10 -10
- package/dist/ui/select.js +1 -0
- package/dist/ui/separator.d.cts +2 -2
- package/dist/ui/{separator.d.mts → separator.d.ts} +3 -3
- package/dist/ui/separator.js +1 -0
- package/dist/ui/sheet.d.cts +9 -9
- package/dist/ui/{sheet.d.mts → sheet.d.ts} +10 -10
- package/dist/ui/sheet.js +1 -0
- package/dist/ui/skeleton.d.cts +2 -2
- package/dist/ui/{skeleton.d.mts → skeleton.d.ts} +3 -3
- package/dist/ui/skeleton.js +1 -0
- package/dist/ui/slider.d.cts +2 -2
- package/dist/ui/{slider.d.mts → slider.d.ts} +3 -3
- package/dist/ui/{slider.mjs → slider.js} +1 -1
- package/dist/ui/slider.js.map +1 -0
- package/dist/ui/sonner.d.cts +2 -2
- package/dist/ui/{sonner.d.mts → sonner.d.ts} +3 -3
- package/dist/ui/{sonner.mjs → sonner.js} +1 -1
- package/dist/ui/sonner.js.map +1 -0
- package/dist/ui/spinner.d.cts +2 -2
- package/dist/ui/{spinner.d.mts → spinner.d.ts} +3 -3
- package/dist/ui/spinner.js +1 -0
- package/dist/ui/switch.d.cts +2 -2
- package/dist/ui/{switch.d.mts → switch.d.ts} +3 -3
- package/dist/ui/switch.js +1 -0
- package/dist/ui/table.d.cts +17 -17
- package/dist/ui/{table.d.mts → table.d.ts} +18 -18
- package/dist/ui/{table.mjs → table.js} +1 -1
- package/dist/ui/table.js.map +1 -0
- package/dist/ui/tabs.d.cts +5 -5
- package/dist/ui/{tabs.d.mts → tabs.d.ts} +6 -6
- package/dist/ui/{tabs.mjs → tabs.js} +1 -1
- package/dist/ui/tabs.js.map +1 -0
- package/dist/ui/textarea.d.cts +2 -2
- package/dist/ui/{textarea.d.mts → textarea.d.ts} +3 -3
- package/dist/ui/textarea.js +1 -0
- package/dist/ui/toggle-group.d.cts +3 -3
- package/dist/ui/{toggle-group.d.mts → toggle-group.d.ts} +5 -5
- package/dist/ui/toggle-group.js +2 -0
- package/dist/ui/toggle-group.js.map +1 -0
- package/dist/ui/toggle.d.cts +5 -5
- package/dist/ui/{toggle.d.mts → toggle.d.ts} +4 -4
- package/dist/ui/{toggle.mjs → toggle.js} +1 -1
- package/dist/ui/toggle.js.map +1 -0
- package/dist/ui/tooltip.d.cts +5 -5
- package/dist/ui/{tooltip.d.mts → tooltip.d.ts} +6 -6
- package/dist/ui/tooltip.js +1 -0
- package/dist/user-BSpgswEC.js +2 -0
- package/dist/user-BSpgswEC.js.map +1 -0
- package/package.json +97 -97
- package/dist/alert-BbvPwf2x.mjs.map +0 -1
- package/dist/avatar-fltdRVsJ.mjs.map +0 -1
- package/dist/badge-CDGBGq8X.mjs.map +0 -1
- package/dist/button-CCVJTHBI.mjs +0 -2
- package/dist/button-CCVJTHBI.mjs.map +0 -1
- package/dist/button.variants-DkMqWB8G.mjs.map +0 -1
- package/dist/calendar-R866yyd1.mjs +0 -2
- package/dist/calendar-R866yyd1.mjs.map +0 -1
- package/dist/cards/grid-product-card.mjs +0 -2
- package/dist/cards/grid-product-card.mjs.map +0 -1
- package/dist/cards/product-card.mjs +0 -2
- package/dist/cards/product-card.mjs.map +0 -1
- package/dist/cards/simple-card.mjs +0 -2
- package/dist/cards/simple-card.mjs.map +0 -1
- package/dist/checkbox-Cat3i08X.mjs.map +0 -1
- package/dist/close-_UHFeiLS.mjs.map +0 -1
- package/dist/cms-layout-DkCR1AfG.mjs +0 -2
- package/dist/cms-layout-DkCR1AfG.mjs.map +0 -1
- package/dist/command-D6_CSbwJ.mjs +0 -2
- package/dist/command-D6_CSbwJ.mjs.map +0 -1
- package/dist/data-display/country.mjs +0 -2
- package/dist/data-display/country.mjs.map +0 -1
- package/dist/data-display/data-list.mjs.map +0 -1
- package/dist/data-display/date-tooltip.mjs +0 -2
- package/dist/data-display/date-tooltip.mjs.map +0 -1
- package/dist/data-display/date.mjs +0 -1
- package/dist/data-display/empty.mjs.map +0 -1
- package/dist/data-display/name.mjs +0 -2
- package/dist/data-display/name.mjs.map +0 -1
- package/dist/data-display/phone-number.mjs +0 -2
- package/dist/data-display/phone-number.mjs.map +0 -1
- package/dist/data-display/role-badge.mjs +0 -2
- package/dist/data-display/role-badge.mjs.map +0 -1
- package/dist/data-display/statistic.mjs +0 -1
- package/dist/data-display/user.mjs +0 -1
- package/dist/date-fY3sUcLp.mjs.map +0 -1
- package/dist/dialog-CLDnvNH_.mjs +0 -2
- package/dist/dialog-CLDnvNH_.mjs.map +0 -1
- package/dist/dialogs/confirm-dialog.mjs +0 -2
- package/dist/dialogs/confirm-dialog.mjs.map +0 -1
- package/dist/dialogs/detail-dialog/components/sidebar.mjs +0 -1
- package/dist/dialogs/detail-dialog/index.mjs +0 -2
- package/dist/dialogs/detail-dialog/index.mjs.map +0 -1
- package/dist/dialogs/error-dialog.mjs +0 -2
- package/dist/dialogs/error-dialog.mjs.map +0 -1
- package/dist/dialogs/loading-dialog.mjs +0 -2
- package/dist/dialogs/loading-dialog.mjs.map +0 -1
- package/dist/dist-DVrfqn8H.mjs.map +0 -1
- package/dist/drawer-CMD7JWH8.mjs.map +0 -1
- package/dist/dropdown-menu-BWhiVsEf.mjs.map +0 -1
- package/dist/features/descriptions/index.mjs +0 -2
- package/dist/features/descriptions/index.mjs.map +0 -1
- package/dist/features/search-modal/index.mjs +0 -1
- package/dist/features/tables/index.mjs +0 -1
- package/dist/features/tanstack-form/index.d.mts +0 -2
- package/dist/features/tanstack-form/index.mjs +0 -1
- package/dist/features/text-editor/index.mjs +0 -1
- package/dist/field-dYemS0hQ.mjs +0 -2
- package/dist/field-dYemS0hQ.mjs.map +0 -1
- package/dist/flex-B6YSJzGe.mjs.map +0 -1
- package/dist/heading-De4Pn3mZ.mjs.map +0 -1
- package/dist/image-D7OZ13Ib.mjs +0 -2
- package/dist/image-D7OZ13Ib.mjs.map +0 -1
- package/dist/index.d.mts +0 -93
- package/dist/index.mjs +0 -1
- package/dist/input-NJP2wQOm.mjs.map +0 -1
- package/dist/label-CUCpwS5D.mjs.map +0 -1
- package/dist/layouts/cms-layout/index.d.mts +0 -2
- package/dist/layouts/cms-layout/index.mjs +0 -1
- package/dist/layouts/flex.mjs +0 -1
- package/dist/layouts/grid.mjs.map +0 -1
- package/dist/layouts/payment-layout/index.mjs +0 -1
- package/dist/pages/FeatureDeveloping.mjs +0 -2
- package/dist/pages/FeatureDeveloping.mjs.map +0 -1
- package/dist/pages/FeatureFixing.mjs +0 -2
- package/dist/pages/FeatureFixing.mjs.map +0 -1
- package/dist/pages/LoginPage.mjs +0 -2
- package/dist/pages/LoginPage.mjs.map +0 -1
- package/dist/pages/NotAuthorized.mjs +0 -2
- package/dist/pages/NotAuthorized.mjs.map +0 -1
- package/dist/pages/NotFound.mjs +0 -2
- package/dist/pages/NotFound.mjs.map +0 -1
- package/dist/pages/RegisterPage.mjs +0 -2
- package/dist/pages/RegisterPage.mjs.map +0 -1
- package/dist/pages/VerifyEmailPage.mjs +0 -2
- package/dist/pages/VerifyEmailPage.mjs.map +0 -1
- package/dist/paragraph-DYLaQtTV.mjs.map +0 -1
- package/dist/payment-layout-DrQ0kZPX.mjs +0 -2
- package/dist/payment-layout-DrQ0kZPX.mjs.map +0 -1
- package/dist/popover-C8rcemA3.mjs +0 -2
- package/dist/popover-C8rcemA3.mjs.map +0 -1
- package/dist/progress-CLeM0e7Z.mjs.map +0 -1
- package/dist/radio-group-Y9bhdr55.mjs.map +0 -1
- package/dist/resizable-CpCaSCFB.mjs.map +0 -1
- package/dist/search-modal-Bn-GOOCy.mjs +0 -2
- package/dist/search-modal-Bn-GOOCy.mjs.map +0 -1
- package/dist/select-LlPCZFSF.mjs.map +0 -1
- package/dist/separator-D3Gmkxzq.mjs.map +0 -1
- package/dist/sheet-BFlIfNaA.mjs.map +0 -1
- package/dist/sidebar-ChtCyu-n.mjs +0 -2
- package/dist/sidebar-ChtCyu-n.mjs.map +0 -1
- package/dist/skeleton-C51IdOfK.mjs.map +0 -1
- package/dist/spinner-eClTgHjk.mjs.map +0 -1
- package/dist/statistic-cwLwcukn.mjs.map +0 -1
- package/dist/switch-BP7EPatj.mjs.map +0 -1
- package/dist/systems/google.mjs.map +0 -1
- package/dist/tables-CFrsk2lM.mjs +0 -4
- package/dist/tables-CFrsk2lM.mjs.map +0 -1
- package/dist/tanstack-form-DT1TqIDl.mjs +0 -12
- package/dist/tanstack-form-DT1TqIDl.mjs.map +0 -1
- package/dist/text-editor-5mA7XyaI.mjs +0 -2
- package/dist/text-editor-5mA7XyaI.mjs.map +0 -1
- package/dist/textarea-7HDXcaK9.mjs.map +0 -1
- package/dist/tooltip-Dxl5Wa8i.mjs.map +0 -1
- package/dist/types-B5nyTWtO.mjs.map +0 -1
- package/dist/typography/paragraph.mjs +0 -1
- package/dist/typography/title.mjs.map +0 -1
- package/dist/ui/alert-dialog.mjs +0 -2
- package/dist/ui/alert-dialog.mjs.map +0 -1
- package/dist/ui/alert.mjs +0 -1
- package/dist/ui/aspect-ratio.mjs.map +0 -1
- package/dist/ui/avatar.mjs +0 -1
- package/dist/ui/badge.d.mts +0 -2
- package/dist/ui/badge.mjs +0 -1
- package/dist/ui/breadcrumb.mjs +0 -2
- package/dist/ui/breadcrumb.mjs.map +0 -1
- package/dist/ui/button-group.mjs +0 -2
- package/dist/ui/button-group.mjs.map +0 -1
- package/dist/ui/button.d.mts +0 -2
- package/dist/ui/button.mjs +0 -1
- package/dist/ui/buttons/add-new.mjs +0 -2
- package/dist/ui/buttons/add-new.mjs.map +0 -1
- package/dist/ui/buttons/edit.mjs +0 -2
- package/dist/ui/buttons/edit.mjs.map +0 -1
- package/dist/ui/buttons/refresh.mjs +0 -2
- package/dist/ui/buttons/refresh.mjs.map +0 -1
- package/dist/ui/buttons/trash.mjs +0 -2
- package/dist/ui/buttons/trash.mjs.map +0 -1
- package/dist/ui/buttons/upload-image.mjs +0 -2
- package/dist/ui/buttons/upload-image.mjs.map +0 -1
- package/dist/ui/calendar.mjs +0 -1
- package/dist/ui/card.mjs +0 -2
- package/dist/ui/card.mjs.map +0 -1
- package/dist/ui/carousel.mjs +0 -2
- package/dist/ui/carousel.mjs.map +0 -1
- package/dist/ui/checkbox.mjs +0 -1
- package/dist/ui/collapsible.mjs.map +0 -1
- package/dist/ui/command.mjs +0 -1
- package/dist/ui/context-menu.mjs.map +0 -1
- package/dist/ui/dialog.mjs +0 -1
- package/dist/ui/drawer.mjs +0 -1
- package/dist/ui/dropdown-menu.mjs +0 -1
- package/dist/ui/empty.mjs.map +0 -1
- package/dist/ui/field.d.mts +0 -65
- package/dist/ui/field.mjs +0 -1
- package/dist/ui/file-uploader.mjs +0 -3
- package/dist/ui/file-uploader.mjs.map +0 -1
- package/dist/ui/form.mjs +0 -2
- package/dist/ui/form.mjs.map +0 -1
- package/dist/ui/hover-card.mjs.map +0 -1
- package/dist/ui/image.mjs +0 -1
- package/dist/ui/input-otp.mjs.map +0 -1
- package/dist/ui/input.d.mts +0 -2
- package/dist/ui/input.mjs +0 -1
- package/dist/ui/inputs/search-input.mjs +0 -2
- package/dist/ui/inputs/search-input.mjs.map +0 -1
- package/dist/ui/item.mjs +0 -2
- package/dist/ui/item.mjs.map +0 -1
- package/dist/ui/label.mjs +0 -1
- package/dist/ui/menubar.mjs.map +0 -1
- package/dist/ui/multi-select.mjs +0 -2
- package/dist/ui/multi-select.mjs.map +0 -1
- package/dist/ui/navigation-menu.mjs.map +0 -1
- package/dist/ui/pagination.mjs +0 -2
- package/dist/ui/pagination.mjs.map +0 -1
- package/dist/ui/popover.mjs +0 -1
- package/dist/ui/progress.mjs +0 -1
- package/dist/ui/radio-group.mjs +0 -1
- package/dist/ui/resizable.mjs +0 -1
- package/dist/ui/scroll-area.mjs.map +0 -1
- package/dist/ui/select.mjs +0 -1
- package/dist/ui/separator.mjs +0 -1
- package/dist/ui/sheet.mjs +0 -1
- package/dist/ui/skeleton.mjs +0 -1
- package/dist/ui/slider.mjs.map +0 -1
- package/dist/ui/sonner.mjs.map +0 -1
- package/dist/ui/spinner.mjs +0 -1
- package/dist/ui/switch.mjs +0 -1
- package/dist/ui/table.mjs.map +0 -1
- package/dist/ui/tabs.mjs.map +0 -1
- package/dist/ui/textarea.mjs +0 -1
- package/dist/ui/toggle-group.mjs +0 -2
- package/dist/ui/toggle-group.mjs.map +0 -1
- package/dist/ui/toggle.mjs.map +0 -1
- package/dist/ui/tooltip.mjs +0 -1
- package/dist/user-DtZy4P9d.mjs +0 -2
- package/dist/user-DtZy4P9d.mjs.map +0 -1
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import"../button.variants-DkMqWB8G.mjs";import{t as e}from"../button-CCVJTHBI.mjs";import{Wrench as t}from"lucide-react";import{cn as n}from"@customafk/react-toolkit/utils";import{jsx as r,jsxs as i}from"react/jsx-runtime";const a=({title:a=`Tính năng đang bảo trì`,subtitle:o=`Chúng tôi đang khắc phục vấn đề với tính năng này. Vui lòng quay lại sau.`,buttonText:s=`Quay lại`,onButtonClick:c=()=>window.history.back(),className:l,iconClassName:u})=>i(`div`,{className:n(`flex flex-col items-center justify-center min-h-[50vh] gap-4 sm:gap-6 py-8 sm:py-10 px-4 text-center w-full`,l),children:[i(`div`,{className:`flex flex-col items-center gap-2`,children:[r(t,{className:n(`size-16 sm:size-24 text-orange-500`,u)}),r(`div`,{className:`text-3xl sm:text-5xl font-bold text-orange-500`})]}),r(`h1`,{className:`text-xl sm:text-2xl font-semibold mt-2`,children:a}),r(`p`,{className:`text-muted-foreground max-w-md text-sm sm:text-base`,children:o}),r(e,{onClick:c,variant:`default`,className:`mt-2`,size:`sm`,children:s})]});var o=a;export{a as FeatureFixing,o as default};
|
|
2
|
-
//# sourceMappingURL=FeatureFixing.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FeatureFixing.mjs","names":[],"sources":["../../packages/components/pages/FeatureFixing.tsx"],"sourcesContent":["import { Button } from '../ui/button';\nimport { cn } from '@customafk/react-toolkit/utils';\nimport { Wrench } from 'lucide-react';\n\nexport interface FeatureFixingProps {\n /** Main heading shown beneath the wrench icon. Defaults to `'Tính năng đang bảo trì'`. */\n title?: string;\n /** Supporting text shown below the title. Defaults to a Vietnamese maintenance message. */\n subtitle?: string;\n /** Label for the action button. Defaults to `'Quay lại'`. */\n buttonText?: string;\n /** Handler called when the action button is clicked. Defaults to `window.history.back()`. */\n onButtonClick?: () => void;\n /** Additional class names applied to the root container element. */\n className?: string;\n /** Additional class names applied to the `Wrench` icon. */\n iconClassName?: string;\n}\n\n/**\n * Full-page placeholder displayed when a feature is temporarily unavailable due to maintenance or bug fixes.\n *\n * @example\n * ```tsx\n * import { FeatureFixing } from '@customafk/lunas-ui/pages/FeatureFixing';\n *\n * <FeatureFixing\n * title=\"Under Maintenance\"\n * subtitle=\"We are fixing an issue. Please check back later.\"\n * buttonText=\"Go Back\"\n * onButtonClick={() => router.back()}\n * />\n * ```\n */\nexport const FeatureFixing = ({\n title = 'Tính năng đang bảo trì',\n subtitle = 'Chúng tôi đang khắc phục vấn đề với tính năng này. Vui lòng quay lại sau.',\n buttonText = 'Quay lại',\n onButtonClick = () => window.history.back(),\n className,\n iconClassName,\n}: FeatureFixingProps) => {\n return (\n <div className={cn('flex flex-col items-center justify-center min-h-[50vh] gap-4 sm:gap-6 py-8 sm:py-10 px-4 text-center w-full', className)}>\n <div className=\"flex flex-col items-center gap-2\">\n <Wrench className={cn('size-16 sm:size-24 text-orange-500', iconClassName)} />\n <div className=\"text-3xl sm:text-5xl font-bold text-orange-500\">{/* This text indicates the feature is being fixed */}</div>\n </div>\n\n <h1 className=\"text-xl sm:text-2xl font-semibold mt-2\">{title}</h1>\n\n <p className=\"text-muted-foreground max-w-md text-sm sm:text-base\">{subtitle}</p>\n\n <Button onClick={onButtonClick} variant=\"default\" className=\"mt-2\" size=\"sm\">\n {buttonText}\n </Button>\n </div>\n );\n};\n\nexport default FeatureFixing;\n"],"mappings":"+NAkCA,MAAa,GAAiB,CAC5B,QAAQ,yBACR,WAAW,4EACX,aAAa,WACb,oBAAsB,OAAO,QAAQ,MAAM,CAC3C,YACA,mBAGE,EAAC,MAAA,CAAI,UAAW,EAAG,8GAA+G,EAAU,WAC1I,EAAC,MAAA,CAAI,UAAU,6CACb,EAAC,EAAA,CAAO,UAAW,EAAG,qCAAsC,EAAc,CAAA,CAAI,CAC9E,EAAC,MAAA,CAAI,UAAU,iDAAA,CAA6G,CAAA,EACxH,CAEN,EAAC,KAAA,CAAG,UAAU,kDAA0C,GAAW,CAEnE,EAAC,IAAA,CAAE,UAAU,+DAAuD,GAAa,CAEjF,EAAC,EAAA,CAAO,QAAS,EAAe,QAAQ,UAAU,UAAU,OAAO,KAAK,cACrE,GACM,GACL,CAIV,IAAA,EAAe"}
|
package/dist/pages/LoginPage.mjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use client";import"../button.variants-DkMqWB8G.mjs";import{t as e}from"../button-CCVJTHBI.mjs";import"../heading-De4Pn3mZ.mjs";import"../paragraph-DYLaQtTV.mjs";import"../close-_UHFeiLS.mjs";import{i as t,l as n,o as r,r as i,t as a}from"../dialog-CLDnvNH_.mjs";import{t as o}from"../input-NJP2wQOm.mjs";import{t as s}from"../label-CUCpwS5D.mjs";import{n as c,t as l}from"../alert-BbvPwf2x.mjs";import{Eye as u,EyeOff as d}from"lucide-react";import{useId as f,useState as p}from"react";import{jsx as m,jsxs as h}from"react/jsx-runtime";import{z as g}from"zod";const _=g.object({email:g.string().min(1,`Vui lòng nhập email`).email(`Email không hợp lệ`),password:g.string().min(1,`Vui lòng nhập mật khẩu`)}),v=({open:g,onOpenChange:v,onLogin:y,onForgotPassword:b,onRegister:x,isLoading:S=!1,errorMessage:C,title:w=`Đăng nhập`,subtitle:T=`Nhập thông tin để tiếp tục`})=>{let E=f(),D=f(),[O,k]=p(``),[A,j]=p(``),[M,N]=p(!1),[P,F]=p({});return m(a,{open:g,onOpenChange:v,children:h(i,{className:`max-sm:data-[state=open]:slide-in-from-bottom max-sm:data-[state=open]:zoom-in-100 max-sm:data-[state=closed]:slide-out-to-bottom max-sm:data-[state=closed]:zoom-out-100 max-sm:top-auto max-sm:right-0 max-sm:bottom-0 max-sm:left-0 max-sm:max-w-full max-sm:translate-x-0 max-sm:translate-y-0 max-sm:rounded-b-none sm:max-w-sm`,children:[h(r,{children:[m(n,{children:w}),m(t,{children:T})]}),h(`form`,{onSubmit:async e=>{e.preventDefault();let t=_.safeParse({email:O,password:A});if(!t.success){let e=t.error.flatten().fieldErrors;F({email:e.email?.[0],password:e.password?.[0]});return}F({}),await y(O,A)},noValidate:!0,className:`flex flex-col gap-4`,children:[C&&m(l,{variant:`destructive`,children:m(c,{children:C})}),h(`div`,{className:`flex flex-col gap-1.5`,children:[m(s,{htmlFor:E,children:`Email`}),m(o,{id:E,type:`email`,autoComplete:`email`,placeholder:`you@example.com`,value:O,onChange:e=>k(e.target.value),"aria-invalid":!!P.email,disabled:S}),P.email&&m(`p`,{className:`text-destructive text-xs`,children:P.email})]}),h(`div`,{className:`flex flex-col gap-1.5`,children:[h(`div`,{className:`flex items-center justify-between`,children:[m(s,{htmlFor:D,children:`Mật khẩu`}),b&&m(e,{type:`button`,variant:`link`,size:`sm`,className:`h-auto p-0 text-xs`,onClick:b,children:`Quên mật khẩu?`})]}),h(`div`,{className:`relative`,children:[m(o,{id:D,type:M?`text`:`password`,autoComplete:`current-password`,placeholder:`••••••••`,value:A,onChange:e=>j(e.target.value),"aria-invalid":!!P.password,disabled:S,className:`pr-10`}),m(`button`,{type:`button`,className:`absolute inset-y-0 right-0 flex items-center px-3 text-muted-foreground hover:text-foreground`,onMouseDown:e=>{e.preventDefault(),N(e=>!e)},"aria-label":M?`Ẩn mật khẩu`:`Hiện mật khẩu`,children:m(M?d:u,{size:16})})]}),P.password&&m(`p`,{className:`text-destructive text-xs`,children:P.password})]}),m(e,{type:`submit`,isLoading:S,className:`w-full`,children:`Đăng nhập`}),m(e,{type:`button`,variant:`outline`,className:`w-full`,disabled:S,onClick:()=>v(!1),children:`Đóng hộp thoại`})]}),x&&h(`div`,{className:`flex justify-center gap-1 text-muted-foreground text-sm`,children:[m(`span`,{children:`Chưa có tài khoản?`}),m(e,{variant:`link`,size:`sm`,className:`h-auto p-0`,onClick:x,children:`Đăng ký`})]})]})})};export{v as LoginPage};
|
|
2
|
-
//# sourceMappingURL=LoginPage.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LoginPage.mjs","names":[],"sources":["../../packages/components/pages/LoginPage.tsx"],"sourcesContent":["'use client';\n\nimport { useId, useState } from 'react';\n\nimport { Eye, EyeOff } from 'lucide-react';\nimport { z } from 'zod';\n\nimport { Alert, AlertDescription } from '../ui/alert';\nimport { Button } from '../ui/button';\nimport { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '../ui/dialog';\nimport { Input } from '../ui/input';\nimport { Label } from '../ui/label';\n\nexport interface LoginPageProps {\n /** Controls whether the dialog is open */\n open: boolean;\n /** Called when the dialog open state changes */\n onOpenChange: (open: boolean) => void;\n /** Called when the user submits login credentials */\n onLogin: (email: string, password: string) => Promise<void> | void;\n /** Called when the \"Quên mật khẩu?\" link is clicked */\n onForgotPassword?: () => void;\n /** Called when the \"Đăng ký\" link is clicked */\n onRegister?: () => void;\n /** Disables the form and shows a spinner on the submit button */\n isLoading?: boolean;\n /** Server-side error message rendered in a destructive Alert */\n errorMessage?: string;\n /** Dialog heading. Default: \"Đăng nhập\" */\n title?: string;\n /** Dialog subheading. Default: \"Nhập thông tin để tiếp tục\" */\n subtitle?: string;\n}\n\nconst loginSchema = z.object({\n email: z.string().min(1, 'Vui lòng nhập email').email('Email không hợp lệ'),\n password: z.string().min(1, 'Vui lòng nhập mật khẩu'),\n});\n\n/**\n * Modal login dialog for the client authentication flow.\n *\n * @example\n * ```tsx\n * import { LoginPage } from '@customafk/lunas-ui/pages/LoginPage';\n *\n * <LoginPage\n * open={open}\n * onOpenChange={setOpen}\n * onLogin={async (email, password) => {\n * await authService.login(email, password);\n * setOpen(false);\n * }}\n * onRegister={() => { setOpen(false); setRegisterOpen(true); }}\n * />\n * ```\n */\nexport const LoginPage = ({\n open,\n onOpenChange,\n onLogin,\n onForgotPassword,\n onRegister,\n isLoading = false,\n errorMessage,\n title = 'Đăng nhập',\n subtitle = 'Nhập thông tin để tiếp tục',\n}: LoginPageProps) => {\n const emailId = useId();\n const passwordId = useId();\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [showPassword, setShowPassword] = useState(false);\n const [fieldErrors, setFieldErrors] = useState<{ email?: string; password?: string }>({});\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n const result = loginSchema.safeParse({ email, password });\n if (!result.success) {\n const errors = result.error.flatten().fieldErrors;\n setFieldErrors({ email: errors.email?.[0], password: errors.password?.[0] });\n return;\n }\n setFieldErrors({});\n await onLogin(email, password);\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-sm:data-[state=open]:slide-in-from-bottom max-sm:data-[state=open]:zoom-in-100 max-sm:data-[state=closed]:slide-out-to-bottom max-sm:data-[state=closed]:zoom-out-100 max-sm:top-auto max-sm:right-0 max-sm:bottom-0 max-sm:left-0 max-sm:max-w-full max-sm:translate-x-0 max-sm:translate-y-0 max-sm:rounded-b-none sm:max-w-sm\">\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{subtitle}</DialogDescription>\n </DialogHeader>\n\n <form onSubmit={handleSubmit} noValidate className=\"flex flex-col gap-4\">\n {errorMessage && (\n <Alert variant=\"destructive\">\n <AlertDescription>{errorMessage}</AlertDescription>\n </Alert>\n )}\n\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor={emailId}>Email</Label>\n <Input\n id={emailId}\n type=\"email\"\n autoComplete=\"email\"\n placeholder=\"you@example.com\"\n value={email}\n onChange={e => setEmail(e.target.value)}\n aria-invalid={!!fieldErrors.email}\n disabled={isLoading}\n />\n {fieldErrors.email && <p className=\"text-destructive text-xs\">{fieldErrors.email}</p>}\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex items-center justify-between\">\n <Label htmlFor={passwordId}>Mật khẩu</Label>\n {onForgotPassword && (\n <Button type=\"button\" variant=\"link\" size=\"sm\" className=\"h-auto p-0 text-xs\" onClick={onForgotPassword}>\n Quên mật khẩu?\n </Button>\n )}\n </div>\n <div className=\"relative\">\n <Input\n id={passwordId}\n type={showPassword ? 'text' : 'password'}\n autoComplete=\"current-password\"\n placeholder=\"••••••••\"\n value={password}\n onChange={e => setPassword(e.target.value)}\n aria-invalid={!!fieldErrors.password}\n disabled={isLoading}\n className=\"pr-10\"\n />\n <button\n type=\"button\"\n className=\"absolute inset-y-0 right-0 flex items-center px-3 text-muted-foreground hover:text-foreground\"\n onMouseDown={e => {\n e.preventDefault();\n setShowPassword(v => !v);\n }}\n aria-label={showPassword ? 'Ẩn mật khẩu' : 'Hiện mật khẩu'}\n >\n {showPassword ? <EyeOff size={16} /> : <Eye size={16} />}\n </button>\n </div>\n {fieldErrors.password && <p className=\"text-destructive text-xs\">{fieldErrors.password}</p>}\n </div>\n\n <Button type=\"submit\" isLoading={isLoading} className=\"w-full\">\n Đăng nhập\n </Button>\n <Button type=\"button\" variant=\"outline\" className=\"w-full\" disabled={isLoading} onClick={() => onOpenChange(false)}>\n Đóng hộp thoại\n </Button>\n </form>\n\n {onRegister && (\n <div className=\"flex justify-center gap-1 text-muted-foreground text-sm\">\n <span>Chưa có tài khoản?</span>\n <Button variant=\"link\" size=\"sm\" className=\"h-auto p-0\" onClick={onRegister}>\n Đăng ký\n </Button>\n </div>\n )}\n </DialogContent>\n </Dialog>\n );\n};\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import"../button.variants-DkMqWB8G.mjs";import{t as e}from"../button-CCVJTHBI.mjs";import{ShieldAlert as t}from"lucide-react";import{cn as n}from"@customafk/react-toolkit/utils";import{jsx as r,jsxs as i}from"react/jsx-runtime";const a=({title:a=`Quyền truy cập bị từ chối`,subtitle:o=`Xin lỗi, bạn không có quyền truy cập vào trang này.`,buttonText:s=`Quay lại`,onButtonClick:c=()=>window.history.back(),className:l,iconClassName:u})=>i(`div`,{className:n(`flex flex-col items-center justify-center min-h-[50vh] gap-4 sm:gap-6 py-8 sm:py-10 px-4 text-center w-full`,l),children:[i(`div`,{className:`flex flex-col items-center gap-2`,children:[r(t,{className:n(`size-16 sm:size-24 text-primary`,u)}),r(`div`,{className:`text-4xl sm:text-6xl font-bold text-primary`,children:`403`})]}),r(`h1`,{className:`text-xl sm:text-2xl font-semibold mt-2`,children:a}),r(`p`,{className:`text-muted-foreground max-w-md text-sm sm:text-base`,children:o}),r(e,{onClick:c,variant:`default`,className:`mt-2`,size:`sm`,children:s})]});var o=a;export{a as NotAuthorized,o as default};
|
|
2
|
-
//# sourceMappingURL=NotAuthorized.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"NotAuthorized.mjs","names":[],"sources":["../../packages/components/pages/NotAuthorized.tsx"],"sourcesContent":["import { Button } from '../ui/button';\nimport { cn } from '@customafk/react-toolkit/utils';\nimport { ShieldAlert } from 'lucide-react';\n\nexport interface NotAuthorizedProps {\n /** Main heading shown beneath the shield icon. Defaults to `'Quyền truy cập bị từ chối'`. */\n title?: string;\n /** Supporting text shown below the title. Defaults to a Vietnamese access-denied message. */\n subtitle?: string;\n /** Label for the action button. Defaults to `'Quay lại'`. */\n buttonText?: string;\n /** Handler called when the action button is clicked. Defaults to `window.history.back()`. */\n onButtonClick?: () => void;\n /** Additional class names applied to the root container element. */\n className?: string;\n /** Additional class names applied to the `ShieldAlert` icon. */\n iconClassName?: string;\n}\n\n/**\n * Full-page 403 error screen shown when the current user lacks permission to access a resource.\n *\n * @example\n * ```tsx\n * import { NotAuthorized } from '@customafk/lunas-ui/pages/NotAuthorized';\n *\n * <NotAuthorized\n * title=\"Access Denied\"\n * subtitle=\"You do not have permission to view this page.\"\n * buttonText=\"Go Back\"\n * onButtonClick={() => router.push('/')}\n * />\n * ```\n */\nexport const NotAuthorized = ({\n title = 'Quyền truy cập bị từ chối',\n subtitle = 'Xin lỗi, bạn không có quyền truy cập vào trang này.',\n buttonText = 'Quay lại',\n onButtonClick = () => window.history.back(),\n className,\n iconClassName,\n}: NotAuthorizedProps) => {\n return (\n <div className={cn('flex flex-col items-center justify-center min-h-[50vh] gap-4 sm:gap-6 py-8 sm:py-10 px-4 text-center w-full', className)}>\n <div className=\"flex flex-col items-center gap-2\">\n <ShieldAlert className={cn('size-16 sm:size-24 text-primary', iconClassName)} />\n <div className=\"text-4xl sm:text-6xl font-bold text-primary\">403</div>\n </div>\n\n <h1 className=\"text-xl sm:text-2xl font-semibold mt-2\">{title}</h1>\n\n <p className=\"text-muted-foreground max-w-md text-sm sm:text-base\">{subtitle}</p>\n\n <Button onClick={onButtonClick} variant=\"default\" className=\"mt-2\" size=\"sm\">\n {buttonText}\n </Button>\n </div>\n );\n};\n\nexport default NotAuthorized;\n"],"mappings":"oOAkCA,MAAa,GAAiB,CAC5B,QAAQ,4BACR,WAAW,sDACX,aAAa,WACb,oBAAsB,OAAO,QAAQ,MAAM,CAC3C,YACA,mBAGE,EAAC,MAAA,CAAI,UAAW,EAAG,8GAA+G,EAAU,WAC1I,EAAC,MAAA,CAAI,UAAU,6CACb,EAAC,EAAA,CAAY,UAAW,EAAG,kCAAmC,EAAc,CAAA,CAAI,CAChF,EAAC,MAAA,CAAI,UAAU,uDAA8C,OAAS,CAAA,EAClE,CAEN,EAAC,KAAA,CAAG,UAAU,kDAA0C,GAAW,CAEnE,EAAC,IAAA,CAAE,UAAU,+DAAuD,GAAa,CAEjF,EAAC,EAAA,CAAO,QAAS,EAAe,QAAQ,UAAU,UAAU,OAAO,KAAK,cACrE,GACM,GACL,CAIV,IAAA,EAAe"}
|
package/dist/pages/NotFound.mjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import"../button.variants-DkMqWB8G.mjs";import{t as e}from"../button-CCVJTHBI.mjs";import{FileQuestion as t}from"lucide-react";import{cn as n}from"@customafk/react-toolkit/utils";import{jsx as r,jsxs as i}from"react/jsx-runtime";const a=({title:a=`Không tìm thấy trang`,subtitle:o=`Xin lỗi, trang bạn đang tìm kiếm không tồn tại hoặc đã bị di chuyển.`,buttonText:s=`Trở về trang chủ`,onButtonClick:c=()=>window.history.back(),className:l,iconClassName:u})=>i(`div`,{className:n(`flex flex-col items-center justify-center min-h-[50vh] gap-4 sm:gap-6 py-8 sm:py-10 px-4 text-center w-full`,l),children:[i(`div`,{className:`flex flex-col items-center gap-2`,children:[r(t,{className:n(`size-16 sm:size-24 text-primary`,u)}),r(`div`,{className:`text-4xl sm:text-6xl font-bold text-primary`,children:`404`})]}),r(`h1`,{className:`text-xl sm:text-2xl font-semibold mt-2`,children:a}),r(`p`,{className:`text-muted-foreground max-w-md text-sm sm:text-base`,children:o}),r(e,{onClick:c,variant:`default`,className:`mt-2`,size:`sm`,children:s})]});var o=a;export{a as NotFound,o as default};
|
|
2
|
-
//# sourceMappingURL=NotFound.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"NotFound.mjs","names":[],"sources":["../../packages/components/pages/NotFound.tsx"],"sourcesContent":["import { Button } from '../ui/button';\nimport { cn } from '@customafk/react-toolkit/utils';\nimport { FileQuestion } from 'lucide-react';\n\nexport interface NotFoundProps {\n /** Main heading shown beneath the file-question icon. Defaults to `'Không tìm thấy trang'`. */\n title?: string;\n /** Supporting text shown below the title. Defaults to a Vietnamese 404 message. */\n subtitle?: string;\n /** Label for the action button. Defaults to `'Trở về trang chủ'`. */\n buttonText?: string;\n /** Handler called when the action button is clicked. Defaults to `window.history.back()`. */\n onButtonClick?: () => void;\n /** Additional class names applied to the root container element. */\n className?: string;\n /** Additional class names applied to the `FileQuestion` icon. */\n iconClassName?: string;\n}\n\n/**\n * Full-page 404 error screen displayed when a requested route or resource does not exist.\n *\n * @example\n * ```tsx\n * import { NotFound } from '@customafk/lunas-ui/pages/NotFound';\n *\n * <NotFound\n * title=\"Page Not Found\"\n * subtitle=\"The page you are looking for does not exist.\"\n * buttonText=\"Go Home\"\n * onButtonClick={() => router.push('/')}\n * />\n * ```\n */\nexport const NotFound = ({\n title = 'Không tìm thấy trang',\n subtitle = 'Xin lỗi, trang bạn đang tìm kiếm không tồn tại hoặc đã bị di chuyển.',\n buttonText = 'Trở về trang chủ',\n onButtonClick = () => window.history.back(),\n className,\n iconClassName,\n}: NotFoundProps) => {\n return (\n <div className={cn('flex flex-col items-center justify-center min-h-[50vh] gap-4 sm:gap-6 py-8 sm:py-10 px-4 text-center w-full', className)}>\n <div className=\"flex flex-col items-center gap-2\">\n <FileQuestion className={cn('size-16 sm:size-24 text-primary', iconClassName)} />\n <div className=\"text-4xl sm:text-6xl font-bold text-primary\">404</div>\n </div>\n\n <h1 className=\"text-xl sm:text-2xl font-semibold mt-2\">{title}</h1>\n\n <p className=\"text-muted-foreground max-w-md text-sm sm:text-base\">{subtitle}</p>\n\n <Button onClick={onButtonClick} variant=\"default\" className=\"mt-2\" size=\"sm\">\n {buttonText}\n </Button>\n </div>\n );\n};\n\nexport default NotFound;\n"],"mappings":"qOAkCA,MAAa,GAAY,CACvB,QAAQ,uBACR,WAAW,uEACX,aAAa,mBACb,oBAAsB,OAAO,QAAQ,MAAM,CAC3C,YACA,mBAGE,EAAC,MAAA,CAAI,UAAW,EAAG,8GAA+G,EAAU,WAC1I,EAAC,MAAA,CAAI,UAAU,6CACb,EAAC,EAAA,CAAa,UAAW,EAAG,kCAAmC,EAAc,CAAA,CAAI,CACjF,EAAC,MAAA,CAAI,UAAU,uDAA8C,OAAS,CAAA,EAClE,CAEN,EAAC,KAAA,CAAG,UAAU,kDAA0C,GAAW,CAEnE,EAAC,IAAA,CAAE,UAAU,+DAAuD,GAAa,CAEjF,EAAC,EAAA,CAAO,QAAS,EAAe,QAAQ,UAAU,UAAU,OAAO,KAAK,cACrE,GACM,GACL,CAIV,IAAA,EAAe"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use client";import"../button.variants-DkMqWB8G.mjs";import{t as e}from"../button-CCVJTHBI.mjs";import"../heading-De4Pn3mZ.mjs";import"../paragraph-DYLaQtTV.mjs";import"../close-_UHFeiLS.mjs";import{i as t,l as n,o as r,r as i,t as a}from"../dialog-CLDnvNH_.mjs";import{t as o}from"../input-NJP2wQOm.mjs";import{t as s}from"../label-CUCpwS5D.mjs";import{n as c,t as l}from"../alert-BbvPwf2x.mjs";import{Eye as u,EyeOff as d}from"lucide-react";import{useId as f,useState as p}from"react";import{jsx as m,jsxs as h}from"react/jsx-runtime";import{z as g}from"zod";const _=g.object({email:g.string().min(1,`Vui lòng nhập email`).email(`Email không hợp lệ`),password:g.string().min(8,`Mật khẩu phải có ít nhất 8 ký tự`).max(50,`Mật khẩu không được vượt quá 50 ký tự`).regex(/[A-Z]/,`Phải có ít nhất một chữ hoa`).regex(/[a-z]/,`Phải có ít nhất một chữ thường`).regex(/[0-9]/,`Phải có ít nhất một chữ số`).regex(/[^A-Za-z0-9]/,`Phải có ít nhất một ký tự đặc biệt`),confirmPassword:g.string().min(1,`Vui lòng xác nhận mật khẩu`)}).refine(e=>e.password===e.confirmPassword,{message:`Mật khẩu xác nhận không khớp`,path:[`confirmPassword`]}),v=({open:g,onOpenChange:v,onRegister:y,onLogin:b,isLoading:x=!1,errorMessage:S,title:C=`Đăng ký`,subtitle:w=`Tạo tài khoản mới để bắt đầu`})=>{let T=f(),E=f(),D=f(),[O,k]=p(``),[A,j]=p(``),[M,N]=p(``),[P,F]=p(!1),[I,L]=p(!1),[R,z]=p({});return m(a,{open:g,onOpenChange:v,children:h(i,{className:`max-sm:data-[state=open]:slide-in-from-bottom max-sm:data-[state=open]:zoom-in-100 max-sm:data-[state=closed]:slide-out-to-bottom max-sm:data-[state=closed]:zoom-out-100 max-sm:top-auto max-sm:right-0 max-sm:bottom-0 max-sm:left-0 max-sm:max-w-full max-sm:translate-x-0 max-sm:translate-y-0 max-sm:rounded-b-none sm:max-w-sm`,children:[h(r,{children:[m(n,{children:C}),m(t,{children:w})]}),h(`form`,{onSubmit:async e=>{e.preventDefault();let t=_.safeParse({email:O,password:A,confirmPassword:M});if(!t.success){let e=t.error.flatten().fieldErrors;z({email:e.email?.[0],password:e.password?.[0],confirmPassword:e.confirmPassword?.[0]});return}z({}),await y(O,A)},noValidate:!0,className:`flex flex-col gap-4`,children:[S&&m(l,{variant:`destructive`,children:m(c,{children:S})}),h(`div`,{className:`flex flex-col gap-1.5`,children:[m(s,{htmlFor:T,children:`Email`}),m(o,{id:T,type:`email`,autoComplete:`email`,placeholder:`you@example.com`,value:O,onChange:e=>k(e.target.value),"aria-invalid":!!R.email,disabled:x}),R.email&&m(`p`,{className:`text-destructive text-xs`,children:R.email})]}),h(`div`,{className:`flex flex-col gap-1.5`,children:[m(s,{htmlFor:E,children:`Mật khẩu`}),h(`div`,{className:`relative`,children:[m(o,{id:E,type:P?`text`:`password`,autoComplete:`new-password`,placeholder:`••••••••`,value:A,onChange:e=>j(e.target.value),"aria-invalid":!!R.password,disabled:x,className:`pr-10`}),m(`button`,{type:`button`,className:`absolute inset-y-0 right-0 flex items-center px-3 text-muted-foreground hover:text-foreground`,onMouseDown:e=>{e.preventDefault(),F(e=>!e)},"aria-label":P?`Ẩn mật khẩu`:`Hiện mật khẩu`,children:m(P?d:u,{size:16})})]}),R.password?m(`p`,{className:`text-destructive text-xs`,children:R.password}):m(`p`,{className:`text-muted-foreground text-xs`,children:`Tối thiểu 8 ký tự, bao gồm chữ hoa, chữ thường, số và ký tự đặc biệt.`})]}),h(`div`,{className:`flex flex-col gap-1.5`,children:[m(s,{htmlFor:D,children:`Xác nhận mật khẩu`}),h(`div`,{className:`relative`,children:[m(o,{id:D,type:I?`text`:`password`,autoComplete:`new-password`,placeholder:`••••••••`,value:M,onChange:e=>N(e.target.value),"aria-invalid":!!R.confirmPassword,disabled:x,className:`pr-10`}),m(`button`,{type:`button`,className:`absolute inset-y-0 right-0 flex items-center px-3 text-muted-foreground hover:text-foreground`,onMouseDown:e=>{e.preventDefault(),L(e=>!e)},"aria-label":I?`Ẩn mật khẩu`:`Hiện mật khẩu`,children:m(I?d:u,{size:16})})]}),R.confirmPassword&&m(`p`,{className:`text-destructive text-xs`,children:R.confirmPassword})]}),m(e,{type:`submit`,isLoading:x,className:`w-full`,children:`Đăng ký`}),m(e,{type:`button`,variant:`outline`,className:`w-full`,disabled:x,onClick:()=>v(!1),children:`Đóng hộp thoại`})]}),b&&h(`div`,{className:`flex justify-center gap-1 text-muted-foreground text-sm`,children:[m(`span`,{children:`Đã có tài khoản?`}),m(e,{variant:`link`,size:`sm`,className:`h-auto p-0`,onClick:b,children:`Đăng nhập`})]})]})})};export{v as RegisterPage};
|
|
2
|
-
//# sourceMappingURL=RegisterPage.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RegisterPage.mjs","names":[],"sources":["../../packages/components/pages/RegisterPage.tsx"],"sourcesContent":["'use client';\n\nimport { useId, useState } from 'react';\n\nimport { Eye, EyeOff } from 'lucide-react';\nimport { z } from 'zod';\n\nimport { Alert, AlertDescription } from '../ui/alert';\nimport { Button } from '../ui/button';\nimport { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '../ui/dialog';\nimport { Input } from '../ui/input';\nimport { Label } from '../ui/label';\n\nexport interface RegisterPageProps {\n /** Controls whether the dialog is open */\n open: boolean;\n /** Called when the dialog open state changes */\n onOpenChange: (open: boolean) => void;\n /** Called when the user submits registration credentials */\n onRegister: (email: string, password: string) => Promise<void> | void;\n /** Called when the \"Đăng nhập\" link is clicked */\n onLogin?: () => void;\n /** Disables the form and shows a spinner on the submit button */\n isLoading?: boolean;\n /** Server-side error message rendered in a destructive Alert */\n errorMessage?: string;\n /** Dialog heading. Default: \"Đăng ký\" */\n title?: string;\n /** Dialog subheading. Default: \"Tạo tài khoản mới để bắt đầu\" */\n subtitle?: string;\n}\n\nconst registerSchema = z\n .object({\n email: z.string().min(1, 'Vui lòng nhập email').email('Email không hợp lệ'),\n password: z\n .string()\n .min(8, 'Mật khẩu phải có ít nhất 8 ký tự')\n .max(50, 'Mật khẩu không được vượt quá 50 ký tự')\n .regex(/[A-Z]/, 'Phải có ít nhất một chữ hoa')\n .regex(/[a-z]/, 'Phải có ít nhất một chữ thường')\n .regex(/[0-9]/, 'Phải có ít nhất một chữ số')\n .regex(/[^A-Za-z0-9]/, 'Phải có ít nhất một ký tự đặc biệt'),\n confirmPassword: z.string().min(1, 'Vui lòng xác nhận mật khẩu'),\n })\n .refine(data => data.password === data.confirmPassword, {\n message: 'Mật khẩu xác nhận không khớp',\n path: ['confirmPassword'],\n });\n\n/**\n * Modal registration dialog for the client authentication flow.\n *\n * @example\n * ```tsx\n * import { RegisterPage } from '@customafk/lunas-ui/pages/RegisterPage';\n *\n * <RegisterPage\n * open={open}\n * onOpenChange={setOpen}\n * onRegister={async (email, password) => {\n * await authService.register(email, password);\n * setOpen(false);\n * }}\n * onLogin={() => { setOpen(false); setLoginOpen(true); }}\n * />\n * ```\n */\nexport const RegisterPage = ({\n open,\n onOpenChange,\n onRegister,\n onLogin,\n isLoading = false,\n errorMessage,\n title = 'Đăng ký',\n subtitle = 'Tạo tài khoản mới để bắt đầu',\n}: RegisterPageProps) => {\n const emailId = useId();\n const passwordId = useId();\n const confirmPasswordId = useId();\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [confirmPassword, setConfirmPassword] = useState('');\n const [showPassword, setShowPassword] = useState(false);\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\n const [fieldErrors, setFieldErrors] = useState<{\n email?: string;\n password?: string;\n confirmPassword?: string;\n }>({});\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n const result = registerSchema.safeParse({ email, password, confirmPassword });\n if (!result.success) {\n const errors = result.error.flatten().fieldErrors;\n setFieldErrors({\n email: errors.email?.[0],\n password: errors.password?.[0],\n confirmPassword: errors.confirmPassword?.[0],\n });\n return;\n }\n setFieldErrors({});\n await onRegister(email, password);\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-sm:data-[state=open]:slide-in-from-bottom max-sm:data-[state=open]:zoom-in-100 max-sm:data-[state=closed]:slide-out-to-bottom max-sm:data-[state=closed]:zoom-out-100 max-sm:top-auto max-sm:right-0 max-sm:bottom-0 max-sm:left-0 max-sm:max-w-full max-sm:translate-x-0 max-sm:translate-y-0 max-sm:rounded-b-none sm:max-w-sm\">\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{subtitle}</DialogDescription>\n </DialogHeader>\n\n <form onSubmit={handleSubmit} noValidate className=\"flex flex-col gap-4\">\n {errorMessage && (\n <Alert variant=\"destructive\">\n <AlertDescription>{errorMessage}</AlertDescription>\n </Alert>\n )}\n\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor={emailId}>Email</Label>\n <Input\n id={emailId}\n type=\"email\"\n autoComplete=\"email\"\n placeholder=\"you@example.com\"\n value={email}\n onChange={e => setEmail(e.target.value)}\n aria-invalid={!!fieldErrors.email}\n disabled={isLoading}\n />\n {fieldErrors.email && <p className=\"text-destructive text-xs\">{fieldErrors.email}</p>}\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor={passwordId}>Mật khẩu</Label>\n <div className=\"relative\">\n <Input\n id={passwordId}\n type={showPassword ? 'text' : 'password'}\n autoComplete=\"new-password\"\n placeholder=\"••••••••\"\n value={password}\n onChange={e => setPassword(e.target.value)}\n aria-invalid={!!fieldErrors.password}\n disabled={isLoading}\n className=\"pr-10\"\n />\n <button\n type=\"button\"\n className=\"absolute inset-y-0 right-0 flex items-center px-3 text-muted-foreground hover:text-foreground\"\n onMouseDown={e => {\n e.preventDefault();\n setShowPassword(v => !v);\n }}\n aria-label={showPassword ? 'Ẩn mật khẩu' : 'Hiện mật khẩu'}\n >\n {showPassword ? <EyeOff size={16} /> : <Eye size={16} />}\n </button>\n </div>\n {fieldErrors.password ? (\n <p className=\"text-destructive text-xs\">{fieldErrors.password}</p>\n ) : (\n <p className=\"text-muted-foreground text-xs\">Tối thiểu 8 ký tự, bao gồm chữ hoa, chữ thường, số và ký tự đặc biệt.</p>\n )}\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor={confirmPasswordId}>Xác nhận mật khẩu</Label>\n <div className=\"relative\">\n <Input\n id={confirmPasswordId}\n type={showConfirmPassword ? 'text' : 'password'}\n autoComplete=\"new-password\"\n placeholder=\"••••••••\"\n value={confirmPassword}\n onChange={e => setConfirmPassword(e.target.value)}\n aria-invalid={!!fieldErrors.confirmPassword}\n disabled={isLoading}\n className=\"pr-10\"\n />\n <button\n type=\"button\"\n className=\"absolute inset-y-0 right-0 flex items-center px-3 text-muted-foreground hover:text-foreground\"\n onMouseDown={e => {\n e.preventDefault();\n setShowConfirmPassword(v => !v);\n }}\n aria-label={showConfirmPassword ? 'Ẩn mật khẩu' : 'Hiện mật khẩu'}\n >\n {showConfirmPassword ? <EyeOff size={16} /> : <Eye size={16} />}\n </button>\n </div>\n {fieldErrors.confirmPassword && <p className=\"text-destructive text-xs\">{fieldErrors.confirmPassword}</p>}\n </div>\n\n <Button type=\"submit\" isLoading={isLoading} className=\"w-full\">\n Đăng ký\n </Button>\n <Button type=\"button\" variant=\"outline\" className=\"w-full\" disabled={isLoading} onClick={() => onOpenChange(false)}>\n Đóng hộp thoại\n </Button>\n </form>\n\n {onLogin && (\n <div className=\"flex justify-center gap-1 text-muted-foreground text-sm\">\n <span>Đã có tài khoản?</span>\n <Button variant=\"link\" size=\"sm\" className=\"h-auto p-0\" onClick={onLogin}>\n Đăng nhập\n </Button>\n </div>\n )}\n </DialogContent>\n </Dialog>\n );\n};\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use client";import"../button.variants-DkMqWB8G.mjs";import{t as e}from"../button-CCVJTHBI.mjs";import"../heading-De4Pn3mZ.mjs";import"../paragraph-DYLaQtTV.mjs";import"../close-_UHFeiLS.mjs";import{i as t,l as n,o as r,r as i,t as a}from"../dialog-CLDnvNH_.mjs";import{n as o,t as s}from"../alert-BbvPwf2x.mjs";import{InputOTP as c,InputOTPGroup as l,InputOTPSeparator as u,InputOTPSlot as d}from"../ui/input-otp.mjs";import{useCallback as f,useEffect as p,useRef as m,useState as h}from"react";import{Fragment as g,jsx as _,jsxs as v}from"react/jsx-runtime";const y=({open:y,onOpenChange:b,email:x,onVerify:S,onResend:C,onBack:w,isLoading:T=!1,errorMessage:E,title:D=`Xác thực email`,subtitle:O,resendCooldownSeconds:k=60})=>{let[A,j]=h(``),[M,N]=h(k),P=m(null),F=f(e=>{P.current&&clearInterval(P.current),N(e),P.current=setInterval(()=>{N(e=>e<=1?(P.current&&clearInterval(P.current),0):e-1)},1e3)},[]);p(()=>(y&&k>0&&F(k),()=>{P.current&&clearInterval(P.current)}),[y,k,F]);let I=f(async()=>{F(k),await C(x)},[x,C,k,F]),L=f(async()=>{A.length<6||await S(x,A)},[x,A,S]);return _(a,{open:y,onOpenChange:b,children:v(i,{className:`max-sm:data-[state=open]:slide-in-from-bottom max-sm:data-[state=open]:zoom-in-100 max-sm:data-[state=closed]:slide-out-to-bottom max-sm:data-[state=closed]:zoom-out-100 max-sm:top-auto max-sm:right-0 max-sm:bottom-0 max-sm:left-0 max-sm:max-w-full max-sm:translate-x-0 max-sm:translate-y-0 max-sm:rounded-b-none sm:max-w-sm`,children:[v(r,{children:[_(n,{children:D}),_(t,{children:O??v(g,{children:[`Nhập mã OTP đã được gửi tới `,_(`span`,{className:`font-medium text-foreground`,children:x}),`. Mã có hiệu lực trong 10 phút.`]})})]}),v(`div`,{className:`flex flex-col items-center gap-4`,children:[E&&_(s,{variant:`destructive`,className:`w-full`,children:_(o,{children:E})}),v(c,{maxLength:6,value:A,onChange:j,onComplete:L,disabled:T,children:[v(l,{children:[_(d,{index:0}),_(d,{index:1}),_(d,{index:2})]}),_(u,{}),v(l,{children:[_(d,{index:3}),_(d,{index:4}),_(d,{index:5})]})]}),_(e,{type:`button`,isLoading:T,disabled:A.length<6,className:`w-full`,onClick:L,children:`Xác thực`}),v(`div`,{className:`flex items-center gap-1 text-muted-foreground text-sm`,children:[_(`span`,{children:`Chưa nhận được mã?`}),_(e,{variant:`link`,size:`sm`,className:`h-auto p-0`,disabled:M>0||T,onClick:I,children:M>0?`Gửi lại (${M}s)`:`Gửi lại`})]}),w&&_(e,{variant:`ghost`,size:`sm`,className:`w-full`,onClick:w,children:`Quay lại`})]})]})})};export{y as VerifyEmailPage};
|
|
2
|
-
//# sourceMappingURL=VerifyEmailPage.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"VerifyEmailPage.mjs","names":[],"sources":["../../packages/components/pages/VerifyEmailPage.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { Alert, AlertDescription } from '../ui/alert';\nimport { Button } from '../ui/button';\nimport { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '../ui/dialog';\nimport { InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot } from '../ui/input-otp';\n\nexport interface VerifyEmailPageProps {\n /** Controls whether the dialog is open */\n open: boolean;\n /** Called when the dialog open state changes */\n onOpenChange: (open: boolean) => void;\n /** The email address the OTP was dispatched to — displayed as context and passed to callbacks */\n email: string;\n /** Called when the user submits the OTP code */\n onVerify: (email: string, otp: string) => Promise<void> | void;\n /** Called when the user requests a new OTP; triggers a fresh cooldown */\n onResend: (email: string) => Promise<void> | void;\n /** Called when the back link is clicked */\n onBack?: () => void;\n /** Disables the form and shows a spinner on the submit button */\n isLoading?: boolean;\n /** Server-side error message rendered in a destructive Alert */\n errorMessage?: string;\n /** Dialog heading. Default: \"Xác thực email\" */\n title?: string;\n /** Dialog subheading. Default: built from the email prop */\n subtitle?: string;\n /** Seconds before the resend button becomes available. Default: 60 */\n resendCooldownSeconds?: number;\n}\n\n/**\n * Modal email OTP verification dialog for the client authentication flow.\n *\n * @example\n * ```tsx\n * import { VerifyEmailPage } from '@customafk/lunas-ui/pages/VerifyEmailPage';\n *\n * <VerifyEmailPage\n * open={open}\n * onOpenChange={setOpen}\n * email=\"user@example.com\"\n * onVerify={async (email, otp) => {\n * await authService.verifyEmail(email, otp);\n * setOpen(false);\n * }}\n * onResend={async (email) => {\n * await authService.resendVerification(email);\n * }}\n * />\n * ```\n */\nexport const VerifyEmailPage = ({\n open,\n onOpenChange,\n email,\n onVerify,\n onResend,\n onBack,\n isLoading = false,\n errorMessage,\n title = 'Xác thực email',\n subtitle,\n resendCooldownSeconds = 60,\n}: VerifyEmailPageProps) => {\n const [otp, setOtp] = useState('');\n const [countdown, setCountdown] = useState(resendCooldownSeconds);\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n const startCountdown = useCallback((seconds: number) => {\n if (intervalRef.current) clearInterval(intervalRef.current);\n setCountdown(seconds);\n intervalRef.current = setInterval(() => {\n setCountdown(prev => {\n if (prev <= 1) {\n if (intervalRef.current) clearInterval(intervalRef.current);\n return 0;\n }\n return prev - 1;\n });\n }, 1000);\n }, []);\n\n useEffect(() => {\n if (open && resendCooldownSeconds > 0) startCountdown(resendCooldownSeconds);\n return () => {\n if (intervalRef.current) clearInterval(intervalRef.current);\n };\n }, [open, resendCooldownSeconds, startCountdown]);\n\n const handleResend = useCallback(async () => {\n startCountdown(resendCooldownSeconds);\n await onResend(email);\n }, [email, onResend, resendCooldownSeconds, startCountdown]);\n\n const handleVerify = useCallback(async () => {\n if (otp.length < 6) return;\n await onVerify(email, otp);\n }, [email, otp, onVerify]);\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-sm:data-[state=open]:slide-in-from-bottom max-sm:data-[state=open]:zoom-in-100 max-sm:data-[state=closed]:slide-out-to-bottom max-sm:data-[state=closed]:zoom-out-100 max-sm:top-auto max-sm:right-0 max-sm:bottom-0 max-sm:left-0 max-sm:max-w-full max-sm:translate-x-0 max-sm:translate-y-0 max-sm:rounded-b-none sm:max-w-sm\">\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>\n {subtitle ?? (\n <>\n Nhập mã OTP đã được gửi tới <span className=\"font-medium text-foreground\">{email}</span>. Mã có hiệu lực trong 10 phút.\n </>\n )}\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"flex flex-col items-center gap-4\">\n {errorMessage && (\n <Alert variant=\"destructive\" className=\"w-full\">\n <AlertDescription>{errorMessage}</AlertDescription>\n </Alert>\n )}\n\n <InputOTP maxLength={6} value={otp} onChange={setOtp} onComplete={handleVerify} disabled={isLoading}>\n <InputOTPGroup>\n <InputOTPSlot index={0} />\n <InputOTPSlot index={1} />\n <InputOTPSlot index={2} />\n </InputOTPGroup>\n <InputOTPSeparator />\n <InputOTPGroup>\n <InputOTPSlot index={3} />\n <InputOTPSlot index={4} />\n <InputOTPSlot index={5} />\n </InputOTPGroup>\n </InputOTP>\n\n <Button type=\"button\" isLoading={isLoading} disabled={otp.length < 6} className=\"w-full\" onClick={handleVerify}>\n Xác thực\n </Button>\n\n <div className=\"flex items-center gap-1 text-muted-foreground text-sm\">\n <span>Chưa nhận được mã?</span>\n <Button variant=\"link\" size=\"sm\" className=\"h-auto p-0\" disabled={countdown > 0 || isLoading} onClick={handleResend}>\n {countdown > 0 ? `Gửi lại (${countdown}s)` : 'Gửi lại'}\n </Button>\n </div>\n\n {onBack && (\n <Button variant=\"ghost\" size=\"sm\" className=\"w-full\" onClick={onBack}>\n Quay lại\n </Button>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n"],"mappings":"gjBAuDA,MAAa,GAAmB,CAC9B,OACA,eACA,QACA,WACA,WACA,SACA,YAAY,GACZ,eACA,QAAQ,iBACR,WACA,wBAAwB,MACE,CAC1B,GAAM,CAAC,EAAK,GAAU,EAAS,GAAG,CAC5B,CAAC,EAAW,GAAgB,EAAS,EAAsB,CAC3D,EAAc,EAA8C,KAAK,CAEjE,EAAiB,EAAa,GAAoB,CAClD,EAAY,SAAS,cAAc,EAAY,QAAQ,CAC3D,EAAa,EAAQ,CACrB,EAAY,QAAU,gBAAkB,CACtC,EAAa,GACP,GAAQ,GACN,EAAY,SAAS,cAAc,EAAY,QAAQ,CACpD,GAEF,EAAO,EACd,EACD,IAAK,EACP,EAAE,CAAC,CAEN,OACM,GAAQ,EAAwB,GAAG,EAAe,EAAsB,KAC/D,CACP,EAAY,SAAS,cAAc,EAAY,QAAQ,GAE5D,CAAC,EAAM,EAAuB,EAAe,CAAC,CAEjD,IAAM,EAAe,EAAY,SAAY,CAC3C,EAAe,EAAsB,CACrC,MAAM,EAAS,EAAM,EACpB,CAAC,EAAO,EAAU,EAAuB,EAAe,CAAC,CAEtD,EAAe,EAAY,SAAY,CACvC,EAAI,OAAS,GACjB,MAAM,EAAS,EAAO,EAAI,EACzB,CAAC,EAAO,EAAK,EAAS,CAAC,CAE1B,OACE,EAAC,EAAA,CAAa,OAAoB,wBAChC,EAAC,EAAA,CAAc,UAAU,iVACvB,EAAC,EAAA,CAAA,SAAA,CACC,EAAC,EAAA,CAAA,SAAa,EAAA,CAAoB,CAClC,EAAC,EAAA,CAAA,SACE,GACC,EAAA,EAAA,CAAA,SAAA,CAAE,+BAC4B,EAAC,OAAA,CAAK,UAAU,uCAA+B,GAAa,qCACvF,CAAA,CAEa,CAAA,CAAA,CACP,CAEf,EAAC,MAAA,CAAI,UAAU,6CACZ,GACC,EAAC,EAAA,CAAM,QAAQ,cAAc,UAAU,kBACrC,EAAC,EAAA,CAAA,SAAkB,EAAA,CAAgC,EAC7C,CAGV,EAAC,EAAA,CAAS,UAAW,EAAG,MAAO,EAAK,SAAU,EAAQ,WAAY,EAAc,SAAU,YACxF,EAAC,EAAA,CAAA,SAAA,CACC,EAAC,EAAA,CAAa,MAAO,EAAA,CAAK,CAC1B,EAAC,EAAA,CAAa,MAAO,EAAA,CAAK,CAC1B,EAAC,EAAA,CAAa,MAAO,EAAA,CAAK,GACZ,CAChB,EAAC,EAAA,EAAA,CAAoB,CACrB,EAAC,EAAA,CAAA,SAAA,CACC,EAAC,EAAA,CAAa,MAAO,EAAA,CAAK,CAC1B,EAAC,EAAA,CAAa,MAAO,EAAA,CAAK,CAC1B,EAAC,EAAA,CAAa,MAAO,EAAA,CAAK,GACZ,GACP,CAEX,EAAC,EAAA,CAAO,KAAK,SAAoB,YAAW,SAAU,EAAI,OAAS,EAAG,UAAU,SAAS,QAAS,WAAc,YAEvG,CAET,EAAC,MAAA,CAAI,UAAU,kEACb,EAAC,OAAA,CAAA,SAAK,qBAAA,CAAyB,CAC/B,EAAC,EAAA,CAAO,QAAQ,OAAO,KAAK,KAAK,UAAU,aAAa,SAAU,EAAY,GAAK,EAAW,QAAS,WACpG,EAAY,EAAI,YAAY,EAAU,IAAM,WACtC,CAAA,EACL,CAEL,GACC,EAAC,EAAA,CAAO,QAAQ,QAAQ,KAAK,KAAK,UAAU,SAAS,QAAS,WAAQ,YAE7D,GAEP,CAAA,EACQ,EACT"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"paragraph-DYLaQtTV.mjs","names":[],"sources":["../packages/components/typography/paragraph.tsx"],"sourcesContent":["'use client';\n\nimport type { ComponentPropsWithoutRef } from 'react';\nimport { cn } from '@customafk/react-toolkit/utils';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nexport const paragraphVariants = cva('not-first:mt-3 max-w-prose whitespace-pre-line text-pretty text-start leading-7 transition-colors', {\n variants: {\n variant: {\n lead: 'text-base leading-8 font-medium text-text-positive-strong md:text-lg',\n lg: 'text-base leading-8 font-normal text-text-positive md:text-lg',\n p: 'text-sm font-normal text-text-positive md:text-base',\n sm: 'text-sm leading-6 font-normal text-text-positive',\n muted: 'text-sm font-normal text-text-positive-weak md:text-base',\n xs: 'text-xs leading-5 font-normal text-text-positive-weak',\n },\n },\n defaultVariants: {\n variant: 'p',\n },\n});\n\n/**\n * Props for the {@link Paragraph} component.\n *\n * Extends all native `<p>` HTML attributes plus the CVA variant.\n *\n * @property variant - Visual style variant.\n * - `'lead'` — large, medium-weight introductory text (default size `text-base` / `md:text-lg`)\n * - `'lg'` — large normal-weight text\n * - `'p'` — standard body text (default)\n * - `'sm'` — small normal-weight text with tighter leading\n * - `'muted'` — subdued colour, standard body size\n * - `'xs'` — extra-small text in a muted colour\n */\nexport type ParagraphProps = ComponentPropsWithoutRef<'p'> & VariantProps<typeof paragraphVariants>;\n\n/**\n * A styled `<p>` element with semantic size and weight variants for body text.\n *\n * @example\n * ```tsx\n * import { Paragraph } from '@customafk/lunas-ui/typography/paragraph';\n *\n * // Default body paragraph\n * <Paragraph>This is body text.</Paragraph>\n *\n * // Lead paragraph with larger, medium-weight text\n * <Paragraph variant=\"lead\">Introducing our new feature.</Paragraph>\n *\n * // Muted helper text\n * <Paragraph variant=\"muted\">Last updated 3 days ago.</Paragraph>\n * ```\n */\nexport const Paragraph = ({ variant, className, ...props }: ParagraphProps) => {\n return <p data-slot=\"paragraph\" className={cn(paragraphVariants({ variant }), className)} {...props} />;\n};\n"],"mappings":"2IAMA,MAAa,EAAoB,EAAI,oGAAqG,CACxI,SAAU,CACR,QAAS,CACP,KAAM,uEACN,GAAI,gEACJ,EAAG,sDACH,GAAI,mDACJ,MAAO,2DACP,GAAI,wDACL,CACF,CACD,gBAAiB,CACf,QAAS,IACV,CACF,CAAC,CAkCW,GAAa,CAAE,UAAS,YAAW,GAAG,KAC1C,EAAC,IAAA,CAAE,YAAU,YAAY,UAAW,EAAG,EAAkB,CAAE,UAAS,CAAC,CAAE,EAAU,CAAE,GAAI,GAAS"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./dist-DVrfqn8H.mjs";import{t}from"./button-CCVJTHBI.mjs";import{t as n}from"./paragraph-DYLaQtTV.mjs";import{t as r}from"./flex-B6YSJzGe.mjs";import{i,n as a,r as o,t as s}from"./tooltip-Dxl5Wa8i.mjs";import{n as c,t as l}from"./avatar-fltdRVsJ.mjs";import{i as u,o as d,r as f,s as p,t as m}from"./sheet-BFlIfNaA.mjs";import{a as h,h as g,i as _,o as v,r as y,t as b,u as x}from"./dropdown-menu-BWhiVsEf.mjs";import{LogOutIcon as S,MenuIcon as C,ShoppingCartIcon as w,UserRoundIcon as T}from"lucide-react";import{createContext as E,useCallback as D,useContext as O,useEffect as k,useMemo as A,useState as j}from"react";import{cn as M}from"@customafk/react-toolkit/utils";import{cva as N}from"class-variance-authority";import{jsx as P,jsxs as F}from"react/jsx-runtime";import{colorHashLight as I}from"@customafk/react-toolkit/color-hash";import{useIsMobile as L}from"@customafk/react-toolkit/hooks/useMobile";const R=E(null);function z(){let e=O(R);if(!e)throw Error(`useSidebar must be used within a SidebarProvider.`);return e}function B({defaultOpen:e=!0,open:t,onOpenChange:n,className:r,style:i,children:a,...s}){let c=L(),[l,u]=j(!1),[d,f]=j(e),p=t??d,m=D(e=>{let t=typeof e==`function`?e(p):e;n?n(t):f(t),document.cookie=`sidebar_state=${t}; path=/; max-age=604800`},[n,p]),h=D(()=>c?u(e=>!e):m(e=>!e),[c,m]);k(()=>{let e=e=>{e.key===`b`&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),h())};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[h]);let g=p?`expanded`:`collapsed`,_=A(()=>({state:g,open:p,setOpen:m,isMobile:c,openMobile:l,setOpenMobile:u,toggleSidebar:h}),[g,p,m,c,l,h]);return P(R.Provider,{value:_,children:P(o,{delayDuration:0,children:P(`div`,{"data-slot":`sidebar-wrapper`,style:{"--sidebar-width":`16rem`,"--sidebar-width-icon":`3rem`,...i},className:M(`group/sidebar-wrapper flex h-dvh w-full`,r),...s,children:a})})})}function V({side:e=`left`,variant:n=`sidebar`,collapsible:r=`offcanvas`,className:i,children:a,...o}){let{isMobile:s,state:c,openMobile:l,setOpenMobile:h,toggleSidebar:g}=z();return r===`none`?P(`aside`,{"data-slot":`sidebar`,className:M(`flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground`,i),...o,children:a}):s?P(m,{open:l,onOpenChange:h,...o,children:F(f,{"data-sidebar":`sidebar`,"data-slot":`sidebar`,"data-mobile":`true`,className:`w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground sm:max-w-3xs [&>button]:hidden`,style:{"--sidebar-width":`18rem`},side:e,children:[F(d,{className:`sr-only`,children:[P(p,{children:`Sidebar`}),P(u,{children:`Displays the mobile sidebar.`})]}),F(`div`,{className:`flex size-full flex-col`,children:[F(`div`,{className:`flex flex-0 items-center gap-x-2 border-border-weak border-b p-2 pr-4`,children:[F(t,{"data-sidebar":`trigger`,"data-slot":`sidebar-trigger`,variant:`ghost`,color:`muted`,size:`icon`,className:M(`size-10 rounded-full`,i),onClick:e=>{g(),e.preventDefault(),e.stopPropagation()},children:[P(C,{className:`size-6!`}),P(`span`,{className:`sr-only`,children:`Toggle Sidebar`})]}),P(`div`,{className:`ml-2 flex aspect-square size-8 items-center justify-center rounded-lg bg-sidebar-primary text-sidebar-primary-foreground`,children:P(w,{size:20})}),F(`div`,{className:`grid flex-1 text-left text-sm leading-tight`,children:[P(`span`,{className:`truncate font-medium`,children:`Lunas Store`}),P(`span`,{className:`truncate text-xs`,children:`Established 2023`})]})]}),P(`div`,{className:`flex flex-1 flex-col p-2`,children:a})]})]})}):F(`aside`,{className:`group peer hidden bg-card text-sidebar-foreground md:block`,"data-state":c,"data-collapsible":c===`collapsed`?r:``,"data-variant":n,"data-side":e,"data-slot":`sidebar`,children:[P(`div`,{"data-slot":`sidebar-gap`,className:M(`relative`,`bg-transparent`,`transition-[width] duration-200 ease-linear`,`h-(--header-height) w-(--sidebar-width)`,`sm:h-[calc(var(--header-height)+0.5rem)]`,`group-data-[collapsible=offcanvas]:w-0`,`group-data-[side=right]:rotate-180`,n===`floating`||n===`inset`?`group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]`:`group-data-[collapsible=icon]:w-(--sidebar-width-icon)`)}),P(`div`,{"data-slot":`sidebar-container`,className:M(`hidden md:flex`,`fixed inset-y-0 top-14 z-10 shadow-nav`,`h-[calc(100dvh-3.5rem)] w-(--sidebar-width)`,`transition-[left,right,width] duration-200 ease-linear`,e===`left`&&`left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]`,e===`right`&&`right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]`,n===`floating`||n===`inset`?`p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]`:`group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l`,i),...o,children:P(`div`,{"data-sidebar":`sidebar`,"data-slot":`sidebar-inner`,className:M(`flex size-full flex-col`,`group-data-[variant=floating]:rounded-lg`,`group-data-[variant=floating]:border`,`group-data-[variant=floating]:border-sidebar-border`,`group-data-[variant=floating]:shadow-sm`),children:a})})]})}function H({className:e,children:t,...n}){return F(`main`,{"data-slot":`sidebar-inset`,className:M(`relative flex w-full flex-1 flex-col`,e),...n,children:[P(`div`,{className:`h-(--header-height) w-full sm:h-[calc(var(--header-height)+0.5rem)]`}),P(`div`,{className:`inset-shadow-sm flex-1`,children:t})]})}function U({className:e,...t}){return P(`div`,{"data-slot":`sidebar-footer`,"data-sidebar":`footer`,className:M(`flex flex-col gap-2 p-2`,e),...t})}function W({className:e,...t}){return P(`div`,{"data-slot":`sidebar-content`,"data-sidebar":`content`,className:M(`flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden`,e),...t})}function G({className:e,...t}){return P(`div`,{"data-slot":`sidebar-group`,"data-sidebar":`group`,className:M(`relative flex w-full min-w-0 flex-col`,e),...t})}function K({className:t,asChild:n=!1,...r}){return P(n?e:`div`,{"data-slot":`sidebar-group-label`,"data-sidebar":`group-label`,className:M(`flex h-8 shrink-0 items-center rounded-md px-2 font-medium text-sidebar-foreground/70 text-xs outline-hidden ring-sidebar-ring transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0`,`group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0`,t),...r})}function q({className:e,...t}){return P(`div`,{"data-slot":`sidebar-group-content`,"data-sidebar":`group-content`,className:M(`w-full text-sm`,e),...t})}function J({className:e,...t}){return P(`ul`,{"data-slot":`sidebar-menu`,"data-sidebar":`menu`,className:M(`flex w-full min-w-0 flex-col gap-1`,e),...t})}function Y({className:e,...t}){return P(`li`,{"data-slot":`sidebar-menu-item`,"data-sidebar":`menu-item`,className:M(`group/menu-item relative`,e),...t})}const X=N([`peer/menu-button`,`cursor-pointer`,`flex w-full items-center gap-2`,`overflow-hidden rounded-md p-2 outline-hidden`,`truncate text-left font-normal`,`transition-[color,width,height,padding]`,`hover:bg-sidebar-accent`,`hover:text-sidebar-accent-foreground`,`active:bg-sidebar-accent`,`active:text-sidebar-accent-foreground`,`disabled:pointer-events-none`,`disabled:opacity-50`,`group-has-data-[sidebar=menu-action]/menu-item:pr-8`,`aria-disabled:pointer-events-none`,`aria-disabled:opacity-50`,`data-[active=true]:bg-sidebar-primary-muted`,`data-[active=true]:text-sidebar-primary`,`data-[state=open]:hover:bg-sidebar-accent`,`data-[state=open]:hover:text-sidebar-accent-foreground`,`group-data-[collapsible=icon]:size-12!`,`group-data-[collapsible=icon]:p-3!`,`group-data-[collapsible=icon]:gap-3!`,`[&>svg]:size-6`,`[&>svg]:shrink-0`,`[&>span:last-child]:truncate`],{variants:{variant:{default:`hover:bg-sidebar-accent/60 hover:text-sidebar-accent-foreground/80`,outline:`bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]`},size:{default:`h-10 text-sm`,sm:`h-7 text-xs`,lg:`h-12 text-sm group-data-[collapsible=icon]:p-0!`}},defaultVariants:{variant:`default`,size:`default`}});function Z({asChild:t=!1,isActive:n=!1,variant:r=`default`,size:o=`default`,tooltip:c,className:l,...u}){let d=t?e:`button`,{isMobile:f,state:p}=z(),m=P(d,{"data-slot":`sidebar-menu-button`,"data-sidebar":`menu-button`,"data-size":o,"data-active":n,className:M(X({variant:r,size:o}),l),...u});return c?(typeof c==`string`&&(c={children:c}),F(s,{children:[P(i,{asChild:!0,children:m}),P(a,{side:`right`,align:`center`,hidden:p!==`collapsed`||f,...c})]})):m}const Q=({uuid:e,username:t,email:i})=>F(r,{"data-slot":`user-display`,wrap:!1,gap:`sm`,padding:`none`,children:[P(l,{className:`size-9 shadow-card`,children:P(c,{style:{backgroundColor:I.hex(e)},children:P(T,{size:28,className:`text-white`})})}),F(r,{vertical:!0,padding:`none`,gap:`none`,align:`start`,className:`hidden sm:flex`,children:[P(n,{className:`text-sm font-medium text-text-positive`,children:t}),P(n,{variant:`sm`,className:`mt-0! text-xs text-text-positive-weak`,children:i})]})]}),$=({user:e,isLogin:n=!0,onLogin:r,onLogout:i})=>{let{toggleSidebar:a}=z(),o=D(e=>{e.preventDefault(),e.stopPropagation(),a()},[a]),s=D(e=>{e.preventDefault(),e.stopPropagation(),i?.()},[i]),c=D(e=>{e.preventDefault(),e.stopPropagation(),r?.()},[r]);return F(`header`,{"data-slot":`payment-layout-header`,className:M(`bg-card`,`h-[calc(var(--header-height)+0.5rem)] sm:px-4 sm:pr-6`,`absolute inset-x-0 top-0 z-20 gap-2 px-2 pr-2.5`,`flex items-center shadow-nav`,`transition-[width,height] ease-linear`),children:[n&&F(t,{"data-sidebar":`trigger`,"data-slot":`sidebar-trigger`,variant:`ghost`,color:`muted`,size:`icon`,className:`hidden size-10 rounded-full transition-all hover:text-text-positive md:flex`,onClick:o,children:[P(C,{className:`size-6!`}),P(`span`,{className:`sr-only`,children:`Toggle Sidebar`})]}),F(`div`,{className:`flex flex-1 gap-x-2 sm:ml-2.5`,children:[P(`div`,{className:`flex aspect-square size-8 items-center justify-center rounded-lg bg-sidebar-primary text-sidebar-primary-foreground`,children:P(w,{size:20})}),F(`div`,{className:`grid flex-1 text-left text-sm leading-tight`,children:[P(`span`,{className:`truncate font-medium`,children:`Lunas Payment`}),P(`span`,{className:`truncate text-xs`,children:`Quản lý đơn hàng`})]})]}),e?F(b,{children:[P(g,{asChild:!0,children:P(t,{variant:`ghost`,color:`muted`,className:`gap-x-2 rounded-full px-2 transition-all hover:text-text-positive`,children:P(Q,{uuid:e?.uuid??``,username:e.fullname,email:e.email})})}),F(y,{align:`end`,className:`w-56`,children:[F(v,{className:`font-normal`,children:[P(`p`,{className:`font-medium`,children:e.fullname}),P(`p`,{className:`text-muted-foreground text-xs`,children:e.email})]}),P(x,{}),P(_,{children:F(h,{onClick:s,children:[P(S,{size:14}),`Đăng xuất`]})})]})]}):P(t,{size:`sm`,onClick:c,children:`Đăng nhập`})]})},ee=({items:e,activeNavItemId:t})=>{let{isMobile:n}=z();if(!n||e.length===0)return null;let r=e.slice(0,5);return P(`nav`,{"data-slot":`mobile-bottom-nav`,className:`fixed inset-x-0 bottom-0 z-20 flex h-16 items-stretch border-border border-t bg-card md:hidden`,children:r.map(e=>F(`button`,{type:`button`,onClick:e.onClick,"data-active":e.id===t,className:M(`flex flex-1 flex-col items-center justify-center gap-0.5`,`text-muted-foreground transition-colors`,`data-[active=true]:text-sidebar-primary`,`[&>svg]:size-5 [&>svg]:shrink-0`),children:[e.icon,P(`span`,{className:`max-w-16 truncate text-[10px] leading-3`,children:e.label})]},e.id))})},te=({activeNavItemId:e,sidebar:t,user:n,isLogin:r=!0,onLogin:i,onLogout:a,children:o})=>{let s=A(()=>t?.groupcontent||[],[t]),c=A(()=>s.flatMap(e=>e.items),[s]);return F(B,{children:[P($,{user:n,isLogin:r,onLogin:i,onLogout:a}),r&&F(V,{variant:`inset`,collapsible:`icon`,children:[P(W,{children:s.map(t=>F(G,{children:[P(K,{children:t.label}),P(q,{children:P(J,{children:t.items.map(t=>P(Y,{children:F(Z,{isActive:t.id===e,onClick:e=>{t.onClick?.(),e.preventDefault(),e.stopPropagation()},children:[t.icon,t.label]})},t.id))})})]},t.id))}),P(U,{children:P(J,{children:P(Y,{className:`mt-2 border-t border-t-border`,children:P(`p`,{className:`pt-2 text-center text-muted-foreground text-xs`,children:`Copyright © 2025, Lunas.`})})})})]}),P(H,{children:P(`section`,{className:`relative size-full`,children:P(`div`,{className:M(`absolute inset-0 overflow-y-auto`,r&&`pb-16 md:pb-0`),children:o})})}),r&&P(ee,{items:c,activeNavItemId:e})]})};export{te as t};
|
|
2
|
-
//# sourceMappingURL=payment-layout-DrQ0kZPX.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"payment-layout-DrQ0kZPX.mjs","names":["open","UserDataDisplay: React.FC<UserDataDisplayProps>","PaymentLayoutHeader: React.FC<{\n user?: PaymentLayoutUser | null;\n isLogin?: boolean;\n onLogin?: () => void;\n onLogout?: () => void;\n}>","MobileBottomNav: React.FC<MobileBottomNavProps>","PaymentLayout: React.FC<\n React.PropsWithChildren<{\n /** ID of the currently active navigation item; matched against each item's `id` to apply the active style. */\n activeNavItemId?: string;\n /** Sidebar navigation definition; omitting this prop renders an empty sidebar. */\n sidebar?: {\n groupcontent: {\n /** Unique identifier for the group, used as React key. */\n id: string;\n /** Optional section heading rendered above the group's items. */\n label?: string;\n items: {\n /** Unique identifier for the nav item, used as React key and for active-state comparison. */\n id: string;\n /** Human-readable label rendered inside the sidebar button. */\n label: string;\n /** Optional icon element rendered to the left of the label. */\n icon?: React.ReactNode;\n /** Callback fired when the sidebar button is clicked. */\n onClick?: () => void;\n }[];\n }[];\n };\n /** Authenticated user; when provided the header shows user info and a logout option, otherwise a login button. */\n user?: PaymentLayoutUser | null;\n /** When false the sidebar and bottom nav are hidden entirely (e.g. unauthenticated state). Defaults to true. */\n isLogin?: boolean;\n /** Called when the login button in the header is clicked (only shown when `user` is absent). */\n onLogin?: () => void;\n /** Called when the logout item in the user dropdown is clicked. */\n onLogout?: () => void;\n }>\n>"],"sources":["../packages/components/layouts/payment-layout/components/sidebar.tsx","../packages/components/layouts/payment-layout/components/header.tsx","../packages/components/layouts/payment-layout/components/mobile-bottom-nav.tsx","../packages/components/layouts/payment-layout/index.tsx"],"sourcesContent":["'use client';\n\nimport { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react';\n\nimport { MenuIcon, PanelLeftIcon, ShoppingCartIcon } from 'lucide-react';\n\nimport { useIsMobile } from '@customafk/react-toolkit/hooks/useMobile';\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { Separator } from '@/components/ui/separator';\nimport { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle } from '@/components/ui/sheet';\nimport { Skeleton } from '@/components/ui/skeleton';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\n\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nconst SIDEBAR_COOKIE_NAME = 'sidebar_state';\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;\nconst SIDEBAR_WIDTH = '16rem';\nconst SIDEBAR_WIDTH_MOBILE = '18rem';\nconst SIDEBAR_WIDTH_ICON = '3rem';\nconst SIDEBAR_KEYBOARD_SHORTCUT = 'b';\n\ntype SidebarContextProps = {\n state: 'expanded' | 'collapsed';\n open: boolean;\n setOpen: (open: boolean) => void;\n openMobile: boolean;\n setOpenMobile: (open: boolean) => void;\n isMobile: boolean;\n toggleSidebar: () => void;\n};\n\nconst SidebarContext = createContext<SidebarContextProps | null>(null);\n\nfunction useSidebar() {\n const context = useContext(SidebarContext);\n if (!context) {\n throw new Error('useSidebar must be used within a SidebarProvider.');\n }\n\n return context;\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<'div'> & {\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}) {\n const isMobile = useIsMobile();\n const [openMobile, setOpenMobile] = useState(false);\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = useState(defaultOpen);\n const open = openProp ?? _open;\n const setOpen = useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === 'function' ? value(open) : value;\n if (setOpenProp) {\n setOpenProp(openState);\n } else {\n _setOpen(openState);\n }\n\n // This sets the cookie to keep the sidebar state.\n // biome-ignore lint/suspicious/noDocumentCookie: true\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;\n },\n [setOpenProp, open]\n );\n\n // Helper to toggle the sidebar.\n const toggleSidebar = useCallback(() => {\n return isMobile ? setOpenMobile(open => !open) : setOpen(open => !open);\n }, [isMobile, setOpen]);\n\n // Adds a keyboard shortcut to toggle the sidebar.\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {\n event.preventDefault();\n toggleSidebar();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [toggleSidebar]);\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? 'expanded' : 'collapsed';\n\n const contextValue = useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, toggleSidebar]\n );\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n '--sidebar-width': SIDEBAR_WIDTH,\n '--sidebar-width-icon': SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn('group/sidebar-wrapper flex h-dvh w-full', className)}\n {...props}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n );\n}\n\nfunction Sidebar({\n side = 'left',\n variant = 'sidebar',\n collapsible = 'offcanvas',\n className,\n children,\n ...props\n}: React.ComponentProps<'div'> & {\n side?: 'left' | 'right';\n variant?: 'sidebar' | 'floating' | 'inset';\n collapsible?: 'offcanvas' | 'icon' | 'none';\n}) {\n const { isMobile, state, openMobile, setOpenMobile, toggleSidebar } = useSidebar();\n\n if (collapsible === 'none') {\n return (\n <aside data-slot=\"sidebar\" className={cn('flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground', className)} {...props}>\n {children}\n </aside>\n );\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className=\"w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground sm:max-w-3xs [&>button]:hidden\"\n style={\n {\n '--sidebar-width': SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex size-full flex-col\">\n <div className=\"flex flex-0 items-center gap-x-2 border-border-weak border-b p-2 pr-4\">\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n color=\"muted\"\n size=\"icon\"\n className={cn('size-10 rounded-full', className)}\n onClick={event => {\n toggleSidebar();\n event.preventDefault();\n event.stopPropagation();\n }}\n >\n <MenuIcon className=\"size-6!\" />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n <div className=\"ml-2 flex aspect-square size-8 items-center justify-center rounded-lg bg-sidebar-primary text-sidebar-primary-foreground\">\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 flex-col p-2\">{children}</div>\n </div>\n </SheetContent>\n </Sheet>\n );\n }\n\n return (\n <aside\n className=\"group peer hidden bg-card text-sidebar-foreground md:block\"\n data-state={state}\n data-collapsible={state === 'collapsed' ? collapsible : ''}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n 'relative',\n 'bg-transparent',\n 'transition-[width] duration-200 ease-linear',\n 'h-(--header-height) w-(--sidebar-width)',\n 'sm:h-[calc(var(--header-height)+0.5rem)]',\n 'group-data-[collapsible=offcanvas]:w-0',\n 'group-data-[side=right]:rotate-180',\n variant === 'floating' || variant === 'inset'\n ? 'group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]'\n : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon)'\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n className={cn(\n 'hidden md:flex',\n 'fixed inset-y-0 top-14 z-10 shadow-nav',\n 'h-[calc(100dvh-3.5rem)] w-(--sidebar-width)',\n 'transition-[left,right,width] duration-200 ease-linear',\n side === 'left' && 'left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]',\n side === 'right' && 'right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]',\n // Adjust the padding for floating and inset variants.\n variant === 'floating' || variant === 'inset'\n ? 'p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]'\n : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l',\n className\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className={cn(\n 'flex size-full flex-col',\n 'group-data-[variant=floating]:rounded-lg',\n 'group-data-[variant=floating]:border',\n 'group-data-[variant=floating]:border-sidebar-border',\n 'group-data-[variant=floating]:shadow-sm'\n )}\n >\n {children}\n </div>\n </div>\n </aside>\n );\n}\n\nfunction SidebarTrigger({ className, onClick, ...props }: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn('size-7', className)}\n onClick={event => {\n onClick?.(event);\n toggleSidebar();\n }}\n {...props}\n >\n <PanelLeftIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n );\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<'button'>) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n 'absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-0.5 hover:after:bg-sidebar-border group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex',\n 'in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize',\n '[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize',\n 'group-data-[collapsible=offcanvas]:translate-x-0 hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:after:left-full',\n '[[data-side=left][data-collapsible=offcanvas]_&]:-right-2',\n '[[data-side=right][data-collapsible=offcanvas]_&]:-left-2',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarInset({ className, children, ...props }: React.ComponentProps<'main'>) {\n return (\n <main data-slot=\"sidebar-inset\" className={cn('relative flex w-full flex-1 flex-col', className)} {...props}>\n <div className=\"h-(--header-height) w-full sm:h-[calc(var(--header-height)+0.5rem)]\" />\n <div className=\"inset-shadow-sm flex-1\">{children}</div>\n </main>\n );\n}\n\nfunction SidebarInput({ className, ...props }: React.ComponentProps<typeof Input>) {\n return <Input data-slot=\"sidebar-input\" data-sidebar=\"input\" className={cn('h-8 w-full bg-background shadow-none', className)} {...props} />;\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"sidebar-header\" data-sidebar=\"header\" className={cn('flex flex-col gap-2 p-2', className)} {...props} />;\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"sidebar-footer\" data-sidebar=\"footer\" className={cn('flex flex-col gap-2 p-2', className)} {...props} />;\n}\n\nfunction SidebarSeparator({ className, ...props }: React.ComponentProps<typeof Separator>) {\n return <Separator data-slot=\"sidebar-separator\" data-sidebar=\"separator\" className={cn('mx-2 w-auto bg-sidebar-border', className)} {...props} />;\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn('flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"sidebar-group\" data-sidebar=\"group\" className={cn('relative flex w-full min-w-0 flex-col', className)} {...props} />;\n}\n\nfunction SidebarGroupLabel({ className, asChild = false, ...props }: React.ComponentProps<'div'> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : 'div';\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n 'flex h-8 shrink-0 items-center rounded-md px-2 font-medium text-sidebar-foreground/70 text-xs outline-hidden ring-sidebar-ring transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\n 'group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupAction({ className, asChild = false, ...props }: React.ComponentProps<'button'> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n 'absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-hidden ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',\n 'focus-visible:ring-2',\n '[&>svg]:size-4',\n '[&>svg]:shrink-0',\n // Increases the hit area of the button on mobile.\n 'after:absolute after:-inset-2 md:after:hidden',\n 'group-data-[collapsible=icon]:hidden',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupContent({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"sidebar-group-content\" data-sidebar=\"group-content\" className={cn('w-full text-sm', className)} {...props} />;\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<'ul'>) {\n return <ul data-slot=\"sidebar-menu\" data-sidebar=\"menu\" className={cn('flex w-full min-w-0 flex-col gap-1', className)} {...props} />;\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<'li'>) {\n return <li data-slot=\"sidebar-menu-item\" data-sidebar=\"menu-item\" className={cn('group/menu-item relative', className)} {...props} />;\n}\n\nconst sidebarMenuButtonVariants = cva(\n [\n 'peer/menu-button',\n 'cursor-pointer',\n 'flex w-full items-center gap-2',\n 'overflow-hidden rounded-md p-2 outline-hidden',\n 'truncate text-left font-normal',\n 'transition-[color,width,height,padding]',\n 'hover:bg-sidebar-accent',\n 'hover:text-sidebar-accent-foreground',\n 'active:bg-sidebar-accent',\n 'active:text-sidebar-accent-foreground',\n 'disabled:pointer-events-none',\n 'disabled:opacity-50',\n 'group-has-data-[sidebar=menu-action]/menu-item:pr-8',\n 'aria-disabled:pointer-events-none',\n 'aria-disabled:opacity-50',\n 'data-[active=true]:bg-sidebar-primary-muted',\n 'data-[active=true]:text-sidebar-primary',\n 'data-[state=open]:hover:bg-sidebar-accent',\n 'data-[state=open]:hover:text-sidebar-accent-foreground',\n 'group-data-[collapsible=icon]:size-12!',\n 'group-data-[collapsible=icon]:p-3!',\n 'group-data-[collapsible=icon]:gap-3!',\n '[&>svg]:size-6',\n '[&>svg]:shrink-0',\n '[&>span:last-child]:truncate',\n ],\n {\n variants: {\n variant: {\n default: 'hover:bg-sidebar-accent/60 hover:text-sidebar-accent-foreground/80',\n outline:\n 'bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]',\n },\n size: {\n default: 'h-10 text-sm',\n sm: 'h-7 text-xs',\n lg: 'h-12 text-sm group-data-[collapsible=icon]:p-0!',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n);\n\nfunction SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = 'default',\n size = 'default',\n tooltip,\n className,\n ...props\n}: React.ComponentProps<'button'> & {\n asChild?: boolean;\n isActive?: boolean;\n tooltip?: string | React.ComponentProps<typeof TooltipContent>;\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp = asChild ? Slot : 'button';\n const { isMobile, state } = useSidebar();\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n );\n\n if (!tooltip) {\n return button;\n }\n\n if (typeof tooltip === 'string') {\n tooltip = {\n children: tooltip,\n };\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent side=\"right\" align=\"center\" hidden={state !== 'collapsed' || isMobile} {...tooltip} />\n </Tooltip>\n );\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<'button'> & {\n asChild?: boolean;\n showOnHover?: boolean;\n}) {\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n 'absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-hidden ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-sidebar-accent-foreground [&>svg]:size-4 [&>svg]:shrink-0',\n // Increases the hit area of the button on mobile.\n 'after:absolute after:-inset-2 md:after:hidden',\n 'peer-data-[size=sm]/menu-button:top-1',\n 'peer-data-[size=default]/menu-button:top-1.5',\n 'peer-data-[size=lg]/menu-button:top-2.5',\n 'group-data-[collapsible=icon]:hidden',\n showOnHover &&\n 'group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuBadge({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n 'pointer-events-none absolute right-1 flex h-5 min-w-5 select-none items-center justify-center rounded-md px-1 font-medium text-sidebar-foreground text-xs tabular-nums',\n 'peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground',\n 'peer-data-[size=sm]/menu-button:top-1',\n 'peer-data-[size=default]/menu-button:top-1.5',\n 'peer-data-[size=lg]/menu-button:top-2.5',\n 'group-data-[collapsible=icon]:hidden',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<'div'> & {\n showIcon?: boolean;\n}) {\n // Random width between 50 to 90%.\n const width = useMemo(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`;\n }, []);\n\n return (\n <div data-slot=\"sidebar-menu-skeleton\" data-sidebar=\"menu-skeleton\" className={cn('flex h-8 items-center gap-2 rounded-md px-2', className)} {...props}>\n {showIcon && <Skeleton className=\"size-4 rounded-md\" data-sidebar=\"menu-skeleton-icon\" />}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n '--skeleton-width': width,\n } as React.CSSProperties\n }\n />\n </div>\n );\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<'ul'>) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n 'mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-sidebar-border border-l px-2.5 py-0.5',\n 'group-data-[collapsible=icon]:hidden',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSubItem({ className, ...props }: React.ComponentProps<'li'>) {\n return <li data-slot=\"sidebar-menu-sub-item\" data-sidebar=\"menu-sub-item\" className={cn('group/menu-sub-item relative', className)} {...props} />;\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = 'md',\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<'a'> & {\n asChild?: boolean;\n size?: 'sm' | 'md';\n isActive?: boolean;\n}) {\n const Comp = asChild ? Slot : 'a';\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n 'flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-hidden ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground',\n 'data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground',\n size === 'sm' && 'text-xs',\n size === 'md' && 'text-sm',\n 'group-data-[collapsible=icon]:hidden',\n className\n )}\n {...props}\n />\n );\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n // biome-ignore lint/style/useComponentExportOnlyModules: true\n useSidebar,\n};\n","import { useCallback } from 'react';\n\nimport { LogOutIcon, MenuIcon, ShoppingCartIcon, UserRoundIcon } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Button } from '@/components/ui/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu';\n\nimport type { PaymentLayoutUser } from '../index';\nimport { useSidebar } from './sidebar';\nimport { Flex } from '../../flex';\nimport { Avatar, AvatarFallback } from '@/components/ui/avatar';\nimport { Paragraph } from '@/components/typography/paragraph';\nimport { colorHashLight } from '@customafk/react-toolkit/color-hash';\n\ntype UserDataDisplayProps = {\n /** Unique identifier used to deterministically generate the avatar background colour. */\n uuid: string;\n /** Display name rendered as the primary line of the user card. */\n username: string;\n /** Email address rendered as the secondary, muted line below the username. */\n email: string;\n};\n\n/**\n * Displays a user identity card with a colour-hashed avatar, username, and email address.\n *\n * @example\n * ```tsx\n * import { UserDataDisplay } from '@customafk/lunas-ui/data-display/user';\n *\n * <UserDataDisplay uuid=\"abc-123\" username=\"Nguyễn Văn An\" email=\"an@example.com\" />\n * ```\n */\nexport const UserDataDisplay: React.FC<UserDataDisplayProps> = ({ uuid, username, email }) => {\n return (\n <Flex data-slot=\"user-display\" wrap={false} gap=\"sm\" padding=\"none\">\n <Avatar className=\"size-9 shadow-card\">\n <AvatarFallback style={{ backgroundColor: colorHashLight.hex(uuid) }}>\n <UserRoundIcon size={28} className=\"text-white\" />\n </AvatarFallback>\n </Avatar>\n <Flex vertical padding=\"none\" gap=\"none\" align=\"start\" className=\"hidden sm:flex\">\n <Paragraph className=\"text-sm font-medium text-text-positive\">{username}</Paragraph>\n <Paragraph variant=\"sm\" className=\"mt-0! text-xs text-text-positive-weak\">\n {email}\n </Paragraph>\n </Flex>\n </Flex>\n );\n};\n\nexport const PaymentLayoutHeader: React.FC<{\n user?: PaymentLayoutUser | null;\n isLogin?: boolean;\n onLogin?: () => void;\n onLogout?: () => void;\n}> = ({ user, isLogin = true, onLogin, onLogout }) => {\n const { toggleSidebar } = useSidebar();\n\n const handleToggleSidebar = useCallback(\n (event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n toggleSidebar();\n },\n [toggleSidebar]\n );\n\n const handleLogout = useCallback(\n (event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n onLogout?.();\n },\n [onLogout]\n );\n\n const handleLogin = useCallback(\n (event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n onLogin?.();\n },\n [onLogin]\n );\n\n return (\n <header\n data-slot=\"payment-layout-header\"\n className={cn(\n 'bg-card',\n // 'h-(--header-height)',\n 'h-[calc(var(--header-height)+0.5rem)] sm:px-4 sm:pr-6',\n 'absolute inset-x-0 top-0 z-20 gap-2 px-2 pr-2.5',\n 'flex items-center shadow-nav',\n 'transition-[width,height] ease-linear'\n )}\n >\n {isLogin && (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n color=\"muted\"\n size=\"icon\"\n className=\"hidden size-10 rounded-full transition-all hover:text-text-positive md:flex\"\n onClick={handleToggleSidebar}\n >\n <MenuIcon className=\"size-6!\" />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n )}\n\n <div className=\"flex flex-1 gap-x-2 sm:ml-2.5\">\n <div className=\"flex aspect-square size-8 items-center justify-center rounded-lg bg-sidebar-primary text-sidebar-primary-foreground\">\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 Payment</span>\n <span className=\"truncate text-xs\">Quản lý đơn hàng</span>\n </div>\n </div>\n\n {user ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" color=\"muted\" className=\"gap-x-2 rounded-full px-2 transition-all hover:text-text-positive\">\n <UserDataDisplay uuid={user?.uuid ?? ''} username={user.fullname} email={user.email} />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-56\">\n <DropdownMenuLabel className=\"font-normal\">\n <p className=\"font-medium\">{user.fullname}</p>\n <p className=\"text-muted-foreground text-xs\">{user.email}</p>\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuGroup>\n <DropdownMenuItem onClick={handleLogout}>\n <LogOutIcon size={14} />\n Đăng xuất\n </DropdownMenuItem>\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n ) : (\n <Button size=\"sm\" onClick={handleLogin}>\n Đăng nhập\n </Button>\n )}\n </header>\n );\n};\n","'use client';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { useSidebar } from './sidebar';\n\ntype MobileBottomNavItem = {\n id: string;\n label: string;\n icon?: React.ReactNode;\n onClick?: () => void;\n};\n\ntype MobileBottomNavProps = {\n items: MobileBottomNavItem[];\n activeNavItemId?: string;\n};\n\nexport const MobileBottomNav: React.FC<MobileBottomNavProps> = ({ items, activeNavItemId }) => {\n const { isMobile } = useSidebar();\n\n if (!isMobile || items.length === 0) return null;\n\n const visibleItems = items.slice(0, 5);\n\n return (\n <nav data-slot=\"mobile-bottom-nav\" className=\"fixed inset-x-0 bottom-0 z-20 flex h-16 items-stretch border-border border-t bg-card md:hidden\">\n {visibleItems.map(item => (\n <button\n key={item.id}\n type=\"button\"\n onClick={item.onClick}\n data-active={item.id === activeNavItemId}\n className={cn(\n 'flex flex-1 flex-col items-center justify-center gap-0.5',\n 'text-muted-foreground transition-colors',\n 'data-[active=true]:text-sidebar-primary',\n '[&>svg]:size-5 [&>svg]:shrink-0'\n )}\n >\n {item.icon}\n <span className=\"max-w-16 truncate text-[10px] leading-3\">{item.label}</span>\n </button>\n ))}\n </nav>\n );\n};\n","import { useMemo } from 'react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { PaymentLayoutHeader } from './components/header';\nimport { MobileBottomNav } from './components/mobile-bottom-nav';\nimport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarInset,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarProvider,\n} from './components/sidebar';\n\nexport type PaymentLayoutUser = {\n uuid?: string;\n /** Display name shown in the header and dropdown. */\n fullname: string;\n /** Email address shown in the user dropdown. */\n email: string;\n /** Optional avatar image URL; falls back to initials when omitted. */\n avatar?: string;\n};\n\n/**\n * Full-page payment application shell with a collapsible inset sidebar and a fixed header.\n * On mobile, the sidebar is replaced by a bottom navigation bar (up to 5 items).\n *\n * @example\n * ```tsx\n * import { PaymentLayout } from '@customafk/lunas-ui/layouts/payment-layout';\n * import { CreditCardIcon } from 'lucide-react';\n *\n * <PaymentLayout\n * activeNavItemId=\"transactions\"\n * sidebar={{\n * groupcontent: [\n * {\n * id: 'payment',\n * label: 'Payment',\n * items: [\n * { id: 'transactions', label: 'Transactions', icon: <CreditCardIcon />, onClick: () => router.push('/transactions') },\n * ],\n * },\n * ],\n * }}\n * user={{ fullname: 'Nguyen Van A', email: 'a@example.com' }}\n * onLogin={() => setLoginOpen(true)}\n * onLogout={() => authService.logout()}\n * >\n * <TransactionsPage />\n * </PaymentLayout>\n * ```\n */\nexport const PaymentLayout: React.FC<\n React.PropsWithChildren<{\n /** ID of the currently active navigation item; matched against each item's `id` to apply the active style. */\n activeNavItemId?: string;\n /** Sidebar navigation definition; omitting this prop renders an empty sidebar. */\n sidebar?: {\n groupcontent: {\n /** Unique identifier for the group, used as React key. */\n id: string;\n /** Optional section heading rendered above the group's items. */\n label?: string;\n items: {\n /** Unique identifier for the nav item, used as React key and for active-state comparison. */\n id: string;\n /** Human-readable label rendered inside the sidebar button. */\n label: string;\n /** Optional icon element rendered to the left of the label. */\n icon?: React.ReactNode;\n /** Callback fired when the sidebar button is clicked. */\n onClick?: () => void;\n }[];\n }[];\n };\n /** Authenticated user; when provided the header shows user info and a logout option, otherwise a login button. */\n user?: PaymentLayoutUser | null;\n /** When false the sidebar and bottom nav are hidden entirely (e.g. unauthenticated state). Defaults to true. */\n isLogin?: boolean;\n /** Called when the login button in the header is clicked (only shown when `user` is absent). */\n onLogin?: () => void;\n /** Called when the logout item in the user dropdown is clicked. */\n onLogout?: () => void;\n }>\n> = ({ activeNavItemId, sidebar, user, isLogin = true, onLogin, onLogout, children }) => {\n const groupcontent = useMemo(() => {\n return sidebar?.groupcontent || [];\n }, [sidebar]);\n\n const flatNavItems = useMemo(() => {\n return groupcontent.flatMap(group => group.items);\n }, [groupcontent]);\n\n return (\n <SidebarProvider>\n <PaymentLayoutHeader user={user} isLogin={isLogin} onLogin={onLogin} onLogout={onLogout} />\n\n {isLogin && (\n <Sidebar variant=\"inset\" collapsible=\"icon\">\n <SidebarContent>\n {groupcontent.map(group => {\n return (\n <SidebarGroup key={group.id}>\n <SidebarGroupLabel>{group.label}</SidebarGroupLabel>\n <SidebarGroupContent>\n <SidebarMenu>\n {group.items.map(item => {\n return (\n <SidebarMenuItem key={item.id}>\n <SidebarMenuButton\n isActive={item.id === activeNavItemId}\n onClick={event => {\n item.onClick?.();\n event.preventDefault();\n event.stopPropagation();\n }}\n >\n {item.icon}\n {item.label}\n </SidebarMenuButton>\n </SidebarMenuItem>\n );\n })}\n </SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n );\n })}\n </SidebarContent>\n <SidebarFooter>\n <SidebarMenu>\n <SidebarMenuItem className=\"mt-2 border-t border-t-border\">\n <p className=\"pt-2 text-center text-muted-foreground text-xs\">Copyright © 2025, Lunas.</p>\n </SidebarMenuItem>\n </SidebarMenu>\n </SidebarFooter>\n </Sidebar>\n )}\n\n <SidebarInset>\n <section className=\"relative size-full\">\n <div className={cn('absolute inset-0 overflow-y-auto', isLogin && 'pb-16 md:pb-0')}>{children}</div>\n </section>\n </SidebarInset>\n\n {isLogin && <MobileBottomNav items={flatNavItems} activeNavItemId={activeNavItemId} />}\n </SidebarProvider>\n );\n};\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./close-_UHFeiLS.mjs";import{cn as t}from"@customafk/react-toolkit/utils";import{jsx as n}from"react/jsx-runtime";import{Popover as r}from"radix-ui";function i({...e}){return n(r.Root,{"data-slot":`popover`,...e})}function a({...e}){return n(r.Trigger,{"data-slot":`popover-trigger`,...e})}function o({className:e,align:i=`start`,sideOffset:a=4,...o}){return n(r.Portal,{children:n(r.Content,{"data-slot":`popover-content`,align:i,sideOffset:a,className:t(`relative bg-popover`,`text-text-positive`,`z-50`,`min-w-(--radix-popover-trigger-width)`,`max-h-(--radix-popover-content-available-height)`,`origin-(--radix-popover-content-transform-origin)`,`rounded-md p-4 shadow-dropdown outline-none`,`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`,`data-[side=bottom]:slide-in-from-top-2`,`data-[side=left]:slide-in-from-right-2`,`data-[side=right]:slide-in-from-left-2`,`data-[side=top]:slide-in-from-bottom-2`,e),...o})})}function s({...e}){return n(r.Anchor,{"data-slot":`popover-anchor`,...e})}function c({className:t,...i}){return n(r.Close,{"data-slot":`popover-close`,...i,asChild:!0,children:n(e,{className:`absolute top-2 right-2`})})}export{a,o as i,s as n,c as r,i as t};
|
|
2
|
-
//# sourceMappingURL=popover-C8rcemA3.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"popover-C8rcemA3.mjs","names":["Popover","PopoverPrimitive"],"sources":["../packages/components/ui/popover.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Popover as PopoverPrimitive } from 'radix-ui';\nimport { CloseButton } from './buttons/close';\n\n/**\n * Floating panel built on Radix UI's Popover primitives, anchored to a trigger element with animated open/close transitions.\n *\n * @example\n * ```tsx\n * import {\n * Popover, PopoverTrigger, PopoverContent, PopoverClose,\n * } from '@customafk/lunas-ui/ui/popover';\n * import { Button } from '@customafk/lunas-ui/ui/button';\n *\n * <Popover>\n * <PopoverTrigger asChild>\n * <Button variant=\"outline\">Open popover</Button>\n * </PopoverTrigger>\n * <PopoverContent>\n * <PopoverClose />\n * <p>Popover body content goes here.</p>\n * </PopoverContent>\n * </Popover>\n * ```\n */\nfunction Popover({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />;\n}\n\n/** Element that opens or closes the popover on click; use `asChild` to render a custom trigger element. */\nfunction PopoverTrigger({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />;\n}\n\n/** Floating content panel rendered in a portal, matching the trigger width and animated on open/close. */\nfunction PopoverContent({ className, align = 'start', sideOffset = 4, ...props }: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'relative bg-popover',\n 'text-text-positive',\n 'z-50',\n 'min-w-(--radix-popover-trigger-width)',\n 'max-h-(--radix-popover-content-available-height)',\n 'origin-(--radix-popover-content-transform-origin)',\n 'rounded-md p-4 shadow-dropdown outline-none',\n\n 'data-[state=open]:animate-in',\n 'data-[state=open]:fade-in-0',\n 'data-[state=open]:zoom-in-95',\n\n 'data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0',\n 'data-[state=closed]:zoom-out-95',\n\n 'data-[side=bottom]:slide-in-from-top-2',\n 'data-[side=left]:slide-in-from-right-2',\n 'data-[side=right]:slide-in-from-left-2',\n 'data-[side=top]:slide-in-from-bottom-2',\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n );\n}\n\n/** Optional anchor element that overrides the trigger as the popover's positioning reference point. */\nfunction PopoverAnchor({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Anchor>) {\n return <PopoverPrimitive.Anchor data-slot=\"popover-anchor\" {...props} />;\n}\n\n/** Close button pre-positioned at the top-right corner of `PopoverContent` using the shared `CloseButton` primitive. */\nfunction PopoverClose({ className, ...props }: React.ComponentProps<typeof PopoverPrimitive.Close>) {\n return (\n <PopoverPrimitive.Close data-slot=\"popover-close\" {...props} asChild>\n <CloseButton className=\"absolute top-2 right-2\" />\n </PopoverPrimitive.Close>\n );\n}\n\nexport { Popover, PopoverAnchor, PopoverContent, PopoverTrigger, PopoverClose };\n"],"mappings":"wKA4BA,SAASA,EAAQ,CAAE,GAAG,GAA6D,CACjF,OAAO,EAACC,EAAiB,KAAA,CAAK,YAAU,UAAU,GAAI,GAAS,CAIjE,SAAS,EAAe,CAAE,GAAG,GAAgE,CAC3F,OAAO,EAACA,EAAiB,QAAA,CAAQ,YAAU,kBAAkB,GAAI,GAAS,CAI5E,SAAS,EAAe,CAAE,YAAW,QAAQ,QAAS,aAAa,EAAG,GAAG,GAAgE,CACvI,OACE,EAACA,EAAiB,OAAA,CAAA,SAChB,EAACA,EAAiB,QAAA,CAChB,YAAU,kBACH,QACK,aACZ,UAAW,EACT,sBACA,qBACA,OACA,wCACA,mDACA,oDACA,8CAEA,+BACA,8BACA,+BAEA,kCACA,iCACA,kCAEA,yCACA,yCACA,yCACA,yCACA,EACD,CACD,GAAI,GACJ,CAAA,CACsB,CAK9B,SAAS,EAAc,CAAE,GAAG,GAA+D,CACzF,OAAO,EAACA,EAAiB,OAAA,CAAO,YAAU,iBAAiB,GAAI,GAAS,CAI1E,SAAS,EAAa,CAAE,YAAW,GAAG,GAA8D,CAClG,OACE,EAACA,EAAiB,MAAA,CAAM,YAAU,gBAAgB,GAAI,EAAO,QAAA,YAC3D,EAAC,EAAA,CAAY,UAAU,yBAAA,CAA2B,EAC3B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"progress-CLeM0e7Z.mjs","names":["Progress","ProgressPrimitive"],"sources":["../packages/components/ui/progress.tsx"],"sourcesContent":["'use client';\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Progress as ProgressPrimitive } from 'radix-ui';\n\n/**\n * A horizontal progress bar that visually represents a completion percentage.\n *\n * @example\n * ```tsx\n * import { Progress } from '@customafk/lunas-ui/ui/progress';\n *\n * <Progress value={65} />\n * ```\n */\nfunction Progress({ className, value, ...props }: React.ComponentProps<typeof ProgressPrimitive.Root>) {\n return (\n <ProgressPrimitive.Root data-slot=\"progress\" className={cn('bg-primary-weak relative h-2 w-full overflow-hidden rounded-full', className)} {...props}>\n <ProgressPrimitive.Indicator\n data-slot=\"progress-indicator\"\n className=\"bg-primary size-full flex-1 transition-all\"\n style={{ transform: `translateX(-${100 - (value || 0)}%)` }}\n />\n </ProgressPrimitive.Root>\n );\n}\n\nexport { Progress };\n"],"mappings":"gIAeA,SAASA,EAAS,CAAE,YAAW,QAAO,GAAG,GAA8D,CACrG,OACE,EAACC,EAAkB,KAAA,CAAK,YAAU,WAAW,UAAW,EAAG,mEAAoE,EAAU,CAAE,GAAI,WAC7I,EAACA,EAAkB,UAAA,CACjB,YAAU,qBACV,UAAU,6CACV,MAAO,CAAE,UAAW,eAAe,KAAO,GAAS,GAAG,IAAK,EAC3D,EACqB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"radio-group-Y9bhdr55.mjs","names":["RadioGroup","RadioGroupPrimitive"],"sources":["../packages/components/ui/radio-group.tsx"],"sourcesContent":["'use client';\n\nimport { CircleIcon } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { RadioGroup as RadioGroupPrimitive } from 'radix-ui';\n\n/**\n * Accessible radio button group built on Radix UI's RadioGroup primitive, where only one option can be selected at a time.\n *\n * @example\n * ```tsx\n * import { RadioGroup, RadioGroupItem } from '@customafk/lunas-ui/ui/radio-group';\n * import { Label } from '@customafk/lunas-ui/ui/label';\n *\n * <RadioGroup defaultValue=\"monthly\">\n * <div className=\"flex items-center gap-2\">\n * <RadioGroupItem value=\"monthly\" id=\"monthly\" />\n * <Label htmlFor=\"monthly\">Monthly</Label>\n * </div>\n * <div className=\"flex items-center gap-2\">\n * <RadioGroupItem value=\"annually\" id=\"annually\" />\n * <Label htmlFor=\"annually\">Annually</Label>\n * </div>\n * </RadioGroup>\n * ```\n */\nfunction RadioGroup({ className, ...props }: React.ComponentProps<typeof RadioGroupPrimitive.Root>) {\n return <RadioGroupPrimitive.Root data-slot=\"radio-group\" className={cn('grid gap-3', className)} {...props} />;\n}\n\n/** Individual radio button within a `RadioGroup`; shows a filled circle indicator when selected. */\nfunction RadioGroupItem({ className, ...props }: React.ComponentProps<typeof RadioGroupPrimitive.Item>) {\n return (\n <RadioGroupPrimitive.Item\n data-slot=\"radio-group-item\"\n className={cn(\n 'aspect-square size-4 shrink-0 rounded-full border border-border shadow-xs outline-none transition-all',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'focus:border-border focus:ring-4 focus:ring-primary-weak',\n 'aria-invalid:border-danger-strong aria-invalid:ring-danger-weak',\n 'aria-readonly:pointer-events-none',\n 'aria-readonly:[&_div]:bg-muted',\n 'aria-readonly:[&_svg]:fill-muted-weak',\n 'aria-readonly:[&_svg]:text-muted-weak',\n className\n )}\n {...props}\n >\n <RadioGroupPrimitive.Indicator data-slot=\"radio-group-indicator\" className=\"relative flex items-center justify-center bg-primary\">\n <div className=\"absolute size-4 rounded-full bg-primary\" />\n <CircleIcon className=\"-translate-1/2 absolute top-1/2 left-1/2 size-2 fill-text-negative-strong text-text-negative\" />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n );\n}\n\nexport { RadioGroup, RadioGroupItem };\n"],"mappings":"sLA4BA,SAASA,EAAW,CAAE,YAAW,GAAG,GAAgE,CAClG,OAAO,EAACC,EAAoB,KAAA,CAAK,YAAU,cAAc,UAAW,EAAG,aAAc,EAAU,CAAE,GAAI,GAAS,CAIhH,SAAS,EAAe,CAAE,YAAW,GAAG,GAAgE,CACtG,OACE,EAACA,EAAoB,KAAA,CACnB,YAAU,mBACV,UAAW,EACT,wGACA,kDACA,2DACA,kEACA,oCACA,iCACA,wCACA,wCACA,EACD,CACD,GAAI,WAEJ,EAACA,EAAoB,UAAA,CAAU,YAAU,wBAAwB,UAAU,iEACzE,EAAC,MAAA,CAAI,UAAU,0CAAA,CAA4C,CAC3D,EAAC,EAAA,CAAW,UAAU,+FAAA,CAAiG,CAAA,EACzF,EACP"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resizable-CpCaSCFB.mjs","names":[],"sources":["../packages/components/ui/resizable.tsx"],"sourcesContent":["'use client';\n\nimport { memo } from 'react';\n\nimport { GripVerticalIcon } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport * as ResizablePrimitive from 'react-resizable-panels';\n\ntype TResizablePanelGroup = React.ComponentProps<typeof ResizablePrimitive.PanelGroup>;\n\ntype TResizablePanel = React.ComponentProps<typeof ResizablePrimitive.Panel>;\n\ntype TResizableHandle = React.ComponentProps<typeof ResizablePrimitive.PanelResizeHandle> & {\n withHandle?: boolean;\n};\n\n/**\n * Root container that manages a group of resizable panels; supports horizontal and vertical orientations.\n *\n * @example\n * ```tsx\n * import { ResizablePanelGroup, ResizablePanel, ResizableHandle } from '@customafk/lunas-ui/ui/resizable';\n *\n * <ResizablePanelGroup direction=\"horizontal\">\n * <ResizablePanel defaultSize={50}>Left</ResizablePanel>\n * <ResizableHandle withHandle />\n * <ResizablePanel defaultSize={50}>Right</ResizablePanel>\n * </ResizablePanelGroup>\n * ```\n */\nconst ResizablePanelGroup = memo<TResizablePanelGroup>(({ className, ...props }) => {\n return (\n <ResizablePrimitive.PanelGroup\n data-slot=\"resizable-panel-group\"\n className={cn('flex h-full w-full data-[panel-group-direction=vertical]:flex-col', className)}\n {...props}\n />\n );\n});\nResizablePanelGroup.displayName = 'ResizablePanelGroup';\n\n/** An individual resizable panel within a ResizablePanelGroup. */\nconst ResizablePanel = memo<TResizablePanel>(({ ...props }) => {\n return <ResizablePrimitive.Panel data-slot=\"resizable-panel\" {...props} />;\n});\nResizablePanel.displayName = 'ResizablePanel';\n\n/**\n * The drag handle placed between two ResizablePanels to resize them.\n *\n * @param withHandle - When true, renders a visible grip icon centered on the handle.\n */\nconst ResizableHandle = memo<TResizableHandle>(({ withHandle, className, ...props }) => {\n return (\n <ResizablePrimitive.PanelResizeHandle\n data-slot=\"resizable-handle\"\n className={cn(\n 'relative flex w-px items-center justify-center bg-border after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 data-[panel-group-direction=vertical]:h-px data-[panel-group-direction=vertical]:w-full data-[panel-group-direction=vertical]:after:left-0 data-[panel-group-direction=vertical]:after:h-1 data-[panel-group-direction=vertical]:after:w-full data-[panel-group-direction=vertical]:after:translate-x-0 data-[panel-group-direction=vertical]:after:-translate-y-1/2 [&[data-panel-group-direction=vertical]>div]:rotate-90',\n className\n )}\n {...props}\n >\n {withHandle && (\n <div className=\"z-10 flex h-4 w-3 items-center justify-center rounded-xs border bg-border\">\n <GripVerticalIcon className=\"size-2.5\" />\n </div>\n )}\n </ResizablePrimitive.PanelResizeHandle>\n );\n});\nResizableHandle.displayName = 'ResizableHandle';\n\nexport { ResizableHandle, ResizablePanel, ResizablePanelGroup };\n"],"mappings":"kNAgCA,MAAM,EAAsB,GAA4B,CAAE,YAAW,GAAG,KAEpE,EAAC,EAAmB,WAAA,CAClB,YAAU,wBACV,UAAW,EAAG,oEAAqE,EAAU,CAC7F,GAAI,GACJ,CAEJ,CACF,EAAoB,YAAc,sBAGlC,MAAM,EAAiB,GAAuB,CAAE,GAAG,KAC1C,EAAC,EAAmB,MAAA,CAAM,YAAU,kBAAkB,GAAI,GAAS,CAC1E,CACF,EAAe,YAAc,iBAO7B,MAAM,EAAkB,GAAwB,CAAE,aAAY,YAAW,GAAG,KAExE,EAAC,EAAmB,kBAAA,CAClB,YAAU,mBACV,UAAW,EACT,4oBACA,EACD,CACD,GAAI,WAEH,GACC,EAAC,MAAA,CAAI,UAAU,qFACb,EAAC,EAAA,CAAiB,UAAU,WAAA,CAAa,EACrC,EAE6B,CAEzC,CACF,EAAgB,YAAc"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as e,t}from"./dialog-CLDnvNH_.mjs";import{a as n,i as r,o as i,r as a,s as o,t as s}from"./command-D6_CSbwJ.mjs";import{ForwardIcon as c,Package2Icon as l}from"lucide-react";import{jsx as u,jsxs as d}from"react/jsx-runtime";const f=({value:e})=>u(i,{value:e,children:d(`div`,{className:`size-full flex space-x-2 items-center`,children:[u(`div`,{className:`size-12 border border-border rounded-lg bg-card`}),d(`div`,{className:`flex flex-col grow text-sm`,children:[d(`p`,{className:`font-semibold`,children:[`Content Item for `,e]}),u(`p`,{className:`font-medium text-text-positive-weak`,children:`100.000VND`})]}),u(`button`,{className:`size-8 flex items-center justify-center grow-0`,children:u(c,{size:20,className:`text-text-positive-weak`})})]})}),p=()=>d(s,{children:[u(n,{placeholder:`Type a command or search...`}),d(o,{children:[d(a,{className:`h-80 flex flex-col items-center justify-center space-y-2`,children:[u(l,{strokeWidth:1,size:64,className:`text-text-positive-weak`}),u(`span`,{className:`ml-2`,children:`No results found.`})]}),d(r,{heading:`Search Results`,children:[u(f,{value:`example-item-1`}),u(f,{value:`example-item-2`}),u(f,{value:`example-item-3`})]})]})]}),m=()=>u(t,{open:!0,children:u(e,{showCloseButton:!1,className:`sm:max-w-3xl`,children:u(p,{})})});export{m as t};
|
|
2
|
-
//# sourceMappingURL=search-modal-Bn-GOOCy.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search-modal-Bn-GOOCy.mjs","names":["Item: React.FC<{\n value: string;\n}>"],"sources":["../packages/components/features/search-modal/components/command.tsx","../packages/components/features/search-modal/index.tsx"],"sourcesContent":["import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '@/components/ui/command';\nimport { ForwardIcon, Package2Icon } from 'lucide-react';\n\nconst Item: React.FC<{\n value: string;\n}> = ({ value }) => {\n return (\n <CommandItem value={value}>\n <div className=\"size-full flex space-x-2 items-center\">\n <div className=\"size-12 border border-border rounded-lg bg-card\" />\n <div className=\"flex flex-col grow text-sm\">\n <p className=\"font-semibold\">Content Item for {value}</p>\n <p className=\"font-medium text-text-positive-weak\">100.000VND</p>\n </div>\n <button className=\"size-8 flex items-center justify-center grow-0\">\n <ForwardIcon size={20} className=\"text-text-positive-weak\" />\n </button>\n </div>\n </CommandItem>\n );\n};\n\nexport const SearchCommand = () => {\n return (\n <Command>\n <CommandInput placeholder=\"Type a command or search...\" />\n <CommandList>\n <CommandEmpty className=\"h-80 flex flex-col items-center justify-center space-y-2\">\n <Package2Icon strokeWidth={1} size={64} className=\"text-text-positive-weak\" />\n <span className=\"ml-2\">No results found.</span>\n </CommandEmpty>\n <CommandGroup heading=\"Search Results\">\n <Item value=\"example-item-1\" />\n <Item value=\"example-item-2\" />\n <Item value=\"example-item-3\" />\n </CommandGroup>\n </CommandList>\n </Command>\n );\n};\n","import { Dialog, DialogContent } from '@/components/ui/dialog';\nimport { SearchCommand } from './components/command';\n\n/**\n * A full-screen command-palette modal that wraps the internal `SearchCommand` component inside an always-open dialog.\n *\n * @example\n * import { SearchModal } from '@customafk/lunas-ui/features/search-modal';\n *\n * // Render conditionally based on application state\n * {isSearchOpen && <SearchModal />}\n */\nexport const SearchModal = () => {\n return (\n <Dialog open>\n <DialogContent showCloseButton={false} className=\"sm:max-w-3xl\">\n <SearchCommand />\n </DialogContent>\n </Dialog>\n );\n};\n"],"mappings":"yOAGA,MAAMA,GAEA,CAAE,WAEJ,EAAC,EAAA,CAAmB,iBAClB,EAAC,MAAA,CAAI,UAAU,kDACb,EAAC,MAAA,CAAI,UAAU,kDAAA,CAAoD,CACnE,EAAC,MAAA,CAAI,UAAU,uCACb,EAAC,IAAA,CAAE,UAAU,0BAAgB,oBAAkB,EAAA,EAAU,CACzD,EAAC,IAAA,CAAE,UAAU,+CAAsC,cAAc,CAAA,EAC7D,CACN,EAAC,SAAA,CAAO,UAAU,0DAChB,EAAC,EAAA,CAAY,KAAM,GAAI,UAAU,2BAA4B,EACtD,GACL,EACM,CAIL,MAET,EAAC,EAAA,CAAA,SAAA,CACC,EAAC,EAAA,CAAa,YAAY,8BAAA,CAAgC,CAC1D,EAAC,EAAA,CAAA,SAAA,CACC,EAAC,EAAA,CAAa,UAAU,qEACtB,EAAC,EAAA,CAAa,YAAa,EAAG,KAAM,GAAI,UAAU,2BAA4B,CAC9E,EAAC,OAAA,CAAK,UAAU,gBAAO,qBAAwB,CAAA,EAClC,CACf,EAAC,EAAA,CAAa,QAAQ,2BACpB,EAAC,EAAA,CAAK,MAAM,iBAAA,CAAmB,CAC/B,EAAC,EAAA,CAAK,MAAM,iBAAA,CAAmB,CAC/B,EAAC,EAAA,CAAK,MAAM,iBAAA,CAAmB,GAClB,CAAA,CAAA,CACH,CAAA,CAAA,CACN,CCzBD,MAET,EAAC,EAAA,CAAO,KAAA,YACN,EAAC,EAAA,CAAc,gBAAiB,GAAO,UAAU,wBAC/C,EAAC,EAAA,EAAA,CAAgB,EACH,EACT"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"select-LlPCZFSF.mjs","names":["Select","SelectPrimitive"],"sources":["../packages/components/ui/select.tsx"],"sourcesContent":["'use client';\n\nimport { CheckIcon, ChevronDownIcon } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Select as SelectPrimitive } from 'radix-ui';\n\n/**\n * Accessible dropdown select built on Radix UI's Select primitives, composed from `Select`, `SelectTrigger`, `SelectContent`, and `SelectItem`.\n *\n * @example\n * ```tsx\n * import {\n * Select, SelectTrigger, SelectValue,\n * SelectContent, SelectItem,\n * } from '@customafk/lunas-ui/ui/select';\n *\n * <Select>\n * <SelectTrigger>\n * <SelectValue placeholder=\"Pick a fruit\" />\n * </SelectTrigger>\n * <SelectContent>\n * <SelectItem value=\"apple\">Apple</SelectItem>\n * <SelectItem value=\"banana\">Banana</SelectItem>\n * </SelectContent>\n * </Select>\n * ```\n */\nfunction Select({ ...props }: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />;\n}\n\n/** Groups related `SelectItem` elements with an optional `SelectLabel` header. */\nfunction SelectGroup({ ...props }: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />;\n}\n\n/** Renders the currently selected value (or a placeholder) inside `SelectTrigger`. */\nfunction SelectValue({ ...props }: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />;\n}\n\n/**\n * The button that opens the select dropdown; renders the current value and a chevron icon.\n *\n * @param size - `'default'` (standard padding) or `'sm'` (compact).\n */\nfunction SelectTrigger({\n className,\n size = 'default',\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n /** Controls the trigger's padding — `'default'` or `'sm'`. */\n size?: 'sm' | 'default';\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n 'flex w-full items-center justify-between',\n 'outline-1 outline-border -outline-offset-1',\n 'gap-2 rounded bg-transparent px-3 py-2',\n 'rounded shadow-input transition-all',\n 'cursor-pointer whitespace-nowrap text-sm',\n\n // Text styles\n 'focus-visible:text-text-positive-strong',\n 'focus-visible:outline-primary-strong',\n 'focus-visible:ring-4',\n 'focus-visible:ring-primary-weak',\n\n // State styles\n 'data-[state=open]:text-text-positive-muted',\n 'data-[state=open]:outline-primary-strong',\n 'data-[state=open]:ring-4',\n 'data-[state=open]:ring-primary-weak',\n 'disabled:cursor-not-allowed',\n 'disabled:opacity-50',\n\n // Invalid state\n 'aria-invalid:bg-danger-bg-subtle',\n 'aria-invalid:outline-danger',\n 'aria-invalid:ring-danger-weak',\n 'aria-invalid:focus:outline-danger-strong',\n 'aria-invalid:focus:ring-4',\n 'aria-invalid:placeholder:text-text-positive-weak',\n 'aria-invalid:data-[state=open]:outline-danger-strong',\n 'aria-invalid:data-[state=open]:ring-danger-weak',\n\n // Placeholder styles\n 'data-placeholder:text-text-positive-muted',\n '*:data-[slot=select-value]:line-clamp-1',\n '*:data-[slot=select-value]:flex',\n '*:data-[slot=select-value]:items-center',\n '*:data-[slot=select-value]:gap-2',\n\n // Readonly state\n 'aria-readonly:bg-muted-muted',\n 'aria-readonly:cursor-default',\n 'aria-readonly:focus:outline-none',\n 'aria-readonly:ring-0',\n 'aria-readonly:pointer-events-none',\n\n // Icon styles\n '[&_svg]:shrink-0',\n '[&_svg]:pointer-events-none',\n \"[&_svg:not([class*='size-'])]:size-4\",\n \"[&_svg:not([class*='text-'])]:text-muted-foreground\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDownIcon size={16} opacity={50} />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n );\n}\n\n/** Floating dropdown panel that renders inside a portal with enter/exit animations. */\nfunction SelectContent({ className, children, position = 'popper', ...props }: React.ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n className={cn(\n 'relative z-50 max-h-80 min-w-32 overflow-y-auto overflow-x-hidden rounded shadow-dropdown duration-300',\n 'bg-white',\n 'w-(--radix-select-trigger-width)',\n 'origin-(--radix-select-content-transform-origin)',\n 'max-h-[min(20rem,var(--radix-select-content-available-height))]',\n\n 'data-[state=open]:animate-in',\n 'data-[state=open]:fade-in',\n\n 'data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out',\n\n 'data-[side=bottom]:slide-in-from-top-8',\n 'data-[side=left]:slide-in-from-right-8',\n 'data-[side=right]:slide-in-from-left-8',\n 'data-[side=top]:slide-in-from-bottom-8',\n\n position === 'popper' && 'data-[side=bottom]:translate-y-1',\n position === 'popper' && 'data-[side=left]:-translate-x-1',\n position === 'popper' && 'data-[side=right]:translate-x-1',\n position === 'popper' && 'data-[side=top]:-translate-y-1',\n className\n )}\n position={position}\n {...props}\n >\n <SelectPrimitive.Viewport\n className={cn(\n 'p-1',\n position === 'popper' && 'w-full scroll-my-1',\n position === 'popper' && 'h-(--radix-select-trigger-height)',\n position === 'popper' && 'min-w-(--radix-select-trigger-width)'\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n );\n}\n\n/** Non-interactive label displayed above a `SelectGroup` to describe its options. */\nfunction SelectLabel({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return <SelectPrimitive.Label data-slot=\"select-label\" className={cn('px-2 py-1.5 text-text-positive-weak text-xs', className)} {...props} />;\n}\n\n/** A selectable option within `SelectContent`; shows a check icon when chosen. */\nfunction SelectItem({ className, children, ...props }: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n 'relative flex select-none items-center',\n 'gap-2 rounded py-2.5 pr-8 pl-2',\n 'w-full',\n 'cursor-pointer outline-none transition-colors',\n 'font-medium text-sm text-text-positive-weak',\n\n 'focus:shadow-xs',\n 'focus:bg-muted-muted',\n\n 'data-disabled:opacity-50',\n 'data-disabled:pointer-events-none',\n\n '[&_svg]:pointer-events-none',\n '[&_svg]:shrink-0',\n \"[&_svg:not([class*='size-'])]:size-4\",\n \"[&_svg:not([class*='text-'])]:text-text-positive-weak\",\n\n '*:[span]:last:flex',\n '*:[span]:last:items-center',\n '*:[span]:last:gap-2',\n className\n )}\n {...props}\n >\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n <span className=\"absolute right-2 flex size-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <CheckIcon size={16} />\n </SelectPrimitive.ItemIndicator>\n </span>\n </SelectPrimitive.Item>\n );\n}\n\n/** Thin horizontal rule used to visually separate groups of `SelectItem` elements. */\nfunction SelectSeparator({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return <SelectPrimitive.Separator data-slot=\"select-separator\" className={cn('-mx-1 pointer-events-none my-1 h-px bg-border-weak', className)} {...props} />;\n}\n\nexport { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectSeparator, SelectTrigger, SelectValue };\n"],"mappings":"sMA6BA,SAASA,EAAO,CAAE,GAAG,GAA4D,CAC/E,OAAO,EAACC,EAAgB,KAAA,CAAK,YAAU,SAAS,GAAI,GAAS,CAI/D,SAAS,EAAY,CAAE,GAAG,GAA6D,CACrF,OAAO,EAACA,EAAgB,MAAA,CAAM,YAAU,eAAe,GAAI,GAAS,CAItE,SAAS,EAAY,CAAE,GAAG,GAA6D,CACrF,OAAO,EAACA,EAAgB,MAAA,CAAM,YAAU,eAAe,GAAI,GAAS,CAQtE,SAAS,EAAc,CACrB,YACA,OAAO,UACP,WACA,GAAG,GAIF,CACD,OACE,EAACA,EAAgB,QAAA,CACf,YAAU,iBACV,YAAW,EACX,UAAW,EACT,2CACA,6CACA,yCACA,sCACA,2CAGA,0CACA,uCACA,uBACA,kCAGA,6CACA,2CACA,2BACA,sCACA,8BACA,sBAGA,mCACA,8BACA,gCACA,2CACA,4BACA,mDACA,uDACA,kDAGA,4CACA,0CACA,kCACA,0CACA,mCAGA,+BACA,+BACA,mCACA,uBACA,oCAGA,mBACA,8BACA,uCACA,sDACA,EACD,CACD,GAAI,YAEH,EACD,EAACA,EAAgB,KAAA,CAAK,QAAA,YACpB,EAAC,EAAA,CAAgB,KAAM,GAAI,QAAS,IAAM,EACrB,CAAA,EACC,CAK9B,SAAS,EAAc,CAAE,YAAW,WAAU,WAAW,SAAU,GAAG,GAA+D,CACnI,OACE,EAACA,EAAgB,OAAA,CAAA,SACf,EAACA,EAAgB,QAAA,CACf,YAAU,iBACV,UAAW,EACT,yGACA,WACA,mCACA,mDACA,kEAEA,+BACA,4BAEA,kCACA,+BAEA,yCACA,yCACA,yCACA,yCAEA,IAAa,UAAY,mCACzB,IAAa,UAAY,kCACzB,IAAa,UAAY,kCACzB,IAAa,UAAY,iCACzB,EACD,CACS,WACV,GAAI,WAEJ,EAACA,EAAgB,SAAA,CACf,UAAW,EACT,MACA,IAAa,UAAY,qBACzB,IAAa,UAAY,oCACzB,IAAa,UAAY,uCAC1B,CAEA,YACwB,EACH,CAAA,CACH,CAK7B,SAAS,EAAY,CAAE,YAAW,GAAG,GAA6D,CAChG,OAAO,EAACA,EAAgB,MAAA,CAAM,YAAU,eAAe,UAAW,EAAG,8CAA+C,EAAU,CAAE,GAAI,GAAS,CAI/I,SAAS,EAAW,CAAE,YAAW,WAAU,GAAG,GAA4D,CACxG,OACE,EAACA,EAAgB,KAAA,CACf,YAAU,cACV,UAAW,EACT,yCACA,iCACA,SACA,gDACA,8CAEA,kBACA,uBAEA,2BACA,oCAEA,8BACA,mBACA,uCACA,wDAEA,qBACA,6BACA,sBACA,EACD,CACD,GAAI,YAEJ,EAACA,EAAgB,SAAA,CAAU,WAAA,CAAoC,CAC/D,EAAC,OAAA,CAAK,UAAU,sEACd,EAACA,EAAgB,cAAA,CAAA,SACf,EAAC,EAAA,CAAU,KAAM,GAAA,CAAM,CAAA,CACO,EAC3B,CAAA,EACc,CAK3B,SAAS,EAAgB,CAAE,YAAW,GAAG,GAAiE,CACxG,OAAO,EAACA,EAAgB,UAAA,CAAU,YAAU,mBAAmB,UAAW,EAAG,qDAAsD,EAAU,CAAE,GAAI,GAAS"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"separator-D3Gmkxzq.mjs","names":["Separator","SeparatorPrimitive"],"sources":["../packages/components/ui/separator.tsx"],"sourcesContent":["'use client';\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Separator as SeparatorPrimitive } from 'radix-ui';\n\n/**\n * Thin visual divider built on Radix UI's Separator primitive, supporting horizontal and vertical orientations.\n *\n * @example\n * ```tsx\n * import { Separator } from '@customafk/lunas-ui/ui/separator';\n *\n * <div className=\"space-y-4\">\n * <p>Section one</p>\n * <Separator />\n * <p>Section two</p>\n * </div>\n *\n * <div className=\"flex h-8 items-center gap-4\">\n * <span>Left</span>\n * <Separator orientation=\"vertical\" />\n * <span>Right</span>\n * </div>\n * ```\n */\nfunction Separator({ className, orientation = 'horizontal', decorative = true, ...props }: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n 'bg-border-weak shrink-0',\n 'data-[orientation=horizontal]:h-px',\n 'data-[orientation=horizontal]:w-full',\n 'data-[orientation=vertical]:h-full',\n 'data-[orientation=vertical]:w-px',\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Separator };\n"],"mappings":"iIAyBA,SAASA,EAAU,CAAE,YAAW,cAAc,aAAc,aAAa,GAAM,GAAG,GAA+D,CAC/I,OACE,EAACC,EAAmB,KAAA,CAClB,YAAU,YACE,aACC,cACb,UAAW,EACT,0BACA,qCACA,uCACA,qCACA,mCACA,EACD,CACD,GAAI,GACJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sheet-BFlIfNaA.mjs","names":["SheetPrimitive"],"sources":["../packages/components/ui/sheet.tsx"],"sourcesContent":["'use client';\n\nimport { XIcon } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Dialog as SheetPrimitive } from 'radix-ui';\n\n/**\n * Root provider for the Sheet panel — wraps all Sheet sub-components and manages open state.\n *\n * @example\n * ```tsx\n * import { Sheet, SheetTrigger, SheetContent, SheetHeader, SheetTitle, SheetDescription } from '@customafk/lunas-ui/ui/sheet';\n *\n * <Sheet>\n * <SheetTrigger>Open</SheetTrigger>\n * <SheetContent side=\"right\">\n * <SheetHeader>\n * <SheetTitle>Settings</SheetTitle>\n * <SheetDescription>Manage your preferences.</SheetDescription>\n * </SheetHeader>\n * </SheetContent>\n * </Sheet>\n * ```\n */\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />;\n}\n\n/** Button or element that opens the Sheet when interacted with. */\nfunction SheetTrigger({ ...props }: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />;\n}\n\n/** Button that programmatically closes the Sheet. */\nfunction SheetClose({ ...props }: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />;\n}\n\n/** Portals Sheet content outside the current DOM hierarchy. */\nfunction SheetPortal({ ...props }: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />;\n}\n\n/** Semi-transparent backdrop rendered behind the Sheet panel. */\nfunction SheetOverlay({ className, ...props }: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-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\n/**\n * The sliding panel itself; renders on the specified `side` of the viewport and includes a built-in close button.\n */\nfunction SheetContent({\n className,\n children,\n side = 'right',\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n /** Edge of the viewport from which the sheet slides in. */\n side?: 'top' | 'right' | 'bottom' | 'left';\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n className={cn(\n 'bg-background',\n 'fixed z-50 flex flex-col gap-4 border-border-weak shadow-dropdown transition ease-in-out',\n\n 'data-[state=open]:animate-in',\n 'data-[state=open]:duration-500',\n 'data-[state=closed]:animate-out',\n 'data-[state=closed]:duration-300',\n\n side === 'right' && 'inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm',\n side === 'right' && 'data-[state=closed]:slide-out-to-right',\n side === 'right' && 'data-[state=open]:slide-in-from-right',\n\n side === 'left' && 'inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm',\n side === 'left' && 'data-[state=closed]:slide-out-to-left',\n side === 'left' && 'data-[state=open]:slide-in-from-left',\n\n side === 'top' && 'inset-x-0 top-0 h-auto border-b',\n side === 'top' && 'data-[state=closed]:slide-out-to-top',\n side === 'top' && 'data-[state=open]:slide-in-from-top',\n\n side === 'bottom' && 'inset-x-0 bottom-0 h-auto border-t',\n side === 'bottom' && 'data-[state=closed]:slide-out-to-bottom',\n side === 'bottom' && 'data-[state=open]:slide-in-from-bottom',\n className\n )}\n {...props}\n >\n {children}\n <SheetPrimitive.Close\n className={cn(\n 'cursor-pointer p-2 ring-offset-background',\n 'absolute top-2 right-2 rounded-full opacity-70 transition-opacity',\n 'data-[state=open]:bg-secondary',\n 'disabled:pointer-events-none',\n 'hover:opacity-100',\n 'hover:bg-border-muted',\n 'focus:ring-border-weak',\n 'focus:ring-4',\n 'focus:outline-hidden'\n )}\n >\n <XIcon className=\"size-5\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n </SheetPrimitive.Content>\n </SheetPortal>\n );\n}\n\n/** Padded container for the Sheet title and description at the top of the panel. */\nfunction SheetHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"sheet-header\" className={cn('flex flex-0 flex-col gap-1.5 p-4', className)} {...props} />;\n}\n\n/** Sticky footer area at the bottom of the Sheet panel, typically used for action buttons. */\nfunction SheetFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"sheet-footer\" className={cn('mt-auto flex flex-0 flex-col gap-2 p-4', className)} {...props} />;\n}\n\n/** Accessible title element for the Sheet, announced by screen readers on open. */\nfunction SheetTitle({ className, ...props }: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return <SheetPrimitive.Title data-slot=\"sheet-title\" className={cn('font-semibold text-text-positive-strong', className)} {...props} />;\n}\n\n/** Accessible description element for the Sheet, providing supplemental context to the title. */\nfunction SheetDescription({ className, ...props }: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return <SheetPrimitive.Description data-slot=\"sheet-description\" className={cn('text-sm text-text-positive-weak', className)} {...props} />;\n}\n\nexport { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger };\n"],"mappings":"6KA0BA,SAAS,EAAM,CAAE,GAAG,GAA2D,CAC7E,OAAO,EAACA,EAAe,KAAA,CAAK,YAAU,QAAQ,GAAI,GAAS,CAI7D,SAAS,EAAa,CAAE,GAAG,GAA8D,CACvF,OAAO,EAACA,EAAe,QAAA,CAAQ,YAAU,gBAAgB,GAAI,GAAS,CAIxE,SAAS,EAAW,CAAE,GAAG,GAA4D,CACnF,OAAO,EAACA,EAAe,MAAA,CAAM,YAAU,cAAc,GAAI,GAAS,CAIpE,SAAS,EAAY,CAAE,GAAG,GAA6D,CACrF,OAAO,EAACA,EAAe,OAAA,CAAO,YAAU,eAAe,GAAI,GAAS,CAItE,SAAS,EAAa,CAAE,YAAW,GAAG,GAA8D,CAClG,OACE,EAACA,EAAe,QAAA,CACd,YAAU,gBACV,UAAW,EACT,iCACA,+BACA,kCACA,iCACA,8BACA,EACD,CACD,GAAI,GACJ,CAON,SAAS,EAAa,CACpB,YACA,WACA,OAAO,QACP,GAAG,GAIF,CACD,OACE,EAAC,EAAA,CAAA,SAAA,CACC,EAAC,EAAA,EAAA,CAAe,CAChB,EAACA,EAAe,QAAA,CACd,YAAU,gBACV,UAAW,EACT,gBACA,2FAEA,+BACA,iCACA,kCACA,mCAEA,IAAS,SAAW,sDACpB,IAAS,SAAW,yCACpB,IAAS,SAAW,wCAEpB,IAAS,QAAU,qDACnB,IAAS,QAAU,wCACnB,IAAS,QAAU,uCAEnB,IAAS,OAAS,kCAClB,IAAS,OAAS,uCAClB,IAAS,OAAS,sCAElB,IAAS,UAAY,qCACrB,IAAS,UAAY,0CACrB,IAAS,UAAY,yCACrB,EACD,CACD,GAAI,YAEH,EACD,EAACA,EAAe,MAAA,CACd,UAAW,EACT,4CACA,oEACA,iCACA,+BACA,oBACA,wBACA,yBACA,eACA,uBACD,WAED,EAAC,EAAA,CAAM,UAAU,SAAA,CAAW,CAC5B,EAAC,OAAA,CAAK,UAAU,mBAAU,SAAY,CAAA,EACjB,CAAA,EACA,CAAA,CAAA,CACb,CAKlB,SAAS,EAAY,CAAE,YAAW,GAAG,GAAsC,CACzE,OAAO,EAAC,MAAA,CAAI,YAAU,eAAe,UAAW,EAAG,mCAAoC,EAAU,CAAE,GAAI,GAAS,CAIlH,SAAS,EAAY,CAAE,YAAW,GAAG,GAAsC,CACzE,OAAO,EAAC,MAAA,CAAI,YAAU,eAAe,UAAW,EAAG,yCAA0C,EAAU,CAAE,GAAI,GAAS,CAIxH,SAAS,EAAW,CAAE,YAAW,GAAG,GAA4D,CAC9F,OAAO,EAACA,EAAe,MAAA,CAAM,YAAU,cAAc,UAAW,EAAG,0CAA2C,EAAU,CAAE,GAAI,GAAS,CAIzI,SAAS,EAAiB,CAAE,YAAW,GAAG,GAAkE,CAC1G,OAAO,EAACA,EAAe,YAAA,CAAY,YAAU,oBAAoB,UAAW,EAAG,kCAAmC,EAAU,CAAE,GAAI,GAAS"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./button-CCVJTHBI.mjs";import{t}from"./skeleton-C51IdOfK.mjs";import{i as n,n as r,r as i,t as a}from"./tooltip-Dxl5Wa8i.mjs";import{t as o}from"./separator-D3Gmkxzq.mjs";import{i as s,o as c,r as l,s as u,t as d}from"./sheet-BFlIfNaA.mjs";import{MenuIcon as f}from"lucide-react";import{createContext as p,use as m,useCallback as h,useEffect as g,useMemo as _,useState as v}from"react";import{cn as y}from"@customafk/react-toolkit/utils";import{cva as b}from"class-variance-authority";import{jsx as x,jsxs as S}from"react/jsx-runtime";import{Slot as C}from"radix-ui";import{useIsMobile as w}from"@customafk/react-toolkit/hooks/useMobile";const T=p(null);function E(){let e=m(T);if(!e)throw Error(`useSidebar must be used within a SidebarProvider.`);return e}function D({defaultOpen:e=!0,open:t,onOpenChange:n,className:r,style:a,children:o,...s}){let c=w(),[l,u]=v(!1),[d,f]=v(e),p=t??d,m=h(e=>{let t=typeof e==`function`?e(p):e;n?n(t):f(t),document.cookie=`detail_dialog_sidebar_state=${t}; path=/; max-age=604800`},[n,p]),b=h(()=>c?u(e=>!e):m(e=>!e),[c,m]);g(()=>{let e=e=>{e.key===`p`&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),b())};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[b]);let S=p?`expanded`:`collapsed`,C=_(()=>({state:S,isMobile:c,toggleSidebar:b,open:p,setOpen:m,openMobile:l,setOpenMobile:u}),[S,c,p,m,l,b]);return x(T.Provider,{value:C,children:x(i,{delayDuration:0,children:x(`div`,{"data-slot":`sidebar-wrapper`,style:{"--sidebar-width":`18rem`,"--sidebar-width-icon":`3rem`,...a},className:y(`group/sidebar-wrapper flex h-full min-h-[85dvh] w-full items-start has-data-[variant=inset]:bg-sidebar`,r),...s,children:o})})})}function O({side:e=`left`,variant:t=`sidebar`,collapsible:n=`offcanvas`,className:r,children:i,...a}){let{state:o,isMobile:f,openMobile:p,setOpenMobile:m}=E();return n===`none`?x(`div`,{"data-slot":`sidebar`,className:y(`flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground`,r),...a,children:i}):f?x(d,{open:p,onOpenChange:m,...a,children:S(l,{"data-sidebar":`sidebar`,"data-slot":`sidebar`,"data-mobile":`true`,className:`z-20 hidden w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground shadow-nav md:flex [&>button]:hidden`,style:{"--sidebar-width":`18rem`},side:e,children:[S(c,{className:`sr-only`,children:[x(u,{children:`Sidebar`}),x(s,{children:`Displays the mobile sidebar.`})]}),x(`div`,{className:`flex h-full w-full flex-col`,children:i})]})}):S(`div`,{className:`group peer hidden text-sidebar-foreground md:block`,"data-state":o,"data-collapsible":o===`collapsed`?n:``,"data-variant":t,"data-side":e,"data-slot":`sidebar`,children:[x(`div`,{"data-slot":`sidebar-gap`,className:y(`relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear`,`group-data-[collapsible=offcanvas]:w-0`,`group-data-[side=right]:rotate-180`,t===`floating`||t===`inset`?`group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]`:`group-data-[collapsible=icon]:w-(--sidebar-width-icon)`)}),x(`div`,{"data-slot":`sidebar-container`,className:y(`absolute inset-y-0 z-20 hidden w-(--sidebar-width) shadow-nav transition-[left,right,width] duration-200 ease-linear md:flex`,e===`left`?`left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]`:`right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]`,t===`floating`||t===`inset`?`p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]`:`group-data-[collapsible=icon]:w-(--sidebar-width-icon)`,r),...a,children:x(`div`,{"data-sidebar":`sidebar`,"data-slot":`sidebar-inner`,className:y(`flex size-full flex-col shadow-nav`,`group-data-[variant=floating]:rounded-lg`,`group-data-[variant=floating]:border`,`group-data-[variant=floating]:border-sidebar-border`,`group-data-[variant=floating]:shadow-sm`),children:i})})]})}function k({className:t,onClick:n,...r}){let{toggleSidebar:i}=E();return S(e,{"data-sidebar":`trigger`,"data-slot":`sidebar-trigger`,variant:`ghost`,color:`secondary`,size:`icon`,className:y(`size-10 rounded-full [&_svg]:size-6!`,t),onClick:e=>{n?.(e),i()},...r,children:[x(f,{}),x(`span`,{className:`sr-only`,children:`Toggle Sidebar`})]})}function A({className:e,...t}){let{toggleSidebar:n}=E();return x(`button`,{"data-sidebar":`rail`,"data-slot":`sidebar-rail`,"aria-label":`Toggle Sidebar`,tabIndex:-1,onClick:n,title:`Toggle Sidebar`,className:y(`absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear sm:flex`,`after:absolute after:inset-y-0 after:left-1/2 after:w-0.5`,`hover:after:bg-sidebar-border`,`group-data-[side=left]:-right-4 group-data-[side=right]:left-0`,`in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize`,`[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize`,`hover:group-data-[collapsible=offcanvas]:bg-sidebar`,`group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full`,`[[data-side=left][data-collapsible=offcanvas]_&]:-right-2`,`[[data-side=right][data-collapsible=offcanvas]_&]:-left-2`,e),...t})}function j({className:e,...t}){return x(`main`,{"data-slot":`sidebar-inset`,className:y(`relative flex w-full flex-1 flex-col bg-background`,`md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0`,`md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm`,`md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2`,e),...t})}function M({className:e,...t}){return x(`div`,{"data-slot":`sidebar-header`,"data-sidebar":`header`,className:y(`flex flex-col gap-2 p-2`,e),...t})}function N({className:e,children:t,...n}){let{open:r}=E();return x(`div`,{"data-slot":`sidebar-footer`,"data-sidebar":`footer`,className:y(`flex flex-col gap-2 p-2`,e),...n,children:S(B,{children:[r&&x(V,{children:t}),x(V,{children:S(`p`,{className:`pt-2 text-center text-xs text-text-positive-subtle`,children:[`Copyright © `,new Date().getFullYear(),`, Lunas.`]})})]})})}function P({className:e,...t}){return x(o,{"data-slot":`sidebar-separator`,"data-sidebar":`separator`,className:y(`mx-2 w-auto bg-sidebar-border`,e),...t})}function F({className:e,...t}){return x(`div`,{"data-slot":`sidebar-content`,"data-sidebar":`content`,className:y(`flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden`,e),...t})}function I({className:e,...t}){return x(`div`,{"data-slot":`sidebar-group`,"data-sidebar":`group`,className:y(`relative flex w-full min-w-0 flex-col p-2`,e),...t})}function L({className:e,asChild:t=!1,...n}){return x(t?C.Slot:`div`,{"data-slot":`sidebar-group-label`,"data-sidebar":`group-label`,className:y(`flex h-8 shrink-0 items-center rounded-md px-2 font-medium text-sidebar-foreground/70 text-xs outline-hidden ring-sidebar-ring transition-[margin,opacity,color] duration-200 ease-linear focus-visible:ring-2`,`[&>svg]:size-4 [&>svg]:shrink-0`,`group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0`,e),...n})}function R({className:e,asChild:t=!1,...n}){return x(t?C.Slot:`button`,{"data-slot":`sidebar-group-action`,"data-sidebar":`group-action`,className:y(`absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-hidden ring-sidebar-ring transition-[background-color,color,transform]`,`hover:bg-sidebar-accent hover:text-sidebar-accent-foreground`,`focus-visible:ring-2`,`[&>svg]:size-4 [&>svg]:shrink-0`,`after:absolute after:-inset-2 md:after:hidden`,`group-data-[collapsible=icon]:hidden`,e),...n})}function z({className:e,...t}){return x(`div`,{"data-slot":`sidebar-group-content`,"data-sidebar":`group-content`,className:y(`w-full text-sm`,e),...t})}function B({className:e,...t}){return x(`ul`,{"data-slot":`sidebar-menu`,"data-sidebar":`menu`,className:y(`flex w-full min-w-0 flex-col gap-1`,e),...t})}function V({className:e,...t}){return x(`li`,{"data-slot":`sidebar-menu-item`,"data-sidebar":`menu-item`,className:y(`group/menu-item relative`,e),...t})}const H=b([`peer/menu-button`,`cursor-pointer`,`flex w-full items-center gap-2`,`overflow-hidden rounded-md p-2 outline-hidden`,`truncate text-left font-normal`,`transition-[color,background-color,width,height,padding]`,`active:bg-sidebar-accent active:text-sidebar-accent-foreground`,`disabled:pointer-events-none disabled:opacity-50`,`group-has-data-[sidebar=menu-action]/menu-item:pr-8`,`aria-disabled:pointer-events-none aria-disabled:opacity-50`,`data-[active=true]:bg-sidebar-primary-muted data-[active=true]:font-normal data-[active=true]:text-sidebar-primary`,`data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground`,`group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2!`,`[&>svg]:size-4 [&>svg]:shrink-0`,`[&>span:last-child]:truncate`],{variants:{variant:{default:`hover:bg-sidebar-accent/60 hover:text-sidebar-accent-foreground`,outline:`bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]`},size:{default:`h-8 text-sm`,sm:`h-7 text-xs`,lg:`h-12 text-sm group-data-[collapsible=icon]:p-0!`}},defaultVariants:{variant:`default`,size:`default`}});function U({asChild:e=!1,isActive:t=!1,variant:i=`default`,size:o=`default`,tooltip:s,className:c,...l}){let u=e?C.Slot:`button`,{state:d}=E(),f=x(u,{"data-slot":`sidebar-menu-button`,"data-sidebar":`menu-button`,"data-size":o,"data-active":t,className:y(H({variant:i,size:o}),c),...l});return s?(typeof s==`string`&&(s={children:s}),S(a,{children:[x(n,{asChild:!0,children:f}),x(r,{side:`right`,align:`center`,hidden:d!==`collapsed`,...s})]})):f}function W({className:e,asChild:t=!1,showOnHover:n=!1,...r}){return x(t?C.Slot:`button`,{"data-slot":`sidebar-menu-action`,"data-sidebar":`menu-action`,className:y(`absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden`,`text-sidebar-foreground ring-sidebar-ring`,`transition-[background-color,color,opacity]`,`hover:bg-sidebar-accent hover:text-sidebar-accent-foreground`,`focus-visible:ring-2`,`peer-hover/menu-button:text-sidebar-accent-foreground`,`[&>svg]:size-4 [&>svg]:shrink-0`,`after:absolute after:-inset-2 md:after:hidden`,`peer-data-[size=sm]/menu-button:top-1`,`peer-data-[size=default]/menu-button:top-1.5`,`peer-data-[size=lg]/menu-button:top-2.5`,`group-data-[collapsible=icon]:hidden`,n&&`peer-data-[active=true]/menu-button:text-sidebar-accent-foreground`,n&&`group-focus-within/menu-item:opacity-100`,n&&`group-hover/menu-item:opacity-100`,n&&`data-[state=open]:opacity-100 md:opacity-0`,e),...r})}function G({className:e,...t}){return x(`div`,{"data-slot":`sidebar-menu-badge`,"data-sidebar":`menu-badge`,className:y(`pointer-events-none absolute right-1 flex h-5 min-w-5 select-none items-center justify-center rounded-md px-1 font-medium text-sidebar-foreground text-xs tabular-nums transition-colors`,`peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground`,`peer-data-[size=sm]/menu-button:top-1`,`peer-data-[size=default]/menu-button:top-1.5`,`peer-data-[size=lg]/menu-button:top-2.5`,`group-data-[collapsible=icon]:hidden`,e),...t})}function K({className:e,showIcon:n=!1,...r}){let i=_(()=>`${Math.floor(Math.random()*40)+50}%`,[]);return S(`div`,{"data-slot":`sidebar-menu-skeleton`,"data-sidebar":`menu-skeleton`,className:y(`flex h-8 items-center gap-2 rounded-md px-2`,e),...r,children:[n&&x(t,{className:`size-4 rounded-md`,"data-sidebar":`menu-skeleton-icon`}),x(t,{className:`h-4 max-w-(--skeleton-width) flex-1`,"data-sidebar":`menu-skeleton-text`,style:{"--skeleton-width":i}})]})}function q({className:e,...t}){return x(`ul`,{"data-slot":`sidebar-menu-sub`,"data-sidebar":`menu-sub`,className:y(`mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5`,`group-data-[collapsible=icon]:hidden`,e),...t})}function J({className:e,...t}){return x(`li`,{"data-slot":`sidebar-menu-sub-item`,"data-sidebar":`menu-sub-item`,className:y(`group/menu-sub-item relative`,e),...t})}function Y({asChild:e=!1,size:t=`md`,isActive:n=!1,className:r,...i}){return x(e?C.Slot:`a`,{"data-slot":`sidebar-menu-sub-button`,"data-sidebar":`menu-sub-button`,"data-size":t,"data-active":n,className:y(`text-sidebar-foreground ring-sidebar-ring`,`flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 outline-hidden`,`transition-[background-color,color]`,`hover:bg-sidebar-accent hover:text-sidebar-accent-foreground`,`active:bg-sidebar-accent active:text-sidebar-accent-foreground`,`focus-visible:ring-2`,`disabled:pointer-events-none disabled:opacity-50`,`aria-disabled:pointer-events-none aria-disabled:opacity-50`,`data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground`,`group-data-[collapsible=icon]:hidden`,`[&>span:last-child]:truncate`,`[&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground`,t===`sm`&&`text-xs`,t===`md`&&`text-sm`,r),...i})}export{E as C,D as S,A as _,z as a,O as b,B as c,U as d,V as f,J as g,Y as h,R as i,W as l,q as m,N as n,L as o,K as p,I as r,M as s,F as t,G as u,P as v,j as x,k as y};
|
|
2
|
-
//# sourceMappingURL=sidebar-ChtCyu-n.mjs.map
|