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
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, cool-shift 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