Shell e layouts
Variações do shell do Core, slots de layout, layouts por rota e páginas por blocos declarativos.
O shell — cabeçalho, menu lateral, área principal, estados de sessão — pertence ao Core. Você o configura, não o reimplementa.
Configuração do shell
defineOonApp({
// ...
shell: {
shell: "default", // "default" | "portal" | "content-only" | "custom:<chave>"
sidebar: "core", // "core" | "none" | "custom:<chave>"
topbar: "core",
header: "none", // "none" | "custom:<chave>"
footer: "none", // "core" | "none" | "custom:<chave>"
assistant: "none", // "core" | "none" | "custom:<chave>"
},
});
| Shell | Uso |
|---|---|
default |
Central operacional com menu lateral e cabeçalho |
portal |
Portais e cockpits |
content-only |
Apenas a área de conteúdo |
custom:<chave> |
Componente registrado em layouts |
Slots de layout
import { ThemeToggle } from "../components/ThemeToggle";
import { OrgSwitcher } from "../components/OrgSwitcher";
defineOonApp({
// ...
layouts: {
topbarEnd: ThemeToggle, // à direita do avatar no cabeçalho
organization: OrgSwitcher, // seletor de organização no cabeçalho
},
});
Os slots recebem { app, menu }. Para o seletor de organização, use CoreOrganizationSwitcher do UI Kit.
Layout por rota
function WorkspaceLayout({ children }: { children: React.ReactNode }) {
return <div className="workspace">{children}</div>;
}
defineOonRoutes([{ path: "/pedidos", component: PedidosPage, layout: WorkspaceLayout }]);
O layout envolve somente a rota declarada, dentro do shell.
Páginas por blocos
Para telas simples, declare blocos em vez de escrever React:
defineOonApp({
// ...
pages: [
{
path: "/inicio",
label: "Início",
section: "Visão geral",
blocks: [
{ type: "markdown", content: "## Bem-vindo\nAcompanhe a operação do dia." },
{ type: "navigation.cards", columns: 3, cards: [
{ title: "Pedidos", description: "Acompanhe pedidos", href: "/pedidos" },
{ title: "Fornecedores", href: "/fornecedores" },
] },
{ type: "collection.datagrid", model: "Pedido", mode: "dynamic" },
{ type: "custom", component: "GraficoMensal" },
],
},
],
components: { pageComponents: { GraficoMensal } },
});
| Bloco | Descrição |
|---|---|
markdown |
Texto em Markdown |
section |
Agrupa blocos com título e descrição |
navigation.cards |
Cards de navegação (1–4 colunas) |
collection.datagrid |
Grid de uma model |
collection.cards |
Cards de uma model |
custom |
Componente de pageComponents |
collection.form, pipeline.board, document.viewer, dashboard.kpi, tabs |
Blocos genéricos |
Páginas aceitam public, layout (default, content-only, portal), permissions, capabilities, hidden e order. Páginas ocultas continuam acessíveis por ações do shell (por exemplo, /configuracoes aberta pelo ícone de engrenagem).
Regra de ouro
Não recrie shell, menu, roteamento e providers. Overrides são para: campo especial, ação específica, card, cabeçalho, dashboard, integração visual pontual ou aba customizada da modal de detalhe.