From 03b575cd1d02dac7069f1cddd9aa0707ab37ae64 Mon Sep 17 00:00:00 2001 From: xRangerDE Date: Mon, 11 May 2026 07:57:33 +0200 Subject: [PATCH] a11y: scope=col + aria-label on storage stats table headers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Storage card's per-streamer stats table was built without scope attributes on its cells and the last column (the "Open" action column) had an empty header — screen readers couldn't tell which column a data cell belonged to once you tabbed into the rows, and the actions column had no announced name at all. Fixes: - All 6 column headers get scope="col" — explicit signal to screen readers that each is a column header (the implicit -inside- semantics work, but explicit scope is best practice for data tables and the de-facto standard for accessibility tooling validation) - The empty actions header gets aria-label set from a new storageColumnActionsAria locale key (DE: "Aktionen", EN: "Actions") so screen readers announce "Aktionen, Spaltenkopf" for that column instead of skipping over an unnamed header. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/renderer-locale-de.ts | 1 + src/renderer-locale-en.ts | 1 + src/renderer-settings.ts | 7 ++++++- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/renderer-locale-de.ts b/src/renderer-locale-de.ts index 57fce82..3ff2bae 100644 --- a/src/renderer-locale-de.ts +++ b/src/renderer-locale-de.ts @@ -65,6 +65,7 @@ const UI_TEXT_DE = { storageColumnTotal: 'Gesamt', storageColumnLive: 'Live', storageColumnChat: 'Chat', + storageColumnActionsAria: 'Aktionen', storageOpen: 'Oeffnen', storageOtherFolders: 'Andere Ordner im Download-Pfad', cleanupTitle: 'Auto-Cleanup', diff --git a/src/renderer-locale-en.ts b/src/renderer-locale-en.ts index f8640c6..536f02c 100644 --- a/src/renderer-locale-en.ts +++ b/src/renderer-locale-en.ts @@ -65,6 +65,7 @@ const UI_TEXT_EN = { storageColumnTotal: 'Total', storageColumnLive: 'Live', storageColumnChat: 'Chat', + storageColumnActionsAria: 'Actions', storageOpen: 'Open', storageOtherFolders: 'Other folders in download path', cleanupTitle: 'Auto-cleanup', diff --git a/src/renderer-settings.ts b/src/renderer-settings.ts index eeb7b70..304dacd 100644 --- a/src/renderer-settings.ts +++ b/src/renderer-settings.ts @@ -366,7 +366,12 @@ function renderStorageStats(stats: StorageStatsResult): void { ]; for (const h of headers) { const th = document.createElement('th'); - th.textContent = h; + th.scope = 'col'; + if (h) { + th.textContent = h; + } else { + th.setAttribute('aria-label', UI_TEXT.static.storageColumnActionsAria); + } headRow.appendChild(th); } thead.appendChild(headRow);