ζ-0 Setup: Repo-Skelett, iOS-Build grün, Healthz live

- project.yml mit Bundle ev.mana.zitare + Widget + ShareExt-Targets
- ManaSwiftCore (ManaCore + ManaTokens) + ManaSwiftUI (ManaAuthUI)
  als Package-Dependencies via path:
- Pure SwiftUI für Native-Surfaces, WKWebView nur für Lese-Tabs
  (Hybrid-Sonderfall vs cards/memoro/manaspur, dokumentiert im
  Playbook ZITARE_NATIVE_GREENFIELD.md)
- Theme: paper-Variant aus @mana/themes
- ZitareAPI.healthCheck via direct URLSession (öffentlicher
  Endpoint, kein AuthenticatedTransport-Gate)
- 6/6 AppConfigTests + 1/1 UI-Smoke grün auf iPhone 16e Simulator
- Live: zitare-api.mana.how/healthz → HTTP/2 200

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till 2026-05-14 12:15:22 +02:00
commit 0bd59ed148
25 changed files with 1468 additions and 0 deletions

View file

@ -0,0 +1,38 @@
import SwiftUI
/// Phase ζ-1 Placeholder.
///
/// Wird in ζ-1 zu einer echten `UIViewRepresentable`/
/// `NSViewRepresentable` um `WKWebView`. Aufgabenliste in ζ-1:
///
/// - WebView-Konfiguration: `WKWebViewConfiguration` mit non-persistent
/// DataStore in Debug-Builds; Persistent in Release.
/// - Cookie-Bridge: nach ManaCore-Login JWT als `mana.access`-Cookie
/// für `.mana.how` ins `WKHTTPCookieStore` schreiben.
/// - Pull-to-Refresh via `UIRefreshControl` (iOS) /
/// `NSScrollView` (macOS).
/// - `WKNavigationDelegate` für Deep-Link-Catching: wenn der WebView
/// eine Navigation auf `zitare://` oder eine andere mana-Domain
/// versucht, abfangen und natively routen.
/// - `WKUIDelegate` für `target=_blank`-Links (Safari öffnen, nicht
/// im WebView).
/// - Native-Toolbar overlay (ζ-5).
///
/// Heute nur die Signatur, damit `RootView` schon den finalen
/// Import-Pfad nutzt.
struct WebShellView: View {
let initialURL: URL
var body: some View {
VStack(spacing: 12) {
Text("WebShellView")
.font(.headline)
Text("ζ-1 — TODO: WKWebView auf \(initialURL.absoluteString)")
.font(.caption)
.foregroundStyle(.secondary)
.multilineTextAlignment(.center)
.padding(.horizontal)
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
}