gökberk. design system
Foundations · v0.1

The studio foundation.

A minimal, editorial system. A near-neutral canvas, one forest-green accent, and a single typeface working hard. Everything below is driven by design tokens — flip the theme to watch the whole page re-resolve from one attribute.

Colour

A near-neutral canvas, used in proportion

Near-white paper, near-black ink, and a neutral grey ramp do almost all the work. The forest-green accent appears rarely — for calls to action, links, focus, and the occasional mark. It deepens in light and turns vivid in dark. Swatches render live from the tokens.

Core & accent

Neutral ramp

Status

Typography

One typeface, hierarchy from weight & scale

Geist for display and text; Geist Mono for labels, eyebrows, and code. Hierarchy comes from size, weight, and tight tracking on the display roles — not from many families. The scale is responsive (resize to see it shift).

Expressive Advancing the craft
Headline 1 Designed with restraint
Headline 3 Quiet, precise, editorial
Eyebrow Section label · mono
Body intro A larger lead paragraph to open a section, set in the text family at a comfortable measure.
Body regular The workhorse paragraph. Sixteen pixels, generous line height, sized for long-form reading. Good typography is invisible — it just gets out of the way of the words.
Caption Small print, metadata, and captions.
Code const accent = "#1a5a34";
Space

A 4px baseline, generous at the top

Controls use the lower steps; editorial layouts lean on 900–1100 for section rhythm. Whitespace is a material, not leftover.

Semantic spacing

Intent names over the raw scale

The same 4px scale, named by what it does: inset pads inside a surface, stack gaps blocks vertically, inline gaps items in a row. Components reach for intent, not numbers — nothing new is invented, each token just points at a --gok-space-* step.

Inset · padding inside a surface

inset-s · 12px
inset-m · 16px
inset-l · 32px

Stack · vertical gap between blocks

stack-s · 8px
stack-m · 16px
stack-l · 40px

Inline · horizontal gap in a row

inline-s · 8px
inline-m · 12px
inline-l · 24px

--gok-space-section (64px) sets the padding within a section; --gok-space-section-gap (128px) the rhythm between major divisions — the editorial breathing room this page is built on.

Layout & grid

Breakpoints, containers & a 12-column grid

Width does two jobs, kept separate: a narrow reading measure for text, and a wide canvas for layout and media. Resize the window — the readout tracks the active breakpoint, and the auto grid reflows with no media query.

Active breakpoint:
container · prose — 72ch (text measure)
container · content — 1200px (default sections)
container · wide — 1440px (galleries, media)
container · bleed — full width

12-column grid · .gok-grid

span 6
span 6
span 4
span 4
span 4
3
3
3
3

Auto grid · .gok-grid.gok-grid--auto

auto
auto
auto
auto
auto
auto
Radius

Crisp corners

Small, restrained radii. The pill is reserved for tags and avatars.

radius-s · 2px
radius-m · 6px
radius-l · 12px
radius-pill
Border width

Hairline by default

A tidy three-step scale beside radius. The hairline (1px) is the editorial divider already used for these section rules; heavier weights mark emphasis and selection. Components read a token instead of inventing a width.

border-width-hairline · 1px
border-width-regular · 2px
border-width-strong · 4px
Motion

Quiet & precise

Precise curve to enter, dynamic curve to exit. No bounce. Click a row to preview the easing. Transition durations stay sub-300ms; ambient/looping durations (spinners, shimmer) run in seconds. Reduced-motion collapses every transition duration to zero — the ambient loops slow or freeze themselves instead.

TokenValueUsePreview
duration-instant100msHover / colour micro-states
duration-fast150msChevrons, checks, small reveals
duration-moderate220msPopovers, menus, tabs
duration-slow300msModal / drawer / toast
duration-loop1.2sAmbient — one full spin (spinner, button pending)
duration-shimmer1.8sAmbient — a highlight sweep (skeleton)
duration-pulse1.6sAmbient — a breathing cycle (pulse loaders)
ease-preciseenterSnaps into place, no settle
ease-dynamicexitAccelerates away
ease-standardbothSymmetric micro-states
Elevation

Soft, restrained depth

Three levels by how far a surface sits above the page.

shadow-1 · raised
shadow-2 · overlay
shadow-3 · modal
Opacity & state layers

One model for interaction states

Disabled dims a whole control; hover, focus, and pressed are the alpha of an ink wash composed over a surface — one consistent system instead of one-off colours. The scrim is the modal backdrop, composed straight from its opacity token.

State-layer washes · ink over a surface

Rest
surface · no wash
Hover
opacity-hover · 0.04
Focus
opacity-focus · 0.08
Pressed
opacity-pressed · 0.12

Disabled & scrim

Disabled
opacity-disabled · 0.4
Dialog content behind
color-scrim · 0.5 backdrop
Layering

A z-index scale, so layers never fight

Overlapping surfaces stack in a deliberate, shared order — components read a named token (--gok-z-*) instead of inventing a number. The higher tier sits on top. The sticky topbar above already uses --gok-z-sticky.

z-sticky · 100
z-dropdown · 200
z-modal · 400