Konde Design Framework

i18n är din översättning.
KDF är din design.
Båda bor i JSON.

Ett JSON-baserat lager för att styra design i server-side webbappar och agent-assisterade UI:n. Återkommande beslut — layout, spacing, typografi, styling — bor på ett enda ställe som dina agenter läser istället för att försöka återskapa allt över massa filer, sidor och gamla chattsessioner.

Se hur det funkar
kdf / homepage.json → renderad
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"
Bygg och skeppa med AI.
data-kdf="hero.body"

En enda source of truth håller varje sida, komponent och agentsession konsekvent.

data-kdf="hero.cta-primary"
Kom igång →

JSON definierar · kod renderar · data-kdf mappar tillbaka

Licens
MIT
Runtime
Node Filesystem
Dependencies
Noll Runtime
Testat med
Next · Astro · Hono
01 — Problemet

Designen glider isär i
dina komponenter.

När klassnamn bara lever inuti .tsx-filer börjar varje sida sakta glida isär. Det funkar okej för en enda mänsklig kodare — men det är sjukt skört så fort agenter börjar pilla på UI:t.

utan kdf · utspritt över filer
<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

Samma knapp får plötsligt fem olika varianter. Spacing ändras från sida till sida. Varje ny agentsession måste lära sig reglerna från noll.

RESULTATET
  • Agenter improviserar med färger, spacing, typografi och layout.
  • Användare tvingas rätta resultatet i chatten, varje gång.
  • Ändringar innebär att man måste leta igenom massa komponentfiler.
  • Upprepade sessioner tappar bort själva tanken bakom designen.

→ oändlig "större" · "mer blå" · "flytta vänster" iteration

02 — Lösningen

Gör designen tydlig.

KDF gör samma sak för design som i18n gör för text: flyttar ut återkommande beslut från komponentfilerna och in i JSON. Det renderade UI:t använder fortfarande helt vanlig CSS — det som ändras är vem som äger den.

1 — definiera det i json
{
  "hero": {
    "title": "text-5xl font-semibold tracking-tight"
  }
}
2 — rendera det i kod
const d = getDesign("homepage");

<h1 data-kdf="hero.title" className={d("hero.title")}>
JSON definierar
En enda fil styr inriktningen på designen. Användare redigerar den direkt när de vill ha stenkoll.
Kod renderar
Dina komponenter läser in tokens och renderar designen med vanlig CSS — inget magiskt under huven.
Agenter implementerar
Agenter bygger UI utifrån JSON istället för att gissa. Inget mer påhittat avstånd, färger, typografi eller konstig ordning på sektioner.
Användare justerar JSON
Ändra källan en gång istället för att behöva beskriva samma visuella rättning i chatten, session efter session.
03 — Inget komponentbibliotek

Ett bibliotek säger vad.
KDF säger vilket.

Ett designbibliotek ger dig en Button. KDF berättar att just den här är homepage.hero.cta-primary, renderas som en Button, och stajlas med detta token. Det lägger till den exakta mappningen som bibliotek ofta skippar — från element till designbeslut.

 DesignbibliotekKDF
Vad det säger"Detta är en Button.""Detta är hero.cta-primaryhomepage."
MappningGenerisk komponent, många möjliga overrides.Ett element mappar till en enda designnyckel.
SpårbarhetIngen exakt mappning från element till beslut.data-kdf pekar varje DOM-nod tillbaka till dess JSON-sökväg.
Sitter ovanför shadcn · Bootstrap · Chakra · Tailwind · vanlig CSS · ditt egna system — KDF är inte en ersättning för något av dem.
04 — Ordboken

Sex symboler.
En grammatik.

KDF lagrar klassnamn, delade referenser, sektionsordning och CSS-variabler. Det lagrar aldrig affärslogik, eventhandlers, datahämtning, behörigheter eller tillgänglighetsbeteenden.

data-kdf
Kartan

Varje element som använder ett token bär med sig en matchande sökväg. DOM-noder kan spåras raka vägen tillbaka till JSON — perfekt för scanners, tester och granskning av agenter.

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

Löser upp en sökväg till dess className-sträng. d.css() returnerar objektet med CSS-variabler.

className={d("hero.title")}
@
Delad referens

