mana-swift-ui/CLAUDE.md
Till JS 0a2cb349b4 v0.1.0 — initialer Sprint, vollständige Auth-Reise als SwiftUI
Phase 2 aus dem Native-Auth-Vollausbau-Plan (Option A, siehe
../mana/docs/MANA_SWIFT.md). Entstanden weil drei Apps fast-
byte-identische LoginView.swift hatten und Sign-Up/Forgot-PW
komplett fehlten.

ManaAuthUI-Library mit:
- ManaBrandConfig — App-injizierte Theme-Werte (forest für Cards/
  Manaspur, mana-default für Memoro), Environment-Key, View-Modifier
- Base-Components: ManaAuthScaffold, ManaPrimaryButton, ManaTextField,
  ManaSecureField + .manaEmailField()-Modifier
- ManaLoginView + LoginViewModel — Email/PW-Login, schaltet bei
  AuthError.emailNotVerified automatisch auf ManaEmailVerifyGateView
- ManaSignUpView + SignUpViewModel — Email/Name/PW + awaiting-
  Verification-Hinweis-Screen
- ManaEmailVerifyGateView + ViewModel — Resend-Verification
- ManaForgotPasswordView + ViewModel — Reset-Mail anfordern (immer
  generischer Hinweis, User-Enumeration-Schutz)
- ManaResetPasswordView + ViewModel — neues PW mit Token aus
  Universal-Link
- ManaChangeEmailView, ManaChangePasswordView, ManaDeleteAccountView
  + internal ViewModels — Account-Bausteine
- ManaDeleteAccountView ist zweistufig (Bestätigungs-Wort tippen
  + Passwort) → App-Store-Guideline 5.1.1(v) Pflicht-Surface

26/26 ViewModel-Tests grün via per-test-ID URLProtocol-Routing
(löst Parallel-Pollution zwischen .serialized Suites).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 19:22:42 +02:00

4.2 KiB

CLAUDE.md — mana-swift-ui

Guidance für Claude Code in diesem Repo.

Übergeordneter Plan: ../mana/docs/MANA_SWIFT.md ist die SOT für die ganze native-App-Plattform. Phase ε dort beschreibt dieses Paket.

Was dieses Repo ist

Swift-Package mit native UI-Komponenten für alle nativen mana-e.V.-Apps. Heute genau ein Library-Product:

  • ManaAuthUI — vollständige Auth-Reise als SwiftUI-Views: Login, Sign-Up, Email-Verifikation, Passwort-Reset, Account-Management. Konsumiert ManaCore (für API-Calls) und ManaTokens (für Vereins-Designwerte).

Wird konsumiert von cards-native, manaspur-native, memoro-native, geplant nutriphi-native und weiteren.

Status

v0.1.0 — initiale Extraktion 2026-05-13.

Phase 2 aus dem Native-Auth-Vollausbau-Plan (Option A — alles nativ). Entstanden weil drei Apps fast-byte-identische LoginView.swift- Dateien hatten und Sign-Up/Forgot-PW komplett fehlten.

Architektonische Invarianten

Nicht ohne explizite Diskussion antasten:

  1. Keine externen UI-Libraries. Pure SwiftUI. Identische Regel wie in ManaCore (mana-swift-core/CLAUDE.md Invariante 2).
  2. App injiziert ManaBrandConfig. Keine hardcoded Farben oder App-Namen im Paket. forest/mana/zukünftige Themes leben in der App, nicht hier — bis ManaTokens-Theme-Variants kommen.
  3. ViewModels sind testbar, Views sind dünn. Jede non-triviale View hat einen begleitenden @Observable-ViewModel mit reiner State-Maschine. URLProtocol-Mock-Tests gehen gegen ViewModels.
  4. Lokalisierung DE first. Public-API-Strings auf Deutsch, EN später via Localizable.xcstrings. Konsistent mit Verein-Konvention.
  5. Account-Löschung ist Pflicht-Komponente. App-Store-Guideline 5.1.1(v) — ManaDeleteAccountView MUSS in jeder App, die ManaSignUpView einbaut, erreichbar sein.
  6. iOS 18 / macOS 15. Gleiche Minimums wie mana-swift-core.
  7. Public API ist Sendable. Swift-6-Strict-Concurrency.

Repo-Layout

mana-swift-ui/
├── Package.swift
├── README.md
├── CHANGELOG.md
├── CLAUDE.md                    dieses File
├── Sources/
│   └── ManaAuthUI/
│       ├── Brand/               ManaBrandConfig (App-injiziert)
│       ├── Components/          ManaAuthScaffold, ManaTextField, ...
│       ├── Login/               ManaLoginView + ViewModel
│       ├── Register/            ManaSignUpView + ViewModel
│       ├── Verify/              ManaEmailVerifyGateView
│       ├── Reset/               ManaForgotPasswordView, ManaResetPasswordView
│       └── Account/             ChangeEmail/ChangePassword/DeleteAccount
└── Tests/
    └── ManaAuthUITests/

Konventionen

  • Swift 6.0, Strict Concurrency komplett
  • iOS 18 / macOS 15 Minimum
  • Tabs für Indent? Nein — wir nutzen 4 Spaces wie mana-swift-core (SwiftFormat .swiftformat). Verein-TS-Repos nutzen Tabs, Swift-Repos Spaces — bewusster Bruch wegen Xcode-Tooling
  • Doc-Comments pflicht auf jedem public-Symbol (///)
  • Lokalisierung: Public-API-Strings auf Deutsch

Versionierung

  • Semver strikt. UI ändert sich öfter als Auth-Core — getrenntes Repo damit mana-swift-core stabil bleibt
  • CHANGELOG.md pflicht. Was hat sich geändert, müssen Apps was anpassen
  • Pflege-Politik: Letzte zwei Minor-Versionen mit Patches

Lokal entwickeln

swift build              # baut ManaAuthUI
swift test               # Unit-Tests gegen ViewModels

mana-swift-core muss als Schwester-Verzeichnis existieren.

Wenn ein neuer Auth-Flow dazukommt

  1. ViewModel zuerst — pure State-Maschine, testbar
  2. SwiftUI-View dünn, nur @Observable-State-Bindings
  3. Public-API-Doc auf Deutsch
  4. ViewModel-Tests via URLProtocol-Mock (Pattern in ManaAuthUITests/)
  5. CHANGELOG.md ergänzen
  6. Bei Breaking-Change: Major-Bump-Plan + alle aktiven Apps informieren

Wichtige Cross-Repo-Doks

  • ../mana/docs/MANA_SWIFT.md — Plattform-SOT, Phase ε
  • ../mana-swift-core/CLAUDE.md — Auth-Core, ManaTokens
  • ../mana/docs/THEMING.md — Token-SOT, spiegelt sich in ManaTokens
  • ../mana/services/mana-auth/CLAUDE.md — Server-Konventionen