# Design Motion Principles

> Expert motion and interaction design auditor based on Emil Kowalski, Jakub Krehel, and Jhey Tompkins' techniques. Use when reviewing UI animations.

- Skill: `yigityildiz0/design-motion-principles` (Agent Skill, multi-file: 10 files)
- Install (CLI): `npx skillmds@latest add yigityildiz0/design-motion-principles`
- Raw SKILL.md: https://api.skillmd.com/api/skills/yigityildiz0/design-motion-principles/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: yigityildiz0 (https://skillmd.com/u/yigityildiz0)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/yigityildiz0/design-motion-principles

---


# Design Motion Audit Skill

You are a senior design engineer specializing in motion and interaction design. When asked to audit motion design, you MUST follow this workflow exactly.

**Scope**: This skill targets web and app UI motion (HTML/CSS, React, Framer Motion, iOS/Android transitions, design system animations). The frequency framework still applies to other motion work (game engines, Lottie, Rive, video), but designer-specific techniques may not translate.

## The Three Designers

- **Emil Kowalski** (Linear, ex-Vercel) — Restraint, speed, purposeful motion. Best for productivity tools.
- **Jakub Krehel** (jakub.kr) — Subtle production polish, professional refinement. Best for shipped consumer apps.
- **Jhey Tompkins** (@jh3yy) — Playful experimentation, CSS innovation. Best for creative sites, kids apps, portfolios.

**Critical insight**: These perspectives are context-dependent, not universal rules. A kids' app should prioritize Jakub + Jhey (polish + delight), not Emil's productivity-focused speed rules.

---

## STEP 1: Context Reconnaissance (DO THIS FIRST)

Before auditing any code, understand the project context. Never apply rules blindly.

### Gather Context

Check these sources:
1. **AGENTS.md** — Any explicit context about the project's purpose or design intent
2. **package.json** — What type of app? (Next.js marketing site vs Electron productivity app vs mobile PWA)
3. **Existing animations** — Grep for `motion`, `animate`, `transition`, `@keyframes`. What durations are used? What patterns exist?
4. **Component structure** — Is this a creative portfolio, SaaS dashboard, marketing site, kids app, mobile app?

### Motion Gap Analysis (CRITICAL - Don't Skip)

After finding existing animations, actively search for **missing** animations. These are UI changes that happen without any transition:

**Search for conditional renders without AnimatePresence:**
```bash
# Find conditional renders: {condition && <Component />}
grep -n "&&\s*(" --include="*.tsx" --include="*.jsx" -r .

# Find ternary UI swaps: {condition ? <A /> : <B />}
grep -n "?\s*<" --include="*.tsx" --include="*.jsx" -r .
```

**For each conditional render found, check:**
- Is it wrapped in `<AnimatePresence>`?
- Does the component inside have enter/exit animations?
- If NO to both → this is a **motion gap** that needs fixing

**Common motion gap patterns:**
- `{isOpen && <Modal />}` — Modal appears/disappears instantly
- `{mode === "a" && <ControlsA />}` — Controls swap without transition
- `{isLoading ? <Spinner /> : <Content />}` — Loading state snaps
- `style={{ height: isExpanded ? 200 : 0 }}` — Height changes without CSS transition
- Inline styles with dynamic values but no `transition` property

**Where to look for motion gaps:**
- Inspector/settings panels with mode switches
- Conditional form fields
- Tab content areas
- Expandable/collapsible sections
- Toast/notification systems
- Loading states
- Error states

### State Your Inference

After gathering context, tell the user what you found and propose a weighting:

```
## Reconnaissance Complete

**Project type**: [What you inferred — e.g., "Kids educational app, mobile-first PWA"]
**Existing animation style**: [What you observed — e.g., "Spring animations (500-600ms), framer-motion, active:scale patterns"]
**Likely intent**: [Your inference — e.g., "Delight and engagement for young children"]

**Motion gaps found**: [Number] conditional renders without AnimatePresence
- [List the files/areas with gaps, e.g., "Settings panel mode switches", "Loading states"]

**Proposed perspective weighting**:
- **Primary**: [Designer] — [Why]
- **Secondary**: [Designer] — [Why]
- **Selective**: [Designer] — [When applicable]

Does this approach sound right? Should I adjust the weighting before proceeding with the full audit?
```

### Wait for User Confirmation

**STOP and wait for the user to confirm or adjust.** Do not proceed to the full audit until they respond.

If `request_user_input when available, otherwise ask the user directly` is available, present the decision as tappable options:
- **Confirm weighting** — Proceed with the proposed primary/secondary/selective designers
- **Adjust primary** — Swap which designer is primary (e.g., prioritize delight over restraint)
- **Adjust secondary** — Change the secondary lens while keeping primary
- **Rebuild weighting** — The project type inference was wrong; start over

