WIP primitives · pages to decide from

Six ways to build the bar

The most important interface in both tools is the transport, and there is to be one of it. WORDMAKE plays a clip: autoplaying, looping, technical — a frame counter, a clock, a rate, the frame as the unit a designer argues about. Morf plays a font's history: eleven builds of Geist Serif, evenly by beat, eased from one to the next with a hold, the build as the unit. Same bones, two registers, so every schema below is drawn twice on the same live clocks. Nothing on the stage is clickable any more; the bar is the whole instrument.

undecided

What all six obey

one primitive
play · scrubber · readouts slot. WORDMAKE mounts step / play / frames / clock / loop / rate. Morf mounts tune / play / builds / labels. Nothing is a per-app fork.
the unit
WORDMAKE's scrubber is in frames, never seconds. Morf's is in builds, spaced evenly by index — dates are labels, not distances.
scrubbing pauses
A head that runs away from the hand dragging it is the one thing a transport must never do. Every schema pauses on pointerdown and stays paused.
readouts
Tabular figures, one ink each: the counter full, the clock quiet. Loop is a state, not a color. The rate is a select, and it says 23.976, never a fraction.
keys
Space toggles. ←/→ step one unit; shift × 10 in WORDMAKE. Every bar is focusable and the ring is never removed.
the mark
Material, from the full face: play_arrow / pause FILL 1, wght 300 → 400 when on; repeat for loop, filled when on; the rate as its own ligature, 60fps_select. The shipped subset has none of these yet — both apps draw play and pause as Cal Sans glyphs today.
target
44px, as padding. The bar is 44px tall where it is a bar; where a schema is taller, the extra height is readout, not target.
no acid
--signal is not spent here. WORDMAKE's export button already wears it once per screen; a transport that glows would compete with it.
00

Icons

full face · FILL · wght · GRAD

The transport's vocabulary is already drawn. The full Material face in docs/fonts carries a media set the 24-ligature subset does not: play and pause in three forms, a combined play_pause, the steps, the seeks, repeat, and — the ones the bars had been faking with text — the frame rates as glyphs: 24fps_select, 30fps_select, 60fps_select, autofps_select, plus 30fps and 60fps without the select frame. Each is shown three ways on icon.css's axes: rest (FILL 0 · wght 300), on (FILL 1 · wght 400), and the dark-ground correction (GRAD 200). Every bar below now spends the rate ligature for its rate and repeat for loop; click a rate to cycle 60 → 30 → 25 → 24 → 23.976.

play_arrowplay_arrowplay_arrow
play_arrow
pausepausepause
pause
play_pauseplay_pauseplay_pause
play_pause
play_circleplay_circleplay_circle
play_circle
pause_circlepause_circlepause_circle
pause_circle
stopstopstop
stop
skip_previousskip_previousskip_previous
skip_previous
skip_nextskip_nextskip_next
skip_next
fast_rewindfast_rewindfast_rewind
fast_rewind
fast_forwardfast_forwardfast_forward
fast_forward
replay_5replay_5replay_5
replay_5
forward_5forward_5forward_5
forward_5
repeatrepeatrepeat
repeat
repeat_onerepeat_onerepeat_one
repeat_one
24fps_select24fps_select24fps_select
24fps_select
30fps_select30fps_select30fps_select
30fps_select
60fps_select60fps_select60fps_select
60fps_select
autofps_selectautofps_selectautofps_select
autofps_select
30fps30fps30fps
30fps
60fps60fps60fps
60fps
discover_tunediscover_tunediscover_tune
discover_tune
speedspeedspeed
speed
shutter_speedshutter_speedshutter_speed
shutter_speed
frame_inspectframe_inspectframe_inspect
frame_inspect

Two gaps. There is no ligature for 25 or 23.976 — the DOOH rates — so the rate icon falls back to the number in text for those two, which is a second grammar on one control and a reason the select may stay a select. And none of these is in the shipped subset: choosing a schema means adding its icons to fonts/MaterialSymbolsOutlined.woff2, both copies, and lint-icons.py will hold every consumer to it.

01

Deck

controls · track · readouts

What both apps have now, made one thing. Controls left, the track in the middle taking all the width there is, the numbers and options right. The only decisions are the ones the button page already made: one radius, one ink ladder, 44px bought as padding, the head a 2px hairline that grows under the pointer and thickens held. Boring on purpose — this is the control group.

