canvas-ui-sdk 0.3.23 → 4.0.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 (177) hide show
  1. package/README.md +25 -5
  2. package/dist/charts.js +11 -6
  3. package/dist/charts.js.map +1 -1
  4. package/dist/index.d.ts +1233 -153
  5. package/dist/index.js +3562 -447
  6. package/dist/index.js.map +1 -1
  7. package/mcp/dist/index.js +1195 -149
  8. package/package.json +1 -1
  9. package/prompts/.cursorrules +96 -0
  10. package/prompts/.windsurfrules +96 -0
  11. package/prompts/CLAUDE.md +22 -0
  12. package/prompts/copilot-instructions.md +96 -0
  13. package/registry/blocks/activity-feed.json +12 -1
  14. package/registry/blocks/blog-cards.json +10 -2
  15. package/registry/blocks/bottom-action-bar.json +27 -0
  16. package/registry/blocks/bottom-input-chat-widget.json +9 -1
  17. package/registry/blocks/category-grid.json +10 -2
  18. package/registry/blocks/centered-hero.json +9 -1
  19. package/registry/blocks/chat-message.json +8 -1
  20. package/registry/blocks/circular-progress-bar-list.json +11 -1
  21. package/registry/blocks/confirmation-popup.json +10 -1
  22. package/registry/blocks/contact-form-popup.json +10 -1
  23. package/registry/blocks/content-dropzone.json +8 -0
  24. package/registry/blocks/content-with-image.json +9 -1
  25. package/registry/blocks/core-values-grid.json +10 -2
  26. package/registry/blocks/credit-card-display.json +9 -1
  27. package/registry/blocks/cta-banner.json +10 -2
  28. package/registry/blocks/destination-cards.json +10 -1
  29. package/registry/blocks/detail-drawer.json +10 -1
  30. package/registry/blocks/details-popup.json +10 -1
  31. package/registry/blocks/editable-list.json +29 -0
  32. package/registry/blocks/empty-state.json +10 -2
  33. package/registry/blocks/faq-accordion.json +9 -1
  34. package/registry/blocks/faqs-table.json +10 -1
  35. package/registry/blocks/feature-with-image.json +9 -1
  36. package/registry/blocks/featured-news-cards.json +10 -2
  37. package/registry/blocks/featured-places.json +10 -2
  38. package/registry/blocks/features-comparison.json +9 -1
  39. package/registry/blocks/feedback-popup.json +9 -1
  40. package/registry/blocks/filter-popover.json +8 -1
  41. package/registry/blocks/fixed-column-data-table.json +11 -1
  42. package/registry/blocks/flair-banner.json +9 -1
  43. package/registry/blocks/footer-navbar.json +9 -1
  44. package/registry/blocks/form-group.json +14 -3
  45. package/registry/blocks/form-popup.json +31 -0
  46. package/registry/blocks/gallery-section.json +10 -2
  47. package/registry/blocks/gradient-banner.json +10 -2
  48. package/registry/blocks/graph-metric-tiles.json +1 -1
  49. package/registry/blocks/grid-tiles-list.json +10 -1
  50. package/registry/blocks/hero-dark-centered.json +9 -1
  51. package/registry/blocks/hero-dark-with-image.json +9 -1
  52. package/registry/blocks/hero-fullwidth-image.json +9 -1
  53. package/registry/blocks/hero-section.json +9 -1
  54. package/registry/blocks/how-it-works.json +9 -1
  55. package/registry/blocks/image-feed-with-nested-comments.json +10 -1
  56. package/registry/blocks/image-popup.json +10 -1
  57. package/registry/blocks/invoice-popup.json +10 -1
  58. package/registry/blocks/large-image-labels-list.json +10 -1
  59. package/registry/blocks/list-popup.json +28 -0
  60. package/registry/blocks/loader.json +9 -1
  61. package/registry/blocks/login-branding-panel.json +10 -2
  62. package/registry/blocks/menu-section.json +9 -1
  63. package/registry/blocks/menufocus-template.json +9 -1
  64. package/registry/blocks/messenger-sidebar.json +11 -2
  65. package/registry/blocks/metrics-section.json +10 -2
  66. package/registry/blocks/mobile-bottom-nav.json +10 -2
  67. package/registry/blocks/monthly-calendar-widget.json +9 -1
  68. package/registry/blocks/multistep-form-popup.json +34 -0
  69. package/registry/blocks/nested-comments-table.json +9 -1
  70. package/registry/blocks/nested-data-table.json +10 -1
  71. package/registry/blocks/nps-survey-popup.json +27 -0
  72. package/registry/blocks/office-locations.json +10 -2
  73. package/registry/blocks/order-summary-sidebar.json +27 -0
  74. package/registry/blocks/page-header-section.json +9 -1
  75. package/registry/blocks/pagination.json +8 -1
  76. package/registry/blocks/participant-list.json +9 -1
  77. package/registry/blocks/persona-card.json +10 -1
  78. package/registry/blocks/personalize-feed-popup.json +27 -0
  79. package/registry/blocks/pill-tabs.json +9 -1
  80. package/registry/blocks/place-detail-panel.json +11 -1
  81. package/registry/blocks/pricing-cards.json +10 -2
  82. package/registry/blocks/pricing-cta.json +9 -1
  83. package/registry/blocks/pricing-plans-popup.json +10 -1
  84. package/registry/blocks/profile-card.json +12 -2
  85. package/registry/blocks/profile-grid-tiles-list.json +10 -1
  86. package/registry/blocks/profile-image-uploader.json +9 -1
  87. package/registry/blocks/profile-info-cards.json +10 -1
  88. package/registry/blocks/progress-bar.json +8 -1
  89. package/registry/blocks/prompt-template.json +1 -1
  90. package/registry/blocks/purchase-confirmation-popup.json +10 -1
  91. package/registry/blocks/reservation-card.json +26 -0
  92. package/registry/blocks/reviews-grid.json +10 -2
  93. package/registry/blocks/reviews-table.json +10 -1
  94. package/registry/blocks/screen-prompt-template.json +1 -1
  95. package/registry/blocks/search-bar.json +9 -2
  96. package/registry/blocks/search-sidebar.json +9 -2
  97. package/registry/blocks/settings-list-row.json +9 -1
  98. package/registry/blocks/share-project-popup.json +36 -0
  99. package/registry/blocks/sidebar-cards.json +10 -2
  100. package/registry/blocks/sidebar-profile-card.json +10 -2
  101. package/registry/blocks/slideshow-grid-tiles.json +10 -2
  102. package/registry/blocks/slideshow-popup.json +10 -1
  103. package/registry/blocks/small-edit-popup.json +29 -0
  104. package/registry/blocks/social-feed.json +10 -1
  105. package/registry/blocks/social-proof.json +9 -1
  106. package/registry/blocks/standard-data-table.json +13 -1
  107. package/registry/blocks/standard-list-with-image.json +10 -1
  108. package/registry/blocks/step-tracker.json +9 -1
  109. package/registry/blocks/store-location-map.json +9 -1
  110. package/registry/blocks/team-cards-grid.json +9 -1
  111. package/registry/blocks/team-circular-grid.json +9 -1
  112. package/registry/blocks/terms-of-service-popup.json +10 -1
  113. package/registry/blocks/testimonial-carousel.json +10 -2
  114. package/registry/blocks/tile-image-gallery.json +26 -0
  115. package/registry/blocks/title-group.json +10 -1
  116. package/registry/blocks/upvoting-posts-table.json +10 -1
  117. package/registry/blocks/vertical-how-it-works.json +9 -1
  118. package/registry/blocks/vertical-step-tracker.json +9 -1
  119. package/registry/blocks/video-chat-controls.json +9 -1
  120. package/registry/blocks/video-content-section.json +9 -1
  121. package/registry/blocks/video-playlist.json +9 -1
  122. package/registry/blocks/video-popup.json +9 -1
  123. package/registry/blocks/view-profile-popup.json +10 -1
  124. package/registry/blocks/webcam-preview.json +9 -1
  125. package/registry/hooks/use-css-variable-sync.json +10 -1
  126. package/registry/hooks/use-mobile.json +9 -1
  127. package/registry/index.json +1526 -147
  128. package/registry/layout/account-settings-shell.json +10 -1
  129. package/registry/layout/dashboard-shell.json +12 -1
  130. package/registry/layout/double-sidebar-shell.json +11 -2
  131. package/registry/layout/double-sidebar.json +9 -1
  132. package/registry/layout/header.json +10 -1
  133. package/registry/layout/icon-sidebar-shell.json +9 -1
  134. package/registry/layout/icon-sidebar.json +9 -1
  135. package/registry/layout/mobile-menu-shell.json +10 -1
  136. package/registry/layout/multistep-progressbar-shell.json +9 -1
  137. package/registry/layout/multistep-shell.json +11 -1
  138. package/registry/layout/multistep-sidebar-shell.json +10 -2
  139. package/registry/layout/project-context-shell.json +1 -1
  140. package/registry/layout/search-bar-shell.json +8 -1
  141. package/registry/layout/sidebar-nav.json +7 -1
  142. package/registry/layout/sidebar.json +9 -2
  143. package/registry/layout/standard-page-shell.json +10 -1
  144. package/registry/layout/vertical-multistep-shell.json +10 -1
  145. package/registry/ui/avatar.json +9 -1
  146. package/registry/ui/button.json +9 -1
  147. package/registry/ui/calendar.json +9 -1
  148. package/registry/ui/checkbox.json +8 -1
  149. package/registry/ui/date-input.json +9 -1
  150. package/registry/ui/dialog.json +8 -1
  151. package/registry/ui/dropdown-menu.json +8 -1
  152. package/registry/ui/file-uploader.json +9 -1
  153. package/registry/ui/image-uploader.json +9 -1
  154. package/registry/ui/input.json +8 -1
  155. package/registry/ui/label.json +8 -1
  156. package/registry/ui/line-tabs.json +9 -1
  157. package/registry/ui/multiselect-checkbox-field.json +9 -1
  158. package/registry/ui/multiselect-tags.json +9 -1
  159. package/registry/ui/popover.json +8 -1
  160. package/registry/ui/radio-group.json +9 -1
  161. package/registry/ui/range-input.json +8 -1
  162. package/registry/ui/scroll-area.json +8 -1
  163. package/registry/ui/searchbox.json +9 -1
  164. package/registry/ui/select.json +9 -1
  165. package/registry/ui/selectable-pills.json +11 -1
  166. package/registry/ui/separator.json +8 -1
  167. package/registry/ui/sheet.json +9 -1
  168. package/registry/ui/sidebar.json +8 -1
  169. package/registry/ui/skeleton.json +8 -1
  170. package/registry/ui/slider.json +10 -2
  171. package/registry/ui/switch.json +9 -1
  172. package/registry/ui/tabs.json +8 -1
  173. package/registry/ui/text-input.json +8 -1
  174. package/registry/ui/textarea.json +9 -1
  175. package/registry/ui/tooltip.json +8 -1
  176. package/registry/ui/typography.json +9 -1
  177. package/styles/tokens.reference.css +21 -0
