swiftui-animation · jamesrochabrun — Claude Code skill: what it does, how to install
Guides AI coding agents through building SwiftUI spring animations and Metal shader effects on iOS and macOS.
npx skills add jamesrochabrun/skills --skill swiftui-animation -a claude-codeWhat swiftui-animation does
This skill equips coding agents with Apple motion design principles and spring physics for SwiftUI. It provides code conventions for PhaseAnimator, KeyframeAnimator, and hero transitions via matchedGeometryEffect.
The reference documentation covers GPU-accelerated Metal shader integration for iOS 17+. The agent learns to write .colorEffect() or .distortionEffect() modifiers using ShaderLibrary, as well as embedding an MTKView through UIViewRepresentable when custom rendering is needed.
Keep animations under 400ms so the interface stays responsive, starting from .spring(response: 0.35, dampingFraction: 0.8). Testing frame rates directly on physical hardware is necessary. The iOS Simulator handles spring timing and GPU load differently.
What it helps with
- implement hero transitions using matchedGeometryEffect
- configure spring physics with response and damping fraction
- apply Metal distortion and color effects via ShaderLibrary
- sequence multi-step animations using PhaseAnimator
Example prompts for the agent
- Create an expandable card view using explicit spring animation
- Connect thumbnail and detail views with matchedGeometryEffect
- Apply a wave distortion shader to this image layer using ShaderLibrary
How to install swiftui-animation
1Skills CLI (Vercel)
npx skills add jamesrochabrun/skills --skill swiftui-animation -a claude-code2Manually: put the files in place
~/.claude/skills/swiftui-animation/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/swiftui-animation/
1Skills CLI (Vercel)
npx skills add jamesrochabrun/skills --skill swiftui-animation -a codex2Manually: put the files in place
.agents/skills/swiftui-animation/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add jamesrochabrun/skills --skill swiftui-animation -a cursor2Manually: put the files in place
.cursor/skills/swiftui-animation/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install jamesrochabrun/skills swiftui-animation2Manually: put the files in place
.github/skills/swiftui-animation/SKILL.md1Skills CLI (Vercel)
npx skills add jamesrochabrun/skills --skill swiftui-animation -a gemini-cli2Platform CLI
gemini skills install https://github.com/jamesrochabrun/skills --path skills/swiftui-animationManually: put the files in place
.devin/skills/swiftui-animation/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add jamesrochabrun/skills --skill swiftui-animation -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about swiftui-animation
How do I install swiftui-animation in Claude Code?
Run npx skills add jamesrochabrun/skills --skill swiftui-animation -a claude-code.
What does the swiftui-animation skill do?
It provides motion design guidance, spring animation presets, view transitions, and Metal shader integration for SwiftUI applications.
How do I fix jumping matchedGeometryEffect transitions?
Ensure both views share the same identifier and @Namespace, wrap state updates inside withAnimation, and verify layering using zIndex.
Source text
SKILL.md · MIT
---
name: swiftui-animation
description: This skill provides comprehensive guidance for implementing advanced SwiftUI animations, transitions, matched geometry effects, and Metal shader integration. Use when building animations, view transitions, hero animations, or GPU-accelerated effects in SwiftUI apps for iOS and macOS.
---
# SwiftUI Animation Expert
Expert guidance for implementing advanced SwiftUI animations and Metal shader integration. Covers animation curves, springs, transitions, matched geometry effects, PhaseAnimator, KeyframeAnimator, and GPU-accelerated shader effects.
## When to Use This Skill
- Understanding motion design principles and when to use animation
- Making animations accessible and platform-appropriate
- Implementing animations in SwiftUI (springs, easing, keyframes)
- Creating view transitions (fade, slide, scale, custom)
- Building hero animations with matchedGeometryEffect
- Adding GPU-accelerated effects with Metal shaders
- Optimizing animation performance
- Creating multi-phase orchestrated animations
## Quick Reference
### Animation Basics
```swift
// Explicit animation (preferred)
withAnimation(.spring(response: 0.4, dampingFraction: 0.75)) {
isExpanded.toggle()
}
// iOS 17+ spring presets
withAnimation(.snappy) { ... } // Fast, small bounce
withAnimation(.smooth) { ... } // Gentle, no bounce
withAnimation(.bouncy) { ... } // More bounce
```
### Common Transitions
```swift
// Basic
.transition(.opacity)
.transition(.scale)
.transition(.slide)
.transition(.move(edge: .bottom))
// Combined
.transition(.move(edge: .trailing).combined(with: .opacity))
// Asymmetric
.transition(.asymmetric(
insertion: .move(edge: .bottom),
removal: .opacity
))
```
### Matched Geometry Effect
```swift
@Namespace var namespace
// Source view
ThumbnailView()
.matchedGeometryEffect(id: "hero", in: namespace)
// Destination view
DetailView()
.matchedGeometryEffect(id: "hero", in: namespace)
```
### Metal Shader Effects (iOS 17+)
```swift
// Color manipulation
.colorEffect(ShaderLibrary.invert())
// Pixel displacement
.distortionEffect(
ShaderLibrary.wave(.float(time)),
maxSampleOffset: CGSize(width: 20, height: 20)
)
// Full layer access
.layerEffect(ShaderLibrary.blur(.float(radius)), maxSampleOffset: .zero)
```
## Reference Materials
Detailed documentation is available in `references/`:
- **motion-guidelines.md** - HIG Motion design principles
- Purpose-driven motion philosophy
- Accessibility requirements
- Platform-specific considerations (iOS, visionOS, watchOS)
- Animation anti-patterns to avoid
- **animations.md** - Complete animation API guide
- Implicit vs explicit animations
- Spring parameters and presets
- Animation modifiers (speed, delay, repeat)
- PhaseAnimator for multi-step sequences
- KeyframeAnimator for property-specific timelines
- Custom animatable properties
- **transitions.md** - View transition guide
- Built-in transitions (opacity, scale, slide, move)
- Combined and asymmetric transitions
- Matched geometry effect implementation
- Hero animation patterns
- Content transitions (iOS 17+)
- Custom transition creation
- **metal-shaders.md** - GPU shader integration
- SwiftUI shader modifiers (colorEffect, distortionEffect, layerEffect)
- Writing Metal shader functions
- Embedding MTKView with UIViewRepresentable
- Cross-platform Metal integration (iOS/macOS)
- Performance considerations
## Common Patterns
### Expandable Card
```swift
struct ExpandableCard: View {
@State private var isExpanded = false
var body: some View {
VStack {
RoundedRectangle(cornerRadius: isExpanded ? 20 : 12)
.fill(.blue)
.frame(
width: isExpanded ? 300 : 150,
height: isExpanded ? 400 : 100
)
}
.onTapGesture {
withAnimation(.spring(response: 0.35, dampingFraction: 0.75)) {
isExpanded.toggle()
}
}
}
}
```
### List Item Appearance
```swift
ForEach(Array(items.enumerated()), id: \.element.id) { index, item in
ItemRow(item: item)
.transition(.asymmetric(
insertion: .move(edge: .trailing).combined(with: .opacity),
removal: .move(edge: .leading).combined(with: .opacity)
))
.animation(.spring().delay(Double(index) * 0.05), value: items)
}
```
### Pulsing Indicator
```swift
Circle()
.fill(.blue)
.frame(width: 20, height: 20)
.scaleEffect(isPulsing ? 1.2 : 1.0)
.opacity(isPulsing ? 0.6 : 1.0)
.onAppear {
withAnimation(.easeInOut(duration: 1.0).repeatForever(autoreverses: true)) {
isPulsing = true
}
}
```
## Best Practices
1. **Motion should be purposeful** - Don't add animation for its own sake; support the experience without overshadowing it
2. **Make motion optional** - Supplement with haptics and audio; never use motion as the only way to communicate
3. **Aim for brevity** - Brief, precise animations feel lightweight and convey information effectively
4. **Prefer explicit animations** - Use `withAnimation` over `.animation()` modifier for clarity
5. **Use spring animations** - They feel more natural and iOS-native
6. **Start with `.spring(response: 0.35, dampingFraction: 0.8)`** - Good default for most interactions
7. **Keep animations under 400ms** - Longer feels sluggish
8. **Let people cancel motion** - Don't force users to wait for animations to complete
9. **Test on device** - Simulator animation timing differs
10. **Profile shader performance** - GPU time matters for complex effects
## Troubleshooting
### Animation not working
- Ensure state change is wrapped in `withAnimation`
- Check that the property is animatable
- Verify the view is actually changing
### Matched geometry jumps
- Both views must use the same ID and namespace
- Use explicit `withAnimation` when toggling
- Check `zIndex` for proper layering
### Shader not appearing
- Verify `.metal` file is added to target
- Check shader function signature matches expected format
- Ensure `maxSampleOffset` is set correctly for distortion effects
© jamesrochabrun · MIT · jamesrochabrun/skills
Similar skills
Everything for Mobile →swiftui-animation by other authors comes first.