@its-thepoe/design-motion-principles 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SKILL.md +334 -0
- package/audit-checklist.md +137 -0
- package/package.json +18 -0
- package/references/accessibility.md +52 -0
- package/references/common-mistakes.md +158 -0
- package/references/emil-kowalski.md +355 -0
- package/references/jakub-krehel.md +317 -0
- package/references/jhey-tompkins.md +367 -0
- package/references/performance.md +82 -0
- package/references/philosophy.md +108 -0
- package/references/technical-principles.md +527 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Performance
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## will-change Explained (Jakub)
|
|
6
|
+
|
|
7
|
+
A hint to the browser: "I'm about to animate these properties, please prepare."
|
|
8
|
+
|
|
9
|
+
```css
|
|
10
|
+
/* Good - specific properties that will animate */
|
|
11
|
+
.animated-button {
|
|
12
|
+
will-change: transform, opacity;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/* Bad - too broad, wastes resources */
|
|
16
|
+
* { will-change: auto; }
|
|
17
|
+
.element { will-change: all; }
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**Properties that benefit from will-change**:
|
|
21
|
+
- transform
|
|
22
|
+
- opacity
|
|
23
|
+
- filter (blur, brightness)
|
|
24
|
+
- clip-path
|
|
25
|
+
- mask
|
|
26
|
+
|
|
27
|
+
**Why it matters**: Without the hint, the browser promotes elements to GPU layers only when animation starts, causing first-frame stutter. With `will-change`, it pre-promotes during idle time.
|
|
28
|
+
|
|
29
|
+
**When NOT to use**:
|
|
30
|
+
- On elements that won't animate
|
|
31
|
+
- On too many elements (each GPU layer uses memory)
|
|
32
|
+
- As a "fix" for janky animations (find the real cause)
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Gradient Animation Performance (Jakub)
|
|
37
|
+
|
|
38
|
+
**Cheap to animate (GPU-accelerated)**:
|
|
39
|
+
- background-position
|
|
40
|
+
- background-size
|
|
41
|
+
- opacity
|
|
42
|
+
|
|
43
|
+
**Expensive to animate**:
|
|
44
|
+
- Color stops
|
|
45
|
+
- Adding/removing gradient layers
|
|
46
|
+
- Switching gradient types
|
|
47
|
+
|
|
48
|
+
**Tip**: Animate a pseudo-element overlay or use CSS variables that transition indirectly.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Animation Performance Budget
|
|
53
|
+
|
|
54
|
+
As a rough guide:
|
|
55
|
+
- **0-3 elements** with `will-change`: Fine
|
|
56
|
+
- **4-10 elements**: Careful, test on low-end devices
|
|
57
|
+
- **10+ elements**: Reconsider approach, use virtualization or stagger
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Properties to Avoid Animating
|
|
62
|
+
|
|
63
|
+
These trigger layout recalculation (expensive):
|
|
64
|
+
- `width`, `height`
|
|
65
|
+
- `top`, `left`, `right`, `bottom`
|
|
66
|
+
- `margin`, `padding`
|
|
67
|
+
- `font-size`
|
|
68
|
+
|
|
69
|
+
**Always prefer**:
|
|
70
|
+
- `transform: translate()` instead of `top`/`left`
|
|
71
|
+
- `transform: scale()` instead of `width`/`height`
|
|
72
|
+
- `opacity` for visibility changes
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Performance Checklist
|
|
77
|
+
|
|
78
|
+
- [ ] `will-change` used sparingly and specifically
|
|
79
|
+
- [ ] Animations use transform/opacity (not layout properties)
|
|
80
|
+
- [ ] Tested on low-end devices
|
|
81
|
+
- [ ] No continuous animations without purpose
|
|
82
|
+
- [ ] GPU layer count is reasonable (< 10 animated elements)
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# Philosophy & Approach
|
|
2
|
+
|
|
3
|
+
Understanding the "why" behind these designers' techniques is as important as the techniques themselves. Their approaches differ significantly, and knowing when to apply each mindset is crucial.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Emil's Approach: Purposeful Restraint
|
|
8
|
+
|
|
9
|
+
Emil Kowalski's defining contribution is knowing **when NOT to animate**.
|
|
10
|
+
|
|
11
|
+
> "The goal is not to animate for animation's sake, it's to build great user interfaces."
|
|
12
|
+
|
|
13
|
+
**Core Philosophy**: Animation decisions should be driven by **interaction frequency**. The more often users perform an action, the less animation it should have—or none at all.
|
|
14
|
+
|
|
15
|
+
**The Frequency Framework**:
|
|
16
|
+
- **Rare interactions** (monthly): Delightful, expressive animations welcome
|
|
17
|
+
- **Occasional interactions** (daily): Subtle, fast animations
|
|
18
|
+
- **Frequent interactions** (100s/day): Minimal or no animation
|
|
19
|
+
- **Keyboard-initiated actions**: Never animate
|
|
20
|
+
|
|
21
|
+
**Emil's Speed Rule**: For high-frequency UI, animations should stay under 300ms (180ms feels ideal). When in doubt, go faster. *Note: This is Emil's guideline for productivity tools—Jakub and Jhey may use longer durations for polish or experimentation.*
|
|
22
|
+
|
|
23
|
+
**When to apply Emil's mindset**:
|
|
24
|
+
- High-frequency productivity tools (like Raycast, Linear)
|
|
25
|
+
- Keyboard-heavy workflows
|
|
26
|
+
- When users have clear goals and don't expect delight
|
|
27
|
+
- When questioning whether to animate at all
|
|
28
|
+
- When existing animations feel slow or tiresome
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Jakub's Approach: Subtle Production Polish
|
|
33
|
+
|
|
34
|
+
Jakub's work embodies **refinement for production use**. His animations are:
|
|
35
|
+
|
|
36
|
+
- **Barely noticeable** — If users consciously notice the animation, it's probably too much
|
|
37
|
+
- **Production-ready** — Designed for real client work, not demos
|
|
38
|
+
- **Contextually appropriate** — Adapts to light mode, varied backgrounds, real content
|
|
39
|
+
- **Subtle over flashy** — The goal is to make interfaces feel smooth and responsive, not impressive
|
|
40
|
+
|
|
41
|
+
**Core Philosophy**: Animation should **enhance the experience invisibly**. Users should feel that an interface is polished and responsive without being able to point to specific animations. The best compliment is "this feels really nice" not "cool animation!"
|
|
42
|
+
|
|
43
|
+
**When to apply Jakub's mindset**:
|
|
44
|
+
- Production applications and client work
|
|
45
|
+
- Professional/enterprise interfaces
|
|
46
|
+
- When users will interact repeatedly (animations must not get tiresome)
|
|
47
|
+
- When accessibility and performance are critical
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Jhey's Approach: Learn Through Playful Creation
|
|
52
|
+
|
|
53
|
+
Jhey's work embodies **experimental joy**. His philosophy:
|
|
54
|
+
|
|
55
|
+
> "I went from 'I want to learn X, so how do I fit it into Y' to 'I want to make Y, can I learn X to do it?'"
|
|
56
|
+
|
|
57
|
+
**The motivation should be making something cool—learning is a happy side effect.**
|
|
58
|
+
|
|
59
|
+
**Core Beliefs**:
|
|
60
|
+
- **No idea is a bad idea** — Document every spark, however weird (toadstools, Peter Griffin blinds, bread array slice/splice cartoon)
|
|
61
|
+
- **Don't ask "Why?" or "Is this practical?"** — Make what brings you joy first
|
|
62
|
+
- **"Useless" demos teach real skills** — CSS art teaches clip-path mastery, border-radius tricks, stacking contexts
|
|
63
|
+
- **Lateral learning** — Building diverse demos trains you to switch contexts and rise to challenges
|
|
64
|
+
- **You'll never have time to make everything** — And that's okay. The act of documenting ideas matters.
|
|
65
|
+
|
|
66
|
+
**Core Philosophy**: Playfulness in code supercharges learning. The fact you're learning new skills is a bonus, not the goal. Work on ideas that spark joy for you.
|
|
67
|
+
|
|
68
|
+
**When to apply Jhey's mindset**:
|
|
69
|
+
- Learning new techniques
|
|
70
|
+
- Personal projects and experiments
|
|
71
|
+
- When you're stuck in a creative rut
|
|
72
|
+
- Building your portfolio or demos
|
|
73
|
+
- Exploring what's possible with new CSS features
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## The Golden Rule of Animation
|
|
78
|
+
|
|
79
|
+
> "The best animation is that which goes unnoticed."
|
|
80
|
+
|
|
81
|
+
*(Note: Jhey references this as a saying that has always stuck with him, not as his original quote. The principle itself is widely shared in motion design.)*
|
|
82
|
+
|
|
83
|
+
This captures the essence of production-quality motion design. Effective motion:
|
|
84
|
+
- Enhances the experience without demanding attention
|
|
85
|
+
- Feels natural and expected
|
|
86
|
+
- Serves a functional purpose (orientation, feedback, continuity)
|
|
87
|
+
- Doesn't fatigue users on repeated interactions
|
|
88
|
+
|
|
89
|
+
**The test**: If you remove the animation, do users feel something is missing? Good. If users comment "nice animation!" every time they see it? Probably too prominent.
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Synthesizing All Three Approaches
|
|
94
|
+
|
|
95
|
+
| Question | Emil | Jakub | Jhey |
|
|
96
|
+
|----------|------|-------|------|
|
|
97
|
+
| **Primary concern** | "Should this animate at all?" | "Is this subtle enough?" | "What could this become?" |
|
|
98
|
+
| **Success metric** | Frictionless workflow | Invisible polish | Joy and learning |
|
|
99
|
+
| **Duration preference** | Under 300ms (180ms ideal) | "Whatever feels right" (often 200-400ms) | Varies widely by effect |
|
|
100
|
+
| **Signature technique** | Frequency-based decisions | Blur + opacity + translateY | CSS custom properties |
|
|
101
|
+
| **Ideal context** | High-frequency tools | Production polish | Learning & exploration |
|
|
102
|
+
|
|
103
|
+
**Decision Framework**:
|
|
104
|
+
1. **First, apply Emil's lens**: Should this animate at all? Check frequency and purpose.
|
|
105
|
+
2. **If yes, apply Jakub's lens**: How do we make this subtle and production-ready?
|
|
106
|
+
3. **For learning/exploration, apply Jhey's lens**: What techniques can we discover through play?
|
|
107
|
+
|
|
108
|
+
The three approaches aren't competing—they're complementary filters for different stages and contexts of motion design work.
|