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/templates/vite.config.ts
CHANGED
|
@@ -1,52 +1,55 @@
|
|
|
1
|
-
import { defineConfig } from 'vite';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import fs from 'fs';
|
|
4
|
-
import tailwindcss from '@tailwindcss/vite';
|
|
5
|
-
import react from '@vitejs/plugin-react';
|
|
6
|
-
|
|
7
|
-
// ── Monorepo dev aliases (auto-detected) ────────────────────────────────────
|
|
8
|
-
// When this vite.config lives inside the xertica-ui monorepo (i.e. the
|
|
9
|
-
// `components/` directory exists one level up), we alias every `xertica-ui/*`
|
|
10
|
-
// subpath directly to the TypeScript source so Vite HMR picks up changes
|
|
11
|
-
// without a full `npm run build` in the library root.
|
|
12
|
-
//
|
|
13
|
-
// When this file is copied to a project scaffolded by the CLI, `../components`
|
|
14
|
-
// does NOT exist and the aliases are simply skipped — the project resolves
|
|
15
|
-
// `xertica-ui` from node_modules as normal.
|
|
16
|
-
// ────────────────────────────────────────────────────────────────────────────
|
|
17
|
-
const LIB_ROOT = path.resolve(__dirname, '..');
|
|
18
|
-
const isMonorepo = fs.existsSync(path.join(LIB_ROOT, 'components', 'index.ts'));
|
|
19
|
-
|
|
20
|
-
const libAliases = isMonorepo
|
|
21
|
-
? [
|
|
22
|
-
{ find: 'xertica-ui/ui',
|
|
23
|
-
{ find: 'xertica-ui/blocks',
|
|
24
|
-
{
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
{ find: 'xertica-ui/
|
|
29
|
-
{ find: 'xertica-ui/
|
|
30
|
-
|
|
31
|
-
{ find: 'xertica-ui',
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
1
|
+
import { defineConfig } from 'vite';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import fs from 'fs';
|
|
4
|
+
import tailwindcss from '@tailwindcss/vite';
|
|
5
|
+
import react from '@vitejs/plugin-react';
|
|
6
|
+
|
|
7
|
+
// ── Monorepo dev aliases (auto-detected) ────────────────────────────────────
|
|
8
|
+
// When this vite.config lives inside the xertica-ui monorepo (i.e. the
|
|
9
|
+
// `components/` directory exists one level up), we alias every `xertica-ui/*`
|
|
10
|
+
// subpath directly to the TypeScript source so Vite HMR picks up changes
|
|
11
|
+
// without a full `npm run build` in the library root.
|
|
12
|
+
//
|
|
13
|
+
// When this file is copied to a project scaffolded by the CLI, `../components`
|
|
14
|
+
// does NOT exist and the aliases are simply skipped — the project resolves
|
|
15
|
+
// `xertica-ui` from node_modules as normal.
|
|
16
|
+
// ────────────────────────────────────────────────────────────────────────────
|
|
17
|
+
const LIB_ROOT = path.resolve(__dirname, '..');
|
|
18
|
+
const isMonorepo = fs.existsSync(path.join(LIB_ROOT, 'components', 'index.ts'));
|
|
19
|
+
|
|
20
|
+
const libAliases = isMonorepo
|
|
21
|
+
? [
|
|
22
|
+
{ find: 'xertica-ui/ui', replacement: path.join(LIB_ROOT, 'components/ui/index.ts') },
|
|
23
|
+
{ find: 'xertica-ui/blocks', replacement: path.join(LIB_ROOT, 'components/blocks/index.ts') },
|
|
24
|
+
{
|
|
25
|
+
find: 'xertica-ui/assistant',
|
|
26
|
+
replacement: path.join(LIB_ROOT, 'components/assistant/index.ts'),
|
|
27
|
+
},
|
|
28
|
+
{ find: 'xertica-ui/layout', replacement: path.join(LIB_ROOT, 'components/layout/index.ts') },
|
|
29
|
+
{ find: 'xertica-ui/brand', replacement: path.join(LIB_ROOT, 'components/brand/index.ts') },
|
|
30
|
+
{ find: 'xertica-ui/media', replacement: path.join(LIB_ROOT, 'components/media/index.ts') },
|
|
31
|
+
{ find: 'xertica-ui/hooks', replacement: path.join(LIB_ROOT, 'components/hooks/index.ts') },
|
|
32
|
+
{ find: 'xertica-ui/pages', replacement: path.join(LIB_ROOT, 'components/pages/index.ts') },
|
|
33
|
+
// Bare `xertica-ui` must come AFTER subpaths (most-specific first).
|
|
34
|
+
{ find: 'xertica-ui', replacement: path.join(LIB_ROOT, 'components/index.ts') },
|
|
35
|
+
]
|
|
36
|
+
: [];
|
|
37
|
+
|
|
38
|
+
export default defineConfig({
|
|
39
|
+
plugins: [
|
|
40
|
+
// The React and Tailwind plugins are both required for Make, even if
|
|
41
|
+
// Tailwind is not being actively used — do not remove them.
|
|
42
|
+
react(),
|
|
43
|
+
tailwindcss(),
|
|
44
|
+
],
|
|
45
|
+
resolve: {
|
|
46
|
+
alias: [
|
|
47
|
+
...libAliases,
|
|
48
|
+
// Alias @ to the src directory
|
|
49
|
+
{ find: '@', replacement: path.resolve(__dirname, './src') },
|
|
50
|
+
],
|
|
51
|
+
},
|
|
52
|
+
|
|
53
|
+
// File types to support raw imports. Never add .css, .tsx, or .ts files to this.
|
|
54
|
+
assetsInclude: ['**/*.svg', '**/*.csv'],
|
|
52
55
|
});
|
package/utils/color-utils.ts
CHANGED
|
@@ -1,72 +1,72 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Color utility functions shared across the project.
|
|
3
|
-
* Extracted from BrandColorsContext to allow reuse and isolated testing.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Converts a hex color string to its RGB components.
|
|
8
|
-
* @param hex - Hex color string (with or without leading `#`)
|
|
9
|
-
* @returns Object with `r`, `g`, `b` values (0–255), or `null` if invalid
|
|
10
|
-
*
|
|
11
|
-
* @example
|
|
12
|
-
* hexToRgb('#3b82f6') // { r: 59, g: 130, b: 246 }
|
|
13
|
-
* hexToRgb('3b82f6') // { r: 59, g: 130, b: 246 }
|
|
14
|
-
* hexToRgb('invalid') // null
|
|
15
|
-
*/
|
|
16
|
-
export function hexToRgb(hex: string): { r: number; g: number; b: number } | null {
|
|
17
|
-
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
|
|
18
|
-
return result
|
|
19
|
-
? {
|
|
20
|
-
r: parseInt(result[1], 16),
|
|
21
|
-
g: parseInt(result[2], 16),
|
|
22
|
-
b: parseInt(result[3], 16),
|
|
23
|
-
}
|
|
24
|
-
: null;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Converts RGB components to an `rgba()` CSS string.
|
|
29
|
-
* @param r - Red (0–255)
|
|
30
|
-
* @param g - Green (0–255)
|
|
31
|
-
* @param b - Blue (0–255)
|
|
32
|
-
* @param alpha - Alpha (0–1), defaults to 1
|
|
33
|
-
*
|
|
34
|
-
* @example
|
|
35
|
-
* rgbToRgba(59, 130, 246, 0.5) // 'rgba(59, 130, 246, 0.5)'
|
|
36
|
-
*/
|
|
37
|
-
export function rgbToRgba(r: number, g: number, b: number, alpha = 1): string {
|
|
38
|
-
return `rgba(${r}, ${g}, ${b}, ${alpha})`;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Converts a hex color to an `rgba()` CSS string.
|
|
43
|
-
* Returns `null` if the hex is invalid.
|
|
44
|
-
*
|
|
45
|
-
* @example
|
|
46
|
-
* hexToRgba('#3b82f6', 0.15) // 'rgba(59, 130, 246, 0.15)'
|
|
47
|
-
*/
|
|
48
|
-
export function hexToRgba(hex: string, alpha = 1): string | null {
|
|
49
|
-
const rgb = hexToRgb(hex);
|
|
50
|
-
if (!rgb) return null;
|
|
51
|
-
return rgbToRgba(rgb.r, rgb.g, rgb.b, alpha);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Determines whether a hex color is considered "light" based on its luminance.
|
|
56
|
-
* Uses the W3C relative luminance formula.
|
|
57
|
-
*
|
|
58
|
-
* @param hex - Hex color string
|
|
59
|
-
* @returns `true` if the color is light, `false` if dark
|
|
60
|
-
*
|
|
61
|
-
* @example
|
|
62
|
-
* isLightColor('#ffffff') // true
|
|
63
|
-
* isLightColor('#000000') // false
|
|
64
|
-
* isLightColor('#3b82f6') // false
|
|
65
|
-
*/
|
|
66
|
-
export function isLightColor(hex: string): boolean {
|
|
67
|
-
const rgb = hexToRgb(hex);
|
|
68
|
-
if (!rgb) return true;
|
|
69
|
-
// W3C relative luminance
|
|
70
|
-
const luminance = (0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b) / 255;
|
|
71
|
-
return luminance > 0.5;
|
|
72
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Color utility functions shared across the project.
|
|
3
|
+
* Extracted from BrandColorsContext to allow reuse and isolated testing.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Converts a hex color string to its RGB components.
|
|
8
|
+
* @param hex - Hex color string (with or without leading `#`)
|
|
9
|
+
* @returns Object with `r`, `g`, `b` values (0–255), or `null` if invalid
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* hexToRgb('#3b82f6') // { r: 59, g: 130, b: 246 }
|
|
13
|
+
* hexToRgb('3b82f6') // { r: 59, g: 130, b: 246 }
|
|
14
|
+
* hexToRgb('invalid') // null
|
|
15
|
+
*/
|
|
16
|
+
export function hexToRgb(hex: string): { r: number; g: number; b: number } | null {
|
|
17
|
+
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
|
|
18
|
+
return result
|
|
19
|
+
? {
|
|
20
|
+
r: parseInt(result[1], 16),
|
|
21
|
+
g: parseInt(result[2], 16),
|
|
22
|
+
b: parseInt(result[3], 16),
|
|
23
|
+
}
|
|
24
|
+
: null;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Converts RGB components to an `rgba()` CSS string.
|
|
29
|
+
* @param r - Red (0–255)
|
|
30
|
+
* @param g - Green (0–255)
|
|
31
|
+
* @param b - Blue (0–255)
|
|
32
|
+
* @param alpha - Alpha (0–1), defaults to 1
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* rgbToRgba(59, 130, 246, 0.5) // 'rgba(59, 130, 246, 0.5)'
|
|
36
|
+
*/
|
|
37
|
+
export function rgbToRgba(r: number, g: number, b: number, alpha = 1): string {
|
|
38
|
+
return `rgba(${r}, ${g}, ${b}, ${alpha})`;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Converts a hex color to an `rgba()` CSS string.
|
|
43
|
+
* Returns `null` if the hex is invalid.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* hexToRgba('#3b82f6', 0.15) // 'rgba(59, 130, 246, 0.15)'
|
|
47
|
+
*/
|
|
48
|
+
export function hexToRgba(hex: string, alpha = 1): string | null {
|
|
49
|
+
const rgb = hexToRgb(hex);
|
|
50
|
+
if (!rgb) return null;
|
|
51
|
+
return rgbToRgba(rgb.r, rgb.g, rgb.b, alpha);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Determines whether a hex color is considered "light" based on its luminance.
|
|
56
|
+
* Uses the W3C relative luminance formula.
|
|
57
|
+
*
|
|
58
|
+
* @param hex - Hex color string
|
|
59
|
+
* @returns `true` if the color is light, `false` if dark
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* isLightColor('#ffffff') // true
|
|
63
|
+
* isLightColor('#000000') // false
|
|
64
|
+
* isLightColor('#3b82f6') // false
|
|
65
|
+
*/
|
|
66
|
+
export function isLightColor(hex: string): boolean {
|
|
67
|
+
const rgb = hexToRgb(hex);
|
|
68
|
+
if (!rgb) return true;
|
|
69
|
+
// W3C relative luminance
|
|
70
|
+
const luminance = (0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b) / 255;
|
|
71
|
+
return luminance > 0.5;
|
|
72
|
+
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { getDemoResponse } from './demo-responses';
|
|
3
|
-
|
|
4
|
-
describe('demo-responses', () => {
|
|
5
|
-
it('returns a demo response', () => {
|
|
6
|
-
const response = getDemoResponse('hello');
|
|
7
|
-
const content = typeof response === 'string' ? response : response.content;
|
|
8
|
-
expect(content?.length).toBeGreaterThan(0);
|
|
9
|
-
});
|
|
10
|
-
});
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { getDemoResponse } from './demo-responses';
|
|
3
|
+
|
|
4
|
+
describe('demo-responses', () => {
|
|
5
|
+
it('returns a demo response', () => {
|
|
6
|
+
const response = getDemoResponse('hello');
|
|
7
|
+
const content = typeof response === 'string' ? response : response.content;
|
|
8
|
+
expect(content?.length).toBeGreaterThan(0);
|
|
9
|
+
});
|
|
10
|
+
});
|
package/utils/demo-responses.ts
CHANGED
|
@@ -1,151 +1,151 @@
|
|
|
1
|
-
import { Message } from '../components/assistant/xertica-assistant';
|
|
2
|
-
|
|
3
|
-
export const generateDemoResponse = (mensagemUsuario: string): string | Partial<Message> => {
|
|
4
|
-
const mensagemLower = mensagemUsuario.toLowerCase();
|
|
5
|
-
|
|
6
|
-
if (
|
|
7
|
-
mensagemLower.includes('o que') &&
|
|
8
|
-
(mensagemLower.includes('fazer') || mensagemLower.includes('pedir'))
|
|
9
|
-
) {
|
|
10
|
-
return 'Posso ajudar você com diversas tarefas! Posso:\n\n• Analisar dados e métricas dos seus projetos\n• Responder perguntas sobre performance e resultados\n• Sugerir otimizações e melhorias\n• Gerar relatórios e documentação\n• Ajudar no planejamento de sprints\n• E muito mais!\n\nQual tarefa você gostaria de realizar primeiro?';
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
if (mensagemLower.includes('o que você faz') || mensagemLower.includes('quem é você')) {
|
|
14
|
-
return 'Olá! Sou o Assistente Xertica, uma IA desenvolvida para ajudar você a gerenciar projetos, analisar dados e otimizar processos. Estou aqui 24/7 para responder suas perguntas e auxiliar nas suas tarefas diárias.\n\nPosso processar documentos, analisar áudios e imagens, além de fornecer insights baseados nos dados da plataforma.';
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
if (
|
|
18
|
-
mensagemLower.includes('projeto') &&
|
|
19
|
-
(mensagemLower.includes('preocupar') || mensagemLower.includes('atenção'))
|
|
20
|
-
) {
|
|
21
|
-
return 'Com base na análise dos seus projetos ativos, recomendo focar nos seguintes:\n\n1. **Projeto Alpha** - 15% acima do prazo, requer atenção imediata\n2. **Sistema Beta** - Performance crítica, necessita otimização\n3. **Mobile Gamma** - Aguardando aprovações há 5 dias\n\nGostaria de mais detalhes sobre algum deles?';
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
if (mensagemLower.includes('próximo projeto') || mensagemLower.includes('próxima tarefa')) {
|
|
25
|
-
return 'Seu próximo projeto prioritário é o **Sistema de Analytics V2**.\n\n📅 Início previsto: Próxima segunda-feira\n👥 Time: 5 desenvolvedores\n⏱️ Duração estimada: 3 sprints\n\nJá preparei um roadmap inicial. Gostaria de revisar?';
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
if (
|
|
29
|
-
mensagemLower.includes('desempenho') ||
|
|
30
|
-
mensagemLower.includes('performance') ||
|
|
31
|
-
mensagemLower.includes('melhor')
|
|
32
|
-
) {
|
|
33
|
-
return {
|
|
34
|
-
content:
|
|
35
|
-
'Analisando os dados de performance dos últimos 6 meses:\n\n🏆 **Melhor Performance:**\n• Projeto Dashboard 2.0: +35% eficiência\n• Sistema CRM: -40% tempo de resposta\n• App Mobile: 4.8★ rating (+0.5)\n\n📊 Visualize o crescimento abaixo:',
|
|
36
|
-
chartData: [
|
|
37
|
-
{ month: 'Jan', desktop: 186, mobile: 80 },
|
|
38
|
-
{ month: 'Fev', desktop: 305, mobile: 200 },
|
|
39
|
-
{ month: 'Mar', desktop: 237, mobile: 120 },
|
|
40
|
-
{ month: 'Abr', desktop: 73, mobile: 190 },
|
|
41
|
-
{ month: 'Mai', desktop: 209, mobile: 130 },
|
|
42
|
-
{ month: 'Jun', desktop: 214, mobile: 140 },
|
|
43
|
-
],
|
|
44
|
-
chartConfig: {
|
|
45
|
-
desktop: { label: 'Desktop', color: 'hsl(var(--chart-1))' },
|
|
46
|
-
mobile: { label: 'Mobile', color: 'hsl(var(--chart-2))' },
|
|
47
|
-
},
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
if (
|
|
52
|
-
mensagemLower.includes('tabela') ||
|
|
53
|
-
mensagemLower.includes('lista') ||
|
|
54
|
-
mensagemLower.includes('relatório')
|
|
55
|
-
) {
|
|
56
|
-
return {
|
|
57
|
-
content: 'Aqui está o relatório detalhado dos projetos ativos:',
|
|
58
|
-
tableData: {
|
|
59
|
-
caption: 'Status dos Projetos - Q1 2024',
|
|
60
|
-
headers: ['Projeto', 'Status', 'Prioridade', 'Responsável'],
|
|
61
|
-
rows: [
|
|
62
|
-
['Analytics Dashboard', 'Em Progresso', 'Alta', 'João Silva'],
|
|
63
|
-
['Mobile App V2', 'Revisão', 'Média', 'Maria Santos'],
|
|
64
|
-
['API Gateway', 'Concluído', 'Baixa', 'Carlos Souza'],
|
|
65
|
-
['Website Institucional', 'Em Progresso', 'Média', 'Ana Oliveira'],
|
|
66
|
-
['Sistema de Pagamentos', 'Planejamento', 'Crítica', 'Pedro Costa'],
|
|
67
|
-
],
|
|
68
|
-
},
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
if (
|
|
73
|
-
mensagemLower.includes('olá') ||
|
|
74
|
-
mensagemLower.includes('oi') ||
|
|
75
|
-
mensagemLower.includes('bom dia') ||
|
|
76
|
-
mensagemLower.includes('boa tarde') ||
|
|
77
|
-
mensagemLower.includes('boa noite')
|
|
78
|
-
) {
|
|
79
|
-
return 'Olá! 👋 Como posso ajudar você hoje? Estou pronto para auxiliar com análises, relatórios ou responder suas dúvidas sobre os projetos.';
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
if (mensagemLower.includes('obrigado') || mensagemLower.includes('obrigada')) {
|
|
83
|
-
return 'Por nada! Estou aqui sempre que precisar. 😊 Se tiver mais alguma dúvida ou precisar de ajuda, é só chamar!';
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
if (mensagemLower.includes('criar documento')) {
|
|
87
|
-
const tema = mensagemUsuario.replace(/📄 \[Criar documento\]/gi, '').trim();
|
|
88
|
-
return {
|
|
89
|
-
content: `📝 Documento criado com sucesso!\n\nGerei um documento completo sobre "${tema}" com as seguintes seções:\n\n• Introdução e contexto\n• Análise detalhada\n• Dados e métricas relevantes\n• Conclusões e recomendações\n• Próximos passos\n\nO documento está pronto para revisão e pode ser editado conforme necessário. Gostaria de adicionar ou modificar alguma seção?`,
|
|
90
|
-
attachmentType: 'document',
|
|
91
|
-
documentTitle: `Documento: ${tema}`,
|
|
92
|
-
documentContent: `# ${tema}\n\n## Introdução\nEste documento foi gerado automaticamente.\n\n## Conteúdo\nConteúdo gerado sobre ${tema}...`,
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
if (mensagemLower.includes('gerar podcast')) {
|
|
97
|
-
const tema = mensagemUsuario.replace(/🎙️ \[Gerar podcast\]/gi, '').trim();
|
|
98
|
-
return {
|
|
99
|
-
content: `🎙️ Preparando podcast sobre "${tema}"...\n\nEstou processando o conteúdo e gerando um roteiro de podcast profissional com:\n\n• Introdução envolvente\n• Desenvolvimento do tema\n• Exemplos práticos\n• Conclusão e insights\n\nO áudio será gerado em instantes. Aguarde...`,
|
|
100
|
-
attachmentType: 'podcast',
|
|
101
|
-
attachmentName: `Podcast - ${tema}.mp3`,
|
|
102
|
-
audioUrl:
|
|
103
|
-
'data:audio/mp3;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU4Ljc2LjEwMAAAAAAAAAAAAAAA//tQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAADhAC7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7v///////////////////////////////////////////8AAAAATGF2YzU4LjEzAAAAAAAAAAAAAAAAJAAAAAAAAAAAA4TnTxAOAAAAAAD/+xBkAA',
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
if (mensagemLower.includes('pesquisar')) {
|
|
108
|
-
const termo = mensagemUsuario.replace(/🔍 \[Pesquisar\]/gi, '').trim();
|
|
109
|
-
return {
|
|
110
|
-
content: `🔍 Resultados da pesquisa sobre "${termo}"\n\n**Encontrei as seguintes informações relevantes:**\n\n1. **Documentação interna** - 12 resultados\n Guias e manuais relacionados ao tema\n\n2. **Projetos relacionados** - 8 projetos\n Incluindo Analytics v2 e Dashboard Pro\n\n3. **Discussões em equipe** - 15 menções\n Últimas conversas sobre o assunto\n\nGostaria de ver mais detalhes sobre algum desses resultados?`,
|
|
111
|
-
attachmentType: 'search',
|
|
112
|
-
searchResults: [
|
|
113
|
-
{
|
|
114
|
-
id: '1',
|
|
115
|
-
title: 'Doc 1',
|
|
116
|
-
description: 'Descrição 1',
|
|
117
|
-
type: 'document',
|
|
118
|
-
path: '/docs/1',
|
|
119
|
-
relevance: 0.9,
|
|
120
|
-
},
|
|
121
|
-
{
|
|
122
|
-
id: '2',
|
|
123
|
-
title: 'Projeto A',
|
|
124
|
-
description: 'Projeto Alpha',
|
|
125
|
-
type: 'project',
|
|
126
|
-
path: '/projects/a',
|
|
127
|
-
relevance: 0.8,
|
|
128
|
-
},
|
|
129
|
-
],
|
|
130
|
-
searchSources: [
|
|
131
|
-
{ name: 'Documentos', count: 12 },
|
|
132
|
-
{ name: 'Projetos', count: 8 },
|
|
133
|
-
],
|
|
134
|
-
};
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
if (mensagemLower.includes('arquivo') || mensagemLower.includes('documento')) {
|
|
138
|
-
return 'Entendi que você deseja trabalhar com arquivos. Posso analisar diversos tipos de documentos:\n\n📄 Documentos de texto (PDF, DOCX)\n📊 Planilhas (XLSX, CSV)\n📈 Relatórios e apresentações\n\nBasta enviá-los usando o botão de anexo (📎) e terei prazer em analisá-los para você!';
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
const respostasGenericas = [
|
|
142
|
-
'Entendo sua questão. Com base nos dados disponíveis na plataforma Xertica, posso fornecer análises detalhadas sobre esse tema. Poderia me dar mais contexto para que eu possa ajudá-lo melhor?',
|
|
143
|
-
'Interessante! Deixe-me processar isso... Com base no seu histórico e nos dados do sistema, recomendo que possamos explorar essa questão em mais detalhes. O que especificamente você gostaria de saber?',
|
|
144
|
-
'Ótima pergunta! Para te dar a melhor resposta possível, preciso entender melhor o contexto. Você pode me fornecer mais informações sobre o que está buscando?',
|
|
145
|
-
'Estou analisando sua solicitação. Baseado nos dados do sistema Xertica, posso te ajudar com isso. Você gostaria de uma análise rápida ou um relatório completo?',
|
|
146
|
-
];
|
|
147
|
-
|
|
148
|
-
return respostasGenericas[Math.floor(Math.random() * respostasGenericas.length)];
|
|
149
|
-
};
|
|
150
|
-
|
|
151
|
-
export const getDemoResponse = generateDemoResponse;
|
|
1
|
+
import { Message } from '../components/assistant/xertica-assistant';
|
|
2
|
+
|
|
3
|
+
export const generateDemoResponse = (mensagemUsuario: string): string | Partial<Message> => {
|
|
4
|
+
const mensagemLower = mensagemUsuario.toLowerCase();
|
|
5
|
+
|
|
6
|
+
if (
|
|
7
|
+
mensagemLower.includes('o que') &&
|
|
8
|
+
(mensagemLower.includes('fazer') || mensagemLower.includes('pedir'))
|
|
9
|
+
) {
|
|
10
|
+
return 'Posso ajudar você com diversas tarefas! Posso:\n\n• Analisar dados e métricas dos seus projetos\n• Responder perguntas sobre performance e resultados\n• Sugerir otimizações e melhorias\n• Gerar relatórios e documentação\n• Ajudar no planejamento de sprints\n• E muito mais!\n\nQual tarefa você gostaria de realizar primeiro?';
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
if (mensagemLower.includes('o que você faz') || mensagemLower.includes('quem é você')) {
|
|
14
|
+
return 'Olá! Sou o Assistente Xertica, uma IA desenvolvida para ajudar você a gerenciar projetos, analisar dados e otimizar processos. Estou aqui 24/7 para responder suas perguntas e auxiliar nas suas tarefas diárias.\n\nPosso processar documentos, analisar áudios e imagens, além de fornecer insights baseados nos dados da plataforma.';
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
if (
|
|
18
|
+
mensagemLower.includes('projeto') &&
|
|
19
|
+
(mensagemLower.includes('preocupar') || mensagemLower.includes('atenção'))
|
|
20
|
+
) {
|
|
21
|
+
return 'Com base na análise dos seus projetos ativos, recomendo focar nos seguintes:\n\n1. **Projeto Alpha** - 15% acima do prazo, requer atenção imediata\n2. **Sistema Beta** - Performance crítica, necessita otimização\n3. **Mobile Gamma** - Aguardando aprovações há 5 dias\n\nGostaria de mais detalhes sobre algum deles?';
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (mensagemLower.includes('próximo projeto') || mensagemLower.includes('próxima tarefa')) {
|
|
25
|
+
return 'Seu próximo projeto prioritário é o **Sistema de Analytics V2**.\n\n📅 Início previsto: Próxima segunda-feira\n👥 Time: 5 desenvolvedores\n⏱️ Duração estimada: 3 sprints\n\nJá preparei um roadmap inicial. Gostaria de revisar?';
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (
|
|
29
|
+
mensagemLower.includes('desempenho') ||
|
|
30
|
+
mensagemLower.includes('performance') ||
|
|
31
|
+
mensagemLower.includes('melhor')
|
|
32
|
+
) {
|
|
33
|
+
return {
|
|
34
|
+
content:
|
|
35
|
+
'Analisando os dados de performance dos últimos 6 meses:\n\n🏆 **Melhor Performance:**\n• Projeto Dashboard 2.0: +35% eficiência\n• Sistema CRM: -40% tempo de resposta\n• App Mobile: 4.8★ rating (+0.5)\n\n📊 Visualize o crescimento abaixo:',
|
|
36
|
+
chartData: [
|
|
37
|
+
{ month: 'Jan', desktop: 186, mobile: 80 },
|
|
38
|
+
{ month: 'Fev', desktop: 305, mobile: 200 },
|
|
39
|
+
{ month: 'Mar', desktop: 237, mobile: 120 },
|
|
40
|
+
{ month: 'Abr', desktop: 73, mobile: 190 },
|
|
41
|
+
{ month: 'Mai', desktop: 209, mobile: 130 },
|
|
42
|
+
{ month: 'Jun', desktop: 214, mobile: 140 },
|
|
43
|
+
],
|
|
44
|
+
chartConfig: {
|
|
45
|
+
desktop: { label: 'Desktop', color: 'hsl(var(--chart-1))' },
|
|
46
|
+
mobile: { label: 'Mobile', color: 'hsl(var(--chart-2))' },
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (
|
|
52
|
+
mensagemLower.includes('tabela') ||
|
|
53
|
+
mensagemLower.includes('lista') ||
|
|
54
|
+
mensagemLower.includes('relatório')
|
|
55
|
+
) {
|
|
56
|
+
return {
|
|
57
|
+
content: 'Aqui está o relatório detalhado dos projetos ativos:',
|
|
58
|
+
tableData: {
|
|
59
|
+
caption: 'Status dos Projetos - Q1 2024',
|
|
60
|
+
headers: ['Projeto', 'Status', 'Prioridade', 'Responsável'],
|
|
61
|
+
rows: [
|
|
62
|
+
['Analytics Dashboard', 'Em Progresso', 'Alta', 'João Silva'],
|
|
63
|
+
['Mobile App V2', 'Revisão', 'Média', 'Maria Santos'],
|
|
64
|
+
['API Gateway', 'Concluído', 'Baixa', 'Carlos Souza'],
|
|
65
|
+
['Website Institucional', 'Em Progresso', 'Média', 'Ana Oliveira'],
|
|
66
|
+
['Sistema de Pagamentos', 'Planejamento', 'Crítica', 'Pedro Costa'],
|
|
67
|
+
],
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (
|
|
73
|
+
mensagemLower.includes('olá') ||
|
|
74
|
+
mensagemLower.includes('oi') ||
|
|
75
|
+
mensagemLower.includes('bom dia') ||
|
|
76
|
+
mensagemLower.includes('boa tarde') ||
|
|
77
|
+
mensagemLower.includes('boa noite')
|
|
78
|
+
) {
|
|
79
|
+
return 'Olá! 👋 Como posso ajudar você hoje? Estou pronto para auxiliar com análises, relatórios ou responder suas dúvidas sobre os projetos.';
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (mensagemLower.includes('obrigado') || mensagemLower.includes('obrigada')) {
|
|
83
|
+
return 'Por nada! Estou aqui sempre que precisar. 😊 Se tiver mais alguma dúvida ou precisar de ajuda, é só chamar!';
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (mensagemLower.includes('criar documento')) {
|
|
87
|
+
const tema = mensagemUsuario.replace(/📄 \[Criar documento\]/gi, '').trim();
|
|
88
|
+
return {
|
|
89
|
+
content: `📝 Documento criado com sucesso!\n\nGerei um documento completo sobre "${tema}" com as seguintes seções:\n\n• Introdução e contexto\n• Análise detalhada\n• Dados e métricas relevantes\n• Conclusões e recomendações\n• Próximos passos\n\nO documento está pronto para revisão e pode ser editado conforme necessário. Gostaria de adicionar ou modificar alguma seção?`,
|
|
90
|
+
attachmentType: 'document',
|
|
91
|
+
documentTitle: `Documento: ${tema}`,
|
|
92
|
+
documentContent: `# ${tema}\n\n## Introdução\nEste documento foi gerado automaticamente.\n\n## Conteúdo\nConteúdo gerado sobre ${tema}...`,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (mensagemLower.includes('gerar podcast')) {
|
|
97
|
+
const tema = mensagemUsuario.replace(/🎙️ \[Gerar podcast\]/gi, '').trim();
|
|
98
|
+
return {
|
|
99
|
+
content: `🎙️ Preparando podcast sobre "${tema}"...\n\nEstou processando o conteúdo e gerando um roteiro de podcast profissional com:\n\n• Introdução envolvente\n• Desenvolvimento do tema\n• Exemplos práticos\n• Conclusão e insights\n\nO áudio será gerado em instantes. Aguarde...`,
|
|
100
|
+
attachmentType: 'podcast',
|
|
101
|
+
attachmentName: `Podcast - ${tema}.mp3`,
|
|
102
|
+
audioUrl:
|
|
103
|
+
'data:audio/mp3;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU4Ljc2LjEwMAAAAAAAAAAAAAAA//tQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAADhAC7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7v///////////////////////////////////////////8AAAAATGF2YzU4LjEzAAAAAAAAAAAAAAAAJAAAAAAAAAAAA4TnTxAOAAAAAAD/+xBkAA',
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (mensagemLower.includes('pesquisar')) {
|
|
108
|
+
const termo = mensagemUsuario.replace(/🔍 \[Pesquisar\]/gi, '').trim();
|
|
109
|
+
return {
|
|
110
|
+
content: `🔍 Resultados da pesquisa sobre "${termo}"\n\n**Encontrei as seguintes informações relevantes:**\n\n1. **Documentação interna** - 12 resultados\n Guias e manuais relacionados ao tema\n\n2. **Projetos relacionados** - 8 projetos\n Incluindo Analytics v2 e Dashboard Pro\n\n3. **Discussões em equipe** - 15 menções\n Últimas conversas sobre o assunto\n\nGostaria de ver mais detalhes sobre algum desses resultados?`,
|
|
111
|
+
attachmentType: 'search',
|
|
112
|
+
searchResults: [
|
|
113
|
+
{
|
|
114
|
+
id: '1',
|
|
115
|
+
title: 'Doc 1',
|
|
116
|
+
description: 'Descrição 1',
|
|
117
|
+
type: 'document',
|
|
118
|
+
path: '/docs/1',
|
|
119
|
+
relevance: 0.9,
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
id: '2',
|
|
123
|
+
title: 'Projeto A',
|
|
124
|
+
description: 'Projeto Alpha',
|
|
125
|
+
type: 'project',
|
|
126
|
+
path: '/projects/a',
|
|
127
|
+
relevance: 0.8,
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
searchSources: [
|
|
131
|
+
{ name: 'Documentos', count: 12 },
|
|
132
|
+
{ name: 'Projetos', count: 8 },
|
|
133
|
+
],
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (mensagemLower.includes('arquivo') || mensagemLower.includes('documento')) {
|
|
138
|
+
return 'Entendi que você deseja trabalhar com arquivos. Posso analisar diversos tipos de documentos:\n\n📄 Documentos de texto (PDF, DOCX)\n📊 Planilhas (XLSX, CSV)\n📈 Relatórios e apresentações\n\nBasta enviá-los usando o botão de anexo (📎) e terei prazer em analisá-los para você!';
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const respostasGenericas = [
|
|
142
|
+
'Entendo sua questão. Com base nos dados disponíveis na plataforma Xertica, posso fornecer análises detalhadas sobre esse tema. Poderia me dar mais contexto para que eu possa ajudá-lo melhor?',
|
|
143
|
+
'Interessante! Deixe-me processar isso... Com base no seu histórico e nos dados do sistema, recomendo que possamos explorar essa questão em mais detalhes. O que especificamente você gostaria de saber?',
|
|
144
|
+
'Ótima pergunta! Para te dar a melhor resposta possível, preciso entender melhor o contexto. Você pode me fornecer mais informações sobre o que está buscando?',
|
|
145
|
+
'Estou analisando sua solicitação. Baseado nos dados do sistema Xertica, posso te ajudar com isso. Você gostaria de uma análise rápida ou um relatório completo?',
|
|
146
|
+
];
|
|
147
|
+
|
|
148
|
+
return respostasGenericas[Math.floor(Math.random() * respostasGenericas.length)];
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
export const getDemoResponse = generateDemoResponse;
|
package/utils/gemini.test.ts
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
-
import { callGeminiAPI, buildSystemPrompt } from './gemini';
|
|
3
|
-
|
|
4
|
-
describe('gemini utility', () => {
|
|
5
|
-
beforeEach(() => {
|
|
6
|
-
vi.clearAllMocks();
|
|
7
|
-
});
|
|
8
|
-
|
|
9
|
-
it('builds system prompt correctly', () => {
|
|
10
|
-
const prompt = buildSystemPrompt();
|
|
11
|
-
expect(prompt).toContain('Assistente Xertica');
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
it.skip('calls Gemini API - requires real API key in .env', async () => {
|
|
15
|
-
// Skipped by default - API key may exceed quota (429 error)
|
|
16
|
-
// To enable: change it.skip to it
|
|
17
|
-
const apiKey = import.meta.env.VITE_GEMINI_API_KEY || '';
|
|
18
|
-
if (!apiKey) {
|
|
19
|
-
console.log('Skipping test - no VITE_GEMINI_API_KEY in .env');
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
const response = await callGeminiAPI(apiKey, 'hello');
|
|
23
|
-
expect(typeof response).toBe('string');
|
|
24
|
-
}, 30000);
|
|
25
|
-
});
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import { callGeminiAPI, buildSystemPrompt } from './gemini';
|
|
3
|
+
|
|
4
|
+
describe('gemini utility', () => {
|
|
5
|
+
beforeEach(() => {
|
|
6
|
+
vi.clearAllMocks();
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
it('builds system prompt correctly', () => {
|
|
10
|
+
const prompt = buildSystemPrompt();
|
|
11
|
+
expect(prompt).toContain('Assistente Xertica');
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
it.skip('calls Gemini API - requires real API key in .env', async () => {
|
|
15
|
+
// Skipped by default - API key may exceed quota (429 error)
|
|
16
|
+
// To enable: change it.skip to it
|
|
17
|
+
const apiKey = import.meta.env.VITE_GEMINI_API_KEY || '';
|
|
18
|
+
if (!apiKey) {
|
|
19
|
+
console.log('Skipping test - no VITE_GEMINI_API_KEY in .env');
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const response = await callGeminiAPI(apiKey, 'hello');
|
|
23
|
+
expect(typeof response).toBe('string');
|
|
24
|
+
}, 30000);
|
|
25
|
+
});
|