Make your own skill

apple-design

Skill

Apple's approach to interface design and fluid, physical motion, translated for the web. Use when building or reviewing gesture-driven UI, spring animations, drag/swipe/sheet interactions, momentum and interruptible transitions, translucent materials and depth, typography (optical sizing, tracking,

Eby emilkowalski 0 installs v1 · updated Jul 21

Imported with attribution. Source: https://github.com/emilkowalski/skills · license MIT · revision f6f79ca1d8e9. Content was copied only after the declared license passed the import policy and still went through Workbench review.

Install

copy one prompt — your agent does the rest
Fetch https://workbench.md/skills/apple-design/manifest and install this skill: read SKILL.md and download the files it references.

Works with Claude Code, Cursor, Codex — any agent that can fetch a URL. Installing today pins you at v1.

Community skill — not audited by Workbench, and Workbench isn't responsible for what it does. Read all the code yourself before installing.

Apple Design

How Apple builds interfaces that stop feeling like a computer and start feeling like an extension of you. This knowledge comes from Apple’s WWDC design talks — chiefly Designing Fluid Interfaces (WWDC 2018) — distilled and translated into the web platform (CSS, Pointer Events, requestAnimationFrame, spring libraries like Motion/Framer Motion).

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 all of this natural, because they are inherently interruptible and velocity-aware.

The Core Idea

“When we align the interface to the way we think and move, something magical happens — it stops feeling like a computer and starts feeling like a seamless extension of us.”

An interface is fluid when it behaves like the physical world: things respond instantly, move continuously, carry momentum, resist at boundaries, and can be redirected mid-motion. Everything below is a way to get closer to that.

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

1. Response — kill latency

The moment lag appears, the feeling of directness “falls off a cliff.” Response is the foundation everything else is built on.

/* Feedback lives on the press, and it's instant */
.button:active {
  transform: scale(0.97);
  transition: transform 100ms ease-out;
}

2. Direct manipulation — 1:1 tracking

“Touch and content should move together.”

When the user drags something, it must stay glued to the finger — and respect the offset from where they grabbed it. Snapping to the element’s center on grab breaks the illusion immediately.

el.addEventListener('pointerdown', (e) => {
  el.setPointerCapture(e.pointerId);
  const grabOffset = e.clientY - el.getBoundingClientRect().top; // respect where they grabbed
  // ...track position + timestamp history for velocity
});

3. Interruptibility — the single most important principle

“The thought and the gesture happen in parallel.”

Every animation must be interruptible and redirectable at any moment. A user must be able to grab a moving element mid-flight and reverse it without waiting for the animation to finish. A closing modal the user grabs again should follow the finger — not finish closing first, then reopen.

4. Behavior over animation — use springs

“Think of animation as a conversation between you and the object, not something prescribed by the interface.”

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

Apple deliberately replaced the physics triplet (mass/stiffness/damping) with two designer-friendly parameters. Think in these:

Defaults:

Concrete values Apple ships:

Interaction Damping Response
Move / reposition (e.g. PiP) 1.0 0.4
Rotation 0.8 0.4
Drawer / sheet 0.8 0.3

Web mapping (Motion / Framer Motion): the bounce + duration spring API maps closely to Apple’s damping + response. A safe house style is damping: 1.0 springs everywhere by default; reserve bounce for momentum-driven, physical interactions.

import { animate } from 'motion';

// Critically damped default (no overshoot)
animate(el, { y: 0 }, { type: 'spring', bounce: 0, duration: 0.4 });

// Momentum interaction — a little bounce, only because a flick preceded it
animate(el, { y: target }, { type: 'spring', bounce: 0.2, duration: 0.4 });

5. Velocity handoff — the seam between drag and animation

When a gesture ends, the animation must continue at the finger’s exact velocity, so there’s no visible seam between dragging and animating. This is the detail that most separates “fluid” from “fine.”

Pass the pointer’s release velocity as the spring’s initial velocity. Some spring APIs want relative velocity — normalize it by the remaining distance to the target:

