Skip to content

Commit c9fe848

Browse files
committed
accessibility fixup
make focus go back to map when info box closes previously keyboard-only users would get stuck after opening infobox
1 parent c64a411 commit c9fe848

File tree

2 files changed

+45
-20
lines changed

2 files changed

+45
-20
lines changed

src/components/InfoBox.js

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,55 +12,77 @@ import "./InfoBox.scss";
1212
const TRANSITION_SPEED = 500;
1313

1414
export default function InfoBox({ desc, displayMode, title, url }) {
15-
const [hidden, setHidden] = useState(true);
15+
const [closed, setClosed] = useState(true);
1616

1717
const ref = useRef(null);
1818

19+
const setKeyboardUser = (e) => {
20+
const body = document.body;
21+
22+
if (e.keyCode === 9) {
23+
body.classList.add("using-keyboard");
24+
}
25+
};
26+
27+
useEffect(() => {
28+
const map = document.getElementsByClassName("leaflet-container")[0];
29+
30+
map.addEventListener("keyup", setKeyboardUser);
31+
32+
return () => {
33+
map.removeEventListener("keyup", setKeyboardUser);
34+
};
35+
}, []);
36+
1937
useEffect(() => {
2038
const intro = document.querySelector(".leaflet-control-zoom");
2139
const height = ref.current.clientHeight;
2240

2341
if (!height || !intro) return;
2442

25-
if (hidden) {
43+
if (closed) {
2644
intro.style.transition = "margin 300ms";
2745
intro.style.marginBottom = "80px"; // .leaflet-bottom .leaflet-control in App.scss
2846
} else {
2947
intro.style.transition = "margin 300ms 200ms";
3048
intro.style.marginBottom = `${height + 64}px`;
3149
}
32-
}, [hidden]);
50+
}, [closed]);
3351

3452
useEffect(() => {
3553
const body = document.body;
3654
body.classList.add("overflow-hidden");
3755

3856
const map = document.getElementsByClassName("leaflet-container")[0];
3957

40-
const handleClick = () => {
41-
setHidden(!hidden);
58+
const handleMapClick = () => {
59+
setClosed(!closed);
4260
};
4361

44-
if (hidden) {
45-
map.removeEventListener("click", handleClick);
46-
map.removeEventListener("touchstart", handleClick);
47-
map.removeEventListener("touchmove", handleClick);
48-
return;
62+
if (closed) {
63+
document.querySelector(".leaflet-container").focus();
64+
map.removeEventListener("click", handleMapClick);
65+
map.removeEventListener("touchstart", handleMapClick);
66+
map.removeEventListener("touchmove", handleMapClick);
67+
} else {
68+
map.addEventListener("click", handleMapClick);
69+
map.addEventListener("touchstart", handleMapClick);
70+
map.addEventListener("touchmove", handleMapClick);
4971
}
5072

51-
window.setTimeout(() => {
52-
map.addEventListener("click", handleClick);
53-
map.addEventListener("touchstart", handleClick);
54-
map.addEventListener("touchmove", handleClick);
55-
}, 100);
56-
}, [hidden]);
73+
return () => {
74+
map.removeEventListener("click", handleMapClick);
75+
map.removeEventListener("touchstart", handleMapClick);
76+
map.removeEventListener("touchmove", handleMapClick);
77+
};
78+
}, [closed]);
5779

5880
return (
59-
<CSSTransition in={!hidden} timeout={TRANSITION_SPEED}>
81+
<CSSTransition in={!closed} timeout={TRANSITION_SPEED}>
6082
<div>
6183
<InfoButton
6284
displayMode={displayMode}
63-
handleClick={() => setHidden(!hidden)}
85+
handleClick={() => setClosed(!closed)}
6486
/>
6587
<div ref={ref} className={classNames("info-wrapper", displayMode)}>
6688
<div className="info-title">

src/components/InfoButton.scss

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
border: 0;
77
outline: 0;
88
width: 340px;
9-
position: absolute;
9+
position: fixed;
1010
left: 0;
1111
right: 0;
1212
bottom: -20px; // this svg has extra padding in the image
@@ -15,13 +15,16 @@
1515
text-align: center;
1616
z-index: $z-index-map;
1717

18+
1819
@media (min-width: $mobile_breakpoint) {
1920
bottom: -40px; // this svg has extra padding in the image
2021

2122
}
2223
}
2324

24-
25+
.using-keyboard .info-button:focus {
26+
border: 1px solid blue;
27+
}
2528

2629
.info-button:hover {
2730
cursor: pointer;

0 commit comments

Comments
 (0)