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.

Foundations

Design tokens that everything else builds on. Colors, typography, borders, interactions, breakpoints.

Colors

Color palette and CSS variables used throughout the website.

Background Colors

--background-color#181927
--background-frostedrgba(24, 25, 39, 0.05)

Surface Colors

--card-surface-raised#2d2d3b
--card-surface#1c2638
--card-surface-hover#313d50

Text Colors

--color#e0e0e0
--light-color#f6f5f7

Color Scales

Each section uses a themed color palette. These override --accent-color and --secondary-accent-color at the section level.

Orange
--orange-bg
--orange-tint
--orange-cool-shift
--orange-desaturated
--orange-border
--orange-lightest
--orange-light
--orange
--orange-dark
--orange-darker
--orange-darkest
Red
--red-bg
--red-tint
--red-cool-shift
--red-desaturated
--red-border
--red-lightest
--red-light
--red
--red-dark
--red-darker
--red-darkest
Green
--green-bg
--green-tint
--green-cool-shift
--green-desaturated
--green-border
--green-lightest
--green-light
--green
--green-dark
--green-darker
--green-darkest
Pink
--pink-bg
--pink-tint
--pink-cool-shift
--pink-desaturated
--pink-border
--pink-lightest
--pink-light
--pink
--pink-dark
--pink-darker
--pink-darkest
Purple
--purple-bg
--purple-tint
--purple-cool-shift
--purple-desaturated
--purple-border
--purple-lightest
--purple-light
--purple
--purple-dark
--purple-darker
--purple-darkest
Blue
--blue-bg
--blue-tint
--blue-cool-shift
--blue-desaturated
--blue-border
--blue-lightest
--blue-light
--blue
--blue-dark
--blue-darker
--blue-darkest
Cyan
--cyan-bg
--cyan-tint
--cyan-cool-shift
--cyan-desaturated
--cyan-border
--cyan-lightest
--cyan-light
--cyan
--cyan-dark
--cyan-darker
--cyan-darkest
Yellow
--yellow-bg
--yellow-tint
--yellow-cool-shift
--yellow-desaturated
--yellow-border
--yellow-lightest
--yellow-light
--yellow
--yellow-dark
--yellow-darker
--yellow-darkest
Indigo
--indigo-bg
--indigo-tint
--indigo-cool-shift
--indigo-desaturated
--indigo-border
--indigo-lightest
--indigo-light
--indigo
--indigo-dark
--indigo-darker
--indigo-darkest
Teal
--teal-bg
--teal-tint
--teal-cool-shift
--teal-desaturated
--teal-border
--teal-lightest
--teal-light
--teal
--teal-dark
--teal-darker
--teal-darkest

Border Colors

--border-colorrgba(255, 255, 255, 0.1)
--border-hover-colorrgba(255, 255, 255, 0.2)

Usage

Import variables from @/styles/variables.css or use CSS custom properties directly in your styles.

Typography

Outfit, weights 100–800. Article typography is the baseline — hero uses oversized variants.

Headings

h1 --h2-size

Article Title

h2 clamp(24px, …, 30px)

Heading 2

h3 1.15em

Heading 3

h4 1em

Heading 4

Body

p --font-size · line-height: 1.7

Body text. Longer line-height for reading comfort, em-based margins between paragraphs.

subtitle --subtitle-size

Subtitle text

button --button-font-size

Hero (oversized)

The hero section uses larger heading sizes for the landing page. These override the defaults.

h1 --h1-size

Hero Title

h2 --h2-size

Section Title

h3 --h3-size

Card Title

Size Variables

VariableValueMinMax
--h1-sizeclamp(48px, 1.58rem + 5.05vw, 96px)48px96px
--h2-sizeclamp(42px, 2.21rem + 1.47vw, 56px)42px56px
--h3-sizeclamp(18px, 0.95rem + 0.63vw, 24px)18px24px
--subtitle-sizeclamp(20px, 1.19rem + 0.21vw, 22px)20px22px
--font-size-lgclamp(16px, 0.89rem + 0.42vw, 20px)16px20px
--font-sizeclamp(16px, 0.89rem + 0.21vw, 18px)16px18px
--font-size-smclamp(14px, 0.78rem + 0.21vw, 16px)14px16px
--font-size-xsclamp(13px, 0.69rem + 0.42vw, 17px)13px17px
--font-size-2xs12px12px12px
--font-size-3xs11px11px11px
--button-font-size15px15px15px

