Design System

KippiDS

Cópia direta do manual visual do Kippi-DS (docs/manual.html) — mesma marcação, mesmo CSS e mesmo script de demonstração de lá, nunca reescritos aqui. Rodenpm run ds:import sempre que o Kippi-DS mudar; esta página sempre reflete a última importação, nunca uma cópia congelada.

Última importação: 17 de setembro de 2026 · fonte: C:/github/Kippi_design_system/Kippi-Design-System-Methodology/Kippi-DS-V2

Esta página renderiza de verdade os tokens da fundação (00-fundacao/) — é o acompanhamento visual, não a documentação escrita (essa continua nos .md, linkados do índice). Cresce conforme novas categorias e componentes forem fechados.

Fundação

Tokens visuais e a auditoria que os valida — 00-fundacao/.

Cores

Fechado

Âncoras de marca

Roxo de marca#4819B9
Roxo claro#6E51E5
Coral de marca#FF6B6B
Grafite#505050
Grafite claro#C8C8C8
Branco#FFFFFF

Escala de tons — Roxo (posição 10 = âncora)

Escala de tons — Coral

Texto, fundo e ação

text-default#141322
text-secondary#404052
text-muted#59596C
background-page#F1F1F1
surface-subtle#F8F8F8
border-default#C3B6DA
action-primary#4819B9
action-accent#FF6B6B

Feedback

feedback-success#1F7A52
feedback-warning#FF9C5C
feedback-info#4819B9
feedback-danger#D9342B (fechado)

Regra: coral puro nunca como texto/ícone isolado

Coral puro
2,78:1 — falha
Coral corrigido (texto)
75% + preto — 4,69:1
Coral corrigido (ícone)
90% + preto — 3,38:1

Tipografia

Proposto

Display (Ashby — cai para Inter se a fonte não estiver instalada)

display-lg / 40·48
Kippi-DS v2
display-md / 32·40
Kippi-DS v2
display-sm / 24·32
Kippi-DS v2
display-xs / 20·28
Kippi-DS v2

Text (Inter)

text-lg / 18·28
Texto de destaque, corpo maior de leitura.
text-md / 16·24
Corpo de texto padrão da interface Kippi.
text-sm / 14·20
Legenda, rótulo de campo, metadado.
text-xs / 13·18
Texto auxiliar bem pequeno.
text-2xs / 12·16
Metadado discreto.
text-3xs / 11·14
Timestamp, contador, texto legal.

Espaçamento & raio

Proposto

Escala de espaçamento (grid de 4px)

space-1
4px
space-2
8px
space-3
12px
space-4
16px
space-5
20px
space-6
24px
space-7
32px
space-8
40px
space-9
48px
space-10
64px
space-11
96px

Escala de raio

radius-none
radius-sm
radius-md
radius-lg
radius-xl
radius-full

Efeitos

Proposto

Sombra / elevação

elevation-1
elevation-2
elevation-3
elevation-4

Anel de foco — clique e dê Tab no botão

Backdrop blur

blur-sm
blur-md
blur-lg

Movimento

Proposto

duration-fast (150ms) e duration-spin (0,8s) — passe o mouse / observe o giro

Em movimento reduzido (prefers-reduced-motion), a transição do botão quase zera e o spinner só desacelera (nunca para) — ver 00-fundacao/movimento.md.

Logos

Fechado

Matriz de combinações aprovadas

Preferencial · 9.93:1
Preferencial · 9.93:1
Preferencial · 4.82:1
Secundária · 2.78:1
Secundária · 2.78:1
Restrita · 1.88:1

Vetor real do wordmark (assets/logos/kippi-wordmark.svg), embutido uma única vez como <symbol> e reusado nas 6 combinações via <use> — mesma técnica de sprite do v1.

A legenda abaixo do logo (ex. "Secundária · 2.78:1") é texto de interface comum — segue a regra de pareamento on-color normalmente, mesmo quando o logo por cima dela tem contraste baixo por decisão de governança de marca (caso "Restrita"). São duas regras diferentes: a cor do logo vem da matriz de marca (fixa, documentada); a cor do texto ao redor vem do pareamento on-color (calculado). Por isso a legenda sobre coral usa texto escuro, não branco — ver cores.md.

Ícones de interface

