Colour palette
The base uses a warm off-white linen (#FDFAF6) rather than pure white — giving terracotta accents a natural resting surface. Each elevation step is ~6–8 lightness units apart: perceptible but not jarring. In dark mode the base has a warm brown tint, keeping the palette coherent across both modes.
Colour psychology
Typography
Tags use colour semantically, helping the user learn to navigate intuitively. A tag is a compressed filter chip: the same hue appears in the search filter panel and appear in the same order across art cards, search results, and other locations, creating associations that the users internalise over time.
Border radius
Spacing & gaps
Buttons & inputs
Border usage
Border weight is always .5px except for the one special case of a "featured" card (2px). Borders use rgba opacity rather than fixed hex values so they work in both themes without separate declarations.
Motion system
Live demos
Icon draws itself via stroke-dashoffset on save. Elastic rebound overshoots 1.25× then settles. Amber fill on saved state.
Heart compresses then rebounds with elastic overshoot. Count rolls — old slides up-out, new slides up-in. No particles.
Play icon morphs to pause bars. Fill activates left-to-right like a needle drop. Buffering state shows breathing pulse.
Indicator slides with ease-out-back overshoot. Content crossfades (outgoing: fade + shift up; incoming: fade in from below).
Dots enter staggered with elastic.out. Tap: dot presses in (scale 0.82), card slides up. Untouched dots dim to 40% opacity.
Tooltip blooms upward from the tapped term. Tap outside or term again to dismiss.
Shimmer moves at candlelight pace (slow, warm). Images resolve from desaturated blur.
Pull reveals the Reframe viewfinder motif that fills as tension increases. Release fires refresh; cards cascade in with 40ms stagger.
Entering screen slides from +width to 0 (power3.out, 380ms). Leaving slides to −60px and fades — depth without full parallax.
Thumb snaps with back.out(2) — a tiny physical rebound confirms the state change. Track colour transitions at --dur-mid.
Chip scales to 1.08× on click then snaps back with back.out(2). Fill floods in at --dur-fast.
Hover lifts card −4px. Press scales to 0.97×. Release snaps back with ease-out-back.











