File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 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+ } ;
Original file line number Diff line number Diff line change @@ -4,6 +4,7 @@ import { FC } from "react";
44import { MapContainer } from "react-leaflet" ;
55
66import { CONFIG } from "./config" ;
7+ import { ControlTabOrder } from "./ControlTabOrder" ;
78import { HeightContainer } from "./HeightContainer" ;
89import { KeyboardZoomController } from "./KeyboardZoomController" ;
910import { Layer } from "./Layer" ;
@@ -14,6 +15,7 @@ import { ZoomControls } from "./ZoomControls";
1415export const Geomap : FC = ( ) => (
1516 < HeightContainer >
1617 < MapContainer { ...CONFIG } className = "geomap_container" >
18+ < ControlTabOrder />
1719 < SelectionResetHandler />
1820 < ZoomControls />
1921 < KeyboardZoomController />
You can’t perform that action at this time.
0 commit comments