@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,392 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react-vite";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import {
|
|
4
|
+
Settings,
|
|
5
|
+
HelpCircle,
|
|
6
|
+
Info,
|
|
7
|
+
MoreVertical,
|
|
8
|
+
Plus,
|
|
9
|
+
Calendar,
|
|
10
|
+
} from "lucide-react";
|
|
11
|
+
import { Popover, PopoverContent, PopoverTrigger } from "../popover";
|
|
12
|
+
import { Button } from "../button";
|
|
13
|
+
import { Input } from "../input";
|
|
14
|
+
import { Label } from "../label";
|
|
15
|
+
import {
|
|
16
|
+
Select,
|
|
17
|
+
SelectContent,
|
|
18
|
+
SelectItem,
|
|
19
|
+
SelectTrigger,
|
|
20
|
+
SelectValue,
|
|
21
|
+
} from "../select";
|
|
22
|
+
|
|
23
|
+
const meta = {
|
|
24
|
+
title: "Overlays/Popover",
|
|
25
|
+
component: Popover,
|
|
26
|
+
parameters: {
|
|
27
|
+
layout: "centered",
|
|
28
|
+
docs: {
|
|
29
|
+
description: {
|
|
30
|
+
component:
|
|
31
|
+
"Displays rich content in a portal, triggered by a button. Perfect for forms, help text, or interactive content that doesn't require navigation.",
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
tags: ["autodocs"],
|
|
36
|
+
argTypes: {
|
|
37
|
+
open: {
|
|
38
|
+
control: "boolean",
|
|
39
|
+
description: "Controls the open state of the popover",
|
|
40
|
+
},
|
|
41
|
+
defaultOpen: {
|
|
42
|
+
control: "boolean",
|
|
43
|
+
description: "The initial open state for uncontrolled usage",
|
|
44
|
+
},
|
|
45
|
+
modal: {
|
|
46
|
+
control: "boolean",
|
|
47
|
+
description: "Whether the popover should be modal",
|
|
48
|
+
defaultValue: false,
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
} satisfies Meta<typeof Popover>;
|
|
52
|
+
|
|
53
|
+
export default meta;
|
|
54
|
+
type Story = StoryObj<typeof meta>;
|
|
55
|
+
|
|
56
|
+
export const Interactive: Story = {
|
|
57
|
+
args: {
|
|
58
|
+
defaultOpen: false,
|
|
59
|
+
modal: false,
|
|
60
|
+
},
|
|
61
|
+
render: (args) => (
|
|
62
|
+
<Popover {...args}>
|
|
63
|
+
<PopoverTrigger asChild>
|
|
64
|
+
<Button variant="outline">Open Popover</Button>
|
|
65
|
+
</PopoverTrigger>
|
|
66
|
+
<PopoverContent className="w-80">
|
|
67
|
+
<div className="grid gap-4">
|
|
68
|
+
<div className="space-y-2">
|
|
69
|
+
<h4 className="font-medium leading-none">Settings</h4>
|
|
70
|
+
<p className="text-sm text-muted-foreground">
|
|
71
|
+
Configure your preferences and options.
|
|
72
|
+
</p>
|
|
73
|
+
</div>
|
|
74
|
+
<div className="grid gap-2">
|
|
75
|
+
<div className="grid gap-2">
|
|
76
|
+
<Label htmlFor="theme">Theme</Label>
|
|
77
|
+
<Select defaultValue="light">
|
|
78
|
+
<SelectTrigger id="theme">
|
|
79
|
+
<SelectValue />
|
|
80
|
+
</SelectTrigger>
|
|
81
|
+
<SelectContent>
|
|
82
|
+
<SelectItem value="light">Light</SelectItem>
|
|
83
|
+
<SelectItem value="dark">Dark</SelectItem>
|
|
84
|
+
<SelectItem value="system">System</SelectItem>
|
|
85
|
+
</SelectContent>
|
|
86
|
+
</Select>
|
|
87
|
+
</div>
|
|
88
|
+
<div className="grid gap-2">
|
|
89
|
+
<Label htmlFor="language">Language</Label>
|
|
90
|
+
<Select defaultValue="en">
|
|
91
|
+
<SelectTrigger id="language">
|
|
92
|
+
<SelectValue />
|
|
93
|
+
</SelectTrigger>
|
|
94
|
+
<SelectContent>
|
|
95
|
+
<SelectItem value="en">English</SelectItem>
|
|
96
|
+
<SelectItem value="es">Spanish</SelectItem>
|
|
97
|
+
<SelectItem value="fr">French</SelectItem>
|
|
98
|
+
<SelectItem value="de">German</SelectItem>
|
|
99
|
+
</SelectContent>
|
|
100
|
+
</Select>
|
|
101
|
+
</div>
|
|
102
|
+
</div>
|
|
103
|
+
<Button size="sm">Save Changes</Button>
|
|
104
|
+
</div>
|
|
105
|
+
</PopoverContent>
|
|
106
|
+
</Popover>
|
|
107
|
+
),
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
export const Variants: Story = {
|
|
111
|
+
render: () => (
|
|
112
|
+
<div className="grid grid-cols-2 gap-8 place-items-center min-h-[400px]">
|
|
113
|
+
{/* Positioning variants */}
|
|
114
|
+
<div className="space-y-4">
|
|
115
|
+
<h3 className="text-sm font-medium text-center">Positioning</h3>
|
|
116
|
+
<div className="grid grid-cols-2 gap-4">
|
|
117
|
+
<Popover>
|
|
118
|
+
<PopoverTrigger asChild>
|
|
119
|
+
<Button variant="outline" size="sm">
|
|
120
|
+
Top
|
|
121
|
+
</Button>
|
|
122
|
+
</PopoverTrigger>
|
|
123
|
+
<PopoverContent side="top">
|
|
124
|
+
<p className="text-sm">Opens on top</p>
|
|
125
|
+
</PopoverContent>
|
|
126
|
+
</Popover>
|
|
127
|
+
|
|
128
|
+
<Popover>
|
|
129
|
+
<PopoverTrigger asChild>
|
|
130
|
+
<Button variant="outline" size="sm">
|
|
131
|
+
Right
|
|
132
|
+
</Button>
|
|
133
|
+
</PopoverTrigger>
|
|
134
|
+
<PopoverContent side="right">
|
|
135
|
+
<p className="text-sm">Opens on right</p>
|
|
136
|
+
</PopoverContent>
|
|
137
|
+
</Popover>
|
|
138
|
+
|
|
139
|
+
<Popover>
|
|
140
|
+
<PopoverTrigger asChild>
|
|
141
|
+
<Button variant="outline" size="sm">
|
|
142
|
+
Bottom
|
|
143
|
+
</Button>
|
|
144
|
+
</PopoverTrigger>
|
|
145
|
+
<PopoverContent side="bottom">
|
|
146
|
+
<p className="text-sm">Opens on bottom</p>
|
|
147
|
+
</PopoverContent>
|
|
148
|
+
</Popover>
|
|
149
|
+
|
|
150
|
+
<Popover>
|
|
151
|
+
<PopoverTrigger asChild>
|
|
152
|
+
<Button variant="outline" size="sm">
|
|
153
|
+
Left
|
|
154
|
+
</Button>
|
|
155
|
+
</PopoverTrigger>
|
|
156
|
+
<PopoverContent side="left">
|
|
157
|
+
<p className="text-sm">Opens on left</p>
|
|
158
|
+
</PopoverContent>
|
|
159
|
+
</Popover>
|
|
160
|
+
</div>
|
|
161
|
+
</div>
|
|
162
|
+
|
|
163
|
+
{/* Alignment variants */}
|
|
164
|
+
<div className="space-y-4">
|
|
165
|
+
<h3 className="text-sm font-medium text-center">Alignment</h3>
|
|
166
|
+
<div className="grid gap-4">
|
|
167
|
+
<Popover>
|
|
168
|
+
<PopoverTrigger asChild>
|
|
169
|
+
<Button variant="outline" size="sm">
|
|
170
|
+
Align Start
|
|
171
|
+
</Button>
|
|
172
|
+
</PopoverTrigger>
|
|
173
|
+
<PopoverContent align="start">
|
|
174
|
+
<p className="text-sm">Aligned to start</p>
|
|
175
|
+
</PopoverContent>
|
|
176
|
+
</Popover>
|
|
177
|
+
|
|
178
|
+
<Popover>
|
|
179
|
+
<PopoverTrigger asChild>
|
|
180
|
+
<Button variant="outline" size="sm">
|
|
181
|
+
Align Center
|
|
182
|
+
</Button>
|
|
183
|
+
</PopoverTrigger>
|
|
184
|
+
<PopoverContent align="center">
|
|
185
|
+
<p className="text-sm">Aligned to center</p>
|
|
186
|
+
</PopoverContent>
|
|
187
|
+
</Popover>
|
|
188
|
+
|
|
189
|
+
<Popover>
|
|
190
|
+
<PopoverTrigger asChild>
|
|
191
|
+
<Button variant="outline" size="sm">
|
|
192
|
+
Align End
|
|
193
|
+
</Button>
|
|
194
|
+
</PopoverTrigger>
|
|
195
|
+
<PopoverContent align="end">
|
|
196
|
+
<p className="text-sm">Aligned to end</p>
|
|
197
|
+
</PopoverContent>
|
|
198
|
+
</Popover>
|
|
199
|
+
</div>
|
|
200
|
+
</div>
|
|
201
|
+
|
|
202
|
+
{/* Trigger variants */}
|
|
203
|
+
<div className="space-y-4 col-span-2">
|
|
204
|
+
<h3 className="text-sm font-medium text-center">Trigger Types</h3>
|
|
205
|
+
<div className="flex gap-4 justify-center">
|
|
206
|
+
<Popover>
|
|
207
|
+
<PopoverTrigger asChild>
|
|
208
|
+
<Button variant="default">Default Button</Button>
|
|
209
|
+
</PopoverTrigger>
|
|
210
|
+
<PopoverContent>
|
|
211
|
+
<p className="text-sm">Triggered by default button</p>
|
|
212
|
+
</PopoverContent>
|
|
213
|
+
</Popover>
|
|
214
|
+
|
|
215
|
+
<Popover>
|
|
216
|
+
<PopoverTrigger asChild>
|
|
217
|
+
<Button variant="ghost" size="icon">
|
|
218
|
+
<Info className="h-4 w-4" />
|
|
219
|
+
</Button>
|
|
220
|
+
</PopoverTrigger>
|
|
221
|
+
<PopoverContent>
|
|
222
|
+
<p className="text-sm">Triggered by icon button</p>
|
|
223
|
+
</PopoverContent>
|
|
224
|
+
</Popover>
|
|
225
|
+
|
|
226
|
+
<Popover>
|
|
227
|
+
<PopoverTrigger className="text-sm text-muted-foreground hover:text-foreground underline cursor-pointer">
|
|
228
|
+
Text trigger
|
|
229
|
+
</PopoverTrigger>
|
|
230
|
+
<PopoverContent>
|
|
231
|
+
<p className="text-sm">Triggered by text element</p>
|
|
232
|
+
</PopoverContent>
|
|
233
|
+
</Popover>
|
|
234
|
+
|
|
235
|
+
<Popover>
|
|
236
|
+
<PopoverTrigger asChild>
|
|
237
|
+
<div className="cursor-pointer rounded-lg border border-dashed border-border p-2 hover:border-foreground text-sm">
|
|
238
|
+
Custom element
|
|
239
|
+
</div>
|
|
240
|
+
</PopoverTrigger>
|
|
241
|
+
<PopoverContent>
|
|
242
|
+
<p className="text-sm">Triggered by custom element</p>
|
|
243
|
+
</PopoverContent>
|
|
244
|
+
</Popover>
|
|
245
|
+
</div>
|
|
246
|
+
</div>
|
|
247
|
+
</div>
|
|
248
|
+
),
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
export const InContext: Story = {
|
|
252
|
+
render: () => (
|
|
253
|
+
<div className="space-y-6 p-6 max-w-2xl mx-auto">
|
|
254
|
+
{/* Form with help popover */}
|
|
255
|
+
<div className="space-y-4">
|
|
256
|
+
<h3 className="text-lg font-semibold">API Configuration</h3>
|
|
257
|
+
<div className="grid gap-4">
|
|
258
|
+
<div className="grid gap-2">
|
|
259
|
+
<div className="flex items-center gap-2">
|
|
260
|
+
<Label htmlFor="api-key">API Key</Label>
|
|
261
|
+
<Popover>
|
|
262
|
+
<PopoverTrigger asChild>
|
|
263
|
+
<Button variant="ghost" size="icon" className="h-5 w-5">
|
|
264
|
+
<HelpCircle className="h-3 w-3" />
|
|
265
|
+
<span className="sr-only">Help</span>
|
|
266
|
+
</Button>
|
|
267
|
+
</PopoverTrigger>
|
|
268
|
+
<PopoverContent side="top" className="w-80">
|
|
269
|
+
<div className="space-y-2">
|
|
270
|
+
<h4 className="font-medium">What is an API Key?</h4>
|
|
271
|
+
<p className="text-sm text-muted-foreground">
|
|
272
|
+
An API key is a unique identifier used to authenticate
|
|
273
|
+
requests to our API. Keep it secret and don't share
|
|
274
|
+
it publicly.
|
|
275
|
+
</p>
|
|
276
|
+
<p className="text-sm text-muted-foreground">
|
|
277
|
+
You can generate a new API key from your account settings.
|
|
278
|
+
</p>
|
|
279
|
+
</div>
|
|
280
|
+
</PopoverContent>
|
|
281
|
+
</Popover>
|
|
282
|
+
</div>
|
|
283
|
+
<Input
|
|
284
|
+
id="api-key"
|
|
285
|
+
type="password"
|
|
286
|
+
placeholder="sk-1234567890abcdef..."
|
|
287
|
+
/>
|
|
288
|
+
</div>
|
|
289
|
+
|
|
290
|
+
<div className="grid gap-2">
|
|
291
|
+
<Label htmlFor="endpoint">Endpoint URL</Label>
|
|
292
|
+
<Input id="endpoint" placeholder="https://api.example.com/v1" />
|
|
293
|
+
</div>
|
|
294
|
+
</div>
|
|
295
|
+
</div>
|
|
296
|
+
|
|
297
|
+
{/* Data table with action menu */}
|
|
298
|
+
<div className="space-y-4">
|
|
299
|
+
<h3 className="text-lg font-semibold">Recent Deployments</h3>
|
|
300
|
+
<div className="border rounded-lg">
|
|
301
|
+
<div className="flex items-center justify-between p-4 border-b">
|
|
302
|
+
<div>
|
|
303
|
+
<div className="font-medium">Production Deploy</div>
|
|
304
|
+
<div className="text-sm text-muted-foreground">
|
|
305
|
+
main branch • 2 minutes ago
|
|
306
|
+
</div>
|
|
307
|
+
</div>
|
|
308
|
+
<div className="flex items-center gap-2">
|
|
309
|
+
<div className="px-2 py-1 bg-green-100 text-green-800 text-xs rounded-full">
|
|
310
|
+
Success
|
|
311
|
+
</div>
|
|
312
|
+
<Popover>
|
|
313
|
+
<PopoverTrigger asChild>
|
|
314
|
+
<Button variant="ghost" size="icon">
|
|
315
|
+
<MoreVertical className="h-4 w-4" />
|
|
316
|
+
<span className="sr-only">More options</span>
|
|
317
|
+
</Button>
|
|
318
|
+
</PopoverTrigger>
|
|
319
|
+
<PopoverContent className="w-56 p-1">
|
|
320
|
+
<div className="grid gap-1">
|
|
321
|
+
<Button variant="ghost" size="sm" className="justify-start">
|
|
322
|
+
<Calendar className="mr-2 h-4 w-4" />
|
|
323
|
+
View logs
|
|
324
|
+
</Button>
|
|
325
|
+
<Button variant="ghost" size="sm" className="justify-start">
|
|
326
|
+
<Plus className="mr-2 h-4 w-4" />
|
|
327
|
+
Rollback
|
|
328
|
+
</Button>
|
|
329
|
+
<Button variant="ghost" size="sm" className="justify-start">
|
|
330
|
+
<Settings className="mr-2 h-4 w-4" />
|
|
331
|
+
Configure
|
|
332
|
+
</Button>
|
|
333
|
+
<div className="my-1 h-px bg-border" />
|
|
334
|
+
<Button
|
|
335
|
+
variant="ghost"
|
|
336
|
+
size="sm"
|
|
337
|
+
className="justify-start text-destructive hover:text-destructive"
|
|
338
|
+
>
|
|
339
|
+
Delete
|
|
340
|
+
</Button>
|
|
341
|
+
</div>
|
|
342
|
+
</PopoverContent>
|
|
343
|
+
</Popover>
|
|
344
|
+
</div>
|
|
345
|
+
</div>
|
|
346
|
+
|
|
347
|
+
<div className="flex items-center justify-between p-4">
|
|
348
|
+
<div>
|
|
349
|
+
<div className="font-medium">Staging Deploy</div>
|
|
350
|
+
<div className="text-sm text-muted-foreground">
|
|
351
|
+
feature/new-ui • 1 hour ago
|
|
352
|
+
</div>
|
|
353
|
+
</div>
|
|
354
|
+
<div className="flex items-center gap-2">
|
|
355
|
+
<div className="px-2 py-1 bg-blue-100 text-blue-800 text-xs rounded-full">
|
|
356
|
+
Running
|
|
357
|
+
</div>
|
|
358
|
+
<Popover>
|
|
359
|
+
<PopoverTrigger asChild>
|
|
360
|
+
<Button variant="ghost" size="icon">
|
|
361
|
+
<MoreVertical className="h-4 w-4" />
|
|
362
|
+
<span className="sr-only">More options</span>
|
|
363
|
+
</Button>
|
|
364
|
+
</PopoverTrigger>
|
|
365
|
+
<PopoverContent className="w-56 p-1">
|
|
366
|
+
<div className="grid gap-1">
|
|
367
|
+
<Button variant="ghost" size="sm" className="justify-start">
|
|
368
|
+
<Calendar className="mr-2 h-4 w-4" />
|
|
369
|
+
View logs
|
|
370
|
+
</Button>
|
|
371
|
+
<Button variant="ghost" size="sm" className="justify-start">
|
|
372
|
+
<Settings className="mr-2 h-4 w-4" />
|
|
373
|
+
Configure
|
|
374
|
+
</Button>
|
|
375
|
+
<div className="my-1 h-px bg-border" />
|
|
376
|
+
<Button
|
|
377
|
+
variant="ghost"
|
|
378
|
+
size="sm"
|
|
379
|
+
className="justify-start text-destructive hover:text-destructive"
|
|
380
|
+
>
|
|
381
|
+
Stop deployment
|
|
382
|
+
</Button>
|
|
383
|
+
</div>
|
|
384
|
+
</PopoverContent>
|
|
385
|
+
</Popover>
|
|
386
|
+
</div>
|
|
387
|
+
</div>
|
|
388
|
+
</div>
|
|
389
|
+
</div>
|
|
390
|
+
</div>
|
|
391
|
+
),
|
|
392
|
+
};
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react-vite";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { Progress } from "../progress";
|
|
4
|
+
import { Button } from "../button";
|
|
5
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../card";
|
|
6
|
+
|
|
7
|
+
const meta = {
|
|
8
|
+
title: "Data Display/Progress",
|
|
9
|
+
component: Progress,
|
|
10
|
+
parameters: {
|
|
11
|
+
layout: "centered",
|
|
12
|
+
docs: {
|
|
13
|
+
description: {
|
|
14
|
+
component:
|
|
15
|
+
"A progress bar component built on Radix UI Progress. Displays the completion progress of a task or process with smooth transitions and accessibility features.",
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
tags: ["autodocs"],
|
|
20
|
+
argTypes: {
|
|
21
|
+
value: {
|
|
22
|
+
control: { type: "range", min: 0, max: 100, step: 1 },
|
|
23
|
+
description: "The progress value from 0 to 100. Undefined shows no progress.",
|
|
24
|
+
},
|
|
25
|
+
className: {
|
|
26
|
+
control: { type: "text" },
|
|
27
|
+
description: "Additional CSS classes for styling customization",
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
} satisfies Meta<typeof Progress>;
|
|
31
|
+
|
|
32
|
+
export default meta;
|
|
33
|
+
type Story = StoryObj<typeof meta>;
|
|
34
|
+
|
|
35
|
+
export const Interactive: Story = {
|
|
36
|
+
args: {
|
|
37
|
+
value: 60,
|
|
38
|
+
},
|
|
39
|
+
render: (args) => (
|
|
40
|
+
<div className="w-[400px] space-y-4">
|
|
41
|
+
<Progress {...args} />
|
|
42
|
+
<div className="text-center text-sm text-muted-foreground">
|
|
43
|
+
Adjust the progress value using the controls above
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
),
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export const Variants: Story = {
|
|
50
|
+
render: () => (
|
|
51
|
+
<div className="w-[400px] space-y-6">
|
|
52
|
+
<div className="space-y-4">
|
|
53
|
+
<div className="space-y-2">
|
|
54
|
+
<p className="text-sm font-medium">States</p>
|
|
55
|
+
<div className="space-y-3">
|
|
56
|
+
<div className="space-y-1">
|
|
57
|
+
<span className="text-xs text-muted-foreground">Empty (0%)</span>
|
|
58
|
+
<Progress value={0} />
|
|
59
|
+
</div>
|
|
60
|
+
<div className="space-y-1">
|
|
61
|
+
<span className="text-xs text-muted-foreground">In Progress (45%)</span>
|
|
62
|
+
<Progress value={45} />
|
|
63
|
+
</div>
|
|
64
|
+
<div className="space-y-1">
|
|
65
|
+
<span className="text-xs text-muted-foreground">Complete (100%)</span>
|
|
66
|
+
<Progress value={100} />
|
|
67
|
+
</div>
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
|
|
71
|
+
<div className="space-y-2">
|
|
72
|
+
<p className="text-sm font-medium">Sizes</p>
|
|
73
|
+
<div className="space-y-3">
|
|
74
|
+
<div className="space-y-1">
|
|
75
|
+
<span className="text-xs text-muted-foreground">Extra Small (h-1)</span>
|
|
76
|
+
<Progress value={60} className="h-1" />
|
|
77
|
+
</div>
|
|
78
|
+
<div className="space-y-1">
|
|
79
|
+
<span className="text-xs text-muted-foreground">Default (h-2)</span>
|
|
80
|
+
<Progress value={60} />
|
|
81
|
+
</div>
|
|
82
|
+
<div className="space-y-1">
|
|
83
|
+
<span className="text-xs text-muted-foreground">Large (h-4)</span>
|
|
84
|
+
<Progress value={60} className="h-4" />
|
|
85
|
+
</div>
|
|
86
|
+
</div>
|
|
87
|
+
</div>
|
|
88
|
+
|
|
89
|
+
<div className="space-y-2">
|
|
90
|
+
<p className="text-sm font-medium">Custom Colors</p>
|
|
91
|
+
<div className="space-y-3">
|
|
92
|
+
<div className="space-y-1">
|
|
93
|
+
<span className="text-xs text-muted-foreground">Success</span>
|
|
94
|
+
<Progress value={100} className="[&>div]:bg-green-500" />
|
|
95
|
+
</div>
|
|
96
|
+
<div className="space-y-1">
|
|
97
|
+
<span className="text-xs text-muted-foreground">Warning</span>
|
|
98
|
+
<Progress value={75} className="[&>div]:bg-yellow-500" />
|
|
99
|
+
</div>
|
|
100
|
+
<div className="space-y-1">
|
|
101
|
+
<span className="text-xs text-muted-foreground">Danger</span>
|
|
102
|
+
<Progress value={30} className="[&>div]:bg-red-500" />
|
|
103
|
+
</div>
|
|
104
|
+
</div>
|
|
105
|
+
</div>
|
|
106
|
+
</div>
|
|
107
|
+
</div>
|
|
108
|
+
),
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
export const InContext: Story = {
|
|
112
|
+
render: function ProgressInContext() {
|
|
113
|
+
const [uploadProgress, setUploadProgress] = React.useState(0);
|
|
114
|
+
const [isUploading, setIsUploading] = React.useState(false);
|
|
115
|
+
const [currentStep, setCurrentStep] = React.useState(2);
|
|
116
|
+
|
|
117
|
+
const simulateUpload = () => {
|
|
118
|
+
setIsUploading(true);
|
|
119
|
+
setUploadProgress(0);
|
|
120
|
+
|
|
121
|
+
const interval = setInterval(() => {
|
|
122
|
+
setUploadProgress((prev) => {
|
|
123
|
+
if (prev >= 100) {
|
|
124
|
+
clearInterval(interval);
|
|
125
|
+
setIsUploading(false);
|
|
126
|
+
return 100;
|
|
127
|
+
}
|
|
128
|
+
const increment = Math.random() * 8 + 2;
|
|
129
|
+
return Math.min(100, prev + increment);
|
|
130
|
+
});
|
|
131
|
+
}, 150);
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
const totalSteps = 4;
|
|
135
|
+
const stepProgress = (currentStep / totalSteps) * 100;
|
|
136
|
+
|
|
137
|
+
return (
|
|
138
|
+
<div className="w-[500px] space-y-6">
|
|
139
|
+
{/* File Upload Progress */}
|
|
140
|
+
<Card>
|
|
141
|
+
<CardHeader>
|
|
142
|
+
<CardTitle>File Upload</CardTitle>
|
|
143
|
+
<CardDescription>
|
|
144
|
+
document.pdf • 2.4 MB
|
|
145
|
+
</CardDescription>
|
|
146
|
+
</CardHeader>
|
|
147
|
+
<CardContent className="space-y-4">
|
|
148
|
+
<div className="space-y-2">
|
|
149
|
+
<div className="flex justify-between text-sm">
|
|
150
|
+
<span>
|
|
151
|
+
{isUploading
|
|
152
|
+
? "Uploading..."
|
|
153
|
+
: uploadProgress === 100
|
|
154
|
+
? "Upload complete"
|
|
155
|
+
: "Ready to upload"}
|
|
156
|
+
</span>
|
|
157
|
+
<span className="text-muted-foreground">
|
|
158
|
+
{Math.round(uploadProgress)}%
|
|
159
|
+
</span>
|
|
160
|
+
</div>
|
|
161
|
+
<Progress value={uploadProgress} />
|
|
162
|
+
</div>
|
|
163
|
+
{!isUploading && uploadProgress !== 100 && (
|
|
164
|
+
<Button onClick={simulateUpload} className="w-full">
|
|
165
|
+
Upload File
|
|
166
|
+
</Button>
|
|
167
|
+
)}
|
|
168
|
+
{uploadProgress === 100 && (
|
|
169
|
+
<Button
|
|
170
|
+
variant="outline"
|
|
171
|
+
onClick={() => setUploadProgress(0)}
|
|
172
|
+
className="w-full"
|
|
173
|
+
>
|
|
174
|
+
Upload Another
|
|
175
|
+
</Button>
|
|
176
|
+
)}
|
|
177
|
+
</CardContent>
|
|
178
|
+
</Card>
|
|
179
|
+
|
|
180
|
+
{/* Multi-Step Process */}
|
|
181
|
+
<Card>
|
|
182
|
+
<CardHeader>
|
|
183
|
+
<CardTitle>Setup Process</CardTitle>
|
|
184
|
+
<CardDescription>
|
|
185
|
+
Complete your account setup
|
|
186
|
+
</CardDescription>
|
|
187
|
+
</CardHeader>
|
|
188
|
+
<CardContent className="space-y-4">
|
|
189
|
+
<div className="space-y-2">
|
|
190
|
+
<div className="flex justify-between text-sm">
|
|
191
|
+
<span className="font-medium">Step {currentStep} of {totalSteps}</span>
|
|
192
|
+
<span className="text-muted-foreground">Profile Information</span>
|
|
193
|
+
</div>
|
|
194
|
+
<Progress value={stepProgress} />
|
|
195
|
+
</div>
|
|
196
|
+
<div className="flex justify-between">
|
|
197
|
+
<Button
|
|
198
|
+
variant="outline"
|
|
199
|
+
size="sm"
|
|
200
|
+
onClick={() => setCurrentStep(Math.max(1, currentStep - 1))}
|
|
201
|
+
disabled={currentStep === 1}
|
|
202
|
+
>
|
|
203
|
+
Previous
|
|
204
|
+
</Button>
|
|
205
|
+
<Button
|
|
206
|
+
size="sm"
|
|
207
|
+
onClick={() => setCurrentStep(Math.min(totalSteps, currentStep + 1))}
|
|
208
|
+
disabled={currentStep === totalSteps}
|
|
209
|
+
>
|
|
210
|
+
{currentStep === totalSteps ? "Complete" : "Next"}
|
|
211
|
+
</Button>
|
|
212
|
+
</div>
|
|
213
|
+
</CardContent>
|
|
214
|
+
</Card>
|
|
215
|
+
</div>
|
|
216
|
+
);
|
|
217
|
+
},
|
|
218
|
+
};
|