mana-swift-core/Sources/ManaTokens/Themes/View+ManaTheme.swift
Till JS 20c30fc321 feat(tokens): ManaTheme + 8 Web-Theme-Variants (v1.6.0)
Acht Web-Themes aus @mana/themes (mana, forest, paper, neutral, lume,
twilight, skylight, monochrome) sind jetzt als Swift verfuegbar.
Generiert aus den CSS-Quellen via `pnpm --filter @mana/themes gen:swift`,
hand-geschriebene API-Schicht oben drauf.

Hintergrund: Cards, Viadocu, Nutriphi hatten je ~90 LOC forest-HSL-
Apparat lokal nachgebaut. Mit v1.6.0 sind diese App-lokalen Files
durch `ManaTheme.<variant>` ersetzbar (Audit 2026-05-17 V1).

Neu:
- `ManaTheme` (public enum) — 8 Cases, CaseIterable, Sendable
- `ManaThemeColors` (public struct, Sendable) — 12 Tokens als Color
- `ManaTheme.colors` + Convenience-Accessoren (`.background` etc.)
- `View.manaTheme(_:)` + `@Environment(\.manaTheme)` (Default `.mana`)
- Generator: `mana/packages/themes/scripts/gen-swift-themes.mjs`

Geaendert: nichts breaking. `ManaColor.*` und `ManaBrand.*`
unveraendert.

Tests: 7 neue Tests in ThemeTests.swift; 12/12 ManaTokens grün,
76/76 gesamt grün auf macOS.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 21:11:25 +02:00

37 lines
1 KiB
Swift

import SwiftUI
private struct ManaThemeEnvironmentKey: EnvironmentKey {
static let defaultValue: ManaTheme = .mana
}
public extension EnvironmentValues {
/// Aktuell aktive Theme-Variant. Default: ``ManaTheme/mana``.
var manaTheme: ManaTheme {
get { self[ManaThemeEnvironmentKey.self] }
set { self[ManaThemeEnvironmentKey.self] = newValue }
}
}
public extension View {
/// Setzt die aktive Theme-Variant für diesen View-Subtree.
///
/// Apps mit fixer Identität setzen das an der App-Root:
///
/// ```swift
/// @main
/// struct CardsApp: App {
/// var body: some Scene {
/// WindowGroup {
/// ContentView()
/// .manaTheme(.forest)
/// }
/// }
/// }
/// ```
///
/// Apps mit User-Theme-Switching binden den Wert an `@AppStorage`
/// oder eine Settings-Source und re-rendern bei Wechsel automatisch.
func manaTheme(_ theme: ManaTheme) -> some View {
environment(\.manaTheme, theme)
}
}