From 2e984e45fdef435583b3b52012104079e29d0254 Mon Sep 17 00:00:00 2001 From: Lubos Pintes Date: Sat, 22 Nov 2025 18:49:45 +0100 Subject: [PATCH 01/15] feat(a11y): add accessibility features to Button component MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add isLoading prop with aria-busy support - Add dev warning for icon-only buttons without aria-label - Add comprehensive JSDoc with accessibility requirements 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/components/ui/button.tsx | 40 +++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx index f6487460b..0228eac6f 100644 --- a/src/components/ui/button.tsx +++ b/src/components/ui/button.tsx @@ -39,24 +39,58 @@ export interface ButtonProps extends React.ButtonHTMLAttributes, VariantProps { asChild?: boolean; + /** + * Loading state - sets aria-busy and disables the button + */ + isLoading?: boolean; } /** * Button component with multiple variants and sizes - * + * + * ACCESSIBILITY REQUIREMENTS: + * - Icon-only buttons (size="icon") MUST have an aria-label prop + * - Use isLoading prop to indicate loading state to screen readers + * * @example + * // Standard button * + * + * @example + * // Icon-only button (requires aria-label) + * + * + * @example + * // Loading state + * */ const Button = React.forwardRef( - ({ className, variant, size, ...props }, ref) => { + ({ className, variant, size, isLoading, disabled, children, ...props }, ref) => { + // Warn in development if icon-only button lacks aria-label + if (process.env.NODE_ENV === 'development' && size === 'icon') { + if (!props['aria-label'] && !props['aria-labelledby']) { + console.warn( + 'Button: Icon-only buttons (size="icon") should have an aria-label or aria-labelledby for accessibility' + ); + } + } + return ( ); } ); From d9729cea9c6d96c7310dbd9aa7790552cf46edfb Mon Sep 17 00:00:00 2001 From: Lubos Pintes Date: Sat, 22 Nov 2025 18:51:37 +0100 Subject: [PATCH 02/15] feat(a11y): add screen reader labels to CustomTitlebar buttons MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add sr-only spans to 4 icon-only buttons: - Agents button - Usage Dashboard button - Settings button - More options button 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/components/CustomTitlebar.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/components/CustomTitlebar.tsx b/src/components/CustomTitlebar.tsx index 3342959b0..b1d49a95e 100644 --- a/src/components/CustomTitlebar.tsx +++ b/src/components/CustomTitlebar.tsx @@ -148,6 +148,7 @@ export const CustomTitlebar: React.FC = ({ className="p-2 rounded-md hover:bg-accent hover:text-accent-foreground transition-colors tauri-no-drag" > + Agents )} @@ -161,6 +162,7 @@ export const CustomTitlebar: React.FC = ({ className="p-2 rounded-md hover:bg-accent hover:text-accent-foreground transition-colors tauri-no-drag" > + Usage Dashboard )} @@ -180,6 +182,7 @@ export const CustomTitlebar: React.FC = ({ className="p-2 rounded-md hover:bg-accent hover:text-accent-foreground transition-colors tauri-no-drag" > + Settings )} @@ -194,6 +197,7 @@ export const CustomTitlebar: React.FC = ({ className="p-2 rounded-md hover:bg-accent hover:text-accent-foreground transition-colors flex items-center gap-1" > + More options From c66b2150caa33b14ae737b177adeb02dbf6ca190 Mon Sep 17 00:00:00 2001 From: Lubos Pintes Date: Sat, 22 Nov 2025 18:53:13 +0100 Subject: [PATCH 03/15] feat(a11y): add screen reader labels to SessionHeader buttons MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add sr-only spans to 4 icon-only buttons: - Back to projects button - Copy conversation button - Toggle timeline button - Session settings button 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/components/claude-code-session/SessionHeader.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/components/claude-code-session/SessionHeader.tsx b/src/components/claude-code-session/SessionHeader.tsx index b48a24823..94cb008f4 100644 --- a/src/components/claude-code-session/SessionHeader.tsx +++ b/src/components/claude-code-session/SessionHeader.tsx @@ -66,6 +66,7 @@ export const SessionHeader: React.FC = React.memo(({ className="h-8 w-8" > + Back to projects
@@ -109,6 +110,7 @@ export const SessionHeader: React.FC = React.memo(({ trigger={ } content={ @@ -145,12 +147,14 @@ export const SessionHeader: React.FC = React.memo(({ )} > + Toggle timeline From ebe89c9e73ce61dcb7671df44a8b5d6c46a03fc3 Mon Sep 17 00:00:00 2001 From: Lubos Pintes Date: Sat, 22 Nov 2025 18:55:23 +0100 Subject: [PATCH 04/15] feat(a11y): add screen reader labels to FloatingPromptInput buttons MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add sr-only spans to 3 icon-only buttons: - Minimize button (in expanded modal) - Expand button (in fixed input bar) - Send/Stop button with dynamic labels based on loading state 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/components/FloatingPromptInput.tsx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/components/FloatingPromptInput.tsx b/src/components/FloatingPromptInput.tsx index 1f042b2c6..7dfc86941 100644 --- a/src/components/FloatingPromptInput.tsx +++ b/src/components/FloatingPromptInput.tsx @@ -881,6 +881,7 @@ const FloatingPromptInputInner = ( className="h-8 w-8" > + Minimize @@ -1259,6 +1260,7 @@ const FloatingPromptInputInner = ( className="h-8 w-8 hover:bg-accent/50 transition-colors" > + Expand @@ -1279,9 +1281,15 @@ const FloatingPromptInputInner = ( )} > {isLoading ? ( - + <> + + Stop generation + ) : ( - + <> + + Send message + )} From 73f00e377b00e5ed72828d37aa6c6c8f711b6a1e Mon Sep 17 00:00:00 2001 From: Lubos Pintes Date: Sat, 22 Nov 2025 18:57:24 +0100 Subject: [PATCH 05/15] feat(a11y): add screen reader labels to ClaudeCodeSession buttons MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add sr-only spans to 8 icon-only buttons: - Collapse/Expand queue button (with dynamic labels) - Remove queued prompt button - Session timeline button - Copy conversation button - Checkpoint settings button - Close timeline button - Scroll to top button - Scroll to bottom button 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/components/ClaudeCodeSession.tsx | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/components/ClaudeCodeSession.tsx b/src/components/ClaudeCodeSession.tsx index f0f164f21..67c330404 100644 --- a/src/components/ClaudeCodeSession.tsx +++ b/src/components/ClaudeCodeSession.tsx @@ -1389,7 +1389,17 @@ export const ClaudeCodeSession: React.FC = ({ transition={{ duration: 0.15 }} > @@ -1423,6 +1433,7 @@ export const ClaudeCodeSession: React.FC = ({ onClick={() => setQueuedPrompts(prev => prev.filter(p => p.id !== queuedPrompt.id))} > + Remove from queue @@ -1458,7 +1469,7 @@ export const ClaudeCodeSession: React.FC = ({ top: 0, behavior: 'smooth' }); - + // After smooth scroll completes, trigger a small scroll to ensure rendering setTimeout(() => { if (parentRef.current) { @@ -1476,6 +1487,7 @@ export const ClaudeCodeSession: React.FC = ({ className="px-3 py-2 hover:bg-accent rounded-none" > + Scroll to top @@ -1509,6 +1521,7 @@ export const ClaudeCodeSession: React.FC = ({ className="px-3 py-2 hover:bg-accent rounded-none" > + Scroll to bottom @@ -1542,6 +1555,7 @@ export const ClaudeCodeSession: React.FC = ({ className="h-9 w-9 text-muted-foreground hover:text-foreground" > + Session Timeline @@ -1560,6 +1574,7 @@ export const ClaudeCodeSession: React.FC = ({ className="h-9 w-9 text-muted-foreground hover:text-foreground" > + Copy conversation @@ -1602,6 +1617,7 @@ export const ClaudeCodeSession: React.FC = ({ className="h-8 w-8 text-muted-foreground hover:text-foreground" > + Checkpoint Settings @@ -1654,6 +1670,7 @@ export const ClaudeCodeSession: React.FC = ({ className="h-8 w-8" > + Close timeline
From 1bb0df90fd518944c5062fd76dab00612a142b6e Mon Sep 17 00:00:00 2001 From: Lubos Pintes Date: Sat, 22 Nov 2025 19:56:59 +0100 Subject: [PATCH 06/15] feat(a11y): add screen reader labels to PromptQueue buttons MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add sr-only span to remove from queue button 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/components/claude-code-session/PromptQueue.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/claude-code-session/PromptQueue.tsx b/src/components/claude-code-session/PromptQueue.tsx index b2b2f546e..d85750dca 100644 --- a/src/components/claude-code-session/PromptQueue.tsx +++ b/src/components/claude-code-session/PromptQueue.tsx @@ -73,6 +73,7 @@ export const PromptQueue: React.FC = React.memo(({ onClick={() => onRemove(queuedPrompt.id)} > + Remove from queue ))} From 86ab6b07a932aa1b440428452f3c86d2bdd1e698 Mon Sep 17 00:00:00 2001 From: Lubos Pintes Date: Sat, 22 Nov 2025 19:57:37 +0100 Subject: [PATCH 07/15] feat(a11y): add screen reader labels to pagination buttons MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add sr-only spans to 2 icon-only buttons: - Previous page button - Next page button 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/components/ui/pagination.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/ui/pagination.tsx b/src/components/ui/pagination.tsx index 4a10c6d06..489d6e659 100644 --- a/src/components/ui/pagination.tsx +++ b/src/components/ui/pagination.tsx @@ -52,6 +52,7 @@ export const Pagination: React.FC = ({ className="h-8 w-8" > + Previous page @@ -66,6 +67,7 @@ export const Pagination: React.FC = ({ className="h-8 w-8" > + Next page ); From 9353c68e287d6d6532df209b63c83e0c461f4cc0 Mon Sep 17 00:00:00 2001 From: Lubos Pintes Date: Sat, 22 Nov 2025 20:15:16 +0100 Subject: [PATCH 08/15] feat(a11y): add screen reader labels to navigation Back buttons MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add sr-only spans to 6 back navigation buttons: - CCAgents: Back button - CreateAgent: Back to Agents button - AgentRunView: Back button - AgentExecution: Back button - ClaudeFileEditor: Back button - TabContent: Back to Projects button 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/components/AgentExecution.tsx | 1 + src/components/AgentRunView.tsx | 1 + src/components/CCAgents.tsx | 1 + src/components/ClaudeFileEditor.tsx | 1 + src/components/CreateAgent.tsx | 1 + src/components/TabContent.tsx | 1 + 6 files changed, 6 insertions(+) diff --git a/src/components/AgentExecution.tsx b/src/components/AgentExecution.tsx index 90f089ccd..8d6237195 100644 --- a/src/components/AgentExecution.tsx +++ b/src/components/AgentExecution.tsx @@ -549,6 +549,7 @@ export const AgentExecution: React.FC = ({ title="Back" > + Back

{agent.name}

diff --git a/src/components/AgentRunView.tsx b/src/components/AgentRunView.tsx index 16ade6c51..f789c1f38 100644 --- a/src/components/AgentRunView.tsx +++ b/src/components/AgentRunView.tsx @@ -257,6 +257,7 @@ export const AgentRunView: React.FC = ({ className="h-8 w-8" > + Back
{renderIcon(run.agent_icon)} diff --git a/src/components/CCAgents.tsx b/src/components/CCAgents.tsx index f72b154ee..69cab7472 100644 --- a/src/components/CCAgents.tsx +++ b/src/components/CCAgents.tsx @@ -306,6 +306,7 @@ export const CCAgents: React.FC = ({ onBack, className }) => { className="h-8 w-8" > + Back

CC Agents

diff --git a/src/components/ClaudeFileEditor.tsx b/src/components/ClaudeFileEditor.tsx index 252e3e7bc..11d14bae0 100644 --- a/src/components/ClaudeFileEditor.tsx +++ b/src/components/ClaudeFileEditor.tsx @@ -110,6 +110,7 @@ export const ClaudeFileEditor: React.FC = ({ className="h-8 w-8" > + Back

{file.relative_path}

diff --git a/src/components/CreateAgent.tsx b/src/components/CreateAgent.tsx index 96861e8e0..beee3fd7a 100644 --- a/src/components/CreateAgent.tsx +++ b/src/components/CreateAgent.tsx @@ -139,6 +139,7 @@ export const CreateAgent: React.FC = ({ title="Back to Agents" > + Back to Agents
diff --git a/src/components/TabContent.tsx b/src/components/TabContent.tsx index e306324ed..1c5352492 100644 --- a/src/components/TabContent.tsx +++ b/src/components/TabContent.tsx @@ -163,6 +163,7 @@ const TabPanel: React.FC = ({ tab, isActive }) => { title="Back to Projects" > + Back to Projects
From 015923ae403436f0df37d2c9384271bd57ac2bf5 Mon Sep 17 00:00:00 2001 From: Lubos Pintes Date: Sat, 22 Nov 2025 20:26:16 +0100 Subject: [PATCH 09/15] feat(a11y): add screen reader labels to list action buttons MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add sr-only spans to Edit/Delete buttons: - Settings: Remove rule buttons (Allow/Deny rules) - SlashCommandsManager: Edit and Delete command buttons - StorageTab: Edit and Delete row buttons - ClaudeMemoriesDropdown: Edit file button 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/components/ClaudeMemoriesDropdown.tsx | 1 + src/components/Settings.tsx | 2 ++ src/components/SlashCommandsManager.tsx | 2 ++ src/components/StorageTab.tsx | 2 ++ 4 files changed, 7 insertions(+) diff --git a/src/components/ClaudeMemoriesDropdown.tsx b/src/components/ClaudeMemoriesDropdown.tsx index da4c8037e..32f8d5dff 100644 --- a/src/components/ClaudeMemoriesDropdown.tsx +++ b/src/components/ClaudeMemoriesDropdown.tsx @@ -143,6 +143,7 @@ export const ClaudeMemoriesDropdown: React.FC = ({ }} > + Edit file ))} diff --git a/src/components/Settings.tsx b/src/components/Settings.tsx index 06d338a0c..924b5a800 100644 --- a/src/components/Settings.tsx +++ b/src/components/Settings.tsx @@ -824,6 +824,7 @@ export const Settings: React.FC = ({ className="h-8 w-8" > + Remove rule )) @@ -872,6 +873,7 @@ export const Settings: React.FC = ({ className="h-8 w-8" > + Remove rule )) diff --git a/src/components/SlashCommandsManager.tsx b/src/components/SlashCommandsManager.tsx index 631f1744d..2b866fb07 100644 --- a/src/components/SlashCommandsManager.tsx +++ b/src/components/SlashCommandsManager.tsx @@ -464,6 +464,7 @@ export const SlashCommandsManager: React.FC = ({ className="h-8 w-8" > + Edit command
diff --git a/src/components/StorageTab.tsx b/src/components/StorageTab.tsx index aa4071cb3..aa4ddcb3d 100644 --- a/src/components/StorageTab.tsx +++ b/src/components/StorageTab.tsx @@ -496,6 +496,7 @@ export const StorageTab: React.FC = () => { className="h-6 w-6" > + Edit row
From 0ddb29154c07886f470818a8e00efc6163cf4e46 Mon Sep 17 00:00:00 2001 From: Lubos Pintes Date: Sat, 22 Nov 2025 20:40:45 +0100 Subject: [PATCH 10/15] feat(a11y): add screen reader labels to specialized control buttons MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add sr-only spans to: - TimelineNavigator: Expand/Collapse, Restore, Fork, and Compare buttons - FilePicker: Navigate up and Close buttons - Agents: Agent options dropdown trigger 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/components/Agents.tsx | 1 + src/components/FilePicker.tsx | 2 ++ src/components/TimelineNavigator.tsx | 13 +++++++++++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/components/Agents.tsx b/src/components/Agents.tsx index 795071786..6f1c1124d 100644 --- a/src/components/Agents.tsx +++ b/src/components/Agents.tsx @@ -356,6 +356,7 @@ export const Agents: React.FC = () => { diff --git a/src/components/FilePicker.tsx b/src/components/FilePicker.tsx index 3038df4e1..a0258eca7 100644 --- a/src/components/FilePicker.tsx +++ b/src/components/FilePicker.tsx @@ -381,6 +381,7 @@ export const FilePicker: React.FC = ({ className="h-8 w-8" > + Navigate up {relativePath} @@ -393,6 +394,7 @@ export const FilePicker: React.FC = ({ className="h-8 w-8" > + Close
diff --git a/src/components/TimelineNavigator.tsx b/src/components/TimelineNavigator.tsx index 2cc0ce154..a69dd390f 100644 --- a/src/components/TimelineNavigator.tsx +++ b/src/components/TimelineNavigator.tsx @@ -283,9 +283,15 @@ export const TimelineNavigator: React.FC = ({ onClick={() => toggleNodeExpansion(node.checkpoint.id)} > {isExpanded ? ( - + <> + + Collapse + ) : ( - + <> + + Expand + )} )} @@ -350,6 +356,7 @@ export const TimelineNavigator: React.FC = ({ }} > + Restore to this checkpoint Restore to this checkpoint @@ -369,6 +376,7 @@ export const TimelineNavigator: React.FC = ({ }} > + Fork from this checkpoint Fork from this checkpoint @@ -388,6 +396,7 @@ export const TimelineNavigator: React.FC = ({ }} > + Compare with another checkpoint Compare with another checkpoint From e6908f93425d5e1d75b64b55ddfebaaceb877799 Mon Sep 17 00:00:00 2001 From: Lubos Pintes Date: Sun, 23 Nov 2025 14:06:45 +0100 Subject: [PATCH 11/15] Commit bun.lock. --- bun.lock | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/bun.lock b/bun.lock index 0152c93a4..398706c6d 100644 --- a/bun.lock +++ b/bun.lock @@ -1,5 +1,6 @@ { "lockfileVersion": 1, + "configVersion": 0, "workspaces": { "": { "name": "opcode", @@ -58,6 +59,10 @@ "typescript": "~5.6.2", "vite": "^6.0.3", }, + "optionalDependencies": { + "@esbuild/linux-x64": "^0.25.6", + "@rollup/rollup-linux-x64-gnu": "^4.45.1", + }, }, }, "trustedDependencies": [ @@ -139,7 +144,7 @@ "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ=="], - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.5", "", { "os": "linux", "cpu": "x64" }, "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw=="], + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="], "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.5", "", { "os": "none", "cpu": "arm64" }, "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw=="], @@ -357,7 +362,7 @@ "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.43.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-QmNIAqDiEMEvFV15rsSnjoSmO0+eJLoKRD9EAa9rrYNwO/XRCtOGM3A5A0X+wmG+XRrw9Fxdsw+LnyYiZWWcVw=="], - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.43.0", "", { "os": "linux", "cpu": "x64" }, "sha512-jAHr/S0iiBtFyzjhOkAics/2SrXE092qyqEg96e90L3t9Op8OTzS6+IX0Fy5wCt2+KqeHAkti+eitV0wvblEoQ=="], + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.53.3", "", { "os": "linux", "cpu": "x64" }, "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w=="], "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.43.0", "", { "os": "linux", "cpu": "x64" }, "sha512-3yATWgdeXyuHtBhrLt98w+5fKurdqvs8B53LaoKD7P7H7FKOONLsBVMNl9ghPQZQuYcceV5CDyPfyfGpMWD9mQ=="], @@ -1061,6 +1066,8 @@ "decode-named-character-reference/character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="], + "esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.5", "", { "os": "linux", "cpu": "x64" }, "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw=="], + "hast-util-from-parse5/hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="], "hast-util-to-parse5/property-information": ["property-information@6.5.0", "", {}, "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig=="], @@ -1087,6 +1094,8 @@ "rehype-prism-plus/refractor": ["refractor@4.9.0", "", { "dependencies": { "@types/hast": "^2.0.0", "@types/prismjs": "^1.0.0", "hastscript": "^7.0.0", "parse-entities": "^4.0.0" } }, "sha512-nEG1SPXFoGGx+dcjftjv8cAjEusIh6ED1xhf5DG3C0x/k+rmZ2duKnc3QLpt6qeHv5fPb8uwN3VWN2BT7fr3Og=="], + "rollup/@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.43.0", "", { "os": "linux", "cpu": "x64" }, "sha512-jAHr/S0iiBtFyzjhOkAics/2SrXE092qyqEg96e90L3t9Op8OTzS6+IX0Fy5wCt2+KqeHAkti+eitV0wvblEoQ=="], + "stringify-entities/character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], "@uiw/react-markdown-preview/rehype-prism-plus/refractor": ["refractor@4.9.0", "", { "dependencies": { "@types/hast": "^2.0.0", "@types/prismjs": "^1.0.0", "hastscript": "^7.0.0", "parse-entities": "^4.0.0" } }, "sha512-nEG1SPXFoGGx+dcjftjv8cAjEusIh6ED1xhf5DG3C0x/k+rmZ2duKnc3QLpt6qeHv5fPb8uwN3VWN2BT7fr3Og=="], From 8ea0ed65d8723261e1d200bca7c829ef8eab8e59 Mon Sep 17 00:00:00 2001 From: Lubos Pintes Date: Sun, 23 Nov 2025 16:32:56 +0100 Subject: [PATCH 12/15] feat(a11y): add screen reader labels to SessionOutputViewer buttons MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add sr-only spans to output viewer controls: - Fullscreen toggle: "Enter fullscreen" / "Exit fullscreen" - Refresh output: "Refresh output" - Close viewer: "Close output viewer" These buttons are essential for managing the session output view, and now provide proper context for screen reader users. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/components/SessionOutputViewer.tsx | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/components/SessionOutputViewer.tsx b/src/components/SessionOutputViewer.tsx index eafcc0145..e213c0635 100644 --- a/src/components/SessionOutputViewer.tsx +++ b/src/components/SessionOutputViewer.tsx @@ -412,7 +412,17 @@ export function SessionOutputViewer({ session, onClose, className }: SessionOutp onClick={() => setIsFullscreen(!isFullscreen)} title="Fullscreen" > - {isFullscreen ? : } + {isFullscreen ? ( + <> + + Exit fullscreen + + ) : ( + <> + + Enter fullscreen + + )} + Refresh output
From 497c6f8dac7212d341e740694ad6fbab03e0b800 Mon Sep 17 00:00:00 2001 From: Lubos Pintes Date: Sun, 23 Nov 2025 16:33:27 +0100 Subject: [PATCH 13/15] feat(a11y): add screen reader labels to ProjectList pagination buttons MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add sr-only spans to pagination controls: - Previous page button: "Previous page" - Next page button: "Next page" These navigation buttons allow users to browse through multiple pages of projects and now announce their purpose to screen readers. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/components/ProjectList.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/ProjectList.tsx b/src/components/ProjectList.tsx index 8d8ab7995..3f35da4f3 100644 --- a/src/components/ProjectList.tsx +++ b/src/components/ProjectList.tsx @@ -206,6 +206,7 @@ export const ProjectList: React.FC = ({ disabled={currentPage === 1} > + Previous page @@ -234,6 +235,7 @@ export const ProjectList: React.FC = ({ disabled={currentPage === totalPages} > + Next page From ae8b2e5aec49037a37343079cbcda541ee9fd24c Mon Sep 17 00:00:00 2001 From: Lubos Pintes Date: Sun, 23 Nov 2025 16:33:58 +0100 Subject: [PATCH 14/15] feat(a11y): add screen reader labels to MCPServerList action buttons MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add sr-only spans to server management buttons: - Test connection button: "Test connection" / "Testing connection" - Remove server button: "Remove server" / "Removing server" These buttons control MCP server operations and now provide proper feedback about their action and loading states to screen reader users. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/components/MCPServerList.tsx | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/components/MCPServerList.tsx b/src/components/MCPServerList.tsx index b4936928c..08633f6ca 100644 --- a/src/components/MCPServerList.tsx +++ b/src/components/MCPServerList.tsx @@ -266,9 +266,15 @@ export const MCPServerList: React.FC = ({ className="hover:bg-green-500/10 hover:text-green-600" > {testingServer === server.name ? ( - + <> + + Testing connection + ) : ( - + <> + + Test connection + )} From 59456c4cb73d7fbb4e2da05358b197025ada1d86 Mon Sep 17 00:00:00 2001 From: Lubos Pintes Date: Sun, 23 Nov 2025 16:34:29 +0100 Subject: [PATCH 15/15] feat(a11y): add screen reader labels to CustomTitlebar window control buttons MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add sr-only spans to macOS-style traffic light buttons: - Close button: "Close window" - Minimize button: "Minimize window" - Maximize button: "Maximize window" These native window controls now announce their function to screen reader users, completing accessibility coverage for all window operations. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/components/CustomTitlebar.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/CustomTitlebar.tsx b/src/components/CustomTitlebar.tsx index b1d49a95e..8a498eaa9 100644 --- a/src/components/CustomTitlebar.tsx +++ b/src/components/CustomTitlebar.tsx @@ -95,6 +95,7 @@ export const CustomTitlebar: React.FC = ({ {isHovered && ( )} + Close window {/* Minimize button */} @@ -109,6 +110,7 @@ export const CustomTitlebar: React.FC = ({ {isHovered && ( )} + Minimize window {/* Maximize button */} @@ -123,6 +125,7 @@ export const CustomTitlebar: React.FC = ({ {isHovered && ( )} + Maximize window