@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.
Files changed (439) hide show
  1. package/README.md +1 -1
  2. package/SKILL.md +214 -0
  3. package/package.json +58 -23
  4. package/skills/apps/analytics.md +103 -0
  5. package/skills/apps/booking-scheduling.md +97 -0
  6. package/skills/apps/content-management.md +52 -0
  7. package/skills/apps/crm.md +80 -0
  8. package/skills/apps/e-commerce.md +109 -0
  9. package/skills/apps/education.md +79 -0
  10. package/skills/apps/finance.md +68 -0
  11. package/skills/apps/health-fitness.md +72 -0
  12. package/skills/apps/marketplace.md +99 -0
  13. package/skills/apps/messaging.md +84 -0
  14. package/skills/apps/portfolio-personal.md +90 -0
  15. package/skills/apps/project-management.md +95 -0
  16. package/skills/apps/saas-dashboard.md +104 -0
  17. package/skills/apps/social-platform.md +50 -0
  18. package/skills/blocks/auth.md +106 -0
  19. package/skills/blocks/communication.md +98 -0
  20. package/skills/blocks/content.md +107 -0
  21. package/skills/blocks/data-management.md +109 -0
  22. package/skills/blocks/data-viz.md +92 -0
  23. package/skills/blocks/ecommerce.md +126 -0
  24. package/skills/blocks/feedback.md +97 -0
  25. package/skills/blocks/filtering.md +127 -0
  26. package/skills/blocks/marketing.md +136 -0
  27. package/skills/blocks/media.md +102 -0
  28. package/skills/blocks/navigation.md +136 -0
  29. package/skills/blocks/onboarding.md +75 -0
  30. package/skills/blocks/profiles.md +131 -0
  31. package/skills/blocks/scheduling.md +117 -0
  32. package/skills/blocks/settings.md +102 -0
  33. package/skills/components/advanced-components.md +142 -0
  34. package/skills/components/avatar.md +92 -0
  35. package/skills/components/badge.md +105 -0
  36. package/skills/components/button.md +87 -0
  37. package/skills/components/card.md +144 -0
  38. package/skills/components/chart.md +88 -0
  39. package/skills/components/dialog.md +109 -0
  40. package/skills/components/dropdown-menu.md +117 -0
  41. package/skills/components/extended-components.md +187 -0
  42. package/skills/components/feedback.md +165 -0
  43. package/skills/components/form.md +112 -0
  44. package/skills/components/input.md +107 -0
  45. package/skills/components/map.md +53 -0
  46. package/skills/components/navigation.md +73 -0
  47. package/skills/components/overlay.md +77 -0
  48. package/skills/components/page-header.md +51 -0
  49. package/skills/components/select.md +175 -0
  50. package/skills/components/table.md +102 -0
  51. package/skills/components/tabs.md +105 -0
  52. package/skills/components/utilities.md +138 -0
  53. package/skills/devices/desktop.md +43 -0
  54. package/skills/devices/mobile.md +77 -0
  55. package/skills/foundation/design-principles.md +77 -0
  56. package/skills/foundation/design-tokens.md +121 -0
  57. package/skills/foundation/mockup-generation.md +118 -0
  58. package/skills/foundation/rules.md +54 -0
  59. package/skills/foundation/tailwind-usage.md +204 -0
  60. package/skills/layouts/dashboard.md +71 -0
  61. package/skills/layouts/full-page-form.md +75 -0
  62. package/skills/layouts/list-detail.md +70 -0
  63. package/skills/layouts/marketing.md +70 -0
  64. package/skills/layouts/responsive.md +67 -0
  65. package/skills/layouts/settings-page.md +106 -0
  66. package/skills/layouts/sidebar.md +73 -0
  67. package/skills/layouts/topbar.md +68 -0
  68. package/skills/patterns/auth.md +131 -0
  69. package/skills/patterns/content-display.md +164 -0
  70. package/skills/patterns/dashboards.md +104 -0
  71. package/skills/patterns/data-tables.md +113 -0
  72. package/skills/patterns/empty-states.md +71 -0
  73. package/skills/patterns/error-states.md +73 -0
  74. package/skills/patterns/forms.md +136 -0
  75. package/skills/patterns/loading-states.md +92 -0
  76. package/skills/patterns/navigation.md +113 -0
  77. package/skills/patterns/notifications.md +91 -0
  78. package/skills/patterns/onboarding.md +42 -0
  79. package/skills/patterns/search.md +55 -0
  80. package/skills/patterns/settings.md +132 -0
  81. package/skills/patterns/user-profiles.md +67 -0
  82. package/skills/personas/business-operator.md +114 -0
  83. package/skills/personas/consumer-casual.md +60 -0
  84. package/skills/personas/consumer-power-user.md +109 -0
  85. package/skills/personas/creative-professional.md +109 -0
  86. package/skills/personas/enterprise-admin.md +134 -0
  87. package/skills/visual/color-usage.md +62 -0
  88. package/skills/visual/dark-mode.md +50 -0
  89. package/skills/visual/polish-techniques.md +101 -0
  90. package/skills/visual/spacing-composition.md +69 -0
  91. package/skills/visual/transitions-animations.md +66 -0
  92. package/skills/visual/typography-hierarchy.md +66 -0
  93. package/src/components/blocks/auth/auth-card/AuthCard.tsx +62 -0
  94. package/src/components/blocks/auth/auth-card/index.ts +1 -0
  95. package/src/components/blocks/auth/index.ts +3 -0
  96. package/src/components/blocks/auth/social-login/SocialLoginGroup.tsx +75 -0
  97. package/src/components/blocks/auth/social-login/index.ts +1 -0
  98. package/src/components/blocks/auth/two-factor/TwoFactorForm.tsx +59 -0
  99. package/src/components/blocks/auth/two-factor/index.ts +1 -0
  100. package/src/components/blocks/communication/activity-item/ActivityItem.tsx +17 -0
  101. package/src/components/blocks/communication/activity-item/ActivityItemAvatar.tsx +21 -0
  102. package/src/components/blocks/communication/activity-item/ActivityItemContent.tsx +16 -0
  103. package/src/components/blocks/communication/activity-item/index.ts +3 -0
  104. package/src/components/blocks/communication/chat-bubble/ChatBubble.tsx +21 -0
  105. package/src/components/blocks/communication/chat-bubble/ChatBubbleAvatar.tsx +19 -0
  106. package/src/components/blocks/communication/chat-bubble/ChatBubbleMessage.tsx +35 -0
  107. package/src/components/blocks/communication/chat-bubble/ChatBubbleTimestamp.tsx +15 -0
  108. package/src/components/blocks/communication/chat-bubble/index.ts +4 -0
  109. package/src/components/blocks/communication/index.ts +2 -0
  110. package/src/components/blocks/content/article-header/ArticleHeader.tsx +73 -0
  111. package/src/components/blocks/content/article-header/index.ts +1 -0
  112. package/src/components/blocks/content/author-card/AuthorCard.tsx +46 -0
  113. package/src/components/blocks/content/author-card/index.ts +1 -0
  114. package/src/components/blocks/content/index.ts +3 -0
  115. package/src/components/blocks/content/rich-text/RichTextContent.tsx +27 -0
  116. package/src/components/blocks/content/rich-text/index.ts +1 -0
  117. package/src/components/blocks/data-management/index.ts +2 -0
  118. package/src/components/blocks/data-management/kanban/KanbanBoard.tsx +10 -0
  119. package/src/components/blocks/data-management/kanban/KanbanCard.tsx +102 -0
  120. package/src/components/blocks/data-management/kanban/KanbanColumn.tsx +41 -0
  121. package/src/components/blocks/data-management/kanban/index.ts +3 -0
  122. package/src/components/blocks/data-management/tree-view/TreeItem.tsx +68 -0
  123. package/src/components/blocks/data-management/tree-view/TreeView.tsx +10 -0
  124. package/src/components/blocks/data-management/tree-view/index.ts +2 -0
  125. package/src/components/blocks/data-viz/financial-ticker/FinancialTicker.tsx +35 -0
  126. package/src/components/blocks/data-viz/financial-ticker/index.ts +1 -0
  127. package/src/components/blocks/data-viz/index.ts +3 -0
  128. package/src/components/blocks/data-viz/kpi-card/KpiCard.tsx +61 -0
  129. package/src/components/blocks/data-viz/kpi-card/index.ts +1 -0
  130. package/src/components/blocks/data-viz/stat-grid/StatGrid.tsx +28 -0
  131. package/src/components/blocks/data-viz/stat-grid/index.ts +1 -0
  132. package/src/components/blocks/ecommerce/index.ts +3 -0
  133. package/src/components/blocks/ecommerce/pricing-tier/PricingFeatureList.tsx +27 -0
  134. package/src/components/blocks/ecommerce/pricing-tier/PricingHeader.tsx +25 -0
  135. package/src/components/blocks/ecommerce/pricing-tier/PricingTier.tsx +31 -0
  136. package/src/components/blocks/ecommerce/pricing-tier/index.ts +3 -0
  137. package/src/components/blocks/ecommerce/product-card/ProductCard.tsx +17 -0
  138. package/src/components/blocks/ecommerce/product-card/ProductCardContent.tsx +15 -0
  139. package/src/components/blocks/ecommerce/product-card/ProductCardImage.tsx +20 -0
  140. package/src/components/blocks/ecommerce/product-card/ProductCardPrice.tsx +20 -0
  141. package/src/components/blocks/ecommerce/product-card/index.ts +4 -0
  142. package/src/components/blocks/ecommerce/rating-summary/RatingStars.tsx +32 -0
  143. package/src/components/blocks/ecommerce/rating-summary/index.ts +1 -0
  144. package/src/components/blocks/feedback/empty-state/EmptyState.tsx +53 -0
  145. package/src/components/blocks/feedback/empty-state/index.ts +1 -0
  146. package/src/components/blocks/feedback/error-state/ErrorState.tsx +50 -0
  147. package/src/components/blocks/feedback/error-state/index.ts +1 -0
  148. package/src/components/blocks/feedback/index.ts +3 -0
  149. package/src/components/blocks/feedback/not-found/NotFoundState.tsx +47 -0
  150. package/src/components/blocks/feedback/not-found/index.ts +1 -0
  151. package/src/components/blocks/filtering/faceted-sidebar/FacetedGroup.tsx +32 -0
  152. package/src/components/blocks/filtering/faceted-sidebar/FacetedSidebar.tsx +26 -0
  153. package/src/components/blocks/filtering/faceted-sidebar/index.ts +2 -0
  154. package/src/components/blocks/filtering/filter-bar/FilterBar.tsx +85 -0
  155. package/src/components/blocks/filtering/filter-bar/index.ts +1 -0
  156. package/src/components/blocks/filtering/index.ts +3 -0
  157. package/src/components/blocks/filtering/search-result/SearchResultItem.tsx +70 -0
  158. package/src/components/blocks/filtering/search-result/index.ts +1 -0
  159. package/src/components/blocks/index.ts +21 -0
  160. package/src/components/blocks/marketing/cta-block/CtaBlock.tsx +80 -0
  161. package/src/components/blocks/marketing/cta-block/index.ts +1 -0
  162. package/src/components/blocks/marketing/feature-grid/FeatureGrid.tsx +47 -0
  163. package/src/components/blocks/marketing/feature-grid/index.ts +1 -0
  164. package/src/components/blocks/marketing/hero-section/HeroSection.tsx +89 -0
  165. package/src/components/blocks/marketing/hero-section/index.ts +1 -0
  166. package/src/components/blocks/marketing/index.ts +4 -0
  167. package/src/components/blocks/marketing/testimonial-card/TestimonialCard.tsx +71 -0
  168. package/src/components/blocks/marketing/testimonial-card/index.ts +1 -0
  169. package/src/components/blocks/media/call-controls/CallControlButton.tsx +52 -0
  170. package/src/components/blocks/media/call-controls/CallControls.tsx +10 -0
  171. package/src/components/blocks/media/call-controls/index.ts +2 -0
  172. package/src/components/blocks/media/index.ts +2 -0
  173. package/src/components/blocks/media/media-player/MediaPlayer.tsx +20 -0
  174. package/src/components/blocks/media/media-player/MediaPlayerControls.tsx +16 -0
  175. package/src/components/blocks/media/media-player/MediaPlayerScrubber.tsx +29 -0
  176. package/src/components/blocks/media/media-player/MediaPlayerVideo.tsx +25 -0
  177. package/src/components/blocks/media/media-player/index.ts +4 -0
  178. package/src/components/blocks/navigation/app-sidebar/AppSidebar.tsx +32 -0
  179. package/src/components/blocks/navigation/app-sidebar/NavItem.tsx +43 -0
  180. package/src/components/blocks/navigation/app-sidebar/index.ts +2 -0
  181. package/src/components/blocks/navigation/context-switcher/ContextSwitcher.tsx +77 -0
  182. package/src/components/blocks/navigation/context-switcher/index.ts +1 -0
  183. package/src/components/blocks/navigation/index.ts +3 -0
  184. package/src/components/blocks/navigation/top-navbar/TopNavbar.tsx +47 -0
  185. package/src/components/blocks/navigation/top-navbar/index.ts +1 -0
  186. package/src/components/blocks/onboarding/index.ts +2 -0
  187. package/src/components/blocks/onboarding/onboarding-welcome/OnboardingWelcome.tsx +74 -0
  188. package/src/components/blocks/onboarding/onboarding-welcome/index.ts +1 -0
  189. package/src/components/blocks/onboarding/step-wizard/StepWizard.tsx +72 -0
  190. package/src/components/blocks/onboarding/step-wizard/index.ts +1 -0
  191. package/src/components/blocks/profiles/connection-list/ConnectionItem.tsx +35 -0
  192. package/src/components/blocks/profiles/connection-list/ConnectionList.tsx +16 -0
  193. package/src/components/blocks/profiles/connection-list/index.ts +2 -0
  194. package/src/components/blocks/profiles/index.ts +3 -0
  195. package/src/components/blocks/profiles/profile-header/ProfileHeader.tsx +88 -0
  196. package/src/components/blocks/profiles/profile-header/index.ts +1 -0
  197. package/src/components/blocks/profiles/profile-stats/ProfileStats.tsx +20 -0
  198. package/src/components/blocks/profiles/profile-stats/index.ts +1 -0
  199. package/src/components/blocks/scheduling/booking-slot/BookingSlot.tsx +44 -0
  200. package/src/components/blocks/scheduling/booking-slot/index.ts +1 -0
  201. package/src/components/blocks/scheduling/event-card/EventCard.tsx +85 -0
  202. package/src/components/blocks/scheduling/event-card/index.ts +1 -0
  203. package/src/components/blocks/scheduling/index.ts +3 -0
  204. package/src/components/blocks/scheduling/timeline-row/TimelineRow.tsx +82 -0
  205. package/src/components/blocks/scheduling/timeline-row/index.ts +1 -0
  206. package/src/components/blocks/settings/billing-usage/BillingUsage.tsx +49 -0
  207. package/src/components/blocks/settings/billing-usage/index.ts +1 -0
  208. package/src/components/blocks/settings/index.ts +3 -0
  209. package/src/components/blocks/settings/integration-card/IntegrationCard.tsx +62 -0
  210. package/src/components/blocks/settings/integration-card/index.ts +1 -0
  211. package/src/components/blocks/settings/settings-section/SettingsSection.tsx +23 -0
  212. package/src/components/blocks/settings/settings-section/index.ts +1 -0
  213. package/src/components/ui/accordion.tsx +56 -0
  214. package/src/components/ui/alert-dialog.tsx +141 -0
  215. package/src/components/ui/alert.tsx +59 -0
  216. package/src/components/ui/aspect-ratio.tsx +5 -0
  217. package/src/components/ui/avatar.tsx +50 -0
  218. package/src/components/ui/badge.tsx +36 -0
  219. package/src/components/ui/breadcrumb.tsx +115 -0
  220. package/src/components/ui/button.tsx +56 -0
  221. package/src/components/ui/calendar.tsx +211 -0
  222. package/src/components/ui/card.tsx +79 -0
  223. package/src/components/ui/carousel.tsx +262 -0
  224. package/src/components/ui/chart.tsx +367 -0
  225. package/src/components/ui/checkbox.tsx +28 -0
  226. package/src/components/ui/collapsible.tsx +11 -0
  227. package/src/components/ui/command.tsx +153 -0
  228. package/src/components/ui/component-placeholder.tsx +38 -0
  229. package/src/components/ui/context-menu.tsx +198 -0
  230. package/src/components/ui/dialog.tsx +122 -0
  231. package/src/components/ui/drawer.tsx +116 -0
  232. package/src/components/ui/dropdown-menu.tsx +200 -0
  233. package/src/components/ui/form.tsx +176 -0
  234. package/src/components/ui/hover-card.tsx +27 -0
  235. package/src/components/ui/input-otp.tsx +69 -0
  236. package/src/components/ui/input.tsx +22 -0
  237. package/src/components/ui/label.tsx +24 -0
  238. package/src/components/ui/menubar.tsx +256 -0
  239. package/src/components/ui/navigation-menu.tsx +128 -0
  240. package/src/components/ui/pagination.tsx +117 -0
  241. package/src/components/ui/popover.tsx +29 -0
  242. package/src/components/ui/progress.tsx +28 -0
  243. package/src/components/ui/radio-group.tsx +42 -0
  244. package/src/components/ui/resizable.tsx +45 -0
  245. package/src/components/ui/scroll-area.tsx +46 -0
  246. package/src/components/ui/select.tsx +160 -0
  247. package/src/components/ui/separator.tsx +29 -0
  248. package/src/components/ui/sheet.tsx +140 -0
  249. package/src/components/ui/skeleton.tsx +15 -0
  250. package/src/components/ui/slider.tsx +26 -0
  251. package/src/components/ui/sonner.tsx +45 -0
  252. package/src/components/ui/switch.tsx +27 -0
  253. package/src/components/ui/table.tsx +117 -0
  254. package/src/components/ui/tabs.tsx +53 -0
  255. package/src/components/ui/textarea.tsx +22 -0
  256. package/src/components/ui/toast.tsx +127 -0
  257. package/src/components/ui/toaster.tsx +33 -0
  258. package/src/components/ui/toggle-group.tsx +61 -0
  259. package/src/components/ui/toggle.tsx +45 -0
  260. package/src/components/ui/tooltip.tsx +28 -0
  261. package/src/hooks/use-toast.ts +194 -0
  262. package/src/index.ts +53 -56
  263. package/src/styles/tokens.css +30 -14
  264. package/tailwind.config.js +120 -98
  265. package/tsconfig.json +2 -2
  266. package/DESIGN_GUIDE.md +0 -148
  267. package/src/components/ui/accordion/Accordion.vue +0 -13
  268. package/src/components/ui/accordion/AccordionContent.vue +0 -20
  269. package/src/components/ui/accordion/AccordionItem.vue +0 -15
  270. package/src/components/ui/accordion/AccordionTrigger.vue +0 -25
  271. package/src/components/ui/accordion/index.ts +0 -4
  272. package/src/components/ui/alert/Alert.vue +0 -38
  273. package/src/components/ui/alert/AlertDescription.vue +0 -12
  274. package/src/components/ui/alert/AlertTitle.vue +0 -12
  275. package/src/components/ui/alert/index.ts +0 -3
  276. package/src/components/ui/alert-dialog/AlertDialog.vue +0 -13
  277. package/src/components/ui/alert-dialog/AlertDialogAction.vue +0 -21
  278. package/src/components/ui/alert-dialog/AlertDialogCancel.vue +0 -21
  279. package/src/components/ui/alert-dialog/AlertDialogContent.vue +0 -39
  280. package/src/components/ui/alert-dialog/AlertDialogDescription.vue +0 -15
  281. package/src/components/ui/alert-dialog/AlertDialogFooter.vue +0 -12
  282. package/src/components/ui/alert-dialog/AlertDialogHeader.vue +0 -12
  283. package/src/components/ui/alert-dialog/AlertDialogTitle.vue +0 -15
  284. package/src/components/ui/alert-dialog/AlertDialogTrigger.vue +0 -11
  285. package/src/components/ui/alert-dialog/index.ts +0 -9
  286. package/src/components/ui/avatar/Avatar.vue +0 -14
  287. package/src/components/ui/avatar/index.ts +0 -1
  288. package/src/components/ui/badge/Badge.vue +0 -27
  289. package/src/components/ui/badge/index.ts +0 -1
  290. package/src/components/ui/breadcrumb/Breadcrumb.vue +0 -6
  291. package/src/components/ui/breadcrumb/BreadcrumbEllipsis.vue +0 -12
  292. package/src/components/ui/breadcrumb/BreadcrumbItem.vue +0 -6
  293. package/src/components/ui/breadcrumb/BreadcrumbLink.vue +0 -20
  294. package/src/components/ui/breadcrumb/BreadcrumbList.vue +0 -6
  295. package/src/components/ui/breadcrumb/BreadcrumbPage.vue +0 -6
  296. package/src/components/ui/breadcrumb/BreadcrumbSeparator.vue +0 -11
  297. package/src/components/ui/breadcrumb/index.ts +0 -7
  298. package/src/components/ui/button/Button.vue +0 -65
  299. package/src/components/ui/button/index.ts +0 -1
  300. package/src/components/ui/card/Card.vue +0 -13
  301. package/src/components/ui/card/CardContent.vue +0 -7
  302. package/src/components/ui/card/CardDescription.vue +0 -7
  303. package/src/components/ui/card/CardFooter.vue +0 -7
  304. package/src/components/ui/card/CardHeader.vue +0 -9
  305. package/src/components/ui/card/CardTitle.vue +0 -7
  306. package/src/components/ui/card/index.ts +0 -6
  307. package/src/components/ui/checkbox/Checkbox.vue +0 -25
  308. package/src/components/ui/checkbox/index.ts +0 -1
  309. package/src/components/ui/collapsible/Collapsible.vue +0 -13
  310. package/src/components/ui/collapsible/index.ts +0 -2
  311. package/src/components/ui/command/Command.vue +0 -16
  312. package/src/components/ui/command/CommandEmpty.vue +0 -5
  313. package/src/components/ui/command/CommandGroup.vue +0 -22
  314. package/src/components/ui/command/CommandInput.vue +0 -21
  315. package/src/components/ui/command/CommandItem.vue +0 -22
  316. package/src/components/ui/command/CommandList.vue +0 -17
  317. package/src/components/ui/command/CommandSeparator.vue +0 -5
  318. package/src/components/ui/command/index.ts +0 -7
  319. package/src/components/ui/context-menu/ContextMenuContent.vue +0 -24
  320. package/src/components/ui/context-menu/ContextMenuItem.vue +0 -16
  321. package/src/components/ui/context-menu/ContextMenuLabel.vue +0 -9
  322. package/src/components/ui/context-menu/ContextMenuSeparator.vue +0 -9
  323. package/src/components/ui/context-menu/ContextMenuSubContent.vue +0 -14
  324. package/src/components/ui/context-menu/index.ts +0 -9
  325. package/src/components/ui/dialog/Dialog.vue +0 -14
  326. package/src/components/ui/dialog/DialogClose.vue +0 -12
  327. package/src/components/ui/dialog/DialogContent.vue +0 -48
  328. package/src/components/ui/dialog/DialogDescription.vue +0 -23
  329. package/src/components/ui/dialog/DialogFooter.vue +0 -12
  330. package/src/components/ui/dialog/DialogHeader.vue +0 -12
  331. package/src/components/ui/dialog/DialogScrollContent.vue +0 -47
  332. package/src/components/ui/dialog/DialogTitle.vue +0 -23
  333. package/src/components/ui/dialog/DialogTrigger.vue +0 -12
  334. package/src/components/ui/dialog/index.ts +0 -9
  335. package/src/components/ui/dropdown-menu/DropdownMenu.vue +0 -13
  336. package/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +0 -28
  337. package/src/components/ui/dropdown-menu/DropdownMenuContent.vue +0 -33
  338. package/src/components/ui/dropdown-menu/DropdownMenuGroup.vue +0 -11
  339. package/src/components/ui/dropdown-menu/DropdownMenuItem.vue +0 -27
  340. package/src/components/ui/dropdown-menu/DropdownMenuLabel.vue +0 -23
  341. package/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +0 -13
  342. package/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +0 -27
  343. package/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue +0 -13
  344. package/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue +0 -12
  345. package/src/components/ui/dropdown-menu/DropdownMenuSub.vue +0 -13
  346. package/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue +0 -27
  347. package/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +0 -23
  348. package/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue +0 -11
  349. package/src/components/ui/dropdown-menu/index.ts +0 -14
  350. package/src/components/ui/form/FormControl.vue +0 -3
  351. package/src/components/ui/form/FormDescription.vue +0 -6
  352. package/src/components/ui/form/FormItem.vue +0 -6
  353. package/src/components/ui/form/FormLabel.vue +0 -10
  354. package/src/components/ui/form/FormMessage.vue +0 -10
  355. package/src/components/ui/form/index.ts +0 -9
  356. package/src/components/ui/hover-card/HoverCard.vue +0 -13
  357. package/src/components/ui/hover-card/HoverCardContent.vue +0 -26
  358. package/src/components/ui/hover-card/HoverCardTrigger.vue +0 -11
  359. package/src/components/ui/hover-card/index.ts +0 -3
  360. package/src/components/ui/input/Input.vue +0 -23
  361. package/src/components/ui/input/index.ts +0 -1
  362. package/src/components/ui/label/Label.vue +0 -18
  363. package/src/components/ui/label/index.ts +0 -1
  364. package/src/components/ui/lib/utils.ts +0 -2
  365. package/src/components/ui/menubar/MenubarContent.vue +0 -15
  366. package/src/components/ui/menubar/MenubarItem.vue +0 -13
  367. package/src/components/ui/menubar/MenubarTrigger.vue +0 -13
  368. package/src/components/ui/menubar/index.ts +0 -5
  369. package/src/components/ui/navigation-menu/NavigationMenuContent.vue +0 -14
  370. package/src/components/ui/navigation-menu/NavigationMenuTrigger.vue +0 -15
  371. package/src/components/ui/navigation-menu/index.ts +0 -4
  372. package/src/components/ui/pagination/PaginationContent.vue +0 -13
  373. package/src/components/ui/pagination/PaginationEllipsis.vue +0 -12
  374. package/src/components/ui/pagination/PaginationNext.vue +0 -14
  375. package/src/components/ui/pagination/PaginationPrev.vue +0 -14
  376. package/src/components/ui/pagination/index.ts +0 -6
  377. package/src/components/ui/popover/Popover.vue +0 -13
  378. package/src/components/ui/popover/PopoverContent.vue +0 -27
  379. package/src/components/ui/popover/PopoverTrigger.vue +0 -11
  380. package/src/components/ui/popover/index.ts +0 -3
  381. package/src/components/ui/progress/Progress.vue +0 -21
  382. package/src/components/ui/progress/index.ts +0 -1
  383. package/src/components/ui/radio-group/RadioGroup.vue +0 -16
  384. package/src/components/ui/radio-group/RadioGroupItem.vue +0 -24
  385. package/src/components/ui/radio-group/index.ts +0 -2
  386. package/src/components/ui/scroll-area/ScrollArea.vue +0 -13
  387. package/src/components/ui/scroll-area/index.ts +0 -1
  388. package/src/components/ui/select/Select.vue +0 -13
  389. package/src/components/ui/select/SelectContent.vue +0 -40
  390. package/src/components/ui/select/SelectGroup.vue +0 -15
  391. package/src/components/ui/select/SelectItem.vue +0 -30
  392. package/src/components/ui/select/SelectLabel.vue +0 -15
  393. package/src/components/ui/select/SelectSeparator.vue +0 -13
  394. package/src/components/ui/select/SelectTrigger.vue +0 -23
  395. package/src/components/ui/select/SelectValue.vue +0 -11
  396. package/src/components/ui/select/index.ts +0 -8
  397. package/src/components/ui/separator/Separator.vue +0 -16
  398. package/src/components/ui/separator/index.ts +0 -1
  399. package/src/components/ui/sheet/Sheet.vue +0 -13
  400. package/src/components/ui/sheet/SheetClose.vue +0 -11
  401. package/src/components/ui/sheet/SheetContent.vue +0 -65
  402. package/src/components/ui/sheet/SheetDescription.vue +0 -15
  403. package/src/components/ui/sheet/SheetFooter.vue +0 -12
  404. package/src/components/ui/sheet/SheetHeader.vue +0 -12
  405. package/src/components/ui/sheet/SheetTitle.vue +0 -15
  406. package/src/components/ui/sheet/SheetTrigger.vue +0 -11
  407. package/src/components/ui/sheet/index.ts +0 -8
  408. package/src/components/ui/skeleton/Skeleton.vue +0 -9
  409. package/src/components/ui/skeleton/index.ts +0 -1
  410. package/src/components/ui/slider/Slider.vue +0 -26
  411. package/src/components/ui/slider/index.ts +0 -1
  412. package/src/components/ui/switch/Switch.vue +0 -24
  413. package/src/components/ui/switch/index.ts +0 -1
  414. package/src/components/ui/table/Table.vue +0 -13
  415. package/src/components/ui/table/TableBody.vue +0 -6
  416. package/src/components/ui/table/TableCaption.vue +0 -6
  417. package/src/components/ui/table/TableCell.vue +0 -6
  418. package/src/components/ui/table/TableFooter.vue +0 -6
  419. package/src/components/ui/table/TableHead.vue +0 -6
  420. package/src/components/ui/table/TableHeader.vue +0 -6
  421. package/src/components/ui/table/TableRow.vue +0 -6
  422. package/src/components/ui/table/index.ts +0 -8
  423. package/src/components/ui/tabs/Tabs.vue +0 -13
  424. package/src/components/ui/tabs/TabsContent.vue +0 -21
  425. package/src/components/ui/tabs/TabsList.vue +0 -21
  426. package/src/components/ui/tabs/TabsTrigger.vue +0 -21
  427. package/src/components/ui/tabs/index.ts +0 -4
  428. package/src/components/ui/textarea/Textarea.vue +0 -29
  429. package/src/components/ui/textarea/index.ts +0 -1
  430. package/src/components/ui/toggle/Toggle.vue +0 -40
  431. package/src/components/ui/toggle/index.ts +0 -1
  432. package/src/components/ui/toggle-group/ToggleGroup.vue +0 -16
  433. package/src/components/ui/toggle-group/ToggleGroupItem.vue +0 -21
  434. package/src/components/ui/toggle-group/index.ts +0 -2
  435. package/src/components/ui/tooltip/Tooltip.vue +0 -13
  436. package/src/components/ui/tooltip/TooltipContent.vue +0 -27
  437. package/src/components/ui/tooltip/TooltipProvider.vue +0 -12
  438. package/src/components/ui/tooltip/TooltipTrigger.vue +0 -11
  439. 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.