xertica-ui 2.5.3 → 2.7.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 +705 -664
- package/README.md +482 -482
- package/assets/xertica-logo.svg +37 -37
- package/assets/xertica-x-logo.svg +20 -20
- package/bin/cli.ts +1293 -1256
- package/bin/generate-tokens.ts +256 -262
- package/bin/language-config.test.ts +32 -0
- package/bin/language-config.ts +384 -359
- package/components/Introduction.mdx +121 -121
- package/components/assistant/code-block/CodeBlock.tsx +7 -6
- package/components/assistant/code-block/code-block.mdx +38 -38
- package/components/assistant/code-block/code-block.test.tsx +2 -1
- package/components/assistant/formatted-document/FormattedDocument.tsx +3 -0
- package/components/assistant/formatted-document/formatted-document.mdx +31 -31
- package/components/assistant/formatted-document/formatted-document.test.tsx +5 -4
- package/components/assistant/markdown-message/MarkdownMessage.tsx +1 -1
- package/components/assistant/markdown-message/markdown-message.mdx +44 -44
- package/components/assistant/modern-chat-input/modern-chat-input.mdx +71 -71
- package/components/assistant/modern-chat-input/modern-chat-input.test.tsx +3 -2
- package/components/assistant/xertica-assistant/parts/AssistantMessageBubble.tsx +1 -1
- package/components/assistant/xertica-assistant/types.ts +3 -2
- package/components/assistant/xertica-assistant/use-assistant.ts +10 -10
- package/components/assistant/xertica-assistant/xertica-assistant.mdx +66 -66
- package/components/assistant/xertica-assistant/xertica-assistant.test.tsx +2 -1
- package/{templates/src/features/auth/ui → components/blocks/auth}/AuthPageShell.tsx +37 -32
- package/components/blocks/auth/PasswordStrengthMeter.tsx +41 -0
- package/components/blocks/auth/SocialLoginButtons.tsx +95 -0
- package/components/blocks/auth/index.ts +11 -0
- package/components/blocks/auth/usePasswordStrength.ts +13 -0
- package/components/blocks/card-patterns/card-patterns.mdx +123 -123
- package/components/blocks/index.ts +1 -0
- package/components/brand/branding/branding.mdx +27 -27
- package/components/brand/language-selector/language-selector.mdx +126 -126
- package/components/brand/theme-toggle/theme-toggle.mdx +47 -47
- package/components/brand/theme-toggle/theme-toggle.test.tsx +6 -2
- package/components/brand/xertica-logo/xertica-logo.mdx +56 -56
- package/components/brand/xertica-orbe/xertica-orbe.mdx +38 -38
- package/components/brand/xertica-provider/XerticaProvider.tsx +112 -112
- package/components/brand/xertica-provider/xertica-provider.mdx +61 -61
- package/components/brand/xertica-provider/xertica-provider.test.tsx +25 -13
- package/components/brand/xertica-xlogo/xertica-xlogo.mdx +55 -55
- package/components/examples/DrawingMapExample.tsx +1 -4
- package/components/layout/header/header.mdx +117 -117
- package/components/layout/header/header.test.tsx +2 -1
- package/components/layout/sidebar/sidebar.mdx +99 -99
- package/components/layout/sidebar/sidebar.stories.tsx +1033 -1033
- package/components/layout/sidebar/sidebar.test.tsx +2 -1
- package/components/layout/sidebar/sidebar.tsx +1509 -1506
- package/components/media/audio-player/AudioPlayer.mdx +67 -67
- package/components/media/audio-player/AudioPlayer.test.tsx +2 -1
- package/components/media/floating-media-wrapper.mdx +74 -74
- package/components/media/video-player/VideoPlayer.mdx +102 -102
- package/components/media/video-player/VideoPlayer.test.tsx +3 -2
- package/components/pages/forgot-password-page/ForgotPasswordPage.tsx +94 -188
- package/components/pages/forgot-password-page/forgot-password-page.mdx +60 -60
- package/components/pages/forgot-password-page/forgot-password-page.test.tsx +2 -1
- package/components/pages/home-content/HomeContent.tsx +119 -119
- package/components/pages/home-content/home-content.mdx +62 -62
- package/components/pages/home-page/HomePage.stories.tsx +8 -15
- package/components/pages/home-page/home-page.mdx +53 -53
- package/components/pages/home-page/home-page.test.tsx +2 -1
- package/components/pages/login-page/LoginPage.mdx +31 -31
- package/components/pages/login-page/LoginPage.tsx +125 -218
- package/components/pages/login-page/login-page.test.tsx +2 -1
- package/components/pages/reset-password-page/ResetPasswordPage.tsx +153 -243
- package/components/pages/reset-password-page/reset-password-page.mdx +63 -63
- package/components/pages/template-content/TemplateContent.tsx +1353 -1353
- package/components/pages/template-content/template-content.mdx +61 -61
- package/components/pages/template-page/TemplatePage.stories.tsx +32 -32
- package/components/pages/template-page/template-page.mdx +53 -53
- package/components/pages/template-page/template-page.test.tsx +2 -1
- package/components/pages/verify-email-page/VerifyEmailPage.tsx +104 -206
- package/components/pages/verify-email-page/verify-email-page.mdx +55 -55
- package/components/public-api-smoke.test.tsx +10 -6
- package/components/shared/assistant-utils.ts +3 -2
- package/components/shared/navigation.ts +2 -2
- package/components/ui/accordion/accordion.mdx +29 -29
- package/components/ui/alert/alert.mdx +29 -29
- package/components/ui/alert-dialog/alert-dialog.mdx +26 -26
- package/components/ui/aspect-ratio/aspect-ratio.mdx +25 -25
- package/components/ui/assistant-chart/AssistantChart.tsx +8 -2
- package/components/ui/assistant-chart/assistant-chart.mdx +25 -25
- package/components/ui/avatar/avatar.mdx +26 -26
- package/components/ui/badge/badge.mdx +28 -28
- package/components/ui/breadcrumb/breadcrumb.mdx +26 -26
- package/components/ui/button/button.mdx +29 -29
- package/components/ui/calendar/calendar.mdx +26 -26
- package/components/ui/card/card.mdx +26 -26
- package/components/ui/carousel/carousel.mdx +26 -26
- package/components/ui/chart/chart.mdx +26 -26
- package/components/ui/chart/chart.test.tsx +178 -178
- package/components/ui/chart/chart.tsx +2252 -2245
- package/components/ui/checkbox/checkbox.mdx +26 -26
- package/components/ui/collapsible/collapsible.mdx +25 -25
- package/components/ui/command/command.mdx +26 -26
- package/components/ui/context-menu/context-menu.mdx +26 -26
- package/components/ui/dialog/dialog.mdx +26 -26
- package/components/ui/drawer/drawer.mdx +26 -26
- package/components/ui/dropdown-menu/dropdown-menu.mdx +26 -26
- package/components/ui/empty/empty.mdx +26 -26
- package/components/ui/file-upload/file-upload.mdx +26 -26
- package/components/ui/form/form.mdx +20 -20
- package/components/ui/google-maps-loader/google-maps-loader.mdx +68 -68
- package/components/ui/hover-card/hover-card.mdx +26 -26
- package/components/ui/input/input.mdx +29 -29
- package/components/ui/input-otp/input-otp.mdx +26 -26
- package/components/ui/label/label.mdx +25 -25
- package/components/ui/map/map.mdx +26 -26
- package/components/ui/map/map.tsx +6 -1
- package/components/ui/menubar/menubar.mdx +26 -26
- package/components/ui/navigation-menu/navigation-menu.mdx +26 -26
- package/components/ui/notification-badge/notification-badge.mdx +26 -26
- package/components/ui/page-header/page-header.mdx +44 -44
- package/components/ui/pagination/pagination.mdx +26 -26
- package/components/ui/popover/popover.mdx +26 -26
- package/components/ui/progress/progress.mdx +25 -25
- package/components/ui/radio-group/radio-group.mdx +26 -26
- package/components/ui/rating/rating.mdx +26 -26
- package/components/ui/resizable/resizable.mdx +26 -26
- package/components/ui/resizable/resizable.tsx +13 -8
- package/components/ui/rich-text-editor/rich-text-editor.mdx +47 -47
- package/components/ui/route-map/route-map.mdx +26 -26
- package/components/ui/scroll-area/scroll-area.mdx +25 -25
- package/components/ui/search/search.mdx +27 -27
- package/components/ui/select/select.mdx +26 -26
- package/components/ui/separator/separator.mdx +25 -25
- package/components/ui/sheet/sheet.mdx +26 -26
- package/components/ui/simple-map/simple-map.mdx +25 -25
- package/components/ui/skeleton/skeleton.mdx +25 -25
- package/components/ui/slider/slider.mdx +26 -26
- package/components/ui/sonner/sonner.mdx +26 -26
- package/components/ui/stats-card/stats-card.mdx +26 -26
- package/components/ui/stats-card/stats-card.stories.tsx +117 -117
- package/components/ui/stats-card/stats-card.tsx +109 -109
- package/components/ui/stepper/stepper.mdx +26 -26
- package/components/ui/switch/switch.mdx +25 -25
- package/components/ui/table/table.mdx +27 -27
- package/components/ui/tabs/tabs.mdx +26 -26
- package/components/ui/textarea/textarea.mdx +25 -25
- package/components/ui/timeline/timeline.mdx +26 -26
- package/components/ui/toggle/toggle.mdx +26 -26
- package/components/ui/toggle-group/toggle-group.mdx +26 -26
- package/components/ui/tooltip/tooltip.mdx +26 -26
- package/components/ui/tree-view/tree-view.mdx +26 -26
- package/components.json +511 -511
- package/contexts/BrandColorsContext.tsx +282 -282
- package/contexts/i18n-singleton.test.tsx +57 -0
- package/contexts/theme-data.ts +391 -391
- package/dist/{AssistantChart-DNdwuS-t.js → AssistantChart-BMNSA_Pk.js} +4 -4
- package/dist/{AssistantChart-COGiOV-g.cjs → AssistantChart-BzM7plyc.cjs} +31 -21
- package/dist/{AssistantChart-CWX1OWNM.js → AssistantChart-C842evTi.js} +31 -21
- package/dist/{AssistantChart-D0A1FPYt.cjs → AssistantChart-CImCNLfD.cjs} +150 -114
- package/dist/{AssistantChart-BW9JK6jw.cjs → AssistantChart-CVF2uh37.cjs} +4 -4
- package/dist/{AssistantChart-BXU1ACnh.js → AssistantChart-DfdIfmQr.js} +134 -240
- package/dist/{AssistantChart-BZTPJ5dP.cjs → AssistantChart-JooMdVQU.cjs} +5 -5
- package/dist/{AssistantChart-DMJJ_Amf.js → AssistantChart-KHS-tp-L.js} +5 -5
- package/dist/{BrandColorsContext-BwY-b6M4.cjs → BrandColorsContext-B4_81eas.cjs} +2 -2
- package/dist/{BrandColorsContext-BMRJ04Wf.js → BrandColorsContext-DbK5LnQ_.js} +2 -2
- package/dist/{CodeBlock-CjeFavqV.js → CodeBlock-DiKO8ocT.js} +11 -11
- package/dist/{CodeBlock-CV6dtsTM.cjs → CodeBlock-ZYThr7Kn.cjs} +12 -9
- package/dist/{FeatureCard-Cfs6Ishq.js → FeatureCard-BhpfmPPx.js} +20 -20
- package/dist/{FeatureCard-ie3L8Fpr.cjs → FeatureCard-D-5yS_OD.cjs} +31 -18
- package/dist/{progress-DDeuWPZw.cjs → ImageWithFallback-CfkAkctC.cjs} +34 -9
- package/dist/{progress-Cs9i4DPx.js → ImageWithFallback-bw-CxxDc.js} +27 -10
- package/dist/LanguageContext-CX_zdxre.js +1912 -0
- package/dist/LanguageContext-CjhSSqJT.cjs +1917 -0
- package/dist/LanguageSelector-BR3Ss0k_.js +46 -0
- package/dist/LanguageSelector-CHOLPmHr.cjs +48 -0
- package/dist/{XerticaXLogo-mqjoBiLI.js → LanguageSelector-CmTj3lWq.js} +85 -82
- package/dist/{XerticaXLogo-BX3ueACh.js → LanguageSelector-DxW6o7bt.js} +81 -81
- package/dist/{XerticaXLogo-uQgwns_E.cjs → LanguageSelector-Sw73qvWV.cjs} +84 -81
- package/dist/PasswordStrengthMeter-C8irs0G1.js +173 -0
- package/dist/PasswordStrengthMeter-MLzhax-d.cjs +179 -0
- package/dist/{ThemeContext-BgclCB35.js → ThemeContext-BGeh_Kdr.js} +290 -212
- package/dist/{ThemeContext-bSzuOit2.cjs → ThemeContext-CEY9pCn-.cjs} +15 -10
- package/dist/{ThemeContext-BblcjQup.cjs → ThemeContext-D50irx5T.cjs} +291 -205
- package/dist/{ThemeContext-RTy1m2Uq.js → ThemeContext-Dk3tH7Ym.js} +14 -13
- package/dist/{XerticaXLogo-CFuIlYFH.js → ThemeToggle-BpM_iHh8.js} +56 -93
- package/dist/{XerticaXLogo-CziKMQil.cjs → ThemeToggle-CZRlv0d4.cjs} +62 -85
- package/dist/{VerifyEmailPage-C_Zk6Gen.cjs → VerifyEmailPage-B6bOrybJ.cjs} +17 -17
- package/dist/VerifyEmailPage-BKiaw2YK.js +2954 -0
- package/dist/{VerifyEmailPage-B31mCrMc.js → VerifyEmailPage-BRE5Fz59.js} +8 -8
- package/dist/{VerifyEmailPage-Cyl55sJb.js → VerifyEmailPage-BcCluouh.js} +135 -65
- package/dist/VerifyEmailPage-Beaicc6V.cjs +2963 -0
- package/dist/VerifyEmailPage-BehPBp0F.cjs +2963 -0
- package/dist/VerifyEmailPage-Bx1sr0uQ.cjs +3298 -0
- package/dist/{VerifyEmailPage-Bci0bA-P.js → VerifyEmailPage-DUYyXCX9.js} +3 -3
- package/dist/VerifyEmailPage-DXXMHbzq.js +3289 -0
- package/dist/VerifyEmailPage-Djb6hthM.js +2954 -0
- package/dist/{VerifyEmailPage-u_Dn7t1U.cjs → VerifyEmailPage-DpYtFk35.cjs} +21 -21
- package/dist/{VerifyEmailPage-X14vhdyl.js → VerifyEmailPage-NXKWW3Dk.js} +12 -12
- package/dist/{VerifyEmailPage-C7KiYXrm.cjs → VerifyEmailPage-QrCz4Wqr.cjs} +11 -11
- package/dist/{VerifyEmailPage-Bv8Ah_TK.cjs → VerifyEmailPage-ZmQra0Wi.cjs} +144 -74
- package/dist/{XerticaProvider-BErr83Bg.js → XerticaProvider-BF3q_myt.js} +5 -4
- package/dist/{XerticaProvider-B8CaV7xu.cjs → XerticaProvider-BijpC_py.cjs} +18 -11
- package/dist/{XerticaProvider-DQtvJU7m.js → XerticaProvider-C2wDRQhT.js} +17 -13
- package/dist/{XerticaProvider-CeS5G_n5.cjs → XerticaProvider-C_JSOz1U.cjs} +2 -2
- package/dist/{XerticaProvider-CwOkHxiT.cjs → XerticaProvider-D5zjrqZq.cjs} +5 -4
- package/dist/{XerticaProvider-ra2NciRq.js → XerticaProvider-KTGl4Cn1.js} +2 -2
- package/dist/{alert-dialog-DqlRW_An.js → alert-dialog-BrpwXKwS.js} +3 -3
- package/dist/{alert-dialog-yckpaOpy.cjs → alert-dialog-BzIcTKn_.cjs} +173 -166
- package/dist/{alert-dialog-DhwPioBa.cjs → alert-dialog-CZU1Zase.cjs} +3 -3
- package/dist/{alert-dialog-KpoabzJb.js → alert-dialog-ClRoLH7l.js} +40 -56
- package/dist/{alert-dialog-B4M3vQKS.cjs → alert-dialog-DBBqvU-V.cjs} +53 -38
- package/dist/{alert-dialog-iDe5VE5o.js → alert-dialog-kty5pxQp.js} +160 -183
- package/dist/assistant.cjs.js +2 -2
- package/dist/assistant.es.js +2 -2
- package/dist/blocks.cjs.js +7 -3
- package/dist/blocks.es.js +2 -2
- package/dist/brand.cjs.js +7 -6
- package/dist/brand.es.js +3 -2
- package/dist/cli.js +63 -21
- package/dist/components/assistant/code-block/CodeBlock.d.ts +2 -1
- package/dist/components/assistant/formatted-document/FormattedDocument.d.ts +2 -1
- package/dist/components/assistant/markdown-message/MarkdownMessage.d.ts +2 -1
- package/dist/components/assistant/modern-chat-input/ModernChatInput.d.ts +2 -1
- package/dist/components/assistant/xertica-assistant/parts/AssistantCollapsedView.d.ts +2 -1
- package/dist/components/assistant/xertica-assistant/parts/AssistantConversationList.d.ts +2 -1
- package/dist/components/assistant/xertica-assistant/parts/AssistantDocumentEditor.d.ts +2 -1
- package/dist/components/assistant/xertica-assistant/parts/AssistantFeedbackDialog.d.ts +2 -1
- package/dist/components/assistant/xertica-assistant/parts/AssistantHeader.d.ts +2 -1
- package/dist/components/assistant/xertica-assistant/parts/AssistantMessageBubble.d.ts +2 -1
- package/dist/components/assistant/xertica-assistant/parts/AssistantTabBar.d.ts +2 -1
- package/dist/components/assistant/xertica-assistant/parts/AssistantTypingIndicator.d.ts +2 -1
- package/dist/components/assistant/xertica-assistant/parts/AssistantWelcomeScreen.d.ts +2 -1
- package/dist/components/assistant/xertica-assistant/types.d.ts +3 -2
- package/dist/components/assistant/xertica-assistant/use-assistant.d.ts +1 -1
- package/dist/components/assistant/xertica-assistant/xertica-assistant.d.ts +2 -1
- package/dist/components/blocks/auth/AuthPageShell.d.ts +12 -0
- package/dist/components/blocks/auth/PasswordStrengthMeter.d.ts +7 -0
- package/dist/components/blocks/auth/SocialLoginButtons.d.ts +8 -0
- package/dist/components/blocks/auth/index.d.ts +8 -0
- package/dist/components/blocks/auth/usePasswordStrength.d.ts +3 -0
- package/dist/components/blocks/card-patterns/ActivityCard.d.ts +1 -1
- package/dist/components/blocks/card-patterns/ActivityCardSkeleton.d.ts +1 -1
- package/dist/components/blocks/card-patterns/FeatureCard.d.ts +1 -1
- package/dist/components/blocks/card-patterns/FeatureCardSkeleton.d.ts +1 -1
- package/dist/components/blocks/card-patterns/NotificationCard.d.ts +1 -1
- package/dist/components/blocks/card-patterns/NotificationCardSkeleton.d.ts +1 -1
- package/dist/components/blocks/card-patterns/ProfileCard.d.ts +1 -1
- package/dist/components/blocks/card-patterns/ProfileCardSkeleton.d.ts +1 -1
- package/dist/components/blocks/card-patterns/ProjectCard.d.ts +1 -1
- package/dist/components/blocks/card-patterns/ProjectCardSkeleton.d.ts +1 -1
- package/dist/components/blocks/card-patterns/QuickActionCard.d.ts +1 -1
- package/dist/components/blocks/card-patterns/QuickActionCardSkeleton.d.ts +1 -1
- package/dist/components/blocks/index.d.ts +1 -0
- package/dist/components/brand/language-selector/LanguageSelector.d.ts +2 -1
- package/dist/components/brand/theme-toggle/ThemeToggle.d.ts +2 -1
- package/dist/components/brand/xertica-logo/XerticaLogo.d.ts +2 -1
- package/dist/components/brand/xertica-orbe/XerticaOrbe.d.ts +2 -1
- package/dist/components/brand/xertica-provider/XerticaProvider.d.ts +1 -1
- package/dist/components/brand/xertica-xlogo/XerticaXLogo.d.ts +2 -1
- package/dist/components/examples/DrawingMapExample.d.ts +2 -1
- package/dist/components/examples/FilterableMapExample.d.ts +1 -1
- package/dist/components/examples/MapShowcase.d.ts +2 -1
- package/dist/components/examples/SimpleFilterableMap.d.ts +2 -1
- package/dist/components/figma/ImageWithFallback.d.ts +1 -1
- package/dist/components/layout/header/header.d.ts +1 -1
- package/dist/components/layout/sidebar/sidebar.d.ts +25 -13
- package/dist/components/media/FloatingMediaWrapper.d.ts +1 -1
- package/dist/components/media/audio-player/AudioPlayer.d.ts +2 -1
- package/dist/components/media/video-player/VideoPlayer.d.ts +2 -1
- package/dist/components/pages/forgot-password-page/ForgotPasswordPage.d.ts +2 -1
- package/dist/components/pages/home-content/HomeContent.d.ts +2 -1
- package/dist/components/pages/home-page/HomePage.d.ts +2 -1
- package/dist/components/pages/login-page/LoginPage.d.ts +2 -1
- package/dist/components/pages/reset-password-page/ResetPasswordPage.d.ts +3 -2
- package/dist/components/pages/template-content/TemplateContent.d.ts +2 -1
- package/dist/components/pages/template-page/TemplatePage.d.ts +2 -1
- package/dist/components/pages/verify-email-page/VerifyEmailPage.d.ts +2 -1
- package/dist/components/shared/CustomTooltipContent.d.ts +1 -1
- package/dist/components/shared/assistant-utils.d.ts +3 -2
- package/dist/components/shared/error-boundary.d.ts +4 -4
- package/dist/components/shared/error-fallbacks.d.ts +4 -3
- package/dist/components/shared/navigation.d.ts +6 -2
- package/dist/components/ui/accordion/accordion.d.ts +4 -4
- package/dist/components/ui/alert/alert.d.ts +3 -3
- package/dist/components/ui/alert-dialog/alert-dialog.d.ts +10 -10
- package/dist/components/ui/aspect-ratio/aspect-ratio.d.ts +1 -1
- package/dist/components/ui/assistant-chart/AssistantChart.d.ts +4 -3
- package/dist/components/ui/avatar/avatar.d.ts +3 -3
- package/dist/components/ui/badge/badge.d.ts +1 -1
- package/dist/components/ui/breadcrumb/breadcrumb.d.ts +7 -7
- package/dist/components/ui/calendar/calendar.d.ts +2 -2
- package/dist/components/ui/card/card.d.ts +7 -7
- package/dist/components/ui/carousel/carousel.d.ts +5 -5
- package/dist/components/ui/chart/chart.d.ts +16 -16
- package/dist/components/ui/collapsible/collapsible.d.ts +3 -3
- package/dist/components/ui/command/command.d.ts +9 -9
- package/dist/components/ui/context-menu/context-menu.d.ts +15 -15
- package/dist/components/ui/dialog/dialog.d.ts +9 -9
- package/dist/components/ui/drawer/drawer.d.ts +10 -10
- package/dist/components/ui/dropdown-menu/dropdown-menu.d.ts +15 -15
- package/dist/components/ui/form/form.d.ts +7 -7
- package/dist/components/ui/google-maps-loader/google-maps-loader.d.ts +3 -3
- package/dist/components/ui/hover-card/hover-card.d.ts +3 -3
- package/dist/components/ui/input-otp/input-otp.d.ts +4 -4
- package/dist/components/ui/label/label.d.ts +1 -1
- package/dist/components/ui/menubar/menubar.d.ts +16 -16
- package/dist/components/ui/navigation-menu/navigation-menu.d.ts +8 -8
- package/dist/components/ui/page-header/page-header.d.ts +3 -3
- package/dist/components/ui/pagination/pagination.d.ts +7 -7
- package/dist/components/ui/popover/popover.d.ts +4 -4
- package/dist/components/ui/progress/progress.d.ts +1 -1
- package/dist/components/ui/resizable/resizable.d.ts +11 -7
- package/dist/components/ui/rich-text-editor/rich-text-editor.d.ts +1 -1
- package/dist/components/ui/scroll-area/scroll-area.d.ts +2 -2
- package/dist/components/ui/separator/separator.d.ts +1 -1
- package/dist/components/ui/sheet/sheet.d.ts +10 -10
- package/dist/components/ui/skeleton/skeleton.d.ts +1 -1
- package/dist/components/ui/sonner/sonner.d.ts +2 -1
- package/dist/components/ui/stats-card/stats-card-skeleton.d.ts +1 -1
- package/dist/components/ui/table/table.d.ts +8 -8
- package/dist/components/ui/tabs/tabs.d.ts +4 -4
- package/dist/components/ui/tooltip/tooltip.d.ts +4 -4
- package/dist/contexts/ApiKeyContext.d.ts +2 -2
- package/dist/contexts/AssistenteContext.d.ts +1 -1
- package/dist/contexts/AuthContext.d.ts +1 -1
- package/dist/contexts/LanguageContext.d.ts +2 -2
- package/dist/contexts/LayoutContext.d.ts +2 -2
- package/dist/contexts/ThemeContext.d.ts +1 -1
- package/dist/features/assistant/hooks/useAssistantConfig.d.ts +1 -1
- package/dist/features/home/hooks/useDashboardStats.d.ts +1 -1
- package/dist/features/home/hooks/useFeatureCards.d.ts +1 -1
- package/dist/features/home/hooks/useTeamMembers.d.ts +1 -1
- package/dist/{google-maps-loader-BCe58h9D.js → google-maps-loader-BOug999f.js} +0 -4
- package/dist/{google-maps-loader-casMyxlo.cjs → google-maps-loader-DfeBRI8Q.cjs} +0 -5
- package/dist/hooks.cjs.js +6 -5
- package/dist/hooks.es.js +3 -2
- package/dist/{index-9GWd0qxq.cjs → index-BQjx1Mdf.cjs} +1 -1
- package/dist/index-Bei5DzAL.js +6 -0
- package/dist/index.cjs.js +32 -27
- package/dist/index.es.js +15 -14
- package/dist/layout.cjs.js +1 -1
- package/dist/layout.es.js +1 -1
- package/dist/pages.cjs.js +1 -1
- package/dist/pages.es.js +1 -1
- package/dist/{rich-text-editor-B2CKz7nx.cjs → rich-text-editor-BuqSu718.cjs} +68 -3
- package/dist/{rich-text-editor-DloeW0wc.js → rich-text-editor-CV8FtA_l.js} +66 -4
- package/dist/{sidebar-B4ZWaMrE.js → sidebar-B7YzwAp3.js} +365 -6
- package/dist/{sidebar-CLmIjgNd.cjs → sidebar-BGJ0j567.cjs} +84 -67
- package/dist/{sidebar-Duermn32.js → sidebar-BI6mZlC8.js} +81 -64
- package/dist/{sidebar-BS1p2V7t.cjs → sidebar-BtmotOg-.cjs} +367 -9
- package/dist/{sidebar-DyYvgyBj.cjs → sidebar-Cb0U7NsV.cjs} +368 -9
- package/dist/{sidebar-QwCoeoZ_.js → sidebar-D3EgGVxF.js} +1 -1
- package/dist/{sidebar-CQn_rwxP.cjs → sidebar-DDTqMGnR.cjs} +4 -4
- package/dist/{sidebar-3XyzjVBw.js → sidebar-I7EXyf5D.js} +364 -6
- package/dist/ui.cjs.js +9 -9
- package/dist/ui.es.js +5 -5
- package/dist/{xertica-assistant-BbgzsgsG.js → xertica-assistant-8fh8KA2K.js} +60 -51
- package/dist/{xertica-assistant-d2qs2Vd9.cjs → xertica-assistant-BjfG3zyL.cjs} +63 -46
- package/dist/{xertica-assistant-B687qEPU.js → xertica-assistant-CJVnvMqU.js} +17 -8
- package/dist/{xertica-assistant-sOHwTgIP.cjs → xertica-assistant-CKPtc1z5.cjs} +19 -10
- package/dist/{xertica-assistant-QFUnv5I2.cjs → xertica-assistant-DER0brPQ.cjs} +6 -5
- package/dist/{xertica-assistant-CyikE3N_.js → xertica-assistant-DQCjpk5M.js} +4 -3
- package/dist/{xertica-assistant-B1NaSFFj.js → xertica-assistant-Dk-9AJzw.js} +6 -5
- package/dist/{xertica-assistant-CIaUlbIt.cjs → xertica-assistant-DxhIKvuY.cjs} +8 -7
- package/dist/xertica-ui.css +2 -2
- package/docs/components/audio-player.md +1 -1
- package/docs/components/sidebar.md +331 -331
- package/docs/components/stats-card.md +138 -138
- package/docs/components/toggle.md +12 -0
- package/docs/doc-audit.md +35 -229
- package/docs/i18n.md +33 -10
- package/docs/llms.md +6 -4
- package/llms-compact.txt +444 -444
- package/llms-full.txt +12144 -12144
- package/llms.txt +187 -187
- package/package.json +223 -219
- package/scripts/a11y-audit.mjs +162 -162
- package/scripts/fix-stories.cjs +19 -19
- package/styles/globals.css +0 -1
- package/styles/xertica/base.css +8 -0
- package/styles/xertica/tokens.css +240 -240
- package/templates/.env.example +2 -2
- package/templates/.prettierignore +4 -4
- package/templates/.prettierrc +10 -10
- package/templates/guidelines/Guidelines.md +865 -865
- package/templates/index.html +13 -13
- package/templates/package.json +69 -69
- package/templates/src/app/components/AuthGuard.tsx +11 -0
- package/templates/src/features/auth/ui/ForgotPasswordContent.tsx +1 -2
- package/templates/src/features/auth/ui/LoginContent.tsx +1 -2
- package/templates/src/features/auth/ui/ResetPasswordContent.tsx +3 -57
- package/templates/src/features/auth/ui/VerifyEmailContent.tsx +1 -2
- package/templates/src/features/home/index.ts +0 -10
- package/templates/src/features/home/ui/HomeContent.tsx +62 -116
- package/templates/src/features/settings/index.ts +2 -0
- package/templates/src/features/settings/ui/SettingsContent.tsx +134 -0
- package/templates/src/features/template/index.ts +0 -4
- package/templates/src/features/template/ui/TemplateContent.tsx +68 -1321
- package/templates/src/i18n.ts +36 -13
- package/templates/src/locales/en/pages/settings.json +15 -0
- package/templates/src/locales/en/pages/templates.json +5 -313
- package/templates/src/locales/es/pages/settings.json +15 -0
- package/templates/src/locales/es/pages/templates.json +5 -313
- package/templates/src/locales/pt-BR/pages/settings.json +15 -0
- package/templates/src/locales/pt-BR/pages/templates.json +5 -313
- package/templates/src/pages/SettingsPage.tsx +28 -0
- package/templates/src/shared/config/navigation.ts +2 -2
- package/templates/src/styles/xertica/tokens.css +240 -240
- package/utils/gemini.ts +2 -2
- package/dist/AssistantChart-9w31gdAb.cjs +0 -3363
- package/dist/AssistantChart-BAudAfne.cjs +0 -3591
- package/dist/AssistantChart-BAx9VQvb.cjs +0 -3374
- package/dist/AssistantChart-BP8upjMk.js +0 -3565
- package/dist/AssistantChart-CVko2A1W.js +0 -3348
- package/dist/AssistantChart-CVzmmhx4.js +0 -3337
- package/dist/AssistantChart-CeU2dIb6.js +0 -3469
- package/dist/AssistantChart-DO5UuX4J.cjs +0 -3495
- package/dist/AudioPlayer-1ypwE2Wh.cjs +0 -936
- package/dist/AudioPlayer-BJ2IuRQW.cjs +0 -1275
- package/dist/AudioPlayer-BWDW6TN9.cjs +0 -1279
- package/dist/AudioPlayer-CM962GEh.js +0 -1280
- package/dist/AudioPlayer-CbZId7cj.cjs +0 -998
- package/dist/AudioPlayer-DU8zt8-z.js +0 -999
- package/dist/AudioPlayer-DuKXrCfy.js +0 -937
- package/dist/AudioPlayer-Xxma6_-H.js +0 -1276
- package/dist/BrandColorsContext-DLVJgtmH.js +0 -666
- package/dist/BrandColorsContext-DZT7JjeD.js +0 -659
- package/dist/BrandColorsContext-GUyFmkX0.cjs +0 -665
- package/dist/BrandColorsContext-awnBCmC4.cjs +0 -666
- package/dist/CodeBlock-C2ZUXt8V.js +0 -219
- package/dist/CodeBlock-C5oYnLQp.cjs +0 -218
- package/dist/CodeBlock-DuxdtN-l.js +0 -219
- package/dist/CodeBlock-POVYONvC.cjs +0 -218
- package/dist/CustomTooltipContent-BT6brkVJ.cjs +0 -49
- package/dist/CustomTooltipContent-CfOfikhq.js +0 -33
- package/dist/CustomTooltipContent-DHjkY0ww.js +0 -40
- package/dist/CustomTooltipContent-c_K-DWRr.cjs +0 -56
- package/dist/FeatureCard-9GhnlgL3.js +0 -336
- package/dist/FeatureCard-Bcb3Zi54.js +0 -302
- package/dist/FeatureCard-CkPd2psQ.cjs +0 -301
- package/dist/FeatureCard-Dkp-xmzM.cjs +0 -335
- package/dist/FeatureCardSkeleton-CAgu8stE.js +0 -27
- package/dist/FeatureCardSkeleton-mO3Bdm_V.cjs +0 -26
- package/dist/LanguageContext-BwhwC3G2.js +0 -657
- package/dist/LanguageContext-DvUt5jBg.cjs +0 -656
- package/dist/LayoutContext-BDmcZfMH.cjs +0 -84
- package/dist/LayoutContext-C4kKN9RV.cjs +0 -93
- package/dist/LayoutContext-CGEe1oPq.js +0 -94
- package/dist/LayoutContext-CwT5KLiW.cjs +0 -104
- package/dist/LayoutContext-DVLCsoQn.js +0 -105
- package/dist/LayoutContext-dbQvdC4O.js +0 -85
- package/dist/ThemeContext-BbBNoFTG.js +0 -735
- package/dist/ThemeContext-Bo-W2WZH.js +0 -1856
- package/dist/ThemeContext-CP3a0jxy.cjs +0 -1855
- package/dist/ThemeContext-Cmr8Ex8H.cjs +0 -734
- package/dist/ThemeContext-CpqYShLq.cjs +0 -324
- package/dist/ThemeContext-D3LzacmG.js +0 -188
- package/dist/ThemeContext-DQUOeziy.cjs +0 -1855
- package/dist/ThemeContext-Du2nE1PL.js +0 -325
- package/dist/ThemeContext-GeEBTJ3q.cjs +0 -1621
- package/dist/ThemeContext-JyLK9B1o.js +0 -1622
- package/dist/ThemeContext-U4dEYc6C.cjs +0 -187
- package/dist/ThemeContext-ept8jhXI.js +0 -1856
- package/dist/VerifyEmailPage-BE-L9mB7.js +0 -2828
- package/dist/VerifyEmailPage-BIBOKV7Z.js +0 -3214
- package/dist/VerifyEmailPage-BJjAMUTW.js +0 -3223
- package/dist/VerifyEmailPage-BRSP-Pwt.cjs +0 -3196
- package/dist/VerifyEmailPage-Bae2cBXT.cjs +0 -2827
- package/dist/VerifyEmailPage-BiRm7Nh4.cjs +0 -3213
- package/dist/VerifyEmailPage-Bvfv8HVQ.js +0 -3214
- package/dist/VerifyEmailPage-CR7kb5df.cjs +0 -2827
- package/dist/VerifyEmailPage-C_ihbcth.js +0 -2828
- package/dist/VerifyEmailPage-CbgjOF0v.js +0 -2828
- package/dist/VerifyEmailPage-CdYPSJoO.js +0 -2828
- package/dist/VerifyEmailPage-CkBYfsNy.cjs +0 -3232
- package/dist/VerifyEmailPage-D-FRj5TU.cjs +0 -3213
- package/dist/VerifyEmailPage-DF2ilhum.cjs +0 -3210
- package/dist/VerifyEmailPage-DMBh4NM9.cjs +0 -2827
- package/dist/VerifyEmailPage-DTtFfC-J.js +0 -3197
- package/dist/VerifyEmailPage-Dt7zgA4w.cjs +0 -2827
- package/dist/VerifyEmailPage-EhudUdqF.js +0 -3211
- package/dist/VerifyEmailPage-RrUApqBN.js +0 -3214
- package/dist/VerifyEmailPage-VoMI7MYH.cjs +0 -3213
- package/dist/VerifyEmailPage-hdB8JQGv.cjs +0 -3213
- package/dist/VerifyEmailPage-vYHbYK3q.js +0 -3214
- package/dist/XerticaOrbe-BCUVSPPB.cjs +0 -1924
- package/dist/XerticaOrbe-BGIB1CTK.js +0 -1355
- package/dist/XerticaOrbe-By8eEvR-.js +0 -1925
- package/dist/XerticaOrbe-FWGjBj0U.cjs +0 -1354
- package/dist/XerticaProvider-AChwphCO.cjs +0 -48
- package/dist/XerticaProvider-AbWlr7Af.cjs +0 -48
- package/dist/XerticaProvider-BITjgC5p.js +0 -39
- package/dist/XerticaProvider-BSyFrmC0.js +0 -49
- package/dist/XerticaProvider-By8q3Roe.cjs +0 -38
- package/dist/XerticaProvider-CUYJZc32.js +0 -49
- package/dist/XerticaProvider-CW9hpCdF.cjs +0 -39
- package/dist/XerticaProvider-CWgby5mY.js +0 -49
- package/dist/XerticaProvider-CWs6EwNa.js +0 -49
- package/dist/XerticaProvider-CiNKjMx1.cjs +0 -48
- package/dist/XerticaProvider-CjQAQPcn.cjs +0 -48
- package/dist/XerticaProvider-D5lLumH-.js +0 -49
- package/dist/XerticaProvider-DUOJg9iX.js +0 -49
- package/dist/XerticaProvider-Dl_b72_l.cjs +0 -51
- package/dist/XerticaProvider-qQUDop71.cjs +0 -48
- package/dist/XerticaProvider-siSt9uG2.js +0 -40
- package/dist/XerticaXLogo-8TTzBjHw.cjs +0 -251
- package/dist/XerticaXLogo-B2svDGZh.cjs +0 -251
- package/dist/XerticaXLogo-BWaag64t.js +0 -252
- package/dist/XerticaXLogo-CU-U-GP4.cjs +0 -251
- package/dist/XerticaXLogo-ChryA6xj.js +0 -252
- package/dist/XerticaXLogo-CowGv7BC.js +0 -252
- package/dist/XerticaXLogo-D8jf0SNv.cjs +0 -214
- package/dist/XerticaXLogo-DHz5SugF.js +0 -252
- package/dist/XerticaXLogo-DTee_y8X.cjs +0 -251
- package/dist/XerticaXLogo-DfUvz-lD.js +0 -243
- package/dist/XerticaXLogo-DzXKZBtG.js +0 -231
- package/dist/XerticaXLogo-fAJMy3H4.js +0 -215
- package/dist/XerticaXLogo-kslQ8Tk_.cjs +0 -251
- package/dist/XerticaXLogo-xWbElCZj.cjs +0 -230
- package/dist/avatar-Cq5_E8r9.cjs +0 -78
- package/dist/avatar-CuYu2MKt.cjs +0 -72
- package/dist/avatar-Cxyofu1H.js +0 -56
- package/dist/avatar-DSBfJMRJ.js +0 -62
- package/dist/breadcrumb-CVzzzqfo.js +0 -103
- package/dist/breadcrumb-DIJ0X3Ot.js +0 -96
- package/dist/breadcrumb-DjSxkjlQ.cjs +0 -95
- package/dist/breadcrumb-DnDlQFg2.cjs +0 -102
- package/dist/button-0CXwCRTm.cjs +0 -85
- package/dist/button-Bnv9SvYK.cjs +0 -79
- package/dist/button-C6uvh0rV.js +0 -63
- package/dist/button-qkz7Icqf.js +0 -69
- package/dist/card-B8-Gl5DL.js +0 -73
- package/dist/card-Bv_c57KU.cjs +0 -72
- package/dist/card-DJTsYhLL.cjs +0 -89
- package/dist/card-fi8zAN-I.js +0 -90
- package/dist/dropdown-menu-B_uEXNc4.cjs +0 -220
- package/dist/dropdown-menu-CFuCssWA.js +0 -204
- package/dist/dropdown-menu-Ze1YZFyc.cjs +0 -247
- package/dist/dropdown-menu-nc_Lvg-u.js +0 -231
- package/dist/google-maps-loader-BVoVhUwA.js +0 -316
- package/dist/google-maps-loader-BqsYL48U.cjs +0 -285
- package/dist/google-maps-loader-DjJaYhV6.cjs +0 -316
- package/dist/google-maps-loader-t2IlYBzw.js +0 -286
- package/dist/index-B7A523O_.js +0 -8
- package/dist/index-BabBx2pa.js +0 -6
- package/dist/index-CkTUgOwX.js +0 -8
- package/dist/index-D3RLKRAs.cjs +0 -7
- package/dist/index-DmHhnb7a.cjs +0 -7
- package/dist/index.umd.js +0 -13712
- package/dist/input-CNFHVKvo.cjs +0 -145
- package/dist/input-CPl84zAx.cjs +0 -151
- package/dist/input-C_UiS2Py.cjs +0 -152
- package/dist/input-D-6IsAca.js +0 -133
- package/dist/input-cc-PTD4R.js +0 -123
- package/dist/input-wPYg0d0P.js +0 -127
- package/dist/progress-BLwqortq.cjs +0 -105
- package/dist/progress-D9mtsf6j.js +0 -89
- package/dist/rich-text-editor-1UW3Y2JK.js +0 -2891
- package/dist/rich-text-editor-BM-LPpTh.js +0 -2902
- package/dist/rich-text-editor-BmsjY03B.js +0 -2949
- package/dist/rich-text-editor-BrdC5evx.js +0 -2244
- package/dist/rich-text-editor-CyggTOLQ.cjs +0 -2908
- package/dist/rich-text-editor-DbV-S7Fi.cjs +0 -2261
- package/dist/rich-text-editor-DoCkKhzk.cjs +0 -2919
- package/dist/rich-text-editor-DqLICivI.js +0 -2832
- package/dist/rich-text-editor-DxO1Hz3a.cjs +0 -2903
- package/dist/rich-text-editor-GS2kpTAK.cjs +0 -2966
- package/dist/routes.d.ts +0 -10
- package/dist/select-Cmb8zF7w.cjs +0 -156
- package/dist/select-CprSNX0z.js +0 -139
- package/dist/select-DT7Zjn42.cjs +0 -162
- package/dist/select-En8DkoaQ.js +0 -145
- package/dist/sidebar-B3EYhli0.cjs +0 -800
- package/dist/sidebar-B9NR0lCe.cjs +0 -800
- package/dist/sidebar-BcJ6LxvX.cjs +0 -733
- package/dist/sidebar-BvF5I2Ue.cjs +0 -800
- package/dist/sidebar-C5B_LHek.cjs +0 -795
- package/dist/sidebar-CA6_ek3f.js +0 -801
- package/dist/sidebar-CRMiBtAi.js +0 -801
- package/dist/sidebar-CVUGHOS_.cjs +0 -756
- package/dist/sidebar-CZ2mWaMM.cjs +0 -800
- package/dist/sidebar-CmvwjnVb.js +0 -757
- package/dist/sidebar-CplprZpM.js +0 -801
- package/dist/sidebar-Dz7bd3zP.js +0 -796
- package/dist/sidebar-KIS0C2JH.js +0 -801
- package/dist/sidebar-OTO_up7Z.js +0 -801
- package/dist/sidebar-WoKvFWCN.js +0 -717
- package/dist/sidebar-zowjejT2.cjs +0 -800
- package/dist/skeleton-4zoHiFJ_.cjs +0 -83
- package/dist/skeleton-C4bHqUBf.js +0 -84
- package/dist/slider-C0JKA9k3.js +0 -56
- package/dist/slider-CPmwzm_3.cjs +0 -73
- package/dist/slider-DcJharR9.cjs +0 -73
- package/dist/slider-Pay3fka2.js +0 -56
- package/dist/sonner-DeUIj0Zg.cjs +0 -63
- package/dist/sonner-g9RIfi35.js +0 -47
- package/dist/tooltip-CNtsL5cB.cjs +0 -71
- package/dist/tooltip-CTyZCD8h.js +0 -55
- package/dist/tooltip-CwgSdy3h.cjs +0 -67
- package/dist/tooltip-D-OrYnKO.js +0 -51
- package/dist/use-audio-player-BJFV24XW.js +0 -188
- package/dist/use-audio-player-Bkh23vQ3.js +0 -177
- package/dist/use-audio-player-Dn1NR9xN.cjs +0 -176
- package/dist/use-audio-player-DyVYlOnR.cjs +0 -187
- package/dist/use-mobile-BB4M_4Ru.cjs +0 -47
- package/dist/use-mobile-CLu9nqGL.js +0 -31
- package/dist/use-mobile-CNwiBNxu.js +0 -33
- package/dist/use-mobile-Dlf74ufz.cjs +0 -49
- package/dist/xertica-assistant-B1IaHXnB.cjs +0 -1894
- package/dist/xertica-assistant-BMqdyRVi.js +0 -2082
- package/dist/xertica-assistant-Bj3vBCq_.cjs +0 -2081
- package/dist/xertica-assistant-CfBCo21g.js +0 -2148
- package/dist/xertica-assistant-DIM_Do1k.js +0 -1866
- package/dist/xertica-assistant-DPsESB6t.js +0 -1878
- package/dist/xertica-assistant-DrsRwla1.cjs +0 -2147
- package/dist/xertica-assistant-Qp3ydksa.cjs +0 -1882
- package/dist/xertica-assistant-gnCJdcZY.js +0 -1866
- package/dist/xertica-assistant-yyrR0JKl.cjs +0 -1882
- package/styles/xertica/app-overrides/scrollbar.css +0 -33
- package/templates/src/features/auth/ui/SocialLoginButtons.tsx +0 -78
- package/templates/src/features/home/data/mock.ts +0 -41
- package/templates/src/features/home/hooks/useFeatureCards.ts +0 -20
- package/templates/src/features/home/store/dashboardStore.ts +0 -25
- package/templates/src/features/template/ui/CrudTemplate.tsx +0 -112
- package/templates/src/features/template/ui/DashboardTemplate.tsx +0 -110
- package/templates/src/features/template/ui/FormTemplate.tsx +0 -117
- package/templates/src/features/template/ui/LoginTemplate.tsx +0 -59
- package/templates/src/locales/en/pages/crudTemplate.json +0 -25
- package/templates/src/locales/en/pages/dashboardTemplate.json +0 -20
- package/templates/src/locales/en/pages/formTemplate.json +0 -16
- package/templates/src/locales/en/pages/loginTemplate.json +0 -9
- package/templates/src/locales/es/pages/crudTemplate.json +0 -25
- package/templates/src/locales/es/pages/dashboardTemplate.json +0 -20
- package/templates/src/locales/es/pages/formTemplate.json +0 -16
- package/templates/src/locales/es/pages/loginTemplate.json +0 -9
- package/templates/src/locales/pt-BR/pages/crudTemplate.json +0 -25
- package/templates/src/locales/pt-BR/pages/dashboardTemplate.json +0 -20
- package/templates/src/locales/pt-BR/pages/formTemplate.json +0 -16
- package/templates/src/locales/pt-BR/pages/loginTemplate.json +0 -9
- package/templates/vite.config.d.ts +0 -2
- package/templates/vite.config.js +0 -20
- package/dist/{XerticaXLogo-qBPhwK3g.cjs → LanguageSelector-1cINLJ23.cjs} +80 -80
|
@@ -1,71 +1,71 @@
|
|
|
1
|
-
import { Meta, Title, Subtitle, Description, Primary, Controls, Stories, Canvas } from '@storybook/addon-docs/blocks';
|
|
2
|
-
import * as ModernChatInputStories from './modern-chat-input.stories';
|
|
3
|
-
|
|
4
|
-
<Meta of={ModernChatInputStories} />
|
|
5
|
-
|
|
6
|
-
<Title />
|
|
7
|
-
<Subtitle>An advanced, high-performance chat input for the Xertica Assistant.</Subtitle>
|
|
8
|
-
|
|
9
|
-
<Description />
|
|
10
|
-
|
|
11
|
-
<Primary />
|
|
12
|
-
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
## Usage Patterns
|
|
16
|
-
|
|
17
|
-
### Standard Floating Input
|
|
18
|
-
Optimized for chat interfaces with multi-line support, voice recording, and action chips.
|
|
19
|
-
|
|
20
|
-
<Canvas>
|
|
21
|
-
<ModernChatInputStories.Default />
|
|
22
|
-
</Canvas>
|
|
23
|
-
|
|
24
|
-
### Full-Page Variant
|
|
25
|
-
Adjusts maximum width and alignment for use in standalone chat pages.
|
|
26
|
-
|
|
27
|
-
<Canvas>
|
|
28
|
-
<ModernChatInputStories.FullPage />
|
|
29
|
-
</Canvas>
|
|
30
|
-
|
|
31
|
-
---
|
|
32
|
-
|
|
33
|
-
## Feature Flags
|
|
34
|
-
|
|
35
|
-
Each input capability can be individually toggled via boolean props.
|
|
36
|
-
All flags default to `true` for full backward compatibility.
|
|
37
|
-
|
|
38
|
-
| Prop | Controls | Default |
|
|
39
|
-
|---|---|---|
|
|
40
|
-
| `enableAudioInput` | Voice recording button | `true` |
|
|
41
|
-
| `enableFileAttachment` | File attachment (paperclip) button | `true` |
|
|
42
|
-
| `enableDocumentCreation` | "Create document" menu item | `true` |
|
|
43
|
-
| `enablePodcastGeneration` | "Generate podcast" menu item | `true` |
|
|
44
|
-
| `enableSearch` | "Search" menu item | `true` |
|
|
45
|
-
|
|
46
|
-
> [!NOTE]
|
|
47
|
-
> When all three action types (`enableDocumentCreation`, `enablePodcastGeneration`, `enableSearch`) are set to `false`, the "+" menu button is completely hidden.
|
|
48
|
-
|
|
49
|
-
### Text Only
|
|
50
|
-
All action buttons disabled — only the text input and send button remain.
|
|
51
|
-
|
|
52
|
-
<Canvas>
|
|
53
|
-
<ModernChatInputStories.TextOnly />
|
|
54
|
-
</Canvas>
|
|
55
|
-
|
|
56
|
-
### Selective Actions
|
|
57
|
-
Only document creation and search are enabled for a focused workflow.
|
|
58
|
-
|
|
59
|
-
<Canvas>
|
|
60
|
-
<ModernChatInputStories.SelectiveActions />
|
|
61
|
-
</Canvas>
|
|
62
|
-
|
|
63
|
-
---
|
|
64
|
-
|
|
65
|
-
## AI Best Practices
|
|
66
|
-
|
|
67
|
-
> [!IMPORTANT]
|
|
68
|
-
> - **Action Workflow** — Handle the `onSubmit` callback's optional `action` parameter to distinguish between standard text messages and intent-driven generations (Documents, Podcasts, Search).
|
|
69
|
-
> - **State Sync** — Always maintain the `value` in a parent state and update it via `onChange` and `onVoiceRecording` to ensure consistent data binding.
|
|
70
|
-
> - **Dynamic Sizing** — The input automatically expands up to 100px based on content; ensure the parent container can accommodate these height changes without layout shift.
|
|
71
|
-
> - **Feature Flags** — Pass flags like `enableSearch={false}` or `enableAudioInput={false}` to tailor input capabilities per use-case. Flags are independent and can be combined freely.
|
|
1
|
+
import { Meta, Title, Subtitle, Description, Primary, Controls, Stories, Canvas } from '@storybook/addon-docs/blocks';
|
|
2
|
+
import * as ModernChatInputStories from './modern-chat-input.stories';
|
|
3
|
+
|
|
4
|
+
<Meta of={ModernChatInputStories} />
|
|
5
|
+
|
|
6
|
+
<Title />
|
|
7
|
+
<Subtitle>An advanced, high-performance chat input for the Xertica Assistant.</Subtitle>
|
|
8
|
+
|
|
9
|
+
<Description />
|
|
10
|
+
|
|
11
|
+
<Primary />
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Usage Patterns
|
|
16
|
+
|
|
17
|
+
### Standard Floating Input
|
|
18
|
+
Optimized for chat interfaces with multi-line support, voice recording, and action chips.
|
|
19
|
+
|
|
20
|
+
<Canvas>
|
|
21
|
+
<ModernChatInputStories.Default />
|
|
22
|
+
</Canvas>
|
|
23
|
+
|
|
24
|
+
### Full-Page Variant
|
|
25
|
+
Adjusts maximum width and alignment for use in standalone chat pages.
|
|
26
|
+
|
|
27
|
+
<Canvas>
|
|
28
|
+
<ModernChatInputStories.FullPage />
|
|
29
|
+
</Canvas>
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Feature Flags
|
|
34
|
+
|
|
35
|
+
Each input capability can be individually toggled via boolean props.
|
|
36
|
+
All flags default to `true` for full backward compatibility.
|
|
37
|
+
|
|
38
|
+
| Prop | Controls | Default |
|
|
39
|
+
|---|---|---|
|
|
40
|
+
| `enableAudioInput` | Voice recording button | `true` |
|
|
41
|
+
| `enableFileAttachment` | File attachment (paperclip) button | `true` |
|
|
42
|
+
| `enableDocumentCreation` | "Create document" menu item | `true` |
|
|
43
|
+
| `enablePodcastGeneration` | "Generate podcast" menu item | `true` |
|
|
44
|
+
| `enableSearch` | "Search" menu item | `true` |
|
|
45
|
+
|
|
46
|
+
> [!NOTE]
|
|
47
|
+
> When all three action types (`enableDocumentCreation`, `enablePodcastGeneration`, `enableSearch`) are set to `false`, the "+" menu button is completely hidden.
|
|
48
|
+
|
|
49
|
+
### Text Only
|
|
50
|
+
All action buttons disabled — only the text input and send button remain.
|
|
51
|
+
|
|
52
|
+
<Canvas>
|
|
53
|
+
<ModernChatInputStories.TextOnly />
|
|
54
|
+
</Canvas>
|
|
55
|
+
|
|
56
|
+
### Selective Actions
|
|
57
|
+
Only document creation and search are enabled for a focused workflow.
|
|
58
|
+
|
|
59
|
+
<Canvas>
|
|
60
|
+
<ModernChatInputStories.SelectiveActions />
|
|
61
|
+
</Canvas>
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## AI Best Practices
|
|
66
|
+
|
|
67
|
+
> [!IMPORTANT]
|
|
68
|
+
> - **Action Workflow** — Handle the `onSubmit` callback's optional `action` parameter to distinguish between standard text messages and intent-driven generations (Documents, Podcasts, Search).
|
|
69
|
+
> - **State Sync** — Always maintain the `value` in a parent state and update it via `onChange` and `onVoiceRecording` to ensure consistent data binding.
|
|
70
|
+
> - **Dynamic Sizing** — The input automatically expands up to 100px based on content; ensure the parent container can accommodate these height changes without layout shift.
|
|
71
|
+
> - **Feature Flags** — Pass flags like `enableSearch={false}` or `enableAudioInput={false}` to tailor input capabilities per use-case. Flags are independent and can be combined freely.
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { screen, fireEvent, act, waitFor } from '@testing-library/react';
|
|
2
|
+
import { renderWithProviders as render } from '../../../test/render';
|
|
2
3
|
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
3
4
|
import { ModernChatInput } from './ModernChatInput';
|
|
4
5
|
import React from 'react';
|
|
@@ -19,7 +20,7 @@ describe('ModernChatInput', () => {
|
|
|
19
20
|
const onChange = vi.fn();
|
|
20
21
|
render(<ModernChatInput value="" onChange={onChange} onSubmit={vi.fn()} />);
|
|
21
22
|
|
|
22
|
-
const textarea = screen.getByPlaceholderText('
|
|
23
|
+
const textarea = screen.getByPlaceholderText('Envie uma mensagem');
|
|
23
24
|
fireEvent.change(textarea, { target: { value: 'hello' } });
|
|
24
25
|
|
|
25
26
|
expect(onChange).toHaveBeenCalledWith('hello');
|
|
@@ -238,7 +238,7 @@ export function AssistantMessageBubble({
|
|
|
238
238
|
|
|
239
239
|
{/* Table Rendering */}
|
|
240
240
|
{msg.tableData && (
|
|
241
|
-
<div className="mt-4 w-full max-w-full border rounded-[var(--radius)] overflow-x-auto
|
|
241
|
+
<div className="mt-4 w-full max-w-full border rounded-[var(--radius)] overflow-x-auto scrollbar-thin scrollbar-thumb-border scrollbar-track-transparent relative">
|
|
242
242
|
<Table>
|
|
243
243
|
{msg.tableData.caption && <TableCaption>{msg.tableData.caption}</TableCaption>}
|
|
244
244
|
<TableHeader>
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ReactNode } from 'react';
|
|
2
|
+
import type { ChartConfig, DashboardChartDatum } from '../../ui/chart';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* @file types.ts
|
|
@@ -88,8 +89,8 @@ export interface Message {
|
|
|
88
89
|
searchResults?: SearchResult[];
|
|
89
90
|
searchSources?: SearchSource[];
|
|
90
91
|
searchCommands?: SearchCommand[];
|
|
91
|
-
chartData?:
|
|
92
|
-
chartConfig?:
|
|
92
|
+
chartData?: DashboardChartDatum[];
|
|
93
|
+
chartConfig?: ChartConfig;
|
|
93
94
|
tableData?: {
|
|
94
95
|
caption?: string;
|
|
95
96
|
headers: string[];
|
|
@@ -183,7 +183,7 @@ export function useAssistant({
|
|
|
183
183
|
onSendMessage,
|
|
184
184
|
isProcessing = false,
|
|
185
185
|
responseGenerator,
|
|
186
|
-
richSuggestions = [],
|
|
186
|
+
richSuggestions: _richSuggestions = [],
|
|
187
187
|
onRichAction,
|
|
188
188
|
onEvaluation,
|
|
189
189
|
}: UseAssistantProps = {}): UseAssistantReturn {
|
|
@@ -257,15 +257,14 @@ export function useAssistant({
|
|
|
257
257
|
// Auto-scroll on new messages (condicional ≤ 120px)
|
|
258
258
|
useEffect(() => {
|
|
259
259
|
if (messagesEndRef.current && abaSelecionada === 'chat') {
|
|
260
|
-
const container = messagesEndRef.current.
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
}
|
|
260
|
+
const container = messagesEndRef.current.closest<HTMLElement>(
|
|
261
|
+
'[data-radix-scroll-area-viewport]'
|
|
262
|
+
);
|
|
263
|
+
if (!container) return;
|
|
265
264
|
const distanceFromBottom =
|
|
266
265
|
container.scrollHeight - container.scrollTop - container.clientHeight;
|
|
267
266
|
if (distanceFromBottom < 120) {
|
|
268
|
-
messagesEndRef.current.scrollIntoView({ behavior: 'smooth' });
|
|
267
|
+
messagesEndRef.current.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
|
|
269
268
|
}
|
|
270
269
|
}
|
|
271
270
|
}, [mensagens, abaSelecionada]);
|
|
@@ -381,10 +380,11 @@ export function useAssistant({
|
|
|
381
380
|
await navigator.clipboard.writeText(content);
|
|
382
381
|
setCopiedId(messageId);
|
|
383
382
|
setTimeout(() => setCopiedId(null), 2000);
|
|
384
|
-
} catch (clipboardError
|
|
383
|
+
} catch (clipboardError) {
|
|
385
384
|
if (
|
|
386
|
-
clipboardError
|
|
387
|
-
clipboardError.
|
|
385
|
+
clipboardError instanceof Error &&
|
|
386
|
+
(clipboardError.name === 'NotAllowedError' ||
|
|
387
|
+
clipboardError.message.includes('permissions policy'))
|
|
388
388
|
) {
|
|
389
389
|
throw new Error('Clipboard permission denied, falling back');
|
|
390
390
|
}
|
|
@@ -1,66 +1,66 @@
|
|
|
1
|
-
import { Meta, Title, Subtitle, Description, Primary, Controls, Stories, Canvas } from '@storybook/addon-docs/blocks';
|
|
2
|
-
import * as AssistantStories from './xertica-assistant.stories';
|
|
3
|
-
|
|
4
|
-
<Meta of={AssistantStories} />
|
|
5
|
-
|
|
6
|
-
<Title />
|
|
7
|
-
<Subtitle>An embedded AI-powered assistant panel for chat, document creation, and data analysis.</Subtitle>
|
|
8
|
-
|
|
9
|
-
<Description />
|
|
10
|
-
|
|
11
|
-
<Primary />
|
|
12
|
-
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
## Feature Flags
|
|
16
|
-
|
|
17
|
-
Each assistant capability can be individually toggled on or off via boolean props.
|
|
18
|
-
All flags default to `true` for full backward compatibility.
|
|
19
|
-
|
|
20
|
-
| Prop | Controls | Default |
|
|
21
|
-
|---|---|---|
|
|
22
|
-
| `showHistory` | Conversation history tab and collapsed icon | `true` |
|
|
23
|
-
| `showFavorites` | Favorites tab and collapsed icon | `true` |
|
|
24
|
-
| `enableAudioInput` | Voice recording and audio upload | `true` |
|
|
25
|
-
| `enableFileAttachment` | File attachment button | `true` |
|
|
26
|
-
| `enableDocumentCreation` | "Create document" action in the input menu | `true` |
|
|
27
|
-
| `enablePodcastGeneration` | "Generate podcast" action and per-message button | `true` |
|
|
28
|
-
| `enableSearch` | "Search" action in the input menu | `true` |
|
|
29
|
-
|
|
30
|
-
### Chat Only
|
|
31
|
-
|
|
32
|
-
All extra features disabled — the assistant provides only a basic text chat.
|
|
33
|
-
|
|
34
|
-
<Canvas of={AssistantStories.ChatOnly} />
|
|
35
|
-
|
|
36
|
-
### Minimal Input
|
|
37
|
-
|
|
38
|
-
Only document creation and file attachment are enabled — ideal for document-focused workflows.
|
|
39
|
-
|
|
40
|
-
<Canvas of={AssistantStories.MinimalInput} />
|
|
41
|
-
|
|
42
|
-
---
|
|
43
|
-
|
|
44
|
-
## Workspace Integration
|
|
45
|
-
|
|
46
|
-
The assistant features specialized workspaces for different content types.
|
|
47
|
-
|
|
48
|
-
### Document Editing
|
|
49
|
-
When the assistant generates a document, it opens a dedicated editing workspace using the `RichTextEditor` component.
|
|
50
|
-
|
|
51
|
-
<Canvas of={AssistantStories.DocumentEditing} />
|
|
52
|
-
|
|
53
|
-
### Full Page View
|
|
54
|
-
For focused work, the assistant can be expanded into a centered full-page layout.
|
|
55
|
-
|
|
56
|
-
<Canvas of={AssistantStories.FullPage} />
|
|
57
|
-
|
|
58
|
-
---
|
|
59
|
-
|
|
60
|
-
## AI Best Practices
|
|
61
|
-
|
|
62
|
-
> [!IMPORTANT]
|
|
63
|
-
> - **Layout Context** — Use `useLayout()` to toggle the assistant's visibility and track its state across the application.
|
|
64
|
-
> - **Demo Mode** — Use `demoMode={true}` for prototyping; it provides rich mock responses for documents, charts, and media.
|
|
65
|
-
> - **Custom Responses** — Leverage `responseGenerator` to bridge the assistant with your backend or custom LLM logic.
|
|
66
|
-
> - **Feature Flags** — Pass individual flags like `showHistory={false}` or `enableSearch={false}` to tailor the assistant's capabilities per use-case. Flags can be combined freely.
|
|
1
|
+
import { Meta, Title, Subtitle, Description, Primary, Controls, Stories, Canvas } from '@storybook/addon-docs/blocks';
|
|
2
|
+
import * as AssistantStories from './xertica-assistant.stories';
|
|
3
|
+
|
|
4
|
+
<Meta of={AssistantStories} />
|
|
5
|
+
|
|
6
|
+
<Title />
|
|
7
|
+
<Subtitle>An embedded AI-powered assistant panel for chat, document creation, and data analysis.</Subtitle>
|
|
8
|
+
|
|
9
|
+
<Description />
|
|
10
|
+
|
|
11
|
+
<Primary />
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Feature Flags
|
|
16
|
+
|
|
17
|
+
Each assistant capability can be individually toggled on or off via boolean props.
|
|
18
|
+
All flags default to `true` for full backward compatibility.
|
|
19
|
+
|
|
20
|
+
| Prop | Controls | Default |
|
|
21
|
+
|---|---|---|
|
|
22
|
+
| `showHistory` | Conversation history tab and collapsed icon | `true` |
|
|
23
|
+
| `showFavorites` | Favorites tab and collapsed icon | `true` |
|
|
24
|
+
| `enableAudioInput` | Voice recording and audio upload | `true` |
|
|
25
|
+
| `enableFileAttachment` | File attachment button | `true` |
|
|
26
|
+
| `enableDocumentCreation` | "Create document" action in the input menu | `true` |
|
|
27
|
+
| `enablePodcastGeneration` | "Generate podcast" action and per-message button | `true` |
|
|
28
|
+
| `enableSearch` | "Search" action in the input menu | `true` |
|
|
29
|
+
|
|
30
|
+
### Chat Only
|
|
31
|
+
|
|
32
|
+
All extra features disabled — the assistant provides only a basic text chat.
|
|
33
|
+
|
|
34
|
+
<Canvas of={AssistantStories.ChatOnly} />
|
|
35
|
+
|
|
36
|
+
### Minimal Input
|
|
37
|
+
|
|
38
|
+
Only document creation and file attachment are enabled — ideal for document-focused workflows.
|
|
39
|
+
|
|
40
|
+
<Canvas of={AssistantStories.MinimalInput} />
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Workspace Integration
|
|
45
|
+
|
|
46
|
+
The assistant features specialized workspaces for different content types.
|
|
47
|
+
|
|
48
|
+
### Document Editing
|
|
49
|
+
When the assistant generates a document, it opens a dedicated editing workspace using the `RichTextEditor` component.
|
|
50
|
+
|
|
51
|
+
<Canvas of={AssistantStories.DocumentEditing} />
|
|
52
|
+
|
|
53
|
+
### Full Page View
|
|
54
|
+
For focused work, the assistant can be expanded into a centered full-page layout.
|
|
55
|
+
|
|
56
|
+
<Canvas of={AssistantStories.FullPage} />
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## AI Best Practices
|
|
61
|
+
|
|
62
|
+
> [!IMPORTANT]
|
|
63
|
+
> - **Layout Context** — Use `useLayout()` to toggle the assistant's visibility and track its state across the application.
|
|
64
|
+
> - **Demo Mode** — Use `demoMode={true}` for prototyping; it provides rich mock responses for documents, charts, and media.
|
|
65
|
+
> - **Custom Responses** — Leverage `responseGenerator` to bridge the assistant with your backend or custom LLM logic.
|
|
66
|
+
> - **Feature Flags** — Pass individual flags like `showHistory={false}` or `enableSearch={false}` to tailor the assistant's capabilities per use-case. Flags can be combined freely.
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { screen, fireEvent, act, waitFor } from '@testing-library/react';
|
|
2
|
+
import { renderWithProviders as render } from '../../../test/render';
|
|
2
3
|
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
3
4
|
import { XerticaAssistant } from './xertica-assistant';
|
|
4
5
|
import React from 'react';
|
|
@@ -1,32 +1,37 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { ImageWithFallback } from '
|
|
3
|
-
import { LanguageSelector } from '
|
|
4
|
-
|
|
5
|
-
interface AuthPageShellProps {
|
|
6
|
-
imageSrc: string;
|
|
7
|
-
imageAlt: string;
|
|
8
|
-
children: React.ReactNode;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
<
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ImageWithFallback } from '../../figma/ImageWithFallback';
|
|
3
|
+
import { LanguageSelector } from '../../brand/language-selector';
|
|
4
|
+
|
|
5
|
+
export interface AuthPageShellProps {
|
|
6
|
+
imageSrc: string;
|
|
7
|
+
imageAlt: string;
|
|
8
|
+
children: React.ReactNode;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Shared two-column shell used by every auth page (Login, ForgotPassword,
|
|
13
|
+
* ResetPassword, VerifyEmail): hero image on the left, centered form panel
|
|
14
|
+
* with a language selector on the right.
|
|
15
|
+
*/
|
|
16
|
+
export function AuthPageShell({ imageSrc, imageAlt, children }: AuthPageShellProps) {
|
|
17
|
+
return (
|
|
18
|
+
<div className="h-screen w-full flex overflow-y-auto">
|
|
19
|
+
<div className="hidden lg:flex lg:flex-1 relative overflow-hidden">
|
|
20
|
+
<ImageWithFallback
|
|
21
|
+
src={imageSrc}
|
|
22
|
+
alt={imageAlt}
|
|
23
|
+
className="absolute inset-0 w-full h-full object-cover"
|
|
24
|
+
/>
|
|
25
|
+
<div className="absolute inset-0 bg-[image:var(--gradient-diagonal)] opacity-80" />
|
|
26
|
+
</div>
|
|
27
|
+
|
|
28
|
+
<div className="flex-1 flex items-center justify-center px-4 sm:px-6 lg:px-8 lg:flex-none lg:w-1/2 relative bg-muted">
|
|
29
|
+
<div className="absolute top-4 right-4 z-20">
|
|
30
|
+
<LanguageSelector variant="minimal" showIcon={false} />
|
|
31
|
+
</div>
|
|
32
|
+
<div className="absolute inset-0 lg:hidden bg-[image:var(--gradient-diagonal)] opacity-10 dark:opacity-5" />
|
|
33
|
+
<div className="w-full max-w-sm space-y-6 relative z-10">{children}</div>
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
);
|
|
37
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useTranslation } from 'react-i18next';
|
|
3
|
+
import type { PasswordStrength } from './usePasswordStrength';
|
|
4
|
+
|
|
5
|
+
export interface PasswordStrengthMeterProps {
|
|
6
|
+
strength: PasswordStrength;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const BAR_WIDTH: Record<Exclude<PasswordStrength, null>, string> = {
|
|
10
|
+
weak: 'w-1/3 bg-destructive',
|
|
11
|
+
medium: 'w-2/3 bg-[var(--chart-3)]',
|
|
12
|
+
strong: 'w-full bg-[var(--chart-2)]',
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const TEXT_COLOR: Record<Exclude<PasswordStrength, null>, string> = {
|
|
16
|
+
weak: 'text-destructive',
|
|
17
|
+
medium: 'text-[var(--chart-3)]',
|
|
18
|
+
strong: 'text-[var(--chart-2)]',
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const LABEL_KEY: Record<Exclude<PasswordStrength, null>, string> = {
|
|
22
|
+
weak: 'resetPassword.strengthWeak',
|
|
23
|
+
medium: 'resetPassword.strengthMedium',
|
|
24
|
+
strong: 'resetPassword.strengthStrong',
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
/** Progress bar + label shown under the new-password field on reset/create-password screens. */
|
|
28
|
+
export function PasswordStrengthMeter({ strength }: PasswordStrengthMeterProps) {
|
|
29
|
+
const { t } = useTranslation();
|
|
30
|
+
|
|
31
|
+
if (!strength) return null;
|
|
32
|
+
|
|
33
|
+
return (
|
|
34
|
+
<div className="flex items-center gap-2">
|
|
35
|
+
<div className="flex-1 h-1 bg-muted rounded-full overflow-hidden">
|
|
36
|
+
<div className={`h-full transition-all duration-300 ${BAR_WIDTH[strength]}`} />
|
|
37
|
+
</div>
|
|
38
|
+
<span className={`text-small ${TEXT_COLOR[strength]}`}>{t(LABEL_KEY[strength])}</span>
|
|
39
|
+
</div>
|
|
40
|
+
);
|
|
41
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useTranslation } from 'react-i18next';
|
|
3
|
+
import { Lock } from 'lucide-react';
|
|
4
|
+
import { Button } from '../../ui/button';
|
|
5
|
+
|
|
6
|
+
export type SocialProvider = 'google' | 'mtLogin' | 'govBr';
|
|
7
|
+
|
|
8
|
+
export interface SocialLoginButtonsProps {
|
|
9
|
+
onSocialLogin: (provider: string) => void;
|
|
10
|
+
/** Which SSO providers to render — projects without gov.br/MT Login can pass a smaller list. */
|
|
11
|
+
providers?: SocialProvider[];
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const DEFAULT_PROVIDERS: SocialProvider[] = ['google', 'mtLogin', 'govBr'];
|
|
15
|
+
|
|
16
|
+
export function SocialLoginButtons({
|
|
17
|
+
onSocialLogin,
|
|
18
|
+
providers = DEFAULT_PROVIDERS,
|
|
19
|
+
}: SocialLoginButtonsProps) {
|
|
20
|
+
const { t } = useTranslation();
|
|
21
|
+
|
|
22
|
+
if (providers.length === 0) return null;
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<>
|
|
26
|
+
<div className="relative">
|
|
27
|
+
<div className="absolute inset-0 flex items-center">
|
|
28
|
+
<div className="w-full border-t border-border" />
|
|
29
|
+
</div>
|
|
30
|
+
<div className="relative flex justify-center text-sm">
|
|
31
|
+
<span className="bg-muted px-2 text-muted-foreground">{t('login.orContinueWith')}</span>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
|
|
35
|
+
<div className="space-y-3">
|
|
36
|
+
{providers.includes('google') && (
|
|
37
|
+
<Button
|
|
38
|
+
type="button"
|
|
39
|
+
variant="outline"
|
|
40
|
+
className="w-full justify-center"
|
|
41
|
+
onClick={() => onSocialLogin('Google')}
|
|
42
|
+
>
|
|
43
|
+
<svg className="w-5 h-5 mr-2" viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg">
|
|
44
|
+
<path
|
|
45
|
+
fill="#EA4335"
|
|
46
|
+
d="M24 9.5c3.54 0 6.71 1.22 9.21 3.6l6.85-6.85C35.9 2.38 30.47 0 24 0 14.62 0 6.51 5.38 2.56 13.22l7.98 6.19C12.43 13.72 17.74 9.5 24 9.5z"
|
|
47
|
+
/>
|
|
48
|
+
<path
|
|
49
|
+
fill="#4285F4"
|
|
50
|
+
d="M46.98 24.55c0-1.57-.15-3.09-.38-4.55H24v9.02h12.94c-.58 2.96-2.26 5.48-4.78 7.18l7.73 6c4.51-4.18 7.09-10.36 7.09-17.65z"
|
|
51
|
+
/>
|
|
52
|
+
<path
|
|
53
|
+
fill="#FBBC05"
|
|
54
|
+
d="M10.53 28.59c-.48-1.45-.76-2.99-.76-4.59s.27-3.14.76-4.59l-7.98-6.19C.92 16.46 0 20.12 0 24c0 3.88.92 7.54 2.56 10.78l7.97-6.19z"
|
|
55
|
+
/>
|
|
56
|
+
<path
|
|
57
|
+
fill="#34A853"
|
|
58
|
+
d="M24 48c6.48 0 11.93-2.13 15.89-5.81l-7.73-6c-2.15 1.45-4.92 2.3-8.16 2.3-6.26 0-11.57-4.22-13.47-9.91l-7.98 6.19C6.51 42.62 14.62 48 24 48z"
|
|
59
|
+
/>
|
|
60
|
+
<path fill="none" d="M0 0h48v48H0z" />
|
|
61
|
+
</svg>
|
|
62
|
+
<span>{t('login.signInWithGoogle')}</span>
|
|
63
|
+
</Button>
|
|
64
|
+
)}
|
|
65
|
+
|
|
66
|
+
{providers.includes('mtLogin') && (
|
|
67
|
+
<Button
|
|
68
|
+
type="button"
|
|
69
|
+
variant="outline"
|
|
70
|
+
className="w-full justify-center"
|
|
71
|
+
onClick={() => onSocialLogin('MT Login')}
|
|
72
|
+
>
|
|
73
|
+
<Lock className="w-5 h-5 mr-2 text-[var(--chart-4)]" />
|
|
74
|
+
<span>{t('login.signInWithMTLogin')}</span>
|
|
75
|
+
</Button>
|
|
76
|
+
)}
|
|
77
|
+
|
|
78
|
+
{providers.includes('govBr') && (
|
|
79
|
+
<Button
|
|
80
|
+
type="button"
|
|
81
|
+
variant="outline"
|
|
82
|
+
className="w-full justify-center font-normal"
|
|
83
|
+
onClick={() => onSocialLogin('gov.br')}
|
|
84
|
+
>
|
|
85
|
+
<span>
|
|
86
|
+
{t('login.signInWithGovBr').split('gov.br')[0]}
|
|
87
|
+
<strong className="font-semibold">gov.br</strong>
|
|
88
|
+
{t('login.signInWithGovBr').split('gov.br')[1] || ''}
|
|
89
|
+
</span>
|
|
90
|
+
</Button>
|
|
91
|
+
)}
|
|
92
|
+
</div>
|
|
93
|
+
</>
|
|
94
|
+
);
|
|
95
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { AuthPageShell } from './AuthPageShell';
|
|
2
|
+
export type { AuthPageShellProps } from './AuthPageShell';
|
|
3
|
+
|
|
4
|
+
export { SocialLoginButtons } from './SocialLoginButtons';
|
|
5
|
+
export type { SocialLoginButtonsProps, SocialProvider } from './SocialLoginButtons';
|
|
6
|
+
|
|
7
|
+
export { usePasswordStrength } from './usePasswordStrength';
|
|
8
|
+
export type { PasswordStrength } from './usePasswordStrength';
|
|
9
|
+
|
|
10
|
+
export { PasswordStrengthMeter } from './PasswordStrengthMeter';
|
|
11
|
+
export type { PasswordStrengthMeterProps } from './PasswordStrengthMeter';
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
|
|
3
|
+
export type PasswordStrength = 'weak' | 'medium' | 'strong' | null;
|
|
4
|
+
|
|
5
|
+
/** Length-based password strength heuristic shared by every reset/create-password screen. */
|
|
6
|
+
export function usePasswordStrength(password: string): PasswordStrength {
|
|
7
|
+
return useMemo(() => {
|
|
8
|
+
if (password.length === 0) return null;
|
|
9
|
+
if (password.length < 6) return 'weak';
|
|
10
|
+
if (password.length < 10) return 'medium';
|
|
11
|
+
return 'strong';
|
|
12
|
+
}, [password]);
|
|
13
|
+
}
|