Expert theming decisions for iOS/tvOS: when custom themes add value vs system colors suffice, color token architecture trade-offs, theme switching animation strategies, and accessibility contrast compliance. Use when designing color systems, implementing dark mode, or building theme pickers. Trigger keywords: theme, dark mode, light mode, color scheme, appearance, colorScheme, ThemeManager, adaptive colors, dynamic colors, color tokens, WCAG contrast
View on GitHubKaakati/rails-enterprise-dev
reactree-ios-dev
January 25, 2026
Select agents to install to:
npx add-skill https://github.com/Kaakati/rails-enterprise-dev/blob/main/plugins/reactree-ios-dev/skills/theme-management/SKILL.md -a claude-code --skill theme-managementInstallation paths:
.claude/skills/theme-management/# Theme Management — Expert Decisions
Expert decision frameworks for theming choices in SwiftUI. Claude knows Color and colorScheme — this skill provides judgment calls for when custom theming adds value and architecture trade-offs.
---
## Decision Trees
### Do You Need Custom Theming?
```
What's your color requirement?
├─ Standard light/dark mode only
│ └─ System colors are sufficient
│ Color(.systemBackground), Color(.label)
│
├─ Brand colors that differ from system
│ └─ Asset catalog colors (Named Colors)
│ Define light/dark variants in xcassets
│
├─ User-selectable themes (beyond light/dark)
│ └─ Full ThemeManager with custom palettes
│ User can choose "Ocean", "Forest", etc.
│
└─ White-label app (different branding per client)
└─ Remote theme configuration
Fetch brand colors from server
```
**The trap**: Building a ThemeManager for an app that only needs light/dark mode. Asset catalog colors already handle this automatically.
### Color Token Architecture
```
How should you organize colors?
├─ Small app (< 20 screens)
│ └─ Direct Color("name") usage
│ Don't over-engineer
│
├─ Medium app, single brand
│ └─ Color extension with static properties
│ Color.appPrimary, Color.appBackground
│
├─ Large app, design system
│ └─ Semantic tokens + primitive tokens
│ Primitives: blue500, gray100
│ Semantic: textPrimary → gray900/gray100
│
└─ Multi-brand/white-label
└─ Protocol-based themes
protocol Theme { var primary: Color }
```
### Theme Switching Strategy
```
When should theme changes apply?
├─ Immediate (all screens at once)
│ └─ Environment-based (@Environment(\.colorScheme))
│ System handles propagation
│
├─ Per-screen animation
│ └─ withAnimation on theme property change
│ Smooth transition within visible content
│
├─ Custom transition (like morphing)
│ └─ Snapshot + crossfade technique
│ Complex, usually not worth it
│
└─ App restart required
└─ For deep UIKit integration
Sometimes