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>
37 lines
1 KiB
Swift
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)
|
|
}
|
|
}
|