@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,553 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import * as MenubarPrimitive from "@radix-ui/react-menubar";
|
|
3
|
+
import { CheckIcon, ChevronRightIcon, CircleIcon } from "lucide-react";
|
|
4
|
+
|
|
5
|
+
import { cn } from "@/lib/utils";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* A visually persistent menu common in desktop applications that provides access to a consistent set of commands.
|
|
9
|
+
*
|
|
10
|
+
* Menubar provides a horizontal navigation structure similar to desktop application menus
|
|
11
|
+
* like those found in VS Code, Figma, or native applications. Each menu contains dropdown
|
|
12
|
+
* content with actions, checkboxes, radio groups, and nested submenus.
|
|
13
|
+
*
|
|
14
|
+
* Built on top of Radix UI Menubar primitive with full keyboard navigation and accessibility support.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```tsx
|
|
18
|
+
* // Basic application menubar
|
|
19
|
+
* <Menubar>
|
|
20
|
+
* <MenubarMenu>
|
|
21
|
+
* <MenubarTrigger>File</MenubarTrigger>
|
|
22
|
+
* <MenubarContent>
|
|
23
|
+
* <MenubarItem>New File <MenubarShortcut>⌘N</MenubarShortcut></MenubarItem>
|
|
24
|
+
* <MenubarItem>Open <MenubarShortcut>⌘O</MenubarShortcut></MenubarItem>
|
|
25
|
+
* <MenubarSeparator />
|
|
26
|
+
* <MenubarItem>Exit</MenubarItem>
|
|
27
|
+
* </MenubarContent>
|
|
28
|
+
* </MenubarMenu>
|
|
29
|
+
* <MenubarMenu>
|
|
30
|
+
* <MenubarTrigger>Edit</MenubarTrigger>
|
|
31
|
+
* <MenubarContent>
|
|
32
|
+
* <MenubarItem>Undo <MenubarShortcut>⌘Z</MenubarShortcut></MenubarItem>
|
|
33
|
+
* <MenubarItem>Redo <MenubarShortcut>⇧⌘Z</MenubarShortcut></MenubarItem>
|
|
34
|
+
* </MenubarContent>
|
|
35
|
+
* </MenubarMenu>
|
|
36
|
+
* </Menubar>
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```tsx
|
|
41
|
+
* // With checkboxes and submenus
|
|
42
|
+
* <Menubar>
|
|
43
|
+
* <MenubarMenu>
|
|
44
|
+
* <MenubarTrigger>View</MenubarTrigger>
|
|
45
|
+
* <MenubarContent>
|
|
46
|
+
* <MenubarCheckboxItem checked={showToolbar} onCheckedChange={setShowToolbar}>
|
|
47
|
+
* Show Toolbar
|
|
48
|
+
* </MenubarCheckboxItem>
|
|
49
|
+
* <MenubarSeparator />
|
|
50
|
+
* <MenubarSub>
|
|
51
|
+
* <MenubarSubTrigger>Panels</MenubarSubTrigger>
|
|
52
|
+
* <MenubarSubContent>
|
|
53
|
+
* <MenubarItem>Explorer</MenubarItem>
|
|
54
|
+
* <MenubarItem>Terminal</MenubarItem>
|
|
55
|
+
* </MenubarSubContent>
|
|
56
|
+
* </MenubarSub>
|
|
57
|
+
* </MenubarContent>
|
|
58
|
+
* </MenubarMenu>
|
|
59
|
+
* </Menubar>
|
|
60
|
+
* ```
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* ```tsx
|
|
64
|
+
* // With radio groups for exclusive selections
|
|
65
|
+
* <Menubar>
|
|
66
|
+
* <MenubarMenu>
|
|
67
|
+
* <MenubarTrigger>Theme</MenubarTrigger>
|
|
68
|
+
* <MenubarContent>
|
|
69
|
+
* <MenubarRadioGroup value={theme} onValueChange={setTheme}>
|
|
70
|
+
* <MenubarRadioItem value="light">Light</MenubarRadioItem>
|
|
71
|
+
* <MenubarRadioItem value="dark">Dark</MenubarRadioItem>
|
|
72
|
+
* <MenubarRadioItem value="system">System</MenubarRadioItem>
|
|
73
|
+
* </MenubarRadioGroup>
|
|
74
|
+
* </MenubarContent>
|
|
75
|
+
* </MenubarMenu>
|
|
76
|
+
* </Menubar>
|
|
77
|
+
* ```
|
|
78
|
+
*
|
|
79
|
+
* @accessibility
|
|
80
|
+
* - Follows WAI-ARIA menubar pattern
|
|
81
|
+
* - Left/Right arrow keys navigate between menu triggers
|
|
82
|
+
* - Up/Down arrow keys navigate within menu content
|
|
83
|
+
* - Enter or Space activates menu items
|
|
84
|
+
* - Escape closes open menus
|
|
85
|
+
* - Tab moves focus to next focusable element outside menubar
|
|
86
|
+
* - Full keyboard navigation with arrow keys, Enter, and Escape
|
|
87
|
+
* - Screen reader support with proper ARIA labels and roles
|
|
88
|
+
*
|
|
89
|
+
* @see {@link https://www.w3.org/WAI/ARIA/apg/patterns/menubar/} ARIA Menubar Pattern
|
|
90
|
+
* @see {@link https://ui.shadcn.com/docs/components/menubar} shadcn/ui Menubar Documentation
|
|
91
|
+
* @since 1.0.0
|
|
92
|
+
*/
|
|
93
|
+
/**
|
|
94
|
+
* Root container for the menubar component.
|
|
95
|
+
*
|
|
96
|
+
* @param className - Additional CSS classes to apply
|
|
97
|
+
* @param props - All props from Radix UI Menubar Root
|
|
98
|
+
*/
|
|
99
|
+
function Menubar({
|
|
100
|
+
className,
|
|
101
|
+
...props
|
|
102
|
+
}: React.ComponentProps<typeof MenubarPrimitive.Root>) {
|
|
103
|
+
return (
|
|
104
|
+
<MenubarPrimitive.Root
|
|
105
|
+
data-slot="menubar"
|
|
106
|
+
className={cn(
|
|
107
|
+
"bg-background flex h-9 items-center gap-1 rounded-md border p-1 shadow-xs",
|
|
108
|
+
className,
|
|
109
|
+
)}
|
|
110
|
+
{...props}
|
|
111
|
+
/>
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Container for a single menu within the menubar.
|
|
117
|
+
*
|
|
118
|
+
* Each MenubarMenu represents one dropdown menu that can be triggered
|
|
119
|
+
* by its corresponding MenubarTrigger.
|
|
120
|
+
*
|
|
121
|
+
* @param props - All props from Radix UI Menubar Menu
|
|
122
|
+
*/
|
|
123
|
+
function MenubarMenu({
|
|
124
|
+
...props
|
|
125
|
+
}: React.ComponentProps<typeof MenubarPrimitive.Menu>) {
|
|
126
|
+
return <MenubarPrimitive.Menu data-slot="menubar-menu" {...props} />;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Groups related menu items together within MenubarContent.
|
|
131
|
+
*
|
|
132
|
+
* Used to create logical groupings of menu items, often separated
|
|
133
|
+
* by MenubarSeparator components.
|
|
134
|
+
*
|
|
135
|
+
* @param props - All props from Radix UI Menubar Group
|
|
136
|
+
*/
|
|
137
|
+
function MenubarGroup({
|
|
138
|
+
...props
|
|
139
|
+
}: React.ComponentProps<typeof MenubarPrimitive.Group>) {
|
|
140
|
+
return <MenubarPrimitive.Group data-slot="menubar-group" {...props} />;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Portal for rendering menu content outside the DOM hierarchy.
|
|
145
|
+
*
|
|
146
|
+
* Automatically used by MenubarContent to ensure proper layering
|
|
147
|
+
* and positioning of dropdown menus.
|
|
148
|
+
*
|
|
149
|
+
* @param props - All props from Radix UI Menubar Portal
|
|
150
|
+
*/
|
|
151
|
+
function MenubarPortal({
|
|
152
|
+
...props
|
|
153
|
+
}: React.ComponentProps<typeof MenubarPrimitive.Portal>) {
|
|
154
|
+
return <MenubarPrimitive.Portal data-slot="menubar-portal" {...props} />;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Container for mutually exclusive radio items.
|
|
159
|
+
*
|
|
160
|
+
* Use for single-selection scenarios like theme selection,
|
|
161
|
+
* view modes, or other settings where only one option can be active.
|
|
162
|
+
*
|
|
163
|
+
* @param props - All props from Radix UI Menubar RadioGroup
|
|
164
|
+
* @example
|
|
165
|
+
* ```tsx
|
|
166
|
+
* <MenubarRadioGroup value={theme} onValueChange={setTheme}>
|
|
167
|
+
* <MenubarRadioItem value="light">Light</MenubarRadioItem>
|
|
168
|
+
* <MenubarRadioItem value="dark">Dark</MenubarRadioItem>
|
|
169
|
+
* </MenubarRadioGroup>
|
|
170
|
+
* ```
|
|
171
|
+
*/
|
|
172
|
+
function MenubarRadioGroup({
|
|
173
|
+
...props
|
|
174
|
+
}: React.ComponentProps<typeof MenubarPrimitive.RadioGroup>) {
|
|
175
|
+
return (
|
|
176
|
+
<MenubarPrimitive.RadioGroup data-slot="menubar-radio-group" {...props} />
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Button that opens a dropdown menu.
|
|
182
|
+
*
|
|
183
|
+
* The trigger text should be concise and descriptive of the menu contents.
|
|
184
|
+
* Common patterns include "File", "Edit", "View", "Tools", "Help".
|
|
185
|
+
*
|
|
186
|
+
* @param className - Additional CSS classes to apply
|
|
187
|
+
* @param props - All props from Radix UI Menubar Trigger
|
|
188
|
+
*/
|
|
189
|
+
function MenubarTrigger({
|
|
190
|
+
className,
|
|
191
|
+
...props
|
|
192
|
+
}: React.ComponentProps<typeof MenubarPrimitive.Trigger>) {
|
|
193
|
+
return (
|
|
194
|
+
<MenubarPrimitive.Trigger
|
|
195
|
+
data-slot="menubar-trigger"
|
|
196
|
+
className={cn(
|
|
197
|
+
"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex items-center rounded-sm px-2 py-1 text-sm font-medium outline-hidden select-none",
|
|
198
|
+
className,
|
|
199
|
+
)}
|
|
200
|
+
{...props}
|
|
201
|
+
/>
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Dropdown content container for menu items.
|
|
207
|
+
*
|
|
208
|
+
* Contains the actual menu items, separators, and submenus that appear
|
|
209
|
+
* when a MenubarTrigger is activated.
|
|
210
|
+
*
|
|
211
|
+
* @param className - Additional CSS classes to apply
|
|
212
|
+
* @param align - Alignment relative to trigger (start, center, end)
|
|
213
|
+
* @param alignOffset - Offset from the aligned position
|
|
214
|
+
* @param sideOffset - Distance from the trigger
|
|
215
|
+
* @param props - All props from Radix UI Menubar Content
|
|
216
|
+
*/
|
|
217
|
+
function MenubarContent({
|
|
218
|
+
className,
|
|
219
|
+
align = "start",
|
|
220
|
+
alignOffset = -4,
|
|
221
|
+
sideOffset = 8,
|
|
222
|
+
...props
|
|
223
|
+
}: React.ComponentProps<typeof MenubarPrimitive.Content>) {
|
|
224
|
+
return (
|
|
225
|
+
<MenubarPortal>
|
|
226
|
+
<MenubarPrimitive.Content
|
|
227
|
+
data-slot="menubar-content"
|
|
228
|
+
align={align}
|
|
229
|
+
alignOffset={alignOffset}
|
|
230
|
+
sideOffset={sideOffset}
|
|
231
|
+
className={cn(
|
|
232
|
+
"bg-popover text-popover-foreground data-[state=open]:animate-in 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-[12rem] origin-(--radix-menubar-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-md",
|
|
233
|
+
className,
|
|
234
|
+
)}
|
|
235
|
+
{...props}
|
|
236
|
+
/>
|
|
237
|
+
</MenubarPortal>
|
|
238
|
+
);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* A selectable menu item within MenubarContent.
|
|
243
|
+
*
|
|
244
|
+
* Can be enhanced with icons, keyboard shortcuts, and supports
|
|
245
|
+
* different variants including destructive actions.
|
|
246
|
+
*
|
|
247
|
+
* @param className - Additional CSS classes to apply
|
|
248
|
+
* @param inset - Whether to add left padding for alignment with items that have icons
|
|
249
|
+
* @param variant - Visual variant ("default" | "destructive")
|
|
250
|
+
* @param props - All props from Radix UI Menubar Item
|
|
251
|
+
* @example
|
|
252
|
+
* ```tsx
|
|
253
|
+
* <MenubarItem variant="destructive">
|
|
254
|
+
* Delete File
|
|
255
|
+
* <MenubarShortcut>⌫</MenubarShortcut>
|
|
256
|
+
* </MenubarItem>
|
|
257
|
+
* ```
|
|
258
|
+
*/
|
|
259
|
+
function MenubarItem({
|
|
260
|
+
className,
|
|
261
|
+
inset,
|
|
262
|
+
variant = "default",
|
|
263
|
+
...props
|
|
264
|
+
}: React.ComponentProps<typeof MenubarPrimitive.Item> & {
|
|
265
|
+
inset?: boolean;
|
|
266
|
+
variant?: "default" | "destructive";
|
|
267
|
+
}) {
|
|
268
|
+
return (
|
|
269
|
+
<MenubarPrimitive.Item
|
|
270
|
+
data-slot="menubar-item"
|
|
271
|
+
data-inset={inset}
|
|
272
|
+
data-variant={variant}
|
|
273
|
+
className={cn(
|
|
274
|
+
"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-1.5 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",
|
|
275
|
+
className,
|
|
276
|
+
)}
|
|
277
|
+
{...props}
|
|
278
|
+
/>
|
|
279
|
+
);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* A menu item that can be checked/unchecked.
|
|
284
|
+
*
|
|
285
|
+
* Perfect for toggle options like "Show Toolbar", "Enable Feature",
|
|
286
|
+
* or any binary setting that can be turned on/off.
|
|
287
|
+
*
|
|
288
|
+
* @param className - Additional CSS classes to apply
|
|
289
|
+
* @param children - The content of the checkbox item
|
|
290
|
+
* @param checked - Whether the item is checked
|
|
291
|
+
* @param props - All props from Radix UI Menubar CheckboxItem including onCheckedChange
|
|
292
|
+
* @example
|
|
293
|
+
* ```tsx
|
|
294
|
+
* <MenubarCheckboxItem checked={showToolbar} onCheckedChange={setShowToolbar}>
|
|
295
|
+
* Show Toolbar
|
|
296
|
+
* </MenubarCheckboxItem>
|
|
297
|
+
* ```
|
|
298
|
+
*/
|
|
299
|
+
function MenubarCheckboxItem({
|
|
300
|
+
className,
|
|
301
|
+
children,
|
|
302
|
+
checked,
|
|
303
|
+
...props
|
|
304
|
+
}: React.ComponentProps<typeof MenubarPrimitive.CheckboxItem>) {
|
|
305
|
+
return (
|
|
306
|
+
<MenubarPrimitive.CheckboxItem
|
|
307
|
+
data-slot="menubar-checkbox-item"
|
|
308
|
+
className={cn(
|
|
309
|
+
"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-xs 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",
|
|
310
|
+
className,
|
|
311
|
+
)}
|
|
312
|
+
checked={checked}
|
|
313
|
+
{...props}
|
|
314
|
+
>
|
|
315
|
+
<span className="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center">
|
|
316
|
+
<MenubarPrimitive.ItemIndicator>
|
|
317
|
+
<CheckIcon className="size-4" />
|
|
318
|
+
</MenubarPrimitive.ItemIndicator>
|
|
319
|
+
</span>
|
|
320
|
+
{children}
|
|
321
|
+
</MenubarPrimitive.CheckboxItem>
|
|
322
|
+
);
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* A menu item for single selection within a MenubarRadioGroup.
|
|
327
|
+
*
|
|
328
|
+
* Use within MenubarRadioGroup for mutually exclusive options.
|
|
329
|
+
* Only one radio item can be selected at a time within the group.
|
|
330
|
+
*
|
|
331
|
+
* @param className - Additional CSS classes to apply
|
|
332
|
+
* @param children - The content of the radio item
|
|
333
|
+
* @param props - All props from Radix UI Menubar RadioItem including value
|
|
334
|
+
* @example
|
|
335
|
+
* ```tsx
|
|
336
|
+
* <MenubarRadioItem value="dark">Dark Theme</MenubarRadioItem>
|
|
337
|
+
* ```
|
|
338
|
+
*/
|
|
339
|
+
function MenubarRadioItem({
|
|
340
|
+
className,
|
|
341
|
+
children,
|
|
342
|
+
...props
|
|
343
|
+
}: React.ComponentProps<typeof MenubarPrimitive.RadioItem>) {
|
|
344
|
+
return (
|
|
345
|
+
<MenubarPrimitive.RadioItem
|
|
346
|
+
data-slot="menubar-radio-item"
|
|
347
|
+
className={cn(
|
|
348
|
+
"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-xs 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",
|
|
349
|
+
className,
|
|
350
|
+
)}
|
|
351
|
+
{...props}
|
|
352
|
+
>
|
|
353
|
+
<span className="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center">
|
|
354
|
+
<MenubarPrimitive.ItemIndicator>
|
|
355
|
+
<CircleIcon className="size-2 fill-current" />
|
|
356
|
+
</MenubarPrimitive.ItemIndicator>
|
|
357
|
+
</span>
|
|
358
|
+
{children}
|
|
359
|
+
</MenubarPrimitive.RadioItem>
|
|
360
|
+
);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* A non-interactive label for grouping menu items.
|
|
365
|
+
*
|
|
366
|
+
* Used to provide section headings within menu content,
|
|
367
|
+
* helping users understand the organization of menu items.
|
|
368
|
+
*
|
|
369
|
+
* @param className - Additional CSS classes to apply
|
|
370
|
+
* @param inset - Whether to add left padding for alignment with items that have icons
|
|
371
|
+
* @param props - All props from Radix UI Menubar Label
|
|
372
|
+
* @example
|
|
373
|
+
* ```tsx
|
|
374
|
+
* <MenubarLabel>Recent Files</MenubarLabel>
|
|
375
|
+
* <MenubarSeparator />
|
|
376
|
+
* ```
|
|
377
|
+
*/
|
|
378
|
+
function MenubarLabel({
|
|
379
|
+
className,
|
|
380
|
+
inset,
|
|
381
|
+
...props
|
|
382
|
+
}: React.ComponentProps<typeof MenubarPrimitive.Label> & {
|
|
383
|
+
inset?: boolean;
|
|
384
|
+
}) {
|
|
385
|
+
return (
|
|
386
|
+
<MenubarPrimitive.Label
|
|
387
|
+
data-slot="menubar-label"
|
|
388
|
+
data-inset={inset}
|
|
389
|
+
className={cn(
|
|
390
|
+
"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8",
|
|
391
|
+
className,
|
|
392
|
+
)}
|
|
393
|
+
{...props}
|
|
394
|
+
/>
|
|
395
|
+
);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
/**
|
|
399
|
+
* A visual divider between menu items.
|
|
400
|
+
*
|
|
401
|
+
* Use to create logical groupings and improve visual hierarchy
|
|
402
|
+
* within menu content.
|
|
403
|
+
*
|
|
404
|
+
* @param className - Additional CSS classes to apply
|
|
405
|
+
* @param props - All props from Radix UI Menubar Separator
|
|
406
|
+
*/
|
|
407
|
+
function MenubarSeparator({
|
|
408
|
+
className,
|
|
409
|
+
...props
|
|
410
|
+
}: React.ComponentProps<typeof MenubarPrimitive.Separator>) {
|
|
411
|
+
return (
|
|
412
|
+
<MenubarPrimitive.Separator
|
|
413
|
+
data-slot="menubar-separator"
|
|
414
|
+
className={cn("bg-border -mx-1 my-1 h-px", className)}
|
|
415
|
+
{...props}
|
|
416
|
+
/>
|
|
417
|
+
);
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
/**
|
|
421
|
+
* Displays keyboard shortcut for a menu item.
|
|
422
|
+
*
|
|
423
|
+
* Shows keyboard shortcuts aligned to the right of menu items.
|
|
424
|
+
* Use standard platform conventions (⌘ for Mac, Ctrl+ for Windows/Linux).
|
|
425
|
+
*
|
|
426
|
+
* @param className - Additional CSS classes to apply
|
|
427
|
+
* @param props - All props from HTML span element
|
|
428
|
+
* @example
|
|
429
|
+
* ```tsx
|
|
430
|
+
* <MenubarItem>
|
|
431
|
+
* Save File
|
|
432
|
+
* <MenubarShortcut>⌘S</MenubarShortcut>
|
|
433
|
+
* </MenubarItem>
|
|
434
|
+
* ```
|
|
435
|
+
*/
|
|
436
|
+
function MenubarShortcut({
|
|
437
|
+
className,
|
|
438
|
+
...props
|
|
439
|
+
}: React.ComponentProps<"span">) {
|
|
440
|
+
return (
|
|
441
|
+
<span
|
|
442
|
+
data-slot="menubar-shortcut"
|
|
443
|
+
className={cn(
|
|
444
|
+
"text-muted-foreground ml-auto text-xs tracking-widest",
|
|
445
|
+
className,
|
|
446
|
+
)}
|
|
447
|
+
{...props}
|
|
448
|
+
/>
|
|
449
|
+
);
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
/**
|
|
453
|
+
* Container for a submenu.
|
|
454
|
+
*
|
|
455
|
+
* Wraps MenubarSubTrigger and MenubarSubContent to create
|
|
456
|
+
* nested menu structures.
|
|
457
|
+
*
|
|
458
|
+
* @param props - All props from Radix UI Menubar Sub
|
|
459
|
+
* @example
|
|
460
|
+
* ```tsx
|
|
461
|
+
* <MenubarSub>
|
|
462
|
+
* <MenubarSubTrigger>Export</MenubarSubTrigger>
|
|
463
|
+
* <MenubarSubContent>
|
|
464
|
+
* <MenubarItem>Export as PDF</MenubarItem>
|
|
465
|
+
* <MenubarItem>Export as CSV</MenubarItem>
|
|
466
|
+
* </MenubarSubContent>
|
|
467
|
+
* </MenubarSub>
|
|
468
|
+
* ```
|
|
469
|
+
*/
|
|
470
|
+
function MenubarSub({
|
|
471
|
+
...props
|
|
472
|
+
}: React.ComponentProps<typeof MenubarPrimitive.Sub>) {
|
|
473
|
+
return <MenubarPrimitive.Sub data-slot="menubar-sub" {...props} />;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
/**
|
|
477
|
+
* Menu item that opens a submenu.
|
|
478
|
+
*
|
|
479
|
+
* Automatically includes a right arrow indicator to show
|
|
480
|
+
* that it opens a submenu when hovered or focused.
|
|
481
|
+
*
|
|
482
|
+
* @param className - Additional CSS classes to apply
|
|
483
|
+
* @param inset - Whether to add left padding for alignment with items that have icons
|
|
484
|
+
* @param children - The content of the sub-trigger
|
|
485
|
+
* @param props - All props from Radix UI Menubar SubTrigger
|
|
486
|
+
*/
|
|
487
|
+
function MenubarSubTrigger({
|
|
488
|
+
className,
|
|
489
|
+
inset,
|
|
490
|
+
children,
|
|
491
|
+
...props
|
|
492
|
+
}: React.ComponentProps<typeof MenubarPrimitive.SubTrigger> & {
|
|
493
|
+
inset?: boolean;
|
|
494
|
+
}) {
|
|
495
|
+
return (
|
|
496
|
+
<MenubarPrimitive.SubTrigger
|
|
497
|
+
data-slot="menubar-sub-trigger"
|
|
498
|
+
data-inset={inset}
|
|
499
|
+
className={cn(
|
|
500
|
+
"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-none select-none data-[inset]:pl-8",
|
|
501
|
+
className,
|
|
502
|
+
)}
|
|
503
|
+
{...props}
|
|
504
|
+
>
|
|
505
|
+
{children}
|
|
506
|
+
<ChevronRightIcon className="ml-auto h-4 w-4" />
|
|
507
|
+
</MenubarPrimitive.SubTrigger>
|
|
508
|
+
);
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
/**
|
|
512
|
+
* Content container for a submenu.
|
|
513
|
+
*
|
|
514
|
+
* Contains the menu items that appear when a MenubarSubTrigger
|
|
515
|
+
* is hovered or focused. Supports all the same content as MenubarContent.
|
|
516
|
+
*
|
|
517
|
+
* @param className - Additional CSS classes to apply
|
|
518
|
+
* @param props - All props from Radix UI Menubar SubContent
|
|
519
|
+
*/
|
|
520
|
+
function MenubarSubContent({
|
|
521
|
+
className,
|
|
522
|
+
...props
|
|
523
|
+
}: React.ComponentProps<typeof MenubarPrimitive.SubContent>) {
|
|
524
|
+
return (
|
|
525
|
+
<MenubarPrimitive.SubContent
|
|
526
|
+
data-slot="menubar-sub-content"
|
|
527
|
+
className={cn(
|
|
528
|
+
"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-menubar-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg",
|
|
529
|
+
className,
|
|
530
|
+
)}
|
|
531
|
+
{...props}
|
|
532
|
+
/>
|
|
533
|
+
);
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
export {
|
|
537
|
+
Menubar,
|
|
538
|
+
MenubarPortal,
|
|
539
|
+
MenubarMenu,
|
|
540
|
+
MenubarTrigger,
|
|
541
|
+
MenubarContent,
|
|
542
|
+
MenubarGroup,
|
|
543
|
+
MenubarSeparator,
|
|
544
|
+
MenubarLabel,
|
|
545
|
+
MenubarItem,
|
|
546
|
+
MenubarShortcut,
|
|
547
|
+
MenubarCheckboxItem,
|
|
548
|
+
MenubarRadioGroup,
|
|
549
|
+
MenubarRadioItem,
|
|
550
|
+
MenubarSub,
|
|
551
|
+
MenubarSubTrigger,
|
|
552
|
+
MenubarSubContent,
|
|
553
|
+
};
|