xertica-ui 2.2.1 → 2.4.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/CHANGELOG.md +564 -525
- package/README.md +417 -382
- package/bin/cli.ts +1244 -748
- package/bin/generate-tokens.ts +262 -262
- package/bin/language-config.ts +5 -8
- package/components/assets/xertica-orbe-animation.ts +1162 -1162
- package/components/assistant/code-block/CodeBlock.tsx +268 -268
- package/components/assistant/code-block/code-block.stories.tsx +57 -57
- package/components/assistant/code-block/code-block.test.tsx +44 -44
- package/components/assistant/code-block/index.ts +1 -1
- package/components/assistant/formatted-document/FormattedDocument.tsx +147 -147
- package/components/assistant/formatted-document/formatted-document.stories.tsx +51 -51
- package/components/assistant/formatted-document/formatted-document.test.tsx +42 -42
- package/components/assistant/formatted-document/index.ts +1 -1
- package/components/assistant/index.ts +6 -6
- package/components/assistant/markdown-message/MarkdownMessage.tsx +152 -152
- package/components/assistant/markdown-message/index.ts +1 -1
- package/components/assistant/markdown-message/markdown-message.stories.tsx +50 -50
- package/components/assistant/markdown-message/markdown-message.test.tsx +33 -33
- package/components/assistant/modern-chat-input/ModernChatInput.tsx +17 -7
- package/components/assistant/modern-chat-input/index.ts +1 -1
- package/components/assistant/modern-chat-input/modern-chat-input.stories.tsx +131 -131
- package/components/assistant/modern-chat-input/modern-chat-input.test.tsx +79 -79
- package/components/assistant/xertica-assistant/index.ts +3 -3
- package/components/assistant/xertica-assistant/parts/AssistantCollapsedView.tsx +99 -99
- package/components/assistant/xertica-assistant/parts/AssistantConversationList.tsx +104 -106
- package/components/assistant/xertica-assistant/parts/AssistantDocumentEditor.tsx +81 -81
- package/components/assistant/xertica-assistant/parts/AssistantFeedbackDialog.tsx +88 -78
- package/components/assistant/xertica-assistant/parts/AssistantHeader.tsx +75 -75
- package/components/assistant/xertica-assistant/parts/AssistantMessageBubble.tsx +564 -560
- package/components/assistant/xertica-assistant/parts/AssistantTabBar.tsx +67 -67
- package/components/assistant/xertica-assistant/parts/AssistantTypingIndicator.tsx +41 -41
- package/components/assistant/xertica-assistant/parts/AssistantWelcomeScreen.tsx +103 -103
- package/components/assistant/xertica-assistant/parts/index.ts +16 -16
- package/components/assistant/xertica-assistant/types.ts +134 -134
- package/components/assistant/xertica-assistant/use-assistant.ts +615 -615
- package/components/assistant/xertica-assistant/xertica-assistant.stories.tsx +407 -407
- package/components/assistant/xertica-assistant/xertica-assistant.test.tsx +65 -65
- package/components/assistant/xertica-assistant/xertica-assistant.tsx +611 -613
- package/components/blocks/card-patterns/ActivityCard.tsx +100 -100
- package/components/blocks/card-patterns/FeatureCard.tsx +109 -109
- package/components/blocks/card-patterns/FeatureCardSkeleton.tsx +1 -6
- package/components/blocks/card-patterns/NotificationCard.tsx +140 -140
- package/components/blocks/card-patterns/ProfileCard.tsx +112 -114
- package/components/blocks/card-patterns/ProjectCard.tsx +123 -123
- package/components/blocks/card-patterns/ProjectCardSkeleton.tsx +1 -6
- package/components/blocks/card-patterns/QuickActionCard.tsx +68 -68
- package/components/blocks/card-patterns/card-patterns.mdx +123 -123
- package/components/blocks/card-patterns/card-patterns.stories.tsx +594 -594
- package/components/blocks/card-patterns/index.ts +29 -29
- package/components/blocks/index.ts +1 -1
- package/components/brand/branding/branding.stories.tsx +57 -57
- package/components/brand/index.ts +6 -6
- package/components/brand/language-selector/index.ts +1 -1
- package/components/brand/language-selector/language-selector.mdx +126 -126
- package/components/brand/language-selector/language-selector.stories.tsx +1 -4
- package/components/brand/theme-toggle/ThemeToggle.tsx +74 -70
- package/components/brand/theme-toggle/index.ts +1 -1
- package/components/brand/theme-toggle/theme-toggle.stories.tsx +34 -34
- package/components/brand/theme-toggle/theme-toggle.test.tsx +34 -34
- package/components/brand/xertica-logo/XerticaLogo.stories.tsx +82 -82
- package/components/brand/xertica-logo/XerticaLogo.tsx +104 -104
- package/components/brand/xertica-logo/index.ts +1 -1
- package/components/brand/xertica-logo/xertica-logo.test.tsx +26 -26
- package/components/brand/xertica-orbe/XerticaOrbe.tsx +1927 -1927
- package/components/brand/xertica-orbe/index.ts +1 -1
- package/components/brand/xertica-orbe/xertica-orbe.stories.tsx +40 -40
- package/components/brand/xertica-orbe/xertica-orbe.test.tsx +19 -19
- package/components/brand/xertica-provider/XerticaProvider.tsx +1 -4
- package/components/brand/xertica-provider/index.ts +1 -1
- package/components/brand/xertica-provider/xertica-provider.test.tsx +74 -74
- package/components/brand/xertica-xlogo/XerticaXLogo.stories.tsx +79 -79
- package/components/brand/xertica-xlogo/XerticaXLogo.tsx +65 -65
- package/components/brand/xertica-xlogo/index.ts +1 -1
- package/components/brand/xertica-xlogo/xertica-xlogo.test.tsx +16 -16
- package/components/examples/ApiKeyMapExample.tsx +71 -71
- package/components/examples/DrawingMapExample.tsx +565 -565
- package/components/examples/FilterableMapExample.tsx +393 -393
- package/components/examples/LocationPickerExample.tsx +348 -348
- package/components/examples/MapExamples.tsx +268 -268
- package/components/examples/MapGmpExample.tsx +169 -169
- package/components/examples/MapShowcase.tsx +471 -471
- package/components/examples/RouteMapExamples.tsx +329 -329
- package/components/examples/SidebarLogoExample.tsx +65 -65
- package/components/examples/SimpleFilterableMap.tsx +219 -219
- package/components/examples/index.ts +45 -45
- package/components/figma/ImageWithFallback.tsx +27 -27
- package/components/hooks/index.ts +13 -13
- package/components/hooks/use-layout-shortcuts.ts +43 -43
- package/components/index.ts +86 -90
- package/components/layout/header/header.stories.tsx +204 -204
- package/components/layout/header/header.test.tsx +75 -75
- package/components/layout/header/header.tsx +349 -349
- package/components/layout/header/index.ts +1 -1
- package/components/layout/index.ts +2 -2
- package/components/layout/sidebar/index.ts +3 -3
- package/components/layout/sidebar/sidebar.stories.tsx +586 -586
- package/components/layout/sidebar/sidebar.test.tsx +76 -76
- package/components/layout/sidebar/sidebar.tsx +1079 -1073
- package/components/layout/sidebar/use-sidebar.ts +104 -104
- package/components/media/FloatingMediaWrapper.tsx +371 -371
- package/components/media/audio-player/AudioPlayer.stories.tsx +124 -124
- package/components/media/audio-player/AudioPlayer.test.tsx +106 -106
- package/components/media/audio-player/AudioPlayer.tsx +767 -765
- package/components/media/audio-player/index.ts +1 -1
- package/components/media/audio-player/use-audio-player.ts +312 -312
- package/components/media/index.ts +3 -3
- package/components/media/video-player/VideoPlayer.stories.tsx +98 -98
- package/components/media/video-player/VideoPlayer.test.tsx +73 -73
- package/components/media/video-player/VideoPlayer.tsx +310 -310
- package/components/media/video-player/index.ts +1 -1
- package/components/pages/forgot-password-page/ForgotPasswordPage.stories.tsx +24 -24
- package/components/pages/forgot-password-page/ForgotPasswordPage.tsx +188 -188
- package/components/pages/forgot-password-page/forgot-password-page.test.tsx +45 -45
- package/components/pages/forgot-password-page/index.ts +1 -1
- package/components/pages/home-content/HomeContent.stories.tsx +43 -43
- package/components/pages/home-content/HomeContent.tsx +120 -120
- package/components/pages/home-content/index.ts +1 -1
- package/components/pages/home-page/HomePage.stories.tsx +39 -39
- package/components/pages/home-page/HomePage.tsx +78 -74
- package/components/pages/home-page/home-page.test.tsx +53 -53
- package/components/pages/home-page/index.ts +1 -1
- package/components/pages/index.ts +8 -8
- package/components/pages/login-page/LoginPage.stories.tsx +39 -39
- package/components/pages/login-page/LoginPage.tsx +218 -216
- package/components/pages/login-page/index.ts +1 -1
- package/components/pages/login-page/login-page.test.tsx +63 -63
- package/components/pages/reset-password-page/ResetPasswordPage.stories.tsx +24 -24
- package/components/pages/reset-password-page/ResetPasswordPage.tsx +243 -239
- package/components/pages/reset-password-page/index.ts +1 -1
- package/components/pages/template-content/TemplateContent.stories.tsx +43 -43
- package/components/pages/template-content/TemplateContent.tsx +1354 -1235
- package/components/pages/template-content/index.ts +1 -1
- package/components/pages/template-page/TemplatePage.stories.tsx +39 -39
- package/components/pages/template-page/TemplatePage.tsx +62 -62
- package/components/pages/template-page/index.ts +1 -1
- package/components/pages/template-page/template-page.test.tsx +52 -52
- package/components/pages/verify-email-page/VerifyEmailPage.stories.tsx +41 -41
- package/components/pages/verify-email-page/VerifyEmailPage.tsx +206 -206
- package/components/pages/verify-email-page/index.ts +1 -1
- package/components/public-api-smoke.test.tsx +52 -52
- package/components/shared/CustomTooltipContent.tsx +48 -48
- package/components/shared/assistant-utils.test.ts +16 -16
- package/components/shared/assistant-utils.ts +225 -225
- package/components/shared/error-boundary.stories.tsx +114 -132
- package/components/shared/error-boundary.tsx +150 -154
- package/components/shared/error-fallbacks.tsx +222 -226
- package/components/shared/layout-constants.ts +8 -8
- package/components/shared/navigation.ts +35 -35
- package/components/shared/use-mobile.test.ts +16 -16
- package/components/shared/use-mobile.ts +36 -36
- package/components/shared/utils.test.ts +14 -14
- package/components/shared/utils.ts +6 -6
- package/components/ui/accordion/accordion.stories.tsx +105 -105
- package/components/ui/accordion/accordion.test.tsx +59 -59
- package/components/ui/accordion/accordion.tsx +77 -77
- package/components/ui/accordion/index.ts +1 -1
- package/components/ui/alert/alert.stories.tsx +86 -86
- package/components/ui/alert/alert.test.tsx +53 -53
- package/components/ui/alert/alert.tsx +93 -93
- package/components/ui/alert/index.ts +1 -1
- package/components/ui/alert-dialog/alert-dialog.stories.tsx +84 -84
- package/components/ui/alert-dialog/alert-dialog.test.tsx +70 -70
- package/components/ui/alert-dialog/alert-dialog.tsx +149 -149
- package/components/ui/alert-dialog/index.ts +1 -1
- package/components/ui/aspect-ratio/aspect-ratio.stories.tsx +46 -46
- package/components/ui/aspect-ratio/aspect-ratio.test.tsx +28 -28
- package/components/ui/aspect-ratio/aspect-ratio.tsx +20 -20
- package/components/ui/aspect-ratio/index.ts +1 -1
- package/components/ui/assistant-chart/AssistantChart.tsx +64 -64
- package/components/ui/assistant-chart/assistant-chart.stories.tsx +44 -44
- package/components/ui/assistant-chart/assistant-chart.test.tsx +46 -46
- package/components/ui/assistant-chart/index.ts +1 -1
- package/components/ui/avatar/avatar.stories.tsx +86 -86
- package/components/ui/avatar/avatar.test.tsx +55 -55
- package/components/ui/avatar/avatar.tsx +71 -71
- package/components/ui/avatar/index.ts +1 -1
- package/components/ui/badge/badge.stories.tsx +72 -72
- package/components/ui/badge/badge.test.tsx +40 -40
- package/components/ui/badge/badge.tsx +58 -58
- package/components/ui/badge/index.ts +1 -1
- package/components/ui/breadcrumb/breadcrumb.stories.tsx +123 -123
- package/components/ui/breadcrumb/breadcrumb.test.tsx +70 -70
- package/components/ui/breadcrumb/breadcrumb.tsx +114 -114
- package/components/ui/breadcrumb/index.ts +1 -1
- package/components/ui/button/button.stories.tsx +183 -183
- package/components/ui/button/button.test.tsx +64 -64
- package/components/ui/button/button.tsx +98 -98
- package/components/ui/button/index.ts +1 -1
- package/components/ui/calendar/calendar.stories.tsx +108 -108
- package/components/ui/calendar/calendar.test.tsx +53 -53
- package/components/ui/calendar/calendar.tsx +230 -230
- package/components/ui/calendar/index.ts +1 -1
- package/components/ui/card/card.stories.tsx +301 -301
- package/components/ui/card/card.test.tsx +55 -55
- package/components/ui/card/card.tsx +83 -83
- package/components/ui/card/index.ts +1 -1
- package/components/ui/carousel/carousel.stories.tsx +80 -80
- package/components/ui/carousel/carousel.test.tsx +75 -75
- package/components/ui/carousel/carousel.tsx +242 -242
- package/components/ui/carousel/index.ts +1 -1
- package/components/ui/chart/chart.stories.tsx +1328 -1328
- package/components/ui/chart/chart.test.tsx +178 -178
- package/components/ui/chart/chart.tsx +2232 -2232
- package/components/ui/chart/index.ts +1 -1
- package/components/ui/checkbox/checkbox.stories.tsx +109 -109
- package/components/ui/checkbox/checkbox.test.tsx +49 -49
- package/components/ui/checkbox/checkbox.tsx +68 -68
- package/components/ui/checkbox/index.ts +1 -1
- package/components/ui/collapsible/collapsible.stories.tsx +45 -45
- package/components/ui/collapsible/collapsible.test.tsx +51 -51
- package/components/ui/collapsible/collapsible.tsx +32 -32
- package/components/ui/collapsible/index.ts +1 -1
- package/components/ui/command/command.stories.tsx +134 -134
- package/components/ui/command/command.test.tsx +48 -48
- package/components/ui/command/command.tsx +163 -163
- package/components/ui/command/index.ts +1 -1
- package/components/ui/context-menu/context-menu.stories.tsx +76 -76
- package/components/ui/context-menu/context-menu.test.tsx +61 -61
- package/components/ui/context-menu/context-menu.tsx +236 -236
- package/components/ui/context-menu/index.ts +1 -1
- package/components/ui/dialog/dialog.stories.tsx +174 -174
- package/components/ui/dialog/dialog.test.tsx +78 -78
- package/components/ui/dialog/dialog.tsx +189 -189
- package/components/ui/dialog/index.ts +1 -1
- package/components/ui/drawer/drawer.stories.tsx +71 -71
- package/components/ui/drawer/drawer.test.tsx +67 -67
- package/components/ui/drawer/drawer.tsx +146 -146
- package/components/ui/drawer/index.ts +1 -1
- package/components/ui/dropdown-menu/dropdown-menu.stories.tsx +156 -156
- package/components/ui/dropdown-menu/dropdown-menu.test.tsx +62 -62
- package/components/ui/dropdown-menu/dropdown-menu.tsx +240 -240
- package/components/ui/dropdown-menu/index.ts +1 -1
- package/components/ui/empty/empty.stories.tsx +85 -85
- package/components/ui/empty/empty.test.tsx +31 -31
- package/components/ui/empty/empty.tsx +88 -88
- package/components/ui/empty/index.ts +1 -1
- package/components/ui/file-upload/file-upload.stories.tsx +144 -144
- package/components/ui/file-upload/file-upload.test.tsx +65 -65
- package/components/ui/file-upload/file-upload.tsx +142 -142
- package/components/ui/file-upload/index.ts +2 -2
- package/components/ui/file-upload/use-file-upload.ts +177 -177
- package/components/ui/form/form.stories.tsx +85 -85
- package/components/ui/form/form.test.tsx +75 -75
- package/components/ui/form/form.tsx +163 -163
- package/components/ui/form/index.ts +1 -1
- package/components/ui/google-maps-loader/google-maps-loader.test.tsx +35 -35
- package/components/ui/google-maps-loader/google-maps-loader.tsx +465 -465
- package/components/ui/google-maps-loader/index.ts +1 -1
- package/components/ui/hover-card/hover-card.stories.tsx +61 -61
- package/components/ui/hover-card/hover-card.test.tsx +48 -48
- package/components/ui/hover-card/hover-card.tsx +50 -50
- package/components/ui/hover-card/index.ts +1 -1
- package/components/ui/index.ts +400 -400
- package/components/ui/input/index.ts +1 -1
- package/components/ui/input/input.stories.tsx +153 -153
- package/components/ui/input/input.test.tsx +47 -47
- package/components/ui/input/input.tsx +57 -57
- package/components/ui/input-otp/index.ts +1 -1
- package/components/ui/input-otp/input-otp.stories.tsx +120 -120
- package/components/ui/input-otp/input-otp.test.tsx +74 -74
- package/components/ui/input-otp/input-otp.tsx +101 -101
- package/components/ui/label/index.ts +1 -1
- package/components/ui/label/label.stories.tsx +74 -74
- package/components/ui/label/label.test.tsx +45 -45
- package/components/ui/label/label.tsx +53 -53
- package/components/ui/map/index.ts +1 -1
- package/components/ui/map/map.stories.tsx +86 -86
- package/components/ui/map/map.test.tsx +82 -82
- package/components/ui/map/map.tsx +506 -506
- package/components/ui/map/mock.test.tsx +13 -13
- package/components/ui/map-config/index.ts +1 -1
- package/components/ui/map-config/map-config.ts +18 -18
- package/components/ui/map-layers/index.ts +1 -1
- package/components/ui/map-layers/map-layers.test.tsx +48 -48
- package/components/ui/map-layers/map-layers.tsx +126 -126
- package/components/ui/map.exports/index.ts +1 -1
- package/components/ui/map.exports/map.exports.ts +31 -31
- package/components/ui/menubar/index.ts +1 -1
- package/components/ui/menubar/menubar.stories.tsx +130 -130
- package/components/ui/menubar/menubar.test.tsx +53 -53
- package/components/ui/menubar/menubar.tsx +265 -265
- package/components/ui/navigation-menu/index.ts +1 -1
- package/components/ui/navigation-menu/navigation-menu.stories.tsx +126 -126
- package/components/ui/navigation-menu/navigation-menu.test.tsx +47 -47
- package/components/ui/navigation-menu/navigation-menu.tsx +165 -165
- package/components/ui/notification-badge/index.ts +1 -1
- package/components/ui/notification-badge/notification-badge.stories.tsx +66 -66
- package/components/ui/notification-badge/notification-badge.test.tsx +61 -61
- package/components/ui/notification-badge/notification-badge.tsx +91 -91
- package/components/ui/page-header/index.ts +1 -1
- package/components/ui/page-header/page-header.stories.tsx +69 -69
- package/components/ui/page-header/page-header.test.tsx +37 -37
- package/components/ui/page-header/page-header.tsx +124 -124
- package/components/ui/pagination/index.ts +3 -3
- package/components/ui/pagination/pagination.stories.tsx +210 -210
- package/components/ui/pagination/pagination.test.tsx +63 -63
- package/components/ui/pagination/pagination.tsx +140 -140
- package/components/ui/pagination/use-pagination.ts +173 -173
- package/components/ui/popover/index.ts +1 -1
- package/components/ui/popover/popover.stories.tsx +73 -73
- package/components/ui/popover/popover.test.tsx +48 -48
- package/components/ui/popover/popover.tsx +54 -54
- package/components/ui/progress/index.ts +1 -1
- package/components/ui/progress/progress.stories.tsx +55 -55
- package/components/ui/progress/progress.test.tsx +23 -23
- package/components/ui/progress/progress.tsx +68 -68
- package/components/ui/radio-group/index.ts +1 -1
- package/components/ui/radio-group/radio-group.stories.tsx +114 -114
- package/components/ui/radio-group/radio-group.test.tsx +78 -78
- package/components/ui/radio-group/radio-group.tsx +93 -93
- package/components/ui/rating/index.ts +1 -1
- package/components/ui/rating/rating.stories.tsx +50 -50
- package/components/ui/rating/rating.test.tsx +48 -48
- package/components/ui/rating/rating.tsx +145 -145
- package/components/ui/resizable/index.ts +1 -1
- package/components/ui/resizable/resizable.stories.tsx +88 -88
- package/components/ui/resizable/resizable.test.tsx +61 -61
- package/components/ui/resizable/resizable.tsx +452 -452
- package/components/ui/rich-text-editor/index.ts +7 -7
- package/components/ui/rich-text-editor/rich-text-editor.stories.tsx +290 -290
- package/components/ui/rich-text-editor/rich-text-editor.test.tsx +86 -86
- package/components/ui/rich-text-editor/rich-text-editor.tsx +634 -634
- package/components/ui/rich-text-editor/use-rich-text-editor.ts +453 -453
- package/components/ui/route-map/index.ts +1 -1
- package/components/ui/route-map/route-map.stories.tsx +48 -48
- package/components/ui/route-map/route-map.test.tsx +108 -108
- package/components/ui/route-map/route-map.tsx +349 -349
- package/components/ui/scroll-area/index.ts +1 -1
- package/components/ui/scroll-area/scroll-area.stories.tsx +31 -31
- package/components/ui/scroll-area/scroll-area.test.tsx +27 -27
- package/components/ui/scroll-area/scroll-area.tsx +70 -70
- package/components/ui/search/index.ts +1 -1
- package/components/ui/search/search.stories.tsx +107 -107
- package/components/ui/search/search.test.tsx +67 -67
- package/components/ui/search/search.tsx +141 -141
- package/components/ui/select/index.ts +1 -1
- package/components/ui/select/select.stories.tsx +163 -163
- package/components/ui/select/select.test.tsx +99 -99
- package/components/ui/select/select.tsx +195 -195
- package/components/ui/separator/index.ts +1 -1
- package/components/ui/separator/separator.stories.tsx +55 -55
- package/components/ui/separator/separator.test.tsx +23 -23
- package/components/ui/separator/separator.tsx +39 -39
- package/components/ui/sheet/index.ts +1 -1
- package/components/ui/sheet/sheet.stories.tsx +93 -93
- package/components/ui/sheet/sheet.test.tsx +62 -62
- package/components/ui/sheet/sheet.tsx +149 -149
- package/components/ui/simple-map/index.ts +1 -1
- package/components/ui/simple-map/simple-map.stories.tsx +44 -44
- package/components/ui/simple-map/simple-map.test.tsx +36 -36
- package/components/ui/simple-map/simple-map.tsx +92 -92
- package/components/ui/skeleton/index.ts +1 -1
- package/components/ui/skeleton/skeleton.stories.tsx +36 -36
- package/components/ui/skeleton/skeleton.test.tsx +19 -19
- package/components/ui/skeleton/skeleton.tsx +25 -25
- package/components/ui/slider/index.ts +1 -1
- package/components/ui/slider/slider.stories.tsx +44 -44
- package/components/ui/slider/slider.test.tsx +25 -25
- package/components/ui/slider/slider.tsx +66 -66
- package/components/ui/sonner/index.ts +1 -1
- package/components/ui/sonner/sonner.stories.tsx +41 -41
- package/components/ui/sonner/sonner.test.tsx +24 -24
- package/components/ui/sonner/sonner.tsx +74 -74
- package/components/ui/stats-card/index.ts +2 -2
- package/components/ui/stats-card/stats-card-skeleton.tsx +1 -3
- package/components/ui/stats-card/stats-card.stories.tsx +99 -99
- package/components/ui/stats-card/stats-card.test.tsx +34 -34
- package/components/ui/stats-card/stats-card.tsx +93 -93
- package/components/ui/stepper/index.ts +3 -3
- package/components/ui/stepper/stepper.stories.tsx +171 -171
- package/components/ui/stepper/stepper.test.tsx +47 -47
- package/components/ui/stepper/stepper.tsx +190 -190
- package/components/ui/stepper/use-stepper.ts +139 -139
- package/components/ui/switch/index.ts +1 -1
- package/components/ui/switch/switch.stories.tsx +93 -93
- package/components/ui/switch/switch.test.tsx +44 -44
- package/components/ui/switch/switch.tsx +70 -70
- package/components/ui/table/index.ts +1 -1
- package/components/ui/table/table.stories.tsx +114 -114
- package/components/ui/table/table.test.tsx +43 -43
- package/components/ui/table/table.tsx +104 -104
- package/components/ui/tabs/index.ts +1 -1
- package/components/ui/tabs/tabs.stories.tsx +140 -140
- package/components/ui/tabs/tabs.test.tsx +50 -50
- package/components/ui/tabs/tabs.tsx +66 -66
- package/components/ui/textarea/index.ts +1 -1
- package/components/ui/textarea/textarea.stories.tsx +69 -69
- package/components/ui/textarea/textarea.test.tsx +41 -41
- package/components/ui/textarea/textarea.tsx +61 -61
- package/components/ui/timeline/index.ts +1 -1
- package/components/ui/timeline/timeline.stories.tsx +97 -97
- package/components/ui/timeline/timeline.test.tsx +53 -53
- package/components/ui/timeline/timeline.tsx +124 -124
- package/components/ui/toggle/index.ts +1 -1
- package/components/ui/toggle/toggle.stories.tsx +56 -56
- package/components/ui/toggle/toggle.test.tsx +32 -32
- package/components/ui/toggle/toggle.tsx +55 -55
- package/components/ui/toggle-group/index.ts +1 -1
- package/components/ui/toggle-group/toggle-group.stories.tsx +66 -66
- package/components/ui/toggle-group/toggle-group.test.tsx +47 -47
- package/components/ui/toggle-group/toggle-group.tsx +79 -79
- package/components/ui/tooltip/index.ts +1 -1
- package/components/ui/tooltip/tooltip.stories.tsx +83 -83
- package/components/ui/tooltip/tooltip.test.tsx +39 -39
- package/components/ui/tooltip/tooltip.tsx +69 -69
- package/components/ui/tree-view/index.ts +4 -4
- package/components/ui/tree-view/tree-view.stories.tsx +154 -154
- package/components/ui/tree-view/tree-view.test.tsx +58 -58
- package/components/ui/tree-view/tree-view.tsx +171 -171
- package/components/ui/tree-view/use-tree-view.ts +237 -237
- package/components.json +892 -892
- package/contexts/ApiKeyContext.test.tsx +26 -26
- package/contexts/ApiKeyContext.tsx +196 -196
- package/contexts/AssistenteContext.test.tsx +17 -17
- package/contexts/AssistenteContext.tsx +113 -113
- package/contexts/AuthContext.tsx +121 -118
- package/contexts/BrandColorsContext.test.tsx +21 -21
- package/contexts/BrandColorsContext.tsx +251 -251
- package/contexts/LanguageContext.tsx +1 -2
- package/contexts/LayoutContext.test.tsx +29 -29
- package/contexts/LayoutContext.tsx +140 -140
- package/contexts/ThemeContext.test.tsx +38 -38
- package/contexts/ThemeContext.tsx +111 -111
- package/contexts/index.ts +8 -8
- package/contexts/theme-data.ts +340 -340
- package/dist/AssistantChart-COGiOV-g.cjs +3541 -0
- package/dist/AssistantChart-CWX1OWNM.js +3373 -0
- package/dist/AudioPlayer-9psiEucT.cjs +1282 -0
- package/dist/AudioPlayer-Dp2bD1Gk.js +1278 -0
- package/dist/BrandColorsContext-DZT7JjeD.js +659 -0
- package/dist/BrandColorsContext-awnBCmC4.cjs +666 -0
- package/dist/CodeBlock-DYkTfR0f.js +221 -0
- package/dist/CodeBlock-EOvp9cVu.cjs +223 -0
- package/dist/CustomTooltipContent-BhdIeBEg.cjs +54 -0
- package/dist/CustomTooltipContent-CNbVB2NS.js +33 -0
- package/dist/FeatureCard-BZ4CYxFf.cjs +497 -0
- package/dist/FeatureCard-DNycVGwT.js +485 -0
- package/dist/FeatureCardSkeleton-DZqc96mt.js +27 -0
- package/dist/FeatureCardSkeleton-pTa0YNKP.cjs +29 -0
- package/dist/LayoutContext-BEq_-n98.cjs +96 -0
- package/dist/LayoutContext-DNl1xSoX.js +92 -0
- package/dist/ThemeContext-CMD3z2Dz.cjs +1930 -0
- package/dist/ThemeContext-x_F2zsnv.js +1923 -0
- package/dist/VerifyEmailPage-BJjAMUTW.js +3223 -0
- package/dist/VerifyEmailPage-Bv8Ah_TK.cjs +3235 -0
- package/dist/VerifyEmailPage-CkBYfsNy.cjs +3232 -0
- package/dist/VerifyEmailPage-Cyl55sJb.js +3226 -0
- package/dist/VerifyEmailPage-X14vhdyl.js +3296 -0
- package/dist/VerifyEmailPage-u_Dn7t1U.cjs +3305 -0
- package/dist/XerticaOrbe-Uk2JML1-.cjs +1927 -0
- package/dist/XerticaOrbe-jA5T2iOk.js +1925 -0
- package/dist/XerticaProvider-BErr83Bg.js +42 -0
- package/dist/XerticaProvider-CwOkHxiT.cjs +44 -0
- package/dist/XerticaProvider-DUOJg9iX.js +49 -0
- package/dist/XerticaProvider-Dl_b72_l.cjs +51 -0
- package/dist/XerticaXLogo-BX3ueACh.js +255 -0
- package/dist/XerticaXLogo-mqjoBiLI.js +252 -0
- package/dist/XerticaXLogo-qBPhwK3g.cjs +260 -0
- package/dist/XerticaXLogo-uQgwns_E.cjs +257 -0
- package/dist/alert-dialog-DhwPioBa.cjs +885 -0
- package/dist/alert-dialog-DqlRW_An.js +831 -0
- package/dist/assistant.cjs.js +8 -4
- package/dist/assistant.es.js +5 -11
- package/dist/avatar-3kO2Anrp.js +54 -0
- package/dist/avatar-BCM7YQRC.cjs +77 -0
- package/dist/blocks.cjs.js +9 -4
- package/dist/blocks.es.js +2 -16
- package/dist/brand.cjs.js +10 -5
- package/dist/brand.es.js +3 -11
- package/dist/breadcrumb-BKtHF4gk.cjs +98 -0
- package/dist/breadcrumb-ifNsA7Zl.js +90 -0
- package/dist/button-0BlA47It.cjs +85 -0
- package/dist/button-DZHzN1Gd.js +62 -0
- package/dist/cli.js +471 -93
- package/dist/components/brand/theme-toggle/ThemeToggle.d.ts +1 -1
- package/dist/components/index.d.ts +1 -1
- package/dist/dropdown-menu-BMcykFDf.cjs +225 -0
- package/dist/dropdown-menu-Dn_eV2Xb.js +190 -0
- package/dist/google-maps-loader-BCe58h9D.js +308 -0
- package/dist/google-maps-loader-casMyxlo.cjs +316 -0
- package/dist/hooks.cjs.js +12 -8
- package/dist/hooks.es.js +10 -27
- package/dist/index-9GWd0qxq.cjs +12 -0
- package/dist/index-BabBx2pa.js +6 -0
- package/dist/index.cjs.js +37 -32
- package/dist/index.es.js +30 -363
- package/dist/input-C_UiS2Py.cjs +152 -0
- package/dist/input-cc-PTD4R.js +123 -0
- package/dist/layout.cjs.js +10 -6
- package/dist/layout.es.js +7 -9
- package/dist/media.cjs.js +8 -3
- package/dist/media.es.js +1 -6
- package/dist/pages.cjs.js +8 -3
- package/dist/pages.es.js +1 -11
- package/dist/progress-C7Lti5wo.js +80 -0
- package/dist/progress-Cqwxbqs1.cjs +103 -0
- package/dist/rich-text-editor-DqLICivI.js +2832 -0
- package/dist/rich-text-editor-DxO1Hz3a.cjs +2903 -0
- package/dist/select-CH6v_KcQ.cjs +161 -0
- package/dist/select-D-xvCZK2.js +130 -0
- package/dist/sidebar-3XyzjVBw.js +792 -0
- package/dist/sidebar-B4ZWaMrE.js +792 -0
- package/dist/sidebar-BS1p2V7t.cjs +795 -0
- package/dist/sidebar-DyYvgyBj.cjs +795 -0
- package/dist/skeleton-DjiHerJn.cjs +87 -0
- package/dist/skeleton-DtR5tkYe.js +78 -0
- package/dist/slider-B00b9SVK.cjs +78 -0
- package/dist/slider-DQCNUUMj.js +56 -0
- package/dist/sonner-B-jWlik1.cjs +68 -0
- package/dist/sonner-C9tiqj4f.js +47 -0
- package/dist/tooltip-D8n9UYoU.cjs +72 -0
- package/dist/tooltip-RtbSmPYJ.js +48 -0
- package/dist/ui.cjs.js +23 -18
- package/dist/ui.es.js +16 -303
- package/dist/use-audio-player-B78fd2ct.js +188 -0
- package/dist/use-audio-player-DGvhPrgR.cjs +190 -0
- package/dist/use-mobile-BdXTRb0Z.cjs +51 -0
- package/dist/use-mobile-Ce2cBAQe.js +29 -0
- package/dist/xertica-assistant-B1NaSFFj.js +2173 -0
- package/dist/xertica-assistant-B687qEPU.js +2165 -0
- package/dist/xertica-assistant-CIaUlbIt.cjs +2180 -0
- package/dist/xertica-assistant-sOHwTgIP.cjs +2172 -0
- package/dist/xertica-ui.css +1 -1
- package/docs/ai-usage.md +195 -195
- package/docs/architecture-improvements.md +456 -456
- package/docs/architecture.md +312 -306
- package/docs/components/accordion.md +109 -109
- package/docs/components/alert-dialog.md +127 -127
- package/docs/components/alert.md +106 -106
- package/docs/components/aspect-ratio.md +58 -58
- package/docs/components/assistant-chart.md +47 -47
- package/docs/components/assistant.md +428 -426
- package/docs/components/audio-player.md +167 -167
- package/docs/components/avatar.md +101 -101
- package/docs/components/badge.md +84 -84
- package/docs/components/branding.md +252 -252
- package/docs/components/breadcrumb.md +104 -104
- package/docs/components/button.md +156 -156
- package/docs/components/calendar.md +141 -141
- package/docs/components/card-patterns.md +447 -445
- package/docs/components/card.md +245 -245
- package/docs/components/carousel.md +100 -100
- package/docs/components/chart.md +638 -638
- package/docs/components/checkbox.md +88 -88
- package/docs/components/code-block.md +105 -105
- package/docs/components/collapsible.md +86 -86
- package/docs/components/command.md +113 -113
- package/docs/components/context-menu.md +81 -81
- package/docs/components/dialog.md +198 -198
- package/docs/components/drawer.md +105 -105
- package/docs/components/dropdown-menu.md +127 -127
- package/docs/components/empty.md +127 -127
- package/docs/components/error-boundary.md +201 -191
- package/docs/components/file-upload.md +189 -189
- package/docs/components/floating-media-wrapper.md +63 -63
- package/docs/components/form.md +177 -177
- package/docs/components/formatted-document.md +105 -105
- package/docs/components/google-maps-loader.md +44 -44
- package/docs/components/header.md +177 -177
- package/docs/components/hooks.md +432 -430
- package/docs/components/hover-card.md +86 -86
- package/docs/components/image-with-fallback.md +107 -107
- package/docs/components/input-otp.md +95 -95
- package/docs/components/input.md +130 -130
- package/docs/components/label.md +69 -69
- package/docs/components/language-selector.md +20 -16
- package/docs/components/map-layers.md +138 -138
- package/docs/components/map.md +84 -84
- package/docs/components/markdown-message.md +47 -47
- package/docs/components/menubar.md +89 -89
- package/docs/components/modern-chat-input.md +164 -164
- package/docs/components/navigation-menu.md +83 -83
- package/docs/components/notification-badge.md +78 -78
- package/docs/components/page-header.md +93 -93
- package/docs/components/pages.md +323 -309
- package/docs/components/pagination.md +334 -334
- package/docs/components/popover.md +116 -116
- package/docs/components/progress.md +103 -103
- package/docs/components/radio-group.md +133 -133
- package/docs/components/rating.md +77 -77
- package/docs/components/resizable.md +84 -84
- package/docs/components/rich-text-editor.md +255 -255
- package/docs/components/route-map.md +124 -124
- package/docs/components/scroll-area.md +58 -58
- package/docs/components/search.md +87 -87
- package/docs/components/select.md +144 -144
- package/docs/components/separator.md +58 -58
- package/docs/components/sheet.md +122 -122
- package/docs/components/sidebar.md +314 -314
- package/docs/components/simple-map.md +51 -51
- package/docs/components/skeleton.md +99 -99
- package/docs/components/slider.md +84 -84
- package/docs/components/sonner.md +115 -115
- package/docs/components/stats-card.md +120 -120
- package/docs/components/stepper.md +268 -268
- package/docs/components/switch.md +106 -106
- package/docs/components/table.md +138 -138
- package/docs/components/tabs.md +117 -117
- package/docs/components/textarea.md +86 -86
- package/docs/components/theme-toggle.md +73 -73
- package/docs/components/timeline.md +121 -121
- package/docs/components/toggle-group.md +68 -68
- package/docs/components/toggle.md +62 -62
- package/docs/components/tooltip.md +116 -116
- package/docs/components/tree-view.md +238 -238
- package/docs/components/use-mobile.md +96 -96
- package/docs/components/video-player.md +68 -68
- package/docs/components/xertica-logo.md +36 -36
- package/docs/components/xertica-orbe.md +35 -35
- package/docs/components/xertica-provider.md +65 -65
- package/docs/components/xertica-xlogo.md +35 -35
- package/docs/decision-tree.md +293 -293
- package/docs/doc-audit.md +244 -243
- package/docs/form-sizing.md +162 -162
- package/docs/getting-started.md +616 -591
- package/docs/guidelines.md +330 -328
- package/docs/i18n.md +61 -57
- package/docs/installation.md +268 -267
- package/docs/layout.md +143 -143
- package/docs/llms.md +295 -295
- package/docs/patterns/analytics.md +194 -194
- package/docs/patterns/crud.md +149 -149
- package/docs/patterns/dashboard.md +138 -138
- package/docs/patterns/detail-page.md +296 -296
- package/docs/patterns/form.md +241 -241
- package/docs/patterns/login.md +156 -156
- package/docs/patterns/settings.md +368 -368
- package/docs/patterns/wizard.md +213 -213
- package/docs/state-management.md +289 -289
- package/guidelines/Guidelines.md +409 -406
- package/hooks/useTheme.test.tsx +16 -16
- package/hooks/useTheme.ts +4 -4
- package/imports/Podcast.tsx +540 -540
- package/imports/XerticaAi.tsx +46 -46
- package/imports/XerticaX.tsx +15 -15
- package/imports/svg-aueiaqngck.ts +20 -20
- package/imports/svg-v9krss1ozd.ts +23 -23
- package/imports/svg-vhrdofe3qe.ts +6 -6
- package/llms-compact.txt +2 -1
- package/llms.txt +2 -1
- package/mcp/resources.json +22 -22
- package/mcp/tools.json +35 -35
- package/package.json +219 -213
- package/scripts/ai-validator.ts +91 -91
- package/scripts/cleanup-case-dupes.ts +62 -62
- package/scripts/generate-ai-manifests.ts +107 -107
- package/styles/globals.css +13 -13
- package/styles/xertica/app-overrides/chat.css +61 -61
- package/styles/xertica/app-overrides/scrollbar.css +33 -33
- package/styles/xertica/base.css +90 -71
- package/styles/xertica/integrations/google-maps.css +76 -76
- package/styles/xertica/integrations/sonner.css +73 -73
- package/styles/xertica/theme-map.css +102 -99
- package/styles/xertica/tokens.css +240 -236
- package/templates/CLAUDE.md +16 -1
- package/templates/eslint.config.js +26 -26
- package/templates/guidelines/Guidelines.md +577 -553
- package/templates/package.json +69 -69
- package/templates/postcss.config.js +6 -6
- package/templates/src/app/App.tsx +46 -46
- package/templates/src/app/components/AppLayout.tsx +55 -55
- package/templates/src/app/components/AuthGuard.tsx +131 -82
- package/templates/src/app/context/AuthContext.tsx +108 -108
- package/templates/src/features/assistant/index.ts +5 -5
- package/templates/src/features/auth/index.ts +4 -4
- package/templates/src/features/auth/ui/AuthPageShell.tsx +32 -32
- package/templates/src/features/auth/ui/ForgotPasswordContent.tsx +70 -72
- package/templates/src/features/auth/ui/LoginContent.tsx +92 -92
- package/templates/src/features/auth/ui/ResetPasswordContent.tsx +6 -2
- package/templates/src/features/auth/ui/SocialLoginButtons.tsx +78 -78
- package/templates/src/features/auth/ui/VerifyEmailContent.tsx +2 -6
- package/templates/src/features/home/data/mock.ts +41 -35
- package/templates/src/features/home/index.ts +11 -11
- package/templates/src/features/home/store/dashboardStore.ts +25 -25
- package/templates/src/features/home/ui/HomeContent.tsx +117 -119
- package/templates/src/features/template/index.ts +5 -5
- package/templates/src/features/template/ui/CrudTemplate.tsx +1 -4
- package/templates/src/features/template/ui/LoginTemplate.tsx +1 -1
- package/templates/src/features/template/ui/TemplateContent.tsx +29 -21
- package/templates/src/locales/en/pages/templates.json +17 -17
- package/templates/src/locales/es/pages/templates.json +17 -17
- package/templates/src/locales/pt-BR/pages/templates.json +17 -17
- package/templates/src/main.tsx +11 -11
- package/templates/src/pages/AssistantPage.tsx +26 -20
- package/templates/src/pages/ForgotPasswordPage.tsx +6 -6
- package/templates/src/pages/HomePage.tsx +53 -49
- package/templates/src/pages/LoginPage.tsx +10 -10
- package/templates/src/pages/ResetPasswordPage.tsx +6 -6
- package/templates/src/pages/TemplatePage.tsx +28 -28
- package/templates/src/pages/VerifyEmailPage.tsx +6 -6
- package/templates/src/shared/config/navigation.ts +19 -19
- package/templates/src/shared/error-boundary.tsx +150 -154
- package/templates/src/shared/error-fallbacks.tsx +222 -226
- package/templates/src/shared/lib/auth.ts +20 -20
- package/templates/src/shared/types/auth.ts +3 -3
- package/templates/src/styles/index.css +95 -95
- package/templates/src/styles/xertica/tokens.css +240 -236
- package/templates/tsconfig.json +25 -25
- package/templates/tsconfig.node.json +12 -12
- package/templates/vite-env.d.ts +1 -1
- package/templates/vite.config.js +20 -20
- package/templates/vite.config.ts +54 -51
- package/utils/color-utils.ts +72 -72
- package/utils/demo-responses.test.ts +10 -10
- package/utils/demo-responses.ts +151 -151
- package/utils/gemini.test.ts +25 -25
- package/utils/gemini.ts +155 -155
package/docs/patterns/crud.md
CHANGED
|
@@ -1,149 +1,149 @@
|
|
|
1
|
-
# Pattern: CRUD List
|
|
2
|
-
|
|
3
|
-
## Intent
|
|
4
|
-
|
|
5
|
-
The standard data list page for any entity in the system. Combines a filterable table with row-level actions. Editing and creation are handled by modals (`Dialog`) or side panels (`Sheet`), not by navigating to a separate route.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## When to Use
|
|
10
|
-
|
|
11
|
-
- Team management, user lists, product catalogs, record management
|
|
12
|
-
- Any page where the primary task is viewing, filtering, and acting on a list of records
|
|
13
|
-
- When create/edit flows are short enough to fit in a modal or side sheet
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
## Anatomy
|
|
18
|
-
|
|
19
|
-
```
|
|
20
|
-
┌─────────────────────────────────────────────────────────────┐
|
|
21
|
-
│ Page Header: Entity Title + Description + [New Entity] Btn │
|
|
22
|
-
├─────────────────────────────────────────────────────────────┤
|
|
23
|
-
│ Card Container: │
|
|
24
|
-
│ ┌──────────┬───────────────────────────────────────────┐ │
|
|
25
|
-
│ │ [Search] │ [Filter Dropdown] [Status Filter] ... │ │
|
|
26
|
-
│ ├──────────┴───────────────────────────────────────────┤ │
|
|
27
|
-
│ │ Table: thead > th columns │ │
|
|
28
|
-
│ │ tbody > tr per record, last col = action menu │ │
|
|
29
|
-
│ └──────────────────────────────────────────────────────┘ │
|
|
30
|
-
└─────────────────────────────────────────────────────────────┘
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
---
|
|
34
|
-
|
|
35
|
-
## Full Pattern Code
|
|
36
|
-
|
|
37
|
-
```tsx
|
|
38
|
-
import {
|
|
39
|
-
Button,
|
|
40
|
-
Input,
|
|
41
|
-
Table,
|
|
42
|
-
TableHeader,
|
|
43
|
-
TableRow,
|
|
44
|
-
TableHead,
|
|
45
|
-
TableBody,
|
|
46
|
-
TableCell,
|
|
47
|
-
DropdownMenu,
|
|
48
|
-
DropdownMenuTrigger,
|
|
49
|
-
DropdownMenuContent,
|
|
50
|
-
DropdownMenuItem,
|
|
51
|
-
Badge,
|
|
52
|
-
Card,
|
|
53
|
-
} from 'xertica-ui/ui';
|
|
54
|
-
import { Search, Plus, MoreHorizontal } from 'lucide-react';
|
|
55
|
-
|
|
56
|
-
export function TeamMembersCRUD() {
|
|
57
|
-
return (
|
|
58
|
-
<div className="flex flex-col gap-6 p-6 w-full max-w-[1400px] mx-auto">
|
|
59
|
-
{/* 1. Page Header */}
|
|
60
|
-
<div className="flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between">
|
|
61
|
-
<div>
|
|
62
|
-
<h1 className="text-2xl font-bold tracking-tight">Team Members</h1>
|
|
63
|
-
<p className="text-muted-foreground">Manage member access to the system.</p>
|
|
64
|
-
</div>
|
|
65
|
-
<Button className="gap-2">
|
|
66
|
-
<Plus className="size-4" />
|
|
67
|
-
New Member
|
|
68
|
-
</Button>
|
|
69
|
-
</div>
|
|
70
|
-
|
|
71
|
-
{/* 2. Table Card */}
|
|
72
|
-
<Card>
|
|
73
|
-
{/* Filter Row */}
|
|
74
|
-
<div className="flex p-4 border-b gap-2 flex-wrap">
|
|
75
|
-
<div className="relative w-full max-w-sm">
|
|
76
|
-
<Search className="absolute left-2.5 top-2.5 size-4 text-muted-foreground" />
|
|
77
|
-
<Input placeholder="Search by email..." className="w-full h-9 pl-8" />
|
|
78
|
-
</div>
|
|
79
|
-
{/* Add more filter dropdowns here if needed */}
|
|
80
|
-
</div>
|
|
81
|
-
|
|
82
|
-
{/* Data Table */}
|
|
83
|
-
<Table>
|
|
84
|
-
<TableHeader>
|
|
85
|
-
<TableRow>
|
|
86
|
-
<TableHead>Name</TableHead>
|
|
87
|
-
<TableHead>Email</TableHead>
|
|
88
|
-
<TableHead className="hidden md:table-cell">Role</TableHead>
|
|
89
|
-
<TableHead>Status</TableHead>
|
|
90
|
-
<TableHead className="text-right">Actions</TableHead>
|
|
91
|
-
</TableRow>
|
|
92
|
-
</TableHeader>
|
|
93
|
-
<TableBody>
|
|
94
|
-
<TableRow>
|
|
95
|
-
<TableCell className="font-medium">Admin Dev</TableCell>
|
|
96
|
-
<TableCell>dev@example.com</TableCell>
|
|
97
|
-
<TableCell className="hidden md:table-cell">Administrator</TableCell>
|
|
98
|
-
<TableCell>
|
|
99
|
-
<Badge variant="outline">Active</Badge>
|
|
100
|
-
</TableCell>
|
|
101
|
-
<TableCell className="text-right">
|
|
102
|
-
<DropdownMenu>
|
|
103
|
-
<DropdownMenuTrigger asChild>
|
|
104
|
-
<Button variant="ghost" size="icon" className="size-8">
|
|
105
|
-
<MoreHorizontal className="size-4" />
|
|
106
|
-
</Button>
|
|
107
|
-
</DropdownMenuTrigger>
|
|
108
|
-
<DropdownMenuContent align="end">
|
|
109
|
-
<DropdownMenuItem>Edit Profile</DropdownMenuItem>
|
|
110
|
-
<DropdownMenuItem className="text-destructive">Revoke Access</DropdownMenuItem>
|
|
111
|
-
</DropdownMenuContent>
|
|
112
|
-
</DropdownMenu>
|
|
113
|
-
</TableCell>
|
|
114
|
-
</TableRow>
|
|
115
|
-
</TableBody>
|
|
116
|
-
</Table>
|
|
117
|
-
</Card>
|
|
118
|
-
</div>
|
|
119
|
-
);
|
|
120
|
-
}
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
---
|
|
124
|
-
|
|
125
|
-
## Composition Rules
|
|
126
|
-
|
|
127
|
-
1. **Filter search input** always uses the `relative` + `absolute icon` + `pl-8` pattern — never put the icon outside the input.
|
|
128
|
-
2. **Row action menus** always use `<DropdownMenu>` with `<DropdownMenuTrigger asChild>` wrapping a ghost icon button.
|
|
129
|
-
3. **Status cells** always use `<Badge>` — never plain text.
|
|
130
|
-
4. **Destructive row actions** (delete, revoke) use `className="text-destructive"` on the `<DropdownMenuItem>`.
|
|
131
|
-
5. **The create button** is always in the top-right of the page header, uses `<Plus className="size-4" />` icon.
|
|
132
|
-
6. **Never open a new route for create/edit** — use a `<Dialog>` or `<Sheet>` instead.
|
|
133
|
-
7. Wrap the entire table (filter row + `<Table>`) inside a **single `<Card>`** — do not create separate cards for the filter and the table.
|
|
134
|
-
|
|
135
|
-
---
|
|
136
|
-
|
|
137
|
-
## Related Patterns
|
|
138
|
-
|
|
139
|
-
- [Dashboard Pattern](./dashboard.md) — Overview page that links to CRUD pages
|
|
140
|
-
- [Form Pattern](./form.md) — The create/edit form used inside the Dialog or Sheet
|
|
141
|
-
|
|
142
|
-
## Related Components
|
|
143
|
-
|
|
144
|
-
- [`Table`](../components/table.md)
|
|
145
|
-
- [`DropdownMenu`](../components/dropdown-menu.md)
|
|
146
|
-
- [`Badge`](../components/badge.md)
|
|
147
|
-
- [`Input`](../components/input.md)
|
|
148
|
-
- [`Dialog`](../components/dialog.md) — For create/edit modals
|
|
149
|
-
- [`Sheet`](../components/sheet.md) — For create/edit side panels
|
|
1
|
+
# Pattern: CRUD List
|
|
2
|
+
|
|
3
|
+
## Intent
|
|
4
|
+
|
|
5
|
+
The standard data list page for any entity in the system. Combines a filterable table with row-level actions. Editing and creation are handled by modals (`Dialog`) or side panels (`Sheet`), not by navigating to a separate route.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## When to Use
|
|
10
|
+
|
|
11
|
+
- Team management, user lists, product catalogs, record management
|
|
12
|
+
- Any page where the primary task is viewing, filtering, and acting on a list of records
|
|
13
|
+
- When create/edit flows are short enough to fit in a modal or side sheet
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Anatomy
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
21
|
+
│ Page Header: Entity Title + Description + [New Entity] Btn │
|
|
22
|
+
├─────────────────────────────────────────────────────────────┤
|
|
23
|
+
│ Card Container: │
|
|
24
|
+
│ ┌──────────┬───────────────────────────────────────────┐ │
|
|
25
|
+
│ │ [Search] │ [Filter Dropdown] [Status Filter] ... │ │
|
|
26
|
+
│ ├──────────┴───────────────────────────────────────────┤ │
|
|
27
|
+
│ │ Table: thead > th columns │ │
|
|
28
|
+
│ │ tbody > tr per record, last col = action menu │ │
|
|
29
|
+
│ └──────────────────────────────────────────────────────┘ │
|
|
30
|
+
└─────────────────────────────────────────────────────────────┘
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Full Pattern Code
|
|
36
|
+
|
|
37
|
+
```tsx
|
|
38
|
+
import {
|
|
39
|
+
Button,
|
|
40
|
+
Input,
|
|
41
|
+
Table,
|
|
42
|
+
TableHeader,
|
|
43
|
+
TableRow,
|
|
44
|
+
TableHead,
|
|
45
|
+
TableBody,
|
|
46
|
+
TableCell,
|
|
47
|
+
DropdownMenu,
|
|
48
|
+
DropdownMenuTrigger,
|
|
49
|
+
DropdownMenuContent,
|
|
50
|
+
DropdownMenuItem,
|
|
51
|
+
Badge,
|
|
52
|
+
Card,
|
|
53
|
+
} from 'xertica-ui/ui';
|
|
54
|
+
import { Search, Plus, MoreHorizontal } from 'lucide-react';
|
|
55
|
+
|
|
56
|
+
export function TeamMembersCRUD() {
|
|
57
|
+
return (
|
|
58
|
+
<div className="flex flex-col gap-6 p-6 w-full max-w-[1400px] mx-auto">
|
|
59
|
+
{/* 1. Page Header */}
|
|
60
|
+
<div className="flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between">
|
|
61
|
+
<div>
|
|
62
|
+
<h1 className="text-2xl font-bold tracking-tight">Team Members</h1>
|
|
63
|
+
<p className="text-muted-foreground">Manage member access to the system.</p>
|
|
64
|
+
</div>
|
|
65
|
+
<Button className="gap-2">
|
|
66
|
+
<Plus className="size-4" />
|
|
67
|
+
New Member
|
|
68
|
+
</Button>
|
|
69
|
+
</div>
|
|
70
|
+
|
|
71
|
+
{/* 2. Table Card */}
|
|
72
|
+
<Card>
|
|
73
|
+
{/* Filter Row */}
|
|
74
|
+
<div className="flex p-4 border-b gap-2 flex-wrap">
|
|
75
|
+
<div className="relative w-full max-w-sm">
|
|
76
|
+
<Search className="absolute left-2.5 top-2.5 size-4 text-muted-foreground" />
|
|
77
|
+
<Input placeholder="Search by email..." className="w-full h-9 pl-8" />
|
|
78
|
+
</div>
|
|
79
|
+
{/* Add more filter dropdowns here if needed */}
|
|
80
|
+
</div>
|
|
81
|
+
|
|
82
|
+
{/* Data Table */}
|
|
83
|
+
<Table>
|
|
84
|
+
<TableHeader>
|
|
85
|
+
<TableRow>
|
|
86
|
+
<TableHead>Name</TableHead>
|
|
87
|
+
<TableHead>Email</TableHead>
|
|
88
|
+
<TableHead className="hidden md:table-cell">Role</TableHead>
|
|
89
|
+
<TableHead>Status</TableHead>
|
|
90
|
+
<TableHead className="text-right">Actions</TableHead>
|
|
91
|
+
</TableRow>
|
|
92
|
+
</TableHeader>
|
|
93
|
+
<TableBody>
|
|
94
|
+
<TableRow>
|
|
95
|
+
<TableCell className="font-medium">Admin Dev</TableCell>
|
|
96
|
+
<TableCell>dev@example.com</TableCell>
|
|
97
|
+
<TableCell className="hidden md:table-cell">Administrator</TableCell>
|
|
98
|
+
<TableCell>
|
|
99
|
+
<Badge variant="outline">Active</Badge>
|
|
100
|
+
</TableCell>
|
|
101
|
+
<TableCell className="text-right">
|
|
102
|
+
<DropdownMenu>
|
|
103
|
+
<DropdownMenuTrigger asChild>
|
|
104
|
+
<Button variant="ghost" size="icon" className="size-8">
|
|
105
|
+
<MoreHorizontal className="size-4" />
|
|
106
|
+
</Button>
|
|
107
|
+
</DropdownMenuTrigger>
|
|
108
|
+
<DropdownMenuContent align="end">
|
|
109
|
+
<DropdownMenuItem>Edit Profile</DropdownMenuItem>
|
|
110
|
+
<DropdownMenuItem className="text-destructive">Revoke Access</DropdownMenuItem>
|
|
111
|
+
</DropdownMenuContent>
|
|
112
|
+
</DropdownMenu>
|
|
113
|
+
</TableCell>
|
|
114
|
+
</TableRow>
|
|
115
|
+
</TableBody>
|
|
116
|
+
</Table>
|
|
117
|
+
</Card>
|
|
118
|
+
</div>
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## Composition Rules
|
|
126
|
+
|
|
127
|
+
1. **Filter search input** always uses the `relative` + `absolute icon` + `pl-8` pattern — never put the icon outside the input.
|
|
128
|
+
2. **Row action menus** always use `<DropdownMenu>` with `<DropdownMenuTrigger asChild>` wrapping a ghost icon button.
|
|
129
|
+
3. **Status cells** always use `<Badge>` — never plain text.
|
|
130
|
+
4. **Destructive row actions** (delete, revoke) use `className="text-destructive"` on the `<DropdownMenuItem>`.
|
|
131
|
+
5. **The create button** is always in the top-right of the page header, uses `<Plus className="size-4" />` icon.
|
|
132
|
+
6. **Never open a new route for create/edit** — use a `<Dialog>` or `<Sheet>` instead.
|
|
133
|
+
7. Wrap the entire table (filter row + `<Table>`) inside a **single `<Card>`** — do not create separate cards for the filter and the table.
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## Related Patterns
|
|
138
|
+
|
|
139
|
+
- [Dashboard Pattern](./dashboard.md) — Overview page that links to CRUD pages
|
|
140
|
+
- [Form Pattern](./form.md) — The create/edit form used inside the Dialog or Sheet
|
|
141
|
+
|
|
142
|
+
## Related Components
|
|
143
|
+
|
|
144
|
+
- [`Table`](../components/table.md)
|
|
145
|
+
- [`DropdownMenu`](../components/dropdown-menu.md)
|
|
146
|
+
- [`Badge`](../components/badge.md)
|
|
147
|
+
- [`Input`](../components/input.md)
|
|
148
|
+
- [`Dialog`](../components/dialog.md) — For create/edit modals
|
|
149
|
+
- [`Sheet`](../components/sheet.md) — For create/edit side panels
|
|
@@ -1,138 +1,138 @@
|
|
|
1
|
-
# Pattern: Dashboard
|
|
2
|
-
|
|
3
|
-
## Intent
|
|
4
|
-
|
|
5
|
-
A Dashboard provides an at-a-glance overview of key system metrics. Use it as the home or overview page of any management application. The pattern combines KPI stat cards, charts, and activity feeds in a structured grid layout.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## When to Use
|
|
10
|
-
|
|
11
|
-
- As the first page after login in management applications
|
|
12
|
-
- When the user needs to monitor multiple metrics simultaneously
|
|
13
|
-
- For executive or operational overview screens
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
## Anatomy
|
|
18
|
-
|
|
19
|
-
```
|
|
20
|
-
┌────────────────────────────────────────────────────────┐
|
|
21
|
-
│ Page Header: Title + CTA Button (e.g., "Download Report")
|
|
22
|
-
├────────────────────────────────────────────────────────┤
|
|
23
|
-
│ Stats Row: 4 KPI Cards (grid-cols-4 lg) │
|
|
24
|
-
├───────────────────────────────┬────────────────────────┤
|
|
25
|
-
│ Chart Panel (col-span-4) │ Activity Feed (col-3) │
|
|
26
|
-
└───────────────────────────────┴────────────────────────┘
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
---
|
|
30
|
-
|
|
31
|
-
## Full Pattern Code
|
|
32
|
-
|
|
33
|
-
```tsx
|
|
34
|
-
import { Card, CardContent, CardHeader, CardTitle, Badge, Button, StatsCard } from 'xertica-ui/ui';
|
|
35
|
-
import { Users, DollarSign, Activity, TrendingUp } from 'lucide-react';
|
|
36
|
-
|
|
37
|
-
export function DashboardPage() {
|
|
38
|
-
return (
|
|
39
|
-
<div className="flex flex-col gap-6 p-6 w-full max-w-[1400px] mx-auto">
|
|
40
|
-
{/* 1. Page Header */}
|
|
41
|
-
<div className="flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between">
|
|
42
|
-
<div>
|
|
43
|
-
<h1 className="text-2xl font-bold tracking-tight">Dashboard</h1>
|
|
44
|
-
<p className="text-muted-foreground">System overview</p>
|
|
45
|
-
</div>
|
|
46
|
-
<Button>Download Report</Button>
|
|
47
|
-
</div>
|
|
48
|
-
|
|
49
|
-
{/* 2. KPI Stats Row */}
|
|
50
|
-
<div className="grid gap-4 grid-cols-1 sm:grid-cols-2 lg:grid-cols-4">
|
|
51
|
-
<StatsCard
|
|
52
|
-
title="Total Revenue"
|
|
53
|
-
value="$45,231.89"
|
|
54
|
-
trend="+20.1%"
|
|
55
|
-
icon={<DollarSign className="size-4 text-muted-foreground" />}
|
|
56
|
-
/>
|
|
57
|
-
<StatsCard
|
|
58
|
-
title="Active Users"
|
|
59
|
-
value="+2,350"
|
|
60
|
-
trend="+180 this month"
|
|
61
|
-
icon={<Users className="size-4 text-muted-foreground" />}
|
|
62
|
-
/>
|
|
63
|
-
<StatsCard
|
|
64
|
-
title="Sales"
|
|
65
|
-
value="+12,234"
|
|
66
|
-
trend="+19% vs last month"
|
|
67
|
-
icon={<Activity className="size-4 text-muted-foreground" />}
|
|
68
|
-
/>
|
|
69
|
-
<StatsCard
|
|
70
|
-
title="Retention Rate"
|
|
71
|
-
value="89.3%"
|
|
72
|
-
trend="+1.2%"
|
|
73
|
-
icon={<TrendingUp className="size-4 text-muted-foreground" />}
|
|
74
|
-
/>
|
|
75
|
-
</div>
|
|
76
|
-
|
|
77
|
-
{/* 3. Chart + Feed Panel */}
|
|
78
|
-
<div className="grid gap-4 grid-cols-1 lg:grid-cols-7">
|
|
79
|
-
{/* Chart — takes 4 of 7 columns */}
|
|
80
|
-
<Card className="col-span-1 lg:col-span-4">
|
|
81
|
-
<CardHeader>
|
|
82
|
-
<CardTitle>Overview</CardTitle>
|
|
83
|
-
</CardHeader>
|
|
84
|
-
<CardContent className="h-[350px]">
|
|
85
|
-
{/* Mount a Recharts BarChart / LineChart here */}
|
|
86
|
-
<div className="flex h-full w-full items-center justify-center rounded-md border border-dashed bg-muted/20 text-muted-foreground">
|
|
87
|
-
Chart Area
|
|
88
|
-
</div>
|
|
89
|
-
</CardContent>
|
|
90
|
-
</Card>
|
|
91
|
-
|
|
92
|
-
{/* Activity Feed — takes 3 of 7 columns */}
|
|
93
|
-
<Card className="col-span-1 lg:col-span-3">
|
|
94
|
-
<CardHeader>
|
|
95
|
-
<CardTitle>Recent Events</CardTitle>
|
|
96
|
-
</CardHeader>
|
|
97
|
-
<CardContent>
|
|
98
|
-
<div className="space-y-4 text-sm">
|
|
99
|
-
<div className="flex items-center gap-4">
|
|
100
|
-
<Badge variant="outline">09:00</Badge>
|
|
101
|
-
<span>John Smith logged in</span>
|
|
102
|
-
</div>
|
|
103
|
-
<div className="flex items-center gap-4">
|
|
104
|
-
<Badge variant="outline">10:45</Badge>
|
|
105
|
-
<span>Invoice #INV004 paid</span>
|
|
106
|
-
</div>
|
|
107
|
-
</div>
|
|
108
|
-
</CardContent>
|
|
109
|
-
</Card>
|
|
110
|
-
</div>
|
|
111
|
-
</div>
|
|
112
|
-
);
|
|
113
|
-
}
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
---
|
|
117
|
-
|
|
118
|
-
## Composition Rules
|
|
119
|
-
|
|
120
|
-
1. **KPI cards always use the `StatsCard` pattern**: small title (`text-sm font-medium`), large value (`text-2xl font-bold`), supplementary trend text.
|
|
121
|
-
2. **Chart cards always occupy more grid space than feed cards** — use `col-span-4` vs `col-span-3` in a 7-column grid.
|
|
122
|
-
3. **Never hardcode pixel widths in grids** — use `lg:grid-cols-4`, `lg:grid-cols-7` with responsive overrides.
|
|
123
|
-
4. **Chart placeholder areas** use `border-dashed bg-muted/20` — never leave them blank.
|
|
124
|
-
5. **The max-width `max-w-[1400px]`** prevents the content from becoming too wide on large monitors.
|
|
125
|
-
|
|
126
|
-
---
|
|
127
|
-
|
|
128
|
-
## Related Patterns
|
|
129
|
-
|
|
130
|
-
- [Analytics Pattern](./analytics.md) — When you need time-series filtering and comparative views
|
|
131
|
-
- [CRUD Pattern](./crud.md) — When the dashboard links to data management pages
|
|
132
|
-
|
|
133
|
-
## Related Components
|
|
134
|
-
|
|
135
|
-
- [`Card`](../components/card.md) — Primary container for all dashboard sections
|
|
136
|
-
- [`Badge`](../components/badge.md) — Status and timestamp labels
|
|
137
|
-
- [`Chart`](../components/chart.md) — Recharts integration for graph areas
|
|
138
|
-
- [`StatsCard`](../components/stats-card.md) — Pre-built KPI card component
|
|
1
|
+
# Pattern: Dashboard
|
|
2
|
+
|
|
3
|
+
## Intent
|
|
4
|
+
|
|
5
|
+
A Dashboard provides an at-a-glance overview of key system metrics. Use it as the home or overview page of any management application. The pattern combines KPI stat cards, charts, and activity feeds in a structured grid layout.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## When to Use
|
|
10
|
+
|
|
11
|
+
- As the first page after login in management applications
|
|
12
|
+
- When the user needs to monitor multiple metrics simultaneously
|
|
13
|
+
- For executive or operational overview screens
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Anatomy
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
┌────────────────────────────────────────────────────────┐
|
|
21
|
+
│ Page Header: Title + CTA Button (e.g., "Download Report")
|
|
22
|
+
├────────────────────────────────────────────────────────┤
|
|
23
|
+
│ Stats Row: 4 KPI Cards (grid-cols-4 lg) │
|
|
24
|
+
├───────────────────────────────┬────────────────────────┤
|
|
25
|
+
│ Chart Panel (col-span-4) │ Activity Feed (col-3) │
|
|
26
|
+
└───────────────────────────────┴────────────────────────┘
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Full Pattern Code
|
|
32
|
+
|
|
33
|
+
```tsx
|
|
34
|
+
import { Card, CardContent, CardHeader, CardTitle, Badge, Button, StatsCard } from 'xertica-ui/ui';
|
|
35
|
+
import { Users, DollarSign, Activity, TrendingUp } from 'lucide-react';
|
|
36
|
+
|
|
37
|
+
export function DashboardPage() {
|
|
38
|
+
return (
|
|
39
|
+
<div className="flex flex-col gap-6 p-6 w-full max-w-[1400px] mx-auto">
|
|
40
|
+
{/* 1. Page Header */}
|
|
41
|
+
<div className="flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between">
|
|
42
|
+
<div>
|
|
43
|
+
<h1 className="text-2xl font-bold tracking-tight">Dashboard</h1>
|
|
44
|
+
<p className="text-muted-foreground">System overview</p>
|
|
45
|
+
</div>
|
|
46
|
+
<Button>Download Report</Button>
|
|
47
|
+
</div>
|
|
48
|
+
|
|
49
|
+
{/* 2. KPI Stats Row */}
|
|
50
|
+
<div className="grid gap-4 grid-cols-1 sm:grid-cols-2 lg:grid-cols-4">
|
|
51
|
+
<StatsCard
|
|
52
|
+
title="Total Revenue"
|
|
53
|
+
value="$45,231.89"
|
|
54
|
+
trend="+20.1%"
|
|
55
|
+
icon={<DollarSign className="size-4 text-muted-foreground" />}
|
|
56
|
+
/>
|
|
57
|
+
<StatsCard
|
|
58
|
+
title="Active Users"
|
|
59
|
+
value="+2,350"
|
|
60
|
+
trend="+180 this month"
|
|
61
|
+
icon={<Users className="size-4 text-muted-foreground" />}
|
|
62
|
+
/>
|
|
63
|
+
<StatsCard
|
|
64
|
+
title="Sales"
|
|
65
|
+
value="+12,234"
|
|
66
|
+
trend="+19% vs last month"
|
|
67
|
+
icon={<Activity className="size-4 text-muted-foreground" />}
|
|
68
|
+
/>
|
|
69
|
+
<StatsCard
|
|
70
|
+
title="Retention Rate"
|
|
71
|
+
value="89.3%"
|
|
72
|
+
trend="+1.2%"
|
|
73
|
+
icon={<TrendingUp className="size-4 text-muted-foreground" />}
|
|
74
|
+
/>
|
|
75
|
+
</div>
|
|
76
|
+
|
|
77
|
+
{/* 3. Chart + Feed Panel */}
|
|
78
|
+
<div className="grid gap-4 grid-cols-1 lg:grid-cols-7">
|
|
79
|
+
{/* Chart — takes 4 of 7 columns */}
|
|
80
|
+
<Card className="col-span-1 lg:col-span-4">
|
|
81
|
+
<CardHeader>
|
|
82
|
+
<CardTitle>Overview</CardTitle>
|
|
83
|
+
</CardHeader>
|
|
84
|
+
<CardContent className="h-[350px]">
|
|
85
|
+
{/* Mount a Recharts BarChart / LineChart here */}
|
|
86
|
+
<div className="flex h-full w-full items-center justify-center rounded-md border border-dashed bg-muted/20 text-muted-foreground">
|
|
87
|
+
Chart Area
|
|
88
|
+
</div>
|
|
89
|
+
</CardContent>
|
|
90
|
+
</Card>
|
|
91
|
+
|
|
92
|
+
{/* Activity Feed — takes 3 of 7 columns */}
|
|
93
|
+
<Card className="col-span-1 lg:col-span-3">
|
|
94
|
+
<CardHeader>
|
|
95
|
+
<CardTitle>Recent Events</CardTitle>
|
|
96
|
+
</CardHeader>
|
|
97
|
+
<CardContent>
|
|
98
|
+
<div className="space-y-4 text-sm">
|
|
99
|
+
<div className="flex items-center gap-4">
|
|
100
|
+
<Badge variant="outline">09:00</Badge>
|
|
101
|
+
<span>John Smith logged in</span>
|
|
102
|
+
</div>
|
|
103
|
+
<div className="flex items-center gap-4">
|
|
104
|
+
<Badge variant="outline">10:45</Badge>
|
|
105
|
+
<span>Invoice #INV004 paid</span>
|
|
106
|
+
</div>
|
|
107
|
+
</div>
|
|
108
|
+
</CardContent>
|
|
109
|
+
</Card>
|
|
110
|
+
</div>
|
|
111
|
+
</div>
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Composition Rules
|
|
119
|
+
|
|
120
|
+
1. **KPI cards always use the `StatsCard` pattern**: small title (`text-sm font-medium`), large value (`text-2xl font-bold`), supplementary trend text.
|
|
121
|
+
2. **Chart cards always occupy more grid space than feed cards** — use `col-span-4` vs `col-span-3` in a 7-column grid.
|
|
122
|
+
3. **Never hardcode pixel widths in grids** — use `lg:grid-cols-4`, `lg:grid-cols-7` with responsive overrides.
|
|
123
|
+
4. **Chart placeholder areas** use `border-dashed bg-muted/20` — never leave them blank.
|
|
124
|
+
5. **The max-width `max-w-[1400px]`** prevents the content from becoming too wide on large monitors.
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## Related Patterns
|
|
129
|
+
|
|
130
|
+
- [Analytics Pattern](./analytics.md) — When you need time-series filtering and comparative views
|
|
131
|
+
- [CRUD Pattern](./crud.md) — When the dashboard links to data management pages
|
|
132
|
+
|
|
133
|
+
## Related Components
|
|
134
|
+
|
|
135
|
+
- [`Card`](../components/card.md) — Primary container for all dashboard sections
|
|
136
|
+
- [`Badge`](../components/badge.md) — Status and timestamp labels
|
|
137
|
+
- [`Chart`](../components/chart.md) — Recharts integration for graph areas
|
|
138
|
+
- [`StatsCard`](../components/stats-card.md) — Pre-built KPI card component
|