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.
What’s in the box
8 bags · 81 pcsPaint the ground
Semantic tokens first. Components never reference a raw value, so one attribute on the page swaps every color at once.
- 18xcolor tokens--background…
- 7xstage aliases--stage…
- 6xcolorwaysdata-theme
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.
Every colorway at once: its ground, its swatches, its five lights, its three hero colors, and the marker a text selection lays down.
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.
- Aa1xfamilyInter
- AAAAA8xsizes10px → 144px
The layer between systems and people.
Ray is an autonomous car for the modern human.
Reviewed production code, not handoffs. Body copy runs at a comfortable measure with relaxed leading for reading.
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.
- text-micro
- 10px
- Tags, swatch keys, tile index
- text-meta
- 11px
- text-xs
- 12px
- Body copy, tile descriptions
- text-sm
- 14px
- Footer, small buttons, dense chrome
- text-base
- 16px
- Lede paragraphs, card blurbs, buttons
- text-xl
- 20px
- Hero subline, hero buttons
- text-[1.875rem]
- 30px
- Wordmark and nav at full width
- display
- 44–144px
- Headlines: 5.45vw, -0.06em
Wire the signals
The recurring motif: status made physical. Flat dots, an optional opacity pulse, no glow. One color per state.
- 1xgreen
- 1xcyan
- 1xamber
- 1xred
- 1xviolet
- 1xmuted
- greenshipped / operational
- cyanlive / running now
- amberin progress / draft
- rederror / offline
- violetarchive / reference
- mutedidle / retired
The label always names the light
- a case study that went live
- 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.
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.
- 1xcard
- 3xtile · default
- 2xtile · thumbnail
- 2xtile · banner
- 2xposter card
Interactive Link Tile
The whole surface is a link. On hover the border and panel settle a shade darker.
Non-Interactive Tile
Same surface without an href, for read-only information.
Tile with Children
Tiles accept arbitrary content below the description.
- React
- TypeScript
- Canvas
Playground
Every experiment on the index, each one live in the browser.
Placeholder Media
Without an image the plate draws registration marks, so a tile never waits on artwork.
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
One card-colored panel, the piece's art moving in the theme's primary on top, then the number, the title at display size, and the blurb.
Particle Field
An instrument, not a toy. Three switchable force fields over 5,000 particles — flow, swarm, orbit. Tune it, recolor it, share the exact state by URL.
Pattern Weaver
A loom for woven marks. Paint a 9×9 unit, animate it frame by frame, tile it into repeats and mosaics, then export SVG, animated SVG, or canvas JS.
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.
- d#s1gn1xscrambleScrambleText
- mark1xmarker--highlight
I'm Ahmed, a product designer working in the layer between complex systems and the people using them.
ahmed thingsthe wordmark, one alternate
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
- 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.
- In shows the next alternate in the set, out jumbles back. A word with several alternates reveals a new one every time.
- Nothing marks the word. No underline, no color shift, no cursor change — it is found by moving across it.
- 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.
- No hover to leave, so a tap steps through the whole set instead — the resting word included.
- The word swaps in place with no churn. Same content, no animation.
- The churning letters are aria-hidden; a stable copy of the settled word sits alongside them.
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.
- 1xbar
- 1xstage
- 8xcontrols
Controls, one job each
- 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.
- 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.
- A single on/off. The whole row is the target, label left, switch right.
- 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.
- A color from a set. The selected one carries an inset ring.
- Only for a list too long or too wordy for tabs, six options and up.
- An action, never a state: share, save, reset. Choosing is tabs; toggling is a switch.
- 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
- 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.
- On a wide screen the divider is a rail down the panel's left edge: drag to resize (remembered per piece), click to collapse.
- 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.
- Under the canvas on a wide screen, above it as one line on a phone.
- 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.
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.
- 1xRayray.obj
- 1xhazard mark--hazard