skip to content
design system · build manual

Assembly instructions.

Every piece this site is built from, in the order it goes together. Each step lists its parts, then shows them assembled, live, from the same components the pages use.

Set No. 2026ahmed things.
Ages 4 to 9981pcs · drag to turn
Pick a colorway · the whole set repaints

What’s in the box

8 bags · 81 pcs
  1. 31 pcs
    Paint
  2. 8 pcs
    Aa
    Type
  3. 6 pcs
    Signals
  4. 12 pcs
    Buttons
  5. 10 pcs
    Surfaces
  6. 2 pcs
    d#s1gn
    Moves
  7. 10 pcs
    Stage
  8. 2 pcs
    Ray
Step 1

Paint the ground

Semantic tokens first. Components never reference a raw value, so one attribute on the page swaps every color at once.

Parts
  • 18x
    color tokens
    --background…
  • 7x
    stage aliases
    --stage…
  • 6x
    colorways
    data-theme
1a · active colorway
background
--background
foreground
--foreground
card
--card
muted
--muted
muted fg
--muted-foreground
primary
--primary
accent
--accent
destructive
--destructive
border
--border
hairline
control border
--control-border
outline buttons
ring
--ring
focus
ink warm
--ink-warm
headline
ink cool
--ink-cool
headline
hazard
--hazard
Ray's lamp
forest
--forest
accent
navy
--navy
accent
pink
--pink
brand
red
--red
brand
1b · stage layer

What the playground paints with. Each is an alias onto the active colorway, so a prototype asks for --stage and gets whatever ground the site is wearing.

stage
--stage
the prototype ground
stage ink
--stage-ink
primary marks
stage muted
--stage-muted
readouts
stage line
--stage-line
hairlines
line strong
--stage-line-strong
tracks, dividers
stage panel
--stage-panel
panel material
stage accent
--stage-accent
selected, markers
1c · paint chart · 6 colorways

Every colorway at once: its ground, its swatches, its five lights, its three hero colors, and the marker a text selection lays down.

Dark
Blue marker
Light
Blue marker
Red
Yellow marker
Yellow
Blue marker
Blue
Lilac marker
Green
Mint marker
Step 2

Set the type

Inter for everything. Display runs big and tight; meta stays small, uppercase and spaced. Nothing ad hoc between the steps of the ramp.

Parts
  • Aa
    1x
    family
    Inter
  • AAAAA
    8x
    sizes
    10px → 144px
2a · the four voices
display · h1

The layer between systems and people.

title · h3

Ray is an autonomous car for the modern human.

body

Reviewed production code, not handoffs. Body copy runs at a comfortable measure with relaxed leading for reading.

meta

01 · shipped

2b · the ramp

Chrome sizes at the bottom, display at the top. Display is fluid: 44px on a phone to 120px on a 2200px screen, so the headline holds its proportion edge to edge.

1
text-micro
10px
Tags, swatch keys, tile index
2
text-meta
11px
Eyebrows, meta rows, readouts
3
text-xs
12px
Body copy, tile descriptions
4
text-sm
14px
Footer, small buttons, dense chrome
5
text-base
16px
Lede paragraphs, card blurbs, buttons
6
text-xl
20px
Hero subline, hero buttons
7
text-[1.875rem]
30px
Wordmark and nav at full width
8
display
44–144px
Headlines: 5.45vw, -0.06em
Step 3

Wire the signals

The recurring motif: status made physical. Flat dots, an optional opacity pulse, no glow. One color per state.

Parts
  • 1x
    green
  • 1x
    cyan
  • 1x
    amber
  • 1x
    red
  • 1x
    violet
  • 1x
    muted
3a · what each light means
  • greenshipped / operational
  • cyanlive / running now
  • amberin progress / draft
  • rederror / offline
  • violetarchive / reference
  • mutedidle / retired
3b · sizes and states
sm · md · lg
pulse
steady
The label always names the light
green
shipped
a case study that went live
amber
in development
a build still in progress

Every status string in the content is drawn from this column. Playground entries carry none: every piece there is live, so a light would say nothing.

Step 4

Snap on the buttons

Chunky. Generous padding, a 10px corner, Inter Medium in sentence case. Hover is a hard swap: the filled button turns a second RAY color, the outline fills with the ink.

Parts
  • 4x
    variants
  • 5x
    sizes
  • 3x
    corners
    6 · 8 · 10px
4a · variants · hover each one
4b · sizes · sm, default, lg, hero, icon
4c · corners
--radius-sm · 6px · tagsReact
--radius-md · 8px · cards
--radius-lg · 10px · buttons
4d · focus · tab to these
Link
Focus rules
two classes
.focus-ring for site chrome, .focus-ring-stage for anything painting on a prototype stage. Nothing else. There used to be three treatments chosen per component.
two-step ring
A ring of the ground color, then a ring of --ring outside it. The gap is drawn rather than offset, so it reads the same on a card, a page, and a colored stage.
never removed
outline: none only ever appears together with the replacement ring, so a keyboard user is never left without one.
baseline
Anything that opts out still gets the global :focus-visible outline. The floor is never nothing.
Step 5

