01 · Foundations
The values every screen is built from.
Colour, type, space, depth, material, motion and icons, read straight from the app’s stylesheet. Colours are OKLCH, so lightness steps stay even across hues and both themes come from one set of numbers.
Colour
A neutral, faintly violet grey palette in the spirit of iOS system colours, one blue accent and one orange brand colour. Dark mode swaps the surfaces to true black and greys; tokens marked “same as light” aren’t overridden in dark. Text tokens are the ink colour at lower alpha, so they sit right on any surface.
Brand
--brandMootionblue orange: the Ask Claude key and brand moments
oklch(0.683 0.211 37.698)oklch(0.683 0.211 37.698) same as light--brand-2Lighter orange for brand gradients
oklch(0.726 0.178 43.189)oklch(0.726 0.178 43.189) same as lightSurfaces
--bgThe window behind every panel
oklch(0.963 0.007 286.274)oklch(0 0 0)--surfaceCards, panels, the inspector and timeline shells
oklch(1 0 0)oklch(0.227 0.004 286.092)--surface-2Raised fills inside a surface, hovered rows
oklch(0.945 0.007 286.271)oklch(0.294 0.004 286.177)--surface-3Deeper fills and pressed rows
oklch(0.917 0.007 286.266)oklch(0.349 0.003 286.221)--boardThe stage board behind the video
oklch(0.935 0.007 286.27)oklch(0.227 0.004 286.092)--glassTranslucent floating bars, with blur
oklch(1 0 0 / 0.722)oklch(0.227 0.004 286.092 / 0.761)--glass-edgeThe 1px inner edge of glass
oklch(1 0 0 / 0.902)oklch(1 0 0 / 0.071)Ink and lines
--inkPrimary text and icons
oklch(0.227 0.004 286.092)oklch(0.965 0.003 286.35)--ink-2Secondary text and labels
oklch(0.227 0.004 286.092 / 0.62)oklch(0.965 0.003 286.35 / 0.639)--ink-3Hints, placeholders and units
oklch(0.227 0.004 286.092 / 0.42)oklch(0.965 0.003 286.35 / 0.42)--ink-4Disabled text and faint marks
oklch(0.227 0.004 286.092 / 0.22)oklch(0.965 0.003 286.35 / 0.2)--lineHairline dividers
oklch(0 0 0 / 0.059)oklch(1 0 0 / 0.071)--line-2Stronger borders and slider tracks
oklch(0 0 0 / 0.102)oklch(1 0 0 / 0.122)--dotThe dot grid on the stage board
oklch(0 0 0 / 0.11)oklch(1 0 0 / 0.102)Accent and status
--accentSystem blue: selection, focus rings, primary actions
oklch(0.603 0.218 257.424)oklch(0.625 0.206 255.486)--accent-2Lighter blue for gradients
oklch(0.685 0.17 252.993)oklch(0.685 0.17 252.993) same as light--accent-softTint behind selected rows and chips
oklch(0.603 0.218 257.424 / 0.122)oklch(0.625 0.206 255.486 / 0.2)--on-accentText and icons on the accent
oklch(1 0 0)oklch(1 0 0) same as light--dangerDelete and errors
oklch(0.654 0.232 28.659)oklch(0.663 0.224 28.292)--goodSuccess and keys that are on
oklch(0.611 0.162 148.827)oklch(0.755 0.208 146.984)--warnWarnings
oklch(0.57 0.138 57.053)oklch(0.825 0.149 73.346)Controls
--field-bgWells for fields, selects and segmented controls
oklch(0.569 0.015 285.906 / 0.102)oklch(0.569 0.015 285.906 / 0.22)--key-faceThe face of a key
oklch(0.945 0.007 286.271)oklch(0.294 0.004 286.177)--key-face-hoverThe face of a key on hover
oklch(0.923 0.007 286.267)oklch(0.322 0.005 286.101)--key-edgeThe 3D edge under a key
oklch(0.862 0.007 286.255)oklch(0.197 0.004 286.029)Contrast
WCAG 2 ratios for the pairs the app relies on, with alpha composited over the real surface. Body text needs 4.5:1; large or bold text and icons need 3:1.
| Pair | Light | Dark |
|---|---|---|
--ink on --bgBody text on the window | Aa 15.3:1 AAA | Aa 19.0:1 AAA |
--ink on --surfaceText on cards and panels | Aa 17.0:1 AAA | Aa 15.4:1 AAA |
--ink-2 on --surfaceLabels on panels | Aa 4.8:1 AA | Aa 7.0:1 AA |
--ink-3 on --surfaceHints and units | Aa 2.6:1 Below 3:1 | Aa 3.8:1 AA large |
--on-accent on --accentText on accent keys | Aa 4.0:1 AA large | Aa 3.6:1 AA large |
--accent on --surfaceLinks and the accent on panels | Aa 4.0:1 AA large | Aa 4.7:1 AA |
--danger on --surfaceDelete labels | Aa 3.5:1 AA large | Aa 5.0:1 AA |
--good on --surfaceOn-state keys | Aa 3.5:1 AA large | Aa 8.4:1 AAA |
Watch these pairs. --ink-3 is under 3:1 on light surfaces: keep it for units, placeholders and icons next to a
label, never for a sentence. White on --accent is about 4:1 in light and 3.6:1 in dark, so accent keys keep to short
semibold labels; a step darker accent would clear 4.5:1. --good and --danger on light surfaces work as icons and short
words, not as body text.
Timeline colours
Clips are two-stop gradients by layer type, with a soft wave on top. Section pills take the colour the section was given, at 12–14% for the fill.
oklch(0.695 0.191 300.788)oklch(0.561 0.239 295.146)oklch(0.764 0.126 249.168)oklch(0.624 0.161 256.028)oklch(0.719 0.148 255.812)oklch(0.579 0.19 260.532)oklch(0.823 0.136 67.559)oklch(0.722 0.162 55.816)oklch(0.735 0.16 355.121)oklch(0.626 0.196 1.838)oklch(0.813 0.117 158.841)oklch(0.684 0.127 158.76)oklch(0.766 0.136 308.698)oklch(0.604 0.198 303.315)Typography
Inter carries the interface at a 13px base with character variants cv11 and ss01 (the single-storey a and the open
digits), antialiased. Numbers that change use tabular figures so they don’t jitter.
Every label, field, menu and heading. Weights 400 to 700.
The wordmark at 900, −0.03em. Also the default face for text layers in videos.
Only inside the “One shape” template tile, where it matches the demo video’s own type.
var(--mono)
0:00.0
The system mono stack (SF Mono, Menlo) for timecodes, code layers and inline code.
Type scale
The sizes the app actually uses, largest first. Most of the interface lives between 11 and 15px; 13px is the base.
Weights
Numbers
Spacing
An even rhythm with a few odd steps for optical fixes. Gaps of 6, 8 and 10px cover most of the app; rows are 36px tall, keys 40px (32px small), the top bar 64px and the inspector 400px wide.
Radii
Corners grow with the size of the surface: 10px for controls, 12px for keys, 14px for menus, 18px for cards and 22px for the big panes. Nested corners shrink by the padding between them.
Elevation
Two shadows only. Cards sit on --card-shadow; anything that floats above the work, such as menus, popovers, the palette and toasts, uses --pop-shadow. Dark mode deepens both, since shadows read less on black.
0 1px 2px oklch(0 0 0 / 0.031), 0 8px 26px -14px oklch(0 0 0 / 0.122)
0 1px 2px oklch(0 0 0 / 0.059), 0 24px 60px -20px oklch(0 0 0 / 0.322)
0 1px 2px oklch(0 0 0 / 0.302), 0 12px 32px -14px oklch(0 0 0 / 0.6)
0 1px 2px oklch(0 0 0 / 0.4), 0 24px 60px -20px oklch(0 0 0 / 0.8)
Materials
Two materials give the app its feel: glass for things that float over the video, and keys you can press.
Motion
Two curves. Spring for things that appear or respond to a press: it overshoots a touch and settles. Ease for things that move or change colour: fast out, soft landing. Nothing uses linear except loaders.
cubic-bezier(0.2, 0.8, 0.2, 1)Hover fills, tabs, sliders, focus rings, fades.
cubic-bezier(0.34, 1.4, 0.64, 1)Menus, cards, the toast, keys lifting. It overshoots by about 10% before it settles.
Keyframes
Entrances are short and start close to where they land: 6–8px of travel and 96–98.5% scale, never a slide across the screen.
Durations
| Duration | Curve | Used for |
|---|---|---|
| 0.12s | ease | A key landing when pressed |
| 0.15s | ease | Hover fills, focus rings, field wells |
| 0.18s | ease | Small fades and colour changes |
| 0.2s | ease / spring | The workhorse: tabs, thumbs, menus closing |
| 0.28s | spring | Menus and popovers popping in |
| 0.3s | spring | The toast dropping in |
| 0.34s | spring | A key rising on hover |
| 0.42s | spring | Panels and cards entering, staggered 35ms |
| 0.6s | spring | The sign-in form arriving |
Reduced motion. Under prefers-reduced-motion: reduce the app drops travel and scale and keeps short fades, so state still changes visibly without movement.
Icons
Mootionblue’s own stroke set: 89 icons on a 24px grid, 1.8px stroke, round caps and joins, drawn from the real paths in
src/components/icons.tsx. Filled: play, diamond, bolt. Solid with a stroke: speakerOn, speakerOff. 19px is the default; tool rows use 19px, menus 15–16px.