Konde Design Framework

O i18n cuida da tradução.
O KDF cuida do seu design.
E os dois vivem no JSON.

Uma camada de coordenação de design em JSON focada em web apps SSR (server-side) e UIs feitas com a ajuda de agentes. Decisões que se repetem — layout, espaçamento, tipografia, estilos de componentes — vivem em uma única fonte da verdade que seus agentes leem de forma clara, sem precisar caçar estilos perdidos por arquivos, páginas e sessões.

Veja como funciona
kdf / homepage.json → renderizado
kdf/homepage.json
{
  "$layout": ["hero", "footer"],
  "hero": {
    "wrapper": "mx-auto max-w-6xl px-6 py-20",
    "title":   "@typography.h1",
    "cta-primary": "@button.cta"
  }
}
data-kdf="hero.title"
Crie e lance com IA.
data-kdf="hero.body"

Uma única fonte da verdade mantém cada página, componente e sessão dos agentes totalmente consistentes.

data-kdf="hero.cta-primary"
Começar agora →

O JSON define · o código renderiza · data-kdf faz o mapeamento inverso

Licença
MIT
Ambiente
Node Filesystem
Dependências
Zero no Runtime
Testado no
Next · Astro · Hono
01 — O problema

O design começa a se
perder nos componentes.

Quando os nomes de classes vivem só dentro de arquivos .tsx, cada página começa a divergir aos poucos. Pra um humano mantendo tudo sozinho até funciona — mas o negócio quebra assim que os agentes começam a mexer na interface.

sem o kdf · estilos espalhados pelos arquivos
<section className="mx-auto max-w-6xl px-6 py-20">
  <h1 className="text-5xl font-semibold tracking-tight">
  // …and again, slightly different, on the next page

O mesmo botão ganha silenciosamente cinco variantes. O espaçamento muda de uma página pra outra. Cada nova sessão do agente precisa redescobrir as regras do zero.

O RESULTADO
  • Os agentes improvisam cores, espaçamento, tipografia e layout.
  • Os usuários ficam corrigindo os resultados pelo chat o tempo todo.
  • Mudar algo significa ter que caçar os estilos no meio dos arquivos de componentes.
  • As sessões antigas não repassam a intenção do design para as novas.

→ iteração "maior" · "mais azul" · "um pouco pra esquerda" infinita

02 — A solução

Torne o design explícito.

O KDF faz pelo design o mesmo que o i18n faz pelo texto: ele tira decisões repetitivas dos arquivos de componentes e as coloca no JSON. A interface renderizada ainda usa CSS normal — a diferença é quem controla isso.

1 — defina no json
{
  "hero": {
    "title": "text-5xl font-semibold tracking-tight"
  }
}
2 — renderize no código
const d = getDesign("homepage");

<h1 data-kdf="hero.title" className={d("hero.title")}>
O JSON define
Um único arquivo comanda o design. Você edita direto lá quando quiser controle total.
O código renderiza
Seus componentes leem os tokens e renderizam o design aprovado usando CSS normal — não tem mágica por trás.
Os agentes implementam
Os agentes criam a interface lendo o JSON em vez de tentar adivinhar. Fim do improviso com espaçamento, cores, tipografia ou ordem de seções.
O usuário ajusta o JSON
Altere a origem uma vez só, em vez de ficar descrevendo a mesma correção visual no chat a cada nova sessão.
03 — Não é uma biblioteca de componentes

Uma biblioteca diz 'o que'.
O KDF diz qual.

Uma biblioteca de design te entrega um Botão. O KDF diz que isso é o homepage.hero.cta-primary, renderizado como um Botão, e com esse token de estilo. Ele adiciona o mapeamento que falta nas bibliotecas — conectando o elemento direto à decisão de design.

 Biblioteca de designKDF
O que diz"Isto é um Botão.""Isto é o hero.cta-primary na página homepage."
MapeamentoComponente genérico, sujeito a muitas variações.Um elemento mapeia direto para uma chave de design.
RastreabilidadeSem conexão direta entre o elemento e a decisão.O atributo data-kdf aponta cada nó do DOM pro seu caminho no JSON.
Fica acima do shadcn · Bootstrap · Chakra · Tailwind · CSS puro · o seu próprio sistema — o KDF não substitui nenhum deles.
04 — O vocabulário

Seis símbolos.
Uma gramática.

O KDF armazena nomes de classes, referências compartilhadas, a ordem das seções e CSS custom properties. Ele nunca guarda lógica de negócio, event handlers, chamadas a APIs, permissões ou comportamento de acessibilidade.

data-kdf
O mapa

Todo elemento que usa um token carrega o caminho de onde ele veio. Os nós do DOM apontam de volta pro JSON — excelente pra scanners, testes e pros próprios agentes.

data-kdf="hero.title"
d(path)
O acessor

Resolve um caminho pra retornar a string className. Já o d.css() retorna um objeto de CSS custom properties.

className={d("hero.title")}
@
Referência compartilhada

Aponta para um token reutilizável dentro de shared/. Refs podem encadear e estender com classes extras.

