KDS
Display

Separator

Linha fina semântica ou decorativa para dividir grupos de conteúdo.

Overview

Separator é um divisor visual entre grupos de conteúdo. Constrói em cima do @radix-ui/react-separator, o que dá um detalhe importante de acessibilidade: o flag decorative controla se o separador é exposto a leitores de tela (role="separator" com aria-orientation) ou tratado como ornamento puro (role="none").

A pergunta que precede a inclusão de um Separator é: a respiração do espaço não está bastando? Espaçamento entre seções (space-y-6, gap-8) costuma comunicar agrupamento sem nenhum traço — só recorra ao Separator quando o agrupamento precisa ser explícito ou quando o ar disponível é escasso (sidebar de 240px, toolbar densa).

Preview
Separador horizontal padrão.

Linha de cima

Linha de baixo

Anatomy

<Separator
  ├─ [data-slot="separator"]
  ├─ [data-orientation="horizontal" | "vertical"]
  ├─ orientation = "horizontal" (default) | "vertical"
  └─ decorative = true (default) | false
/>

A altura/largura do separador é 1px em qualquer eixo. No horizontal ocupa 100% da largura disponível; no vertical precisa de um container flex com altura definida — caso contrário ele colapsa.

Usage

import { Separator } from "@kalvner/kds/display/separator";

export function SettingsHeader() {
  return (
    <div className="space-y-1">
      <h3 className="text-sm font-semibold">Conta</h3>
      <p className="text-sm text-muted-foreground">
        Email, senha, idioma.
      </p>
      <Separator className="my-4" />
    </div>
  );
}

Props

PropTipoDefaultDescrição
orientation'horizontal' | 'vertical''horizontal'Eixo do separador.
decorativebooleantrueQuando true, expõe role="none" (ornamento). Quando false, expõe role="separator" semântico.
...restReact.ComponentProps<'div'>Tudo o que <div> aceita (className, id, aria-*).

Variants

Horizontal
Default — divide blocos empilhados.

Bloco A

Bloco B

Vertical
Divide grupos lado a lado em uma linha.
Esquerda
Centro
Direita

States

Decorative (default)
role="none" — ignorado por leitores de tela.

Hoje

Ontem

Semantic
decorative=false expõe role="separator".

Hoje

Ontem

Composition

Settings sections
Cada bloco de settings termina com um Separator.

Conta

Email, senha, idioma.

Notificações

Push, email, resumo.

Aparência

Tema, densidade.

Toolbar groups
Vertical separators entre grupos de ações.

When to use

  • Para terminar um agrupamento dentro de um Card denso, quando a respiração natural não basta.
  • Em sidebars estreitas onde o espaço para space-y-6 não cabe.
  • Em toolbars horizontais para isolar grupos de ações relacionadas.
  • Em listas de eventos/atividades para marcar a transição entre janelas temporais (Hoje, Ontem, Semana passada).

When not to use

  • Como elemento decorativo aleatório — se a função do separador não é dividir grupos, ele vira ruído visual.
  • Para separar título e descrição dentro de um mesmo bloco — tipografia e espaçamento já fazem isso.
  • Como borda inferior de Card — use border-b direto no Card.
  • Para dividir colunas de uma tabela — a tabela já tem grid lines.

Best practices

  • Ar primeiro, separador depois. Aumente gap-* e veja se o agrupamento já fica claro. Separador é a última camada de hierarquia visual.
  • Decorativo é o default certo. Em 99% dos casos, o separador não carrega significado para leitor de tela. Só passe decorative={false} quando o contexto realmente muda (Hoje vs Ontem em um feed cronológico, por exemplo).
  • Vertical exige container com altura. Sem altura definida no flex parent, o separador colapsa para 0px. Use h-8, h-full ou um wrapper com altura conhecida.
  • Mantenha a mesma cor (bg-border). Não invente tokens de separador — use a borda padrão do tema. Se precisar de um divisor mais forte, considere se um Card ou Section seria mais adequado.

Accessibility

ConcernComportamento
RolesQuando decorative={true} (default): role="none". Quando decorative={false}: role="separator" com aria-orientation.
KeyboardNão recebe foco — separador não é interativo.
Screen readerNo modo decorativo, leitor de tela ignora. No modo semântico, anuncia "separator" e a orientação.
Contrastebg-border é um cinza muito sutil — ele cumpre o papel de respiração visual, não de elemento informacional. Não dependa do separador para transmitir informação crítica.
Mobile / touchNão aplicável — separador é estático.
  • Card — wrapper que costuma alojar Separators internos entre suas seções.
  • Stack — quando gap resolve, o Separator não é necessário.

On this page