Pular para o conteúdo
Forma & elevação

Fundações

Forma & elevação

Regra de bolso: toca = pílula · contém = canto 16. Duas formas no vocabulário, mais o canto interno derivado — é isso que faz qualquer tela ser reconhecível de longe. Elevação vem de borda 1px e um fio de sombra; sombra pesada só no que FLUTUA.
--radius: 0.75rem3 formas + 2 exceções4 níveis de elevação

O vocabulário de forma

Três formas. A pergunta que decide não é o tamanho do elemento — é o que ele FAZ.

Pílula

rounded-full

Tudo que você TOCA ou lê como estado: botão, campo de uma linha, filtro, badge, avatar, item de nav, tooltip, barra de ações.

Canto 16

rounded-xl · 16px

Tudo que CONTÉM coisas: card, modal, tabela, menu aberto, painel, aviso, textarea, bloco de código.

Interno

rounded-md · 10px

Só DENTRO de um contêiner (canto externo − padding): item de menu, linha de escolha, tapete de edição, bolha de chat, código inline.

A conta dos raios

Tudo deriva de um token só. Mexer nele muda o app inteiro de forma coerente — e é por isso que ele nunca é mexido por capricho.
globals.css
--radius: 0.75rem;                     /* 12px — a base do remap */

--radius-sm:  calc(var(--radius) - 4px);  /*  8px */
--radius-md:  calc(var(--radius) - 2px);  /* 10px  ← o canto interno */
--radius-lg:  var(--radius);              /* 12px */
--radius-xl:  calc(var(--radius) + 4px);  /* 16px  ← o "contém" */
--radius-2xl: calc(var(--radius) + 8px);  /* 20px */

Armadilha já pagaO 2xl precisa ser declarado

Sem a última linha, rounded-2xl fica no default do Tailwind v4 (16px) — igual ao xl remapeado — e quem pede um canto MAIOR recebe o mesmo canto, sem nenhum erro na tela.
ClasseValorUso canônico
rounded-full9999pxToca ou é estado
rounded-2xl20pxPeça flutuante grande: a barra de ações em massa e o cartão de agendamento da agenda
rounded-xl16pxContém — e é o raio do toast (o Sonner recebe calc(--radius + 4) = 16px)
rounded-lg12pxRaro — a base crua, quase nunca usada direta
rounded-md10pxItem interno
rounded-sm8pxPraticamente não usado
rounded-[6px]6pxExceção única: checkbox

As exceções — e só elas

ElementoFormaPor quê
Checkboxrounded-[6px]Redondo pareceria radio (opção única). É a única medida fora da escala no app inteiro.
Textarearounded-xlMulti-linha não funciona como pílula: a curva cortaria a primeira linha.
Recorte de visão (segmented control)trilho rounded-full bg-ink-100 p-1O botão ativo vira uma pílula de superfície com shadow-xs dentro do trilho. É o que o app usa em Cadastros e na Agenda — ver Navegação.
Slot de OTProunded só nas pontasfirst:rounded-l-md last:rounded-r-md — o conjunto lê como um campo só.
CTAnunca retângulo de canto médioPílula ou nada. Botão rounded-md no meio de uma tela de pílulas parece de outro sistema.

Sim

Buscar paciente…FiltroAtivos 12

Mesma linha, mesma forma, mesma altura (h-8): busca, filtro e estado falam a mesma língua.

Não

Buscar paciente…FiltroAtivos 12

Três formas e três alturas na mesma fileira: o olho lê dois ou três sistemas diferentes na mesma tela.

Bordas

Uma espessura, um token, e uma regra global que quase ninguém precisa saber que existe.
globals.css — a borda padrão de TODO elemento
@layer base {
  * { @apply border-border outline-ring/50 }
}

/* Efeito: escrever `border` (sem cor) já pinta a cor certa do tema.
   `border-input` existe pro campo: é alias de --border, mas nomeia o papel. */
