@omnifyjp/ui 0.4.4 → 0.5.0
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 +379 -133
- package/dist/chunk-2ZIFL2X3.js +189 -0
- package/dist/chunk-2ZIFL2X3.js.map +1 -0
- package/dist/chunk-5BL4VFRJ.js +57 -0
- package/dist/chunk-5BL4VFRJ.js.map +1 -0
- package/dist/chunk-5D3OAVOZ.js +91 -0
- package/dist/chunk-5D3OAVOZ.js.map +1 -0
- package/dist/chunk-DTM76EJD.js +235 -0
- package/dist/chunk-DTM76EJD.js.map +1 -0
- package/dist/chunk-EJEVW4RO.js +49 -0
- package/dist/chunk-EJEVW4RO.js.map +1 -0
- package/dist/chunk-JXFBHSPN.js +37 -0
- package/dist/chunk-JXFBHSPN.js.map +1 -0
- package/dist/chunk-O25D7DCP.js +72 -0
- package/dist/chunk-O25D7DCP.js.map +1 -0
- package/dist/chunk-OY3PSPA5.js +661 -0
- package/dist/chunk-OY3PSPA5.js.map +1 -0
- package/dist/chunk-SHHZRZMM.js +83 -0
- package/dist/chunk-SHHZRZMM.js.map +1 -0
- package/dist/chunk-X57K24P3.js +224 -0
- package/dist/chunk-X57K24P3.js.map +1 -0
- package/dist/chunk-XDXGUPCR.js +123 -0
- package/dist/chunk-XDXGUPCR.js.map +1 -0
- package/dist/components/AppShell.d.ts +27 -0
- package/dist/components/AppShell.js +11 -0
- package/dist/components/AppShell.js.map +1 -0
- package/dist/components/Header.d.ts +11 -0
- package/dist/components/Header.js +6 -0
- package/dist/components/Header.js.map +1 -0
- package/dist/components/OrganizationSelector.d.ts +8 -0
- package/dist/components/OrganizationSelector.js +4 -0
- package/dist/components/OrganizationSelector.js.map +1 -0
- package/dist/components/OrganizationSetupModal.d.ts +5 -0
- package/dist/components/OrganizationSetupModal.js +4 -0
- package/dist/components/OrganizationSetupModal.js.map +1 -0
- package/dist/components/PageContainer.d.ts +105 -0
- package/dist/components/PageContainer.js +3 -0
- package/dist/components/PageContainer.js.map +1 -0
- package/dist/components/ServiceMenu.d.ts +11 -0
- package/dist/components/ServiceMenu.js +3 -0
- package/dist/components/ServiceMenu.js.map +1 -0
- package/dist/components/Sidebar.d.ts +11 -0
- package/dist/components/Sidebar.js +5 -0
- package/dist/components/Sidebar.js.map +1 -0
- package/dist/contexts/OrganizationContext.d.ts +26 -0
- package/dist/contexts/OrganizationContext.js +3 -0
- package/dist/contexts/OrganizationContext.js.map +1 -0
- package/dist/contexts/ThemeContext.d.ts +14 -0
- package/dist/contexts/ThemeContext.js +3 -0
- package/dist/contexts/ThemeContext.js.map +1 -0
- package/dist/hooks/useDateFormat.d.ts +28 -0
- package/dist/hooks/useDateFormat.js +4 -0
- package/dist/hooks/useDateFormat.js.map +1 -0
- package/dist/i18n.d.ts +38 -0
- package/dist/i18n.js +3 -0
- package/dist/i18n.js.map +1 -0
- package/dist/index.d.ts +13 -109
- package/dist/index.js +11 -70
- package/dist/types.d.ts +89 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +23 -70
- package/dist/chunk-2C2HRGM7.js +0 -51
- package/dist/chunk-2C2HRGM7.js.map +0 -1
- package/dist/chunk-2TUWDXAC.js +0 -196
- package/dist/chunk-2TUWDXAC.js.map +0 -1
- package/dist/chunk-34ARZSNP.js +0 -63
- package/dist/chunk-34ARZSNP.js.map +0 -1
- package/dist/chunk-35DNN46W.js +0 -13
- package/dist/chunk-35DNN46W.js.map +0 -1
- package/dist/chunk-35U6QG4P.js +0 -116
- package/dist/chunk-35U6QG4P.js.map +0 -1
- package/dist/chunk-36YYHIJU.js +0 -52
- package/dist/chunk-36YYHIJU.js.map +0 -1
- package/dist/chunk-3EOHW4QN.js +0 -35
- package/dist/chunk-3EOHW4QN.js.map +0 -1
- package/dist/chunk-3UPBCOS4.js +0 -39
- package/dist/chunk-3UPBCOS4.js.map +0 -1
- package/dist/chunk-3VU56V66.js +0 -41
- package/dist/chunk-3VU56V66.js.map +0 -1
- package/dist/chunk-55E7D2HR.js +0 -99
- package/dist/chunk-55E7D2HR.js.map +0 -1
- package/dist/chunk-67YUL2ZS.js +0 -53
- package/dist/chunk-67YUL2ZS.js.map +0 -1
- package/dist/chunk-6DIDQ4TB.js +0 -131
- package/dist/chunk-6DIDQ4TB.js.map +0 -1
- package/dist/chunk-6GWVQB3Q.js +0 -155
- package/dist/chunk-6GWVQB3Q.js.map +0 -1
- package/dist/chunk-75WZR6HF.js +0 -44
- package/dist/chunk-75WZR6HF.js.map +0 -1
- package/dist/chunk-7IRLBU2I.js +0 -114
- package/dist/chunk-7IRLBU2I.js.map +0 -1
- package/dist/chunk-7RMTPT6O.js +0 -99
- package/dist/chunk-7RMTPT6O.js.map +0 -1
- package/dist/chunk-7XH3MGBR.js +0 -128
- package/dist/chunk-7XH3MGBR.js.map +0 -1
- package/dist/chunk-A3BB5ZOC.js +0 -77
- package/dist/chunk-A3BB5ZOC.js.map +0 -1
- package/dist/chunk-B434PORR.js +0 -239
- package/dist/chunk-B434PORR.js.map +0 -1
- package/dist/chunk-BAQWGQJG.js +0 -106
- package/dist/chunk-BAQWGQJG.js.map +0 -1
- package/dist/chunk-BRSM3SZP.js +0 -46
- package/dist/chunk-BRSM3SZP.js.map +0 -1
- package/dist/chunk-C34KSTWA.js +0 -43
- package/dist/chunk-C34KSTWA.js.map +0 -1
- package/dist/chunk-C5NZAOA7.js +0 -54
- package/dist/chunk-C5NZAOA7.js.map +0 -1
- package/dist/chunk-CUZR4JWM.js +0 -23
- package/dist/chunk-CUZR4JWM.js.map +0 -1
- package/dist/chunk-DGPY4WP3.js +0 -11
- package/dist/chunk-DGPY4WP3.js.map +0 -1
- package/dist/chunk-EWBCV7VA.js +0 -65
- package/dist/chunk-EWBCV7VA.js.map +0 -1
- package/dist/chunk-F2ZJLKDP.js +0 -119
- package/dist/chunk-F2ZJLKDP.js.map +0 -1
- package/dist/chunk-FLWMT4DB.js +0 -66
- package/dist/chunk-FLWMT4DB.js.map +0 -1
- package/dist/chunk-FRKG7JQY.js +0 -48
- package/dist/chunk-FRKG7JQY.js.map +0 -1
- package/dist/chunk-G7HTZBUR.js +0 -187
- package/dist/chunk-G7HTZBUR.js.map +0 -1
- package/dist/chunk-HWTW64R5.js +0 -90
- package/dist/chunk-HWTW64R5.js.map +0 -1
- package/dist/chunk-IAWKX5W4.js +0 -219
- package/dist/chunk-IAWKX5W4.js.map +0 -1
- package/dist/chunk-INLM7UJC.js +0 -238
- package/dist/chunk-INLM7UJC.js.map +0 -1
- package/dist/chunk-JAJMM32I.js +0 -18
- package/dist/chunk-JAJMM32I.js.map +0 -1
- package/dist/chunk-JJSVA3TH.js +0 -61
- package/dist/chunk-JJSVA3TH.js.map +0 -1
- package/dist/chunk-JLTBUACL.js +0 -121
- package/dist/chunk-JLTBUACL.js.map +0 -1
- package/dist/chunk-JRU2QX7T.js +0 -38
- package/dist/chunk-JRU2QX7T.js.map +0 -1
- package/dist/chunk-JXGRW2MR.js +0 -17
- package/dist/chunk-JXGRW2MR.js.map +0 -1
- package/dist/chunk-KTBOZ4NE.js +0 -93
- package/dist/chunk-KTBOZ4NE.js.map +0 -1
- package/dist/chunk-LMT327XH.js +0 -56
- package/dist/chunk-LMT327XH.js.map +0 -1
- package/dist/chunk-LTTNCAAA.js +0 -138
- package/dist/chunk-LTTNCAAA.js.map +0 -1
- package/dist/chunk-LVZNNIK4.js +0 -111
- package/dist/chunk-LVZNNIK4.js.map +0 -1
- package/dist/chunk-MJLFJPUG.js +0 -143
- package/dist/chunk-MJLFJPUG.js.map +0 -1
- package/dist/chunk-MZ2P566X.js +0 -65
- package/dist/chunk-MZ2P566X.js.map +0 -1
- package/dist/chunk-N47H4MHX.js +0 -41
- package/dist/chunk-N47H4MHX.js.map +0 -1
- package/dist/chunk-NNJTKHCE.js +0 -160
- package/dist/chunk-NNJTKHCE.js.map +0 -1
- package/dist/chunk-NPL2R5LD.js +0 -171
- package/dist/chunk-NPL2R5LD.js.map +0 -1
- package/dist/chunk-NU56GKGM.js +0 -44
- package/dist/chunk-NU56GKGM.js.map +0 -1
- package/dist/chunk-P3M5TZD2.js +0 -24
- package/dist/chunk-P3M5TZD2.js.map +0 -1
- package/dist/chunk-PGWNOZDX.js +0 -28
- package/dist/chunk-PGWNOZDX.js.map +0 -1
- package/dist/chunk-QB3UWRZH.js +0 -92
- package/dist/chunk-QB3UWRZH.js.map +0 -1
- package/dist/chunk-R2CDE5DO.js +0 -33
- package/dist/chunk-R2CDE5DO.js.map +0 -1
- package/dist/chunk-RQNZDWY3.js +0 -65
- package/dist/chunk-RQNZDWY3.js.map +0 -1
- package/dist/chunk-S6PDRGR5.js +0 -109
- package/dist/chunk-S6PDRGR5.js.map +0 -1
- package/dist/chunk-TGYQ3AKH.js +0 -95
- package/dist/chunk-TGYQ3AKH.js.map +0 -1
- package/dist/chunk-THQUH6WX.js +0 -81
- package/dist/chunk-THQUH6WX.js.map +0 -1
- package/dist/chunk-TJMK2KBE.js +0 -112
- package/dist/chunk-TJMK2KBE.js.map +0 -1
- package/dist/chunk-TTH7TWVX.js +0 -30
- package/dist/chunk-TTH7TWVX.js.map +0 -1
- package/dist/chunk-USIHM7FV.js +0 -211
- package/dist/chunk-USIHM7FV.js.map +0 -1
- package/dist/chunk-VVYSAGB3.js +0 -104
- package/dist/chunk-VVYSAGB3.js.map +0 -1
- package/dist/chunk-WD5KZE25.js +0 -25
- package/dist/chunk-WD5KZE25.js.map +0 -1
- package/dist/chunk-WL4ZO2H3.js +0 -33
- package/dist/chunk-WL4ZO2H3.js.map +0 -1
- package/dist/chunk-WRCHR4AK.js +0 -23
- package/dist/chunk-WRCHR4AK.js.map +0 -1
- package/dist/chunk-XOJJBNDX.js +0 -33
- package/dist/chunk-XOJJBNDX.js.map +0 -1
- package/dist/chunk-XUVLD65E.js +0 -617
- package/dist/chunk-XUVLD65E.js.map +0 -1
- package/dist/chunk-YBMEQZX7.js +0 -164
- package/dist/chunk-YBMEQZX7.js.map +0 -1
- package/dist/chunk-Z2QAABLM.js +0 -86
- package/dist/chunk-Z2QAABLM.js.map +0 -1
- package/dist/chunk-ZHEKDP5X.js +0 -41
- package/dist/chunk-ZHEKDP5X.js.map +0 -1
- package/dist/chunk-ZPMXRW2A.js +0 -63
- package/dist/chunk-ZPMXRW2A.js.map +0 -1
- package/dist/chunk-ZYEGBF7G.js +0 -25
- package/dist/chunk-ZYEGBF7G.js.map +0 -1
- package/dist/components/accordion.d.ts +0 -37
- package/dist/components/accordion.js +0 -4
- package/dist/components/accordion.js.map +0 -1
- package/dist/components/alert-dialog.d.ts +0 -56
- package/dist/components/alert-dialog.js +0 -5
- package/dist/components/alert-dialog.js.map +0 -1
- package/dist/components/alert.d.ts +0 -68
- package/dist/components/alert.js +0 -4
- package/dist/components/alert.js.map +0 -1
- package/dist/components/aspect-ratio.d.ts +0 -23
- package/dist/components/aspect-ratio.js +0 -3
- package/dist/components/aspect-ratio.js.map +0 -1
- package/dist/components/avatar.d.ts +0 -48
- package/dist/components/avatar.js +0 -4
- package/dist/components/avatar.js.map +0 -1
- package/dist/components/badge.d.ts +0 -52
- package/dist/components/badge.js +0 -4
- package/dist/components/badge.js.map +0 -1
- package/dist/components/breadcrumb.d.ts +0 -50
- package/dist/components/breadcrumb.js +0 -4
- package/dist/components/breadcrumb.js.map +0 -1
- package/dist/components/button.d.ts +0 -81
- package/dist/components/button.js +0 -4
- package/dist/components/button.js.map +0 -1
- package/dist/components/calendar-category-badge.d.ts +0 -24
- package/dist/components/calendar-category-badge.js +0 -5
- package/dist/components/calendar-category-badge.js.map +0 -1
- package/dist/components/calendar-event-chip.d.ts +0 -41
- package/dist/components/calendar-event-chip.js +0 -4
- package/dist/components/calendar-event-chip.js.map +0 -1
- package/dist/components/calendar-event-sheet.d.ts +0 -68
- package/dist/components/calendar-event-sheet.js +0 -9
- package/dist/components/calendar-event-sheet.js.map +0 -1
- package/dist/components/calendar-mini.d.ts +0 -65
- package/dist/components/calendar-mini.js +0 -6
- package/dist/components/calendar-mini.js.map +0 -1
- package/dist/components/calendar-toolbar.d.ts +0 -58
- package/dist/components/calendar-toolbar.js +0 -7
- package/dist/components/calendar-toolbar.js.map +0 -1
- package/dist/components/calendar.d.ts +0 -19
- package/dist/components/calendar.js +0 -5
- package/dist/components/calendar.js.map +0 -1
- package/dist/components/card.d.ts +0 -43
- package/dist/components/card.js +0 -4
- package/dist/components/card.js.map +0 -1
- package/dist/components/carousel.d.ts +0 -53
- package/dist/components/carousel.js +0 -5
- package/dist/components/carousel.js.map +0 -1
- package/dist/components/chart.d.ts +0 -103
- package/dist/components/chart.js +0 -4
- package/dist/components/chart.js.map +0 -1
- package/dist/components/checkbox.d.ts +0 -24
- package/dist/components/checkbox.js +0 -4
- package/dist/components/checkbox.js.map +0 -1
- package/dist/components/collapsible.d.ts +0 -28
- package/dist/components/collapsible.js +0 -3
- package/dist/components/collapsible.js.map +0 -1
- package/dist/components/color-picker.d.ts +0 -35
- package/dist/components/color-picker.js +0 -7
- package/dist/components/color-picker.js.map +0 -1
- package/dist/components/combobox.d.ts +0 -98
- package/dist/components/combobox.js +0 -8
- package/dist/components/combobox.js.map +0 -1
- package/dist/components/command.d.ts +0 -63
- package/dist/components/command.js +0 -5
- package/dist/components/command.js.map +0 -1
- package/dist/components/context-menu.d.ts +0 -70
- package/dist/components/context-menu.js +0 -4
- package/dist/components/context-menu.js.map +0 -1
- package/dist/components/date-picker.d.ts +0 -71
- package/dist/components/date-picker.js +0 -7
- package/dist/components/date-picker.js.map +0 -1
- package/dist/components/dialog.d.ts +0 -58
- package/dist/components/dialog.js +0 -4
- package/dist/components/dialog.js.map +0 -1
- package/dist/components/drawer.d.ts +0 -60
- package/dist/components/drawer.js +0 -4
- package/dist/components/drawer.js.map +0 -1
- package/dist/components/dropdown-menu.d.ts +0 -76
- package/dist/components/dropdown-menu.js +0 -4
- package/dist/components/dropdown-menu.js.map +0 -1
- package/dist/components/file-upload.d.ts +0 -44
- package/dist/components/file-upload.js +0 -5
- package/dist/components/file-upload.js.map +0 -1
- package/dist/components/form.d.ts +0 -67
- package/dist/components/form.js +0 -5
- package/dist/components/form.js.map +0 -1
- package/dist/components/hover-card.d.ts +0 -43
- package/dist/components/hover-card.js +0 -4
- package/dist/components/hover-card.js.map +0 -1
- package/dist/components/input-otp.d.ts +0 -38
- package/dist/components/input-otp.js +0 -4
- package/dist/components/input-otp.js.map +0 -1
- package/dist/components/input.d.ts +0 -38
- package/dist/components/input.js +0 -4
- package/dist/components/input.js.map +0 -1
- package/dist/components/label.d.ts +0 -20
- package/dist/components/label.js +0 -4
- package/dist/components/label.js.map +0 -1
- package/dist/components/menubar.d.ts +0 -82
- package/dist/components/menubar.js +0 -4
- package/dist/components/menubar.js.map +0 -1
- package/dist/components/navigation-menu.d.ts +0 -64
- package/dist/components/navigation-menu.js +0 -4
- package/dist/components/navigation-menu.js.map +0 -1
- package/dist/components/pagination.d.ts +0 -59
- package/dist/components/pagination.js +0 -5
- package/dist/components/pagination.js.map +0 -1
- package/dist/components/password-input.d.ts +0 -32
- package/dist/components/password-input.js +0 -5
- package/dist/components/password-input.js.map +0 -1
- package/dist/components/permission-grid.d.ts +0 -67
- package/dist/components/permission-grid.js +0 -5
- package/dist/components/permission-grid.js.map +0 -1
- package/dist/components/popover.d.ts +0 -37
- package/dist/components/popover.js +0 -4
- package/dist/components/popover.js.map +0 -1
- package/dist/components/progress.d.ts +0 -20
- package/dist/components/progress.js +0 -4
- package/dist/components/progress.js.map +0 -1
- package/dist/components/radio-group.d.ts +0 -38
- package/dist/components/radio-group.js +0 -4
- package/dist/components/radio-group.js.map +0 -1
- package/dist/components/rating.d.ts +0 -35
- package/dist/components/rating.js +0 -4
- package/dist/components/rating.js.map +0 -1
- package/dist/components/resizable.d.ts +0 -36
- package/dist/components/resizable.js +0 -4
- package/dist/components/resizable.js.map +0 -1
- package/dist/components/scope-tree.d.ts +0 -78
- package/dist/components/scope-tree.js +0 -5
- package/dist/components/scope-tree.js.map +0 -1
- package/dist/components/scope-type-badge.d.ts +0 -35
- package/dist/components/scope-type-badge.js +0 -5
- package/dist/components/scope-type-badge.js.map +0 -1
- package/dist/components/scroll-area.d.ts +0 -29
- package/dist/components/scroll-area.js +0 -4
- package/dist/components/scroll-area.js.map +0 -1
- package/dist/components/select.d.ts +0 -52
- package/dist/components/select.js +0 -4
- package/dist/components/select.js.map +0 -1
- package/dist/components/separator.d.ts +0 -24
- package/dist/components/separator.js +0 -4
- package/dist/components/separator.js.map +0 -1
- package/dist/components/sheet.d.ts +0 -51
- package/dist/components/sheet.js +0 -4
- package/dist/components/sheet.js.map +0 -1
- package/dist/components/sidebar.d.ts +0 -169
- package/dist/components/sidebar.js +0 -11
- package/dist/components/sidebar.js.map +0 -1
- package/dist/components/skeleton.d.ts +0 -25
- package/dist/components/skeleton.js +0 -4
- package/dist/components/skeleton.js.map +0 -1
- package/dist/components/slider.d.ts +0 -24
- package/dist/components/slider.js +0 -4
- package/dist/components/slider.js.map +0 -1
- package/dist/components/slug-input.d.ts +0 -50
- package/dist/components/slug-input.js +0 -6
- package/dist/components/slug-input.js.map +0 -1
- package/dist/components/sonner.d.ts +0 -22
- package/dist/components/sonner.js +0 -3
- package/dist/components/sonner.js.map +0 -1
- package/dist/components/stage-type-badge.d.ts +0 -30
- package/dist/components/stage-type-badge.js +0 -5
- package/dist/components/stage-type-badge.js.map +0 -1
- package/dist/components/switch.d.ts +0 -26
- package/dist/components/switch.js +0 -4
- package/dist/components/switch.js.map +0 -1
- package/dist/components/table.d.ts +0 -57
- package/dist/components/table.js +0 -4
- package/dist/components/table.js.map +0 -1
- package/dist/components/tabs.d.ts +0 -39
- package/dist/components/tabs.js +0 -4
- package/dist/components/tabs.js.map +0 -1
- package/dist/components/tag-input.d.ts +0 -40
- package/dist/components/tag-input.js +0 -5
- package/dist/components/tag-input.js.map +0 -1
- package/dist/components/textarea.d.ts +0 -21
- package/dist/components/textarea.js +0 -4
- package/dist/components/textarea.js.map +0 -1
- package/dist/components/time-picker.d.ts +0 -57
- package/dist/components/time-picker.js +0 -8
- package/dist/components/time-picker.js.map +0 -1
- package/dist/components/toggle-group.d.ts +0 -45
- package/dist/components/toggle-group.js +0 -5
- package/dist/components/toggle-group.js.map +0 -1
- package/dist/components/toggle.d.ts +0 -31
- package/dist/components/toggle.js +0 -4
- package/dist/components/toggle.js.map +0 -1
- package/dist/components/tooltip.d.ts +0 -34
- package/dist/components/tooltip.js +0 -4
- package/dist/components/tooltip.js.map +0 -1
- package/dist/components/workflow-category-badge.d.ts +0 -32
- package/dist/components/workflow-category-badge.js +0 -5
- package/dist/components/workflow-category-badge.js.map +0 -1
- package/dist/components/workflow-diagram.d.ts +0 -63
- package/dist/components/workflow-diagram.js +0 -5
- package/dist/components/workflow-diagram.js.map +0 -1
- package/dist/components/workflow-status-badge.d.ts +0 -30
- package/dist/components/workflow-status-badge.js +0 -5
- package/dist/components/workflow-status-badge.js.map +0 -1
- package/dist/components/workflow-stepper.d.ts +0 -52
- package/dist/components/workflow-stepper.js +0 -4
- package/dist/components/workflow-stepper.js.map +0 -1
- package/dist/hooks/use-mobile.d.ts +0 -3
- package/dist/hooks/use-mobile.js +0 -3
- package/dist/hooks/use-mobile.js.map +0 -1
- package/dist/lib/utils.d.ts +0 -5
- package/dist/lib/utils.js +0 -3
- package/dist/lib/utils.js.map +0 -1
- package/dist/types-CBVkScfB.d.ts +0 -84
- package/src/styles/fonts.css +0 -0
- package/src/styles/index.css +0 -3
- package/src/styles/tailwind.css +0 -4
- package/src/styles/theme.css +0 -461
package/dist/chunk-G7HTZBUR.js
DELETED
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
import { Button } from './chunk-55E7D2HR.js';
|
|
2
|
-
import { cn } from './chunk-DGPY4WP3.js';
|
|
3
|
-
import * as React from 'react';
|
|
4
|
-
import { Upload, X, FileImage, FileVideo, FileText, File } from 'lucide-react';
|
|
5
|
-
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
|
-
|
|
7
|
-
function FileUpload({
|
|
8
|
-
value = [],
|
|
9
|
-
onChange,
|
|
10
|
-
accept,
|
|
11
|
-
multiple = false,
|
|
12
|
-
maxSize = 10 * 1024 * 1024,
|
|
13
|
-
// 10MB default
|
|
14
|
-
maxFiles,
|
|
15
|
-
disabled,
|
|
16
|
-
className,
|
|
17
|
-
showPreview = true
|
|
18
|
-
}) {
|
|
19
|
-
const inputRef = React.useRef(null);
|
|
20
|
-
const [dragActive, setDragActive] = React.useState(false);
|
|
21
|
-
const [error, setError] = React.useState("");
|
|
22
|
-
const handleDrag = (e) => {
|
|
23
|
-
e.preventDefault();
|
|
24
|
-
e.stopPropagation();
|
|
25
|
-
if (e.type === "dragenter" || e.type === "dragover") {
|
|
26
|
-
setDragActive(true);
|
|
27
|
-
} else if (e.type === "dragleave") {
|
|
28
|
-
setDragActive(false);
|
|
29
|
-
}
|
|
30
|
-
};
|
|
31
|
-
const validateFiles = (files) => {
|
|
32
|
-
setError("");
|
|
33
|
-
if (maxFiles && value.length + files.length > maxFiles) {
|
|
34
|
-
return {
|
|
35
|
-
valid: [],
|
|
36
|
-
error: `Ch\u1EC9 \u0111\u01B0\u1EE3c ch\u1ECDn t\u1ED1i \u0111a ${maxFiles} file`
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
const oversizedFiles = files.filter((file) => file.size > maxSize);
|
|
40
|
-
if (oversizedFiles.length > 0) {
|
|
41
|
-
return {
|
|
42
|
-
valid: [],
|
|
43
|
-
error: `File v\u01B0\u1EE3t qu\xE1 dung l\u01B0\u1EE3ng cho ph\xE9p (${Math.round(maxSize / 1024 / 1024)}MB)`
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
return { valid: files };
|
|
47
|
-
};
|
|
48
|
-
const handleDrop = (e) => {
|
|
49
|
-
e.preventDefault();
|
|
50
|
-
e.stopPropagation();
|
|
51
|
-
setDragActive(false);
|
|
52
|
-
if (disabled) return;
|
|
53
|
-
const droppedFiles = Array.from(e.dataTransfer.files);
|
|
54
|
-
const { valid, error: error2 } = validateFiles(droppedFiles);
|
|
55
|
-
if (error2) {
|
|
56
|
-
setError(error2);
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
onChange?.([...value, ...valid]);
|
|
60
|
-
};
|
|
61
|
-
const handleChange = (e) => {
|
|
62
|
-
if (disabled) return;
|
|
63
|
-
const selectedFiles = Array.from(e.target.files || []);
|
|
64
|
-
const { valid, error: error2 } = validateFiles(selectedFiles);
|
|
65
|
-
if (error2) {
|
|
66
|
-
setError(error2);
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
onChange?.([...value, ...valid]);
|
|
70
|
-
if (inputRef.current) {
|
|
71
|
-
inputRef.current.value = "";
|
|
72
|
-
}
|
|
73
|
-
};
|
|
74
|
-
const handleRemove = (index) => {
|
|
75
|
-
onChange?.(value.filter((_, i) => i !== index));
|
|
76
|
-
};
|
|
77
|
-
const getFileIcon = (file) => {
|
|
78
|
-
if (file.type.startsWith("image/")) return FileImage;
|
|
79
|
-
if (file.type.startsWith("video/")) return FileVideo;
|
|
80
|
-
if (file.type.startsWith("text/")) return FileText;
|
|
81
|
-
return File;
|
|
82
|
-
};
|
|
83
|
-
const formatFileSize = (bytes) => {
|
|
84
|
-
if (bytes === 0) return "0 Bytes";
|
|
85
|
-
const k = 1024;
|
|
86
|
-
const sizes = ["Bytes", "KB", "MB", "GB"];
|
|
87
|
-
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
88
|
-
return Math.round(bytes / Math.pow(k, i) * 100) / 100 + " " + sizes[i];
|
|
89
|
-
};
|
|
90
|
-
return /* @__PURE__ */ jsxs("div", { className: cn("w-full", className), children: [
|
|
91
|
-
/* @__PURE__ */ jsx(
|
|
92
|
-
"input",
|
|
93
|
-
{
|
|
94
|
-
ref: inputRef,
|
|
95
|
-
type: "file",
|
|
96
|
-
accept,
|
|
97
|
-
multiple,
|
|
98
|
-
onChange: handleChange,
|
|
99
|
-
disabled,
|
|
100
|
-
className: "hidden"
|
|
101
|
-
}
|
|
102
|
-
),
|
|
103
|
-
/* @__PURE__ */ jsxs(
|
|
104
|
-
"div",
|
|
105
|
-
{
|
|
106
|
-
onDragEnter: handleDrag,
|
|
107
|
-
onDragLeave: handleDrag,
|
|
108
|
-
onDragOver: handleDrag,
|
|
109
|
-
onDrop: handleDrop,
|
|
110
|
-
onClick: () => !disabled && inputRef.current?.click(),
|
|
111
|
-
className: cn(
|
|
112
|
-
"relative border-2 border-dashed rounded-lg p-8 text-center cursor-pointer transition-colors",
|
|
113
|
-
dragActive ? "border-primary bg-primary/5" : "border-border hover:border-border/80",
|
|
114
|
-
disabled && "opacity-50 cursor-not-allowed",
|
|
115
|
-
error && "border-destructive"
|
|
116
|
-
),
|
|
117
|
-
children: [
|
|
118
|
-
/* @__PURE__ */ jsx(Upload, { className: "mx-auto h-12 w-12 text-muted-foreground mb-4" }),
|
|
119
|
-
/* @__PURE__ */ jsxs("div", { className: "text-sm text-muted-foreground mb-2", children: [
|
|
120
|
-
/* @__PURE__ */ jsx("span", { className: "font-semibold text-primary", children: "Nh\u1EA5p \u0111\u1EC3 ch\u1ECDn file" }),
|
|
121
|
-
" ",
|
|
122
|
-
"ho\u1EB7c k\xE9o th\u1EA3 file v\xE0o \u0111\xE2y"
|
|
123
|
-
] }),
|
|
124
|
-
/* @__PURE__ */ jsxs("div", { className: "text-xs text-muted-foreground", children: [
|
|
125
|
-
accept && /* @__PURE__ */ jsxs("div", { children: [
|
|
126
|
-
"\u0110\u1ECBnh d\u1EA1ng: ",
|
|
127
|
-
accept
|
|
128
|
-
] }),
|
|
129
|
-
/* @__PURE__ */ jsxs("div", { children: [
|
|
130
|
-
"Dung l\u01B0\u1EE3ng t\u1ED1i \u0111a: ",
|
|
131
|
-
Math.round(maxSize / 1024 / 1024),
|
|
132
|
-
"MB"
|
|
133
|
-
] }),
|
|
134
|
-
maxFiles && /* @__PURE__ */ jsxs("div", { children: [
|
|
135
|
-
"S\u1ED1 l\u01B0\u1EE3ng t\u1ED1i \u0111a: ",
|
|
136
|
-
maxFiles,
|
|
137
|
-
" file"
|
|
138
|
-
] })
|
|
139
|
-
] })
|
|
140
|
-
]
|
|
141
|
-
}
|
|
142
|
-
),
|
|
143
|
-
error && /* @__PURE__ */ jsx("div", { className: "mt-2 text-sm text-destructive", children: error }),
|
|
144
|
-
showPreview && value.length > 0 && /* @__PURE__ */ jsx("div", { className: "mt-4 space-y-2", children: value.map((file, index) => {
|
|
145
|
-
const FileIcon = getFileIcon(file);
|
|
146
|
-
const isImage = file.type.startsWith("image/");
|
|
147
|
-
const previewUrl = isImage ? URL.createObjectURL(file) : null;
|
|
148
|
-
return /* @__PURE__ */ jsxs(
|
|
149
|
-
"div",
|
|
150
|
-
{
|
|
151
|
-
className: "flex items-center gap-3 p-3 border rounded-lg bg-muted",
|
|
152
|
-
children: [
|
|
153
|
-
previewUrl ? /* @__PURE__ */ jsx(
|
|
154
|
-
"img",
|
|
155
|
-
{
|
|
156
|
-
src: previewUrl,
|
|
157
|
-
alt: file.name,
|
|
158
|
-
className: "w-10 h-10 rounded object-cover"
|
|
159
|
-
}
|
|
160
|
-
) : /* @__PURE__ */ jsx("div", { className: "w-10 h-10 rounded bg-muted flex items-center justify-center", children: /* @__PURE__ */ jsx(FileIcon, { className: "w-5 h-5 text-muted-foreground" }) }),
|
|
161
|
-
/* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
|
|
162
|
-
/* @__PURE__ */ jsx("div", { className: "text-sm font-medium truncate", children: file.name }),
|
|
163
|
-
/* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground", children: formatFileSize(file.size) })
|
|
164
|
-
] }),
|
|
165
|
-
/* @__PURE__ */ jsx(
|
|
166
|
-
Button,
|
|
167
|
-
{
|
|
168
|
-
type: "button",
|
|
169
|
-
variant: "ghost",
|
|
170
|
-
size: "sm",
|
|
171
|
-
onClick: () => handleRemove(index),
|
|
172
|
-
disabled,
|
|
173
|
-
className: "flex-shrink-0",
|
|
174
|
-
children: /* @__PURE__ */ jsx(X, { className: "h-4 w-4" })
|
|
175
|
-
}
|
|
176
|
-
)
|
|
177
|
-
]
|
|
178
|
-
},
|
|
179
|
-
`${file.name}-${index}`
|
|
180
|
-
);
|
|
181
|
-
}) })
|
|
182
|
-
] });
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
export { FileUpload };
|
|
186
|
-
//# sourceMappingURL=chunk-G7HTZBUR.js.map
|
|
187
|
-
//# sourceMappingURL=chunk-G7HTZBUR.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/file-upload.tsx"],"names":["error"],"mappings":"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","file":"chunk-G7HTZBUR.js","sourcesContent":["import * as React from \"react\";\nimport { Upload, X, File, FileImage, FileText, FileVideo } from \"lucide-react\";\nimport { cn } from \"../lib/utils\";\nimport { Button } from \"./button\";\n\ninterface FileUploadProps {\n /** Array of currently uploaded File objects. */\n value?: File[];\n /** Callback fired when files are added or removed. */\n onChange?: (files: File[]) => void;\n /** Accepted file types (e.g., `\"image/*,.pdf\"`). Maps to the HTML `accept` attribute. */\n accept?: string;\n /** Whether multiple files can be selected at once. Defaults to `false`. */\n multiple?: boolean;\n /** Maximum file size in bytes. Defaults to 10 MB. */\n maxSize?: number;\n /** Maximum number of files allowed. */\n maxFiles?: number;\n /** Whether the upload area is disabled. */\n disabled?: boolean;\n /** Additional CSS class for the outer wrapper. */\n className?: string;\n /** Whether to show the file list with previews below the drop zone. Defaults to `true`. */\n showPreview?: boolean;\n}\n\n/**\n * File upload component with drag-and-drop support and file previews.\n * Validates file size and count, shows image thumbnails, and provides remove buttons.\n *\n * @example\n * ```tsx\n * const [files, setFiles] = useState<File[]>([]);\n *\n * <FileUpload\n * value={files}\n * onChange={setFiles}\n * accept=\"image/*,.pdf\"\n * multiple\n * maxSize={5 * 1024 * 1024}\n * maxFiles={3}\n * />\n * ```\n */\nexport function FileUpload({\n value = [],\n onChange,\n accept,\n multiple = false,\n maxSize = 10 * 1024 * 1024, // 10MB default\n maxFiles,\n disabled,\n className,\n showPreview = true,\n}: FileUploadProps) {\n const inputRef = React.useRef<HTMLInputElement>(null);\n const [dragActive, setDragActive] = React.useState(false);\n const [error, setError] = React.useState<string>(\"\");\n\n const handleDrag = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (e.type === \"dragenter\" || e.type === \"dragover\") {\n setDragActive(true);\n } else if (e.type === \"dragleave\") {\n setDragActive(false);\n }\n };\n\n const validateFiles = (files: File[]): { valid: File[]; error?: string } => {\n setError(\"\");\n\n // Check max files\n if (maxFiles && value.length + files.length > maxFiles) {\n return {\n valid: [],\n error: `Chỉ được chọn tối đa ${maxFiles} file`,\n };\n }\n\n // Check file size\n const oversizedFiles = files.filter((file) => file.size > maxSize);\n if (oversizedFiles.length > 0) {\n return {\n valid: [],\n error: `File vượt quá dung lượng cho phép (${Math.round(maxSize / 1024 / 1024)}MB)`,\n };\n }\n\n return { valid: files };\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragActive(false);\n\n if (disabled) return;\n\n const droppedFiles = Array.from(e.dataTransfer.files);\n const { valid, error } = validateFiles(droppedFiles);\n\n if (error) {\n setError(error);\n return;\n }\n\n onChange?.([...value, ...valid]);\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (disabled) return;\n\n const selectedFiles = Array.from(e.target.files || []);\n const { valid, error } = validateFiles(selectedFiles);\n\n if (error) {\n setError(error);\n return;\n }\n\n onChange?.([...value, ...valid]);\n\n // Reset input\n if (inputRef.current) {\n inputRef.current.value = \"\";\n }\n };\n\n const handleRemove = (index: number) => {\n onChange?.(value.filter((_, i) => i !== index));\n };\n\n const getFileIcon = (file: File) => {\n if (file.type.startsWith(\"image/\")) return FileImage;\n if (file.type.startsWith(\"video/\")) return FileVideo;\n if (file.type.startsWith(\"text/\")) return FileText;\n return File;\n };\n\n const formatFileSize = (bytes: number) => {\n if (bytes === 0) return \"0 Bytes\";\n const k = 1024;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return Math.round(bytes / Math.pow(k, i) * 100) / 100 + \" \" + sizes[i];\n };\n\n return (\n <div className={cn(\"w-full\", className)}>\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n onChange={handleChange}\n disabled={disabled}\n className=\"hidden\"\n />\n\n {/* Upload Area */}\n <div\n onDragEnter={handleDrag}\n onDragLeave={handleDrag}\n onDragOver={handleDrag}\n onDrop={handleDrop}\n onClick={() => !disabled && inputRef.current?.click()}\n className={cn(\n \"relative border-2 border-dashed rounded-lg p-8 text-center cursor-pointer transition-colors\",\n dragActive\n ? \"border-primary bg-primary/5\"\n : \"border-border hover:border-border/80\",\n disabled && \"opacity-50 cursor-not-allowed\",\n error && \"border-destructive\"\n )}\n >\n <Upload className=\"mx-auto h-12 w-12 text-muted-foreground mb-4\" />\n <div className=\"text-sm text-muted-foreground mb-2\">\n <span className=\"font-semibold text-primary\">Nhấp để chọn file</span>\n {\" \"}hoặc kéo thả file vào đây\n </div>\n <div className=\"text-xs text-muted-foreground\">\n {accept && <div>Định dạng: {accept}</div>}\n <div>Dung lượng tối đa: {Math.round(maxSize / 1024 / 1024)}MB</div>\n {maxFiles && <div>Số lượng tối đa: {maxFiles} file</div>}\n </div>\n </div>\n\n {/* Error Message */}\n {error && (\n <div className=\"mt-2 text-sm text-destructive\">{error}</div>\n )}\n\n {/* File List */}\n {showPreview && value.length > 0 && (\n <div className=\"mt-4 space-y-2\">\n {value.map((file, index) => {\n const FileIcon = getFileIcon(file);\n const isImage = file.type.startsWith(\"image/\");\n const previewUrl = isImage ? URL.createObjectURL(file) : null;\n\n return (\n <div\n key={`${file.name}-${index}`}\n className=\"flex items-center gap-3 p-3 border rounded-lg bg-muted\"\n >\n {previewUrl ? (\n <img\n src={previewUrl}\n alt={file.name}\n className=\"w-10 h-10 rounded object-cover\"\n />\n ) : (\n <div className=\"w-10 h-10 rounded bg-muted flex items-center justify-center\">\n <FileIcon className=\"w-5 h-5 text-muted-foreground\" />\n </div>\n )}\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm font-medium truncate\">{file.name}</div>\n <div className=\"text-xs text-muted-foreground\">\n {formatFileSize(file.size)}\n </div>\n </div>\n\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => handleRemove(index)}\n disabled={disabled}\n className=\"flex-shrink-0\"\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n"]}
|
package/dist/chunk-HWTW64R5.js
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import { Popover, PopoverTrigger, PopoverContent } from './chunk-C34KSTWA.js';
|
|
2
|
-
import { Calendar as Calendar$1 } from './chunk-QB3UWRZH.js';
|
|
3
|
-
import { Button } from './chunk-55E7D2HR.js';
|
|
4
|
-
import { cn } from './chunk-DGPY4WP3.js';
|
|
5
|
-
import { format } from 'date-fns';
|
|
6
|
-
import { Calendar } from 'lucide-react';
|
|
7
|
-
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
8
|
-
|
|
9
|
-
function DatePicker({
|
|
10
|
-
value,
|
|
11
|
-
onChange,
|
|
12
|
-
placeholder = "Select date",
|
|
13
|
-
className,
|
|
14
|
-
disabled,
|
|
15
|
-
locale
|
|
16
|
-
}) {
|
|
17
|
-
return /* @__PURE__ */ jsxs(Popover, { children: [
|
|
18
|
-
/* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
|
|
19
|
-
Button,
|
|
20
|
-
{
|
|
21
|
-
variant: "outline",
|
|
22
|
-
disabled,
|
|
23
|
-
className: cn(
|
|
24
|
-
"w-full justify-start text-left font-normal",
|
|
25
|
-
!value && "text-muted-foreground",
|
|
26
|
-
className
|
|
27
|
-
),
|
|
28
|
-
children: [
|
|
29
|
-
/* @__PURE__ */ jsx(Calendar, { className: "mr-2 h-4 w-4" }),
|
|
30
|
-
value ? format(value, "PPP", locale ? { locale } : void 0) : /* @__PURE__ */ jsx("span", { children: placeholder })
|
|
31
|
-
]
|
|
32
|
-
}
|
|
33
|
-
) }),
|
|
34
|
-
/* @__PURE__ */ jsx(PopoverContent, { className: "w-auto p-0", align: "start", children: /* @__PURE__ */ jsx(
|
|
35
|
-
Calendar$1,
|
|
36
|
-
{
|
|
37
|
-
mode: "single",
|
|
38
|
-
selected: value,
|
|
39
|
-
onSelect: onChange,
|
|
40
|
-
autoFocus: true
|
|
41
|
-
}
|
|
42
|
-
) })
|
|
43
|
-
] });
|
|
44
|
-
}
|
|
45
|
-
function DateRangePicker({
|
|
46
|
-
value,
|
|
47
|
-
onChange,
|
|
48
|
-
placeholder = "Select date range",
|
|
49
|
-
className,
|
|
50
|
-
disabled,
|
|
51
|
-
locale
|
|
52
|
-
}) {
|
|
53
|
-
return /* @__PURE__ */ jsxs(Popover, { children: [
|
|
54
|
-
/* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
|
|
55
|
-
Button,
|
|
56
|
-
{
|
|
57
|
-
variant: "outline",
|
|
58
|
-
disabled,
|
|
59
|
-
className: cn(
|
|
60
|
-
"w-full justify-start text-left font-normal",
|
|
61
|
-
!value && "text-muted-foreground",
|
|
62
|
-
className
|
|
63
|
-
),
|
|
64
|
-
children: [
|
|
65
|
-
/* @__PURE__ */ jsx(Calendar, { className: "mr-2 h-4 w-4" }),
|
|
66
|
-
value?.from ? value.to ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
67
|
-
format(value.from, "PPP", locale ? { locale } : void 0),
|
|
68
|
-
" -",
|
|
69
|
-
" ",
|
|
70
|
-
format(value.to, "PPP", locale ? { locale } : void 0)
|
|
71
|
-
] }) : format(value.from, "PPP", locale ? { locale } : void 0) : /* @__PURE__ */ jsx("span", { children: placeholder })
|
|
72
|
-
]
|
|
73
|
-
}
|
|
74
|
-
) }),
|
|
75
|
-
/* @__PURE__ */ jsx(PopoverContent, { className: "w-auto p-0", align: "start", children: /* @__PURE__ */ jsx(
|
|
76
|
-
Calendar$1,
|
|
77
|
-
{
|
|
78
|
-
mode: "range",
|
|
79
|
-
selected: value,
|
|
80
|
-
onSelect: onChange,
|
|
81
|
-
numberOfMonths: 2,
|
|
82
|
-
autoFocus: true
|
|
83
|
-
}
|
|
84
|
-
) })
|
|
85
|
-
] });
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
export { DatePicker, DateRangePicker };
|
|
89
|
-
//# sourceMappingURL=chunk-HWTW64R5.js.map
|
|
90
|
-
//# sourceMappingURL=chunk-HWTW64R5.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/date-picker.tsx"],"names":["CalendarIcon","Calendar"],"mappings":"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","file":"chunk-HWTW64R5.js","sourcesContent":["import { format } from \"date-fns\";\nimport { Calendar as CalendarIcon } from \"lucide-react\";\nimport type { Locale } from \"date-fns\";\n\nimport { cn } from \"../lib/utils\";\nimport { Button } from \"./button\";\nimport { Calendar } from \"./calendar\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover\";\n\ninterface DatePickerProps {\n /** Currently selected date. */\n value?: Date;\n /** Callback fired when a date is selected or cleared. */\n onChange?: (date: Date | undefined) => void;\n /** Placeholder text shown when no date is selected. */\n placeholder?: string;\n /** Additional CSS class for the trigger button. */\n className?: string;\n /** Whether the date picker is disabled. */\n disabled?: boolean;\n /** date-fns Locale object for date formatting (e.g., `ja` for Japanese). */\n locale?: Locale;\n}\n\n/**\n * Single date picker with a calendar popover.\n * Displays the selected date formatted with date-fns and opens a calendar on click.\n *\n * @example\n * ```tsx\n * const [date, setDate] = useState<Date>();\n *\n * <DatePicker\n * value={date}\n * onChange={setDate}\n * placeholder=\"Pick a date\"\n * />\n * ```\n */\nexport function DatePicker({\n value,\n onChange,\n placeholder = \"Select date\",\n className,\n disabled,\n locale,\n}: DatePickerProps) {\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n disabled={disabled}\n className={cn(\n \"w-full justify-start text-left font-normal\",\n !value && \"text-muted-foreground\",\n className\n )}\n >\n <CalendarIcon className=\"mr-2 h-4 w-4\" />\n {value ? format(value, \"PPP\", locale ? { locale } : undefined) : <span>{placeholder}</span>}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <Calendar\n mode=\"single\"\n selected={value}\n onSelect={onChange}\n autoFocus\n />\n </PopoverContent>\n </Popover>\n );\n}\n\ninterface DateRangePickerProps {\n /** Currently selected date range with `from` and optional `to`. */\n value?: { from: Date | undefined; to?: Date | undefined };\n /** Callback fired when the date range changes. */\n onChange?: (range: { from: Date | undefined; to?: Date | undefined } | undefined) => void;\n /** Placeholder text shown when no range is selected. */\n placeholder?: string;\n /** Additional CSS class for the trigger button. */\n className?: string;\n /** Whether the date range picker is disabled. */\n disabled?: boolean;\n /** date-fns Locale object for date formatting (e.g., `ja` for Japanese). */\n locale?: Locale;\n}\n\n/**\n * Date range picker with a two-month calendar popover.\n * Allows selecting a start and end date displayed as a range string.\n *\n * @example\n * ```tsx\n * const [range, setRange] = useState<{ from: Date | undefined; to?: Date }>();\n *\n * <DateRangePicker\n * value={range}\n * onChange={setRange}\n * placeholder=\"Select date range\"\n * />\n * ```\n */\nexport function DateRangePicker({\n value,\n onChange,\n placeholder = \"Select date range\",\n className,\n disabled,\n locale,\n}: DateRangePickerProps) {\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n disabled={disabled}\n className={cn(\n \"w-full justify-start text-left font-normal\",\n !value && \"text-muted-foreground\",\n className\n )}\n >\n <CalendarIcon className=\"mr-2 h-4 w-4\" />\n {value?.from ? (\n value.to ? (\n <>\n {format(value.from, \"PPP\", locale ? { locale } : undefined)} -{\" \"}\n {format(value.to, \"PPP\", locale ? { locale } : undefined)}\n </>\n ) : (\n format(value.from, \"PPP\", locale ? { locale } : undefined)\n )\n ) : (\n <span>{placeholder}</span>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <Calendar\n mode=\"range\"\n selected={value}\n onSelect={onChange}\n numberOfMonths={2}\n autoFocus\n />\n </PopoverContent>\n </Popover>\n );\n}\n"]}
|
package/dist/chunk-IAWKX5W4.js
DELETED
|
@@ -1,219 +0,0 @@
|
|
|
1
|
-
import { cn } from './chunk-DGPY4WP3.js';
|
|
2
|
-
import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
|
|
3
|
-
import { CheckIcon, CircleIcon, ChevronRightIcon } from 'lucide-react';
|
|
4
|
-
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
5
|
-
|
|
6
|
-
function DropdownMenu({
|
|
7
|
-
...props
|
|
8
|
-
}) {
|
|
9
|
-
return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Root, { "data-slot": "dropdown-menu", ...props });
|
|
10
|
-
}
|
|
11
|
-
function DropdownMenuPortal({
|
|
12
|
-
...props
|
|
13
|
-
}) {
|
|
14
|
-
return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, { "data-slot": "dropdown-menu-portal", ...props });
|
|
15
|
-
}
|
|
16
|
-
function DropdownMenuTrigger({
|
|
17
|
-
...props
|
|
18
|
-
}) {
|
|
19
|
-
return /* @__PURE__ */ jsx(
|
|
20
|
-
DropdownMenuPrimitive.Trigger,
|
|
21
|
-
{
|
|
22
|
-
"data-slot": "dropdown-menu-trigger",
|
|
23
|
-
...props
|
|
24
|
-
}
|
|
25
|
-
);
|
|
26
|
-
}
|
|
27
|
-
function DropdownMenuContent({
|
|
28
|
-
className,
|
|
29
|
-
sideOffset = 4,
|
|
30
|
-
...props
|
|
31
|
-
}) {
|
|
32
|
-
return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx(
|
|
33
|
-
DropdownMenuPrimitive.Content,
|
|
34
|
-
{
|
|
35
|
-
"data-slot": "dropdown-menu-content",
|
|
36
|
-
sideOffset,
|
|
37
|
-
className: cn(
|
|
38
|
-
"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 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 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md",
|
|
39
|
-
className
|
|
40
|
-
),
|
|
41
|
-
...props
|
|
42
|
-
}
|
|
43
|
-
) });
|
|
44
|
-
}
|
|
45
|
-
function DropdownMenuGroup({
|
|
46
|
-
...props
|
|
47
|
-
}) {
|
|
48
|
-
return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Group, { "data-slot": "dropdown-menu-group", ...props });
|
|
49
|
-
}
|
|
50
|
-
function DropdownMenuItem({
|
|
51
|
-
className,
|
|
52
|
-
inset,
|
|
53
|
-
variant = "default",
|
|
54
|
-
...props
|
|
55
|
-
}) {
|
|
56
|
-
return /* @__PURE__ */ jsx(
|
|
57
|
-
DropdownMenuPrimitive.Item,
|
|
58
|
-
{
|
|
59
|
-
"data-slot": "dropdown-menu-item",
|
|
60
|
-
"data-inset": inset,
|
|
61
|
-
"data-variant": variant,
|
|
62
|
-
className: cn(
|
|
63
|
-
"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-[var(--density-menu-item-py)] text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
64
|
-
className
|
|
65
|
-
),
|
|
66
|
-
...props
|
|
67
|
-
}
|
|
68
|
-
);
|
|
69
|
-
}
|
|
70
|
-
function DropdownMenuCheckboxItem({
|
|
71
|
-
className,
|
|
72
|
-
children,
|
|
73
|
-
checked,
|
|
74
|
-
...props
|
|
75
|
-
}) {
|
|
76
|
-
return /* @__PURE__ */ jsxs(
|
|
77
|
-
DropdownMenuPrimitive.CheckboxItem,
|
|
78
|
-
{
|
|
79
|
-
"data-slot": "dropdown-menu-checkbox-item",
|
|
80
|
-
className: cn(
|
|
81
|
-
"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
82
|
-
className
|
|
83
|
-
),
|
|
84
|
-
checked,
|
|
85
|
-
...props,
|
|
86
|
-
children: [
|
|
87
|
-
/* @__PURE__ */ jsx("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(CheckIcon, { className: "size-4" }) }) }),
|
|
88
|
-
children
|
|
89
|
-
]
|
|
90
|
-
}
|
|
91
|
-
);
|
|
92
|
-
}
|
|
93
|
-
function DropdownMenuRadioGroup({
|
|
94
|
-
...props
|
|
95
|
-
}) {
|
|
96
|
-
return /* @__PURE__ */ jsx(
|
|
97
|
-
DropdownMenuPrimitive.RadioGroup,
|
|
98
|
-
{
|
|
99
|
-
"data-slot": "dropdown-menu-radio-group",
|
|
100
|
-
...props
|
|
101
|
-
}
|
|
102
|
-
);
|
|
103
|
-
}
|
|
104
|
-
function DropdownMenuRadioItem({
|
|
105
|
-
className,
|
|
106
|
-
children,
|
|
107
|
-
...props
|
|
108
|
-
}) {
|
|
109
|
-
return /* @__PURE__ */ jsxs(
|
|
110
|
-
DropdownMenuPrimitive.RadioItem,
|
|
111
|
-
{
|
|
112
|
-
"data-slot": "dropdown-menu-radio-item",
|
|
113
|
-
className: cn(
|
|
114
|
-
"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
115
|
-
className
|
|
116
|
-
),
|
|
117
|
-
...props,
|
|
118
|
-
children: [
|
|
119
|
-
/* @__PURE__ */ jsx("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(CircleIcon, { className: "size-2 fill-current" }) }) }),
|
|
120
|
-
children
|
|
121
|
-
]
|
|
122
|
-
}
|
|
123
|
-
);
|
|
124
|
-
}
|
|
125
|
-
function DropdownMenuLabel({
|
|
126
|
-
className,
|
|
127
|
-
inset,
|
|
128
|
-
...props
|
|
129
|
-
}) {
|
|
130
|
-
return /* @__PURE__ */ jsx(
|
|
131
|
-
DropdownMenuPrimitive.Label,
|
|
132
|
-
{
|
|
133
|
-
"data-slot": "dropdown-menu-label",
|
|
134
|
-
"data-inset": inset,
|
|
135
|
-
className: cn(
|
|
136
|
-
"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8",
|
|
137
|
-
className
|
|
138
|
-
),
|
|
139
|
-
...props
|
|
140
|
-
}
|
|
141
|
-
);
|
|
142
|
-
}
|
|
143
|
-
function DropdownMenuSeparator({
|
|
144
|
-
className,
|
|
145
|
-
...props
|
|
146
|
-
}) {
|
|
147
|
-
return /* @__PURE__ */ jsx(
|
|
148
|
-
DropdownMenuPrimitive.Separator,
|
|
149
|
-
{
|
|
150
|
-
"data-slot": "dropdown-menu-separator",
|
|
151
|
-
className: cn("bg-border -mx-1 my-1 h-px", className),
|
|
152
|
-
...props
|
|
153
|
-
}
|
|
154
|
-
);
|
|
155
|
-
}
|
|
156
|
-
function DropdownMenuShortcut({
|
|
157
|
-
className,
|
|
158
|
-
...props
|
|
159
|
-
}) {
|
|
160
|
-
return /* @__PURE__ */ jsx(
|
|
161
|
-
"span",
|
|
162
|
-
{
|
|
163
|
-
"data-slot": "dropdown-menu-shortcut",
|
|
164
|
-
className: cn(
|
|
165
|
-
"text-muted-foreground ml-auto text-xs tracking-widest",
|
|
166
|
-
className
|
|
167
|
-
),
|
|
168
|
-
...props
|
|
169
|
-
}
|
|
170
|
-
);
|
|
171
|
-
}
|
|
172
|
-
function DropdownMenuSub({
|
|
173
|
-
...props
|
|
174
|
-
}) {
|
|
175
|
-
return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Sub, { "data-slot": "dropdown-menu-sub", ...props });
|
|
176
|
-
}
|
|
177
|
-
function DropdownMenuSubTrigger({
|
|
178
|
-
className,
|
|
179
|
-
inset,
|
|
180
|
-
children,
|
|
181
|
-
...props
|
|
182
|
-
}) {
|
|
183
|
-
return /* @__PURE__ */ jsxs(
|
|
184
|
-
DropdownMenuPrimitive.SubTrigger,
|
|
185
|
-
{
|
|
186
|
-
"data-slot": "dropdown-menu-sub-trigger",
|
|
187
|
-
"data-inset": inset,
|
|
188
|
-
className: cn(
|
|
189
|
-
"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8",
|
|
190
|
-
className
|
|
191
|
-
),
|
|
192
|
-
...props,
|
|
193
|
-
children: [
|
|
194
|
-
children,
|
|
195
|
-
/* @__PURE__ */ jsx(ChevronRightIcon, { className: "ml-auto size-4" })
|
|
196
|
-
]
|
|
197
|
-
}
|
|
198
|
-
);
|
|
199
|
-
}
|
|
200
|
-
function DropdownMenuSubContent({
|
|
201
|
-
className,
|
|
202
|
-
...props
|
|
203
|
-
}) {
|
|
204
|
-
return /* @__PURE__ */ jsx(
|
|
205
|
-
DropdownMenuPrimitive.SubContent,
|
|
206
|
-
{
|
|
207
|
-
"data-slot": "dropdown-menu-sub-content",
|
|
208
|
-
className: cn(
|
|
209
|
-
"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 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 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg",
|
|
210
|
-
className
|
|
211
|
-
),
|
|
212
|
-
...props
|
|
213
|
-
}
|
|
214
|
-
);
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
export { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger };
|
|
218
|
-
//# sourceMappingURL=chunk-IAWKX5W4.js.map
|
|
219
|
-
//# sourceMappingURL=chunk-IAWKX5W4.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/dropdown-menu.tsx"],"names":[],"mappings":"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","file":"chunk-IAWKX5W4.js","sourcesContent":["import * as React from \"react\";\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\";\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from \"lucide-react\";\n\nimport { cn } from \"../lib/utils\";\n\n/**\n * Dropdown menu component built on Radix UI DropdownMenu.\n *\n * Displays a menu of actions or options triggered by a button click.\n * Supports items, checkbox items, radio items, sub-menus, separators,\n * labels, shortcuts, and destructive variants.\n *\n * @example\n * ```tsx\n * <DropdownMenu>\n * <DropdownMenuTrigger asChild>\n * <Button variant=\"outline\">Actions</Button>\n * </DropdownMenuTrigger>\n * <DropdownMenuContent>\n * <DropdownMenuLabel>My Account</DropdownMenuLabel>\n * <DropdownMenuSeparator />\n * <DropdownMenuItem>\n * <UserIcon className=\"size-4\" />\n * Profile\n * <DropdownMenuShortcut>Ctrl+P</DropdownMenuShortcut>\n * </DropdownMenuItem>\n * <DropdownMenuItem>\n * <SettingsIcon className=\"size-4\" />\n * Settings\n * </DropdownMenuItem>\n * <DropdownMenuSeparator />\n * <DropdownMenuItem variant=\"destructive\">\n * <TrashIcon className=\"size-4\" />\n * Delete\n * </DropdownMenuItem>\n * </DropdownMenuContent>\n * </DropdownMenu>\n * ```\n */\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />;\n}\n\n/** Portal that renders dropdown content outside the DOM hierarchy. */\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n );\n}\n\n/** Element that opens the dropdown menu when clicked. Use `asChild` to merge into your own button. */\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n {...props}\n />\n );\n}\n\n/** Floating container for menu items, positioned relative to the trigger. */\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 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 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md\",\n className,\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n );\n}\n\n/** Groups related menu items together for accessibility. */\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n );\n}\n\n/** Actionable menu item. Set `variant=\"destructive\"` for dangerous actions, `inset` for left-padding alignment. */\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean;\n variant?: \"default\" | \"destructive\";\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-[var(--density-menu-item-py)] text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Menu item with a checkbox indicator for toggling options. */\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n );\n}\n\n/** Container for radio menu items where only one can be selected at a time. */\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n );\n}\n\n/** Menu item with a radio indicator for single-selection groups. */\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CircleIcon className=\"size-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n );\n}\n\n/** Non-interactive label used to title a group of menu items. */\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean;\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Visual divider between groups of menu items. */\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"bg-border -mx-1 my-1 h-px\", className)}\n {...props}\n />\n );\n}\n\n/** Keyboard shortcut hint displayed at the end of a menu item. */\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n \"text-muted-foreground ml-auto text-xs tracking-widest\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Container for a nested sub-menu within the dropdown. */\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />;\n}\n\n/** Menu item that opens a sub-menu on hover. Displays a chevron indicator. */\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto size-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n );\n}\n\n/** Floating container for sub-menu items. */\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 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 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n};"]}
|