pageta-native/CLAUDE.md
Till JS a5c1d3e358 Theme-Galerie: alle ManaTheme-Variants frei wählbar im Konto-Tab
Verein-Doktrin (THEMING.md 2026-05-31): jede App unterstützt alle
Variants + Light/Dark/System. Visuelle Galerie aus Live-Vorschau-Karten
(LazyVGrid) je Variant + segmentierter Appearance-Picker, im iOS-Konto-Tab
und in den macOS-Settings.

- PagetaTheme löst gegen ManaTheme.current (@AppStorage, Default paper)
  statt hartkodiert; alle ~40 Call-Sites unverändert.
- PagetaBrand.config(for:) macht auch die Auth-Reise variant-bewusst.
- Variant × Light/Dark orthogonal (Variant-Farben sind schon adaptiv,
  .preferredColorScheme steuert weiter Hell/Dunkel).
- CLAUDE.md Invariante 6 von "fixe paper-Brand" auf "paper als Default,
  alle Themes wählbar" korrigiert.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-31 18:37:41 +02:00

4.9 KiB

CLAUDE.md — pageta-native

Guidance für Claude Code in diesem Repo.

Wenn du gerade neu bist: lies zuerst STATUS.md. Der vollständige Plan lebt in ../mana/docs/playbooks/PAGETA_NATIVE_GREENFIELD.md.

Was dieses Repo ist

Pageta Native — iOS + iPadOS + macOS Universal-App für die Reader-App des Vereins mana e.V. Pendant zur SvelteKit-Web-App in ../pageta/. Konsumiert ManaCore / ManaAuthUI aus dem mana-swift-core + mana-swift-ui SwiftPM-Workspace, redet mit api.pageta.com.

Vorbild: herbatrium-native (gleiche SwiftUI-Universal-Architektur mit Tab-Navigation + ManaAuthGate). Bewusst kein Hybrid-Pattern wie zitare-native — Pageta rendert den Reader nativ (Begründung im Playbook).

Architektonische Invarianten

Beschlossen. Nicht ohne explizite Diskussion antasten.

  1. SwiftUI Universal, Single-Repo. iOS + macOS aus demselben Code. Plattform-Spezifika via #if os(iOS) / #if os(macOS).
  2. mana-auth via ManaAuthUI. Kein eigener Login-Flow. ManaAuthGate umhüllt das RootView.
  3. Pure-Native, kein WKWebView. Reader-Detail wird in SwiftUI gerendert (kommt mit π-3). Begründung im Playbook §Leitprinzip.
  4. Server-authoritative. Kein SwiftData-Caching im MVP — App ist thin Client zu pageta-api. Offline-Cache + Sync kommt frühestens mit π-7 (Widget-Snapshot in App-Group).
  5. pageta.com ist Lead-Domain für Native. AASA + Universal-Links leben auf pageta.com. pageta.mana.how (Web-Alternative) wird Native-seitig nicht angesprochen.
  6. paper als Default-Variant, aber alle Themes wählbar. Pageta startet mit ManaTheme.paper (passt zur Reader-Identität), zwingt den User aber nicht darauf fest. Verein-Doktrin: jede App unterstützt alle ManaTheme-Variants (forest, twilight, lume, … aus ManaTokens) plus immer Light/Dark/System. Der User wählt frei im Konto-Tab; die Wahl bindet an @AppStorage und treibt .manaTheme(_:) an der App-Root. PagetaBrand zieht bereits aus ManaTheme.paper (Cross-App-Bezug vollzogen) — der Theme-Picker verallgemeinert das auf die übrigen Variants. Hell/Dunkel/Automatik ist über AppearanceMode schon umgesetzt. SOT: ../mana/docs/THEMING.md.

Stack

  • SwiftUI Universal (iOS 18 / macOS 15)
  • Swift 6, SWIFT_STRICT_CONCURRENCY=complete
  • mana-swift-core (ManaCore + ManaTokens)
  • mana-swift-ui (ManaAuthUI)
  • XcodeGen für Projekt-Datei
  • Bundle ev.mana.pageta, Team QP3GLU8PH3

Repo-Struktur

pageta-native/
├── Sources/
│   ├── App/                      PagetaNativeApp + RootView (TabView)
│   ├── Core/
│   │   ├── AppConfig.swift       URLs + KeychainGroup
│   │   ├── API/                  PagetaAPI (kommt mit π-1)
│   │   ├── Domain/               DTOs (kommt mit π-1)
│   │   └── Theme/                PagetaTheme (paper-Tokens inline)
│   ├── Features/
│   │   ├── FeedTabView.swift         Placeholder bis π-1
│   │   ├── LeseListeTabView.swift    Placeholder bis π-2
│   │   └── AccountTabView.swift      ManaAccountView
│   └── Resources/                Info.plist + Entitlements + Assets
├── Tests/UnitTests/
├── project.yml                   XcodeGen-Manifest
├── README.md
├── STATUS.md
└── CLAUDE.md (diese Datei)

Konventionen

  • Tabs für Indent (siehe .swiftformat)
  • Single quotes wo möglich (SwiftUI-Strings via Text()-Init, selten Doppelquote-Pflicht)
  • DE als Primary-Locale, EN als Fallback (developmentLanguage: de in project.yml)
  • Naming: Features als <Name>TabView für Tab-Views, <Name>View für Detail-Surfaces

Wichtige Cross-Repo-Doks

Lokal entwickeln

Voraussetzungen:

  • Xcode 16+
  • mana-swift-core + mana-swift-ui als Schwester-Repos ausgecheckt
  • Apple-Developer-Account mit Team QP3GLU8PH3-Mitgliedschaft
scripts/xcodegen         # → PagetaNative.xcodeproj
open PagetaNative.xcodeproj
# Cmd+R im Simulator

Wichtig: scripts/xcodegen statt plain xcodegen benutzen — der Wrapper patcht den XcodeGen-Bug, der platformFilter: macOS als maccatalyst in die pbxproj schreibt. Ohne den Patch wird die macOS-Share-Extension (PagetaShareExtensionMac.appex) auf echten macOS-Builds nicht in PlugIns/ embeddet.