Lab

Interface experiment

A countdown that anticipates each flip.

The browser clock stays authoritative. Digits keep their geometry while larger units quietly preload the next change.

065
days
0203
hours
0509
mins
05
secs

Experiment · Jun 2026

A countdown can be correct and still feel unstable

Numeric rhythm, browser time, reduced motion, and the point where mechanical anticipation starts to misrepresent reality.

A countdown can be mathematically correct and still feel unstable. The usual culprit is not the timer. It is the typography, the update model, or motion that tells a slightly different story from the value on screen.

Same time source, different treatment

Default figures

06
days
00
hours
00
mins
05
secs

Locked figures + motion

065
days
0203
hours
0509
mins
05
secs

Lock the geometry first

Proportional figures have different widths. When 11 becomes 00, the text can breathe horizontally and pull neighboring labels with it. tabular-nums makes every figure occupy the same advance width; lining-nums explicitly keeps their vertical treatment consistent.

Many interface fonts already default to lining figures, and monospace faces usually solve both axes by construction. Declaring the numeric behavior is still useful: the component keeps its contract when the font stack changes.

The browser clock is the source of truth

The countdown stores an absolute target, then derives the remaining duration from Date.now(). It does not subtract one second per interval. If a background tab is throttled for twenty seconds, the next frame catches up instead of continuing from stale local state.

React only re-renders when the displayed second changes. A Motion value carries the sub-second remainder for the anticipatory movement, keeping the high-frequency work outside the component render cycle.

Anticipation can become misinformation

Seconds snap at the boundary. Larger units begin to build tension during the final 1.5 seconds of their cycle, like a mechanical wheel taking up slack before it indexes.

That detail makes the transition easier to follow, but it introduces a real tradeoff: the next digit becomes partially visible before the value has changed. For a launch page, that expressive anticipation can be appropriate. For an auction, payment deadline, or any high-stakes clock, I would remove it and change every unit exactly at the boundary.

The point is not to animate every digit. It is to keep geometry, time, and motion in agreement, and to know when precision matters more than personality.