From 7f1d3cdec0269d53065ac0d650fb8c9d6ddc2aad Mon Sep 17 00:00:00 2001 From: Cuarroc <47299143+Cuarroc@users.noreply.github.com> Date: Fri, 16 Oct 2026 03:20:57 +0200 Subject: [PATCH 1/3] test(design): compact search trigger must keep its accessible name (red, DS-T-04) The header search button has no aria-label; its name comes only from the visible span and the shortcut chip, which header.css hides with container queries as the search shrinks. With both hidden, the button has no name. Test-First: src/shell/header/header.test.tsx::search trigger keeps a permanent accessible name Co-Authored-By: Claude Opus 5.5 --- src/shell/header/header.test.tsx | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/shell/header/header.test.tsx b/src/shell/header/header.test.tsx index ca8628de..c06afc39 100644 --- a/src/shell/header/header.test.tsx +++ b/src/shell/header/header.test.tsx @@ -82,6 +82,15 @@ describe("command palette details", () => { render(); expect(screen.getByRole("button", { name: /Seiten und Befehle suchen/ }).textContent).toContain("Strg K"); }); + + it("search trigger keeps a permanent accessible name", () => { + render(); + const trigger = screen.getByRole("button", { name: /Seiten und Befehle suchen/ }); + expect(trigger).toHaveAttribute("aria-label", "Seiten und Befehle suchen"); + // header.css hides the shortcut, then the text, as the search shrinks (container queries). + for (const part of trigger.querySelectorAll("span, kbd")) part.style.display = "none"; + expect(screen.getByRole("button", { name: "Seiten und Befehle suchen" })).toBe(trigger); + }); }); describe("command palette composition", () => { From 431b967aef88811fbda830bd9235144a6a47140f Mon Sep 17 00:00:00 2001 From: Cuarroc <47299143+Cuarroc@users.noreply.github.com> Date: Fri, 16 Oct 2026 03:25:40 +0200 Subject: [PATCH 2/3] fix(design): compact search keeps its accessible name (DS-T-04) The header search button now carries aria-label with the same text as its visible label (WCAG 2.5.3 Label in Name). One constant feeds both, so the hardcoded-string ratchet does not grow. header.css may still hide the text and the shortcut chip as the search shrinks; the name stays. Regression-For: 7f1d3cdec0269d53065ac0d650fb8c9d6ddc2aad Co-Authored-By: Claude Opus 5.5 --- src/shell/header/CommandPalette.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/shell/header/CommandPalette.tsx b/src/shell/header/CommandPalette.tsx index d4ac64a9..126c1fd3 100644 --- a/src/shell/header/CommandPalette.tsx +++ b/src/shell/header/CommandPalette.tsx @@ -26,6 +26,9 @@ const shortcutLabel = (): string => { return /mac|iphone|ipad/i.test(nav.userAgentData?.platform || nav.platform || "") ? "⌘ K" : "Strg K"; }; +// Also the button's aria-label: header.css hides the text and the shortcut as the search shrinks. +const SEARCH_LABEL = "Seiten und Befehle suchen"; + /** Search field in the header (Strg K / Cmd K) that opens the palette on the Sheet. */ export function CommandPalette() { const [open, setOpen] = useState(false); @@ -65,9 +68,9 @@ export function CommandPalette() { return ( <> - From f32550f0077d0ba24c52def96afcb389f6157e98 Mon Sep 17 00:00:00 2001 From: Cuarroc <47299143+Cuarroc@users.noreply.github.com> Date: Fri, 16 Oct 2026 03:32:10 +0200 Subject: [PATCH 3/3] docs(plan): add the DS-T-04 row as it is true after the merge No-Test: plan status row Co-Authored-By: Claude Opus 5.5 --- docs/PLAN.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/PLAN.md b/docs/PLAN.md index c1fbf08a..d0008656 100644 --- a/docs/PLAN.md +++ b/docs/PLAN.md @@ -231,6 +231,7 @@ Größe vor dem Start messen: `store.mjs` (570), `app.js` (504/527) und `store.t | MRP-REGEX-SCRIPTS | Paketregex in mrp-count und bench-weekly an #768 angleichen; Root-Disposition 09.10. | bestehender Owner `srv-mrp-regex-scripts` | MERGIFY-REPORT-REGEX/#768 | Server | B | Erledigt #782 (merged 2026-10-09T01:26:43Z); ersetzt: In Prüfung: Draft #782 | benannte Regex-Regressionen rot→grün, Zählerverträge erhalten, eigene prepush/Fremdreview und Root-Abnahme | 46800384 | | MATRIX-RECONCILE | Alle 27 Matrixzeilen mit datierten Belegen und offenen Resten abgleichen; Root-Disposition 09.10. | bestehender Owner `srv-matrix-reconcile` | bestehende Belege; Continuous bleibt aus | Server | C | Erledigt #781 (merged 2026-10-09T01:17:02Z); ersetzt: In Prüfung: Draft #781 | Anforderungen unverändert, kein erfundener Laufzeit-PASS; eigene prepush und Root-Abnahme | a6a28ae8 | | Z2-REVIEW-FOLLOWUPS-1 | Review-Folgepunkte gemäß Root-Disposition 09.10. bündeln und abgrenzen | Root bindet vorhandenen Owner | konkrete Findings, Dateien und Abnahme vor Dispatch binden | Server | nach Dateischnitt festlegen | Erledigt #800 (merged 2026-10-09T02:07:35Z, `15305c2e`); ersetzt: Geplant; kein neuer Worker aus PLAN-Eintrag | jeder Folgepunkt mit Quelle/Disposition; ≤ 300 ALL je Paket, keine erneute Abnahmebehauptung | PLAN-SYNC-0910b | +| DS-T-04 | Kompakte Suche behält ihren zugänglichen Namen (Design-Vertrauensfehler P1-c): `aria-label` am Suchknopf in `src/shell/header/CommandPalette.tsx` mit demselben Text wie die sichtbare Beschriftung | Implementierer · Claude; Root nimmt ab | Designsystem-Entscheidungen D1–D7 (`docs/decisions.md`) | Server | B | Erledigt: #1609; der Suchknopf heißt immer „Seiten und Befehle suchen“, auch wenn Text und Kürzel ausgeblendet sind | red-first `header.test.tsx` („search trigger keeps a permanent accessible name“); typecheck, contrast-check und prepush Exit 0; zwei Stufe-B-Reviews fremder Familien | – | Historisch (08.10.); Quotenteil ersetzt durch AGENTS.md „Routing“, Reviewweg durch `docs/decisions.md` „Reviewer count per tier“ (beide Stand 15.10.): Routing-Freigabe Nutzer 08.10. ~21:25Z: Codex frei bis tatsächlich 98 % nutzen; bei etwa 97 % den Nutzer informieren. Den Reset aktiviert ausschließlich der Nutzer selbst;