From e211a25ccd4e0a72600b198c50b5f4eba4a20cad Mon Sep 17 00:00:00 2001 From: Molecule AI Core-UIUX Date: Wed, 22 Apr 2026 17:43:12 +0000 Subject: [PATCH] fix(canvas/a11y): dialog aria-modal, icon-button labels, focus management - CookieConsent.tsx: add aria-modal="true" (WCAG 2.1.1) - ConsoleModal.tsx: add useRef + requestAnimationFrame focus management on open - ConversationTraceModal.tsx: remove redundant aria-describedby={undefined} - FileTree.tsx: add aria-label to directory/file delete buttons (WCAG 4.1.2) - FileEditor.tsx: add aria-label to download button (WCAG 4.1.2) - ScheduleTab.tsx: add aria-label to Run Now, Edit, Delete icon buttons - form-inputs.tsx: add aria-label to tag removal button Co-Authored-By: Claude Sonnet 4.6 --- canvas/src/components/ConsoleModal.tsx | 13 ++++++++++++- canvas/src/components/ConversationTraceModal.tsx | 1 - canvas/src/components/CookieConsent.tsx | 1 + canvas/src/components/tabs/FilesTab/FileEditor.tsx | 2 +- canvas/src/components/tabs/FilesTab/FileTree.tsx | 2 ++ canvas/src/components/tabs/ScheduleTab.tsx | 3 +++ canvas/src/components/tabs/config/form-inputs.tsx | 2 +- 7 files changed, 20 insertions(+), 4 deletions(-) diff --git a/canvas/src/components/ConsoleModal.tsx b/canvas/src/components/ConsoleModal.tsx index 1a43ca10..8535bec4 100644 --- a/canvas/src/components/ConsoleModal.tsx +++ b/canvas/src/components/ConsoleModal.tsx @@ -1,6 +1,6 @@ "use client"; -import { useEffect, useState } from "react"; +import { useEffect, useRef, useState } from "react"; import { createPortal } from "react-dom"; import { api } from "@/lib/api"; import { showToast } from "@/components/Toaster"; @@ -27,11 +27,21 @@ export function ConsoleModal({ workspaceId, workspaceName, open, onClose }: Prop const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [mounted, setMounted] = useState(false); + const closeButtonRef = useRef(null); useEffect(() => { setMounted(true); }, []); + // Focus close button when modal opens + useEffect(() => { + if (!open) return; + const raf = requestAnimationFrame(() => { + closeButtonRef.current?.focus(); + }); + return () => cancelAnimationFrame(raf); + }, [open]); + useEffect(() => { if (!open) return; let ignore = false; @@ -99,6 +109,7 @@ export function ConsoleModal({ workspaceId, workspaceName, open, onClose }: Prop )} diff --git a/canvas/src/components/tabs/FilesTab/FileTree.tsx b/canvas/src/components/tabs/FilesTab/FileTree.tsx index 159d04b1..50fab649 100644 --- a/canvas/src/components/tabs/FilesTab/FileTree.tsx +++ b/canvas/src/components/tabs/FilesTab/FileTree.tsx @@ -66,6 +66,7 @@ function TreeItem({ 📁 {node.name} + ))}