Font Family

The website uses Outfit as the primary font family with weights from 100 to 800.

Borders

Border tokens and radius conventions.

Border Colors

--border-colorrgba(255, 255, 255, 0.1)
--border-hover-colorrgba(255, 255, 255, 0.2)
--border-ghost-colorrgba(255, 255, 255, 0.3)
accent-color 35%Focus state borders

Accent Border Scales

Each color scale includes a --{color}-border token at 35% opacity, used for chromatic borders.

--orange-border
--red-border
--green-border
--pink-border
--purple-border
--blue-border
--cyan-border

Radius Scale

--radius-xs4px — Code blocks, diagram badges
--radius-sm6px — Badges, tooltips, ghost links
--radius-md8px — Small buttons, logo boxes, sidebar items
--radius-lg12px — Buttons, tags, icon buttons, nav cards, form fields
--radius-xl32px — Cards, spotlight
9999px9999px — Full circle (spotlight glow)

Common Patterns

PatternBorderRadius
Card / Spotlight1px solid var(--border-color)var(--radius-xl)
Button / Tag1px solid transparentvar(--radius-lg)
Form field2px solid var(--border-color)var(--radius-lg)
Small buttonnonevar(--radius-md)
Badge / Ghost link1px solid var(--border-ghost-color)var(--radius-sm)

Interactions

Tokens for interactive states — transitions, opacity, borders, and shared patterns.

Transitions

Hover me
--transition-base0.3s ease — general hover/focus
Hover me
--transition-fast0.2s ease — subtle interactions
Click me
--transition-snap200ms — active/press states
TokenValueUsed by
--transition-base0.3s easeButton, Link, IconButton, BadgeLink, IconLink, .anime
--transition-fast0.2s easeNavCard, ArrowLink icons, tooltips
--transition-snap200msActive/press state on buttons and links

Opacity

0.8
--opacity-idleInteractive elements at rest
0.6
--opacity-mutedSecondary content, subtitles
1.0
1Hover state (full opacity)
TokenValueUsed by
--opacity-idle0.8Link, BadgeLink, Button ghost
--opacity-muted0.6NavCard subtitle, IconLink icon

Letter Spacing

Normal spacingletter-spacing: 0
Wide spacing--letter-spacing-wide: 0.5px

Used on ghost-styled elements — badges, ghost buttons — where bold + wide tracking gives a label-like feel without uppercase.

Ghost Pattern

Shared mixin from _ghost.scss — border, weight, spacing, hover accent

BadgeLinkExternal
@use "@/styles/ghost" as *;

.my-element {
  @include ghost;
  // adds: transparent bg, ghost border, 700 weight,
  //       wide tracking, idle opacity, accent hover
}

The mixin provides the visual identity. Layout (display, padding, height, radius) stays in the component.

All Tokens

TokenValueCategory
--transition-base0.3s easeTransition
--transition-fast0.2s easeTransition
--transition-snap200msTransition
--opacity-idle0.8Opacity
--opacity-muted0.6Opacity
--border-ghost-colorrgba(255,255,255,0.3)Border
--letter-spacing-wide0.5pxTypography
--radius-xs4pxRadius
--radius-sm6pxRadius
--radius-md8pxRadius
--radius-lg12pxRadius
--radius-xl32pxRadius

Breakpoints

SCSS mixins from _breakpoints.scss. All mobile-first, triggered at max-width.

Scale

Mobile
600px
Tablet
900px
Desktop
1100px
Wide
1200px
Ultrawide
1368px

Mixins

MixinMax WidthTypical Use
@include mobile600pxSingle column, compact spacing
@include tablet900pxStacked layouts, smaller typography
@include desktop1100pxSidebar collapse, grid adjustments
@include wide1200pxMinor width tweaks
@include ultrawide1368pxMax content width boundary

Usage

@use "@/styles/breakpoints" as *;

.component {
  display: grid;
  grid-template-columns: 1fr 1fr;

  @include tablet {
    grid-template-columns: 1fr;
  }

  @include mobile {
    padding: 16px;
  }
}

Import with @use "@/styles/breakpoints" as * to use mixins without a namespace prefix.

kinoo.dev · Design System