From a2ee7fbc37cb0e16c1766cda8ef7a721c7546e84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nicole=20miko=C5=82ajczyk?= Date: Sat, 21 Feb 2026 15:03:34 +0100 Subject: [PATCH] Nicolium: language dropdown keyboard handling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nicole mikołajczyk --- .../src/components/dropdown-menu/dropdown-menu.tsx | 8 ++++++-- .../compose/components/language-dropdown.tsx | 12 ++++++++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/packages/pl-fe/src/components/dropdown-menu/dropdown-menu.tsx b/packages/pl-fe/src/components/dropdown-menu/dropdown-menu.tsx index c14fbcf1f..10d8768e2 100644 --- a/packages/pl-fe/src/components/dropdown-menu/dropdown-menu.tsx +++ b/packages/pl-fe/src/components/dropdown-menu/dropdown-menu.tsx @@ -73,7 +73,11 @@ const DropdownMenuContent: React.FC = ({ () => (e: KeyboardEvent) => { if (!ref.current) return; - const elements = Array.from(ref.current.querySelectorAll('a, button')); + const elements = Array.from( + ref.current.querySelectorAll( + 'a, button:not([disabled]), input:not([disabled])', + ), + ).filter((element) => !element.hasAttribute('aria-hidden')); const index = elements.indexOf(document.activeElement as any); let element = null; @@ -119,7 +123,7 @@ const DropdownMenuContent: React.FC = ({ } if (element) { - (element as HTMLAnchorElement).focus(); + (element as HTMLElement).focus(); e.preventDefault(); e.stopPropagation(); } diff --git a/packages/pl-fe/src/features/compose/components/language-dropdown.tsx b/packages/pl-fe/src/features/compose/components/language-dropdown.tsx index 46fc89290..ef87d8971 100644 --- a/packages/pl-fe/src/features/compose/components/language-dropdown.tsx +++ b/packages/pl-fe/src/features/compose/components/language-dropdown.tsx @@ -61,7 +61,7 @@ const getLanguageDropdown = ); const node = useRef(null); - const focusedItem = useRef(null); + const input = useRef(null); const [searchValue, setSearchValue] = useState(''); @@ -156,9 +156,13 @@ const getLanguageDropdown = handleMenuClose(); }; + useEffect(() => { + if (!language) input.current?.focus(); + }, [input.current]); + useEffect(() => { if (node.current) { - (node.current?.querySelector('div[aria-selected=true]') as HTMLDivElement)?.focus(); + (node.current?.querySelector('button[aria-selected=true]') as HTMLButtonElement)?.focus(); } }, [node.current]); @@ -173,6 +177,7 @@ const getLanguageDropdown = {intl.formatMessage(messages.search)} -
+
{results.map(([code, name]) => { const active = code === language; const modified = code === modifiedLanguage; @@ -218,7 +223,6 @@ const getLanguageDropdown = '⁂-language-dropdown__option--active': active, })} aria-selected={active} - ref={active ? focusedItem : null} >
{name}
{features.multiLanguage &&