Peka på ett återanvändbart token i shared/. Refs kan kedjas ihop och utökas med extra klasser.

"@button.cta" shadow-xl
$layout
Ordning & synlighet

En array av sektionsnycklar. Listade sektioner renderas i rätt ordning; de som saknas döljs av värdappen.

["hero", "features", "footer"]
$
Komponentidentitet

Metadata för agenter och värdverktyg — vilken komponent som renderar detta token, plus hints om varianter och storlek.

"$": "Button"
css
Anpassade egenskaper

Värden som inte går att uttrycka som återanvändbara klasser appliceras som inline style-variabler via d.css().

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

Delade standardvärden.
Overrides per sida.

Design-tokens bor på två ställen: återanvändbara standardvärden i shared/, och per-sida-komposition som bara skriver över exakt det som behövs. Två CSS-filer, som du som användare äger, täcker first paint och fallback-lösningar.

projektstruktur
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
Flernivåkaskad

En referens som @button.cta hämtas från sidans shared/, sedan en överordnad shared/, och till sist sidans tokens. Mallar skriver bara över det de behöver och ärver resten.

Lätt som standard

Designen löses upp på servern; webbläsaren får färdiga klass-strängar. Kritisk CSS laddas vid first paint, resten kommer efter — ingen renderingstyngd dumpas på svaga klienter.

TVÅ ANVÄNDARÄGDA CSS-FILER · TVÅ LADDNINGSMOMENT
konde-server.css
kritisk · first paint

Importeras av appen så att designvariabler och no-FOUC-overrides kommer med direkt vid first paint — innan något hinner blinka till.

/* konde-server.css */
:root { --kdf-primary: #1F8F47; }
[data-kdf="hero.slider"] { display: none; }
konde.css
icke-kritisk · efter app-css

Laddas efter ramverket och appens CSS för justeringar, experiment och escape hatches — finlir som aldrig behöver blockera renderingen.

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

→ KDF skapar båda filerna en gång och skriver aldrig över dem sen. Pluginet exponerar sökvägarna via miljövariabler - din app sköter importerna; inget injiceras i smyg åt dig.

06 — Multi-mall

Byt design
precis som du byter språk.

Samma sätt som i18n byter språk, byter KDF designmallar. Samma app, samma komponenter, samma kod — bara peka om KDF_DIR till en annan designmapp och hela utseendet byts ut.

designs/ — två mallar, en app
designs/
  lander/
    shared/
    homepage.json
  newlander/
    shared/
    homepage.json
// next.config.ts
withKDF({ dir: "./designs/lander" })(nextConfig);
$layout Ändra ordning på eller dölj sektioner utan att ens röra en komponent.
@button Ändra alla CTA:er på en gång genom ett delat token.
KDF_DIR Byt ut hela designmallen som ett aktivt val i värdappen.
07 — Runtime API

Lös upp på servern.
Skicka ner strängar.

KDF-kärnan läser JSON från disken, så den körs server-side: Next.js Server Components, Astro-renderingar, Hono-handlers. Lös upp klasserna där och skicka sedan ner rena strängar till klientkomponenterna.

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")

→ upplöst className-sträng

d.css("hero.title")

→ objekt med CSS-variabler

cn · cx · dedupeClasses

Slå ihop villkorliga klasser, droppa falsy-värden, ta bort dubbletter — 100% fri från semantik som standard.

cache: auto · always · none

Produktion cachar; dev utvärderar på nytt baserat på mtime & storlek.

08 — Kompatibel från grunden

Det sitter ovanpå
din stack.

STYLING — LAGRAR KLASSNAMN, INTE CSS

TailwindshadcnBootstrapChakraCSS ModulesPlain CSSYour own system

KDF är ingen CSS-motor. Tokens rymmer vilka klass-strängar som helst som ditt stylingsystem fattar. Om ditt ramverk skannar källfiler, peka det mot JSON-filerna också: @source "../kdf/**/*.json".

RUNTIME — SERVER-SIDE JAVASCRIPT

Next.js testat · plugin
Astro testat
Hono testat
Kom igång

Installera en gång.
Init bygger upp resten.

När du installerar sätts även en grundläggande kdf/-mapp upp om den inte redan finns. Filer som redan finns skrivs aldrig över.

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

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