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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user