From a09fabef9cf5c93ddf8a9fc6652b56f9db194ea4 Mon Sep 17 00:00:00 2001 From: PJ Doland Date: Mon, 18 May 2026 12:24:46 -0400 Subject: [PATCH 1/3] a11y(chat-sidebar): promote header icon-divs to real buttons The new-chat, resume-session, settings, and tools-button icons in the chat sidebar were
nodes with no tabIndex or keyboard handler. Keyboard users could not reach them at all and screen readers announced them as generic group nodes. Promote to
+ )} -
handleSettingsButtonClick()} title="Open Notebook Intelligence settings" aria-label="Open Notebook Intelligence settings" > -
+
{skillsReloadedVisible && ( @@ -3871,7 +3875,8 @@ function SidebarComponent(props: any) {
)} {chatMode !== 'ask' && !NBIAPI.config.isInClaudeCodeMode && ( -
0 ? 'tools-button-active' : ''}`} onClick={() => handleChatToolsButtonClick()} title={ @@ -3879,10 +3884,15 @@ function SidebarComponent(props: any) { ? `Tool selection can cause irreversible changes! Review each tool execution carefully.\n${toolSelectionTitle}` : toolSelectionTitle } + aria-label={ + unsafeToolSelected + ? 'Configure tools (warning: irreversible tools selected)' + : 'Configure tools' + } > {selectedToolCount > 0 && <>{selectedToolCount}} -
+ )} {NBIAPI.config.isInClaudeCodeMode && ( Date: Mon, 18 May 2026 12:28:10 -0400 Subject: [PATCH 2/3] review: differentiate title vs aria-label, tighten button reset Six-reviewer pass surfaced two convergent points: identical title and aria-label strings get read twice by NVDA, and the focus-ring fallback color drifts from the rest of base.css. Differentiate the strings (short name in aria-label, longer description in title) and drop the literal #2196f3 fallback. Also adds line-height: 1 to the button reset so the tools-button badge stays aligned across the div-to-button conversion. --- src/chat-sidebar.tsx | 4 ++-- style/base.css | 11 +++++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/chat-sidebar.tsx b/src/chat-sidebar.tsx index fb1645d8..cd3c7c74 100644 --- a/src/chat-sidebar.tsx +++ b/src/chat-sidebar.tsx @@ -3565,8 +3565,8 @@ function SidebarComponent(props: any) { type="button" className="user-input-footer-button" onClick={() => setShowClaudeSessionPicker(true)} - title="Resume previous Claude session" aria-label="Resume previous Claude session" + title="Resume a Claude session you started earlier in this workspace" > @@ -3576,8 +3576,8 @@ function SidebarComponent(props: any) { type="button" className="user-input-footer-button" onClick={() => handleSettingsButtonClick()} - title="Open Notebook Intelligence settings" aria-label="Open Notebook Intelligence settings" + title="Configure providers, API keys, MCP servers, and skills" > diff --git a/style/base.css b/style/base.css index 6c977746..82ef2083 100644 --- a/style/base.css +++ b/style/base.css @@ -277,21 +277,24 @@ } /* Reset native chrome on the footer buttons that now render as