From f125347a899649b07f710b8b3e966e88fd1cab8e Mon Sep 17 00:00:00 2001 From: Edwin Date: Sat, 8 Aug 2026 07:57:17 -0700 Subject: [PATCH] feat(webui): give the session list ARIA tree semantics and a roving tabindex MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The session list had full keyboard navigation but no accessibility semantics: rows were anonymous divs, selection was CSS-class-only, and no row was ever in the tab order, so assistive tech saw nothing and Tab-only users could not reach the list at all. - The container is now role="tree" (matching the lineage panel's existing convention; groups nest sessions, sessions nest subagents/forks, so a tree fits better than a flat listbox). - Every row — sessions, services, the operator, group headers, and archived-count rows — is a treeitem. Sessions/services carry aria-selected; group headers, archived rows, and sessions with children carry aria-expanded; all rows expose aria-level / aria-posinset / aria-setsize derived from the ordered items' depth. - Roving tabindex: exactly one row (the caret row, else the selected row, else the first) holds tabindex="0", so Tab reaches the list exactly once and the existing arrow-key handling takes over. - toggleListFocus now enters through that roving Tab stop; its old query looked for .item.selected, a class no row ever carries. Existing key handling (Enter / Space / Shift+Arrow / group Left-Right) is untouched. Closes #1075 --- crates/daemon/assets/index.html | 146 +++++++++++++++++++++++++++++--- crates/e2e/tests/web_smoke.rs | 125 +++++++++++++++++++++++++++ 2 files changed, 259 insertions(+), 12 deletions(-) diff --git a/crates/daemon/assets/index.html b/crates/daemon/assets/index.html index ffefbd8d..a94a14aa 100644 --- a/crates/daemon/assets/index.html +++ b/crates/daemon/assets/index.html @@ -3859,7 +3859,7 @@ aria-label="new session">+ new session sessions -