Design System

Work in progress. I'm adding components as I go, following patterns from what's already documented. Nothing here is set in stone yet.

Atoms

Small, single-purpose elements. Some are structural (Button), others are chromatic (Tag) and pick up the accent color from their context.

Button

Atom

Chromatic button — inherits --accent-color from its container. Renders as <a> when href is set, <button> otherwise.

Variants

<Button variant="solid | surface | ghost | tint | cool-shift">...</Button>

As Link

<Button href="#" variant="tint">...</Button>

Small

<Button size="small">...</Button>

With Icon

Raw SVG string rendered before text

<Button icon={githubSvg}>...</Button>

States

<Button state="loading | success">...</Button>

Chromatic

All variants adapt to --accent-color

Props

PropTypeDefaultDescription
variant"solid" | "surface" | "ghost" | "tint" | "cool-shift""solid"Visual style variant
size"default" | "small""default"Compact 28px variant
state"idle" | "loading" | "success""idle"Button state for form feedback
hrefstring—When set, renders as <a> instead of <button>
externalboolean—Opens in new tab with noreferrer/nofollow
iconstring—Raw SVG string rendered before text
...attrsComponentProps<"button">—All native button attributes (disabled, type, etc.)

IconButton

Atom

Default Color

<IconButton label="Menu"><BurgerIcon /></IconButton>

Primary Color

<IconButton label="Contact" color="primary">...</IconButton>

As Link

<IconButton label="Contact" href="#contact" color="primary">...</IconButton>

When href is provided, renders as <a> instead of <button>.

With Open State

Add .open class to trigger BurgerIcon animation.

Props

PropTypeDefaultDescription
labelstringrequiredAccessible aria-label
idstring-Optional ID for JavaScript targeting
hrefstring-If provided, renders as <a> instead of <button>
variant"default" | "floating""default"Floating adds fixed position and shadow
color"default" | "primary""default"Color scheme
classstring-Additional CSS classes

Tag

Atom

Passive metadata label. No hover state, no interactivity — just shows what something is. Picks up --accent-color from its section for the tint and left border.

Variants

Default
Highlight
Outline
Badge

Small

Default
Highlight
Outline
Badge
size="small"

With Icon

Terminal
Terminal
icon={terminalSvg}

Chromatic

Default
Highlight
Outline
Badge

Props

PropTypeDefaultDescription
titlestringrequiredThe text content of the tag
size"default" | "small""default"Compact variant
iconstring-SVG icon as raw string
highlightbooleanfalseAdds accent border
outlinebooleanfalseTransparent background with accent border
badgebooleanfalseSolid accent background, cool-shift text
animatedbooleanfalseStarts hidden for reveal animation

Responsive

PropertyDesktop≤900px≤600px
font-size14px~13px12px
padding8px 18px6px 12px4px 10px
icon16px16px12px

TagRow

Atom

Flex row for Tag components. Uses margin-top: auto to push down and padding-top for minimum spacing.

Preview

React
TypeScript
Next.js
<TagRow><Tag title="React" /><Tag title="TypeScript" /></TagRow>

Fluid spacing

PropertyValueMinMax
gapclamp(6px, 0.32rem + 0.21vw, 8px)6px8px
padding-topclamp(18px, 0.59rem + 1.89vw, 36px)18px36px

kinoo.dev · Design System