Proposto

Solar Icons (Linear, 1.5px) — amostra, cores da marca

Renderizados ao vivo via API pública do Iconify (api.iconify.design) — precisa de internet pra carregar; nomes a confirmar contra o pacote oficial (@iconify-json/solar) quando ele for instalado de verdade no projeto.

início
Início
buscar
Buscar
perfil
Perfil
configurações
Config.
notificações
Notif.
calendário
Calendário
mensagem
Mensagem
curtir
Curtir
favorito
Favorito
excluir
Excluir
concluído
Concluído
cancelar
Cancelar

Solar Icons (Line Duotone) — duas cores da marca

Estilo Line Duotone do Solar (mesmo traço 1.5px do resto do pack, já fechado em icones.md) — cada ícone vem dividido em duas camadas no dado do pack; camada "cheia" recebe action-primary (roxo), camada de apoio recebe action-accent (coral), as duas em opacidade plena — regra já documentada em 00-fundacao/icones.md §Como a cor da Kippi entra (duotone de verdade com as duas cores primárias, não uma cor em duas intensidades). Embutido como SVG inline (dado real de @iconify-json/solar, MIT) — a API pública só recolore com uma cor só, não dá pra pintar as duas camadas separadamente por URL. "Buscar" e "Favorito" são exceções do pack (sem 2ª camada Duotone) — mesma lista já prevista em icones.md.

Início
Buscar
Perfil
Config.
Notif.
Calendário
Mensagem
Curtir
Favorito
Excluir
Concluído
Cancelar

Ícones de atributo (produto)

Fechado

Aplicação primária (branco sobre roxo) e sobre fundo claro

frio 24h
Frio 24h
quente 12h
Quente 12h
parede dupla vácuo
Parede dupla
aço inox 304
Aço inox
eco sustentável
Eco
livre de BPA
Livre de BPA

Auditoria de contraste

Regra fixa — pareamento on-color

Todo par fundo → texto companheiro da fundação, calculado ao vivo

Calculado nesta página em JavaScript, pela fórmula de luminância relativa da WCAG 2.1 (§1.4.3) — não é uma tabela digitada à mão. Se um valor de token mudar no futuro sem atualizar o par, o selo aqui vira "falha" sozinho. Ver a regra completa em cores.md.

Fundo fora da paleta fixa — escolha automática (pickTextColor)

Pra qualquer cor que ainda não é token, a mesma fórmula decide entre text-default e branco — nunca cor fixa "porque geralmente funciona". Teste ao vivo:

Texto de exemplo

Átomos

Peças de interface de menor nível — 02-componentes/.

Botões — 02-componentes

Básico fechado — 6 variantes × 8 tamanhos + estados · Fase 1 de padrões construída

Variantes × forma (pílula / retangular)

Estrutura vem do button.tsx do ReUI (shadcn/ui, MIT) — <button> nativo, anel de foco em :focus-visible, estado desabilitado, aria-invalid. Nada do visual original foi mantido: cada par fundo/texto abaixo é um par on-color já verificado em cores.md. Duas formas por variante: pílula (padrão, radius-full) e retangular (radius-md, 8px) — a mesma cor/estado, só o raio muda. link não tem forma própria (não é uma "caixa"). Documentação completa em botoes.md; código-fonte em button.css (HTML/CSS) e Button.tsx (React/cva).

default
secondary
outline
ghost
destructive
link

Passe o mouse (escurece/clareia) e dê Tab (anel de foco) pra testar ao vivo. Primeira coluna: pílula. Segunda: retangular.

Tamanhos (variante default) — pílula e retangular

xs
sm
default
lg
icon-*

Botão só-ícone sempre leva aria-label — sem texto visível, é o único jeito do leitor de tela saber o que o botão faz.

Com ícone, carregando, inválido, desabilitado — pílula e retangular

ícone esq.
carregando
inválido
desabilitado

Padrões implementados (Fase 1) — copiar com feedback, assíncrono

As duas primeiras composições de prioridade Alta sem dependência nova, catalogadas na área de variações abaixo (marcadas Feito). Clique pra testar de verdade — cópia real (Clipboard API) e uma ação assíncrona simulada. Fonte: padroes.css + padroes.js (HTML/CSS/JS puro) e CopyButton.tsx / AsyncButton.tsx (React). Documentação completa em botoes.md §Padrões implementados.

