skills/material-design-3-motion/SKILL.md
Applies Material Design 3 Expressive motion and animation principles to create natural, intuitive, and engaging user experiences. Use this when implementing animations, transitions, micro-interactions, or when the user asks to apply Material Design 3 motion guidelines.
npx skillsauth add shelbeely/shelbeely-agent-skills material-design-3-motionInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill guides the implementation of Material Design 3 (M3) Expressive motion principles to create springy, natural-feeling animations that enhance usability and delight users.
Keywords: Material Design 3, M3, motion, animation, transitions, micro-interactions, easing, duration, spring physics, expressive motion, haptics, physics-based animation
M3 Expressive motion is designed to feel alive, natural, and responsive:
Expressive Motion (Default for M3 Expressive):
Standard Motion (Utilitarian flows):
Legacy Motion (Compatibility):
M3 Expressive motion uses three key physics parameters instead of traditional time/easing curves:
| Scheme | Stiffness | Damping | Bounce Effect | |------------|-----------|---------|---------------| | Expressive | High | Medium | Pronounced overshoot | | Standard | Medium | High | Minimal/none |
Enter Transitions (Elements appearing):
Exit Transitions (Elements disappearing):
Shared Element Transitions (Between screens/states):
Hover States:
Focus States:
Press/Touch States:
Loading States:
Stagger Animations:
Choreographed Animations:
Morphing Shapes:
Extra Small (50-100ms):
Small (100-200ms):
Medium (200-300ms):
Large (300-500ms):
Extra Large (500ms+):
/* CSS with expressive spring-like bezier approximation */
transition-timing-function: cubic-bezier(0.05, 0.7, 0.1, 1.0);
/* Enhanced linear() for expressive spring with overshoot */
transition-timing-function: linear(
0, 0.004, 0.016 2.5%, 0.063 5%, 0.141, 0.25,
0.391 11.3%, 0.563, 0.765, 1.000 20%, 1.066 23.8%,
1.109 27.5%, 1.130 31.3%, 1.138 35%, 1.136 38.8%,
1.121 46.3%, 1.093 53.8%, 1.057 61.3%, 1.025 68.8%,
1.005 77.5%, 0.997 87.5%, 1
);
/* CSS with standard spring-like bezier approximation */
transition-timing-function: cubic-bezier(0.2, 0.0, 0, 1.0);
/* CSS linear() for better standard spring approximation */
transition-timing-function: linear(
0, 0.009, 0.035 2.1%, 0.141 4.4%, 0.723 12.9%,
0.938 16.7%, 1.017, 1.077, 1.121, 1.149 24.3%,
1.159, 1.163, 1.161, 1.154 29.9%, 1.129 32.8%,
1.051 39.6%, 1.017 43.1%, 0.991, 0.977 51%,
0.974 53.8%, 0.975 57.1%, 0.997 69.8%, 1.003 76.9%, 1
);
// Expressive spring animation
element.animate(
[
{ transform: 'scale(0)', opacity: 0 },
{ transform: 'scale(1)', opacity: 1 }
],
{
duration: 300,
easing: 'cubic-bezier(0.05, 0.7, 0.1, 1.0)',
fill: 'forwards'
}
);
// Standard spring animation
element.animate(
[
{ transform: 'translateY(20px)', opacity: 0 },
{ transform: 'translateY(0)', opacity: 1 }
],
{
duration: 250,
easing: 'cubic-bezier(0.2, 0.0, 0, 1.0)',
fill: 'forwards'
}
);
| Scenario | Motion Mode | Why | |----------|-------------|-----| | Button press feedback | Expressive | User-triggered, benefits from bounce | | Page transition | Standard | Functional, should not distract | | Loading completion | Expressive | Celebratory moment of delight | | Form validation | Standard | Utilitarian feedback | | FAB expansion | Expressive | Key interaction with visual emphasis | | List scroll | Standard | Continuous motion, should be smooth | | Shape morphing | Expressive | Visual storytelling moment | | Tooltip appearance | Standard | Informational, should not distract |
M3 Expressive recommends pairing spring-driven animations with platform-native haptic feedback:
// Pair haptic feedback with expressive motion
function expressivePress(element) {
// Trigger haptic feedback
if (navigator.vibrate) {
navigator.vibrate(10); // Short, subtle haptic
}
// Trigger spring animation
element.animate([
{ transform: 'scale(1)' },
{ transform: 'scale(0.95)' },
{ transform: 'scale(1.02)' },
{ transform: 'scale(1)' }
], {
duration: 300,
easing: 'cubic-bezier(0.05, 0.7, 0.1, 1.0)'
});
}
Smoothly morph from one container to another:
// Using View Transitions API (modern browsers)
document.startViewTransition(() => {
// Update DOM
container.classList.toggle('expanded');
});
// CSS
::view-transition-old(container),
::view-transition-new(container) {
animation-duration: 300ms;
animation-timing-function: cubic-bezier(0.2, 0.0, 0, 1.0);
}
Elements exit and enter along a shared axis:
/* X-axis shared transition */
.exit-left {
animation: exit-left 300ms cubic-bezier(0.2, 0.0, 0, 1.0);
}
.enter-right {
animation: enter-right 300ms cubic-bezier(0.2, 0.0, 0, 1.0);
}
@keyframes exit-left {
from { transform: translateX(0); opacity: 1; }
to { transform: translateX(-100px); opacity: 0; }
}
@keyframes enter-right {
from { transform: translateX(100px); opacity: 0; }
to { transform: translateX(0); opacity: 1; }
}
Animate elevation with shadow and transform:
.elevated-card {
transition:
box-shadow 200ms cubic-bezier(0.2, 0.0, 0, 1.0),
transform 200ms cubic-bezier(0.2, 0.0, 0, 1.0);
}
.elevated-card:hover {
box-shadow:
0px 4px 8px rgba(0, 0, 0, 0.12),
0px 8px 16px rgba(0, 0, 0, 0.08);
transform: translateY(-2px);
}
Material ripple for touch feedback:
.ripple {
position: relative;
overflow: hidden;
}
.ripple::after {
content: '';
position: absolute;
top: 50%;
left: 50%;
width: 0;
height: 0;
border-radius: 50%;
background: rgba(255, 255, 255, 0.5);
transform: translate(-50%, -50%);
transition: width 0.3s, height 0.3s;
}
.ripple:active::after {
width: 300%;
height: 300%;
}
Always respect user preferences:
@media (prefers-reduced-motion: reduce) {
* {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
Ensure animated focus states are still visible:
transform and opacity (GPU accelerated)width, height, top, left (causes layout reflow)will-change sparingly for complex animationsDefine motion tokens for consistency. M3 Expressive introduces tokenized spring-based motion:
:root {
/* Durations */
--md-sys-motion-duration-short1: 50ms;
--md-sys-motion-duration-short2: 100ms;
--md-sys-motion-duration-short3: 150ms;
--md-sys-motion-duration-short4: 200ms;
--md-sys-motion-duration-medium1: 250ms;
--md-sys-motion-duration-medium2: 300ms;
--md-sys-motion-duration-medium3: 350ms;
--md-sys-motion-duration-medium4: 400ms;
--md-sys-motion-duration-long1: 450ms;
--md-sys-motion-duration-long2: 500ms;
--md-sys-motion-duration-long3: 550ms;
--md-sys-motion-duration-long4: 600ms;
/* Easing — Standard (utilitarian) */
--md-sys-motion-easing-standard: cubic-bezier(0.2, 0.0, 0, 1.0);
--md-sys-motion-easing-standard-decelerate: cubic-bezier(0.0, 0.0, 0, 1.0);
--md-sys-motion-easing-standard-accelerate: cubic-bezier(0.3, 0.0, 1.0, 1.0);
/* Easing — Expressive (default for M3 Expressive) */
--md-sys-motion-easing-expressive: cubic-bezier(0.05, 0.7, 0.1, 1.0);
--md-sys-motion-easing-expressive-decelerate: cubic-bezier(0.05, 0.7, 0.1, 1.0);
--md-sys-motion-easing-expressive-accelerate: cubic-bezier(0.3, 0.0, 0.8, 0.15);
/* Easing — Emphasized (legacy naming, same as expressive) */
--md-sys-motion-easing-emphasized: cubic-bezier(0.05, 0.7, 0.1, 1.0);
--md-sys-motion-easing-emphasized-decelerate: cubic-bezier(0.05, 0.7, 0.1, 1.0);
--md-sys-motion-easing-emphasized-accelerate: cubic-bezier(0.3, 0.0, 0.8, 0.15);
/* Legacy easing */
--md-sys-motion-easing-legacy: cubic-bezier(0.4, 0.0, 0.2, 1.0);
/* Expressive tokenized motion (new in M3 Expressive) */
--md-sys-motion-expressive-fast-spatial: cubic-bezier(0.05, 0.7, 0.1, 1.0);
--md-sys-motion-expressive-fast-effects: cubic-bezier(0.2, 0.0, 0, 1.0);
--md-sys-motion-expressive-slow-spatial: cubic-bezier(0.05, 0.7, 0.1, 1.0);
--md-sys-motion-expressive-slow-effects: cubic-bezier(0.2, 0.0, 0, 1.0);
}
When implementing M3 motion, ensure:
examples/motion-patterns.css — Ready-to-use CSS animation patterns using M3 motion tokens (fade, scale, slide, shared axis, state layer, elevation, and theme transitions). Copy the relevant @keyframes and classes into your project.tools
Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Claude's capabilities with specialized knowledge, workflows, or tool integrations.
development
Generate Material Design 3 color themes programmatically from a source color using @material/material-color-utilities, the same engine that powers the Material Theme Builder. Use this when the user asks to generate an M3 color palette, create a custom theme from a brand color, or export M3 tokens to CSS, JSON, or framework configs.
testing
Applies Material Design 3 Expressive typography principles including variable fonts, type scales, and hierarchy. Use this when working on text styling, type hierarchy, readable interfaces, or when the user asks to apply Material Design 3 typography guidelines.
testing
Applies Material Design 3 Expressive shape and containment principles including rounded corners, morphing shapes, and container design. Use this when working on component shapes, borders, containment, or when the user asks to apply Material Design 3 shape guidelines.