xertica-ui 2.3.0 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +564 -552
- package/README.md +417 -406
- package/assets/xertica-logo.svg +37 -37
- package/assets/xertica-x-logo.svg +20 -20
- package/bin/cli.ts +1244 -1155
- package/bin/language-config.ts +358 -361
- package/components/assistant/code-block/CodeBlock.tsx +268 -268
- package/components/assistant/formatted-document/FormattedDocument.tsx +147 -147
- package/components/assistant/modern-chat-input/ModernChatInput.tsx +564 -554
- package/components/assistant/xertica-assistant/parts/AssistantCollapsedView.tsx +99 -99
- package/components/assistant/xertica-assistant/parts/AssistantConversationList.tsx +104 -106
- package/components/assistant/xertica-assistant/parts/AssistantDocumentEditor.tsx +81 -81
- package/components/assistant/xertica-assistant/parts/AssistantFeedbackDialog.tsx +88 -78
- package/components/assistant/xertica-assistant/parts/AssistantHeader.tsx +75 -75
- package/components/assistant/xertica-assistant/parts/AssistantMessageBubble.tsx +564 -560
- package/components/assistant/xertica-assistant/parts/AssistantTabBar.tsx +67 -67
- package/components/assistant/xertica-assistant/parts/AssistantWelcomeScreen.tsx +103 -103
- package/components/assistant/xertica-assistant/use-assistant.ts +615 -615
- package/components/assistant/xertica-assistant/xertica-assistant.tsx +611 -613
- package/components/blocks/card-patterns/ActivityCard.tsx +100 -100
- package/components/blocks/card-patterns/ActivityCardSkeleton.tsx +56 -56
- package/components/blocks/card-patterns/FeatureCardSkeleton.tsx +58 -63
- package/components/blocks/card-patterns/NotificationCard.tsx +140 -140
- package/components/blocks/card-patterns/NotificationCardSkeleton.tsx +81 -81
- package/components/blocks/card-patterns/ProfileCard.tsx +112 -114
- package/components/blocks/card-patterns/ProfileCardSkeleton.tsx +69 -69
- package/components/blocks/card-patterns/ProjectCard.tsx +123 -123
- package/components/blocks/card-patterns/ProjectCardSkeleton.tsx +67 -72
- package/components/blocks/card-patterns/QuickActionCardSkeleton.tsx +44 -44
- package/components/blocks/card-patterns/card-patterns.stories.tsx +594 -594
- package/components/blocks/card-patterns/index.ts +29 -29
- package/components/brand/language-selector/LanguageSelector.tsx +102 -102
- package/components/brand/language-selector/language-selector.stories.tsx +111 -114
- package/components/brand/language-selector/language-selector.test.tsx +101 -101
- package/components/brand/theme-toggle/ThemeToggle.tsx +74 -70
- package/components/brand/xertica-provider/XerticaProvider.tsx +109 -112
- package/components/brand/xertica-provider/xertica-provider.mdx +61 -61
- package/components/index.ts +86 -90
- package/components/layout/sidebar/sidebar.mdx +1 -1
- package/components/layout/sidebar/sidebar.tsx +1079 -1073
- package/components/media/FloatingMediaWrapper.tsx +371 -371
- package/components/media/audio-player/AudioPlayer.tsx +768 -766
- package/components/media/video-player/VideoPlayer.tsx +310 -310
- package/components/pages/forgot-password-page/ForgotPasswordPage.tsx +1 -1
- package/components/pages/home-content/HomeContent.tsx +120 -120
- package/components/pages/home-content/home-content.mdx +62 -62
- package/components/pages/home-page/HomePage.tsx +78 -74
- package/components/pages/home-page/home-page.mdx +53 -53
- package/components/pages/login-page/LoginPage.tsx +218 -216
- package/components/pages/reset-password-page/ResetPasswordPage.tsx +243 -239
- package/components/pages/template-content/TemplateContent.tsx +1354 -1235
- package/components/pages/template-content/template-content.mdx +61 -61
- package/components/pages/template-page/template-page.mdx +53 -53
- package/components/pages/verify-email-page/VerifyEmailPage.tsx +206 -206
- package/components/shared/error-boundary.stories.tsx +4 -22
- package/components/shared/error-boundary.tsx +1 -5
- package/components/shared/error-fallbacks.tsx +4 -8
- package/components/ui/accordion/accordion.mdx +8 -8
- package/components/ui/alert/alert.mdx +8 -8
- package/components/ui/alert-dialog/alert-dialog.mdx +8 -8
- package/components/ui/aspect-ratio/aspect-ratio.mdx +8 -8
- package/components/ui/assistant-chart/assistant-chart.mdx +8 -8
- package/components/ui/avatar/avatar.mdx +8 -8
- package/components/ui/badge/badge.mdx +8 -8
- package/components/ui/breadcrumb/breadcrumb.mdx +8 -8
- package/components/ui/button/button.mdx +8 -8
- package/components/ui/calendar/calendar.mdx +8 -8
- package/components/ui/card/card.mdx +8 -8
- package/components/ui/carousel/carousel.mdx +8 -8
- package/components/ui/chart/chart.mdx +8 -8
- package/components/ui/checkbox/checkbox.mdx +8 -8
- package/components/ui/collapsible/collapsible.mdx +8 -8
- package/components/ui/command/command.mdx +8 -8
- package/components/ui/context-menu/context-menu.mdx +8 -8
- package/components/ui/dialog/dialog.mdx +8 -8
- package/components/ui/drawer/drawer.mdx +8 -8
- package/components/ui/dropdown-menu/dropdown-menu.mdx +8 -8
- package/components/ui/empty/empty.mdx +8 -8
- package/components/ui/file-upload/file-upload.mdx +8 -8
- package/components/ui/hover-card/hover-card.mdx +8 -8
- package/components/ui/input/input.mdx +8 -8
- package/components/ui/input-otp/input-otp.mdx +8 -8
- package/components/ui/label/label.mdx +8 -8
- package/components/ui/map/map.mdx +8 -8
- package/components/ui/menubar/menubar.mdx +8 -8
- package/components/ui/navigation-menu/navigation-menu.mdx +8 -8
- package/components/ui/notification-badge/notification-badge.mdx +8 -8
- package/components/ui/pagination/pagination.mdx +8 -8
- package/components/ui/popover/popover.mdx +8 -8
- package/components/ui/progress/progress.mdx +8 -8
- package/components/ui/radio-group/radio-group.mdx +8 -8
- package/components/ui/rating/rating.mdx +8 -8
- package/components/ui/resizable/resizable.mdx +8 -8
- package/components/ui/route-map/route-map.mdx +8 -8
- package/components/ui/scroll-area/scroll-area.mdx +8 -8
- package/components/ui/search/search.mdx +8 -8
- package/components/ui/select/select.mdx +8 -8
- package/components/ui/separator/separator.mdx +8 -8
- package/components/ui/sheet/sheet.mdx +8 -8
- package/components/ui/simple-map/simple-map.mdx +8 -8
- package/components/ui/skeleton/skeleton.mdx +8 -8
- package/components/ui/slider/slider.mdx +8 -8
- package/components/ui/sonner/sonner.mdx +8 -8
- package/components/ui/stats-card/index.ts +2 -2
- package/components/ui/stats-card/stats-card-skeleton.tsx +60 -62
- package/components/ui/stats-card/stats-card.mdx +8 -8
- package/components/ui/stats-card/stats-card.stories.tsx +99 -99
- package/components/ui/stepper/stepper.mdx +8 -8
- package/components/ui/switch/switch.mdx +8 -8
- package/components/ui/table/table.mdx +8 -8
- package/components/ui/tabs/tabs.mdx +8 -8
- package/components/ui/textarea/textarea.mdx +8 -8
- package/components/ui/timeline/timeline.mdx +8 -8
- package/components/ui/toggle/toggle.mdx +8 -8
- package/components/ui/toggle-group/toggle-group.mdx +8 -8
- package/components/ui/tooltip/tooltip.mdx +8 -8
- package/components/ui/tree-view/tree-view.mdx +8 -8
- package/components.json +892 -892
- package/contexts/AuthContext.tsx +11 -8
- package/contexts/LanguageContext.test.tsx +121 -121
- package/contexts/LanguageContext.tsx +250 -251
- package/dist/{AssistantChart-DoZCyS5r.cjs → AssistantChart-9w31gdAb.cjs} +4 -4
- package/dist/{AssistantChart-CldVCVDe.cjs → AssistantChart-BAudAfne.cjs} +5 -5
- package/dist/{AssistantChart-Bdd44uBn.cjs → AssistantChart-BAx9VQvb.cjs} +127 -388
- package/dist/{AssistantChart-Cu3m7RBo.js → AssistantChart-BP8upjMk.js} +5 -5
- package/dist/{AssistantChart-CFhDdGyU.js → AssistantChart-CVko2A1W.js} +130 -391
- package/dist/{AssistantChart-C_hwFRRr.js → AssistantChart-CVzmmhx4.js} +4 -4
- package/dist/{AudioPlayer-IAU5q5T1.cjs → AudioPlayer-1ypwE2Wh.cjs} +1 -1
- package/dist/{AudioPlayer-CGRUtUdN.js → AudioPlayer-DuKXrCfy.js} +1 -1
- package/dist/{LanguageContext-CS14yCpi.js → LanguageContext-BwhwC3G2.js} +2 -2
- package/dist/{LanguageContext-B_KFTCzT.cjs → LanguageContext-DvUt5jBg.cjs} +2 -2
- package/dist/{ThemeContext-C2EwAPDt.js → ThemeContext-BbBNoFTG.js} +2 -2
- package/dist/{ThemeContext-Bmod0Cg2.cjs → ThemeContext-BblcjQup.cjs} +13 -8
- package/dist/{ThemeContext-BWq9ACPo.js → ThemeContext-Bo-W2WZH.js} +13 -8
- package/dist/{ThemeContext-j5aGtPky.cjs → ThemeContext-CP3a0jxy.cjs} +193 -262
- package/dist/{ThemeContext-vTjumZeM.cjs → ThemeContext-Cmr8Ex8H.cjs} +2 -2
- package/dist/ThemeContext-CpqYShLq.cjs +324 -0
- package/dist/{ThemeContext-CQSo4Iwc.js → ThemeContext-D3LzacmG.js} +8 -1
- package/dist/ThemeContext-Du2nE1PL.js +325 -0
- package/dist/ThemeContext-GeEBTJ3q.cjs +1621 -0
- package/dist/ThemeContext-JyLK9B1o.js +1622 -0
- package/dist/{ThemeContext-CGk3KK0k.cjs → ThemeContext-U4dEYc6C.cjs} +8 -1
- package/dist/{ThemeContext-BXjrgUjW.js → ThemeContext-ept8jhXI.js} +200 -261
- package/dist/{VerifyEmailPage-C0c2e5n0.js → VerifyEmailPage-BE-L9mB7.js} +7 -7
- package/dist/{VerifyEmailPage-DSBMRHtl.js → VerifyEmailPage-BIBOKV7Z.js} +41 -36
- package/dist/{VerifyEmailPage-DgIid028.js → VerifyEmailPage-BJjAMUTW.js} +4 -4
- package/dist/{VerifyEmailPage--1Vurewl.cjs → VerifyEmailPage-BRSP-Pwt.cjs} +3 -3
- package/dist/{VerifyEmailPage-Cwi3kbol.cjs → VerifyEmailPage-Bae2cBXT.cjs} +7 -7
- package/dist/{VerifyEmailPage-De6bQjrz.cjs → VerifyEmailPage-BiRm7Nh4.cjs} +41 -36
- package/dist/{VerifyEmailPage-ByerOcm4.cjs → VerifyEmailPage-Bv8Ah_TK.cjs} +23 -20
- package/dist/VerifyEmailPage-Bvfv8HVQ.js +3214 -0
- package/dist/{VerifyEmailPage-BComraR7.cjs → VerifyEmailPage-CR7kb5df.cjs} +22 -12
- package/dist/{VerifyEmailPage-MTD7AG1Z.js → VerifyEmailPage-C_ihbcth.js} +4 -4
- package/dist/{VerifyEmailPage-1WwWczAn.js → VerifyEmailPage-CbgjOF0v.js} +22 -12
- package/dist/{VerifyEmailPage-DvMLZgFt.js → VerifyEmailPage-CdYPSJoO.js} +1 -1
- package/dist/{VerifyEmailPage-By3Jf__L.cjs → VerifyEmailPage-CkBYfsNy.cjs} +4 -4
- package/dist/{VerifyEmailPage-CJLz3jrn.js → VerifyEmailPage-Cyl55sJb.js} +23 -20
- package/dist/VerifyEmailPage-D-FRj5TU.cjs +3213 -0
- package/dist/VerifyEmailPage-DF2ilhum.cjs +3210 -0
- package/dist/{VerifyEmailPage-CYXtbKi3.cjs → VerifyEmailPage-DMBh4NM9.cjs} +1 -1
- package/dist/{VerifyEmailPage-CgMxRb4z.js → VerifyEmailPage-DTtFfC-J.js} +3 -3
- package/dist/{VerifyEmailPage-CFLMls1p.cjs → VerifyEmailPage-Dt7zgA4w.cjs} +4 -4
- package/dist/VerifyEmailPage-EhudUdqF.js +3211 -0
- package/dist/{VerifyEmailPage-C5TNQTBa.js → VerifyEmailPage-X14vhdyl.js} +148 -75
- package/dist/VerifyEmailPage-hdB8JQGv.cjs +3213 -0
- package/dist/{VerifyEmailPage-B4peJjAT.cjs → VerifyEmailPage-u_Dn7t1U.cjs} +148 -75
- package/dist/VerifyEmailPage-vYHbYK3q.js +3214 -0
- package/dist/{XerticaProvider-CBGc4EMA.cjs → XerticaProvider-AChwphCO.cjs} +4 -4
- package/dist/{XerticaProvider-BIrqfZ-i.cjs → XerticaProvider-AbWlr7Af.cjs} +8 -11
- package/dist/{XerticaProvider-D-yNhF94.cjs → XerticaProvider-B8CaV7xu.cjs} +1 -1
- package/dist/{XerticaProvider-DDuiIcKo.js → XerticaProvider-BErr83Bg.js} +14 -11
- package/dist/{XerticaProvider-CEoWMTxu.js → XerticaProvider-BITjgC5p.js} +2 -2
- package/dist/{XerticaProvider-CllrbMEJ.cjs → XerticaProvider-By8q3Roe.cjs} +2 -2
- package/dist/{XerticaProvider-C1DKnvLh.js → XerticaProvider-CUYJZc32.js} +4 -4
- package/dist/{XerticaProvider-ET0ihewn.cjs → XerticaProvider-CW9hpCdF.cjs} +2 -2
- package/dist/{XerticaProvider-Dt5HEzbQ.js → XerticaProvider-CWgby5mY.js} +10 -10
- package/dist/XerticaProvider-CWs6EwNa.js +49 -0
- package/dist/XerticaProvider-CjQAQPcn.cjs +48 -0
- package/dist/XerticaProvider-CwOkHxiT.cjs +44 -0
- package/dist/XerticaProvider-D5lLumH-.js +49 -0
- package/dist/{XerticaProvider-DYq4JWtg.js → XerticaProvider-DQtvJU7m.js} +1 -1
- package/dist/XerticaProvider-qQUDop71.cjs +48 -0
- package/dist/{XerticaProvider-B7EVH-NF.js → XerticaProvider-siSt9uG2.js} +2 -2
- package/dist/{XerticaXLogo-Zw2B276b.cjs → XerticaXLogo-8TTzBjHw.cjs} +1 -1
- package/dist/{XerticaXLogo-B7xQ5dhi.js → XerticaXLogo-BWaag64t.js} +1 -1
- package/dist/{XerticaXLogo-DZbo4vOE.js → XerticaXLogo-BX3ueACh.js} +5 -2
- package/dist/XerticaXLogo-CFuIlYFH.js +252 -0
- package/dist/XerticaXLogo-CU-U-GP4.cjs +251 -0
- package/dist/XerticaXLogo-ChryA6xj.js +252 -0
- package/dist/{XerticaXLogo-CQUUjXoH.cjs → XerticaXLogo-CziKMQil.cjs} +8 -8
- package/dist/XerticaXLogo-DHz5SugF.js +252 -0
- package/dist/XerticaXLogo-DTee_y8X.cjs +251 -0
- package/dist/{XerticaXLogo-Cmsp-Eey.js → XerticaXLogo-DfUvz-lD.js} +9 -9
- package/dist/XerticaXLogo-kslQ8Tk_.cjs +251 -0
- package/dist/{XerticaXLogo-bvZSgwGF.cjs → XerticaXLogo-qBPhwK3g.cjs} +5 -2
- package/dist/{alert-dialog-s-vmNkJ_.js → alert-dialog-iDe5VE5o.js} +3 -3
- package/dist/{alert-dialog-DSKByiKZ.cjs → alert-dialog-yckpaOpy.cjs} +3 -3
- package/dist/assistant.cjs.js +1 -1
- package/dist/assistant.es.js +1 -1
- package/dist/brand.cjs.js +2 -2
- package/dist/brand.es.js +2 -2
- package/dist/cli.js +90 -37
- package/dist/components/brand/theme-toggle/ThemeToggle.d.ts +1 -1
- package/dist/components/index.d.ts +1 -1
- package/dist/{google-maps-loader-Y-QkD-Li.cjs → google-maps-loader-BqsYL48U.cjs} +0 -5
- package/dist/{google-maps-loader-CTYySAun.js → google-maps-loader-t2IlYBzw.js} +0 -4
- package/dist/index-CkTUgOwX.js +8 -0
- package/dist/{index-COtD8bRW.cjs → index-D3RLKRAs.cjs} +1 -1
- package/dist/index.cjs.js +5 -5
- package/dist/index.es.js +5 -5
- package/dist/index.umd.js +454 -1027
- 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/{sidebar-DAaY8bRU.cjs → sidebar-B3EYhli0.cjs} +33 -24
- package/dist/{sidebar-B6SlKZYN.js → sidebar-B4ZWaMrE.js} +1 -1
- package/dist/{sidebar-DQj1z3jG.cjs → sidebar-B9NR0lCe.cjs} +269 -227
- package/dist/{sidebar-nzPoVHBQ.cjs → sidebar-BS1p2V7t.cjs} +1 -1
- package/dist/sidebar-BvF5I2Ue.cjs +800 -0
- package/dist/{sidebar-q7P2Godd.cjs → sidebar-C5B_LHek.cjs} +1 -1
- package/dist/{sidebar-CrQDDdcz.js → sidebar-CA6_ek3f.js} +33 -24
- package/dist/{sidebar-BxGXsDAd.cjs → sidebar-CVUGHOS_.cjs} +8 -16
- package/dist/{sidebar-BViy8Eeu.js → sidebar-CmvwjnVb.js} +9 -17
- package/dist/sidebar-CplprZpM.js +801 -0
- package/dist/{sidebar-BbVIQvlP.js → sidebar-Dz7bd3zP.js} +1 -1
- package/dist/sidebar-KIS0C2JH.js +801 -0
- package/dist/sidebar-OTO_up7Z.js +801 -0
- package/dist/sidebar-zowjejT2.cjs +800 -0
- package/dist/{use-audio-player-nv8ZSGa1.js → use-audio-player-Bkh23vQ3.js} +3 -7
- package/dist/{use-audio-player-NKsWyjWu.cjs → use-audio-player-Dn1NR9xN.cjs} +3 -7
- package/dist/{xertica-assistant-dyP7KHM5.cjs → xertica-assistant-B1IaHXnB.cjs} +388 -529
- package/dist/{xertica-assistant-DCsnQyi5.js → xertica-assistant-B1NaSFFj.js} +46 -29
- package/dist/{xertica-assistant-ciJaWqm1.js → xertica-assistant-BMqdyRVi.js} +10 -28
- package/dist/{xertica-assistant-V_IdW4WF.cjs → xertica-assistant-Bj3vBCq_.cjs} +9 -27
- package/dist/{xertica-assistant-CrgTb6Hs.cjs → xertica-assistant-CIaUlbIt.cjs} +47 -22
- package/dist/{xertica-assistant-yX1CFBBo.js → xertica-assistant-DPsESB6t.js} +390 -531
- package/dist/{CodeBlock-BgfYL_rD.cjs → xertica-assistant-Qp3ydksa.cjs} +51 -263
- package/dist/{CodeBlock-BeSt1h5P.js → xertica-assistant-gnCJdcZY.js} +7 -219
- package/dist/xertica-ui.css +2 -2
- package/docs/architecture-improvements.md +456 -456
- package/docs/architecture.md +312 -306
- package/docs/components/assistant.md +428 -428
- package/docs/components/branding.md +252 -252
- package/docs/components/card-patterns.md +447 -445
- package/docs/components/error-boundary.md +32 -22
- package/docs/components/hooks.md +432 -430
- package/docs/components/language-selector.md +176 -172
- package/docs/components/pages.md +20 -6
- package/docs/doc-audit.md +244 -243
- package/docs/getting-started.md +616 -603
- package/docs/guidelines.md +330 -328
- package/docs/i18n.md +480 -476
- package/docs/installation.md +7 -6
- package/docs/llms.md +295 -295
- package/docs/state-management.md +289 -289
- package/guidelines/Guidelines.md +409 -406
- package/llms-compact.txt +1 -1
- package/llms.txt +1 -1
- package/package.json +219 -219
- package/styles/xertica/base.css +6 -0
- package/templates/.prettierignore +4 -4
- package/templates/.prettierrc +10 -10
- package/templates/CLAUDE.md +180 -165
- package/templates/guidelines/Guidelines.md +577 -553
- package/templates/package.json +69 -69
- package/templates/src/app/App.tsx +46 -46
- package/templates/src/app/components/AuthGuard.tsx +57 -8
- package/templates/src/features/assistant/data/mock.ts +75 -75
- package/templates/src/features/assistant/hooks/useAssistantConfig.ts +20 -20
- package/templates/src/features/assistant/index.ts +5 -5
- package/templates/src/features/auth/ui/AuthPageShell.tsx +1 -1
- package/templates/src/features/auth/ui/ForgotPasswordContent.tsx +70 -72
- package/templates/src/features/auth/ui/LoginContent.tsx +92 -92
- package/templates/src/features/auth/ui/ResetPasswordContent.tsx +183 -179
- package/templates/src/features/auth/ui/SocialLoginButtons.tsx +78 -78
- package/templates/src/features/auth/ui/VerifyEmailContent.tsx +80 -84
- package/templates/src/features/home/data/mock.ts +6 -0
- package/templates/src/features/home/hooks/useFeatureCards.ts +20 -20
- package/templates/src/features/home/index.ts +11 -11
- package/templates/src/features/home/ui/HomeContent.tsx +117 -119
- package/templates/src/features/template/ui/CrudTemplate.tsx +112 -115
- package/templates/src/features/template/ui/DashboardTemplate.tsx +110 -110
- package/templates/src/features/template/ui/FormTemplate.tsx +117 -117
- package/templates/src/features/template/ui/LoginTemplate.tsx +59 -59
- package/templates/src/features/template/ui/TemplateContent.tsx +1322 -1314
- package/templates/src/i18n.ts +124 -124
- package/templates/src/locales/en/common.json +21 -21
- package/templates/src/locales/en/components/activityCard.json +10 -10
- package/templates/src/locales/en/components/assistant.json +119 -119
- package/templates/src/locales/en/components/media.json +29 -29
- package/templates/src/locales/en/components/notificationCard.json +5 -5
- package/templates/src/locales/en/components/profileCard.json +8 -8
- package/templates/src/locales/en/components/projectCard.json +10 -10
- package/templates/src/locales/en/components/sidebar.json +14 -14
- package/templates/src/locales/en/components/stats.json +8 -8
- package/templates/src/locales/en/components/team.json +14 -14
- package/templates/src/locales/en/errors.json +9 -9
- package/templates/src/locales/en/languageSelector.json +7 -7
- package/templates/src/locales/en/nav.json +6 -6
- package/templates/src/locales/en/pages/crudTemplate.json +25 -25
- package/templates/src/locales/en/pages/dashboardTemplate.json +20 -20
- package/templates/src/locales/en/pages/forgotPassword.json +10 -10
- package/templates/src/locales/en/pages/formTemplate.json +16 -16
- package/templates/src/locales/en/pages/home.json +7 -7
- package/templates/src/locales/en/pages/login.json +15 -15
- package/templates/src/locales/en/pages/loginTemplate.json +9 -9
- package/templates/src/locales/en/pages/resetPassword.json +18 -18
- package/templates/src/locales/en/pages/templates.json +317 -317
- package/templates/src/locales/en/pages/verifyEmail.json +12 -12
- package/templates/src/locales/en/themeToggle.json +6 -6
- package/templates/src/locales/es/common.json +21 -21
- package/templates/src/locales/es/components/activityCard.json +10 -10
- package/templates/src/locales/es/components/assistant.json +119 -119
- package/templates/src/locales/es/components/media.json +29 -29
- package/templates/src/locales/es/components/notificationCard.json +5 -5
- package/templates/src/locales/es/components/profileCard.json +8 -8
- package/templates/src/locales/es/components/projectCard.json +10 -10
- package/templates/src/locales/es/components/sidebar.json +14 -14
- package/templates/src/locales/es/components/stats.json +8 -8
- package/templates/src/locales/es/components/team.json +14 -14
- package/templates/src/locales/es/errors.json +9 -9
- package/templates/src/locales/es/languageSelector.json +7 -7
- package/templates/src/locales/es/nav.json +6 -6
- package/templates/src/locales/es/pages/crudTemplate.json +25 -25
- package/templates/src/locales/es/pages/dashboardTemplate.json +20 -20
- package/templates/src/locales/es/pages/forgotPassword.json +10 -10
- package/templates/src/locales/es/pages/formTemplate.json +16 -16
- package/templates/src/locales/es/pages/home.json +7 -7
- package/templates/src/locales/es/pages/login.json +15 -15
- package/templates/src/locales/es/pages/loginTemplate.json +9 -9
- package/templates/src/locales/es/pages/resetPassword.json +18 -18
- package/templates/src/locales/es/pages/templates.json +317 -317
- package/templates/src/locales/es/pages/verifyEmail.json +12 -12
- package/templates/src/locales/es/themeToggle.json +6 -6
- package/templates/src/locales/pt-BR/common.json +21 -21
- package/templates/src/locales/pt-BR/components/activityCard.json +10 -10
- package/templates/src/locales/pt-BR/components/assistant.json +119 -119
- package/templates/src/locales/pt-BR/components/media.json +29 -29
- package/templates/src/locales/pt-BR/components/notificationCard.json +5 -5
- package/templates/src/locales/pt-BR/components/profileCard.json +8 -8
- package/templates/src/locales/pt-BR/components/projectCard.json +10 -10
- package/templates/src/locales/pt-BR/components/sidebar.json +14 -14
- package/templates/src/locales/pt-BR/components/stats.json +8 -8
- package/templates/src/locales/pt-BR/components/team.json +14 -14
- package/templates/src/locales/pt-BR/errors.json +9 -9
- package/templates/src/locales/pt-BR/languageSelector.json +7 -7
- package/templates/src/locales/pt-BR/nav.json +6 -6
- package/templates/src/locales/pt-BR/pages/crudTemplate.json +25 -25
- package/templates/src/locales/pt-BR/pages/dashboardTemplate.json +20 -20
- package/templates/src/locales/pt-BR/pages/forgotPassword.json +10 -10
- package/templates/src/locales/pt-BR/pages/formTemplate.json +16 -16
- package/templates/src/locales/pt-BR/pages/home.json +7 -7
- package/templates/src/locales/pt-BR/pages/login.json +15 -15
- package/templates/src/locales/pt-BR/pages/loginTemplate.json +9 -9
- package/templates/src/locales/pt-BR/pages/resetPassword.json +18 -18
- package/templates/src/locales/pt-BR/pages/templates.json +317 -317
- package/templates/src/locales/pt-BR/pages/verifyEmail.json +12 -12
- package/templates/src/locales/pt-BR/themeToggle.json +6 -6
- package/templates/src/pages/AssistantPage.tsx +470 -464
- package/templates/src/pages/HomePage.tsx +53 -49
- package/templates/src/shared/error-boundary.tsx +1 -5
- package/templates/src/shared/error-fallbacks.tsx +4 -8
- package/templates/vite.config.js +20 -20
- package/templates/vite.config.ts +55 -52
- package/dist/AssistantChart-CxGjH7Qk.js +0 -3477
- package/dist/AssistantChart-DIpshm3i.js +0 -4784
- package/dist/AssistantChart-D_PTeu8P.cjs +0 -3503
- package/dist/AssistantChart-zjsy2GaZ.cjs +0 -4810
- package/dist/AudioPlayer-B1lt5cPl.cjs +0 -989
- package/dist/AudioPlayer-BZ7bibzU.cjs +0 -982
- package/dist/AudioPlayer-BpRPS4-1.cjs +0 -1277
- package/dist/AudioPlayer-C12BjQBV.cjs +0 -997
- package/dist/AudioPlayer-CFeV8t-5.cjs +0 -936
- package/dist/AudioPlayer-Coly3q5R.js +0 -1278
- package/dist/AudioPlayer-CySJIyvL.js +0 -937
- package/dist/AudioPlayer-DMcG_c7L.js +0 -990
- package/dist/AudioPlayer-DcFKRJE_.js +0 -998
- package/dist/AudioPlayer-e8LfNoqO.js +0 -983
- package/dist/BrandColorsContext-565dDHd5.js +0 -660
- package/dist/BrandColorsContext-BcJbtkqn.cjs +0 -659
- package/dist/CodeBlock-7TTgmdGG.cjs +0 -2094
- package/dist/CodeBlock-BlcqlA9M.cjs +0 -2094
- package/dist/CodeBlock-Bnmeu5ez.cjs +0 -2094
- package/dist/CodeBlock-BtfPlbAI.js +0 -2078
- package/dist/CodeBlock-CIySIuYr.js +0 -2078
- package/dist/CodeBlock-CuPtUM-7.cjs +0 -2094
- package/dist/CodeBlock-D6ffWXgc.js +0 -2078
- package/dist/CodeBlock-D8dcwbit.cjs +0 -2094
- package/dist/CodeBlock-DMZrFnlw.cjs +0 -2094
- package/dist/CodeBlock-DlBehYN8.js +0 -2078
- package/dist/CodeBlock-DnYNI8rQ.js +0 -2078
- package/dist/CodeBlock-DvKWbSnE.cjs +0 -2094
- package/dist/CodeBlock-DwMCfkFY.js +0 -2078
- package/dist/CodeBlock-Dy6CNYyj.js +0 -2078
- package/dist/CodeBlock-U1pPOQI7.cjs +0 -2094
- package/dist/CodeBlock-f_GpNhEB.js +0 -2078
- package/dist/CodeBlock-oB6u8nI1.js +0 -2078
- package/dist/CodeBlock-tZC31B73.cjs +0 -2094
- package/dist/FeatureCard-CxC-7C-C.cjs +0 -300
- package/dist/FeatureCard-DbHWCb4E.js +0 -301
- package/dist/ImageWithFallback-CGtidP6B.cjs +0 -4542
- package/dist/ImageWithFallback-lsg3pdFg.js +0 -4508
- package/dist/LanguageSelector-B5YfbHra.js +0 -231
- package/dist/LanguageSelector-D6uacAIM.cjs +0 -230
- package/dist/LayoutContext-B45-e9DI.cjs +0 -93
- package/dist/LayoutContext-BAql6ZRY.js +0 -97
- package/dist/LayoutContext-Bav3UMEA.js +0 -94
- package/dist/LayoutContext-BvK-ggDa.cjs +0 -96
- package/dist/ThemeContext-BoH4NLfN.js +0 -734
- package/dist/ThemeContext-r69W20Xg.cjs +0 -733
- package/dist/VerifyEmailPage-COiyNl1y.js +0 -2825
- package/dist/VerifyEmailPage-CqKsR2v8.js +0 -2827
- package/dist/VerifyEmailPage-DjQKRlUS.cjs +0 -2824
- package/dist/VerifyEmailPage-s-1X3LDJ.cjs +0 -2826
- package/dist/XerticaOrbe-KL1RBHzw.cjs +0 -1354
- package/dist/XerticaOrbe-zwS1p2a8.js +0 -1355
- package/dist/XerticaProvider-6btlAlzc.js +0 -17
- package/dist/XerticaProvider-BNoNOxQ5.cjs +0 -16
- package/dist/XerticaProvider-BlY2limY.cjs +0 -38
- package/dist/XerticaProvider-cI9hSs27.cjs +0 -38
- package/dist/XerticaProvider-hSwhNQex.js +0 -39
- package/dist/alert-dialog-BOje--vD.js +0 -847
- package/dist/alert-dialog-BtEuQqrg.cjs +0 -870
- package/dist/breadcrumb-CqJ7bHY5.js +0 -161
- package/dist/breadcrumb-m9Hb2_XN.cjs +0 -177
- package/dist/components/assistant/xertica-assistant/hooks/index.d.ts +0 -6
- package/dist/components/assistant/xertica-assistant/hooks/use-assistant-conversations.d.ts +0 -21
- package/dist/components/assistant/xertica-assistant/hooks/use-assistant-messages.d.ts +0 -49
- package/dist/components/assistant/xertica-assistant/hooks/use-assistant-suggestions.d.ts +0 -16
- package/dist/components/blocks/audio-player/AudioPlayer.d.ts +0 -35
- package/dist/components/blocks/audio-player/index.d.ts +0 -1
- package/dist/components/blocks/document-editor/DocumentEditor.d.ts +0 -26
- package/dist/components/blocks/document-editor/index.d.ts +0 -1
- package/dist/components/blocks/podcast-player/PodcastPlayer.d.ts +0 -41
- package/dist/components/blocks/podcast-player/index.d.ts +0 -1
- package/dist/components/ui/chart/parts/chart-dashboard.d.ts +0 -113
- package/dist/components/ui/chart/parts/chart-metric.d.ts +0 -118
- package/dist/components/ui/chart/parts/chart-primitives.d.ts +0 -101
- package/dist/components/ui/chart/parts/chart-shared.d.ts +0 -20
- package/dist/components/ui/chart/parts/chart-utils.d.ts +0 -12
- package/dist/components/ui/chart/parts/index.d.ts +0 -5
- package/dist/dropdown-menu-BDB5CmQs.cjs +0 -247
- package/dist/dropdown-menu-DQidbKBD.js +0 -231
- package/dist/google-maps-loader-BFWp6VPd.js +0 -287
- package/dist/google-maps-loader-BKcdgFbu.cjs +0 -312
- package/dist/google-maps-loader-CumCNXeG.js +0 -312
- package/dist/google-maps-loader-eS3uQ5TA.cjs +0 -287
- package/dist/header-Cgy6vYPk.cjs +0 -731
- package/dist/header-DRlT4jgI.js +0 -715
- package/dist/header-Dux00SI4.cjs +0 -731
- package/dist/header-EkGKXPsD.js +0 -715
- package/dist/header-WfEywpyc.cjs +0 -731
- package/dist/header-tifNQn2U.js +0 -715
- package/dist/index-BhapVLVj.js +0 -8
- package/dist/index-D6fxYEY8.cjs +0 -7
- package/dist/index-DAIp0_HK.js +0 -8
- package/dist/index-DW5tYe26.js +0 -8
- package/dist/index-GA__GvnG.cjs +0 -7
- package/dist/input-2R4loU86.js +0 -127
- package/dist/input-DWANSKGb.cjs +0 -145
- package/dist/progress-DPtzoVV8.js +0 -175
- package/dist/progress-EeaoqqUs.cjs +0 -191
- package/dist/rich-text-editor-0mraWT5y.cjs +0 -2376
- package/dist/rich-text-editor-B-IkcPD0.js +0 -2874
- package/dist/rich-text-editor-B6jMRLzk.cjs +0 -1939
- package/dist/rich-text-editor-B8_oYcIR.js +0 -1730
- package/dist/rich-text-editor-B9UbSXNb.js +0 -1203
- package/dist/rich-text-editor-BYuRBNBU.js +0 -2373
- package/dist/rich-text-editor-Bb9pySTs.cjs +0 -2374
- package/dist/rich-text-editor-BcL6L3cm.cjs +0 -2374
- package/dist/rich-text-editor-BoVZYtTs.cjs +0 -2391
- package/dist/rich-text-editor-Bp3zQqMC.js +0 -2954
- package/dist/rich-text-editor-CMgSN_w2.js +0 -1189
- package/dist/rich-text-editor-CPV1lEPH.cjs +0 -1748
- package/dist/rich-text-editor-CeucBdIv.cjs +0 -2971
- package/dist/rich-text-editor-CoKqbCtu.cjs +0 -1799
- package/dist/rich-text-editor-Cw56T_mB.js +0 -2356
- package/dist/rich-text-editor-Cyt8qs2b.js +0 -1921
- package/dist/rich-text-editor-D6H84OcX.cjs +0 -1220
- package/dist/rich-text-editor-D76gD-QI.js +0 -2328
- package/dist/rich-text-editor-DKkokOnA.js +0 -1781
- package/dist/rich-text-editor-DNsdpN64.cjs +0 -2359
- package/dist/rich-text-editor-DfG8bCyY.js +0 -2358
- package/dist/rich-text-editor-Dxjw31Z4.js +0 -2341
- package/dist/rich-text-editor-DzP0Epmb.js +0 -2356
- package/dist/rich-text-editor-bRkNoeZY.cjs +0 -2891
- package/dist/rich-text-editor-lyYE2ZG5.cjs +0 -1207
- package/dist/rich-text-editor-skplNlBM.cjs +0 -2345
- package/dist/select-Bkbr0f-Z.cjs +0 -162
- package/dist/select-CvIVdX2n.js +0 -145
- package/dist/sidebar-CK_0ZQHj.cjs +0 -803
- package/dist/sidebar-CUuOvYhK.js +0 -787
- package/dist/sidebar-Djn5syhi.cjs +0 -786
- package/dist/sidebar-LluMXfam.js +0 -759
- package/dist/sidebar-_rT7rBMk.js +0 -787
- package/dist/slider-Bc5Hd0y1.js +0 -56
- package/dist/slider-N7hFFj6X.cjs +0 -73
- package/dist/tooltip-Ded96neP.cjs +0 -137
- package/dist/tooltip-HDOoD2-0.js +0 -120
- package/dist/use-audio-player-B31J-aqh.cjs +0 -187
- package/dist/use-audio-player-BkmEmj8Q.js +0 -185
- package/dist/use-audio-player-CLFTWFW1.cjs +0 -184
- package/dist/use-audio-player-CLLn00I6.js +0 -188
- package/dist/use-file-upload-BcjEo2S5.js +0 -404
- package/dist/use-file-upload-CRJR68Tj.cjs +0 -403
- package/dist/use-mobile-B0hNy_Y6.cjs +0 -4303
- package/dist/use-mobile-BXuYROXM.js +0 -4202
- package/dist/use-mobile-Bbd51ASU.cjs +0 -4392
- package/dist/use-mobile-Bk6CX-TC.js +0 -4359
- package/dist/use-mobile-BvYdisLP.js +0 -4202
- package/dist/use-mobile-BzuxjzNX.cjs +0 -4392
- package/dist/use-mobile-CG2-SdXV.cjs +0 -4235
- package/dist/use-mobile-CKb5pqTs.js +0 -4269
- package/dist/use-mobile-CYuAuGDl.js +0 -4202
- package/dist/use-mobile-CaENcqm-.js +0 -4508
- package/dist/use-mobile-CbrYgJGJ.js +0 -4203
- package/dist/use-mobile-Cd4xPrKq.cjs +0 -46
- package/dist/use-mobile-DMOvImGQ.cjs +0 -4542
- package/dist/use-mobile-DRB3BQgD.cjs +0 -4235
- package/dist/use-mobile-DZvv7QMR.js +0 -4359
- package/dist/use-mobile-DdI_TXam.cjs +0 -4235
- package/dist/use-mobile-DlceKf8a.js +0 -4359
- package/dist/use-mobile-DsOnow1o.cjs +0 -4236
- package/dist/use-mobile-Kcj6jSnK.cjs +0 -4392
- package/dist/use-mobile-bnKcua_i.js +0 -4202
- package/dist/use-mobile-j4w2Jrf1.js +0 -30
- package/dist/use-mobile-ncXBeE2z.cjs +0 -4235
- package/dist/use-rich-text-editor-DjiddBGv.js +0 -282
- package/dist/use-rich-text-editor-lpeswbCs.cjs +0 -281
- package/dist/xertica-assistant-BdiZag0h.js +0 -2187
- package/dist/xertica-assistant-DUBpmEgo.cjs +0 -2186
- package/dist/{rich-text-editor-DgF8s7xW.js → rich-text-editor-BmsjY03B.js} +26 -26
- package/dist/{rich-text-editor-mWoaSCE4.cjs → rich-text-editor-GS2kpTAK.cjs} +26 -26
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
export { ActivityCard } from './ActivityCard';
|
|
2
|
-
export type { ActivityCardProps, ActivityItem } from './ActivityCard';
|
|
3
|
-
export { ActivityCardSkeleton } from './ActivityCardSkeleton';
|
|
4
|
-
export type { ActivityCardSkeletonProps } from './ActivityCardSkeleton';
|
|
5
|
-
|
|
6
|
-
export { ProfileCard } from './ProfileCard';
|
|
7
|
-
export type { ProfileCardProps } from './ProfileCard';
|
|
8
|
-
export { ProfileCardSkeleton } from './ProfileCardSkeleton';
|
|
9
|
-
export type { ProfileCardSkeletonProps } from './ProfileCardSkeleton';
|
|
10
|
-
|
|
11
|
-
export { ProjectCard } from './ProjectCard';
|
|
12
|
-
export type { ProjectCardProps, ProjectMember, ProjectStatus } from './ProjectCard';
|
|
13
|
-
export { ProjectCardSkeleton } from './ProjectCardSkeleton';
|
|
14
|
-
export type { ProjectCardSkeletonProps } from './ProjectCardSkeleton';
|
|
15
|
-
|
|
16
|
-
export { QuickActionCard } from './QuickActionCard';
|
|
17
|
-
export type { QuickActionCardProps } from './QuickActionCard';
|
|
18
|
-
export { QuickActionCardSkeleton } from './QuickActionCardSkeleton';
|
|
19
|
-
export type { QuickActionCardSkeletonProps } from './QuickActionCardSkeleton';
|
|
20
|
-
|
|
21
|
-
export { NotificationCard } from './NotificationCard';
|
|
22
|
-
export type { NotificationCardProps, NotificationItem, NotificationType } from './NotificationCard';
|
|
23
|
-
export { NotificationCardSkeleton } from './NotificationCardSkeleton';
|
|
24
|
-
export type { NotificationCardSkeletonProps } from './NotificationCardSkeleton';
|
|
25
|
-
|
|
26
|
-
export { FeatureCard } from './FeatureCard';
|
|
27
|
-
export type { FeatureCardProps, FeatureCardColor } from './FeatureCard';
|
|
28
|
-
export { FeatureCardSkeleton } from './FeatureCardSkeleton';
|
|
29
|
-
export type { FeatureCardSkeletonProps } from './FeatureCardSkeleton';
|
|
1
|
+
export { ActivityCard } from './ActivityCard';
|
|
2
|
+
export type { ActivityCardProps, ActivityItem } from './ActivityCard';
|
|
3
|
+
export { ActivityCardSkeleton } from './ActivityCardSkeleton';
|
|
4
|
+
export type { ActivityCardSkeletonProps } from './ActivityCardSkeleton';
|
|
5
|
+
|
|
6
|
+
export { ProfileCard } from './ProfileCard';
|
|
7
|
+
export type { ProfileCardProps } from './ProfileCard';
|
|
8
|
+
export { ProfileCardSkeleton } from './ProfileCardSkeleton';
|
|
9
|
+
export type { ProfileCardSkeletonProps } from './ProfileCardSkeleton';
|
|
10
|
+
|
|
11
|
+
export { ProjectCard } from './ProjectCard';
|
|
12
|
+
export type { ProjectCardProps, ProjectMember, ProjectStatus } from './ProjectCard';
|
|
13
|
+
export { ProjectCardSkeleton } from './ProjectCardSkeleton';
|
|
14
|
+
export type { ProjectCardSkeletonProps } from './ProjectCardSkeleton';
|
|
15
|
+
|
|
16
|
+
export { QuickActionCard } from './QuickActionCard';
|
|
17
|
+
export type { QuickActionCardProps } from './QuickActionCard';
|
|
18
|
+
export { QuickActionCardSkeleton } from './QuickActionCardSkeleton';
|
|
19
|
+
export type { QuickActionCardSkeletonProps } from './QuickActionCardSkeleton';
|
|
20
|
+
|
|
21
|
+
export { NotificationCard } from './NotificationCard';
|
|
22
|
+
export type { NotificationCardProps, NotificationItem, NotificationType } from './NotificationCard';
|
|
23
|
+
export { NotificationCardSkeleton } from './NotificationCardSkeleton';
|
|
24
|
+
export type { NotificationCardSkeletonProps } from './NotificationCardSkeleton';
|
|
25
|
+
|
|
26
|
+
export { FeatureCard } from './FeatureCard';
|
|
27
|
+
export type { FeatureCardProps, FeatureCardColor } from './FeatureCard';
|
|
28
|
+
export { FeatureCardSkeleton } from './FeatureCardSkeleton';
|
|
29
|
+
export type { FeatureCardSkeletonProps } from './FeatureCardSkeleton';
|
|
@@ -1,102 +1,102 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../ui/select';
|
|
3
|
-
import { Globe } from 'lucide-react';
|
|
4
|
-
import { useTranslation } from 'react-i18next';
|
|
5
|
-
import { type Language, useLanguage } from '../../../contexts/LanguageContext';
|
|
6
|
-
|
|
7
|
-
// Re-export the canonical Language type so consumers can import from either location.
|
|
8
|
-
export type { Language };
|
|
9
|
-
|
|
10
|
-
export interface LanguageSelectorProps {
|
|
11
|
-
/** Whether to show text labels alongside the globe icon */
|
|
12
|
-
showLabel?: boolean;
|
|
13
|
-
/** UI variant style */
|
|
14
|
-
variant?: 'minimal' | 'default';
|
|
15
|
-
/** Whether to show the globe icon */
|
|
16
|
-
showIcon?: boolean;
|
|
17
|
-
/** Additional CSS classes */
|
|
18
|
-
className?: string;
|
|
19
|
-
/**
|
|
20
|
-
* Whether to render the selector when only one language is configured.
|
|
21
|
-
* When `false` (the default), the selector hides itself in monolingual apps.
|
|
22
|
-
*/
|
|
23
|
-
showWhenMonolingual?: boolean;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* `LanguageSelector` — a self-contained language picker wired to `LanguageContext`.
|
|
28
|
-
*
|
|
29
|
-
* The list of languages displayed is read from `LanguageContext.availableLanguages`
|
|
30
|
-
* (configured via the `availableLanguages` prop on `<LanguageProvider>` or
|
|
31
|
-
* `<XerticaProvider>`). The component is fully data-driven: pass any number of
|
|
32
|
-
* languages and they will all appear in the dropdown.
|
|
33
|
-
*
|
|
34
|
-
* Changing the selected language:
|
|
35
|
-
* 1. Updates `LanguageContext` (persists to localStorage)
|
|
36
|
-
* 2. Calls `i18n.changeLanguage()` (all `useTranslation()` consumers re-render)
|
|
37
|
-
* 3. Invalidates the React Query cache (data-layer strings refresh)
|
|
38
|
-
*
|
|
39
|
-
* **Auto-hide:** When only one language is configured (`isMonolingual === true`),
|
|
40
|
-
* the component renders `null` by default. Pass `showWhenMonolingual` to override.
|
|
41
|
-
*
|
|
42
|
-
* Must be rendered inside `<LanguageProvider>`.
|
|
43
|
-
*/
|
|
44
|
-
export function LanguageSelector({
|
|
45
|
-
showLabel = false,
|
|
46
|
-
variant = 'default',
|
|
47
|
-
showIcon = true,
|
|
48
|
-
className = '',
|
|
49
|
-
showWhenMonolingual = false,
|
|
50
|
-
}: LanguageSelectorProps) {
|
|
51
|
-
const { language, setLanguage, availableLanguages, isMonolingual } = useLanguage();
|
|
52
|
-
const { t } = useTranslation();
|
|
53
|
-
|
|
54
|
-
// Hide selector when only one language is configured
|
|
55
|
-
if (isMonolingual && !showWhenMonolingual) {
|
|
56
|
-
return null;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// Compute display labels with i18n fallback support.
|
|
60
|
-
// Known codes (pt-BR, en, es) get their localized label from translations;
|
|
61
|
-
// custom codes use the label provided in the LanguageDefinition.
|
|
62
|
-
const items = availableLanguages.map(lang => {
|
|
63
|
-
const knownLabelKey =
|
|
64
|
-
lang.code === 'pt-BR'
|
|
65
|
-
? 'languageSelector.ptBR'
|
|
66
|
-
: lang.code === 'en'
|
|
67
|
-
? 'languageSelector.en'
|
|
68
|
-
: lang.code === 'es'
|
|
69
|
-
? 'languageSelector.es'
|
|
70
|
-
: null;
|
|
71
|
-
|
|
72
|
-
return {
|
|
73
|
-
value: lang.code,
|
|
74
|
-
label: knownLabelKey ? t(knownLabelKey, lang.label) : lang.label,
|
|
75
|
-
// Fall back to the first two characters of the code if no shortLabel given
|
|
76
|
-
minimalLabel: lang.shortLabel ?? lang.code.slice(0, 2).toUpperCase(),
|
|
77
|
-
};
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
const currentItem = items.find(l => l.value === language) ?? items[0];
|
|
81
|
-
const displayLabel = variant === 'minimal' ? currentItem.minimalLabel : currentItem.label;
|
|
82
|
-
|
|
83
|
-
return (
|
|
84
|
-
<Select value={language} onValueChange={val => setLanguage(val as Language)}>
|
|
85
|
-
<SelectTrigger
|
|
86
|
-
className={`h-9 gap-2 px-3 border-none shadow-none focus:ring-0 text-muted-foreground hover:bg-accent hover:text-accent-foreground ${className}`}
|
|
87
|
-
aria-label={t('languageSelector.label', 'Selecionar idioma')}
|
|
88
|
-
>
|
|
89
|
-
{showIcon && <Globe className="h-4 w-4 shrink-0" />}
|
|
90
|
-
{/* We do not use SelectValue here because it overrides our custom minimal rendering with the SelectItem's children. */}
|
|
91
|
-
<span className="text-sm">{displayLabel}</span>
|
|
92
|
-
</SelectTrigger>
|
|
93
|
-
<SelectContent align="end">
|
|
94
|
-
{items.map(({ value, label }) => (
|
|
95
|
-
<SelectItem key={value} value={value}>
|
|
96
|
-
{label}
|
|
97
|
-
</SelectItem>
|
|
98
|
-
))}
|
|
99
|
-
</SelectContent>
|
|
100
|
-
</Select>
|
|
101
|
-
);
|
|
102
|
-
}
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../ui/select';
|
|
3
|
+
import { Globe } from 'lucide-react';
|
|
4
|
+
import { useTranslation } from 'react-i18next';
|
|
5
|
+
import { type Language, useLanguage } from '../../../contexts/LanguageContext';
|
|
6
|
+
|
|
7
|
+
// Re-export the canonical Language type so consumers can import from either location.
|
|
8
|
+
export type { Language };
|
|
9
|
+
|
|
10
|
+
export interface LanguageSelectorProps {
|
|
11
|
+
/** Whether to show text labels alongside the globe icon */
|
|
12
|
+
showLabel?: boolean;
|
|
13
|
+
/** UI variant style */
|
|
14
|
+
variant?: 'minimal' | 'default';
|
|
15
|
+
/** Whether to show the globe icon */
|
|
16
|
+
showIcon?: boolean;
|
|
17
|
+
/** Additional CSS classes */
|
|
18
|
+
className?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Whether to render the selector when only one language is configured.
|
|
21
|
+
* When `false` (the default), the selector hides itself in monolingual apps.
|
|
22
|
+
*/
|
|
23
|
+
showWhenMonolingual?: boolean;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* `LanguageSelector` — a self-contained language picker wired to `LanguageContext`.
|
|
28
|
+
*
|
|
29
|
+
* The list of languages displayed is read from `LanguageContext.availableLanguages`
|
|
30
|
+
* (configured via the `availableLanguages` prop on `<LanguageProvider>` or
|
|
31
|
+
* `<XerticaProvider>`). The component is fully data-driven: pass any number of
|
|
32
|
+
* languages and they will all appear in the dropdown.
|
|
33
|
+
*
|
|
34
|
+
* Changing the selected language:
|
|
35
|
+
* 1. Updates `LanguageContext` (persists to localStorage)
|
|
36
|
+
* 2. Calls `i18n.changeLanguage()` (all `useTranslation()` consumers re-render)
|
|
37
|
+
* 3. Invalidates the React Query cache (data-layer strings refresh)
|
|
38
|
+
*
|
|
39
|
+
* **Auto-hide:** When only one language is configured (`isMonolingual === true`),
|
|
40
|
+
* the component renders `null` by default. Pass `showWhenMonolingual` to override.
|
|
41
|
+
*
|
|
42
|
+
* Must be rendered inside `<LanguageProvider>`.
|
|
43
|
+
*/
|
|
44
|
+
export function LanguageSelector({
|
|
45
|
+
showLabel = false,
|
|
46
|
+
variant = 'default',
|
|
47
|
+
showIcon = true,
|
|
48
|
+
className = '',
|
|
49
|
+
showWhenMonolingual = false,
|
|
50
|
+
}: LanguageSelectorProps) {
|
|
51
|
+
const { language, setLanguage, availableLanguages, isMonolingual } = useLanguage();
|
|
52
|
+
const { t } = useTranslation();
|
|
53
|
+
|
|
54
|
+
// Hide selector when only one language is configured
|
|
55
|
+
if (isMonolingual && !showWhenMonolingual) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Compute display labels with i18n fallback support.
|
|
60
|
+
// Known codes (pt-BR, en, es) get their localized label from translations;
|
|
61
|
+
// custom codes use the label provided in the LanguageDefinition.
|
|
62
|
+
const items = availableLanguages.map(lang => {
|
|
63
|
+
const knownLabelKey =
|
|
64
|
+
lang.code === 'pt-BR'
|
|
65
|
+
? 'languageSelector.ptBR'
|
|
66
|
+
: lang.code === 'en'
|
|
67
|
+
? 'languageSelector.en'
|
|
68
|
+
: lang.code === 'es'
|
|
69
|
+
? 'languageSelector.es'
|
|
70
|
+
: null;
|
|
71
|
+
|
|
72
|
+
return {
|
|
73
|
+
value: lang.code,
|
|
74
|
+
label: knownLabelKey ? t(knownLabelKey, lang.label) : lang.label,
|
|
75
|
+
// Fall back to the first two characters of the code if no shortLabel given
|
|
76
|
+
minimalLabel: lang.shortLabel ?? lang.code.slice(0, 2).toUpperCase(),
|
|
77
|
+
};
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
const currentItem = items.find(l => l.value === language) ?? items[0];
|
|
81
|
+
const displayLabel = variant === 'minimal' ? currentItem.minimalLabel : currentItem.label;
|
|
82
|
+
|
|
83
|
+
return (
|
|
84
|
+
<Select value={language} onValueChange={val => setLanguage(val as Language)}>
|
|
85
|
+
<SelectTrigger
|
|
86
|
+
className={`h-9 gap-2 px-3 border-none shadow-none focus:ring-0 text-muted-foreground hover:bg-accent hover:text-accent-foreground ${className}`}
|
|
87
|
+
aria-label={t('languageSelector.label', 'Selecionar idioma')}
|
|
88
|
+
>
|
|
89
|
+
{showIcon && <Globe className="h-4 w-4 shrink-0" />}
|
|
90
|
+
{/* We do not use SelectValue here because it overrides our custom minimal rendering with the SelectItem's children. */}
|
|
91
|
+
<span className="text-sm">{displayLabel}</span>
|
|
92
|
+
</SelectTrigger>
|
|
93
|
+
<SelectContent align="end">
|
|
94
|
+
{items.map(({ value, label }) => (
|
|
95
|
+
<SelectItem key={value} value={value}>
|
|
96
|
+
{label}
|
|
97
|
+
</SelectItem>
|
|
98
|
+
))}
|
|
99
|
+
</SelectContent>
|
|
100
|
+
</Select>
|
|
101
|
+
);
|
|
102
|
+
}
|
|
@@ -1,114 +1,111 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
-
import React from 'react';
|
|
3
|
-
import { LanguageSelector } from './LanguageSelector';
|
|
4
|
-
import {
|
|
5
|
-
LanguageProvider,
|
|
6
|
-
DEFAULT_LANGUAGES,
|
|
7
|
-
type LanguageDefinition,
|
|
8
|
-
} from '../../../contexts/LanguageContext';
|
|
9
|
-
|
|
10
|
-
// ── Decorators ────────────────────────────────────────────────────────────────
|
|
11
|
-
// The global Storybook preview decorator (.storybook/preview.tsx) already wraps
|
|
12
|
-
// every story with <QueryClientProvider> and <XerticaProvider> (which includes
|
|
13
|
-
// <I18nextProvider> and <LanguageProvider> with the default 3 languages).
|
|
14
|
-
//
|
|
15
|
-
// Stories that need to demonstrate a CUSTOM set of available languages override
|
|
16
|
-
// the inner LanguageProvider — this is allowed because contexts are scoped by
|
|
17
|
-
// the nearest matching Provider in the React tree.
|
|
18
|
-
|
|
19
|
-
function withLanguages(availableLanguages: LanguageDefinition[]) {
|
|
20
|
-
return (Story: React.ComponentType) => (
|
|
21
|
-
<LanguageProvider availableLanguages={availableLanguages}>
|
|
22
|
-
<Story />
|
|
23
|
-
</LanguageProvider>
|
|
24
|
-
);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const meta: Meta<typeof LanguageSelector> = {
|
|
28
|
-
title: 'Brand/LanguageSelector',
|
|
29
|
-
component: LanguageSelector,
|
|
30
|
-
parameters: {
|
|
31
|
-
docs: {
|
|
32
|
-
description: {
|
|
33
|
-
component:
|
|
34
|
-
'Language picker wired to `LanguageContext` and `i18next`. ' +
|
|
35
|
-
'Selecting a language persists to `localStorage`, calls `i18n.changeLanguage()` — ' +
|
|
36
|
-
'all `useTranslation()` consumers re-render immediately — and invalidates the ' +
|
|
37
|
-
'React Query cache so mock/API responses also refresh. ' +
|
|
38
|
-
'Auto-hides when only one language is configured.',
|
|
39
|
-
},
|
|
40
|
-
},
|
|
41
|
-
},
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
export default meta;
|
|
45
|
-
type Story = StoryObj<typeof LanguageSelector>;
|
|
46
|
-
|
|
47
|
-
// ── Basic appearance variants ────────────────────────────────────────────────
|
|
48
|
-
|
|
49
|
-
export const Default: Story = {
|
|
50
|
-
args: {},
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
export const WithLabel: Story = {
|
|
54
|
-
args: {
|
|
55
|
-
showLabel: true,
|
|
56
|
-
},
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
export const NoIcon: Story = {
|
|
60
|
-
name: 'No Globe Icon',
|
|
61
|
-
args: {
|
|
62
|
-
showIcon: false,
|
|
63
|
-
},
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
export const Minimal: Story = {
|
|
67
|
-
args: {
|
|
68
|
-
variant: 'minimal',
|
|
69
|
-
showIcon: false,
|
|
70
|
-
},
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
// ── Runtime language configuration ───────────────────────────────────────────
|
|
74
|
-
|
|
75
|
-
export const ExtendedWithFrench: Story = {
|
|
76
|
-
name: 'Extended (with custom language)',
|
|
77
|
-
decorators: [
|
|
78
|
-
withLanguages([
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
showWhenMonolingual: true,
|
|
113
|
-
},
|
|
114
|
-
};
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { LanguageSelector } from './LanguageSelector';
|
|
4
|
+
import {
|
|
5
|
+
LanguageProvider,
|
|
6
|
+
DEFAULT_LANGUAGES,
|
|
7
|
+
type LanguageDefinition,
|
|
8
|
+
} from '../../../contexts/LanguageContext';
|
|
9
|
+
|
|
10
|
+
// ── Decorators ────────────────────────────────────────────────────────────────
|
|
11
|
+
// The global Storybook preview decorator (.storybook/preview.tsx) already wraps
|
|
12
|
+
// every story with <QueryClientProvider> and <XerticaProvider> (which includes
|
|
13
|
+
// <I18nextProvider> and <LanguageProvider> with the default 3 languages).
|
|
14
|
+
//
|
|
15
|
+
// Stories that need to demonstrate a CUSTOM set of available languages override
|
|
16
|
+
// the inner LanguageProvider — this is allowed because contexts are scoped by
|
|
17
|
+
// the nearest matching Provider in the React tree.
|
|
18
|
+
|
|
19
|
+
function withLanguages(availableLanguages: LanguageDefinition[]) {
|
|
20
|
+
return (Story: React.ComponentType) => (
|
|
21
|
+
<LanguageProvider availableLanguages={availableLanguages}>
|
|
22
|
+
<Story />
|
|
23
|
+
</LanguageProvider>
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const meta: Meta<typeof LanguageSelector> = {
|
|
28
|
+
title: 'Brand/LanguageSelector',
|
|
29
|
+
component: LanguageSelector,
|
|
30
|
+
parameters: {
|
|
31
|
+
docs: {
|
|
32
|
+
description: {
|
|
33
|
+
component:
|
|
34
|
+
'Language picker wired to `LanguageContext` and `i18next`. ' +
|
|
35
|
+
'Selecting a language persists to `localStorage`, calls `i18n.changeLanguage()` — ' +
|
|
36
|
+
'all `useTranslation()` consumers re-render immediately — and invalidates the ' +
|
|
37
|
+
'React Query cache so mock/API responses also refresh. ' +
|
|
38
|
+
'Auto-hides when only one language is configured.',
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export default meta;
|
|
45
|
+
type Story = StoryObj<typeof LanguageSelector>;
|
|
46
|
+
|
|
47
|
+
// ── Basic appearance variants ────────────────────────────────────────────────
|
|
48
|
+
|
|
49
|
+
export const Default: Story = {
|
|
50
|
+
args: {},
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
export const WithLabel: Story = {
|
|
54
|
+
args: {
|
|
55
|
+
showLabel: true,
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
export const NoIcon: Story = {
|
|
60
|
+
name: 'No Globe Icon',
|
|
61
|
+
args: {
|
|
62
|
+
showIcon: false,
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
export const Minimal: Story = {
|
|
67
|
+
args: {
|
|
68
|
+
variant: 'minimal',
|
|
69
|
+
showIcon: false,
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
// ── Runtime language configuration ───────────────────────────────────────────
|
|
74
|
+
|
|
75
|
+
export const ExtendedWithFrench: Story = {
|
|
76
|
+
name: 'Extended (with custom language)',
|
|
77
|
+
decorators: [
|
|
78
|
+
withLanguages([...DEFAULT_LANGUAGES, { code: 'fr', label: 'Français', shortLabel: 'FR' }]),
|
|
79
|
+
],
|
|
80
|
+
parameters: {
|
|
81
|
+
docs: {
|
|
82
|
+
description: {
|
|
83
|
+
story:
|
|
84
|
+
'Demonstrates passing extra languages via `availableLanguages` on `<LanguageProvider>` / ' +
|
|
85
|
+
'`<XerticaProvider>`. The selector picks them up automatically.',
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
export const MonolingualAutoHidden: Story = {
|
|
92
|
+
name: 'Monolingual (auto-hidden)',
|
|
93
|
+
decorators: [withLanguages([{ code: 'en', label: 'English' }])],
|
|
94
|
+
parameters: {
|
|
95
|
+
docs: {
|
|
96
|
+
description: {
|
|
97
|
+
story:
|
|
98
|
+
'When only one language is configured, the selector renders nothing. ' +
|
|
99
|
+
'Pass `showWhenMonolingual` to force it to render.',
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
export const MonolingualForced: Story = {
|
|
106
|
+
name: 'Monolingual (showWhenMonolingual=true)',
|
|
107
|
+
decorators: [withLanguages([{ code: 'en', label: 'English' }])],
|
|
108
|
+
args: {
|
|
109
|
+
showWhenMonolingual: true,
|
|
110
|
+
},
|
|
111
|
+
};
|