From e230f9791f5226b3cb3acfb05eb549f6c51c62d2 Mon Sep 17 00:00:00 2001 From: Nicolas Varrot Date: Fri, 13 Feb 2026 13:28:02 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20improve=20accessibility=20=E2=80=94=20s?= =?UTF-8?q?emantic=20HTML=20landmarks,=20skip-to-content=20link,=20ARIA=20?= =?UTF-8?q?attributes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace div with
for primary chat pane (screen reader landmark) - Replace div with
for split pane - Add skip-to-content link for keyboard navigation (Tab → jump to chat input) - Add aria-expanded and aria-label to tool call badge buttons - Add id='chat-input' to textarea for skip link target - Add i18n keys for new ARIA labels (EN + FR) --- src/App.tsx | 9 +++++---- src/components/ChatInput.tsx | 1 + src/components/ToolCall.tsx | 2 ++ src/lib/i18n.ts | 6 ++++++ 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index a64beab..94e24bf 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -138,6 +138,7 @@ export default function App() { return (
+ {t('app.skipToChat')}
{/* Primary pane */} -
+
setSidebarOpen(!sidebarOpen)} activeSessionData={sessions.find(s => s.key === activeSession)} onLogout={logout} soundEnabled={soundEnabled} onToggleSound={toggleSound} messages={messages} agentAvatarUrl={agentIdentity?.avatar} />
Loading…
}> -
+
{/* Split divider + secondary pane */} {splitSession && ( <> @@ -166,7 +167,7 @@ export default function App() { role="separator" aria-orientation="vertical" /> -
+
{/* Secondary header */}
@@ -184,7 +185,7 @@ export default function App() {
Loading…
}> -
+ )} diff --git a/src/components/ChatInput.tsx b/src/components/ChatInput.tsx index 74c31d8..1a10d79 100644 --- a/src/components/ChatInput.tsx +++ b/src/components/ChatInput.tsx @@ -304,6 +304,7 @@ export function ChatInput({ onSend, onAbort, isGenerating, disabled, sessionKey /> setOpen(!open)} className={`inline-flex items-center gap-1.5 rounded-2xl border px-3 py-1.5 text-xs hover:brightness-125 transition-all max-w-full ${cs.glow}`} style={{ ...cs.badge, ...cs.text }} + aria-expanded={open} + aria-label={`${name}${hint ? ` — ${hint}` : ''}: ${open ? 'collapse' : 'expand'} details`} > {getToolEmoji(name)} {name} diff --git a/src/lib/i18n.ts b/src/lib/i18n.ts index cb9ef37..65c474c 100644 --- a/src/lib/i18n.ts +++ b/src/lib/i18n.ts @@ -63,6 +63,9 @@ const en = { 'sidebar.close': 'Close sidebar', 'sidebar.clearSearch': 'Clear search', 'split.close': 'Close split view', + 'app.mainChat': 'Main chat', + 'app.splitPane': 'Split pane', + 'app.skipToChat': 'Skip to chat input', // Thinking 'thinking.label': 'Thinking', @@ -180,6 +183,9 @@ const fr: Record = { 'sidebar.close': 'Fermer la barre latérale', 'sidebar.clearSearch': 'Effacer la recherche', 'split.close': 'Fermer la vue scindée', + 'app.mainChat': 'Chat principal', + 'app.splitPane': 'Volet scindé', + 'app.skipToChat': 'Aller au champ de saisie', 'thinking.label': 'Réflexion', 'thinking.reasoning': 'Réflexion…',