From 829ef7ed1b1500dd41c2580ea1ab5b159f8e0813 Mon Sep 17 00:00:00 2001 From: Cyril Date: Tue, 24 Feb 2026 15:34:40 +0100 Subject: [PATCH] =?UTF-8?q?=E2=99=BF=EF=B8=8F(a11y)=20improve=20settings?= =?UTF-8?q?=20dialog=20screen=20reader=20support?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add aria labels, initial focus and accessible heading to dialog --- .../components/SettingsDialogExtended.tsx | 62 ++++++++++++------- src/frontend/src/locales/en/settings.json | 3 +- src/frontend/src/locales/fr/settings.json | 3 +- 3 files changed, 44 insertions(+), 24 deletions(-) diff --git a/src/frontend/src/features/settings/components/SettingsDialogExtended.tsx b/src/frontend/src/features/settings/components/SettingsDialogExtended.tsx index ed4a782b..4af85212 100644 --- a/src/frontend/src/features/settings/components/SettingsDialogExtended.tsx +++ b/src/frontend/src/features/settings/components/SettingsDialogExtended.tsx @@ -21,7 +21,7 @@ import { AudioTab } from './tabs/AudioTab' import { VideoTab } from './tabs/VideoTab' import { TranscriptionTab } from './tabs/TranscriptionTab' import { ShortcutTab } from './tabs/ShortcutTab' -import { useRef } from 'react' +import { useEffect, useRef } from 'react' import { useMediaQuery } from '@/features/rooms/livekit/hooks/useMediaQuery' import { SettingsDialogExtendedKey } from '@/features/settings/type' import { useIsAdminOrOwner } from '@/features/rooms/livekit/hooks/useIsAdminOrOwner' @@ -68,6 +68,17 @@ export const SettingsDialogExtended = (props: SettingsDialogExtended) => { const isAdminOrOwner = useIsAdminOrOwner() + useEffect(() => { + if (!props.isOpen) return + const timer = setTimeout(() => { + const selectedTab = dialogEl.current?.querySelector( + '[role="tab"][data-selected]' + ) as HTMLElement | null + selectedTab?.focus() + }, 200) + return () => clearTimeout(timer) + }, [props.isOpen]) + return ( { paddingRight: !isWideScreen ? '1rem' : undefined, }} > - {isWideScreen && ( - - {t('dialog.heading')} - - )} - - - + + {t('dialog.heading')} + + + + - - + + - - + + - - + + - - + + - - + + {isAdminOrOwner && ( - + {isWideScreen && t(`tabs.${SettingsDialogExtendedKey.TRANSCRIPTION}`)} )} - - + + diff --git a/src/frontend/src/locales/en/settings.json b/src/frontend/src/locales/en/settings.json index 6d0420bf..5320d4f6 100644 --- a/src/frontend/src/locales/en/settings.json +++ b/src/frontend/src/locales/en/settings.json @@ -106,7 +106,8 @@ "columnShortcut": "Shortcut" }, "dialog": { - "heading": "Settings" + "heading": "Settings", + "tablistLabel": "Sections" }, "language": { "heading": "Language", diff --git a/src/frontend/src/locales/fr/settings.json b/src/frontend/src/locales/fr/settings.json index dfefb828..c4f911ff 100644 --- a/src/frontend/src/locales/fr/settings.json +++ b/src/frontend/src/locales/fr/settings.json @@ -106,7 +106,8 @@ "columnShortcut": "Raccourci" }, "dialog": { - "heading": "Paramètres" + "heading": "Paramètres", + "tablistLabel": "Sections" }, "language": { "heading": "Langue",