Skip to content

Commit 2e84fd1

Browse files
committed
feat: tabIndex for map controls
1 parent 8638f8f commit 2e84fd1

2 files changed

Lines changed: 49 additions & 0 deletions

File tree

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { FC, useEffect } from "react";
2+
import { useMap } from "react-leaflet";
3+
4+
/**
5+
* Why this component is needed?
6+
*
7+
* Leaflet appends `.leaflet-control-container` after `.leaflet-map-pane`, so default
8+
* Tab order visits map markers before zoom/layer controls. Moving the control
9+
* container before the map pane matches expected keyboard order without positive
10+
* tabindex (which would affect the whole document).
11+
*/
12+
export const ControlTabOrder: FC = () => {
13+
const map = useMap();
14+
15+
useEffect(() => {
16+
const reorder = (): void => {
17+
const container = map.getContainer();
18+
const controlContainer = container.querySelector<HTMLElement>(
19+
".leaflet-control-container",
20+
);
21+
const mapPane = container.querySelector<HTMLElement>(".leaflet-map-pane");
22+
23+
if (
24+
!controlContainer ||
25+
!mapPane ||
26+
controlContainer.parentElement !== container ||
27+
mapPane.parentElement !== container
28+
) {
29+
return;
30+
}
31+
32+
if (container.firstElementChild === controlContainer) {
33+
return;
34+
}
35+
36+
container.insertBefore(controlContainer, mapPane);
37+
};
38+
39+
const schedule = (): void => {
40+
requestAnimationFrame(reorder);
41+
};
42+
43+
map.whenReady(schedule);
44+
}, [map]);
45+
46+
return null;
47+
};

vis/js/templates/Geomap/index.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { FC } from "react";
44
import { MapContainer } from "react-leaflet";
55

66
import { CONFIG } from "./config";
7+
import { ControlTabOrder } from "./ControlTabOrder";
78
import { HeightContainer } from "./HeightContainer";
89
import { KeyboardZoomController } from "./KeyboardZoomController";
910
import { Layer } from "./Layer";
@@ -14,6 +15,7 @@ import { ZoomControls } from "./ZoomControls";
1415
export const Geomap: FC = () => (
1516
<HeightContainer>
1617
<MapContainer {...CONFIG} className="geomap_container">
18+
<ControlTabOrder />
1719
<SelectionResetHandler />
1820
<ZoomControls />
1921
<KeyboardZoomController />

0 commit comments

Comments
 (0)