diff --git a/.skill-lock.json b/.skill-lock.json index cbbc8fd4d..5ca394efd 100644 --- a/.skill-lock.json +++ b/.skill-lock.json @@ -162,6 +162,15 @@ "skillFolderHash": "05bb4c1a9463fe22342c09422760c5526d2dac06", "installedAt": "2026-02-25T00:51:58.400Z", "updatedAt": "2026-02-25T00:51:58.400Z" + }, + "mobile-touch": { + "source": "dylantarre/animation-principles", + "sourceType": "github", + "sourceUrl": "https://github.com/dylantarre/animation-principles.git", + "skillPath": "skills/01-by-domain/mobile-touch/SKILL.md", + "skillFolderHash": "9203ae12266a3e314804dcfd26dae33abb495b51", + "installedAt": "2026-02-25T00:52:09.969Z", + "updatedAt": "2026-02-25T00:52:09.969Z" } }, "dismissed": { diff --git a/memory/memories.db-shm b/memory/memories.db-shm index 96ccbe086..7c9e84324 100644 Binary files a/memory/memories.db-shm and b/memory/memories.db-shm differ diff --git a/memory/memories.db-wal b/memory/memories.db-wal index fd67c79fa..236de7d23 100644 Binary files a/memory/memories.db-wal and b/memory/memories.db-wal differ diff --git a/skills/mobile-touch/SKILL.md b/skills/mobile-touch/SKILL.md new file mode 100644 index 000000000..6e83c9a99 --- /dev/null +++ b/skills/mobile-touch/SKILL.md @@ -0,0 +1,88 @@ +--- +name: mobile-touch +description: Use when designing iOS/Android gestures, haptic feedback, touch interactions, or native mobile animations. +--- + +# Mobile Touch Animation + +Apply Disney's 12 animation principles to mobile gestures, haptics, and native app motion. + +## Quick Reference + +| Principle | Mobile Implementation | +|-----------|----------------------| +| Squash & Stretch | Rubber-banding, bounce on scroll limits | +| Anticipation | Peek before reveal, long-press preview | +| Staging | Sheet presentations, focus states | +| Straight Ahead / Pose to Pose | Gesture-driven vs preset transitions | +| Follow Through / Overlapping | Momentum scrolling, trailing elements | +| Slow In / Slow Out | iOS spring animations, Material easing | +| Arc | Swipe-to-dismiss curves, card throws | +| Secondary Action | Haptic pulse with visual feedback | +| Timing | Touch response <100ms, transitions 250-350ms | +| Exaggeration | Bounce amplitude, haptic intensity | +| Solid Drawing | Respect safe areas, consistent anchors | +| Appeal | 60fps minimum, gesture continuity | + +## Principle Applications + +**Squash & Stretch**: Implement rubber-band effect at scroll boundaries. Pull-to-refresh should stretch content naturally. Buttons compress on touch. + +**Anticipation**: Long-press shows preview before full action. Drag threshold provides visual hint before item lifts. Swipe shows edge of destination content. + +**Staging**: Use sheet presentations to maintain context. Dim and scale background during modal focus. Hero transitions connect views meaningfully. + +**Straight Ahead vs Pose to Pose**: Gesture-following animations (drag, pinch) are straight ahead—driven by touch input. System transitions (push, present) are pose to pose—predefined keyframes. + +**Follow Through & Overlapping**: Content continues moving after finger lifts (momentum). Navigation bar elements animate slightly after main content. Lists items settle with stagger. + +**Slow In / Slow Out**: iOS uses spring physics—configure mass, stiffness, damping. Android Material uses standard easing: `FastOutSlowIn`. Never use linear for user-initiated motion. + +**Arc**: Thrown cards follow parabolic arcs. Swipe-to-dismiss curves based on velocity vector. FAB expand/collapse follows natural arc path. + +**Secondary Action**: Pair haptic feedback with visual response. Button ripple accompanies press. Success checkmark triggers light haptic. + +**Timing**: Touch acknowledgment: <100ms. Quick actions: 150-250ms. View transitions: 250-350ms. Complex animations: 350-500ms. Haptic should sync precisely with visual. + +**Exaggeration**: Pull-to-refresh stretches beyond natural—makes feedback clear. Error shake is pronounced. Success animations celebrate appropriately. + +**Solid Drawing**: Respect device safe areas during animation. Maintain consistent transform origins. Account for notch/dynamic island in motion paths. + +**Appeal**: Minimum 60fps, target 120fps on ProMotion displays. Gesture-driven animation must feel connected to finger. Interruptible animations essential. + +## Platform Patterns + +### iOS +```swift +// Spring animation with follow-through +UIView.animate(withDuration: 0.5, + delay: 0, + usingSpringWithDamping: 0.7, + initialSpringVelocity: 0.5, + options: .curveEaseOut) + +// Haptic pairing +let feedback = UIImpactFeedbackGenerator(style: .medium) +feedback.impactOccurred() +``` + +### Android +```kotlin +// Material spring animation +SpringAnimation(view, DynamicAnimation.TRANSLATION_Y) + .setSpring(SpringForce() + .setStiffness(SpringForce.STIFFNESS_MEDIUM) + .setDampingRatio(SpringForce.DAMPING_RATIO_MEDIUM_BOUNCY)) + .start() +``` + +## Haptic Guidelines + +| Action | iOS | Android | +|--------|-----|---------| +| Selection | `.selection` | `EFFECT_TICK` | +| Success | `.success` | `EFFECT_CLICK` | +| Warning | `.warning` | `EFFECT_DOUBLE_CLICK` | +| Error | `.error` | `EFFECT_HEAVY_CLICK` | + +Haptics are secondary action—always pair with visual confirmation.