xertica-ui 2.5.2 → 2.6.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 +687 -656
- 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 +36 -11
- 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 +5 -4
- package/components/assistant/xertica-assistant/xertica-assistant.mdx +66 -66
- package/components/assistant/xertica-assistant/xertica-assistant.test.tsx +2 -1
- package/components/blocks/card-patterns/card-patterns.mdx +123 -123
- 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 -1501
- 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 +188 -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 +2 -3
- 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 +218 -218
- package/components/pages/login-page/login-page.test.tsx +2 -1
- package/components/pages/reset-password-page/ResetPasswordPage.tsx +243 -243
- package/components/pages/reset-password-page/reset-password-page.mdx +63 -63
- package/components/pages/template-content/TemplateContent.tsx +2 -3
- 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 +206 -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-DMJJ_Amf.js → AssistantChart-BMNSA_Pk.js} +5 -5
- package/dist/{AssistantChart-D0A1FPYt.cjs → AssistantChart-BzM7plyc.cjs} +150 -114
- package/dist/{AssistantChart-BXU1ACnh.js → AssistantChart-C842evTi.js} +134 -240
- package/dist/{AssistantChart-BZTPJ5dP.cjs → AssistantChart-CVF2uh37.cjs} +5 -5
- package/dist/{AssistantChart-COGiOV-g.cjs → AssistantChart-JooMdVQU.cjs} +17 -7
- package/dist/{AssistantChart-CWX1OWNM.js → AssistantChart-KHS-tp-L.js} +17 -7
- 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/{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/{ThemeContext-BgclCB35.js → ThemeContext-BGeh_Kdr.js} +290 -212
- package/dist/{ThemeContext-BblcjQup.cjs → ThemeContext-D50irx5T.cjs} +291 -205
- package/dist/{VerifyEmailPage-C_Zk6Gen.cjs → VerifyEmailPage-B6bOrybJ.cjs} +17 -17
- package/dist/{VerifyEmailPage-B31mCrMc.js → VerifyEmailPage-BRE5Fz59.js} +8 -8
- package/dist/{VerifyEmailPage-BJjAMUTW.js → VerifyEmailPage-BcCluouh.js} +151 -78
- package/dist/VerifyEmailPage-Bx1sr0uQ.cjs +3298 -0
- package/dist/{VerifyEmailPage-X14vhdyl.js → VerifyEmailPage-DUYyXCX9.js} +12 -12
- package/dist/VerifyEmailPage-DXXMHbzq.js +3289 -0
- package/dist/{VerifyEmailPage-u_Dn7t1U.cjs → VerifyEmailPage-DpYtFk35.cjs} +21 -21
- package/dist/{VerifyEmailPage-Cyl55sJb.js → VerifyEmailPage-NXKWW3Dk.js} +134 -64
- package/dist/{VerifyEmailPage-Bv8Ah_TK.cjs → VerifyEmailPage-QrCz4Wqr.cjs} +143 -73
- package/dist/{VerifyEmailPage-CkBYfsNy.cjs → VerifyEmailPage-ZmQra0Wi.cjs} +160 -87
- package/dist/{XerticaProvider-BErr83Bg.js → XerticaProvider-BF3q_myt.js} +5 -4
- 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-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/assistant.cjs.js +2 -2
- package/dist/assistant.es.js +2 -2
- package/dist/brand.cjs.js +6 -6
- package/dist/brand.es.js +2 -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/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/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 +2 -1
- 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 +2 -2
- package/dist/hooks.es.js +2 -2
- package/dist/{index-9GWd0qxq.cjs → index-BQjx1Mdf.cjs} +1 -1
- package/dist/index-Bei5DzAL.js +6 -0
- package/dist/index.cjs.js +18 -18
- package/dist/index.es.js +12 -12
- package/dist/{input-cc-PTD4R.js → input-B0_vbA3g.js} +3 -61
- package/dist/{input-C_UiS2Py.cjs → input-ByYuOv8A.cjs} +1 -62
- 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-DxO1Hz3a.cjs → rich-text-editor-BuqSu718.cjs} +70 -5
- package/dist/{rich-text-editor-DqLICivI.js → rich-text-editor-CV8FtA_l.js} +68 -6
- package/dist/{rich-text-editor-DloeW0wc.js → rich-text-editor-DV1SixzE.js} +61 -3
- package/dist/{rich-text-editor-B2CKz7nx.cjs → rich-text-editor-DnSDglzW.cjs} +63 -2
- package/dist/{sidebar-BS1p2V7t.cjs → sidebar-BGJ0j567.cjs} +367 -9
- package/dist/{sidebar-3XyzjVBw.js → sidebar-BI6mZlC8.js} +364 -6
- package/dist/{sidebar-DyYvgyBj.cjs → sidebar-BtmotOg-.cjs} +367 -9
- package/dist/{sidebar-Duermn32.js → sidebar-D3EgGVxF.js} +77 -63
- package/dist/{sidebar-CLmIjgNd.cjs → sidebar-DDTqMGnR.cjs} +80 -66
- package/dist/{sidebar-B4ZWaMrE.js → sidebar-I7EXyf5D.js} +364 -6
- package/dist/ui.cjs.js +7 -7
- package/dist/ui.es.js +5 -5
- package/dist/{xertica-assistant-QFUnv5I2.cjs → xertica-assistant-BrF9jScR.cjs} +4 -4
- package/dist/{xertica-assistant-BbgzsgsG.js → xertica-assistant-CJVnvMqU.js} +55 -45
- package/dist/{xertica-assistant-d2qs2Vd9.cjs → xertica-assistant-CKPtc1z5.cjs} +58 -40
- package/dist/{xertica-assistant-CyikE3N_.js → xertica-assistant-CsBsxTsI.js} +2 -2
- package/dist/{xertica-assistant-CIaUlbIt.cjs → xertica-assistant-DER0brPQ.cjs} +6 -5
- package/dist/{xertica-assistant-B1NaSFFj.js → xertica-assistant-DQCjpk5M.js} +4 -3
- package/dist/{xertica-assistant-B687qEPU.js → xertica-assistant-Dk-9AJzw.js} +16 -7
- package/dist/{xertica-assistant-sOHwTgIP.cjs → xertica-assistant-DxhIKvuY.cjs} +18 -9
- 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 +31 -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/AuthPageShell.tsx +32 -32
- package/templates/src/features/home/ui/HomeContent.tsx +2 -3
- package/templates/src/features/settings/index.ts +2 -0
- package/templates/src/features/settings/ui/SettingsContent.tsx +134 -0
- package/templates/src/features/template/ui/TemplateContent.tsx +2 -3
- package/templates/src/i18n.ts +36 -13
- package/templates/src/locales/en/pages/settings.json +15 -0
- package/templates/src/locales/es/pages/settings.json +15 -0
- package/templates/src/locales/pt-BR/pages/settings.json +15 -0
- 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/templates/vite.config.d.ts +2 -2
- package/templates/vite.config.js +20 -20
- 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-Cfs6Ishq.js +0 -485
- package/dist/FeatureCard-CkPd2psQ.cjs +0 -301
- package/dist/FeatureCard-Dkp-xmzM.cjs +0 -335
- package/dist/FeatureCard-ie3L8Fpr.cjs +0 -484
- 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-RTy1m2Uq.js +0 -82
- package/dist/ThemeContext-U4dEYc6C.cjs +0 -187
- package/dist/ThemeContext-bSzuOit2.cjs +0 -81
- 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-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-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-B8CaV7xu.cjs +0 -39
- 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-DQtvJU7m.js +0 -40
- 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-CFuIlYFH.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-CziKMQil.cjs +0 -242
- 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/alert-dialog-iDe5VE5o.js +0 -842
- package/dist/alert-dialog-yckpaOpy.cjs +0 -865
- 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-D-6IsAca.js +0 -133
- package/dist/input-wPYg0d0P.js +0 -127
- package/dist/progress-BLwqortq.cjs +0 -105
- package/dist/progress-Cs9i4DPx.js +0 -81
- package/dist/progress-D9mtsf6j.js +0 -89
- package/dist/progress-DDeuWPZw.cjs +0 -97
- 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-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/dist/{XerticaXLogo-qBPhwK3g.cjs → LanguageSelector-1cINLJ23.cjs} +80 -80
|
@@ -1,206 +1,206 @@
|
|
|
1
|
-
import React, { useState } from 'react';
|
|
2
|
-
import { Button } from '../../ui/button';
|
|
3
|
-
import { XerticaLogo } from '../../brand/xertica-logo';
|
|
4
|
-
import { ImageWithFallback } from '../../figma/ImageWithFallback';
|
|
5
|
-
import { LanguageSelector } from '../../brand/language-selector';
|
|
6
|
-
import { ArrowLeft, Mail, CheckCircle2, Lock } from 'lucide-react';
|
|
7
|
-
import { useNavigate, useLocation } from 'react-router-dom';
|
|
8
|
-
import { useTranslation } from 'react-i18next';
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Email Verification Page component.
|
|
12
|
-
*
|
|
13
|
-
* @description
|
|
14
|
-
* An informative screen shown after a password reset request. It instructs
|
|
15
|
-
* the user to check their email and provides a "Resend email" feature.
|
|
16
|
-
* Includes the same consistent layout with a hero image side-panel.
|
|
17
|
-
*
|
|
18
|
-
* @ai-rules
|
|
19
|
-
* 1. Data Source: It retrieves the email from the router's `location.state`.
|
|
20
|
-
* 2. Visual Feedback: Displays a temporary success message upon successful resale of the verification email.
|
|
21
|
-
* 3. Navigation: Includes a link to return to the `LoginPage`.
|
|
22
|
-
*/
|
|
23
|
-
export function VerifyEmailPage() {
|
|
24
|
-
const navigate = useNavigate();
|
|
25
|
-
const location = useLocation();
|
|
26
|
-
const { t } = useTranslation();
|
|
27
|
-
const email = location.state?.email || 'your@email.com';
|
|
28
|
-
const [isResending, setIsResending] = useState(false);
|
|
29
|
-
const [resendSuccess, setResendSuccess] = useState(false);
|
|
30
|
-
|
|
31
|
-
const handleResend = async () => {
|
|
32
|
-
setIsResending(true);
|
|
33
|
-
setResendSuccess(false);
|
|
34
|
-
|
|
35
|
-
// Simulate email resending
|
|
36
|
-
await new Promise(resolve => setTimeout(resolve, 1500));
|
|
37
|
-
|
|
38
|
-
setIsResending(false);
|
|
39
|
-
setResendSuccess(true);
|
|
40
|
-
|
|
41
|
-
// Remove success message after 3 seconds
|
|
42
|
-
setTimeout(() => setResendSuccess(false), 3000);
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
const handleSocialLogin = (_provider: string) => {
|
|
46
|
-
// Wire your SSO/social provider integration here
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
return (
|
|
50
|
-
<div className="h-screen w-full flex overflow-y-auto">
|
|
51
|
-
{/* Left side - Full background image */}
|
|
52
|
-
<div className="hidden lg:flex lg:flex-1 relative overflow-hidden">
|
|
53
|
-
{/* Background image filling all space */}
|
|
54
|
-
<ImageWithFallback
|
|
55
|
-
src="https://images.unsplash.com/photo-1563986768609-322da13575f3?w=1200&h=800&fit=crop&auto=format"
|
|
56
|
-
alt={t('verifyEmail.heroImageAlt')}
|
|
57
|
-
className="absolute inset-0 w-full h-full object-cover"
|
|
58
|
-
/>
|
|
59
|
-
|
|
60
|
-
{/* Gradient overlay */}
|
|
61
|
-
<div className="absolute inset-0 bg-[image:var(--gradient-diagonal)] opacity-80" />
|
|
62
|
-
</div>
|
|
63
|
-
|
|
64
|
-
{/* Right side - Content */}
|
|
65
|
-
<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">
|
|
66
|
-
{/* Language selector in the top right corner */}
|
|
67
|
-
<div className="absolute top-4 right-4 z-20">
|
|
68
|
-
<LanguageSelector variant="minimal" showIcon={false} />
|
|
69
|
-
</div>
|
|
70
|
-
|
|
71
|
-
{/* Mobile background gradient */}
|
|
72
|
-
<div className="absolute inset-0 lg:hidden bg-[image:var(--gradient-diagonal)] opacity-10 dark:opacity-5" />
|
|
73
|
-
|
|
74
|
-
<div className="w-full max-w-sm space-y-6 relative z-10">
|
|
75
|
-
{/* Form header */}
|
|
76
|
-
<div className="text-center">
|
|
77
|
-
<div className="flex items-center justify-center mb-4">
|
|
78
|
-
<XerticaLogo
|
|
79
|
-
className="h-12 w-auto text-primary dark:text-foreground"
|
|
80
|
-
variant="theme"
|
|
81
|
-
/>
|
|
82
|
-
</div>
|
|
83
|
-
|
|
84
|
-
{/* Email icon */}
|
|
85
|
-
<div className="flex items-center justify-center mb-4">
|
|
86
|
-
<div className="p-4 bg-primary/10 rounded-[var(--radius)]">
|
|
87
|
-
<Mail className="w-12 h-12 text-primary" />
|
|
88
|
-
</div>
|
|
89
|
-
</div>
|
|
90
|
-
|
|
91
|
-
<h2 className="text-sm text-muted-foreground">{t('verifyEmail.heading')}</h2>
|
|
92
|
-
<p className="mt-2 text-muted-foreground">{t('verifyEmail.instructionsSent')}</p>
|
|
93
|
-
<p className="mt-1 text-primary">{email}</p>
|
|
94
|
-
</div>
|
|
95
|
-
|
|
96
|
-
{/* Instructions */}
|
|
97
|
-
<div className="bg-accent rounded-[var(--radius)] p-4 space-y-3">
|
|
98
|
-
<p className="text-muted-foreground">{t('verifyEmail.instructions')}</p>
|
|
99
|
-
<div className="flex items-start gap-2 text-muted-foreground">
|
|
100
|
-
<CheckCircle2 className="w-4 h-4 mt-0.5 flex-shrink-0 text-[var(--chart-2)]" />
|
|
101
|
-
<span className="text-sm">{t('verifyEmail.checkSpam')}</span>
|
|
102
|
-
</div>
|
|
103
|
-
</div>
|
|
104
|
-
|
|
105
|
-
{/* Success message on resend */}
|
|
106
|
-
{resendSuccess && (
|
|
107
|
-
<div className="bg-[var(--chart-2)]/10 border border-[var(--chart-2)]/20 rounded-[var(--radius)] p-3 flex items-center gap-2">
|
|
108
|
-
<CheckCircle2 className="w-5 h-5 text-[var(--chart-2)] flex-shrink-0" />
|
|
109
|
-
<span className="text-sm text-[var(--chart-2)]">
|
|
110
|
-
{t('verifyEmail.resentSuccess')}
|
|
111
|
-
</span>
|
|
112
|
-
</div>
|
|
113
|
-
)}
|
|
114
|
-
|
|
115
|
-
{/* Action buttons */}
|
|
116
|
-
<div className="space-y-3">
|
|
117
|
-
<p className="text-center text-muted-foreground">{t('verifyEmail.notReceived')}</p>
|
|
118
|
-
<Button
|
|
119
|
-
variant="outline"
|
|
120
|
-
className="w-full"
|
|
121
|
-
onClick={handleResend}
|
|
122
|
-
disabled={isResending}
|
|
123
|
-
>
|
|
124
|
-
{isResending ? t('verifyEmail.resending') : t('verifyEmail.resend')}
|
|
125
|
-
</Button>
|
|
126
|
-
|
|
127
|
-
<Button
|
|
128
|
-
type="button"
|
|
129
|
-
onClick={() => navigate('/login')}
|
|
130
|
-
variant="outline"
|
|
131
|
-
className="w-full text-muted-foreground hover:text-foreground"
|
|
132
|
-
>
|
|
133
|
-
<ArrowLeft className="w-4 h-4 mr-2" />
|
|
134
|
-
{t('verifyEmail.backToLogin')}
|
|
135
|
-
</Button>
|
|
136
|
-
</div>
|
|
137
|
-
|
|
138
|
-
{/* Divider */}
|
|
139
|
-
<div className="relative">
|
|
140
|
-
<div className="absolute inset-0 flex items-center">
|
|
141
|
-
<div className="w-full border-t border-border"></div>
|
|
142
|
-
</div>
|
|
143
|
-
<div className="relative flex justify-center text-sm">
|
|
144
|
-
<span className="bg-muted px-2 text-muted-foreground">
|
|
145
|
-
{t('login.orContinueWith')}
|
|
146
|
-
</span>
|
|
147
|
-
</div>
|
|
148
|
-
</div>
|
|
149
|
-
|
|
150
|
-
{/* Social/SSO login options */}
|
|
151
|
-
<div className="space-y-3">
|
|
152
|
-
{/* Google */}
|
|
153
|
-
<Button
|
|
154
|
-
type="button"
|
|
155
|
-
variant="outline"
|
|
156
|
-
className="w-full justify-center"
|
|
157
|
-
onClick={() => handleSocialLogin('Google')}
|
|
158
|
-
>
|
|
159
|
-
<svg className="w-5 h-5 mr-2" viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg">
|
|
160
|
-
<path
|
|
161
|
-
fill="#EA4335"
|
|
162
|
-
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"
|
|
163
|
-
></path>
|
|
164
|
-
<path
|
|
165
|
-
fill="#4285F4"
|
|
166
|
-
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"
|
|
167
|
-
></path>
|
|
168
|
-
<path
|
|
169
|
-
fill="#FBBC05"
|
|
170
|
-
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"
|
|
171
|
-
></path>
|
|
172
|
-
<path
|
|
173
|
-
fill="#34A853"
|
|
174
|
-
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"
|
|
175
|
-
></path>
|
|
176
|
-
<path fill="none" d="M0 0h48v48H0z"></path>
|
|
177
|
-
</svg>
|
|
178
|
-
<span>{t('login.signInWithGoogle')}</span>
|
|
179
|
-
</Button>
|
|
180
|
-
|
|
181
|
-
{/* MT Login */}
|
|
182
|
-
<Button
|
|
183
|
-
type="button"
|
|
184
|
-
variant="outline"
|
|
185
|
-
className="w-full justify-center"
|
|
186
|
-
onClick={() => handleSocialLogin('MT Login')}
|
|
187
|
-
>
|
|
188
|
-
<Lock className="w-5 h-5 mr-2 text-[var(--chart-4)]" />
|
|
189
|
-
<span>{t('login.signInWithMTLogin')}</span>
|
|
190
|
-
</Button>
|
|
191
|
-
|
|
192
|
-
{/* gov.br */}
|
|
193
|
-
<Button
|
|
194
|
-
type="button"
|
|
195
|
-
variant="outline"
|
|
196
|
-
className="w-full justify-center font-normal"
|
|
197
|
-
onClick={() => handleSocialLogin('gov.br')}
|
|
198
|
-
>
|
|
199
|
-
<span>{t('login.signInWithGovBr')}</span>
|
|
200
|
-
</Button>
|
|
201
|
-
</div>
|
|
202
|
-
</div>
|
|
203
|
-
</div>
|
|
204
|
-
</div>
|
|
205
|
-
);
|
|
206
|
-
}
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import { Button } from '../../ui/button';
|
|
3
|
+
import { XerticaLogo } from '../../brand/xertica-logo';
|
|
4
|
+
import { ImageWithFallback } from '../../figma/ImageWithFallback';
|
|
5
|
+
import { LanguageSelector } from '../../brand/language-selector';
|
|
6
|
+
import { ArrowLeft, Mail, CheckCircle2, Lock } from 'lucide-react';
|
|
7
|
+
import { useNavigate, useLocation } from 'react-router-dom';
|
|
8
|
+
import { useTranslation } from 'react-i18next';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Email Verification Page component.
|
|
12
|
+
*
|
|
13
|
+
* @description
|
|
14
|
+
* An informative screen shown after a password reset request. It instructs
|
|
15
|
+
* the user to check their email and provides a "Resend email" feature.
|
|
16
|
+
* Includes the same consistent layout with a hero image side-panel.
|
|
17
|
+
*
|
|
18
|
+
* @ai-rules
|
|
19
|
+
* 1. Data Source: It retrieves the email from the router's `location.state`.
|
|
20
|
+
* 2. Visual Feedback: Displays a temporary success message upon successful resale of the verification email.
|
|
21
|
+
* 3. Navigation: Includes a link to return to the `LoginPage`.
|
|
22
|
+
*/
|
|
23
|
+
export function VerifyEmailPage() {
|
|
24
|
+
const navigate = useNavigate();
|
|
25
|
+
const location = useLocation();
|
|
26
|
+
const { t } = useTranslation();
|
|
27
|
+
const email = location.state?.email || 'your@email.com';
|
|
28
|
+
const [isResending, setIsResending] = useState(false);
|
|
29
|
+
const [resendSuccess, setResendSuccess] = useState(false);
|
|
30
|
+
|
|
31
|
+
const handleResend = async () => {
|
|
32
|
+
setIsResending(true);
|
|
33
|
+
setResendSuccess(false);
|
|
34
|
+
|
|
35
|
+
// Simulate email resending
|
|
36
|
+
await new Promise(resolve => setTimeout(resolve, 1500));
|
|
37
|
+
|
|
38
|
+
setIsResending(false);
|
|
39
|
+
setResendSuccess(true);
|
|
40
|
+
|
|
41
|
+
// Remove success message after 3 seconds
|
|
42
|
+
setTimeout(() => setResendSuccess(false), 3000);
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const handleSocialLogin = (_provider: string) => {
|
|
46
|
+
// Wire your SSO/social provider integration here
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
return (
|
|
50
|
+
<div className="h-screen w-full flex overflow-y-auto">
|
|
51
|
+
{/* Left side - Full background image */}
|
|
52
|
+
<div className="hidden lg:flex lg:flex-1 relative overflow-hidden">
|
|
53
|
+
{/* Background image filling all space */}
|
|
54
|
+
<ImageWithFallback
|
|
55
|
+
src="https://images.unsplash.com/photo-1563986768609-322da13575f3?w=1200&h=800&fit=crop&auto=format"
|
|
56
|
+
alt={t('verifyEmail.heroImageAlt')}
|
|
57
|
+
className="absolute inset-0 w-full h-full object-cover"
|
|
58
|
+
/>
|
|
59
|
+
|
|
60
|
+
{/* Gradient overlay */}
|
|
61
|
+
<div className="absolute inset-0 bg-[image:var(--gradient-diagonal)] opacity-80" />
|
|
62
|
+
</div>
|
|
63
|
+
|
|
64
|
+
{/* Right side - Content */}
|
|
65
|
+
<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">
|
|
66
|
+
{/* Language selector in the top right corner */}
|
|
67
|
+
<div className="absolute top-4 right-4 z-20">
|
|
68
|
+
<LanguageSelector variant="minimal" showIcon={false} />
|
|
69
|
+
</div>
|
|
70
|
+
|
|
71
|
+
{/* Mobile background gradient */}
|
|
72
|
+
<div className="absolute inset-0 lg:hidden bg-[image:var(--gradient-diagonal)] opacity-10 dark:opacity-5" />
|
|
73
|
+
|
|
74
|
+
<div className="w-full max-w-sm space-y-6 relative z-10">
|
|
75
|
+
{/* Form header */}
|
|
76
|
+
<div className="text-center">
|
|
77
|
+
<div className="flex items-center justify-center mb-4">
|
|
78
|
+
<XerticaLogo
|
|
79
|
+
className="h-12 w-auto text-primary dark:text-foreground"
|
|
80
|
+
variant="theme"
|
|
81
|
+
/>
|
|
82
|
+
</div>
|
|
83
|
+
|
|
84
|
+
{/* Email icon */}
|
|
85
|
+
<div className="flex items-center justify-center mb-4">
|
|
86
|
+
<div className="p-4 bg-primary/10 rounded-[var(--radius)]">
|
|
87
|
+
<Mail className="w-12 h-12 text-primary" />
|
|
88
|
+
</div>
|
|
89
|
+
</div>
|
|
90
|
+
|
|
91
|
+
<h2 className="text-sm text-muted-foreground">{t('verifyEmail.heading')}</h2>
|
|
92
|
+
<p className="mt-2 text-muted-foreground">{t('verifyEmail.instructionsSent')}</p>
|
|
93
|
+
<p className="mt-1 text-primary">{email}</p>
|
|
94
|
+
</div>
|
|
95
|
+
|
|
96
|
+
{/* Instructions */}
|
|
97
|
+
<div className="bg-accent rounded-[var(--radius)] p-4 space-y-3">
|
|
98
|
+
<p className="text-muted-foreground">{t('verifyEmail.instructions')}</p>
|
|
99
|
+
<div className="flex items-start gap-2 text-muted-foreground">
|
|
100
|
+
<CheckCircle2 className="w-4 h-4 mt-0.5 flex-shrink-0 text-[var(--chart-2)]" />
|
|
101
|
+
<span className="text-sm">{t('verifyEmail.checkSpam')}</span>
|
|
102
|
+
</div>
|
|
103
|
+
</div>
|
|
104
|
+
|
|
105
|
+
{/* Success message on resend */}
|
|
106
|
+
{resendSuccess && (
|
|
107
|
+
<div className="bg-[var(--chart-2)]/10 border border-[var(--chart-2)]/20 rounded-[var(--radius)] p-3 flex items-center gap-2">
|
|
108
|
+
<CheckCircle2 className="w-5 h-5 text-[var(--chart-2)] flex-shrink-0" />
|
|
109
|
+
<span className="text-sm text-[var(--chart-2)]">
|
|
110
|
+
{t('verifyEmail.resentSuccess')}
|
|
111
|
+
</span>
|
|
112
|
+
</div>
|
|
113
|
+
)}
|
|
114
|
+
|
|
115
|
+
{/* Action buttons */}
|
|
116
|
+
<div className="space-y-3">
|
|
117
|
+
<p className="text-center text-muted-foreground">{t('verifyEmail.notReceived')}</p>
|
|
118
|
+
<Button
|
|
119
|
+
variant="outline"
|
|
120
|
+
className="w-full"
|
|
121
|
+
onClick={handleResend}
|
|
122
|
+
disabled={isResending}
|
|
123
|
+
>
|
|
124
|
+
{isResending ? t('verifyEmail.resending') : t('verifyEmail.resend')}
|
|
125
|
+
</Button>
|
|
126
|
+
|
|
127
|
+
<Button
|
|
128
|
+
type="button"
|
|
129
|
+
onClick={() => navigate('/login')}
|
|
130
|
+
variant="outline"
|
|
131
|
+
className="w-full text-muted-foreground hover:text-foreground"
|
|
132
|
+
>
|
|
133
|
+
<ArrowLeft className="w-4 h-4 mr-2" />
|
|
134
|
+
{t('verifyEmail.backToLogin')}
|
|
135
|
+
</Button>
|
|
136
|
+
</div>
|
|
137
|
+
|
|
138
|
+
{/* Divider */}
|
|
139
|
+
<div className="relative">
|
|
140
|
+
<div className="absolute inset-0 flex items-center">
|
|
141
|
+
<div className="w-full border-t border-border"></div>
|
|
142
|
+
</div>
|
|
143
|
+
<div className="relative flex justify-center text-sm">
|
|
144
|
+
<span className="bg-muted px-2 text-muted-foreground">
|
|
145
|
+
{t('login.orContinueWith')}
|
|
146
|
+
</span>
|
|
147
|
+
</div>
|
|
148
|
+
</div>
|
|
149
|
+
|
|
150
|
+
{/* Social/SSO login options */}
|
|
151
|
+
<div className="space-y-3">
|
|
152
|
+
{/* Google */}
|
|
153
|
+
<Button
|
|
154
|
+
type="button"
|
|
155
|
+
variant="outline"
|
|
156
|
+
className="w-full justify-center"
|
|
157
|
+
onClick={() => handleSocialLogin('Google')}
|
|
158
|
+
>
|
|
159
|
+
<svg className="w-5 h-5 mr-2" viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg">
|
|
160
|
+
<path
|
|
161
|
+
fill="#EA4335"
|
|
162
|
+
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"
|
|
163
|
+
></path>
|
|
164
|
+
<path
|
|
165
|
+
fill="#4285F4"
|
|
166
|
+
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"
|
|
167
|
+
></path>
|
|
168
|
+
<path
|
|
169
|
+
fill="#FBBC05"
|
|
170
|
+
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"
|
|
171
|
+
></path>
|
|
172
|
+
<path
|
|
173
|
+
fill="#34A853"
|
|
174
|
+
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"
|
|
175
|
+
></path>
|
|
176
|
+
<path fill="none" d="M0 0h48v48H0z"></path>
|
|
177
|
+
</svg>
|
|
178
|
+
<span>{t('login.signInWithGoogle')}</span>
|
|
179
|
+
</Button>
|
|
180
|
+
|
|
181
|
+
{/* MT Login */}
|
|
182
|
+
<Button
|
|
183
|
+
type="button"
|
|
184
|
+
variant="outline"
|
|
185
|
+
className="w-full justify-center"
|
|
186
|
+
onClick={() => handleSocialLogin('MT Login')}
|
|
187
|
+
>
|
|
188
|
+
<Lock className="w-5 h-5 mr-2 text-[var(--chart-4)]" />
|
|
189
|
+
<span>{t('login.signInWithMTLogin')}</span>
|
|
190
|
+
</Button>
|
|
191
|
+
|
|
192
|
+
{/* gov.br */}
|
|
193
|
+
<Button
|
|
194
|
+
type="button"
|
|
195
|
+
variant="outline"
|
|
196
|
+
className="w-full justify-center font-normal"
|
|
197
|
+
onClick={() => handleSocialLogin('gov.br')}
|
|
198
|
+
>
|
|
199
|
+
<span>{t('login.signInWithGovBr')}</span>
|
|
200
|
+
</Button>
|
|
201
|
+
</div>
|
|
202
|
+
</div>
|
|
203
|
+
</div>
|
|
204
|
+
</div>
|
|
205
|
+
);
|
|
206
|
+
}
|
|
@@ -1,55 +1,55 @@
|
|
|
1
|
-
import { Meta, Title, Subtitle } from '@storybook/addon-docs/blocks';
|
|
2
|
-
|
|
3
|
-
<Meta title="Pages/VerifyEmailPage" />
|
|
4
|
-
|
|
5
|
-
<Title>VerifyEmailPage</Title>
|
|
6
|
-
<Subtitle>Full-page confirmation screen for email verification with a resend action.</Subtitle>
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## Overview
|
|
11
|
-
|
|
12
|
-
`VerifyEmailPage` is shown after a user submits their email on `ForgotPasswordPage`. It reads the email address from `location.state?.email` (passed via React Router navigation state) and displays it in the confirmation message.
|
|
13
|
-
|
|
14
|
-
The page includes a "Resend email" button that shows a 3-second success feedback before resetting.
|
|
15
|
-
|
|
16
|
-
This component requires React Router v6+.
|
|
17
|
-
|
|
18
|
-
```tsx
|
|
19
|
-
import { VerifyEmailPage } from 'xertica-ui';
|
|
20
|
-
|
|
21
|
-
// In your router config:
|
|
22
|
-
{ path: '/verify-email', element: <VerifyEmailPage /> }
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
---
|
|
26
|
-
|
|
27
|
-
## Navigation Flow
|
|
28
|
-
|
|
29
|
-
```
|
|
30
|
-
/forgot-password ──▶ /verify-email (state: { email: string })
|
|
31
|
-
│
|
|
32
|
-
[resend button] (no navigation — UI feedback only)
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
---
|
|
36
|
-
|
|
37
|
-
## Reading Location State
|
|
38
|
-
|
|
39
|
-
The page automatically reads `location.state?.email` from React Router. If no email is present (e.g., the user navigates directly to `/verify-email`), the email display gracefully omits the address.
|
|
40
|
-
|
|
41
|
-
---
|
|
42
|
-
|
|
43
|
-
## Props
|
|
44
|
-
|
|
45
|
-
This component accepts no props — it is a self-contained page.
|
|
46
|
-
|
|
47
|
-
---
|
|
48
|
-
|
|
49
|
-
## AI Best Practices
|
|
50
|
-
|
|
51
|
-
> [!IMPORTANT]
|
|
52
|
-
> - **Router requirement** — Must be inside a React Router `<BrowserRouter>`. `useLocation` is used to read navigation state.
|
|
53
|
-
> - **State dependency** — Navigate to this page using `navigate('/verify-email', { state: { email } })` or the email display will be blank.
|
|
54
|
-
> - **Resend logic** — The resend button currently provides visual-only feedback. Wire your actual resend API call by forking the component or wrapping it with a custom route element.
|
|
55
|
-
> - **Expiry handling** — Add a link back to `/forgot-password` for cases where the verification link expires, so users can restart the flow.
|
|
1
|
+
import { Meta, Title, Subtitle } from '@storybook/addon-docs/blocks';
|
|
2
|
+
|
|
3
|
+
<Meta title="Pages/VerifyEmailPage" />
|
|
4
|
+
|
|
5
|
+
<Title>VerifyEmailPage</Title>
|
|
6
|
+
<Subtitle>Full-page confirmation screen for email verification with a resend action.</Subtitle>
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Overview
|
|
11
|
+
|
|
12
|
+
`VerifyEmailPage` is shown after a user submits their email on `ForgotPasswordPage`. It reads the email address from `location.state?.email` (passed via React Router navigation state) and displays it in the confirmation message.
|
|
13
|
+
|
|
14
|
+
The page includes a "Resend email" button that shows a 3-second success feedback before resetting.
|
|
15
|
+
|
|
16
|
+
This component requires React Router v6+.
|
|
17
|
+
|
|
18
|
+
```tsx
|
|
19
|
+
import { VerifyEmailPage } from 'xertica-ui';
|
|
20
|
+
|
|
21
|
+
// In your router config:
|
|
22
|
+
{ path: '/verify-email', element: <VerifyEmailPage /> }
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Navigation Flow
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
/forgot-password ──▶ /verify-email (state: { email: string })
|
|
31
|
+
│
|
|
32
|
+
[resend button] (no navigation — UI feedback only)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Reading Location State
|
|
38
|
+
|
|
39
|
+
The page automatically reads `location.state?.email` from React Router. If no email is present (e.g., the user navigates directly to `/verify-email`), the email display gracefully omits the address.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Props
|
|
44
|
+
|
|
45
|
+
This component accepts no props — it is a self-contained page.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## AI Best Practices
|
|
50
|
+
|
|
51
|
+
> [!IMPORTANT]
|
|
52
|
+
> - **Router requirement** — Must be inside a React Router `<BrowserRouter>`. `useLocation` is used to read navigation state.
|
|
53
|
+
> - **State dependency** — Navigate to this page using `navigate('/verify-email', { state: { email } })` or the email display will be blank.
|
|
54
|
+
> - **Resend logic** — The resend button currently provides visual-only feedback. Wire your actual resend API call by forking the component or wrapping it with a custom route element.
|
|
55
|
+
> - **Expiry handling** — Add a link back to `/forgot-password` for cases where the verification link expires, so users can restart the flow.
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { render, screen } from '@testing-library/react';
|
|
3
3
|
import { renderHook } from '@testing-library/react';
|
|
4
|
+
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
|
|
4
5
|
import { describe, expect, it } from 'vitest';
|
|
5
6
|
import * as Root from './index';
|
|
6
7
|
import * as Assistant from './assistant';
|
|
@@ -29,13 +30,16 @@ describe('public API smoke tests', () => {
|
|
|
29
30
|
});
|
|
30
31
|
|
|
31
32
|
it('renders representative components from the public subpaths', () => {
|
|
33
|
+
const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } } });
|
|
32
34
|
render(
|
|
33
|
-
<
|
|
34
|
-
<
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
<QueryClientProvider client={queryClient}>
|
|
36
|
+
<Brand.XerticaProvider>
|
|
37
|
+
<UI.Button>Action</UI.Button>
|
|
38
|
+
<Layout.Header title="Header smoke" />
|
|
39
|
+
<Assistant.MarkdownMessage content="**Assistant** smoke" />
|
|
40
|
+
<Media.AudioPlayer title="Audio smoke" enableAutoFloat={false} />
|
|
41
|
+
</Brand.XerticaProvider>
|
|
42
|
+
</QueryClientProvider>
|
|
39
43
|
);
|
|
40
44
|
|
|
41
45
|
expect(screen.getByRole('button', { name: 'Action' })).toBeInTheDocument();
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { BarChart3, ImageIcon, Table as TableIcon, FileText } from 'lucide-react';
|
|
2
2
|
import React from 'react';
|
|
3
|
+
import type { ChartConfig, DashboardChartDatum } from '../ui/chart';
|
|
3
4
|
|
|
4
5
|
export interface AssistantSuggestion {
|
|
5
6
|
id: string;
|
|
@@ -13,8 +14,8 @@ export interface AssistantMessage {
|
|
|
13
14
|
content: string;
|
|
14
15
|
timestamp: Date;
|
|
15
16
|
isFavorite?: boolean;
|
|
16
|
-
chartData?:
|
|
17
|
-
chartConfig?:
|
|
17
|
+
chartData?: DashboardChartDatum[];
|
|
18
|
+
chartConfig?: ChartConfig;
|
|
18
19
|
attachmentType?: 'file' | 'audio' | 'image' | 'video' | 'document' | 'podcast' | 'search';
|
|
19
20
|
attachmentName?: string;
|
|
20
21
|
documentContent?: string;
|
|
@@ -11,9 +11,9 @@ export interface RouteConfig {
|
|
|
11
11
|
/** Display label (used in sidebar and breadcrumbs) */
|
|
12
12
|
label: string;
|
|
13
13
|
/** Leading icon component */
|
|
14
|
-
icon: React.ComponentType<
|
|
14
|
+
icon: React.ComponentType<{ className?: string }>;
|
|
15
15
|
/** Optional page component (not used by the sidebar directly) */
|
|
16
|
-
component?: React.ComponentType<
|
|
16
|
+
component?: React.ComponentType<{ className?: string }>;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
import { Meta, Title, Subtitle, Description, Primary, Controls, Stories, Canvas } from '@storybook/addon-docs/blocks';
|
|
2
|
-
import * as AccordionStories from './accordion.stories';
|
|
3
|
-
|
|
4
|
-
<Meta of={AccordionStories} />
|
|
5
|
-
|
|
6
|
-
<Title />
|
|
7
|
-
<Subtitle>A vertically stacked set of collapsible sections.</Subtitle>
|
|
8
|
-
|
|
9
|
-
<Description />
|
|
10
|
-
|
|
11
|
-
<Primary />
|
|
12
|
-
|
|
13
|
-
## Controls
|
|
14
|
-
<Controls />
|
|
15
|
-
|
|
16
|
-
---
|
|
17
|
-
|
|
18
|
-
## Variations
|
|
19
|
-
|
|
20
|
-
<Stories />
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## AI Best Practices
|
|
25
|
-
|
|
26
|
-
> [!IMPORTANT]
|
|
27
|
-
> - **Anatomy** — `AccordionItem` requires a unique `value`.
|
|
28
|
-
> - **Icons** — The chevron icon is built-in; do not add your own.
|
|
29
|
-
> - **Context** — Use `type="single" collapsible` for FAQs. Use `type="multiple"` for settings panels.
|
|
1
|
+
import { Meta, Title, Subtitle, Description, Primary, Controls, Stories, Canvas } from '@storybook/addon-docs/blocks';
|
|
2
|
+
import * as AccordionStories from './accordion.stories';
|
|
3
|
+
|
|
4
|
+
<Meta of={AccordionStories} />
|
|
5
|
+
|
|
6
|
+
<Title />
|
|
7
|
+
<Subtitle>A vertically stacked set of collapsible sections.</Subtitle>
|
|
8
|
+
|
|
9
|
+
<Description />
|
|
10
|
+
|
|
11
|
+
<Primary />
|
|
12
|
+
|
|
13
|
+
## Controls
|
|
14
|
+
<Controls />
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Variations
|
|
19
|
+
|
|
20
|
+
<Stories />
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## AI Best Practices
|
|
25
|
+
|
|
26
|
+
> [!IMPORTANT]
|
|
27
|
+
> - **Anatomy** — `AccordionItem` requires a unique `value`.
|
|
28
|
+
> - **Icons** — The chevron icon is built-in; do not add your own.
|
|
29
|
+
> - **Context** — Use `type="single" collapsible` for FAQs. Use `type="multiple"` for settings panels.
|