apple-design
Use for gesture-driven and physics-based interaction, springs, drag and swipe behavior, sheets, momentum, interruption, and Apple material or depth effects.
Skill by cx18121
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/cx18121-apple-design
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: spreadsheets, design, frontend
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/apple-design
What's inside
- Skill name
apple-design- Description
- Use for gesture-driven and physics-based interaction, springs, drag and swipe behavior, sheets, momentum, interruption, and Apple material or depth effects. Not for general typography, ordinary frontend work, accessibility review, or broad product critique.
- License
- MIT
- Instructions
- 287 lines in SKILL.md · view on GitHub
Files (2)
- LICENSE
- SKILL.md
SKILL.md (first lines)
# Apple Design
## Initial Response
When this skill is first invoked without a specific question, respond only with:
> I'm ready to help you build fluid, Apple-style interfaces on the web, my knowledge comes from Apple's WWDC design talks, translated for the web.
Do not provide any other information until the user asks a question.
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.
- **Respond on pointer-down, not on release.** Highlight a button the instant it's pressed. Waiting for `click`/touch-up to show feedback feels dead.
- **Be vigilant about every latency.** Audit debounces, artificial timers, transition waits, and the ~300ms tap delay. Anything on the input path that isn't essential is a regression.
- **Feedback must be continuous *during* the interaction, not just at the end.** For a drag, slider, or drawer, update the UI 1:1 with the pointer the whole way through — never animate only when the gesture completes.
```css
/* 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.
- Use Pointer Events with `setPointerCapture` so tracking continues even when the pointer leaves the element's bounds.
- Track a short **velocity/position history** (last few `pointermove` events), not just the current point — you'll need velocity at release.
```js
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.
- **Never lock out input during a transition.**
- **Always animate from the *presentation* (current) value, never the target value.** On interrupt, read the element's live on-screen transform and start the new animation from there. Starting from the logical/target value causes a visible jump.
- **Avoid CSS transitions and `@keyframes` for anything gesture-driven** — they can't be smoothly grabbed and reversed mid-flight. Springs animate from the current value by default, 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." Spring libraries that carry velocity through a re-target avoid it. (This is what iOS's *additive animations* do natively; on the web, choose a spring library that re-targets from the current velocity.)
- **Decompose 2D motion into independent X and Y springs.** A single spring on a 2D distance desyncs when X and Y have different velocities.
## 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:
- **Damping ratio** — controls overshoot. `1.0` = critically damped, no bounce, smooth settle. `< 1.0` = overshoots and oscillates. Lower = bouncier.
- **Response** — how quickly the value reaches the target, in seconds. Lower = snappier. **This is not "duration"** — a spring has no fixed duration; its settle time emerges from the parameters.
**Defaults:**
- Start most UI at **damping `1.0`** (critically damped) — graceful and non-distracting.
- Add bounce (**damping ~`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.
**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.
```js
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.From cx18121/agent-skills, MIT.
More from cx18121/agent-skills
- 0.561score
better-interface
cx18121
Review UI screens, flows, branches, or PRs across design domains.
SkillAFreshness: AClaude Code +9 - 0.561score
firecrawl
cx18121
Use Firecrawl for an explicit Firecrawl request, site mapping, bulk crawling, structured web extraction, or live page interaction that the native web and…
SkillAFreshness: AClaude Code +9 - 0.550score
idiot
cx18121
Explain from zero context in simple, concise terms.
SkillAFreshness: AClaude Code +9 - 0.539score
codebase-design
cx18121
Shared vocabulary for designing deep modules.
SkillAFreshness: AClaude Code +9 - 0.539score
herdr
cx18121
Use only when the user explicitly mentions Herdr or requests its pane, tab, workspace, command, or agent controls.
SkillAFreshness: AClaude Code +9 - 0.524score
diagnosing-bugs
cx18121
Reproduction signals, chronology, and hypothesis testing for hard, elusive, or intermittent bugs.
SkillBFreshness: BClaude Code +9 - 0.519score
eli5
cx18121
Explain a topic like I'm a 5 year old.
SkillBFreshness: BClaude Code +9 - 0.519score
docker-cleanup
cx18121
Use when Charlie asks to free local Docker or OrbStack disk, remove unused containers, images, volumes, networks, or build cache, or diagnose recurring Docker…
SkillBFreshness: BClaude Code +9 - 0.515score
algorithms-homework
cx18121
Guided help for Charlie's algorithms coursework.
SkillBFreshness: BClaude Code +9 - 0.515score
emil-design-eng
cx18121
Emil Kowalski's technique reference for component behavior, CSS transforms, clip-path, gestures, and animation performance.
SkillBFreshness: BClaude Code +9 - 0.513score
commit-style
cx18121
Mandatory when writing, amending, squashing, or proposing a commit subject or pull request title.
SkillBFreshness: BClaude Code +9
Signals
- Stars
- 0
- Forks
- 0
- Open issues
- 0
- Last commit (this folder)
- Sep 16, 2026 (1 month ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/cx18121/agent-skills
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from cx18121
- 0.561score
better-interface
cx18121
Review UI screens, flows, branches, or PRs across design domains.
SkillAFreshness: AClaude Code +9 - 0.561score
firecrawl
cx18121
Use Firecrawl for an explicit Firecrawl request, site mapping, bulk crawling, structured web extraction, or live page interaction that the native web and…
SkillAFreshness: AClaude Code +9 - 0.550score
idiot
cx18121
Explain from zero context in simple, concise terms.
SkillAFreshness: AClaude Code +9 - 0.539score
codebase-design
cx18121
Shared vocabulary for designing deep modules.
SkillAFreshness: AClaude Code +9 - 0.539score
herdr
cx18121
Use only when the user explicitly mentions Herdr or requests its pane, tab, workspace, command, or agent controls.
SkillAFreshness: AClaude Code +9 - 0.524score
diagnosing-bugs
cx18121
Reproduction signals, chronology, and hypothesis testing for hard, elusive, or intermittent bugs.
SkillBFreshness: BClaude Code +9
Cite this page
apple-design skill. Agent Mart. https://agentmart.dev/skills/cx18121-apple-design (last updated 2026-10-24)