Skip to content
Development
Skill

/ios-animation-code-review

Reviews iOS animation code for correctness, performance, accessibility, and Apple API best practices. Use when reviewing .swift files containing animation code — withAnimation, .animation(), PhaseAnimator, KeyframeAnimator, matchedGeometryEffect, navigationTransition,

From plugin
beagle
85139 skills2 commands

Claude Code

$ npx -y skills add existential-birds/beagle --skill ios-animation-code-review --agent claude-code

SKILL.md

ios-animation-code-review.SKILL.md
name: ios-animation-code-review
description: Reviews iOS animation code for correctness, performance, accessibility, and Apple API best practices. Use when reviewing .swift files containing animation code — withAnimation, .animation(), PhaseAnimator, KeyframeAnimator, matchedGeometryEffect, navigationTransition, CABasicAnimation, CASpringAnimation, UIViewPropertyAnimator, UIDynamicAnimator, symbolEffect, scrollTransition, contentTransition, or custom Transition conformances.

iOS Animation Code Review

Quick Reference

| Issue Type | Reference | |------------|-----------| | Spring parameters, withAnimation misuse, phase/keyframe bugs | [references/swiftui-animation-patterns.md](references/swiftui-animation-patterns.md) | | Frame drops, offscreen rendering, main thread blocking | [references/performance.md](references/performance.md) | | Reduce Motion, VoiceOver, motion sensitivity | [references/accessibility.md](references/accessibility.md) | | Transition protocol, matchedGeometryEffect, navigation transitions | [references/transitions.md](references/transitions.md) |

Hard gates (sequence)

Complete **in order** for the files in scope. If a step fails, **omit** the finding, **re-anchor**, or **downgrade** to a question—do not ship accusations without meeting the pass condition.

| Step | What you do | Pass condition (objective) | |------|-------------|----------------------------| | **1. Inventory** | List each file under review and where animation APIs appear (line ranges or symbol names: `withAnimation`, `.animation`, `matchedGeometryEffect`, `PhaseAnimator`, UIKit/CA animators, etc.). | A written list exists; files with **no** animation APIs are explicitly marked out of scope. | | **2. Anchor** | Re-read the cited region in the current file or diff hunk before naming an issue. | Each `[FILE:LINE]` still shows the behavior; stale line numbers are fixed or the finding is dropped. | | **3. Evidence** | For framework-specific claims (spring curves, `Transition` conformance, Reduce Motion), cross-check the matching row in [Quick Reference](#quick-reference) against `references/*.md`. | The finding’s detail names the reference file used, or states **inline-only** (structural/readability with no framework rule). | | **4. Report** | Emit findings using [Output Format](#output-format). | Headers match `[FILE:LINE] ISSUE_TITLE`; checklist items below are applied only where gates 1–2 covered that code. |

Output Format

Report each finding as:

[FILE:LINE] ISSUE_TITLE

Example: `[AnimatedCard.swift:42] Missing Reduce Motion fallback for spring animation`

All details, code suggestions, and rationale follow after the header line.

Review Checklist

  • [ ] `@Environment(\.accessibilityReduceMotion)` checked — animations have Reduce Motion fallback
  • [ ] Animation is not the sole feedback channel — important state changes pair with haptics (`.sensoryFeedback`) or audio
  • [ ] Custom animation isn't duplicating system-provided motion (standard nav transitions, sheet presentation, SF Symbol effects)
  • [ ] Animations on frequent interactions are brief and unobtrusive — or absent (system handles it)
  • [ ] All animations are interruptible — user is never forced to wait for completion before interacting
  • [ ] Spring animations use `duration`/`bounce` parameters (not raw mass/stiffness/damping unless UIKit/CA)
  • [ ] No deprecated `.animation()` without `value:` parameter
  • [ ] `withAnimation` wraps state changes, not view declarations
  • [ ] `matchedGeometryEffect` IDs are stable and unique within the namespace
  • [ ] `geometryGroup()` used when parent geometry animates with child views appearing
  • [ ] Looping animations (`PhaseAnimator`, `symbolEffect`) have finite phases or appropriate trigger
  • [ ] No `CATransaction.setAnimationDuration()` in UIView-backed layers (use UIView.animate instead)
  • [ ] Interactive animations handle interruption (re-trigger mid-flight doesn't break state)
  • [ ] Shadow animations provide explicit `shadowPath` (avoids per-frame recalculation)
  • [ ] Gesture-driven animations preserve velocity on release for natural completion
  • [ ] Gesture-driven feedback follows spatial expectations (dismiss direction matches reveal direction)
  • [ ] No animation of `.id()` modifier (destroys view identity — use `transition` or `matchedGeometryEffect` instead)

When to Load References

  • Incorrect spring setup or `withAnimation` scope issues → swiftui-animation-patterns.md
  • Hitches, dropped frames, or expensive animations in scroll views → performance.md
  • Missing Reduce Motion handling or motion accessibility → accessibility.md
  • `matchedGeometryEffect` glitches or custom `Transition` bugs → transitions.md

Review Questions

1. Does every animation have a Reduce Motion fallback that preserves the information conveyed? Is animation the only feedback channel, or are haptics/audio supplementing it? 2. Is this custom animation necessary, or does the system already provide it (standard transitions, SF Symbol effects, Liquid Glass)? 3. Could this animation cause frame drops — is it animating expensive properties (blur, shadow without path, mask) in a list or scroll view? 4. Are all animations interruptible? Can the user act without waiting for completion? Does gesture-driven feedback follow spatial expectations? 5. Is `withAnimation` scoped to the minimal state change needed, or is it wrapping unrelated mutations? 6. For `matchedGeometryEffect` — are source and destination using the same ID and namespace, and is only one visible at a time?

Read more
@existential-birds
Ships withbeagle

Image: NASA, Public Domain. Source Beagle is an Agent Skills marketplace: framework-aware code review, documentation, testing, architectural analysis, and git workflows for any compatible coding agent.

Stars on GitHub

Momentum

stars in total
85
Star history of existential-birds/beagle on GitHub, a chart by star-history.com

Other skills on beagle.

More skills from other plugins.

brainstorming
Auto-invoked

brainstorming

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…

@obra@obraInstall Skill
ask-matt

ask-matt

Ask which skill or flow fits your situation. A router over the skills in this repo.

skills10d309k
@mattpocock@mattpocockInstall Skill
accessibility
Auto-invoked

accessibility

Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android — semantic ARIA roles and labels,…

ecc12d293k
@affaan-m@affaan-mInstall Skill
compiler-commit

compiler-commit

Use when you want to verify compiler changes and commit with the correct convention. Runs tests, lint, and format, then commits…

react1d252k
@facebook@facebookInstall Skill

Questions about ios-animation-code-review.

Which coding agents can use ios-animation-code-review?
ios-animation-code-review installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.