@reinvented/design 0.4.0 → 1.1.0
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/README.md +1 -1
- package/SKILL.md +214 -0
- package/package.json +58 -23
- package/skills/apps/analytics.md +103 -0
- package/skills/apps/booking-scheduling.md +97 -0
- package/skills/apps/content-management.md +52 -0
- package/skills/apps/crm.md +80 -0
- package/skills/apps/e-commerce.md +109 -0
- package/skills/apps/education.md +79 -0
- package/skills/apps/finance.md +68 -0
- package/skills/apps/health-fitness.md +72 -0
- package/skills/apps/marketplace.md +99 -0
- package/skills/apps/messaging.md +84 -0
- package/skills/apps/portfolio-personal.md +90 -0
- package/skills/apps/project-management.md +95 -0
- package/skills/apps/saas-dashboard.md +104 -0
- package/skills/apps/social-platform.md +50 -0
- package/skills/blocks/auth.md +106 -0
- package/skills/blocks/communication.md +98 -0
- package/skills/blocks/content.md +107 -0
- package/skills/blocks/data-management.md +109 -0
- package/skills/blocks/data-viz.md +92 -0
- package/skills/blocks/ecommerce.md +126 -0
- package/skills/blocks/feedback.md +97 -0
- package/skills/blocks/filtering.md +127 -0
- package/skills/blocks/marketing.md +136 -0
- package/skills/blocks/media.md +102 -0
- package/skills/blocks/navigation.md +136 -0
- package/skills/blocks/onboarding.md +75 -0
- package/skills/blocks/profiles.md +131 -0
- package/skills/blocks/scheduling.md +117 -0
- package/skills/blocks/settings.md +102 -0
- package/skills/components/advanced-components.md +142 -0
- package/skills/components/avatar.md +92 -0
- package/skills/components/badge.md +105 -0
- package/skills/components/button.md +87 -0
- package/skills/components/card.md +144 -0
- package/skills/components/chart.md +88 -0
- package/skills/components/dialog.md +109 -0
- package/skills/components/dropdown-menu.md +117 -0
- package/skills/components/extended-components.md +187 -0
- package/skills/components/feedback.md +165 -0
- package/skills/components/form.md +112 -0
- package/skills/components/input.md +107 -0
- package/skills/components/map.md +53 -0
- package/skills/components/navigation.md +73 -0
- package/skills/components/overlay.md +77 -0
- package/skills/components/page-header.md +51 -0
- package/skills/components/select.md +175 -0
- package/skills/components/table.md +102 -0
- package/skills/components/tabs.md +105 -0
- package/skills/components/utilities.md +138 -0
- package/skills/devices/desktop.md +43 -0
- package/skills/devices/mobile.md +77 -0
- package/skills/foundation/design-principles.md +77 -0
- package/skills/foundation/design-tokens.md +121 -0
- package/skills/foundation/mockup-generation.md +118 -0
- package/skills/foundation/rules.md +54 -0
- package/skills/foundation/tailwind-usage.md +204 -0
- package/skills/layouts/dashboard.md +71 -0
- package/skills/layouts/full-page-form.md +75 -0
- package/skills/layouts/list-detail.md +70 -0
- package/skills/layouts/marketing.md +70 -0
- package/skills/layouts/responsive.md +67 -0
- package/skills/layouts/settings-page.md +106 -0
- package/skills/layouts/sidebar.md +73 -0
- package/skills/layouts/topbar.md +68 -0
- package/skills/patterns/auth.md +131 -0
- package/skills/patterns/content-display.md +164 -0
- package/skills/patterns/dashboards.md +104 -0
- package/skills/patterns/data-tables.md +113 -0
- package/skills/patterns/empty-states.md +71 -0
- package/skills/patterns/error-states.md +73 -0
- package/skills/patterns/forms.md +136 -0
- package/skills/patterns/loading-states.md +92 -0
- package/skills/patterns/navigation.md +113 -0
- package/skills/patterns/notifications.md +91 -0
- package/skills/patterns/onboarding.md +42 -0
- package/skills/patterns/search.md +55 -0
- package/skills/patterns/settings.md +132 -0
- package/skills/patterns/user-profiles.md +67 -0
- package/skills/personas/business-operator.md +114 -0
- package/skills/personas/consumer-casual.md +60 -0
- package/skills/personas/consumer-power-user.md +109 -0
- package/skills/personas/creative-professional.md +109 -0
- package/skills/personas/enterprise-admin.md +134 -0
- package/skills/visual/color-usage.md +62 -0
- package/skills/visual/dark-mode.md +50 -0
- package/skills/visual/polish-techniques.md +101 -0
- package/skills/visual/spacing-composition.md +69 -0
- package/skills/visual/transitions-animations.md +66 -0
- package/skills/visual/typography-hierarchy.md +66 -0
- package/src/components/blocks/auth/auth-card/AuthCard.tsx +62 -0
- package/src/components/blocks/auth/auth-card/index.ts +1 -0
- package/src/components/blocks/auth/index.ts +3 -0
- package/src/components/blocks/auth/social-login/SocialLoginGroup.tsx +75 -0
- package/src/components/blocks/auth/social-login/index.ts +1 -0
- package/src/components/blocks/auth/two-factor/TwoFactorForm.tsx +59 -0
- package/src/components/blocks/auth/two-factor/index.ts +1 -0
- package/src/components/blocks/communication/activity-item/ActivityItem.tsx +17 -0
- package/src/components/blocks/communication/activity-item/ActivityItemAvatar.tsx +21 -0
- package/src/components/blocks/communication/activity-item/ActivityItemContent.tsx +16 -0
- package/src/components/blocks/communication/activity-item/index.ts +3 -0
- package/src/components/blocks/communication/chat-bubble/ChatBubble.tsx +21 -0
- package/src/components/blocks/communication/chat-bubble/ChatBubbleAvatar.tsx +19 -0
- package/src/components/blocks/communication/chat-bubble/ChatBubbleMessage.tsx +35 -0
- package/src/components/blocks/communication/chat-bubble/ChatBubbleTimestamp.tsx +15 -0
- package/src/components/blocks/communication/chat-bubble/index.ts +4 -0
- package/src/components/blocks/communication/index.ts +2 -0
- package/src/components/blocks/content/article-header/ArticleHeader.tsx +73 -0
- package/src/components/blocks/content/article-header/index.ts +1 -0
- package/src/components/blocks/content/author-card/AuthorCard.tsx +46 -0
- package/src/components/blocks/content/author-card/index.ts +1 -0
- package/src/components/blocks/content/index.ts +3 -0
- package/src/components/blocks/content/rich-text/RichTextContent.tsx +27 -0
- package/src/components/blocks/content/rich-text/index.ts +1 -0
- package/src/components/blocks/data-management/index.ts +2 -0
- package/src/components/blocks/data-management/kanban/KanbanBoard.tsx +10 -0
- package/src/components/blocks/data-management/kanban/KanbanCard.tsx +102 -0
- package/src/components/blocks/data-management/kanban/KanbanColumn.tsx +41 -0
- package/src/components/blocks/data-management/kanban/index.ts +3 -0
- package/src/components/blocks/data-management/tree-view/TreeItem.tsx +68 -0
- package/src/components/blocks/data-management/tree-view/TreeView.tsx +10 -0
- package/src/components/blocks/data-management/tree-view/index.ts +2 -0
- package/src/components/blocks/data-viz/financial-ticker/FinancialTicker.tsx +35 -0
- package/src/components/blocks/data-viz/financial-ticker/index.ts +1 -0
- package/src/components/blocks/data-viz/index.ts +3 -0
- package/src/components/blocks/data-viz/kpi-card/KpiCard.tsx +61 -0
- package/src/components/blocks/data-viz/kpi-card/index.ts +1 -0
- package/src/components/blocks/data-viz/stat-grid/StatGrid.tsx +28 -0
- package/src/components/blocks/data-viz/stat-grid/index.ts +1 -0
- package/src/components/blocks/ecommerce/index.ts +3 -0
- package/src/components/blocks/ecommerce/pricing-tier/PricingFeatureList.tsx +27 -0
- package/src/components/blocks/ecommerce/pricing-tier/PricingHeader.tsx +25 -0
- package/src/components/blocks/ecommerce/pricing-tier/PricingTier.tsx +31 -0
- package/src/components/blocks/ecommerce/pricing-tier/index.ts +3 -0
- package/src/components/blocks/ecommerce/product-card/ProductCard.tsx +17 -0
- package/src/components/blocks/ecommerce/product-card/ProductCardContent.tsx +15 -0
- package/src/components/blocks/ecommerce/product-card/ProductCardImage.tsx +20 -0
- package/src/components/blocks/ecommerce/product-card/ProductCardPrice.tsx +20 -0
- package/src/components/blocks/ecommerce/product-card/index.ts +4 -0
- package/src/components/blocks/ecommerce/rating-summary/RatingStars.tsx +32 -0
- package/src/components/blocks/ecommerce/rating-summary/index.ts +1 -0
- package/src/components/blocks/feedback/empty-state/EmptyState.tsx +53 -0
- package/src/components/blocks/feedback/empty-state/index.ts +1 -0
- package/src/components/blocks/feedback/error-state/ErrorState.tsx +50 -0
- package/src/components/blocks/feedback/error-state/index.ts +1 -0
- package/src/components/blocks/feedback/index.ts +3 -0
- package/src/components/blocks/feedback/not-found/NotFoundState.tsx +47 -0
- package/src/components/blocks/feedback/not-found/index.ts +1 -0
- package/src/components/blocks/filtering/faceted-sidebar/FacetedGroup.tsx +32 -0
- package/src/components/blocks/filtering/faceted-sidebar/FacetedSidebar.tsx +26 -0
- package/src/components/blocks/filtering/faceted-sidebar/index.ts +2 -0
- package/src/components/blocks/filtering/filter-bar/FilterBar.tsx +85 -0
- package/src/components/blocks/filtering/filter-bar/index.ts +1 -0
- package/src/components/blocks/filtering/index.ts +3 -0
- package/src/components/blocks/filtering/search-result/SearchResultItem.tsx +70 -0
- package/src/components/blocks/filtering/search-result/index.ts +1 -0
- package/src/components/blocks/index.ts +21 -0
- package/src/components/blocks/marketing/cta-block/CtaBlock.tsx +80 -0
- package/src/components/blocks/marketing/cta-block/index.ts +1 -0
- package/src/components/blocks/marketing/feature-grid/FeatureGrid.tsx +47 -0
- package/src/components/blocks/marketing/feature-grid/index.ts +1 -0
- package/src/components/blocks/marketing/hero-section/HeroSection.tsx +89 -0
- package/src/components/blocks/marketing/hero-section/index.ts +1 -0
- package/src/components/blocks/marketing/index.ts +4 -0
- package/src/components/blocks/marketing/testimonial-card/TestimonialCard.tsx +71 -0
- package/src/components/blocks/marketing/testimonial-card/index.ts +1 -0
- package/src/components/blocks/media/call-controls/CallControlButton.tsx +52 -0
- package/src/components/blocks/media/call-controls/CallControls.tsx +10 -0
- package/src/components/blocks/media/call-controls/index.ts +2 -0
- package/src/components/blocks/media/index.ts +2 -0
- package/src/components/blocks/media/media-player/MediaPlayer.tsx +20 -0
- package/src/components/blocks/media/media-player/MediaPlayerControls.tsx +16 -0
- package/src/components/blocks/media/media-player/MediaPlayerScrubber.tsx +29 -0
- package/src/components/blocks/media/media-player/MediaPlayerVideo.tsx +25 -0
- package/src/components/blocks/media/media-player/index.ts +4 -0
- package/src/components/blocks/navigation/app-sidebar/AppSidebar.tsx +32 -0
- package/src/components/blocks/navigation/app-sidebar/NavItem.tsx +43 -0
- package/src/components/blocks/navigation/app-sidebar/index.ts +2 -0
- package/src/components/blocks/navigation/context-switcher/ContextSwitcher.tsx +77 -0
- package/src/components/blocks/navigation/context-switcher/index.ts +1 -0
- package/src/components/blocks/navigation/index.ts +3 -0
- package/src/components/blocks/navigation/top-navbar/TopNavbar.tsx +47 -0
- package/src/components/blocks/navigation/top-navbar/index.ts +1 -0
- package/src/components/blocks/onboarding/index.ts +2 -0
- package/src/components/blocks/onboarding/onboarding-welcome/OnboardingWelcome.tsx +74 -0
- package/src/components/blocks/onboarding/onboarding-welcome/index.ts +1 -0
- package/src/components/blocks/onboarding/step-wizard/StepWizard.tsx +72 -0
- package/src/components/blocks/onboarding/step-wizard/index.ts +1 -0
- package/src/components/blocks/profiles/connection-list/ConnectionItem.tsx +35 -0
- package/src/components/blocks/profiles/connection-list/ConnectionList.tsx +16 -0
- package/src/components/blocks/profiles/connection-list/index.ts +2 -0
- package/src/components/blocks/profiles/index.ts +3 -0
- package/src/components/blocks/profiles/profile-header/ProfileHeader.tsx +88 -0
- package/src/components/blocks/profiles/profile-header/index.ts +1 -0
- package/src/components/blocks/profiles/profile-stats/ProfileStats.tsx +20 -0
- package/src/components/blocks/profiles/profile-stats/index.ts +1 -0
- package/src/components/blocks/scheduling/booking-slot/BookingSlot.tsx +44 -0
- package/src/components/blocks/scheduling/booking-slot/index.ts +1 -0
- package/src/components/blocks/scheduling/event-card/EventCard.tsx +85 -0
- package/src/components/blocks/scheduling/event-card/index.ts +1 -0
- package/src/components/blocks/scheduling/index.ts +3 -0
- package/src/components/blocks/scheduling/timeline-row/TimelineRow.tsx +82 -0
- package/src/components/blocks/scheduling/timeline-row/index.ts +1 -0
- package/src/components/blocks/settings/billing-usage/BillingUsage.tsx +49 -0
- package/src/components/blocks/settings/billing-usage/index.ts +1 -0
- package/src/components/blocks/settings/index.ts +3 -0
- package/src/components/blocks/settings/integration-card/IntegrationCard.tsx +62 -0
- package/src/components/blocks/settings/integration-card/index.ts +1 -0
- package/src/components/blocks/settings/settings-section/SettingsSection.tsx +23 -0
- package/src/components/blocks/settings/settings-section/index.ts +1 -0
- package/src/components/ui/accordion.tsx +56 -0
- package/src/components/ui/alert-dialog.tsx +141 -0
- package/src/components/ui/alert.tsx +59 -0
- package/src/components/ui/aspect-ratio.tsx +5 -0
- package/src/components/ui/avatar.tsx +50 -0
- package/src/components/ui/badge.tsx +36 -0
- package/src/components/ui/breadcrumb.tsx +115 -0
- package/src/components/ui/button.tsx +56 -0
- package/src/components/ui/calendar.tsx +211 -0
- package/src/components/ui/card.tsx +79 -0
- package/src/components/ui/carousel.tsx +262 -0
- package/src/components/ui/chart.tsx +367 -0
- package/src/components/ui/checkbox.tsx +28 -0
- package/src/components/ui/collapsible.tsx +11 -0
- package/src/components/ui/command.tsx +153 -0
- package/src/components/ui/component-placeholder.tsx +38 -0
- package/src/components/ui/context-menu.tsx +198 -0
- package/src/components/ui/dialog.tsx +122 -0
- package/src/components/ui/drawer.tsx +116 -0
- package/src/components/ui/dropdown-menu.tsx +200 -0
- package/src/components/ui/form.tsx +176 -0
- package/src/components/ui/hover-card.tsx +27 -0
- package/src/components/ui/input-otp.tsx +69 -0
- package/src/components/ui/input.tsx +22 -0
- package/src/components/ui/label.tsx +24 -0
- package/src/components/ui/menubar.tsx +256 -0
- package/src/components/ui/navigation-menu.tsx +128 -0
- package/src/components/ui/pagination.tsx +117 -0
- package/src/components/ui/popover.tsx +29 -0
- package/src/components/ui/progress.tsx +28 -0
- package/src/components/ui/radio-group.tsx +42 -0
- package/src/components/ui/resizable.tsx +45 -0
- package/src/components/ui/scroll-area.tsx +46 -0
- package/src/components/ui/select.tsx +160 -0
- package/src/components/ui/separator.tsx +29 -0
- package/src/components/ui/sheet.tsx +140 -0
- package/src/components/ui/skeleton.tsx +15 -0
- package/src/components/ui/slider.tsx +26 -0
- package/src/components/ui/sonner.tsx +45 -0
- package/src/components/ui/switch.tsx +27 -0
- package/src/components/ui/table.tsx +117 -0
- package/src/components/ui/tabs.tsx +53 -0
- package/src/components/ui/textarea.tsx +22 -0
- package/src/components/ui/toast.tsx +127 -0
- package/src/components/ui/toaster.tsx +33 -0
- package/src/components/ui/toggle-group.tsx +61 -0
- package/src/components/ui/toggle.tsx +45 -0
- package/src/components/ui/tooltip.tsx +28 -0
- package/src/hooks/use-toast.ts +194 -0
- package/src/index.ts +53 -56
- package/src/styles/tokens.css +30 -14
- package/tailwind.config.js +120 -98
- package/tsconfig.json +2 -2
- package/DESIGN_GUIDE.md +0 -148
- package/src/components/ui/accordion/Accordion.vue +0 -13
- package/src/components/ui/accordion/AccordionContent.vue +0 -20
- package/src/components/ui/accordion/AccordionItem.vue +0 -15
- package/src/components/ui/accordion/AccordionTrigger.vue +0 -25
- package/src/components/ui/accordion/index.ts +0 -4
- package/src/components/ui/alert/Alert.vue +0 -38
- package/src/components/ui/alert/AlertDescription.vue +0 -12
- package/src/components/ui/alert/AlertTitle.vue +0 -12
- package/src/components/ui/alert/index.ts +0 -3
- package/src/components/ui/alert-dialog/AlertDialog.vue +0 -13
- package/src/components/ui/alert-dialog/AlertDialogAction.vue +0 -21
- package/src/components/ui/alert-dialog/AlertDialogCancel.vue +0 -21
- package/src/components/ui/alert-dialog/AlertDialogContent.vue +0 -39
- package/src/components/ui/alert-dialog/AlertDialogDescription.vue +0 -15
- package/src/components/ui/alert-dialog/AlertDialogFooter.vue +0 -12
- package/src/components/ui/alert-dialog/AlertDialogHeader.vue +0 -12
- package/src/components/ui/alert-dialog/AlertDialogTitle.vue +0 -15
- package/src/components/ui/alert-dialog/AlertDialogTrigger.vue +0 -11
- package/src/components/ui/alert-dialog/index.ts +0 -9
- package/src/components/ui/avatar/Avatar.vue +0 -14
- package/src/components/ui/avatar/index.ts +0 -1
- package/src/components/ui/badge/Badge.vue +0 -27
- package/src/components/ui/badge/index.ts +0 -1
- package/src/components/ui/breadcrumb/Breadcrumb.vue +0 -6
- package/src/components/ui/breadcrumb/BreadcrumbEllipsis.vue +0 -12
- package/src/components/ui/breadcrumb/BreadcrumbItem.vue +0 -6
- package/src/components/ui/breadcrumb/BreadcrumbLink.vue +0 -20
- package/src/components/ui/breadcrumb/BreadcrumbList.vue +0 -6
- package/src/components/ui/breadcrumb/BreadcrumbPage.vue +0 -6
- package/src/components/ui/breadcrumb/BreadcrumbSeparator.vue +0 -11
- package/src/components/ui/breadcrumb/index.ts +0 -7
- package/src/components/ui/button/Button.vue +0 -65
- package/src/components/ui/button/index.ts +0 -1
- package/src/components/ui/card/Card.vue +0 -13
- package/src/components/ui/card/CardContent.vue +0 -7
- package/src/components/ui/card/CardDescription.vue +0 -7
- package/src/components/ui/card/CardFooter.vue +0 -7
- package/src/components/ui/card/CardHeader.vue +0 -9
- package/src/components/ui/card/CardTitle.vue +0 -7
- package/src/components/ui/card/index.ts +0 -6
- package/src/components/ui/checkbox/Checkbox.vue +0 -25
- package/src/components/ui/checkbox/index.ts +0 -1
- package/src/components/ui/collapsible/Collapsible.vue +0 -13
- package/src/components/ui/collapsible/index.ts +0 -2
- package/src/components/ui/command/Command.vue +0 -16
- package/src/components/ui/command/CommandEmpty.vue +0 -5
- package/src/components/ui/command/CommandGroup.vue +0 -22
- package/src/components/ui/command/CommandInput.vue +0 -21
- package/src/components/ui/command/CommandItem.vue +0 -22
- package/src/components/ui/command/CommandList.vue +0 -17
- package/src/components/ui/command/CommandSeparator.vue +0 -5
- package/src/components/ui/command/index.ts +0 -7
- package/src/components/ui/context-menu/ContextMenuContent.vue +0 -24
- package/src/components/ui/context-menu/ContextMenuItem.vue +0 -16
- package/src/components/ui/context-menu/ContextMenuLabel.vue +0 -9
- package/src/components/ui/context-menu/ContextMenuSeparator.vue +0 -9
- package/src/components/ui/context-menu/ContextMenuSubContent.vue +0 -14
- package/src/components/ui/context-menu/index.ts +0 -9
- package/src/components/ui/dialog/Dialog.vue +0 -14
- package/src/components/ui/dialog/DialogClose.vue +0 -12
- package/src/components/ui/dialog/DialogContent.vue +0 -48
- package/src/components/ui/dialog/DialogDescription.vue +0 -23
- package/src/components/ui/dialog/DialogFooter.vue +0 -12
- package/src/components/ui/dialog/DialogHeader.vue +0 -12
- package/src/components/ui/dialog/DialogScrollContent.vue +0 -47
- package/src/components/ui/dialog/DialogTitle.vue +0 -23
- package/src/components/ui/dialog/DialogTrigger.vue +0 -12
- package/src/components/ui/dialog/index.ts +0 -9
- package/src/components/ui/dropdown-menu/DropdownMenu.vue +0 -13
- package/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +0 -28
- package/src/components/ui/dropdown-menu/DropdownMenuContent.vue +0 -33
- package/src/components/ui/dropdown-menu/DropdownMenuGroup.vue +0 -11
- package/src/components/ui/dropdown-menu/DropdownMenuItem.vue +0 -27
- package/src/components/ui/dropdown-menu/DropdownMenuLabel.vue +0 -23
- package/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +0 -13
- package/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +0 -27
- package/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue +0 -13
- package/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue +0 -12
- package/src/components/ui/dropdown-menu/DropdownMenuSub.vue +0 -13
- package/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue +0 -27
- package/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +0 -23
- package/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue +0 -11
- package/src/components/ui/dropdown-menu/index.ts +0 -14
- package/src/components/ui/form/FormControl.vue +0 -3
- package/src/components/ui/form/FormDescription.vue +0 -6
- package/src/components/ui/form/FormItem.vue +0 -6
- package/src/components/ui/form/FormLabel.vue +0 -10
- package/src/components/ui/form/FormMessage.vue +0 -10
- package/src/components/ui/form/index.ts +0 -9
- package/src/components/ui/hover-card/HoverCard.vue +0 -13
- package/src/components/ui/hover-card/HoverCardContent.vue +0 -26
- package/src/components/ui/hover-card/HoverCardTrigger.vue +0 -11
- package/src/components/ui/hover-card/index.ts +0 -3
- package/src/components/ui/input/Input.vue +0 -23
- package/src/components/ui/input/index.ts +0 -1
- package/src/components/ui/label/Label.vue +0 -18
- package/src/components/ui/label/index.ts +0 -1
- package/src/components/ui/lib/utils.ts +0 -2
- package/src/components/ui/menubar/MenubarContent.vue +0 -15
- package/src/components/ui/menubar/MenubarItem.vue +0 -13
- package/src/components/ui/menubar/MenubarTrigger.vue +0 -13
- package/src/components/ui/menubar/index.ts +0 -5
- package/src/components/ui/navigation-menu/NavigationMenuContent.vue +0 -14
- package/src/components/ui/navigation-menu/NavigationMenuTrigger.vue +0 -15
- package/src/components/ui/navigation-menu/index.ts +0 -4
- package/src/components/ui/pagination/PaginationContent.vue +0 -13
- package/src/components/ui/pagination/PaginationEllipsis.vue +0 -12
- package/src/components/ui/pagination/PaginationNext.vue +0 -14
- package/src/components/ui/pagination/PaginationPrev.vue +0 -14
- package/src/components/ui/pagination/index.ts +0 -6
- package/src/components/ui/popover/Popover.vue +0 -13
- package/src/components/ui/popover/PopoverContent.vue +0 -27
- package/src/components/ui/popover/PopoverTrigger.vue +0 -11
- package/src/components/ui/popover/index.ts +0 -3
- package/src/components/ui/progress/Progress.vue +0 -21
- package/src/components/ui/progress/index.ts +0 -1
- package/src/components/ui/radio-group/RadioGroup.vue +0 -16
- package/src/components/ui/radio-group/RadioGroupItem.vue +0 -24
- package/src/components/ui/radio-group/index.ts +0 -2
- package/src/components/ui/scroll-area/ScrollArea.vue +0 -13
- package/src/components/ui/scroll-area/index.ts +0 -1
- package/src/components/ui/select/Select.vue +0 -13
- package/src/components/ui/select/SelectContent.vue +0 -40
- package/src/components/ui/select/SelectGroup.vue +0 -15
- package/src/components/ui/select/SelectItem.vue +0 -30
- package/src/components/ui/select/SelectLabel.vue +0 -15
- package/src/components/ui/select/SelectSeparator.vue +0 -13
- package/src/components/ui/select/SelectTrigger.vue +0 -23
- package/src/components/ui/select/SelectValue.vue +0 -11
- package/src/components/ui/select/index.ts +0 -8
- package/src/components/ui/separator/Separator.vue +0 -16
- package/src/components/ui/separator/index.ts +0 -1
- package/src/components/ui/sheet/Sheet.vue +0 -13
- package/src/components/ui/sheet/SheetClose.vue +0 -11
- package/src/components/ui/sheet/SheetContent.vue +0 -65
- package/src/components/ui/sheet/SheetDescription.vue +0 -15
- package/src/components/ui/sheet/SheetFooter.vue +0 -12
- package/src/components/ui/sheet/SheetHeader.vue +0 -12
- package/src/components/ui/sheet/SheetTitle.vue +0 -15
- package/src/components/ui/sheet/SheetTrigger.vue +0 -11
- package/src/components/ui/sheet/index.ts +0 -8
- package/src/components/ui/skeleton/Skeleton.vue +0 -9
- package/src/components/ui/skeleton/index.ts +0 -1
- package/src/components/ui/slider/Slider.vue +0 -26
- package/src/components/ui/slider/index.ts +0 -1
- package/src/components/ui/switch/Switch.vue +0 -24
- package/src/components/ui/switch/index.ts +0 -1
- package/src/components/ui/table/Table.vue +0 -13
- package/src/components/ui/table/TableBody.vue +0 -6
- package/src/components/ui/table/TableCaption.vue +0 -6
- package/src/components/ui/table/TableCell.vue +0 -6
- package/src/components/ui/table/TableFooter.vue +0 -6
- package/src/components/ui/table/TableHead.vue +0 -6
- package/src/components/ui/table/TableHeader.vue +0 -6
- package/src/components/ui/table/TableRow.vue +0 -6
- package/src/components/ui/table/index.ts +0 -8
- package/src/components/ui/tabs/Tabs.vue +0 -13
- package/src/components/ui/tabs/TabsContent.vue +0 -21
- package/src/components/ui/tabs/TabsList.vue +0 -21
- package/src/components/ui/tabs/TabsTrigger.vue +0 -21
- package/src/components/ui/tabs/index.ts +0 -4
- package/src/components/ui/textarea/Textarea.vue +0 -29
- package/src/components/ui/textarea/index.ts +0 -1
- package/src/components/ui/toggle/Toggle.vue +0 -40
- package/src/components/ui/toggle/index.ts +0 -1
- package/src/components/ui/toggle-group/ToggleGroup.vue +0 -16
- package/src/components/ui/toggle-group/ToggleGroupItem.vue +0 -21
- package/src/components/ui/toggle-group/index.ts +0 -2
- package/src/components/ui/tooltip/Tooltip.vue +0 -13
- package/src/components/ui/tooltip/TooltipContent.vue +0 -27
- package/src/components/ui/tooltip/TooltipProvider.vue +0 -12
- package/src/components/ui/tooltip/TooltipTrigger.vue +0 -11
- package/src/components/ui/tooltip/index.ts +0 -4
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# Layout: Settings Page
|
|
2
|
+
|
|
3
|
+
Narrow content area with sidebar section navigation. Used for app settings, account preferences, and profile editing.
|
|
4
|
+
|
|
5
|
+
## Complete Template
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
<div className="max-w-4xl mx-auto px-6 py-8">
|
|
9
|
+
<h1 className="text-2xl font-bold mb-6">Settings</h1>
|
|
10
|
+
<div className="flex flex-col sm:flex-row gap-8">
|
|
11
|
+
<!-- Section navigation -->
|
|
12
|
+
<nav className="w-full sm:w-48 shrink-0 space-y-1">
|
|
13
|
+
<button v-for="section in sections" :key="section.id"
|
|
14
|
+
className={cn('w-full text-left px-3 py-2 rounded-md text-sm transition-colors',
|
|
15
|
+
activeSection === section.id
|
|
16
|
+
? 'bg-accent font-medium'
|
|
17
|
+
: 'text-muted-foreground hover:bg-accent/50')}>
|
|
18
|
+
{{ section.label }}
|
|
19
|
+
</button>
|
|
20
|
+
</nav>
|
|
21
|
+
|
|
22
|
+
<!-- Settings content -->
|
|
23
|
+
<div className="flex-1 space-y-8">
|
|
24
|
+
<!-- Profile section -->
|
|
25
|
+
<Card>
|
|
26
|
+
<CardHeader>
|
|
27
|
+
<CardTitle>Profile</CardTitle>
|
|
28
|
+
<CardDescription>Manage your public profile information.</CardDescription>
|
|
29
|
+
</CardHeader>
|
|
30
|
+
<CardContent className="space-y-4">
|
|
31
|
+
<div className="space-y-2">
|
|
32
|
+
<Label for="name">Display Name</Label>
|
|
33
|
+
<Input id="name" defaultValue="name" />
|
|
34
|
+
</div>
|
|
35
|
+
<div className="space-y-2">
|
|
36
|
+
<Label for="bio">Bio</Label>
|
|
37
|
+
<Textarea id="bio" defaultValue="bio" rows="3" />
|
|
38
|
+
</div>
|
|
39
|
+
</CardContent>
|
|
40
|
+
<CardFooter className="justify-end">
|
|
41
|
+
<Button>Save Changes</Button>
|
|
42
|
+
</CardFooter>
|
|
43
|
+
</Card>
|
|
44
|
+
|
|
45
|
+
<!-- Notifications section -->
|
|
46
|
+
<Card>
|
|
47
|
+
<CardHeader>
|
|
48
|
+
<CardTitle>Notifications</CardTitle>
|
|
49
|
+
<CardDescription>Configure how you receive notifications.</CardDescription>
|
|
50
|
+
</CardHeader>
|
|
51
|
+
<CardContent className="space-y-4">
|
|
52
|
+
<div className="flex items-center justify-between">
|
|
53
|
+
<div>
|
|
54
|
+
<p className="text-sm font-medium">Email Notifications</p>
|
|
55
|
+
<p className="text-xs text-muted-foreground">Receive emails about account activity.</p>
|
|
56
|
+
</div>
|
|
57
|
+
<Switch />
|
|
58
|
+
</div>
|
|
59
|
+
<Separator />
|
|
60
|
+
<div className="flex items-center justify-between">
|
|
61
|
+
<div>
|
|
62
|
+
<p className="text-sm font-medium">Push Notifications</p>
|
|
63
|
+
<p className="text-xs text-muted-foreground">Receive push notifications on your device.</p>
|
|
64
|
+
</div>
|
|
65
|
+
<Switch />
|
|
66
|
+
</div>
|
|
67
|
+
</CardContent>
|
|
68
|
+
</Card>
|
|
69
|
+
|
|
70
|
+
<!-- Danger zone -->
|
|
71
|
+
<Card className="border-destructive/50">
|
|
72
|
+
<CardHeader>
|
|
73
|
+
<CardTitle>Danger Zone</CardTitle>
|
|
74
|
+
<CardDescription>Irreversible actions for your account.</CardDescription>
|
|
75
|
+
</CardHeader>
|
|
76
|
+
<CardContent>
|
|
77
|
+
<div className="flex items-center justify-between">
|
|
78
|
+
<div>
|
|
79
|
+
<p className="text-sm font-medium">Delete Account</p>
|
|
80
|
+
<p className="text-xs text-muted-foreground">Permanently delete your account and all data.</p>
|
|
81
|
+
</div>
|
|
82
|
+
<Button variant="destructive" size="sm">Delete Account</Button>
|
|
83
|
+
</div>
|
|
84
|
+
</CardContent>
|
|
85
|
+
</Card>
|
|
86
|
+
</div>
|
|
87
|
+
</div>
|
|
88
|
+
</div>
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Key Dimensions
|
|
92
|
+
- Content max width: `max-w-4xl` (narrower than standard pages)
|
|
93
|
+
- Sidebar nav: `w-48`
|
|
94
|
+
- Gap between sidebar and content: `gap-8`
|
|
95
|
+
- Gap between settings cards: `space-y-8`
|
|
96
|
+
- Active nav item: `bg-accent font-medium`
|
|
97
|
+
|
|
98
|
+
## Section Pattern
|
|
99
|
+
Each settings section is a Card with:
|
|
100
|
+
- `CardTitle` and `CardDescription` explaining the section
|
|
101
|
+
- Form fields or toggle rows inside `CardContent`
|
|
102
|
+
- Save button in `CardFooter` (right-aligned)
|
|
103
|
+
- Toggle rows use `flex items-center justify-between` with label on left, `Switch` on right
|
|
104
|
+
|
|
105
|
+
## Mobile Behavior
|
|
106
|
+
On mobile (below `sm:`), the sidebar nav stacks on top of the content area. Consider using horizontal scrolling tabs as an alternative on mobile.
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Layout: Sidebar
|
|
2
|
+
|
|
3
|
+
The most common SaaS/dashboard layout. Fixed sidebar on the left, scrollable content area on the right.
|
|
4
|
+
|
|
5
|
+
## Structure
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
<div className="flex h-screen bg-background">
|
|
9
|
+
<!-- Sidebar: fixed width, full height, scrollable if needed -->
|
|
10
|
+
<aside className="w-64 border-r bg-card flex flex-col shrink-0">
|
|
11
|
+
<!-- Logo area: h-14 to match any topbar -->
|
|
12
|
+
<div className="h-14 flex items-center px-4 border-b">
|
|
13
|
+
<div className="flex items-center gap-2">
|
|
14
|
+
<div className="w-7 h-7 rounded-md bg-primary flex items-center justify-center">
|
|
15
|
+
<Zap className="w-4 h-4 text-primary-foreground" />
|
|
16
|
+
</div>
|
|
17
|
+
<span className="text-sm font-semibold">App Name</span>
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
|
|
21
|
+
<!-- Navigation: flexes to fill available space -->
|
|
22
|
+
<ScrollArea className="flex-1">
|
|
23
|
+
<nav className="p-3 space-y-1">
|
|
24
|
+
<!-- Nav items here (see patterns/navigation.md) -->
|
|
25
|
+
</nav>
|
|
26
|
+
</ScrollArea>
|
|
27
|
+
|
|
28
|
+
<!-- User area: pinned to bottom -->
|
|
29
|
+
<div className="border-t p-3">
|
|
30
|
+
<!-- User avatar + name + dropdown -->
|
|
31
|
+
</div>
|
|
32
|
+
</aside>
|
|
33
|
+
|
|
34
|
+
<!-- Main content area: scrollable independently -->
|
|
35
|
+
<main className="flex-1 overflow-y-auto">
|
|
36
|
+
<div className="max-w-7xl mx-auto px-6 py-8">
|
|
37
|
+
<!-- Page content (see specific patterns) -->
|
|
38
|
+
</div>
|
|
39
|
+
</main>
|
|
40
|
+
</div>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Dimensions
|
|
44
|
+
|
|
45
|
+
| Element | Value | Notes |
|
|
46
|
+
|---------|-------|-------|
|
|
47
|
+
| Sidebar width | `w-64` (256px) | Standard. Use `w-56` (224px) for compact. |
|
|
48
|
+
| Logo bar height | `h-14` (56px) | Matches topbar height for hybrid layouts. |
|
|
49
|
+
| Nav item padding | `px-3 py-2` | Consistent touch targets. |
|
|
50
|
+
| Content max width | `max-w-7xl` (1280px) | Centered with `mx-auto`. |
|
|
51
|
+
| Content padding | `px-6 py-8` | Standard page padding. |
|
|
52
|
+
|
|
53
|
+
## Sidebar with Collapsible Groups
|
|
54
|
+
|
|
55
|
+
For apps with many nav items, group them with collapsible sections:
|
|
56
|
+
|
|
57
|
+
```tsx
|
|
58
|
+
<Collapsible v-model:open="isProjectsOpen" className="space-y-1">
|
|
59
|
+
<CollapsibleTrigger className="w-full flex items-center justify-between px-3 py-2 text-xs font-medium text-muted-foreground uppercase tracking-wider hover:text-foreground">
|
|
60
|
+
Projects
|
|
61
|
+
<ChevronDown className="w-3 h-3 transition-transform" className={isProjectsOpen && 'rotate-180'} />
|
|
62
|
+
</CollapsibleTrigger>
|
|
63
|
+
<CollapsibleContent className="space-y-1">
|
|
64
|
+
<!-- Sub-items -->
|
|
65
|
+
</CollapsibleContent>
|
|
66
|
+
</Collapsible>
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## When to Use
|
|
70
|
+
- SaaS dashboards and admin panels
|
|
71
|
+
- Apps with 5+ primary navigation sections
|
|
72
|
+
- Apps where users spend long sessions (workspace-style)
|
|
73
|
+
- Any app that needs persistent navigation
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Layout: Top Bar
|
|
2
|
+
|
|
3
|
+
Horizontal navigation at the top. Best for simpler apps, consumer products, and marketing sites.
|
|
4
|
+
|
|
5
|
+
## Structure
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
<div className="min-h-screen bg-background">
|
|
9
|
+
<!-- Top bar -->
|
|
10
|
+
<header className="sticky top-0 z-50 h-14 border-b bg-card/95 backdrop-blur supports-[backdrop-filter]:bg-card/60">
|
|
11
|
+
<div className="flex items-center h-full px-6 max-w-7xl mx-auto">
|
|
12
|
+
<!-- Logo -->
|
|
13
|
+
<div className="flex items-center gap-2 shrink-0 mr-6">
|
|
14
|
+
<div className="w-7 h-7 rounded-md bg-primary flex items-center justify-center">
|
|
15
|
+
<Zap className="w-4 h-4 text-primary-foreground" />
|
|
16
|
+
</div>
|
|
17
|
+
<span className="text-sm font-semibold">App Name</span>
|
|
18
|
+
</div>
|
|
19
|
+
|
|
20
|
+
<!-- Navigation -->
|
|
21
|
+
<nav className="hidden md:flex items-center gap-1">
|
|
22
|
+
<Button variant="ghost" size="sm" className="font-medium">Dashboard</Button>
|
|
23
|
+
<Button variant="ghost" size="sm" className="text-muted-foreground">Projects</Button>
|
|
24
|
+
<Button variant="ghost" size="sm" className="text-muted-foreground">Team</Button>
|
|
25
|
+
</nav>
|
|
26
|
+
|
|
27
|
+
<!-- Right side -->
|
|
28
|
+
<div className="ml-auto flex items-center gap-2">
|
|
29
|
+
<Button variant="ghost" size="icon" className="hidden sm:flex">
|
|
30
|
+
<Search className="w-4 h-4" />
|
|
31
|
+
</Button>
|
|
32
|
+
<Button variant="ghost" size="icon">
|
|
33
|
+
<Bell className="w-4 h-4" />
|
|
34
|
+
</Button>
|
|
35
|
+
<!-- User menu -->
|
|
36
|
+
<DropdownMenu>
|
|
37
|
+
<DropdownMenuTrigger as-child>
|
|
38
|
+
<Button variant="ghost" size="icon" className="rounded-full">
|
|
39
|
+
<div className="w-7 h-7 rounded-full bg-gradient-to-br from-primary/60 to-primary" />
|
|
40
|
+
</Button>
|
|
41
|
+
</DropdownMenuTrigger>
|
|
42
|
+
<DropdownMenuContent align="end">
|
|
43
|
+
<!-- User menu items -->
|
|
44
|
+
</DropdownMenuContent>
|
|
45
|
+
</DropdownMenu>
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
</header>
|
|
49
|
+
|
|
50
|
+
<!-- Main content -->
|
|
51
|
+
<main className="max-w-7xl mx-auto px-6 py-8">
|
|
52
|
+
<!-- Page content -->
|
|
53
|
+
</main>
|
|
54
|
+
</div>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Key Details
|
|
58
|
+
|
|
59
|
+
- **Sticky header**: `sticky top-0 z-50` keeps the nav visible while scrolling
|
|
60
|
+
- **Backdrop blur**: `bg-card/95 backdrop-blur` creates a frosted glass effect
|
|
61
|
+
- **Active nav item**: Use `font-medium` for active, `text-muted-foreground` for inactive
|
|
62
|
+
- **Mobile**: Hide nav links with `hidden md:flex`, show hamburger menu instead
|
|
63
|
+
|
|
64
|
+
## When to Use
|
|
65
|
+
- Consumer-facing products
|
|
66
|
+
- Sites with 3–5 top-level sections
|
|
67
|
+
- Apps where vertical space is more valuable than horizontal space
|
|
68
|
+
- Marketing sites and landing pages
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# Pattern: Auth
|
|
2
|
+
|
|
3
|
+
Login, signup, forgot password, and verification screens.
|
|
4
|
+
|
|
5
|
+
## Login Page
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
<div className="flex min-h-screen items-center justify-center px-4">
|
|
9
|
+
<Card className="w-full max-w-sm">
|
|
10
|
+
<CardHeader className="text-center">
|
|
11
|
+
<div className="mx-auto w-10 h-10 rounded-lg bg-primary flex items-center justify-center mb-2">
|
|
12
|
+
<Zap className="w-5 h-5 text-primary-foreground" />
|
|
13
|
+
</div>
|
|
14
|
+
<CardTitle className="text-xl">Welcome back</CardTitle>
|
|
15
|
+
<CardDescription>Sign in to your account</CardDescription>
|
|
16
|
+
</CardHeader>
|
|
17
|
+
<CardContent>
|
|
18
|
+
<form className="space-y-4" @submit.prevent="handleLogin">
|
|
19
|
+
<div className="space-y-2">
|
|
20
|
+
<Label for="email">Email</Label>
|
|
21
|
+
<Input id="email" type="email" placeholder="you@example.com" defaultValue="email" />
|
|
22
|
+
</div>
|
|
23
|
+
<div className="space-y-2">
|
|
24
|
+
<div className="flex items-center justify-between">
|
|
25
|
+
<Label for="password">Password</Label>
|
|
26
|
+
<Button variant="link" size="sm" className="px-0 h-auto text-xs">Forgot password?</Button>
|
|
27
|
+
</div>
|
|
28
|
+
<Input id="password" type="password" defaultValue="password" />
|
|
29
|
+
</div>
|
|
30
|
+
<Button type="submit" className="w-full" :disabled="loading">
|
|
31
|
+
<Loader2 v-if="loading" className="w-4 h-4 animate-spin" />
|
|
32
|
+
{{ loading ? 'Signing in...' : 'Sign In' }}
|
|
33
|
+
</Button>
|
|
34
|
+
</form>
|
|
35
|
+
</CardContent>
|
|
36
|
+
<CardFooter className="justify-center">
|
|
37
|
+
<p className="text-sm text-muted-foreground">
|
|
38
|
+
Don't have an account? <Button variant="link" className="px-1 h-auto">Sign up</Button>
|
|
39
|
+
</p>
|
|
40
|
+
</CardFooter>
|
|
41
|
+
</Card>
|
|
42
|
+
</div>
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Signup Page
|
|
46
|
+
|
|
47
|
+
```tsx
|
|
48
|
+
<div className="flex min-h-screen items-center justify-center px-4">
|
|
49
|
+
<Card className="w-full max-w-sm">
|
|
50
|
+
<CardHeader className="text-center">
|
|
51
|
+
<div className="mx-auto w-10 h-10 rounded-lg bg-primary flex items-center justify-center mb-2">
|
|
52
|
+
<Zap className="w-5 h-5 text-primary-foreground" />
|
|
53
|
+
</div>
|
|
54
|
+
<CardTitle className="text-xl">Create your account</CardTitle>
|
|
55
|
+
<CardDescription>Get started for free</CardDescription>
|
|
56
|
+
</CardHeader>
|
|
57
|
+
<CardContent>
|
|
58
|
+
<form className="space-y-4" @submit.prevent="handleSignup">
|
|
59
|
+
<div className="grid grid-cols-2 gap-3">
|
|
60
|
+
<div className="space-y-2">
|
|
61
|
+
<Label for="first">First Name</Label>
|
|
62
|
+
<Input id="first" placeholder="Sarah" defaultValue="firstName" />
|
|
63
|
+
</div>
|
|
64
|
+
<div className="space-y-2">
|
|
65
|
+
<Label for="last">Last Name</Label>
|
|
66
|
+
<Input id="last" placeholder="Chen" defaultValue="lastName" />
|
|
67
|
+
</div>
|
|
68
|
+
</div>
|
|
69
|
+
<div className="space-y-2">
|
|
70
|
+
<Label for="signup-email">Email</Label>
|
|
71
|
+
<Input id="signup-email" type="email" placeholder="you@example.com" defaultValue="email" />
|
|
72
|
+
</div>
|
|
73
|
+
<div className="space-y-2">
|
|
74
|
+
<Label for="signup-password">Password</Label>
|
|
75
|
+
<Input id="signup-password" type="password" defaultValue="password" />
|
|
76
|
+
<p className="text-xs text-muted-foreground">Must be at least 8 characters.</p>
|
|
77
|
+
</div>
|
|
78
|
+
<div className="flex items-start gap-2">
|
|
79
|
+
<Checkbox id="terms" v-model:checked="agreedToTerms" className="mt-0.5" />
|
|
80
|
+
<Label for="terms" className="text-xs text-muted-foreground font-normal leading-relaxed">
|
|
81
|
+
I agree to the Terms of Service and Privacy Policy
|
|
82
|
+
</Label>
|
|
83
|
+
</div>
|
|
84
|
+
<Button type="submit" className="w-full" :disabled="loading">
|
|
85
|
+
<Loader2 v-if="loading" className="w-4 h-4 animate-spin" />
|
|
86
|
+
{{ loading ? 'Creating account...' : 'Create Account' }}
|
|
87
|
+
</Button>
|
|
88
|
+
</form>
|
|
89
|
+
</CardContent>
|
|
90
|
+
<CardFooter className="justify-center">
|
|
91
|
+
<p className="text-sm text-muted-foreground">
|
|
92
|
+
Already have an account? <Button variant="link" className="px-1 h-auto">Sign in</Button>
|
|
93
|
+
</p>
|
|
94
|
+
</CardFooter>
|
|
95
|
+
</Card>
|
|
96
|
+
</div>
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Forgot Password
|
|
100
|
+
|
|
101
|
+
```tsx
|
|
102
|
+
<Card className="w-full max-w-sm">
|
|
103
|
+
<CardHeader className="text-center">
|
|
104
|
+
<CardTitle className="text-xl">Reset password</CardTitle>
|
|
105
|
+
<CardDescription>Enter your email and we'll send you a reset link.</CardDescription>
|
|
106
|
+
</CardHeader>
|
|
107
|
+
<CardContent>
|
|
108
|
+
<form className="space-y-4" @submit.prevent="handleReset">
|
|
109
|
+
<div className="space-y-2">
|
|
110
|
+
<Label for="reset-email">Email</Label>
|
|
111
|
+
<Input id="reset-email" type="email" placeholder="you@example.com" defaultValue="email" />
|
|
112
|
+
</div>
|
|
113
|
+
<Button type="submit" className="w-full">Send Reset Link</Button>
|
|
114
|
+
</form>
|
|
115
|
+
</CardContent>
|
|
116
|
+
<CardFooter className="justify-center">
|
|
117
|
+
<Button variant="link" className="text-sm"><ArrowLeft className="w-4 h-4" /> Back to sign in</Button>
|
|
118
|
+
</CardFooter>
|
|
119
|
+
</Card>
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Key Design Rules
|
|
123
|
+
|
|
124
|
+
- **Centered card**: `max-w-sm` on a centered flex container with `min-h-screen`
|
|
125
|
+
- **Logo at top**: Small icon in `bg-primary` rounded square, centered
|
|
126
|
+
- **Full-width submit button**: `className="w-full"` on the primary Button
|
|
127
|
+
- **Footer link**: Toggle between login/signup with a link below the form
|
|
128
|
+
- **Minimal fields**: Only ask for what's absolutely necessary
|
|
129
|
+
- **Password hint**: `text-xs text-muted-foreground` below the password field
|
|
130
|
+
- **Terms checkbox**: `text-xs` label with muted color, never pre-checked
|
|
131
|
+
- **Name fields**: Side-by-side in `grid grid-cols-2 gap-3`
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# Pattern: Content Display
|
|
2
|
+
|
|
3
|
+
Card grids, list views, and detail views for browsing and inspecting content.
|
|
4
|
+
|
|
5
|
+
## Card Grid
|
|
6
|
+
|
|
7
|
+
Display items as a responsive grid of cards.
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
10
|
+
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
|
|
11
|
+
<Card v-for="project in projects" :key="project.id"
|
|
12
|
+
className="cursor-pointer transition-colors hover:bg-accent/50">
|
|
13
|
+
<CardHeader className="pb-3">
|
|
14
|
+
<div className="flex items-center justify-between">
|
|
15
|
+
<Badge variant="secondary">{{ project.category }}</Badge>
|
|
16
|
+
<DropdownMenu>
|
|
17
|
+
<DropdownMenuTrigger as-child>
|
|
18
|
+
<Button variant="ghost" size="icon" className="h-8 w-8">
|
|
19
|
+
<MoreHorizontal className="w-4 h-4" />
|
|
20
|
+
</Button>
|
|
21
|
+
</DropdownMenuTrigger>
|
|
22
|
+
<DropdownMenuContent align="end">
|
|
23
|
+
<DropdownMenuItem><Pencil className="w-4 h-4" /> Edit</DropdownMenuItem>
|
|
24
|
+
<DropdownMenuItem className="text-destructive"><Trash2 className="w-4 h-4" /> Delete</DropdownMenuItem>
|
|
25
|
+
</DropdownMenuContent>
|
|
26
|
+
</DropdownMenu>
|
|
27
|
+
</div>
|
|
28
|
+
<CardTitle className="text-lg">{{ project.name }}</CardTitle>
|
|
29
|
+
<CardDescription className="line-clamp-2">{{ project.description }}</CardDescription>
|
|
30
|
+
</CardHeader>
|
|
31
|
+
<CardContent>
|
|
32
|
+
<div className="flex items-center gap-4 text-xs text-muted-foreground">
|
|
33
|
+
<span className="flex items-center gap-1"><Clock className="w-3 h-3" /> {{ project.updated }}</span>
|
|
34
|
+
<span className="flex items-center gap-1"><Users className="w-3 h-3" /> {{ project.members }}</span>
|
|
35
|
+
</div>
|
|
36
|
+
</CardContent>
|
|
37
|
+
</Card>
|
|
38
|
+
</div>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## List View (Stacked Cards)
|
|
42
|
+
|
|
43
|
+
Items displayed as a vertical list with consistent row layout.
|
|
44
|
+
|
|
45
|
+
```tsx
|
|
46
|
+
<div className="space-y-2">
|
|
47
|
+
<Card v-for="item in items" :key="item.id"
|
|
48
|
+
className="cursor-pointer transition-colors hover:bg-accent/50">
|
|
49
|
+
<CardContent className="flex items-center gap-4 p-4">
|
|
50
|
+
<!-- Visual identifier -->
|
|
51
|
+
<div className="w-10 h-10 rounded-lg bg-muted flex items-center justify-center shrink-0">
|
|
52
|
+
<FileText className="w-5 h-5 text-muted-foreground" />
|
|
53
|
+
</div>
|
|
54
|
+
<!-- Content -->
|
|
55
|
+
<div className="flex-1 min-w-0">
|
|
56
|
+
<p className="text-sm font-medium truncate">{{ item.title }}</p>
|
|
57
|
+
<p className="text-xs text-muted-foreground">{{ item.subtitle }}</p>
|
|
58
|
+
</div>
|
|
59
|
+
<!-- Metadata -->
|
|
60
|
+
<div className="hidden sm:flex items-center gap-4 shrink-0">
|
|
61
|
+
<Badge variant="secondary">{{ item.status }}</Badge>
|
|
62
|
+
<span className="text-xs text-muted-foreground">{{ item.date }}</span>
|
|
63
|
+
</div>
|
|
64
|
+
<!-- Chevron -->
|
|
65
|
+
<ChevronRight className="w-4 h-4 text-muted-foreground shrink-0" />
|
|
66
|
+
</CardContent>
|
|
67
|
+
</Card>
|
|
68
|
+
</div>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Status Cards
|
|
72
|
+
|
|
73
|
+
When cards represent items with a specific severity or status (e.g., active, warning, failed), use semantic badges or status dots instead of coloring the card's borders or background. This maintains the "Quiet Confidence" design principle.
|
|
74
|
+
|
|
75
|
+
```tsx
|
|
76
|
+
<!-- ✅ Recommended: Status Dot (Minimal) -->
|
|
77
|
+
<Card>
|
|
78
|
+
<CardHeader className="flex flex-row items-center gap-2 pb-2">
|
|
79
|
+
<div className="w-2 h-2 rounded-full bg-destructive shrink-0" />
|
|
80
|
+
<CardTitle className="text-sm font-medium">Payment Failed</CardTitle>
|
|
81
|
+
</CardHeader>
|
|
82
|
+
</Card>
|
|
83
|
+
|
|
84
|
+
<!-- ✅ Recommended: Semantic Badge (Explicit) -->
|
|
85
|
+
<Card>
|
|
86
|
+
<CardHeader className="flex flex-row items-center justify-between pb-2">
|
|
87
|
+
<CardTitle className="text-sm font-medium">Server Alpha</CardTitle>
|
|
88
|
+
<Badge variant="warning">High Load</Badge>
|
|
89
|
+
</CardHeader>
|
|
90
|
+
</Card>
|
|
91
|
+
|
|
92
|
+
<!-- ❌ Anti-Pattern: Heavy colored borders or backgrounds -->
|
|
93
|
+
<!-- Do NOT use: <Card className="border-l-4 border-l-destructive"> -->
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Detail View
|
|
97
|
+
|
|
98
|
+
Full view of a single entity with header, metadata, and tabbed content.
|
|
99
|
+
|
|
100
|
+
```tsx
|
|
101
|
+
<div className="max-w-4xl mx-auto px-6 py-8 space-y-6">
|
|
102
|
+
<!-- Back button -->
|
|
103
|
+
<Button variant="ghost" size="sm" className="gap-1">
|
|
104
|
+
<ArrowLeft className="w-4 h-4" /> Back to Projects
|
|
105
|
+
</Button>
|
|
106
|
+
|
|
107
|
+
<!-- Header -->
|
|
108
|
+
<div className="flex items-start justify-between">
|
|
109
|
+
<div className="space-y-1">
|
|
110
|
+
<div className="flex items-center gap-3">
|
|
111
|
+
<h1 className="text-2xl font-bold">Project Alpha</h1>
|
|
112
|
+
<Badge>Active</Badge>
|
|
113
|
+
</div>
|
|
114
|
+
<p className="text-muted-foreground">Created by Sarah Chen · Updated 2 hours ago</p>
|
|
115
|
+
</div>
|
|
116
|
+
<div className="flex items-center gap-2">
|
|
117
|
+
<Button variant="outline"><Pencil className="w-4 h-4" /> Edit</Button>
|
|
118
|
+
<DropdownMenu>
|
|
119
|
+
<DropdownMenuTrigger as-child>
|
|
120
|
+
<Button variant="outline" size="icon"><MoreHorizontal className="w-4 h-4" /></Button>
|
|
121
|
+
</DropdownMenuTrigger>
|
|
122
|
+
<DropdownMenuContent align="end">
|
|
123
|
+
<DropdownMenuItem>Duplicate</DropdownMenuItem>
|
|
124
|
+
<DropdownMenuItem>Archive</DropdownMenuItem>
|
|
125
|
+
<DropdownMenuSeparator />
|
|
126
|
+
<DropdownMenuItem className="text-destructive">Delete</DropdownMenuItem>
|
|
127
|
+
</DropdownMenuContent>
|
|
128
|
+
</DropdownMenu>
|
|
129
|
+
</div>
|
|
130
|
+
</div>
|
|
131
|
+
|
|
132
|
+
<!-- Tabbed content -->
|
|
133
|
+
<Tabs default-value="overview">
|
|
134
|
+
<TabsList>
|
|
135
|
+
<TabsTrigger value="overview">Overview</TabsTrigger>
|
|
136
|
+
<TabsTrigger value="tasks">Tasks <Badge variant="secondary" className="ml-1.5">12</Badge></TabsTrigger>
|
|
137
|
+
<TabsTrigger value="activity">Activity</TabsTrigger>
|
|
138
|
+
</TabsList>
|
|
139
|
+
<TabsContent value="overview" className="mt-6">
|
|
140
|
+
<!-- Overview content -->
|
|
141
|
+
</TabsContent>
|
|
142
|
+
</Tabs>
|
|
143
|
+
</div>
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## View Switcher (Grid/List Toggle)
|
|
147
|
+
|
|
148
|
+
```tsx
|
|
149
|
+
<div className="flex items-center justify-between">
|
|
150
|
+
<p className="text-sm text-muted-foreground">{{ items.length }} items</p>
|
|
151
|
+
<ToggleGroup type="single" defaultValue="viewMode">
|
|
152
|
+
<ToggleGroupItem value="grid" aria-label="Grid view"><LayoutGrid className="w-4 h-4" /></ToggleGroupItem>
|
|
153
|
+
<ToggleGroupItem value="list" aria-label="List view"><List className="w-4 h-4" /></ToggleGroupItem>
|
|
154
|
+
</ToggleGroup>
|
|
155
|
+
</div>
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## When to Use Which
|
|
159
|
+
|
|
160
|
+
| Content Type | Display |
|
|
161
|
+
|-------------|---------|
|
|
162
|
+
| Visual items (products, media, projects) | Card grid |
|
|
163
|
+
| Text-heavy items (documents, tasks, emails) | List view |
|
|
164
|
+
| Single entity with sections | Detail view with tabs |
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# Pattern: Dashboards
|
|
2
|
+
|
|
3
|
+
Stats, KPIs, chart areas, activity feeds, and overview layouts.
|
|
4
|
+
|
|
5
|
+
## Stat Cards Row
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4">
|
|
9
|
+
<Card v-for="stat in stats" :key="stat.label">
|
|
10
|
+
<CardHeader className="flex flex-row items-center justify-between pb-2">
|
|
11
|
+
<CardTitle className="text-sm font-medium">{{ stat.label }}</CardTitle>
|
|
12
|
+
<component :is="stat.icon" className="h-4 w-4 text-muted-foreground" />
|
|
13
|
+
</CardHeader>
|
|
14
|
+
<CardContent>
|
|
15
|
+
<div className="text-2xl font-bold">{{ stat.value }}</div>
|
|
16
|
+
<p className="text-xs text-muted-foreground">{{ stat.change }}</p>
|
|
17
|
+
</CardContent>
|
|
18
|
+
</Card>
|
|
19
|
+
</div>
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Stat data example:
|
|
23
|
+
```ts
|
|
24
|
+
const stats = ref([
|
|
25
|
+
{ label: 'Total Revenue', value: '$45,231', change: '+20.1% from last month', icon: DollarSign },
|
|
26
|
+
{ label: 'Subscriptions', value: '2,350', change: '+180 this month', icon: Users },
|
|
27
|
+
{ label: 'Active Now', value: '573', change: '+12 since last hour', icon: Activity },
|
|
28
|
+
{ label: 'Conversion Rate', value: '3.2%', change: '+0.4% from last month', icon: TrendingUp },
|
|
29
|
+
])
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Dashboard Layout (Stats + Chart + Table)
|
|
33
|
+
|
|
34
|
+
```tsx
|
|
35
|
+
<div className="space-y-6">
|
|
36
|
+
<!-- Page Header -->
|
|
37
|
+
<div className="flex items-center justify-between">
|
|
38
|
+
<div>
|
|
39
|
+
<h1 className="text-2xl font-bold">Dashboard</h1>
|
|
40
|
+
<p className="text-muted-foreground">Overview of your business metrics.</p>
|
|
41
|
+
</div>
|
|
42
|
+
<Button variant="outline"><Download className="w-4 h-4" /> Export</Button>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
<!-- Stats Row -->
|
|
46
|
+
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4">
|
|
47
|
+
<!-- 4 stat cards -->
|
|
48
|
+
</div>
|
|
49
|
+
|
|
50
|
+
<!-- Main Content (chart + sidebar) -->
|
|
51
|
+
<div className="grid grid-cols-1 lg:grid-cols-7 gap-6">
|
|
52
|
+
<Card className="lg:col-span-4">
|
|
53
|
+
<CardHeader>
|
|
54
|
+
<CardTitle>Revenue Overview</CardTitle>
|
|
55
|
+
<CardDescription>Monthly revenue for the current year.</CardDescription>
|
|
56
|
+
</CardHeader>
|
|
57
|
+
<CardContent>
|
|
58
|
+
<AreaChart
|
|
59
|
+
:data="[{ month: 'Jan', total: 1200 }, { month: 'Feb', total: 2100 }, { month: 'Mar', total: 1800 }]"
|
|
60
|
+
index="month"
|
|
61
|
+
:categories="['total']"
|
|
62
|
+
className="h-72"
|
|
63
|
+
/>
|
|
64
|
+
</CardContent>
|
|
65
|
+
</Card>
|
|
66
|
+
<Card className="lg:col-span-3">
|
|
67
|
+
<CardHeader>
|
|
68
|
+
<CardTitle>Recent Activity</CardTitle>
|
|
69
|
+
<CardDescription>Latest actions in your workspace.</CardDescription>
|
|
70
|
+
</CardHeader>
|
|
71
|
+
<CardContent className="space-y-4">
|
|
72
|
+
<!-- Activity feed items -->
|
|
73
|
+
<div v-for="activity in recentActivity" :key="activity.id" className="flex items-start gap-3">
|
|
74
|
+
<div className="w-8 h-8 rounded-full shrink-0 flex items-center justify-center text-xs font-medium bg-muted text-muted-foreground">
|
|
75
|
+
{{ activity.initials }}
|
|
76
|
+
</div>
|
|
77
|
+
<div className="flex-1 min-w-0">
|
|
78
|
+
<p className="text-sm"><span className="font-medium">{{ activity.user }}</span> {{ activity.action }}</p>
|
|
79
|
+
<p className="text-xs text-muted-foreground">{{ activity.time }}</p>
|
|
80
|
+
</div>
|
|
81
|
+
</div>
|
|
82
|
+
</CardContent>
|
|
83
|
+
</Card>
|
|
84
|
+
</div>
|
|
85
|
+
|
|
86
|
+
<!-- Bottom Section (table) -->
|
|
87
|
+
<Card>
|
|
88
|
+
<CardHeader>
|
|
89
|
+
<CardTitle>Recent Orders</CardTitle>
|
|
90
|
+
</CardHeader>
|
|
91
|
+
<CardContent className="p-0">
|
|
92
|
+
<!-- Table -->
|
|
93
|
+
</CardContent>
|
|
94
|
+
</Card>
|
|
95
|
+
</div>
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Key Rules
|
|
99
|
+
|
|
100
|
+
- **4 stat cards** is the standard. Use `lg:grid-cols-4` for the grid.
|
|
101
|
+
- **Asymmetric main content**: `lg:grid-cols-7` with the chart spanning `lg:col-span-4` and sidebar `lg:col-span-3`.
|
|
102
|
+
- **Activity feed items**: Avatar + name (bold) + action text + timestamp.
|
|
103
|
+
- **Charts**: Use `<AreaChart>`, `<BarChart>`, `<LineChart>`, or `<DonutChart>` from the design system. Supply realistic dummy data in mockup mode. Always wrap charts in a Card with a `CardTitle` describing the data.
|
|
104
|
+
- Always include a page-level export or date range action in the header.
|