Konde Design Framework

i18n es tu traducción.
KDF es tu diseño.
Ambos viven en JSON.

Una capa de coordinación de diseño basada en JSON para web apps server-side y UI asistida por agentes. Las decisiones repetibles —layout, espaciado, tipografía, estilos— viven en una sola fuente de la verdad que tus agentes leen en vez de andarlas adivinando por los archivos.

Mira cómo 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"
Crea y lanza con IA.
data-kdf="hero.body"

Una única fuente de la verdad mantiene la coherencia en cada página, componente y sesión de agente.

data-kdf="hero.cta-primary"
Empezar →

El JSON define · el código renderiza · data-kdf mapea de vuelta

Licencia
MIT
Runtime
Node Filesystem
Dependencias
Cero en runtime
Probado con
Next · Astro · Hono
01 — El problema

El diseño muta en
tus componentes.

Cuando los nombres de clase viven solo en los archivos .tsx, cada página empieza a desviarse lentamente. Esto funciona con un único humano editando, pero es súper frágil en cuanto los agentes empiezan a tocar la UI.

sin kdf · desperdigado en múltiples archivos
<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

El mismo botón de pronto tiene cinco variantes. El espaciado cambia página por página. Cada nueva sesión del agente tiene que volver a descubrir las reglas desde cero.

EL RESULTADO
  • Los agentes se inventan colores, espaciados, tipografías y layouts.
  • Tienes que corregir el resultado por el chat, todo el rato.
  • Hacer cambios implica buscar entre archivos de componentes.
  • Las sesiones repetidas pierden la intención original del diseño.

→ un bucle infinito de iteraciones pidiendo '"más grande" · "más azul" · "a la izquierda"'

02 — La solución

Haz explícito el diseño.

KDF hace por tu diseño lo que i18n hizo por tus textos: saca las decisiones repetitivas fuera de los componentes y las mete en un JSON. La UI se sigue renderizando con CSS normal — lo que cambia es quién es el dueño de esa decisión.

1 — defínelo en el json
{
  "hero": {
    "title": "text-5xl font-semibold tracking-tight"
  }
}
2 — renderízalo en código
const d = getDesign("homepage");

<h1 data-kdf="hero.title" className={d("hero.title")}>
El JSON define
Un único archivo manda sobre el diseño. Lo editas a mano cuando quieres control preciso.
El código renderiza
Tus componentes leen los tokens y pintan el diseño aprobado con CSS normal — nada de magia por debajo.
Los agentes implementan
Los agentes construyen la UI basándose en el JSON en vez de intentar adivinar. Cero inventarse espaciados, colores o el orden de las secciones.
Tú ajustas el JSON
Cambias la fuente una sola vez, en lugar de describirle al agente la misma corrección visual sesión tras sesión.
03 — No es una librería de componentes

Una librería te dice qué es.
KDF te dice cuál es..

Una librería de diseño te da un Botón. KDF te dice que esto es un homepage.hero.cta-primary, que se renderiza como Botón, estilado con este token. Añade el único enlace que se dejan las librerías: del elemento a la decisión de diseño.

 Librería de diseñoKDF
Lo que dice"Esto es un Botón.""Esto es hero.cta-primary en homepage."
MapeoComponente genérico, cientos de posibles overrides.Un elemento mapea a una sola clave de diseño.
TrazabilidadNo hay un mapa exacto entre el elemento y la decisión.data-kdf conecta cada nodo del DOM con su ruta exacta en el JSON.
Se monta encima de shadcn · Bootstrap · Chakra · Tailwind · CSS puro · tu propio sistema — KDF no pretende sustituir a ninguno de ellos.
04 — El vocabulario

Seis símbolos.
Una gramática.

KDF guarda nombres de clase, referencias compartidas, orden de secciones y custom properties de CSS. Jamás guarda lógica de negocio, event handlers, peticiones de datos, permisos o comportamiento de accesibilidad.

data-kdf
El mapa

Cualquier elemento que use un token lleva consigo la ruta al mismo. Los nodos del DOM apuntan directo al JSON — para escáneres, tests y revisión de agentes.

data-kdf="hero.title"
d(path)
El accessor

Resuelve una ruta a su string de className. d.css() te devuelve el objeto con las custom properties CSS.

