From d621cb83728cd50bf2085f1c32d19ee2007b108a Mon Sep 17 00:00:00 2001 From: Till JS Date: Fri, 22 May 2026 12:29:19 +0200 Subject: [PATCH] =?UTF-8?q?feat(brand):=20logoAssetName=20f=C3=BCr=20Custo?= =?UTF-8?q?m-Logos=20(v0.7.0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ManaBrandConfig.logoAssetName ergänzt — Apps liefern einen Asset- Catalog-Namen, ManaAuthScaffold rendert das Bundle-Asset 64×64pt ohne Tint statt eines getinteten SF-Symbols. logoSymbol bleibt Fallback. Hintergrund: Pageta hat ein eigenes Apple-Icon-Composer-SVG; SF- Symbol "book.pages" sah neben dem polierten App-Icon unecht aus. Additive Änderung, alle bestehenden Apps quellkompatibel. Co-Authored-By: Claude Opus 4.7 (1M context) --- CHANGELOG.md | 47 +++++++++++++++++++ .../ManaAuthUI/Brand/ManaBrandConfig.swift | 13 +++++ .../Components/ManaAuthScaffold.swift | 11 ++++- 3 files changed, 70 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ea52c58..38ce2c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,53 @@ Alle Änderungen werden hier dokumentiert. Format orientiert an ## [Unreleased] +## [0.7.0] — 2026-05-22 + +Minor — **`logoAssetName`** in `ManaBrandConfig`. Apps können jetzt +ein eigenes Logo-Asset (Asset-Catalog-Name) statt eines SF-Symbols +für den Login-/Sign-Up-/Forgot-Password-Header liefern. + +### Hintergrund + +Pageta hat ein eigenes Apple-Icon-Composer-SVG; das SF-Symbol +`book.pages` (vorher) sah neben dem polierten App-Icon unecht aus. +Andere Apps mit echten Logo-Assets (kommt) werden den gleichen +Migrationspfad gehen können. + +### Neu + +- `ManaBrandConfig.logoAssetName: String?` — Name eines Image-Assets + im Bundle der konsumierenden App. Hat Vorrang vor `logoSymbol`. +- `ManaAuthScaffold` rendert `logoAssetName` 64×64pt, `aspectRatio(.fit)`, + ohne Tint (Asset behält Originalfarben — typisch Apple-Icon- + Composer-Output mit Gradient). Fallback bleibt SF-Symbol mit Tint. + +### Geändert + +- `ManaBrandConfig.init` hat einen zusätzlichen optionalen Parameter + `logoAssetName: String? = nil`. Quellkompatibel — bestehende Apps + brauchen nichts ändern. +- `systemDefault`-Config setzt `logoAssetName: nil` explizit (kein + Verhaltenswechsel). + +### Tests + +- 50/50 grün (keine neuen Tests — die `ManaBrandConfig`-Änderung ist + rein additiv, gerendertes Asset hängt am Bundle der App). + +### Adoption + +Apps mit eigenem Logo: + +```swift +ManaBrandConfig( + appName: "Pageta", + logoSymbol: "book.pages", // SF-Fallback bleibt + logoAssetName: "PagetaLogo", // Asset-Catalog-Name, hat Vorrang + ... +) +``` + ## [0.6.0] — 2026-05-17 Minor — **neues Library-Product `ManaWebShell`**. WKWebView-Hülle für diff --git a/Sources/ManaAuthUI/Brand/ManaBrandConfig.swift b/Sources/ManaAuthUI/Brand/ManaBrandConfig.swift index d313285..2879f0b 100644 --- a/Sources/ManaAuthUI/Brand/ManaBrandConfig.swift +++ b/Sources/ManaAuthUI/Brand/ManaBrandConfig.swift @@ -23,8 +23,18 @@ public struct ManaBrandConfig: Sendable { /// Optionales SF-Symbol, das zentral über dem App-Namen erscheint. /// Z.B. `"rectangle.stack.fill"` für Cardecky, `"map.fill"` für /// Manaspur. Wenn nil, wird kein Icon gerendert. + /// + /// Wenn ``logoAssetName`` gesetzt ist, hat das Vorrang — das + /// SF-Symbol dient als Fallback. public let logoSymbol: String? + /// Optionaler Asset-Catalog-Name eines App-spezifischen Logos + /// (z.B. SVG aus dem App Icon Composer). Hat Vorrang vor + /// ``logoSymbol``. Das Asset muss im Bundle der konsumierenden App + /// liegen und Template-fähig sein, wenn es brand.primary annehmen + /// soll — sonst wird's in Originalfarben gerendert. + public let logoAssetName: String? + // MARK: - Theme-Farben /// Seiten-Hintergrund. @@ -58,6 +68,7 @@ public struct ManaBrandConfig: Sendable { appName: String, tagline: String? = nil, logoSymbol: String? = nil, + logoAssetName: String? = nil, background: Color, foreground: Color, surface: Color, @@ -71,6 +82,7 @@ public struct ManaBrandConfig: Sendable { self.appName = appName self.tagline = tagline self.logoSymbol = logoSymbol + self.logoAssetName = logoAssetName self.background = background self.foreground = foreground self.surface = surface @@ -91,6 +103,7 @@ public extension ManaBrandConfig { appName: "mana", tagline: nil, logoSymbol: nil, + logoAssetName: nil, background: PlatformPalette.background, foreground: .primary, surface: PlatformPalette.surface, diff --git a/Sources/ManaAuthUI/Components/ManaAuthScaffold.swift b/Sources/ManaAuthUI/Components/ManaAuthScaffold.swift index e31610f..589bd81 100644 --- a/Sources/ManaAuthUI/Components/ManaAuthScaffold.swift +++ b/Sources/ManaAuthUI/Components/ManaAuthScaffold.swift @@ -47,7 +47,16 @@ public struct ManaAuthScaffold: View { @ViewBuilder private var header: some View { VStack(spacing: 12) { - if let symbol = brand.logoSymbol { + if let assetName = brand.logoAssetName { + // App-spezifisches Logo aus dem Bundle der konsumierenden + // App. Größere 64pt-Variante, damit ein detailliertes + // Custom-Logo seinen Charakter zeigt (statt nur als + // SF-Symbol-Stand-In zu wirken). + Image(assetName) + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 64, height: 64) + } else if let symbol = brand.logoSymbol { Image(systemName: symbol) .font(.system(size: 44, weight: .medium)) .foregroundStyle(brand.primary)