# SRC-04 – Prüfprotokoll: Such-Oberfläche mit Hervorhebung Voraussetzung SRC-03 (Fertig), SHL-01 (Core-Board, Fertig). ## Umsetzung - `web/mail-search`: eigenständige Next.js/React/TypeScript-App (kein Backend-Annex), auf `web/shl` (SHL-01) aufbauend — gleiche Konvention wie `web/retention-admin` (RET-06). - `app/api/search/route.ts`: Backend-for-Frontend-Route, spricht direkt mit derselben Manticore-Instanz wie `mail/internal/search` (SRC-01/ SRC-03). Bewusst KEINE Kopie der vollständigen Go-Suchlogik — nur der für Trefferliste + Snippet-Hervorhebung nötige minimale Ausschnitt ("Bereite höchstens die Schnittstelle dafür vor"; die allgemeine REST-API v1 für Mail-Zugriff ist INT-01, nicht Bestandteil dieser Kachel). Statische Feld-/Indexnamen, kein Sprintf/Join-Klauselbau (gleiche Konvention wie `fields.go`). Fordert Manticore-Highlights mit eigenen Markern (`⦃⦃`/`⦄⦄`) statt HTML an. - `lib/highlight.ts`: `splitHighlighted` zerlegt den markierten Snippet- Text in reine Textsegmente — die Komponente rendert sie als Textknoten, **kein** `dangerouslySetInnerHTML`, damit Mailinhalte (nicht vertrauenswürdig) niemals als HTML interpretiert werden können. - `app/page.tsx`: Sucheingabe (`@nexarch/shl` `TextField`), Live- Trefferliste mit ``-Hervorhebung, verständlicher Hinweis bei leerem Ergebnis, Link je Treffer zur Mail-Detailseite. - `app/mail/[messageId]/page.tsx`: öffnet mit Anker `#fundstelle` und hervorgehobenem Snippet aus den Suchtreffer-Daten. Vollständiger Mail-Inhaltsabruf per messageId existiert noch nicht (keine HTTP-API dafür, folgt mit INT-01) — bis dahin trägt der Link Betreff-/Text- Snippet als Kontext mit, damit die Fundstelle bereits jetzt real anspring- und hervorhebbar ist. - `lib/contrast.ts`/`lib/highlightColors.ts`: reale WCAG-2.1- Kontrastberechnung statt behaupteter Werte. - Kein Umbau: `mail/internal/*`, `web/shl`, `web/retention-admin` unverändert. ## Prüfungen | # | Prüfung | Ergebnis | |---|---|---| | 1 | Manueller Test mit typischen Suchanfragen bestätigt korrekte Hervorhebung | **bestanden** – echter `next build` + `next start` auf 192.168.1.131 gegen die live laufende Manticore-Instanz: `GET /api/search?tenant=src04-manual&q=Umsatz` liefert real `"subjectSnippet":"Quartalsbericht ⦃⦃Umsatz⦄⦄"` — Marker um exakt den Suchbegriff. Zusätzlich automatisiert in `app/page.test.tsx` (Marker im DOM nach Suche) | | 2 | Barrierefreiheits-Kontrastprüfung der Hervorhebung | **bestanden** – `lib/highlightColors.test.ts`: echte WCAG-2.1-Berechnung, Hell-Modus 14,29:1, Dunkel-Modus 6,43:1 (beide ≥ 4.5:1 AA-Grenzwert für Fließtext) | | 3 | Test mit Sonderzeichen in der Suchanfrage bricht die Anzeige nicht | **bestanden** – real gegen den laufenden Server getestet: Anfrage mit `"dritten Quartal" -Verlust