className={d("hero.title")}
@
Referencia compartida

Apunta a un token reutilizable en shared/. Las referencias pueden encadenar y extenderse añadiendo clases extra.

"@button.cta" shadow-xl
$layout
Orden y visibilidad

Un array de claves de sección. Las secciones de la lista se renderizan en orden; la app se encarga de ocultar las que no estén.

["hero", "features", "footer"]
$
Identidad del componente

Metadatos para agentes y tooling del host — indica qué componente pinta este token, además de pistas de tamaño y variantes.

"$": "Button"
css
Propiedades personalizadas

Valores que no encajan como clases reutilizables. Se aplican como variables inline a través de d.css().

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

Defaults compartidos.
Overrides por página.

Los tokens viven en dos partes: los defaults reutilizables en shared/, y la composición por página que sobrescribe solo lo que toca. Dos archivos CSS tuyos cubren el primer pintado y las vías de escape.

estructura del proyecto
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
Cascada multi-nivel

Una referencia tipo @button.cta se busca primero en el shared/ de la página, luego en el shared/ padre y finalmente en los tokens. Las plantillas sobreescriben solo lo que necesitan y heredan el resto.

Ligero por defecto

El diseño se resuelve en el servidor; al navegador le llegan solo strings de clase ya listos. El CSS crítico carga en el first paint y el resto después — cero carga de render inútil en dispositivos lentos.

DOS ARCHIVOS CSS TUYOS · DOS MOMENTOS DE CARGA
konde-server.css
crítico · first paint

Importado en la app para que las variables de diseño y overrides críticos lleguen en el mismo first paint — sin parpadeos (FOUC).

/* konde-server.css */
:root { --kdf-primary: #1F8F47; }
[data-kdf="hero.slider"] { display: none; }
konde.css
no crítico · tras el css de la app

Carga después del framework y del CSS de tu app para ajustes, apaños rápidos y escape hatches — retoques que nunca deberían bloquear el renderizado inicial.

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

→ KDF los genera solo la primera vez y nunca los sobrescribe. El plugin expone las rutas en variables de entorno: tu app hace los imports; no hay inyección mágica de código.

06 — Multi-plantilla

Cambia de diseño
como cambias de idioma.

Igual que i18n cambia de idioma, KDF te permite cambiar de plantilla. Misma app, mismos componentes, mismo código — con solo apuntar la variable KDF_DIR a otra carpeta, todo el look and feel se transforma.

designs/ — dos plantillas, una misma app
designs/
  lander/
    shared/
    homepage.json
  newlander/
    shared/
    homepage.json
// next.config.ts
withKDF({ dir: "./designs/lander" })(nextConfig);
$layout Reordena u oculta secciones sin necesidad de tocar componentes.
@button Cambia todos los CTAs de la web tocando solo un token compartido.
KDF_DIR Cambia por completo la plantilla de diseño modificando una variable de entorno en tu host.
07 — API en Runtime

Resuelve en servidor.
Pasa strings al cliente.

El core de KDF lee JSON directamente del disco, así que va en servidor: Next.js Server Components, renders de Astro, handlers en Hono. Resuelve las clases ahí y mándale strings limpios a los componentes de cliente.

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 resuelto

d.css("hero.title")

→ objeto con las custom properties CSS

cn · cx · dedupeClasses

Junta clases condicionales, filtra valores falsy, desduplica — sin lógica semántica por defecto.

cache: auto · always · none

En producción tira de caché; en dev revalida por mtime y peso del archivo.

08 — Compatible por diseño

Se monta encima
de tu stack.

ESTILOS — GUARDA CLASES, NO CSS

TailwindshadcnBootstrapChakraCSS ModulesPlain CSSYour own system

KDF no es un motor CSS. Los tokens guardan los strings que tu sistema de clases espere. Si tu framework escanea tus ficheros fuente, añádele el JSON: @source "../kdf/**/*.json".

RUNTIME — JAVASCRIPT EN SERVIDOR

Next.js probado · plugin
Astro probado
Hono probado
Empezar

Se instala una vez.
El init te monta el resto.

Al instalar te crea una carpeta kdf/ base si no la tenías ya. Nunca sobrescribimos archivos existentes.

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

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