copiar
assíncrono

Copiar: confirma por 2s (ícone de check + fundo feedback-success) e volta ao normal. Assíncrono: disabled + spinner (~1,2s simulado) → sucesso (~1,6s) → normal. Mudança de estado anunciada via aria-live="polite" pra leitor de tela.

Padrões implementados (Fase 3) — voltar, hambúrguer animado, expansível

As 3 composições de prioridade Baixa sem nenhuma dependência nova. Fonte: padroes.css + padroes.js e HamburgerButton.tsx (React — voltar/expansível são só composição do Button existente, sem componente novo). Documentação completa em botoes.md §Padrões implementados.

voltar
hambúrguer
expansível

Passe o mouse (ou Tab) no hambúrguer e no botão de curtir pra ver a animação. Hambúrguer usa aria-expanded como única fonte de verdade — o CSS lê o próprio atributo, sem classe .is-open separada.

Área de variações — mapa completo (catalogado + já feito)

11 itens catalogados — 6 já feitos, 5 em aberto.

Área de variações — mapa completo (catalogado + já feito)

A página do ReUI tem 60 exemplos; as 6 variantes acima cobrem a base do componente. O restante são composições — o botão básico junto de outra peça (avatar, badge, tooltip) ou de um comportamento extra (animação, JS). Agrupadas por categoria abaixo, cada uma com etiquetas: prioridade pra trazer, do que depende pra existir e, quando já existe, Feito com link pra demo. Fica tudo catalogado aqui, mesmo depois de construído — não é um pedido implícito de construir o resto todo.

Alta não depende de componente novo Média depende de 1 componente que falta Baixa decorativo ou caso de uso estreito nenhuma pronta pra construir hoje Feito já construído — fica catalogado aqui mesmo assim

Conteúdo rico

Botão com avatar (várias combinações de tamanho)
Médiadepende: Avatar
Atalho de teclado (kbd hints) / tooltip
Médiadepende: Tooltip
Multi-linha (ícone + título + descrição)
Baixanenhuma — mas é outro padrão (cartão clicável)

Autenticação

Login social (Remix Icons)
Baixadepende: ícones de terceiro

Decorativo

Toggle de tema (sol/lua animado)
Baixadepende: decisão de produto (dark mode)

Tabela completa (mesmos dados, formato de texto) em botoes.md §Área de variações.

Badges — 02-componentes

Básico fechado — 6 cores × 3 aparências × 3 tamanhos + composições sem dependência

Cores × aparência (preenchido / outline / light)

Estrutura vem do badge.tsx do ReUI (shadcn/ui, MIT) — 6 cores semânticas × 3 aparências. Todo o visual é da fundação Kippi: preenchido usa o par on-color já verificado, outline usa a cor crua como borda/texto (quando passa em contraste), light usa color-mix(cor 15%, white) — mesmo padrão das tags coloridas deste manual. warning é a exceção: cru mede 2,07:1 como texto (falha), por isso outline/light usam a versão escurecida 65% (achado documentado em badges.md). Código-fonte em badge.css e Badge.tsx.

defaultDefaultOutlineLight
secondarySecondaryOutlineLight
destructiveDestructiveOutlineLight
successSuccessOutlineLight
infoInfoOutlineLight
warningWarningOutlineLight

Raio padrão é radius-sm (chip, não pílula) — .k-badge--full pra pílula opcional: Full radius

Tamanhos

smExtra small
mdDefault
lgLarge

Com ícone, removível, ponto de status, como link

ícone Verificado
removível React TypeScript
status dot Online Ausente Offline
como link #design-system

Clique no × pra testar a remoção de verdade (sai do DOM depois da transição de saída). Badge estático não tem anel de foco — só o botão de remover e o badge-como-link, que são os únicos interativos.

Badge de contagem sobre botão

Fecha o item que ficava catalogado em botoes.md §Área de variações, esperando o Badge existir. .k-badge-anchor (wrapper position: relative) + .k-badge--count (posição absoluta, borda de 2px na cor da superfície pra separar do ícone atrás) — usa Badge + Botão básicos, nenhum token novo.

Área de variações — mapa completo