relativeVelocity = gestureVelocity / (targetValue − currentValue)

Example: element at y=50, target y=150 (100px to go), finger moving 50px/s → initial spring velocity = 50 / 100 = 0.5. Framer Motion / Motion take absolute px/s velocity directly (velocity option), so you usually hand it the raw value.

6. Momentum projection — animate to where the gesture is going

“Take a small input and make a big output.”

Don’t snap to the nearest boundary from the release point. Use velocity to project the resting position — exactly like scroll deceleration — then snap to the target nearest that projected point. This is what makes a flick feel like it throws the element.

Apple’s exact projection function (from the Designing Fluid Interfaces sample code):

// decelerationRate ≈ 0.998 for normal scroll feel; 0.99 for snappier
function project(initialVelocity /* px/s */, decelerationRate = 0.998) {
  return (initialVelocity / 1000) * decelerationRate / (1 - decelerationRate);
}

const projectedEndpoint = currentPosition + project(releaseVelocity);
const target = nearestSnapPoint(projectedEndpoint);   // choose target from the projection
animateSpringTo(target, { velocity: releaseVelocity }); // then hand off velocity (§5)

Note: the physics-textbook v²/(2·decel) is not what Apple ships — use the exponential-decay form above. This is the standard behavior in good bottom-sheets and carousels (Vaul, Embla).

7. Spatial consistency — symmetric paths, anchored origins

“If something disappears one way, we expect it to emerge from where it came.”

8. Hint in the direction of the gesture

Humans predict a final state from a trajectory. Intermediate motion should telegraph where things are going — Control Center modules “grow up and out toward your finger.” Make the in-between frames point at the outcome, not just interpolate blindly to it.

9. Rubber-banding — soft boundaries

At an edge, resist progressively instead of stopping hard. A hard stop reads as “frozen”; continuous resistance reads as “responsive, but there’s nothing more here.” Apply damping that increases the further past the boundary the user drags.

// The further past the bound, the less the element follows — real things slow before they stop
function rubberband(overshoot, dimension, constant = 0.55) {
  return (overshoot * dimension * constant) / (dimension + constant * Math.abs(overshoot));
}

10. Gesture design details (the “feel” checklist)

11. Frame-level smoothness

Smoothness is about what’s in the frames, not just the frame rate.

12. Materials & depth — translucency conveys hierarchy

Apple uses translucent materials as a floating functional layer that brings structure without stealing focus. On the web, approximate with backdrop-filter.

.toolbar {
  background: rgba(255, 255, 255, 0.6);
  backdrop-filter: blur(20px) saturate(180%);
  border-top: 1px solid rgba(255, 255, 255, 0.4); /* bright top edge = light catching the material */
}

13. Multimodal feedback — motion + sound + haptics

Three rules for combining senses (from Designing Audio-Haptic Experiences):

  1. Causality — it must be obvious what caused the feedback. Trigger it on the actual causal event (the toggle flipping, the item snapping home), and match its character to the action’s physicality.
  2. Harmony — the visual, the sound, and the haptic must fire on the same frame. Latency between them destroys the illusion. Don’t let a CSS transition lag the audio/haptic (Vibration API).
  3. Utility — add feedback only where it earns its place. Reserve haptics/sound for meaningful moments (success, error, commit, snap). Over-feedback trains users to ignore all of it.

14. Reduced motion & accessibility

Reduced motion doesn’t mean no feedback — it means a gentler, non-vestibular equivalent. Respond to three independent signals and bake them into your components:

Also: avoid full-viewport moving backgrounds, slow looping oscillations (near 0.2 Hz / one cycle per 5s), and abrupt brightness jumps (ease dark↔light theme changes). Make large moving objects semi-transparent while they travel, and fade big surfaces out during a large reposition and back in once settled.

@media (prefers-reduced-motion: reduce) {
  .sheet { transition: opacity 200ms ease; transform: none !important; }
}
@media (prefers-reduced-transparency: reduce) {
  .toolbar { background: white; backdrop-filter: none; }
}

15. Typography — optical sizing, tracking, leading

