pageta-native/Sources/Core/Theme/PagetaPaperBackground.swift
Till JS a5c1d3e358 Theme-Galerie: alle ManaTheme-Variants frei wählbar im Konto-Tab
Verein-Doktrin (THEMING.md 2026-05-31): jede App unterstützt alle
Variants + Light/Dark/System. Visuelle Galerie aus Live-Vorschau-Karten
(LazyVGrid) je Variant + segmentierter Appearance-Picker, im iOS-Konto-Tab
und in den macOS-Settings.

- PagetaTheme löst gegen ManaTheme.current (@AppStorage, Default paper)
  statt hartkodiert; alle ~40 Call-Sites unverändert.
- PagetaBrand.config(for:) macht auch die Auth-Reise variant-bewusst.
- Variant × Light/Dark orthogonal (Variant-Farben sind schon adaptiv,
  .preferredColorScheme steuert weiter Hell/Dunkel).
- CLAUDE.md Invariante 6 von "fixe paper-Brand" auf "paper als Default,
  alle Themes wählbar" korrigiert.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-31 18:37:41 +02:00

52 lines
1.7 KiB
Swift

import ManaTokens
import SwiftUI
/// Setzt den `background`-Token der **aktiven Theme-Variant** als
/// durchgehende Surface — light/dark-adaptiv — und versteckt den
/// Default-System-Background von List/Form, damit die Theme-Surface
/// durchscheint.
///
/// Der `@AppStorage`-Bezug auf die Variant macht den Hintergrund
/// reaktiv: wechselt der User das Theme im Konto-Tab, re-rendert jeder
/// Tab-Root sofort mit der neuen Background-Farbe.
///
/// Anwenden auf jeden Tab-Root, dann fühlt sich die App vom Detail-
/// View bis zur Lese-Liste konsistent an, statt zwischen System-
/// Hintergrund und Theme-Surface hin- und herzuspringen.
struct PaperBackgroundModifier: ViewModifier {
@AppStorage(ManaTheme.storageKey) private var variantRaw = ManaTheme.pagetaDefault.rawValue
private var theme: ManaTheme {
ManaTheme(rawValue: variantRaw) ?? .paper
}
func body(content: Content) -> some View {
content
.scrollContentBackground(.hidden)
.background(theme.background.ignoresSafeArea())
}
}
extension View {
/// `.paperBackground()` macht jede Surface zu einer Paper-Surface
/// mit dem aktuellen Theme-Background. Siehe `PaperBackgroundModifier`.
func paperBackground() -> some View {
modifier(PaperBackgroundModifier())
}
/// Beschränkt Content auf Reading-Width (~720pt) **nur auf macOS**.
/// Auf iOS no-op — Phone-Bildschirme sind sowieso schmaler. Auf
/// iPad könnte man's später aktivieren, Default bleibt vorerst aus.
///
/// Anwenden auf Listen/Cards in den drei Tab-Surfaces, damit das
/// Layout auf breiten Mac-Fenstern nicht edge-to-edge stretcht.
@ViewBuilder
func macReadingWidth() -> some View {
#if os(macOS)
frame(maxWidth: 760, alignment: .center)
.frame(maxWidth: .infinity)
#else
self
#endif
}
}