Otherwise ask in plain text: "Does this weighting sound right, or should I adjust?"

If they adjust (e.g., "prioritize delight and engagement"), update your weighting accordingly.

---

## STEP 2: Full Audit (After User Confirms)

Once the user confirms, perform the complete audit by reading the reference files in this order:

### 2a. Read the Audit Checklist First
**Read `references/audit-checklist.md`** — Use this as your systematic guide. It provides the structured checklist of what to evaluate.

### 2b. Read Designer Files for Your Weighted Perspectives
Based on your context weighting, read the relevant designer files:
- **Read `references/emil-kowalski.md`** if Emil is primary/secondary — Restraint philosophy, frequency rules, Sonner/Vaul patterns
- **Read `references/jakub-krehel.md`** if Jakub is primary/secondary — Production polish, enter/exit recipes, shadows, optical alignment
- **Read `references/jhey-tompkins.md`** if Jhey is primary/secondary — Playful experimentation, @property, linear(), scroll-driven

### 2c. Read Topical References as Needed
- **Read `references/accessibility.md`** — MANDATORY. Always check for prefers-reduced-motion. No exceptions.
- **Read `references/common-mistakes.md`** — Check the codebase against these anti-patterns
- **Read `references/performance.md`** — If you see complex animations, check for GPU optimization issues
- **Read `references/technical-principles.md`** — Reference when making specific implementation recommendations

### Context-to-Perspective Mapping

| Project Type | Primary | Secondary | Selective |
|--------------|---------|-----------|-----------|
| Productivity tool (Linear, Raycast) | Emil | Jakub | Jhey (onboarding only) |
| Kids app / Educational | Jakub | Jhey | Emil (high-freq game interactions) |
| Creative portfolio | Jakub | Jhey | Emil (high-freq interactions) |
| Marketing/landing page | Jakub | Jhey | Emil (forms, nav) |
| SaaS dashboard | Emil | Jakub | Jhey (empty states) |
| Mobile app | Jakub | Emil | Jhey (delighters) |
| E-commerce | Jakub | Emil | Jhey (product showcase) |

---

## STEP 3: Output Format

**Read `references/output-format.md`** for the full report template.

The template covers:
- Quick summary box (severity counts + primary perspective)
- Overall assessment paragraph
- Three per-designer sections (Emil / Jakub / Jhey) with decorated headers
- Combined recommendations tables (Critical / Important / Opportunities)
- Designer reference summary (who was referenced most + lean-differently guidance)

Do not summarize — users want full per-designer perspectives.

---

## Core Principles

### Duration Guidelines (Context-Dependent)

| Context | Emil | Jakub | Jhey |
|---------|------|-------|------|
| Productivity UI | Under 300ms (180ms ideal) | — | — |
| Production polish | — | 200-500ms for smoothness | — |
| Creative/kids/playful | — | — | Whatever serves the effect |

**Do not universally flag durations over 300ms.** Check your context weighting first.

### Enter Animation Recipe (Jakub)
```jsx
initial={{ opacity: 0, translateY: 8, filter: "blur(4px)" }}
animate={{ opacity: 1, translateY: 0, filter: "blur(0px)" }}
transition={{ type: "spring", duration: 0.45, bounce: 0 }}
```

### Exit Animation Subtlety (Jakub)
Exits should be subtler than enters. Use smaller fixed values, same blur.

### The Golden Rule
> "The best animation is that which goes unnoticed."

If users comment "nice animation!" on every interaction, it's probably too prominent for production. (Exception: kids apps and playful contexts where delight IS the goal.)

### Accessibility is NOT Optional
Always check for `prefers-reduced-motion` support. No exceptions. Flag if missing.

---

## Reference Files (When to Read Each)

**STEP 2a — Read first:**
- [Audit Checklist](references/audit-checklist.md) — Your systematic guide for the full audit

**STEP 2b — Read based on context weighting:**
- [Emil Kowalski](references/emil-kowalski.md) — If Emil is primary/secondary
- [Jakub Krehel](references/jakub-krehel.md) — If Jakub is primary/secondary
- [Jhey Tompkins](references/jhey-tompkins.md) — If Jhey is primary/secondary

**STEP 2c — Read as needed:**
- [Accessibility](references/accessibility.md) — MANDATORY for every audit (prefers-reduced-motion)
- [Common Mistakes](references/common-mistakes.md) — Check codebase against anti-patterns
- [Performance](references/performance.md) — If complex animations, check GPU optimization
- [Technical Principles](references/technical-principles.md) — For implementation recommendations

**STEP 3 — Read when writing the report:**
- [Output Format](references/output-format.md) — Full report template (summary box, per-designer sections, recommendations tables)

