Home
cd ../playbooks
Creative & DesignAdvanced

Apple Fluid Interface Design for the Web

Apple's approach to gesture-driven UI and physical motion — from WWDC's Designing Fluid Interfaces — translated to CSS, Pointer Events, and spring animation libraries: interruptibility, velocity handoff, momentum projection, rubber-banding, and translucent materials.

10 minutes
By emilkowalskiSource
#interaction-design#animation#ui-design#gestures#spring-physics#accessibility

Most web animation looks fine until a user's finger touches it — then a fixed-duration CSS transition can't be grabbed mid-flight, reversed, or handed a real release velocity, and the interface instantly reads as a computer instead of an extension of the hand moving it.

Who it's for: frontend developers building gesture-driven interfaces, designers reviewing motion and interaction quality, teams building mobile-web or app-like experiences that need to feel native, anyone whose drag/swipe/sheet interactions feel stiff or laggy compared to a native app

Example

"Review this bottom sheet's drag interaction" → A check against interruptibility (can it be grabbed mid-close and reversed?), velocity handoff (does the release carry the finger's actual speed into the settle animation?), momentum projection (does a flick land where the gesture was heading, not just the nearest boundary?), and rubber-banding at the edge — each with the concrete spring parameters and code pattern to fix what's missing

CLAUDE.md Template

New here? 3-minute setup guide → | Already set up? Copy the template below.

# Apple Fluid Interface Design for the Web

How Apple builds interfaces that stop feeling like a computer and start feeling like an extension of you — distilled from Apple's WWDC design talks (chiefly *Designing Fluid Interfaces*) and translated to the web platform: CSS, Pointer Events, `requestAnimationFrame`, and spring-based animation libraries.

The through-line: **an interface feels alive when motion starts from the current on-screen value, inherits the user's velocity, projects momentum forward, and can be grabbed and reversed at any instant.** Springs are the tool that makes this natural, because they're inherently interruptible and velocity-aware.

Apple frames design as serving four human needs: safety/predictability, understanding, achievement, and joy. Every rule below serves one of them.

## 1. Response — Kill Latency

The moment lag appears, the feeling of directness falls off a cliff.

- Respond on pointer-down, not on release. Highlighting a button only on release feels dead.
- Audit every latency source on the input path — debounces, artificial timers, a stray tap-delay — anything not essential is a regression.
- Feedback must be continuous *during* an interaction, not just at completion. A drag, slider, or drawer must update 1:1 with the pointer throughout, never only when the gesture ends.

## 2. Direct Manipulation — 1:1 Tracking

When the user drags something, it stays glued to the finger and respects the offset from *where they grabbed it* — snapping to the element's center on grab breaks the illusion immediately. Use Pointer Events with capture so tracking continues even when the pointer leaves the element's bounds, and track a short position/velocity history, not just the current point, since you'll need velocity at release.

## 3. Interruptibility — the Single Most Important Principle

Every animation must be interruptible and redirectable at any moment. A user grabbing a moving element mid-flight must be able to reverse it without waiting for the animation to finish.

- Never lock out input during a transition.
- Always animate from the *current, on-screen* value, never the logical target value — on interrupt, read the element's live transform and start the new animation from there, or you get a visible jump.
- Avoid plain CSS transitions/keyframes for anything gesture-driven; they can't be smoothly grabbed and reversed mid-flight. Springs default to animating from the current value, which is exactly what interruption needs.
- When a gesture reverses, blend velocity — don't hard-cut it. Replacing one animation with another at a reversal creates a velocity discontinuity, a "brick wall" feel. Use a spring implementation that re-targets from the current velocity instead.
- Decompose 2D motion into independent X and Y springs — a single spring on a 2D distance desyncs when X and Y velocities differ.

## 4. Behavior Over Animation — Use Springs

A pre-scripted, fixed-duration animation can't respond to new input mid-flight; a spring can, since new input just changes the target and motion stays continuous. Reach for springs for anything the user can touch.

Think in two designer-friendly parameters instead of the raw physics triplet:

- **Damping ratio** — controls overshoot. `1.0` = critically damped, no bounce, a graceful settle. Lower = more overshoot and oscillation.
- **Response** — how quickly the value reaches its target, in seconds. This isn't "duration" — a spring has no fixed duration; its settle time emerges from the parameters.

**Defaults:** start most UI at damping `1.0` (no overshoot). Add bounce (damping around `0.8`) only when the gesture itself carried momentum — a flick, a throw, a drag release. Overshoot on a menu that just faded in feels wrong; overshoot on a card you flicked feels right.

## 5. Velocity Handoff

When a gesture ends, the animation must continue at the finger's exact release velocity, so there's no visible seam between dragging and animating — this detail is what separates "fluid" from merely "fine." Pass the pointer's release velocity as the spring's initial velocity; some spring APIs want it normalized relative to the remaining distance to the target.

## 6. Momentum Projection

Don't snap to the nearest boundary from the release point — use velocity to project where the gesture is *heading*, exactly like scroll deceleration, then snap to the target nearest that projected point. This is what makes a flick feel like it actually throws the element. Apple's own deceleration curve uses an exponential-decay form, not the textbook `v²/(2·decel)` formula — the standard behavior behind any good bottom-sheet or carousel.

## 7. Spatial Consistency

If something disappears one way, it should emerge from where it came from.

- Enter and exit along the same path — a panel sliding in from the right must dismiss to the right; mismatched directions feel disconnected.
- Anchor a menu, popover, or sheet's transform origin to the element that triggered it, so the spatial relationship between trigger and content stays obvious.
- Mirror the easing on a reversible transition so the outbound and return paths match.

## 8. Hint in the Direction of the Gesture

Humans predict a final state from a trajectory. Intermediate motion frames should telegraph where things are going, not just interpolate blindly toward the destination.

## 9. Rubber-Banding

At an edge, resist progressively instead of stopping hard. A hard stop reads as frozen; continuous resistance that increases with overshoot reads as responsive but bounded — the further past the boundary the user drags, the less the element follows.

## 10. Gesture Design Details

- **Tap**: highlight on touch-down, commit on touch-up. Add roughly 10px of hit padding around small targets, and allow cancel-by-dragging-away-and-back.
- **Drag/swipe**: require a small movement threshold before committing to a direction, then track 1:1 after that.
- **Detect all plausible gestures in parallel from the first move**, then confidently cancel the losers once intent is clear — avoid recognizers that only report a final state, since they throw away the continuous tracking real feedback needs.
- **Minimize disambiguation delay.** Double-tap detection unavoidably delays single-tap response; only pay that cost where double-tap genuinely exists.

## 11. Frame-Level Smoothness

Smoothness is about what's actually in each frame, not just the frame rate. Keep per-frame positional change below the perception threshold to avoid strobing. For very fast motion, a subtle motion blur reads as speed better than a hard sharp streak. Animate only compositor-friendly properties — `transform` and `opacity` — and hint with `will-change` where motion is imminent.

## 12. Materials and Depth — Translucency Conveys Hierarchy

Apple uses translucent materials as a floating functional layer that adds structure without stealing focus.

- Build navigation, toolbars, and sheets as translucent layers (`backdrop-filter: blur()` plus a semi-transparent background) with content scrolling underneath, not opaque bars consuming fixed space.
- Material weight encodes hierarchy: heavier/darker materials separate structural regions; lighter materials draw attention to interactive elements. Never stack a light translucent surface on another — legibility collapses.
- Bigger surfaces read as thicker: pair a stronger blur with a deeper shadow than a small chip gets.
- Dim to focus (a modal pairs its surface with a dimming scrim) but separate to keep flow (a parallel, non-blocking panel uses translucency and offset without a scrim so the surrounding flow isn't broken).
- Over blurred or translucent surfaces, use higher-contrast, slightly heavier-weight text rather than flat gray — legibility over a changing background needs the extra weight.
- Prefer a soft scroll-edge fade over a hard 1px divider where floating chrome overlaps scrolling content.
- Animate blur radius and scale together on enter/exit for a glass surface, so it reads as a real material arriving rather than a plain opacity fade.

## 13. Multimodal Feedback — Motion, Sound, Haptics

Three rules for combining senses: **causality** (trigger feedback on the actual causal event, matched to the action's physicality — a toggle flipping, an item snapping home), **harmony** (visual, sound, and haptic must fire on the same frame; latency between them destroys the illusion), and **utility** (add feedback only where it earns its place — reserve it for meaningful moments; overusing it trains people to ignore all of it).

## 14. Reduced Motion and Accessibility

Reduced motion means a gentler, non-vestibular equivalent, not zero feedback.

- Honor `prefers-reduced-motion: reduce` by replacing slides, springs, and parallax with short opacity cross-fades; drop elastic/overshoot but keep opacity/color changes that aid comprehension.
- Honor `prefers-reduced-transparency: reduce` by making translucent surfaces frostier or solid — raise background opacity, drop the blur.
- Honor `prefers-contrast: more` with near-solid backgrounds and a defined, contrasting border.
- Avoid full-viewport moving backgrounds, slow looping oscillations, and abrupt brightness jumps between light and dark themes.

## 15. Typography — Optical Sizing, Tracking, Leading

Apple designs type to change shape with size; the same discipline applies on the web.

- Tracking (letter-spacing) is size-specific, never one fixed value — large display text wants slightly negative tracking, small text wants slightly positive tracking for legibility.
- Leading (line-height) tracks size inversely: tight on large headings, looser on body copy.
- Build hierarchy from weight, size, and leading together, not size alone — weight adds presence without taking more space.
- Respect the user's text-size setting; scale layout with the text (relative units, not fixed pixels) so a larger font doesn't break the layout.
- Default to the platform's system font before reaching for a custom one — it already ships optical sizing and legibility tuning; override only with a reason.

## 16. Eight Design Foundations

The motion and craft above all serve eight underlying principles: **purpose** (decide what not to build), **agency** (keep people in control, with forgiveness — easy undo, sparing confirmation dialogs), **responsibility** (privacy at the right moment, safety anticipating misuse), **familiarity** (build on known metaphors, stay consistent so behavior is predictable), **flexibility** (adapt to context, device, and ability — let people personalize when no single layout fits everyone), **simplicity, not minimalism** (strip the unnecessary so the core purpose shows — sometimes adding context, like a scrubber showing time remaining, is what simplifies), **craft** (every spacing, timing, and alignment value is a deliberate, defensible choice), and **delight** (the result of getting the other seven right, not confetti tacked on top).

Supporting tactics: feedback comes in four kinds (status, completion, warning, error); every screen should answer where am I, where can I go, what's here, how do I get out; proximity should imply relationship (place a control near what it affects); and direct, specific labels beat safe generic ones ("Progress," "Library" over a vague "Home").

## 17. Process

Prototype interactively — a working demo discovers the interface in a way static designs can't, and it sets a concrete quality bar that prevents a mediocre final build. Design interaction and visuals together, not as separate passes; motion is not a layer added after the pixels. Review motion with fresh eyes, in slow motion or frame-by-frame, to catch what's invisible at full speed.

## Quick Reference

| Need | Technique | Value |
|---|---|---|
| Default UI spring | Critically damped, no overshoot | damping 1.0, response 0.3–0.4s |
| Momentum / flick spring | Slight bounce | damping ~0.8, response 0.3–0.4s |
| Gesture → spring velocity | Hand off release velocity | normalized by remaining distance if the API requires it |
| Flick landing point | Project momentum forward | exponential-decay projection, not `v²/(2·decel)` |
| Interrupt cleanly | Start from the live presentation value | read the current on-screen transform |
| Avoid a "brick wall" on reversal | Carry velocity through the re-target | a spring that blends, not replaces, velocity |
| 1:1 drag | Pointer Events + capture | respect the original grab offset |
| Boundary | Rubber-band, don't hard-stop | progressive resistance that grows with overshoot |
| Translucent chrome | `backdrop-filter` layer | content scrolls underneath |
| Type tracking | Size-specific, never fixed | tighten large text, keep body near zero |
| Reduced motion | Cross-fade, not slide/spring | `@media (prefers-reduced-motion)` |

## Tips

- Interruptibility (§3) is worth getting right before anything else on this list — an interface that can be grabbed and reversed mid-flight reads as fluid even with fairly plain visuals; one that can't reads as stiff no matter how polished the rest is.
- Bounce is earned, not default — reserve it for motion the user's own gesture actually carried momentum into; a menu or modal that just appears should settle cleanly.
- Test reduced-motion and reduced-transparency modes as real states to design for, not an afterthought bolted on at the end — they change more than "turn animations off."

## Limitations

- Web-platform techniques (CSS, Pointer Events, spring libraries) approximate but don't perfectly replicate native iOS motion — some effects (true additive animation blending, `CADisplayLink` timing) have no exact web equivalent.
- Assumes access to a spring-capable animation library on the web; the raw math (projection, rubber-banding) can be hand-implemented, but a good spring implementation is worth reaching for rather than rebuilding.
- These are interface-motion principles, not a full design system — pair with your project's actual visual language, brand, and component library.

Get new playbooks like this one

One email a week with new Claude Code workflows. Free, like everything here.

No spam. Unsubscribe anytime.

README.md

What This Does

Distills Apple's own WWDC design talks — chiefly Designing Fluid Interfaces — into a concrete, web-implementable set of rules for gesture-driven UI: kill input latency, track a drag 1:1 with the pointer's actual grab offset, and above all make every animation interruptible — grabbable and reversible mid-flight, always starting from the live on-screen value rather than snapping to a logical target. It covers the two-parameter spring model (damping ratio for overshoot, response for settle speed) that replaces the raw mass/stiffness/damping physics triplet, velocity handoff from a released gesture into its settle animation, and momentum projection — the exponential-decay math that makes a flick land where the gesture was actually heading, not just at the nearest boundary.

Beyond motion mechanics, it covers translucent materials and depth (when to blur, when to dim vs. offset, why never to stack two light translucent surfaces), multimodal feedback rules for combining motion with sound and haptics, concrete reduced-motion and reduced-transparency handling, and Apple's size-specific typography discipline (tracking and leading that scale inversely with font size). A closing section names the eight underlying design foundations — purpose, agency, responsibility, familiarity, flexibility, simplicity, craft, delight — that everything else in the skill exists to serve.


Quick Start

Step 1: Create a Project Folder

mkdir fluid-interface-design && cd fluid-interface-design

Step 2: Download the Template

Click Download above, then:

mv ~/Downloads/CLAUDE.md ./

Step 3: Review or Build an Interaction

claude

Point Claude at a gesture-driven component (a drawer, a sheet, a draggable card) and ask it to review the interaction against these principles, or to build one from scratch using them.


Tips & Best Practices

  • Interruptibility is worth getting right before anything else on this list — an interface that can be grabbed and reversed mid-flight reads as fluid even with fairly plain visuals; one that can't reads as stiff no matter how polished the rest is.
  • Bounce is earned, not default — reserve it for motion the user's own gesture actually carried momentum into. A menu or modal that just appears should settle cleanly, with no overshoot.
  • Design reduced-motion and reduced-transparency as real states, not an afterthought bolted on at the end — they change more than just "turn animations off."

Limitations

  • Web-platform techniques (CSS, Pointer Events, spring libraries) approximate native iOS motion closely but not perfectly — some effects have no exact web equivalent.
  • Assumes access to a spring-capable animation library; the raw math (projection, rubber-banding) can be hand-implemented, but a good spring implementation is worth reaching for rather than rebuilding from scratch.
  • These are interface-motion principles, not a full design system — pair them with your project's actual visual language, brand, and component library.

$Related Playbooks

Creative & Design

Canvas Design

Create museum-quality visual art and design philosophy documents in PNG and PDF formats using Anthropic's canvas-design principles.

10 minutes
Advanced
Creative & Design

Design Critique Reviewer

Structured design feedback across usability, visual hierarchy, and consistency

10 minutes
Intermediate
Creative & Design

Design Handoff Generator

Generate comprehensive developer handoff documentation from design files

10 minutes
Intermediate
Creative & Design

Design System Manager

Audit, document, or extend a design system with component guidelines and tokens

10 minutes
Advanced
Creative & Design

Diagram & Flowchart Creator

Create professional diagrams using Mermaid, PlantUML, and other text-based diagram tools. Generate flowcharts, sequence diagrams, architecture diagrams, and more.

10 minutes
Advanced
Creative & Design

HTML to PowerPoint Converter

Convert HTML/Markdown to PowerPoint presentations using Marp

10 minutes
Advanced
Creative & Design

HTML Presentation Builder

Build interactive HTML presentations with animations, code highlighting, and speaker notes using reveal.js.

10 minutes
Advanced
Creative & Design

AI Image Generation Prompts

Create effective AI image generation prompts for DALL-E, Midjourney, and Stable Diffusion. Generate prompts for various styles and use cases.

10 minutes
Intermediate
Creative & Design

AI Image Enhancer — Upscale & Sharpen Photos with Claude Code

Upscale low-resolution images, sharpen blurry photos, and remove compression artifacts using Claude Code. Batch-process screenshots, product photos, and graphics for professional quality.

5 minutes
Beginner
Creative & Design

Infographic Layout Designer

Design infographic layouts and content structure. Plan visual storytelling with data, icons, and text hierarchy for impactful information design.

10 minutes
Intermediate
Creative & Design

Markdown to Slides Converter

Convert Markdown files into professional presentations exportable to PDF, PPTX, or HTML using Marp.

10 minutes
Beginner
Creative & Design

Scientific Docx

'Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx files). Triggers include: any mention of 'Word doc', 'word document', '.docx', or requests to produce professional documents with formatting like ta...

5 minutes
Beginner

Browse all Creative & Design playbooks →