Lay the surfaces

Every card on the site. One flat panel, one tile in three layouts, and the poster card the index uses for the playground. Hover settles a shade darker; nothing lifts.

Parts
  • 1x
    card
  • 3x
    tile · default
  • 2x
    tile · thumbnail
  • 2x
    tile · banner
  • 2x
    poster card
5a · card · grouped, non-interactive
Card title
A short supporting description that sits under the title in muted foreground.
Card content region. Used for grouped, non-interactive information.
5b · tile · default
→ linklive

Interactive Link Tile

The whole surface is a link. On hover the border and panel settle a shade darker.

// staticsystem

Non-Interactive Tile

Same surface without an href, for read-only information.

// specimenin review

Tile with Children

Tiles accept arbitrary content below the description.

  • React
  • TypeScript
  • Canvas
5c · tile · thumbnail and banner
→ playground7 pieces

Playground

Every experiment on the index, each one live in the browser.

→ indexsystem

Placeholder Media

Without an image the plate draws registration marks, so a tile never waits on artwork.

// staticarchived

Banner, No Link

The strip runs edge to edge; padding moves to the text column. Tags pin to the bottom so a row lines up.

  • Tailwind
  • Tokens
Step 6

Add the moving words

Two text interactions and no more. A word that scrambles into an alternate on hover, and a selection marker hijacked per colorway.

Parts
  • d#s1gn
    1x
    scramble
    ScrambleText
  • mark
    1x
    marker
    --highlight
6a · scramble · hover the word, or tap it

I'm Ahmed, a product designer working in the layer between complex systems and the people using them.

ahmed thingsthe wordmark, one alternate

6b · marker · drag across this text

Select any part of this paragraph and it paints in the active colorway’s marker. A run wrapped in mark uses the same pair, so a deliberate highlight and a dragged selection read as one gesture. Every colorway’s marker is on the paint chart in step 1.

Scramble rules
rest
The first word is home. It renders on the server, and every hover returns to it — the sentence never drifts from what it says at rest.
hover
In shows the next alternate in the set, out jumbles back. A word with several alternates reveals a new one every time.
no chrome
Nothing marks the word. No underline, no color shift, no cursor change — it is found by moving across it.
slot
Sized to the longest word in the set and held there, so a shorter word can never pull the copy behind it up a line.
touch
No hover to leave, so a tap steps through the whole set instead — the resting word included.
reduced motion
The word swaps in place with no churn. Same content, no animation.
assistive tech
The churning letters are aria-hidden; a stable copy of the settled word sits alongside them.
Step 7

Build the stage

The surface a prototype runs on, painted in stage tokens. A 44px bar on top, the canvas, a panel of controls, a readout. Everything here is live.

Parts
  • 1x
    bar
  • 1x
    stage
  • 8x
    controls
7a · the bar · the one line of chrome above a piece
back to playground01

Ray Studio

7b · the controls · drag, tap, switch
0.42
Cyan
group · actions
7c · the stage · panel right, readout under
mode flowdensity 64

under the canvas on a wide screen, above it on a narrow one

Controls, one job each
presets
Whole states as preview tiles, chosen by eye. They lead the panel, since one tap is the fastest way into a piece on a phone. None is selected once the state is tuned off every preset.
tabs
Pick one of two to five short options: a finish, a mode, a camera view, a panel page. The pill slides to the choice; arrow keys move it.
switch
A single on/off. The whole row is the target, label left, switch right.
slider
Label left, live readout right, the track filling with the accent up to a round thumb (20px, 28px on touch). Horizontal drags move it, vertical ones scroll the panel.
swatches
A color from a set. The selected one carries an inset ring.
select
Only for a list too long or too wordy for tabs, six options and up.
chip
An action, never a state: share, save, reset. Choosing is tabs; toggling is a switch.
group
A titled section behind a hairline.

Most visitors play on a phone, so every target grows to 44px on touch. A prototype that needs a new kind of control adds it here first.

Stage rules
one grid
Canvas, readout and panel are tracks of .stage-grid, so a canvas sizes to its own track and runs edge to edge. Nothing ever covers the canvas edge.
the rail
On a wide screen the divider is a rail down the panel's left edge: drag to resize (remembered per piece), click to collapse.
the sheet
Below sm the panel is a sheet that rests at collapsed, half (the default) or full. Drag the header and it snaps to the nearest, flick it up for full, tap to collapse. Full is the one height that covers the canvas.
readout
Under the canvas on a wide screen, above it as one line on a phone.
the bar
A prototype route has no intro page. The 44px bar carries back, number, title, info, versions, status, next and theme, so the stage keeps the viewport.
Step 8

Drop in Ray

The last piece goes in and the model is done. Ray rides the index's hero in the colorway's primary, with the hazard mark blinking on the car's own clock.

Parts
  • 1x
    Ray
    ray.obj
  • 1x
    hazard mark
    --hazard
  1. Paint
  2. Type
  3. Signals
  4. Buttons
  5. Surfaces
  6. Moves
  7. Stage
  8. Ray

Model complete.