From 3e37d780c39fd528c506d8ebd69ade208115b037 Mon Sep 17 00:00:00 2001 From: xRangerDE Date: Mon, 11 May 2026 03:46:40 +0200 Subject: [PATCH] a11y: queue-item title + selector keyboard-accessible MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two more click-only divs in the queue item template were leaving keyboard users stuck: - .queue-selector — the "X" number-badge to the left of pending queue items that toggles bulk-select. Previously a div with onclick. Now role="checkbox" + tabindex + aria-checked tracking the selection state + Enter/Space keydown handler. - .queue-item .title — the truncated VOD title that, when clicked, toggles the expanded detail panel underneath the row. Previously a div with onclick. Now role="button" + tabindex + aria-expanded reflecting the panel state + aria-controls pointing at the details panel ID + Enter/Space keydown handler. Both pick up 2px purple focus-visible rings to match the rest of the a11y family. aria-expanded on a button is the conventional pattern for "disclosure widget" controls (collapsible/expandable content), so screen readers will now announce the title as "VOD title, button, collapsed" or "expanded" as the user navigates and toggles. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/renderer-queue.ts | 4 ++-- src/styles.css | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/renderer-queue.ts b/src/renderer-queue.ts index f0430ff..0fefa21 100644 --- a/src/renderer-queue.ts +++ b/src/renderer-queue.ts @@ -549,13 +549,13 @@ function renderQueue(): void { return `
${showSelector - ? `
${isSelected ? selectionIndex + 1 : ''}
` + ? `` : '' }
-
${liveBadge}${healthBadge}${mergeIcon}${isClip}${safeTitle}
+
${liveBadge}${healthBadge}${mergeIcon}${isClip}${safeTitle}
${safeStatusLabel}
${safeMeta}${mergeMetaExtra}
diff --git a/src/styles.css b/src/styles.css index f8f6dee..7f088ce 100644 --- a/src/styles.css +++ b/src/styles.css @@ -1054,6 +1054,17 @@ select option { transition: all 0.15s; } +.queue-selector:focus-visible { + outline: none; + box-shadow: 0 0 0 2px rgba(145, 70, 255, 0.55); +} + +.queue-item .title:focus-visible { + outline: none; + border-radius: 3px; + box-shadow: 0 0 0 2px rgba(145, 70, 255, 0.45); +} + .queue-selector.selected { background: var(--accent); border-color: var(--accent);