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,331 +1,331 @@
|
|
|
1
|
-
# Sidebar
|
|
2
|
-
|
|
3
|
-
## Overview
|
|
4
|
-
|
|
5
|
-
The `Sidebar` is the primary vertical navigation panel of the application shell. It manages the app's hierarchy, supporting simple lists, grouped items, and an advanced "Assistant" mode for AI-driven or data-rich interfaces.
|
|
6
|
-
|
|
7
|
-
It is a responsive component that can be expanded or collapsed as an icon-only strip, fully integrated with the `LayoutContext` for state management.
|
|
8
|
-
|
|
9
|
-
The component ships with **three usage patterns** to cover different levels of customization:
|
|
10
|
-
|
|
11
|
-
| Pattern | When to use |
|
|
12
|
-
| -------------------------------------------------------------- | --------------------------------------------------------- |
|
|
13
|
-
| **Monolithic API** (`<Sidebar />`) | Standard usage — pass props, get a fully-featured sidebar |
|
|
14
|
-
| **Compound Component API** (`<Sidebar.Root>` + sub-components) | Custom layouts — compose only the parts you need |
|
|
15
|
-
| **Headless Hook** (`useSidebar()`) | Full control — manage state yourself, render anything |
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
## Variants
|
|
20
|
-
|
|
21
|
-
### 1. Default
|
|
22
|
-
|
|
23
|
-
A clean, structured navigation list for standard dashboards and settings areas.
|
|
24
|
-
|
|
25
|
-
- Supports a flat `routes` list OR grouped navigation via `navigationGroups`.
|
|
26
|
-
- Each route can have `children` — sub-routes exposed via a contextual `ChevronRight` button at the end of the item.
|
|
27
|
-
|
|
28
|
-
### 2. Assistant (Advanced)
|
|
29
|
-
|
|
30
|
-
Designed for complex tools, agents, or multi-context navigation.
|
|
31
|
-
|
|
32
|
-
- **Search**: Built-in search bar with optional advanced filtering.
|
|
33
|
-
- **Groups**: Support for sections with labels, descriptions, and action menus.
|
|
34
|
-
- **Fixed Areas**: Pinned top container for persistent actions (like "New Conversation").
|
|
35
|
-
|
|
36
|
-
---
|
|
37
|
-
|
|
38
|
-
## When to Use
|
|
39
|
-
|
|
40
|
-
- Use it to host the primary navigation routes of your platform.
|
|
41
|
-
- Choose `variant="assistant"` when building tools that require local search or frequent creation of new items (e.g., GPT-style interfaces).
|
|
42
|
-
|
|
43
|
-
---
|
|
44
|
-
|
|
45
|
-
## Props
|
|
46
|
-
|
|
47
|
-
### `<Sidebar />` (Monolithic API)
|
|
48
|
-
|
|
49
|
-
| Prop | Type | Default | Description |
|
|
50
|
-
| ------------------ | -------------------------- | ----------------------------------------- | --------------------------------------------------------------------------------------- |
|
|
51
|
-
| `expanded` | `boolean` | `auto` | Controlled state. Defaults to `LayoutContext` or local state. |
|
|
52
|
-
| `onToggle` | `() => void` | `auto` | Toggle callback. Defaults to `LayoutContext` or local state. |
|
|
53
|
-
| `variant` | `'default' \| 'assistant'` | `'default'` | Controls the internal layout and features. |
|
|
54
|
-
| `routes` | `RouteConfig[]` | — | Flat navigation items (default variant, no groups). |
|
|
55
|
-
| `navigationGroups` | `RouteGroup[]` | — | Grouped navigation items with labels. Works in both `default` and `assistant` variants. |
|
|
56
|
-
| `fixedArea` | `SidebarFixedAreaConfig` | — | Pinned top button (assistant variant — e.g. "New Conversation"). |
|
|
57
|
-
| `search` | `SidebarSearchConfig` | — | Search bar configuration (assistant variant). |
|
|
58
|
-
| `logo` | `ReactNode` | — | Logo shown when expanded. |
|
|
59
|
-
| `logoCollapsed` | `ReactNode` | — | Logo shown when collapsed. |
|
|
60
|
-
| `width` | `number` | `280` | Expanded sidebar width in pixels. |
|
|
61
|
-
| `footer` | `SidebarFooterConfig` | — | Footer visibility flags (`showUser`, `showSettings`, `showLogout`). |
|
|
62
|
-
| `showFooter` | `boolean` | `true` for default, `false` for assistant | Whether to render the footer section. |
|
|
63
|
-
|
|
64
|
-
### `<Sidebar.Root />` (Compound Component)
|
|
65
|
-
|
|
66
|
-
| Prop | Type | Default | Description |
|
|
67
|
-
| ---------- | ------------------------ | ---------------------- | ------------------------------------------------------------------------------------ |
|
|
68
|
-
| `expanded` | `boolean` | `auto` | Controlled expansion state. |
|
|
69
|
-
| `onToggle` | `() => void` | `auto` | Toggle callback. |
|
|
70
|
-
| `navigate` | `(path: string) => void` | `window.location.href` | Navigation handler. |
|
|
71
|
-
| `location` | `{ pathname: string }` | `window.location` | Current location for active state. |
|
|
72
|
-
| `width` | `number` | `280` | Expanded width in pixels. |
|
|
73
|
-
| `children` | `ReactNode` | — | Sub-components: `Sidebar.Header`, `Sidebar.Nav`, `Sidebar.Footer`, `Sidebar.Search`. |
|
|
74
|
-
|
|
75
|
-
### `useSidebar()` (Headless Hook)
|
|
76
|
-
|
|
77
|
-
```ts
|
|
78
|
-
import { useSidebar } from 'xertica-ui/layout';
|
|
79
|
-
|
|
80
|
-
const {
|
|
81
|
-
expanded, // boolean — current expansion state
|
|
82
|
-
setExpanded, // (value: boolean | fn) => void
|
|
83
|
-
toggleExpanded, // () => void
|
|
84
|
-
isMobileViewport, // boolean
|
|
85
|
-
hasOverflow, // boolean — nav items overflow the container
|
|
86
|
-
visibleItems, // RouteGroup[] — items that fit in the nav
|
|
87
|
-
overflowItems, // RouteGroup[] — items that overflow
|
|
88
|
-
openSubmenu, // string | null
|
|
89
|
-
setOpenSubmenu, // (id: string | null) => void
|
|
90
|
-
isFilterOpen, // boolean
|
|
91
|
-
setIsFilterOpen, // (open: boolean) => void
|
|
92
|
-
navRef, // RefObject<HTMLElement> — attach to nav container
|
|
93
|
-
navigationGroups, // RouteGroup[] — the resolved groups passed in
|
|
94
|
-
} = useSidebar({
|
|
95
|
-
defaultExpanded: true,
|
|
96
|
-
navigationGroups: myGroups,
|
|
97
|
-
});
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
### RouteConfig
|
|
101
|
-
|
|
102
|
-
| Field | Type | Description |
|
|
103
|
-
| ------------- | ------------------ | -------------------------------------------------------------------- |
|
|
104
|
-
| `path` | `string` | Navigation path |
|
|
105
|
-
| `label` | `string` | Display label |
|
|
106
|
-
| `icon` | `ComponentType` | Leading icon component |
|
|
107
|
-
| `children` | `RouteConfig[]` | Sub-routes. **Desktop**: ChevronRight opens a lateral DropdownMenu. **Mobile**: ChevronRight toggles an inline accordion below the parent item. |
|
|
108
|
-
| `actions` | `ActionMenuItem[]` | Contextual action menu items (ellipsis button — assistant variant) |
|
|
109
|
-
| `description` | `ReactNode` | Auxiliary content shown when the route is active (assistant variant) |
|
|
110
|
-
|
|
111
|
-
### RouteGroup
|
|
112
|
-
|
|
113
|
-
| Field | Type | Description |
|
|
114
|
-
| --------- | ------------------ | --------------------------------- |
|
|
115
|
-
| `id` | `string` | Unique identifier |
|
|
116
|
-
| `label` | `string` | Group title |
|
|
117
|
-
| `icon` | `ComponentType` | Group icon |
|
|
118
|
-
| `items` | `RouteConfig[]` | Navigation items in the group |
|
|
119
|
-
| `actions` | `ActionMenuItem[]` | Context menu for the entire group |
|
|
120
|
-
|
|
121
|
-
---
|
|
122
|
-
|
|
123
|
-
## Examples
|
|
124
|
-
|
|
125
|
-
### 1. Monolithic API — Flat Routes
|
|
126
|
-
|
|
127
|
-
```tsx
|
|
128
|
-
import { Sidebar } from 'xertica-ui/layout';
|
|
129
|
-
import { useLayout } from 'xertica-ui/hooks';
|
|
130
|
-
import { useLocation, useNavigate } from 'react-router-dom';
|
|
131
|
-
import { Home, Settings } from 'lucide-react';
|
|
132
|
-
|
|
133
|
-
export function MySidebar() {
|
|
134
|
-
const { sidebarExpanded, toggleSidebar, sidebarWidth } = useLayout();
|
|
135
|
-
const location = useLocation();
|
|
136
|
-
const navigate = useNavigate();
|
|
137
|
-
|
|
138
|
-
return (
|
|
139
|
-
<Sidebar
|
|
140
|
-
expanded={sidebarExpanded}
|
|
141
|
-
onToggle={toggleSidebar}
|
|
142
|
-
width={sidebarWidth}
|
|
143
|
-
location={location}
|
|
144
|
-
navigate={navigate}
|
|
145
|
-
routes={[
|
|
146
|
-
{ path: '/', label: 'Home', icon: Home },
|
|
147
|
-
{ path: '/settings', label: 'Settings', icon: Settings },
|
|
148
|
-
]}
|
|
149
|
-
/>
|
|
150
|
-
);
|
|
151
|
-
}
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
### 2. Monolithic API — Groups with Children
|
|
155
|
-
|
|
156
|
-
```tsx
|
|
157
|
-
import { BarChart, Users, Settings, Home } from 'lucide-react';
|
|
158
|
-
|
|
159
|
-
<Sidebar
|
|
160
|
-
navigationGroups={[
|
|
161
|
-
{
|
|
162
|
-
id: 'main',
|
|
163
|
-
label: 'Principal',
|
|
164
|
-
items: [
|
|
165
|
-
{ path: '/home', label: 'Início', icon: Home },
|
|
166
|
-
{
|
|
167
|
-
path: '/dashboard',
|
|
168
|
-
label: 'Dashboard',
|
|
169
|
-
icon: BarChart,
|
|
170
|
-
children: [
|
|
171
|
-
{ path: '/dashboard/overview', label: 'Visão Geral' },
|
|
172
|
-
{ path: '/dashboard/reports', label: 'Relatórios' },
|
|
173
|
-
],
|
|
174
|
-
},
|
|
175
|
-
],
|
|
176
|
-
},
|
|
177
|
-
{
|
|
178
|
-
id: 'admin',
|
|
179
|
-
label: 'Administração',
|
|
180
|
-
items: [
|
|
181
|
-
{ path: '/users', label: 'Usuários', icon: Users },
|
|
182
|
-
{ path: '/settings', label: 'Configurações', icon: Settings },
|
|
183
|
-
],
|
|
184
|
-
},
|
|
185
|
-
]}
|
|
186
|
-
/>;
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
### 3. Compound Component API
|
|
190
|
-
|
|
191
|
-
Use this when you need to inject custom content between sections or reorder the layout:
|
|
192
|
-
|
|
193
|
-
```tsx
|
|
194
|
-
import { Sidebar } from 'xertica-ui/layout';
|
|
195
|
-
import { Home, BarChart } from 'lucide-react';
|
|
196
|
-
|
|
197
|
-
export function CustomSidebar({ expanded, onToggle }) {
|
|
198
|
-
return (
|
|
199
|
-
<Sidebar.Root
|
|
200
|
-
expanded={expanded}
|
|
201
|
-
onToggle={onToggle}
|
|
202
|
-
width={280}
|
|
203
|
-
location={{ pathname: window.location.pathname }}
|
|
204
|
-
navigate={path => (window.location.href = path)}
|
|
205
|
-
>
|
|
206
|
-
{/* Toggle button + logo */}
|
|
207
|
-
<Sidebar.Header logo={<MyLogo />} logoCollapsed={<MyIcon />} />
|
|
208
|
-
|
|
209
|
-
{/* Custom content injected between header and nav */}
|
|
210
|
-
<div className="px-4 py-2">
|
|
211
|
-
<span className="text-xs text-sidebar-foreground/60">v2.0.0</span>
|
|
212
|
-
</div>
|
|
213
|
-
|
|
214
|
-
{/* Navigation */}
|
|
215
|
-
<Sidebar.Nav
|
|
216
|
-
navigationGroups={[
|
|
217
|
-
{
|
|
218
|
-
id: 'main',
|
|
219
|
-
items: [
|
|
220
|
-
{ path: '/home', label: 'Home', icon: Home },
|
|
221
|
-
{ path: '/dashboard', label: 'Dashboard', icon: BarChart },
|
|
222
|
-
],
|
|
223
|
-
},
|
|
224
|
-
]}
|
|
225
|
-
/>
|
|
226
|
-
|
|
227
|
-
{/* Footer */}
|
|
228
|
-
<Sidebar.Footer
|
|
229
|
-
user={{ name: 'Admin', email: 'admin@example.com' }}
|
|
230
|
-
onLogout={() => signOut()}
|
|
231
|
-
showUser
|
|
232
|
-
showSettings
|
|
233
|
-
showLogout
|
|
234
|
-
/>
|
|
235
|
-
</Sidebar.Root>
|
|
236
|
-
);
|
|
237
|
-
}
|
|
238
|
-
```
|
|
239
|
-
|
|
240
|
-
### 4. Headless Hook — Fully Custom UI
|
|
241
|
-
|
|
242
|
-
Use `useSidebar` when you need complete control over the rendered output:
|
|
243
|
-
|
|
244
|
-
```tsx
|
|
245
|
-
import { useSidebar } from 'xertica-ui/layout';
|
|
246
|
-
import { Home, BarChart } from 'lucide-react';
|
|
247
|
-
|
|
248
|
-
const groups = [
|
|
249
|
-
{
|
|
250
|
-
id: 'main',
|
|
251
|
-
items: [
|
|
252
|
-
{ path: '/home', label: 'Home', icon: Home },
|
|
253
|
-
{ path: '/dashboard', label: 'Dashboard', icon: BarChart },
|
|
254
|
-
],
|
|
255
|
-
},
|
|
256
|
-
];
|
|
257
|
-
|
|
258
|
-
export function MyCustomSidebar() {
|
|
259
|
-
const { expanded, toggleExpanded, navigationGroups } = useSidebar({
|
|
260
|
-
defaultExpanded: true,
|
|
261
|
-
navigationGroups: groups,
|
|
262
|
-
});
|
|
263
|
-
|
|
264
|
-
return (
|
|
265
|
-
<aside style={{ width: expanded ? 280 : 80 }}>
|
|
266
|
-
<button onClick={toggleExpanded}>Toggle</button>
|
|
267
|
-
<nav>
|
|
268
|
-
{navigationGroups
|
|
269
|
-
.flatMap(g => g.items)
|
|
270
|
-
.map(item => (
|
|
271
|
-
<a key={item.path} href={item.path}>
|
|
272
|
-
{expanded ? item.label : null}
|
|
273
|
-
</a>
|
|
274
|
-
))}
|
|
275
|
-
</nav>
|
|
276
|
-
</aside>
|
|
277
|
-
);
|
|
278
|
-
}
|
|
279
|
-
```
|
|
280
|
-
|
|
281
|
-
---
|
|
282
|
-
|
|
283
|
-
## Accessibility (v2.1.9+)
|
|
284
|
-
|
|
285
|
-
The `default` variant sidebar ships with the following ARIA enhancements:
|
|
286
|
-
|
|
287
|
-
| Element | Attribute | Value | Description |
|
|
288
|
-
| ------------- | --------------- | ----------------------- | ----------------------------------- |
|
|
289
|
-
| Toggle button | `aria-expanded` | `{expanded}` | Signals open/closed state to AT |
|
|
290
|
-
| Toggle button | `aria-controls` | `"sidebar-nav"` | Links button to the nav it controls |
|
|
291
|
-
| `<nav>` | `id` | `"sidebar-nav"` | Target of `aria-controls` |
|
|
292
|
-
| `<nav>` | `aria-label` | `"Navegação principal"` | Identifies the nav landmark |
|
|
293
|
-
|
|
294
|
-
These attributes are applied automatically — no consumer configuration needed.
|
|
295
|
-
|
|
296
|
-
---
|
|
297
|
-
|
|
298
|
-
## AI Rules
|
|
299
|
-
|
|
300
|
-
- **State Management** — Always use `useLayout()` to keep the Sidebar synchronized with the main content padding. Avoid managing `expanded` locally unless using the Headless Hook pattern.
|
|
301
|
-
- **Icons** — Pass the icon **component source** (e.g., `HomeIcon`), not a rendered element.
|
|
302
|
-
- **Groups** — Use `navigationGroups` in `default` variant for structured navigation with labels. Use `routes` for flat lists.
|
|
303
|
-
- **Children (sub-items)** — Add `children` to a `RouteConfig` to expose sub-routes. On **desktop** (≥ 768 px), a ChevronRight button opens a lateral `DropdownMenu` positioned to the right of the sidebar. On **mobile** (< 768 px), the same button toggles an **inline accordion** that expands the child items directly below the parent, with a rotation animation on the ChevronRight icon. Do not nest more than 2 levels.
|
|
304
|
-
- **Assistant Mode** — Use `fixedArea` to place high-priority "Create" buttons so they remain visible regardless of scrolling.
|
|
305
|
-
- **Compound Components** — Use `<Sidebar.Root>` + sub-components when you need to inject custom content between sections or reorder the layout.
|
|
306
|
-
- **Headless Hook** — Use `useSidebar()` only when you need a completely custom sidebar UI that shares none of the default rendering.
|
|
307
|
-
- **location prop** — Always pass `location={useLocation()}` from `react-router-dom` when using inside a Router. Passing a stale `window.location` reference prevents active-state updates on navigation.
|
|
308
|
-
|
|
309
|
-
---
|
|
310
|
-
|
|
311
|
-
## Storybook Stories
|
|
312
|
-
|
|
313
|
-
| Story name | Description |
|
|
314
|
-
| --------------------------- | --------------------------------------------------------------------------------------- |
|
|
315
|
-
| `Default` | Flat routes, collapsed sidebar. |
|
|
316
|
-
| `DefaultWithGroups` | Groups with `children` sub-items — desktop dropdown behavior. |
|
|
317
|
-
| `Assistant` | Assistant variant with search, filter, fixedArea, and nested action menus. |
|
|
318
|
-
| `Collapsed` | Sidebar in collapsed icon-only mode. |
|
|
319
|
-
| `NoFooter` | `showFooter={false}`. |
|
|
320
|
-
| `Autonomous` | No `expanded`/`onToggle` props — fully internal state. |
|
|
321
|
-
| `WithSubitemsDesktop` | Sidebar expanded with sub-items visible. Click ChevronRight to open the lateral dropdown. |
|
|
322
|
-
| `WithSubitemsMobile` | Simulates a 375 px viewport. Open the sidebar via the hamburger button to see sub-items expand inline as an accordion. |
|
|
323
|
-
| `CompoundComponentAPI` | `<Sidebar.Root>` + `<Sidebar.Header>` + `<Sidebar.Nav>` + `<Sidebar.Footer>`. |
|
|
324
|
-
| `HeadlessHook` | Fully custom UI via `useSidebar()`. |
|
|
325
|
-
|
|
326
|
-
---
|
|
327
|
-
|
|
328
|
-
## Related Components
|
|
329
|
-
|
|
330
|
-
- [`Header`](./header.md) — Responsible for the mobile sidebar trigger.
|
|
331
|
-
- [`useLayout`](../layout.md) — The context provider managing sidebar state.
|
|
1
|
+
# Sidebar
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The `Sidebar` is the primary vertical navigation panel of the application shell. It manages the app's hierarchy, supporting simple lists, grouped items, and an advanced "Assistant" mode for AI-driven or data-rich interfaces.
|
|
6
|
+
|
|
7
|
+
It is a responsive component that can be expanded or collapsed as an icon-only strip, fully integrated with the `LayoutContext` for state management.
|
|
8
|
+
|
|
9
|
+
The component ships with **three usage patterns** to cover different levels of customization:
|
|
10
|
+
|
|
11
|
+
| Pattern | When to use |
|
|
12
|
+
| -------------------------------------------------------------- | --------------------------------------------------------- |
|
|
13
|
+
| **Monolithic API** (`<Sidebar />`) | Standard usage — pass props, get a fully-featured sidebar |
|
|
14
|
+
| **Compound Component API** (`<Sidebar.Root>` + sub-components) | Custom layouts — compose only the parts you need |
|
|
15
|
+
| **Headless Hook** (`useSidebar()`) | Full control — manage state yourself, render anything |
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Variants
|
|
20
|
+
|
|
21
|
+
### 1. Default
|
|
22
|
+
|
|
23
|
+
A clean, structured navigation list for standard dashboards and settings areas.
|
|
24
|
+
|
|
25
|
+
- Supports a flat `routes` list OR grouped navigation via `navigationGroups`.
|
|
26
|
+
- Each route can have `children` — sub-routes exposed via a contextual `ChevronRight` button at the end of the item.
|
|
27
|
+
|
|
28
|
+
### 2. Assistant (Advanced)
|
|
29
|
+
|
|
30
|
+
Designed for complex tools, agents, or multi-context navigation.
|
|
31
|
+
|
|
32
|
+
- **Search**: Built-in search bar with optional advanced filtering.
|
|
33
|
+
- **Groups**: Support for sections with labels, descriptions, and action menus.
|
|
34
|
+
- **Fixed Areas**: Pinned top container for persistent actions (like "New Conversation").
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## When to Use
|
|
39
|
+
|
|
40
|
+
- Use it to host the primary navigation routes of your platform.
|
|
41
|
+
- Choose `variant="assistant"` when building tools that require local search or frequent creation of new items (e.g., GPT-style interfaces).
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Props
|
|
46
|
+
|
|
47
|
+
### `<Sidebar />` (Monolithic API)
|
|
48
|
+
|
|
49
|
+
| Prop | Type | Default | Description |
|
|
50
|
+
| ------------------ | -------------------------- | ----------------------------------------- | --------------------------------------------------------------------------------------- |
|
|
51
|
+
| `expanded` | `boolean` | `auto` | Controlled state. Defaults to `LayoutContext` or local state. |
|
|
52
|
+
| `onToggle` | `() => void` | `auto` | Toggle callback. Defaults to `LayoutContext` or local state. |
|
|
53
|
+
| `variant` | `'default' \| 'assistant'` | `'default'` | Controls the internal layout and features. |
|
|
54
|
+
| `routes` | `RouteConfig[]` | — | Flat navigation items (default variant, no groups). |
|
|
55
|
+
| `navigationGroups` | `RouteGroup[]` | — | Grouped navigation items with labels. Works in both `default` and `assistant` variants. |
|
|
56
|
+
| `fixedArea` | `SidebarFixedAreaConfig` | — | Pinned top button (assistant variant — e.g. "New Conversation"). |
|
|
57
|
+
| `search` | `SidebarSearchConfig` | — | Search bar configuration (assistant variant). |
|
|
58
|
+
| `logo` | `ReactNode` | — | Logo shown when expanded. |
|
|
59
|
+
| `logoCollapsed` | `ReactNode` | — | Logo shown when collapsed. |
|
|
60
|
+
| `width` | `number` | `280` | Expanded sidebar width in pixels. |
|
|
61
|
+
| `footer` | `SidebarFooterConfig` | — | Footer visibility flags (`showUser`, `showSettings`, `showLogout`). |
|
|
62
|
+
| `showFooter` | `boolean` | `true` for default, `false` for assistant | Whether to render the footer section. |
|
|
63
|
+
|
|
64
|
+
### `<Sidebar.Root />` (Compound Component)
|
|
65
|
+
|
|
66
|
+
| Prop | Type | Default | Description |
|
|
67
|
+
| ---------- | ------------------------ | ---------------------- | ------------------------------------------------------------------------------------ |
|
|
68
|
+
| `expanded` | `boolean` | `auto` | Controlled expansion state. |
|
|
69
|
+
| `onToggle` | `() => void` | `auto` | Toggle callback. |
|
|
70
|
+
| `navigate` | `(path: string) => void` | `window.location.href` | Navigation handler. |
|
|
71
|
+
| `location` | `{ pathname: string }` | `window.location` | Current location for active state. |
|
|
72
|
+
| `width` | `number` | `280` | Expanded width in pixels. |
|
|
73
|
+
| `children` | `ReactNode` | — | Sub-components: `Sidebar.Header`, `Sidebar.Nav`, `Sidebar.Footer`, `Sidebar.Search`. |
|
|
74
|
+
|
|
75
|
+
### `useSidebar()` (Headless Hook)
|
|
76
|
+
|
|
77
|
+
```ts
|
|
78
|
+
import { useSidebar } from 'xertica-ui/layout';
|
|
79
|
+
|
|
80
|
+
const {
|
|
81
|
+
expanded, // boolean — current expansion state
|
|
82
|
+
setExpanded, // (value: boolean | fn) => void
|
|
83
|
+
toggleExpanded, // () => void
|
|
84
|
+
isMobileViewport, // boolean
|
|
85
|
+
hasOverflow, // boolean — nav items overflow the container
|
|
86
|
+
visibleItems, // RouteGroup[] — items that fit in the nav
|
|
87
|
+
overflowItems, // RouteGroup[] — items that overflow
|
|
88
|
+
openSubmenu, // string | null
|
|
89
|
+
setOpenSubmenu, // (id: string | null) => void
|
|
90
|
+
isFilterOpen, // boolean
|
|
91
|
+
setIsFilterOpen, // (open: boolean) => void
|
|
92
|
+
navRef, // RefObject<HTMLElement> — attach to nav container
|
|
93
|
+
navigationGroups, // RouteGroup[] — the resolved groups passed in
|
|
94
|
+
} = useSidebar({
|
|
95
|
+
defaultExpanded: true,
|
|
96
|
+
navigationGroups: myGroups,
|
|
97
|
+
});
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### RouteConfig
|
|
101
|
+
|
|
102
|
+
| Field | Type | Description |
|
|
103
|
+
| ------------- | ------------------ | -------------------------------------------------------------------- |
|
|
104
|
+
| `path` | `string` | Navigation path |
|
|
105
|
+
| `label` | `string` | Display label |
|
|
106
|
+
| `icon` | `ComponentType` | Leading icon component |
|
|
107
|
+
| `children` | `RouteConfig[]` | Sub-routes. **Desktop**: ChevronRight opens a lateral DropdownMenu. **Mobile**: ChevronRight toggles an inline accordion below the parent item. |
|
|
108
|
+
| `actions` | `ActionMenuItem[]` | Contextual action menu items (ellipsis button — assistant variant) |
|
|
109
|
+
| `description` | `ReactNode` | Auxiliary content shown when the route is active (assistant variant) |
|
|
110
|
+
|
|
111
|
+
### RouteGroup
|
|
112
|
+
|
|
113
|
+
| Field | Type | Description |
|
|
114
|
+
| --------- | ------------------ | --------------------------------- |
|
|
115
|
+
| `id` | `string` | Unique identifier |
|
|
116
|
+
| `label` | `string` | Group title |
|
|
117
|
+
| `icon` | `ComponentType` | Group icon |
|
|
118
|
+
| `items` | `RouteConfig[]` | Navigation items in the group |
|
|
119
|
+
| `actions` | `ActionMenuItem[]` | Context menu for the entire group |
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Examples
|
|
124
|
+
|
|
125
|
+
### 1. Monolithic API — Flat Routes
|
|
126
|
+
|
|
127
|
+
```tsx
|
|
128
|
+
import { Sidebar } from 'xertica-ui/layout';
|
|
129
|
+
import { useLayout } from 'xertica-ui/hooks';
|
|
130
|
+
import { useLocation, useNavigate } from 'react-router-dom';
|
|
131
|
+
import { Home, Settings } from 'lucide-react';
|
|
132
|
+
|
|
133
|
+
export function MySidebar() {
|
|
134
|
+
const { sidebarExpanded, toggleSidebar, sidebarWidth } = useLayout();
|
|
135
|
+
const location = useLocation();
|
|
136
|
+
const navigate = useNavigate();
|
|
137
|
+
|
|
138
|
+
return (
|
|
139
|
+
<Sidebar
|
|
140
|
+
expanded={sidebarExpanded}
|
|
141
|
+
onToggle={toggleSidebar}
|
|
142
|
+
width={sidebarWidth}
|
|
143
|
+
location={location}
|
|
144
|
+
navigate={navigate}
|
|
145
|
+
routes={[
|
|
146
|
+
{ path: '/', label: 'Home', icon: Home },
|
|
147
|
+
{ path: '/settings', label: 'Settings', icon: Settings },
|
|
148
|
+
]}
|
|
149
|
+
/>
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### 2. Monolithic API — Groups with Children
|
|
155
|
+
|
|
156
|
+
```tsx
|
|
157
|
+
import { BarChart, Users, Settings, Home } from 'lucide-react';
|
|
158
|
+
|
|
159
|
+
<Sidebar
|
|
160
|
+
navigationGroups={[
|
|
161
|
+
{
|
|
162
|
+
id: 'main',
|
|
163
|
+
label: 'Principal',
|
|
164
|
+
items: [
|
|
165
|
+
{ path: '/home', label: 'Início', icon: Home },
|
|
166
|
+
{
|
|
167
|
+
path: '/dashboard',
|
|
168
|
+
label: 'Dashboard',
|
|
169
|
+
icon: BarChart,
|
|
170
|
+
children: [
|
|
171
|
+
{ path: '/dashboard/overview', label: 'Visão Geral' },
|
|
172
|
+
{ path: '/dashboard/reports', label: 'Relatórios' },
|
|
173
|
+
],
|
|
174
|
+
},
|
|
175
|
+
],
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
id: 'admin',
|
|
179
|
+
label: 'Administração',
|
|
180
|
+
items: [
|
|
181
|
+
{ path: '/users', label: 'Usuários', icon: Users },
|
|
182
|
+
{ path: '/settings', label: 'Configurações', icon: Settings },
|
|
183
|
+
],
|
|
184
|
+
},
|
|
185
|
+
]}
|
|
186
|
+
/>;
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### 3. Compound Component API
|
|
190
|
+
|
|
191
|
+
Use this when you need to inject custom content between sections or reorder the layout:
|
|
192
|
+
|
|
193
|
+
```tsx
|
|
194
|
+
import { Sidebar } from 'xertica-ui/layout';
|
|
195
|
+
import { Home, BarChart } from 'lucide-react';
|
|
196
|
+
|
|
197
|
+
export function CustomSidebar({ expanded, onToggle }) {
|
|
198
|
+
return (
|
|
199
|
+
<Sidebar.Root
|
|
200
|
+
expanded={expanded}
|
|
201
|
+
onToggle={onToggle}
|
|
202
|
+
width={280}
|
|
203
|
+
location={{ pathname: window.location.pathname }}
|
|
204
|
+
navigate={path => (window.location.href = path)}
|
|
205
|
+
>
|
|
206
|
+
{/* Toggle button + logo */}
|
|
207
|
+
<Sidebar.Header logo={<MyLogo />} logoCollapsed={<MyIcon />} />
|
|
208
|
+
|
|
209
|
+
{/* Custom content injected between header and nav */}
|
|
210
|
+
<div className="px-4 py-2">
|
|
211
|
+
<span className="text-xs text-sidebar-foreground/60">v2.0.0</span>
|
|
212
|
+
</div>
|
|
213
|
+
|
|
214
|
+
{/* Navigation */}
|
|
215
|
+
<Sidebar.Nav
|
|
216
|
+
navigationGroups={[
|
|
217
|
+
{
|
|
218
|
+
id: 'main',
|
|
219
|
+
items: [
|
|
220
|
+
{ path: '/home', label: 'Home', icon: Home },
|
|
221
|
+
{ path: '/dashboard', label: 'Dashboard', icon: BarChart },
|
|
222
|
+
],
|
|
223
|
+
},
|
|
224
|
+
]}
|
|
225
|
+
/>
|
|
226
|
+
|
|
227
|
+
{/* Footer */}
|
|
228
|
+
<Sidebar.Footer
|
|
229
|
+
user={{ name: 'Admin', email: 'admin@example.com' }}
|
|
230
|
+
onLogout={() => signOut()}
|
|
231
|
+
showUser
|
|
232
|
+
showSettings
|
|
233
|
+
showLogout
|
|
234
|
+
/>
|
|
235
|
+
</Sidebar.Root>
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### 4. Headless Hook — Fully Custom UI
|
|
241
|
+
|
|
242
|
+
Use `useSidebar` when you need complete control over the rendered output:
|
|
243
|
+
|
|
244
|
+
```tsx
|
|
245
|
+
import { useSidebar } from 'xertica-ui/layout';
|
|
246
|
+
import { Home, BarChart } from 'lucide-react';
|
|
247
|
+
|
|
248
|
+
const groups = [
|
|
249
|
+
{
|
|
250
|
+
id: 'main',
|
|
251
|
+
items: [
|
|
252
|
+
{ path: '/home', label: 'Home', icon: Home },
|
|
253
|
+
{ path: '/dashboard', label: 'Dashboard', icon: BarChart },
|
|
254
|
+
],
|
|
255
|
+
},
|
|
256
|
+
];
|
|
257
|
+
|
|
258
|
+
export function MyCustomSidebar() {
|
|
259
|
+
const { expanded, toggleExpanded, navigationGroups } = useSidebar({
|
|
260
|
+
defaultExpanded: true,
|
|
261
|
+
navigationGroups: groups,
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
return (
|
|
265
|
+
<aside style={{ width: expanded ? 280 : 80 }}>
|
|
266
|
+
<button onClick={toggleExpanded}>Toggle</button>
|
|
267
|
+
<nav>
|
|
268
|
+
{navigationGroups
|
|
269
|
+
.flatMap(g => g.items)
|
|
270
|
+
.map(item => (
|
|
271
|
+
<a key={item.path} href={item.path}>
|
|
272
|
+
{expanded ? item.label : null}
|
|
273
|
+
</a>
|
|
274
|
+
))}
|
|
275
|
+
</nav>
|
|
276
|
+
</aside>
|
|
277
|
+
);
|
|
278
|
+
}
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
## Accessibility (v2.1.9+)
|
|
284
|
+
|
|
285
|
+
The `default` variant sidebar ships with the following ARIA enhancements:
|
|
286
|
+
|
|
287
|
+
| Element | Attribute | Value | Description |
|
|
288
|
+
| ------------- | --------------- | ----------------------- | ----------------------------------- |
|
|
289
|
+
| Toggle button | `aria-expanded` | `{expanded}` | Signals open/closed state to AT |
|
|
290
|
+
| Toggle button | `aria-controls` | `"sidebar-nav"` | Links button to the nav it controls |
|
|
291
|
+
| `<nav>` | `id` | `"sidebar-nav"` | Target of `aria-controls` |
|
|
292
|
+
| `<nav>` | `aria-label` | `"Navegação principal"` | Identifies the nav landmark |
|
|
293
|
+
|
|
294
|
+
These attributes are applied automatically — no consumer configuration needed.
|
|
295
|
+
|
|
296
|
+
---
|
|
297
|
+
|
|
298
|
+
## AI Rules
|
|
299
|
+
|
|
300
|
+
- **State Management** — Always use `useLayout()` to keep the Sidebar synchronized with the main content padding. Avoid managing `expanded` locally unless using the Headless Hook pattern.
|
|
301
|
+
- **Icons** — Pass the icon **component source** (e.g., `HomeIcon`), not a rendered element.
|
|
302
|
+
- **Groups** — Use `navigationGroups` in `default` variant for structured navigation with labels. Use `routes` for flat lists.
|
|
303
|
+
- **Children (sub-items)** — Add `children` to a `RouteConfig` to expose sub-routes. On **desktop** (≥ 768 px), a ChevronRight button opens a lateral `DropdownMenu` positioned to the right of the sidebar. On **mobile** (< 768 px), the same button toggles an **inline accordion** that expands the child items directly below the parent, with a rotation animation on the ChevronRight icon. Do not nest more than 2 levels.
|
|
304
|
+
- **Assistant Mode** — Use `fixedArea` to place high-priority "Create" buttons so they remain visible regardless of scrolling.
|
|
305
|
+
- **Compound Components** — Use `<Sidebar.Root>` + sub-components when you need to inject custom content between sections or reorder the layout.
|
|
306
|
+
- **Headless Hook** — Use `useSidebar()` only when you need a completely custom sidebar UI that shares none of the default rendering.
|
|
307
|
+
- **location prop** — Always pass `location={useLocation()}` from `react-router-dom` when using inside a Router. Passing a stale `window.location` reference prevents active-state updates on navigation.
|
|
308
|
+
|
|
309
|
+
---
|
|
310
|
+
|
|
311
|
+
## Storybook Stories
|
|
312
|
+
|
|
313
|
+
| Story name | Description |
|
|
314
|
+
| --------------------------- | --------------------------------------------------------------------------------------- |
|
|
315
|
+
| `Default` | Flat routes, collapsed sidebar. |
|
|
316
|
+
| `DefaultWithGroups` | Groups with `children` sub-items — desktop dropdown behavior. |
|
|
317
|
+
| `Assistant` | Assistant variant with search, filter, fixedArea, and nested action menus. |
|
|
318
|
+
| `Collapsed` | Sidebar in collapsed icon-only mode. |
|
|
319
|
+
| `NoFooter` | `showFooter={false}`. |
|
|
320
|
+
| `Autonomous` | No `expanded`/`onToggle` props — fully internal state. |
|
|
321
|
+
| `WithSubitemsDesktop` | Sidebar expanded with sub-items visible. Click ChevronRight to open the lateral dropdown. |
|
|
322
|
+
| `WithSubitemsMobile` | Simulates a 375 px viewport. Open the sidebar via the hamburger button to see sub-items expand inline as an accordion. |
|
|
323
|
+
| `CompoundComponentAPI` | `<Sidebar.Root>` + `<Sidebar.Header>` + `<Sidebar.Nav>` + `<Sidebar.Footer>`. |
|
|
324
|
+
| `HeadlessHook` | Fully custom UI via `useSidebar()`. |
|
|
325
|
+
|
|
326
|
+
---
|
|
327
|
+
|
|
328
|
+
## Related Components
|
|
329
|
+
|
|
330
|
+
- [`Header`](./header.md) — Responsible for the mobile sidebar trigger.
|
|
331
|
+
- [`useLayout`](../layout.md) — The context provider managing sidebar state.
|