@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,250 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react-vite";
|
|
2
|
+
import { Container } from "../container";
|
|
3
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../card";
|
|
4
|
+
|
|
5
|
+
const meta = {
|
|
6
|
+
title: "Layout and Structure/Container",
|
|
7
|
+
component: Container,
|
|
8
|
+
parameters: {
|
|
9
|
+
layout: "fullscreen",
|
|
10
|
+
docs: {
|
|
11
|
+
description: {
|
|
12
|
+
component:
|
|
13
|
+
"A responsive container component that provides consistent max-width and padding across different screen sizes. Perfect for constraining content width and maintaining readable line lengths.",
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
tags: ["autodocs"],
|
|
18
|
+
argTypes: {
|
|
19
|
+
size: {
|
|
20
|
+
control: { type: "select" },
|
|
21
|
+
options: ["sm", "md", "lg", "xl", "full"],
|
|
22
|
+
description: "Maximum width preset: sm (3xl), md (5xl), lg (7xl), xl (none), full (full)",
|
|
23
|
+
defaultValue: "lg",
|
|
24
|
+
},
|
|
25
|
+
className: {
|
|
26
|
+
control: { type: "text" },
|
|
27
|
+
description: "Additional CSS classes to apply to the container",
|
|
28
|
+
},
|
|
29
|
+
children: {
|
|
30
|
+
control: false,
|
|
31
|
+
description: "Content to be rendered inside the container",
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
} satisfies Meta<typeof Container>;
|
|
35
|
+
|
|
36
|
+
export default meta;
|
|
37
|
+
type Story = StoryObj<typeof meta>;
|
|
38
|
+
|
|
39
|
+
export const Interactive: Story = {
|
|
40
|
+
args: {
|
|
41
|
+
size: "lg",
|
|
42
|
+
className: "",
|
|
43
|
+
children: (
|
|
44
|
+
<div className="py-12">
|
|
45
|
+
<h1 className="text-3xl font-bold mb-4">Interactive Container</h1>
|
|
46
|
+
<p className="text-muted-foreground">
|
|
47
|
+
Use the controls below to test different container sizes and see how they affect
|
|
48
|
+
max-width constraints. The container automatically centers content and applies
|
|
49
|
+
responsive horizontal padding (px-4 on mobile, px-6 on small screens, px-8 on large screens).
|
|
50
|
+
</p>
|
|
51
|
+
<div className="mt-6 p-4 bg-muted rounded-lg">
|
|
52
|
+
<p className="text-sm text-muted-foreground">
|
|
53
|
+
This gray box helps visualize the container boundaries. Try different sizes
|
|
54
|
+
and resize your browser to see the responsive behavior.
|
|
55
|
+
</p>
|
|
56
|
+
</div>
|
|
57
|
+
</div>
|
|
58
|
+
),
|
|
59
|
+
},
|
|
60
|
+
parameters: {
|
|
61
|
+
docs: {
|
|
62
|
+
description: {
|
|
63
|
+
story:
|
|
64
|
+
"Interactive playground to test all container props and variants using Storybook controls.",
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
export const Variants: Story = {
|
|
71
|
+
render: () => (
|
|
72
|
+
<div className="space-y-8">
|
|
73
|
+
<div className="bg-red-50 dark:bg-red-950/20">
|
|
74
|
+
<Container size="sm">
|
|
75
|
+
<div className="py-6 text-center">
|
|
76
|
+
<h3 className="font-semibold mb-2">Small (max-w-3xl / 48rem)</h3>
|
|
77
|
+
<p className="text-sm text-muted-foreground">
|
|
78
|
+
Optimal for reading content, articles, and blog posts
|
|
79
|
+
</p>
|
|
80
|
+
</div>
|
|
81
|
+
</Container>
|
|
82
|
+
</div>
|
|
83
|
+
<div className="bg-orange-50 dark:bg-orange-950/20">
|
|
84
|
+
<Container size="md">
|
|
85
|
+
<div className="py-6 text-center">
|
|
86
|
+
<h3 className="font-semibold mb-2">Medium (max-w-5xl / 64rem)</h3>
|
|
87
|
+
<p className="text-sm text-muted-foreground">
|
|
88
|
+
Suitable for forms, documentation, and medium-width layouts
|
|
89
|
+
</p>
|
|
90
|
+
</div>
|
|
91
|
+
</Container>
|
|
92
|
+
</div>
|
|
93
|
+
<div className="bg-green-50 dark:bg-green-950/20">
|
|
94
|
+
<Container size="lg">
|
|
95
|
+
<div className="py-6 text-center">
|
|
96
|
+
<h3 className="font-semibold mb-2">Large (max-w-7xl / 80rem) - Default</h3>
|
|
97
|
+
<p className="text-sm text-muted-foreground">
|
|
98
|
+
Ideal for main application content and dashboards
|
|
99
|
+
</p>
|
|
100
|
+
</div>
|
|
101
|
+
</Container>
|
|
102
|
+
</div>
|
|
103
|
+
<div className="bg-blue-50 dark:bg-blue-950/20">
|
|
104
|
+
<Container size="xl">
|
|
105
|
+
<div className="py-6 text-center">
|
|
106
|
+
<h3 className="font-semibold mb-2">Extra Large (max-w-none)</h3>
|
|
107
|
+
<p className="text-sm text-muted-foreground">
|
|
108
|
+
No max-width constraint but maintains responsive padding
|
|
109
|
+
</p>
|
|
110
|
+
</div>
|
|
111
|
+
</Container>
|
|
112
|
+
</div>
|
|
113
|
+
<div className="bg-purple-50 dark:bg-purple-950/20">
|
|
114
|
+
<Container size="full">
|
|
115
|
+
<div className="py-6 text-center">
|
|
116
|
+
<h3 className="font-semibold mb-2">Full Width (max-w-full)</h3>
|
|
117
|
+
<p className="text-sm text-muted-foreground">
|
|
118
|
+
Full width container for edge-to-edge designs
|
|
119
|
+
</p>
|
|
120
|
+
</div>
|
|
121
|
+
</Container>
|
|
122
|
+
</div>
|
|
123
|
+
</div>
|
|
124
|
+
),
|
|
125
|
+
parameters: {
|
|
126
|
+
docs: {
|
|
127
|
+
description: {
|
|
128
|
+
story:
|
|
129
|
+
"Visual showcase of all container size variants with color-coded backgrounds to illustrate different max-width constraints.",
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
export const InContext: Story = {
|
|
136
|
+
render: () => (
|
|
137
|
+
<div className="min-h-screen bg-background">
|
|
138
|
+
{/* Header with navigation */}
|
|
139
|
+
<header className="border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60 sticky top-0 z-50">
|
|
140
|
+
<Container>
|
|
141
|
+
<div className="flex h-16 items-center justify-between">
|
|
142
|
+
<div className="flex items-center gap-2">
|
|
143
|
+
<div className="h-8 w-8 bg-primary rounded-lg" />
|
|
144
|
+
<h1 className="text-xl font-semibold">Neynar App</h1>
|
|
145
|
+
</div>
|
|
146
|
+
<nav className="flex gap-6">
|
|
147
|
+
<a href="#" className="text-sm text-muted-foreground hover:text-foreground transition-colors">
|
|
148
|
+
Dashboard
|
|
149
|
+
</a>
|
|
150
|
+
<a href="#" className="text-sm text-muted-foreground hover:text-foreground transition-colors">
|
|
151
|
+
Analytics
|
|
152
|
+
</a>
|
|
153
|
+
<a href="#" className="text-sm text-muted-foreground hover:text-foreground transition-colors">
|
|
154
|
+
Settings
|
|
155
|
+
</a>
|
|
156
|
+
</nav>
|
|
157
|
+
</div>
|
|
158
|
+
</Container>
|
|
159
|
+
</header>
|
|
160
|
+
|
|
161
|
+
{/* Hero section with narrow container for readability */}
|
|
162
|
+
<section className="py-16 bg-gradient-to-b from-muted/50">
|
|
163
|
+
<Container size="md">
|
|
164
|
+
<div className="text-center space-y-4">
|
|
165
|
+
<h2 className="text-4xl font-bold tracking-tight">Welcome to Your Dashboard</h2>
|
|
166
|
+
<p className="text-xl text-muted-foreground max-w-2xl mx-auto">
|
|
167
|
+
This example demonstrates how containers work in real-world applications,
|
|
168
|
+
providing consistent layouts across different content sections.
|
|
169
|
+
</p>
|
|
170
|
+
</div>
|
|
171
|
+
</Container>
|
|
172
|
+
</section>
|
|
173
|
+
|
|
174
|
+
{/* Main content with default container */}
|
|
175
|
+
<section className="py-12">
|
|
176
|
+
<Container>
|
|
177
|
+
<div className="grid gap-6 md:grid-cols-3">
|
|
178
|
+
<Card>
|
|
179
|
+
<CardHeader>
|
|
180
|
+
<CardTitle>Total Users</CardTitle>
|
|
181
|
+
<CardDescription>Active users this month</CardDescription>
|
|
182
|
+
</CardHeader>
|
|
183
|
+
<CardContent>
|
|
184
|
+
<div className="text-2xl font-bold">12,345</div>
|
|
185
|
+
<p className="text-xs text-muted-foreground">+20.1% from last month</p>
|
|
186
|
+
</CardContent>
|
|
187
|
+
</Card>
|
|
188
|
+
<Card>
|
|
189
|
+
<CardHeader>
|
|
190
|
+
<CardTitle>Revenue</CardTitle>
|
|
191
|
+
<CardDescription>Total revenue this month</CardDescription>
|
|
192
|
+
</CardHeader>
|
|
193
|
+
<CardContent>
|
|
194
|
+
<div className="text-2xl font-bold">$45,231.89</div>
|
|
195
|
+
<p className="text-xs text-muted-foreground">+15.2% from last month</p>
|
|
196
|
+
</CardContent>
|
|
197
|
+
</Card>
|
|
198
|
+
<Card>
|
|
199
|
+
<CardHeader>
|
|
200
|
+
<CardTitle>Growth Rate</CardTitle>
|
|
201
|
+
<CardDescription>Month over month growth</CardDescription>
|
|
202
|
+
</CardHeader>
|
|
203
|
+
<CardContent>
|
|
204
|
+
<div className="text-2xl font-bold">+12.5%</div>
|
|
205
|
+
<p className="text-xs text-muted-foreground">+2.1% from last month</p>
|
|
206
|
+
</CardContent>
|
|
207
|
+
</Card>
|
|
208
|
+
</div>
|
|
209
|
+
</Container>
|
|
210
|
+
</section>
|
|
211
|
+
|
|
212
|
+
{/* Article section with small container for optimal reading */}
|
|
213
|
+
<section className="py-12 bg-muted/30">
|
|
214
|
+
<Container size="sm">
|
|
215
|
+
<article className="prose prose-gray dark:prose-invert max-w-none">
|
|
216
|
+
<h3 className="text-2xl font-bold mb-4">Recent Updates</h3>
|
|
217
|
+
<p className="text-muted-foreground leading-7">
|
|
218
|
+
This section uses a small container to create optimal line lengths for reading.
|
|
219
|
+
Research shows that lines between 45-75 characters are easiest to read, which
|
|
220
|
+
is exactly what the small container size provides.
|
|
221
|
+
</p>
|
|
222
|
+
<p className="text-muted-foreground leading-7">
|
|
223
|
+
Notice how the content feels more comfortable to read compared to the full-width
|
|
224
|
+
sections above. This demonstrates the importance of choosing the right container
|
|
225
|
+
size for your content type.
|
|
226
|
+
</p>
|
|
227
|
+
</article>
|
|
228
|
+
</Container>
|
|
229
|
+
</section>
|
|
230
|
+
|
|
231
|
+
{/* Footer with full container */}
|
|
232
|
+
<footer className="border-t bg-muted/50">
|
|
233
|
+
<Container>
|
|
234
|
+
<div className="py-8 text-center text-sm text-muted-foreground">
|
|
235
|
+
<p>© 2025 Neynar. Built with Container components for consistent layouts.</p>
|
|
236
|
+
</div>
|
|
237
|
+
</Container>
|
|
238
|
+
</footer>
|
|
239
|
+
</div>
|
|
240
|
+
),
|
|
241
|
+
parameters: {
|
|
242
|
+
layout: "fullscreen",
|
|
243
|
+
docs: {
|
|
244
|
+
description: {
|
|
245
|
+
story:
|
|
246
|
+
"Real-world application example showing how different container sizes work together in a complete page layout. Notice how different sections use appropriate container sizes for their content type.",
|
|
247
|
+
},
|
|
248
|
+
},
|
|
249
|
+
},
|
|
250
|
+
};
|
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react-vite";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import {
|
|
4
|
+
Copy,
|
|
5
|
+
Edit,
|
|
6
|
+
Trash2,
|
|
7
|
+
Download,
|
|
8
|
+
Share2,
|
|
9
|
+
Star,
|
|
10
|
+
ExternalLink,
|
|
11
|
+
Settings,
|
|
12
|
+
User,
|
|
13
|
+
Mail,
|
|
14
|
+
FileText,
|
|
15
|
+
Image,
|
|
16
|
+
Archive,
|
|
17
|
+
Folder,
|
|
18
|
+
} from "lucide-react";
|
|
19
|
+
import {
|
|
20
|
+
ContextMenu,
|
|
21
|
+
ContextMenuContent,
|
|
22
|
+
ContextMenuItem,
|
|
23
|
+
ContextMenuLabel,
|
|
24
|
+
ContextMenuPortal,
|
|
25
|
+
ContextMenuSeparator,
|
|
26
|
+
ContextMenuShortcut,
|
|
27
|
+
ContextMenuSub,
|
|
28
|
+
ContextMenuSubContent,
|
|
29
|
+
ContextMenuSubTrigger,
|
|
30
|
+
ContextMenuTrigger,
|
|
31
|
+
ContextMenuCheckboxItem,
|
|
32
|
+
ContextMenuRadioGroup,
|
|
33
|
+
ContextMenuRadioItem,
|
|
34
|
+
} from "../context-menu";
|
|
35
|
+
|
|
36
|
+
const meta = {
|
|
37
|
+
title: "Navigation & Menus/ContextMenu",
|
|
38
|
+
component: ContextMenu,
|
|
39
|
+
parameters: {
|
|
40
|
+
layout: "centered",
|
|
41
|
+
docs: {
|
|
42
|
+
description: {
|
|
43
|
+
component:
|
|
44
|
+
"A contextual menu component built on Radix UI primitives. Displays contextual actions when right-clicking on elements. Supports sub-menus, checkboxes, radio groups, keyboard shortcuts, and custom variants for different action types.",
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
tags: ["autodocs"],
|
|
49
|
+
argTypes: {
|
|
50
|
+
// Root component props are primarily event handlers from Radix
|
|
51
|
+
onOpenChange: {
|
|
52
|
+
description: "Callback fired when the menu open state changes",
|
|
53
|
+
control: false,
|
|
54
|
+
},
|
|
55
|
+
modal: {
|
|
56
|
+
description: "Whether the menu is modal",
|
|
57
|
+
control: "boolean",
|
|
58
|
+
defaultValue: true,
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
} satisfies Meta<typeof ContextMenu>;
|
|
62
|
+
|
|
63
|
+
export default meta;
|
|
64
|
+
type Story = StoryObj<typeof meta>;
|
|
65
|
+
|
|
66
|
+
export const Interactive: Story = {
|
|
67
|
+
args: {
|
|
68
|
+
modal: true,
|
|
69
|
+
},
|
|
70
|
+
render: (args) => {
|
|
71
|
+
const [showAdvanced, setShowAdvanced] = React.useState(false);
|
|
72
|
+
const [showGrid, setShowGrid] = React.useState(true);
|
|
73
|
+
const [theme, setTheme] = React.useState("light");
|
|
74
|
+
|
|
75
|
+
return (
|
|
76
|
+
<div className="flex h-[300px] w-[400px] items-center justify-center rounded-md border border-dashed text-sm">
|
|
77
|
+
<ContextMenu {...args}>
|
|
78
|
+
<ContextMenuTrigger className="flex h-full w-full items-center justify-center">
|
|
79
|
+
Right-click for interactive menu
|
|
80
|
+
</ContextMenuTrigger>
|
|
81
|
+
<ContextMenuContent className="w-64">
|
|
82
|
+
<ContextMenuLabel>File Actions</ContextMenuLabel>
|
|
83
|
+
<ContextMenuSeparator />
|
|
84
|
+
<ContextMenuItem>
|
|
85
|
+
<Edit className="mr-2 h-4 w-4" />
|
|
86
|
+
Edit
|
|
87
|
+
<ContextMenuShortcut>⌘E</ContextMenuShortcut>
|
|
88
|
+
</ContextMenuItem>
|
|
89
|
+
<ContextMenuItem>
|
|
90
|
+
<Copy className="mr-2 h-4 w-4" />
|
|
91
|
+
Copy
|
|
92
|
+
<ContextMenuShortcut>⌘C</ContextMenuShortcut>
|
|
93
|
+
</ContextMenuItem>
|
|
94
|
+
<ContextMenuSub>
|
|
95
|
+
<ContextMenuSubTrigger>
|
|
96
|
+
<Share2 className="mr-2 h-4 w-4" />
|
|
97
|
+
Share
|
|
98
|
+
</ContextMenuSubTrigger>
|
|
99
|
+
<ContextMenuPortal>
|
|
100
|
+
<ContextMenuSubContent>
|
|
101
|
+
<ContextMenuItem>
|
|
102
|
+
<Mail className="mr-2 h-4 w-4" />
|
|
103
|
+
Email
|
|
104
|
+
</ContextMenuItem>
|
|
105
|
+
<ContextMenuItem>
|
|
106
|
+
<ExternalLink className="mr-2 h-4 w-4" />
|
|
107
|
+
Copy Link
|
|
108
|
+
</ContextMenuItem>
|
|
109
|
+
</ContextMenuSubContent>
|
|
110
|
+
</ContextMenuPortal>
|
|
111
|
+
</ContextMenuSub>
|
|
112
|
+
<ContextMenuSeparator />
|
|
113
|
+
|
|
114
|
+
<ContextMenuLabel>View Options</ContextMenuLabel>
|
|
115
|
+
<ContextMenuSeparator />
|
|
116
|
+
<ContextMenuCheckboxItem
|
|
117
|
+
checked={showGrid}
|
|
118
|
+
onCheckedChange={setShowGrid}
|
|
119
|
+
>
|
|
120
|
+
Show Grid
|
|
121
|
+
</ContextMenuCheckboxItem>
|
|
122
|
+
<ContextMenuCheckboxItem
|
|
123
|
+
checked={showAdvanced}
|
|
124
|
+
onCheckedChange={setShowAdvanced}
|
|
125
|
+
>
|
|
126
|
+
Advanced Mode
|
|
127
|
+
</ContextMenuCheckboxItem>
|
|
128
|
+
|
|
129
|
+
<ContextMenuSeparator />
|
|
130
|
+
<ContextMenuSub>
|
|
131
|
+
<ContextMenuSubTrigger>
|
|
132
|
+
<Settings className="mr-2 h-4 w-4" />
|
|
133
|
+
Theme
|
|
134
|
+
</ContextMenuSubTrigger>
|
|
135
|
+
<ContextMenuPortal>
|
|
136
|
+
<ContextMenuSubContent>
|
|
137
|
+
<ContextMenuRadioGroup value={theme} onValueChange={setTheme}>
|
|
138
|
+
<ContextMenuRadioItem value="light">
|
|
139
|
+
Light
|
|
140
|
+
</ContextMenuRadioItem>
|
|
141
|
+
<ContextMenuRadioItem value="dark">
|
|
142
|
+
Dark
|
|
143
|
+
</ContextMenuRadioItem>
|
|
144
|
+
<ContextMenuRadioItem value="system">
|
|
145
|
+
System
|
|
146
|
+
</ContextMenuRadioItem>
|
|
147
|
+
</ContextMenuRadioGroup>
|
|
148
|
+
</ContextMenuSubContent>
|
|
149
|
+
</ContextMenuPortal>
|
|
150
|
+
</ContextMenuSub>
|
|
151
|
+
|
|
152
|
+
<ContextMenuSeparator />
|
|
153
|
+
<ContextMenuItem variant="destructive">
|
|
154
|
+
<Trash2 className="mr-2 h-4 w-4" />
|
|
155
|
+
Delete
|
|
156
|
+
<ContextMenuShortcut>⌘⌫</ContextMenuShortcut>
|
|
157
|
+
</ContextMenuItem>
|
|
158
|
+
</ContextMenuContent>
|
|
159
|
+
</ContextMenu>
|
|
160
|
+
</div>
|
|
161
|
+
);
|
|
162
|
+
},
|
|
163
|
+
parameters: {
|
|
164
|
+
docs: {
|
|
165
|
+
description: {
|
|
166
|
+
story:
|
|
167
|
+
"Interactive playground showcasing all context menu features: basic items, sub-menus, checkboxes, radio groups, shortcuts, variants, and proper grouping with labels and separators.",
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
},
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
export const Variants: Story = {
|
|
174
|
+
render: () => (
|
|
175
|
+
<div className="grid grid-cols-2 gap-6">
|
|
176
|
+
{/* Basic menu items with variants */}
|
|
177
|
+
<div className="space-y-2">
|
|
178
|
+
<h3 className="text-sm font-semibold">Menu Item Variants</h3>
|
|
179
|
+
<ContextMenu>
|
|
180
|
+
<ContextMenuTrigger className="flex h-[120px] w-full items-center justify-center rounded-md border border-dashed bg-muted/50 text-sm">
|
|
181
|
+
Basic Items
|
|
182
|
+
</ContextMenuTrigger>
|
|
183
|
+
<ContextMenuContent>
|
|
184
|
+
<ContextMenuItem>
|
|
185
|
+
<Edit className="mr-2 h-4 w-4" />
|
|
186
|
+
Default Item
|
|
187
|
+
</ContextMenuItem>
|
|
188
|
+
<ContextMenuItem variant="destructive">
|
|
189
|
+
<Trash2 className="mr-2 h-4 w-4" />
|
|
190
|
+
Destructive Item
|
|
191
|
+
</ContextMenuItem>
|
|
192
|
+
<ContextMenuItem disabled>
|
|
193
|
+
<Settings className="mr-2 h-4 w-4" />
|
|
194
|
+
Disabled Item
|
|
195
|
+
</ContextMenuItem>
|
|
196
|
+
</ContextMenuContent>
|
|
197
|
+
</ContextMenu>
|
|
198
|
+
</div>
|
|
199
|
+
|
|
200
|
+
{/* Inset alignment */}
|
|
201
|
+
<div className="space-y-2">
|
|
202
|
+
<h3 className="text-sm font-semibold">Inset Alignment</h3>
|
|
203
|
+
<ContextMenu>
|
|
204
|
+
<ContextMenuTrigger className="flex h-[120px] w-full items-center justify-center rounded-md border border-dashed bg-muted/50 text-sm">
|
|
205
|
+
Inset Items
|
|
206
|
+
</ContextMenuTrigger>
|
|
207
|
+
<ContextMenuContent>
|
|
208
|
+
<ContextMenuLabel inset>With Icons</ContextMenuLabel>
|
|
209
|
+
<ContextMenuItem>
|
|
210
|
+
<User className="mr-2 h-4 w-4" />
|
|
211
|
+
Has Icon
|
|
212
|
+
</ContextMenuItem>
|
|
213
|
+
<ContextMenuItem inset>No Icon (Inset)</ContextMenuItem>
|
|
214
|
+
<ContextMenuSubTrigger inset>
|
|
215
|
+
Sub-menu (Inset)
|
|
216
|
+
</ContextMenuSubTrigger>
|
|
217
|
+
</ContextMenuContent>
|
|
218
|
+
</ContextMenu>
|
|
219
|
+
</div>
|
|
220
|
+
|
|
221
|
+
{/* Checkbox states */}
|
|
222
|
+
<div className="space-y-2">
|
|
223
|
+
<h3 className="text-sm font-semibold">Checkbox Items</h3>
|
|
224
|
+
<ContextMenu>
|
|
225
|
+
<ContextMenuTrigger className="flex h-[120px] w-full items-center justify-center rounded-md border border-dashed bg-muted/50 text-sm">
|
|
226
|
+
Checkboxes
|
|
227
|
+
</ContextMenuTrigger>
|
|
228
|
+
<ContextMenuContent>
|
|
229
|
+
<ContextMenuCheckboxItem checked={true}>
|
|
230
|
+
Checked Item
|
|
231
|
+
</ContextMenuCheckboxItem>
|
|
232
|
+
<ContextMenuCheckboxItem checked={false}>
|
|
233
|
+
Unchecked Item
|
|
234
|
+
</ContextMenuCheckboxItem>
|
|
235
|
+
<ContextMenuCheckboxItem checked={true} disabled>
|
|
236
|
+
Disabled Checked
|
|
237
|
+
</ContextMenuCheckboxItem>
|
|
238
|
+
</ContextMenuContent>
|
|
239
|
+
</ContextMenu>
|
|
240
|
+
</div>
|
|
241
|
+
|
|
242
|
+
{/* Radio group */}
|
|
243
|
+
<div className="space-y-2">
|
|
244
|
+
<h3 className="text-sm font-semibold">Radio Groups</h3>
|
|
245
|
+
<ContextMenu>
|
|
246
|
+
<ContextMenuTrigger className="flex h-[120px] w-full items-center justify-center rounded-md border border-dashed bg-muted/50 text-sm">
|
|
247
|
+
Radio Options
|
|
248
|
+
</ContextMenuTrigger>
|
|
249
|
+
<ContextMenuContent>
|
|
250
|
+
<ContextMenuRadioGroup value="option2">
|
|
251
|
+
<ContextMenuRadioItem value="option1">
|
|
252
|
+
Option 1
|
|
253
|
+
</ContextMenuRadioItem>
|
|
254
|
+
<ContextMenuRadioItem value="option2">
|
|
255
|
+
Option 2 (Selected)
|
|
256
|
+
</ContextMenuRadioItem>
|
|
257
|
+
<ContextMenuRadioItem value="option3">
|
|
258
|
+
Option 3
|
|
259
|
+
</ContextMenuRadioItem>
|
|
260
|
+
</ContextMenuRadioGroup>
|
|
261
|
+
</ContextMenuContent>
|
|
262
|
+
</ContextMenu>
|
|
263
|
+
</div>
|
|
264
|
+
</div>
|
|
265
|
+
),
|
|
266
|
+
parameters: {
|
|
267
|
+
docs: {
|
|
268
|
+
description: {
|
|
269
|
+
story:
|
|
270
|
+
"Comprehensive showcase of all context menu variants: default and destructive items, disabled states, inset alignment for mixed icon usage, checkbox states, and radio group selections.",
|
|
271
|
+
},
|
|
272
|
+
},
|
|
273
|
+
},
|
|
274
|
+
};
|
|
275
|
+
|
|
276
|
+
export const InContext: Story = {
|
|
277
|
+
render: () => (
|
|
278
|
+
<div className="space-y-6">
|
|
279
|
+
<div className="text-center">
|
|
280
|
+
<h2 className="text-lg font-semibold mb-2">File Manager Interface</h2>
|
|
281
|
+
<p className="text-sm text-muted-foreground">
|
|
282
|
+
Right-click on any file for contextual actions
|
|
283
|
+
</p>
|
|
284
|
+
</div>
|
|
285
|
+
|
|
286
|
+
<div className="grid grid-cols-3 gap-4">
|
|
287
|
+
{/* Document file */}
|
|
288
|
+
<div className="space-y-2">
|
|
289
|
+
<ContextMenu>
|
|
290
|
+
<ContextMenuTrigger className="group flex h-[100px] w-full flex-col items-center justify-center rounded-lg border-2 border-dashed border-border bg-background transition-colors hover:bg-muted/50">
|
|
291
|
+
<FileText className="h-8 w-8 text-blue-500 mb-2" />
|
|
292
|
+
<span className="text-xs font-medium">document.pdf</span>
|
|
293
|
+
<span className="text-xs text-muted-foreground">2.4 MB</span>
|
|
294
|
+
</ContextMenuTrigger>
|
|
295
|
+
<ContextMenuContent>
|
|
296
|
+
<ContextMenuItem>
|
|
297
|
+
<ExternalLink className="mr-2 h-4 w-4" />
|
|
298
|
+
Open
|
|
299
|
+
</ContextMenuItem>
|
|
300
|
+
<ContextMenuItem>
|
|
301
|
+
<Edit className="mr-2 h-4 w-4" />
|
|
302
|
+
Rename
|
|
303
|
+
</ContextMenuItem>
|
|
304
|
+
<ContextMenuSeparator />
|
|
305
|
+
<ContextMenuItem>
|
|
306
|
+
<Copy className="mr-2 h-4 w-4" />
|
|
307
|
+
Copy
|
|
308
|
+
</ContextMenuItem>
|
|
309
|
+
<ContextMenuSub>
|
|
310
|
+
<ContextMenuSubTrigger>
|
|
311
|
+
<Share2 className="mr-2 h-4 w-4" />
|
|
312
|
+
Share
|
|
313
|
+
</ContextMenuSubTrigger>
|
|
314
|
+
<ContextMenuPortal>
|
|
315
|
+
<ContextMenuSubContent>
|
|
316
|
+
<ContextMenuItem>
|
|
317
|
+
<Mail className="mr-2 h-4 w-4" />
|
|
318
|
+
Email
|
|
319
|
+
</ContextMenuItem>
|
|
320
|
+
<ContextMenuItem>
|
|
321
|
+
<ExternalLink className="mr-2 h-4 w-4" />
|
|
322
|
+
Copy Link
|
|
323
|
+
</ContextMenuItem>
|
|
324
|
+
</ContextMenuSubContent>
|
|
325
|
+
</ContextMenuPortal>
|
|
326
|
+
</ContextMenuSub>
|
|
327
|
+
<ContextMenuSeparator />
|
|
328
|
+
<ContextMenuItem>
|
|
329
|
+
<Star className="mr-2 h-4 w-4" />
|
|
330
|
+
Add to Favorites
|
|
331
|
+
</ContextMenuItem>
|
|
332
|
+
<ContextMenuItem>
|
|
333
|
+
<Archive className="mr-2 h-4 w-4" />
|
|
334
|
+
Compress
|
|
335
|
+
</ContextMenuItem>
|
|
336
|
+
<ContextMenuSeparator />
|
|
337
|
+
<ContextMenuItem variant="destructive">
|
|
338
|
+
<Trash2 className="mr-2 h-4 w-4" />
|
|
339
|
+
Move to Trash
|
|
340
|
+
</ContextMenuItem>
|
|
341
|
+
</ContextMenuContent>
|
|
342
|
+
</ContextMenu>
|
|
343
|
+
</div>
|
|
344
|
+
|
|
345
|
+
{/* Image file */}
|
|
346
|
+
<div className="space-y-2">
|
|
347
|
+
<ContextMenu>
|
|
348
|
+
<ContextMenuTrigger className="group flex h-[100px] w-full flex-col items-center justify-center rounded-lg border-2 border-dashed border-border bg-gradient-to-br from-purple-50 to-pink-50 transition-colors hover:from-purple-100 hover:to-pink-100">
|
|
349
|
+
<Image className="h-8 w-8 text-purple-500 mb-2" />
|
|
350
|
+
<span className="text-xs font-medium">photo.jpg</span>
|
|
351
|
+
<span className="text-xs text-muted-foreground">1.8 MB</span>
|
|
352
|
+
</ContextMenuTrigger>
|
|
353
|
+
<ContextMenuContent>
|
|
354
|
+
<ContextMenuItem>
|
|
355
|
+
<Image className="mr-2 h-4 w-4" />
|
|
356
|
+
View
|
|
357
|
+
</ContextMenuItem>
|
|
358
|
+
<ContextMenuItem>
|
|
359
|
+
<Edit className="mr-2 h-4 w-4" />
|
|
360
|
+
Edit in Photos
|
|
361
|
+
</ContextMenuItem>
|
|
362
|
+
<ContextMenuSeparator />
|
|
363
|
+
<ContextMenuItem>
|
|
364
|
+
<Copy className="mr-2 h-4 w-4" />
|
|
365
|
+
Copy Image
|
|
366
|
+
</ContextMenuItem>
|
|
367
|
+
<ContextMenuItem>
|
|
368
|
+
<Download className="mr-2 h-4 w-4" />
|
|
369
|
+
Save As...
|
|
370
|
+
</ContextMenuItem>
|
|
371
|
+
<ContextMenuSeparator />
|
|
372
|
+
<ContextMenuItem variant="destructive">
|
|
373
|
+
<Trash2 className="mr-2 h-4 w-4" />
|
|
374
|
+
Delete
|
|
375
|
+
</ContextMenuItem>
|
|
376
|
+
</ContextMenuContent>
|
|
377
|
+
</ContextMenu>
|
|
378
|
+
</div>
|
|
379
|
+
|
|
380
|
+
{/* Folder */}
|
|
381
|
+
<div className="space-y-2">
|
|
382
|
+
<ContextMenu>
|
|
383
|
+
<ContextMenuTrigger className="group flex h-[100px] w-full flex-col items-center justify-center rounded-lg border-2 border-dashed border-border bg-gradient-to-br from-blue-50 to-cyan-50 transition-colors hover:from-blue-100 hover:to-cyan-100">
|
|
384
|
+
<Folder className="h-8 w-8 text-blue-500 mb-2" />
|
|
385
|
+
<span className="text-xs font-medium">Projects</span>
|
|
386
|
+
<span className="text-xs text-muted-foreground">12 items</span>
|
|
387
|
+
</ContextMenuTrigger>
|
|
388
|
+
<ContextMenuContent>
|
|
389
|
+
<ContextMenuItem>
|
|
390
|
+
<ExternalLink className="mr-2 h-4 w-4" />
|
|
391
|
+
Open
|
|
392
|
+
</ContextMenuItem>
|
|
393
|
+
<ContextMenuItem>
|
|
394
|
+
<Edit className="mr-2 h-4 w-4" />
|
|
395
|
+
Rename
|
|
396
|
+
</ContextMenuItem>
|
|
397
|
+
<ContextMenuSeparator />
|
|
398
|
+
<ContextMenuSub>
|
|
399
|
+
<ContextMenuSubTrigger>
|
|
400
|
+
<FileText className="mr-2 h-4 w-4" />
|
|
401
|
+
New
|
|
402
|
+
</ContextMenuSubTrigger>
|
|
403
|
+
<ContextMenuPortal>
|
|
404
|
+
<ContextMenuSubContent>
|
|
405
|
+
<ContextMenuItem>
|
|
406
|
+
<FileText className="mr-2 h-4 w-4" />
|
|
407
|
+
Text File
|
|
408
|
+
</ContextMenuItem>
|
|
409
|
+
<ContextMenuItem>
|
|
410
|
+
<Folder className="mr-2 h-4 w-4" />
|
|
411
|
+
Folder
|
|
412
|
+
</ContextMenuItem>
|
|
413
|
+
</ContextMenuSubContent>
|
|
414
|
+
</ContextMenuPortal>
|
|
415
|
+
</ContextMenuSub>
|
|
416
|
+
<ContextMenuSeparator />
|
|
417
|
+
<ContextMenuItem>
|
|
418
|
+
<Archive className="mr-2 h-4 w-4" />
|
|
419
|
+
Compress
|
|
420
|
+
</ContextMenuItem>
|
|
421
|
+
<ContextMenuSeparator />
|
|
422
|
+
<ContextMenuItem variant="destructive">
|
|
423
|
+
<Trash2 className="mr-2 h-4 w-4" />
|
|
424
|
+
Delete
|
|
425
|
+
</ContextMenuItem>
|
|
426
|
+
</ContextMenuContent>
|
|
427
|
+
</ContextMenu>
|
|
428
|
+
</div>
|
|
429
|
+
</div>
|
|
430
|
+
|
|
431
|
+
<div className="text-center text-xs text-muted-foreground mt-4">
|
|
432
|
+
This demonstrates how context menus provide relevant actions based on
|
|
433
|
+
file type and context
|
|
434
|
+
</div>
|
|
435
|
+
</div>
|
|
436
|
+
),
|
|
437
|
+
parameters: {
|
|
438
|
+
layout: "padded",
|
|
439
|
+
docs: {
|
|
440
|
+
description: {
|
|
441
|
+
story:
|
|
442
|
+
"Real-world file manager interface showing how context menus provide contextually relevant actions. Each file type (document, image, folder) offers appropriate actions like view, edit, share, and compress based on its capabilities.",
|
|
443
|
+
},
|
|
444
|
+
},
|
|
445
|
+
},
|
|
446
|
+
};
|