What it's made of.
The colours, type, space, and motion the system is built on, and why each is set the way it is. Everything below is live.
Contents
A few rules I follow
There aren't many. The rest of the page is these, in practice.
-
Take things away first
Fewer borders, fills, and colours. If a simpler version works, that's the one.
-
Keep the page quiet
Monochrome, with one green. My colour, used sparingly.
-
Lines and space, not boxes
A thin line and some room usually beat another box.
-
Calm motion
Quick, and out of the way. If you notice it, it's too much.
-
Readable from the start
Colours clear AAA contrast in both themes.
Two tiers, theme-aware
A fixed core of colours, plus semantic roles that swap with the theme. The accent is one green, named Ionia after the Aegean coast I grew up on. Authored in OKLCH.
Geist, and Geist Mono
Geist for everything you read, Geist Mono for labels and code. The sizes and weights are below.
.gok-tabular-nums, so columns line up.
One scale, named by use
A single rem-based scale. Components ask for inset,
stack, or inline instead of a number.
Columns and widths
A narrow width for reading, wider ones for layout and media, on a twelve-column grid. Resize to watch it shift.
Active breakpoint: —.gok-grid.gok-grid.gok-grid--auto.gok-app-shellThe canonical top‑nav + side‑nav + content composition: the top bar and rail stay pinned; only the content scrolls. The app composes the shell (design‑language Axis 13) — these classes just supply the correct structure. Scroll inside the panel:
Corners and borders
6px corners on controls, 12px on surfaces. Borders are 1px unless something needs more.
Z-index, shadow, and flat colour layers
Named z-index levels so layers don't clash. Shadows are kept for the few things that float. Dense, nested surfaces stay flat — separated by colour layers, not shadow.
Durations and curves
Transitions stay under 300ms; a couple of slower loops; three easing curves. Click a row to try one.
One wash for every state
Hover, focus, and pressed are the same ink wash, a little stronger each step. It mixes in place, so both themes get it for free.
Regular, compact, and condensed
Every control sizes from one value, --gok-density-control-height, so a
density switch shrinks the whole interface at once. Same button, three densities —
condensed (28px) is the ops/terminal grade for data grids and log views.
And a second switch: editorial or product
The desktop type scale grows the display roles, because a headline set against a
wide reading measure should. In a dense product surface that is wrong — a metric on
headline-2 lands at 44px beside 14px body text.
data-scale="product" holds them at their mobile sizes. It adds no
values: gök's product scale is its mobile scale.
Status, and the focus ring
Status shows as a line, an icon, and words together. Focus is a 2px outline that holds up in any mode.
AAA, by the numbers
Every text colour clears 7:1 in both themes. The greys are evenly spaced, so contrast is just how many steps apart two are.
Ink on paper
Muted secondary text
An accent link
Next, the components
Same thinking, now you can click them.