@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,280 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react-vite";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { TextField } from "../text-field";
|
|
4
|
+
import { Button } from "../button";
|
|
5
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../card";
|
|
6
|
+
|
|
7
|
+
const meta = {
|
|
8
|
+
title: "Form & Input/TextField",
|
|
9
|
+
component: TextField,
|
|
10
|
+
parameters: {
|
|
11
|
+
layout: "centered",
|
|
12
|
+
docs: {
|
|
13
|
+
description: {
|
|
14
|
+
component:
|
|
15
|
+
"A complete form field component that combines input, label, helper text, and error handling. Built on top of the Input component with enhanced accessibility and UX features.",
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
tags: ["autodocs"],
|
|
20
|
+
argTypes: {
|
|
21
|
+
label: {
|
|
22
|
+
control: { type: "text" },
|
|
23
|
+
description: "The label for the input field",
|
|
24
|
+
},
|
|
25
|
+
helperText: {
|
|
26
|
+
control: { type: "text" },
|
|
27
|
+
description: "Helper text displayed below the input",
|
|
28
|
+
},
|
|
29
|
+
error: {
|
|
30
|
+
control: { type: "text" },
|
|
31
|
+
description: "Error message to display (takes precedence over helperText)",
|
|
32
|
+
},
|
|
33
|
+
required: {
|
|
34
|
+
control: { type: "boolean" },
|
|
35
|
+
description: "Whether the field is required",
|
|
36
|
+
},
|
|
37
|
+
type: {
|
|
38
|
+
control: { type: "select" },
|
|
39
|
+
options: ["text", "email", "password", "number", "tel", "url", "search"],
|
|
40
|
+
description: "The input type",
|
|
41
|
+
},
|
|
42
|
+
disabled: {
|
|
43
|
+
control: { type: "boolean" },
|
|
44
|
+
description: "Whether the field is disabled",
|
|
45
|
+
},
|
|
46
|
+
placeholder: {
|
|
47
|
+
control: { type: "text" },
|
|
48
|
+
description: "Placeholder text for the input",
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
} satisfies Meta<typeof TextField>;
|
|
52
|
+
|
|
53
|
+
export default meta;
|
|
54
|
+
type Story = StoryObj<typeof meta>;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Interactive playground for testing all TextField props and variants.
|
|
58
|
+
* Use the controls below to experiment with different configurations.
|
|
59
|
+
*/
|
|
60
|
+
export const Interactive: Story = {
|
|
61
|
+
args: {
|
|
62
|
+
label: "Username",
|
|
63
|
+
placeholder: "Enter your username",
|
|
64
|
+
helperText: "Choose a unique username (3-20 characters)",
|
|
65
|
+
required: false,
|
|
66
|
+
disabled: false,
|
|
67
|
+
type: "text",
|
|
68
|
+
},
|
|
69
|
+
render: (args) => (
|
|
70
|
+
<div className="w-[350px]">
|
|
71
|
+
<TextField {...args} />
|
|
72
|
+
</div>
|
|
73
|
+
),
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Showcase of all TextField variants and states.
|
|
78
|
+
* Demonstrates the component in different configurations for design reference.
|
|
79
|
+
*/
|
|
80
|
+
export const Variants: Story = {
|
|
81
|
+
render: () => (
|
|
82
|
+
<div className="space-y-8 w-[400px]">
|
|
83
|
+
{/* Basic States */}
|
|
84
|
+
<div>
|
|
85
|
+
<h3 className="mb-4 text-lg font-semibold">Basic States</h3>
|
|
86
|
+
<div className="space-y-4">
|
|
87
|
+
<TextField
|
|
88
|
+
label="Default Field"
|
|
89
|
+
placeholder="Default state"
|
|
90
|
+
/>
|
|
91
|
+
<TextField
|
|
92
|
+
label="With Helper Text"
|
|
93
|
+
placeholder="Enter value"
|
|
94
|
+
helperText="This is helpful information"
|
|
95
|
+
/>
|
|
96
|
+
<TextField
|
|
97
|
+
label="Required Field"
|
|
98
|
+
placeholder="Required input"
|
|
99
|
+
required
|
|
100
|
+
/>
|
|
101
|
+
<TextField
|
|
102
|
+
label="Disabled Field"
|
|
103
|
+
placeholder="Cannot edit"
|
|
104
|
+
disabled
|
|
105
|
+
defaultValue="Disabled value"
|
|
106
|
+
/>
|
|
107
|
+
</div>
|
|
108
|
+
</div>
|
|
109
|
+
|
|
110
|
+
{/* Error State */}
|
|
111
|
+
<div>
|
|
112
|
+
<h3 className="mb-4 text-lg font-semibold">Error State</h3>
|
|
113
|
+
<div className="space-y-4">
|
|
114
|
+
<TextField
|
|
115
|
+
label="Field with Error"
|
|
116
|
+
placeholder="Invalid input"
|
|
117
|
+
error="This field contains an error"
|
|
118
|
+
defaultValue="invalid@"
|
|
119
|
+
/>
|
|
120
|
+
<TextField
|
|
121
|
+
label="Required Field Error"
|
|
122
|
+
placeholder="Required field"
|
|
123
|
+
required
|
|
124
|
+
error="This field is required"
|
|
125
|
+
/>
|
|
126
|
+
</div>
|
|
127
|
+
</div>
|
|
128
|
+
|
|
129
|
+
{/* Input Types */}
|
|
130
|
+
<div>
|
|
131
|
+
<h3 className="mb-4 text-lg font-semibold">Input Types</h3>
|
|
132
|
+
<div className="space-y-4">
|
|
133
|
+
<TextField
|
|
134
|
+
label="Email"
|
|
135
|
+
type="email"
|
|
136
|
+
placeholder="user@example.com"
|
|
137
|
+
helperText="We'll never share your email"
|
|
138
|
+
/>
|
|
139
|
+
<TextField
|
|
140
|
+
label="Password"
|
|
141
|
+
type="password"
|
|
142
|
+
placeholder="Enter password"
|
|
143
|
+
helperText="Must be at least 8 characters"
|
|
144
|
+
/>
|
|
145
|
+
<TextField
|
|
146
|
+
label="Number"
|
|
147
|
+
type="number"
|
|
148
|
+
placeholder="123"
|
|
149
|
+
helperText="Numeric values only"
|
|
150
|
+
/>
|
|
151
|
+
<TextField
|
|
152
|
+
label="URL"
|
|
153
|
+
type="url"
|
|
154
|
+
placeholder="https://example.com"
|
|
155
|
+
helperText="Must be a valid URL"
|
|
156
|
+
/>
|
|
157
|
+
</div>
|
|
158
|
+
</div>
|
|
159
|
+
</div>
|
|
160
|
+
),
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Real-world example showing TextField in a Farcaster profile form context.
|
|
165
|
+
* Demonstrates how the component works in practical applications.
|
|
166
|
+
*/
|
|
167
|
+
export const InContext: Story = {
|
|
168
|
+
render: function ProfileFormExample() {
|
|
169
|
+
const [formData, setFormData] = React.useState({
|
|
170
|
+
username: "",
|
|
171
|
+
displayName: "",
|
|
172
|
+
bio: "",
|
|
173
|
+
website: "",
|
|
174
|
+
});
|
|
175
|
+
const [errors, setErrors] = React.useState<Record<string, string>>({});
|
|
176
|
+
|
|
177
|
+
const handleSubmit = (e: React.FormEvent) => {
|
|
178
|
+
e.preventDefault();
|
|
179
|
+
const newErrors: Record<string, string> = {};
|
|
180
|
+
|
|
181
|
+
if (!formData.username) {
|
|
182
|
+
newErrors.username = "Username is required";
|
|
183
|
+
} else if (formData.username.length < 3) {
|
|
184
|
+
newErrors.username = "Username must be at least 3 characters";
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
if (!formData.displayName) {
|
|
188
|
+
newErrors.displayName = "Display name is required";
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
if (formData.website && !formData.website.startsWith("http")) {
|
|
192
|
+
newErrors.website = "Website must be a valid URL";
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
setErrors(newErrors);
|
|
196
|
+
|
|
197
|
+
if (Object.keys(newErrors).length === 0) {
|
|
198
|
+
console.log("Profile updated:", formData);
|
|
199
|
+
// In a real app, this would make an API call
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
const updateField = (field: string, value: string) => {
|
|
204
|
+
setFormData(prev => ({ ...prev, [field]: value }));
|
|
205
|
+
// Clear error when user starts typing
|
|
206
|
+
if (errors[field]) {
|
|
207
|
+
setErrors(prev => ({ ...prev, [field]: "" }));
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
return (
|
|
212
|
+
<Card className="w-[450px]">
|
|
213
|
+
<CardHeader>
|
|
214
|
+
<CardTitle>Edit Farcaster Profile</CardTitle>
|
|
215
|
+
<CardDescription>
|
|
216
|
+
Update your profile information to customize how you appear to others
|
|
217
|
+
</CardDescription>
|
|
218
|
+
</CardHeader>
|
|
219
|
+
<CardContent>
|
|
220
|
+
<form onSubmit={handleSubmit} className="space-y-6">
|
|
221
|
+
<TextField
|
|
222
|
+
label="Username"
|
|
223
|
+
placeholder="@username"
|
|
224
|
+
required
|
|
225
|
+
value={formData.username}
|
|
226
|
+
onChange={(e) => updateField("username", e.target.value)}
|
|
227
|
+
error={errors.username}
|
|
228
|
+
helperText="3-20 characters, letters and numbers only"
|
|
229
|
+
/>
|
|
230
|
+
|
|
231
|
+
<TextField
|
|
232
|
+
label="Display Name"
|
|
233
|
+
placeholder="Your full name"
|
|
234
|
+
required
|
|
235
|
+
value={formData.displayName}
|
|
236
|
+
onChange={(e) => updateField("displayName", e.target.value)}
|
|
237
|
+
error={errors.displayName}
|
|
238
|
+
helperText="How your name appears in the app"
|
|
239
|
+
/>
|
|
240
|
+
|
|
241
|
+
<TextField
|
|
242
|
+
label="Bio"
|
|
243
|
+
placeholder="Tell others about yourself..."
|
|
244
|
+
value={formData.bio}
|
|
245
|
+
onChange={(e) => updateField("bio", e.target.value)}
|
|
246
|
+
helperText={`${formData.bio.length}/160 characters`}
|
|
247
|
+
maxLength={160}
|
|
248
|
+
/>
|
|
249
|
+
|
|
250
|
+
<TextField
|
|
251
|
+
label="Website"
|
|
252
|
+
type="url"
|
|
253
|
+
placeholder="https://yourwebsite.com"
|
|
254
|
+
value={formData.website}
|
|
255
|
+
onChange={(e) => updateField("website", e.target.value)}
|
|
256
|
+
error={errors.website}
|
|
257
|
+
helperText="Optional: Link to your personal website or portfolio"
|
|
258
|
+
/>
|
|
259
|
+
|
|
260
|
+
<div className="flex gap-3 pt-2">
|
|
261
|
+
<Button type="submit" className="flex-1">
|
|
262
|
+
Save Changes
|
|
263
|
+
</Button>
|
|
264
|
+
<Button
|
|
265
|
+
type="button"
|
|
266
|
+
variant="outline"
|
|
267
|
+
onClick={() => {
|
|
268
|
+
setFormData({username: "", displayName: "", bio: "", website: ""});
|
|
269
|
+
setErrors({});
|
|
270
|
+
}}
|
|
271
|
+
>
|
|
272
|
+
Reset
|
|
273
|
+
</Button>
|
|
274
|
+
</div>
|
|
275
|
+
</form>
|
|
276
|
+
</CardContent>
|
|
277
|
+
</Card>
|
|
278
|
+
);
|
|
279
|
+
},
|
|
280
|
+
};
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react-vite";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { Textarea } from "../textarea";
|
|
4
|
+
import { Label } from "../label";
|
|
5
|
+
import { Button } from "../button";
|
|
6
|
+
import {
|
|
7
|
+
Card,
|
|
8
|
+
CardContent,
|
|
9
|
+
CardDescription,
|
|
10
|
+
CardHeader,
|
|
11
|
+
CardTitle,
|
|
12
|
+
} from "../card";
|
|
13
|
+
import { Avatar, AvatarFallback } from "../avatar";
|
|
14
|
+
|
|
15
|
+
const meta = {
|
|
16
|
+
title: "Form & Input/Textarea",
|
|
17
|
+
component: Textarea,
|
|
18
|
+
parameters: {
|
|
19
|
+
layout: "centered",
|
|
20
|
+
docs: {
|
|
21
|
+
description: {
|
|
22
|
+
component:
|
|
23
|
+
"A multi-line text input control for entering longer pieces of text. Features automatic content-based resizing and consistent styling with other form elements.",
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
tags: ["autodocs"],
|
|
28
|
+
argTypes: {
|
|
29
|
+
placeholder: {
|
|
30
|
+
control: { type: "text" },
|
|
31
|
+
description: "Placeholder text displayed when empty",
|
|
32
|
+
},
|
|
33
|
+
disabled: {
|
|
34
|
+
control: { type: "boolean" },
|
|
35
|
+
description: "Whether the textarea is disabled",
|
|
36
|
+
},
|
|
37
|
+
rows: {
|
|
38
|
+
control: { type: "number", min: 1, max: 10 },
|
|
39
|
+
description: "Number of visible text lines for initial height",
|
|
40
|
+
},
|
|
41
|
+
readOnly: {
|
|
42
|
+
control: { type: "boolean" },
|
|
43
|
+
description: "Whether the textarea is read-only",
|
|
44
|
+
},
|
|
45
|
+
maxLength: {
|
|
46
|
+
control: { type: "number", min: 0, max: 1000 },
|
|
47
|
+
description: "Maximum number of characters allowed",
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
} satisfies Meta<typeof Textarea>;
|
|
51
|
+
|
|
52
|
+
export default meta;
|
|
53
|
+
type Story = StoryObj<typeof meta>;
|
|
54
|
+
|
|
55
|
+
export const Interactive: Story = {
|
|
56
|
+
args: {
|
|
57
|
+
placeholder: "Type your message here...",
|
|
58
|
+
rows: 4,
|
|
59
|
+
disabled: false,
|
|
60
|
+
readOnly: false,
|
|
61
|
+
},
|
|
62
|
+
render: (args) => (
|
|
63
|
+
<div className="w-[400px] space-y-2">
|
|
64
|
+
<Label htmlFor="interactive-textarea">Interactive Textarea</Label>
|
|
65
|
+
<Textarea id="interactive-textarea" {...args} />
|
|
66
|
+
<p className="text-sm text-muted-foreground">
|
|
67
|
+
Adjust the controls to see different states and configurations
|
|
68
|
+
</p>
|
|
69
|
+
</div>
|
|
70
|
+
),
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
export const Variants: Story = {
|
|
74
|
+
render: () => (
|
|
75
|
+
<div className="space-y-6 w-[500px]">
|
|
76
|
+
<div className="space-y-4">
|
|
77
|
+
<h3 className="text-lg font-semibold">States</h3>
|
|
78
|
+
|
|
79
|
+
<div className="space-y-2">
|
|
80
|
+
<Label>Default</Label>
|
|
81
|
+
<Textarea placeholder="Default textarea" />
|
|
82
|
+
</div>
|
|
83
|
+
|
|
84
|
+
<div className="space-y-2">
|
|
85
|
+
<Label>With content</Label>
|
|
86
|
+
<Textarea defaultValue="This textarea has some content already filled in." />
|
|
87
|
+
</div>
|
|
88
|
+
|
|
89
|
+
<div className="space-y-2">
|
|
90
|
+
<Label>Disabled</Label>
|
|
91
|
+
<Textarea disabled placeholder="This textarea is disabled" />
|
|
92
|
+
</div>
|
|
93
|
+
|
|
94
|
+
<div className="space-y-2">
|
|
95
|
+
<Label>Read-only</Label>
|
|
96
|
+
<Textarea readOnly defaultValue="This content cannot be modified." />
|
|
97
|
+
</div>
|
|
98
|
+
|
|
99
|
+
<div className="space-y-2">
|
|
100
|
+
<Label className="text-destructive">Error state</Label>
|
|
101
|
+
<Textarea
|
|
102
|
+
placeholder="Enter your feedback"
|
|
103
|
+
aria-invalid="true"
|
|
104
|
+
aria-describedby="error-message"
|
|
105
|
+
/>
|
|
106
|
+
<p id="error-message" className="text-sm text-destructive">
|
|
107
|
+
This field is required
|
|
108
|
+
</p>
|
|
109
|
+
</div>
|
|
110
|
+
</div>
|
|
111
|
+
|
|
112
|
+
<div className="space-y-4">
|
|
113
|
+
<h3 className="text-lg font-semibold">Sizes</h3>
|
|
114
|
+
|
|
115
|
+
<div className="space-y-2">
|
|
116
|
+
<Label>Small (2 rows)</Label>
|
|
117
|
+
<Textarea placeholder="Small textarea" rows={2} />
|
|
118
|
+
</div>
|
|
119
|
+
|
|
120
|
+
<div className="space-y-2">
|
|
121
|
+
<Label>Default (auto-sizing)</Label>
|
|
122
|
+
<Textarea placeholder="Auto-sizing textarea" />
|
|
123
|
+
</div>
|
|
124
|
+
|
|
125
|
+
<div className="space-y-2">
|
|
126
|
+
<Label>Large (6 rows)</Label>
|
|
127
|
+
<Textarea placeholder="Large textarea" rows={6} />
|
|
128
|
+
</div>
|
|
129
|
+
</div>
|
|
130
|
+
</div>
|
|
131
|
+
),
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
export const InContext: Story = {
|
|
135
|
+
render: function CastComposerExample() {
|
|
136
|
+
const [content, setContent] = React.useState("");
|
|
137
|
+
const [reply, setReply] = React.useState("");
|
|
138
|
+
const [isReplying, setIsReplying] = React.useState(false);
|
|
139
|
+
const maxLength = 320;
|
|
140
|
+
|
|
141
|
+
return (
|
|
142
|
+
<div className="space-y-6 w-[600px]">
|
|
143
|
+
<Card>
|
|
144
|
+
<CardHeader>
|
|
145
|
+
<CardTitle>Create New Cast</CardTitle>
|
|
146
|
+
<CardDescription>
|
|
147
|
+
Share an update with your followers on Farcaster
|
|
148
|
+
</CardDescription>
|
|
149
|
+
</CardHeader>
|
|
150
|
+
<CardContent className="space-y-4">
|
|
151
|
+
<div className="flex gap-3">
|
|
152
|
+
<Avatar>
|
|
153
|
+
<AvatarFallback>ME</AvatarFallback>
|
|
154
|
+
</Avatar>
|
|
155
|
+
<div className="flex-1 space-y-2">
|
|
156
|
+
<Textarea
|
|
157
|
+
placeholder="What's happening?"
|
|
158
|
+
value={content}
|
|
159
|
+
onChange={(e) =>
|
|
160
|
+
setContent(e.target.value.slice(0, maxLength))
|
|
161
|
+
}
|
|
162
|
+
className="min-h-[100px]"
|
|
163
|
+
/>
|
|
164
|
+
<div className="flex justify-between items-center">
|
|
165
|
+
<div className="flex gap-2 text-sm text-muted-foreground">
|
|
166
|
+
<span>๐ท Image</span>
|
|
167
|
+
<span>๐ Link</span>
|
|
168
|
+
<span>๐ Poll</span>
|
|
169
|
+
</div>
|
|
170
|
+
<span className="text-sm text-muted-foreground">
|
|
171
|
+
{content.length}/{maxLength}
|
|
172
|
+
</span>
|
|
173
|
+
</div>
|
|
174
|
+
</div>
|
|
175
|
+
</div>
|
|
176
|
+
<div className="flex justify-end">
|
|
177
|
+
<Button disabled={!content.trim()}>Cast</Button>
|
|
178
|
+
</div>
|
|
179
|
+
</CardContent>
|
|
180
|
+
</Card>
|
|
181
|
+
|
|
182
|
+
<Card>
|
|
183
|
+
<CardContent className="pt-4">
|
|
184
|
+
<div className="space-y-4">
|
|
185
|
+
{/* Original cast */}
|
|
186
|
+
<div className="flex gap-3">
|
|
187
|
+
<Avatar>
|
|
188
|
+
<AvatarFallback>VB</AvatarFallback>
|
|
189
|
+
</Avatar>
|
|
190
|
+
<div className="flex-1">
|
|
191
|
+
<div className="flex items-center gap-2">
|
|
192
|
+
<span className="font-semibold">vitalik.eth</span>
|
|
193
|
+
<span className="text-sm text-muted-foreground">ยท 2h</span>
|
|
194
|
+
</div>
|
|
195
|
+
<p className="text-sm mt-1">
|
|
196
|
+
What are your thoughts on the future of decentralized social
|
|
197
|
+
networks? I believe we're just getting started with
|
|
198
|
+
protocols like Farcaster.
|
|
199
|
+
</p>
|
|
200
|
+
</div>
|
|
201
|
+
</div>
|
|
202
|
+
|
|
203
|
+
{/* Reply section */}
|
|
204
|
+
{!isReplying ? (
|
|
205
|
+
<Button
|
|
206
|
+
variant="ghost"
|
|
207
|
+
size="sm"
|
|
208
|
+
onClick={() => setIsReplying(true)}
|
|
209
|
+
className="ml-12"
|
|
210
|
+
>
|
|
211
|
+
๐ฌ Reply
|
|
212
|
+
</Button>
|
|
213
|
+
) : (
|
|
214
|
+
<div className="ml-12 space-y-3">
|
|
215
|
+
<Textarea
|
|
216
|
+
placeholder="Share your thoughts..."
|
|
217
|
+
value={reply}
|
|
218
|
+
onChange={(e) => setReply(e.target.value)}
|
|
219
|
+
className="min-h-[80px]"
|
|
220
|
+
autoFocus
|
|
221
|
+
/>
|
|
222
|
+
<div className="flex justify-between items-center">
|
|
223
|
+
<Button
|
|
224
|
+
variant="ghost"
|
|
225
|
+
size="sm"
|
|
226
|
+
onClick={() => {
|
|
227
|
+
setIsReplying(false);
|
|
228
|
+
setReply("");
|
|
229
|
+
}}
|
|
230
|
+
>
|
|
231
|
+
Cancel
|
|
232
|
+
</Button>
|
|
233
|
+
<Button size="sm" disabled={!reply.trim()}>
|
|
234
|
+
Reply
|
|
235
|
+
</Button>
|
|
236
|
+
</div>
|
|
237
|
+
</div>
|
|
238
|
+
)}
|
|
239
|
+
</div>
|
|
240
|
+
</CardContent>
|
|
241
|
+
</Card>
|
|
242
|
+
</div>
|
|
243
|
+
);
|
|
244
|
+
},
|
|
245
|
+
};
|