"@button.cta" shadow-xl
$layout
Ordem & visibilidade

Um array de chaves de seções. As listadas são renderizadas na ordem; se faltar alguma, o app esconde.

["hero", "features", "footer"]
$
Identidade do componente

Metadados pros agentes e pro host — qual componente vai renderizar aquele token, junto com dicas de variantes e tamanho.

"$": "Button"
css
Propriedades customizadas

Valores que não cabem como classes reutilizáveis são aplicados como variáveis de estilo inline usando o d.css().

{ "--kdf-accent": "#4F46E5" }
05 — Arquitetura

Padrões compartilhados.
Overrides por página.

Os design tokens vivem em dois lugares: padrões reutilizáveis no shared/, e uma composição por página pra sobrescrever só o necessário. Dois arquivos CSS sob seu controle cuidam do first paint e servem de rota de fuga.

estrutura do projeto
kdf/
  shared/
    button.json      ← reusable defaults
    card.json
    color.json
    typography.json
  homepage.json      ← page composition
  konde-server.css   ← critical, first paint
  konde.css          ← non-critical tweaks
Cascata em múltiplos níveis

Uma referência como @button.cta é resolvida primeiro no shared/ da página, depois no shared/ pai, e depois nos tokens da página. O template sobrescreve só o que precisa e herda o restante.

Leve por padrão

O design é resolvido no backend; o navegador já recebe a string de classes pronta. O CSS crítico carrega logo no first paint, e o restante depois — sem jogar processamento de renderização nas costas de celulares mais fracos.

DOIS ARQUIVOS CSS DO USUÁRIO · DOIS MOMENTOS DE CARREGAMENTO
konde-server.css
crítico · first paint

Importado pelo app pra que variáveis de design e regras anti-FOUC (pra não piscar o estilo) carreguem antes de tudo.

/* konde-server.css */
:root { --kdf-primary: #1F8F47; }
[data-kdf="hero.slider"] { display: none; }
konde.css
não crítico · pós-app css

Carrega depois dos frameworks pra você ajustar o que quiser sem travar a renderização inicial da página.

/* konde.css */
[data-kdf="hero.title"] { letter-spacing: -0.02em; }
[data-kdf="hero.wrapper"] { gap: 3rem; }

→ O KDF só cria isso uma vez e nunca sobrescreve. Você só precisa importar; o plugin te dá o caminho pela env.

06 — Multi-templates

Mude de design
como se muda de idioma.

Da mesma forma que o i18n troca idiomas, o KDF troca templates de design. É o mesmo app, os mesmos componentes, o mesmo código — você só aponta a variável KDF_DIR para outra pasta e o visual muda por completo.

designs/ — dois templates, um app
designs/
  lander/
    shared/
    homepage.json
  newlander/
    shared/
    homepage.json
// next.config.ts
withKDF({ dir: "./designs/lander" })(nextConfig);
$layout Reorganize a ordem ou esconda seções inteiras sem tocar num só componente.
@button Mude o estilo de todos os botões de ação de uma vez por meio de um token compartilhado.
KDF_DIR Troque de template apenas alterando a origem no seu host.
07 — API Runtime

Resolve no servidor.
Passa as strings pro cliente.

O KDF lê o JSON no disco, então ele roda totalmente no backend: Next.js (Server Components), Astro, Hono. Resolva as classes lá e entregue as strings puras pro frontend.

server component
import { getDesign, cn } from "@kondeio/kdf";

const d = getDesign("homepage");

<button data-kdf="hero.cta" className={cn(d("hero.cta"), isActive)}>Start</button>
d("hero.title")

→ string de className resolvida

d.css("hero.title")

→ objeto de custom-properties de CSS

cn · cx · dedupeClasses

Junte classes condicionais, limpe nulos, remova duplicadas — sem inventar semântica por padrão.

cache: auto · always · none

No ambiente de produção, faz cache. No ambiente de desenvolvimento, revalida por mtime & tamanho.

08 — Feito para ser compatível

Fica uma camada
acima da sua stack.

ESTILIZAÇÃO — GUARDA NOMES DE CLASSES, NÃO CSS

TailwindshadcnBootstrapChakraCSS ModulesPlain CSSYour own system

O KDF não é uma engine de CSS. Os tokens só guardam o que quer que seu sistema de estilo entenda. Se o seu framework varre arquivos-fonte atrás de classes, aponte ele pro JSON também: @source "../kdf/**/*.json".

RUNTIME — JAVASCRIPT NO BACKEND

Next.js testado · plugin
Astro testado
Hono testado
Começar agora

Instalou, tá pronto.
O Init cria o resto.

A própria instalação cria a pasta base kdf/ se ela não existir. Ele nunca sobrescreve o que já está lá.

$npm install @kondeio/kdf
$pnpm add @kondeio/kdf
$bun add @kondeio/kdf
$npm exec -- kdf init # instalação manual
next.config.ts
import withKDF from "@kondeio/kdf/plugin";

export default withKDF({ dir: "./designs" })(nextConfig);