7 itens catalogados — 5 já feitos, 2 em aberto.

Área de variações — mapa completo

Com ícone
Feito
Removível
Feito
Ponto de status
Feito
Como link
Feito
Com Avatar
Médiadepende: Avatar
Com imagem de bandeira
Médiadepende: asset de bandeira

Tabela completa em badges.md §Área de variações.

Formulários

Campos, agrupamento e fluxos em etapas — 02-componentes/.

Campos de formulário — 02-componentes

Básico fechado — Input, Textarea, Select, Checkbox, Radio + Field (rótulo/descrição/erro/agrupamento/separador/orientação); Slider, Switch e OTP catalogados como backlog

Fase aberta por reui.io/components/field — os 11 exemplos do Field só fazem sentido com campos de verdade dentro, então esta rodada construiu Input/Textarea/Select/Checkbox/Radio antes de fechar Field. Documentação completa de cada um: input.md, textarea.md, select.md, checkbox.md, radio.md, field.md.

Input — tamanhos e estados

sm
default
lg
hover
focus
readonly
disabled
inválido

Input — composições (ícone, senha, contador)

ícone
senha
contador
0/60

Textarea

padrão
disabled
inválido
auto-resize
+ contador
0/200

Select

com placeholder
com grupos
disabled
inválido

Checkbox

estados
rótulo +
descrição
grupo inline

Radio

Estados
Plano — com descrição

Setas do teclado alternam entre as opções do mesmo grupo (mesmo name) — comportamento nativo do navegador, testado via Tab + setas.

Field — orientação vertical (padrão)

Aparece no seu perfil público.

Field — orientação horizontal e responsiva

horizontal é fixo (sempre lado a lado); responsive usa Container Query — redimensione a janela do navegador pra ver o segundo grupo virar coluna abaixo de ~480px de largura do próprio contêiner, não da tela inteira.

Arraste o canto do quadro tracejado (só nesta demo) pra simular o contêiner ficando estreito.

Field — separador

ou

Formulário com validação

Constraint Validation API nativa (required, type=email) no submit — setFieldInvalid() liga aria-invalid do controle, o texto de erro e data-invalid do Field juntos. Tente enviar em branco.

Área de variações — mapa completo

11 itens catalogados — 6 já feitos, 5 em aberto.

Área de variações — mapa completo

Select rico (busca, multi-seleção, async)
Médiadepende: Radix Select
Card de checkbox/radio (com Avatar/ícone)
Médiadepende: Card, Avatar
Field com Slider
Baixadepende: Slider
Field com Switch
Baixadepende: Switch
Field com input OTP
Baixadepende: OTP

Tabelas completas por componente: input.md, textarea.md, select.md, checkbox.md, radio.md, field.md.

Formulários — 02-componentes

Fechado (escopo reduzido) — FormActions, FormSummary, FormGrid, FormSuccess; sem fonte externa (o ReUI só tem "Form" como Blocks pagos, não como componente livre) — escopo definido com o usuário via pergunta de escolha

Sem fonte MIT pra restilizar — reui.io/components não tem um "Form" livre, só existe como Blocks pagos (telas de app inteiras, licença comercial). Escopo reduzido ao que o Field ainda não resolve: como o formulário termina (ações), como avisa que algo deu errado antes de caçar campo por campo (resumo), como organiza vários campos lado a lado (grade), e como confirma que deu certo (FormSuccess). Documentação completa: formularios.md.

FormActions — fileira de ações

Alinhamento padrão à direita (ação principal por último, leitura ocidental "fim = confirmar"); variação --between separa uma ação de escape (ex.: "Limpar") na ponta oposta sem trocar a ordem no HTML — a ordem de tabulação (Tab) continua igual à leitura visual esquerda→direita. Variação --sticky (fileira fixa no fim da tela, formulário longo) está implementada mas não demonstrada ao vivo aqui — a maioria dos formulários do catálogo é curta o bastante pra não precisar.

padrão (à direita)

--between (ação de escape à esquerda)

FormSummary — resumo de erros no topo

Ao enviar com erro, o foco vai pro resumo (não pro primeiro campo) — cada item da lista foca e rola até o campo certo. Sem role="alert" de propósito (ver formularios.md §Acessibilidade — evita anúncio duplicado pelo leitor de tela). Tente enviar em branco.