WORDMAKE · 24.00s · 60 fps · loopframes
clip
001 / 14400.00s of 24.00s
MORF · Geist Serif · 11 buildsbuilds
ABCDEFGHIJKLM
v0.2 · Aug 17

What it costs. Nothing is wrong with it and nothing is learned from it. Loop and rate sit as furniture at the end of every bar whether or not anyone is about to change them, and the frame counter has to be read from two numbers and a slash.

02

Slate

readout-first

The number is the object. A broadcast slate: the frame count at 22px, tabular, is what the bar is for, and the track is a hairline underneath it that the head rides at 8px. The clock sits under the count as a caption. Play is an icon at the left; loop and rate recede to quiet caps at the right, one line, because they are settings and not readings. Morf turns the same slate to the build's own name — #4 · Aug 27 — with build 5 of 11 as its caption.

WORDMAKEframes
clip
001 / 1440
0.00s of 24.00s
MORFbuilds
ABCDEFGHIJKLM
v0.2 · Aug 17
build 1 of 11

What it costs. Height — 64px, and the track is small enough that scrubbing is a precision act. The counter changes sixty times a second at 22px, which is a lot of moving ink in the corner of the eye; it wants the imperative write WORDMAKE already does, not a re-render.

03

Ruler

the track is a timeline

The track is graduated. WORDMAKE's has a tick every second, a minor every half, and the seconds numbered along the bottom — the clip is 24 seconds and you can see all of them. The head is a full-height hairline with a flag riding it that carries the frame and the time together. Morf's ruler has one tick per build with every label written under it, alternating baselines so eleven names fit; the head's flag says which build. Play is set into the ruler's left cap as its origin.

WORDMAKEframes
clip
MORFbuilds
ABCDEFGHIJKLM

What it costs. Width, and it does not degrade — at 600px the second-labels collide and Morf's eleven names stack into a third row. It also decides the visual scale of the whole footer: a ruler is loud, and both apps' floors are meant to be quieter than what is above them.

04

Strip

the bar is the scrubber

The footer itself is the track. There is no track element: elapsed fills the whole 44px strip from the left as a lighter surface, the head is a hairline the full height, and pressing anywhere on the strip that is not a control seeks there. The controls sit on the fill. In Morf the fill steps — it jumps a build's width at each beat and the hairlines between beats show as seams — so the strip reads as a stack of eleven panels, one per drawing.

WORDMAKEframes
clip
001 / 14400.00s of 24.00s
MORFbuilds
ABCDEFGHIJKLM
v0.2 · Aug 17

What it costs. The controls sit on a surface that is also a target, so a miss on the play button is a seek — the hit areas have to be exact and the gutters between them can't be track. And the fill is the same surface-hi the pressed button uses, so "playing" and "held" share a color.

05

Cells

discrete

The unit made visible. WORDMAKE's bar is twenty-four cells — one per second — that fill as they play, the current one in full ink; the frame count stays as a number because a cell per frame would be 1440 of them. Morf's bar is eleven cells, one per build, which is the honest picture: a beat is a discrete thing, and this is the only schema where the scrubber has the same grain as the content. The current cell wears its label above it. Loop is not a button: when it is on, a repeat mark closes the row.

WORDMAKEseconds → frames
clip
001 / 1440
MORFbuilds
ABCDEFGHIJKLM

What it costs. WORDMAKE loses the frame as a scrub target — a cell is a second, sixty frames, and the fine seek moves to the arrow keys. In Morf the eleven cells only stay legible up to about thirty builds; a font with a year of beats needs the log, not the bar.

06

Overlay

broadcast

The bar is on the picture, and it gets out of the way. The live-broadcast register: a translucent strip over the bottom edge of the stage that shows on hover or focus and sinks away a moment after play begins, so the clip is seen the size it will ship at. It carries a LIVE dot that is lit while playing, a measured frame rate — the actual number the engine is achieving, not the one selected — and the progress as a full-ink line along the top edge that grows a head only under the pointer. For Morf the same strip lies over the specimen, with the build's name where the counter was.

WORDMAKEframes · measured fps
clip · hover to reveal
live 001 / 14400.00s of 24.00s — fps
MORFbuilds
ABCDEFGHIJKLM
v0.2 · Aug 17 1 of 11

What it costs. Discoverability, and a fixed relationship to the stage: it only works where the bar can lie on the picture, which in both apps means giving up the floor as a floor. The measured-fps readout is the one honest broadcast affordance here, and it is also the one that will read 58.9 on a laptop on battery and start a conversation nobody wants.