package/mcp/dist/index.js CHANGED
@@ -20839,416 +20839,860 @@ var StdioServerTransport = class {
20839
20839
  var layoutShells = {
20840
20840
  DashboardShell: {
20841
20841
  path: "@/components/layout",
20842
- description: "Main dashboard layout with dark sidebar (320px) and fixed header. Sidebar has collapsible sections with nav items.",
20842
+ description: "Full-screen app layout with dark sidebar (320px) and fixed header. Sidebar has collapsible sections with nav items. Hides sidebar on mobile with a slide-out menu. Full viewport height. Use for data-heavy applications with many navigation sections like admin dashboards, CRM tools, or project management.",
20843
+ keywords: ["admin", "dashboard", "sidebar", "navigation", "crm", "back-office", "management", "app"],
20844
+ visualWeight: "light",
20843
20845
  props: ["navigation: NavSection[]", "pageHeader?", "children", "onNavItemClick?"]
20844
20846
  },
20845
20847
  IconSidebarShell: {
20846
20848
  path: "@/components/layout",
20847
- description: "Layout with narrow icon-only sidebar (96px). Good for apps with few main sections.",
20849
+ description: "App layout with narrow icon-only sidebar (96px) and fixed header. Icons expand to tooltip labels on hover. Full viewport height. Use for apps with few main sections where you want maximum content space.",
20850
+ keywords: ["sidebar", "icon", "compact", "navigation", "app"],
20851
+ visualWeight: "light",
20848
20852
  props: ["navigation?: IconNavItemConfig[]", "pageHeader?", "children", "onNavItemClick?"]
20849
20853
  },
20850
20854
  DoubleSidebarShell: {
20851
20855
  path: "@/components/layout",
20852
- description: "Two-column sidebar layout (96px icons + 280px nav). Each column can be light/dark themed independently.",
20856
+ description: "Two-column sidebar layout (96px icon strip + 280px nav panel). Each column can be light or dark themed independently. Full viewport height. Use for complex apps with category groupings and nested navigation.",
20857
+ keywords: ["sidebar", "double", "icon", "navigation", "categories", "nested"],
20858
+ visualWeight: "light",
20853
20859
  props: ["sections?: DoubleSidebarSection[]", "iconVariant?", "navVariant?", "children", "onTabClick?"]
20854
20860
  },
20855
20861
  StandardPageShell: {
20856
20862
  path: "@/components/layout",
20857
- description: "No-sidebar layout with centered content (max 992px). Has optional flair banner and page header with tabs.",
20863
+ description: "No-sidebar layout with centered content (max 992px). Has optional flair banner at top and page header with tabs. Full viewport height. Use for content pages, marketing pages, search results, or any page that doesn't need persistent navigation.",
20864
+ keywords: ["centered", "content", "standard", "page", "no-sidebar", "simple"],
20865
+ visualWeight: "light",
20858
20866
  props: ["bannerTitle?", "pageTitle?", "tabs?", "activeTab?", "showBanner?", "showTabs?", "children"]
20859
20867
  },
20860
20868
  AccountSettingsShell: {
20861
20869
  path: "@/components/layout",
20862
- description: "Settings page layout with left sidebar navigation (Profile, Security, Payments, Notifications tabs).",
20870
+ description: "Settings page layout with left sidebar tab navigation (Profile, Security, Payments, Notifications) and right content area. Sidebar stacks above content on mobile. Full viewport height. Use for user preferences, account management, or any settings interface.",
20871
+ keywords: ["settings", "account", "preferences", "tabs", "profile", "security"],
20872
+ visualWeight: "light",
20863
20873
  props: ["activeTab?: AccountTab", "onTabChange?", "pageTitle?", "children"]
20864
20874
  },
20865
20875
  MultistepShell: {
20866
20876
  path: "@/components/layout",
20867
- description: "Multi-step wizard layout with horizontal step tracker, step title/description, and navigation buttons.",
20877
+ description: "Multi-step wizard layout with horizontal step tracker at top, step title/description, and navigation buttons. Content area centered (max 768px). Full viewport height. Use for registration flows, onboarding, or any sequential form process.",
20878
+ keywords: ["wizard", "multistep", "steps", "form", "onboarding", "registration", "flow"],
20879
+ visualWeight: "light",
20868
20880
  props: ["steps?: Step[]", "currentStep?", "onStepClick?", "onCancel?", "onContinue?", "children"]
20869
20881
  },
20870
20882
  MultistepSidebarShell: {
20871
20883
  path: "@/components/layout",
20872
- description: "Multi-step wizard with sidebar step list instead of horizontal tracker.",
20884
+ description: "Multi-step wizard with step list in a left sidebar instead of horizontal tracker. Full viewport height. Use when steps need descriptions or the flow has many steps.",
20885
+ keywords: ["wizard", "multistep", "sidebar", "steps", "form"],
20886
+ visualWeight: "light",
20873
20887
  props: ["steps?: Step[]", "currentStep?", "children"]
20874
20888
  },
20875
20889
  MultistepProgressBarShell: {
20876
20890
  path: "@/components/layout",
20877
- description: "Multi-step wizard with a horizontal progress bar at top.",
20891
+ description: "Multi-step wizard with a horizontal progress bar at top instead of numbered steps. Full viewport height. Simpler visual for flows where step count matters less than overall progress.",
20892
+ keywords: ["wizard", "multistep", "progress", "bar", "form"],
20893
+ visualWeight: "light",
20878
20894
  props: ["steps?: MultistepProgressBarStep[]", "currentStep?", "children"]
20879
20895
  },
20880
20896
  VerticalMultistepShell: {
20881
20897
  path: "@/components/layout",
20882
- description: "Multi-step wizard with vertical step tracker on the left side.",
20898
+ description: "Multi-step wizard with vertical step tracker on the left side. Steps show as a vertical list with descriptions. Full viewport height. Use for compact multi-step forms.",
20899
+ keywords: ["wizard", "multistep", "vertical", "steps", "form", "compact"],
20900
+ visualWeight: "light",
20883
20901
  props: ["steps?: Step[]", "currentStep?", "children"]
20884
20902
  },
20885
20903
  MobileMenuShell: {
20886
20904
  path: "@/components/layout",
20887
- description: "Mobile-first layout with bottom navigation bar. Good for mobile app-like experiences.",
20905
+ description: "Mobile-first layout with sticky bottom navigation bar (Home, Search, Profile tabs). Full viewport height. Use for mobile app-like experiences or responsive apps that need bottom tab navigation.",
20906
+ keywords: ["mobile", "bottom", "tabs", "navigation", "app", "responsive"],
20907
+ visualWeight: "light",
20888
20908
  props: ["children", "bottomNavItems?"]
20889
20909
  },
20890
20910
  SearchBarShell: {
20891
20911
  path: "@/components/layout",
20892
- description: "Layout with prominent search bar in header area.",
20912
+ description: "Layout with prominent search bar in header area. Centered content below. Full viewport height. Use for search-focused pages like documentation, knowledge bases, or directory search.",
20913
+ keywords: ["search", "documentation", "knowledge-base", "directory"],
20914
+ visualWeight: "light",
20893
20915
  props: ["children", "onSearch?"]
20894
20916
  }
20895
20917
  };
20896
20918
  var layoutPrimitives = {
20897
20919
  Header: {
20898
20920
  path: "@/components/layout",
20899
- description: "Top navigation bar with logo, nav links, icon cluster (search, notifications, messages, cart), and avatar dropdown.",
20921
+ description: "Responsive top navigation bar (~64px tall) with logo, nav links, icon cluster (search, notifications, messages, cart), and avatar dropdown. Collapses to hamburger menu on mobile. Light and dark variants.",
20922
+ keywords: ["header", "navbar", "navigation", "top-bar", "logo", "menu"],
20923
+ visualWeight: "light",
20900
20924
  props: ["onMenuClick?", "showDesktopLogo?", "variant?: 'light' | 'dark'", "navItems?", "showAuthButtons?"]
20901
20925
  },
20902
20926
  Sidebar: {
20903
20927
  path: "@/components/layout",
20904
- description: "Dark or light sidebar with logo and collapsible nav sections. Used inside DashboardShell.",
20928
+ description: "Dark or light sidebar (320px, full height) with logo and collapsible nav sections. Used inside DashboardShell. Each section has a title and list of nav items with icons.",
20929
+ keywords: ["sidebar", "navigation", "menu", "collapsible"],
20930
+ visualWeight: "light",
20905
20931
  props: ["sections: NavSection[]", "variant?: 'dark' | 'light'", "onItemClick?"]
20906
20932
  },
20907
20933
  SidebarNav: {
20908
20934
  path: "@/components/layout",
20909
- description: "Navigation items component used inside Sidebar. Handles section titles and item rendering.",
20935
+ description: "Navigation items component used inside Sidebar. Handles section titles and item rendering with active states. Compact, fits within sidebar width.",
20936
+ keywords: ["navigation", "sidebar", "menu-items"],
20937
+ visualWeight: "light",
20910
20938
  props: ["sections: NavSection[]", "variant?", "onItemClick?"]
20911
20939
  },
20912
20940
  IconSidebar: {
20913
20941
  path: "@/components/layout",
20914
- description: "Narrow sidebar with only icons and tooltips. Used inside IconSidebarShell.",
20942
+ description: "Narrow sidebar (96px, full height) with only icons and tooltips. Used inside IconSidebarShell. Shows icon buttons with hover tooltips for labels.",
20943
+ keywords: ["sidebar", "icon", "compact", "narrow", "navigation"],
20944
+ visualWeight: "light",
20915
20945
  props: ["items?: IconNavItemConfig[]", "variant?", "onItemClick?"]
20916
20946
  },
20917
20947
  DoubleSidebar: {
20918
20948
  path: "@/components/layout",
20919
- description: "Two-column sidebar with icon strip and nav panel. Used inside DoubleSidebarShell.",
20949
+ description: "Two-column sidebar with icon strip (96px) and nav panel (280px, full height). Used inside DoubleSidebarShell. Icons select categories, nav panel shows items for selected category.",
20950
+ keywords: ["sidebar", "double", "icon", "categories", "navigation"],
20951
+ visualWeight: "light",
20920
20952
  props: ["sections?", "iconVariant?", "navVariant?", "onTabClick?"]
20921
20953
  }
20922
20954
  };
20923
20955
  var blocks = {
20924
20956
  ActivityFeed: {
20925
20957
  path: "@/components/blocks",
20926
- description: "Timeline-style activity feed showing user actions, comments, and file attachments with connecting lines. Supports status changes, comments with reactions, and file attachments.",
20958
+ description: "Timeline-style activity feed with vertical connecting lines between entries. Each entry shows user avatar, action description, timestamp, and optional attachments or reactions. Full-width block (~400-800px depending on items). Use for audit logs, project activity, notification history, or any chronological event stream.",
20959
+ keywords: ["timeline", "audit", "log", "history", "events", "chronological", "feed", "activity"],
20960
+ visualWeight: "heavy",
20927
20961
  props: ["title?", "subtitle?", "items?: ActivityItem[]", "onLike?", "onReply?", "onAttachmentClick?"]
20928
20962
  },
20929
20963
  CircularProgressBarList: {
20930
20964
  path: "@/components/blocks",
20931
- description: "List block with circular progress indicators showing completion percentages. Features header with sort/filter controls and item action menus.",
20965
+ description: "Vertical list of items, each with a circular progress indicator (percentage ring), title, description, and action menu. Header with sort/filter controls. Full-width block (~400-600px). Use for skill assessments, goal tracking, course completion, or any list where items have progress.",
20966
+ keywords: ["progress", "skills", "goals", "tracking", "completion", "circular", "ring"],
20967
+ visualWeight: "heavy",
20932
20968
  props: ["title?", "items?: ProgressListItem[]", "sortOptions?", "filterOptions?", "onSort?", "onFilter?", "onItemAction?"]
20933
20969
  },
20934
20970
  CircularProgressBar: {
20935
20971
  path: "@/components/blocks",
20936
- description: "SVG-based circular progress indicator showing a percentage value. Can be used standalone or within CircularProgressBarList.",
20972
+ description: "SVG-based circular progress ring showing a percentage value in the center. Configurable size and stroke width. Compact inline element (~60-120px). Use standalone or within CircularProgressBarList.",
20973
+ keywords: ["progress", "ring", "percentage", "circular", "gauge"],
20974
+ visualWeight: "light",
20937
20975
  props: ["progress: number", "size?", "strokeWidth?", "className?"]
20938
20976
  },
20939
20977
  FaqsTable: {
20940
20978
  path: "@/components/blocks",
20941
- description: "Expandable FAQ list with accordion behavior. Shows questions with plus/minus toggle icons, revealing answers one at a time.",
20979
+ description: "Expandable FAQ list with accordion behavior. Shows question text with plus/minus toggle icons, revealing answer text one at a time. Full-width block (~300-600px depending on items). Use for FAQ sections, help centers, or any question-and-answer content.",
20980
+ keywords: ["faq", "questions", "answers", "accordion", "help", "expandable"],
20981
+ visualWeight: "medium",
20942
20982
  props: ["title?", "items?: FAQItem[]", "defaultExpandedId?", "className?"]
20943
20983
  },
20944
20984
  StandardDataTable: {
20945
20985
  path: "@/components/blocks",
20946
- description: "Data table with title, result count, sort/filter dropdowns, and action button. Rows have avatar + name/email/title/role columns.",
20986
+ description: "Tabular data display with sortable columns, avatar-enhanced rows, and row action menus. Header includes result count, sort/filter dropdowns, and primary action button. Full-width block (~400-800px depending on rows). Dense, text-heavy. Use for user directories, order lists, inventory tables, or any structured row-based data.",
20987
+ keywords: ["table", "data", "rows", "sortable", "directory", "list", "inventory", "orders", "users"],
20988
+ visualWeight: "heavy",
20947
20989
  props: ["title?", "data?: TableRow[]", "columns?", "sortOptions?", "filterOptions?", "actionButtonText?", "onAddNew?"]
20948
20990
  },
20949
20991
  FixedColumnDataTable: {
20950
20992
  path: "@/components/blocks",
20951
- description: "Data table with fixed first column (Name with avatar) that stays visible during horizontal scroll. Ideal for invoice-style tables with columns: Amount, Status badge, Logo, Company, Date Sent.",
20993
+ description: "Data table with fixed first column (name with avatar) that stays visible during horizontal scroll. Remaining columns scroll horizontally. Full-width block (~400-800px). Dense, text-heavy. Use for wide data sets like invoices, financial reports, or comparison tables where the row identifier must stay visible.",
20994
+ keywords: ["table", "fixed-column", "scroll", "wide", "invoices", "financial", "comparison"],
20995
+ visualWeight: "heavy",
20952
20996
  props: ["title?", "data?: FixedColumnTableRow[]", "sortOptions?", "filterOptions?", "actionButtonText?", "onAddNew?", "onRowAction?"]
20953
20997
  },
20954
20998
  NestedDataTable: {
20955
20999
  path: "@/components/blocks",
20956
- description: "Expandable data table with parent rows that reveal nested child tables. Shows hierarchical data like locations with employees.",
21000
+ description: "Expandable data table with parent rows that reveal nested child tables on click. Shows hierarchical data with expand/collapse toggles. Full-width block (~400-800px). Dense, text-heavy. Use for organizational hierarchies, location-based data, or any parent-child data relationships.",
21001
+ keywords: ["table", "nested", "hierarchy", "expandable", "parent-child", "tree"],
21002
+ visualWeight: "heavy",
20957
21003
  props: ["title?", "data?: ParentRow[]", "sortOptions?", "filterOptions?", "actionButtonText?", "onAddNew?", "onRowAction?", "onChildAction?"]
20958
21004
  },
20959
21005
  ReviewsTable: {
20960
21006
  path: "@/components/blocks",
20961
- description: "Review listing with user avatars, star ratings, dates, and expandable text. Includes sort/filter dropdowns and action button.",
21007
+ description: "Vertical list of review entries with user avatar, star rating (1-5), date, and expandable review text. Header with sort/filter controls and action button. Full-width block (~400-600px). Use for product reviews, testimonials, feedback lists, or any user-submitted ratings.",
21008
+ keywords: ["reviews", "ratings", "stars", "testimonials", "feedback", "comments"],
21009
+ visualWeight: "heavy",
20962
21010
  props: ["title?", "reviews?: ReviewItem[]", "sortOptions?", "filterOptions?", "actionButtonText?", "onAddNew?", "onReadMore?"]
20963
21011
  },
20964
21012
  MessengerSidebar: {
20965
21013
  path: "@/components/blocks",
20966
- description: "Thread list sidebar for messaging with search, avatars, timestamps, and unread badges.",
21014
+ description: "Vertical thread list sidebar for messaging apps. Each thread shows avatar, name, last message preview, timestamp, and unread badge. Includes search bar at top. Use for chat apps, support inboxes, or any thread-based messaging interface.",
21015
+ keywords: ["chat", "messaging", "threads", "inbox", "conversations", "support"],
21016
+ visualWeight: "medium",
20967
21017
  props: ["selectedThreadId?", "onSelectThread?", "className?"]
20968
21018
  },
20969
21019
  ChatBubble: {
20970
21020
  path: "@/components/blocks",
20971
- description: "Single chat message bubble. Sent messages align right with primary color, received align left with avatar.",
21021
+ description: "Single chat message bubble. Sent messages align right with primary color background, received messages align left with avatar and neutral background. Shows timestamp below.",
21022
+ keywords: ["chat", "message", "bubble", "conversation"],
21023
+ visualWeight: "light",
20972
21024
  props: ["message: ChatBubbleMessage"]
20973
21025
  },
20974
21026
  ChatDateSeparator: {
20975
21027
  path: "@/components/blocks",
20976
- description: "Date separator line between chat messages (e.g., 'Jan 25, 2024').",
21028
+ description: "Horizontal date separator line between chat messages (e.g., 'Jan 25, 2024'). Centered text with lines extending to each side.",
21029
+ keywords: ["chat", "date", "separator", "divider"],
21030
+ visualWeight: "light",
20977
21031
  props: ["date: string"]
20978
21032
  },
20979
21033
  MessengerInput: {
20980
21034
  path: "@/components/blocks",
20981
- description: "Chat input with textarea, attachment pills, file upload button, and send button.",
21035
+ description: "Chat input bar with expandable textarea, attachment pills, file upload button, and send button. Use at the bottom of any chat or messaging interface.",
21036
+ keywords: ["chat", "input", "message", "compose", "send"],
21037
+ visualWeight: "light",
20982
21038
  props: ["attachments?", "onRemoveAttachment?", "onSend?"]
20983
21039
  },
20984
21040
  ProfileCard: {
20985
21041
  path: "@/components/blocks",
20986
- description: "Centered profile card with avatar overlapping banner, stats, bio, tags, and social links.",
21042
+ description: "Centered profile card with large avatar overlapping a banner image, user stats row (posts, followers, following), bio text, skill/interest tags, and social media links. Includes a built-in stats row \u2014 if building a profile page, consider using this rather than assembling stats manually. Use for user profiles, author pages, or member directories.",
21043
+ keywords: ["profile", "avatar", "stats", "bio", "social", "user", "member"],
21044
+ visualWeight: "medium",
20987
21045
  props: ["name", "username", "avatarUrl?", "rating?", "location?", "stats?", "bio?", "tags?", "socialLinks?"]
20988
21046
  },
20989
21047
  StepTracker: {
20990
21048
  path: "@/components/blocks",
20991
- description: "Horizontal multi-step progress indicator with numbered circles and connecting lines.",
21049
+ description: "Horizontal multi-step progress indicator with numbered circles connected by lines. Completed steps show checkmarks, current step is highlighted. Use in multi-step forms, wizards, or onboarding flows.",
21050
+ keywords: ["steps", "wizard", "progress", "tracker", "multistep"],
21051
+ visualWeight: "light",
20992
21052
  props: ["steps: Step[]", "currentStep: number", "onStepClick?"]
20993
21053
  },
20994
21054
  VerticalStepTracker: {
20995
21055
  path: "@/components/blocks",
20996
- description: "Vertical step tracker for sidebar placement in multi-step flows.",
21056
+ description: "Vertical step tracker for sidebar placement in multi-step flows. Steps shown as a vertical list with numbers, titles, and optional descriptions. Use when horizontal space is limited.",
21057
+ keywords: ["steps", "wizard", "progress", "tracker", "vertical"],
21058
+ visualWeight: "light",
20997
21059
  props: ["steps: Step[]", "currentStep: number", "onStepClick?"]
20998
21060
  },
20999
21061
  ProgressBar: {
21000
21062
  path: "@/components/blocks",
21001
- description: "Horizontal progress bar. Can use percentage or currentStep/totalSteps.",
21063
+ description: "Horizontal progress bar with filled portion showing completion. Can use percentage or currentStep/totalSteps. Use for upload progress, form completion, or any linear progress indicator.",
21064
+ keywords: ["progress", "loading", "completion", "bar"],
21065
+ visualWeight: "light",
21002
21066
  props: ["progress?", "currentStep?", "totalSteps?"]
21003
21067
  },
21004
21068
  FlairBanner: {
21005
21069
  path: "@/components/blocks",
21006
- description: "Dark blue hero banner with large title text. Used at top of pages.",
21070
+ description: "Full-width dark blue hero banner with large title text. Use at the top of content pages for visual emphasis. Pairs well with PageHeaderSection below it.",
21071
+ keywords: ["banner", "hero", "header", "decorative", "flair"],
21072
+ visualWeight: "spacer",
21007
21073
  props: ["title: string"]
21008
21074
  },
21009
21075
  Loader: {
21010
21076
  path: "@/components/blocks",
21011
- description: "Loading feedback component with animated spinner (loading state) and checkmark (success state). Includes title, description, and optional action button.",
21077
+ description: "Loading feedback component with animated spinner (loading state) and checkmark (success state). Shows title, description, and optional action button. Use for form submissions, file uploads, or any async operation feedback.",
21078
+ keywords: ["loading", "spinner", "feedback", "async", "success"],
21079
+ visualWeight: "light",
21012
21080
  props: ["state?: 'loading' | 'success'", "title?", "description?", "buttonText?", "onButtonClick?", "className?"]
21013
21081
  },
21014
21082
  GradientBanner: {
21015
21083
  path: "@/components/blocks",
21016
- description: "Banner with gradient background. Alternative to FlairBanner.",
21084
+ description: "Full-width banner with gradient background and optional title/subtitle text. Use as a decorative page header or profile banner area.",
21085
+ keywords: ["banner", "gradient", "header", "decorative", "profile"],
21086
+ visualWeight: "spacer",
21017
21087
  props: ["title?", "subtitle?"]
21018
21088
  },
21019
21089
  PageHeaderSection: {
21020
21090
  path: "@/components/blocks",
21021
- description: "Page title, description, and optional line tabs. Used below banners.",
21091
+ description: "Page title, description text, and optional horizontal line tabs below. Use below banners or at the top of content areas for page-level navigation and context.",
21092
+ keywords: ["header", "title", "tabs", "page-title", "navigation"],
21093
+ visualWeight: "light",
21022
21094
  props: ["title", "description?", "tabs?", "activeTab?", "onTabChange?", "showTabs?"]
21023
21095
  },
21024
21096
  SearchBar: {
21025
21097
  path: "@/components/blocks",
21026
- description: "Prominent search input with icon.",
21098
+ description: "Prominent search input with search icon. Use for search-focused interfaces like documentation, directories, or knowledge bases.",
21099
+ keywords: ["search", "input", "find", "query"],
21100
+ visualWeight: "light",
21027
21101
  props: ["placeholder?", "value?", "onChange?", "onSearch?"]
21028
21102
  },
21029
21103
  SearchSidebar: {
21030
21104
  path: "@/components/blocks",
21031
- description: "Sidebar with search results or filters.",
21105
+ description: "Sidebar panel with search results list or filter controls. Use alongside main content for search-driven interfaces.",
21106
+ keywords: ["search", "sidebar", "results", "filter"],
21107
+ visualWeight: "medium",
21032
21108
  props: ["results?", "onResultClick?"]
21033
21109
  },
21034
21110
  FilterPopover: {
21035
21111
  path: "@/components/blocks",
21036
- description: "Popover with filter controls (checkboxes, date ranges, etc.).",
21112
+ description: "Popover dropdown with filter controls (checkboxes, date ranges, sliders). Triggered by a filter button. Use for refining lists, tables, or search results.",
21113
+ keywords: ["filter", "popover", "dropdown", "refine"],
21114
+ visualWeight: "light",
21037
21115
  props: ["filters?", "onApply?", "onReset?"]
21038
21116
  },
21039
21117
  MenuSection: {
21040
21118
  path: "@/components/blocks",
21041
- description: "Section within sidebar navigation with title and items.",
21119
+ description: "Collapsible navigation section with section title and list of menu items. Multiple sections stack vertically. Use for categorized navigation, settings menus, or documentation sidebars.",
21120
+ keywords: ["menu", "navigation", "collapsible", "sections", "sidebar"],
21121
+ visualWeight: "medium",
21042
21122
  props: ["title?", "items: NavItem[]"]
21043
21123
  },
21044
21124
  MenufocusTemplate: {
21045
21125
  path: "@/components/blocks",
21046
- description: "Dropdown menu with trigger button (three dots). Used for row actions in tables.",
21126
+ description: "Three-dot dropdown menu for row-level actions. Opens a list of action items on click. Use for table row actions, card actions, or any contextual menu.",
21127
+ keywords: ["menu", "dropdown", "actions", "context-menu", "three-dot"],
21128
+ visualWeight: "light",
21047
21129
  props: ["items: MenuItem[]", "ariaLabel?"]
21048
21130
  },
21049
21131
  SidebarCards: {
21050
21132
  path: "@/components/blocks",
21051
- description: "Card list for sidebar showing items with images/titles.",
21133
+ description: "Vertical list of card items for sidebar placement, each with thumbnail image and title. Use for related content, recommended items, or sidebar navigation with visual previews.",
21134
+ keywords: ["sidebar", "cards", "thumbnails", "related", "recommended"],
21135
+ visualWeight: "medium",
21052
21136
  props: ["cards: SidebarCard[]", "onCardClick?"]
21053
21137
  },
21054
21138
  SidebarProfileCard: {
21055
21139
  path: "@/components/blocks",
21056
- description: "Compact profile card for sidebar with avatar and key info.",
21140
+ description: "Compact profile card for sidebar placement with avatar, name, and role/title. Use in sidebars to show user info, author details, or contact information.",
21141
+ keywords: ["sidebar", "profile", "avatar", "compact", "user"],
21142
+ visualWeight: "light",
21057
21143
  props: ["name", "role?", "avatarUrl?"]
21058
21144
  },
21145
+ StatsCard: {
21146
+ path: "@/components/blocks/profile-info-cards",
21147
+ description: "Horizontal row of 2-3 stat items centered in a bordered card. Each stat shows a bold value and muted label. Prefer this over hand-rolling stat numbers with raw Typography or inline styles \u2014 it handles alignment, consistent sizing, and responsive layout automatically. Use for profile stats (followers, posts, rating), sidebar stats, or any compact numeric summary.",
21148
+ keywords: ["stats", "metrics", "numbers", "statistics", "profile"],
21149
+ visualWeight: "light",
21150
+ props: ["stats: { value: string, label: string }[]", "className?"]
21151
+ },
21059
21152
  ProfileInfoCards: {
21060
21153
  path: "@/components/blocks",
21061
- description: "Grid of info cards for profile pages (contact, stats, etc.).",
21154
+ description: "Grid of small info cards for profile or detail pages. Each card has a label, value, and optional icon. Use for contact details, stats, metadata, or any key-value information display.",
21155
+ keywords: ["profile", "info", "metadata", "details", "cards", "key-value"],
21156
+ visualWeight: "light",
21062
21157
  props: ["cards: InfoCard[]"]
21063
21158
  },
21064
21159
  ProfileImageUploader: {
21065
21160
  path: "@/components/blocks",
21066
- description: "Avatar upload component with preview and edit button.",
21161
+ description: "Circular avatar upload component with current image preview and edit/upload button overlay. Use for profile photo editing, team member photos, or any avatar upload interface.",
21162
+ keywords: ["avatar", "upload", "image", "profile", "photo"],
21163
+ visualWeight: "light",
21067
21164
  props: ["currentImage?", "onUpload?"]
21068
21165
  },
21069
21166
  StoreLocationMap: {
21070
21167
  path: "@/components/blocks",
21071
- description: "Single store location card with address info, directions button, and embedded Google Maps iframe. Uses TitleGroup for header.",
21168
+ description: "Location card with address text, directions button, and embedded map iframe. Uses TitleGroup for header. Use for store locators, office locations, or any place-based information display.",
21169
+ keywords: ["map", "location", "address", "directions", "store"],
21170
+ visualWeight: "medium",
21072
21171
  props: ["title?", "subtitle?", "storeLabel?", "storeName?", "addressLines?", "buttonText?", "onDirectionsClick?", "mapEmbedUrl?", "className?"]
21073
21172
  },
21074
21173
  SettingsListRow: {
21075
21174
  path: "@/components/blocks",
21076
- description: "Row item for settings lists with label, value, and edit action.",
21175
+ description: "Single row item for settings pages with label on left, current value in center, and edit button on right. Use for user profile fields, account settings, or any editable key-value setting.",
21176
+ keywords: ["settings", "row", "editable", "preference", "key-value"],
21177
+ visualWeight: "light",
21077
21178
  props: ["label", "value?", "onEdit?"]
21078
21179
  },
21079
21180
  CreditCardDisplay: {
21080
21181
  path: "@/components/blocks",
21081
- description: "Visual credit card display showing card details.",
21182
+ description: "Visual credit/debit card display showing card number (masked), cardholder name, expiry date, and card type logo. Use for payment method displays, saved cards, or financial account interfaces.",
21183
+ keywords: ["credit-card", "payment", "card", "financial", "billing"],
21184
+ visualWeight: "light",
21082
21185
  props: ["cardNumber?", "cardHolder?", "expiry?", "type?"]
21083
21186
  },
21084
21187
  PillTabs: {
21085
21188
  path: "@/components/blocks",
21086
- description: "Horizontal pill-style tab navigation.",
21189
+ description: "Horizontal row of pill-shaped tab buttons with active state highlighting. Use for content filtering, view switching, or any tab navigation that needs a rounded pill style.",
21190
+ keywords: ["tabs", "pills", "filter", "toggle", "navigation"],
21191
+ visualWeight: "light",
21087
21192
  props: ["tabs: Tab[]", "activeTab?", "onTabChange?"]
21088
21193
  },
21089
21194
  LoginBrandingPanel: {
21090
21195
  path: "@/components/blocks",
21091
- description: "Branding side panel for login/signup pages with logo and background.",
21196
+ description: "Side panel with background image and centered logo for authentication pages. Takes up one half of a split-screen layout. Use alongside login, signup, or password reset forms.",
21197
+ keywords: ["login", "branding", "auth", "split-screen", "signup"],
21198
+ visualWeight: "spacer",
21092
21199
  props: ["backgroundImage?", "logo?"]
21093
21200
  },
21094
21201
  ContentDropzone: {
21095
21202
  path: "@/components/blocks",
21096
21203
  description: "Placeholder dropzone for content areas. Shows dashed placeholder when empty; arranges children in a flex column with 32px (--spacing-4xl) gap between blocks. Within a block, use 12px (--spacing-lg) gap between title groups and their content.",
21204
+ keywords: ["content", "dropzone", "container", "layout", "spacing"],
21205
+ visualWeight: "light",
21097
21206
  props: ["height?", "className?", "children?"]
21098
21207
  },
21099
21208
  UpvotingPostsTable: {
21100
21209
  path: "@/components/blocks",
21101
- description: "Social feed with upvoting posts, comments, and nested replies. Features header with sort/filter controls.",
21210
+ description: "Social feed with upvotable posts, comment threads, and nested replies. Each post has an upvote button with count, title, description, and author info. Use for feature request boards, community forums, Q&A sites, or feedback portals.",
21211
+ keywords: ["forum", "upvote", "posts", "community", "feedback", "feature-requests"],
21212
+ visualWeight: "heavy",
21102
21213
  props: ["title?", "subtitle?", "posts?: Post[]", "currentUser?", "sortOptions?", "filterOptions?", "actionButtonText?", "onUpvote?", "onComment?", "onReply?", "onLike?"]
21103
21214
  },
21104
21215
  NestedCommentsTable: {
21105
21216
  path: "@/components/blocks",
21106
- description: "Threaded discussion component with nested comments, reply/like actions, and collapsible threads.",
21217
+ description: "Threaded discussion with nested comments, reply and like actions, and collapsible sub-threads. Each comment shows avatar, name, timestamp, and content. Use for blog comments, discussion boards, or any nested conversation interface.",
21218
+ keywords: ["comments", "discussion", "threaded", "replies", "forum"],
21219
+ visualWeight: "heavy",
21107
21220
  props: ["title?", "subtitle?", "comments?: Comment[]", "currentUser?", "onComment?", "onReply?", "onLike?"]
21108
21221
  },
21109
21222
  ImageFeedWithNestedComments: {
21110
21223
  path: "@/components/blocks",
21111
- description: "Instagram-style image feed with large images, social interactions (like/comment/share/bookmark), and nested comment threads.",
21224
+ description: "Full-width image feed with large photos, social interaction buttons (like, comment, share, bookmark), and nested comment threads below each image. Use for photo galleries, social feeds, portfolio showcases, or media-rich community content.",
21225
+ keywords: ["feed", "images", "social", "photos", "gallery", "comments"],
21226
+ visualWeight: "heavy",
21112
21227
  props: ["title?", "subtitle?", "posts?: ImagePost[]", "currentUser?", "onLike?", "onComment?", "onShare?", "onBookmark?", "onReply?", "onCommentLike?"]
21113
21228
  },
21114
21229
  MobileBottomNav: {
21115
21230
  path: "@/components/blocks",
21116
- description: "Fixed bottom navigation bar for mobile layouts.",
21231
+ description: "Fixed bottom navigation bar with icon tabs (Home, Search, Profile, etc.). Sticks to bottom of viewport. Use for mobile app-like experiences or responsive layouts needing bottom tab navigation.",
21232
+ keywords: ["mobile", "bottom", "navigation", "tabs", "app"],
21233
+ visualWeight: "light",
21117
21234
  props: ["items: BottomNavItem[]", "activeItem?", "onItemClick?"]
21118
21235
  },
21119
21236
  MonthlyCalendarWidget: {
21120
21237
  path: "@/components/blocks",
21121
- description: "Dual-month calendar for date range selection with price labels, disabled dates, and today indicator. Used for booking and scheduling interfaces.",
21238
+ description: "Dual-month calendar for selecting date ranges. Shows two months side by side with price labels on dates, disabled dates, and today indicator. Use for booking flows, scheduling interfaces, or any date range selection.",
21239
+ keywords: ["calendar", "booking", "dates", "scheduling", "date-range"],
21240
+ visualWeight: "medium",
21122
21241
  props: ["title?", "subtitle?", "initialMonth?", "selectedRange?", "disabledDates?", "pricedDates?", "todayDate?", "onDateSelect?", "onRangeChange?", "onConfirm?", "onCancel?"]
21123
21242
  },
21124
21243
  BottomInputChatWidget: {
21125
21244
  path: "@/components/blocks",
21126
- description: "Slack-style chat widget with message threads list and conversation view. Features bottom input bar with attachment support.",
21245
+ description: "Chat widget with two views: threads list (showing conversation previews) and conversation view (showing message bubbles). Bottom input bar with attachment support. Use for in-app messaging, support chat, or team communication.",
21246
+ keywords: ["chat", "widget", "messaging", "threads", "support"],
21247
+ visualWeight: "heavy",
21127
21248
  props: ["variant?: 'threads' | 'conversation'", "title?", "threads?", "messages?", "conversationName?", "onThreadClick?", "onBackClick?", "onSend?"]
21128
21249
  },
21129
21250
  LargeImageLabelsList: {
21130
21251
  path: "@/components/blocks",
21131
- description: "Property-style listing with large images, ratings, prices, and icon labels. Includes header with sort/filter controls.",
21252
+ description: "Vertical list of items with large landscape images, star ratings, price, and descriptive icon labels (beds, baths, area, etc.). Header with sort/filter controls and favorite button. Use for property listings, product catalogs, hotel results, or any image-prominent list.",
21253
+ keywords: ["listings", "property", "images", "catalog", "real-estate", "hotels"],
21254
+ visualWeight: "heavy",
21132
21255
  props: ["title?", "items?: ListItem[]", "sortOptions?", "filterOptions?", "onFavorite?", "onItemClick?"]
21133
21256
  },
21134
21257
  SocialFeed: {
21135
21258
  path: "@/components/blocks",
21136
- description: "Social media-style feed with post composer, various content types (text, images, video, reposts, link cards), social interactions (like/comment/repost/share), and threaded replies.",
21259
+ description: "Social media feed with post composer at top, and posts showing various content types (text, images, video, reposts, link cards). Each post has social interactions (like, comment, repost, share) and threaded replies. Use for community feeds, social networks, or activity streams.",
21260
+ keywords: ["social", "feed", "posts", "community", "timeline", "network"],
21261
+ visualWeight: "heavy",
21137
21262
  props: ["title?", "posts?: SocialFeedPost[]", "currentUser?", "composerPlaceholder?", "composerImagePreview?", "onPost?", "onLike?", "onComment?", "onRepost?", "onShare?"]
21138
21263
  },
21139
21264
  StandardListWithImage: {
21140
21265
  path: "@/components/blocks",
21141
- description: "Blog/article-style list block with image thumbnails, title, author, date, description, and tags. Includes header with sort/filter controls.",
21266
+ description: "Vertical list of content items with square image thumbnails, title, author, date, description text, and tags. Header with sort/filter controls. Use for blog posts, articles, courses, events, or any content listing with images.",
21267
+ keywords: ["list", "articles", "blog", "content", "thumbnails", "courses"],
21268
+ visualWeight: "heavy",
21142
21269
  props: ["title?", "subtitle?", "items?: ListItem[]", "sortOptions?", "filterOptions?", "onSort?", "onFilter?", "onItemClick?"]
21143
21270
  },
21144
21271
  SlideshowGridTiles: {
21145
21272
  path: "@/components/blocks",
21146
- description: "2-column grid of portfolio/slideshow tiles with hover states. Features large images with slideshow navigation, save button, user info with avatar, and engagement stats (likes/views).",
21273
+ description: "2-column grid of portfolio tiles with image slideshow navigation (prev/next arrows), save button, user avatar with name/location, and engagement stats (likes, views). Use for design portfolios, photo galleries, creative showcases, or any visual content grid.",
21274
+ keywords: ["portfolio", "slideshow", "grid", "gallery", "creative"],
21275
+ visualWeight: "heavy",
21147
21276
  props: ["title?", "subtitle?", "items?: SlideshowTileItem[]", "sortOptions?", "filterOptions?", "actionButtonText?", "onAddNew?", "onSort?", "onFilter?", "onSave?", "onItemClick?"]
21148
21277
  },
21149
21278
  ProfileGridTilesList: {
21150
21279
  path: "@/components/blocks",
21151
- description: "Responsive grid of profile cards with avatar, ratings, certifications, and metadata. Configurable 2-5 columns with mobile responsiveness. Ideal for tutors, team members, or user directories.",
21280
+ description: "Responsive grid of profile cards with avatar, star rating, certification badges, and metadata (location, price, specialization). Configurable 2-5 columns. Use for team directories, service provider listings, tutor marketplaces, or any people-focused catalog.",
21281
+ keywords: ["people", "directory", "profiles", "team", "grid", "marketplace"],
21282
+ visualWeight: "medium",
21152
21283
  props: ["title?", "subtitle?", "items?: ProfileTileItem[]", "columns?: 2|3|4|5", "sortOptions?", "filterOptions?", "actionButtonText?", "onAddNew?", "onSort?", "onFilter?", "onItemClick?"]
21153
21284
  },
21154
21285
  GridTilesList: {
21155
21286
  path: "@/components/blocks",
21156
- description: "Responsive grid of property/listing tiles with configurable 2-5 columns. Features images, star ratings, prices, favorite buttons, and optional tags. Includes header with sort/filter controls.",
21287
+ description: "Configurable 2-5 column image card grid. Each tile has a square image, title, star rating, location text, price, and favorite button. Optional tag badges. Header with sort/filter controls and action button. Use for product catalogs, property listings, course directories, or any visual item grid.",
21288
+ keywords: ["grid", "tiles", "products", "catalog", "cards", "listings"],
21289
+ visualWeight: "medium",
21157
21290
  props: ["title?", "subtitle?", "columns?: 2|3|4|5", "items?: GridTileItem[]", "sortOptions?", "filterOptions?", "actionButtonText?", "onAddNew?", "onFavorite?", "onItemClick?"]
21158
21291
  },
21159
21292
  Pagination: {
21160
21293
  path: "@/components/blocks",
21161
- description: "Responsive pagination with results summary, items per page dropdown, and page navigation. Shows 'Viewing X-Y of Z results' on desktop, compact navigation on mobile.",
21294
+ description: "Responsive pagination bar with 'Viewing X-Y of Z results' text, items-per-page dropdown, and page navigation buttons. Results text hides on mobile for compact layout. Use below any paginated list or table.",
21295
+ keywords: ["pagination", "pages", "navigation", "results"],
21296
+ visualWeight: "light",
21162
21297
  props: ["currentPage?", "totalPages?", "totalItems?", "itemsPerPage?", "itemsPerPageOptions?", "onPageChange?", "onItemsPerPageChange?", "showResultsText?", "showItemsPerPage?", "maxVisiblePages?"]
21163
21298
  },
21164
21299
  // Graph and Metric Tiles (Dashboard Widgets)
21165
21300
  MetricCard: {
21166
21301
  path: "@/components/blocks/graph-metric-tiles",
21167
- description: "Single KPI card displaying a large value with label and optional change indicator (up/down arrow with color).",
21302
+ description: "Single KPI summary card showing a large numeric value, label text, and optional change indicator (up/down arrow with percentage). Use for revenue, users, orders, or any single numeric metric. Prefer this over hand-rolling stat numbers with inline styles \u2014 it handles typography scale, alignment, and card containment automatically.",
21303
+ keywords: ["metric", "kpi", "stat", "number", "dashboard"],
21304
+ visualWeight: "light",
21168
21305
  props: ["label: string", "value: string", "change?: { value: string, direction: 'up' | 'down' }", "className?"]
21169
21306
  },
21170
21307
  MetricCardsRow: {
21171
21308
  path: "@/components/blocks/graph-metric-tiles",
21172
- description: "Horizontal row of 2-4 MetricCard components with automatic flex layout and spacing.",
21309
+ description: "Row of 2-4 KPI summary cards in a responsive grid. Stacks to 2 columns on tablet and 1 column on mobile. Prefer this for dashboard KPI rows \u2014 each card includes proper containment, change indicators, and responsive grid behavior. Use instead of hand-rolling metric displays.",
21310
+ keywords: ["metrics", "kpi", "dashboard", "stats", "cards", "row"],
21311
+ visualWeight: "light",
21173
21312
  props: ["metrics: MetricCardData[]", "columns?: 2|3|4", "className?"]
21174
21313
  },
21175
21314
  LineChartWidget: {
21176
21315
  path: "@/components/blocks/graph-metric-tiles",
21177
- description: "Full-width widget with Chart.js line/area chart. Includes header, value display, and footer actions. Chart colors update live with CSS variables.",
21316
+ description: "Dashboard widget with Chart.js line/area chart, header with label and value, and footer with action links. Chart colors update live with CSS variables. Chart height reduces on mobile. Use for trend visualization, revenue charts, or any time-series data.",
21317
+ keywords: ["chart", "line", "graph", "trend", "time-series", "dashboard"],
21318
+ visualWeight: "medium",
21178
21319
  props: ["label: string", "value: string", "description?", "chartData?: number[]", "chartLabels?: string[]", "onMenuClick?", "onManageClick?", "onViewDetailsClick?"]
21179
21320
  },
21180
21321
  DonutChartWidget: {
21181
21322
  path: "@/components/blocks/graph-metric-tiles",
21182
- description: "Widget with Chart.js doughnut chart and legend metrics grid. Colors mapped to --chart-color-1 through --chart-color-5 CSS variables.",
21323
+ description: "Dashboard widget with Chart.js doughnut chart and legend grid showing category breakdowns. Chart and legend stack vertically on mobile. Colors mapped to --chart-color-1 through --chart-color-5 CSS variables. Use for category distributions, budget breakdowns, or any proportional data.",
21324
+ keywords: ["chart", "donut", "doughnut", "pie", "categories", "dashboard"],
21325
+ visualWeight: "medium",
21183
21326
  props: ["label: string", "value: string", "description?", "legendItems?: DonutChartLegendItem[]", "onMenuClick?", "onManageClick?", "onViewDetailsClick?"]
21184
21327
  },
21185
21328
  MetricListCard: {
21186
21329
  path: "@/components/blocks/graph-metric-tiles",
21187
- description: "Card displaying a list of transactions or metrics with optional date, label, and value columns.",
21330
+ description: "Dashboard widget showing a vertical list of line items with optional date, label, and value columns. Header with title and subtitle. Use for recent transactions, activity summaries, or any tabular metric list.",
21331
+ keywords: ["metric", "list", "transactions", "activity", "dashboard"],
21332
+ visualWeight: "medium",
21188
21333
  props: ["headerLabel: string", "title: string", "subtitle?", "items: MetricListItem[]", "viewDetailsLabel?", "onMenuClick?", "onManageClick?", "onViewDetailsClick?"]
21189
21334
  },
21190
21335
  ProgressMetricCard: {
21191
21336
  path: "@/components/blocks/graph-metric-tiles",
21192
- description: "Card with horizontal progress bars, optional images/sublabels, and value display. Uses --canvas-primary for bar color by default.",
21337
+ description: "Dashboard widget with horizontal progress bars, optional thumbnail images, sublabels, and value display. Uses --canvas-primary for bar color. Use for goal tracking, category performance, or any ranked metric with progress.",
21338
+ keywords: ["progress", "metric", "goals", "tracking", "dashboard"],
21339
+ visualWeight: "medium",
21193
21340
  props: ["headerLabel: string", "title: string", "subtitle?", "items: ProgressBarItem[]", "onMenuClick?", "onManageClick?", "onViewDetailsClick?"]
21194
21341
  },
21195
21342
  TwoColumnWidgets: {
21196
21343
  path: "@/components/blocks/graph-metric-tiles",
21197
- description: "Simple flex layout wrapper for arranging two widget cards side by side with proper gap spacing.",
21344
+ description: "Layout wrapper for arranging two dashboard widgets side by side with proper gap spacing. Stacks vertically on mobile. Use to pair any two widget cards in a dashboard layout.",
21345
+ keywords: ["layout", "two-column", "widgets", "dashboard", "grid"],
21346
+ visualWeight: "light",
21198
21347
  props: ["children: React.ReactNode", "className?"]
21199
21348
  },
21200
21349
  DashboardHeader: {
21201
21350
  path: "@/components/blocks/graph-metric-tiles",
21202
- description: "Page header for dashboards with title and optional subtitle.",
21351
+ description: "Page header for dashboard pages with large title and optional subtitle text. Font size reduces on mobile via typography tokens.",
21352
+ keywords: ["dashboard", "header", "title", "page-header"],
21353
+ visualWeight: "light",
21203
21354
  props: ["title: string", "subtitle?", "className?"]
21204
21355
  },
21205
21356
  GraphMetricTilesDemo: {
21206
21357
  path: "@/components/blocks/graph-metric-tiles",
21207
- description: "Complete dashboard demo composing all metric tile components together. Use as reference for dashboard layouts.",
21358
+ description: "Complete dashboard demo composing MetricCardsRow, LineChartWidget, DonutChartWidget, MetricListCard, and ProgressMetricCard together. Use as a reference for building dashboard layouts.",
21359
+ keywords: ["dashboard", "demo", "reference", "widgets"],
21360
+ visualWeight: "heavy",
21208
21361
  props: ["className?"]
21362
+ },
21363
+ // Utility / Structural Blocks
21364
+ TitleGroup: {
21365
+ path: "@/components/blocks",
21366
+ description: "Header section with title, subtitle, optional sort dropdown, filter popover, and action button. Compact (~48px tall). Use as the header for any content block \u2014 pairs with data tables, lists, card grids, or any section that needs a scannable title landmark.",
21367
+ keywords: ["title", "header", "section", "sort", "filter", "action"],
21368
+ visualWeight: "light",
21369
+ props: ["title", "subtitle?", "sortOptions?", "onSort?", "showFilter?", "filterPopoverProps?", "actionButtonText?", "onAction?", "className?"]
21370
+ },
21371
+ EmptyState: {
21372
+ path: "@/components/blocks",
21373
+ description: "Centered empty state display with emoji/icon, title, and optional description inside a dashed border card. Compact (~200px tall). Use when a list, table, or content area has no data to show.",
21374
+ keywords: ["empty", "placeholder", "no-data", "no-results", "blank"],
21375
+ visualWeight: "light",
21376
+ props: ["icon?", "title?", "description?", "className?"]
21377
+ },
21378
+ TileImageGallery: {
21379
+ path: "@/components/blocks",
21380
+ description: "Hero image gallery with one large image on the left and a 2x2 grid of thumbnails on the right, plus a 'View all' button overlay. Full-width block (~400px tall). Use at the top of product detail pages, listing pages, or property pages for immersive visual browsing.",
21381
+ keywords: ["gallery", "images", "photos", "tiles", "product", "listing"],
21382
+ visualWeight: "spacer",
21383
+ props: ["images?", "onViewAll?", "viewAllLabel?", "height?", "className?"]
21384
+ },
21385
+ ReservationCard: {
21386
+ path: "@/components/blocks",
21387
+ description: "Sidebar card for booking/reservation with price display, 'From' and 'To' date inputs, and primary CTA button. Bordered card (~250px tall). Use in a sidebar alongside product/listing detail content for booking flows, appointment scheduling, or any date-based reservation.",
21388
+ keywords: ["reservation", "booking", "dates", "price", "sidebar", "card"],
21389
+ visualWeight: "medium",
21390
+ props: ["price?", "priceUnit?", "fromDate?", "onFromDateChange?", "toDate?", "onToDateChange?", "ctaLabel?", "onCtaClick?", "className?"]
21391
+ },
21392
+ OrderSummarySidebar: {
21393
+ path: "@/components/blocks",
21394
+ description: "Shopping cart sidebar showing line items with quantities, promo code input, tax/shipping info, and order total with separators. Bordered card (~350px tall). Use in a sidebar alongside checkout steps for e-commerce order summaries.",
21395
+ keywords: ["order", "cart", "summary", "checkout", "total", "sidebar"],
21396
+ visualWeight: "medium",
21397
+ props: ["title?", "lineItems?", "promoCodePlaceholder?", "onApplyPromo?", "applyLabel?", "taxes?", "shippingLabel?", "total?", "currency?", "className?"]
21398
+ },
21399
+ BottomActionBar: {
21400
+ path: "@/components/blocks",
21401
+ description: "Sticky bottom bar displaying price with unit and primary CTA button. Fixed to bottom of viewport (~64px tall). Use on mobile-friendly detail pages for persistent booking/purchase actions.",
21402
+ keywords: ["bottom", "action", "bar", "sticky", "cta", "mobile", "price"],
21403
+ visualWeight: "light",
21404
+ props: ["price?", "priceUnit?", "ctaLabel?", "onCtaClick?", "className?"]
21405
+ },
21406
+ EditableList: {
21407
+ path: "@/components/blocks",
21408
+ description: "Editable list where users can add items via input field and remove them with trash icon buttons. Compact inline element. Use for tag lists, skill lists, or any dynamic list where users add/remove items.",
21409
+ keywords: ["list", "editable", "add", "remove", "tags", "dynamic"],
21410
+ visualWeight: "light",
21411
+ props: ["label?", "items?", "onItemsChange?", "addPlaceholder?", "disabled?", "className?"]
21412
+ },
21413
+ PersonaCard: {
21414
+ path: "@/components/blocks",
21415
+ description: "Card displaying persona information with avatar, name, role, goals, pain points, and quote with icons. Medium bordered card (~300px tall). Use for UX persona displays, user research artifacts, or team role descriptions.",
21416
+ keywords: ["persona", "user", "profile", "goals", "research", "ux"],
21417
+ visualWeight: "medium",
21418
+ props: ["persona?", "className?"]
21419
+ },
21420
+ PlaceDetailPanel: {
21421
+ path: "@/components/blocks",
21422
+ description: "Right-side drawer panel for place/business details with hero image, tabs, description, info rows, operating hours, amenities, admission pricing, and reviews. Heavy, content-rich overlay (~full height). Use for map-based detail views, place cards, or business information panels.",
21423
+ keywords: ["place", "detail", "drawer", "business", "map", "reviews", "amenities"],
21424
+ visualWeight: "heavy",
21425
+ props: ["open?", "onOpenChange?", "title?", "subtitle?", "rating?", "heroImageUrl?", "tabs?", "activeTab?", "description?", "infoRows?", "operatingHours?", "amenities?", "reviews?", "className?"]
21426
+ },
21427
+ SelectablePills: {
21428
+ path: "@/components/blocks",
21429
+ description: "Grid of toggleable pill/chip buttons for multi-select. Each pill shows a label and toggles selected state on click. Compact inline element. Use for interest selection, tag filtering, or any multi-choice selection interface.",
21430
+ keywords: ["pills", "chips", "tags", "select", "toggle", "filter", "interests"],
21431
+ visualWeight: "light",
21432
+ props: ["options?", "selected?", "onToggle?", "className?"]
21433
+ },
21434
+ FileUploader: {
21435
+ path: "@/components/blocks",
21436
+ description: "Drag-and-drop file upload area with browse button. Shows upload progress and file previews. Use for document uploads, image uploads, or any file attachment interface.",
21437
+ keywords: ["upload", "file", "drag-drop", "attachment", "document"],
21438
+ visualWeight: "light",
21439
+ props: ["accept?", "maxSize?", "onUpload?", "className?"]
21440
+ },
21441
+ ImageUploader: {
21442
+ path: "@/components/blocks",
21443
+ description: "Image upload component with drag-and-drop, preview grid of uploaded images, and remove buttons. Use for multi-image uploads, gallery management, or product photo uploads.",
21444
+ keywords: ["upload", "image", "drag-drop", "gallery", "photos"],
21445
+ visualWeight: "medium",
21446
+ props: ["images?", "onImagesChange?", "maxImages?", "className?"]
21447
+ },
21448
+ Typography: {
21449
+ path: "@/components/blocks",
21450
+ description: "Text rendering component with semantic HTML tags (h1-h6, p, span, label) and design token typography styles. Maps to --typo-h1 through --typo-body-s tokens automatically. Use for any text content instead of raw HTML tags to ensure consistent typography.",
21451
+ keywords: ["text", "heading", "paragraph", "typography", "font"],
21452
+ visualWeight: "light",
21453
+ props: ["as?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'span' | 'label'", "children", "className?"]
21454
+ },
21455
+ LineTabs: {
21456
+ path: "@/components/blocks",
21457
+ description: "Horizontal tab navigation with underline indicator on active tab. Tabs render as a row of text links with a bottom border highlight. Use for page-level or section-level tab navigation with a minimal underline style.",
21458
+ keywords: ["tabs", "navigation", "underline", "line", "horizontal"],
21459
+ visualWeight: "light",
21460
+ props: ["tabs?", "activeTab?", "onTabChange?", "className?"]
21461
+ },
21462
+ ChatMessage: {
21463
+ path: "@/components/blocks",
21464
+ description: "Individual chat message component with avatar, sender name, timestamp, and message content. Supports sent/received alignment. Use inside chat interfaces for individual message rendering.",
21465
+ keywords: ["chat", "message", "conversation", "bubble"],
21466
+ visualWeight: "light",
21467
+ props: ["message?", "className?"]
21468
+ },
21469
+ MultiselectCheckboxField: {
21470
+ path: "@/components/blocks",
21471
+ description: "Form field with a grid of checkbox options for multi-selection. Each option shows a checkbox with label. Use inside forms for selecting multiple items from a predefined list.",
21472
+ keywords: ["multiselect", "checkbox", "form", "field", "options"],
21473
+ visualWeight: "light",
21474
+ props: ["label?", "options?", "selected?", "onChange?", "className?"]
21475
+ },
21476
+ MultiselectTags: {
21477
+ path: "@/components/blocks",
21478
+ description: "Tag-based multi-select input with removable tag chips and dropdown search. Selected items appear as tags that can be removed. Use for multi-select inputs where selected items should be visually prominent.",
21479
+ keywords: ["multiselect", "tags", "chips", "select", "form"],
21480
+ visualWeight: "light",
21481
+ props: ["label?", "options?", "selected?", "onChange?", "placeholder?", "className?"]
21482
+ },
21483
+ Searchbox: {
21484
+ path: "@/components/blocks",
21485
+ description: "Compact search input with search icon and clear button. Use for inline search within tables, lists, or sidebars.",
21486
+ keywords: ["search", "input", "find", "filter", "compact"],
21487
+ visualWeight: "light",
21488
+ props: ["value?", "onChange?", "placeholder?", "className?"]
21489
+ },
21490
+ TextInput: {
21491
+ path: "@/components/blocks",
21492
+ description: "Styled text input field with label, optional description, and error state. Wraps the base Input with form field structure. Use for individual form fields outside of FormGroup.",
21493
+ keywords: ["input", "text", "field", "form"],
21494
+ visualWeight: "light",
21495
+ props: ["label?", "description?", "error?", "className?"]
21496
+ },
21497
+ MultistepProgressbarShell: {
21498
+ path: "@/components/blocks",
21499
+ description: "Alternative multi-step layout with a horizontal progress bar instead of numbered step tracker. Content area centered below. Use for simplified wizard flows where progress percentage matters more than step numbers.",
21500
+ keywords: ["wizard", "multistep", "progress", "bar", "form"],
21501
+ visualWeight: "light",
21502
+ props: ["steps?", "currentStep?", "children?"]
21209
21503
  }
21210
21504
  };
21211
21505
  var groupModalDrawerBlocks = {
21212
21506
  FormGroup: {
21213
21507
  path: "@/components/blocks",
21214
- description: "Single-column form layout with header (title, sort, filter, action button), configurable fields, and footer (cancel/save). Supports text inputs, textareas, selects, date pickers, multiselect checkboxes, checkbox groups, radio groups, multiselect tags, image/file uploaders, and sliders.",
21508
+ description: "Single-column form layout with header (title, sort, filter, action button), configurable fields, and footer (cancel/save). Supports text inputs, textareas, selects, date pickers, multiselect checkboxes, checkbox groups, radio groups, multiselect tags, image/file uploaders, and sliders. Use for any data entry form, settings page, or create/edit interface.",
21509
+ keywords: ["form", "fields", "input", "data-entry", "create", "edit", "settings"],
21510
+ visualWeight: "heavy",
21215
21511
  props: ["title?", "description?", "fields?: FormFieldConfig[]", "sortOptions?", "filterOptions?", "inputSize?: 'sm' | 'default' | 'lg'", "onAddNew?", "onCancel?", "onSave?", "onFieldChange?", "showHeader?", "showFooter?"]
21216
21512
  },
21217
21513
  DetailDrawer: {
21218
21514
  path: "@/components/blocks",
21219
- description: "Right-side detail drawer with tabbed content. Info tab shows metadata fields (with avatars, badges, links), rich content sections, and file attachments. Comments tab shows a chat-style thread with sender names, timestamps, and a comment input.",
21515
+ description: "Right-side sliding drawer with tabbed content. Info tab shows metadata fields (with avatars, badges, links), rich content sections, and file attachments. Comments tab shows a chat-style thread. Use for row detail views, task details, record inspection, or any side-panel detail interface.",
21516
+ keywords: ["drawer", "detail", "side-panel", "inspect", "comments", "overlay"],
21517
+ visualWeight: "heavy",
21220
21518
  props: ["open?", "onOpenChange?", "title?", "subtitle?", "tabs?: DrawerTab[]", "activeTab?", "onTabChange?", "detailFields?: DetailField[][]", "richContent?", "attachments?: DrawerAttachment[]", "comments?: DrawerComment[]", "commentPlaceholder?", "onComment?", "onAttachmentDownload?"]
21519
+ },
21520
+ // Popup / Modal Components
21521
+ ConfirmationPopup: {
21522
+ path: "@/components/blocks",
21523
+ description: "Modal overlay with title, description text, and confirm/cancel action buttons. Confirm button supports destructive (red) and default (primary) variants. Compact centered dialog (~200px tall). Use for delete confirmations, discard warnings, or any yes/no decision.",
21524
+ keywords: ["confirm", "dialog", "modal", "delete", "warning", "destructive"],
21525
+ visualWeight: "light",
21526
+ props: ["open?", "onOpenChange?", "title?", "description?", "confirmLabel?", "cancelLabel?", "variant?", "onConfirm?", "onCancel?", "loading?"]
21527
+ },
21528
+ ContactFormPopup: {
21529
+ path: "@/components/blocks",
21530
+ description: "Contact form modal with gradient banner, large overlapping avatar, and configurable form fields supporting text, email, tel, and textarea inputs. Centered dialog (~450px tall). Use for contact forms, inquiry submissions, or any user-to-user messaging form.",
21531
+ keywords: ["contact", "form", "modal", "message", "email", "inquiry"],
21532
+ visualWeight: "medium",
21533
+ props: ["open?", "onOpenChange?", "name?", "description?", "avatarUrl?", "fields?", "submitLabel?", "cancelLabel?", "onSubmit?", "onCancel?", "loading?"]
21534
+ },
21535
+ DetailsPopup: {
21536
+ path: "@/components/blocks",
21537
+ description: "Read-only details viewer modal displaying label-value pairs. Centered dialog (~300px tall). Use for displaying product specs, property information, record details, or any structured metadata.",
21538
+ keywords: ["details", "view", "modal", "specs", "metadata", "info"],
21539
+ visualWeight: "light",
21540
+ props: ["open?", "onOpenChange?", "title?", "details?", "className?"]
21541
+ },
21542
+ FeedbackPopup: {
21543
+ path: "@/components/blocks",
21544
+ description: "Compact feedback collection modal with textarea for free-text input. Centered dialog (~250px tall). Use for user feedback, bug reports, feature requests, or any free-text submission.",
21545
+ keywords: ["feedback", "modal", "textarea", "comment", "report"],
21546
+ visualWeight: "light",
21547
+ props: ["open?", "onOpenChange?", "title?", "description?", "submitLabel?", "cancelLabel?", "placeholder?", "onSubmit?", "onCancel?", "loading?"]
21548
+ },
21549
+ FormPopup: {
21550
+ path: "@/components/blocks",
21551
+ description: "Scrollable form modal supporting diverse field types: text, select, date, textarea, radio, checkbox, multiselect tags, image/file uploaders, and sliders. Centered dialog (~400-500px tall). Use for create/edit forms, settings dialogs, or any structured data input in a modal context.",
21552
+ keywords: ["form", "modal", "fields", "input", "create", "edit", "dialog"],
21553
+ visualWeight: "medium",
21554
+ props: ["open?", "onOpenChange?", "title?", "description?", "fields?", "cancelLabel?", "saveLabel?", "inputSize?", "onSave?", "onCancel?", "onFieldChange?", "loading?"]
21555
+ },
21556
+ ImagePopup: {
21557
+ path: "@/components/blocks",
21558
+ description: "Minimal lightbox modal for displaying a single image in full view with responsive sizing. Use for image previews, photo zoom, or any image detail view.",
21559
+ keywords: ["image", "lightbox", "modal", "preview", "zoom", "photo"],
21560
+ visualWeight: "light",
21561
+ props: ["open?", "onOpenChange?", "src?", "alt?"]
21562
+ },
21563
+ InvoicePopup: {
21564
+ path: "@/components/blocks",
21565
+ description: "Invoice display modal with header section (logo, title, metadata), line items table, summary calculations (subtotal, discount, total), and action button. Centered dialog (~500px tall). Use for invoice previews, receipt displays, or billing document views.",
21566
+ keywords: ["invoice", "receipt", "billing", "modal", "payment", "document"],
21567
+ visualWeight: "medium",
21568
+ props: ["open?", "onOpenChange?", "title?", "subtitle?", "invoiceNumber?", "invoiceDate?", "recipientName?", "recipientAddress?", "lineItems?", "subtotal?", "discount?", "total?", "actionLabel?", "onAction?", "loading?"]
21569
+ },
21570
+ ListPopup: {
21571
+ path: "@/components/blocks",
21572
+ description: "Editable list management modal with add/remove functionality using EditableList component. Centered dialog (~300px tall). Use for managing tag lists, skill lists, or any dynamic list that needs a dedicated editor.",
21573
+ keywords: ["list", "editable", "modal", "manage", "add", "remove"],
21574
+ visualWeight: "light",
21575
+ props: ["open?", "onOpenChange?", "title?", "listLabel?", "items?", "onSave?", "onCancel?", "addPlaceholder?"]
21576
+ },
21577
+ MultistepFormPopup: {
21578
+ path: "@/components/blocks",
21579
+ description: "Multi-step form wizard modal with configurable form steps, billing plan selection step, and loading/success state displays. Centered dialog (~450px tall). Use for complex multi-step processes in a modal: subscription signups, onboarding wizards, or multi-page forms.",
21580
+ keywords: ["multistep", "wizard", "modal", "form", "steps", "subscription"],
21581
+ visualWeight: "medium",
21582
+ props: ["open?", "onOpenChange?", "steps?", "billingPlans?", "loadingTitle?", "successTitle?", "successDescription?", "onComplete?", "onSuccessButtonClick?"]
21583
+ },
21584
+ NpsSurveyPopup: {
21585
+ path: "@/components/blocks",
21586
+ description: "Numeric rating survey modal with number buttons (configurable 1-10 range) and end-labels (e.g., 'Not likely' to 'Very likely'). Compact centered dialog (~200px tall). Use for NPS surveys, satisfaction ratings, or any numeric scale feedback.",
21587
+ keywords: ["nps", "survey", "rating", "modal", "score", "feedback"],
21588
+ visualWeight: "light",
21589
+ props: ["open?", "onOpenChange?", "title?", "description?", "value?", "onSubmit?", "onCancel?", "minLabel?", "maxLabel?", "min?", "max?"]
21590
+ },
21591
+ PersonalizeFeedPopup: {
21592
+ path: "@/components/blocks",
21593
+ description: "Topic selection modal displaying toggleable topic chips in a grid for feed personalization. Centered dialog (~350px tall). Use for interest selection, feed customization, preference settings, or any multi-choice topic picker.",
21594
+ keywords: ["personalize", "topics", "interests", "modal", "feed", "preferences"],
21595
+ visualWeight: "light",
21596
+ props: ["open?", "onOpenChange?", "title?", "description?", "options?", "defaultSelected?", "onSave?", "onCancel?"]
21597
+ },
21598
+ PricingPlansPopup: {
21599
+ path: "@/components/blocks",
21600
+ description: "Pricing plan selector modal with monthly/annual billing toggle and radio card plan selection. Centered dialog (~400px tall). Use for in-app plan upgrades, subscription changes, or plan selection during checkout.",
21601
+ keywords: ["pricing", "plans", "modal", "subscription", "billing", "upgrade"],
21602
+ visualWeight: "medium",
21603
+ props: ["open?", "onOpenChange?", "title?", "description?", "plans?", "billingPeriod?", "onBillingPeriodChange?", "selectedPlanId?", "onPlanChange?", "confirmLabel?", "cancelLabel?", "onConfirm?", "onCancel?", "loading?"]
21604
+ },
21605
+ PurchaseConfirmationPopup: {
21606
+ path: "@/components/blocks",
21607
+ description: "Checkout confirmation modal displaying summary, masked credit card selection with change option, and confirm/cancel actions. Compact centered dialog (~250px tall). Use for purchase confirmations, payment confirmations, or order finalization.",
21608
+ keywords: ["purchase", "confirmation", "modal", "checkout", "payment", "card"],
21609
+ visualWeight: "light",
21610
+ props: ["open?", "onOpenChange?", "title?", "description?", "cardLabel?", "cardLastFour?", "onChangeCard?", "confirmLabel?", "cancelLabel?", "onConfirm?", "onCancel?", "loading?"]
21611
+ },
21612
+ ShareProjectPopup: {
21613
+ path: "@/components/blocks",
21614
+ description: "Project sharing modal with visibility dropdown, URL copy field, user invite select, and people-with-access list with role dropdowns and enable/disable toggles. Centered dialog (~450px tall). Use for sharing settings, collaboration invites, or permission management.",
21615
+ keywords: ["share", "invite", "modal", "collaboration", "permissions", "access"],
21616
+ visualWeight: "medium",
21617
+ props: ["open?", "onOpenChange?", "title?", "description?", "visibilityOptions?", "shareUrl?", "inviteOptions?", "roles?", "people?", "onInvite?", "onRoleChange?", "onToggle?", "onCopyLink?"]
21618
+ },
21619
+ SlideshowPopup: {
21620
+ path: "@/components/blocks",
21621
+ description: "Full-screen image gallery modal with prev/next navigation, dot indicators, keyboard support (arrow keys), and author/likes/views metadata bar. Use for image slideshows, photo galleries, or portfolio detail views.",
21622
+ keywords: ["slideshow", "gallery", "modal", "images", "fullscreen", "carousel"],
21623
+ visualWeight: "medium",
21624
+ props: ["open?", "onOpenChange?", "slides?", "author?", "likes?", "views?", "initialIndex?", "onSlideChange?"]
21625
+ },
21626
+ SmallEditPopup: {
21627
+ path: "@/components/blocks",
21628
+ description: "Compact edit form modal with text inputs arranged in flexible rows supporting half-width field pairing. Centered dialog (~250px tall). Use for quick edits, inline field editing, or small update forms.",
21629
+ keywords: ["edit", "form", "modal", "compact", "quick-edit", "update"],
21630
+ visualWeight: "light",
21631
+ props: ["open?", "onOpenChange?", "title?", "description?", "fields?", "cancelLabel?", "saveLabel?", "onSave?", "onCancel?", "loading?"]
21632
+ },
21633
+ TermsOfServicePopup: {
21634
+ path: "@/components/blocks",
21635
+ description: "Scrollable content viewer modal for terms/legal documents with styled scrollbar and confirm/decline action buttons. Centered dialog (~450px tall). Use for terms of service, privacy policies, legal agreements, or any long-form content that needs acceptance.",
21636
+ keywords: ["terms", "legal", "modal", "agreement", "policy", "tos"],
21637
+ visualWeight: "medium",
21638
+ props: ["open?", "onOpenChange?", "title?", "children?", "confirmLabel?", "cancelLabel?", "onConfirm?", "onCancel?", "loading?"]
21639
+ },
21640
+ VideoPopup: {
21641
+ path: "@/components/blocks",
21642
+ description: "YouTube video player modal displaying full-width video. Centered dialog. Use for video previews, tutorial popups, or any embedded video in a modal context.",
21643
+ keywords: ["video", "youtube", "modal", "player", "tutorial"],
21644
+ visualWeight: "medium",
21645
+ props: ["open?", "onOpenChange?", "videoId?", "title?"]
21646
+ },
21647
+ ViewProfilePopup: {
21648
+ path: "@/components/blocks",
21649
+ description: "Profile card modal with gradient banner, overlapping avatar, star rating, flexible detail rows (text/tags/icons), message/more-options buttons, and optional profile link. Centered dialog (~400px tall). Use for user profile previews, contact cards, or member detail popups.",
21650
+ keywords: ["profile", "modal", "user", "avatar", "rating", "contact"],
21651
+ visualWeight: "medium",
21652
+ props: ["open?", "onOpenChange?", "name?", "subtitle?", "avatarUrl?", "rating?", "details?", "profileUrl?", "onMessage?", "onMoreOptions?"]
21221
21653
  }
21222
21654
  };
21223
21655
  var videoBlocks = {
21224
21656
  VideoChatControls: {
21225
21657
  path: "@/components/blocks",
21226
- description: "Row of circular buttons for video calls: camera, mic, cast, leave.",
21658
+ description: "Row of circular toggle buttons for video/audio calls: camera on/off, microphone on/off, screen cast, and leave/end call. Use at the bottom of any video conferencing or audio call interface.",
21659
+ keywords: ["video", "call", "controls", "camera", "microphone"],
21660
+ visualWeight: "light",
21227
21661
  props: ["isVideoOn?", "isMicOn?", "onToggleVideo?", "onToggleMic?", "onCast?", "onLeave?"]
21228
21662
  },
21229
21663
  WebcamPreview: {
21230
21664
  path: "@/components/blocks",
21231
- description: "Live webcam preview component with optional overlay controls.",
21665
+ description: "Video preview component showing a webcam or video feed with optional overlay controls. Use for video call self-view, camera preview, or live streaming interfaces.",
21666
+ keywords: ["video", "webcam", "camera", "preview", "stream"],
21667
+ visualWeight: "medium",
21232
21668
  props: ["className?", "showControls?"]
21233
21669
  },
21234
21670
  ParticipantList: {
21235
21671
  path: "@/components/blocks",
21236
- description: "List of video call participants with avatars and status.",
21672
+ description: "Vertical list of participants with avatars, names, and connection status indicators. Use for video call participant panels, meeting attendees, or online user lists.",
21673
+ keywords: ["participants", "attendees", "users", "video-call", "meeting"],
21674
+ visualWeight: "medium",
21237
21675
  props: ["participants: Participant[]"]
21238
21676
  },
21239
21677
  VideoPlaylist: {
21240
21678
  path: "@/components/blocks",
21241
- description: "Sidebar playlist for video content with thumbnails.",
21679
+ description: "Sidebar playlist of video items with thumbnails, titles, and duration. Current video highlighted. Use for course lessons, tutorial series, or any sequential video content.",
21680
+ keywords: ["playlist", "videos", "lessons", "course", "tutorial"],
21681
+ visualWeight: "medium",
21242
21682
  props: ["videos: Video[]", "currentVideo?", "onVideoSelect?"]
21243
21683
  },
21244
21684
  VideoContentSection: {
21245
21685
  path: "@/components/blocks",
21246
- description: "Video player area with metadata and description.",
21686
+ description: "Video player area with title, metadata (views, date, channel), description text, and social actions. Use for video detail pages, course lessons, or media content pages.",
21687
+ keywords: ["video", "player", "content", "media", "description"],
21688
+ visualWeight: "heavy",
21247
21689
  props: ["video: Video", "onPlay?"]
21248
21690
  },
21249
21691
  YouTubePlayer: {
21250
21692
  path: "@/components/blocks",
21251
- description: "Embedded YouTube player component.",
21693
+ description: "Embedded YouTube video player component. Renders a responsive YouTube iframe. Use for embedding tutorial videos, product demos, or any YouTube content.",
21694
+ keywords: ["youtube", "video", "embed", "player"],
21695
+ visualWeight: "medium",
21252
21696
  props: ["videoId: string", "autoplay?"]
21253
21697
  }
21254
21698
  };
@@ -21256,241 +21700,539 @@ var marketingBlocks = {
21256
21700
  // Hero Sections
21257
21701
  HeroSection: {
21258
21702
  path: "@/components/blocks/marketing",
21259
- description: "Hero with background image and simple search bar overlay.",
21703
+ description: "Full-width hero banner with background image, large heading, subtitle text, and optional search bar overlay. Use as the main visual entry point for landing pages, homepages, or category pages.",
21704
+ keywords: ["hero", "banner", "landing", "search", "homepage"],
21705
+ visualWeight: "spacer",
21260
21706
  props: ["title", "subtitle", "searchPlaceholder?", "backgroundImage?"]
21261
21707
  },
21262
21708
  HeroDarkWithImage: {
21263
21709
  path: "@/components/blocks/marketing",
21264
- description: "Dark hero section with text on left and image on right.",
21710
+ description: "Dark-background hero section with heading and subtitle on the left, large feature image on the right. Stacks vertically on mobile. Use for product launches, feature announcements, or SaaS landing pages.",
21711
+ keywords: ["hero", "dark", "feature", "product", "landing"],
21712
+ visualWeight: "spacer",
21265
21713
  props: ["title", "subtitle", "image"]
21266
21714
  },
21267
21715
  HeroDarkCentered: {
21268
21716
  path: "@/components/blocks/marketing",
21269
- description: "Dark centered hero with multi-field search (location, dates, guests).",
21717
+ description: "Dark-background centered hero with large heading, subtitle, and multi-field search bar (location, dates, guests). Use for search-focused homepages like travel, real estate, or marketplace sites.",
21718
+ keywords: ["hero", "dark", "centered", "search", "landing"],
21719
+ visualWeight: "spacer",
21270
21720
  props: ["title", "subtitle"]
21271
21721
  },
21272
21722
  HeroFullwidthImage: {
21273
21723
  path: "@/components/blocks/marketing",
21274
- description: "Full-width hero image with centered content and multi-field search.",
21724
+ description: "Full-width hero with background image covering entire section, centered heading and subtitle overlay, and multi-field search bar. Use for visually immersive landing pages.",
21725
+ keywords: ["hero", "fullwidth", "image", "immersive", "landing"],
21726
+ visualWeight: "spacer",
21275
21727
  props: ["title", "subtitle", "backgroundImage"]
21276
21728
  },
21277
21729
  CenteredHero: {
21278
21730
  path: "@/components/blocks/marketing",
21279
- description: "Simple centered hero for about/landing pages.",
21731
+ description: "Clean centered hero with large heading and subtitle text on a plain background. No image or search bar. Use for about pages, company pages, or minimal landing sections.",
21732
+ keywords: ["hero", "centered", "minimal", "about", "clean"],
21733
+ visualWeight: "spacer",
21280
21734
  props: ["title", "subtitle?"]
21281
21735
  },
21282
21736
  // Content Sections
21283
21737
  DestinationCards: {
21284
21738
  path: "@/components/blocks/marketing",
21285
- description: "Grid of destination cards with images and titles.",
21739
+ description: "4-column card grid with large images, title, item count, and price. Each card has hover zoom effect. Header with title and 'Explore more' link. Use for featured categories, popular items, highlighted locations, or any curated collection showcase.",
21740
+ keywords: ["cards", "grid", "categories", "featured", "browse", "destinations"],
21741
+ visualWeight: "medium",
21286
21742
  props: ["title?", "destinations?"]
21287
21743
  },
21288
21744
  FeaturedPlaces: {
21289
21745
  path: "@/components/blocks/marketing",
21290
- description: "Featured places section with filter pills and card grid.",
21746
+ description: "3-column card grid with filter pill tabs at top, image cards with name, rating, item count, and price. Header with title and 'Explore more' link. Use for filterable catalogs, featured products, or curated collections with category filtering.",
21747
+ keywords: ["cards", "grid", "filter", "featured", "catalog"],
21748
+ visualWeight: "medium",
21291
21749
  props: ["title?", "filters?", "places?"]
21292
21750
  },
21293
21751
  CategoryGrid: {
21294
21752
  path: "@/components/blocks/marketing",
21295
- description: "Grid of category cards with icons/images.",
21753
+ description: "5-column grid of category cards, each with a large icon, category title, and item count on a bordered card. Use for browse-by-category sections, service categories, or topic navigation grids.",
21754
+ keywords: ["categories", "grid", "icons", "browse", "navigation"],
21755
+ visualWeight: "medium",
21296
21756
  props: ["categories?"]
21297
21757
  },
21298
21758
  GallerySection: {
21299
21759
  path: "@/components/blocks/marketing",
21300
- description: "Image gallery with title and grid layout.",
21760
+ description: "3-column masonry-style image gallery with varying image heights. Header with title, subtitle, and two description paragraphs. Light and dark variants. Use for photo galleries, portfolio showcases, or visual inspiration sections.",
21761
+ keywords: ["gallery", "images", "masonry", "photos", "portfolio"],
21762
+ visualWeight: "heavy",
21301
21763
  props: ["title?", "subtitle?", "images?"]
21302
21764
  },
21303
21765
  BlogCards: {
21304
21766
  path: "@/components/blocks/marketing",
21305
- description: "Grid of blog post cards with images, titles, dates.",
21767
+ description: "3-column grid of blog/article cards with large images, title, description, and 'Read more' link with arrow icon. Header with subtitle and title. Use for blog sections, news feeds, content highlights, or any editorial content grid.",
21768
+ keywords: ["blog", "articles", "news", "content", "cards"],
21769
+ visualWeight: "medium",
21306
21770
  props: ["title?", "subtitle?", "posts?"]
21307
21771
  },
21308
21772
  // How It Works
21309
21773
  HowItWorks: {
21310
21774
  path: "@/components/blocks/marketing",
21311
- description: "Horizontal 3-step how it works section.",
21775
+ description: "4-column grid of feature items, each with a large icon, title, and description. Light and dark variants. Use for 'how it works' steps, feature highlights, value propositions, or benefit lists.",
21776
+ keywords: ["features", "steps", "benefits", "how-it-works", "value"],
21777
+ visualWeight: "medium",
21312
21778
  props: ["steps?"]
21313
21779
  },
21314
21780
  VerticalHowItWorks: {
21315
21781
  path: "@/components/blocks/marketing",
21316
- description: "Vertical how it works with large numbers. Has light/dark variants.",
21782
+ description: "Vertical numbered list of steps with large step numbers, titles, and descriptions. Header with title and description. Light and dark variants. Use for process explanations, getting started guides, or numbered feature lists.",
21783
+ keywords: ["steps", "process", "numbered", "how-it-works", "guide"],
21784
+ visualWeight: "medium",
21317
21785
  props: ["variant?: 'light' | 'dark'", "title", "description", "steps?"]
21318
21786
  },
21319
21787
  // Social Proof
21320
21788
  TestimonialCarousel: {
21321
21789
  path: "@/components/blocks/marketing",
21322
- description: "Dark testimonial carousel with quote, author, and navigation arrows.",
21790
+ description: "Dark-background testimonial carousel showing one quote at a time with author name, role, avatar, and left/right navigation arrows. Use for customer testimonials, user quotes, or endorsement sections.",
21791
+ keywords: ["testimonials", "quotes", "reviews", "social-proof", "carousel"],
21792
+ visualWeight: "medium",
21323
21793
  props: ["testimonials?"]
21324
21794
  },
21325
21795
  ReviewsGrid: {
21326
21796
  path: "@/components/blocks/marketing",
21327
- description: "Grid of review cards with ratings and text.",
21797
+ description: "3-column grid of review cards, each with quote text, author avatar, name, and location. Cards distributed across columns for masonry effect. Use for customer reviews, testimonial grids, or social proof sections.",
21798
+ keywords: ["reviews", "testimonials", "grid", "social-proof", "quotes"],
21799
+ visualWeight: "medium",
21328
21800
  props: ["title?", "subtitle?", "reviews?"]
21329
21801
  },
21330
21802
  SocialProof: {
21331
21803
  path: "@/components/blocks/marketing",
21332
- description: "Logo bar showing 'as featured on' brands.",
21804
+ description: "Horizontal logo bar with 'as featured in' label and partner/press brand logos. Use for trust indicators, partner logos, media mentions, or integration partner displays.",
21805
+ keywords: ["logos", "partners", "trust", "featured-in", "brands"],
21806
+ visualWeight: "light",
21333
21807
  props: ["label?", "logos?"]
21334
21808
  },
21335
21809
  MetricsSection: {
21336
21810
  path: "@/components/blocks/marketing",
21337
- description: "Row of large metric numbers with labels.",
21811
+ description: "Row of 2-4 large metric numbers with labels below, separated by left borders. Header with subtitle and title. Metrics grid shows 2 columns on mobile, 4 on desktop. Prefer this for marketing/landing page stat displays \u2014 includes left-border separators, h1-scale typography, and responsive grid. Use for company stats, key figures, achievement highlights, or any numeric overview section.",
21812
+ keywords: ["metrics", "stats", "numbers", "achievements", "key-figures"],
21813
+ visualWeight: "light",
21338
21814
  props: ["metrics?"]
21339
21815
  },
21340
21816
  // Features
21341
21817
  FeatureWithImage: {
21342
21818
  path: "@/components/blocks/marketing",
21343
- description: "Feature highlight with image and text side by side.",
21819
+ description: "Two-column feature section with large image on one side and heading, description, benefit list, and CTA button on the other. Image position toggleable (left/right). Stacks vertically on mobile. Use for product features, service explanations, or benefit showcases.",
21820
+ keywords: ["feature", "two-column", "image", "benefits", "product"],
21821
+ visualWeight: "medium",
21344
21822
  props: ["title", "description", "ctaText?", "imagePosition?: 'left' | 'right'"]
21345
21823
  },
21346
21824
  ContentWithImage: {
21347
21825
  path: "@/components/blocks/marketing",
21348
- description: "Generic content section with image. Similar to FeatureWithImage.",
21826
+ description: "Two-column content section with image and text content side by side. Image position toggleable. Similar to FeatureWithImage but more generic. Use for any content + image layout.",
21827
+ keywords: ["content", "image", "two-column", "text", "layout"],
21828
+ visualWeight: "medium",
21349
21829
  props: ["title", "content", "image", "imagePosition?"]
21350
21830
  },
21351
21831
  CoreValuesGrid: {
21352
21832
  path: "@/components/blocks/marketing",
21353
- description: "Grid of value cards with icons and descriptions.",
21833
+ description: "3-column grid of value cards, each with an icon in a square container, title, and description text. Centered header with subtitle, title, and description. Light and dark variants. Use for core values, company principles, service benefits, or feature grids.",
21834
+ keywords: ["values", "principles", "benefits", "features", "grid"],
21835
+ visualWeight: "medium",
21354
21836
  props: ["values?"]
21355
21837
  },
21356
21838
  // Team
21357
21839
  TeamCardsGrid: {
21358
21840
  path: "@/components/blocks/marketing",
21359
- description: "Grid of team member cards with photos and roles.",
21841
+ description: "4-column grid of team member cards with portrait photos, name, and role/title text. Photos have responsive height. Use for team pages, about pages, staff directories, or leadership sections.",
21842
+ keywords: ["team", "members", "people", "staff", "leadership"],
21843
+ visualWeight: "medium",
21360
21844
  props: ["title?", "members?"]
21361
21845
  },
21362
21846
  TeamCircularGrid: {
21363
21847
  path: "@/components/blocks/marketing",
21364
- description: "Team grid with circular avatar photos.",
21848
+ description: "Grid of team members with circular avatar photos, name, and role text. More compact than TeamCardsGrid. Use for advisory boards, small teams, or avatar-focused people grids.",
21849
+ keywords: ["team", "members", "avatars", "people", "compact"],
21850
+ visualWeight: "medium",
21365
21851
  props: ["title?", "members?"]
21366
21852
  },
21367
21853
  // CTA & Footer
21368
21854
  CtaBanner: {
21369
21855
  path: "@/components/blocks/marketing",
21370
- description: "Call to action banner with title and button.",
21856
+ description: "Full-width call-to-action banner with heading text and primary action button. Use for newsletter signups, contact prompts, trial starts, or any conversion-focused section.",
21857
+ keywords: ["cta", "call-to-action", "conversion", "signup", "banner"],
21858
+ visualWeight: "light",
21371
21859
  props: ["title", "buttonText", "onButtonClick?"]
21372
21860
  },
21373
21861
  FooterNavbar: {
21374
21862
  path: "@/components/blocks/marketing",
21375
- description: "Footer with logo, nav links, and social icons.",
21863
+ description: "Full-width footer with company logo, multi-column navigation link groups, and social media icons. Use at the bottom of any marketing or content page.",
21864
+ keywords: ["footer", "navigation", "links", "social", "bottom"],
21865
+ visualWeight: "medium",
21376
21866
  props: ["companyName?", "links?", "socialLinks?"]
21377
21867
  },
21378
21868
  // Other
21379
21869
  FeaturedNewsCards: {
21380
21870
  path: "@/components/blocks/marketing",
21381
- description: "Featured news/press cards section.",
21871
+ description: "2-column grid of large news/press cards with images, headlines, descriptions, and 'Read more' links. Centered header with subtitle, title, and description. Light and dark variants. Use for press coverage, news highlights, blog features, or content spotlights.",
21872
+ keywords: ["news", "press", "articles", "featured", "highlights"],
21873
+ visualWeight: "medium",
21382
21874
  props: ["title?", "articles?"]
21383
21875
  },
21384
21876
  OfficeLocations: {
21385
21877
  path: "@/components/blocks/marketing",
21386
- description: "Grid of office location cards with addresses.",
21878
+ description: "3-column grid of location cards, each showing city name and multi-line address in a bordered card. Header with subtitle, title, and description. Use for office locations, store directories, branch listings, or any multi-location display.",
21879
+ keywords: ["offices", "locations", "addresses", "branches", "stores"],
21880
+ visualWeight: "medium",
21387
21881
  props: ["title?", "locations?"]
21388
21882
  }
21389
21883
  };
21390
21884
  var pricingBlocks = {
21391
21885
  PricingCards: {
21392
21886
  path: "@/components/blocks/pricing",
21393
- description: "Three-tier pricing cards with monthly/annual toggle, features list, and CTA buttons.",
21887
+ description: "Three-tier pricing cards with monthly/annual billing toggle, 'Most Popular' badge, feature checklists, AI add-on badges, and CTA buttons. Below cards is a contact/enterprise banner. Use for SaaS pricing, subscription plans, or any tiered pricing display.",
21888
+ keywords: ["pricing", "plans", "subscription", "tiers", "billing"],
21889
+ visualWeight: "heavy",
21394
21890
  props: ["plans?"]
21395
21891
  },
21396
21892
  FaqAccordion: {
21397
21893
  path: "@/components/blocks/pricing",
21398
- description: "Expandable FAQ accordion for pricing pages.",
21894
+ description: "Expandable FAQ accordion with question titles and expandable answer text. Use for pricing FAQ sections, help pages, or any expandable Q&A content.",
21895
+ keywords: ["faq", "questions", "answers", "accordion", "help"],
21896
+ visualWeight: "medium",
21399
21897
  props: ["faqs?: FAQ[]"]
21400
21898
  },
21401
21899
  FeaturesComparison: {
21402
21900
  path: "@/components/blocks/pricing",
21403
- description: "Feature comparison table across pricing tiers.",
21901
+ description: "Feature comparison table showing plan names across columns and feature rows with check/cross indicators. Use for comparing pricing tiers, product editions, or service levels side by side.",
21902
+ keywords: ["comparison", "features", "plans", "table", "tiers"],
21903
+ visualWeight: "heavy",
21404
21904
  props: ["features?", "plans?"]
21405
21905
  },
21406
21906
  PricingCta: {
21407
21907
  path: "@/components/blocks/pricing",
21408
- description: "CTA section for pricing page (contact sales, etc.).",
21908
+ description: "Call-to-action section for pricing pages with heading, description, and action button. Use for 'Contact Sales', 'Start Free Trial', or any pricing page conversion section.",
21909
+ keywords: ["pricing", "cta", "call-to-action", "sales", "trial"],
21910
+ visualWeight: "light",
21409
21911
  props: ["title?", "description?", "buttonText?"]
21410
21912
  }
21411
21913
  };
21914
+ var uiPrimitives = {
21915
+ Button: {
21916
+ path: "@/components/ui",
21917
+ description: "Themed button with 6 variants (primary, primary-outline, primary-neutral, neutral, neutral-delete, delete) and 4 sizes (mini, sm, default, lg). Inline element (~36-48px tall depending on size). Use for form submissions, actions, navigation, or any clickable trigger.",
21918
+ keywords: ["button", "action", "submit", "click", "cta"],
21919
+ visualWeight: "light",
21920
+ props: ["variant?", "size?", "disabled?", "children", "className?", "onClick?"]
21921
+ },
21922
+ Input: {
21923
+ path: "@/components/ui",
21924
+ description: "Themed text input field with border, focus ring, and placeholder styling. Supports standard HTML input attributes. Use for single-line text entry in forms.",
21925
+ keywords: ["input", "text", "field", "form"],
21926
+ visualWeight: "light",
21927
+ props: ["type?", "placeholder?", "value?", "onChange?", "disabled?", "className?"]
21928
+ },
21929
+ Textarea: {
21930
+ path: "@/components/ui",
21931
+ description: "Themed multi-line text area with border and focus ring. Use for long-form text entry like descriptions, comments, or messages.",
21932
+ keywords: ["textarea", "text", "multiline", "form", "comment"],
21933
+ visualWeight: "light",
21934
+ props: ["placeholder?", "value?", "onChange?", "rows?", "disabled?", "className?"]
21935
+ },
21936
+ Select: {
21937
+ path: "@/components/ui",
21938
+ description: "Themed dropdown select with trigger button, content panel, and option items. Built on Radix Select. Use for choosing one option from a list.",
21939
+ keywords: ["select", "dropdown", "option", "form", "choose"],
21940
+ visualWeight: "light",
21941
+ props: ["value?", "onValueChange?", "placeholder?", "children", "disabled?"]
21942
+ },
21943
+ Checkbox: {
21944
+ path: "@/components/ui",
21945
+ description: "Themed checkbox with check indicator. Built on Radix Checkbox. Use for boolean toggles or multi-select lists in forms.",
21946
+ keywords: ["checkbox", "toggle", "form", "boolean"],
21947
+ visualWeight: "light",
21948
+ props: ["checked?", "onCheckedChange?", "disabled?", "className?"]
21949
+ },
21950
+ RadioGroup: {
21951
+ path: "@/components/ui",
21952
+ description: "Themed radio button group for single selection from multiple options. Built on Radix RadioGroup. Use when users must choose exactly one option.",
21953
+ keywords: ["radio", "group", "form", "selection", "choice"],
21954
+ visualWeight: "light",
21955
+ props: ["value?", "onValueChange?", "children", "disabled?", "className?"]
21956
+ },
21957
+ Switch: {
21958
+ path: "@/components/ui",
21959
+ description: "Themed toggle switch for on/off states. Built on Radix Switch. Use for boolean settings, feature toggles, or any on/off preference.",
21960
+ keywords: ["switch", "toggle", "on-off", "boolean", "setting"],
21961
+ visualWeight: "light",
21962
+ props: ["checked?", "onCheckedChange?", "disabled?", "className?"]
21963
+ },
21964
+ Slider: {
21965
+ path: "@/components/ui",
21966
+ description: "Themed range slider with track and thumb. Built on Radix Slider. Use for numeric range selection like price filters, volume controls, or rating inputs.",
21967
+ keywords: ["slider", "range", "numeric", "filter", "control"],
21968
+ visualWeight: "light",
21969
+ props: ["value?", "onValueChange?", "min?", "max?", "step?", "disabled?", "className?"]
21970
+ },
21971
+ Dialog: {
21972
+ path: "@/components/ui",
21973
+ description: "Modal dialog overlay with title, description, and content area. Built on Radix Dialog. Use as the base for popup components or any modal interaction.",
21974
+ keywords: ["dialog", "modal", "overlay", "popup"],
21975
+ visualWeight: "light",
21976
+ props: ["open?", "onOpenChange?", "children"]
21977
+ },
21978
+ Sheet: {
21979
+ path: "@/components/ui",
21980
+ description: "Side panel overlay that slides in from the edge of the screen. Built on Radix Dialog. Use for detail drawers, mobile menus, or side-panel content.",
21981
+ keywords: ["sheet", "drawer", "side-panel", "overlay", "slide"],
21982
+ visualWeight: "light",
21983
+ props: ["open?", "onOpenChange?", "side?", "children"]
21984
+ },
21985
+ Popover: {
21986
+ path: "@/components/ui",
21987
+ description: "Floating content panel anchored to a trigger element. Built on Radix Popover. Use for filter dropdowns, tooltips with rich content, or contextual menus.",
21988
+ keywords: ["popover", "floating", "dropdown", "anchor"],
21989
+ visualWeight: "light",
21990
+ props: ["open?", "onOpenChange?", "children"]
21991
+ },
21992
+ DropdownMenu: {
21993
+ path: "@/components/ui",
21994
+ description: "Dropdown menu with items, labels, separators, and keyboard navigation. Built on Radix DropdownMenu. Use for action menus, context menus, or any dropdown list of actions.",
21995
+ keywords: ["dropdown", "menu", "actions", "context-menu"],
21996
+ visualWeight: "light",
21997
+ props: ["children"]
21998
+ },
21999
+ Tooltip: {
22000
+ path: "@/components/ui",
22001
+ description: "Small text tooltip that appears on hover. Built on Radix Tooltip. Use for brief explanatory text on icons, buttons, or truncated labels.",
22002
+ keywords: ["tooltip", "hover", "hint", "help"],
22003
+ visualWeight: "light",
22004
+ props: ["children"]
22005
+ },
22006
+ Avatar: {
22007
+ path: "@/components/ui",
22008
+ description: "Circular avatar image with fallback initials. Built on Radix Avatar. Use for user photos, profile thumbnails, or any person/entity representation.",
22009
+ keywords: ["avatar", "image", "profile", "user", "photo"],
22010
+ visualWeight: "light",
22011
+ props: ["src?", "alt?", "fallback?", "className?"]
22012
+ },
22013
+ Tabs: {
22014
+ path: "@/components/ui",
22015
+ description: "Tab navigation with content panels. Built on Radix Tabs. Use for switching between different content views within a section.",
22016
+ keywords: ["tabs", "navigation", "panels", "switch"],
22017
+ visualWeight: "light",
22018
+ props: ["value?", "onValueChange?", "children"]
22019
+ },
22020
+ Label: {
22021
+ path: "@/components/ui",
22022
+ description: "Themed form label associated with an input. Built on Radix Label. Use for labeling form fields.",
22023
+ keywords: ["label", "form", "field", "text"],
22024
+ visualWeight: "light",
22025
+ props: ["htmlFor?", "children", "className?"]
22026
+ },
22027
+ Separator: {
22028
+ path: "@/components/ui",
22029
+ description: "Horizontal or vertical separator line. Built on Radix Separator. Use for visually dividing sections of content.",
22030
+ keywords: ["separator", "divider", "line", "hr"],
22031
+ visualWeight: "light",
22032
+ props: ["orientation?", "className?"]
22033
+ },
22034
+ Skeleton: {
22035
+ path: "@/components/ui",
22036
+ description: "Loading placeholder skeleton with animated shimmer effect. Use for content loading states to show layout structure before data loads.",
22037
+ keywords: ["skeleton", "loading", "placeholder", "shimmer"],
22038
+ visualWeight: "light",
22039
+ props: ["className?"]
22040
+ },
22041
+ ScrollArea: {
22042
+ path: "@/components/ui",
22043
+ description: "Custom scrollable container with themed scrollbar. Built on Radix ScrollArea. Use for scrollable panels, long lists, or content that exceeds container height.",
22044
+ keywords: ["scroll", "scrollbar", "overflow", "container"],
22045
+ visualWeight: "light",
22046
+ props: ["children", "className?"]
22047
+ },
22048
+ Calendar: {
22049
+ path: "@/components/ui",
22050
+ description: "Month calendar widget for single or range date selection. Shows month grid with navigation arrows. Use for date pickers, scheduling inputs, or any date selection.",
22051
+ keywords: ["calendar", "date", "picker", "month", "schedule"],
22052
+ visualWeight: "light",
22053
+ props: ["selected?", "onSelect?", "mode?", "disabled?", "className?"]
22054
+ },
22055
+ DateInput: {
22056
+ path: "@/components/ui",
22057
+ description: "Date input field with calendar icon that opens a calendar popover for date selection. Combines Input with Calendar. Use for date entry fields in forms.",
22058
+ keywords: ["date", "input", "picker", "calendar", "form"],
22059
+ visualWeight: "light",
22060
+ props: ["value?", "onChange?", "placeholder?", "className?"]
22061
+ },
22062
+ RangeInput: {
22063
+ path: "@/components/ui",
22064
+ description: "Themed range slider input (HTML range type) with custom styling. Use for simple numeric range selection when Slider is too complex.",
22065
+ keywords: ["range", "slider", "numeric", "input"],
22066
+ visualWeight: "light",
22067
+ props: ["min?", "max?", "step?", "value?", "onChange?", "className?"]
22068
+ }
22069
+ };
21412
22070
  var pageTemplates = {
21413
22071
  "page-admin-portal": {
21414
22072
  path: "/page-admin-portal",
21415
- description: "Admin dashboard with dark sidebar, collapsible nav sections, and data table.",
22073
+ description: "Full-screen admin application with dark sidebar navigation (320px), fixed top header with user avatar, and main content area with data table. Use for admin dashboards, CRM tools, back-office management, or any data-heavy app with many navigation sections.",
21416
22074
  shell: "DashboardShell",
21417
22075
  blocks: ["StandardDataTable", "Header"]
21418
22076
  },
22077
+ "page-account": {
22078
+ path: "/page-account",
22079
+ description: "Account settings page with left sidebar tab navigation (Profile, Security, Payments, Notifications) and right content area showing editable settings rows, avatar upload, and saved payment cards. Use for user account management, profile editing, or any settings interface.",
22080
+ shell: "AccountSettingsShell",
22081
+ blocks: ["ProfileImageUploader", "SettingsListRow", "CreditCardDisplay"]
22082
+ },
22083
+ "page-login": {
22084
+ path: "/page-login",
22085
+ description: "Split-screen authentication page. Left side has a login form with email/password fields, 'Remember me' checkbox, and social login options. Right side has a branding panel with background image and logo. Use for login, signup, or authentication flows.",
22086
+ shell: "custom (split layout)",
22087
+ blocks: ["LoginBrandingPanel"]
22088
+ },
22089
+ "page-reset-password": {
22090
+ path: "/page-reset-password",
22091
+ description: "Password reset/recovery page with header and a centered bordered card containing a content area for the reset form. Minimal layout. Use for password reset, email verification, or any single-action authentication flow.",
22092
+ shell: "custom (Header + centered card)",
22093
+ blocks: ["Header", "ContentDropzone"]
22094
+ },
22095
+ "page-checkout": {
22096
+ path: "/page-checkout",
22097
+ description: "Multi-step purchase flow with 5 steps: shopping cart (quantity controls), shipping info form, shipping method selection, payment method selection, and order confirmation. Right sidebar shows order summary throughout. Use for e-commerce checkout, booking flows, or any multi-step purchase process.",
22098
+ shell: "custom (Header + two-column)",
22099
+ blocks: ["Header", "OrderSummarySidebar", "Button", "Separator"]
22100
+ },
21419
22101
  "page-messenger": {
21420
22102
  path: "/page-messenger",
21421
- description: "Full messaging interface with thread sidebar and chat area.",
22103
+ description: "Full-screen messaging interface with thread list sidebar (search, avatars, timestamps, unread badges) and conversation area (message bubbles, date separators, input bar). Use for chat applications, customer support inboxes, or team messaging tools.",
21422
22104
  shell: "custom (no shell)",
21423
22105
  blocks: ["MessengerSidebar", "ChatBubble", "ChatDateSeparator", "MessengerInput"]
21424
22106
  },
21425
22107
  "page-product-homepage": {
21426
22108
  path: "/page-product-homepage",
21427
- description: "Marketing landing page with multiple hero variations and content blocks.",
22109
+ description: "Full-width marketing landing page with stacked sections: header, hero with search, destination cards, featured places, category grid, how-it-works, testimonials, blog cards, and footer. No sidebar. Use for product homepages, marketplace landing pages, travel sites, or SaaS marketing pages.",
21428
22110
  shell: "custom (no shell)",
21429
22111
  blocks: ["Header", "HeroSection", "HeroDarkWithImage", "DestinationCards", "TestimonialCarousel", "FooterNavbar"]
21430
22112
  },
21431
22113
  "page-pricing": {
21432
22114
  path: "/page-pricing",
21433
- description: "Pricing page with tier cards, FAQ, and feature comparison.",
22115
+ description: "Pricing page with header, three-tier pricing cards with billing toggle, feature comparison table, FAQ accordion, and CTA section. Use for SaaS pricing, subscription plan selection, or any tiered pricing display.",
21434
22116
  shell: "custom (no shell)",
21435
22117
  blocks: ["Header", "PricingCards", "FaqAccordion", "FeaturesComparison"]
21436
22118
  },
21437
22119
  "page-about": {
21438
22120
  path: "/page-about",
21439
- description: "About page with hero, metrics, values, team, and locations.",
22121
+ description: "Company/organization about page with centered hero, key metrics row, core values grid, team member cards, and office locations. Use for about us pages, company information, or organizational overview pages.",
21440
22122
  shell: "custom (no shell)",
21441
22123
  blocks: ["Header", "CenteredHero", "MetricsSection", "CoreValuesGrid", "TeamCardsGrid"]
21442
22124
  },
21443
- "page-account": {
21444
- path: "/page-account",
21445
- description: "Account settings with tabbed sidebar navigation.",
21446
- shell: "AccountSettingsShell",
21447
- blocks: ["ProfileImageUploader", "SettingsListRow", "CreditCardDisplay"]
22125
+ "page-standard": {
22126
+ path: "/page-standard",
22127
+ description: "Standard centered content page (max 992px) with optional flair banner at top, page title/description header, and optional horizontal tabs. No sidebar. Use for content pages, documentation, help centers, or any simple centered layout.",
22128
+ shell: "StandardPageShell",
22129
+ blocks: ["FlairBanner", "PageHeaderSection"]
22130
+ },
22131
+ "page-standard-dashboard": {
22132
+ path: "/page-standard-dashboard",
22133
+ description: "Dashboard page using DashboardShell with dark sidebar navigation and main content area. Content area has a ContentDropzone for placing dashboard widgets. Use as a starting point for any sidebar-based dashboard application.",
22134
+ shell: "DashboardShell",
22135
+ blocks: ["ContentDropzone"]
21448
22136
  },
21449
22137
  "page-centered-profile": {
21450
22138
  path: "/page-centered-profile",
21451
- description: "Profile page with centered layout and banner.",
22139
+ description: "Profile page with flair banner at top and centered profile card below showing avatar, stats, bio, tags, and social links. Use for user profiles, author pages, or public-facing member pages.",
21452
22140
  shell: "StandardPageShell",
21453
22141
  blocks: ["ProfileCard", "FlairBanner"]
21454
22142
  },
22143
+ "page-sidebar-profile": {
22144
+ path: "/page-sidebar-profile",
22145
+ description: "Profile page with header, gradient banner, and two-column layout. Left sidebar (360px) stacks SidebarProfileCard, StatsCard, PortfolioCard, DescriptionCard, SkillsCard, LinksCard, and BadgesCard. Right content area has PillTabs and a ContentDropzone placeholder. Use for user profiles, freelancer portfolios, or any profile page with detailed sidebar info.",
22146
+ shell: "custom (Header + GradientBanner + two-column)",
22147
+ blocks: ["Header", "GradientBanner", "SidebarProfileCard", "StatsCard", "PortfolioCard", "DescriptionCard", "SkillsCard", "LinksCard", "BadgesCard", "PillTabs", "ContentDropzone"]
22148
+ },
21455
22149
  "page-double-sidebar": {
21456
22150
  path: "/page-double-sidebar",
21457
- description: "Dashboard with two-column sidebar navigation.",
22151
+ description: "Dashboard with two-column sidebar: narrow icon strip (96px) on far left, wider navigation panel (280px) next to it. Main content area has data table. Use for complex apps with many categories and sub-navigation.",
21458
22152
  shell: "DoubleSidebarShell",
21459
22153
  blocks: ["StandardDataTable"]
21460
22154
  },
21461
22155
  "page-icon-sidebar": {
21462
22156
  path: "/page-icon-sidebar",
21463
- description: "Dashboard with narrow icon-only sidebar.",
22157
+ description: "Dashboard with narrow icon-only sidebar (96px) for minimal navigation footprint. Main content area has data table. Use for apps with few main sections that want maximum content space.",
21464
22158
  shell: "IconSidebarShell",
21465
22159
  blocks: ["StandardDataTable"]
21466
22160
  },
21467
- "page-login": {
21468
- path: "/page-login",
21469
- description: "Login page with form and branding panel.",
21470
- shell: "custom (split layout)",
21471
- blocks: ["LoginBrandingPanel"]
21472
- },
21473
- "page-standard": {
21474
- path: "/page-standard",
21475
- description: "Standard centered page with banner and tabs.",
21476
- shell: "StandardPageShell",
21477
- blocks: ["FlairBanner", "PageHeaderSection"]
21478
- },
21479
22161
  "page-standard-multistep": {
21480
22162
  path: "/page-standard-multistep",
21481
- description: "Multi-step form wizard with horizontal step tracker.",
22163
+ description: "Multi-step form wizard with horizontal step tracker at top showing numbered steps. Centered content area (max 768px) with navigation buttons. Use for registration, onboarding, or any sequential form flow.",
21482
22164
  shell: "MultistepShell",
21483
22165
  blocks: ["StepTracker", "ContentDropzone"]
21484
22166
  },
22167
+ "page-multistep-with-sidebar": {
22168
+ path: "/page-multistep-with-sidebar",
22169
+ description: "Multi-step wizard with step list in a left sidebar showing step names and descriptions. Main content area on right. Use when steps need more context or the flow has many steps.",
22170
+ shell: "MultistepSidebarShell",
22171
+ blocks: ["ContentDropzone"]
22172
+ },
22173
+ "page-multistep-with-progressbar": {
22174
+ path: "/page-multistep-with-progressbar",
22175
+ description: "Multi-step form with header and horizontal progress bar showing overall completion. Centered content area with step tracker and navigation buttons. Use for simpler flows where step count matters less than progress percentage.",
22176
+ shell: "custom (Header + StepTracker)",
22177
+ blocks: ["Header", "StepTracker", "ContentDropzone"]
22178
+ },
22179
+ "page-standard-multistep-with-sidebar": {
22180
+ path: "/page-standard-multistep-with-sidebar",
22181
+ description: "Multi-step form with header and two-column layout: vertical step tracker in a bordered left sidebar (280px) and content area on right with navigation buttons. Use for registration flows or onboarding with sidebar step navigation.",
22182
+ shell: "custom (Header + two-column)",
22183
+ blocks: ["Header", "VerticalStepTracker", "ContentDropzone"]
22184
+ },
22185
+ "page-vertical-multistep": {
22186
+ path: "/page-vertical-multistep",
22187
+ description: "Compact multi-step form with vertical step tracker on left (240px) showing step names and descriptions, and content area on right. No header. Centered (max 800px). Use for embedded forms or focused wizard flows.",
22188
+ shell: "custom (two-column, no header)",
22189
+ blocks: ["VerticalStepTracker", "ContentDropzone"]
22190
+ },
22191
+ "page-mobile-menu": {
22192
+ path: "/page-mobile-menu",
22193
+ description: "Mobile-first layout with sticky bottom navigation bar (Home, Search, Profile tabs). Content area above with padding. Use for mobile app-like experiences, responsive apps, or any interface needing bottom tab navigation.",
22194
+ shell: "MobileMenuShell",
22195
+ blocks: ["ContentDropzone"]
22196
+ },
22197
+ "page-search-bar": {
22198
+ path: "/page-search-bar",
22199
+ description: "Search-focused page with StandardPageShell, prominent search bar, and content area below for results. Use for search interfaces, documentation search, directory lookup, or knowledge base exploration.",
22200
+ shell: "StandardPageShell",
22201
+ blocks: ["SearchBar", "ContentDropzone"]
22202
+ },
22203
+ "page-standard-search": {
22204
+ path: "/page-standard-search",
22205
+ description: "Standard page with search functionality using StandardPageShell. Title, description, search bar, and results area. Use for search results pages, filtered listings, or any searchable content interface.",
22206
+ shell: "StandardPageShell",
22207
+ blocks: ["SearchBar", "ContentDropzone"]
22208
+ },
22209
+ "page-form-group": {
22210
+ path: "/page-form-group",
22211
+ description: "Centered single-column form page (max 960px) displaying a FormGroup component with configurable fields, header controls, and save/cancel footer. Use for create/edit forms, data entry pages, or settings forms.",
22212
+ shell: "custom (centered)",
22213
+ blocks: ["FormGroup"]
22214
+ },
22215
+ "page-gallery-profile-product": {
22216
+ path: "/page-gallery-profile-product",
22217
+ description: "Product or profile detail page with header, full-width image gallery at top, then two-column layout: main content area on left, sidebar on right with reservation card, order summary, info cards, and links. Bottom action bar. Use for product detail pages, listing detail views, or service booking pages.",
22218
+ shell: "custom (Header + gallery + two-column)",
22219
+ blocks: ["Header", "TileImageGallery", "ContentDropzone", "ReservationCard", "OrderSummarySidebar"]
22220
+ },
22221
+ "page-menu-sections": {
22222
+ path: "/page-menu-sections",
22223
+ description: "Page with header, centered title/description, and multiple collapsible menu sections below. Each section has a title and expandable items with content areas. Use for documentation, help centers, knowledge bases, or organized content with categories.",
22224
+ shell: "custom (Header + centered)",
22225
+ blocks: ["Header", "MenuSection", "ContentDropzone"]
22226
+ },
21485
22227
  "page-video-chat": {
21486
22228
  path: "/page-video-chat",
21487
- description: "Video conferencing interface with webcam, participants, and chat.",
22229
+ description: "Video conferencing interface with large webcam preview area, participant list sidebar, video control bar (camera, mic, cast, leave), and optional chat panel. Use for video calls, telemedicine, virtual meetings, or live streaming.",
21488
22230
  shell: "custom (no shell)",
21489
22231
  blocks: ["WebcamPreview", "VideoChatControls", "ParticipantList", "ChatMessageList"]
21490
22232
  },
21491
22233
  "page-video-list": {
21492
22234
  path: "/page-video-list",
21493
- description: "Video content page with player and playlist sidebar.",
22235
+ description: "Video content page with main video player area (title, metadata, description) and playlist sidebar showing video thumbnails. Use for course platforms, tutorial series, media libraries, or video-on-demand interfaces.",
21494
22236
  shell: "custom (no shell)",
21495
22237
  blocks: ["VideoContentSection", "VideoPlaylist", "YouTubePlayer"]
21496
22238
  }
@@ -21504,7 +22246,8 @@ var categoryMap = {
21504
22246
  "Form/Modal/Drawer": groupModalDrawerBlocks,
21505
22247
  "Video": videoBlocks,
21506
22248
  "Marketing": marketingBlocks,
21507
- "Pricing": pricingBlocks
22249
+ "Pricing": pricingBlocks,
22250
+ "UI Primitives": uiPrimitives
21508
22251
  };
21509
22252
  var allComponents = Object.entries(categoryMap).flatMap(
21510
22253
  ([category, registry2]) => Object.entries(registry2).map(([name, entry]) => ({
@@ -21512,6 +22255,8 @@ var allComponents = Object.entries(categoryMap).flatMap(
21512
22255
  category,
21513
22256
  path: entry.path,
21514
22257
  description: entry.description,
22258
+ keywords: "keywords" in entry && Array.isArray(entry.keywords) ? [...entry.keywords] : [],
22259
+ visualWeight: "visualWeight" in entry && typeof entry.visualWeight === "string" ? entry.visualWeight : "medium",
21515
22260
  props: entry.props
21516
22261
  }))
21517
22262
  );
@@ -21898,33 +22643,182 @@ var cssVariableCategories = [
21898
22643
  var patterns = [
21899
22644
  {
21900
22645
  name: "Dashboard with sidebar",
21901
- description: "Admin dashboard with collapsible sidebar navigation and data content area.",
21902
- components: ["DashboardShell", "StandardDataTable"],
21903
- example: '<DashboardShell navigation={sections}>\n <StandardDataTable title="Users" data={rows} />\n</DashboardShell>'
22646
+ description: "Admin dashboard with collapsible sidebar navigation and data content area. Composition rhythm: light KPI summary row at top (~100px, quick status scan), medium chart widgets in the middle (~300px, trend analysis), heavy data table at bottom (~400px+, detailed drill-down). This top-down density progression mirrors how users scan dashboards: overview first, then details.",
22647
+ components: ["DashboardShell", "MetricCardsRow", "TwoColumnWidgets", "LineChartWidget", "DonutChartWidget", "StandardDataTable"],
22648
+ example: '<DashboardShell navigation={sections}>\n <ContentDropzone>\n <MetricCardsRow metrics={kpis} columns={4} />\n <TwoColumnWidgets>\n <LineChartWidget label="Revenue" value="$12,345" />\n <DonutChartWidget label="Categories" value="100%" />\n </TwoColumnWidgets>\n <StandardDataTable title="Recent Orders" data={rows} />\n </ContentDropzone>\n</DashboardShell>'
21904
22649
  },
21905
22650
  {
21906
22651
  name: "Settings page",
21907
- description: "Account settings with tabbed sidebar navigation, profile editing, and list rows.",
22652
+ description: "Account settings with tabbed sidebar navigation, profile editing, and list rows. Light visual weight throughout \u2014 settings pages are scanned vertically through uniform rows, so consistency matters more than visual variety here.",
21908
22653
  components: ["AccountSettingsShell", "SettingsListRow", "ProfileImageUploader"],
21909
22654
  example: '<AccountSettingsShell activeTab="profile">\n <ProfileImageUploader />\n <SettingsListRow label="Name" value="John" onEdit={...} />\n</AccountSettingsShell>'
21910
22655
  },
21911
22656
  {
21912
22657
  name: "Marketing landing",
21913
- description: "Marketing landing page with header, hero section, content blocks, and footer.",
21914
- components: ["Header", "HeroSection", "DestinationCards", "TestimonialCarousel", "FooterNavbar"],
21915
- example: '<>\n <Header />\n <HeroSection title="..." />\n <DestinationCards />\n <TestimonialCarousel />\n <FooterNavbar />\n</>'
22658
+ description: "Marketing landing page with clear visual rhythm. Opens with spacious hero (focal point, ~400px tall) \u2192 flows to medium-weight card grid (browsable content, ~350px) \u2192 light testimonials (social proof, ~250px) \u2192 compact CTA + footer (clear close, ~300px combined). The alternating density (spacious \u2192 medium \u2192 light \u2192 compact) creates natural scanning rhythm. Each section serves a distinct purpose in the conversion funnel.",
22659
+ components: ["Header", "HeroSection", "DestinationCards", "TestimonialCarousel", "CtaBanner", "FooterNavbar"],
22660
+ example: '<>\n <Header />\n <HeroSection title="..." />\n <DestinationCards />\n <TestimonialCarousel />\n <CtaBanner title="..." buttonText="Get Started" />\n <FooterNavbar />\n</>'
21916
22661
  },
21917
22662
  {
21918
22663
  name: "Multi-step wizard",
21919
- description: "Multi-step form flow with step tracker and navigation buttons.",
22664
+ description: "Multi-step form flow with step tracker and navigation buttons. Light visual weight \u2014 the step tracker provides orientation (~60px) and the form content area is the single focus (~400px). Avoid adding sidebars or secondary content that competes with the form.",
21920
22665
  components: ["MultistepShell", "StepTracker", "FormGroup"],
21921
22666
  example: '<MultistepShell steps={steps} currentStep={1}>\n <FormGroup title="Step 1" rows={formRows} />\n</MultistepShell>'
21922
22667
  },
21923
22668
  {
21924
22669
  name: "Messaging app",
21925
- description: "Chat interface with thread sidebar, message bubbles, and input area.",
22670
+ description: "Chat interface with thread sidebar, message bubbles, and input area. Two-column layout: sidebar (~320px, medium density thread list) and conversation area (fills remaining width, variable density based on messages). The sidebar provides context while the conversation area is the primary focus.",
21926
22671
  components: ["MessengerSidebar", "ChatBubble", "ChatDateSeparator", "MessengerInput"],
21927
22672
  example: '<div className="flex">\n <MessengerSidebar onSelectThread={...} />\n <div>\n <ChatDateSeparator date="Jan 25, 2024" />\n <ChatBubble message={msg} />\n <MessengerInput onSend={...} />\n </div>\n</div>'
22673
+ },
22674
+ {
22675
+ name: "Default page templates",
22676
+ description: "Canvas base templates for common app pages. Use these by default unless the user specifies a different template or provides a reference design that significantly differs. Account settings \u2192 page-account, Admin portal \u2192 page-admin-portal, Login \u2192 page-login, Signup \u2192 page-login (adjust form fields), Password reset \u2192 page-reset-password.",
22677
+ components: [
22678
+ "AccountSettingsShell",
22679
+ "DashboardShell",
22680
+ "LoginBrandingPanel"
22681
+ ],
22682
+ example: '// Account settings\n<AccountSettingsShell activeTab="profile">...</AccountSettingsShell>\n\n// Admin portal\n<DashboardShell navigation={sections}>...</DashboardShell>\n\n// Login / Signup\n<LoginBrandingPanel>...</LoginBrandingPanel>'
22683
+ },
22684
+ {
22685
+ name: "Displaying stats & metrics",
22686
+ description: "When showing numeric stats (followers, ratings, revenue, etc.), always use an SDK component rather than hand-rolling number displays. Choose based on context: StatsCard for profile/sidebar stats in a bordered card, MetricCardsRow for dashboard KPIs with change indicators, MetricsSection for marketing pages with large hero numbers. If the exact layout doesn't match, import the closest component and customize \u2014 they encode typography scale, alignment, spacing, dividers, and responsive behavior that's hard to get right manually.",
22687
+ components: ["StatsCard", "MetricCardsRow", "MetricsSection", "ProfileCard"],
22688
+ example: '// Profile sidebar stats (bordered card)\n<StatsCard stats={[\n { value: "24", label: "Listings" },\n { value: "4.96", label: "Rating" },\n { value: "342", label: "Reviews" },\n]} />\n\n// Dashboard KPIs (with change indicators)\n<MetricCardsRow metrics={[\n { label: "Revenue", value: "$12,345", change: { value: "+12%", direction: "up" } },\n { label: "Users", value: "1,234", change: { value: "+5%", direction: "up" } },\n]} columns={4} />\n\n// Marketing hero stats (large numbers with borders)\n<MetricsSection metrics={[\n { value: "1,200+", label: "Team members" },\n { value: "$22M", label: "In total funding" },\n]} />'
22689
+ },
22690
+ {
22691
+ name: "Content page balance",
22692
+ description: "Content and detail pages alternate between spacious visual sections and dense informational sections. Typical rhythm: banner/hero (spacious, ~200px) \u2192 profile or header info (medium, ~300px) \u2192 tabbed content or data (heavy, ~500px) \u2192 related items or cards (medium, ~300px). Break up heavy sections with TitleGroup headers to create scannable landmarks. Use ContentDropzone to enforce consistent 32px gaps between blocks.",
22693
+ components: ["FlairBanner", "ProfileCard", "PillTabs", "StandardDataTable", "TitleGroup", "ContentDropzone"],
22694
+ example: '<StandardPageShell showBanner bannerTitle="Explore">\n <ContentDropzone>\n {/* Spacious: banner + header */}\n <ProfileCard name="Jane Doe" ... />\n {/* Heavy: main content with scannable landmark */}\n <div className="flex flex-col gap-[var(--spacing-lg)]">\n <TitleGroup title="Activity" />\n <ActivityFeed items={activities} />\n </div>\n {/* Medium: secondary content */}\n <div className="flex flex-col gap-[var(--spacing-lg)]">\n <TitleGroup title="Reviews" />\n <ReviewsTable reviews={reviews} />\n </div>\n </ContentDropzone>\n</StandardPageShell>'
22695
+ },
22696
+ {
22697
+ name: "Product/listing detail page",
22698
+ description: "Detail pages use a two-column layout with visual content on top and structured info below. Typical rhythm: full-width image gallery (spacious, ~400px) \u2192 two-column layout with main content left (heavy, descriptions/reviews) and sidebar right (medium, reservation card/order summary ~300px). The gallery establishes visual context, then the two-column split provides scannable details alongside a persistent action area.",
22699
+ components: ["Header", "TileImageGallery", "ContentDropzone", "ReservationCard", "OrderSummarySidebar", "BottomActionBar"],
22700
+ example: '<>\n <Header />\n <TileImageGallery images={images} />\n <div className="flex gap-[var(--spacing-4xl)] max-w-[1240px] mx-auto">\n <div className="flex-1">\n <ContentDropzone>\n {/* Main content blocks */}\n </ContentDropzone>\n </div>\n <div className="w-[380px]">\n <ReservationCard />\n </div>\n </div>\n</>'
22701
+ }
22702
+ ];
22703
+
22704
+ // src/data/design-rules.ts
22705
+ var designRules = [
22706
+ {
22707
+ id: "stats-numbers",
22708
+ trigger: ["stat", "stats", "number", "count", "metric", "kpi", "followers", "rating", "reviews", "listings", "response rate"],
22709
+ warning: "Large numbers displayed in a bare flex row without a card container, dividers, or visual structure look unpolished. Raw inline styles for font sizes bypass the typography token system.",
22710
+ recommendation: "Use an SDK stat/metric component instead of hand-rolling number displays. Choose based on context: StatsCard for profile or sidebar stats in a bordered card, MetricCardsRow for dashboard KPIs with change indicators (up/down arrows), MetricsSection for marketing pages with large hero numbers and left-border separators.",
22711
+ components: ["StatsCard", "MetricCardsRow", "MetricsSection", "ProfileCard"],
22712
+ modificationHint: "StatsCard wraps content in a bordered card \u2014 pass className to override border/background if embedding stats inside an existing card. MetricCardsRow supports 2-4 columns and stacks responsively. MetricsSection uses h1-scale typography automatically."
22713
+ },
22714
+ {
22715
+ id: "profile-page",
22716
+ trigger: ["profile", "user profile", "host profile", "author", "member"],
22717
+ warning: "Building profile layouts from scratch often results in misaligned avatars, inconsistent stat displays, and missing responsive behavior.",
22718
+ recommendation: "Use ProfileCard for a complete profile layout with avatar, stats row, bio, tags, and social links. Use StatsCard for a standalone stats row. Use GradientBanner or FlairBanner for profile header banners.",
22719
+ components: ["ProfileCard", "StatsCard", "GradientBanner", "FlairBanner", "ProfileImageUploader", "SidebarProfileCard"],
22720
+ modificationHint: "ProfileCard includes a built-in stats row \u2014 if you only need stats, extract the StatsCard instead. SidebarProfileCard is a compact variant for sidebar placement."
22721
+ },
22722
+ {
22723
+ id: "dashboard-metrics",
22724
+ trigger: ["dashboard", "admin", "analytics", "revenue", "overview", "kpi"],
22725
+ warning: "Dashboard metric displays need consistent card containers, change indicators, and responsive grid behavior that's difficult to achieve with ad-hoc layouts.",
22726
+ recommendation: "Use MetricCardsRow for the KPI summary row at the top of dashboards. Pair with LineChartWidget, DonutChartWidget, MetricListCard, or ProgressMetricCard for detailed metric views. Use TwoColumnWidgets to arrange widget pairs side by side.",
22727
+ components: ["MetricCardsRow", "MetricCard", "LineChartWidget", "DonutChartWidget", "MetricListCard", "ProgressMetricCard", "TwoColumnWidgets", "DashboardHeader"],
22728
+ modificationHint: "MetricCardsRow supports 2, 3, or 4 columns via the columns prop. All chart widgets update colors automatically from CSS variables. Use GraphMetricTilesDemo as a complete reference layout."
22729
+ },
22730
+ {
22731
+ id: "reviews-ratings",
22732
+ trigger: ["review", "reviews", "rating", "ratings", "testimonial", "feedback", "star", "guest reviews", "customer reviews"],
22733
+ warning: "Hand-rolled review layouts often miss consistent star rendering, proper avatar alignment, or expandable text behavior.",
22734
+ recommendation: "Use ReviewsTable for a sortable/filterable list of user reviews with star ratings and expandable text. Use TestimonialCarousel for a rotating display of highlighted testimonials on marketing pages.",
22735
+ components: ["ReviewsTable", "TestimonialCarousel"],
22736
+ modificationHint: "ReviewsTable expects `reviewText` (not `text`) and `avatarUrl` (not `avatar`). Map your data accordingly. Pass `sortOptions={[]}` and empty `actionButtonText` to hide controls for display-only contexts. Star ratings use --canvas-primary color automatically."
22737
+ },
22738
+ {
22739
+ id: "data-tables",
22740
+ trigger: ["table", "list", "directory", "inventory", "orders", "users"],
22741
+ warning: "Building tables from scratch misses sortable columns, responsive behavior, avatar-enhanced rows, and row action menus.",
22742
+ recommendation: "Use StandardDataTable for typical data displays. Use FixedColumnDataTable when the first column needs to stay visible during horizontal scroll. Use NestedDataTable for hierarchical data.",
22743
+ components: ["StandardDataTable", "FixedColumnDataTable", "NestedDataTable", "Pagination"],
22744
+ modificationHint: "All data tables include header with result count, sort/filter dropdowns, and primary action button. Pass appropriate sortOptions and filterOptions arrays."
22745
+ },
22746
+ {
22747
+ id: "typography-inline",
22748
+ trigger: ["font", "fontsize", "fontweight", "text", "heading", "title", "label"],
22749
+ warning: "Using raw fontSize/fontWeight/fontFamily inline styles bypasses the design token system and creates inconsistent text rendering across themes.",
22750
+ recommendation: "Use the Typography component with variant prop (h1-h6, body-xl, body-l, body-m, body-s, body-xs) instead of inline style objects. Typography automatically applies the correct font family, size, weight, and line height from design tokens.",
22751
+ components: ["Typography"],
22752
+ modificationHint: "Typography supports as prop for semantic HTML elements (e.g., as='h1', as='span') and color prop ('default' | 'muted'). Combine with className for additional Tailwind utilities."
22753
+ },
22754
+ {
22755
+ id: "forms",
22756
+ trigger: ["form", "input", "settings", "edit", "create", "signup", "register"],
22757
+ warning: "Hand-rolling form layouts misses consistent field sizing, label alignment, validation states, and responsive stacking.",
22758
+ recommendation: "Use FormGroup for structured form layouts with configurable field types (text, textarea, select, date, checkbox, radio, multiselect, slider, file upload). Use SettingsListRow for read/edit settings displays.",
22759
+ components: ["FormGroup", "SettingsListRow", "ProfileImageUploader"],
22760
+ modificationHint: "FormGroup supports inputSize prop ('sm' | 'default' | 'lg') for consistent field heights. Pass showHeader/showFooter=false to hide the built-in header or footer."
22761
+ },
22762
+ {
22763
+ id: "navigation-layout",
22764
+ trigger: ["nav", "navigation", "sidebar", "menu", "tabs"],
22765
+ warning: "Building navigation from scratch often results in inconsistent hover states, missing mobile responsive behavior, and accessibility issues.",
22766
+ recommendation: "Use a layout shell (DashboardShell, IconSidebarShell, AccountSettingsShell) for page-level navigation. Use PillTabs or PageHeaderSection for content-level tab navigation. Use MobileBottomNav for mobile app-style navigation.",
22767
+ components: ["DashboardShell", "IconSidebarShell", "AccountSettingsShell", "PillTabs", "PageHeaderSection", "MobileBottomNav", "Header"]
22768
+ },
22769
+ {
22770
+ id: "image-gallery",
22771
+ trigger: ["gallery", "images", "photos", "listing", "property", "product images", "hero image"],
22772
+ warning: "Building image galleries from scratch misses proper aspect ratio handling, responsive grid behavior, and view-all overlay controls. Leaving image props empty results in broken or generic placeholders.",
22773
+ recommendation: "Use TileImageGallery for hero gallery layouts (1 large + 4 grid). Always pass custom images via the images prop that match the content context.",
22774
+ components: ["TileImageGallery", "SlideshowGridTiles", "LoginBrandingPanel"],
22775
+ modificationHint: "TileImageGallery accepts { id, src, alt }[]. First image is the hero (57% width), next 4 fill a 2x2 grid. Use Unsplash with w/h/fit=crop params for optimal loading."
22776
+ },
22777
+ {
22778
+ id: "login-branding",
22779
+ trigger: ["login", "signup", "sign in", "authentication", "branding panel"],
22780
+ warning: "LoginBrandingPanel defaults to /brand-assets/bg.jpg which may not exist in consumer projects, resulting in a blank panel.",
22781
+ recommendation: "Always pass a backgroundImage prop to LoginBrandingPanel with a relevant image. Choose an image that matches the app's domain.",
22782
+ components: ["LoginBrandingPanel"],
22783
+ modificationHint: "Use overlayOpacity prop (0-1, default 0.7) to control how much the flair color tints the image. Lower values show more of the image."
22784
+ },
22785
+ {
22786
+ id: "data-display-format",
22787
+ trigger: ["listings", "products", "portfolio", "properties", "catalog", "grid", "tiles", "cards grid"],
22788
+ warning: "Using StandardDataTable for visual content (properties, products) squeezes images into small row avatars. This wastes the visual impact of the content.",
22789
+ recommendation: "Use GridTilesList when items have prominent images (property photos, product images, portfolio pieces). Use StandardDataTable for text-heavy data (user lists, transactions, logs). The tile format with large images is always more appropriate for visual catalogs.",
22790
+ components: ["GridTilesList", "StandardDataTable", "FixedColumnDataTable"],
22791
+ modificationHint: "GridTilesList supports 2-5 columns via the columns prop. Items need { id, imageUrl, title, rating, location, price, priceUnit?, tag? }. Use columns={3} for dashboard contexts with sidebars."
22792
+ },
22793
+ {
22794
+ id: "layout-rhythm",
22795
+ trigger: ["page", "layout", "compose", "build page", "mockup", "template", "full page"],
22796
+ warning: "Stacking multiple heavy blocks (data tables, feeds, large forms, galleries) without visual breaks creates a wall of content that's hard to scan. Users lose their place and the page feels overwhelming.",
22797
+ recommendation: "Vary visual weight across the page: alternate heavy blocks (data tables, feeds, forms) with lighter elements (MetricCardsRow, PillTabs, TitleGroup section headers) or spacer elements (FlairBanner, GradientBanner). A good rhythm is: light \u2192 heavy \u2192 light \u2192 heavy. Use ContentDropzone to enforce consistent 32px gaps between blocks.",
22798
+ components: ["ContentDropzone", "TitleGroup", "FlairBanner", "GradientBanner", "MetricCardsRow", "PillTabs"],
22799
+ modificationHint: "ContentDropzone handles inter-block spacing (32px) automatically. For extra breathing room between major sections, wrap groups of related blocks together as single ContentDropzone children. TitleGroup adds scannable section landmarks between heavy content."
22800
+ },
22801
+ {
22802
+ id: "above-the-fold",
22803
+ trigger: ["landing", "homepage", "marketing", "hero", "landing page", "home page"],
22804
+ warning: "The first ~600px of a page (above the fold) should establish clear visual hierarchy with one dominant focal point. Starting with dense data blocks or multiple competing elements makes the page feel cluttered and unclear.",
22805
+ recommendation: "Start with a spacer-weight element (HeroSection, HeroDarkWithImage, FlairBanner, GradientBanner) that establishes a clear focal point, followed by a light-to-medium block. Save heavy blocks (data tables, feeds) for below the fold where users scroll intentionally.",
22806
+ components: ["HeroSection", "HeroDarkWithImage", "HeroDarkCentered", "HeroFullwidthImage", "FlairBanner", "GradientBanner", "CenteredHero"]
22807
+ },
22808
+ {
22809
+ id: "page-ending",
22810
+ trigger: ["footer", "page end", "bottom", "cta", "call to action", "complete page"],
22811
+ warning: "Pages that end abruptly after a heavy content block (data table, feed, form) feel incomplete and unprofessional. Users need a clear signal that they've reached the end of content.",
22812
+ recommendation: "End marketing pages with CtaBanner \u2192 FooterNavbar. End app pages with Pagination below data tables or a clear content boundary. Don't end a page with a data table or feed that just cuts off.",
22813
+ components: ["CtaBanner", "FooterNavbar", "Pagination"]
22814
+ },
22815
+ {
22816
+ id: "visual-monotony",
22817
+ trigger: ["cards", "grid", "multiple sections", "several blocks", "many sections", "content sections"],
22818
+ warning: "Using the same component type repeatedly (e.g., three card grids in a row, or multiple same-sized sections) creates visual monotony even if the content differs. The page looks repetitive and lacks scanning landmarks.",
22819
+ recommendation: "Mix component shapes: alternate card grids with text sections, image-heavy blocks with data-focused blocks. Use different column counts (3-col cards \u2192 full-width feature \u2192 4-col grid) to vary visual texture. Insert FeatureWithImage sections between card grids to break up the pattern.",
22820
+ components: ["GridTilesList", "FeatureWithImage", "ContentWithImage", "BlogCards", "GallerySection"],
22821
+ modificationHint: "FeatureWithImage supports imagePosition='left'|'right' \u2014 alternate between left and right for visual variety when stacking multiple feature sections."
21928
22822
  }
21929
22823
  ];
21930
22824
 
@@ -22133,7 +23027,7 @@ server.tool(
22133
23027
  );
22134
23028
  server.tool(
22135
23029
  "get_component",
22136
- "Returns detailed info for a single component by name, including import path, description, and props.",
23030
+ "Returns detailed info for a single component by name, including import path, description, props, visual weight, and keywords.",
22137
23031
  { name: external_exports.string().describe("Component name (case-insensitive)") },
22138
23032
  async ({ name }) => {
22139
23033
  const comp = componentsByName.get(name.toLowerCase());
@@ -22145,6 +23039,8 @@ server.tool(
22145
23039
  `**Category:** ${comp.category}`,
22146
23040
  `**Import:** \`import { ${comp.name} } from "${comp.path}"\``,
22147
23041
  `**Description:** ${comp.description}`,
23042
+ `**Visual Weight:** ${comp.visualWeight}`,
23043
+ ...comp.keywords.length ? [`**Keywords:** ${comp.keywords.join(", ")}`] : [],
22148
23044
  "",
22149
23045
  "**Props:**",
22150
23046
  ...comp.props.map((p) => `- \`${p}\``)
@@ -22152,6 +23048,38 @@ server.tool(
22152
23048
  return { content: [{ type: "text", text }] };
22153
23049
  }
22154
23050
  );
23051
+ server.tool(
23052
+ "suggest_component",
23053
+ "Suggests up to 5 components matching a natural language query. Searches component names, descriptions, and keywords. Use when you know what you need but not the component name.",
23054
+ { query: external_exports.string().describe("What you're looking for (e.g., 'audit log', 'confirmation dialog', 'stat cards')") },
23055
+ async ({ query }) => {
23056
+ const queryWords = query.toLowerCase().split(/\s+/);
23057
+ const scored = allComponents.map((c) => {
23058
+ const haystack = [c.name, c.description, ...c.keywords].join(" ").toLowerCase();
23059
+ let score = 0;
23060
+ for (const kw of queryWords) {
23061
+ if (haystack.includes(kw)) score += 1;
23062
+ if (c.name.toLowerCase().includes(kw)) score += 2;
23063
+ if (c.keywords.some((k) => k.includes(kw))) score += 1;
23064
+ }
23065
+ return { component: c, score };
23066
+ });
23067
+ const top = scored.filter((s) => s.score > 0).sort((a, b) => b.score - a.score).slice(0, 5);
23068
+ if (top.length === 0) {
23069
+ return { content: [{ type: "text", text: "No matching components found. Try different terms or use list_components to browse all components." }] };
23070
+ }
23071
+ const lines = top.map(
23072
+ ({ component: c, score }) => [
23073
+ `## ${c.name} (${c.category})`,
23074
+ `**Import:** \`import { ${c.name} } from "${c.path}"\``,
23075
+ `**Visual Weight:** ${c.visualWeight}`,
23076
+ `**Description:** ${c.description}`,
23077
+ ""
23078
+ ].join("\n")
23079
+ );
23080
+ return { content: [{ type: "text", text: lines.join("\n") }] };
23081
+ }
23082
+ );
22155
23083
  server.tool(
22156
23084
  "suggest_template",
22157
23085
  "Suggests up to 3 page templates matching a description. Uses keyword matching against template names, descriptions, shells, and blocks.",
@@ -22194,7 +23122,7 @@ server.tool(
22194
23122
  );
22195
23123
  server.tool(
22196
23124
  "list_patterns",
22197
- "Lists common usage patterns showing how to combine components for typical app layouts.",
23125
+ "Lists common usage patterns showing how to combine components for typical app layouts. Includes spatial composition guidance.",
22198
23126
  {},
22199
23127
  async () => {
22200
23128
  const lines = patterns.map(
@@ -22263,5 +23191,123 @@ server.tool(
22263
23191
  return { content: [{ type: "text", text }] };
22264
23192
  }
22265
23193
  );
23194
+ server.tool(
23195
+ "review_design",
23196
+ "Reviews a page or component layout description for common anti-patterns and suggests SDK components. Optionally validates composition by checking the visual weight sequence of an ordered block list. Use before finalizing layouts to catch issues like uncontained numbers, missing visual hierarchy, poor composition rhythm, or hand-rolled patterns that have SDK equivalents.",
23197
+ {
23198
+ description: external_exports.string().describe("Description of what you're building (e.g., 'profile page with user stats showing 24 listings, 4.96 rating')"),
23199
+ blockSequence: external_exports.array(external_exports.string()).optional().describe("Ordered list of block component names top-to-bottom for composition review (e.g., ['HeroSection', 'DestinationCards', 'CtaBanner', 'FooterNavbar'])")
23200
+ },
23201
+ async ({ description, blockSequence }) => {
23202
+ const lower = description.toLowerCase();
23203
+ const matches = designRules.filter(
23204
+ (rule) => rule.trigger.some((kw) => lower.includes(kw))
23205
+ );
23206
+ const resultSections = [];
23207
+ if (matches.length > 0) {
23208
+ const ruleSections = matches.map(
23209
+ (rule) => [
23210
+ `## ${rule.id}`,
23211
+ "",
23212
+ `**Warning:** ${rule.warning}`,
23213
+ "",
23214
+ `**Recommendation:** ${rule.recommendation}`,
23215
+ "",
23216
+ `**Components:** ${rule.components.join(", ")}`,
23217
+ ...rule.modificationHint ? ["", `**Customization tip:** ${rule.modificationHint}`] : [],
23218
+ ""
23219
+ ].join("\n")
23220
+ );
23221
+ resultSections.push(...ruleSections);
23222
+ }
23223
+ if (blockSequence && blockSequence.length > 0) {
23224
+ const compositionIssues = [];
23225
+ const weights = blockSequence.map((name) => {
23226
+ const comp = componentsByName.get(name.toLowerCase());
23227
+ return {
23228
+ name,
23229
+ weight: comp?.visualWeight ?? "medium"
23230
+ };
23231
+ });
23232
+ for (let i = 0; i < weights.length - 1; i++) {
23233
+ if (weights[i].weight === "heavy" && weights[i + 1].weight === "heavy") {
23234
+ compositionIssues.push(
23235
+ `Adjacent heavy blocks: **${weights[i].name}** \u2192 **${weights[i + 1].name}**. Consider inserting a light element (TitleGroup, MetricCardsRow, PillTabs) or spacer (FlairBanner, GradientBanner) between them for visual breathing room.`
23236
+ );
23237
+ }
23238
+ }
23239
+ if (weights.length > 0 && weights[0].weight === "heavy") {
23240
+ compositionIssues.push(
23241
+ `Page opens with heavy block **${weights[0].name}**. Consider starting with a spacer (HeroSection, FlairBanner) or light element (MetricCardsRow, PageHeaderSection) to establish a clear focal point above the fold.`
23242
+ );
23243
+ }
23244
+ if (weights.length > 0) {
23245
+ const last = weights[weights.length - 1];
23246
+ if (last.weight === "heavy") {
23247
+ compositionIssues.push(
23248
+ `Page ends with heavy block **${last.name}**. Consider adding a clear closing element: Pagination below data tables, CtaBanner \u2192 FooterNavbar for marketing pages, or a light summary section.`
23249
+ );
23250
+ }
23251
+ }
23252
+ for (let i = 0; i < weights.length - 2; i++) {
23253
+ if (weights[i].weight === weights[i + 1].weight && weights[i + 1].weight === weights[i + 2].weight && weights[i].weight !== "light") {
23254
+ compositionIssues.push(
23255
+ `Visual monotony: 3 consecutive ${weights[i].weight}-weight blocks (${weights[i].name} \u2192 ${weights[i + 1].name} \u2192 ${weights[i + 2].name}). Vary visual weight to create scanning rhythm.`
23256
+ );
23257
+ }
23258
+ }
23259
+ const heavyCount = weights.filter((w) => w.weight === "heavy").length;
23260
+ if (weights.length >= 4 && heavyCount / weights.length > 0.6) {
23261
+ compositionIssues.push(
23262
+ `Overall density is high: ${heavyCount} of ${weights.length} blocks are heavy-weight. Consider replacing some with lighter alternatives or adding spacer/light elements to improve scannability.`
23263
+ );
23264
+ }
23265
+ const weightSummary = weights.map((w) => `${w.name} (${w.weight})`).join(" \u2192 ");
23266
+ if (compositionIssues.length > 0) {
23267
+ resultSections.push(
23268
+ [
23269
+ "## Composition Review",
23270
+ "",
23271
+ `**Block sequence:** ${weightSummary}`,
23272
+ "",
23273
+ `Found ${compositionIssues.length} composition issue(s):`,
23274
+ "",
23275
+ ...compositionIssues.map((issue2, i) => `${i + 1}. ${issue2}`),
23276
+ ""
23277
+ ].join("\n")
23278
+ );
23279
+ } else {
23280
+ resultSections.push(
23281
+ [
23282
+ "## Composition Review",
23283
+ "",
23284
+ `**Block sequence:** ${weightSummary}`,
23285
+ "",
23286
+ "Composition looks balanced. The visual weight progression creates good scanning rhythm.",
23287
+ ""
23288
+ ].join("\n")
23289
+ );
23290
+ }
23291
+ }
23292
+ if (resultSections.length === 0) {
23293
+ return {
23294
+ content: [{
23295
+ type: "text",
23296
+ text: "No specific design guidance found for this description. General tips:\n- Use SDK components instead of hand-rolling common patterns\n- Use the Typography component instead of inline font styles\n- Wrap numeric displays in card containers with proper visual structure\n- Check list_components for available components before building custom layouts\n- Vary visual weight across the page (light \u2192 heavy \u2192 light) for good scanning rhythm"
23297
+ }]
23298
+ };
23299
+ }
23300
+ return {
23301
+ content: [{
23302
+ type: "text",
23303
+ text: `# Design Review
23304
+
23305
+ Found ${resultSections.length} guideline(s) for your layout:
23306
+
23307
+ ${resultSections.join("\n---\n\n")}`
23308
+ }]
23309
+ };
23310
+ }
23311
+ );
22266
23312
  var transport = new StdioServerTransport();
22267
23313
  await server.connect(transport);