Pular para o conteúdo
Palco de tela

Padrões de tela

Palco de tela

O cabeçalho de toda tela com sub-telas. Duas colunas de 288px lado a lado — a sidebar em surface, o palco em bg — e o conteúdo no resto. Na faixa vivem o ícone em bolha, o título, o subtítulo e o rail inteiro: o título deixa de ser texto que rola e vira endereço fixo.
components/page-stage.tsx/ajustes · /configuracoesgrade de 3 colunas

A grade

Na tela você vê três faixas; no código são DUAS grades. A sidebar de 288px é do shell do app e existe em toda tela; o PageStage acrescenta lg:grid-cols-[18rem_minmax(0,1fr)] — a faixa da tela mais o conteúdo. Nenhum teto de largura: a régua do app é uma só.
[288 sidebar | 288 palco | gap phi-4 | 1fr conteúdo] · palco pt-3.75 pr-phi-3 pl-10 · conteúdo pt-13.75 pb-phi-5 pr-10 · escala 1:2
FaixaMedidaToken
Sidebar do app (é do shell)288pxw-72 · bg-surface · border-r
A grade do palco288px + o restolg:grid-cols-[18rem_minmax(0,1fr)] · a faixa em bg-bg
Calha palco → conteúdo28 → 42pxlg:gap-x-phi-4
Conteúdoresto (sem teto)minmax(0,1fr)
Respiro na direita40pxlg:pr-10
Topo do palco15pxlg:pt-3.75
Recuo do título40pxlg:pl-10
Bolha do ícone26px · ícone 14size-6.5 bg-brand-muted
Bolha → título14pxlg:gap-3.5
Título26 → 33pxtext-phi-display font-bold
Título → subtítulo4pxmt-1 text-sm text-fg-muted
Bloco do título → rail26pxmt-phi-3
Topo do conteúdo55px (= 15 + 26 + 14)lg:pt-13.75
Pé do conteúdo40 → 68pxpb-phi-5
Entre cards26pxspace-y-phi-3

As duas linhas invisíveis

Nenhuma das medidas acima é gosto. Duas linhas mandam nas três colunas, e mexer numa parcela obriga a mexer na conta.

A linha da marca

A bolha do ícone tem os mesmos 26px do HipercliniMark da sidebar, e o centro dela cai no centro do cabeçalho h-14 — 28px, onde já moram a marca e o botão de recolher. Daí os 15px do topo do palco: 28 − 13.

A linha do título

O conteúdo entra em 55px (15 do topo + 26 da bolha + 14 do gap), então o topo do primeiro card nasce na linha do topo da CAIXA do título, não na do ícone. Mexeu em qualquer uma das três parcelas, mexe no lg:pt-13.75 junto.

Por isso os dois valores são fixos, e não o phi-4 fluido; o sticky do miolo usa o mesmo top-3.75 do padding, senão o bloco saltaria na primeira rolagem.

Como se usa

Quem monta o PageStage ganha as duas linhas de graça — o alinhamento nunca se refaz na mão.
layout.tsx — SÍNCRONO
// loading.tsx embrulha a PAGE, nunca o layout do mesmo segmento: um await
// aqui faz o boundary de cima piscar antes de o palco aparecer.
export default function AjustesLayout({ children }) {
  return (
    <PageStage
      icon={SlidersHorizontal}
      title="Ajustes"
      description={<Suspense fallback={…}><Descricao /></Suspense>}
      rail={<Suspense fallback={…}><RailComPapel /></Suspense>}
    >
      {children}
    </PageStage>
  )
}

// page.tsx — a pilha de cards e o gap entre eles são da PÁGINA, não do palco.
return <div className="space-y-phi-3">{/* cards */}</div>

NotaPalco cheio: quando o conteúdo é UMA caixa

Uma tela cujo conteúdo é uma caixa só (a entrevista de custos) pede que a caixa vá até o fim, com a mesma faixa de fundo em cima e embaixo — 55px dos dois lados. Quem pede é o próprio conteúdo, pelo atributo data-palco-cheio; o palco reage por :has() em vez de uma prop, porque entre ele e a caixa há um layout de segmento que não sabe (nem deve saber) em que modo a tela está.

Armadilha já pagaO layout do palco é síncrono

Um await no layout faz o boundary de cima piscar antes de o palco existir — a tela pisca inteira em vez de esqueletizar só o miolo. O que precisa de dado entra em Suspense como prop (descrição, rail com papel), não no corpo do layout.

No celular

Abaixo de lg a grade se desfaz e tudo volta a ser coluna única.
PeçaComportamento
A faixaVira cabeçalho empilhado: bolha + título + subtítulo, um sobre o outro.
O railVira tira horizontal com rolagem e fade na borda direita.
Os paddings fixosSomem: o pt-phi-4 fluido volta a valer.
O conteúdoColuna única (regra 11).

Em uso hoje: /ajustes — onde o palco cobre as 11 sub-telas, precificação inclusive — e /configuracoes.