FormGrid — grade responsiva

Container Query, mesma técnica do Field responsivo (ver §Campos de formulário) — redimensione o quadro tracejado (só nesta demo) pra ver a grade colapsar pra 1 coluna abaixo de ~560px de largura do próprio contêiner. "Endereço" ocupa a largura inteira da grade (k-form-grid-span-full) mesmo com 2 colunas ativas.

FormSuccess — confirmação pós-envio

Contraste deliberado com FormSummary: role="status" (educado, não interrompe o leitor de tela) em vez de role="alert", e o foco NÃO se move pra dentro dela — depois de um envio bem-sucedido não sobra nada que a pessoa precise fazer. Mesmo ícone de check usado em Botões (copiar com feedback / ação assíncrona).

Área de variações — mapa completo

5 itens catalogados — todos já feitos.

Stepper — 02-componentes

Fechado (escopo reduzido) — reimplementado sem Radix UI/Base UI (a fonte usa uma das duas); aria-current="step" em vez do padrão role="tablist"/"tab" da fonte, decisão registrada — ver stepper.md §Acessibilidade

Etapa concluída = <button> clicável (volta pra editar); etapa atual e futuras = <span> não-interativo — sem pular etapas à frente. Indicador numerado vira check ao concluir; conector herda a cor da etapa à esquerda, esticando de ponta a ponta entre indicadores (posicionado, não depende mais da largura do texto). Na horizontal, título/descrição ficam abaixo do indicador, alinhados à esquerda, com largura fixa (quebra linha se a descrição for longa — ver etapa "Pagamento"); na vertical continuam ao lado. Variante de cor com bullets coral (linhas sempre roxas) disponível nas duas orientações — ver bloco abaixo. Documentação completa: stepper.md.

Horizontal — com navegação

Avance com "Próximo" (marca a etapa como concluída) ou clique numa etapa já concluída pra voltar direto a ela.

Vertical

Mesma estrutura de gatilho, etapas empilhadas — conector vira uma linha vertical de altura fixa (48px) sob o indicador.

Variante de cor — bullets coral

Mesmo componente, indicador preenchido em --action-accent (coral de marca) em vez de --action-primary (roxo) — o conector continua sempre roxo nas duas orientações. Número/check usam --text-default (texto escuro), nunca branco sobre coral — ver cores.md §Pareamento on-color.

Área de variações — mapa completo

10 itens catalogados — 5 já feitos, 5 em aberto.

Área de variações — mapa completo

Indicador numerado → check ao concluir
Feito
Orientação horizontal + vertical
Feito
Etapas concluídas clicáveis (voltar pra editar)
Feito
Título + descrição opcional
Feito
Variante de cor — bullets coral, conector roxo
Feito
Barra de progresso (contínua/segmentada)
Baixasem necessidade real ainda
Estado de carregamento (spinner na etapa)
Baixasem necessidade real ainda
Títulos inline (mesma linha do indicador)
Baixasem necessidade real ainda
Ícones/badges customizados no indicador
Baixasem necessidade real ainda
Colapso automático pra vertical (Container Query)
Baixanão pedido ainda

Documentação completa: stepper.md.

Wizard — 02-componentes

Fechado — composição de Stepper + Field + FormActions/FormSuccess, sem fonte externa (mesma situação de Formulários) — ver wizard.md

"Próximo" valida só os campos da etapa ATUAL (Constraint Validation API escopada ao painel, não ao formulário inteiro) — as outras etapas nem precisam estar preenchidas ainda. "Anterior" e clicar numa etapa já concluída no Stepper voltam sem validar nada. Na última etapa o botão vira "Enviar"; ao dar certo, o painel é trocado por um FormSuccess e o Stepper mostra todas as etapas como concluídas. Documentação completa: wizard.md.

Criar conta — 3 etapas

Tente clicar em "Próximo" sem preencher — só os campos da etapa visível ficam inválidos. Depois de enviar, clique em qualquer etapa concluída no indicador acima pra revisar o que foi preenchido.

Área de variações — mapa completo

6 itens catalogados — 4 já feitos, 2 em aberto.

Área de variações — mapa completo

