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>
116 lines
4.9 KiB
Markdown
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.
|