Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/PLAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 | – |
| DS-X-02 | Additive Design-Skalen und Breakpoint-Konstante (Fabrik-Designsystem, Welle 0): Schrift-, Abstands-, Radius-, Höhen-, Ebenen- und Fokus-Token in `src/design/tokens.css`, `BREAKPOINTS` in `src/design/breakpoints.ts` | Implementierer · Claude; Root nimmt ab | Designsystem-Entscheidungen D1–D7 (`docs/decisions.md`) | Server | B | Erledigt: PR #1601; Tokens und Breakpoint-Konstante geliefert, Umstellung der Ansichten separat | `vitest run src/design` Exit 0; contrast-check grün; 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;
Expand Down
7 changes: 5 additions & 2 deletions src/shell/header/CommandPalette.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -65,9 +68,9 @@ export function CommandPalette() {

return (
<>
<button type="button" className="g-hdr-search" aria-haspopup="dialog" onClick={() => setOpen(true)}>
<button type="button" className="g-hdr-search" aria-haspopup="dialog" aria-label={SEARCH_LABEL} onClick={() => setOpen(true)}>
<svg className="g-shell-ic" viewBox="0 0 20 20" aria-hidden="true"><path d="M9 3.5a5.5 5.5 0 1 1 0 11 5.5 5.5 0 0 1 0-11ZM13.5 13.5 17 17" /></svg>
<span>Seiten und Befehle suchen</span>
<span>{SEARCH_LABEL}</span>
<Kbd>{shortcutLabel()}</Kbd>
</button>
<Sheet open={open} onClose={close} aria-label="Befehlspalette">
Expand Down
9 changes: 9 additions & 0 deletions src/shell/header/header.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,15 @@ describe("command palette details", () => {
render(<CommandPalette />);
expect(screen.getByRole("button", { name: /Seiten und Befehle suchen/ }).textContent).toContain("Strg K");
});

it("search trigger keeps a permanent accessible name", () => {
render(<CommandPalette />);
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<HTMLElement>("span, kbd")) part.style.display = "none";
expect(screen.getByRole("button", { name: "Seiten und Befehle suchen" })).toBe(trigger);
});
});

describe("command palette composition", () => {
Expand Down
Loading