@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,471 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import * as NavigationMenuPrimitive from "@radix-ui/react-navigation-menu";
|
|
3
|
+
import { cva } from "class-variance-authority";
|
|
4
|
+
import { ChevronDownIcon } from "lucide-react";
|
|
5
|
+
|
|
6
|
+
import { cn } from "@/lib/utils";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* NavigationMenu - A collection of links for navigating websites
|
|
10
|
+
*
|
|
11
|
+
* A horizontal navigation component built on Radix UI primitives that provides
|
|
12
|
+
* flexible navigation patterns with dropdown content support. Features full
|
|
13
|
+
* keyboard navigation, accessibility compliance, and responsive design.
|
|
14
|
+
*
|
|
15
|
+
* @component
|
|
16
|
+
* @example
|
|
17
|
+
* ```tsx
|
|
18
|
+
* // Basic navigation with dropdown
|
|
19
|
+
* <NavigationMenu>
|
|
20
|
+
* <NavigationMenuList>
|
|
21
|
+
* <NavigationMenuItem>
|
|
22
|
+
* <NavigationMenuTrigger>Products</NavigationMenuTrigger>
|
|
23
|
+
* <NavigationMenuContent>
|
|
24
|
+
* <NavigationMenuLink href="/products">All Products</NavigationMenuLink>
|
|
25
|
+
* </NavigationMenuContent>
|
|
26
|
+
* </NavigationMenuItem>
|
|
27
|
+
* </NavigationMenuList>
|
|
28
|
+
* </NavigationMenu>
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```tsx
|
|
33
|
+
* // Simple navigation links
|
|
34
|
+
* <NavigationMenu>
|
|
35
|
+
* <NavigationMenuList>
|
|
36
|
+
* <NavigationMenuItem>
|
|
37
|
+
* <NavigationMenuLink href="/about">About</NavigationMenuLink>
|
|
38
|
+
* </NavigationMenuItem>
|
|
39
|
+
* <NavigationMenuItem>
|
|
40
|
+
* <NavigationMenuLink href="/contact">Contact</NavigationMenuLink>
|
|
41
|
+
* </NavigationMenuItem>
|
|
42
|
+
* </NavigationMenuList>
|
|
43
|
+
* </NavigationMenu>
|
|
44
|
+
* ```
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```tsx
|
|
48
|
+
* // With Next.js Link using asChild
|
|
49
|
+
* <NavigationMenu>
|
|
50
|
+
* <NavigationMenuList>
|
|
51
|
+
* <NavigationMenuItem>
|
|
52
|
+
* <NavigationMenuLink asChild>
|
|
53
|
+
* <Link href="/dashboard">Dashboard</Link>
|
|
54
|
+
* </NavigationMenuLink>
|
|
55
|
+
* </NavigationMenuItem>
|
|
56
|
+
* </NavigationMenuList>
|
|
57
|
+
* </NavigationMenu>
|
|
58
|
+
* ```
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```tsx
|
|
62
|
+
* // Without viewport for simpler styling
|
|
63
|
+
* <NavigationMenu viewport={false}>
|
|
64
|
+
* <NavigationMenuList>
|
|
65
|
+
* <NavigationMenuItem>
|
|
66
|
+
* <NavigationMenuTrigger>Features</NavigationMenuTrigger>
|
|
67
|
+
* <NavigationMenuContent>
|
|
68
|
+
* <div className="p-4 w-[300px]">
|
|
69
|
+
* <NavigationMenuLink href="/analytics">Analytics</NavigationMenuLink>
|
|
70
|
+
* </div>
|
|
71
|
+
* </NavigationMenuContent>
|
|
72
|
+
* </NavigationMenuItem>
|
|
73
|
+
* </NavigationMenuList>
|
|
74
|
+
* </NavigationMenu>
|
|
75
|
+
* ```
|
|
76
|
+
*
|
|
77
|
+
* @accessibility
|
|
78
|
+
* - Full keyboard navigation with arrow keys for menu traversal
|
|
79
|
+
* - Tab key moves between focusable menu items
|
|
80
|
+
* - Escape key closes open dropdown menus
|
|
81
|
+
* - Enter/Space activates triggers and links
|
|
82
|
+
* - ARIA attributes for proper screen reader support
|
|
83
|
+
* - Focus management with automatic focus trapping in dropdowns
|
|
84
|
+
* - Semantic HTML structure for navigation landmarks
|
|
85
|
+
*
|
|
86
|
+
* @see {@link https://ui.shadcn.com/docs/components/navigation-menu} shadcn/ui Navigation Menu
|
|
87
|
+
* @see {@link https://www.radix-ui.com/primitives/docs/components/navigation-menu} Radix UI Navigation Menu
|
|
88
|
+
* @since 1.0.0
|
|
89
|
+
*/
|
|
90
|
+
/**
|
|
91
|
+
* Main NavigationMenu component props
|
|
92
|
+
*
|
|
93
|
+
* @param viewport - Whether to render the navigation viewport container. Defaults to true.
|
|
94
|
+
* Set to false for simpler dropdown styling without viewport positioning.
|
|
95
|
+
* @param className - Additional CSS classes to apply to the navigation menu root
|
|
96
|
+
* @param children - NavigationMenuList and NavigationMenuViewport components
|
|
97
|
+
*/
|
|
98
|
+
function NavigationMenu({
|
|
99
|
+
className,
|
|
100
|
+
children,
|
|
101
|
+
viewport = true,
|
|
102
|
+
...props
|
|
103
|
+
}: React.ComponentProps<typeof NavigationMenuPrimitive.Root> & {
|
|
104
|
+
/** Whether to render the navigation viewport container for dropdown positioning */
|
|
105
|
+
viewport?: boolean;
|
|
106
|
+
}) {
|
|
107
|
+
return (
|
|
108
|
+
<NavigationMenuPrimitive.Root
|
|
109
|
+
data-slot="navigation-menu"
|
|
110
|
+
data-viewport={viewport}
|
|
111
|
+
className={cn(
|
|
112
|
+
"group/navigation-menu relative flex max-w-max flex-1 items-center justify-center",
|
|
113
|
+
className,
|
|
114
|
+
)}
|
|
115
|
+
{...props}
|
|
116
|
+
>
|
|
117
|
+
{children}
|
|
118
|
+
{viewport && <NavigationMenuViewport />}
|
|
119
|
+
</NavigationMenuPrimitive.Root>
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* NavigationMenuList - Container for navigation menu items
|
|
125
|
+
*
|
|
126
|
+
* A horizontal list container that groups NavigationMenuItem components.
|
|
127
|
+
* Provides the foundational layout structure for the navigation menu.
|
|
128
|
+
*
|
|
129
|
+
* @component
|
|
130
|
+
* @example
|
|
131
|
+
* ```tsx
|
|
132
|
+
* <NavigationMenuList>
|
|
133
|
+
* <NavigationMenuItem>
|
|
134
|
+
* <NavigationMenuLink href="/home">Home</NavigationMenuLink>
|
|
135
|
+
* </NavigationMenuItem>
|
|
136
|
+
* <NavigationMenuItem>
|
|
137
|
+
* <NavigationMenuLink href="/about">About</NavigationMenuLink>
|
|
138
|
+
* </NavigationMenuItem>
|
|
139
|
+
* </NavigationMenuList>
|
|
140
|
+
* ```
|
|
141
|
+
*
|
|
142
|
+
* @param className - Additional CSS classes for styling
|
|
143
|
+
* @since 1.0.0
|
|
144
|
+
*/
|
|
145
|
+
function NavigationMenuList({
|
|
146
|
+
className,
|
|
147
|
+
...props
|
|
148
|
+
}: React.ComponentProps<typeof NavigationMenuPrimitive.List>) {
|
|
149
|
+
return (
|
|
150
|
+
<NavigationMenuPrimitive.List
|
|
151
|
+
data-slot="navigation-menu-list"
|
|
152
|
+
className={cn(
|
|
153
|
+
"group flex flex-1 list-none items-center justify-center gap-1",
|
|
154
|
+
className,
|
|
155
|
+
)}
|
|
156
|
+
{...props}
|
|
157
|
+
/>
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* NavigationMenuItem - Individual navigation menu item container
|
|
163
|
+
*
|
|
164
|
+
* Wraps a single navigation item, which can contain either:
|
|
165
|
+
* - A NavigationMenuTrigger with NavigationMenuContent for dropdowns
|
|
166
|
+
* - A NavigationMenuLink for direct navigation
|
|
167
|
+
*
|
|
168
|
+
* @component
|
|
169
|
+
* @example
|
|
170
|
+
* ```tsx
|
|
171
|
+
* // With dropdown content
|
|
172
|
+
* <NavigationMenuItem>
|
|
173
|
+
* <NavigationMenuTrigger>Products</NavigationMenuTrigger>
|
|
174
|
+
* <NavigationMenuContent>
|
|
175
|
+
* <NavigationMenuLink href="/products/all">All Products</NavigationMenuLink>
|
|
176
|
+
* </NavigationMenuContent>
|
|
177
|
+
* </NavigationMenuItem>
|
|
178
|
+
* ```
|
|
179
|
+
*
|
|
180
|
+
* @example
|
|
181
|
+
* ```tsx
|
|
182
|
+
* // Simple link
|
|
183
|
+
* <NavigationMenuItem>
|
|
184
|
+
* <NavigationMenuLink href="/contact">Contact</NavigationMenuLink>
|
|
185
|
+
* </NavigationMenuItem>
|
|
186
|
+
* ```
|
|
187
|
+
*
|
|
188
|
+
* @param className - Additional CSS classes for styling
|
|
189
|
+
* @since 1.0.0
|
|
190
|
+
*/
|
|
191
|
+
function NavigationMenuItem({
|
|
192
|
+
className,
|
|
193
|
+
...props
|
|
194
|
+
}: React.ComponentProps<typeof NavigationMenuPrimitive.Item>) {
|
|
195
|
+
return (
|
|
196
|
+
<NavigationMenuPrimitive.Item
|
|
197
|
+
data-slot="navigation-menu-item"
|
|
198
|
+
className={cn("relative", className)}
|
|
199
|
+
{...props}
|
|
200
|
+
/>
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const navigationMenuTriggerStyle = cva(
|
|
205
|
+
"group inline-flex h-9 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=open]:hover:bg-accent data-[state=open]:text-accent-foreground data-[state=open]:focus:bg-accent data-[state=open]:bg-accent/50 focus-visible:ring-ring/50 outline-none transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1",
|
|
206
|
+
);
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* NavigationMenuTrigger - Button that opens dropdown navigation content
|
|
210
|
+
*
|
|
211
|
+
* An interactive trigger button that displays NavigationMenuContent when activated.
|
|
212
|
+
* Features automatic chevron icon rotation and hover/focus states. Supports the
|
|
213
|
+
* asChild prop for custom button styling.
|
|
214
|
+
*
|
|
215
|
+
* @component
|
|
216
|
+
* @example
|
|
217
|
+
* ```tsx
|
|
218
|
+
* <NavigationMenuTrigger>Features</NavigationMenuTrigger>
|
|
219
|
+
* ```
|
|
220
|
+
*
|
|
221
|
+
* @example
|
|
222
|
+
* ```tsx
|
|
223
|
+
* // With custom button styling using asChild
|
|
224
|
+
* <NavigationMenuTrigger asChild>
|
|
225
|
+
* <Button variant="outline">Custom Trigger</Button>
|
|
226
|
+
* </NavigationMenuTrigger>
|
|
227
|
+
* ```
|
|
228
|
+
*
|
|
229
|
+
* @accessibility
|
|
230
|
+
* - Automatic ARIA expanded state management
|
|
231
|
+
* - Keyboard activation with Enter/Space keys
|
|
232
|
+
* - Focus visible indicator for keyboard navigation
|
|
233
|
+
* - Screen reader accessible button semantics
|
|
234
|
+
*
|
|
235
|
+
* @param className - Additional CSS classes for styling
|
|
236
|
+
* @param children - Button content (text, icons, etc.)
|
|
237
|
+
* @since 1.0.0
|
|
238
|
+
*/
|
|
239
|
+
function NavigationMenuTrigger({
|
|
240
|
+
className,
|
|
241
|
+
children,
|
|
242
|
+
...props
|
|
243
|
+
}: React.ComponentProps<typeof NavigationMenuPrimitive.Trigger>) {
|
|
244
|
+
return (
|
|
245
|
+
<NavigationMenuPrimitive.Trigger
|
|
246
|
+
data-slot="navigation-menu-trigger"
|
|
247
|
+
className={cn(navigationMenuTriggerStyle(), "group", className)}
|
|
248
|
+
{...props}
|
|
249
|
+
>
|
|
250
|
+
{children}{" "}
|
|
251
|
+
<ChevronDownIcon
|
|
252
|
+
className="relative top-[1px] ml-1 size-3 transition duration-300 group-data-[state=open]:rotate-180"
|
|
253
|
+
aria-hidden="true"
|
|
254
|
+
/>
|
|
255
|
+
</NavigationMenuPrimitive.Trigger>
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* NavigationMenuContent - Dropdown content panel for navigation menu
|
|
261
|
+
*
|
|
262
|
+
* The content container that appears when a NavigationMenuTrigger is activated.
|
|
263
|
+
* Supports enter/exit animations, responsive positioning, and flexible layouts.
|
|
264
|
+
* Can be styled differently based on the viewport prop setting.
|
|
265
|
+
*
|
|
266
|
+
* @component
|
|
267
|
+
* @example
|
|
268
|
+
* ```tsx
|
|
269
|
+
* <NavigationMenuContent>
|
|
270
|
+
* <div className="grid gap-3 p-6 w-[400px]">
|
|
271
|
+
* <NavigationMenuLink href="/feature1">Feature 1</NavigationMenuLink>
|
|
272
|
+
* <NavigationMenuLink href="/feature2">Feature 2</NavigationMenuLink>
|
|
273
|
+
* </div>
|
|
274
|
+
* </NavigationMenuContent>
|
|
275
|
+
* ```
|
|
276
|
+
*
|
|
277
|
+
* @example
|
|
278
|
+
* ```tsx
|
|
279
|
+
* // Complex layout with sections
|
|
280
|
+
* <NavigationMenuContent>
|
|
281
|
+
* <div className="grid gap-6 p-6 w-[600px] grid-cols-3">
|
|
282
|
+
* <div>
|
|
283
|
+
* <h4>Analytics</h4>
|
|
284
|
+
* <NavigationMenuLink href="/dashboard">Dashboard</NavigationMenuLink>
|
|
285
|
+
* </div>
|
|
286
|
+
* </div>
|
|
287
|
+
* </NavigationMenuContent>
|
|
288
|
+
* ```
|
|
289
|
+
*
|
|
290
|
+
* @accessibility
|
|
291
|
+
* - Automatic focus management when opened
|
|
292
|
+
* - Escape key support for closing
|
|
293
|
+
* - Proper ARIA labeling and relationships
|
|
294
|
+
*
|
|
295
|
+
* @param className - Additional CSS classes for styling
|
|
296
|
+
* @param children - Content to display in the dropdown (links, layouts, etc.)
|
|
297
|
+
* @since 1.0.0
|
|
298
|
+
*/
|
|
299
|
+
function NavigationMenuContent({
|
|
300
|
+
className,
|
|
301
|
+
...props
|
|
302
|
+
}: React.ComponentProps<typeof NavigationMenuPrimitive.Content>) {
|
|
303
|
+
return (
|
|
304
|
+
<NavigationMenuPrimitive.Content
|
|
305
|
+
data-slot="navigation-menu-content"
|
|
306
|
+
className={cn(
|
|
307
|
+
"data-[motion^=from-]:animate-in data-[motion^=to-]:animate-out data-[motion^=from-]:fade-in data-[motion^=to-]:fade-out data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 top-0 left-0 w-full p-2 pr-2.5 md:absolute md:w-auto",
|
|
308
|
+
"group-data-[viewport=false]/navigation-menu:bg-popover group-data-[viewport=false]/navigation-menu:text-popover-foreground group-data-[viewport=false]/navigation-menu:data-[state=open]:animate-in group-data-[viewport=false]/navigation-menu:data-[state=closed]:animate-out group-data-[viewport=false]/navigation-menu:data-[state=closed]:zoom-out-95 group-data-[viewport=false]/navigation-menu:data-[state=open]:zoom-in-95 group-data-[viewport=false]/navigation-menu:data-[state=open]:fade-in-0 group-data-[viewport=false]/navigation-menu:data-[state=closed]:fade-out-0 group-data-[viewport=false]/navigation-menu:top-full group-data-[viewport=false]/navigation-menu:mt-1.5 group-data-[viewport=false]/navigation-menu:overflow-hidden group-data-[viewport=false]/navigation-menu:rounded-md group-data-[viewport=false]/navigation-menu:border group-data-[viewport=false]/navigation-menu:shadow group-data-[viewport=false]/navigation-menu:duration-200 **:data-[slot=navigation-menu-link]:focus:ring-0 **:data-[slot=navigation-menu-link]:focus:outline-none",
|
|
309
|
+
className,
|
|
310
|
+
)}
|
|
311
|
+
{...props}
|
|
312
|
+
/>
|
|
313
|
+
);
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* NavigationMenuViewport - Viewport container for dropdown content positioning
|
|
318
|
+
*
|
|
319
|
+
* Manages the positioning, sizing, and animation of NavigationMenuContent panels.
|
|
320
|
+
* Automatically adjusts dimensions based on content size and provides smooth
|
|
321
|
+
* enter/exit animations. Only rendered when viewport prop is true on NavigationMenu.
|
|
322
|
+
*
|
|
323
|
+
* @component
|
|
324
|
+
* @internal This component is typically not used directly by consumers
|
|
325
|
+
*
|
|
326
|
+
* @accessibility
|
|
327
|
+
* - Handles focus containment for dropdown content
|
|
328
|
+
* - Manages viewport announcements for screen readers
|
|
329
|
+
*
|
|
330
|
+
* @param className - Additional CSS classes for styling
|
|
331
|
+
* @since 1.0.0
|
|
332
|
+
*/
|
|
333
|
+
function NavigationMenuViewport({
|
|
334
|
+
className,
|
|
335
|
+
...props
|
|
336
|
+
}: React.ComponentProps<typeof NavigationMenuPrimitive.Viewport>) {
|
|
337
|
+
return (
|
|
338
|
+
<div
|
|
339
|
+
className={cn(
|
|
340
|
+
"absolute top-full left-0 isolate z-50 flex justify-center",
|
|
341
|
+
)}
|
|
342
|
+
>
|
|
343
|
+
<NavigationMenuPrimitive.Viewport
|
|
344
|
+
data-slot="navigation-menu-viewport"
|
|
345
|
+
className={cn(
|
|
346
|
+
"origin-top-center bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-90 relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-md border shadow md:w-[var(--radix-navigation-menu-viewport-width)]",
|
|
347
|
+
className,
|
|
348
|
+
)}
|
|
349
|
+
{...props}
|
|
350
|
+
/>
|
|
351
|
+
</div>
|
|
352
|
+
);
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* NavigationMenuLink - Styled link component for navigation menus
|
|
357
|
+
*
|
|
358
|
+
* A link component designed specifically for navigation menus. Supports active
|
|
359
|
+
* states, hover effects, and the asChild pattern for framework integration.
|
|
360
|
+
* Can be used both within dropdown content and as direct navigation items.
|
|
361
|
+
*
|
|
362
|
+
* @component
|
|
363
|
+
* @example
|
|
364
|
+
* ```tsx
|
|
365
|
+
* // Direct navigation link
|
|
366
|
+
* <NavigationMenuLink href="/about">About Us</NavigationMenuLink>
|
|
367
|
+
* ```
|
|
368
|
+
*
|
|
369
|
+
* @example
|
|
370
|
+
* ```tsx
|
|
371
|
+
* // With Next.js Link using asChild
|
|
372
|
+
* <NavigationMenuLink asChild>
|
|
373
|
+
* <Link href="/products">Products</Link>
|
|
374
|
+
* </NavigationMenuLink>
|
|
375
|
+
* ```
|
|
376
|
+
*
|
|
377
|
+
* @example
|
|
378
|
+
* ```tsx
|
|
379
|
+
* // In dropdown content with description
|
|
380
|
+
* <NavigationMenuLink href="/analytics">
|
|
381
|
+
* <div className="text-sm font-medium">Analytics</div>
|
|
382
|
+
* <p className="text-sm text-muted-foreground">View your data insights</p>
|
|
383
|
+
* </NavigationMenuLink>
|
|
384
|
+
* ```
|
|
385
|
+
*
|
|
386
|
+
* @example
|
|
387
|
+
* ```tsx
|
|
388
|
+
* // With trigger styling for direct navigation
|
|
389
|
+
* <NavigationMenuLink href="/docs" className={navigationMenuTriggerStyle()}>
|
|
390
|
+
* Documentation
|
|
391
|
+
* </NavigationMenuLink>
|
|
392
|
+
* ```
|
|
393
|
+
*
|
|
394
|
+
* @accessibility
|
|
395
|
+
* - Focus visible ring for keyboard navigation
|
|
396
|
+
* - Active state styling for current page indication
|
|
397
|
+
* - Proper link semantics and ARIA attributes
|
|
398
|
+
* - Keyboard activation support (Enter key)
|
|
399
|
+
* - Screen reader compatible text content
|
|
400
|
+
*
|
|
401
|
+
* @param className - Additional CSS classes for styling
|
|
402
|
+
* @param children - Link content (text, elements, descriptions)
|
|
403
|
+
* @since 1.0.0
|
|
404
|
+
*/
|
|
405
|
+
function NavigationMenuLink({
|
|
406
|
+
className,
|
|
407
|
+
...props
|
|
408
|
+
}: React.ComponentProps<typeof NavigationMenuPrimitive.Link>) {
|
|
409
|
+
return (
|
|
410
|
+
<NavigationMenuPrimitive.Link
|
|
411
|
+
data-slot="navigation-menu-link"
|
|
412
|
+
className={cn(
|
|
413
|
+
"data-[active=true]:focus:bg-accent data-[active=true]:hover:bg-accent data-[active=true]:bg-accent/50 data-[active=true]:text-accent-foreground hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus-visible:ring-ring/50 [&_svg:not([class*='text-'])]:text-muted-foreground flex flex-col gap-1 rounded-sm p-2 text-sm transition-all outline-none focus-visible:ring-[3px] focus-visible:outline-1 [&_svg:not([class*='size-'])]:size-4",
|
|
414
|
+
className,
|
|
415
|
+
)}
|
|
416
|
+
{...props}
|
|
417
|
+
/>
|
|
418
|
+
);
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
/**
|
|
422
|
+
* NavigationMenuIndicator - Visual indicator for active menu item
|
|
423
|
+
*
|
|
424
|
+
* Displays an animated arrow indicator that points to the currently active
|
|
425
|
+
* or hovered navigation menu item. Automatically transitions between positions
|
|
426
|
+
* as users navigate through menu items, providing visual feedback.
|
|
427
|
+
*
|
|
428
|
+
* @component
|
|
429
|
+
* @example
|
|
430
|
+
* ```tsx
|
|
431
|
+
* // Typically used automatically, but can be customized
|
|
432
|
+
* <NavigationMenuIndicator className="custom-indicator-styles" />
|
|
433
|
+
* ```
|
|
434
|
+
*
|
|
435
|
+
* @accessibility
|
|
436
|
+
* - Purely decorative visual element
|
|
437
|
+
* - Does not interfere with screen reader navigation
|
|
438
|
+
* - Hidden from assistive technologies (aria-hidden)
|
|
439
|
+
*
|
|
440
|
+
* @param className - Additional CSS classes for custom indicator styling
|
|
441
|
+
* @since 1.0.0
|
|
442
|
+
*/
|
|
443
|
+
function NavigationMenuIndicator({
|
|
444
|
+
className,
|
|
445
|
+
...props
|
|
446
|
+
}: React.ComponentProps<typeof NavigationMenuPrimitive.Indicator>) {
|
|
447
|
+
return (
|
|
448
|
+
<NavigationMenuPrimitive.Indicator
|
|
449
|
+
data-slot="navigation-menu-indicator"
|
|
450
|
+
className={cn(
|
|
451
|
+
"data-[state=visible]:animate-in data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:fade-in top-full z-[1] flex h-1.5 items-end justify-center overflow-hidden",
|
|
452
|
+
className,
|
|
453
|
+
)}
|
|
454
|
+
{...props}
|
|
455
|
+
>
|
|
456
|
+
<div className="bg-border relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm shadow-md" />
|
|
457
|
+
</NavigationMenuPrimitive.Indicator>
|
|
458
|
+
);
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
export {
|
|
462
|
+
NavigationMenu,
|
|
463
|
+
NavigationMenuList,
|
|
464
|
+
NavigationMenuItem,
|
|
465
|
+
NavigationMenuContent,
|
|
466
|
+
NavigationMenuTrigger,
|
|
467
|
+
NavigationMenuLink,
|
|
468
|
+
NavigationMenuIndicator,
|
|
469
|
+
NavigationMenuViewport,
|
|
470
|
+
navigationMenuTriggerStyle,
|
|
471
|
+
};
|