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

@@ -15,6 +15,8 @@ struct CustomizeContentView: View {
@AppStorage(UserDefaultsStore.Keys.theme.rawValue, store: GroupUserDefaults.groupDefaults) private var theme: Theme = .system
@State private var showThemePicker = false
var body: some View {
ScrollView {
VStack(spacing: 24) {
@@ -22,6 +24,50 @@ struct CustomizeContentView: View {
TipView(CustomizeLayoutTip())
.tipBackground(Color(.secondarySystemBackground))
// QUICK THEMES
SettingsSection(title: "Quick Start") {
Button(action: { showThemePicker = true }) {
HStack(spacing: 16) {
// Emoji preview
ZStack {
LinearGradient(
colors: [.purple.opacity(0.8), .blue.opacity(0.8), .cyan.opacity(0.8)],
startPoint: .topLeading,
endPoint: .bottomTrailing
)
Text("🎨")
.font(.title)
}
.frame(width: 56, height: 56)
.clipShape(RoundedRectangle(cornerRadius: 12))
VStack(alignment: .leading, spacing: 4) {
Text("Browse Themes")
.font(.headline)
.foregroundColor(.primary)
Text("12 curated combinations of colors, icons, and layouts")
.font(.caption)
.foregroundColor(.secondary)
.lineLimit(2)
}
Spacer()
Image(systemName: "chevron.right")
.font(.subheadline.weight(.semibold))
.foregroundColor(.secondary)
}
.padding(12)
.background(colorScheme == .dark ? Color(.systemGray6) : .white)
.clipShape(RoundedRectangle(cornerRadius: 16))
}
.buttonStyle(.plain)
}
.sheet(isPresented: $showThemePicker) {
AppThemePickerView()
}
// APPEARANCE
SettingsSection(title: "Appearance") {
VStack(spacing: 16) {