@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,308 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react-vite";
|
|
2
|
+
import { Heart, MoreHorizontal, Settings } from "lucide-react";
|
|
3
|
+
import { Badge } from "../badge";
|
|
4
|
+
import { Button } from "../button";
|
|
5
|
+
import {
|
|
6
|
+
Card,
|
|
7
|
+
CardAction,
|
|
8
|
+
CardContent,
|
|
9
|
+
CardDescription,
|
|
10
|
+
CardFooter,
|
|
11
|
+
CardHeader,
|
|
12
|
+
CardTitle,
|
|
13
|
+
} from "../card";
|
|
14
|
+
|
|
15
|
+
const meta = {
|
|
16
|
+
title: "Layout and Structure/Card",
|
|
17
|
+
component: Card,
|
|
18
|
+
parameters: {
|
|
19
|
+
layout: "centered",
|
|
20
|
+
docs: {
|
|
21
|
+
description: {
|
|
22
|
+
component:
|
|
23
|
+
"A flexible container component for grouping related content with header, content, and footer sections. Supports composition through sub-components and can include actions in the header.",
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
tags: ["autodocs"],
|
|
28
|
+
argTypes: {
|
|
29
|
+
className: {
|
|
30
|
+
control: { type: "text" },
|
|
31
|
+
description: "Additional CSS classes to apply to the card",
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
} satisfies Meta<typeof Card>;
|
|
35
|
+
|
|
36
|
+
export default meta;
|
|
37
|
+
type Story = StoryObj<typeof meta>;
|
|
38
|
+
|
|
39
|
+
export const Interactive: Story = {
|
|
40
|
+
args: {
|
|
41
|
+
className: "w-80",
|
|
42
|
+
},
|
|
43
|
+
argTypes: {
|
|
44
|
+
className: {
|
|
45
|
+
control: { type: "text" },
|
|
46
|
+
description: "Additional CSS classes",
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
render: (args) => (
|
|
50
|
+
<Card {...args}>
|
|
51
|
+
<CardHeader>
|
|
52
|
+
<CardTitle>Interactive Card</CardTitle>
|
|
53
|
+
<CardDescription>
|
|
54
|
+
Use the controls to modify the card appearance and test different
|
|
55
|
+
configurations.
|
|
56
|
+
</CardDescription>
|
|
57
|
+
<CardAction>
|
|
58
|
+
<Button size="icon" variant="ghost">
|
|
59
|
+
<MoreHorizontal className="size-4" />
|
|
60
|
+
</Button>
|
|
61
|
+
</CardAction>
|
|
62
|
+
</CardHeader>
|
|
63
|
+
<CardContent>
|
|
64
|
+
<p>
|
|
65
|
+
This card demonstrates all the available sub-components and their
|
|
66
|
+
composition patterns.
|
|
67
|
+
</p>
|
|
68
|
+
</CardContent>
|
|
69
|
+
<CardFooter className="gap-2">
|
|
70
|
+
<Button variant="outline">Cancel</Button>
|
|
71
|
+
<Button>Save</Button>
|
|
72
|
+
</CardFooter>
|
|
73
|
+
</Card>
|
|
74
|
+
),
|
|
75
|
+
parameters: {
|
|
76
|
+
docs: {
|
|
77
|
+
description: {
|
|
78
|
+
story:
|
|
79
|
+
"Interactive playground to test different card configurations and styling options.",
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export const Variants: Story = {
|
|
86
|
+
render: () => (
|
|
87
|
+
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 max-w-6xl">
|
|
88
|
+
{/* Basic card with all sections */}
|
|
89
|
+
<Card className="w-80">
|
|
90
|
+
<CardHeader>
|
|
91
|
+
<CardTitle>Complete Card</CardTitle>
|
|
92
|
+
<CardDescription>
|
|
93
|
+
Card with header, content, and footer
|
|
94
|
+
</CardDescription>
|
|
95
|
+
</CardHeader>
|
|
96
|
+
<CardContent>
|
|
97
|
+
<p>This card includes all available sections.</p>
|
|
98
|
+
</CardContent>
|
|
99
|
+
<CardFooter>
|
|
100
|
+
<Button size="sm">Action</Button>
|
|
101
|
+
</CardFooter>
|
|
102
|
+
</Card>
|
|
103
|
+
|
|
104
|
+
{/* Card with header action */}
|
|
105
|
+
<Card className="w-80">
|
|
106
|
+
<CardHeader>
|
|
107
|
+
<CardTitle>With Header Action</CardTitle>
|
|
108
|
+
<CardDescription>Card with action button in header</CardDescription>
|
|
109
|
+
<CardAction>
|
|
110
|
+
<Badge variant="secondary">New</Badge>
|
|
111
|
+
</CardAction>
|
|
112
|
+
</CardHeader>
|
|
113
|
+
<CardContent>
|
|
114
|
+
<p>Header action positioned in top-right corner.</p>
|
|
115
|
+
</CardContent>
|
|
116
|
+
</Card>
|
|
117
|
+
|
|
118
|
+
{/* Minimal card */}
|
|
119
|
+
<Card className="w-80">
|
|
120
|
+
<CardContent>
|
|
121
|
+
<p>Minimal card with only content section.</p>
|
|
122
|
+
</CardContent>
|
|
123
|
+
</Card>
|
|
124
|
+
|
|
125
|
+
{/* Stats card */}
|
|
126
|
+
<Card className="w-80">
|
|
127
|
+
<CardHeader>
|
|
128
|
+
<CardTitle className="text-sm font-medium">Revenue</CardTitle>
|
|
129
|
+
<CardAction>
|
|
130
|
+
<Badge variant="outline" className="text-green-600">
|
|
131
|
+
+12%
|
|
132
|
+
</Badge>
|
|
133
|
+
</CardAction>
|
|
134
|
+
</CardHeader>
|
|
135
|
+
<CardContent>
|
|
136
|
+
<div className="text-2xl font-bold">$45,231</div>
|
|
137
|
+
<p className="text-xs text-muted-foreground">+20% from last month</p>
|
|
138
|
+
</CardContent>
|
|
139
|
+
</Card>
|
|
140
|
+
|
|
141
|
+
{/* Card with custom styling */}
|
|
142
|
+
<Card className="w-80 border-2 border-primary">
|
|
143
|
+
<CardHeader>
|
|
144
|
+
<CardTitle>Highlighted Card</CardTitle>
|
|
145
|
+
<CardDescription>Custom border styling</CardDescription>
|
|
146
|
+
</CardHeader>
|
|
147
|
+
<CardContent>
|
|
148
|
+
<p>Card with emphasis border.</p>
|
|
149
|
+
</CardContent>
|
|
150
|
+
</Card>
|
|
151
|
+
|
|
152
|
+
{/* Card with footer actions */}
|
|
153
|
+
<Card className="w-80">
|
|
154
|
+
<CardHeader>
|
|
155
|
+
<CardTitle>Multiple Actions</CardTitle>
|
|
156
|
+
<CardDescription>Card with multiple footer buttons</CardDescription>
|
|
157
|
+
</CardHeader>
|
|
158
|
+
<CardContent>
|
|
159
|
+
<p>Content with action buttons in footer.</p>
|
|
160
|
+
</CardContent>
|
|
161
|
+
<CardFooter className="gap-2">
|
|
162
|
+
<Button className="flex-1" variant="outline">
|
|
163
|
+
Cancel
|
|
164
|
+
</Button>
|
|
165
|
+
<Button className="flex-1">Confirm</Button>
|
|
166
|
+
</CardFooter>
|
|
167
|
+
</Card>
|
|
168
|
+
</div>
|
|
169
|
+
),
|
|
170
|
+
parameters: {
|
|
171
|
+
layout: "fullscreen",
|
|
172
|
+
docs: {
|
|
173
|
+
description: {
|
|
174
|
+
story:
|
|
175
|
+
"Showcase of all card variants and composition patterns available in the component system.",
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
export const InContext: Story = {
|
|
182
|
+
render: () => (
|
|
183
|
+
<div className="max-w-4xl mx-auto p-6 space-y-6">
|
|
184
|
+
{/* Dashboard header */}
|
|
185
|
+
<div className="space-y-2">
|
|
186
|
+
<h1 className="text-3xl font-bold">Dashboard</h1>
|
|
187
|
+
<p className="text-muted-foreground">
|
|
188
|
+
Welcome back! Here's your latest activity.
|
|
189
|
+
</p>
|
|
190
|
+
</div>
|
|
191
|
+
|
|
192
|
+
{/* Stats grid */}
|
|
193
|
+
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
|
|
194
|
+
<Card>
|
|
195
|
+
<CardHeader>
|
|
196
|
+
<CardTitle className="text-sm font-medium">Total Users</CardTitle>
|
|
197
|
+
</CardHeader>
|
|
198
|
+
<CardContent>
|
|
199
|
+
<div className="text-2xl font-bold">2,847</div>
|
|
200
|
+
<p className="text-xs text-muted-foreground">
|
|
201
|
+
+12% from last month
|
|
202
|
+
</p>
|
|
203
|
+
</CardContent>
|
|
204
|
+
</Card>
|
|
205
|
+
|
|
206
|
+
<Card>
|
|
207
|
+
<CardHeader>
|
|
208
|
+
<CardTitle className="text-sm font-medium">Revenue</CardTitle>
|
|
209
|
+
<CardAction>
|
|
210
|
+
<Badge variant="outline" className="text-green-600">
|
|
211
|
+
+8.2%
|
|
212
|
+
</Badge>
|
|
213
|
+
</CardAction>
|
|
214
|
+
</CardHeader>
|
|
215
|
+
<CardContent>
|
|
216
|
+
<div className="text-2xl font-bold">$54,239</div>
|
|
217
|
+
<p className="text-xs text-muted-foreground">
|
|
218
|
+
+8.2% from last month
|
|
219
|
+
</p>
|
|
220
|
+
</CardContent>
|
|
221
|
+
</Card>
|
|
222
|
+
|
|
223
|
+
<Card>
|
|
224
|
+
<CardHeader>
|
|
225
|
+
<CardTitle className="text-sm font-medium">
|
|
226
|
+
Active Sessions
|
|
227
|
+
</CardTitle>
|
|
228
|
+
</CardHeader>
|
|
229
|
+
<CardContent>
|
|
230
|
+
<div className="text-2xl font-bold">1,247</div>
|
|
231
|
+
<p className="text-xs text-muted-foreground">
|
|
232
|
+
+2.1% from last hour
|
|
233
|
+
</p>
|
|
234
|
+
</CardContent>
|
|
235
|
+
</Card>
|
|
236
|
+
</div>
|
|
237
|
+
|
|
238
|
+
{/* Feature cards */}
|
|
239
|
+
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
|
240
|
+
<Card>
|
|
241
|
+
<CardHeader>
|
|
242
|
+
<CardTitle>Account Settings</CardTitle>
|
|
243
|
+
<CardDescription>
|
|
244
|
+
Manage your account preferences and security
|
|
245
|
+
</CardDescription>
|
|
246
|
+
<CardAction>
|
|
247
|
+
<Button size="icon" variant="ghost">
|
|
248
|
+
<Settings className="size-4" />
|
|
249
|
+
</Button>
|
|
250
|
+
</CardAction>
|
|
251
|
+
</CardHeader>
|
|
252
|
+
<CardContent>
|
|
253
|
+
<div className="space-y-2">
|
|
254
|
+
<div className="flex justify-between">
|
|
255
|
+
<span className="text-sm">Two-factor authentication</span>
|
|
256
|
+
<Badge variant="secondary">Enabled</Badge>
|
|
257
|
+
</div>
|
|
258
|
+
<div className="flex justify-between">
|
|
259
|
+
<span className="text-sm">Email notifications</span>
|
|
260
|
+
<Badge variant="outline">On</Badge>
|
|
261
|
+
</div>
|
|
262
|
+
</div>
|
|
263
|
+
</CardContent>
|
|
264
|
+
<CardFooter>
|
|
265
|
+
<Button variant="outline" className="w-full">
|
|
266
|
+
Manage Settings
|
|
267
|
+
</Button>
|
|
268
|
+
</CardFooter>
|
|
269
|
+
</Card>
|
|
270
|
+
|
|
271
|
+
<Card>
|
|
272
|
+
<CardHeader>
|
|
273
|
+
<div className="aspect-video bg-gradient-to-br from-blue-500 to-purple-600 rounded-lg mb-4"></div>
|
|
274
|
+
<CardTitle>Premium Features</CardTitle>
|
|
275
|
+
<CardDescription>
|
|
276
|
+
Unlock advanced functionality with our premium plan
|
|
277
|
+
</CardDescription>
|
|
278
|
+
<CardAction>
|
|
279
|
+
<Badge>Pro</Badge>
|
|
280
|
+
</CardAction>
|
|
281
|
+
</CardHeader>
|
|
282
|
+
<CardContent>
|
|
283
|
+
<ul className="text-sm space-y-1">
|
|
284
|
+
<li>• Advanced analytics</li>
|
|
285
|
+
<li>• Priority support</li>
|
|
286
|
+
<li>• Custom integrations</li>
|
|
287
|
+
</ul>
|
|
288
|
+
</CardContent>
|
|
289
|
+
<CardFooter className="gap-2">
|
|
290
|
+
<Button className="flex-1">Upgrade Now</Button>
|
|
291
|
+
<Button size="icon" variant="outline">
|
|
292
|
+
<Heart className="size-4" />
|
|
293
|
+
</Button>
|
|
294
|
+
</CardFooter>
|
|
295
|
+
</Card>
|
|
296
|
+
</div>
|
|
297
|
+
</div>
|
|
298
|
+
),
|
|
299
|
+
parameters: {
|
|
300
|
+
layout: "fullscreen",
|
|
301
|
+
docs: {
|
|
302
|
+
description: {
|
|
303
|
+
story:
|
|
304
|
+
"Real-world dashboard example showing how cards work together to create cohesive user interfaces. Demonstrates various card patterns including stats cards, feature cards, and content cards with actions.",
|
|
305
|
+
},
|
|
306
|
+
},
|
|
307
|
+
},
|
|
308
|
+
};
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import type { Meta, StoryObj } from "@storybook/react-vite";
|
|
3
|
+
import { Button } from "../button";
|
|
4
|
+
import { Card, CardContent } from "../card";
|
|
5
|
+
import {
|
|
6
|
+
Carousel,
|
|
7
|
+
CarouselContent,
|
|
8
|
+
CarouselItem,
|
|
9
|
+
CarouselNext,
|
|
10
|
+
CarouselPrevious,
|
|
11
|
+
} from "../carousel";
|
|
12
|
+
|
|
13
|
+
const meta = {
|
|
14
|
+
title: "Charts & Visualization/Carousel",
|
|
15
|
+
component: Carousel,
|
|
16
|
+
parameters: {
|
|
17
|
+
layout: "centered",
|
|
18
|
+
docs: {
|
|
19
|
+
description: {
|
|
20
|
+
component:
|
|
21
|
+
"A responsive carousel component built on Embla Carousel with navigation controls, keyboard support, touch/swipe gestures, and customizable orientation. Supports autoplay, looping, and multiple items per view.",
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
tags: ["autodocs"],
|
|
26
|
+
argTypes: {
|
|
27
|
+
orientation: {
|
|
28
|
+
control: { type: "select" },
|
|
29
|
+
options: ["horizontal", "vertical"],
|
|
30
|
+
description: "Layout direction of the carousel",
|
|
31
|
+
},
|
|
32
|
+
opts: {
|
|
33
|
+
control: { type: "object" },
|
|
34
|
+
description: "Embla carousel configuration options (align, loop, etc.)",
|
|
35
|
+
},
|
|
36
|
+
className: {
|
|
37
|
+
control: { type: "text" },
|
|
38
|
+
description: "Additional CSS classes",
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
} satisfies Meta<typeof Carousel>;
|
|
42
|
+
|
|
43
|
+
export default meta;
|
|
44
|
+
type Story = StoryObj<typeof meta>;
|
|
45
|
+
|
|
46
|
+
// Interactive playground with all controls
|
|
47
|
+
export const Interactive: Story = {
|
|
48
|
+
args: {
|
|
49
|
+
orientation: "horizontal",
|
|
50
|
+
opts: {
|
|
51
|
+
align: "start",
|
|
52
|
+
loop: false,
|
|
53
|
+
},
|
|
54
|
+
className: "w-full max-w-sm",
|
|
55
|
+
},
|
|
56
|
+
render: (args) => (
|
|
57
|
+
<div className="w-full max-w-sm">
|
|
58
|
+
<Carousel {...args}>
|
|
59
|
+
<CarouselContent>
|
|
60
|
+
{Array.from({ length: 5 }, (_, index) => (
|
|
61
|
+
<CarouselItem key={index}>
|
|
62
|
+
<div className="p-1">
|
|
63
|
+
<Card>
|
|
64
|
+
<CardContent className="flex aspect-square items-center justify-center p-6">
|
|
65
|
+
<span className="text-4xl font-semibold">{index + 1}</span>
|
|
66
|
+
</CardContent>
|
|
67
|
+
</Card>
|
|
68
|
+
</div>
|
|
69
|
+
</CarouselItem>
|
|
70
|
+
))}
|
|
71
|
+
</CarouselContent>
|
|
72
|
+
<CarouselPrevious />
|
|
73
|
+
<CarouselNext />
|
|
74
|
+
</Carousel>
|
|
75
|
+
</div>
|
|
76
|
+
),
|
|
77
|
+
parameters: {
|
|
78
|
+
docs: {
|
|
79
|
+
description: {
|
|
80
|
+
story:
|
|
81
|
+
"Interactive playground to test all carousel props and configurations. Use the controls panel to experiment with different settings.",
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
// Showcase of all variants and configurations
|
|
88
|
+
export const Variants: Story = {
|
|
89
|
+
render: () => (
|
|
90
|
+
<div className="space-y-8">
|
|
91
|
+
{/* Basic horizontal carousel */}
|
|
92
|
+
<div className="space-y-2">
|
|
93
|
+
<h3 className="text-lg font-semibold">Basic Horizontal</h3>
|
|
94
|
+
<div className="w-full max-w-xs">
|
|
95
|
+
<Carousel>
|
|
96
|
+
<CarouselContent>
|
|
97
|
+
{Array.from({ length: 3 }, (_, index) => (
|
|
98
|
+
<CarouselItem key={index}>
|
|
99
|
+
<div className="p-1">
|
|
100
|
+
<Card>
|
|
101
|
+
<CardContent className="flex aspect-square items-center justify-center p-6">
|
|
102
|
+
<span className="text-2xl font-semibold">
|
|
103
|
+
{index + 1}
|
|
104
|
+
</span>
|
|
105
|
+
</CardContent>
|
|
106
|
+
</Card>
|
|
107
|
+
</div>
|
|
108
|
+
</CarouselItem>
|
|
109
|
+
))}
|
|
110
|
+
</CarouselContent>
|
|
111
|
+
<CarouselPrevious />
|
|
112
|
+
<CarouselNext />
|
|
113
|
+
</Carousel>
|
|
114
|
+
</div>
|
|
115
|
+
</div>
|
|
116
|
+
|
|
117
|
+
{/* Vertical orientation */}
|
|
118
|
+
<div className="space-y-2">
|
|
119
|
+
<h3 className="text-lg font-semibold">Vertical Orientation</h3>
|
|
120
|
+
<div className="w-full max-w-xs">
|
|
121
|
+
<Carousel orientation="vertical" className="h-64">
|
|
122
|
+
<CarouselContent className="h-full">
|
|
123
|
+
{Array.from({ length: 3 }, (_, index) => (
|
|
124
|
+
<CarouselItem key={index} className="basis-1/3">
|
|
125
|
+
<div className="p-1">
|
|
126
|
+
<Card>
|
|
127
|
+
<CardContent className="flex items-center justify-center p-6">
|
|
128
|
+
<span className="text-2xl font-semibold">
|
|
129
|
+
{index + 1}
|
|
130
|
+
</span>
|
|
131
|
+
</CardContent>
|
|
132
|
+
</Card>
|
|
133
|
+
</div>
|
|
134
|
+
</CarouselItem>
|
|
135
|
+
))}
|
|
136
|
+
</CarouselContent>
|
|
137
|
+
<CarouselPrevious />
|
|
138
|
+
<CarouselNext />
|
|
139
|
+
</Carousel>
|
|
140
|
+
</div>
|
|
141
|
+
</div>
|
|
142
|
+
|
|
143
|
+
{/* Multiple items visible */}
|
|
144
|
+
<div className="space-y-2">
|
|
145
|
+
<h3 className="text-lg font-semibold">Multiple Items (basis-1/3)</h3>
|
|
146
|
+
<div className="w-full max-w-sm">
|
|
147
|
+
<Carousel>
|
|
148
|
+
<CarouselContent>
|
|
149
|
+
{Array.from({ length: 6 }, (_, index) => (
|
|
150
|
+
<CarouselItem key={index} className="basis-1/3">
|
|
151
|
+
<div className="p-1">
|
|
152
|
+
<Card>
|
|
153
|
+
<CardContent className="flex aspect-square items-center justify-center p-3">
|
|
154
|
+
<span className="text-lg font-semibold">
|
|
155
|
+
{index + 1}
|
|
156
|
+
</span>
|
|
157
|
+
</CardContent>
|
|
158
|
+
</Card>
|
|
159
|
+
</div>
|
|
160
|
+
</CarouselItem>
|
|
161
|
+
))}
|
|
162
|
+
</CarouselContent>
|
|
163
|
+
<CarouselPrevious />
|
|
164
|
+
<CarouselNext />
|
|
165
|
+
</Carousel>
|
|
166
|
+
</div>
|
|
167
|
+
</div>
|
|
168
|
+
|
|
169
|
+
{/* Without navigation */}
|
|
170
|
+
<div className="space-y-2">
|
|
171
|
+
<h3 className="text-lg font-semibold">
|
|
172
|
+
Without Navigation (swipe/drag only)
|
|
173
|
+
</h3>
|
|
174
|
+
<div className="w-full max-w-xs">
|
|
175
|
+
<Carousel>
|
|
176
|
+
<CarouselContent>
|
|
177
|
+
{Array.from({ length: 3 }, (_, index) => (
|
|
178
|
+
<CarouselItem key={index}>
|
|
179
|
+
<div className="p-1">
|
|
180
|
+
<Card>
|
|
181
|
+
<CardContent className="flex aspect-square items-center justify-center p-6">
|
|
182
|
+
<span className="text-2xl font-semibold">
|
|
183
|
+
{index + 1}
|
|
184
|
+
</span>
|
|
185
|
+
</CardContent>
|
|
186
|
+
</Card>
|
|
187
|
+
</div>
|
|
188
|
+
</CarouselItem>
|
|
189
|
+
))}
|
|
190
|
+
</CarouselContent>
|
|
191
|
+
</Carousel>
|
|
192
|
+
</div>
|
|
193
|
+
</div>
|
|
194
|
+
</div>
|
|
195
|
+
),
|
|
196
|
+
parameters: {
|
|
197
|
+
docs: {
|
|
198
|
+
description: {
|
|
199
|
+
story:
|
|
200
|
+
"Comprehensive showcase of all carousel variants: horizontal, vertical, multiple items, and navigation options.",
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
// Real-world usage example
|
|
207
|
+
export const InContext: Story = {
|
|
208
|
+
render: () => (
|
|
209
|
+
<div className="max-w-4xl mx-auto p-6 space-y-8">
|
|
210
|
+
{/* Product showcase section */}
|
|
211
|
+
<section className="space-y-4">
|
|
212
|
+
<div className="text-center space-y-2">
|
|
213
|
+
<h2 className="text-3xl font-bold">Featured Products</h2>
|
|
214
|
+
<p className="text-muted-foreground">
|
|
215
|
+
Discover our latest collection
|
|
216
|
+
</p>
|
|
217
|
+
</div>
|
|
218
|
+
<Carousel
|
|
219
|
+
opts={{
|
|
220
|
+
align: "start",
|
|
221
|
+
loop: true,
|
|
222
|
+
}}
|
|
223
|
+
className="w-full"
|
|
224
|
+
>
|
|
225
|
+
<CarouselContent className="-ml-2 md:-ml-4">
|
|
226
|
+
{Array.from({ length: 8 }, (_, index) => (
|
|
227
|
+
<CarouselItem
|
|
228
|
+
key={index}
|
|
229
|
+
className="pl-2 md:pl-4 md:basis-1/2 lg:basis-1/3"
|
|
230
|
+
>
|
|
231
|
+
<Card className="h-full">
|
|
232
|
+
<CardContent className="p-4">
|
|
233
|
+
<div className="aspect-square bg-gradient-to-br from-blue-500 to-purple-600 rounded-lg mb-3 flex items-center justify-center">
|
|
234
|
+
<span className="text-white text-xl font-bold">
|
|
235
|
+
#{index + 1}
|
|
236
|
+
</span>
|
|
237
|
+
</div>
|
|
238
|
+
<h3 className="font-semibold mb-2">
|
|
239
|
+
Premium Product {index + 1}
|
|
240
|
+
</h3>
|
|
241
|
+
<p className="text-sm text-muted-foreground mb-3">
|
|
242
|
+
High-quality product with amazing features and benefits.
|
|
243
|
+
</p>
|
|
244
|
+
<div className="flex items-center justify-between">
|
|
245
|
+
<span className="text-lg font-bold">$99.99</span>
|
|
246
|
+
<Button size="sm">Add to Cart</Button>
|
|
247
|
+
</div>
|
|
248
|
+
</CardContent>
|
|
249
|
+
</Card>
|
|
250
|
+
</CarouselItem>
|
|
251
|
+
))}
|
|
252
|
+
</CarouselContent>
|
|
253
|
+
<CarouselPrevious />
|
|
254
|
+
<CarouselNext />
|
|
255
|
+
</Carousel>
|
|
256
|
+
</section>
|
|
257
|
+
|
|
258
|
+
{/* Testimonials section */}
|
|
259
|
+
<section className="space-y-4">
|
|
260
|
+
<div className="text-center space-y-2">
|
|
261
|
+
<h2 className="text-2xl font-bold">What Our Customers Say</h2>
|
|
262
|
+
<p className="text-muted-foreground">
|
|
263
|
+
Real feedback from real people
|
|
264
|
+
</p>
|
|
265
|
+
</div>
|
|
266
|
+
<Carousel className="w-full max-w-2xl mx-auto">
|
|
267
|
+
<CarouselContent>
|
|
268
|
+
{[
|
|
269
|
+
{
|
|
270
|
+
name: "Sarah Johnson",
|
|
271
|
+
role: "Product Manager",
|
|
272
|
+
company: "TechCorp",
|
|
273
|
+
quote:
|
|
274
|
+
"This product has revolutionized our workflow. The team loves it!",
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
name: "Michael Chen",
|
|
278
|
+
role: "Designer",
|
|
279
|
+
company: "Creative Studio",
|
|
280
|
+
quote:
|
|
281
|
+
"Beautiful design and incredible functionality. Highly recommended!",
|
|
282
|
+
},
|
|
283
|
+
{
|
|
284
|
+
name: "Emily Rodriguez",
|
|
285
|
+
role: "Developer",
|
|
286
|
+
company: "StartupXYZ",
|
|
287
|
+
quote:
|
|
288
|
+
"Easy to integrate and customize. Perfect for our needs.",
|
|
289
|
+
},
|
|
290
|
+
].map((testimonial, index) => (
|
|
291
|
+
<CarouselItem key={index}>
|
|
292
|
+
<div className="p-4">
|
|
293
|
+
<Card>
|
|
294
|
+
<CardContent className="p-8 text-center">
|
|
295
|
+
<blockquote className="text-lg italic mb-6">
|
|
296
|
+
"{testimonial.quote}"
|
|
297
|
+
</blockquote>
|
|
298
|
+
<div className="flex flex-col items-center space-y-2">
|
|
299
|
+
<div className="size-12 bg-gradient-to-r from-orange-400 to-pink-500 rounded-full"></div>
|
|
300
|
+
<div>
|
|
301
|
+
<p className="font-semibold">{testimonial.name}</p>
|
|
302
|
+
<p className="text-sm text-muted-foreground">
|
|
303
|
+
{testimonial.role}, {testimonial.company}
|
|
304
|
+
</p>
|
|
305
|
+
</div>
|
|
306
|
+
</div>
|
|
307
|
+
</CardContent>
|
|
308
|
+
</Card>
|
|
309
|
+
</div>
|
|
310
|
+
</CarouselItem>
|
|
311
|
+
))}
|
|
312
|
+
</CarouselContent>
|
|
313
|
+
<CarouselPrevious />
|
|
314
|
+
<CarouselNext />
|
|
315
|
+
</Carousel>
|
|
316
|
+
</section>
|
|
317
|
+
</div>
|
|
318
|
+
),
|
|
319
|
+
parameters: {
|
|
320
|
+
layout: "fullscreen",
|
|
321
|
+
docs: {
|
|
322
|
+
description: {
|
|
323
|
+
story:
|
|
324
|
+
"Real-world example showing carousel usage in a product showcase page with featured items and customer testimonials. Demonstrates responsive design and practical implementation.",
|
|
325
|
+
},
|
|
326
|
+
},
|
|
327
|
+
},
|
|
328
|
+
};
|