SituaçãoReceita
Card, painel, tabelaborder border-border
Campo de formulárioborder border-input
Estado vazioborder border-dashed border-border
Separador dentro de cardborder-t border-border (ou divide-y no pai)
Separador de menuh-px bg-border
Fio vertical entre botõesw-px bg-border (com my- pra não colar)
Item selecionado num cartão de resumoborder-brand ring-1 ring-brand

Borda de 2px não existe no vocabulário — o único traço mais grosso é o sublinhado da aba ativa (border-b-2), e ali ele é tipografia, não moldura.

Elevação

Quatro níveis reais no app, do card quase plano ao modal. Cada degrau tem um motivo funcional: o que sobe é o que FLUTUA sobre o resto.

1 · Plano

Card padrão: border shadow-xs. Um fio de borda e um fio de sombra — o nível mais comum do app inteiro.

2 · Flutuante

Dropdown, tooltip, modal, popover e a barra de ações em massa: shadow-md ring-1 ring-foreground/5.

3 · Alto

Peça fixa que se sobrepõe a uma tela inteira: shadow-xl. Em uso no cartão de agendamento e na barra de confirmar remarcação da agenda.

4 · Bloco em edição

--shadow-lift: a sombra do foco em camadas. É a única sombra grande que aparece em conteúdo, não em overlay.

Os tokens de sombra

A escala do Tailwind (xs…2xl) foi roteada por variáveis do tema: os valores são os defaults da v4 no claro, e cada tema escuro reescreve a tinta — sombra preta sobre fundo preto não desenha nada.
TokenValor no ClaroO que veste
--shadow-card0 1px 2px 0 rgb(0 0 0 / .05)Card em repouso (= shadow-xs)
--shadow-lift0 15px 40px -5px rgb(0 0 0 / .15) + fio de bordaBloco em edição no foco em camadas
--shadow-rise0 -4px 16px -8px rgb(0 0 0 / .12)Sombra que sobe, pra barra colada no rodapé. DECLARADO nos cinco temas e ainda sem consumidor — a barra de ações em massa usa shadow-md. Existe pro dia em que uma barra inferior precisar dele; até lá, não é canon de nada.
--shadow-glow-ia0 -8px 40px -12px rgb(124 58 237 / .35)O halo do dock do agente — acompanha o fúcsia no tema Azul
--sh-xs … --sh-2xlescala padrão, tinta por temashadow-xs … shadow-2xl

Armadilha já pagaSombra colorida é sempre um token próprio

As utilities de sombra apontam pra uma var OPACA. Isso significa que compor cor na classe (shadow-sm shadow-brand/20) deixa de funcionar em silêncio — nada quebra, a sombra só sai na cor do tema. Precisa de sombra colorida? Declare um token, como o --shadow-glow-ia.

No escuro, elevação é TOM

Sombra preta não desenha sobre fundo escuro. Nos três temas escuros, o que sobe fica mais claro (--surface-2) e ganha um fio de luz na borda — 0 0 0 1px rgb(255 255 255 / 0.04) no lugar do fio de sombra. E as sombras de overlay ficam MAIS fundas, não menos: no tema Ardósia, que não vai ao preto, elas são as mais fundas de todas, justamente porque o fundo é mais claro.

Anel vs. borda

Duas coisas parecidas com trabalhos diferentes. Confundir as duas é o que produz moldura dentro de moldura.
RecursoPara que serveRegra
borderDesenhar o limite de um objeto: onde ele começa e termina.Ocupa layout. É permanente.
ringMarcar um ESTADO temporário: foco, seleção, o card que está sendo editado.Não ocupa layout (desenha por fora). Aparece e some.
ring-1 ring-foreground/5O fio de definição de superfícies flutuantes.Vai junto do shadow-md em menu, tooltip e modal — é o que separa o painel do fundo quando a sombra é sutil.
ring-[3px] ring-ring/50O anel de foco do canon.Mesma medida em todo alvo clicável. Ver Foco & acessibilidade.

NuncaUm anel por cena

O anel é do CAMPO. O bloco em edição marca o lugar pela ELEVAÇÃO, e o card devolve a borda neutra enquanto se edita. Anel dentro de anel dentro de anel lê como moldura, não como hierarquia — duas versões já foram recusadas por isso.