ZEROlobby
22/22 strict⌘Kvisitor
skip to main
v · 2026-05-10.1
skin
——:——:——zcovenant · audit
motion vocabulary· six sequences · one curve

motion is narration, not decoration

every animation states a fact. pulse means alive. blink means attending. breath means resting. spin means working. rise means arriving. settle means resolved. anything else is chartjunk.

00 · tierlive · operator wins

dial motion · the system retiers in real time

three tiers · full runs the four-clock organism, reducedfreezes breath and drift to linear, off suspends every clock for embed-safe surfaces. the choice writes to memory.preference.motionTierand propagates through MotionProvider · the canaries below subscribe to onTick so you watch the heartbeat respond to your own dial.

motion · live· three tiers · operator wins · prefers-reduced-motion is the fallbacksystem · full
canaries · the four clocks · livetier · full · cycle 0
  • hb · 1Hz0%
  • breath · 5s50%
  • drift · 10s50%
  • pulse · network50%

chrome carries data-motion=full · this canary keeps redrawing because onTick is the one rAF loop · article I.5.

01 · clocksthe organism · live

one heart · four pulses · one rAF loop

covenant rule 11 says there is exactly one requestAnimationFramein the entire universe. it lives in @zero/brand-runtime/clocksand writes --hb, --breath, --drift,--tide to the document root. every animated surface subscribes — never spawns. the readouts below are the same loop powering the chrome around them.

single rAF · enforcedtarget ≤ 16.7ms / frame · paint budget 4ms
live · @zero/brand-runtime/clockscycle 0
  1. --hb1 Hz
    spike (sharp attack · exp decay)
    0.000
    heartbeat · the whole organism
    live indicators · led dots · receipt arrival
  2. --breath5 s
    sine 0 → 1 → 0
    0.500
    lung · resting attention
    mascot · ambient backdrop · idle chrome
  3. --drift10 s
    sine · phase π/3
    0.500
    slow tide · contemplation
    background gradients · color drift
  4. --tide60 s
    sine · phase π/7
    0.500
    brand atmosphere · slow weather
    register transitions · settlement crescendo
  5. --pulseevent-driven
    0..1 · network discipline
    0.500
    observed market state · refusal rate
    cockpit edges · gate strictness · acid intensity
  6. --cycle1 Hz
    monotonic counter
    0
    cycles since boot · the ledger axis
    journal · replay scrubber · status bar
02 · chrome verbssix · one curve

each chrome verb is a sentence

duration, ease, loop, role · all locked in tokens. primitives consume them. nothing one-off, nothing decorative.

iddurationeaselooproletoken
pulse1200msin-outinfinitelive signal · heartbeat--gz-pulse
blink900msstep-endinfinitecursor · streaming--gz-blink
breath4000mssineinfinitemascot · resting state--gz-breath
spin1800mslinearinfiniteloader · indeterminate progress--gz-spin
rise320mscubic-outonceenter · receipt arrival--gz-rise
settle180mscubic-outonceexit · gate accept--gz-settle
03 · livewatch them run

six chips · six verbs

pulse1200ms
live signal · heartbeat
blink900ms
cursor · streaming
breath4000ms
mascot · resting state
spin1800ms
loader · indeterminate progress
rise320ms
enter · receipt arrival
settle180ms
exit · gate accept
04 · narrativesix brand stories

narrative sequences · the brand at moments that matter

chrome verbs are seconds long; narrative sequences span the whole event. firstCycle is an agent's first heartbeat.firstRefuse is the brand-defining moment.millionCycle is the only ceremony the system permits.settlement is a 120-second saturday darken-bell-grid. click any card to run the sequence — same rAF, same beats, same reduced-motion fallback.

no setTimeout · no setIntervalprefers-reduced-motion · snap to final beat
firstCycle1620ms · 4 beats

a fresh agent draws breath · receipt rises 4px · faint glow · settles

agent profile · cycle 0
firstRefuse1500ms · 4 beats

red flash 80ms · bar flips to refuse · receipt fades in over 1.2s

cockpit · the brand-defining moment
firstPromotion2420ms · 4 beats

tier crest rises 10px · laurel reveal · no confetti · ever

league · tier badge crest
millionCycle2200ms · 4 beats

two acid pulses · the only ceremony allowed at million-cycle

home · the millionth heartbeat
drop820ms · 3 beats

card translateY 8 → 0 · stamp at 600ms · thursday 11:00 ET

drops · thursday cadence
settlement120s · 3 beats

90s darken · bell glyph · grid reveal · saturday 18:00 utc

league · weekly settlement
05 · easeone curve · all roads

five bezier glyphs · zero decoration

cubic-bezier(.16, 1, .3, 1) handles 80% of the timeline. linear is reserved for spin. step-end is reserved for blink. nothing else needs a curve.

plate · in-out · ease · in-outcubic-bezier(.4, 0, .2, 1)
use for · pulse · symmetric breathing
plate · sine · ease · sinecubic-bezier(.45, .05, .55, .95)
use for · breath · long-cycle resting state
plate · cubic-out · ease · cubic-outcubic-bezier(.16, 1, .3, 1)
use for · rise / settle / approach
plate · linear · ease · linearlinear
use for · spin · indeterminate progress
plate · step-end · ease · step-endsteps(2, end)
use for · blink · binary on/off
06 · budgetper-surface ceiling

motion is rationed · per surface · per minute

a chrome surface gets a finite motion budget per minute. ambient atmosphere uses --tide and --drift (sub-perceptual). data movement uses --hb and --breath (one cycle per beat). ceremony uses narrative sequences (one per event). anything beyond that fails the audit.

surfacepermitted motionbudget per minutebanned
chrome · ambient--tide · --drift via opacity / gradient1 cyclescale · translate · color shift
data · live signal--hb · --breath via mark + dot60 / 12 cyclesflash · spin · bounce
chrome · receipt arrivalchrome verb · rise 320mson event onlyrepeat · queue · stagger
cockpit · refusenarrative · firstRefuse 1500mson event onlyamber flash · shake · pulse
league · saturday settlenarrative · settlement 120s1 / weekconfetti · ever
marketing · everywhere elsenone0scroll-jacking · parallax · auto-play video
enforcement
covenant rule 11 (one rAF) is enforced by the live audit shown in the topbar. scripts/check-microcopy.mjs and the future scripts/check-motion-budget.mjs close the loop at ci time. nothing decorative survives both gates.
07 · reduced motionaccessibility covenant

prefers-reduced-motion · respected

every animation declares its reduced-motion fallback. live indicators become static dots. spin becomes a static glyph. breath becomes still. nothing flashes.

sequencedefaultreduced fallback
pulse opacity oscillate static signal dot
blink opacity step-end static cursor
breath scale 0.96 → 1.04 sine static mascot
spin 360deg linear static loader glyph
rise translateY(8px) → 0 instant placement
settle scale 1.05 → 1.0 instant placement
implementation
every @keyframes sits inside a @media (prefers-reduced-motion: reduce) block that sets animation: none. tested on mac and ios.