pageta-native/Sources/Core/Domain/Highlight.swift
Till JS f65cc1d05b feat(highlights): Notiz-Feld pro Markierung (native)
Pro Highlight kann jetzt eine kurze Notiz angelegt + bearbeitet werden
("warum hab ich das markiert?"). HighlightNoteUpdated-Event existiert
schon im shared-schemas-Schema; auf der Native-Seite war es noch nicht
verdrahtet.

- EventType.highlightNoteUpdated + HighlightNoteUpdatedPayload neu.
- Reducer.applyHighlight handelt den note-Patch.
- EventSyncCoordinator.setHighlightNote(id:note:) emittiert das Event,
  normalisiert Empty-String zu nil.
- PagetaAPI.setHighlightNote(...) wrapper.
- HighlightWithArticle ändert highlight/article zu var damit
  Optimistic-Update beim Save patchen kann.

UI:
- Neuer HighlightNoteSheet (Form mit Markierung-Preview + Multi-Line
  TextField + Save/Abbrechen, Auto-Focus).
- MarkierungenTabView: Leading-Swipe "Notiz" öffnet den Sheet, Notiz
  wird in der Row unter dem Highlight-Text mit note.text-Icon angezeigt.
- ArticleDetailView.highlightsSection: kleines Notiz-Icon-Button pro
  Highlight (note.text.badge.plus wenn leer, note.text wenn gesetzt),
  Notiz darunter eingerückt sichtbar. Highlight-Row in eigene
  @ViewBuilder-Methode extrahiert wegen Compiler-Timeout.

iOS Sim BUILD SUCCEEDED, macOS BUILD SUCCEEDED, 38/38 Tests pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 17:30:32 +02:00

59 lines
1.6 KiB
Swift

import Foundation
import SwiftUI
enum HighlightColor: String, Codable, Sendable, CaseIterable, Identifiable {
case yellow
case green
case blue
case pink
var id: String { rawValue }
var label: String {
switch self {
case .yellow: "Gelb"
case .green: "Grün"
case .blue: "Blau"
case .pink: "Pink"
}
}
/// Dezent-warm gewählte Farben, harmonieren mit dem paper-Theme.
var swiftUIColor: Color {
switch self {
case .yellow: Color(red: 0.98, green: 0.85, blue: 0.45)
case .green: Color(red: 0.65, green: 0.85, blue: 0.55)
case .blue: Color(red: 0.60, green: 0.78, blue: 0.95)
case .pink: Color(red: 0.98, green: 0.70, blue: 0.85)
}
}
}
/// Mirror von `pageta-domain/types.ts#Highlight`. Offsets werden vom
/// Web-Client gesetzt; pageta-native arbeitet vorerst auf Paragraph-
/// Granularität (offset=0 bei via Tool-Endpoint gespeicherten
/// Highlights — Web-Highlights mit echten Offsets bleiben sichtbar).
struct Highlight: Codable, Sendable, Identifiable {
let id: String
let articleId: String
let userId: String
let text: String
var note: String?
var color: HighlightColor
let startOffset: Int
let endOffset: Int
let contextBefore: String?
let contextAfter: String?
let createdAt: String
let updatedAt: String
}
/// Highlight + zugehöriger Artikel-Kontext für die globale Markierungen-
/// Liste. `article` ist der gesamte Article-State (nicht nur Titel),
/// damit die Liste auch SiteName, Datum, Reading-Time anzeigen kann
/// ohne separate Lookups.
struct HighlightWithArticle: Sendable, Identifiable {
var id: String { highlight.id }
var highlight: Highlight
var article: Article
}