@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,378 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react-vite";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { DatePicker } from "../date-picker";
|
|
4
|
+
import { Button } from "../button";
|
|
5
|
+
import { cn } from "@/lib/utils";
|
|
6
|
+
|
|
7
|
+
const meta = {
|
|
8
|
+
title: "Form & Input/DatePicker",
|
|
9
|
+
component: DatePicker,
|
|
10
|
+
parameters: {
|
|
11
|
+
layout: "centered",
|
|
12
|
+
docs: {
|
|
13
|
+
description: {
|
|
14
|
+
component:
|
|
15
|
+
"A comprehensive date selection component that combines an accessible button trigger with a full-featured calendar popover. Built on shadcn/ui design principles with proper accessibility, keyboard navigation, and visual feedback.",
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
tags: ["autodocs"],
|
|
20
|
+
argTypes: {
|
|
21
|
+
date: {
|
|
22
|
+
control: { type: "date" },
|
|
23
|
+
description: "The currently selected date value. When undefined, no date is selected.",
|
|
24
|
+
},
|
|
25
|
+
onDateChange: {
|
|
26
|
+
action: "onDateChange",
|
|
27
|
+
description: "Callback function invoked when the user selects or clears a date.",
|
|
28
|
+
},
|
|
29
|
+
placeholder: {
|
|
30
|
+
control: { type: "text" },
|
|
31
|
+
description: "Placeholder text displayed when no date is selected.",
|
|
32
|
+
},
|
|
33
|
+
disabled: {
|
|
34
|
+
control: { type: "boolean" },
|
|
35
|
+
description: "When true, disables the date picker preventing user interaction.",
|
|
36
|
+
},
|
|
37
|
+
className: {
|
|
38
|
+
control: { type: "text" },
|
|
39
|
+
description: "Additional CSS classes to apply to the trigger button.",
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
args: {
|
|
43
|
+
placeholder: "Pick a date",
|
|
44
|
+
disabled: false,
|
|
45
|
+
},
|
|
46
|
+
} satisfies Meta<typeof DatePicker>;
|
|
47
|
+
|
|
48
|
+
export default meta;
|
|
49
|
+
type Story = StoryObj<typeof meta>;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Interactive playground for testing all DatePicker props and behaviors.
|
|
53
|
+
* Use the controls panel to experiment with different configurations.
|
|
54
|
+
*/
|
|
55
|
+
export const Interactive: Story = {
|
|
56
|
+
render: (args) => {
|
|
57
|
+
const [date, setDate] = useState<Date | undefined>(args.date);
|
|
58
|
+
|
|
59
|
+
const handleClearDate = () => setDate(undefined);
|
|
60
|
+
const handleSetToday = () => setDate(new Date());
|
|
61
|
+
const handleSetRandomDate = () => {
|
|
62
|
+
const randomDate = new Date();
|
|
63
|
+
randomDate.setDate(randomDate.getDate() + Math.floor(Math.random() * 365) - 180);
|
|
64
|
+
setDate(randomDate);
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
return (
|
|
68
|
+
<div className="space-y-4">
|
|
69
|
+
<DatePicker
|
|
70
|
+
{...args}
|
|
71
|
+
date={date}
|
|
72
|
+
onDateChange={setDate}
|
|
73
|
+
/>
|
|
74
|
+
|
|
75
|
+
<div className="flex gap-2 flex-wrap">
|
|
76
|
+
<Button
|
|
77
|
+
variant="outline"
|
|
78
|
+
size="sm"
|
|
79
|
+
onClick={handleSetToday}
|
|
80
|
+
>
|
|
81
|
+
Set Today
|
|
82
|
+
</Button>
|
|
83
|
+
<Button
|
|
84
|
+
variant="outline"
|
|
85
|
+
size="sm"
|
|
86
|
+
onClick={handleSetRandomDate}
|
|
87
|
+
>
|
|
88
|
+
Random Date
|
|
89
|
+
</Button>
|
|
90
|
+
<Button
|
|
91
|
+
variant="outline"
|
|
92
|
+
size="sm"
|
|
93
|
+
onClick={handleClearDate}
|
|
94
|
+
>
|
|
95
|
+
Clear
|
|
96
|
+
</Button>
|
|
97
|
+
</div>
|
|
98
|
+
|
|
99
|
+
<div className="text-sm text-muted-foreground space-y-1">
|
|
100
|
+
<div><strong>Selected:</strong> {date?.toDateString() || "No date selected"}</div>
|
|
101
|
+
<div><strong>ISO String:</strong> {date?.toISOString() || "N/A"}</div>
|
|
102
|
+
<div><strong>Locale String:</strong> {date?.toLocaleDateString() || "N/A"}</div>
|
|
103
|
+
</div>
|
|
104
|
+
</div>
|
|
105
|
+
);
|
|
106
|
+
},
|
|
107
|
+
args: {
|
|
108
|
+
placeholder: "Choose a date",
|
|
109
|
+
},
|
|
110
|
+
parameters: {
|
|
111
|
+
docs: {
|
|
112
|
+
description: {
|
|
113
|
+
story: "Interactive example with controls for testing all component props and helper buttons for common operations. Use the controls panel to modify props in real-time.",
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Comprehensive showcase of all DatePicker variants and configurations.
|
|
121
|
+
* Displays different states, sizes, and styling options side by side.
|
|
122
|
+
*/
|
|
123
|
+
export const Variants: Story = {
|
|
124
|
+
render: () => {
|
|
125
|
+
const [basicDate, setBasicDate] = useState<Date | undefined>();
|
|
126
|
+
const [preselectedDate, setPreselectedDate] = useState<Date | undefined>(new Date());
|
|
127
|
+
const [customDate, setCustomDate] = useState<Date | undefined>();
|
|
128
|
+
|
|
129
|
+
return (
|
|
130
|
+
<div className="space-y-6">
|
|
131
|
+
<div className="space-y-3">
|
|
132
|
+
<h3 className="text-lg font-semibold">Basic States</h3>
|
|
133
|
+
<div className="grid grid-cols-1 sm:grid-cols-2 gap-4">
|
|
134
|
+
<div className="space-y-2">
|
|
135
|
+
<label className="text-sm font-medium">Default (no date selected)</label>
|
|
136
|
+
<DatePicker
|
|
137
|
+
date={basicDate}
|
|
138
|
+
onDateChange={setBasicDate}
|
|
139
|
+
placeholder="Pick a date"
|
|
140
|
+
/>
|
|
141
|
+
</div>
|
|
142
|
+
|
|
143
|
+
<div className="space-y-2">
|
|
144
|
+
<label className="text-sm font-medium">With preselected date</label>
|
|
145
|
+
<DatePicker
|
|
146
|
+
date={preselectedDate}
|
|
147
|
+
onDateChange={setPreselectedDate}
|
|
148
|
+
placeholder="Pick a date"
|
|
149
|
+
/>
|
|
150
|
+
</div>
|
|
151
|
+
|
|
152
|
+
<div className="space-y-2">
|
|
153
|
+
<label className="text-sm font-medium">Disabled state</label>
|
|
154
|
+
<DatePicker
|
|
155
|
+
date={new Date()}
|
|
156
|
+
disabled={true}
|
|
157
|
+
placeholder="Date picker disabled"
|
|
158
|
+
/>
|
|
159
|
+
</div>
|
|
160
|
+
|
|
161
|
+
<div className="space-y-2">
|
|
162
|
+
<label className="text-sm font-medium">Custom placeholder</label>
|
|
163
|
+
<DatePicker
|
|
164
|
+
date={customDate}
|
|
165
|
+
onDateChange={setCustomDate}
|
|
166
|
+
placeholder="Select your birthday"
|
|
167
|
+
/>
|
|
168
|
+
</div>
|
|
169
|
+
</div>
|
|
170
|
+
</div>
|
|
171
|
+
|
|
172
|
+
<div className="space-y-3">
|
|
173
|
+
<h3 className="text-lg font-semibold">Width Variants</h3>
|
|
174
|
+
<div className="space-y-4">
|
|
175
|
+
<div className="space-y-2">
|
|
176
|
+
<label className="text-sm font-medium">Default width (240px)</label>
|
|
177
|
+
<DatePicker placeholder="Default width" />
|
|
178
|
+
</div>
|
|
179
|
+
|
|
180
|
+
<div className="space-y-2">
|
|
181
|
+
<label className="text-sm font-medium">Custom width (300px)</label>
|
|
182
|
+
<DatePicker
|
|
183
|
+
placeholder="Custom width"
|
|
184
|
+
className="w-[300px]"
|
|
185
|
+
/>
|
|
186
|
+
</div>
|
|
187
|
+
|
|
188
|
+
<div className="space-y-2">
|
|
189
|
+
<label className="text-sm font-medium">Compact width (180px)</label>
|
|
190
|
+
<DatePicker
|
|
191
|
+
placeholder="Compact"
|
|
192
|
+
className="w-[180px]"
|
|
193
|
+
/>
|
|
194
|
+
</div>
|
|
195
|
+
|
|
196
|
+
<div className="space-y-2">
|
|
197
|
+
<label className="text-sm font-medium">Full width</label>
|
|
198
|
+
<DatePicker
|
|
199
|
+
placeholder="Full width date picker"
|
|
200
|
+
className="w-full"
|
|
201
|
+
/>
|
|
202
|
+
</div>
|
|
203
|
+
</div>
|
|
204
|
+
</div>
|
|
205
|
+
</div>
|
|
206
|
+
);
|
|
207
|
+
},
|
|
208
|
+
parameters: {
|
|
209
|
+
docs: {
|
|
210
|
+
description: {
|
|
211
|
+
story: "Comprehensive display of all DatePicker variants including different states (default, preselected, disabled), custom placeholders, and width configurations.",
|
|
212
|
+
},
|
|
213
|
+
},
|
|
214
|
+
},
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Real-world usage examples showing DatePicker in typical application contexts.
|
|
219
|
+
* Demonstrates common patterns like date ranges, form integration, and validation.
|
|
220
|
+
*/
|
|
221
|
+
export const InContext: Story = {
|
|
222
|
+
render: () => {
|
|
223
|
+
const [startDate, setStartDate] = useState<Date | undefined>();
|
|
224
|
+
const [endDate, setEndDate] = useState<Date | undefined>();
|
|
225
|
+
const [birthDate, setBirthDate] = useState<Date | undefined>();
|
|
226
|
+
const [appointmentDate, setAppointmentDate] = useState<Date | undefined>();
|
|
227
|
+
|
|
228
|
+
// Validation for birth date (must be in the past)
|
|
229
|
+
const today = new Date();
|
|
230
|
+
const isBirthDateInFuture = birthDate && birthDate > today;
|
|
231
|
+
|
|
232
|
+
// Validation for appointment (must be in the future)
|
|
233
|
+
const isAppointmentInPast = appointmentDate && appointmentDate < today;
|
|
234
|
+
|
|
235
|
+
return (
|
|
236
|
+
<div className="max-w-2xl space-y-8">
|
|
237
|
+
{/* Date Range Selection */}
|
|
238
|
+
<div className="space-y-3">
|
|
239
|
+
<h3 className="text-lg font-semibold">Event Date Range</h3>
|
|
240
|
+
<p className="text-sm text-muted-foreground">
|
|
241
|
+
Select start and end dates for your event or booking.
|
|
242
|
+
</p>
|
|
243
|
+
<div className="flex gap-3 items-center flex-wrap">
|
|
244
|
+
<DatePicker
|
|
245
|
+
date={startDate}
|
|
246
|
+
onDateChange={setStartDate}
|
|
247
|
+
placeholder="Start date"
|
|
248
|
+
className="w-[180px]"
|
|
249
|
+
/>
|
|
250
|
+
<span className="text-muted-foreground">to</span>
|
|
251
|
+
<DatePicker
|
|
252
|
+
date={endDate}
|
|
253
|
+
onDateChange={setEndDate}
|
|
254
|
+
placeholder="End date"
|
|
255
|
+
className="w-[180px]"
|
|
256
|
+
/>
|
|
257
|
+
</div>
|
|
258
|
+
{startDate && endDate && (
|
|
259
|
+
<div className="text-sm text-muted-foreground bg-muted p-3 rounded-md">
|
|
260
|
+
<strong>Duration:</strong> {Math.ceil((endDate.getTime() - startDate.getTime()) / (1000 * 60 * 60 * 24))} days
|
|
261
|
+
</div>
|
|
262
|
+
)}
|
|
263
|
+
</div>
|
|
264
|
+
|
|
265
|
+
{/* Form with Validation */}
|
|
266
|
+
<div className="space-y-3">
|
|
267
|
+
<h3 className="text-lg font-semibold">Profile Information</h3>
|
|
268
|
+
<p className="text-sm text-muted-foreground">
|
|
269
|
+
Date picker with validation in a form context.
|
|
270
|
+
</p>
|
|
271
|
+
<div className="space-y-4">
|
|
272
|
+
<div className="space-y-2">
|
|
273
|
+
<label className="text-sm font-medium">Birth Date</label>
|
|
274
|
+
<DatePicker
|
|
275
|
+
date={birthDate}
|
|
276
|
+
onDateChange={setBirthDate}
|
|
277
|
+
placeholder="Select your birth date"
|
|
278
|
+
className={cn(
|
|
279
|
+
"w-full",
|
|
280
|
+
isBirthDateInFuture && "border-destructive"
|
|
281
|
+
)}
|
|
282
|
+
/>
|
|
283
|
+
{isBirthDateInFuture && (
|
|
284
|
+
<p className="text-sm text-destructive">
|
|
285
|
+
Birth date cannot be in the future.
|
|
286
|
+
</p>
|
|
287
|
+
)}
|
|
288
|
+
</div>
|
|
289
|
+
|
|
290
|
+
<div className="space-y-2">
|
|
291
|
+
<label className="text-sm font-medium">Appointment Date</label>
|
|
292
|
+
<DatePicker
|
|
293
|
+
date={appointmentDate}
|
|
294
|
+
onDateChange={setAppointmentDate}
|
|
295
|
+
placeholder="Schedule your appointment"
|
|
296
|
+
className={cn(
|
|
297
|
+
"w-full",
|
|
298
|
+
isAppointmentInPast && "border-destructive"
|
|
299
|
+
)}
|
|
300
|
+
/>
|
|
301
|
+
{isAppointmentInPast && (
|
|
302
|
+
<p className="text-sm text-destructive">
|
|
303
|
+
Appointment must be scheduled for a future date.
|
|
304
|
+
</p>
|
|
305
|
+
)}
|
|
306
|
+
</div>
|
|
307
|
+
</div>
|
|
308
|
+
</div>
|
|
309
|
+
|
|
310
|
+
{/* Dashboard Context */}
|
|
311
|
+
<div className="space-y-3">
|
|
312
|
+
<h3 className="text-lg font-semibold">Analytics Dashboard</h3>
|
|
313
|
+
<p className="text-sm text-muted-foreground">
|
|
314
|
+
Date pickers in a dashboard context with preset actions.
|
|
315
|
+
</p>
|
|
316
|
+
<div className="border rounded-lg p-4 space-y-4">
|
|
317
|
+
<div className="flex gap-3 items-center flex-wrap">
|
|
318
|
+
<DatePicker
|
|
319
|
+
date={startDate}
|
|
320
|
+
onDateChange={setStartDate}
|
|
321
|
+
placeholder="From"
|
|
322
|
+
className="w-[140px]"
|
|
323
|
+
/>
|
|
324
|
+
<DatePicker
|
|
325
|
+
date={endDate}
|
|
326
|
+
onDateChange={setEndDate}
|
|
327
|
+
placeholder="To"
|
|
328
|
+
className="w-[140px]"
|
|
329
|
+
/>
|
|
330
|
+
<div className="flex gap-2">
|
|
331
|
+
<Button
|
|
332
|
+
variant="outline"
|
|
333
|
+
size="sm"
|
|
334
|
+
onClick={() => {
|
|
335
|
+
const today = new Date();
|
|
336
|
+
const lastWeek = new Date(today.getTime() - 7 * 24 * 60 * 60 * 1000);
|
|
337
|
+
setStartDate(lastWeek);
|
|
338
|
+
setEndDate(today);
|
|
339
|
+
}}
|
|
340
|
+
>
|
|
341
|
+
Last 7 days
|
|
342
|
+
</Button>
|
|
343
|
+
<Button
|
|
344
|
+
variant="outline"
|
|
345
|
+
size="sm"
|
|
346
|
+
onClick={() => {
|
|
347
|
+
const today = new Date();
|
|
348
|
+
const lastMonth = new Date(today.getTime() - 30 * 24 * 60 * 60 * 1000);
|
|
349
|
+
setStartDate(lastMonth);
|
|
350
|
+
setEndDate(today);
|
|
351
|
+
}}
|
|
352
|
+
>
|
|
353
|
+
Last 30 days
|
|
354
|
+
</Button>
|
|
355
|
+
</div>
|
|
356
|
+
</div>
|
|
357
|
+
|
|
358
|
+
<div className="bg-muted/50 p-3 rounded text-sm">
|
|
359
|
+
<strong>Selected Period:</strong>{" "}
|
|
360
|
+
{startDate && endDate
|
|
361
|
+
? `${startDate.toLocaleDateString()} - ${endDate.toLocaleDateString()}`
|
|
362
|
+
: "No date range selected"
|
|
363
|
+
}
|
|
364
|
+
</div>
|
|
365
|
+
</div>
|
|
366
|
+
</div>
|
|
367
|
+
</div>
|
|
368
|
+
);
|
|
369
|
+
},
|
|
370
|
+
parameters: {
|
|
371
|
+
layout: "padded",
|
|
372
|
+
docs: {
|
|
373
|
+
description: {
|
|
374
|
+
story: "Real-world examples showing DatePicker in common application scenarios: date ranges for events, form validation, and dashboard analytics with preset date ranges.",
|
|
375
|
+
},
|
|
376
|
+
},
|
|
377
|
+
},
|
|
378
|
+
};
|