From dylantarre-animation-principles
Use when implementing Disney's 12 animation principles with Rive interactive animations
npx claudepluginhub joshuarweaver/cascade-content-creation-misc-1 --plugin dylantarre-animation-principlesThis skill uses the workspace's default tool permissions.
Implement all 12 Disney animation principles using Rive's state machine and interactive animations.
Generates design tokens/docs from CSS/Tailwind/styled-components codebases, audits visual consistency across 10 dimensions, detects AI slop in UI.
Records polished WebM UI demo videos of web apps using Playwright with cursor overlay, natural pacing, and three-phase scripting. Activates for demo, walkthrough, screen recording, or tutorial requests.
Delivers idiomatic Kotlin patterns for null safety, immutability, sealed classes, coroutines, Flows, extensions, DSL builders, and Gradle DSL. Use when writing, reviewing, refactoring, or designing Kotlin code.
Implement all 12 Disney animation principles using Rive's state machine and interactive animations.
In Rive Editor:
scaleX: 1.2 when scaleY: 0.8// Trigger from code
rive.play('squash_stretch');
State Machine Setup:
const inputs = rive.stateMachineInputs('State Machine');
const trigger = inputs.find(i => i.name === 'jump');
trigger.fire(); // Plays anticipate → action sequence
In Rive:
// Control visibility
const bgOpacity = inputs.find(i => i.name === 'bgOpacity');
bgOpacity.value = 0.6;
Pose to Pose in Rive:
In Rive Editor:
In Rive Graph Editor:
// Runtime speed control
rive.play('animation', { speed: 0.5 });
In Rive:
State Machine approach:
// Listen for state changes
rive.on('statechange', (event) => {
if (event.data.includes('button_press')) {
// Secondary animations auto-trigger via state machine
}
});
// Or blend multiple animations
rive.play(['main_action', 'secondary_particles']);
// Fast - snappy feedback
rive.play('click', { speed: 1.5 });
// Normal
rive.play('hover');
// Slow - dramatic reveal
rive.play('reveal', { speed: 0.5 });
In Rive Editor:
In Rive:
In Rive:
Design in Rive:
// Smooth hover interactions
const hover = inputs.find(i => i.name === 'isHovering');
element.addEventListener('mouseenter', () => hover.value = true);
element.addEventListener('mouseleave', () => hover.value = false);
import { useRive, useStateMachineInput } from '@rive-app/react-canvas';
function AnimatedButton() {
const { rive, RiveComponent } = useRive({
src: 'button.riv',
stateMachines: 'Button',
autoplay: true
});
const hoverInput = useStateMachineInput(rive, 'Button', 'isHovering');
return (
<RiveComponent
onMouseEnter={() => hoverInput.value = true}
onMouseLeave={() => hoverInput.value = false}
/>
);
}