user-feedback-clarity
28
总安装量
17
周安装量
#13269
全站排名
安装命令
npx skills add https://github.com/dylantarre/animation-principles --skill user-feedback-clarity
Agent 安装分布
claude-code
14
codex
11
gemini-cli
11
opencode
11
windsurf
10
Skill 文档
User Feedback Clarity
Make feedback animations unmissable using Disney’s principles.
Problem Indicators
- Users click multiple times (didn’t see feedback)
- “Did it work?” questions
- Users miss success/error states
- Form submission confusion
- State changes go unnoticed
Diagnosis by Principle
Anticipation
Issue: No buildup before action completes Fix: Show loading/processing state immediately. User should know their input was received.
Follow Through
Issue: Feedback appears and vanishes too quickly Fix: Let feedback linger. Success messages need 2-3 seconds minimum. Add settle animation.
Staging
Issue: Feedback appears outside user’s focus Fix: Show feedback near the trigger. If button was clicked, feedback should appear on/near button.
Exaggeration
Issue: Feedback is too subtle Fix: Increase contrast, size change, or motion. Feedback must compete with user’s task focus.
Secondary Action
Issue: Only one feedback channel Fix: Combine channels: visual + motion + color. Error = red + shake. Success = green + checkmark + pulse.
Quick Fixes
- Immediate acknowledgment – Show something within 100ms
- Animate the trigger – Button should respond visibly
- Use color + motion together – Redundant signals
- Keep feedback in viewport – Near user’s focus
- Add haptic feedback – On supported devices
Troubleshooting Checklist
- Does feedback appear within 100ms of action?
- Is feedback in user’s current focus area?
- Would feedback be noticed peripherally?
- Are multiple senses engaged (visual, motion)?
- Does feedback last long enough to read?
- Is error feedback more prominent than success?
- Test: Can users tell if action succeeded without reading text?
- Test with usersâask “did that work?”
Code Pattern
/* Button feedback */
.button:active {
transform: scale(0.95);
}
.button.loading {
pointer-events: none;
}
.button.success {
animation: successPulse 300ms ease-out;
}
@keyframes successPulse {
0% { transform: scale(1); }
50% { transform: scale(1.05); background: var(--success); }
100% { transform: scale(1); }
}
/* Error shake */
@keyframes errorShake {
0%, 100% { transform: translateX(0); }
25% { transform: translateX(-4px); }
75% { transform: translateX(4px); }
}