@omnifyjp/ui 0.5.3 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -6
- package/dist/chunk-2C2HRGM7.js +51 -0
- package/dist/chunk-2C2HRGM7.js.map +1 -0
- package/dist/chunk-2TUWDXAC.js +196 -0
- package/dist/chunk-2TUWDXAC.js.map +1 -0
- package/dist/chunk-34ARZSNP.js +63 -0
- package/dist/chunk-34ARZSNP.js.map +1 -0
- package/dist/chunk-35DNN46W.js +13 -0
- package/dist/chunk-35DNN46W.js.map +1 -0
- package/dist/chunk-35U6QG4P.js +116 -0
- package/dist/chunk-35U6QG4P.js.map +1 -0
- package/dist/chunk-3EOHW4QN.js +35 -0
- package/dist/chunk-3EOHW4QN.js.map +1 -0
- package/dist/chunk-3VU56V66.js +41 -0
- package/dist/chunk-3VU56V66.js.map +1 -0
- package/dist/chunk-55E7D2HR.js +99 -0
- package/dist/chunk-55E7D2HR.js.map +1 -0
- package/dist/chunk-67YUL2ZS.js +53 -0
- package/dist/chunk-67YUL2ZS.js.map +1 -0
- package/dist/chunk-6DIDQ4TB.js +131 -0
- package/dist/chunk-6DIDQ4TB.js.map +1 -0
- package/dist/chunk-6GWVQB3Q.js +155 -0
- package/dist/chunk-6GWVQB3Q.js.map +1 -0
- package/dist/chunk-75WZR6HF.js +44 -0
- package/dist/chunk-75WZR6HF.js.map +1 -0
- package/dist/chunk-7IRLBU2I.js +114 -0
- package/dist/chunk-7IRLBU2I.js.map +1 -0
- package/dist/chunk-7RMTPT6O.js +99 -0
- package/dist/chunk-7RMTPT6O.js.map +1 -0
- package/dist/chunk-7XH3MGBR.js +128 -0
- package/dist/chunk-7XH3MGBR.js.map +1 -0
- package/dist/chunk-A3BB5ZOC.js +77 -0
- package/dist/chunk-A3BB5ZOC.js.map +1 -0
- package/dist/chunk-BAQWGQJG.js +106 -0
- package/dist/chunk-BAQWGQJG.js.map +1 -0
- package/dist/chunk-BRSM3SZP.js +46 -0
- package/dist/chunk-BRSM3SZP.js.map +1 -0
- package/dist/chunk-C34KSTWA.js +43 -0
- package/dist/chunk-C34KSTWA.js.map +1 -0
- package/dist/chunk-C5NZAOA7.js +54 -0
- package/dist/chunk-C5NZAOA7.js.map +1 -0
- package/dist/chunk-CUZR4JWM.js +23 -0
- package/dist/chunk-CUZR4JWM.js.map +1 -0
- package/dist/chunk-DGPY4WP3.js +11 -0
- package/dist/chunk-DGPY4WP3.js.map +1 -0
- package/dist/chunk-EWBCV7VA.js +65 -0
- package/dist/chunk-EWBCV7VA.js.map +1 -0
- package/dist/chunk-F2ZJLKDP.js +119 -0
- package/dist/chunk-F2ZJLKDP.js.map +1 -0
- package/dist/chunk-FLWMT4DB.js +66 -0
- package/dist/chunk-FLWMT4DB.js.map +1 -0
- package/dist/chunk-FRKG7JQY.js +48 -0
- package/dist/chunk-FRKG7JQY.js.map +1 -0
- package/dist/chunk-G7HTZBUR.js +187 -0
- package/dist/chunk-G7HTZBUR.js.map +1 -0
- package/dist/chunk-IAWKX5W4.js +219 -0
- package/dist/chunk-IAWKX5W4.js.map +1 -0
- package/dist/chunk-INLM7UJC.js +238 -0
- package/dist/chunk-INLM7UJC.js.map +1 -0
- package/dist/chunk-JAJMM32I.js +18 -0
- package/dist/chunk-JAJMM32I.js.map +1 -0
- package/dist/chunk-JJSVA3TH.js +61 -0
- package/dist/chunk-JJSVA3TH.js.map +1 -0
- package/dist/chunk-JLTBUACL.js +121 -0
- package/dist/chunk-JLTBUACL.js.map +1 -0
- package/dist/chunk-JRU2QX7T.js +38 -0
- package/dist/chunk-JRU2QX7T.js.map +1 -0
- package/dist/chunk-JXGRW2MR.js +17 -0
- package/dist/chunk-JXGRW2MR.js.map +1 -0
- package/dist/chunk-LMT327XH.js +56 -0
- package/dist/chunk-LMT327XH.js.map +1 -0
- package/dist/chunk-LTTNCAAA.js +138 -0
- package/dist/chunk-LTTNCAAA.js.map +1 -0
- package/dist/chunk-MJLFJPUG.js +143 -0
- package/dist/chunk-MJLFJPUG.js.map +1 -0
- package/dist/chunk-MZ2P566X.js +65 -0
- package/dist/chunk-MZ2P566X.js.map +1 -0
- package/dist/chunk-N47H4MHX.js +41 -0
- package/dist/chunk-N47H4MHX.js.map +1 -0
- package/dist/chunk-NNJTKHCE.js +160 -0
- package/dist/chunk-NNJTKHCE.js.map +1 -0
- package/dist/chunk-NPL2R5LD.js +171 -0
- package/dist/chunk-NPL2R5LD.js.map +1 -0
- package/dist/chunk-NU56GKGM.js +44 -0
- package/dist/chunk-NU56GKGM.js.map +1 -0
- package/dist/chunk-P3M5TZD2.js +24 -0
- package/dist/chunk-P3M5TZD2.js.map +1 -0
- package/dist/chunk-PGWNOZDX.js +28 -0
- package/dist/chunk-PGWNOZDX.js.map +1 -0
- package/dist/chunk-QB3UWRZH.js +92 -0
- package/dist/chunk-QB3UWRZH.js.map +1 -0
- package/dist/chunk-R2CDE5DO.js +33 -0
- package/dist/chunk-R2CDE5DO.js.map +1 -0
- package/dist/chunk-RQNZDWY3.js +65 -0
- package/dist/chunk-RQNZDWY3.js.map +1 -0
- package/dist/chunk-S6PDRGR5.js +109 -0
- package/dist/chunk-S6PDRGR5.js.map +1 -0
- package/dist/chunk-TGYQ3AKH.js +95 -0
- package/dist/chunk-TGYQ3AKH.js.map +1 -0
- package/dist/chunk-TJMK2KBE.js +112 -0
- package/dist/chunk-TJMK2KBE.js.map +1 -0
- package/dist/chunk-USIHM7FV.js +211 -0
- package/dist/chunk-USIHM7FV.js.map +1 -0
- package/dist/chunk-VVYSAGB3.js +104 -0
- package/dist/chunk-VVYSAGB3.js.map +1 -0
- package/dist/chunk-WD5KZE25.js +25 -0
- package/dist/chunk-WD5KZE25.js.map +1 -0
- package/dist/chunk-WL4ZO2H3.js +33 -0
- package/dist/chunk-WL4ZO2H3.js.map +1 -0
- package/dist/chunk-WRCHR4AK.js +23 -0
- package/dist/chunk-WRCHR4AK.js.map +1 -0
- package/dist/chunk-WS6E7HBT.js +39 -0
- package/dist/chunk-WS6E7HBT.js.map +1 -0
- package/dist/chunk-XOJJBNDX.js +33 -0
- package/dist/chunk-XOJJBNDX.js.map +1 -0
- package/dist/chunk-YBMEQZX7.js +164 -0
- package/dist/chunk-YBMEQZX7.js.map +1 -0
- package/dist/chunk-Z2QAABLM.js +86 -0
- package/dist/chunk-Z2QAABLM.js.map +1 -0
- package/dist/chunk-ZHEKDP5X.js +41 -0
- package/dist/chunk-ZHEKDP5X.js.map +1 -0
- package/dist/chunk-ZPMXRW2A.js +63 -0
- package/dist/chunk-ZPMXRW2A.js.map +1 -0
- package/dist/chunk-ZYEGBF7G.js +25 -0
- package/dist/chunk-ZYEGBF7G.js.map +1 -0
- package/dist/components/accordion.d.ts +37 -0
- package/dist/components/accordion.js +4 -0
- package/dist/components/accordion.js.map +1 -0
- package/dist/components/alert-dialog.d.ts +56 -0
- package/dist/components/alert-dialog.js +5 -0
- package/dist/components/alert-dialog.js.map +1 -0
- package/dist/components/alert.d.ts +68 -0
- package/dist/components/alert.js +4 -0
- package/dist/components/alert.js.map +1 -0
- package/dist/components/aspect-ratio.d.ts +23 -0
- package/dist/components/aspect-ratio.js +3 -0
- package/dist/components/aspect-ratio.js.map +1 -0
- package/dist/components/avatar.d.ts +48 -0
- package/dist/components/avatar.js +4 -0
- package/dist/components/avatar.js.map +1 -0
- package/dist/components/badge.d.ts +52 -0
- package/dist/components/badge.js +4 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/breadcrumb.d.ts +50 -0
- package/dist/components/breadcrumb.js +4 -0
- package/dist/components/breadcrumb.js.map +1 -0
- package/dist/components/button.d.ts +81 -0
- package/dist/components/button.js +4 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/calendar-category-badge.d.ts +24 -0
- package/dist/components/calendar-category-badge.js +5 -0
- package/dist/components/calendar-category-badge.js.map +1 -0
- package/dist/components/calendar-event-chip.d.ts +41 -0
- package/dist/components/calendar-event-chip.js +30 -0
- package/dist/components/calendar-event-chip.js.map +1 -0
- package/dist/components/calendar-event-sheet.d.ts +68 -0
- package/dist/components/calendar-event-sheet.js +83 -0
- package/dist/components/calendar-event-sheet.js.map +1 -0
- package/dist/components/calendar-mini.d.ts +65 -0
- package/dist/components/calendar-mini.js +93 -0
- package/dist/components/calendar-mini.js.map +1 -0
- package/dist/components/calendar-toolbar.d.ts +58 -0
- package/dist/components/calendar-toolbar.js +54 -0
- package/dist/components/calendar-toolbar.js.map +1 -0
- package/dist/components/calendar.d.ts +19 -0
- package/dist/components/calendar.js +5 -0
- package/dist/components/calendar.js.map +1 -0
- package/dist/components/card.d.ts +43 -0
- package/dist/components/card.js +4 -0
- package/dist/components/card.js.map +1 -0
- package/dist/components/carousel.d.ts +53 -0
- package/dist/components/carousel.js +5 -0
- package/dist/components/carousel.js.map +1 -0
- package/dist/components/chart.d.ts +125 -0
- package/dist/components/chart.js +239 -0
- package/dist/components/chart.js.map +1 -0
- package/dist/components/checkbox.d.ts +24 -0
- package/dist/components/checkbox.js +4 -0
- package/dist/components/checkbox.js.map +1 -0
- package/dist/components/collapsible.d.ts +28 -0
- package/dist/components/collapsible.js +3 -0
- package/dist/components/collapsible.js.map +1 -0
- package/dist/components/color-picker.d.ts +35 -0
- package/dist/components/color-picker.js +7 -0
- package/dist/components/color-picker.js.map +1 -0
- package/dist/components/combobox.d.ts +98 -0
- package/dist/components/combobox.js +8 -0
- package/dist/components/combobox.js.map +1 -0
- package/dist/components/command.d.ts +63 -0
- package/dist/components/command.js +5 -0
- package/dist/components/command.js.map +1 -0
- package/dist/components/context-menu.d.ts +70 -0
- package/dist/components/context-menu.js +4 -0
- package/dist/components/context-menu.js.map +1 -0
- package/dist/components/date-picker.d.ts +71 -0
- package/dist/components/date-picker.js +90 -0
- package/dist/components/date-picker.js.map +1 -0
- package/dist/components/dialog.d.ts +58 -0
- package/dist/components/dialog.js +4 -0
- package/dist/components/dialog.js.map +1 -0
- package/dist/components/drawer.d.ts +60 -0
- package/dist/components/drawer.js +4 -0
- package/dist/components/drawer.js.map +1 -0
- package/dist/components/dropdown-menu.d.ts +76 -0
- package/dist/components/dropdown-menu.js +4 -0
- package/dist/components/dropdown-menu.js.map +1 -0
- package/dist/components/file-upload.d.ts +44 -0
- package/dist/components/file-upload.js +5 -0
- package/dist/components/file-upload.js.map +1 -0
- package/dist/components/form.d.ts +67 -0
- package/dist/components/form.js +111 -0
- package/dist/components/form.js.map +1 -0
- package/dist/components/hover-card.d.ts +43 -0
- package/dist/components/hover-card.js +4 -0
- package/dist/components/hover-card.js.map +1 -0
- package/dist/components/input-otp.d.ts +38 -0
- package/dist/components/input-otp.js +4 -0
- package/dist/components/input-otp.js.map +1 -0
- package/dist/components/input.d.ts +38 -0
- package/dist/components/input.js +4 -0
- package/dist/components/input.js.map +1 -0
- package/dist/components/label.d.ts +20 -0
- package/dist/components/label.js +4 -0
- package/dist/components/label.js.map +1 -0
- package/dist/components/menubar.d.ts +82 -0
- package/dist/components/menubar.js +4 -0
- package/dist/components/menubar.js.map +1 -0
- package/dist/components/navigation-menu.d.ts +64 -0
- package/dist/components/navigation-menu.js +4 -0
- package/dist/components/navigation-menu.js.map +1 -0
- package/dist/components/pagination.d.ts +59 -0
- package/dist/components/pagination.js +5 -0
- package/dist/components/pagination.js.map +1 -0
- package/dist/components/password-input.d.ts +32 -0
- package/dist/components/password-input.js +5 -0
- package/dist/components/password-input.js.map +1 -0
- package/dist/components/permission-grid.d.ts +67 -0
- package/dist/components/permission-grid.js +5 -0
- package/dist/components/permission-grid.js.map +1 -0
- package/dist/components/popover.d.ts +37 -0
- package/dist/components/popover.js +4 -0
- package/dist/components/popover.js.map +1 -0
- package/dist/components/progress.d.ts +20 -0
- package/dist/components/progress.js +4 -0
- package/dist/components/progress.js.map +1 -0
- package/dist/components/radio-group.d.ts +38 -0
- package/dist/components/radio-group.js +4 -0
- package/dist/components/radio-group.js.map +1 -0
- package/dist/components/rating.d.ts +35 -0
- package/dist/components/rating.js +4 -0
- package/dist/components/rating.js.map +1 -0
- package/dist/components/resizable.d.ts +36 -0
- package/dist/components/resizable.js +4 -0
- package/dist/components/resizable.js.map +1 -0
- package/dist/components/scope-tree.d.ts +78 -0
- package/dist/components/scope-tree.js +5 -0
- package/dist/components/scope-tree.js.map +1 -0
- package/dist/components/scope-type-badge.d.ts +35 -0
- package/dist/components/scope-type-badge.js +5 -0
- package/dist/components/scope-type-badge.js.map +1 -0
- package/dist/components/scroll-area.d.ts +29 -0
- package/dist/components/scroll-area.js +4 -0
- package/dist/components/scroll-area.js.map +1 -0
- package/dist/components/select.d.ts +52 -0
- package/dist/components/select.js +4 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/separator.d.ts +24 -0
- package/dist/components/separator.js +4 -0
- package/dist/components/separator.js.map +1 -0
- package/dist/components/sheet.d.ts +51 -0
- package/dist/components/sheet.js +4 -0
- package/dist/components/sheet.js.map +1 -0
- package/dist/components/skeleton.d.ts +25 -0
- package/dist/components/skeleton.js +4 -0
- package/dist/components/skeleton.js.map +1 -0
- package/dist/components/slider.d.ts +24 -0
- package/dist/components/slider.js +4 -0
- package/dist/components/slider.js.map +1 -0
- package/dist/components/slug-input.d.ts +50 -0
- package/dist/components/slug-input.js +6 -0
- package/dist/components/slug-input.js.map +1 -0
- package/dist/components/sonner.d.ts +22 -0
- package/dist/components/sonner.js +3 -0
- package/dist/components/sonner.js.map +1 -0
- package/dist/components/stage-type-badge.d.ts +30 -0
- package/dist/components/stage-type-badge.js +5 -0
- package/dist/components/stage-type-badge.js.map +1 -0
- package/dist/components/switch.d.ts +26 -0
- package/dist/components/switch.js +4 -0
- package/dist/components/switch.js.map +1 -0
- package/dist/components/table.d.ts +57 -0
- package/dist/components/table.js +4 -0
- package/dist/components/table.js.map +1 -0
- package/dist/components/tabs.d.ts +39 -0
- package/dist/components/tabs.js +4 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/tag-input.d.ts +40 -0
- package/dist/components/tag-input.js +5 -0
- package/dist/components/tag-input.js.map +1 -0
- package/dist/components/textarea.d.ts +21 -0
- package/dist/components/textarea.js +4 -0
- package/dist/components/textarea.js.map +1 -0
- package/dist/components/time-picker.d.ts +57 -0
- package/dist/components/time-picker.js +8 -0
- package/dist/components/time-picker.js.map +1 -0
- package/dist/components/toggle-group.d.ts +45 -0
- package/dist/components/toggle-group.js +5 -0
- package/dist/components/toggle-group.js.map +1 -0
- package/dist/components/toggle.d.ts +31 -0
- package/dist/components/toggle.js +4 -0
- package/dist/components/toggle.js.map +1 -0
- package/dist/components/tooltip.d.ts +34 -0
- package/dist/components/tooltip.js +4 -0
- package/dist/components/tooltip.js.map +1 -0
- package/dist/components/workflow-category-badge.d.ts +32 -0
- package/dist/components/workflow-category-badge.js +5 -0
- package/dist/components/workflow-category-badge.js.map +1 -0
- package/dist/components/workflow-diagram.d.ts +63 -0
- package/dist/components/workflow-diagram.js +5 -0
- package/dist/components/workflow-diagram.js.map +1 -0
- package/dist/components/workflow-status-badge.d.ts +30 -0
- package/dist/components/workflow-status-badge.js +5 -0
- package/dist/components/workflow-status-badge.js.map +1 -0
- package/dist/components/workflow-stepper.d.ts +52 -0
- package/dist/components/workflow-stepper.js +4 -0
- package/dist/components/workflow-stepper.js.map +1 -0
- package/dist/hooks/use-mobile.d.ts +3 -3
- package/dist/hooks/use-mobile.js +1 -1
- package/dist/hooks/use-mobile.js.map +1 -1
- package/dist/index.d.ts +98 -16
- package/dist/index.js +62 -13
- package/dist/lib/types.d.ts +84 -1
- package/dist/lib/types.js +1 -1
- package/dist/lib/types.js.map +1 -1
- package/dist/lib/utils.d.ts +5 -1
- package/dist/lib/utils.js +1 -1
- package/dist/lib/utils.js.map +1 -1
- package/package.json +68 -31
- package/src/styles/fonts.css +0 -0
- package/src/styles/index.css +3 -1
- package/src/styles/tailwind.css +4 -0
- package/src/styles/theme.css +461 -0
- package/dist/chunk-2GN4WIOV.js +0 -240
- package/dist/chunk-2GN4WIOV.js.map +0 -1
- package/dist/chunk-5BL4VFRJ.js +0 -57
- package/dist/chunk-5BL4VFRJ.js.map +0 -1
- package/dist/chunk-735JNJJO.js +0 -27
- package/dist/chunk-735JNJJO.js.map +0 -1
- package/dist/chunk-EJEVW4RO.js +0 -49
- package/dist/chunk-EJEVW4RO.js.map +0 -1
- package/dist/chunk-FVOQZTHE.js +0 -191
- package/dist/chunk-FVOQZTHE.js.map +0 -1
- package/dist/chunk-ITXOZ4IR.js +0 -85
- package/dist/chunk-ITXOZ4IR.js.map +0 -1
- package/dist/chunk-NVPNMQSR.js +0 -30
- package/dist/chunk-NVPNMQSR.js.map +0 -1
- package/dist/chunk-O25D7DCP.js +0 -72
- package/dist/chunk-O25D7DCP.js.map +0 -1
- package/dist/chunk-O2ADW2GC.js +0 -224
- package/dist/chunk-O2ADW2GC.js.map +0 -1
- package/dist/chunk-OY3PSPA5.js +0 -661
- package/dist/chunk-OY3PSPA5.js.map +0 -1
- package/dist/chunk-UASABUQA.js +0 -39
- package/dist/chunk-UASABUQA.js.map +0 -1
- package/dist/chunk-UR2QLIS2.js +0 -93
- package/dist/chunk-UR2QLIS2.js.map +0 -1
- package/dist/chunk-XDXGUPCR.js +0 -123
- package/dist/chunk-XDXGUPCR.js.map +0 -1
- package/dist/components/AppShell.d.ts +0 -27
- package/dist/components/AppShell.js +0 -13
- package/dist/components/AppShell.js.map +0 -1
- package/dist/components/Header.d.ts +0 -11
- package/dist/components/Header.js +0 -9
- package/dist/components/Header.js.map +0 -1
- package/dist/components/LanguageSelector.d.ts +0 -11
- package/dist/components/LanguageSelector.js +0 -5
- package/dist/components/LanguageSelector.js.map +0 -1
- package/dist/components/OrganizationSelector.d.ts +0 -8
- package/dist/components/OrganizationSelector.js +0 -4
- package/dist/components/OrganizationSelector.js.map +0 -1
- package/dist/components/OrganizationSetupModal.d.ts +0 -5
- package/dist/components/OrganizationSetupModal.js +0 -4
- package/dist/components/OrganizationSetupModal.js.map +0 -1
- package/dist/components/PageContainer.d.ts +0 -105
- package/dist/components/PageContainer.js +0 -3
- package/dist/components/PageContainer.js.map +0 -1
- package/dist/components/ServiceMenu.d.ts +0 -11
- package/dist/components/ServiceMenu.js +0 -3
- package/dist/components/ServiceMenu.js.map +0 -1
- package/dist/components/Sidebar.d.ts +0 -11
- package/dist/components/Sidebar.js +0 -5
- package/dist/components/Sidebar.js.map +0 -1
- package/dist/contexts/LanguageContext.d.ts +0 -17
- package/dist/contexts/LanguageContext.js +0 -4
- package/dist/contexts/LanguageContext.js.map +0 -1
- package/dist/contexts/OrganizationContext.d.ts +0 -28
- package/dist/contexts/OrganizationContext.js +0 -3
- package/dist/contexts/OrganizationContext.js.map +0 -1
- package/dist/contexts/ThemeContext.d.ts +0 -14
- package/dist/contexts/ThemeContext.js +0 -3
- package/dist/contexts/ThemeContext.js.map +0 -1
- package/dist/hooks/useDateFormat.d.ts +0 -28
- package/dist/hooks/useDateFormat.js +0 -4
- package/dist/hooks/useDateFormat.js.map +0 -1
- package/dist/i18n.d.ts +0 -38
- package/dist/i18n.js +0 -3
- package/dist/i18n.js.map +0 -1
- package/dist/types.d.ts +0 -91
- package/dist/types.js +0 -3
- package/dist/types.js.map +0 -1
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { cn } from './chunk-DGPY4WP3.js';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { Slot } from '@radix-ui/react-slot';
|
|
4
|
+
import { cva } from 'class-variance-authority';
|
|
5
|
+
import { jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var buttonVariants = cva(
|
|
8
|
+
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
|
|
9
|
+
{
|
|
10
|
+
variants: {
|
|
11
|
+
variant: {
|
|
12
|
+
// Solid — color applied via compoundVariants
|
|
13
|
+
default: "",
|
|
14
|
+
// Legacy — maps to solid + destructive color (backward compatible)
|
|
15
|
+
destructive: "",
|
|
16
|
+
// Color-independent
|
|
17
|
+
secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
|
18
|
+
// Color-aware — applied via compoundVariants
|
|
19
|
+
outline: "",
|
|
20
|
+
soft: "",
|
|
21
|
+
ghost: "",
|
|
22
|
+
link: ""
|
|
23
|
+
},
|
|
24
|
+
color: {
|
|
25
|
+
primary: "",
|
|
26
|
+
destructive: "",
|
|
27
|
+
success: "",
|
|
28
|
+
warning: "",
|
|
29
|
+
info: ""
|
|
30
|
+
},
|
|
31
|
+
size: {
|
|
32
|
+
xs: "h-element-xs rounded-md gap-1 px-2 text-xs has-[>svg]:px-1.5",
|
|
33
|
+
sm: "h-element-sm rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
|
|
34
|
+
default: "h-element px-4 py-2 has-[>svg]:px-3",
|
|
35
|
+
lg: "h-element-lg rounded-md px-6 has-[>svg]:px-4",
|
|
36
|
+
xl: "h-element-xl rounded-md px-8 text-base font-semibold has-[>svg]:px-5",
|
|
37
|
+
icon: "size-element rounded-md"
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
compoundVariants: [
|
|
41
|
+
// ── Solid (default variant) × color ──
|
|
42
|
+
{ variant: "default", color: "primary", className: "bg-primary text-primary-foreground hover:bg-primary/90" },
|
|
43
|
+
{ variant: "default", color: "destructive", className: "bg-destructive text-destructive-foreground hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40" },
|
|
44
|
+
{ variant: "default", color: "success", className: "bg-success text-success-foreground hover:bg-success/90 focus-visible:ring-success/20 dark:focus-visible:ring-success/40" },
|
|
45
|
+
{ variant: "default", color: "warning", className: "bg-warning text-warning-foreground hover:bg-warning/90 focus-visible:ring-warning/20 dark:focus-visible:ring-warning/40" },
|
|
46
|
+
{ variant: "default", color: "info", className: "bg-info text-info-foreground hover:bg-info/90 focus-visible:ring-info/20 dark:focus-visible:ring-info/40" },
|
|
47
|
+
// ── Legacy destructive variant (backward compat) ──
|
|
48
|
+
{ variant: "destructive", className: "bg-destructive text-destructive-foreground hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40" },
|
|
49
|
+
// ── Outline × color ──
|
|
50
|
+
{ variant: "outline", color: "primary", className: "border border-input bg-background text-foreground hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50" },
|
|
51
|
+
{ variant: "outline", color: "destructive", className: "border border-destructive/50 text-destructive bg-background hover:bg-destructive/10 focus-visible:ring-destructive/20" },
|
|
52
|
+
{ variant: "outline", color: "success", className: "border border-success/50 text-success bg-background hover:bg-success/10 focus-visible:ring-success/20" },
|
|
53
|
+
{ variant: "outline", color: "warning", className: "border border-warning/50 text-warning bg-background hover:bg-warning/10 focus-visible:ring-warning/20" },
|
|
54
|
+
{ variant: "outline", color: "info", className: "border border-info/50 text-info bg-background hover:bg-info/10 focus-visible:ring-info/20" },
|
|
55
|
+
// ── Soft × color ──
|
|
56
|
+
{ variant: "soft", color: "primary", className: "bg-primary/10 text-primary hover:bg-primary/20" },
|
|
57
|
+
{ variant: "soft", color: "destructive", className: "bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:ring-destructive/20" },
|
|
58
|
+
{ variant: "soft", color: "success", className: "bg-success/10 text-success hover:bg-success/20 focus-visible:ring-success/20" },
|
|
59
|
+
{ variant: "soft", color: "warning", className: "bg-warning/10 text-warning hover:bg-warning/20 focus-visible:ring-warning/20" },
|
|
60
|
+
{ variant: "soft", color: "info", className: "bg-info/10 text-info hover:bg-info/20 focus-visible:ring-info/20" },
|
|
61
|
+
// ── Ghost × color ──
|
|
62
|
+
{ variant: "ghost", color: "primary", className: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50" },
|
|
63
|
+
{ variant: "ghost", color: "destructive", className: "text-destructive hover:bg-destructive/10" },
|
|
64
|
+
{ variant: "ghost", color: "success", className: "text-success hover:bg-success/10" },
|
|
65
|
+
{ variant: "ghost", color: "warning", className: "text-warning hover:bg-warning/10" },
|
|
66
|
+
{ variant: "ghost", color: "info", className: "text-info hover:bg-info/10" },
|
|
67
|
+
// ── Link × color ──
|
|
68
|
+
{ variant: "link", color: "primary", className: "text-primary underline-offset-4 hover:underline" },
|
|
69
|
+
{ variant: "link", color: "destructive", className: "text-destructive underline-offset-4 hover:underline" },
|
|
70
|
+
{ variant: "link", color: "success", className: "text-success underline-offset-4 hover:underline" },
|
|
71
|
+
{ variant: "link", color: "warning", className: "text-warning underline-offset-4 hover:underline" },
|
|
72
|
+
{ variant: "link", color: "info", className: "text-info underline-offset-4 hover:underline" }
|
|
73
|
+
],
|
|
74
|
+
defaultVariants: {
|
|
75
|
+
variant: "default",
|
|
76
|
+
color: "primary",
|
|
77
|
+
size: "default"
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
);
|
|
81
|
+
var Button = React.forwardRef(
|
|
82
|
+
({ className, variant, color, size, asChild = false, block = false, ...props }, ref) => {
|
|
83
|
+
const Comp = asChild ? Slot : "button";
|
|
84
|
+
return /* @__PURE__ */ jsx(
|
|
85
|
+
Comp,
|
|
86
|
+
{
|
|
87
|
+
ref,
|
|
88
|
+
"data-slot": "button",
|
|
89
|
+
className: cn(buttonVariants({ variant, color, size }), block && "w-full", className),
|
|
90
|
+
...props
|
|
91
|
+
}
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
);
|
|
95
|
+
Button.displayName = "Button";
|
|
96
|
+
|
|
97
|
+
export { Button, buttonVariants };
|
|
98
|
+
//# sourceMappingURL=chunk-55E7D2HR.js.map
|
|
99
|
+
//# sourceMappingURL=chunk-55E7D2HR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/button.tsx"],"names":[],"mappings":"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","file":"chunk-55E7D2HR.js","sourcesContent":["import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../lib/utils\";\nimport type { UIColor } from \"../lib/types\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n // Solid — color applied via compoundVariants\n default: \"\",\n // Legacy — maps to solid + destructive color (backward compatible)\n destructive: \"\",\n // Color-independent\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n // Color-aware — applied via compoundVariants\n outline: \"\",\n soft: \"\",\n ghost: \"\",\n link: \"\",\n },\n color: {\n primary: \"\",\n destructive: \"\",\n success: \"\",\n warning: \"\",\n info: \"\",\n },\n size: {\n xs: \"h-element-xs rounded-md gap-1 px-2 text-xs has-[>svg]:px-1.5\",\n sm: \"h-element-sm rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n default: \"h-element px-4 py-2 has-[>svg]:px-3\",\n lg: \"h-element-lg rounded-md px-6 has-[>svg]:px-4\",\n xl: \"h-element-xl rounded-md px-8 text-base font-semibold has-[>svg]:px-5\",\n icon: \"size-element rounded-md\",\n },\n },\n compoundVariants: [\n // ── Solid (default variant) × color ──\n { variant: \"default\", color: \"primary\", className: \"bg-primary text-primary-foreground hover:bg-primary/90\" },\n { variant: \"default\", color: \"destructive\", className: \"bg-destructive text-destructive-foreground hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40\" },\n { variant: \"default\", color: \"success\", className: \"bg-success text-success-foreground hover:bg-success/90 focus-visible:ring-success/20 dark:focus-visible:ring-success/40\" },\n { variant: \"default\", color: \"warning\", className: \"bg-warning text-warning-foreground hover:bg-warning/90 focus-visible:ring-warning/20 dark:focus-visible:ring-warning/40\" },\n { variant: \"default\", color: \"info\", className: \"bg-info text-info-foreground hover:bg-info/90 focus-visible:ring-info/20 dark:focus-visible:ring-info/40\" },\n\n // ── Legacy destructive variant (backward compat) ──\n { variant: \"destructive\", className: \"bg-destructive text-destructive-foreground hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40\" },\n\n // ── Outline × color ──\n { variant: \"outline\", color: \"primary\", className: \"border border-input bg-background text-foreground hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\" },\n { variant: \"outline\", color: \"destructive\", className: \"border border-destructive/50 text-destructive bg-background hover:bg-destructive/10 focus-visible:ring-destructive/20\" },\n { variant: \"outline\", color: \"success\", className: \"border border-success/50 text-success bg-background hover:bg-success/10 focus-visible:ring-success/20\" },\n { variant: \"outline\", color: \"warning\", className: \"border border-warning/50 text-warning bg-background hover:bg-warning/10 focus-visible:ring-warning/20\" },\n { variant: \"outline\", color: \"info\", className: \"border border-info/50 text-info bg-background hover:bg-info/10 focus-visible:ring-info/20\" },\n\n // ── Soft × color ──\n { variant: \"soft\", color: \"primary\", className: \"bg-primary/10 text-primary hover:bg-primary/20\" },\n { variant: \"soft\", color: \"destructive\", className: \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:ring-destructive/20\" },\n { variant: \"soft\", color: \"success\", className: \"bg-success/10 text-success hover:bg-success/20 focus-visible:ring-success/20\" },\n { variant: \"soft\", color: \"warning\", className: \"bg-warning/10 text-warning hover:bg-warning/20 focus-visible:ring-warning/20\" },\n { variant: \"soft\", color: \"info\", className: \"bg-info/10 text-info hover:bg-info/20 focus-visible:ring-info/20\" },\n\n // ── Ghost × color ──\n { variant: \"ghost\", color: \"primary\", className: \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\" },\n { variant: \"ghost\", color: \"destructive\", className: \"text-destructive hover:bg-destructive/10\" },\n { variant: \"ghost\", color: \"success\", className: \"text-success hover:bg-success/10\" },\n { variant: \"ghost\", color: \"warning\", className: \"text-warning hover:bg-warning/10\" },\n { variant: \"ghost\", color: \"info\", className: \"text-info hover:bg-info/10\" },\n\n // ── Link × color ──\n { variant: \"link\", color: \"primary\", className: \"text-primary underline-offset-4 hover:underline\" },\n { variant: \"link\", color: \"destructive\", className: \"text-destructive underline-offset-4 hover:underline\" },\n { variant: \"link\", color: \"success\", className: \"text-success underline-offset-4 hover:underline\" },\n { variant: \"link\", color: \"warning\", className: \"text-warning underline-offset-4 hover:underline\" },\n { variant: \"link\", color: \"info\", className: \"text-info underline-offset-4 hover:underline\" },\n ],\n defaultVariants: {\n variant: \"default\",\n color: \"primary\",\n size: \"default\",\n },\n },\n);\n\ninterface ButtonProps\n extends React.ComponentProps<\"button\">,\n Omit<VariantProps<typeof buttonVariants>, \"color\"> {\n /**\n * Semantic color intent. Works with `variant` to produce the final appearance.\n *\n * | Color | Use for |\n * |-------|---------|\n * | `primary` | Main actions (default) |\n * | `destructive` | Delete, errors |\n * | `success` | Approve, confirm |\n * | `warning` | Caution, attention |\n * | `info` | Informational |\n *\n * @default \"primary\"\n * @example\n * ```tsx\n * <Button color=\"success\">Approve</Button>\n * <Button variant=\"outline\" color=\"destructive\">Reject</Button>\n * <Button variant=\"soft\" color=\"warning\">Review</Button>\n * ```\n */\n color?: UIColor;\n /**\n * Render as a child component using Radix Slot.\n * When `true`, the button merges its props onto its single child element.\n * @default false\n */\n asChild?: boolean;\n /**\n * Make the button take the full width of its container.\n * @default false\n * @example\n * ```tsx\n * <Button block>Full Width</Button>\n * <Button size=\"xl\" block>Sign In</Button>\n * ```\n */\n block?: boolean;\n}\n\n/**\n * Button component with semantic colors, visual variants, and standard sizes.\n *\n * Combines `variant` (how it looks) with `color` (what it means) for full flexibility.\n * All existing `variant=\"destructive\"` usage continues to work unchanged.\n *\n * @example\n * ```tsx\n * // Default (solid primary)\n * <Button>Save</Button>\n *\n * // Semantic colors\n * <Button color=\"success\">Approve</Button>\n * <Button color=\"destructive\">Delete</Button>\n * <Button color=\"warning\">Proceed with caution</Button>\n *\n * // Variant × Color combinations\n * <Button variant=\"outline\" color=\"destructive\">Reject</Button>\n * <Button variant=\"soft\" color=\"success\">Approved</Button>\n * <Button variant=\"ghost\" color=\"info\">Learn more</Button>\n *\n * // Legacy (still works)\n * <Button variant=\"destructive\">Delete</Button>\n *\n * // Sizes: xs (24px) | sm (28px) | default (32px) | lg (36px) | xl (44px) | icon (32x32)\n * <Button size=\"xs\">Tiny</Button>\n * <Button size=\"xl\" block>Sign In</Button>\n * <Button size=\"icon\"><PlusIcon /></Button>\n * ```\n */\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, color, size, asChild = false, block = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n\n return (\n <Comp\n ref={ref}\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, color, size }), block && \"w-full\", className)}\n {...props}\n />\n );\n },\n);\n\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\nexport type { ButtonProps };\n"]}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { cn } from './chunk-DGPY4WP3.js';
|
|
2
|
+
import * as AvatarPrimitive from '@radix-ui/react-avatar';
|
|
3
|
+
import { jsx } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
function Avatar({
|
|
6
|
+
className,
|
|
7
|
+
...props
|
|
8
|
+
}) {
|
|
9
|
+
return /* @__PURE__ */ jsx(
|
|
10
|
+
AvatarPrimitive.Root,
|
|
11
|
+
{
|
|
12
|
+
"data-slot": "avatar",
|
|
13
|
+
className: cn(
|
|
14
|
+
"relative flex size-10 shrink-0 overflow-hidden rounded-full",
|
|
15
|
+
className
|
|
16
|
+
),
|
|
17
|
+
...props
|
|
18
|
+
}
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
function AvatarImage({
|
|
22
|
+
className,
|
|
23
|
+
...props
|
|
24
|
+
}) {
|
|
25
|
+
return /* @__PURE__ */ jsx(
|
|
26
|
+
AvatarPrimitive.Image,
|
|
27
|
+
{
|
|
28
|
+
"data-slot": "avatar-image",
|
|
29
|
+
className: cn("aspect-square size-full", className),
|
|
30
|
+
...props
|
|
31
|
+
}
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
function AvatarFallback({
|
|
35
|
+
className,
|
|
36
|
+
...props
|
|
37
|
+
}) {
|
|
38
|
+
return /* @__PURE__ */ jsx(
|
|
39
|
+
AvatarPrimitive.Fallback,
|
|
40
|
+
{
|
|
41
|
+
"data-slot": "avatar-fallback",
|
|
42
|
+
className: cn(
|
|
43
|
+
"bg-muted flex size-full items-center justify-center rounded-full",
|
|
44
|
+
className
|
|
45
|
+
),
|
|
46
|
+
...props
|
|
47
|
+
}
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export { Avatar, AvatarFallback, AvatarImage };
|
|
52
|
+
//# sourceMappingURL=chunk-67YUL2ZS.js.map
|
|
53
|
+
//# sourceMappingURL=chunk-67YUL2ZS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/avatar.tsx"],"names":[],"mappings":";;;;AAyBA,SAAS,MAAA,CAAO;AAAA,EACd,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAgB;AACd,EAAA,uBACE,GAAA;AAAA,IAAiB,eAAA,CAAA,IAAA;AAAA,IAAhB;AAAA,MACC,WAAA,EAAU,QAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,6DAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAaA,SAAS,WAAA,CAAY;AAAA,EACnB,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAqB;AACnB,EAAA,uBACE,GAAA;AAAA,IAAiB,eAAA,CAAA,KAAA;AAAA,IAAhB;AAAA,MACC,WAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,yBAAA,EAA2B,SAAS,CAAA;AAAA,MACjD,GAAG;AAAA;AAAA,GACN;AAEJ;AAaA,SAAS,cAAA,CAAe;AAAA,EACtB,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAwB;AACtB,EAAA,uBACE,GAAA;AAAA,IAAiB,eAAA,CAAA,QAAA;AAAA,IAAhB;AAAA,MACC,WAAA,EAAU,iBAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,kEAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ","file":"chunk-67YUL2ZS.js","sourcesContent":["import * as React from \"react\";\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\";\n\nimport { cn } from \"../lib/utils\";\n\ntype AvatarProps = React.ComponentProps<typeof AvatarPrimitive.Root>;\n\n/**\n * Circular container for user profile images or initials.\n * Use with {@link AvatarImage} and {@link AvatarFallback} for graceful loading.\n *\n * @example\n * ```tsx\n * <Avatar>\n * <AvatarImage src=\"/avatar.jpg\" alt=\"User\" />\n * <AvatarFallback>JD</AvatarFallback>\n * </Avatar>\n *\n * // Custom size\n * <Avatar className=\"size-8\">\n * <AvatarImage src=\"/small.jpg\" alt=\"User\" />\n * <AvatarFallback>U</AvatarFallback>\n * </Avatar>\n * ```\n */\nfunction Avatar({\n className,\n ...props\n}: AvatarProps) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n className={cn(\n \"relative flex size-10 shrink-0 overflow-hidden rounded-full\",\n className,\n )}\n {...props}\n />\n );\n}\n\ntype AvatarImageProps = React.ComponentProps<typeof AvatarPrimitive.Image>;\n\n/**\n * Image element rendered inside an {@link Avatar}. Falls back to\n * {@link AvatarFallback} when the image fails to load.\n *\n * @example\n * ```tsx\n * <AvatarImage src=\"/photo.jpg\" alt=\"Jane Doe\" />\n * ```\n */\nfunction AvatarImage({\n className,\n ...props\n}: AvatarImageProps) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\"aspect-square size-full\", className)}\n {...props}\n />\n );\n}\n\ntype AvatarFallbackProps = React.ComponentProps<typeof AvatarPrimitive.Fallback>;\n\n/**\n * Fallback content displayed while the {@link AvatarImage} is loading or\n * if it fails. Typically shows user initials (max 2 characters).\n *\n * @example\n * ```tsx\n * <AvatarFallback>JD</AvatarFallback>\n * ```\n */\nfunction AvatarFallback({\n className,\n ...props\n}: AvatarFallbackProps) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n \"bg-muted flex size-full items-center justify-center rounded-full\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Avatar, AvatarImage, AvatarFallback };\nexport type { AvatarProps, AvatarImageProps, AvatarFallbackProps };"]}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { ScrollArea } from './chunk-JJSVA3TH.js';
|
|
2
|
+
import { Input } from './chunk-3VU56V66.js';
|
|
3
|
+
import { Popover, PopoverTrigger, PopoverContent } from './chunk-C34KSTWA.js';
|
|
4
|
+
import { Button } from './chunk-55E7D2HR.js';
|
|
5
|
+
import { cn } from './chunk-DGPY4WP3.js';
|
|
6
|
+
import * as React from 'react';
|
|
7
|
+
import { Clock } from 'lucide-react';
|
|
8
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
9
|
+
|
|
10
|
+
function TimePicker({
|
|
11
|
+
value,
|
|
12
|
+
onChange,
|
|
13
|
+
placeholder = "Ch\u1ECDn gi\u1EDD",
|
|
14
|
+
className,
|
|
15
|
+
disabled,
|
|
16
|
+
format24h = true
|
|
17
|
+
}) {
|
|
18
|
+
const [open, setOpen] = React.useState(false);
|
|
19
|
+
const hours = format24h ? Array.from({ length: 24 }, (_, i) => i.toString().padStart(2, "0")) : Array.from({ length: 12 }, (_, i) => (i + 1).toString().padStart(2, "0"));
|
|
20
|
+
const minutes = Array.from(
|
|
21
|
+
{ length: 60 },
|
|
22
|
+
(_, i) => i.toString().padStart(2, "0")
|
|
23
|
+
);
|
|
24
|
+
const [selectedHour, selectedMinute] = value?.split(":") || ["", ""];
|
|
25
|
+
const handleHourSelect = (hour) => {
|
|
26
|
+
const newTime = `${hour}:${selectedMinute || "00"}`;
|
|
27
|
+
onChange?.(newTime);
|
|
28
|
+
};
|
|
29
|
+
const handleMinuteSelect = (minute) => {
|
|
30
|
+
const newTime = `${selectedHour || "00"}:${minute}`;
|
|
31
|
+
onChange?.(newTime);
|
|
32
|
+
setOpen(false);
|
|
33
|
+
};
|
|
34
|
+
return /* @__PURE__ */ jsxs(Popover, { open, onOpenChange: setOpen, children: [
|
|
35
|
+
/* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
|
|
36
|
+
Button,
|
|
37
|
+
{
|
|
38
|
+
variant: "outline",
|
|
39
|
+
disabled,
|
|
40
|
+
className: cn(
|
|
41
|
+
"w-full justify-start",
|
|
42
|
+
!value && "text-muted-foreground",
|
|
43
|
+
className
|
|
44
|
+
),
|
|
45
|
+
children: [
|
|
46
|
+
/* @__PURE__ */ jsx(Clock, { className: "mr-2 h-4 w-4" }),
|
|
47
|
+
value || placeholder
|
|
48
|
+
]
|
|
49
|
+
}
|
|
50
|
+
) }),
|
|
51
|
+
/* @__PURE__ */ jsx(PopoverContent, { className: "w-auto p-0", align: "start", children: /* @__PURE__ */ jsxs("div", { className: "flex", children: [
|
|
52
|
+
/* @__PURE__ */ jsx(ScrollArea, { className: "h-60 w-20 border-r", children: /* @__PURE__ */ jsx("div", { className: "p-1", children: hours.map((hour) => /* @__PURE__ */ jsx(
|
|
53
|
+
"button",
|
|
54
|
+
{
|
|
55
|
+
type: "button",
|
|
56
|
+
onClick: () => handleHourSelect(hour),
|
|
57
|
+
className: cn(
|
|
58
|
+
"w-full px-3 py-2 text-sm rounded hover:bg-accent transition-colors text-center",
|
|
59
|
+
selectedHour === hour && "bg-primary/10 text-primary font-semibold"
|
|
60
|
+
),
|
|
61
|
+
children: hour
|
|
62
|
+
},
|
|
63
|
+
hour
|
|
64
|
+
)) }) }),
|
|
65
|
+
/* @__PURE__ */ jsx(ScrollArea, { className: "h-60 w-20", children: /* @__PURE__ */ jsx("div", { className: "p-1", children: minutes.map((minute) => /* @__PURE__ */ jsx(
|
|
66
|
+
"button",
|
|
67
|
+
{
|
|
68
|
+
type: "button",
|
|
69
|
+
onClick: () => handleMinuteSelect(minute),
|
|
70
|
+
className: cn(
|
|
71
|
+
"w-full px-3 py-2 text-sm rounded hover:bg-accent transition-colors text-center",
|
|
72
|
+
selectedMinute === minute && "bg-primary/10 text-primary font-semibold"
|
|
73
|
+
),
|
|
74
|
+
children: minute
|
|
75
|
+
},
|
|
76
|
+
minute
|
|
77
|
+
)) }) })
|
|
78
|
+
] }) })
|
|
79
|
+
] });
|
|
80
|
+
}
|
|
81
|
+
function TimeInput({
|
|
82
|
+
value = "",
|
|
83
|
+
onChange,
|
|
84
|
+
className,
|
|
85
|
+
disabled
|
|
86
|
+
}) {
|
|
87
|
+
const [localValue, setLocalValue] = React.useState(value);
|
|
88
|
+
const handleChange = (e) => {
|
|
89
|
+
let input = e.target.value.replace(/\D/g, "");
|
|
90
|
+
if (input.length >= 2) {
|
|
91
|
+
const hours = parseInt(input.substring(0, 2));
|
|
92
|
+
if (hours > 23) input = "23" + input.substring(2);
|
|
93
|
+
}
|
|
94
|
+
if (input.length >= 4) {
|
|
95
|
+
const minutes = parseInt(input.substring(2, 4));
|
|
96
|
+
if (minutes > 59) input = input.substring(0, 2) + "59";
|
|
97
|
+
}
|
|
98
|
+
if (input.length >= 2) {
|
|
99
|
+
input = input.substring(0, 2) + ":" + input.substring(2, 4);
|
|
100
|
+
}
|
|
101
|
+
setLocalValue(input);
|
|
102
|
+
};
|
|
103
|
+
const handleBlur = () => {
|
|
104
|
+
const parts = localValue.split(":");
|
|
105
|
+
if (parts.length === 2 && parts[0].length === 2 && parts[1].length === 2) {
|
|
106
|
+
onChange?.(localValue);
|
|
107
|
+
} else {
|
|
108
|
+
setLocalValue(value);
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
return /* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
112
|
+
/* @__PURE__ */ jsx(
|
|
113
|
+
Input,
|
|
114
|
+
{
|
|
115
|
+
type: "text",
|
|
116
|
+
value: localValue,
|
|
117
|
+
onChange: handleChange,
|
|
118
|
+
onBlur: handleBlur,
|
|
119
|
+
placeholder: "00:00",
|
|
120
|
+
maxLength: 5,
|
|
121
|
+
disabled,
|
|
122
|
+
className: cn("pr-10", className)
|
|
123
|
+
}
|
|
124
|
+
),
|
|
125
|
+
/* @__PURE__ */ jsx(Clock, { className: "absolute right-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" })
|
|
126
|
+
] });
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export { TimeInput, TimePicker };
|
|
130
|
+
//# sourceMappingURL=chunk-6DIDQ4TB.js.map
|
|
131
|
+
//# sourceMappingURL=chunk-6DIDQ4TB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/time-picker.tsx"],"names":[],"mappings":"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","file":"chunk-6DIDQ4TB.js","sourcesContent":["import * as React from \"react\";\nimport { Clock } from \"lucide-react\";\nimport { cn } from \"../lib/utils\";\nimport { Button } from \"./button\";\nimport { Input } from \"./input\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover\";\nimport { ScrollArea } from \"./scroll-area\";\n\ninterface TimePickerProps {\n /** Currently selected time in `\"HH:mm\"` format (e.g., `\"14:30\"`). */\n value?: string;\n /** Callback fired when a time is selected. Receives a `\"HH:mm\"` string. */\n onChange?: (time: string) => void;\n /** Placeholder text shown when no time is selected. */\n placeholder?: string;\n /** Additional CSS class for the trigger button. */\n className?: string;\n /** Whether the time picker is disabled. */\n disabled?: boolean;\n /** Use 24-hour format (0-23). When false, shows 12-hour (1-12). Defaults to `true`. */\n format24h?: boolean;\n}\n\n/**\n * Time picker with a scrollable hour/minute popover.\n * Opens a two-column dropdown for selecting hours and minutes.\n *\n * @example\n * ```tsx\n * const [time, setTime] = useState<string>();\n *\n * <TimePicker\n * value={time}\n * onChange={setTime}\n * placeholder=\"Select time\"\n * format24h\n * />\n * ```\n */\nexport function TimePicker({\n value,\n onChange,\n placeholder = \"Chọn giờ\",\n className,\n disabled,\n format24h = true,\n}: TimePickerProps) {\n const [open, setOpen] = React.useState(false);\n\n const hours = format24h\n ? Array.from({ length: 24 }, (_, i) => i.toString().padStart(2, \"0\"))\n : Array.from({ length: 12 }, (_, i) => (i + 1).toString().padStart(2, \"0\"));\n\n const minutes = Array.from({ length: 60 }, (_, i) =>\n i.toString().padStart(2, \"0\")\n );\n\n const [selectedHour, selectedMinute] = value?.split(\":\") || [\"\", \"\"];\n\n const handleHourSelect = (hour: string) => {\n const newTime = `${hour}:${selectedMinute || \"00\"}`;\n onChange?.(newTime);\n };\n\n const handleMinuteSelect = (minute: string) => {\n const newTime = `${selectedHour || \"00\"}:${minute}`;\n onChange?.(newTime);\n setOpen(false);\n };\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n disabled={disabled}\n className={cn(\n \"w-full justify-start\",\n !value && \"text-muted-foreground\",\n className\n )}\n >\n <Clock className=\"mr-2 h-4 w-4\" />\n {value || placeholder}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <div className=\"flex\">\n {/* Hours */}\n <ScrollArea className=\"h-60 w-20 border-r\">\n <div className=\"p-1\">\n {hours.map((hour) => (\n <button\n key={hour}\n type=\"button\"\n onClick={() => handleHourSelect(hour)}\n className={cn(\n \"w-full px-3 py-2 text-sm rounded hover:bg-accent transition-colors text-center\",\n selectedHour === hour && \"bg-primary/10 text-primary font-semibold\"\n )}\n >\n {hour}\n </button>\n ))}\n </div>\n </ScrollArea>\n\n {/* Minutes */}\n <ScrollArea className=\"h-60 w-20\">\n <div className=\"p-1\">\n {minutes.map((minute) => (\n <button\n key={minute}\n type=\"button\"\n onClick={() => handleMinuteSelect(minute)}\n className={cn(\n \"w-full px-3 py-2 text-sm rounded hover:bg-accent transition-colors text-center\",\n selectedMinute === minute && \"bg-primary/10 text-primary font-semibold\"\n )}\n >\n {minute}\n </button>\n ))}\n </div>\n </ScrollArea>\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\ninterface TimeInputProps {\n /** Current time value in `\"HH:mm\"` format. */\n value?: string;\n /** Callback fired on blur with a valid `\"HH:mm\"` string. */\n onChange?: (time: string) => void;\n /** Additional CSS class for the input wrapper. */\n className?: string;\n /** Whether the input is disabled. */\n disabled?: boolean;\n}\n\n/**\n * Inline text input for typing a time value directly.\n * Automatically formats input as `HH:mm` and validates on blur.\n *\n * @example\n * ```tsx\n * const [time, setTime] = useState(\"09:00\");\n *\n * <TimeInput value={time} onChange={setTime} />\n * ```\n */\nexport function TimeInput({\n value = \"\",\n onChange,\n className,\n disabled,\n}: TimeInputProps) {\n const [localValue, setLocalValue] = React.useState(value);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n let input = e.target.value.replace(/\\D/g, \"\"); // Remove non-digits\n\n if (input.length >= 2) {\n const hours = parseInt(input.substring(0, 2));\n if (hours > 23) input = \"23\" + input.substring(2);\n }\n\n if (input.length >= 4) {\n const minutes = parseInt(input.substring(2, 4));\n if (minutes > 59) input = input.substring(0, 2) + \"59\";\n }\n\n // Format as HH:mm\n if (input.length >= 2) {\n input = input.substring(0, 2) + \":\" + input.substring(2, 4);\n }\n\n setLocalValue(input);\n };\n\n const handleBlur = () => {\n // Validate and format\n const parts = localValue.split(\":\");\n if (parts.length === 2 && parts[0].length === 2 && parts[1].length === 2) {\n onChange?.(localValue);\n } else {\n setLocalValue(value);\n }\n };\n\n return (\n <div className=\"relative\">\n <Input\n type=\"text\"\n value={localValue}\n onChange={handleChange}\n onBlur={handleBlur}\n placeholder=\"00:00\"\n maxLength={5}\n disabled={disabled}\n className={cn(\"pr-10\", className)}\n />\n <Clock className=\"absolute right-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground\" />\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { Dialog, DialogHeader, DialogTitle, DialogDescription, DialogContent } from './chunk-F2ZJLKDP.js';
|
|
2
|
+
import { cn } from './chunk-DGPY4WP3.js';
|
|
3
|
+
import { Command as Command$1 } from 'cmdk';
|
|
4
|
+
import { SearchIcon } from 'lucide-react';
|
|
5
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
function Command({
|
|
8
|
+
className,
|
|
9
|
+
...props
|
|
10
|
+
}) {
|
|
11
|
+
return /* @__PURE__ */ jsx(
|
|
12
|
+
Command$1,
|
|
13
|
+
{
|
|
14
|
+
"data-slot": "command",
|
|
15
|
+
className: cn(
|
|
16
|
+
"bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md",
|
|
17
|
+
className
|
|
18
|
+
),
|
|
19
|
+
...props
|
|
20
|
+
}
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
function CommandDialog({
|
|
24
|
+
title = "Command Palette",
|
|
25
|
+
description = "Search for a command to run...",
|
|
26
|
+
children,
|
|
27
|
+
...props
|
|
28
|
+
}) {
|
|
29
|
+
return /* @__PURE__ */ jsxs(Dialog, { ...props, children: [
|
|
30
|
+
/* @__PURE__ */ jsxs(DialogHeader, { className: "sr-only", children: [
|
|
31
|
+
/* @__PURE__ */ jsx(DialogTitle, { children: title }),
|
|
32
|
+
/* @__PURE__ */ jsx(DialogDescription, { children: description })
|
|
33
|
+
] }),
|
|
34
|
+
/* @__PURE__ */ jsx(DialogContent, { className: "overflow-hidden p-0", children: /* @__PURE__ */ jsx(Command, { className: "[&_[cmdk-group-heading]]:text-muted-foreground **:data-[slot=command-input-wrapper]:h-12 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group]]:px-2 [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5", children }) })
|
|
35
|
+
] });
|
|
36
|
+
}
|
|
37
|
+
function CommandInput({
|
|
38
|
+
className,
|
|
39
|
+
...props
|
|
40
|
+
}) {
|
|
41
|
+
return /* @__PURE__ */ jsxs(
|
|
42
|
+
"div",
|
|
43
|
+
{
|
|
44
|
+
"data-slot": "command-input-wrapper",
|
|
45
|
+
className: "flex h-9 items-center gap-2 border-b px-3",
|
|
46
|
+
children: [
|
|
47
|
+
/* @__PURE__ */ jsx(SearchIcon, { className: "size-4 shrink-0 opacity-50" }),
|
|
48
|
+
/* @__PURE__ */ jsx(
|
|
49
|
+
Command$1.Input,
|
|
50
|
+
{
|
|
51
|
+
"data-slot": "command-input",
|
|
52
|
+
className: cn(
|
|
53
|
+
"placeholder:text-muted-foreground flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50",
|
|
54
|
+
className
|
|
55
|
+
),
|
|
56
|
+
...props
|
|
57
|
+
}
|
|
58
|
+
)
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
function CommandList({
|
|
64
|
+
className,
|
|
65
|
+
...props
|
|
66
|
+
}) {
|
|
67
|
+
return /* @__PURE__ */ jsx(
|
|
68
|
+
Command$1.List,
|
|
69
|
+
{
|
|
70
|
+
"data-slot": "command-list",
|
|
71
|
+
className: cn(
|
|
72
|
+
"max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto",
|
|
73
|
+
className
|
|
74
|
+
),
|
|
75
|
+
...props
|
|
76
|
+
}
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
function CommandEmpty({
|
|
80
|
+
...props
|
|
81
|
+
}) {
|
|
82
|
+
return /* @__PURE__ */ jsx(
|
|
83
|
+
Command$1.Empty,
|
|
84
|
+
{
|
|
85
|
+
"data-slot": "command-empty",
|
|
86
|
+
className: "py-6 text-center text-sm",
|
|
87
|
+
...props
|
|
88
|
+
}
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
function CommandGroup({
|
|
92
|
+
className,
|
|
93
|
+
...props
|
|
94
|
+
}) {
|
|
95
|
+
return /* @__PURE__ */ jsx(
|
|
96
|
+
Command$1.Group,
|
|
97
|
+
{
|
|
98
|
+
"data-slot": "command-group",
|
|
99
|
+
className: cn(
|
|
100
|
+
"text-foreground [&_[cmdk-group-heading]]:text-muted-foreground overflow-hidden p-1 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium",
|
|
101
|
+
className
|
|
102
|
+
),
|
|
103
|
+
...props
|
|
104
|
+
}
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
function CommandSeparator({
|
|
108
|
+
className,
|
|
109
|
+
...props
|
|
110
|
+
}) {
|
|
111
|
+
return /* @__PURE__ */ jsx(
|
|
112
|
+
Command$1.Separator,
|
|
113
|
+
{
|
|
114
|
+
"data-slot": "command-separator",
|
|
115
|
+
className: cn("bg-border -mx-1 h-px", className),
|
|
116
|
+
...props
|
|
117
|
+
}
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
function CommandItem({
|
|
121
|
+
className,
|
|
122
|
+
...props
|
|
123
|
+
}) {
|
|
124
|
+
return /* @__PURE__ */ jsx(
|
|
125
|
+
Command$1.Item,
|
|
126
|
+
{
|
|
127
|
+
"data-slot": "command-item",
|
|
128
|
+
className: cn(
|
|
129
|
+
"data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
130
|
+
className
|
|
131
|
+
),
|
|
132
|
+
...props
|
|
133
|
+
}
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
function CommandShortcut({
|
|
137
|
+
className,
|
|
138
|
+
...props
|
|
139
|
+
}) {
|
|
140
|
+
return /* @__PURE__ */ jsx(
|
|
141
|
+
"span",
|
|
142
|
+
{
|
|
143
|
+
"data-slot": "command-shortcut",
|
|
144
|
+
className: cn(
|
|
145
|
+
"text-muted-foreground ml-auto text-xs tracking-widest",
|
|
146
|
+
className
|
|
147
|
+
),
|
|
148
|
+
...props
|
|
149
|
+
}
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut };
|
|
154
|
+
//# sourceMappingURL=chunk-6GWVQB3Q.js.map
|
|
155
|
+
//# sourceMappingURL=chunk-6GWVQB3Q.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/command.tsx"],"names":["CommandPrimitive"],"mappings":";;;;;;AAgDA,SAAS,OAAA,CAAQ;AAAA,EACf,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAkD;AAChD,EAAA,uBACE,GAAA;AAAA,IAACA,SAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,SAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,2FAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAGA,SAAS,aAAA,CAAc;AAAA,EACrB,KAAA,GAAQ,iBAAA;AAAA,EACR,WAAA,GAAc,gCAAA;AAAA,EACd,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAGG;AACD,EAAA,uBACE,IAAA,CAAC,MAAA,EAAA,EAAQ,GAAG,KAAA,EACV,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,YAAA,EAAA,EAAa,WAAU,SAAA,EACtB,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,eAAa,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBACpB,GAAA,CAAC,qBAAmB,QAAA,EAAA,WAAA,EAAY;AAAA,KAAA,EAClC,CAAA;AAAA,oBACA,GAAA,CAAC,iBAAc,SAAA,EAAU,qBAAA,EACvB,8BAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,uZAAA,EAChB,QAAA,EACH,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAGA,SAAS,YAAA,CAAa;AAAA,EACpB,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAwD;AACtD,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,uBAAA;AAAA,MACV,SAAA,EAAU,2CAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,WAAU,4BAAA,EAA6B,CAAA;AAAA,wBACnD,GAAA;AAAA,UAACA,SAAA,CAAiB,KAAA;AAAA,UAAjB;AAAA,YACC,WAAA,EAAU,eAAA;AAAA,YACV,SAAA,EAAW,EAAA;AAAA,cACT,0JAAA;AAAA,cACA;AAAA,aACF;AAAA,YACC,GAAG;AAAA;AAAA;AACN;AAAA;AAAA,GACF;AAEJ;AAGA,SAAS,WAAA,CAAY;AAAA,EACnB,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAuD;AACrD,EAAA,uBACE,GAAA;AAAA,IAACA,SAAA,CAAiB,IAAA;AAAA,IAAjB;AAAA,MACC,WAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,6DAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAGA,SAAS,YAAA,CAAa;AAAA,EACpB,GAAG;AACL,CAAA,EAAwD;AACtD,EAAA,uBACE,GAAA;AAAA,IAACA,SAAA,CAAiB,KAAA;AAAA,IAAjB;AAAA,MACC,WAAA,EAAU,eAAA;AAAA,MACV,SAAA,EAAU,0BAAA;AAAA,MACT,GAAG;AAAA;AAAA,GACN;AAEJ;AAGA,SAAS,YAAA,CAAa;AAAA,EACpB,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAwD;AACtD,EAAA,uBACE,GAAA;AAAA,IAACA,SAAA,CAAiB,KAAA;AAAA,IAAjB;AAAA,MACC,WAAA,EAAU,eAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,wNAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAGA,SAAS,gBAAA,CAAiB;AAAA,EACxB,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA4D;AAC1D,EAAA,uBACE,GAAA;AAAA,IAACA,SAAA,CAAiB,SAAA;AAAA,IAAjB;AAAA,MACC,WAAA,EAAU,mBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,sBAAA,EAAwB,SAAS,CAAA;AAAA,MAC9C,GAAG;AAAA;AAAA,GACN;AAEJ;AAGA,SAAS,WAAA,CAAY;AAAA,EACnB,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAuD;AACrD,EAAA,uBACE,GAAA;AAAA,IAACA,SAAA,CAAiB,IAAA;AAAA,IAAjB;AAAA,MACC,WAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,qYAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAGA,SAAS,eAAA,CAAgB;AAAA,EACvB,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAiC;AAC/B,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,kBAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,uDAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ","file":"chunk-6GWVQB3Q.js","sourcesContent":["import * as React from \"react\";\nimport { Command as CommandPrimitive } from \"cmdk\";\nimport { SearchIcon } from \"lucide-react\";\n\nimport { cn } from \"../lib/utils\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"./dialog\";\n\n/**\n * Command palette component built on cmdk.\n *\n * Provides a searchable, keyboard-navigable list of commands or options.\n * Use `CommandDialog` for a modal command palette, or `Command` inline\n * for embedded search/filter interfaces like comboboxes.\n *\n * @example\n * ```tsx\n * <CommandDialog open={open} onOpenChange={setOpen}>\n * <CommandInput placeholder=\"Type a command or search...\" />\n * <CommandList>\n * <CommandEmpty>No results found.</CommandEmpty>\n * <CommandGroup heading=\"Suggestions\">\n * <CommandItem>\n * <CalendarIcon className=\"size-4\" />\n * Calendar\n * </CommandItem>\n * <CommandItem>\n * <SearchIcon className=\"size-4\" />\n * Search\n * <CommandShortcut>Ctrl+K</CommandShortcut>\n * </CommandItem>\n * </CommandGroup>\n * <CommandSeparator />\n * <CommandGroup heading=\"Settings\">\n * <CommandItem>\n * <SettingsIcon className=\"size-4\" />\n * Settings\n * </CommandItem>\n * </CommandGroup>\n * </CommandList>\n * </CommandDialog>\n * ```\n */\nfunction Command({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive>) {\n return (\n <CommandPrimitive\n data-slot=\"command\"\n className={cn(\n \"bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Modal wrapper that renders a Command palette inside a Dialog. Accepts optional `title` and `description` for accessibility. */\nfunction CommandDialog({\n title = \"Command Palette\",\n description = \"Search for a command to run...\",\n children,\n ...props\n}: React.ComponentProps<typeof Dialog> & {\n title?: string;\n description?: string;\n}) {\n return (\n <Dialog {...props}>\n <DialogHeader className=\"sr-only\">\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n <DialogContent className=\"overflow-hidden p-0\">\n <Command className=\"[&_[cmdk-group-heading]]:text-muted-foreground **:data-[slot=command-input-wrapper]:h-12 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group]]:px-2 [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n );\n}\n\n/** Search input field with a magnifying glass icon for filtering command items. */\nfunction CommandInput({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Input>) {\n return (\n <div\n data-slot=\"command-input-wrapper\"\n className=\"flex h-9 items-center gap-2 border-b px-3\"\n >\n <SearchIcon className=\"size-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n data-slot=\"command-input\"\n className={cn(\n \"placeholder:text-muted-foreground flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n />\n </div>\n );\n}\n\n/** Scrollable container for command groups and items. */\nfunction CommandList({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.List>) {\n return (\n <CommandPrimitive.List\n data-slot=\"command-list\"\n className={cn(\n \"max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Fallback content shown when no command items match the search query. */\nfunction CommandEmpty({\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Empty>) {\n return (\n <CommandPrimitive.Empty\n data-slot=\"command-empty\"\n className=\"py-6 text-center text-sm\"\n {...props}\n />\n );\n}\n\n/** Groups related command items under an optional heading. */\nfunction CommandGroup({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Group>) {\n return (\n <CommandPrimitive.Group\n data-slot=\"command-group\"\n className={cn(\n \"text-foreground [&_[cmdk-group-heading]]:text-muted-foreground overflow-hidden p-1 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Visual divider between groups of command items. */\nfunction CommandSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Separator>) {\n return (\n <CommandPrimitive.Separator\n data-slot=\"command-separator\"\n className={cn(\"bg-border -mx-1 h-px\", className)}\n {...props}\n />\n );\n}\n\n/** Selectable command item that can be navigated with keyboard arrows and activated with Enter. */\nfunction CommandItem({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Item>) {\n return (\n <CommandPrimitive.Item\n data-slot=\"command-item\"\n className={cn(\n \"data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Keyboard shortcut hint displayed at the end of a command item. */\nfunction CommandShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"command-shortcut\"\n className={cn(\n \"text-muted-foreground ml-auto text-xs tracking-widest\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n};"]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Label } from './chunk-P3M5TZD2.js';
|
|
2
|
+
import { Input } from './chunk-3VU56V66.js';
|
|
3
|
+
import { useEffect } from 'react';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var defaultLabels = {
|
|
7
|
+
slug: "Slug",
|
|
8
|
+
autoGenerated: "Auto-generated from title",
|
|
9
|
+
placeholder: "enter-slug-here"
|
|
10
|
+
};
|
|
11
|
+
function generateSlug(text) {
|
|
12
|
+
return text.toLowerCase().replace(/[àáạảãâầấậẩẫăằắặẳẵ]/g, "a").replace(/[èéẹẻẽêềếệểễ]/g, "e").replace(/[ìíịỉĩ]/g, "i").replace(/[òóọỏõôồốộổỗơờớợởỡ]/g, "o").replace(/[ùúụủũưừứựửữ]/g, "u").replace(/[ỳýỵỷỹ]/g, "y").replace(/đ/g, "d").replace(/[^a-z0-9\s-]/g, "").replace(/\s+/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
|
|
13
|
+
}
|
|
14
|
+
function SlugInput({
|
|
15
|
+
title,
|
|
16
|
+
slug,
|
|
17
|
+
onSlugChange,
|
|
18
|
+
disabled = false,
|
|
19
|
+
labels: labelOverrides
|
|
20
|
+
}) {
|
|
21
|
+
const labels = { ...defaultLabels, ...labelOverrides };
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
if (!disabled && title) {
|
|
24
|
+
onSlugChange(generateSlug(title));
|
|
25
|
+
}
|
|
26
|
+
}, [title, disabled, onSlugChange]);
|
|
27
|
+
return /* @__PURE__ */ jsxs("div", { children: [
|
|
28
|
+
/* @__PURE__ */ jsx(Label, { children: labels.slug }),
|
|
29
|
+
/* @__PURE__ */ jsx(
|
|
30
|
+
Input,
|
|
31
|
+
{
|
|
32
|
+
value: slug,
|
|
33
|
+
onChange: (e) => onSlugChange(e.target.value),
|
|
34
|
+
placeholder: labels.placeholder,
|
|
35
|
+
className: "h-element-sm mt-1 font-mono text-sm"
|
|
36
|
+
}
|
|
37
|
+
),
|
|
38
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground mt-1", children: labels.autoGenerated })
|
|
39
|
+
] });
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export { SlugInput, generateSlug };
|
|
43
|
+
//# sourceMappingURL=chunk-75WZR6HF.js.map
|
|
44
|
+
//# sourceMappingURL=chunk-75WZR6HF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/slug-input.tsx"],"names":[],"mappings":";;;;;AA2BA,IAAM,aAAA,GAAiC;AAAA,EACrC,IAAA,EAAM,MAAA;AAAA,EACN,aAAA,EAAe,2BAAA;AAAA,EACf,WAAA,EAAa;AACf,CAAA;AAMO,SAAS,aAAa,IAAA,EAAsB;AACjD,EAAA,OAAO,IAAA,CACJ,aAAY,CACZ,OAAA,CAAQ,wBAAwB,GAAG,CAAA,CACnC,QAAQ,gBAAA,EAAkB,GAAG,EAC7B,OAAA,CAAQ,UAAA,EAAY,GAAG,CAAA,CACvB,OAAA,CAAQ,wBAAwB,GAAG,CAAA,CACnC,QAAQ,gBAAA,EAAkB,GAAG,EAC7B,OAAA,CAAQ,UAAA,EAAY,GAAG,CAAA,CACvB,OAAA,CAAQ,MAAM,GAAG,CAAA,CACjB,QAAQ,eAAA,EAAiB,EAAE,EAC3B,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CACnB,OAAA,CAAQ,OAAO,GAAG,CAAA,CAClB,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AACzB;AAqBO,SAAS,SAAA,CAAU;AAAA,EACxB,KAAA;AAAA,EACA,IAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,MAAA,EAAQ;AACV,CAAA,EAAmB;AACjB,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,aAAA,EAAe,GAAG,cAAA,EAAe;AAErD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,YAAY,KAAA,EAAO;AACtB,MAAA,YAAA,CAAa,YAAA,CAAa,KAAK,CAAC,CAAA;AAAA,IAClC;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,QAAA,EAAU,YAAY,CAAC,CAAA;AAElC,EAAA,4BACG,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,KAAA,EAAA,EAAO,iBAAO,IAAA,EAAK,CAAA;AAAA,oBACpB,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,IAAA;AAAA,QACP,UAAU,CAAC,CAAA,KAAM,YAAA,CAAa,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QAC5C,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,SAAA,EAAU;AAAA;AAAA,KACZ;AAAA,oBACA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oCAAA,EAAsC,iBAAO,aAAA,EAAc;AAAA,GAAA,EAC1E,CAAA;AAEJ","file":"chunk-75WZR6HF.js","sourcesContent":["import { useEffect } from 'react';\nimport { Input } from './input';\nimport { Label } from './label';\n\n/** Customizable labels for the SlugInput component. */\nexport interface SlugInputLabels {\n /** Label text above the slug input field. */\n slug: string;\n /** Helper text below the slug input. */\n autoGenerated: string;\n /** Placeholder shown inside the slug input. */\n placeholder: string;\n}\n\nexport interface SlugInputProps {\n /** Source title string from which the slug is auto-generated. */\n title: string;\n /** Current slug value. */\n slug: string;\n /** Callback fired when the slug changes (auto-generated or manually edited). */\n onSlugChange: (slug: string) => void;\n /** Whether auto-generation from title is disabled and slug is manually editable only. */\n disabled?: boolean;\n /** Override default label strings for localization. */\n labels?: Partial<SlugInputLabels>;\n}\n\nconst defaultLabels: SlugInputLabels = {\n slug: 'Slug',\n autoGenerated: 'Auto-generated from title',\n placeholder: 'enter-slug-here',\n};\n\n/**\n * Generates a URL-friendly slug from a text string.\n * Handles Vietnamese diacritics and other special characters.\n */\nexport function generateSlug(text: string): string {\n return text\n .toLowerCase()\n .replace(/[àáạảãâầấậẩẫăằắặẳẵ]/g, 'a')\n .replace(/[èéẹẻẽêềếệểễ]/g, 'e')\n .replace(/[ìíịỉĩ]/g, 'i')\n .replace(/[òóọỏõôồốộổỗơờớợởỡ]/g, 'o')\n .replace(/[ùúụủũưừứựửữ]/g, 'u')\n .replace(/[ỳýỵỷỹ]/g, 'y')\n .replace(/đ/g, 'd')\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n}\n\n/**\n * URL slug input that auto-generates a slug from a title string.\n * Handles Vietnamese diacritics and special characters via `generateSlug`.\n * The slug updates automatically when the title changes (unless `disabled` is true).\n *\n * @example\n * ```tsx\n * const [title, setTitle] = useState(\"My Blog Post\");\n * const [slug, setSlug] = useState(\"\");\n *\n * <Input value={title} onChange={(e) => setTitle(e.target.value)} />\n * <SlugInput\n * title={title}\n * slug={slug}\n * onSlugChange={setSlug}\n * />\n * // slug will auto-populate as \"my-blog-post\"\n * ```\n */\nexport function SlugInput({\n title,\n slug,\n onSlugChange,\n disabled = false,\n labels: labelOverrides,\n}: SlugInputProps) {\n const labels = { ...defaultLabels, ...labelOverrides };\n\n useEffect(() => {\n if (!disabled && title) {\n onSlugChange(generateSlug(title));\n }\n }, [title, disabled, onSlugChange]);\n\n return (\n <div>\n <Label>{labels.slug}</Label>\n <Input\n value={slug}\n onChange={(e) => onSlugChange(e.target.value)}\n placeholder={labels.placeholder}\n className=\"h-element-sm mt-1 font-mono text-sm\"\n />\n <p className=\"text-xs text-muted-foreground mt-1\">{labels.autoGenerated}</p>\n </div>\n );\n}\n"]}
|