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

116 lines
4.9 KiB
Markdown

# CLAUDE.md — pageta-native
Guidance für Claude Code in diesem Repo.
> **Wenn du gerade neu bist:** lies zuerst [`STATUS.md`](STATUS.md). Der
> vollständige Plan lebt in
> [`../mana/docs/playbooks/PAGETA_NATIVE_GREENFIELD.md`](../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
- [`../mana/docs/playbooks/PAGETA_NATIVE_GREENFIELD.md`](../mana/docs/playbooks/PAGETA_NATIVE_GREENFIELD.md) — Plan + Phasen
- [`../mana/docs/MANA_SWIFT.md`](../mana/docs/MANA_SWIFT.md) — Native-Koordination (Keychain, Session)
- [`../mana-swift-core/CLAUDE.md`](../mana-swift-core/CLAUDE.md) — Core-Package
- [`../mana-swift-ui/CLAUDE.md`](../mana-swift-ui/CLAUDE.md) — UI-Package
- [`../pageta/STATUS.md`](../pageta/STATUS.md) — Web-App-Stand
- [`../pageta/apps/api/src/routes/`](../pageta/apps/api/src/routes/) — Wire-Format-SOT
## Lokal entwickeln
Voraussetzungen:
- Xcode 16+
- `mana-swift-core` + `mana-swift-ui` als Schwester-Repos ausgecheckt
- Apple-Developer-Account mit Team `QP3GLU8PH3`-Mitgliedschaft
```bash
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.