@@ -17,7 +17,7 @@ import { useHead } from '@unhead/vue';
1717import type { GeoJSON } from ' geojson' ;
1818import { LngLatBounds } from ' mapbox-gl' ;
1919import type { VNode } from ' vue' ;
20- import { computed , ref } from ' vue' ;
20+ import { computed , onBeforeUnmount , ref } from ' vue' ;
2121import { nextTick , onMounted , watch } from ' vue' ;
2222
2323import { MapStyle } from ' ../MapStyle' ;
@@ -161,12 +161,10 @@ const props = withDefaults(
161161 mapItems: MapItem [];
162162 terrain? : boolean ;
163163 mapStyle: MapStyle ;
164- sidebarOverlaySize? : DOMRectReadOnly ;
165164 }>(),
166165 {
167166 selected : () => [],
168167 terrain: false ,
169- sidebarOverlaySize: undefined ,
170168 },
171169);
172170
@@ -235,7 +233,7 @@ function optimiseViewport(map: mapboxgl.Map, bounds: LngLatBounds) {
235233
236234 const aspectRatio = (northWest .y - southEast .y ) / (northWest .x - southEast .x );
237235
238- const topLeft = props . sidebarOverlaySize ;
236+ const topLeft = container . value ?. querySelector ( ' .mapboxgl-ctrl-top-left ' ) ;
239237 const topRight = container .value ?.querySelector (' .mapboxgl-ctrl-top-right' );
240238 const bottomLeft = container .value ?.querySelector (' .mapboxgl-ctrl-bottom-left' );
241239 const bottomRight = container .value ?.querySelector (' .mapboxgl-ctrl-bottom-right' );
@@ -246,7 +244,7 @@ function optimiseViewport(map: mapboxgl.Map, bounds: LngLatBounds) {
246244 new Viewport (width , height , { left: padding , top: padding , bottom: padding , right: padding }),
247245 ]
248246 .flatMap ((viewport ) =>
249- [{ top: topLeft ?.height }, { left: topLeft ?.width ?? 0 }].map ((offset ) =>
247+ [{ top: topLeft ?.clientHeight }, { left: topLeft ?.clientWidth ?? 0 }].map ((offset ) =>
250248 viewport .withOffset (offset ),
251249 ),
252250 )
@@ -315,6 +313,16 @@ function zoomToSelection(): void {
315313 flyTo (selectedMapItems .value , true );
316314}
317315
316+ const resizeHandler = () => map .value ?.resize ();
317+
318+ onMounted (() => {
319+ window .addEventListener (' transitionend' , resizeHandler , { passive: true });
320+ });
321+
322+ onBeforeUnmount (() => {
323+ window .removeEventListener (' transitionend' , resizeHandler );
324+ });
325+
318326function applyMapItems(next : MapItem [], sourceID : string ): void {
319327 const source = map .value ?.getSource (sourceID );
320328 (source as mapboxgl .GeoJSONSource )?.setData (makeGeoJsonData (next ));
@@ -430,5 +438,32 @@ defineExpose({ zoomToSelection });
430438.mapboxgl-canvas {
431439 cursor : pointer ;
432440 outline : none ;
441+ left : 0 ;
442+ right : 0 ;
443+ margin-left : 50% ;
444+ transform : translateX (-50% );
445+ }
446+
447+ .mapboxgl-ctrl-top-right {
448+ padding-top : var (--top-safe-area );
449+ }
450+
451+ .mapboxgl-ctrl-top-right {
452+ padding-top : var (--top-safe-area );
453+ }
454+
455+ .mapboxgl-ctrl-top-left {
456+ padding-top : max (var (--top-safe-area ), var (--sidebar-overlay-height , 0 ));
457+ padding-left : var (--sidebar-overlay-width , 0 );
458+ }
459+
460+ .mapboxgl-ctrl-bottom-left ,
461+ .mapboxgl-ctrl-bottom-right {
462+ padding-bottom : var (--bottom-safe-area );
463+ }
464+
465+ .mapboxgl-ctrl-top-right ,
466+ .mapboxgl-ctrl-bottom-right {
467+ padding-right : var (--right-safe-area );
433468}
434469 </style >
0 commit comments