pageta-native/Sources/Features/HighlightSelectionPalette.swift
Till JS c029ab15c8 feat(reader): Inline-Markier-Palette (Books-Stil) + Login-Gate + sichtbare Schreibfehler
Markieren öffnet jetzt eine schwebende Farb-Palette direkt an der Auswahl
(HighlightSelectionPalette) statt Edit-Menü → Bottom-Sheet; System-Menü
unterdrückt, Kopieren lebt in der Palette. Selection-getriebenes Reporting
via UITextViewDelegate (Text + Screen-Rect), Inhalts-Guard gegen
Auswahl-Abräumen. Schreibfehler (z.B. Session abgelaufen) werden sichtbar
statt still verschluckt; nicht-eingeloggt führt über ManaAuthGate.require
direkt ins Login-Sheet und holt die Markierung nach.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 12:40:11 +02:00

56 lines
1.5 KiB
Swift

import SwiftUI
/// Schwebende Auswahl-Leiste (Books-/Kindle-Stil): erscheint direkt an
/// der Text-Auswahl, statt als Bottom-Sheet vom unteren Bildschirmrand.
///
/// Ein Tipp auf eine Farbe markiert sofort — kein Zwischenschritt. Das
/// System-Edit-Menü wird in `ArticleBodyTextView` unterdrückt, daher
/// trägt diese Leiste auch das „Kopieren" mit, damit es nicht verloren
/// geht (vier Farb-Punkte + Trenner + Kopieren).
struct HighlightSelectionPalette: View {
let onPick: (HighlightColor) -> Void
let onCopy: () -> Void
var body: some View {
HStack(spacing: 10) {
ForEach(HighlightColor.allCases) { color in
Button {
onPick(color)
} label: {
Circle()
.fill(color.swiftUIColor)
.frame(width: 28, height: 28)
.overlay(
Circle().stroke(Color.primary.opacity(0.18), lineWidth: 1)
)
}
.buttonStyle(.plain)
.accessibilityLabel("Markieren: \(color.label)")
}
Divider().frame(height: 22)
Button {
onCopy()
} label: {
Image(systemName: "doc.on.doc")
.font(.system(size: 15, weight: .medium))
.foregroundStyle(PagetaTheme.foreground)
.frame(width: 28, height: 28)
}
.buttonStyle(.plain)
.accessibilityLabel("Kopieren")
}
.padding(.horizontal, 12)
.padding(.vertical, 8)
.background {
Capsule(style: .continuous)
.fill(.regularMaterial)
.shadow(color: .black.opacity(0.18), radius: 8, y: 3)
}
.overlay {
Capsule(style: .continuous)
.strokeBorder(Color.primary.opacity(0.08), lineWidth: 0.5)
}
}
}