Design system

50 components over a theme generated from one colour. Everything below is read from the registry and from the live theme, so it cannot drift from what this app actually ships — change the brand colour in the operator console (/admin/settings) and this page changes with it.

The theme

Generated from #36D6EE, then verified: every role that carries text declares a contrast obligation in APCA Lc and is moved until it clears it. This build moved 13 and failed 0.

neutral
accent
success
warning
danger
info

Components never name a ramp step. They name a role, and the role resolves per mode — which is why light and dark are one declaration rather than two palettes that quietly diverge.

--k-bg-canvas
--k-bg-surface
--k-bg-accent
--k-bg-success
--k-bg-warning
--k-bg-danger
--k-fg-default
--k-fg-muted
--k-fg-accent
--k-border-subtle

One vocabulary

No per-component prop dialect — no colour, colorScheme, contained, primary. Every component takes the same four facets, and an unknown value throws with the legal set rather than rendering an unstyled control.

tone — accent · neutral · success · warning · danger · info
variant — solid · soft · outline · ghost · plain
size — xs · sm · md · lg · xl
radius — none · sm · md · lg · full · inherit (set per component, or once on the theme)

In use

A few of them together, rendered by this page rather than pictured.

Label, description and error share one shell.

SavedEvery alert takes the same tone vocabulary.
chip3--k-fg-accent
Working
Usage this period62%

All 50 components

Filter by category or search the descriptions and examples. Import from @/components/kit for anything interactive — the registry ships no 'use client' directives, so the boundary is declared there once rather than at fifty import sites.