Design language

Motion

Durations

--duration-instant120msPress, colour, focus, menu exit
--duration-fast160msHover borders, chevrons, toggles, tooltips, link nudge
--duration-base240msMenus, popovers, toasts, status lines
--duration-slow360msRefresh frame out
--duration-slower420msBlock shapes, demo cards, stepper track
--duration-dialog140msDialogs, alert dialogs, sheets, drawers and menus in
--duration-dialog-exit80msDialogs, alert dialogs, sheets, drawers and menus out
--duration-hold1100msRefresh frame holds before clearing
--duration-stagger45msBetween blocks, list items, status lines
--duration-rest300msHover rest before a tooltip shows
--duration-reduced140msOpacity-only feedback when reduced motion is requested

Curves

--ease-standardcubic-bezier(0.2, 0.7, 0.2, 1)Things arriving: surfaces, sheets, lifts
--ease-exitcubic-bezier(0.4, 0, 1, 1)Things leaving
--ease-movecubic-bezier(0.45, 0, 0.55, 1)The mark and loops
--ease-step-snapsteps(2, end)Rotations, binary flips, tooltips
--ease-step-8bitsteps(6, end)Blocks, sprites, wipes, status lines
--ease-step-wipesteps(4, end)Menus, popovers and toasts opening from their edge

Recipes

ElementEnterExit
Hover fillCells fill in random order over about 140ms, content colour flips at 70msReverse
Shard fillUneven blocks, packed like the glitch, land on 6 stepped frames of --duration-stagger; the ink flips once most have landed, when the host asks for it (Card's hover, the Trusted by cells)Reverse
Toast hoverLift 2px, deeper shadow, --duration-fast --ease-standardReverse
Footer linkBlock dot scales in (--ease-step-snap), label shifts 14px (--duration-fast)Reverse
Menu, popover, hover cardWipe from the anchor edge plus 4px, --duration-dialog --ease-step-wipeFade, --duration-dialog-exit steps(2)
TooltipAfter --duration-rest, --duration-fast --ease-step-snapSame, no delay
Chat toastWipe up, --duration-base --ease-step-wipe; stack 12px and 6% per cardBreaks into blocks, 7 steps of --duration-stagger
Sheet, drawer, mobile menuSlide from the edge, --duration-dialog --ease-step-8bit--duration-dialog-exit
Dialog, alert dialogStep up 8px, --duration-dialog --ease-step-8bit--duration-dialog-exit
Status lineWipe left to right, --duration-base --ease-step-8bit, lines spaced by the scriptNone
Demo cardWipe down after 2 × --duration-slower, then --duration-slower --ease-step-8bit; stays once shownNone
Composition blocksEach shape --duration-slower --ease-step-8bit, --duration-stagger betweenNone
Refresh frameBars --duration-slower, staggered; hold --duration-holdWipe out --duration-slow --ease-step-8bit
MarkListening 2.8s and Talking 1.1s snap between held positions (steps); Thinking 2.2s steps(7)Loops

Reduced motion: every enter shows its final state at once, loops stop, and demos render their last frame.

Loops

LoopCycleFrames
Mark: Listening2.4ssteps(4), rows offset by 110ms
Mark: Talking1.2ssteps(3), rows offset by 70ms
Mark: Thinking2.2ssteps(7), rows offset by 80ms
Spinner and orbit loaders0.96s8 cells lit in turn
Status dot: answering1.2shard blink
Text caret1shard blink
Animated icons (send, verify, seal)1.2 to 1.8shard frames
Product and step timers6 to 8s per rowlinear fill, pauses out of view
Live payments ticker7.2ssteps(24)

The identity’s own renders of the mark’s states, its loop and the lockup are on Brand motion.

Moments

Page load and app entry

The mark’s three bars draw in over an off-white and ink split, hold, then the frame wipes away. 1.5s.

Hover and press

Cells fill the whole element over about 140ms; content colour flips at 70ms. Reverses on leave.

Compositions on scroll

Blocks appear in random order when the composition enters the viewport. Once.

Loading

Orbit

Inline and in buttons.

Scatter

Sections and panels. Blocks fill at random, then clear.

Assemble

Media, video, builder stories.

Mark: Thinking

AI work only.

Stepped progress

Determinate: uploads, setup.

Marching blocks

Indeterminate, top of a panel.

Block skeleton

Content placeholders.

Summarizing

Block cursor

Streaming text.

Brand colours

On light

On dark