WIP primitives · pages to decide from
Seven ways to say play
The button page decided how a thing looks when pressing it does something. This is the one control where pressing it does two things, and the whole design question is what carries the difference. Seven answers, one per carrier — the mark, the ring, the word, the ground, the enclosure, the elevation, the surface — each drawn once, live, on the same fake ninety-second clip. As different from each other as the brief allows, and none of them a copy of the one everyone knows; what that one gets right is listed below, and every family here has to get it right in its own language.
undecided
What all seven obey
- state
- Both states legible at rest, not only in the moment of the toggle. A paused control must look paused to someone who did not see it pause.
- target
- 44px, bought as padding, never as size. The mark is 20–28px; the target is not.
- press
- Stroke before fill: 1.2px under the pointer, 1.8px held. Where there is no stroke, the family names its own equivalent.
- ink
- faint / quiet / full. Hover and pressed never share one; paused and playing never share one either.
- keys
- Every control is a
<button aria-pressed>. Space and Enter toggle; the focus ring is 2px on the signal, offset 2, and it is never removed.
- mark
- Material Symbols, wght 300, FILL 1 for the two glyphs that have a filled form. Emphasis rides GRAD and one weight step, never a second drawing.
- time
- Where a family shows elapsed time it is tabular, and it is the only number on the control.
- motion
- The toggle is 240ms on the house curve. Progress advances linearly. Nothing loops.
01
Morph
mark
The mark is the state. One filled shape, two halves, and the triangle becomes two bars by each half becoming one. No box, no ring, no word — the same object is read twice. The press law without a stroke: under the pointer the halves take one more pixel of ink each way.
elapsed0:00
What it costs. Everything rides on the morph reading as one object; at 20px the halves are 6px bars and the join shows in the middle frame. And it says nothing about where you are — it is the only family here with no clock in it.
02
Ring
enclosure
Progress is the enclosure. The circle is the corner law's one permitted circle, and its stroke is the clip: elapsed in full ink, remaining as the hairline. The stroke obeys the press law directly — 1 at rest, 1.2 under the pointer, 1.8 held — so the ring is the button, and the mark inside only names the state.
elapsed0:00
What it costs. A ring cannot be scrubbed with any honesty, and it wants room: at 72px it is the biggest control here for the least information. The full-ink arc also competes with the mark for "chosen", so the mark has to stay quiet until playing.
03
Word
rule
The type is the control. The button page's own argument, taken at its word: no mark at all. "Play" rolls up to "Pause" the way a departures board turns, and the solid rule thickens by the press law. Playing, the elapsed time arrives after the word — the only number, tabular.
elapsed0:00
What it costs. It is words, so it is a language. And it depends on the rule family's absolute condition: nothing else on the page may be underlined. It also cannot shrink — at micro size the roll is a flicker.
04
Lozenge
ground
The pill is the timeline. The wash is the ground and the ground is the clock: elapsed fills from the left at 16%, the rest sits at 6%. Tap anywhere on it to toggle; drag along it to scrub. Mark left, time right, and the whole thing is one target, which is the one thing a row of separate controls never is.
elapsed · remaining0:00
What it costs. Two gestures on one surface, so the tap has to be distinguished from the drag's first pixel. The 6% resting wash is the lozenge family's known risk — on --surface it is nearly gone. Width: it earns its pill by being wide.
05
Bracket
enclosure
The enclosure becomes the mark. Corner ticks around a triangle, closing on approach as the bracket family does. Press play and the two vertical pairs run to full height and thicken until they are the two bars — the frame that meant "press me" turns into the glyph that means "playing". The triangle leaves; nothing is added.
elapsed0:00
What it costs. The cleverest and the least self-evident: paused, it is a bracketed triangle, and a bracket already means "field" on the button page. Two meanings on one device, and the morph needs the full 240ms to be read as a transformation rather than a swap.
06
Plate
elevation
State is elevation. A latching key. Paused is raised; playing is pressed into the ground and stays there, the way a tape deck's play key stays down. The mark barely changes — the hill and the hole do the talking, and pressing a key that is already down is the most familiar gesture on this page.
elapsed0:00
latching
What it costs. The plate family's fault, inherited whole: an inset shadow follows the radius but not the corner-shape, so the well is a rounded rectangle inside a superellipse. And a down key reads as "on" only if there are no other keys nearby that are simply flat.
07
Stage
surface
The surface is the button. There is no control to find: the whole stage toggles, and the confirmation is a large ghost of the new state that blooms and fades at the center — feedback for a change you might not otherwise see. What persists is small and in the corner: the state mark, the time, a hairline of progress along the bottom edge that thickens under the pointer.
elapsed0:00
What it costs. The largest target and the least discoverable: there is nothing to see until you touch it, so the corner status has to carry the resting state alone. It is also the only family that is a behavior more than a control — it wants keyboard and a hover reveal to be complete.