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.
- package/README.md +25 -5
- package/dist/charts.js +11 -6
- package/dist/charts.js.map +1 -1
- package/dist/index.d.ts +1233 -153
- package/dist/index.js +3562 -447
- package/dist/index.js.map +1 -1
- package/mcp/dist/index.js +1195 -149
- package/package.json +1 -1
- package/prompts/.cursorrules +96 -0
- package/prompts/.windsurfrules +96 -0
- package/prompts/CLAUDE.md +22 -0
- package/prompts/copilot-instructions.md +96 -0
- package/registry/blocks/activity-feed.json +12 -1
- package/registry/blocks/blog-cards.json +10 -2
- package/registry/blocks/bottom-action-bar.json +27 -0
- package/registry/blocks/bottom-input-chat-widget.json +9 -1
- package/registry/blocks/category-grid.json +10 -2
- package/registry/blocks/centered-hero.json +9 -1
- package/registry/blocks/chat-message.json +8 -1
- package/registry/blocks/circular-progress-bar-list.json +11 -1
- package/registry/blocks/confirmation-popup.json +10 -1
- package/registry/blocks/contact-form-popup.json +10 -1
- package/registry/blocks/content-dropzone.json +8 -0
- package/registry/blocks/content-with-image.json +9 -1
- package/registry/blocks/core-values-grid.json +10 -2
- package/registry/blocks/credit-card-display.json +9 -1
- package/registry/blocks/cta-banner.json +10 -2
- package/registry/blocks/destination-cards.json +10 -1
- package/registry/blocks/detail-drawer.json +10 -1
- package/registry/blocks/details-popup.json +10 -1
- package/registry/blocks/editable-list.json +29 -0
- package/registry/blocks/empty-state.json +10 -2
- package/registry/blocks/faq-accordion.json +9 -1
- package/registry/blocks/faqs-table.json +10 -1
- package/registry/blocks/feature-with-image.json +9 -1
- package/registry/blocks/featured-news-cards.json +10 -2
- package/registry/blocks/featured-places.json +10 -2
- package/registry/blocks/features-comparison.json +9 -1
- package/registry/blocks/feedback-popup.json +9 -1
- package/registry/blocks/filter-popover.json +8 -1
- package/registry/blocks/fixed-column-data-table.json +11 -1
- package/registry/blocks/flair-banner.json +9 -1
- package/registry/blocks/footer-navbar.json +9 -1
- package/registry/blocks/form-group.json +14 -3
- package/registry/blocks/form-popup.json +31 -0
- package/registry/blocks/gallery-section.json +10 -2
- package/registry/blocks/gradient-banner.json +10 -2
- package/registry/blocks/graph-metric-tiles.json +1 -1
- package/registry/blocks/grid-tiles-list.json +10 -1
- package/registry/blocks/hero-dark-centered.json +9 -1
- package/registry/blocks/hero-dark-with-image.json +9 -1
- package/registry/blocks/hero-fullwidth-image.json +9 -1
- package/registry/blocks/hero-section.json +9 -1
- package/registry/blocks/how-it-works.json +9 -1
- package/registry/blocks/image-feed-with-nested-comments.json +10 -1
- package/registry/blocks/image-popup.json +10 -1
- package/registry/blocks/invoice-popup.json +10 -1
- package/registry/blocks/large-image-labels-list.json +10 -1
- package/registry/blocks/list-popup.json +28 -0
- package/registry/blocks/loader.json +9 -1
- package/registry/blocks/login-branding-panel.json +10 -2
- package/registry/blocks/menu-section.json +9 -1
- package/registry/blocks/menufocus-template.json +9 -1
- package/registry/blocks/messenger-sidebar.json +11 -2
- package/registry/blocks/metrics-section.json +10 -2
- package/registry/blocks/mobile-bottom-nav.json +10 -2
- package/registry/blocks/monthly-calendar-widget.json +9 -1
- package/registry/blocks/multistep-form-popup.json +34 -0
- package/registry/blocks/nested-comments-table.json +9 -1
- package/registry/blocks/nested-data-table.json +10 -1
- package/registry/blocks/nps-survey-popup.json +27 -0
- package/registry/blocks/office-locations.json +10 -2
- package/registry/blocks/order-summary-sidebar.json +27 -0
- package/registry/blocks/page-header-section.json +9 -1
- package/registry/blocks/pagination.json +8 -1
- package/registry/blocks/participant-list.json +9 -1
- package/registry/blocks/persona-card.json +10 -1
- package/registry/blocks/personalize-feed-popup.json +27 -0
- package/registry/blocks/pill-tabs.json +9 -1
- package/registry/blocks/place-detail-panel.json +11 -1
- package/registry/blocks/pricing-cards.json +10 -2
- package/registry/blocks/pricing-cta.json +9 -1
- package/registry/blocks/pricing-plans-popup.json +10 -1
- package/registry/blocks/profile-card.json +12 -2
- package/registry/blocks/profile-grid-tiles-list.json +10 -1
- package/registry/blocks/profile-image-uploader.json +9 -1
- package/registry/blocks/profile-info-cards.json +10 -1
- package/registry/blocks/progress-bar.json +8 -1
- package/registry/blocks/prompt-template.json +1 -1
- package/registry/blocks/purchase-confirmation-popup.json +10 -1
- package/registry/blocks/reservation-card.json +26 -0
- package/registry/blocks/reviews-grid.json +10 -2
- package/registry/blocks/reviews-table.json +10 -1
- package/registry/blocks/screen-prompt-template.json +1 -1
- package/registry/blocks/search-bar.json +9 -2
- package/registry/blocks/search-sidebar.json +9 -2
- package/registry/blocks/settings-list-row.json +9 -1
- package/registry/blocks/share-project-popup.json +36 -0
- package/registry/blocks/sidebar-cards.json +10 -2
- package/registry/blocks/sidebar-profile-card.json +10 -2
- package/registry/blocks/slideshow-grid-tiles.json +10 -2
- package/registry/blocks/slideshow-popup.json +10 -1
- package/registry/blocks/small-edit-popup.json +29 -0
- package/registry/blocks/social-feed.json +10 -1
- package/registry/blocks/social-proof.json +9 -1
- package/registry/blocks/standard-data-table.json +13 -1
- package/registry/blocks/standard-list-with-image.json +10 -1
- package/registry/blocks/step-tracker.json +9 -1
- package/registry/blocks/store-location-map.json +9 -1
- package/registry/blocks/team-cards-grid.json +9 -1
- package/registry/blocks/team-circular-grid.json +9 -1
- package/registry/blocks/terms-of-service-popup.json +10 -1
- package/registry/blocks/testimonial-carousel.json +10 -2
- package/registry/blocks/tile-image-gallery.json +26 -0
- package/registry/blocks/title-group.json +10 -1
- package/registry/blocks/upvoting-posts-table.json +10 -1
- package/registry/blocks/vertical-how-it-works.json +9 -1
- package/registry/blocks/vertical-step-tracker.json +9 -1
- package/registry/blocks/video-chat-controls.json +9 -1
- package/registry/blocks/video-content-section.json +9 -1
- package/registry/blocks/video-playlist.json +9 -1
- package/registry/blocks/video-popup.json +9 -1
- package/registry/blocks/view-profile-popup.json +10 -1
- package/registry/blocks/webcam-preview.json +9 -1
- package/registry/hooks/use-css-variable-sync.json +10 -1
- package/registry/hooks/use-mobile.json +9 -1
- package/registry/index.json +1526 -147
- package/registry/layout/account-settings-shell.json +10 -1
- package/registry/layout/dashboard-shell.json +12 -1
- package/registry/layout/double-sidebar-shell.json +11 -2
- package/registry/layout/double-sidebar.json +9 -1
- package/registry/layout/header.json +10 -1
- package/registry/layout/icon-sidebar-shell.json +9 -1
- package/registry/layout/icon-sidebar.json +9 -1
- package/registry/layout/mobile-menu-shell.json +10 -1
- package/registry/layout/multistep-progressbar-shell.json +9 -1
- package/registry/layout/multistep-shell.json +11 -1
- package/registry/layout/multistep-sidebar-shell.json +10 -2
- package/registry/layout/project-context-shell.json +1 -1
- package/registry/layout/search-bar-shell.json +8 -1
- package/registry/layout/sidebar-nav.json +7 -1
- package/registry/layout/sidebar.json +9 -2
- package/registry/layout/standard-page-shell.json +10 -1
- package/registry/layout/vertical-multistep-shell.json +10 -1
- package/registry/ui/avatar.json +9 -1
- package/registry/ui/button.json +9 -1
- package/registry/ui/calendar.json +9 -1
- package/registry/ui/checkbox.json +8 -1
- package/registry/ui/date-input.json +9 -1
- package/registry/ui/dialog.json +8 -1
- package/registry/ui/dropdown-menu.json +8 -1
- package/registry/ui/file-uploader.json +9 -1
- package/registry/ui/image-uploader.json +9 -1
- package/registry/ui/input.json +8 -1
- package/registry/ui/label.json +8 -1
- package/registry/ui/line-tabs.json +9 -1
- package/registry/ui/multiselect-checkbox-field.json +9 -1
- package/registry/ui/multiselect-tags.json +9 -1
- package/registry/ui/popover.json +8 -1
- package/registry/ui/radio-group.json +9 -1
- package/registry/ui/range-input.json +8 -1
- package/registry/ui/scroll-area.json +8 -1
- package/registry/ui/searchbox.json +9 -1
- package/registry/ui/select.json +9 -1
- package/registry/ui/selectable-pills.json +11 -1
- package/registry/ui/separator.json +8 -1
- package/registry/ui/sheet.json +9 -1
- package/registry/ui/sidebar.json +8 -1
- package/registry/ui/skeleton.json +8 -1
- package/registry/ui/slider.json +10 -2
- package/registry/ui/switch.json +9 -1
- package/registry/ui/tabs.json +8 -1
- package/registry/ui/text-input.json +8 -1
- package/registry/ui/textarea.json +9 -1
- package/registry/ui/tooltip.json +8 -1
- package/registry/ui/typography.json +9 -1
- 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: "
|
|
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: "
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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: "
|
|
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
|
|
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: "
|
|
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
|
|
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
|
|
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: "
|
|
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 (
|
|
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
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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
|
|
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: "
|
|
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).
|
|
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: "
|
|
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.
|
|
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
|
|
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,
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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
|
|
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
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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
|
|
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-
|
|
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: "
|
|
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
|
|
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
|
|
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: "
|
|
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
|
|
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: "
|
|
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: "
|
|
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
|
|
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: "
|
|
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
|
|
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,
|
|
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: "
|
|
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
|
|
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
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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: "
|
|
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: "
|
|
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
|
|
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
|
|
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: "
|
|
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
|
|
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
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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
|
|
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
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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,
|
|
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: "
|
|
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: "
|
|
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
|
|
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: "
|
|
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
|
|
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: "
|
|
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-
|
|
21444
|
-
path: "/page-
|
|
21445
|
-
description: "
|
|
21446
|
-
shell: "
|
|
21447
|
-
blocks: ["
|
|
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
|
|
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,
|
|
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="
|
|
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
|
|
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
|
|
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);
|