@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,373 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react-vite";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { toast } from "sonner";
|
|
4
|
+
import { Toaster } from "../sonner";
|
|
5
|
+
import { Button } from "../button";
|
|
6
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../card";
|
|
7
|
+
|
|
8
|
+
const meta: Meta<typeof Toaster> = {
|
|
9
|
+
title: "Data Display/Sonner",
|
|
10
|
+
component: Toaster,
|
|
11
|
+
parameters: {
|
|
12
|
+
layout: "centered",
|
|
13
|
+
docs: {
|
|
14
|
+
description: {
|
|
15
|
+
component:
|
|
16
|
+
"An opinionated toast component for React built on Sonner. Provides beautiful, accessible notifications with minimal setup and automatic theme integration.",
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
tags: ["autodocs"],
|
|
21
|
+
argTypes: {
|
|
22
|
+
position: {
|
|
23
|
+
control: "select",
|
|
24
|
+
options: ["top-left", "top-center", "top-right", "bottom-left", "bottom-center", "bottom-right"],
|
|
25
|
+
description: "Position of toasts on screen",
|
|
26
|
+
},
|
|
27
|
+
richColors: {
|
|
28
|
+
control: "boolean",
|
|
29
|
+
description: "Enable enhanced colors for different toast types",
|
|
30
|
+
},
|
|
31
|
+
expand: {
|
|
32
|
+
control: "boolean",
|
|
33
|
+
description: "Expand toasts by default to show full content",
|
|
34
|
+
},
|
|
35
|
+
duration: {
|
|
36
|
+
control: "number",
|
|
37
|
+
description: "Default duration in milliseconds before auto-dismiss",
|
|
38
|
+
},
|
|
39
|
+
gap: {
|
|
40
|
+
control: "number",
|
|
41
|
+
description: "Spacing between toasts in pixels",
|
|
42
|
+
},
|
|
43
|
+
visibleToasts: {
|
|
44
|
+
control: "number",
|
|
45
|
+
description: "Maximum number of toasts visible at once",
|
|
46
|
+
},
|
|
47
|
+
closeButton: {
|
|
48
|
+
control: "boolean",
|
|
49
|
+
description: "Show close button on each toast",
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
decorators: [
|
|
53
|
+
(Story) => (
|
|
54
|
+
<>
|
|
55
|
+
<Story />
|
|
56
|
+
<Toaster position="bottom-right" />
|
|
57
|
+
</>
|
|
58
|
+
),
|
|
59
|
+
],
|
|
60
|
+
} satisfies Meta<typeof Toaster>;
|
|
61
|
+
|
|
62
|
+
export default meta;
|
|
63
|
+
type Story = StoryObj<typeof meta>;
|
|
64
|
+
|
|
65
|
+
export const Interactive: Story = {
|
|
66
|
+
args: {
|
|
67
|
+
position: "bottom-right",
|
|
68
|
+
richColors: false,
|
|
69
|
+
expand: false,
|
|
70
|
+
duration: 4000,
|
|
71
|
+
gap: 14,
|
|
72
|
+
visibleToasts: 3,
|
|
73
|
+
closeButton: false,
|
|
74
|
+
},
|
|
75
|
+
render: (args) => (
|
|
76
|
+
<div className="space-y-4">
|
|
77
|
+
<Toaster {...args} />
|
|
78
|
+
<div className="grid grid-cols-2 gap-4">
|
|
79
|
+
<Button onClick={() => toast("Basic notification")}>
|
|
80
|
+
Basic Toast
|
|
81
|
+
</Button>
|
|
82
|
+
<Button
|
|
83
|
+
variant="outline"
|
|
84
|
+
onClick={() => toast.success("Operation completed successfully")}
|
|
85
|
+
>
|
|
86
|
+
Success Toast
|
|
87
|
+
</Button>
|
|
88
|
+
<Button
|
|
89
|
+
variant="outline"
|
|
90
|
+
onClick={() => toast.error("Something went wrong")}
|
|
91
|
+
>
|
|
92
|
+
Error Toast
|
|
93
|
+
</Button>
|
|
94
|
+
<Button
|
|
95
|
+
variant="outline"
|
|
96
|
+
onClick={() => toast("Event created", {
|
|
97
|
+
description: "Your event has been scheduled",
|
|
98
|
+
action: {
|
|
99
|
+
label: "View",
|
|
100
|
+
onClick: () => console.log("View event")
|
|
101
|
+
}
|
|
102
|
+
})}
|
|
103
|
+
>
|
|
104
|
+
With Action
|
|
105
|
+
</Button>
|
|
106
|
+
<Button
|
|
107
|
+
variant="outline"
|
|
108
|
+
onClick={() => {
|
|
109
|
+
const promise = new Promise((resolve) => setTimeout(resolve, 2000));
|
|
110
|
+
toast.promise(promise, {
|
|
111
|
+
loading: "Processing...",
|
|
112
|
+
success: "Complete!",
|
|
113
|
+
error: "Failed to process"
|
|
114
|
+
});
|
|
115
|
+
}}
|
|
116
|
+
>
|
|
117
|
+
Promise Toast
|
|
118
|
+
</Button>
|
|
119
|
+
<Button
|
|
120
|
+
variant="outline"
|
|
121
|
+
onClick={() => toast.dismiss()}
|
|
122
|
+
>
|
|
123
|
+
Dismiss All
|
|
124
|
+
</Button>
|
|
125
|
+
</div>
|
|
126
|
+
</div>
|
|
127
|
+
),
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
export const Variants: Story = {
|
|
131
|
+
render: () => (
|
|
132
|
+
<div className="space-y-6">
|
|
133
|
+
<div>
|
|
134
|
+
<h3 className="mb-3 text-lg font-semibold">Toast Types</h3>
|
|
135
|
+
<div className="grid grid-cols-3 gap-3">
|
|
136
|
+
<Button
|
|
137
|
+
size="sm"
|
|
138
|
+
onClick={() => toast("Default notification")}
|
|
139
|
+
>
|
|
140
|
+
Default
|
|
141
|
+
</Button>
|
|
142
|
+
<Button
|
|
143
|
+
size="sm"
|
|
144
|
+
variant="outline"
|
|
145
|
+
onClick={() => toast.success("Success message")}
|
|
146
|
+
>
|
|
147
|
+
Success
|
|
148
|
+
</Button>
|
|
149
|
+
<Button
|
|
150
|
+
size="sm"
|
|
151
|
+
variant="outline"
|
|
152
|
+
onClick={() => toast.error("Error message")}
|
|
153
|
+
>
|
|
154
|
+
Error
|
|
155
|
+
</Button>
|
|
156
|
+
<Button
|
|
157
|
+
size="sm"
|
|
158
|
+
variant="outline"
|
|
159
|
+
onClick={() => toast.warning("Warning message")}
|
|
160
|
+
>
|
|
161
|
+
Warning
|
|
162
|
+
</Button>
|
|
163
|
+
<Button
|
|
164
|
+
size="sm"
|
|
165
|
+
variant="outline"
|
|
166
|
+
onClick={() => toast.info("Info message")}
|
|
167
|
+
>
|
|
168
|
+
Info
|
|
169
|
+
</Button>
|
|
170
|
+
<Button
|
|
171
|
+
size="sm"
|
|
172
|
+
variant="outline"
|
|
173
|
+
onClick={() => toast.loading("Loading...")}
|
|
174
|
+
>
|
|
175
|
+
Loading
|
|
176
|
+
</Button>
|
|
177
|
+
</div>
|
|
178
|
+
</div>
|
|
179
|
+
|
|
180
|
+
<div>
|
|
181
|
+
<h3 className="mb-3 text-lg font-semibold">Positions</h3>
|
|
182
|
+
<div className="grid grid-cols-3 gap-3">
|
|
183
|
+
<Button
|
|
184
|
+
size="sm"
|
|
185
|
+
variant="secondary"
|
|
186
|
+
onClick={() => toast.success("Top Left", { position: "top-left" })}
|
|
187
|
+
>
|
|
188
|
+
Top Left
|
|
189
|
+
</Button>
|
|
190
|
+
<Button
|
|
191
|
+
size="sm"
|
|
192
|
+
variant="secondary"
|
|
193
|
+
onClick={() => toast.success("Top Center", { position: "top-center" })}
|
|
194
|
+
>
|
|
195
|
+
Top Center
|
|
196
|
+
</Button>
|
|
197
|
+
<Button
|
|
198
|
+
size="sm"
|
|
199
|
+
variant="secondary"
|
|
200
|
+
onClick={() => toast.success("Top Right", { position: "top-right" })}
|
|
201
|
+
>
|
|
202
|
+
Top Right
|
|
203
|
+
</Button>
|
|
204
|
+
<Button
|
|
205
|
+
size="sm"
|
|
206
|
+
variant="secondary"
|
|
207
|
+
onClick={() => toast.success("Bottom Left", { position: "bottom-left" })}
|
|
208
|
+
>
|
|
209
|
+
Bottom Left
|
|
210
|
+
</Button>
|
|
211
|
+
<Button
|
|
212
|
+
size="sm"
|
|
213
|
+
variant="secondary"
|
|
214
|
+
onClick={() => toast.success("Bottom Center", { position: "bottom-center" })}
|
|
215
|
+
>
|
|
216
|
+
Bottom Center
|
|
217
|
+
</Button>
|
|
218
|
+
<Button
|
|
219
|
+
size="sm"
|
|
220
|
+
variant="secondary"
|
|
221
|
+
onClick={() => toast.success("Bottom Right", { position: "bottom-right" })}
|
|
222
|
+
>
|
|
223
|
+
Bottom Right
|
|
224
|
+
</Button>
|
|
225
|
+
</div>
|
|
226
|
+
</div>
|
|
227
|
+
|
|
228
|
+
<div>
|
|
229
|
+
<h3 className="mb-3 text-lg font-semibold">Durations</h3>
|
|
230
|
+
<div className="flex gap-3">
|
|
231
|
+
<Button
|
|
232
|
+
size="sm"
|
|
233
|
+
variant="ghost"
|
|
234
|
+
onClick={() => toast("Quick (1s)", { duration: 1000 })}
|
|
235
|
+
>
|
|
236
|
+
Quick (1s)
|
|
237
|
+
</Button>
|
|
238
|
+
<Button
|
|
239
|
+
size="sm"
|
|
240
|
+
variant="ghost"
|
|
241
|
+
onClick={() => toast("Standard (4s)", { duration: 4000 })}
|
|
242
|
+
>
|
|
243
|
+
Standard (4s)
|
|
244
|
+
</Button>
|
|
245
|
+
<Button
|
|
246
|
+
size="sm"
|
|
247
|
+
variant="ghost"
|
|
248
|
+
onClick={() => toast("Long (8s)", { duration: 8000 })}
|
|
249
|
+
>
|
|
250
|
+
Long (8s)
|
|
251
|
+
</Button>
|
|
252
|
+
<Button
|
|
253
|
+
size="sm"
|
|
254
|
+
variant="ghost"
|
|
255
|
+
onClick={() => toast("Persistent", { duration: Infinity })}
|
|
256
|
+
>
|
|
257
|
+
Persistent
|
|
258
|
+
</Button>
|
|
259
|
+
</div>
|
|
260
|
+
</div>
|
|
261
|
+
</div>
|
|
262
|
+
),
|
|
263
|
+
};
|
|
264
|
+
|
|
265
|
+
export const InContext: Story = {
|
|
266
|
+
render: () => (
|
|
267
|
+
<Card className="w-[500px]">
|
|
268
|
+
<CardHeader>
|
|
269
|
+
<CardTitle>Farcaster Dashboard</CardTitle>
|
|
270
|
+
<CardDescription>
|
|
271
|
+
Manage your Farcaster presence and interactions
|
|
272
|
+
</CardDescription>
|
|
273
|
+
</CardHeader>
|
|
274
|
+
<CardContent className="space-y-4">
|
|
275
|
+
<div className="grid grid-cols-2 gap-3">
|
|
276
|
+
<Button
|
|
277
|
+
onClick={() =>
|
|
278
|
+
toast.success("Cast published", {
|
|
279
|
+
description: "Your cast has been published to /farcaster",
|
|
280
|
+
action: {
|
|
281
|
+
label: "View Cast",
|
|
282
|
+
onClick: () => console.log("Opening cast...")
|
|
283
|
+
}
|
|
284
|
+
})
|
|
285
|
+
}
|
|
286
|
+
>
|
|
287
|
+
Publish Cast
|
|
288
|
+
</Button>
|
|
289
|
+
<Button
|
|
290
|
+
variant="outline"
|
|
291
|
+
onClick={() =>
|
|
292
|
+
toast("New follower: @vitalik.eth", {
|
|
293
|
+
description: "They followed you 2 minutes ago",
|
|
294
|
+
action: {
|
|
295
|
+
label: "Follow Back",
|
|
296
|
+
onClick: () => toast.success("Followed @vitalik.eth")
|
|
297
|
+
}
|
|
298
|
+
})
|
|
299
|
+
}
|
|
300
|
+
>
|
|
301
|
+
Follow Notification
|
|
302
|
+
</Button>
|
|
303
|
+
<Button
|
|
304
|
+
variant="outline"
|
|
305
|
+
onClick={() => {
|
|
306
|
+
const mintPromise = new Promise((resolve) => setTimeout(resolve, 3000));
|
|
307
|
+
toast.promise(mintPromise, {
|
|
308
|
+
loading: "Minting Frame NFT...",
|
|
309
|
+
success: "NFT minted successfully! View on OpenSea",
|
|
310
|
+
error: "Failed to mint NFT"
|
|
311
|
+
});
|
|
312
|
+
}}
|
|
313
|
+
>
|
|
314
|
+
Mint Frame NFT
|
|
315
|
+
</Button>
|
|
316
|
+
<Button
|
|
317
|
+
variant="outline"
|
|
318
|
+
onClick={() =>
|
|
319
|
+
toast.warning("API rate limit approaching", {
|
|
320
|
+
description: "85% of your hourly limit used",
|
|
321
|
+
action: {
|
|
322
|
+
label: "Upgrade Plan",
|
|
323
|
+
onClick: () => console.log("Opening billing...")
|
|
324
|
+
}
|
|
325
|
+
})
|
|
326
|
+
}
|
|
327
|
+
>
|
|
328
|
+
Rate Limit Warning
|
|
329
|
+
</Button>
|
|
330
|
+
<Button
|
|
331
|
+
variant="outline"
|
|
332
|
+
onClick={() =>
|
|
333
|
+
toast("Cast deleted", {
|
|
334
|
+
description: "Your cast has been removed from the feed",
|
|
335
|
+
action: {
|
|
336
|
+
label: "Undo",
|
|
337
|
+
onClick: () => toast.success("Cast restored")
|
|
338
|
+
}
|
|
339
|
+
})
|
|
340
|
+
}
|
|
341
|
+
>
|
|
342
|
+
Delete Cast
|
|
343
|
+
</Button>
|
|
344
|
+
<Button
|
|
345
|
+
variant="outline"
|
|
346
|
+
onClick={() =>
|
|
347
|
+
toast.info("Frame analytics ready", {
|
|
348
|
+
description: "View engagement data for your latest Frame",
|
|
349
|
+
action: {
|
|
350
|
+
label: "View Analytics",
|
|
351
|
+
onClick: () => console.log("Opening analytics...")
|
|
352
|
+
}
|
|
353
|
+
})
|
|
354
|
+
}
|
|
355
|
+
>
|
|
356
|
+
Analytics Update
|
|
357
|
+
</Button>
|
|
358
|
+
</div>
|
|
359
|
+
|
|
360
|
+
<div className="border-t pt-4">
|
|
361
|
+
<Button
|
|
362
|
+
variant="ghost"
|
|
363
|
+
size="sm"
|
|
364
|
+
className="w-full"
|
|
365
|
+
onClick={() => toast.dismiss()}
|
|
366
|
+
>
|
|
367
|
+
Clear All Notifications
|
|
368
|
+
</Button>
|
|
369
|
+
</div>
|
|
370
|
+
</CardContent>
|
|
371
|
+
</Card>
|
|
372
|
+
),
|
|
373
|
+
};
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react-vite";
|
|
2
|
+
import { Stack } from "../stack";
|
|
3
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../card";
|
|
4
|
+
import { Button } from "../button";
|
|
5
|
+
import { Badge } from "../badge";
|
|
6
|
+
import { Avatar, AvatarFallback, AvatarImage } from "../avatar";
|
|
7
|
+
import { Input } from "../input";
|
|
8
|
+
|
|
9
|
+
const meta = {
|
|
10
|
+
title: "Layout and Structure/Stack",
|
|
11
|
+
component: Stack,
|
|
12
|
+
parameters: {
|
|
13
|
+
layout: "centered",
|
|
14
|
+
docs: {
|
|
15
|
+
description: {
|
|
16
|
+
component:
|
|
17
|
+
"A layout component that arranges children with consistent spacing. Useful for creating vertical or horizontal layouts with predefined spacing values.",
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
tags: ["autodocs"],
|
|
22
|
+
argTypes: {
|
|
23
|
+
spacing: {
|
|
24
|
+
control: { type: "select" },
|
|
25
|
+
options: [1, 2, 3, 4, 6, 8, 12],
|
|
26
|
+
description: "The spacing between children",
|
|
27
|
+
},
|
|
28
|
+
direction: {
|
|
29
|
+
control: { type: "radio" },
|
|
30
|
+
options: ["vertical", "horizontal"],
|
|
31
|
+
description: "The direction of the stack",
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
} satisfies Meta<typeof Stack>;
|
|
35
|
+
|
|
36
|
+
export default meta;
|
|
37
|
+
type Story = StoryObj<typeof meta>;
|
|
38
|
+
|
|
39
|
+
export const Interactive: Story = {
|
|
40
|
+
args: {
|
|
41
|
+
spacing: 4,
|
|
42
|
+
direction: "vertical",
|
|
43
|
+
className: "w-[300px]",
|
|
44
|
+
},
|
|
45
|
+
render: (args) => (
|
|
46
|
+
<Stack {...args}>
|
|
47
|
+
<Card>
|
|
48
|
+
<CardHeader>
|
|
49
|
+
<CardTitle>First Card</CardTitle>
|
|
50
|
+
<CardDescription>This is the first card in the stack</CardDescription>
|
|
51
|
+
</CardHeader>
|
|
52
|
+
</Card>
|
|
53
|
+
<Card>
|
|
54
|
+
<CardHeader>
|
|
55
|
+
<CardTitle>Second Card</CardTitle>
|
|
56
|
+
<CardDescription>This is the second card in the stack</CardDescription>
|
|
57
|
+
</CardHeader>
|
|
58
|
+
</Card>
|
|
59
|
+
<Card>
|
|
60
|
+
<CardHeader>
|
|
61
|
+
<CardTitle>Third Card</CardTitle>
|
|
62
|
+
<CardDescription>This is the third card in the stack</CardDescription>
|
|
63
|
+
</CardHeader>
|
|
64
|
+
</Card>
|
|
65
|
+
</Stack>
|
|
66
|
+
),
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export const Variants: Story = {
|
|
70
|
+
render: () => (
|
|
71
|
+
<div className="space-y-8">
|
|
72
|
+
{/* Direction Variants */}
|
|
73
|
+
<div>
|
|
74
|
+
<h3 className="text-lg font-semibold mb-4">Direction Variants</h3>
|
|
75
|
+
<div className="grid grid-cols-1 md:grid-cols-2 gap-8">
|
|
76
|
+
<div>
|
|
77
|
+
<p className="text-sm font-medium mb-3">Vertical (Default)</p>
|
|
78
|
+
<Stack spacing={3}>
|
|
79
|
+
<Button>First Button</Button>
|
|
80
|
+
<Button variant="outline">Second Button</Button>
|
|
81
|
+
<Button variant="ghost">Third Button</Button>
|
|
82
|
+
</Stack>
|
|
83
|
+
</div>
|
|
84
|
+
<div>
|
|
85
|
+
<p className="text-sm font-medium mb-3">Horizontal</p>
|
|
86
|
+
<Stack direction="horizontal" spacing={3}>
|
|
87
|
+
<Button>First</Button>
|
|
88
|
+
<Button variant="outline">Second</Button>
|
|
89
|
+
<Button variant="ghost">Third</Button>
|
|
90
|
+
</Stack>
|
|
91
|
+
</div>
|
|
92
|
+
</div>
|
|
93
|
+
</div>
|
|
94
|
+
|
|
95
|
+
{/* Spacing Variants */}
|
|
96
|
+
<div>
|
|
97
|
+
<h3 className="text-lg font-semibold mb-4">Spacing Variants</h3>
|
|
98
|
+
<div className="grid grid-cols-2 md:grid-cols-4 gap-6">
|
|
99
|
+
{[1, 2, 4, 8].map((spacing) => (
|
|
100
|
+
<div key={spacing}>
|
|
101
|
+
<p className="text-sm font-medium mb-2">Spacing {spacing}</p>
|
|
102
|
+
<Stack spacing={spacing as 1 | 2 | 4 | 8}>
|
|
103
|
+
<Badge>Item 1</Badge>
|
|
104
|
+
<Badge variant="outline">Item 2</Badge>
|
|
105
|
+
<Badge variant="secondary">Item 3</Badge>
|
|
106
|
+
</Stack>
|
|
107
|
+
</div>
|
|
108
|
+
))}
|
|
109
|
+
</div>
|
|
110
|
+
</div>
|
|
111
|
+
|
|
112
|
+
{/* Combined Variants */}
|
|
113
|
+
<div>
|
|
114
|
+
<h3 className="text-lg font-semibold mb-4">Combined Usage</h3>
|
|
115
|
+
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
|
116
|
+
<div>
|
|
117
|
+
<p className="text-sm font-medium mb-2">Vertical + Large Spacing</p>
|
|
118
|
+
<Stack spacing={6} className="p-4 border rounded-lg">
|
|
119
|
+
<Input placeholder="Email" />
|
|
120
|
+
<Input placeholder="Password" />
|
|
121
|
+
<Button>Sign In</Button>
|
|
122
|
+
</Stack>
|
|
123
|
+
</div>
|
|
124
|
+
<div>
|
|
125
|
+
<p className="text-sm font-medium mb-2">Horizontal + Tight Spacing</p>
|
|
126
|
+
<Stack direction="horizontal" spacing={1} className="p-4 border rounded-lg">
|
|
127
|
+
<Button size="sm">❤️</Button>
|
|
128
|
+
<Button size="sm" variant="outline">🔄</Button>
|
|
129
|
+
<Button size="sm" variant="outline">💬</Button>
|
|
130
|
+
<Button size="sm" variant="outline">📤</Button>
|
|
131
|
+
</Stack>
|
|
132
|
+
</div>
|
|
133
|
+
</div>
|
|
134
|
+
</div>
|
|
135
|
+
</div>
|
|
136
|
+
),
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
export const InContext: Story = {
|
|
140
|
+
render: () => (
|
|
141
|
+
<div className="max-w-md mx-auto">
|
|
142
|
+
{/* User Profile Card - Real-world usage example */}
|
|
143
|
+
<Card>
|
|
144
|
+
<CardHeader>
|
|
145
|
+
<Stack spacing={4}>
|
|
146
|
+
{/* Header with avatar and info */}
|
|
147
|
+
<Stack direction="horizontal" spacing={4} className="items-center">
|
|
148
|
+
<Avatar className="h-16 w-16">
|
|
149
|
+
<AvatarImage src="https://github.com/shadcn.png" />
|
|
150
|
+
<AvatarFallback>DW</AvatarFallback>
|
|
151
|
+
</Avatar>
|
|
152
|
+
<Stack spacing={1}>
|
|
153
|
+
<h3 className="font-semibold text-lg">Dan Williams</h3>
|
|
154
|
+
<p className="text-sm text-muted-foreground">@dwr.eth</p>
|
|
155
|
+
<Stack direction="horizontal" spacing={2}>
|
|
156
|
+
<Badge variant="secondary">Verified</Badge>
|
|
157
|
+
<Badge variant="outline">Active</Badge>
|
|
158
|
+
</Stack>
|
|
159
|
+
</Stack>
|
|
160
|
+
</Stack>
|
|
161
|
+
|
|
162
|
+
{/* Bio section */}
|
|
163
|
+
<p className="text-sm">
|
|
164
|
+
Building the future of decentralized social networks.
|
|
165
|
+
Previously co-founded Coinbase. Passionate about crypto,
|
|
166
|
+
developer tools, and community building.
|
|
167
|
+
</p>
|
|
168
|
+
|
|
169
|
+
{/* Stats section */}
|
|
170
|
+
<Stack direction="horizontal" spacing={6} className="justify-center">
|
|
171
|
+
<Stack spacing={1} className="items-center">
|
|
172
|
+
<p className="font-semibold text-lg">12.5k</p>
|
|
173
|
+
<p className="text-xs text-muted-foreground">Followers</p>
|
|
174
|
+
</Stack>
|
|
175
|
+
<Stack spacing={1} className="items-center">
|
|
176
|
+
<p className="font-semibold text-lg">842</p>
|
|
177
|
+
<p className="text-xs text-muted-foreground">Following</p>
|
|
178
|
+
</Stack>
|
|
179
|
+
<Stack spacing={1} className="items-center">
|
|
180
|
+
<p className="font-semibold text-lg">1.2k</p>
|
|
181
|
+
<p className="text-xs text-muted-foreground">Casts</p>
|
|
182
|
+
</Stack>
|
|
183
|
+
</Stack>
|
|
184
|
+
|
|
185
|
+
{/* Action buttons */}
|
|
186
|
+
<Stack direction="horizontal" spacing={3}>
|
|
187
|
+
<Button className="flex-1">Follow</Button>
|
|
188
|
+
<Button variant="outline" className="flex-1">Message</Button>
|
|
189
|
+
<Button variant="ghost" size="icon">⋯</Button>
|
|
190
|
+
</Stack>
|
|
191
|
+
</Stack>
|
|
192
|
+
</CardHeader>
|
|
193
|
+
</Card>
|
|
194
|
+
|
|
195
|
+
{/* Recent Activity - showing nested stacks */}
|
|
196
|
+
<Card className="mt-6">
|
|
197
|
+
<CardHeader>
|
|
198
|
+
<CardTitle>Recent Activity</CardTitle>
|
|
199
|
+
</CardHeader>
|
|
200
|
+
<CardContent>
|
|
201
|
+
<Stack spacing={4}>
|
|
202
|
+
{[
|
|
203
|
+
{ action: "Published a new cast", time: "2 hours ago", content: "Just shipped a major update to Farcaster frames!" },
|
|
204
|
+
{ action: "Liked a cast", time: "4 hours ago", content: "Great insights on decentralized identity" },
|
|
205
|
+
{ action: "Followed 3 new users", time: "1 day ago", content: "" }
|
|
206
|
+
].map((activity, i) => (
|
|
207
|
+
<Stack key={i} spacing={2} className="p-3 border rounded-lg">
|
|
208
|
+
<Stack direction="horizontal" spacing={2} className="items-center justify-between">
|
|
209
|
+
<p className="text-sm font-medium">{activity.action}</p>
|
|
210
|
+
<p className="text-xs text-muted-foreground">{activity.time}</p>
|
|
211
|
+
</Stack>
|
|
212
|
+
{activity.content && (
|
|
213
|
+
<p className="text-sm text-muted-foreground">{activity.content}</p>
|
|
214
|
+
)}
|
|
215
|
+
</Stack>
|
|
216
|
+
))}
|
|
217
|
+
</Stack>
|
|
218
|
+
</CardContent>
|
|
219
|
+
</Card>
|
|
220
|
+
</div>
|
|
221
|
+
),
|
|
222
|
+
};
|