Milo BRAND + INTERFACE SYSTEM V1.0
10Interface system

Motion

Motion tells you where something came from, where it went, what changed, what is active and what completed. Quiet, physical, continuous, purposeful. Nothing moves to decorate.

7 DURATIONS · 4 EASINGS9 NAMED PATTERNS · LIVESOURCE: tokens/motion.json
Principles10.01

Five things motion is allowed to say.

If a movement does not answer one of these, it does not happen. Luxury here is restraint: the fewer things move, the more each movement means.

  • Fromwhere something came from — a run drops out of its row, not from the sky
  • Towhere it went — a dismissed ask leaves the way it came
  • Changedwhat is different now — a state glyph turns, a count advances
  • Activewhat is working — one pulse, on one glyph, at 1.6s
  • Completedwhat finished — a check, a hold, then stillness
Forbidden
  • Toy-like spring overshoot
  • AI blobs and orbs
  • Constant ambient movement in the interface
  • Gratuitous parallax
  • Cyberpunk glitches, VHS tearing, random distortion in the interface (the animated image layer has its own, stricter print-glitch rules on 05)
  • Decorative loaders that hide nothing real
  • Motion on hover that changes layout
  • Animating a painting like cheap AI video
Tokens10.02

Seven durations. Four easings.

The bars below are the values: press Play and each dot travels its track in exactly its duration; each curve is drawn from its cubic-bezier.

ambient (24s) shown as a fill
Token tables
DurationValueUseReduced motion
EasingCurveUsed for

CSS: --dur-* and --ease-* in tokens/milo.css. Under prefers-reduced-motion: reduce the same file collapses every duration to ≤120ms and dither/ambient to 0.

Catalogue10.03

Nine named patterns, demo beside spec.

Every pattern in tokens/motion.json, live on the left, specified on the right. The names are the ones used in the CSS and the engine.

expand · Task → Run
Render Day 1 voice trackrun 3 · step 2 of 5
Running
  1. Load reference clip0.8s
  2. Synthesise 2,140 words1m 12s
  3. Normalise loudness

01expand

collapse · Run → Task

The reverse of expand, faster, with the exit curve: what folds away should not linger.

  • Reply to the FAM print proof◇ FAM
    Queued

02collapse

emerge · Artifact from conversation

Done. Hero written at 2400×1600.

03emerge

voice-appear · voice-resolve · voice-dismiss

Fixed top-centre while it runs. Watch the top of the viewport.

04voice-appear

05voice-resolve

06voice-dismiss

theme-switch
  • Reprint the series art◇ Euangelion
    Running

Colour tokens crossfade; imagery re-maps to the Nous recipe in dark.

07theme-switch

dither-propagate
ORIGINAL

Half Dome, Carol M. Highsmith, Library of Congress. Public domain.

08dither-propagate

ambient-nature · appears still
Alpine lakes and forest, Denali National Park

Carol M. Highsmith, Library of Congress. Watch for a minute; it should feel like weather, not a loop.

09ambient-nature

All nine, as a table
PatternDurationEasingNoteWhere
Choreography10.04

What moves first.

A surface enters in the order you read it: the statement, its meta, the rows one after another, Milo's activity line, then the figure. Nothing overlaps enough to feel busy; nothing waits long enough to feel slow.

Today · entering

What matters now

Cut the Daily Bread Day 4 opener.

◇ Daily Breadest. 40 minLocal
  • Reply to the FAM print proof◇ FAM
    Queued
  • Approve Euangelion render batch 7◇ Euangelion
    Needs you
  • 3 more today
    tucked

◉ Milo is rendering Euangelion batch 8 on the M4 · 3 of 12 · 2m 14s

Half Dome, Archive recipe
idle
statement
0 · slow meta
+80 row 1
+140 row 2
+180 row 3
+220 activity
+360 figure
+600

scale: 1 unit = 12ms · total ≈ 960ms · each beat = emerge (slow · enter)

Rules
RuleValueWhy
Beatemerge · slow (360ms) · enterone pattern for everything that enters; the ear learns one rhythm
Row stagger40msreads as a list arriving, not as separate events
Maximum entry≤ 1s to last beata surface must be usable before it has finished arriving
Imagery last+600msthe figure is the least urgent thing on Today
Navigationnever animates on entrythe rail is furniture, not content
Reduced motionall beats at 0ms, 120ms fadeorder is preserved by layout, not by time
The animated image layer10.05

Ten percent of images move.

The image engine has its own motion: reveal, drift, glitch and pixels, applied with data-fx. It is specified on 05 Imagery §animated; one example here so the catalogue is complete.

Grand Teton in autumn: dither reveal on entry
Carol M. Highsmith
Fall display in Grand Teton National Park
Library of CongressNo known restrictions
mode
data-fx="reveal" — once, when scrolled into view
duration
1500ms, ease-out cubic (print easing approximation)
stages
original → pixels → dither → channels → interpretation → data
after
holds the recipe; nothing recomputes at rest
reduced
final frame drawn immediately
others
drift (breathes every 4.2s) · glitch (≤420ms print burst, seconds apart) · pixels (24px → clean)
Reduced motion10.06

Nothing is lost except the movement.

Under prefers-reduced-motion: reduce every transition collapses to an opacity change of 120ms or less, ambient motion stops, and the dither transition draws its final frame at once.

This browser: checking…

Same surface · full motion

Approve the Euangelion batch.

  • Reprint the series art◇ Euangelion
    Running
  • Write the Thursday note◇ Personal
    Idle
What changes, exactly
Under reduceFullReducedSource
--dur-fast / base / slow / reveal140 / 220 / 360 / 600ms80 / 120 / 120 / 120mstokens/milo.css media query
--dur-dither1400ms0 — final frametokens/milo.css · engine/canvas.js
--dur-ambient24s0 — stilltokens/milo.css
State pulse (.state-active)1.6s loopnonemilo.css
Voice pill ringbreathe / spin / pulsenone; state word still changesmilo.css
data-fx imagesreveal / drift / glitch / pixelsfinal frame onlyengine/fx.js
Scroll behavioursmoothautomilo.css