Animation Patterns

rshankras/claude-code-apple-skills/skills/design/animation-patterns

by rshankras9ffb83138209No license784 starsListed Oct 9, 2026Updated Oct 9, 2026Repository updated 2 months ago

SwiftUI animation patterns including springs, transitions, PhaseAnimator, KeyframeAnimator, SF Symbol effects, scroll-driven effects, mesh gradients, text renderers, and shader effects. Use when implementing, reviewing, or fixing animation or visual-effect code on iOS/macOS.

Instructions onlySoftware Development
AI-generated overview

Reference patterns for SwiftUI animations, transitions, symbol effects, and shader effects on iOS and macOS.

What it does
This skill supplies correct API shapes and patterns for SwiftUI animation and visual-effect code, covering springs, transitions, PhaseAnimator, KeyframeAnimator, SF Symbol effects, scroll-driven effects, mesh gradients, text renderers, and shaders. It routes the agent to one of five reference files through a decision tree and lists API availability by OS version. It also provides a top-mistakes table and a review checklist for animation code.
When to use it
Use it when adding, reviewing, or fixing animation or visual-effect code in SwiftUI on iOS or macOS. It fits questions about springs, view transitions, hero or zoom navigation transitions, PhaseAnimator, KeyframeAnimator, SF Symbol effects, reduce motion, scroll-driven effects, MeshGradient, TextRenderer, or Metal shader effects.
Requirements
No scripts; instructions and reference documents only. The agent needs read access to the skill's markdown files, and the described APIs target iOS 13 through iOS 18 and macOS equivalents.

Animation Patterns

Correct API shapes and patterns for SwiftUI animations. Prevents the most common mistakes: mixed spring parameter generations, wrong PhaseAnimator/KeyframeAnimator closure signatures, and using matchedGeometryEffect where matchedTransitionSource is needed.

When This Skill Activates

Use this skill when the user:

  • Asks to add, fix, or review animation code
  • Mentions spring, bounce, or snappy animations
  • Wants view transitions (insertion/removal, hero, zoom)
  • Asks about PhaseAnimator or KeyframeAnimator
  • Wants SF Symbol effects (bounce, pulse, wiggle, breathe)
  • Mentions matchedGeometryEffect or matchedTransitionSource
  • Asks about reduce motion / animation accessibility
  • Wants to sequence or chain animations
  • Mentions withAnimation, animation completions, or Transaction
  • Wants scroll-driven effects (parallax, carousels, scrollTransition, visualEffect)
  • Mentions MeshGradient, TextRenderer, or Metal shader effects (colorEffect, distortionEffect, layerEffect)

Decision Tree

Choose the right reference file based on what the user needs:

What are you animating?│├─ A state change (opacity, position, color)│  └─ → core-animations.md│     ├─ withAnimation { } — explicit animation│     ├─ .animation(_:value:) — implicit animation│     └─ Spring configuration — .spring, .bouncy, .snappy, .smooth│├─ A multi-step / sequenced animation│  └─ → phase-keyframe-animators.md (PhaseAnimator)│     └─ Cycles through discrete phases automatically or on trigger│├─ A complex multi-property animation (scale + rotation + offset)│  └─ → phase-keyframe-animators.md (KeyframeAnimator)│     └─ Timeline-based keyframes with per-property tracks│├─ A view appearing / disappearing│  └─ → transitions.md│     ├─ .transition() — insertion/removal│     ├─ .contentTransition() — text/symbol changes│     └─ .asymmetric() — different in/out│├─ A hero / zoom navigation transition│  └─ → transitions.md (matchedTransitionSource section)│     ├─ iOS 18+: matchedTransitionSource + .navigationTransition(.zoom)│     ├─ UIKit: preferredTransition = .zoom (capture stable IDs, never views)│     └─ iOS 14+: matchedGeometryEffect (NOT for NavigationStack)│├─ A UIKit view driven by SwiftUI state or gestures│  └─ → transitions.md (Bridging UIKit and SwiftUI Animations)│     └─ UIView.animate(.spring(...)) / context.animate in updateUIView│├─ An SF Symbol animation│  └─ → symbol-effects.md│     └─ .symbolEffect(.bounce), .pulse, .wiggle, .breathe, .rotate│├─ A scroll-driven, geometry-driven, or shader effect│  └─ → visual-effects.md│     ├─ .scrollTransition — carousel scale/parallax/caption fades│     ├─ .visualEffect — position-based effects without GeometryReader│     ├─ MeshGradient — animatable multi-point gradients│     ├─ TextRenderer — per-line / per-glyph text animation│     └─ ShaderLibrary + .colorEffect / .distortionEffect / .layerEffect│└─ Spring physics / timing configuration   └─ → core-animations.md (Spring Configurations section)