Apple designs type to change shape with size; the same discipline applies on the web. (From The Details of UI Typography, WWDC 2020.)

:root { font: 100%/1.5 system-ui, sans-serif; } /* body: system font, comfortable leading */

.display {
  font-size: clamp(2rem, 5vw, 4rem);
  line-height: 1.05;        /* tight leading for large text */
  letter-spacing: -0.02em;  /* negative tracking as it grows */
  font-optical-sizing: auto;
}

16. Design foundations — the eight principles

The motion and craft above serve Apple’s eight design principles (Principles of Great Design, WWDC 2026). Use these as the names you reason with:

  1. Purpose. Make with intention; decide what not to build. Every feature asks for the user’s time, attention, and trust — spend that budget only where it pays off.
  2. Agency. Keep people in control: offer choices, don’t force a single path. Back it with forgiveness — easy undo for slips, a confirmation dialog only for genuinely destructive, irreversible actions (use sparingly; overusing it trains people to click through).
  3. Responsibility. Act in the user’s interest. Privacy: ask at the right moment, only for what’s needed, transparently. Safety: anticipate misuse and harm — especially with AI (an allergy-aware recipe app must not suggest a harmful ingredient). Add previews, confirmations, disclaimers; cut a feature whose risk outweighs its value.
  4. Familiarity. Build on what people already know. Use metaphors that are neither too literal nor too abstract (a trash can means delete), and honor their physics. Be consistent: things that look the same must behave the same and live in the same place (close is always top-left on macOS) so people can predict what happens next. Only break a familiar pattern if you can prove it’s better — then test it, don’t assume.
  5. Flexibility. Design for different contexts, devices, and the full range of abilities. Adapt to the platform (iPhone = quick touch; desktop = deep workflows with precise pointer control) and to the situation. Design inclusively (age, language, expertise, accessibility). When no single layout fits everyone, let people personalize — rearrange controls, hide what they don’t use.
  6. Simplicity — not minimalism. Strip the unnecessary so the core purpose shines; burying everything in one place looks minimal but isn’t simple. Be concise (plain language, no jargon, fewer steps) and clear (use hierarchy — order, spacing, contrast — so the most important thing is the most obvious). Every element earns its place; sometimes adding context simplifies (a video scrubber that shows time remaining). Show the common path first, advanced options one level deeper.
  7. Craft. Uncompromising attention to detail builds trust. Beautiful typography, colors that adapt to light/dark, clear iconography, and responsive animations that give immediate, natural feedback. Nothing is random — every spacing, timing, and alignment value is a deliberate choice you can defend. Jittery scroll, misaligned icons, and layouts that break on rotation read as carelessness. Craft needs iteration and longevity — keep evolving the design as features and hardware change.
  8. Delight. The result of getting the other seven right, not confetti tacked on top. Decide the emotion you want people to feel (calm, confident, excited) and reinforce it in every decision.

Tactical rules that serve these:

17. Process

Quick Reference

Need Technique Concrete value
Default UI spring Critically damped, no overshoot damping 1.0, response 0.3–0.4
Momentum / flick spring Under-damped, slight bounce damping ~0.8, response 0.3–0.4
Gesture → spring velocity Hand off release velocity gestureVelocity / (target − current) if normalized
Flick landing point Project momentum current + (v/1000)·d/(1−d), d ≈ 0.998
Interrupt cleanly Start from presentation (live) value read the on-screen transform
Avoid reversal “brick wall” Carry velocity through re-target spring that blends velocity
Reversible transition Mirror the easing curve inverse cubic-bézier
Decide reverse vs. commit Use velocity sign, not position at release
1:1 drag Pointer Events + capture respect the grab offset
Feedback On pointer-down, continuous never only at the end
Boundary Rubber-band, don’t hard-stop progressive resistance
Translucent chrome backdrop-filter layer content scrolls under
Type tracking Size-specific, never fixed tighten large text (-0.02em), body near 0
Reduced motion Cross-fade, not slide/spring @media (prefers-reduced-motion)