xertica-ui 2.5.0 → 2.5.2
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 +35 -0
- package/README.md +56 -17
- package/assets/xertica-logo.svg +37 -37
- package/assets/xertica-x-logo.svg +20 -20
- package/bin/cli.ts +14 -2
- package/bin/generate-tokens.ts +262 -262
- package/bin/language-config.ts +359 -358
- 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 -564
- package/components/assistant/xertica-assistant/parts/AssistantCollapsedView.tsx +99 -99
- package/components/assistant/xertica-assistant/parts/AssistantConversationList.tsx +104 -104
- package/components/assistant/xertica-assistant/parts/AssistantDocumentEditor.tsx +81 -81
- package/components/assistant/xertica-assistant/parts/AssistantFeedbackDialog.tsx +88 -88
- package/components/assistant/xertica-assistant/parts/AssistantHeader.tsx +75 -75
- package/components/assistant/xertica-assistant/parts/AssistantMessageBubble.tsx +564 -564
- 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 -611
- 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 -58
- 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 -112
- 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 -67
- 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 -111
- package/components/brand/language-selector/language-selector.test.tsx +101 -101
- package/components/brand/theme-toggle/ThemeToggle.tsx +74 -74
- package/components/brand/xertica-provider/xertica-provider.mdx +61 -61
- package/components/index.ts +86 -86
- package/components/layout/sidebar/sidebar.mdx +1 -1
- package/components/layout/sidebar/sidebar.stories.tsx +1033 -787
- package/components/layout/sidebar/sidebar.tsx +338 -1
- package/components/media/FloatingMediaWrapper.tsx +371 -371
- package/components/media/audio-player/AudioPlayer.tsx +768 -768
- package/components/media/video-player/VideoPlayer.tsx +310 -310
- 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 -78
- package/components/pages/home-page/home-page.mdx +53 -53
- package/components/pages/template-content/TemplateContent.tsx +1354 -1354
- 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/shared/error-boundary.stories.tsx +114 -114
- package/components/shared/error-boundary.tsx +150 -150
- package/components/shared/error-fallbacks.tsx +222 -222
- 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/chart/chart.test.tsx +178 -178
- package/components/ui/chart/chart.tsx +2245 -2239
- 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 -60
- package/components/ui/stats-card/stats-card.mdx +8 -8
- package/components/ui/stats-card/stats-card.tsx +109 -109
- 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 +511 -511
- package/contexts/AuthContext.tsx +121 -121
- package/contexts/BrandColorsContext.tsx +282 -282
- package/contexts/LanguageContext.test.tsx +121 -121
- package/contexts/LanguageContext.tsx +250 -250
- package/contexts/theme-data.ts +391 -391
- 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-CGIwmWrm.js → VerifyEmailPage-B31mCrMc.js} +1 -1
- 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-CpqqpLpo.cjs → VerifyEmailPage-C_Zk6Gen.cjs} +1 -1
- 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-B4peJjAT.cjs → VerifyEmailPage-DF2ilhum.cjs} +334 -356
- 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-C5TNQTBa.js → VerifyEmailPage-EhudUdqF.js} +343 -355
- package/dist/{VerifyEmailPage-DGhuIqkb.js → VerifyEmailPage-X14vhdyl.js} +4 -4
- package/dist/VerifyEmailPage-hdB8JQGv.cjs +3213 -0
- package/dist/{VerifyEmailPage-Bp1XXl3H.cjs → VerifyEmailPage-u_Dn7t1U.cjs} +4 -4
- 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-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-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-CFuIlYFH.js} +12 -12
- package/dist/{XerticaXLogo-bvZSgwGF.cjs → XerticaXLogo-CU-U-GP4.cjs} +7 -13
- 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/{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/cli.js +16 -6
- package/dist/components/ui/chart/chart.d.ts +7 -5
- 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 +2 -2
- package/dist/index.es.js +2 -2
- 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-nzPoVHBQ.cjs → sidebar-B9NR0lCe.cjs} +46 -41
- package/dist/{sidebar-CeTMuzOx.cjs → sidebar-BvF5I2Ue.cjs} +47 -128
- 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-CLmIjgNd.cjs +1136 -0
- package/dist/{sidebar-BxGXsDAd.cjs → sidebar-CVUGHOS_.cjs} +8 -16
- package/dist/{sidebar-BViy8Eeu.js → sidebar-CmvwjnVb.js} +9 -17
- package/dist/{sidebar-B6SlKZYN.js → sidebar-CplprZpM.js} +49 -40
- package/dist/sidebar-Duermn32.js +1133 -0
- package/dist/{sidebar-BbVIQvlP.js → sidebar-Dz7bd3zP.js} +1 -1
- package/dist/{sidebar-0ocFLSks.js → sidebar-KIS0C2JH.js} +50 -127
- 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-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-yX1CFBBo.js → xertica-assistant-DPsESB6t.js} +390 -531
- package/dist/{CodeBlock-7TTgmdGG.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 -312
- package/docs/components/assistant.md +428 -428
- package/docs/components/branding.md +252 -252
- package/docs/components/card-patterns.md +447 -447
- package/docs/components/error-boundary.md +201 -201
- package/docs/components/hooks.md +432 -432
- package/docs/components/language-selector.md +176 -176
- package/docs/components/pages.md +323 -323
- package/docs/components/sidebar.md +331 -331
- package/docs/components/stats-card.md +138 -138
- package/docs/doc-audit.md +244 -244
- package/docs/getting-started.md +616 -616
- package/docs/guidelines.md +330 -330
- package/docs/i18n.md +480 -480
- package/docs/installation.md +268 -268
- package/docs/llms.md +295 -295
- package/docs/state-management.md +289 -289
- package/guidelines/Guidelines.md +409 -409
- package/llms-compact.txt +1 -1
- package/llms-full.txt +10688 -10688
- package/llms.txt +1 -1
- package/package.json +1 -1
- package/styles/xertica/base.css +90 -90
- package/styles/xertica/tokens.css +240 -240
- package/templates/.prettierignore +4 -4
- package/templates/.prettierrc +10 -10
- package/templates/CLAUDE.md +180 -180
- package/templates/package.json +2 -2
- package/templates/src/app/App.tsx +46 -46
- package/templates/src/app/components/AuthGuard.tsx +131 -131
- 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/ForgotPasswordContent.tsx +70 -70
- package/templates/src/features/auth/ui/LoginContent.tsx +92 -92
- package/templates/src/features/auth/ui/ResetPasswordContent.tsx +183 -183
- package/templates/src/features/auth/ui/SocialLoginButtons.tsx +78 -78
- package/templates/src/features/auth/ui/VerifyEmailContent.tsx +80 -80
- package/templates/src/features/home/data/mock.ts +41 -41
- 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 -117
- package/templates/src/features/template/ui/CrudTemplate.tsx +112 -112
- 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 -1322
- 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 -470
- package/templates/src/pages/HomePage.tsx +53 -53
- package/templates/src/shared/error-boundary.tsx +150 -150
- package/templates/src/shared/error-fallbacks.tsx +222 -222
- package/templates/src/styles/xertica/tokens.css +240 -240
- package/templates/vite.config.js +20 -20
- package/templates/vite.config.ts +55 -55
- package/dist/AssistantChart-BKVtGUKF.js +0 -3383
- 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-WeycT5Pd.cjs +0 -3551
- 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-BgfYL_rD.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-DDuiIcKo.js +0 -39
- 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-DQj1z3jG.cjs +0 -758
- 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-CrgTb6Hs.cjs +0 -2155
- package/dist/xertica-assistant-DCsnQyi5.js +0 -2156
- 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,120 +1,120 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { Card, CardContent, CardFooter, CardHeader, CardTitle } from '../../ui/card';
|
|
3
|
-
import { Header } from '../../layout/header';
|
|
4
|
-
import { Button } from '../../ui/button';
|
|
5
|
-
import { FileText } from 'lucide-react';
|
|
6
|
-
import { ScrollArea } from '../../ui/scroll-area';
|
|
7
|
-
import { useLocation, useNavigate, Link } from 'react-router-dom';
|
|
8
|
-
import { Badge } from '../../ui/badge';
|
|
9
|
-
import { PageHeader } from '../../ui/page-header';
|
|
10
|
-
import { useOptionalLayout } from '../../../contexts/LayoutContext';
|
|
11
|
-
import { SIDEBAR_EXPANDED_WIDTH, SIDEBAR_COLLAPSED_WIDTH } from '../../shared/layout-constants';
|
|
12
|
-
import { useFeatureCards } from '../../../features/home';
|
|
13
|
-
import { useTranslation } from 'react-i18next';
|
|
14
|
-
import { SectionErrorBoundary } from '../../shared/error-boundary';
|
|
15
|
-
import { FeatureCardSkeleton } from '../../blocks/card-patterns/FeatureCardSkeleton';
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Main dashboard content area for the landing page.
|
|
19
|
-
*
|
|
20
|
-
* @description
|
|
21
|
-
* Fetches feature cards via `useFeatureCards` (React Query). All UI strings are
|
|
22
|
-
* translated via `useTranslation()` — change language via `LanguageSelector`.
|
|
23
|
-
*
|
|
24
|
-
* @ai-rules
|
|
25
|
-
* 1. Data: Feature cards come from `useFeatureCards()` — never hardcode them here.
|
|
26
|
-
* 2. i18n: Use `t('home.*')` for all UI strings — never hardcode text in JSX.
|
|
27
|
-
* 3. Loading: Renders a skeleton card while the query is in-flight.
|
|
28
|
-
*/
|
|
29
|
-
export function HomeContent() {
|
|
30
|
-
const { t } = useTranslation();
|
|
31
|
-
const layout = useOptionalLayout();
|
|
32
|
-
const sidebarExpanded = layout?.sidebarExpanded ?? false;
|
|
33
|
-
const sidebarWidth = layout?.sidebarWidth ?? 256;
|
|
34
|
-
const navigate = useNavigate();
|
|
35
|
-
|
|
36
|
-
const { data: featureCards = [], isLoading } = useFeatureCards();
|
|
37
|
-
|
|
38
|
-
return (
|
|
39
|
-
<div
|
|
40
|
-
style={{
|
|
41
|
-
paddingLeft: sidebarExpanded ? `${sidebarWidth}px` : SIDEBAR_COLLAPSED_WIDTH,
|
|
42
|
-
}}
|
|
43
|
-
className="flex-1 flex flex-col overflow-hidden transition-all duration-300"
|
|
44
|
-
>
|
|
45
|
-
<Header
|
|
46
|
-
showThemeToggle={true}
|
|
47
|
-
showLanguageSelector={true}
|
|
48
|
-
breadcrumbs={[{ label: t('nav.designSystem'), href: '/home' }, { label: t('nav.home') }]}
|
|
49
|
-
renderLink={(href, props) => <Link to={href} {...props} />}
|
|
50
|
-
/>
|
|
51
|
-
|
|
52
|
-
<main className="flex-1 overflow-hidden bg-muted">
|
|
53
|
-
<ScrollArea className="h-full">
|
|
54
|
-
<div className="p-5 sm:p-4 md:p-6">
|
|
55
|
-
<div className="max-w-6xl mx-auto space-y-8">
|
|
56
|
-
<PageHeader title={t('home.welcome')} subtitle={t('home.subtitle')} />
|
|
57
|
-
|
|
58
|
-
<SectionErrorBoundary>
|
|
59
|
-
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
|
|
60
|
-
{isLoading ? (
|
|
61
|
-
<>
|
|
62
|
-
<FeatureCardSkeleton showAction />
|
|
63
|
-
<FeatureCardSkeleton showAction />
|
|
64
|
-
<FeatureCardSkeleton showAction />
|
|
65
|
-
</>
|
|
66
|
-
) : (
|
|
67
|
-
featureCards.map(card => (
|
|
68
|
-
<Card
|
|
69
|
-
key={card.id}
|
|
70
|
-
className="hover:shadow-xl transition-shadow duration-200 flex flex-col h-full"
|
|
71
|
-
>
|
|
72
|
-
<CardHeader>
|
|
73
|
-
<div className="flex items-center gap-3">
|
|
74
|
-
<div className="p-2 bg-[var(--chart-2)]/20 rounded-[var(--radius)]">
|
|
75
|
-
<FileText className="w-6 h-6 text-[var(--chart-2)]" />
|
|
76
|
-
</div>
|
|
77
|
-
<div className="flex items-center gap-2">
|
|
78
|
-
<CardTitle className="text-sm">
|
|
79
|
-
{t(`home.${card.id.replace(/-/g, '')}Title`, {
|
|
80
|
-
defaultValue: card.title,
|
|
81
|
-
})}
|
|
82
|
-
</CardTitle>
|
|
83
|
-
{card.badge && (
|
|
84
|
-
<Badge variant="default" className="text-xs">
|
|
85
|
-
{t(`home.${card.id.replace(/-/g, '')}badge`, {
|
|
86
|
-
defaultValue: card.badge,
|
|
87
|
-
})}
|
|
88
|
-
</Badge>
|
|
89
|
-
)}
|
|
90
|
-
</div>
|
|
91
|
-
</div>
|
|
92
|
-
</CardHeader>
|
|
93
|
-
<CardContent className="flex-1">
|
|
94
|
-
<p className="text-muted-foreground">
|
|
95
|
-
{t(`home.${card.id.replace(/-/g, '')}Description`, {
|
|
96
|
-
defaultValue: card.description,
|
|
97
|
-
})}
|
|
98
|
-
</p>
|
|
99
|
-
</CardContent>
|
|
100
|
-
<CardFooter>
|
|
101
|
-
<Button
|
|
102
|
-
variant="outline"
|
|
103
|
-
className="w-full"
|
|
104
|
-
onClick={() => navigate(card.href)}
|
|
105
|
-
>
|
|
106
|
-
{t('common.view')}
|
|
107
|
-
</Button>
|
|
108
|
-
</CardFooter>
|
|
109
|
-
</Card>
|
|
110
|
-
))
|
|
111
|
-
)}
|
|
112
|
-
</div>
|
|
113
|
-
</SectionErrorBoundary>
|
|
114
|
-
</div>
|
|
115
|
-
</div>
|
|
116
|
-
</ScrollArea>
|
|
117
|
-
</main>
|
|
118
|
-
</div>
|
|
119
|
-
);
|
|
120
|
-
}
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Card, CardContent, CardFooter, CardHeader, CardTitle } from '../../ui/card';
|
|
3
|
+
import { Header } from '../../layout/header';
|
|
4
|
+
import { Button } from '../../ui/button';
|
|
5
|
+
import { FileText } from 'lucide-react';
|
|
6
|
+
import { ScrollArea } from '../../ui/scroll-area';
|
|
7
|
+
import { useLocation, useNavigate, Link } from 'react-router-dom';
|
|
8
|
+
import { Badge } from '../../ui/badge';
|
|
9
|
+
import { PageHeader } from '../../ui/page-header';
|
|
10
|
+
import { useOptionalLayout } from '../../../contexts/LayoutContext';
|
|
11
|
+
import { SIDEBAR_EXPANDED_WIDTH, SIDEBAR_COLLAPSED_WIDTH } from '../../shared/layout-constants';
|
|
12
|
+
import { useFeatureCards } from '../../../features/home';
|
|
13
|
+
import { useTranslation } from 'react-i18next';
|
|
14
|
+
import { SectionErrorBoundary } from '../../shared/error-boundary';
|
|
15
|
+
import { FeatureCardSkeleton } from '../../blocks/card-patterns/FeatureCardSkeleton';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Main dashboard content area for the landing page.
|
|
19
|
+
*
|
|
20
|
+
* @description
|
|
21
|
+
* Fetches feature cards via `useFeatureCards` (React Query). All UI strings are
|
|
22
|
+
* translated via `useTranslation()` — change language via `LanguageSelector`.
|
|
23
|
+
*
|
|
24
|
+
* @ai-rules
|
|
25
|
+
* 1. Data: Feature cards come from `useFeatureCards()` — never hardcode them here.
|
|
26
|
+
* 2. i18n: Use `t('home.*')` for all UI strings — never hardcode text in JSX.
|
|
27
|
+
* 3. Loading: Renders a skeleton card while the query is in-flight.
|
|
28
|
+
*/
|
|
29
|
+
export function HomeContent() {
|
|
30
|
+
const { t } = useTranslation();
|
|
31
|
+
const layout = useOptionalLayout();
|
|
32
|
+
const sidebarExpanded = layout?.sidebarExpanded ?? false;
|
|
33
|
+
const sidebarWidth = layout?.sidebarWidth ?? 256;
|
|
34
|
+
const navigate = useNavigate();
|
|
35
|
+
|
|
36
|
+
const { data: featureCards = [], isLoading } = useFeatureCards();
|
|
37
|
+
|
|
38
|
+
return (
|
|
39
|
+
<div
|
|
40
|
+
style={{
|
|
41
|
+
paddingLeft: sidebarExpanded ? `${sidebarWidth}px` : SIDEBAR_COLLAPSED_WIDTH,
|
|
42
|
+
}}
|
|
43
|
+
className="flex-1 flex flex-col overflow-hidden transition-all duration-300"
|
|
44
|
+
>
|
|
45
|
+
<Header
|
|
46
|
+
showThemeToggle={true}
|
|
47
|
+
showLanguageSelector={true}
|
|
48
|
+
breadcrumbs={[{ label: t('nav.designSystem'), href: '/home' }, { label: t('nav.home') }]}
|
|
49
|
+
renderLink={(href, props) => <Link to={href} {...props} />}
|
|
50
|
+
/>
|
|
51
|
+
|
|
52
|
+
<main className="flex-1 overflow-hidden bg-muted">
|
|
53
|
+
<ScrollArea className="h-full">
|
|
54
|
+
<div className="p-5 sm:p-4 md:p-6">
|
|
55
|
+
<div className="max-w-6xl mx-auto space-y-8">
|
|
56
|
+
<PageHeader title={t('home.welcome')} subtitle={t('home.subtitle')} />
|
|
57
|
+
|
|
58
|
+
<SectionErrorBoundary>
|
|
59
|
+
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
|
|
60
|
+
{isLoading ? (
|
|
61
|
+
<>
|
|
62
|
+
<FeatureCardSkeleton showAction />
|
|
63
|
+
<FeatureCardSkeleton showAction />
|
|
64
|
+
<FeatureCardSkeleton showAction />
|
|
65
|
+
</>
|
|
66
|
+
) : (
|
|
67
|
+
featureCards.map(card => (
|
|
68
|
+
<Card
|
|
69
|
+
key={card.id}
|
|
70
|
+
className="hover:shadow-xl transition-shadow duration-200 flex flex-col h-full"
|
|
71
|
+
>
|
|
72
|
+
<CardHeader>
|
|
73
|
+
<div className="flex items-center gap-3">
|
|
74
|
+
<div className="p-2 bg-[var(--chart-2)]/20 rounded-[var(--radius)]">
|
|
75
|
+
<FileText className="w-6 h-6 text-[var(--chart-2)]" />
|
|
76
|
+
</div>
|
|
77
|
+
<div className="flex items-center gap-2">
|
|
78
|
+
<CardTitle className="text-sm">
|
|
79
|
+
{t(`home.${card.id.replace(/-/g, '')}Title`, {
|
|
80
|
+
defaultValue: card.title,
|
|
81
|
+
})}
|
|
82
|
+
</CardTitle>
|
|
83
|
+
{card.badge && (
|
|
84
|
+
<Badge variant="default" className="text-xs">
|
|
85
|
+
{t(`home.${card.id.replace(/-/g, '')}badge`, {
|
|
86
|
+
defaultValue: card.badge,
|
|
87
|
+
})}
|
|
88
|
+
</Badge>
|
|
89
|
+
)}
|
|
90
|
+
</div>
|
|
91
|
+
</div>
|
|
92
|
+
</CardHeader>
|
|
93
|
+
<CardContent className="flex-1">
|
|
94
|
+
<p className="text-muted-foreground">
|
|
95
|
+
{t(`home.${card.id.replace(/-/g, '')}Description`, {
|
|
96
|
+
defaultValue: card.description,
|
|
97
|
+
})}
|
|
98
|
+
</p>
|
|
99
|
+
</CardContent>
|
|
100
|
+
<CardFooter>
|
|
101
|
+
<Button
|
|
102
|
+
variant="outline"
|
|
103
|
+
className="w-full"
|
|
104
|
+
onClick={() => navigate(card.href)}
|
|
105
|
+
>
|
|
106
|
+
{t('common.view')}
|
|
107
|
+
</Button>
|
|
108
|
+
</CardFooter>
|
|
109
|
+
</Card>
|
|
110
|
+
))
|
|
111
|
+
)}
|
|
112
|
+
</div>
|
|
113
|
+
</SectionErrorBoundary>
|
|
114
|
+
</div>
|
|
115
|
+
</div>
|
|
116
|
+
</ScrollArea>
|
|
117
|
+
</main>
|
|
118
|
+
</div>
|
|
119
|
+
);
|
|
120
|
+
}
|
|
@@ -1,62 +1,62 @@
|
|
|
1
|
-
import { Meta, Title, Subtitle } from '@storybook/addon-docs/blocks';
|
|
2
|
-
|
|
3
|
-
<Meta title="Pages/HomeContent" />
|
|
4
|
-
|
|
5
|
-
<Title>HomeContent</Title>
|
|
6
|
-
<Subtitle>Main dashboard landing area with breadcrumb header and feature card grid.</Subtitle>
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## Overview
|
|
11
|
-
|
|
12
|
-
`HomeContent` is the top-level content component for the application's home/dashboard route. It renders:
|
|
13
|
-
|
|
14
|
-
- A sticky `Header` with breadcrumbs and optional theme/language controls.
|
|
15
|
-
- A `PageHeader` welcoming the user.
|
|
16
|
-
- A responsive card grid for navigating to application features.
|
|
17
|
-
|
|
18
|
-
It reads sidebar state from `LayoutContext` when available and falls back to safe local defaults when rendered outside `XerticaProvider`.
|
|
19
|
-
|
|
20
|
-
**Requires:** React Router v6. `XerticaProvider` is recommended for synchronized layout state, but no longer required for rendering.
|
|
21
|
-
|
|
22
|
-
```tsx
|
|
23
|
-
import { HomeContent } from 'xertica-ui';
|
|
24
|
-
|
|
25
|
-
<HomeContent user={currentUser} onLogout={handleLogout} />
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
---
|
|
29
|
-
|
|
30
|
-
## Props
|
|
31
|
-
|
|
32
|
-
| Prop | Type | Default | Description |
|
|
33
|
-
|---|---|---|---|
|
|
34
|
-
| `user` | `{ name?: string; email?: string; avatar?: string } \| null` | - | Currently authenticated user. Passed to the header for display. |
|
|
35
|
-
| `onLogout` | `() => void` | - | Called when the user triggers logout from the header. |
|
|
36
|
-
| `onSettings` | `() => void` | - | Called when the user opens account settings from the header. |
|
|
37
|
-
|
|
38
|
-
---
|
|
39
|
-
|
|
40
|
-
## Layout Dependency
|
|
41
|
-
|
|
42
|
-
`HomeContent` uses optional layout state. When wrapped in `XerticaProvider`, it synchronizes with the global sidebar width and expanded state. Without the provider, it renders using collapsed-sidebar defaults.
|
|
43
|
-
|
|
44
|
-
```tsx
|
|
45
|
-
// Recommended - synchronized app layout
|
|
46
|
-
<XerticaProvider>
|
|
47
|
-
<HomeContent />
|
|
48
|
-
</XerticaProvider>
|
|
49
|
-
|
|
50
|
-
// Also safe - uses local fallback layout values
|
|
51
|
-
<HomeContent />
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
---
|
|
55
|
-
|
|
56
|
-
## AI Best Practices
|
|
57
|
-
|
|
58
|
-
> [!IMPORTANT]
|
|
59
|
-
> - **Provider fallback** - `HomeContent` renders without `XerticaProvider`, but the provider is recommended for synchronized sidebar state.
|
|
60
|
-
> - **Feature cards** - The card grid is currently hardcoded to the "Template CLI" feature. To add cards, fork the component and extend the grid section.
|
|
61
|
-
> - **Breadcrumbs** - Breadcrumb labels are resolved via a local `labelTranslations` map and `getRouteByPath`. Ensure your route definitions include a `label` field for correct breadcrumb rendering.
|
|
62
|
-
> - **Background color** - The outer container uses `bg-muted` from the design system tokens. Override with `className` if a different background is needed.
|
|
1
|
+
import { Meta, Title, Subtitle } from '@storybook/addon-docs/blocks';
|
|
2
|
+
|
|
3
|
+
<Meta title="Pages/HomeContent" />
|
|
4
|
+
|
|
5
|
+
<Title>HomeContent</Title>
|
|
6
|
+
<Subtitle>Main dashboard landing area with breadcrumb header and feature card grid.</Subtitle>
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Overview
|
|
11
|
+
|
|
12
|
+
`HomeContent` is the top-level content component for the application's home/dashboard route. It renders:
|
|
13
|
+
|
|
14
|
+
- A sticky `Header` with breadcrumbs and optional theme/language controls.
|
|
15
|
+
- A `PageHeader` welcoming the user.
|
|
16
|
+
- A responsive card grid for navigating to application features.
|
|
17
|
+
|
|
18
|
+
It reads sidebar state from `LayoutContext` when available and falls back to safe local defaults when rendered outside `XerticaProvider`.
|
|
19
|
+
|
|
20
|
+
**Requires:** React Router v6. `XerticaProvider` is recommended for synchronized layout state, but no longer required for rendering.
|
|
21
|
+
|
|
22
|
+
```tsx
|
|
23
|
+
import { HomeContent } from 'xertica-ui';
|
|
24
|
+
|
|
25
|
+
<HomeContent user={currentUser} onLogout={handleLogout} />
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Props
|
|
31
|
+
|
|
32
|
+
| Prop | Type | Default | Description |
|
|
33
|
+
|---|---|---|---|
|
|
34
|
+
| `user` | `{ name?: string; email?: string; avatar?: string } \| null` | - | Currently authenticated user. Passed to the header for display. |
|
|
35
|
+
| `onLogout` | `() => void` | - | Called when the user triggers logout from the header. |
|
|
36
|
+
| `onSettings` | `() => void` | - | Called when the user opens account settings from the header. |
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Layout Dependency
|
|
41
|
+
|
|
42
|
+
`HomeContent` uses optional layout state. When wrapped in `XerticaProvider`, it synchronizes with the global sidebar width and expanded state. Without the provider, it renders using collapsed-sidebar defaults.
|
|
43
|
+
|
|
44
|
+
```tsx
|
|
45
|
+
// Recommended - synchronized app layout
|
|
46
|
+
<XerticaProvider>
|
|
47
|
+
<HomeContent />
|
|
48
|
+
</XerticaProvider>
|
|
49
|
+
|
|
50
|
+
// Also safe - uses local fallback layout values
|
|
51
|
+
<HomeContent />
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## AI Best Practices
|
|
57
|
+
|
|
58
|
+
> [!IMPORTANT]
|
|
59
|
+
> - **Provider fallback** - `HomeContent` renders without `XerticaProvider`, but the provider is recommended for synchronized sidebar state.
|
|
60
|
+
> - **Feature cards** - The card grid is currently hardcoded to the "Template CLI" feature. To add cards, fork the component and extend the grid section.
|
|
61
|
+
> - **Breadcrumbs** - Breadcrumb labels are resolved via a local `labelTranslations` map and `getRouteByPath`. Ensure your route definitions include a `label` field for correct breadcrumb rendering.
|
|
62
|
+
> - **Background color** - The outer container uses `bg-muted` from the design system tokens. Override with `className` if a different background is needed.
|
|
@@ -1,78 +1,78 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { useLocation, useNavigate } from 'react-router-dom';
|
|
3
|
-
import { Sidebar } from '../../layout/sidebar';
|
|
4
|
-
import { HomeContent } from '../home-content/HomeContent';
|
|
5
|
-
import { XerticaAssistant } from '../../assistant/xertica-assistant/xertica-assistant';
|
|
6
|
-
import { gerarResposta } from '../../shared/assistant-utils';
|
|
7
|
-
import { routes } from '../../shared/navigation';
|
|
8
|
-
import { useOptionalLayout } from '../../../contexts/LayoutContext';
|
|
9
|
-
import { useAuth } from '../../../contexts/AuthContext';
|
|
10
|
-
import {
|
|
11
|
-
useAssistantConfig,
|
|
12
|
-
getMockRichSuggestions,
|
|
13
|
-
getMockFeedbackOptions,
|
|
14
|
-
} from '../../../features/assistant';
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Root Dashboard page component.
|
|
18
|
-
*
|
|
19
|
-
* @description
|
|
20
|
-
* Assembles Sidebar, HomeContent, and XerticaAssistant. Assistant configuration
|
|
21
|
-
* (suggestions, feedback options) is fetched via `useAssistantConfig` (React Query).
|
|
22
|
-
* To use a real API, replace `fetchAssistantConfig` in `features/assistant/data/mock.ts`.
|
|
23
|
-
*
|
|
24
|
-
* @ai-rules
|
|
25
|
-
* 1. Data: Assistant config comes from `useAssistantConfig()` — never hardcode suggestions here.
|
|
26
|
-
* 2. Composition: Keep this as a thin layout shell; delegate all content to children.
|
|
27
|
-
* 3. State: Relies on `LayoutContext` for sidebar / assistant visibility.
|
|
28
|
-
*/
|
|
29
|
-
export function HomePage() {
|
|
30
|
-
const { user, logout } = useAuth();
|
|
31
|
-
const layout = useOptionalLayout();
|
|
32
|
-
const [localSidebarExpanded, setLocalSidebarExpanded] = React.useState(false);
|
|
33
|
-
const [localAssistantExpanded, setLocalAssistantExpanded] = React.useState(false);
|
|
34
|
-
const sidebarExpanded = layout?.sidebarExpanded ?? localSidebarExpanded;
|
|
35
|
-
const sidebarWidth = layout?.sidebarWidth ?? 280;
|
|
36
|
-
const assistenteExpanded = layout?.assistenteExpanded ?? localAssistantExpanded;
|
|
37
|
-
const toggleSidebar = layout?.toggleSidebar ?? (() => setLocalSidebarExpanded(value => !value));
|
|
38
|
-
const toggleAssistente =
|
|
39
|
-
layout?.toggleAssistente ?? (() => setLocalAssistantExpanded(value => !value));
|
|
40
|
-
const location = useLocation();
|
|
41
|
-
const navigate = useNavigate();
|
|
42
|
-
|
|
43
|
-
const { data: assistantConfig } = useAssistantConfig();
|
|
44
|
-
|
|
45
|
-
return (
|
|
46
|
-
<div className="h-screen flex bg-muted overflow-hidden relative">
|
|
47
|
-
<Sidebar
|
|
48
|
-
expanded={sidebarExpanded}
|
|
49
|
-
width={sidebarWidth}
|
|
50
|
-
onToggle={toggleSidebar}
|
|
51
|
-
user={{
|
|
52
|
-
...user,
|
|
53
|
-
name: 'Ariel Santos',
|
|
54
|
-
avatar: 'https://github.com/shadcn.png',
|
|
55
|
-
}}
|
|
56
|
-
onLogout={logout}
|
|
57
|
-
onSettingsClick={() => navigate('/settings')}
|
|
58
|
-
location={location}
|
|
59
|
-
navigate={navigate}
|
|
60
|
-
routes={routes}
|
|
61
|
-
/>
|
|
62
|
-
<HomeContent />
|
|
63
|
-
<XerticaAssistant
|
|
64
|
-
isExpanded={assistenteExpanded}
|
|
65
|
-
onToggle={toggleAssistente}
|
|
66
|
-
defaultTab="chat"
|
|
67
|
-
demoMode={true}
|
|
68
|
-
responseGenerator={gerarResposta}
|
|
69
|
-
suggestions={assistantConfig?.suggestions}
|
|
70
|
-
richSuggestions={assistantConfig?.richSuggestions ?? getMockRichSuggestions()}
|
|
71
|
-
feedbackOptions={assistantConfig?.feedbackOptions ?? getMockFeedbackOptions()}
|
|
72
|
-
onEvaluation={() => {
|
|
73
|
-
// Wire your feedback persistence logic here
|
|
74
|
-
}}
|
|
75
|
-
/>
|
|
76
|
-
</div>
|
|
77
|
-
);
|
|
78
|
-
}
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useLocation, useNavigate } from 'react-router-dom';
|
|
3
|
+
import { Sidebar } from '../../layout/sidebar';
|
|
4
|
+
import { HomeContent } from '../home-content/HomeContent';
|
|
5
|
+
import { XerticaAssistant } from '../../assistant/xertica-assistant/xertica-assistant';
|
|
6
|
+
import { gerarResposta } from '../../shared/assistant-utils';
|
|
7
|
+
import { routes } from '../../shared/navigation';
|
|
8
|
+
import { useOptionalLayout } from '../../../contexts/LayoutContext';
|
|
9
|
+
import { useAuth } from '../../../contexts/AuthContext';
|
|
10
|
+
import {
|
|
11
|
+
useAssistantConfig,
|
|
12
|
+
getMockRichSuggestions,
|
|
13
|
+
getMockFeedbackOptions,
|
|
14
|
+
} from '../../../features/assistant';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Root Dashboard page component.
|
|
18
|
+
*
|
|
19
|
+
* @description
|
|
20
|
+
* Assembles Sidebar, HomeContent, and XerticaAssistant. Assistant configuration
|
|
21
|
+
* (suggestions, feedback options) is fetched via `useAssistantConfig` (React Query).
|
|
22
|
+
* To use a real API, replace `fetchAssistantConfig` in `features/assistant/data/mock.ts`.
|
|
23
|
+
*
|
|
24
|
+
* @ai-rules
|
|
25
|
+
* 1. Data: Assistant config comes from `useAssistantConfig()` — never hardcode suggestions here.
|
|
26
|
+
* 2. Composition: Keep this as a thin layout shell; delegate all content to children.
|
|
27
|
+
* 3. State: Relies on `LayoutContext` for sidebar / assistant visibility.
|
|
28
|
+
*/
|
|
29
|
+
export function HomePage() {
|
|
30
|
+
const { user, logout } = useAuth();
|
|
31
|
+
const layout = useOptionalLayout();
|
|
32
|
+
const [localSidebarExpanded, setLocalSidebarExpanded] = React.useState(false);
|
|
33
|
+
const [localAssistantExpanded, setLocalAssistantExpanded] = React.useState(false);
|
|
34
|
+
const sidebarExpanded = layout?.sidebarExpanded ?? localSidebarExpanded;
|
|
35
|
+
const sidebarWidth = layout?.sidebarWidth ?? 280;
|
|
36
|
+
const assistenteExpanded = layout?.assistenteExpanded ?? localAssistantExpanded;
|
|
37
|
+
const toggleSidebar = layout?.toggleSidebar ?? (() => setLocalSidebarExpanded(value => !value));
|
|
38
|
+
const toggleAssistente =
|
|
39
|
+
layout?.toggleAssistente ?? (() => setLocalAssistantExpanded(value => !value));
|
|
40
|
+
const location = useLocation();
|
|
41
|
+
const navigate = useNavigate();
|
|
42
|
+
|
|
43
|
+
const { data: assistantConfig } = useAssistantConfig();
|
|
44
|
+
|
|
45
|
+
return (
|
|
46
|
+
<div className="h-screen flex bg-muted overflow-hidden relative">
|
|
47
|
+
<Sidebar
|
|
48
|
+
expanded={sidebarExpanded}
|
|
49
|
+
width={sidebarWidth}
|
|
50
|
+
onToggle={toggleSidebar}
|
|
51
|
+
user={{
|
|
52
|
+
...user,
|
|
53
|
+
name: 'Ariel Santos',
|
|
54
|
+
avatar: 'https://github.com/shadcn.png',
|
|
55
|
+
}}
|
|
56
|
+
onLogout={logout}
|
|
57
|
+
onSettingsClick={() => navigate('/settings')}
|
|
58
|
+
location={location}
|
|
59
|
+
navigate={navigate}
|
|
60
|
+
routes={routes}
|
|
61
|
+
/>
|
|
62
|
+
<HomeContent />
|
|
63
|
+
<XerticaAssistant
|
|
64
|
+
isExpanded={assistenteExpanded}
|
|
65
|
+
onToggle={toggleAssistente}
|
|
66
|
+
defaultTab="chat"
|
|
67
|
+
demoMode={true}
|
|
68
|
+
responseGenerator={gerarResposta}
|
|
69
|
+
suggestions={assistantConfig?.suggestions}
|
|
70
|
+
richSuggestions={assistantConfig?.richSuggestions ?? getMockRichSuggestions()}
|
|
71
|
+
feedbackOptions={assistantConfig?.feedbackOptions ?? getMockFeedbackOptions()}
|
|
72
|
+
onEvaluation={() => {
|
|
73
|
+
// Wire your feedback persistence logic here
|
|
74
|
+
}}
|
|
75
|
+
/>
|
|
76
|
+
</div>
|
|
77
|
+
);
|
|
78
|
+
}
|
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
import { Meta, Title, Subtitle } from '@storybook/addon-docs/blocks';
|
|
2
|
-
import * as HomePageStories from './HomePage.stories';
|
|
3
|
-
|
|
4
|
-
<Meta of={HomePageStories} />
|
|
5
|
-
|
|
6
|
-
<Title>HomePage</Title>
|
|
7
|
-
<Subtitle>Full application shell composed from Sidebar, HomeContent, and XerticaAssistant.</Subtitle>
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## Overview
|
|
12
|
-
|
|
13
|
-
`HomePage` is the root authenticated page. It assembles the three major layout pillars:
|
|
14
|
-
|
|
15
|
-
- **Sidebar** - Primary navigation.
|
|
16
|
-
- **HomeContent** - Dashboard area with breadcrumb header and feature card grid.
|
|
17
|
-
- **XerticaAssistant** - Floating AI assistant panel.
|
|
18
|
-
|
|
19
|
-
When `XerticaProvider` is present, the page synchronizes sidebar width, sidebar expansion, and assistant visibility through `LayoutContext`. Without the provider, it renders with local fallback layout state.
|
|
20
|
-
|
|
21
|
-
**Requires:** React Router v6. `XerticaProvider` is recommended for app-level synchronization.
|
|
22
|
-
|
|
23
|
-
---
|
|
24
|
-
|
|
25
|
-
## Props
|
|
26
|
-
|
|
27
|
-
| Prop | Type | Required | Description |
|
|
28
|
-
|---|---|---|---|
|
|
29
|
-
| `user` | `{ email: string } \| null` | Yes | Currently authenticated user. Passed to Sidebar and HomeContent for display. |
|
|
30
|
-
| `onLogout` | `() => void` | Yes | Called when the user triggers logout from the Sidebar or Header. |
|
|
31
|
-
|
|
32
|
-
---
|
|
33
|
-
|
|
34
|
-
## Composition
|
|
35
|
-
|
|
36
|
-
```tsx
|
|
37
|
-
import { HomePage } from 'xertica-ui';
|
|
38
|
-
|
|
39
|
-
<Route
|
|
40
|
-
path="/home"
|
|
41
|
-
element={<HomePage user={currentUser} onLogout={handleLogout} />}
|
|
42
|
-
/>
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
---
|
|
46
|
-
|
|
47
|
-
## AI Best Practices
|
|
48
|
-
|
|
49
|
-
> [!IMPORTANT]
|
|
50
|
-
> - **Top-level only** - `HomePage` is a full-screen layout component. Do not nest it inside other layouts.
|
|
51
|
-
> - **No logic here** - Keep business logic in `HomeContent` or lower-level components.
|
|
52
|
-
> - **Provider fallback** - The page renders without `XerticaProvider`, but the provider is recommended for synchronized app layout.
|
|
53
|
-
> - **Extend via HomeContent** - To add dashboard sections, edit `HomeContent`, not `HomePage`.
|
|
1
|
+
import { Meta, Title, Subtitle } from '@storybook/addon-docs/blocks';
|
|
2
|
+
import * as HomePageStories from './HomePage.stories';
|
|
3
|
+
|
|
4
|
+
<Meta of={HomePageStories} />
|
|
5
|
+
|
|
6
|
+
<Title>HomePage</Title>
|
|
7
|
+
<Subtitle>Full application shell composed from Sidebar, HomeContent, and XerticaAssistant.</Subtitle>
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Overview
|
|
12
|
+
|
|
13
|
+
`HomePage` is the root authenticated page. It assembles the three major layout pillars:
|
|
14
|
+
|
|
15
|
+
- **Sidebar** - Primary navigation.
|
|
16
|
+
- **HomeContent** - Dashboard area with breadcrumb header and feature card grid.
|
|
17
|
+
- **XerticaAssistant** - Floating AI assistant panel.
|
|
18
|
+
|
|
19
|
+
When `XerticaProvider` is present, the page synchronizes sidebar width, sidebar expansion, and assistant visibility through `LayoutContext`. Without the provider, it renders with local fallback layout state.
|
|
20
|
+
|
|
21
|
+
**Requires:** React Router v6. `XerticaProvider` is recommended for app-level synchronization.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Props
|
|
26
|
+
|
|
27
|
+
| Prop | Type | Required | Description |
|
|
28
|
+
|---|---|---|---|
|
|
29
|
+
| `user` | `{ email: string } \| null` | Yes | Currently authenticated user. Passed to Sidebar and HomeContent for display. |
|
|
30
|
+
| `onLogout` | `() => void` | Yes | Called when the user triggers logout from the Sidebar or Header. |
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Composition
|
|
35
|
+
|
|
36
|
+
```tsx
|
|
37
|
+
import { HomePage } from 'xertica-ui';
|
|
38
|
+
|
|
39
|
+
<Route
|
|
40
|
+
path="/home"
|
|
41
|
+
element={<HomePage user={currentUser} onLogout={handleLogout} />}
|
|
42
|
+
/>
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## AI Best Practices
|
|
48
|
+
|
|
49
|
+
> [!IMPORTANT]
|
|
50
|
+
> - **Top-level only** - `HomePage` is a full-screen layout component. Do not nest it inside other layouts.
|
|
51
|
+
> - **No logic here** - Keep business logic in `HomeContent` or lower-level components.
|
|
52
|
+
> - **Provider fallback** - The page renders without `XerticaProvider`, but the provider is recommended for synchronized app layout.
|
|
53
|
+
> - **Extend via HomeContent** - To add dashboard sections, edit `HomeContent`, not `HomePage`.
|