From 0b3207cdb95b718cac6fc4a54ae074028339840c Mon Sep 17 00:00:00 2001 From: Cyril Date: Wed, 15 Jul 2026 11:28:48 +0200 Subject: [PATCH 1/3] =?UTF-8?q?=E2=99=BF=EF=B8=8F(frontend)=20announce=20s?= =?UTF-8?q?earch=20loading=20state=20for=20screen=20readers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add live region announcement when document search is in progress. --- CHANGELOG.md | 1 + .../docs/doc-search/components/DocSearchContent.tsx | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2aafeb4ab4..11d21bb7af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to ### Changed - ♻️(backend) reset collaboration connection in cascade for all children #2507 +- ♿️(frontend) announce search loading state for screen readers #2526 ### Fixed diff --git a/src/frontend/apps/impress/src/features/docs/doc-search/components/DocSearchContent.tsx b/src/frontend/apps/impress/src/features/docs/doc-search/components/DocSearchContent.tsx index 909d436282..87cccfb70a 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-search/components/DocSearchContent.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-search/components/DocSearchContent.tsx @@ -115,6 +115,12 @@ export const DocSearchContent = ({ onResults, ]); + useEffect(() => { + if (loading && (search || isSearchNotMandatory)) { + announce(t('Loading documents...'), 'polite'); + } + }, [loading, search, isSearchNotMandatory]); + useEffect(() => { onLoadingChange?.(loading); }, [loading, onLoadingChange]); From 171a0065c6793945e4e51a9461261b8b96830f1f Mon Sep 17 00:00:00 2001 From: Cyril Date: Wed, 15 Jul 2026 11:44:16 +0200 Subject: [PATCH 2/3] =?UTF-8?q?fixup!=20=E2=99=BF=EF=B8=8F(frontend)=20ann?= =?UTF-8?q?ounce=20search=20loading=20state=20for=20screen=20readers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../docs/doc-search/components/DocSearchContent.tsx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/frontend/apps/impress/src/features/docs/doc-search/components/DocSearchContent.tsx b/src/frontend/apps/impress/src/features/docs/doc-search/components/DocSearchContent.tsx index 87cccfb70a..fb5f3c111b 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-search/components/DocSearchContent.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-search/components/DocSearchContent.tsx @@ -1,6 +1,6 @@ import { announce } from '@react-aria/live-announcer'; import { t } from 'i18next'; -import { useEffect, useState } from 'react'; +import { useEffect, useRef, useState } from 'react'; import { InView } from 'react-intersection-observer'; import { Box } from '@/components/'; @@ -115,10 +115,17 @@ export const DocSearchContent = ({ onResults, ]); + const prevLoadingRef = useRef(false); + useEffect(() => { - if (loading && (search || isSearchNotMandatory)) { + if ( + loading && + !prevLoadingRef.current && + (search || isSearchNotMandatory) + ) { announce(t('Loading documents...'), 'polite'); } + prevLoadingRef.current = loading; }, [loading, search, isSearchNotMandatory]); useEffect(() => { From 22ba8568a2533b95777f5bd41d3d47ac39e81bc2 Mon Sep 17 00:00:00 2001 From: Cyril Date: Wed, 22 Jul 2026 13:23:25 +0200 Subject: [PATCH 3/3] =?UTF-8?q?fixup!=20=E2=99=BF=EF=B8=8F(frontend)=20ann?= =?UTF-8?q?ounce=20search=20loading=20state=20for=20screen=20readers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../doc-search/components/DocSearchContent.tsx | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/src/frontend/apps/impress/src/features/docs/doc-search/components/DocSearchContent.tsx b/src/frontend/apps/impress/src/features/docs/doc-search/components/DocSearchContent.tsx index fb5f3c111b..e6c335d66a 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-search/components/DocSearchContent.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-search/components/DocSearchContent.tsx @@ -1,6 +1,6 @@ import { announce } from '@react-aria/live-announcer'; import { t } from 'i18next'; -import { useEffect, useRef, useState } from 'react'; +import { useEffect, useState } from 'react'; import { InView } from 'react-intersection-observer'; import { Box } from '@/components/'; @@ -65,6 +65,9 @@ export const DocSearchContent = ({ useEffect(() => { if (loading) { + if (search || isSearchNotMandatory) { + announce(t('Loading documents...'), 'polite'); + } return; } @@ -115,19 +118,6 @@ export const DocSearchContent = ({ onResults, ]); - const prevLoadingRef = useRef(false); - - useEffect(() => { - if ( - loading && - !prevLoadingRef.current && - (search || isSearchNotMandatory) - ) { - announce(t('Loading documents...'), 'polite'); - } - prevLoadingRef.current = loading; - }, [loading, search, isSearchNotMandatory]); - useEffect(() => { onLoadingChange?.(loading); }, [loading, onLoadingChange]);