Case 05 · Design Systems · Everything on this page is live



Botim moves with one heartbeat: a soft, rhythmic pulse. Calm, trustworthy, never flashy.

A defined primitive, a cross-platform token spec, six patterns you can operate — all live on this page.

Signature — Pulseone beat per event
calm · trustworthy · alivesys.pulse — steady
Signature
Pulse — one soft beat
Structure
3 principles · 11 tokens · 6 patterns
Platforms
Web · iOS · Android
Thesis
RTL / MENA-aware
01

Purposeful, not decorative. Every animation has a job — guide, confirm, explain. Motion that only performs gets cut.

02

Calm confidence. One soft beat per event. Nothing loops but loading; money commits without overshoot.

03

Bilingual by construction. Energy travels in reading order. Direction is an input — physics never flips.

tap the surface — the pulse/beat primitive, verbatim
[ 01 ]

Feel the physics

simulated from the shipped values
target
position / time — simulated from the shipped values1100ms window
lists, cardsspring/standard
web 380 / 21
ios response 0.32 · ζ 0.54
The duration scale, raced
exit/all
180ms
fade/quick
200ms
fade/backdrop
350ms
glow/once
550ms
pulse/beat
600ms
Why the springs translate

Cross-platform values are physical conversions, not eyeballs: response = 2π/√k, ζ = c/2√k. The curve you just watched lands identically in SwiftUI and Compose.

[ 02 ]

One spec, three platforms

renders from the module the demos import
TokenSpecWeb · Framer Motion
pulse/beat
the signature — arrivals & confirmations
scale 1→1.02→1 · dim 10% · 600msanimate: scale [1, 1.02, 1] · 0.6s easeInOut
pulse/loop
loading — the beat, repeated
beat every 1.1s · ∞ · stops on resolverepeat: Infinity · 1.1s easeInOut
spring/gentle · 290/24
sheets, modals, large surfaces
ζ 0.70 — soft, settledspring(stiffness: 290, damping: 24)
spring/standard · 380/21
list items, cards, chips
ζ 0.54 — lively, quickspring(stiffness: 380, damping: 21)
spring/pop · 420/17
toasts, badges, small arrivals
ζ 0.41 — visible bouncespring(stiffness: 420, damping: 17)
spring/committed · 300/32
money moments — send, confirm, settle
ζ 0.92 — no overshoot, everspring(stiffness: 300, damping: 32)
stagger/relay
group arrivals — energy handed on
80ms per elementdelay: i * 0.08
fade/quick
non-spatial fades
200ms ease-outtween 0.2s easeOut
fade/backdrop
dim layers behind sheets
350ms ease-outtween 0.35s easeOut
exit/all
everything leaves faster than it arrived
180ms ease-intween 0.18s easeIn
glow/once
arrival emphasis — never loops
550ms · single pulse of lightboxShadow keyframes · 0.55s easeOut
[ 03 ]

Patterns, live

tap everything
9:415G ▮▮▮
tap — spring/pop press · pulse/beat + glow/once confirm
01

Button press

use Ripple confirms the touch; confirm = one beat + glow.

avoid Passive rows — a list is not a button.

9:415G ▮▮▮
Ahmed K.+ AED 250.00
Fatima A.− AED 89.50
Gold · 1.2g+ AED 612.30
Etisalat top-up− AED 100.00
02

List stagger

use Rows relay at 80ms; the group closes with a soft beat.

avoid Re-running the relay on sort, or past the first viewport.

9:415G ▮▮▮
03

Modal / sheet

use In on spring/gentle, content answers with a beat; out in 180ms.

avoid Using a sheet for navigation — that’s a page transition.

9:415G ▮▮▮
tap a row
04

Page transition

use Surface first; content relays in; the hero block beats once.

avoid Sliding tab switches — peers crossfade, only hierarchy slides.

9:415G ▮▮▮
pulse/loop — the only motion allowed to repeat
05

Loading

use pulse/loop — the signature repeated; stops the instant data lands.

avoid Anything under 300ms, and fake progress of any kind.

9:415G ▮▮▮
Transfer · AED 500
Ready to send
06

Success / error

use Success beats once and glows; the check lands committed.

avoid Errors never breathe — no pulse, no bounce, no glow.

[ 04 ]

Do / don’t

both sides live
Errors hold still
Do
Insufficient balance
one recoil · one red flash · then still
Don’t
Insufficient balance
bouncy + glowing — failure is not a celebration
Relay at 80ms — not a slideshow
Do
Ahmed K.
Fatima A.
Gold · 1.2g
80ms relay — one gesture
Don’t
Ahmed K.
Fatima A.
Gold · 1.2g
400ms stagger — the user is waiting for your art
[ 05 ]

Motion that reads Arabic

mirror the layout — what follows?
Flips — entry follows reading direction
EN · enters from the left
Ahmed K.
Fatima A.
Wallet
عربي · يدخل من اليمين
أحمد
فاطمة
المحفظة
Never flips — physics has no reading direction
✓ Sent
identical
✓ تم الإرسال
متطابق

flips entry direction · relay geometry · progress · navigation

never the pulse · springs · scale · glow — physics has no reading direction

[ 06 ]

Ship it

one contract, three runtimes
motion-tokens.tsMotionTokens.swiftMotionTokens.ktsame physics · same beat · one heartbeat

Pulse won a four-way live bake-off against Connected Flow, Trust Settle, and Detent. The lab is still live →