Add 12 cohesive app themes with matching subscription and lock screens

- Create AppTheme enum bundling color tint, icon pack, entry style, voting layout, paywall style, and lock screen style into unified themes
- Add AppThemePickerView for selecting themes with preview cards and detail sheets
- Extend PaywallStyle to 12 variants (celestial, garden, neon, minimal, zen, editorial, mixtape, heartfelt, luxe, forecast, playful, journal)
- Add LockScreenStyle enum with 13 variants including aurora default
- Create themed subscription paywalls with unique backgrounds, decorative elements, and typography for each style
- Create themed lock screens with unique backgrounds, central elements, and unlock buttons
- Update FeelsSubscriptionStoreView to read style from AppStorage so it auto-matches current theme
- Update PaywallPreviewSettingsView to support all 12 paywall styles

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Trey t
2025-12-26 23:53:35 -06:00
parent 53eb953b77
commit a0b30d8bae
8 changed files with 4084 additions and 77 deletions

View File

@@ -34,6 +34,14 @@ enum PaywallStyle: Int, CaseIterable {
case garden = 1 // Garden Growth - organic, blooming nature
case neon = 2 // Neon Pulse - synthwave, energetic
case minimal = 3 // Minimal Zen - clean, sophisticated
case zen = 4 // Zen Garden - ink brushstrokes, meditation
case editorial = 5 // Editorial - magazine typography
case mixtape = 6 // Mixtape - cassette/retro analog
case heartfelt = 7 // Heartfelt - hearts and emotion
case luxe = 8 // Luxe - premium glass materials
case forecast = 9 // Forecast - weather metaphors
case playful = 10 // Playful - vibrant emoji patterns
case journal = 11 // Journal - handwritten paper
var displayName: String {
switch self {
@@ -41,6 +49,14 @@ enum PaywallStyle: Int, CaseIterable {
case .garden: return "Garden"
case .neon: return "Neon"
case .minimal: return "Minimal"
case .zen: return "Zen"
case .editorial: return "Editorial"
case .mixtape: return "Mixtape"
case .heartfelt: return "Heartfelt"
case .luxe: return "Luxe"
case .forecast: return "Forecast"
case .playful: return "Playful"
case .journal: return "Journal"
}
}
@@ -50,6 +66,48 @@ enum PaywallStyle: Int, CaseIterable {
case .garden: return "Blooming flowers & organic growth"
case .neon: return "Synthwave energy & glowing pulses"
case .minimal: return "Clean typography & subtle elegance"
case .zen: return "Ink brushstrokes & meditative calm"
case .editorial: return "Magazine typography & literary elegance"
case .mixtape: return "Cassette tapes & analog nostalgia"
case .heartfelt: return "Hearts & emotional expression"
case .luxe: return "Premium glass & refined materials"
case .forecast: return "Weather metaphors & natural flow"
case .playful: return "Vibrant patterns & playful energy"
case .journal: return "Handwritten notes & paper textures"
}
}
}
enum LockScreenStyle: Int, CaseIterable {
case aurora = 0 // Default - emotional aurora with breathing orb
case zen = 1 // Zen - ink circles, minimal, calming
case neon = 2 // Neon - synthwave grid, glowing elements
case celestial = 3 // Celestial - stars, moon phases, cosmic
case editorial = 4 // Editorial - typography focused, clean
case mixtape = 5 // Mixtape - cassette aesthetic, retro
case bloom = 6 // Bloom - organic shapes, flowers
case heartfelt = 7 // Heartfelt - hearts, soft gradients
case minimal = 8 // Minimal - ultra clean, simple
case luxe = 9 // Luxe - glass, premium materials
case forecast = 10 // Forecast - weather, atmospheric
case playful = 11 // Playful - patterns, vibrant
case journal = 12 // Journal - paper, handwritten feel
var displayName: String {
switch self {
case .aurora: return "Aurora"
case .zen: return "Zen"
case .neon: return "Neon"
case .celestial: return "Celestial"
case .editorial: return "Editorial"
case .mixtape: return "Mixtape"
case .bloom: return "Bloom"
case .heartfelt: return "Heartfelt"
case .minimal: return "Minimal"
case .luxe: return "Luxe"
case .forecast: return "Forecast"
case .playful: return "Playful"
case .journal: return "Journal"
}
}
}
@@ -133,6 +191,7 @@ class UserDefaultsStore {
case healthKitEnabled
case healthKitSyncEnabled
case paywallStyle
case lockScreenStyle
case contentViewCurrentSelectedHeaderViewBackDays
case contentViewHeaderTag