diff --git a/about/uses.page.tsx b/about/uses.page.tsx index c01893d3a..8a9f9187a 100644 --- a/about/uses.page.tsx +++ b/about/uses.page.tsx @@ -617,6 +617,7 @@ export default function Uses() { const [displayModal, setDisplayModal] = React.useState(false); const [currentIndex, setCurrentIndex] = React.useState(0); const [modalPortalTarget, setModalPortalTarget] = React.useState(null); + const [filterModalOpen, setFilterModalOpen] = React.useState(false); const filterButtonRef = React.useRef(null); const categoryFilterModalRef = React.useRef(null); React.useEffect(() => { @@ -627,12 +628,23 @@ export default function Uses() { if (!modal) { return; } - const returnFocusToOpener = () => { + const onShow = () => { + setFilterModalOpen(true); + }; + const onHide = () => { + // Move focus out before Bootstrap sets aria-hidden on this subtree. filterButtonRef.current?.focus(); }; - modal.addEventListener("hidden.bs.modal", returnFocusToOpener); + const onHidden = () => { + setFilterModalOpen(false); + }; + modal.addEventListener("show.bs.modal", onShow); + modal.addEventListener("hide.bs.modal", onHide); + modal.addEventListener("hidden.bs.modal", onHidden); return () => { - modal.removeEventListener("hidden.bs.modal", returnFocusToOpener); + modal.removeEventListener("show.bs.modal", onShow); + modal.removeEventListener("hide.bs.modal", onHide); + modal.removeEventListener("hidden.bs.modal", onHidden); }; }, [modalPortalTarget]); const defaultSelectedCategories = new Set(Object.keys(featured_categories)); @@ -958,6 +970,7 @@ export default function Uses() { data-bs-target="#categoryFilterModal" aria-haspopup="dialog" aria-controls="categoryFilterModal" + aria-expanded={filterModalOpen} >
+

+ {translate("Filter by Categories")} +