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">...</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" "solid" Visual style variant
size "default" | "small" "default" Compact 28px variant
state "idle" | "loading" | "success" "idle" Button state for form feedback
href string When set, renders as <a> instead of <button>
external boolean Opens in new tab with noreferrer/nofollow
icon string Raw SVG string rendered before text
...attrs ComponentProps<"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
label string required Accessible aria-label
id string - Optional ID for JavaScript targeting
href string - If provided, renders as <a> instead of <button>
variant "default" | "floating" "default" Floating adds fixed position and shadow
color "default" | "primary" "default" Color scheme
class string - 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
title string required The text content of the tag
size "default" | "small" "default" Compact variant
icon string - SVG icon as raw string
highlight boolean false Adds accent border
outline boolean false Transparent background with accent border
badge boolean false Solid accent background, black text
animated boolean false Starts hidden for reveal animation

Responsive

PropertyDesktop≤900px≤600px
font-size 14px ~13px 12px
padding 8px 18px 6px 12px 4px 10px
icon 16px 16px 12px

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
gap clamp(6px, 0.32rem + 0.21vw, 8px) 6px 8px
padding-top clamp(18px, 0.59rem + 1.89vw, 36px) 18px 36px

kinoo.dev · Design System