Frontend
Sidebar e Layout
AppLayout, sidebar e navegação
O layout segue o padrão oficial de sidebar do shadcn/ui.
Estrutura
AppLayout = SidebarProvider > AppSidebar + SidebarInsetAppLayout—src/components/layout/AppLayout.tsxAppSidebar—src/components/layout/Sidebar.tsx(o arquivo se chamaSidebar.tsxe exportaAppSidebar)`AppHeader—src/components/layout/AppHeader.tsx
AppSidebar
Usa Sidebar collapsible="icon" com:
- Header — logo do Vendee + nome do workspace ativo, em texto. Não há mais troca de workspace pela sidebar (1 login = 1 workspace).
- Content — NavMain (itens de navegação)
- Footer — NavUser (menu do usuário)
- Rail — Barra lateral para toggle
Navegação
Definida em src/lib/navigation.ts:
export const mainNavItems: NavItem[] = [
{ title: "Dashboard", url: ROUTES.dashboard, icon: LayoutDashboard },
{ title: "Negócios", url: ROUTES.deals, icon: Kanban },
{ title: "Contatos", url: ROUTES.contacts, icon: Users },
{ title: "Empresas", url: ROUTES.companies, icon: Building2 },
{ title: "Atividades", url: ROUTES.activities, icon: CalendarCheck },
];
export const settingsNavItem: NavItem = {
title: "Configurações",
url: "/settings",
icon: Settings,
items: [
{ title: "Empresa", url: "/settings/empresa", icon: Building },
{ title: "Equipe", url: "/settings/equipe", icon: UserCog },
// ... 8 sub-items
],
};Adicionar novo item de navegação
- Adicione o item em
src/lib/navigation.ts - O
NavMainrenderiza automaticamente usandoSidebarMenu - Sub-items usam
Collapsiblepara expandir/recolher
AppHeader
Composto por:
SidebarTrigger— Toggle da sidebarSeparator— Divisor visualBreadcrumb— Navegação por caminho
As URLs vêm de ROUTES
☠️ As rotas do app são em português (/negocios, /contatos, /empresas, /atividades) e
nunca são escritas à mão no menu — saem da constante ROUTES em src/lib/constants.ts. Rota
nova entra lá primeiro.
Os quatro grupos da sidebar
O menu é montado por grupo, e cada grupo aparece conforme papel e flags do workspace:
| Grupo | O que traz |
|---|---|
| CRM | Dashboard, Negócios, Contatos, Empresas, Atividades, Propostas + Prospecção, Automações e Base de Clientes (cada um atrás da própria flag) |
| Inteligência | Base de Conhecimento, Aurora e Copiloto — o grupo inteiro só aparece se alguma flag de IA estiver ligada |
| Configurações | montado por getSettingsNavItem(role, settings): itens condicionados a permissão e a flag |
| Admin | só para super admin |
Configurações não é uma lista estática. É função — cada sub-item depende de permissão
(canManageSettings) e, alguns, de flag de workspace. Item novo entra na função, não num array
solto.