API Availability

APIMinimum VersionReference
withAnimationiOS 13core-animations.md
.animation(_:value:)iOS 13core-animations.md
.spring(response:dampingFraction:)iOS 13core-animations.md
.matchedGeometryEffectiOS 14transitions.md
.transition(.push(from:))iOS 16transitions.md
.contentTransition(.numericText())iOS 16transitions.md
PhaseAnimatoriOS 17phase-keyframe-animators.md
KeyframeAnimatoriOS 17phase-keyframe-animators.md
.spring(duration:bounce:)iOS 17core-animations.md
Spring presets (.bouncy, .snappy, .smooth)iOS 17core-animations.md
withAnimation(_:completionCriteria:_:completion:)iOS 17core-animations.md
.symbolEffect()iOS 17symbol-effects.md
.transition(.blurReplace)iOS 17transitions.md
.contentTransition(.symbolEffect(.replace))iOS 17transitions.md
Transition protocol / TransitionPhaseiOS 17transitions.md
TransactionKey, scoped .animation / .transaction variantsiOS 17core-animations.md
KeyframeTimeline, .mapCameraKeyframeAnimatoriOS 17phase-keyframe-animators.md
.scrollTransition, .visualEffectiOS 17visual-effects.md
Shaders: .colorEffect / .distortionEffect / .layerEffectiOS 17visual-effects.md
MeshGradientiOS 18visual-effects.md
TextRenderer / TextAttributeiOS 18visual-effects.md
.matchedTransitionSourceiOS 18transitions.md
.navigationTransition(.zoom) — push, sheet, fullScreenCoveriOS 18transitions.md
UIViewController.preferredTransition = .zoomiOS 18transitions.md
UIView.animate(_: Animation) / context.animateiOS 18transitions.md

Top 5 Mistakes — Quick Reference

#MistakeFixDetails
1spring(response:bounce:) — mixing parameter generationsUse either spring(response:dampingFraction:) (iOS 13) or spring(duration:bounce:) (iOS 17)core-animations.md
2.animation(.spring()) without value: parameterAlways pass value: — the no-value variant is deprecated (iOS 15)core-animations.md
3Wrong PhaseAnimator closure signaturePhaseAnimator(phases) { content, phase in } — not { phase in }phase-keyframe-animators.md
4Using matchedGeometryEffect for NavigationStack transitionsUse matchedTransitionSource + .navigationTransition(.zoom) on iOS 18+transitions.md
5Using withAnimation for SF Symbol effectsUse .symbolEffect() modifier insteadsymbol-effects.md

Review Checklist

When reviewing animation code, verify:

  • Reduce motion — animations respect AccessibilityMotionEffect or UIAccessibility.isReduceMotionEnabled; provide non-motion alternatives
  • Duration limits — no animation exceeds ~0.5s for UI feedback; longer only for decorative/ambient effects
  • Spring vs linear — springs for interactive/physical motion; linear/easeInOut only for opacity fades or progress indicators
  • No deprecated APIs — .animation(.spring()) without value: is deprecated; .animation(nil) is replaced by withTransaction
  • Correct spring generation — parameter names match the same API generation (never mix response with bounce)
  • Completion handlers — using withAnimation(_:completionCriteria:_:completion:) (iOS 17+), not inventing .onAnimationCompleted
  • Transition scope — .transition() only affects views inside if/switch controlled by state; not for views that are always present
  • Per-frame closures stay cheap — KeyframeAnimator content closures, visualEffect closures, TextRenderer.draw, and Animatable view bodies run every frame; no allocation, formatting, or layout math inside

Reference Files

FileContent
core-animations.md [blocked]withAnimation, springs, completions, transactions + TransactionKey, timing curves, Animatable mechanics, fluid-interface principles (momentum projection, rubber-banding, hysteresis)
phase-keyframe-animators.md [blocked]PhaseAnimator, KeyframeAnimator, KeyframeTimeline, MapKit camera keyframes, custom animations
transitions.md [blocked]View transitions, custom Transition protocol, matched geometry, navigation/zoom transitions (SwiftUI + UIKit), interruptibility, UIKit↔SwiftUI bridging, gesture-driven springs
symbol-effects.md [blocked]SF Symbol effects, accessibility
visual-effects.md [blocked]scrollTransition, visualEffect, MeshGradient, TextRenderer, shader effects (colorEffect/distortionEffect/layerEffect), effect pipelines, semantic alignment guides

Source and attribution

Source:rshankras/claude-code-apple-skillsinskills/design/animation-patternsat commit9ffb831

License: No license

Content belongs to its original authors. SourceWeft indexes it from a public repository.

Report or request removal