@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,420 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react-vite";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { useIsMobile } from "@/hooks/use-mobile";
|
|
4
|
+
import {
|
|
5
|
+
Card,
|
|
6
|
+
CardContent,
|
|
7
|
+
CardDescription,
|
|
8
|
+
CardHeader,
|
|
9
|
+
CardTitle,
|
|
10
|
+
} from "../card";
|
|
11
|
+
import { Badge } from "../badge";
|
|
12
|
+
import { Button } from "../button";
|
|
13
|
+
import {
|
|
14
|
+
Sheet,
|
|
15
|
+
SheetContent,
|
|
16
|
+
SheetDescription,
|
|
17
|
+
SheetHeader,
|
|
18
|
+
SheetTitle,
|
|
19
|
+
SheetTrigger,
|
|
20
|
+
} from "../sheet";
|
|
21
|
+
import {
|
|
22
|
+
Dialog,
|
|
23
|
+
DialogContent,
|
|
24
|
+
DialogDescription,
|
|
25
|
+
DialogHeader,
|
|
26
|
+
DialogTitle,
|
|
27
|
+
DialogTrigger,
|
|
28
|
+
} from "../dialog";
|
|
29
|
+
import {
|
|
30
|
+
NavigationMenu,
|
|
31
|
+
NavigationMenuContent,
|
|
32
|
+
NavigationMenuItem,
|
|
33
|
+
NavigationMenuLink,
|
|
34
|
+
NavigationMenuList,
|
|
35
|
+
NavigationMenuTrigger,
|
|
36
|
+
} from "../navigation-menu";
|
|
37
|
+
import { Smartphone, Monitor, Menu, Search } from "lucide-react";
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* useIsMobile hook stories for design system documentation
|
|
41
|
+
*
|
|
42
|
+
* This story file demonstrates the useIsMobile hook's capabilities through three focused stories:
|
|
43
|
+
* - Interactive: Live playground showing current viewport state and breakpoint testing
|
|
44
|
+
* - Variants: Different responsive patterns and use cases for mobile detection
|
|
45
|
+
* - InContext: Real-world usage examples showing mobile vs desktop component selection
|
|
46
|
+
*/
|
|
47
|
+
|
|
48
|
+
// Demo component for the Interactive story
|
|
49
|
+
function MobileDetector() {
|
|
50
|
+
const isMobile = useIsMobile();
|
|
51
|
+
const [windowWidth, setWindowWidth] = React.useState<number>(0);
|
|
52
|
+
|
|
53
|
+
React.useEffect(() => {
|
|
54
|
+
const updateWidth = () => setWindowWidth(window.innerWidth);
|
|
55
|
+
updateWidth();
|
|
56
|
+
window.addEventListener("resize", updateWidth);
|
|
57
|
+
return () => window.removeEventListener("resize", updateWidth);
|
|
58
|
+
}, []);
|
|
59
|
+
|
|
60
|
+
return (
|
|
61
|
+
<Card className="w-full max-w-md">
|
|
62
|
+
<CardHeader>
|
|
63
|
+
<CardTitle className="flex items-center gap-2">
|
|
64
|
+
{isMobile ? (
|
|
65
|
+
<Smartphone className="h-5 w-5" />
|
|
66
|
+
) : (
|
|
67
|
+
<Monitor className="h-5 w-5" />
|
|
68
|
+
)}
|
|
69
|
+
Mobile Detection Status
|
|
70
|
+
</CardTitle>
|
|
71
|
+
<CardDescription>
|
|
72
|
+
Resize your browser window to see the hook respond to viewport changes
|
|
73
|
+
</CardDescription>
|
|
74
|
+
</CardHeader>
|
|
75
|
+
<CardContent className="space-y-4">
|
|
76
|
+
<div className="flex items-center justify-between">
|
|
77
|
+
<span>Current Width:</span>
|
|
78
|
+
<Badge variant="outline">{windowWidth}px</Badge>
|
|
79
|
+
</div>
|
|
80
|
+
<div className="flex items-center justify-between">
|
|
81
|
+
<span>Breakpoint (768px):</span>
|
|
82
|
+
<Badge variant="secondary">md</Badge>
|
|
83
|
+
</div>
|
|
84
|
+
<div className="flex items-center justify-between">
|
|
85
|
+
<span>Is Mobile:</span>
|
|
86
|
+
<Badge variant={isMobile ? "default" : "destructive"}>
|
|
87
|
+
{isMobile ? "true" : "false"}
|
|
88
|
+
</Badge>
|
|
89
|
+
</div>
|
|
90
|
+
<div className="pt-2 text-sm text-muted-foreground">
|
|
91
|
+
{isMobile
|
|
92
|
+
? "Currently showing mobile layout (< 768px)"
|
|
93
|
+
: "Currently showing desktop layout (≥ 768px)"}
|
|
94
|
+
</div>
|
|
95
|
+
</CardContent>
|
|
96
|
+
</Card>
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Demo component for Variants story
|
|
101
|
+
function ResponsivePatterns() {
|
|
102
|
+
const isMobile = useIsMobile();
|
|
103
|
+
|
|
104
|
+
return (
|
|
105
|
+
<div className="space-y-6">
|
|
106
|
+
{/* Pattern 1: Conditional Component Rendering */}
|
|
107
|
+
<Card>
|
|
108
|
+
<CardHeader>
|
|
109
|
+
<CardTitle>Pattern 1: Conditional Component Rendering</CardTitle>
|
|
110
|
+
<CardDescription>
|
|
111
|
+
Different components for mobile vs desktop
|
|
112
|
+
</CardDescription>
|
|
113
|
+
</CardHeader>
|
|
114
|
+
<CardContent>
|
|
115
|
+
{isMobile ? (
|
|
116
|
+
<Badge className="bg-blue-500">Mobile Component Active</Badge>
|
|
117
|
+
) : (
|
|
118
|
+
<Badge className="bg-green-500">Desktop Component Active</Badge>
|
|
119
|
+
)}
|
|
120
|
+
</CardContent>
|
|
121
|
+
</Card>
|
|
122
|
+
|
|
123
|
+
{/* Pattern 2: Layout Switching */}
|
|
124
|
+
<Card>
|
|
125
|
+
<CardHeader>
|
|
126
|
+
<CardTitle>Pattern 2: Layout Direction</CardTitle>
|
|
127
|
+
<CardDescription>
|
|
128
|
+
Vertical on mobile, horizontal on desktop
|
|
129
|
+
</CardDescription>
|
|
130
|
+
</CardHeader>
|
|
131
|
+
<CardContent>
|
|
132
|
+
<div className={`flex gap-2 ${isMobile ? "flex-col" : "flex-row"}`}>
|
|
133
|
+
<Button variant="outline" size="sm">
|
|
134
|
+
Action 1
|
|
135
|
+
</Button>
|
|
136
|
+
<Button variant="outline" size="sm">
|
|
137
|
+
Action 2
|
|
138
|
+
</Button>
|
|
139
|
+
<Button variant="outline" size="sm">
|
|
140
|
+
Action 3
|
|
141
|
+
</Button>
|
|
142
|
+
</div>
|
|
143
|
+
</CardContent>
|
|
144
|
+
</Card>
|
|
145
|
+
|
|
146
|
+
{/* Pattern 3: Content Density */}
|
|
147
|
+
<Card>
|
|
148
|
+
<CardHeader>
|
|
149
|
+
<CardTitle>Pattern 3: Content Density</CardTitle>
|
|
150
|
+
<CardDescription>
|
|
151
|
+
Less content on mobile for better UX
|
|
152
|
+
</CardDescription>
|
|
153
|
+
</CardHeader>
|
|
154
|
+
<CardContent>
|
|
155
|
+
<div className="space-y-2">
|
|
156
|
+
<div>Always visible content</div>
|
|
157
|
+
{!isMobile && (
|
|
158
|
+
<>
|
|
159
|
+
<div className="text-muted-foreground">
|
|
160
|
+
Desktop-only details
|
|
161
|
+
</div>
|
|
162
|
+
<div className="text-muted-foreground">
|
|
163
|
+
Additional information
|
|
164
|
+
</div>
|
|
165
|
+
</>
|
|
166
|
+
)}
|
|
167
|
+
</div>
|
|
168
|
+
</CardContent>
|
|
169
|
+
</Card>
|
|
170
|
+
</div>
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Demo component for InContext story
|
|
175
|
+
function ResponsiveNavigation() {
|
|
176
|
+
const isMobile = useIsMobile();
|
|
177
|
+
|
|
178
|
+
if (isMobile) {
|
|
179
|
+
return (
|
|
180
|
+
<Sheet>
|
|
181
|
+
<SheetTrigger asChild>
|
|
182
|
+
<Button variant="outline" size="icon">
|
|
183
|
+
<Menu className="h-4 w-4" />
|
|
184
|
+
</Button>
|
|
185
|
+
</SheetTrigger>
|
|
186
|
+
<SheetContent>
|
|
187
|
+
<SheetHeader>
|
|
188
|
+
<SheetTitle>Mobile Navigation</SheetTitle>
|
|
189
|
+
<SheetDescription>
|
|
190
|
+
Mobile-optimized navigation using Sheet component
|
|
191
|
+
</SheetDescription>
|
|
192
|
+
</SheetHeader>
|
|
193
|
+
<div className="mt-6 space-y-3">
|
|
194
|
+
<Button variant="ghost" className="w-full justify-start">
|
|
195
|
+
Home
|
|
196
|
+
</Button>
|
|
197
|
+
<Button variant="ghost" className="w-full justify-start">
|
|
198
|
+
Products
|
|
199
|
+
</Button>
|
|
200
|
+
<Button variant="ghost" className="w-full justify-start">
|
|
201
|
+
About
|
|
202
|
+
</Button>
|
|
203
|
+
<Button variant="ghost" className="w-full justify-start">
|
|
204
|
+
Contact
|
|
205
|
+
</Button>
|
|
206
|
+
</div>
|
|
207
|
+
</SheetContent>
|
|
208
|
+
</Sheet>
|
|
209
|
+
);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
return (
|
|
213
|
+
<NavigationMenu>
|
|
214
|
+
<NavigationMenuList>
|
|
215
|
+
<NavigationMenuItem>
|
|
216
|
+
<NavigationMenuTrigger>Products</NavigationMenuTrigger>
|
|
217
|
+
<NavigationMenuContent>
|
|
218
|
+
<div className="p-4 w-48">
|
|
219
|
+
<NavigationMenuLink className="block p-2 hover:bg-accent rounded">
|
|
220
|
+
Web Apps
|
|
221
|
+
</NavigationMenuLink>
|
|
222
|
+
<NavigationMenuLink className="block p-2 hover:bg-accent rounded">
|
|
223
|
+
Mobile Apps
|
|
224
|
+
</NavigationMenuLink>
|
|
225
|
+
</div>
|
|
226
|
+
</NavigationMenuContent>
|
|
227
|
+
</NavigationMenuItem>
|
|
228
|
+
<NavigationMenuItem>
|
|
229
|
+
<NavigationMenuLink className="px-4 py-2">About</NavigationMenuLink>
|
|
230
|
+
</NavigationMenuItem>
|
|
231
|
+
<NavigationMenuItem>
|
|
232
|
+
<NavigationMenuLink className="px-4 py-2">Contact</NavigationMenuLink>
|
|
233
|
+
</NavigationMenuItem>
|
|
234
|
+
</NavigationMenuList>
|
|
235
|
+
</NavigationMenu>
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
function ResponsiveSearchDialog() {
|
|
240
|
+
const isMobile = useIsMobile();
|
|
241
|
+
|
|
242
|
+
if (isMobile) {
|
|
243
|
+
return (
|
|
244
|
+
<Sheet>
|
|
245
|
+
<SheetTrigger asChild>
|
|
246
|
+
<Button variant="outline" className="gap-2">
|
|
247
|
+
<Search className="h-4 w-4" />
|
|
248
|
+
Search
|
|
249
|
+
</Button>
|
|
250
|
+
</SheetTrigger>
|
|
251
|
+
<SheetContent side="top" className="h-[400px]">
|
|
252
|
+
<SheetHeader>
|
|
253
|
+
<SheetTitle>Search</SheetTitle>
|
|
254
|
+
<SheetDescription>
|
|
255
|
+
Mobile search interface using Sheet for better mobile UX
|
|
256
|
+
</SheetDescription>
|
|
257
|
+
</SheetHeader>
|
|
258
|
+
<div className="mt-6">
|
|
259
|
+
<input
|
|
260
|
+
type="text"
|
|
261
|
+
placeholder="Search everything..."
|
|
262
|
+
className="w-full p-3 border rounded-lg"
|
|
263
|
+
/>
|
|
264
|
+
</div>
|
|
265
|
+
</SheetContent>
|
|
266
|
+
</Sheet>
|
|
267
|
+
);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
return (
|
|
271
|
+
<Dialog>
|
|
272
|
+
<DialogTrigger asChild>
|
|
273
|
+
<Button variant="outline" className="gap-2">
|
|
274
|
+
<Search className="h-4 w-4" />
|
|
275
|
+
Search
|
|
276
|
+
</Button>
|
|
277
|
+
</DialogTrigger>
|
|
278
|
+
<DialogContent>
|
|
279
|
+
<DialogHeader>
|
|
280
|
+
<DialogTitle>Search</DialogTitle>
|
|
281
|
+
<DialogDescription>
|
|
282
|
+
Desktop search interface using Dialog for focused interaction
|
|
283
|
+
</DialogDescription>
|
|
284
|
+
</DialogHeader>
|
|
285
|
+
<div className="mt-4">
|
|
286
|
+
<input
|
|
287
|
+
type="text"
|
|
288
|
+
placeholder="Search everything..."
|
|
289
|
+
className="w-full p-3 border rounded-lg"
|
|
290
|
+
/>
|
|
291
|
+
</div>
|
|
292
|
+
</DialogContent>
|
|
293
|
+
</Dialog>
|
|
294
|
+
);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
function RealWorldExample() {
|
|
298
|
+
return (
|
|
299
|
+
<div className="space-y-8 max-w-4xl">
|
|
300
|
+
<Card>
|
|
301
|
+
<CardHeader>
|
|
302
|
+
<CardTitle>Responsive Navigation</CardTitle>
|
|
303
|
+
<CardDescription>
|
|
304
|
+
Navigation adapts to screen size: NavigationMenu on desktop, Sheet
|
|
305
|
+
on mobile
|
|
306
|
+
</CardDescription>
|
|
307
|
+
</CardHeader>
|
|
308
|
+
<CardContent>
|
|
309
|
+
<ResponsiveNavigation />
|
|
310
|
+
</CardContent>
|
|
311
|
+
</Card>
|
|
312
|
+
|
|
313
|
+
<Card>
|
|
314
|
+
<CardHeader>
|
|
315
|
+
<CardTitle>Responsive Search</CardTitle>
|
|
316
|
+
<CardDescription>
|
|
317
|
+
Search uses Dialog on desktop for focused interaction, Sheet on
|
|
318
|
+
mobile for better mobile UX
|
|
319
|
+
</CardDescription>
|
|
320
|
+
</CardHeader>
|
|
321
|
+
<CardContent>
|
|
322
|
+
<ResponsiveSearchDialog />
|
|
323
|
+
</CardContent>
|
|
324
|
+
</Card>
|
|
325
|
+
|
|
326
|
+
<Card>
|
|
327
|
+
<CardHeader>
|
|
328
|
+
<CardTitle>Implementation Notes</CardTitle>
|
|
329
|
+
</CardHeader>
|
|
330
|
+
<CardContent className="space-y-2 text-sm text-muted-foreground">
|
|
331
|
+
<p>• Hook uses 768px breakpoint (Tailwind's md breakpoint)</p>
|
|
332
|
+
<p>• SSR-safe: returns false on server, updates on client</p>
|
|
333
|
+
<p>• Automatically updates on window resize</p>
|
|
334
|
+
<p>• Pattern matches shadcn/ui's useSidebar hook behavior</p>
|
|
335
|
+
<p>• Ideal for component selection rather than CSS media queries</p>
|
|
336
|
+
</CardContent>
|
|
337
|
+
</Card>
|
|
338
|
+
</div>
|
|
339
|
+
);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
const meta: Meta = {
|
|
343
|
+
title: "Utilities/useIsMobile",
|
|
344
|
+
parameters: {
|
|
345
|
+
layout: "centered",
|
|
346
|
+
docs: {
|
|
347
|
+
description: {
|
|
348
|
+
component: `
|
|
349
|
+
A React hook for detecting mobile viewport width based on Tailwind CSS breakpoints.
|
|
350
|
+
Returns true when viewport width is less than 768px (Tailwind's md breakpoint).
|
|
351
|
+
|
|
352
|
+
**Key Features:**
|
|
353
|
+
- Follows shadcn/ui responsive patterns
|
|
354
|
+
- SSR-safe implementation
|
|
355
|
+
- Automatic viewport resize handling
|
|
356
|
+
- Standard 768px breakpoint alignment
|
|
357
|
+
- Perfect for conditional component rendering
|
|
358
|
+
|
|
359
|
+
**Common Use Cases:**
|
|
360
|
+
- Mobile vs desktop navigation patterns
|
|
361
|
+
- Dialog vs Sheet component selection
|
|
362
|
+
- Responsive layout adjustments
|
|
363
|
+
- Content density optimization
|
|
364
|
+
`,
|
|
365
|
+
},
|
|
366
|
+
},
|
|
367
|
+
},
|
|
368
|
+
tags: ["autodocs"],
|
|
369
|
+
} satisfies Meta;
|
|
370
|
+
|
|
371
|
+
export default meta;
|
|
372
|
+
type Story = StoryObj<typeof meta>;
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* Interactive playground showing the hook's real-time response to viewport changes.
|
|
376
|
+
* Resize your browser window to see the mobile detection update dynamically.
|
|
377
|
+
*/
|
|
378
|
+
export const Interactive: Story = {
|
|
379
|
+
render: () => <MobileDetector />,
|
|
380
|
+
parameters: {
|
|
381
|
+
docs: {
|
|
382
|
+
description: {
|
|
383
|
+
story:
|
|
384
|
+
"Live demonstration of mobile detection. Resize your browser window to see the hook respond to viewport changes in real-time.",
|
|
385
|
+
},
|
|
386
|
+
},
|
|
387
|
+
},
|
|
388
|
+
};
|
|
389
|
+
|
|
390
|
+
/**
|
|
391
|
+
* Different responsive patterns demonstrating various ways to use mobile detection
|
|
392
|
+
* for adaptive user interfaces and layout adjustments.
|
|
393
|
+
*/
|
|
394
|
+
export const Variants: Story = {
|
|
395
|
+
render: () => <ResponsivePatterns />,
|
|
396
|
+
parameters: {
|
|
397
|
+
docs: {
|
|
398
|
+
description: {
|
|
399
|
+
story:
|
|
400
|
+
"Common responsive patterns: conditional rendering, layout switching, and content density adaptation.",
|
|
401
|
+
},
|
|
402
|
+
},
|
|
403
|
+
},
|
|
404
|
+
};
|
|
405
|
+
|
|
406
|
+
/**
|
|
407
|
+
* Real-world examples showing how to use mobile detection for component selection
|
|
408
|
+
* and responsive user experience patterns in production applications.
|
|
409
|
+
*/
|
|
410
|
+
export const InContext: Story = {
|
|
411
|
+
render: () => <RealWorldExample />,
|
|
412
|
+
parameters: {
|
|
413
|
+
docs: {
|
|
414
|
+
description: {
|
|
415
|
+
story:
|
|
416
|
+
"Production-ready examples: responsive navigation with NavigationMenu/Sheet and search with Dialog/Sheet combinations.",
|
|
417
|
+
},
|
|
418
|
+
},
|
|
419
|
+
},
|
|
420
|
+
};
|