Write, review, or improve SwiftUI code following best practices for state management, view composition, performance, macOS-specific APIs, and iOS 26+ Liquid Glass adoption. Use when building new SwiftUI features, refactoring existing views, reviewing code quality, or adopting modern SwiftUI patterns.
Install with Tessl CLI
npx tessl i github:avdlee/swiftui-agent-skill --skill swiftui-expert-skill94
Does it follow best practices?
Validation for skill structure
Observable state management and sheet patterns
@Observable used
0%
100%
@MainActor on Observable
0%
100%
@State with Observable
0%
100%
State is private
100%
100%
No passed @State
100%
100%
@Bindable for injected
0%
100%
sheet(item:) used
0%
0%
Sheet owns dismiss
0%
100%
Business logic in model
100%
100%
Methods for actions
87%
100%
let for read-only
100%
100%
Without context: $0.2364 · 1m 2s · 12 turns · 19 in / 3,701 out tokens
With context: $0.6048 · 2m 3s · 18 turns · 646 in / 7,918 out tokens
Modern API usage and navigation patterns
NavigationStack used
100%
100%
navigationDestination used
100%
100%
Tab API used
0%
100%
Button not onTapGesture
100%
100%
foregroundStyle used
100%
100%
clipShape for corners
100%
100%
localizedStandardContains
0%
0%
Modern Text format
0%
40%
Two-param onChange
100%
100%
.task for async
100%
100%
Button accessibility
100%
100%
No foregroundColor
100%
100%
Without context: $0.2515 · 1m 2s · 12 turns · 19 in / 4,175 out tokens
With context: $0.4751 · 1m 41s · 14 turns · 15 in / 6,246 out tokens
List performance patterns and ForEach identity
Stable ForEach identity
100%
100%
No inline filtering
100%
100%
Constant views per element
100%
100%
LazyVStack used
50%
100%
No AnyView in rows
100%
100%
Minimal view props
25%
62%
Hot-path guard
100%
100%
No body object creation
100%
100%
Body stays pure
100%
100%
scrollIndicators modifier
0%
0%
Subview extraction
100%
100%
Without context: $0.4234 · 1m 57s · 17 turns · 24 in / 7,550 out tokens
With context: $0.7712 · 3m 43s · 17 turns · 645 in / 10,725 out tokens
SwiftUI animation patterns
animation has value param
100%
100%
withAnimation for button taps
90%
100%
Transforms not frame for animation
100%
100%
Transition outside conditional
100%
100%
phaseAnimator for multi-step
100%
100%
No deprecated animation
100%
100%
Asymmetric or combined transition
100%
100%
Scoped animation
50%
100%
No linear timing for UI
100%
100%
State not changed without animation
87%
100%
Without context: $0.4648 · 2m 3s · 19 turns · 25 in / 8,672 out tokens
With context: $0.9141 · 3m 13s · 24 turns · 6,436 in / 13,141 out tokens
Liquid Glass iOS 26+ adoption
#available with fallback
100%
100%
GlassEffectContainer used
83%
100%
glassEffect after layout modifiers
100%
100%
.interactive() only on tappable
70%
100%
glassEffectID morphing
50%
100%
@Namespace declared
100%
100%
Prominent style for Done
25%
100%
GlassEffectContainer spacing
25%
100%
No unnecessary nesting
100%
100%
Consistent shapes
83%
100%
GlassEffectContainer wraps both states
100%
100%
Without context: $0.4636 · 2m 23s · 15 turns · 21 in / 9,605 out tokens
With context: $0.4766 · 1m 26s · 18 turns · 4,345 in / 4,813 out tokens
View composition and accessibility
@Entry macro used
100%
100%
@ViewBuilder let content
66%
100%
No closure-based content
100%
100%
@ScaledMetric for avatar
100%
100%
@ScaledMetric for other values
100%
100%
accessibilityElement combine on reaction
50%
83%
redacted placeholder loading
0%
100%
CardTheme read from environment
100%
100%
No magic number layout
50%
66%
Subview extraction
33%
33%
Without context: $0.3710 · 1m 59s · 12 turns · 14 in / 7,785 out tokens
With context: $0.8782 · 2m · 24 turns · 14,975 in / 7,499 out tokens
macOS scene architecture and window configuration
MenuBarExtra used
100%
100%
No NSStatusItem
100%
100%
Settings scene used
100%
100%
#if os(macOS) wrapping
0%
100%
WindowGroup as primary scene
100%
100%
defaultSize configured
100%
100%
windowResizability used
100%
100%
frame min on content
100%
100%
Commands used
100%
100%
No custom prefs window
100%
100%
Without context: $0.6967 · 3m 15s · 24 turns · 31 in / 12,897 out tokens
With context: $0.7727 · 2m 37s · 27 turns · 30 in / 8,729 out tokens
macOS NavigationSplitView, Table, and Inspector
NavigationSplitView used
100%
100%
No HSplitView for sidebar
100%
100%
Table used
100%
100%
Table sortOrder
75%
100%
Adaptive first column
0%
100%
horizontalSizeClass used
100%
100%
Inspector used
0%
100%
Inspector toggle in toolbar
37%
100%
navigationSplitViewColumnWidth
100%
0%
Without context: $0.3079 · 1m 22s · 15 turns · 22 in / 5,557 out tokens
With context: $1.1147 · 4m 7s · 27 turns · 909 in / 15,583 out tokens
@Observable with persistent state and scroll control
@ObservationIgnored on @AppStorage
0%
100%
@ObservationIgnored on second wrapper
0%
100%
No unwrapped property wrapper
100%
100%
ScrollViewReader used
100%
100%
scrollTo uses stable ID
100%
50%
withAnimation on scrollTo
100%
100%
UIImage downsampling addressed
31%
100%
visualEffect captures value
0%
100%
Without context: $0.6144 · 2m 56s · 24 turns · 30 in / 11,029 out tokens
With context: $1.3699 · 4m 29s · 30 turns · 11,882 in / 17,648 out tokens
Table of Contents
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.