Validação por etapa (só o painel atual)
Feito
Sincronização automática com o Stepper
Feito
Voltar pra etapa concluída (sem validar)
Feito
FormSuccess na etapa final
Feito
Transição animada entre painéis
Baixamesmo item ainda aberto em Tabs
Salvar rascunho entre etapas (localStorage/API)
Baixasem necessidade real ainda

Documentação completa: wizard.md.

Navegação

Como o usuário se move dentro de uma tela e entre elas — 02-componentes/.

Controles de conteúdo
Menus do site

Drawer — 02-componentes

Fechado — sem fonte externa MIT (comportamento é o padrão público WAI-ARIA "Dialog (Modal)"), estrutura consultada em Kippi-DS/referencia/menus.md (v1, estilo 6), não copiada — ver drawer.md §Fonte

Primeiro overlay verdadeiramente modal do v2: foco preso dentro do painel (Tab/Shift+Tab não escapam), Escape fecha, scroll da página bloqueado enquanto aberto. Clique no hambúrguer, tecle Tab pra sentir o foco preso, ou clique no véu/no X pra fechar. Documentação completa: drawer.md.

Cortina — abre pela direita

O visual do gatilho reaproveita .k-btn-hamburger de Botões, mas não usa initHamburgerButtons — o Drawer sincroniza o próprio aria-expanded/aria-label do gatilho junto com a animação, véu e foco preso, coisas que o padrão simples de Botões não faz.

Cortina — abre pela esquerda

data-side="left" — mesma peça, só inverte o lado que desliza; útil quando o gatilho mora numa sidebar/app shell em vez de uma navbar de site.

Área de variações — mapa completo

7 itens catalogados — 6 já feitos, 1 em aberto.

Área de variações — mapa completo

Painel deslizante com véu
Feito
Lado direito / esquerdo
Feito
2º nível em acordeão (grid-template-rows)
Feito
Foco preso (Tab/Shift+Tab) + Escape
Feito
Scroll do body bloqueado (com compensação de scrollbar)
Feito
Rolagem própria do painel
Feito
Aba fixa lateral (padrão "6b" do v1, específico do menu do manual)
Feitovia composição própria, fora do componente — ver a aba "Menu" no topo desta página e drawer.md §Decisões

Documentação completa: drawer.md.

Seletor de idioma — 02-componentes

Fechado — sem fonte externa MIT, composição de Menu (dropdown, incluindo o novo role="menuitemradio") — bandeiras: Flagpack (MIT) — ver seletor-idioma.md §Fonte

Clique no gatilho pra abrir a lista — setas cima/baixo navegam, Home/End pulam pro primeiro/último, Escape fecha. Rótulos em endônimo (cada idioma no nome que usa pra se chamar), item selecionado com check. Duas variantes da mesma engine: gatilho completo (bandeira + rótulo) e compacto (só bandeira — o rótulo continua no DOM como .sr-only, dá o nome acessível ao botão). Documentação completa: seletor-idioma.md.

Completo

Compacto

Área de variações — mapa completo

5 itens catalogados — 4 já feitos, 1 em aberto.

Área de variações — mapa completo

Gatilho completo (bandeira + rótulo em endônimo)
Feito
Gatilho compacto (só bandeira, rótulo .sr-only)
Feito
Item selecionado com check (menuitemradio)
Feito
Teclado — setas/Home/End/Escape (herdado do Menu)
Feito
Detecção de idioma do navegador como padrão inicial
Baixaver seletor-idioma.md §O que fica em aberto

Documentação completa: seletor-idioma.md.

Barra inferior mobile — 02-componentes

Fechado — sem fonte externa MIT, estrutura consultada em Kippi-DS/referencia/menus.md (v1, estilo 9) — composição do Badge (contador) — ver barra-inferior-mobile.md §Fonte

Navegação principal em telas pequenas, limitada a 5 destinos. Clique num item pra ver o estado ativo trocar. Documentação completa: barra-inferior-mobile.md.

Início

Tela do app — só pra mostrar a Barra inferior no contexto de uma tela de celular de verdade.

Área de variações — mapa completo

5 itens catalogados — todos já feitos.

Área de variações — mapa completo

5 destinos, ícone + rótulo
Feito
Item ativo
Feito
Contador composto (Badge)
Feito
Área de toque ≥48px (Material Design 3)
Feito
Respeita a área segura do aparelho (notch/home indicator)
Feito

