RelayCTX / Motion Lab · exploration

The pulse is the one living thing.

v3.5 bans shadows, gradients, and glow, so motion is the only channel for warmth. This lab extends the ratified pulse family into the interaction layer: how creating, sending, claiming, and waiting should feel in the app. Every demo runs on the real tokens, the real mark, and the real colour law. Nothing here is ratified until it lands in SPEC.pulse-motion.md.

relay-tokens-v35.css relay-pulse.css exploration · not ratified July 2026
Q3 pricing brief
Working context
Anywhere else
Q3 pricing brief
Received

The whole loop, as one sequence. Press Create relay.

Touch

The product layer. Everything here stays at or under 0.18s, runs once, and reads as acknowledgement, not decoration. The Code gets the most care: it is the artifact, so it gets the most tactile feedback in the system.

Copied
Copy cascadeProposed

Click the Code: characters lift in a 28ms wave and a pulse underline sweeps once. Copying is the most repeated act in the product; it should feel like picking the Code up.

0.34s + staggerease-out-quart#00D9C8 sweep · once.rly-copy-cascade
Code materializeProposed

A fresh Code lands character by character, 55ms apart, like it is being minted. Runs once at creation, then the Code holds still forever. Click to replay.

0.3s + staggerease-out-quartsystem teal.rly-materialize
Shutter toggleProposed

A switch built from the mark: off is the core alone, on opens the rays clockwise in 30ms steps. For settings that turn a signal on: notifications, nudges, public visibility.

0.28s + staggerease-out-quartsystem teal.rly-shutter
Press weightRatified v3.5

Buttons compress to 0.97 on press and release on a 120ms out-curve. In dark mode the fill keeps the ink-flip: bright teal, near-black label. No lift, no shadow; weight comes from scale alone.

0.12sease-out-quartscale 0.97product layer

Arrivals

Event moments. Something crossed a boundary right now, and #00D9C8 is allowed exactly here: once, briefly, in motion. Loops never qualify.

Receipt flashRatified v3.5

The moment a relay is received, a pulse ring expands off the Code container and dies in 0.9s. Family behaviour 2, shown here on the claim surface. Click to replay.

0.9sease-out#00D9C8 · once.rly-receipt-flash
Handoff noted2m
Session closed14m
Stream arrivalProposed

A new Stream item slides in from above while the feed settles beneath it; its dot carries one arrival ring, then the item is ordinary.

0.4sease-out-expo#00D9C8 ring · once.rly-stream-in
relay-kb refresh · awaiting your pass
Nudge blinkProposed

A nudge is a tap on the shoulder, not an alarm: two soft border-and-dot beats in system teal, then still. Never repeats on its own.

1.1s · 2 beatsease-in-outsystem teal.rly-nudge
Arrival ring toastRatified v3.5

Notifications enter with the family arrival ring on their status dot: one emanating pulse, 0.9s, done. The toast itself slides 10px on an out-expo, no bounce.

0.35s enter0.9s ring#00D9C8 · once.rly-arrival-ring

Waiting

Loops. Anything that repeats stays in system teal, breathes slowly, and obeys the one-pulsing-element rule. Waiting states admit that time is passing without demanding attention.

Routing…
Routing spinnerProposed

The mark as the loading indicator: rays light clockwise in an eight-step chase. Replaces generic spinners anywhere the app waits on the network for more than 400ms.

1.1s looplinear chasesystem teal · loop.rly-routing
HVK2R9 · sent, awaiting receipt
Awaiting breatheRatified v3.5

A sent relay that has not been claimed yet breathes at 4.2s: slow enough to read as patience. Family behaviour 4, applied to the status dot in list rows.

4.2s loopease-in-outamber · loop.rly-awaiting

No relays yet. Create one and the Code lands here.

Empty-state heartbeatRatified v3.5

Family behaviour 1 on its home surface: an empty list is a brand surface, so the mark may live there and beat at 2.8s. The copy does the reassuring; the pulse does the inviting.

2.8s loopease-in-outsystem teal · loop.rly-heartbeat

The law, and what this lab adds

The four hard rules from SPEC.pulse-motion.md carry unchanged. Below them, the additions this lab proposes for ratification into the family.

#MomentClassBehaviourLoop?Colour law
7Code materialize.rly-materializeCharacters land top-down, 55ms stagger, at relay creationOncesystem teal
8Copy cascade.rly-copy-cascadeCharacter wave + single underline sweep on Code copyOnce#00D9C8 · event
9Claim unfold.rly-unfoldReceived card wipes open, content lines stagger in 90ms apartOncesystem teal
10Stream arrival.rly-stream-inItem slides in from above; status dot carries one arrival ringOnce#00D9C8 ring · event
11Routing spinner.rly-routingRays chase clockwise while waiting on the networkLoopsystem teal (rule 4)
12Shutter toggle.rly-shutterRays open and close clockwise on a boolean settingOncesystem teal
13Nudge blink.rly-nudgeTwo soft border-and-dot beats when a nudge arrivesOnce (2 beats)system teal
14In-flight travel.rly-travelCode chip crosses a dashed path through the mark; pulse-coloured while movingOnce, bounded#00D9C8 · in motion