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
Âncoras de marca
Escala de tons — Roxo (posição 10 = âncora)
Escala de tons — Coral
Texto, fundo e ação
Feedback
Regra: coral puro nunca como texto/ícone isolado
2,78:1 — falha
75% + preto — 4,69:1
90% + preto — 3,38:1
Tipografia
Display (Ashby — cai para Inter se a fonte não estiver instalada)
Text (Inter)
Espaçamento & raio
Escala de espaçamento (grid de 4px)
Escala de raio
Efeitos
Sombra / elevação
Anel de foco — clique e dê Tab no botão
Backdrop blur
Movimento
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
Matriz de combinações aprovadas
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
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.
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.
Ícones de atributo (produto)
Aplicação primária (branco sobre roxo) e sobre fundo claro
Auditoria de contraste
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:
Átomos
Peças de interface de menor nível — 02-componentes/.
Botões — 02-componentes
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).
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
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
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: 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.
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.
Badges — 02-componentes
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.
Raio padrão é radius-sm (chip, não pílula) — .k-badge--full pra pílula opcional: Full radius
Tamanhos
Com ícone, removível, ponto de status, como link
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.
Formulários
Campos, agrupamento e fluxos em etapas — 02-componentes/.
Campos de formulário — 02-componentes
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
Input — composições (ícone, senha, contador)
Textarea
+ contador
Select
Checkbox
descrição
Radio
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
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.
Formulários — 02-componentes
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
aria-current="step" em vez do padrão role="tablist"/"tab" da fonte, decisão registrada — ver stepper.md §AcessibilidadeEtapa 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.
Wizard — 02-componentes
"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.
Navegação
Como o usuário se move dentro de uma tela e entre elas — 02-componentes/.
Drawer — 02-componentes
Kippi-DS/referencia/menus.md (v1, estilo 6), não copiada — ver drawer.md §FontePrimeiro 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.
Seletor de idioma — 02-componentes
role="menuitemradio") — bandeiras: Flagpack (MIT) — ver seletor-idioma.md §FonteClique 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.
Barra inferior mobile — 02-componentes
Kippi-DS/referencia/menus.md (v1, estilo 9) — composição do Badge (contador) — ver barra-inferior-mobile.md §FonteNavegaçã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.
Área de variações — mapa completo
5 itens catalogados — todos já feitos.
Dados
Exibir e enviar conjuntos de dados — 02-componentes/.
Tabela — 02-componentes
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.
Upload — 02-componentes
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.