Documentação completa: barra-inferior-mobile.md.

Dados

Exibir e enviar conjuntos de dados — 02-componentes/.

Tabela — 02-componentes

Fechado — reconstruída do zero a partir do sistema anterior (mesmo conjunto de estados), com a arquitetura de RENDER já usada em Paginação/Stepper — ver tabela.md §Arquitetura pra comparação de código

initTable(container, { columns, rows, rowActions }) monta tudo a partir de dados — nenhuma linha é HTML escrito à mão (o sistema anterior repetia o mesmo menu de 3 ícones 9 vezes). Redimensione a janela abaixo de ~640px pra ver a mesma tabela virar lista de cartões (mesmos dados, sem uma segunda versão estática desalinhada). Documentação completa: tabela.md.

Pedidos — conjunto completo

Ordenação (clique num cabeçalho), seleção com barra de ações em lote, paginação, busca, densidade, colunas ocultáveis ("Colunas"), linha expansível (chevron), edição inline (duplo-clique ou Enter no campo "Qtd."), cabeçalho e coluna de ações fixos na rolagem, chips de filtro removíveis e estados simulados de carregando/vazio/erro.

Área de variações — mapa completo

14 itens catalogados — 12 já feitos, 2 em aberto.

Área de variações — mapa completo

Ordenação por coluna (aria-sort)
Feito
Seleção múltipla + barra de ações em lote
Feito
Paginação (reaproveita Pagination)
Feito
Busca
Feito
Densidade (padrão/compacta/confortável)
Feito
Colunas ocultáveis
Feito
Linha expansível (detalhe)
Feito
Edição inline (mouse + teclado)
Feito
Cabeçalho + coluna de ações fixos (sticky)
Feito
Chips de filtro removíveis
Feito
Estados: carregando/vazio/erro
Feito
Responsivo: vira lista de cartões (genuíno, mesmo DOM)
Feito
Detecção automática de "vazio" a partir de rows.length === 0
Baixahoje só via toggle "Simular estado" — ver tabela.md §Ainda em aberto
Ordenação/filtro no servidor (paginação real)
Baixasem API real ainda

Documentação completa: tabela.md.

Upload — 02-componentes

Fechado — sem código-fonte MIT acessível nesta sessão (registro do ReUI bloqueado), reconstruído do ESCOPO documentado em reui.io/components/file-upload — ver upload.md §Fonte

Motor único (initUpload(container, options)) com uma opção variant que troca a aparência — dropzone (multi-arquivo), avatar (single, círculo), cover (single, retângulo). Progresso é simulado (sem backend, igual ao resto do catálogo). A grade ordenável (sortable) foi uma escolha explícita do usuário — trouxe @dnd-kit pra versão React; a vanilla reordena com a Drag and Drop API nativa do HTML5, sem lib nenhuma. Documentação completa: upload.md.

Dropzone — múltiplos arquivos

Clique, tecle Enter/Espaço ou arraste arquivos do sistema pra cima da área tracejada. Tente soltar um arquivo maior que 5MB ou um tipo fora de image/*,.pdf pra ver a validação recusar antes de virar item da lista.

Avatar — arquivo único, círculo

Capa — arquivo único, retângulo

Grade ordenável

Arraste uma miniatura sobre outra pra trocar de posição (arraste nativo do navegador nesta demo). Mesmo comportamento visual da versão React com @dnd-kit — a diferença fica só no motor por baixo, ver upload.md §Stack.

Área de variações — mapa completo

10 itens catalogados — 8 já feitos, 2 em aberto.

Área de variações — mapa completo

Dropzone (clique + arrastar-soltar)
Feito
Validação de tipo/tamanho/quantidade
Feito
Progresso simulado por item
Feito
Miniatura de imagem (object URL)
Feito
Avatar (single, círculo)
Feito
Capa (single, retângulo)
Feito
Grade ordenável (arrastar pra reordenar)
Feito
Remover arquivo (libera object URL)
Feito
Reordenar a grade por teclado
Baixaver upload.md §O que fica em aberto
Variação "card" / "tabela" do escopo do ReUI
Baixalista padrão já cobre o caso de uso — ver upload.md

Documentação completa: upload.md.