@neynar/ui 0.1.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/LICENSE +21 -0
- package/README.md +195 -0
- package/dist/components/ui/accordion.d.ts +229 -0
- package/dist/components/ui/accordion.d.ts.map +1 -0
- package/dist/components/ui/alert-dialog.d.ts +247 -0
- package/dist/components/ui/alert-dialog.d.ts.map +1 -0
- package/dist/components/ui/alert.d.ts +187 -0
- package/dist/components/ui/alert.d.ts.map +1 -0
- package/dist/components/ui/aspect-ratio.d.ts +94 -0
- package/dist/components/ui/aspect-ratio.d.ts.map +1 -0
- package/dist/components/ui/avatar.d.ts +244 -0
- package/dist/components/ui/avatar.d.ts.map +1 -0
- package/dist/components/ui/badge.d.ts +163 -0
- package/dist/components/ui/badge.d.ts.map +1 -0
- package/dist/components/ui/breadcrumb.d.ts +281 -0
- package/dist/components/ui/breadcrumb.d.ts.map +1 -0
- package/dist/components/ui/button.d.ts +129 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/calendar.d.ts +169 -0
- package/dist/components/ui/calendar.d.ts.map +1 -0
- package/dist/components/ui/card.d.ts +365 -0
- package/dist/components/ui/card.d.ts.map +1 -0
- package/dist/components/ui/carousel.d.ts +369 -0
- package/dist/components/ui/carousel.d.ts.map +1 -0
- package/dist/components/ui/chart.d.ts +442 -0
- package/dist/components/ui/chart.d.ts.map +1 -0
- package/dist/components/ui/checkbox.d.ts +88 -0
- package/dist/components/ui/checkbox.d.ts.map +1 -0
- package/dist/components/ui/collapsible.d.ts +182 -0
- package/dist/components/ui/collapsible.d.ts.map +1 -0
- package/dist/components/ui/combobox.d.ts +270 -0
- package/dist/components/ui/combobox.d.ts.map +1 -0
- package/dist/components/ui/command.d.ts +355 -0
- package/dist/components/ui/command.d.ts.map +1 -0
- package/dist/components/ui/container.d.ts +102 -0
- package/dist/components/ui/container.d.ts.map +1 -0
- package/dist/components/ui/context-menu.d.ts +339 -0
- package/dist/components/ui/context-menu.d.ts.map +1 -0
- package/dist/components/ui/date-picker.d.ts +145 -0
- package/dist/components/ui/date-picker.d.ts.map +1 -0
- package/dist/components/ui/dialog.d.ts +322 -0
- package/dist/components/ui/dialog.d.ts.map +1 -0
- package/dist/components/ui/drawer.d.ts +154 -0
- package/dist/components/ui/drawer.d.ts.map +1 -0
- package/dist/components/ui/dropdown-menu.d.ts +349 -0
- package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
- package/dist/components/ui/empty-state.d.ts +133 -0
- package/dist/components/ui/empty-state.d.ts.map +1 -0
- package/dist/components/ui/hover-card.d.ts +109 -0
- package/dist/components/ui/hover-card.d.ts.map +1 -0
- package/dist/components/ui/input.d.ts +89 -0
- package/dist/components/ui/input.d.ts.map +1 -0
- package/dist/components/ui/label.d.ts +93 -0
- package/dist/components/ui/label.d.ts.map +1 -0
- package/dist/components/ui/menubar.d.ts +306 -0
- package/dist/components/ui/menubar.d.ts.map +1 -0
- package/dist/components/ui/navigation-menu.d.ts +318 -0
- package/dist/components/ui/navigation-menu.d.ts.map +1 -0
- package/dist/components/ui/pagination.d.ts +343 -0
- package/dist/components/ui/pagination.d.ts.map +1 -0
- package/dist/components/ui/popover.d.ts +178 -0
- package/dist/components/ui/popover.d.ts.map +1 -0
- package/dist/components/ui/progress.d.ts +64 -0
- package/dist/components/ui/progress.d.ts.map +1 -0
- package/dist/components/ui/radio-group.d.ts +144 -0
- package/dist/components/ui/radio-group.d.ts.map +1 -0
- package/dist/components/ui/resizable.d.ts +164 -0
- package/dist/components/ui/resizable.d.ts.map +1 -0
- package/dist/components/ui/scroll-area.d.ts +82 -0
- package/dist/components/ui/scroll-area.d.ts.map +1 -0
- package/dist/components/ui/select.d.ts +316 -0
- package/dist/components/ui/select.d.ts.map +1 -0
- package/dist/components/ui/separator.d.ts +80 -0
- package/dist/components/ui/separator.d.ts.map +1 -0
- package/dist/components/ui/sheet.d.ts +346 -0
- package/dist/components/ui/sheet.d.ts.map +1 -0
- package/dist/components/ui/sidebar.d.ts +1561 -0
- package/dist/components/ui/sidebar.d.ts.map +1 -0
- package/dist/components/ui/skeleton.d.ts +66 -0
- package/dist/components/ui/skeleton.d.ts.map +1 -0
- package/dist/components/ui/slider.d.ts +95 -0
- package/dist/components/ui/slider.d.ts.map +1 -0
- package/dist/components/ui/sonner.d.ts +101 -0
- package/dist/components/ui/sonner.d.ts.map +1 -0
- package/dist/components/ui/stack.d.ts +192 -0
- package/dist/components/ui/stack.d.ts.map +1 -0
- package/dist/components/ui/stories/accordion.stories.d.ts +71 -0
- package/dist/components/ui/stories/accordion.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/alert-dialog.stories.d.ts +39 -0
- package/dist/components/ui/stories/alert-dialog.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/alert.stories.d.ts +48 -0
- package/dist/components/ui/stories/alert.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/aspect-ratio.stories.d.ts +53 -0
- package/dist/components/ui/stories/aspect-ratio.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/avatar.stories.d.ts +49 -0
- package/dist/components/ui/stories/avatar.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/badge.stories.d.ts +64 -0
- package/dist/components/ui/stories/badge.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/breadcrumb.stories.d.ts +27 -0
- package/dist/components/ui/stories/breadcrumb.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/button.stories.d.ts +92 -0
- package/dist/components/ui/stories/button.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/calendar.stories.d.ts +94 -0
- package/dist/components/ui/stories/calendar.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/card.stories.d.ts +29 -0
- package/dist/components/ui/stories/card.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/carousel.stories.d.ts +42 -0
- package/dist/components/ui/stories/carousel.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/chart.stories.d.ts +51 -0
- package/dist/components/ui/stories/chart.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/checkbox.stories.d.ts +72 -0
- package/dist/components/ui/stories/checkbox.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/cn.stories.d.ts +19 -0
- package/dist/components/ui/stories/cn.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/collapsible.stories.d.ts +51 -0
- package/dist/components/ui/stories/collapsible.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/colors.stories.d.ts +31 -0
- package/dist/components/ui/stories/colors.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/combobox.stories.d.ts +89 -0
- package/dist/components/ui/stories/combobox.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/command.stories.d.ts +69 -0
- package/dist/components/ui/stories/command.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/container.stories.d.ts +42 -0
- package/dist/components/ui/stories/container.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/context-menu.stories.d.ts +32 -0
- package/dist/components/ui/stories/context-menu.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/date-picker.stories.d.ts +67 -0
- package/dist/components/ui/stories/date-picker.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/dialog.stories.d.ts +48 -0
- package/dist/components/ui/stories/dialog.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/drawer.stories.d.ts +33 -0
- package/dist/components/ui/stories/drawer.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/dropdown-menu.stories.d.ts +31 -0
- package/dist/components/ui/stories/dropdown-menu.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/empty-state.stories.d.ts +74 -0
- package/dist/components/ui/stories/empty-state.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/hover-card.stories.d.ts +35 -0
- package/dist/components/ui/stories/hover-card.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/input.stories.d.ts +69 -0
- package/dist/components/ui/stories/input.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/label.stories.d.ts +47 -0
- package/dist/components/ui/stories/label.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/menubar.stories.d.ts +39 -0
- package/dist/components/ui/stories/menubar.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/navigation-menu.stories.d.ts +44 -0
- package/dist/components/ui/stories/navigation-menu.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/pagination.stories.d.ts +33 -0
- package/dist/components/ui/stories/pagination.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/popover.stories.d.ts +36 -0
- package/dist/components/ui/stories/popover.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/progress.stories.d.ts +38 -0
- package/dist/components/ui/stories/progress.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/radio-group.stories.d.ts +76 -0
- package/dist/components/ui/stories/radio-group.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/resizable.stories.d.ts +49 -0
- package/dist/components/ui/stories/resizable.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/scroll-area.stories.d.ts +35 -0
- package/dist/components/ui/stories/scroll-area.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/select.stories.d.ts +51 -0
- package/dist/components/ui/stories/select.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/separator.stories.d.ts +58 -0
- package/dist/components/ui/stories/separator.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/sheet.stories.d.ts +43 -0
- package/dist/components/ui/stories/sheet.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/sidebar.stories.d.ts +60 -0
- package/dist/components/ui/stories/sidebar.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/skeleton.stories.d.ts +42 -0
- package/dist/components/ui/stories/skeleton.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/slider.stories.d.ts +99 -0
- package/dist/components/ui/stories/slider.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/sonner.stories.d.ts +9 -0
- package/dist/components/ui/stories/sonner.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/stack.stories.d.ts +39 -0
- package/dist/components/ui/stories/stack.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/switch.stories.d.ts +71 -0
- package/dist/components/ui/stories/switch.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/table.stories.d.ts +40 -0
- package/dist/components/ui/stories/table.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/tabs.stories.d.ts +62 -0
- package/dist/components/ui/stories/tabs.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/text-field.stories.d.ts +78 -0
- package/dist/components/ui/stories/text-field.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/textarea.stories.d.ts +57 -0
- package/dist/components/ui/stories/textarea.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/theme-toggle.stories.d.ts +71 -0
- package/dist/components/ui/stories/theme-toggle.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/theme.stories.d.ts +51 -0
- package/dist/components/ui/stories/theme.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/toggle-group.stories.d.ts +71 -0
- package/dist/components/ui/stories/toggle-group.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/toggle.stories.d.ts +78 -0
- package/dist/components/ui/stories/toggle.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/tooltip.stories.d.ts +37 -0
- package/dist/components/ui/stories/tooltip.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/typography.stories.d.ts +137 -0
- package/dist/components/ui/stories/typography.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/use-mobile.stories.d.ts +20 -0
- package/dist/components/ui/stories/use-mobile.stories.d.ts.map +1 -0
- package/dist/components/ui/stories/use-theme.stories.d.ts +23 -0
- package/dist/components/ui/stories/use-theme.stories.d.ts.map +1 -0
- package/dist/components/ui/switch.d.ts +84 -0
- package/dist/components/ui/switch.d.ts.map +1 -0
- package/dist/components/ui/table.d.ts +321 -0
- package/dist/components/ui/table.d.ts.map +1 -0
- package/dist/components/ui/tabs.d.ts +260 -0
- package/dist/components/ui/tabs.d.ts.map +1 -0
- package/dist/components/ui/text-field.d.ts +157 -0
- package/dist/components/ui/text-field.d.ts.map +1 -0
- package/dist/components/ui/textarea.d.ts +84 -0
- package/dist/components/ui/textarea.d.ts.map +1 -0
- package/dist/components/ui/theme-toggle.d.ts +105 -0
- package/dist/components/ui/theme-toggle.d.ts.map +1 -0
- package/dist/components/ui/theme.d.ts +110 -0
- package/dist/components/ui/theme.d.ts.map +1 -0
- package/dist/components/ui/toggle-group.d.ts +133 -0
- package/dist/components/ui/toggle-group.d.ts.map +1 -0
- package/dist/components/ui/toggle.d.ts +84 -0
- package/dist/components/ui/toggle.d.ts.map +1 -0
- package/dist/components/ui/tooltip.d.ts +202 -0
- package/dist/components/ui/tooltip.d.ts.map +1 -0
- package/dist/components/ui/typography.d.ts +287 -0
- package/dist/components/ui/typography.d.ts.map +1 -0
- package/dist/hooks/use-mobile.d.ts +74 -0
- package/dist/hooks/use-mobile.d.ts.map +1 -0
- package/dist/hooks/use-theme.d.ts +142 -0
- package/dist/hooks/use-theme.d.ts.map +1 -0
- package/dist/index.d.ts +57 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27498 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/utils.d.ts +43 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/docs/llm/colors.md +273 -0
- package/docs/llm/components/buttons.md +68 -0
- package/docs/llm/components/cards.md +53 -0
- package/docs/llm/components/display.md +134 -0
- package/docs/llm/components/feedback.md +96 -0
- package/docs/llm/components/forms.md +90 -0
- package/docs/llm/components/layout.md +59 -0
- package/docs/llm/components/menus.md +70 -0
- package/docs/llm/components/navigation.md +80 -0
- package/docs/llm/components/overlays.md +83 -0
- package/docs/llm/components/tables.md +73 -0
- package/docs/llm/components/typography.md +199 -0
- package/docs/llm/components/utilities.md +114 -0
- package/docs/llm/guide.md +165 -0
- package/llms.txt +122 -0
- package/package.json +104 -0
- package/src/components/ui/accordion.tsx +285 -0
- package/src/components/ui/alert-dialog.tsx +387 -0
- package/src/components/ui/alert.tsx +243 -0
- package/src/components/ui/aspect-ratio.tsx +99 -0
- package/src/components/ui/avatar.tsx +288 -0
- package/src/components/ui/badge.tsx +205 -0
- package/src/components/ui/breadcrumb.tsx +378 -0
- package/src/components/ui/button.tsx +195 -0
- package/src/components/ui/calendar.tsx +371 -0
- package/src/components/ui/card.tsx +447 -0
- package/src/components/ui/carousel.tsx +624 -0
- package/src/components/ui/chart.tsx +802 -0
- package/src/components/ui/checkbox.tsx +113 -0
- package/src/components/ui/collapsible.tsx +207 -0
- package/src/components/ui/combobox.tsx +373 -0
- package/src/components/ui/command.tsx +518 -0
- package/src/components/ui/container.tsx +114 -0
- package/src/components/ui/context-menu.tsx +563 -0
- package/src/components/ui/date-picker.tsx +213 -0
- package/src/components/ui/dialog.tsx +447 -0
- package/src/components/ui/drawer.tsx +273 -0
- package/src/components/ui/dropdown-menu.tsx +578 -0
- package/src/components/ui/empty-state.tsx +145 -0
- package/src/components/ui/hover-card.tsx +144 -0
- package/src/components/ui/input.tsx +106 -0
- package/src/components/ui/label.tsx +110 -0
- package/src/components/ui/menubar.tsx +553 -0
- package/src/components/ui/navigation-menu.tsx +471 -0
- package/src/components/ui/pagination.tsx +456 -0
- package/src/components/ui/popover.tsx +216 -0
- package/src/components/ui/progress.tsx +88 -0
- package/src/components/ui/radio-group.tsx +183 -0
- package/src/components/ui/resizable.tsx +209 -0
- package/src/components/ui/scroll-area.tsx +132 -0
- package/src/components/ui/select.tsx +485 -0
- package/src/components/ui/separator.tsx +101 -0
- package/src/components/ui/sheet.tsx +495 -0
- package/src/components/ui/sidebar.tsx +2211 -0
- package/src/components/ui/skeleton.tsx +76 -0
- package/src/components/ui/slider.tsx +147 -0
- package/src/components/ui/sonner.tsx +120 -0
- package/src/components/ui/stack.tsx +180 -0
- package/src/components/ui/stories/accordion.stories.tsx +429 -0
- package/src/components/ui/stories/alert-dialog.stories.tsx +519 -0
- package/src/components/ui/stories/alert.stories.tsx +228 -0
- package/src/components/ui/stories/aspect-ratio.stories.tsx +200 -0
- package/src/components/ui/stories/avatar.stories.tsx +317 -0
- package/src/components/ui/stories/badge.stories.tsx +260 -0
- package/src/components/ui/stories/breadcrumb.stories.tsx +482 -0
- package/src/components/ui/stories/button.stories.tsx +266 -0
- package/src/components/ui/stories/calendar.stories.tsx +375 -0
- package/src/components/ui/stories/card.stories.tsx +308 -0
- package/src/components/ui/stories/carousel.stories.tsx +328 -0
- package/src/components/ui/stories/chart.stories.tsx +430 -0
- package/src/components/ui/stories/checkbox.stories.tsx +297 -0
- package/src/components/ui/stories/cn.stories.tsx +433 -0
- package/src/components/ui/stories/collapsible.stories.tsx +256 -0
- package/src/components/ui/stories/colors.stories.tsx +502 -0
- package/src/components/ui/stories/combobox.stories.tsx +301 -0
- package/src/components/ui/stories/command.stories.tsx +632 -0
- package/src/components/ui/stories/container.stories.tsx +250 -0
- package/src/components/ui/stories/context-menu.stories.tsx +446 -0
- package/src/components/ui/stories/date-picker.stories.tsx +378 -0
- package/src/components/ui/stories/dialog.stories.tsx +535 -0
- package/src/components/ui/stories/drawer.stories.tsx +364 -0
- package/src/components/ui/stories/dropdown-menu.stories.tsx +374 -0
- package/src/components/ui/stories/empty-state.stories.tsx +244 -0
- package/src/components/ui/stories/hover-card.stories.tsx +355 -0
- package/src/components/ui/stories/input.stories.tsx +289 -0
- package/src/components/ui/stories/label.stories.tsx +294 -0
- package/src/components/ui/stories/menubar.stories.tsx +764 -0
- package/src/components/ui/stories/navigation-menu.stories.tsx +539 -0
- package/src/components/ui/stories/pagination.stories.tsx +604 -0
- package/src/components/ui/stories/popover.stories.tsx +392 -0
- package/src/components/ui/stories/progress.stories.tsx +218 -0
- package/src/components/ui/stories/radio-group.stories.tsx +400 -0
- package/src/components/ui/stories/resizable.stories.tsx +417 -0
- package/src/components/ui/stories/scroll-area.stories.tsx +180 -0
- package/src/components/ui/stories/select.stories.tsx +389 -0
- package/src/components/ui/stories/separator.stories.tsx +192 -0
- package/src/components/ui/stories/sheet.stories.tsx +468 -0
- package/src/components/ui/stories/sidebar.stories.tsx +731 -0
- package/src/components/ui/stories/skeleton.stories.tsx +216 -0
- package/src/components/ui/stories/slider.stories.tsx +321 -0
- package/src/components/ui/stories/sonner.stories.tsx +373 -0
- package/src/components/ui/stories/stack.stories.tsx +222 -0
- package/src/components/ui/stories/switch.stories.tsx +202 -0
- package/src/components/ui/stories/table.stories.tsx +541 -0
- package/src/components/ui/stories/tabs.stories.tsx +544 -0
- package/src/components/ui/stories/text-field.stories.tsx +280 -0
- package/src/components/ui/stories/textarea.stories.tsx +245 -0
- package/src/components/ui/stories/theme-toggle.stories.tsx +275 -0
- package/src/components/ui/stories/theme.stories.tsx +412 -0
- package/src/components/ui/stories/toggle-group.stories.tsx +337 -0
- package/src/components/ui/stories/toggle.stories.tsx +325 -0
- package/src/components/ui/stories/tooltip.stories.tsx +444 -0
- package/src/components/ui/stories/typography.stories.tsx +1586 -0
- package/src/components/ui/stories/use-mobile.stories.tsx +420 -0
- package/src/components/ui/stories/use-theme.stories.tsx +531 -0
- package/src/components/ui/switch.tsx +106 -0
- package/src/components/ui/table.tsx +424 -0
- package/src/components/ui/tabs.tsx +316 -0
- package/src/components/ui/text-field.tsx +206 -0
- package/src/components/ui/textarea.tsx +98 -0
- package/src/components/ui/theme-toggle.tsx +185 -0
- package/src/components/ui/theme.tsx +148 -0
- package/src/components/ui/toggle-group.tsx +196 -0
- package/src/components/ui/toggle.tsx +115 -0
- package/src/components/ui/tooltip.tsx +253 -0
- package/src/components/ui/typography.tsx +468 -0
- package/src/hooks/use-mobile.ts +91 -0
- package/src/hooks/use-theme.ts +319 -0
- package/src/index.ts +77 -0
- package/src/lib/utils.ts +57 -0
- package/src/styles/globals.css +160 -0
|
@@ -0,0 +1,485 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import * as SelectPrimitive from "@radix-ui/react-select";
|
|
5
|
+
import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from "lucide-react";
|
|
6
|
+
|
|
7
|
+
import { cn } from "@/lib/utils";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Select - A dropdown selection component built on Radix UI primitives
|
|
11
|
+
*
|
|
12
|
+
* Provides a dropdown menu for selecting a single option from a list of choices.
|
|
13
|
+
* Features comprehensive keyboard navigation, grouping capabilities, accessibility
|
|
14
|
+
* compliance, and flexible styling options. Perfect for forms, filters, and
|
|
15
|
+
* configuration interfaces.
|
|
16
|
+
*
|
|
17
|
+
* @component
|
|
18
|
+
* @example
|
|
19
|
+
* ```tsx
|
|
20
|
+
* // Basic uncontrolled select
|
|
21
|
+
* <Select defaultValue="apple">
|
|
22
|
+
* <SelectTrigger className="w-[180px]">
|
|
23
|
+
* <SelectValue placeholder="Select a fruit" />
|
|
24
|
+
* </SelectTrigger>
|
|
25
|
+
* <SelectContent>
|
|
26
|
+
* <SelectItem value="apple">Apple</SelectItem>
|
|
27
|
+
* <SelectItem value="banana">Banana</SelectItem>
|
|
28
|
+
* <SelectItem value="orange">Orange</SelectItem>
|
|
29
|
+
* </SelectContent>
|
|
30
|
+
* </Select>
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```tsx
|
|
35
|
+
* // Controlled select with state management
|
|
36
|
+
* const [value, setValue] = useState("");
|
|
37
|
+
*
|
|
38
|
+
* <Select value={value} onValueChange={setValue}>
|
|
39
|
+
* <SelectTrigger>
|
|
40
|
+
* <SelectValue placeholder="Choose an option" />
|
|
41
|
+
* </SelectTrigger>
|
|
42
|
+
* <SelectContent>
|
|
43
|
+
* <SelectItem value="option1">Option 1</SelectItem>
|
|
44
|
+
* <SelectItem value="option2">Option 2</SelectItem>
|
|
45
|
+
* </SelectContent>
|
|
46
|
+
* </Select>
|
|
47
|
+
* ```
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```tsx
|
|
51
|
+
* // Grouped options with separators
|
|
52
|
+
* <Select>
|
|
53
|
+
* <SelectTrigger>
|
|
54
|
+
* <SelectValue placeholder="Select a timezone" />
|
|
55
|
+
* </SelectTrigger>
|
|
56
|
+
* <SelectContent>
|
|
57
|
+
* <SelectGroup>
|
|
58
|
+
* <SelectLabel>North America</SelectLabel>
|
|
59
|
+
* <SelectItem value="est">Eastern Time (EST)</SelectItem>
|
|
60
|
+
* <SelectItem value="cst">Central Time (CST)</SelectItem>
|
|
61
|
+
* </SelectGroup>
|
|
62
|
+
* <SelectSeparator />
|
|
63
|
+
* <SelectGroup>
|
|
64
|
+
* <SelectLabel>Europe</SelectLabel>
|
|
65
|
+
* <SelectItem value="gmt">Greenwich Mean Time (GMT)</SelectItem>
|
|
66
|
+
* <SelectItem value="cet">Central European Time (CET)</SelectItem>
|
|
67
|
+
* </SelectGroup>
|
|
68
|
+
* </SelectContent>
|
|
69
|
+
* </Select>
|
|
70
|
+
* ```
|
|
71
|
+
*
|
|
72
|
+
* @accessibility
|
|
73
|
+
* - Full keyboard navigation (Arrow keys, Enter, Space, Escape, Home, End)
|
|
74
|
+
* - ARIA compliant with proper roles, states, and properties
|
|
75
|
+
* - Screen reader announcements for selection changes and state updates
|
|
76
|
+
* - Focus management and trapping within dropdown
|
|
77
|
+
* - Support for disabled state on both trigger and individual items
|
|
78
|
+
* - Proper labeling and description associations
|
|
79
|
+
*
|
|
80
|
+
* @see {@link SelectTrigger} - The button that opens the dropdown
|
|
81
|
+
* @see {@link SelectContent} - The dropdown content container
|
|
82
|
+
* @see {@link SelectItem} - Individual selectable options
|
|
83
|
+
* @see {@link SelectGroup} - Container for grouping related items
|
|
84
|
+
* @see {@link SelectValue} - Displays selected value or placeholder
|
|
85
|
+
* @see {@link https://ui.shadcn.com/docs/components/select} for design patterns
|
|
86
|
+
* @since 1.0.0
|
|
87
|
+
*/
|
|
88
|
+
function Select({
|
|
89
|
+
...props
|
|
90
|
+
}: React.ComponentProps<typeof SelectPrimitive.Root>) {
|
|
91
|
+
return <SelectPrimitive.Root data-slot="select" {...props} />;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* SelectGroup - Container for grouping related select items
|
|
96
|
+
*
|
|
97
|
+
* Groups related options together with an optional label for better organization
|
|
98
|
+
* and improved user experience when dealing with many options.
|
|
99
|
+
*
|
|
100
|
+
* @component
|
|
101
|
+
* @example
|
|
102
|
+
* ```tsx
|
|
103
|
+
* <SelectGroup>
|
|
104
|
+
* <SelectLabel>Fruits</SelectLabel>
|
|
105
|
+
* <SelectItem value="apple">Apple</SelectItem>
|
|
106
|
+
* <SelectItem value="banana">Banana</SelectItem>
|
|
107
|
+
* </SelectGroup>
|
|
108
|
+
* ```
|
|
109
|
+
*
|
|
110
|
+
* @see {@link SelectLabel} - Label for the group
|
|
111
|
+
* @see {@link SelectItem} - Items within the group
|
|
112
|
+
* @since 1.0.0
|
|
113
|
+
*/
|
|
114
|
+
function SelectGroup({
|
|
115
|
+
...props
|
|
116
|
+
}: React.ComponentProps<typeof SelectPrimitive.Group>) {
|
|
117
|
+
return <SelectPrimitive.Group data-slot="select-group" {...props} />;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* SelectValue - Displays the selected value or placeholder
|
|
122
|
+
*
|
|
123
|
+
* Renders the currently selected option's text or a placeholder when no option
|
|
124
|
+
* is selected. Must be used inside SelectTrigger.
|
|
125
|
+
*
|
|
126
|
+
* @component
|
|
127
|
+
* @example
|
|
128
|
+
* ```tsx
|
|
129
|
+
* <SelectTrigger>
|
|
130
|
+
* <SelectValue placeholder="Choose an option" />
|
|
131
|
+
* </SelectTrigger>
|
|
132
|
+
* ```
|
|
133
|
+
*
|
|
134
|
+
* @see {@link SelectTrigger} - Parent container for the value
|
|
135
|
+
* @since 1.0.0
|
|
136
|
+
*/
|
|
137
|
+
function SelectValue({
|
|
138
|
+
...props
|
|
139
|
+
}: React.ComponentProps<typeof SelectPrimitive.Value>) {
|
|
140
|
+
return <SelectPrimitive.Value data-slot="select-value" {...props} />;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* SelectTrigger - The button that opens the select dropdown
|
|
145
|
+
*
|
|
146
|
+
* A styled button that displays the current value and triggers the dropdown menu.
|
|
147
|
+
* Includes a chevron icon to indicate dropdown functionality and supports different
|
|
148
|
+
* size variants for various UI contexts.
|
|
149
|
+
*
|
|
150
|
+
* @component
|
|
151
|
+
* @example
|
|
152
|
+
* ```tsx
|
|
153
|
+
* // Basic trigger with custom width
|
|
154
|
+
* <SelectTrigger className="w-[200px]">
|
|
155
|
+
* <SelectValue placeholder="Select an option" />
|
|
156
|
+
* </SelectTrigger>
|
|
157
|
+
* ```
|
|
158
|
+
*
|
|
159
|
+
* @example
|
|
160
|
+
* ```tsx
|
|
161
|
+
* // Small size variant for compact layouts
|
|
162
|
+
* <SelectTrigger size="sm" className="w-[150px]">
|
|
163
|
+
* <SelectValue placeholder="Compact" />
|
|
164
|
+
* </SelectTrigger>
|
|
165
|
+
* ```
|
|
166
|
+
*
|
|
167
|
+
* @example
|
|
168
|
+
* ```tsx
|
|
169
|
+
* // With form integration
|
|
170
|
+
* <SelectTrigger id="user-role" aria-describedby="role-help">
|
|
171
|
+
* <SelectValue placeholder="Choose role" />
|
|
172
|
+
* </SelectTrigger>
|
|
173
|
+
* ```
|
|
174
|
+
*
|
|
175
|
+
* @accessibility
|
|
176
|
+
* - Keyboard accessible with Enter/Space to open dropdown
|
|
177
|
+
* - Arrow keys navigate when closed (opens and moves to first/last item)
|
|
178
|
+
* - Properly announces state changes to screen readers
|
|
179
|
+
* - Focus visible ring for keyboard navigation
|
|
180
|
+
* - Supports aria-describedby for additional context
|
|
181
|
+
* - Disabled state properly communicated to assistive technology
|
|
182
|
+
*
|
|
183
|
+
* @see {@link SelectValue} - Displays the selected value or placeholder
|
|
184
|
+
* @since 1.0.0
|
|
185
|
+
*/
|
|
186
|
+
function SelectTrigger({
|
|
187
|
+
className,
|
|
188
|
+
size = "default",
|
|
189
|
+
children,
|
|
190
|
+
...props
|
|
191
|
+
}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {
|
|
192
|
+
/**
|
|
193
|
+
* The size variant of the trigger button
|
|
194
|
+
* @default "default"
|
|
195
|
+
*/
|
|
196
|
+
size?: "sm" | "default";
|
|
197
|
+
}) {
|
|
198
|
+
return (
|
|
199
|
+
<SelectPrimitive.Trigger
|
|
200
|
+
data-slot="select-trigger"
|
|
201
|
+
data-size={size}
|
|
202
|
+
className={cn(
|
|
203
|
+
"border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
204
|
+
className,
|
|
205
|
+
)}
|
|
206
|
+
{...props}
|
|
207
|
+
>
|
|
208
|
+
{children}
|
|
209
|
+
<SelectPrimitive.Icon asChild>
|
|
210
|
+
<ChevronDownIcon className="size-4 opacity-50" />
|
|
211
|
+
</SelectPrimitive.Icon>
|
|
212
|
+
</SelectPrimitive.Trigger>
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* SelectContent - Container for the dropdown content
|
|
218
|
+
*
|
|
219
|
+
* The dropdown panel that contains all selectable items, groups, and labels.
|
|
220
|
+
* Automatically handles scrolling for long lists and positioning relative to the trigger.
|
|
221
|
+
*
|
|
222
|
+
* @component
|
|
223
|
+
* @example
|
|
224
|
+
* ```tsx
|
|
225
|
+
* <SelectContent>
|
|
226
|
+
* <SelectItem value="1">Option 1</SelectItem>
|
|
227
|
+
* <SelectItem value="2">Option 2</SelectItem>
|
|
228
|
+
* <SelectItem value="3">Option 3</SelectItem>
|
|
229
|
+
* </SelectContent>
|
|
230
|
+
* ```
|
|
231
|
+
*
|
|
232
|
+
* @example
|
|
233
|
+
* ```tsx
|
|
234
|
+
* // With fixed positioning
|
|
235
|
+
* <SelectContent position="item-aligned">
|
|
236
|
+
* <SelectItem value="1">Option 1</SelectItem>
|
|
237
|
+
* </SelectContent>
|
|
238
|
+
* ```
|
|
239
|
+
*
|
|
240
|
+
* @accessibility
|
|
241
|
+
* - Focus trapped within dropdown when open
|
|
242
|
+
* - Scrollable with keyboard navigation
|
|
243
|
+
* - Escape key closes the dropdown
|
|
244
|
+
*
|
|
245
|
+
* @see {@link SelectItem} - Individual options
|
|
246
|
+
* @see {@link SelectGroup} - Group container
|
|
247
|
+
* @since 1.0.0
|
|
248
|
+
*/
|
|
249
|
+
function SelectContent({
|
|
250
|
+
className,
|
|
251
|
+
children,
|
|
252
|
+
position = "popper",
|
|
253
|
+
...props
|
|
254
|
+
}: React.ComponentProps<typeof SelectPrimitive.Content>) {
|
|
255
|
+
return (
|
|
256
|
+
<SelectPrimitive.Portal>
|
|
257
|
+
<SelectPrimitive.Content
|
|
258
|
+
data-slot="select-content"
|
|
259
|
+
className={cn(
|
|
260
|
+
"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 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md",
|
|
261
|
+
position === "popper" &&
|
|
262
|
+
"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
|
|
263
|
+
className,
|
|
264
|
+
)}
|
|
265
|
+
position={position}
|
|
266
|
+
{...props}
|
|
267
|
+
>
|
|
268
|
+
<SelectScrollUpButton />
|
|
269
|
+
<SelectPrimitive.Viewport
|
|
270
|
+
className={cn(
|
|
271
|
+
"p-1",
|
|
272
|
+
position === "popper" &&
|
|
273
|
+
"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1",
|
|
274
|
+
)}
|
|
275
|
+
>
|
|
276
|
+
{children}
|
|
277
|
+
</SelectPrimitive.Viewport>
|
|
278
|
+
<SelectScrollDownButton />
|
|
279
|
+
</SelectPrimitive.Content>
|
|
280
|
+
</SelectPrimitive.Portal>
|
|
281
|
+
);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* SelectLabel - Label for a group of select items
|
|
286
|
+
*
|
|
287
|
+
* Provides a non-selectable label for categorizing groups of options.
|
|
288
|
+
* Helps users understand the context of the options below.
|
|
289
|
+
*
|
|
290
|
+
* @component
|
|
291
|
+
* @example
|
|
292
|
+
* ```tsx
|
|
293
|
+
* <SelectGroup>
|
|
294
|
+
* <SelectLabel>Countries</SelectLabel>
|
|
295
|
+
* <SelectItem value="us">United States</SelectItem>
|
|
296
|
+
* <SelectItem value="uk">United Kingdom</SelectItem>
|
|
297
|
+
* </SelectGroup>
|
|
298
|
+
* ```
|
|
299
|
+
*
|
|
300
|
+
* @accessibility
|
|
301
|
+
* - Properly associated with group for screen readers
|
|
302
|
+
* - Non-selectable and non-focusable
|
|
303
|
+
*
|
|
304
|
+
* @see {@link SelectGroup} - Parent container
|
|
305
|
+
* @since 1.0.0
|
|
306
|
+
*/
|
|
307
|
+
function SelectLabel({
|
|
308
|
+
className,
|
|
309
|
+
...props
|
|
310
|
+
}: React.ComponentProps<typeof SelectPrimitive.Label>) {
|
|
311
|
+
return (
|
|
312
|
+
<SelectPrimitive.Label
|
|
313
|
+
data-slot="select-label"
|
|
314
|
+
className={cn("text-muted-foreground px-2 py-1.5 text-xs", className)}
|
|
315
|
+
{...props}
|
|
316
|
+
/>
|
|
317
|
+
);
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* SelectItem - Individual selectable option in the dropdown
|
|
322
|
+
*
|
|
323
|
+
* Represents a single option that users can select. Shows a checkmark
|
|
324
|
+
* when selected and supports keyboard navigation.
|
|
325
|
+
*
|
|
326
|
+
* @component
|
|
327
|
+
* @example
|
|
328
|
+
* ```tsx
|
|
329
|
+
* <SelectItem value="apple">Apple</SelectItem>
|
|
330
|
+
* ```
|
|
331
|
+
*
|
|
332
|
+
* @example
|
|
333
|
+
* ```tsx
|
|
334
|
+
* // Disabled item
|
|
335
|
+
* <SelectItem value="sold-out" disabled>
|
|
336
|
+
* Sold Out
|
|
337
|
+
* </SelectItem>
|
|
338
|
+
* ```
|
|
339
|
+
*
|
|
340
|
+
* @accessibility
|
|
341
|
+
* - Arrow keys navigate between items
|
|
342
|
+
* - Enter or Space selects the item
|
|
343
|
+
* - Shows checkmark icon when selected
|
|
344
|
+
* - Supports disabled state
|
|
345
|
+
*
|
|
346
|
+
* @see {@link SelectContent} - Parent container
|
|
347
|
+
* @since 1.0.0
|
|
348
|
+
*/
|
|
349
|
+
function SelectItem({
|
|
350
|
+
className,
|
|
351
|
+
children,
|
|
352
|
+
...props
|
|
353
|
+
}: React.ComponentProps<typeof SelectPrimitive.Item>) {
|
|
354
|
+
return (
|
|
355
|
+
<SelectPrimitive.Item
|
|
356
|
+
data-slot="select-item"
|
|
357
|
+
className={cn(
|
|
358
|
+
"focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 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 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",
|
|
359
|
+
className,
|
|
360
|
+
)}
|
|
361
|
+
{...props}
|
|
362
|
+
>
|
|
363
|
+
<span className="absolute right-2 flex size-3.5 items-center justify-center">
|
|
364
|
+
<SelectPrimitive.ItemIndicator>
|
|
365
|
+
<CheckIcon className="size-4" />
|
|
366
|
+
</SelectPrimitive.ItemIndicator>
|
|
367
|
+
</span>
|
|
368
|
+
<SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>
|
|
369
|
+
</SelectPrimitive.Item>
|
|
370
|
+
);
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/**
|
|
374
|
+
* SelectSeparator - Visual divider between select groups
|
|
375
|
+
*
|
|
376
|
+
* A horizontal line that visually separates groups of options
|
|
377
|
+
* for better organization and clarity.
|
|
378
|
+
*
|
|
379
|
+
* @component
|
|
380
|
+
* @example
|
|
381
|
+
* ```tsx
|
|
382
|
+
* <SelectContent>
|
|
383
|
+
* <SelectGroup>
|
|
384
|
+
* <SelectItem value="1">Option 1</SelectItem>
|
|
385
|
+
* </SelectGroup>
|
|
386
|
+
* <SelectSeparator />
|
|
387
|
+
* <SelectGroup>
|
|
388
|
+
* <SelectItem value="2">Option 2</SelectItem>
|
|
389
|
+
* </SelectGroup>
|
|
390
|
+
* </SelectContent>
|
|
391
|
+
* ```
|
|
392
|
+
*
|
|
393
|
+
* @accessibility
|
|
394
|
+
* - Decorative element with no semantic meaning
|
|
395
|
+
* - Not focusable or interactive
|
|
396
|
+
*
|
|
397
|
+
* @since 1.0.0
|
|
398
|
+
*/
|
|
399
|
+
function SelectSeparator({
|
|
400
|
+
className,
|
|
401
|
+
...props
|
|
402
|
+
}: React.ComponentProps<typeof SelectPrimitive.Separator>) {
|
|
403
|
+
return (
|
|
404
|
+
<SelectPrimitive.Separator
|
|
405
|
+
data-slot="select-separator"
|
|
406
|
+
className={cn("bg-border pointer-events-none -mx-1 my-1 h-px", className)}
|
|
407
|
+
{...props}
|
|
408
|
+
/>
|
|
409
|
+
);
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* SelectScrollUpButton - Scroll button for navigating up in long lists
|
|
414
|
+
*
|
|
415
|
+
* Appears at the top of the dropdown when there are more items above
|
|
416
|
+
* the visible area. Allows scrolling through long option lists.
|
|
417
|
+
*
|
|
418
|
+
* @component
|
|
419
|
+
* @accessibility
|
|
420
|
+
* - Keyboard accessible
|
|
421
|
+
* - Only visible when scrolling is available
|
|
422
|
+
*
|
|
423
|
+
* @since 1.0.0
|
|
424
|
+
*/
|
|
425
|
+
function SelectScrollUpButton({
|
|
426
|
+
className,
|
|
427
|
+
...props
|
|
428
|
+
}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {
|
|
429
|
+
return (
|
|
430
|
+
<SelectPrimitive.ScrollUpButton
|
|
431
|
+
data-slot="select-scroll-up-button"
|
|
432
|
+
className={cn(
|
|
433
|
+
"flex cursor-default items-center justify-center py-1",
|
|
434
|
+
className,
|
|
435
|
+
)}
|
|
436
|
+
{...props}
|
|
437
|
+
>
|
|
438
|
+
<ChevronUpIcon className="size-4" />
|
|
439
|
+
</SelectPrimitive.ScrollUpButton>
|
|
440
|
+
);
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
/**
|
|
444
|
+
* SelectScrollDownButton - Scroll button for navigating down in long lists
|
|
445
|
+
*
|
|
446
|
+
* Appears at the bottom of the dropdown when there are more items below
|
|
447
|
+
* the visible area. Allows scrolling through long option lists.
|
|
448
|
+
*
|
|
449
|
+
* @component
|
|
450
|
+
* @accessibility
|
|
451
|
+
* - Keyboard accessible
|
|
452
|
+
* - Only visible when scrolling is available
|
|
453
|
+
*
|
|
454
|
+
* @since 1.0.0
|
|
455
|
+
*/
|
|
456
|
+
function SelectScrollDownButton({
|
|
457
|
+
className,
|
|
458
|
+
...props
|
|
459
|
+
}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {
|
|
460
|
+
return (
|
|
461
|
+
<SelectPrimitive.ScrollDownButton
|
|
462
|
+
data-slot="select-scroll-down-button"
|
|
463
|
+
className={cn(
|
|
464
|
+
"flex cursor-default items-center justify-center py-1",
|
|
465
|
+
className,
|
|
466
|
+
)}
|
|
467
|
+
{...props}
|
|
468
|
+
>
|
|
469
|
+
<ChevronDownIcon className="size-4" />
|
|
470
|
+
</SelectPrimitive.ScrollDownButton>
|
|
471
|
+
);
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
export {
|
|
475
|
+
Select,
|
|
476
|
+
SelectContent,
|
|
477
|
+
SelectGroup,
|
|
478
|
+
SelectItem,
|
|
479
|
+
SelectLabel,
|
|
480
|
+
SelectScrollDownButton,
|
|
481
|
+
SelectScrollUpButton,
|
|
482
|
+
SelectSeparator,
|
|
483
|
+
SelectTrigger,
|
|
484
|
+
SelectValue,
|
|
485
|
+
};
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import * as SeparatorPrimitive from "@radix-ui/react-separator";
|
|
3
|
+
|
|
4
|
+
import { cn } from "@/lib/utils";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Separator component for visually dividing content sections
|
|
8
|
+
*
|
|
9
|
+
* A flexible separator component built on Radix UI primitives that creates
|
|
10
|
+
* visual or semantic divisions between content sections. Supports both horizontal
|
|
11
|
+
* and vertical orientations with full accessibility features including decorative
|
|
12
|
+
* and semantic separator modes for screen reader compatibility.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```tsx
|
|
16
|
+
* // Basic horizontal separator
|
|
17
|
+
* <div>
|
|
18
|
+
* <p>Above content</p>
|
|
19
|
+
* <Separator />
|
|
20
|
+
* <p>Below content</p>
|
|
21
|
+
* </div>
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```tsx
|
|
26
|
+
* // Vertical separator in toolbars
|
|
27
|
+
* <div className="flex items-center">
|
|
28
|
+
* <button>Bold</button>
|
|
29
|
+
* <Separator orientation="vertical" className="mx-2 h-6" />
|
|
30
|
+
* <button>Italic</button>
|
|
31
|
+
* </div>
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```tsx
|
|
36
|
+
* // Semantic separator for navigation
|
|
37
|
+
* <nav className="flex items-center">
|
|
38
|
+
* <a href="/home">Home</a>
|
|
39
|
+
* <Separator
|
|
40
|
+
* orientation="vertical"
|
|
41
|
+
* decorative={false}
|
|
42
|
+
* aria-label="Navigation separator"
|
|
43
|
+
* className="mx-2 h-4"
|
|
44
|
+
* />
|
|
45
|
+
* <a href="/about">About</a>
|
|
46
|
+
* </nav>
|
|
47
|
+
* ```
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```tsx
|
|
51
|
+
* // Custom styled separator
|
|
52
|
+
* <Separator className="my-6 h-0.5 bg-gradient-to-r from-transparent via-border to-transparent" />
|
|
53
|
+
* ```
|
|
54
|
+
*
|
|
55
|
+
* @see {@link https://ui.shadcn.com/docs/components/separator} for design patterns
|
|
56
|
+
* @since 1.0.0
|
|
57
|
+
* @see {@link https://www.radix-ui.com/primitives/docs/components/separator} for API reference
|
|
58
|
+
*/
|
|
59
|
+
/**
|
|
60
|
+
* Props for the Separator component
|
|
61
|
+
*/
|
|
62
|
+
type SeparatorProps = React.ComponentProps<typeof SeparatorPrimitive.Root> & {
|
|
63
|
+
/** Additional CSS class names to apply to the separator */
|
|
64
|
+
className?: string;
|
|
65
|
+
/** The orientation of the separator. @default "horizontal" */
|
|
66
|
+
orientation?: "horizontal" | "vertical";
|
|
67
|
+
/** Whether the separator is purely decorative (hidden from screen readers). @default true */
|
|
68
|
+
decorative?: boolean;
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Separator component implementation
|
|
73
|
+
*
|
|
74
|
+
* @param className - Additional CSS class names to apply
|
|
75
|
+
* @param orientation - The orientation of the separator ("horizontal" | "vertical")
|
|
76
|
+
* @param decorative - Whether the separator is decorative (hidden from screen readers)
|
|
77
|
+
* @param props - Additional props passed to the underlying Radix Separator primitive
|
|
78
|
+
*/
|
|
79
|
+
function Separator({
|
|
80
|
+
className,
|
|
81
|
+
orientation = "horizontal",
|
|
82
|
+
decorative = true,
|
|
83
|
+
...props
|
|
84
|
+
}: SeparatorProps) {
|
|
85
|
+
return (
|
|
86
|
+
<SeparatorPrimitive.Root
|
|
87
|
+
data-slot="separator"
|
|
88
|
+
decorative={decorative}
|
|
89
|
+
orientation={orientation}
|
|
90
|
+
className={cn(
|
|
91
|
+
"bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px",
|
|
92
|
+
className,
|
|
93
|
+
)}
|
|
94
|
+
{...props}
|
|
95
|
+
/>
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
Separator.displayName = "Separator";
|
|
100
|
+
|
|
101
|
+
export { Separator, type SeparatorProps };
|