@page-speed/maps 0.1.5 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -410,11 +410,55 @@ function MapLibre({
410
410
  }
411
411
  return getMapLibreStyleUrl("osm-bright", stadiaApiKey);
412
412
  }, [mapStyle, stadiaApiKey, styleUrl]);
413
+ const isInIframe = React.useMemo(() => {
414
+ if (typeof window === "undefined") return false;
415
+ try {
416
+ return window.self !== window.top;
417
+ } catch {
418
+ return true;
419
+ }
420
+ }, []);
421
+ React.useEffect(() => {
422
+ if (!isInIframe || !mapRef.current) return;
423
+ let lastHeight = 0;
424
+ let lastWidth = 0;
425
+ let resizeTimeout;
426
+ const handleResize = (entries) => {
427
+ clearTimeout(resizeTimeout);
428
+ const entry = entries[0];
429
+ if (!entry) return;
430
+ const { width, height } = entry.contentRect;
431
+ const widthChanged = Math.abs(width - lastWidth) > 1;
432
+ const heightChanged = Math.abs(height - lastHeight) > 1;
433
+ if (widthChanged || heightChanged) {
434
+ lastWidth = width;
435
+ lastHeight = height;
436
+ resizeTimeout = setTimeout(() => {
437
+ mapRef.current?.resize();
438
+ }, 250);
439
+ }
440
+ };
441
+ const parentElement = mapRef.current.getContainer().parentElement;
442
+ if (parentElement) {
443
+ const resizeObserver = new ResizeObserver(handleResize);
444
+ resizeObserver.observe(parentElement);
445
+ return () => {
446
+ clearTimeout(resizeTimeout);
447
+ resizeObserver.disconnect();
448
+ };
449
+ }
450
+ }, [isInIframe]);
413
451
  return /* @__PURE__ */ jsx(
414
452
  "div",
415
453
  {
416
454
  className: joinClassNames("relative w-full h-full", className),
417
- style: { width: "100%", height: "100%", ...style },
455
+ style: {
456
+ width: "100%",
457
+ height: "100%",
458
+ // Prevent content from pushing container size in iframes
459
+ ...isInIframe && { overflow: "hidden", position: "relative" },
460
+ ...style
461
+ },
418
462
  children: /* @__PURE__ */ jsxs(
419
463
  Map,
420
464
  {
@@ -426,7 +470,7 @@ function MapLibre({
426
470
  onMoveEnd: handleMoveEnd,
427
471
  onClick: handleMapClick,
428
472
  attributionControl: false,
429
- trackResize: true,
473
+ trackResize: !isInIframe,
430
474
  dragRotate: false,
431
475
  touchZoomRotate: false,
432
476
  children: [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/getMapLibreStyleUrl.ts","../../src/core/MapLibre.tsx"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["const MAPLIBRE_DEFAULT_STYLE_URL =\n \"https://basemaps.cartocdn.com/gl/positron-gl-style/style.json\";\nconst DEFAULT_STADIA_STYLE_URL =\n \"https://tiles.stadiamaps.com/styles/osm_bright.json\";\n\nconst STYLE_MAP: Record<string, string> = {\n default: DEFAULT_STADIA_STYLE_URL,\n \"alidade-smooth\": \"https://tiles.stadiamaps.com/styles/alidade_smooth.json\",\n \"alidade-smooth-dark\": \"https://tiles.stadiamaps.com/styles/alidade_smooth_dark.json\",\n \"maplibre-default\": MAPLIBRE_DEFAULT_STYLE_URL,\n \"osm-bright\": \"https://tiles.stadiamaps.com/styles/osm_bright.json\",\n \"stadia-outdoors\": \"https://tiles.stadiamaps.com/styles/outdoors.json\",\n \"stamen-toner\": \"https://tiles.stadiamaps.com/styles/stamen_toner.json\",\n \"stamen-terrain\": \"https://tiles.stadiamaps.com/styles/stamen_terrain.json\",\n \"stamen-watercolor\": \"https://tiles.stadiamaps.com/styles/stamen_watercolor.json\"\n};\n\nconst HTTP_URL_REGEX = /^https?:\\/\\//i;\n\nexport type MapLibreBuiltInStyle = keyof typeof STYLE_MAP;\n\nfunction isStadiaMapsUrl(url: string): boolean {\n try {\n const parsed = new URL(url);\n return parsed.hostname === \"tiles.stadiamaps.com\";\n } catch {\n return false;\n }\n}\n\nfunction assertStadiaApiKey(stadiaApiKey: string): void {\n if (!stadiaApiKey.trim()) {\n throw new Error(\n \"A non-empty stadiaApiKey is required for Stadia Maps style URLs.\"\n );\n }\n}\n\nexport function appendStadiaApiKey(\n styleUrl: string,\n stadiaApiKey: string\n): string {\n if (!isStadiaMapsUrl(styleUrl)) {\n return styleUrl;\n }\n\n assertStadiaApiKey(stadiaApiKey);\n\n const parsed = new URL(styleUrl);\n if (!parsed.searchParams.has(\"api_key\")) {\n parsed.searchParams.set(\"api_key\", stadiaApiKey);\n }\n\n return parsed.toString();\n}\n\nexport function getMapLibreStyleUrl(\n value: string | undefined,\n stadiaApiKey: string\n): string {\n const normalizedApiKey = stadiaApiKey.trim();\n\n if (!value || typeof value !== \"string\") {\n if (!normalizedApiKey) {\n return MAPLIBRE_DEFAULT_STYLE_URL;\n }\n return appendStadiaApiKey(DEFAULT_STADIA_STYLE_URL, normalizedApiKey);\n }\n\n if (STYLE_MAP[value]) {\n const mappedStyleUrl = STYLE_MAP[value];\n if (isStadiaMapsUrl(mappedStyleUrl) && !normalizedApiKey) {\n return MAPLIBRE_DEFAULT_STYLE_URL;\n }\n return appendStadiaApiKey(mappedStyleUrl, normalizedApiKey);\n }\n\n if (HTTP_URL_REGEX.test(value)) {\n if (isStadiaMapsUrl(value) && !normalizedApiKey) {\n return MAPLIBRE_DEFAULT_STYLE_URL;\n }\n return appendStadiaApiKey(value, normalizedApiKey);\n }\n\n if (!normalizedApiKey) {\n return MAPLIBRE_DEFAULT_STYLE_URL;\n }\n\n return appendStadiaApiKey(DEFAULT_STADIA_STYLE_URL, normalizedApiKey);\n}\n\nexport { DEFAULT_STADIA_STYLE_URL, MAPLIBRE_DEFAULT_STYLE_URL };\n","import React from \"react\";\nimport {\n GeolocateControl,\n Map,\n Marker,\n NavigationControl,\n type MapRef,\n type ViewStateChangeEvent\n} from \"react-map-gl/maplibre\";\n\nimport type {\n BasicMarkerInput,\n MapLibreFlyToOptions,\n MapLibreMarker,\n MapLibreProps,\n MapViewState\n} from \"../types\";\nimport { appendStadiaApiKey, getMapLibreStyleUrl } from \"../utils\";\n\nconst DEFAULT_MAPLIBRE_CSS_HREF =\n \"https://cdn.jsdelivr.net/npm/maplibre-gl@5.18.0/dist/maplibre-gl.css\";\nconst MAPLIBRE_STYLESHEET_ID = \"page-speed-maplibre-gl-css\";\nconst DEFAULT_FLY_TO_OPTIONS: Readonly<MapLibreFlyToOptions> = Object.freeze({});\nconst VIEW_STATE_COORDINATE_EPSILON = 0.000001;\nconst VIEW_STATE_ZOOM_EPSILON = 0.01;\nconst DEFAULT_FLY_TO_EASING = (t: number): number => 1 - Math.pow(1 - t, 3);\n\nfunction joinClassNames(...classNames: Array<string | undefined>): string {\n return classNames.filter(Boolean).join(\" \");\n}\n\nfunction hasMeaningfulViewStateDelta(\n previous: MapViewState,\n next: MapViewState\n): boolean {\n return (\n Math.abs(previous.latitude - next.latitude) > VIEW_STATE_COORDINATE_EPSILON ||\n Math.abs(previous.longitude - next.longitude) > VIEW_STATE_COORDINATE_EPSILON ||\n Math.abs(previous.zoom - next.zoom) > VIEW_STATE_ZOOM_EPSILON\n );\n}\n\nfunction ensureMapLibreStylesheet(href: string): void {\n if (typeof document === \"undefined\") {\n return;\n }\n\n const existingLink = document.getElementById(MAPLIBRE_STYLESHEET_ID);\n if (existingLink instanceof HTMLLinkElement) {\n if (existingLink.getAttribute(\"href\") !== href) {\n existingLink.setAttribute(\"href\", href);\n }\n return;\n }\n\n const matchingLink = Array.from(\n document.querySelectorAll(\"link[rel='stylesheet']\")\n ).find((link) => link.getAttribute(\"href\") === href);\n\n if (matchingLink instanceof HTMLLinkElement) {\n matchingLink.id = MAPLIBRE_STYLESHEET_ID;\n return;\n }\n\n const stylesheet = document.createElement(\"link\");\n stylesheet.id = MAPLIBRE_STYLESHEET_ID;\n stylesheet.rel = \"stylesheet\";\n stylesheet.href = href;\n stylesheet.dataset.pageSpeedMaps = \"maplibre-css\";\n document.head.appendChild(stylesheet);\n}\n\nfunction DefaultMarker({ marker }: { marker: MapLibreMarker }) {\n return (\n <div\n style={{\n cursor: marker.draggable ? \"grab\" : \"pointer\",\n transform: \"translate(-50%, -100%)\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n position: \"relative\"\n }}\n onClick={marker.onClick}\n >\n <svg\n aria-hidden=\"true\"\n width=\"32\"\n height=\"32\"\n viewBox=\"0 0 24 24\"\n fill={marker.color || \"#3B82F6\"}\n style={{ filter: \"drop-shadow(0 2px 8px rgba(0,0,0,0.35))\" }}\n >\n <path d=\"M12 2C8.13 2 5 5.13 5 9c0 4.85 6.13 12.24 6.39 12.55a.75.75 0 0 0 1.16 0C12.87 21.24 19 13.85 19 9c0-3.87-3.13-7-7-7Zm0 9.75A2.75 2.75 0 1 1 12 6.25a2.75 2.75 0 0 1 0 5.5Z\" />\n </svg>\n {marker.label ? (\n <div\n style={{\n position: \"absolute\",\n bottom: -28,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n background: \"#FFFFFF\",\n borderRadius: 6,\n padding: \"2px 8px\",\n fontSize: 12,\n fontWeight: 500,\n whiteSpace: \"nowrap\",\n boxShadow: \"0 3px 10px rgba(0, 0, 0, 0.2)\"\n }}\n >\n {marker.label}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction normalizeMarkers(\n markers: (MapLibreMarker | BasicMarkerInput)[]\n): MapLibreMarker[] {\n return markers.map((marker, index) => {\n if (\n (marker as MapLibreMarker).lat !== undefined &&\n (marker as MapLibreMarker).lng !== undefined\n ) {\n return marker as MapLibreMarker;\n }\n\n const basicMarker = marker as BasicMarkerInput;\n return {\n id: basicMarker.id ?? index,\n lat: basicMarker.latitude,\n lng: basicMarker.longitude,\n color: basicMarker.color,\n draggable: basicMarker.draggable,\n label: basicMarker.label,\n element: basicMarker.element,\n onClick: basicMarker.onClick\n };\n });\n}\n\nexport function MapLibre({\n stadiaApiKey,\n mapLibreCssHref,\n viewState,\n onViewStateChange,\n mapStyle,\n center = viewState\n ? { lat: viewState.latitude ?? 0, lng: viewState.longitude ?? 0 }\n : { lat: 0, lng: 0 },\n zoom = viewState?.zoom ?? 14,\n styleUrl,\n markers = [],\n onMoveEnd,\n onClick,\n onMarkerDrag,\n className,\n style,\n children,\n showNavigationControl = true,\n showGeolocateControl = false,\n navigationControlPosition = \"bottom-right\",\n geolocateControlPosition = \"top-left\",\n flyToOptions = DEFAULT_FLY_TO_OPTIONS\n}: MapLibreProps) {\n const mapRef = React.useRef<MapRef>(null);\n const resolvedMapLibreCssHref =\n mapLibreCssHref && mapLibreCssHref.trim().length > 0\n ? mapLibreCssHref\n : DEFAULT_MAPLIBRE_CSS_HREF;\n\n const [internalViewState, setInternalViewState] = React.useState<MapViewState>({\n latitude: viewState?.latitude ?? center.lat,\n longitude: viewState?.longitude ?? center.lng,\n zoom: viewState?.zoom ?? zoom\n });\n\n const isUserInteracting = React.useRef(false);\n const isMarkerDragging = React.useRef(false);\n const dragAnimationFrame = React.useRef<number | null>(null);\n const lastReportedViewState = React.useRef<MapViewState | null>(null);\n\n const resolvedFlyToOptions = React.useMemo(\n () => ({\n speed: flyToOptions.speed ?? 0.8,\n curve: flyToOptions.curve ?? 1.2,\n bearing: flyToOptions.bearing ?? 0,\n easing: flyToOptions.easing ?? DEFAULT_FLY_TO_EASING\n }),\n [\n flyToOptions.bearing,\n flyToOptions.curve,\n flyToOptions.easing,\n flyToOptions.speed\n ]\n );\n\n React.useEffect(() => {\n ensureMapLibreStylesheet(resolvedMapLibreCssHref);\n }, [resolvedMapLibreCssHref]);\n\n React.useEffect(() => {\n if (\n !mapRef.current ||\n !viewState ||\n isUserInteracting.current ||\n isMarkerDragging.current\n ) {\n return;\n }\n\n setInternalViewState((previous) => {\n const next = {\n latitude: viewState.latitude ?? previous.latitude,\n longitude: viewState.longitude ?? previous.longitude,\n zoom: viewState.zoom ?? previous.zoom\n };\n\n const hasChanged = hasMeaningfulViewStateDelta(previous, next);\n\n if (!hasChanged) {\n return previous;\n }\n\n const isEchoedMoveState =\n !!lastReportedViewState.current &&\n !hasMeaningfulViewStateDelta(lastReportedViewState.current, next);\n\n if (!isEchoedMoveState) {\n mapRef.current?.flyTo({\n center: [next.longitude, next.latitude],\n zoom: next.zoom,\n speed: resolvedFlyToOptions.speed,\n curve: resolvedFlyToOptions.curve,\n bearing: resolvedFlyToOptions.bearing,\n easing: resolvedFlyToOptions.easing,\n essential: true\n });\n }\n\n return next;\n });\n }, [\n resolvedFlyToOptions,\n viewState?.latitude,\n viewState?.longitude,\n viewState?.zoom\n ]);\n\n const handleMoveStart = React.useCallback(() => {\n isUserInteracting.current = true;\n }, []);\n\n const handleMove = React.useCallback(\n (event: ViewStateChangeEvent) => {\n const nextViewState = event.viewState;\n setInternalViewState({\n latitude: nextViewState.latitude,\n longitude: nextViewState.longitude,\n zoom: nextViewState.zoom\n });\n\n const roundedViewState = {\n latitude: Number(nextViewState.latitude.toFixed(6)),\n longitude: Number(nextViewState.longitude.toFixed(6)),\n zoom: Number(nextViewState.zoom.toFixed(2))\n };\n\n lastReportedViewState.current = roundedViewState;\n onViewStateChange?.(roundedViewState);\n },\n [onViewStateChange]\n );\n\n const handleMoveEnd = React.useCallback(\n (event: ViewStateChangeEvent) => {\n isUserInteracting.current = false;\n\n if (!onMoveEnd) {\n return;\n }\n\n const map = event.target;\n const nextCenter = map.getCenter();\n const nextZoom = map.getZoom();\n const bounds = map.getBounds();\n\n onMoveEnd(\n {\n lat: Number(nextCenter.lat.toFixed(6)),\n lng: Number(nextCenter.lng.toFixed(6))\n },\n Number(nextZoom.toFixed(2)),\n bounds\n );\n },\n [onMoveEnd]\n );\n\n const handleMapClick = React.useCallback(\n (event: { lngLat: { lng: number; lat: number } }) => {\n if (!onClick) {\n return;\n }\n\n onClick({ latitude: event.lngLat.lat, longitude: event.lngLat.lng });\n },\n [onClick]\n );\n\n const normalizedMarkers = React.useMemo(\n () => normalizeMarkers(markers),\n [markers]\n );\n\n const markerElements = React.useMemo(\n () =>\n normalizedMarkers.map((marker) => (\n <Marker\n key={marker.id}\n longitude={marker.lng}\n latitude={marker.lat}\n draggable={marker.draggable}\n onDragStart={() => {\n isMarkerDragging.current = true;\n }}\n onDrag={(event) => {\n if (!mapRef.current) {\n return;\n }\n\n const nextLngLat = (event as { lngLat?: { lng?: number; lat?: number } }).lngLat;\n if (!nextLngLat || nextLngLat.lng === undefined || nextLngLat.lat === undefined) {\n return;\n }\n const draggedLng = nextLngLat.lng;\n const draggedLat = nextLngLat.lat;\n\n if (dragAnimationFrame.current) {\n cancelAnimationFrame(dragAnimationFrame.current);\n }\n\n dragAnimationFrame.current = requestAnimationFrame(() => {\n if (!mapRef.current) {\n return;\n }\n\n const bounds = mapRef.current.getBounds();\n const viewportWidth = bounds.getEast() - bounds.getWest();\n const viewportHeight = bounds.getNorth() - bounds.getSouth();\n\n const edgePadding = 0.1;\n const westThreshold = bounds.getWest() + viewportWidth * edgePadding;\n const eastThreshold = bounds.getEast() - viewportWidth * edgePadding;\n const southThreshold = bounds.getSouth() + viewportHeight * edgePadding;\n const northThreshold = bounds.getNorth() - viewportHeight * edgePadding;\n\n const nearWestEdge = draggedLng < westThreshold;\n const nearEastEdge = draggedLng > eastThreshold;\n const nearSouthEdge = draggedLat < southThreshold;\n const nearNorthEdge = draggedLat > northThreshold;\n\n if (!nearWestEdge && !nearEastEdge && !nearSouthEdge && !nearNorthEdge) {\n return;\n }\n\n let panLng = draggedLng;\n let panLat = draggedLat;\n const offsetAmount = 0.2;\n\n if (nearWestEdge) {\n panLng = draggedLng - viewportWidth * offsetAmount;\n }\n if (nearEastEdge) {\n panLng = draggedLng + viewportWidth * offsetAmount;\n }\n if (nearSouthEdge) {\n panLat = draggedLat - viewportHeight * offsetAmount;\n }\n if (nearNorthEdge) {\n panLat = draggedLat + viewportHeight * offsetAmount;\n }\n\n mapRef.current?.easeTo({\n center: [panLng, panLat],\n duration: 200\n });\n });\n }}\n onDragEnd={(event) => {\n isMarkerDragging.current = false;\n\n if (dragAnimationFrame.current) {\n cancelAnimationFrame(dragAnimationFrame.current);\n dragAnimationFrame.current = null;\n }\n\n if (!onMarkerDrag) {\n return;\n }\n\n const nextLngLat = (event as { lngLat?: { lng?: number; lat?: number } }).lngLat;\n if (!nextLngLat || nextLngLat.lng === undefined || nextLngLat.lat === undefined) {\n return;\n }\n\n onMarkerDrag(marker.id ?? null, {\n latitude: nextLngLat.lat,\n longitude: nextLngLat.lng\n });\n }}\n >\n {marker.element\n ? typeof marker.element === \"function\"\n ? marker.element()\n : marker.element\n : <DefaultMarker marker={marker} />}\n </Marker>\n )),\n [normalizedMarkers, onMarkerDrag]\n );\n\n const resolvedMapStyleUrl = React.useMemo(() => {\n if (styleUrl) {\n return appendStadiaApiKey(styleUrl, stadiaApiKey);\n }\n\n if (mapStyle) {\n return getMapLibreStyleUrl(mapStyle, stadiaApiKey);\n }\n\n return getMapLibreStyleUrl(\"osm-bright\", stadiaApiKey);\n }, [mapStyle, stadiaApiKey, styleUrl]);\n\n return (\n <div\n className={joinClassNames(\"relative w-full h-full\", className)}\n style={{ width: \"100%\", height: \"100%\", ...style }}\n >\n <Map\n ref={mapRef}\n {...internalViewState}\n mapStyle={resolvedMapStyleUrl}\n onMoveStart={handleMoveStart}\n onMove={handleMove}\n onMoveEnd={handleMoveEnd}\n onClick={handleMapClick}\n attributionControl={false}\n trackResize\n dragRotate={false}\n touchZoomRotate={false}\n >\n {showGeolocateControl ? (\n <GeolocateControl position={geolocateControlPosition} />\n ) : null}\n\n {showNavigationControl ? (\n <NavigationControl position={navigationControlPosition} />\n ) : null}\n\n {markerElements}\n\n {children}\n </Map>\n </div>\n );\n}\n\nexport const DTMapLibreMap = MapLibre;\n"]}
1
+ {"version":3,"sources":["../../src/utils/getMapLibreStyleUrl.ts","../../src/core/MapLibre.tsx"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["const MAPLIBRE_DEFAULT_STYLE_URL =\n \"https://basemaps.cartocdn.com/gl/positron-gl-style/style.json\";\nconst DEFAULT_STADIA_STYLE_URL =\n \"https://tiles.stadiamaps.com/styles/osm_bright.json\";\n\nconst STYLE_MAP: Record<string, string> = {\n default: DEFAULT_STADIA_STYLE_URL,\n \"alidade-smooth\": \"https://tiles.stadiamaps.com/styles/alidade_smooth.json\",\n \"alidade-smooth-dark\": \"https://tiles.stadiamaps.com/styles/alidade_smooth_dark.json\",\n \"maplibre-default\": MAPLIBRE_DEFAULT_STYLE_URL,\n \"osm-bright\": \"https://tiles.stadiamaps.com/styles/osm_bright.json\",\n \"stadia-outdoors\": \"https://tiles.stadiamaps.com/styles/outdoors.json\",\n \"stamen-toner\": \"https://tiles.stadiamaps.com/styles/stamen_toner.json\",\n \"stamen-terrain\": \"https://tiles.stadiamaps.com/styles/stamen_terrain.json\",\n \"stamen-watercolor\": \"https://tiles.stadiamaps.com/styles/stamen_watercolor.json\"\n};\n\nconst HTTP_URL_REGEX = /^https?:\\/\\//i;\n\nexport type MapLibreBuiltInStyle = keyof typeof STYLE_MAP;\n\nfunction isStadiaMapsUrl(url: string): boolean {\n try {\n const parsed = new URL(url);\n return parsed.hostname === \"tiles.stadiamaps.com\";\n } catch {\n return false;\n }\n}\n\nfunction assertStadiaApiKey(stadiaApiKey: string): void {\n if (!stadiaApiKey.trim()) {\n throw new Error(\n \"A non-empty stadiaApiKey is required for Stadia Maps style URLs.\"\n );\n }\n}\n\nexport function appendStadiaApiKey(\n styleUrl: string,\n stadiaApiKey: string\n): string {\n if (!isStadiaMapsUrl(styleUrl)) {\n return styleUrl;\n }\n\n assertStadiaApiKey(stadiaApiKey);\n\n const parsed = new URL(styleUrl);\n if (!parsed.searchParams.has(\"api_key\")) {\n parsed.searchParams.set(\"api_key\", stadiaApiKey);\n }\n\n return parsed.toString();\n}\n\nexport function getMapLibreStyleUrl(\n value: string | undefined,\n stadiaApiKey: string\n): string {\n const normalizedApiKey = stadiaApiKey.trim();\n\n if (!value || typeof value !== \"string\") {\n if (!normalizedApiKey) {\n return MAPLIBRE_DEFAULT_STYLE_URL;\n }\n return appendStadiaApiKey(DEFAULT_STADIA_STYLE_URL, normalizedApiKey);\n }\n\n if (STYLE_MAP[value]) {\n const mappedStyleUrl = STYLE_MAP[value];\n if (isStadiaMapsUrl(mappedStyleUrl) && !normalizedApiKey) {\n return MAPLIBRE_DEFAULT_STYLE_URL;\n }\n return appendStadiaApiKey(mappedStyleUrl, normalizedApiKey);\n }\n\n if (HTTP_URL_REGEX.test(value)) {\n if (isStadiaMapsUrl(value) && !normalizedApiKey) {\n return MAPLIBRE_DEFAULT_STYLE_URL;\n }\n return appendStadiaApiKey(value, normalizedApiKey);\n }\n\n if (!normalizedApiKey) {\n return MAPLIBRE_DEFAULT_STYLE_URL;\n }\n\n return appendStadiaApiKey(DEFAULT_STADIA_STYLE_URL, normalizedApiKey);\n}\n\nexport { DEFAULT_STADIA_STYLE_URL, MAPLIBRE_DEFAULT_STYLE_URL };\n","import React from \"react\";\nimport {\n GeolocateControl,\n Map,\n Marker,\n NavigationControl,\n type MapRef,\n type ViewStateChangeEvent\n} from \"react-map-gl/maplibre\";\n\nimport type {\n BasicMarkerInput,\n MapLibreFlyToOptions,\n MapLibreMarker,\n MapLibreProps,\n MapViewState\n} from \"../types\";\nimport { appendStadiaApiKey, getMapLibreStyleUrl } from \"../utils\";\n\nconst DEFAULT_MAPLIBRE_CSS_HREF =\n \"https://cdn.jsdelivr.net/npm/maplibre-gl@5.18.0/dist/maplibre-gl.css\";\nconst MAPLIBRE_STYLESHEET_ID = \"page-speed-maplibre-gl-css\";\nconst DEFAULT_FLY_TO_OPTIONS: Readonly<MapLibreFlyToOptions> = Object.freeze({});\nconst VIEW_STATE_COORDINATE_EPSILON = 0.000001;\nconst VIEW_STATE_ZOOM_EPSILON = 0.01;\nconst DEFAULT_FLY_TO_EASING = (t: number): number => 1 - Math.pow(1 - t, 3);\n\nfunction joinClassNames(...classNames: Array<string | undefined>): string {\n return classNames.filter(Boolean).join(\" \");\n}\n\nfunction hasMeaningfulViewStateDelta(\n previous: MapViewState,\n next: MapViewState\n): boolean {\n return (\n Math.abs(previous.latitude - next.latitude) > VIEW_STATE_COORDINATE_EPSILON ||\n Math.abs(previous.longitude - next.longitude) > VIEW_STATE_COORDINATE_EPSILON ||\n Math.abs(previous.zoom - next.zoom) > VIEW_STATE_ZOOM_EPSILON\n );\n}\n\nfunction ensureMapLibreStylesheet(href: string): void {\n if (typeof document === \"undefined\") {\n return;\n }\n\n const existingLink = document.getElementById(MAPLIBRE_STYLESHEET_ID);\n if (existingLink instanceof HTMLLinkElement) {\n if (existingLink.getAttribute(\"href\") !== href) {\n existingLink.setAttribute(\"href\", href);\n }\n return;\n }\n\n const matchingLink = Array.from(\n document.querySelectorAll(\"link[rel='stylesheet']\")\n ).find((link) => link.getAttribute(\"href\") === href);\n\n if (matchingLink instanceof HTMLLinkElement) {\n matchingLink.id = MAPLIBRE_STYLESHEET_ID;\n return;\n }\n\n const stylesheet = document.createElement(\"link\");\n stylesheet.id = MAPLIBRE_STYLESHEET_ID;\n stylesheet.rel = \"stylesheet\";\n stylesheet.href = href;\n stylesheet.dataset.pageSpeedMaps = \"maplibre-css\";\n document.head.appendChild(stylesheet);\n}\n\nfunction DefaultMarker({ marker }: { marker: MapLibreMarker }) {\n return (\n <div\n style={{\n cursor: marker.draggable ? \"grab\" : \"pointer\",\n transform: \"translate(-50%, -100%)\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n position: \"relative\"\n }}\n onClick={marker.onClick}\n >\n <svg\n aria-hidden=\"true\"\n width=\"32\"\n height=\"32\"\n viewBox=\"0 0 24 24\"\n fill={marker.color || \"#3B82F6\"}\n style={{ filter: \"drop-shadow(0 2px 8px rgba(0,0,0,0.35))\" }}\n >\n <path d=\"M12 2C8.13 2 5 5.13 5 9c0 4.85 6.13 12.24 6.39 12.55a.75.75 0 0 0 1.16 0C12.87 21.24 19 13.85 19 9c0-3.87-3.13-7-7-7Zm0 9.75A2.75 2.75 0 1 1 12 6.25a2.75 2.75 0 0 1 0 5.5Z\" />\n </svg>\n {marker.label ? (\n <div\n style={{\n position: \"absolute\",\n bottom: -28,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n background: \"#FFFFFF\",\n borderRadius: 6,\n padding: \"2px 8px\",\n fontSize: 12,\n fontWeight: 500,\n whiteSpace: \"nowrap\",\n boxShadow: \"0 3px 10px rgba(0, 0, 0, 0.2)\"\n }}\n >\n {marker.label}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction normalizeMarkers(\n markers: (MapLibreMarker | BasicMarkerInput)[]\n): MapLibreMarker[] {\n return markers.map((marker, index) => {\n if (\n (marker as MapLibreMarker).lat !== undefined &&\n (marker as MapLibreMarker).lng !== undefined\n ) {\n return marker as MapLibreMarker;\n }\n\n const basicMarker = marker as BasicMarkerInput;\n return {\n id: basicMarker.id ?? index,\n lat: basicMarker.latitude,\n lng: basicMarker.longitude,\n color: basicMarker.color,\n draggable: basicMarker.draggable,\n label: basicMarker.label,\n element: basicMarker.element,\n onClick: basicMarker.onClick\n };\n });\n}\n\nexport function MapLibre({\n stadiaApiKey,\n mapLibreCssHref,\n viewState,\n onViewStateChange,\n mapStyle,\n center = viewState\n ? { lat: viewState.latitude ?? 0, lng: viewState.longitude ?? 0 }\n : { lat: 0, lng: 0 },\n zoom = viewState?.zoom ?? 14,\n styleUrl,\n markers = [],\n onMoveEnd,\n onClick,\n onMarkerDrag,\n className,\n style,\n children,\n showNavigationControl = true,\n showGeolocateControl = false,\n navigationControlPosition = \"bottom-right\",\n geolocateControlPosition = \"top-left\",\n flyToOptions = DEFAULT_FLY_TO_OPTIONS\n}: MapLibreProps) {\n const mapRef = React.useRef<MapRef>(null);\n const resolvedMapLibreCssHref =\n mapLibreCssHref && mapLibreCssHref.trim().length > 0\n ? mapLibreCssHref\n : DEFAULT_MAPLIBRE_CSS_HREF;\n\n const [internalViewState, setInternalViewState] = React.useState<MapViewState>({\n latitude: viewState?.latitude ?? center.lat,\n longitude: viewState?.longitude ?? center.lng,\n zoom: viewState?.zoom ?? zoom\n });\n\n const isUserInteracting = React.useRef(false);\n const isMarkerDragging = React.useRef(false);\n const dragAnimationFrame = React.useRef<number | null>(null);\n const lastReportedViewState = React.useRef<MapViewState | null>(null);\n\n const resolvedFlyToOptions = React.useMemo(\n () => ({\n speed: flyToOptions.speed ?? 0.8,\n curve: flyToOptions.curve ?? 1.2,\n bearing: flyToOptions.bearing ?? 0,\n easing: flyToOptions.easing ?? DEFAULT_FLY_TO_EASING\n }),\n [\n flyToOptions.bearing,\n flyToOptions.curve,\n flyToOptions.easing,\n flyToOptions.speed\n ]\n );\n\n React.useEffect(() => {\n ensureMapLibreStylesheet(resolvedMapLibreCssHref);\n }, [resolvedMapLibreCssHref]);\n\n React.useEffect(() => {\n if (\n !mapRef.current ||\n !viewState ||\n isUserInteracting.current ||\n isMarkerDragging.current\n ) {\n return;\n }\n\n setInternalViewState((previous) => {\n const next = {\n latitude: viewState.latitude ?? previous.latitude,\n longitude: viewState.longitude ?? previous.longitude,\n zoom: viewState.zoom ?? previous.zoom\n };\n\n const hasChanged = hasMeaningfulViewStateDelta(previous, next);\n\n if (!hasChanged) {\n return previous;\n }\n\n const isEchoedMoveState =\n !!lastReportedViewState.current &&\n !hasMeaningfulViewStateDelta(lastReportedViewState.current, next);\n\n if (!isEchoedMoveState) {\n mapRef.current?.flyTo({\n center: [next.longitude, next.latitude],\n zoom: next.zoom,\n speed: resolvedFlyToOptions.speed,\n curve: resolvedFlyToOptions.curve,\n bearing: resolvedFlyToOptions.bearing,\n easing: resolvedFlyToOptions.easing,\n essential: true\n });\n }\n\n return next;\n });\n }, [\n resolvedFlyToOptions,\n viewState?.latitude,\n viewState?.longitude,\n viewState?.zoom\n ]);\n\n const handleMoveStart = React.useCallback(() => {\n isUserInteracting.current = true;\n }, []);\n\n const handleMove = React.useCallback(\n (event: ViewStateChangeEvent) => {\n const nextViewState = event.viewState;\n setInternalViewState({\n latitude: nextViewState.latitude,\n longitude: nextViewState.longitude,\n zoom: nextViewState.zoom\n });\n\n const roundedViewState = {\n latitude: Number(nextViewState.latitude.toFixed(6)),\n longitude: Number(nextViewState.longitude.toFixed(6)),\n zoom: Number(nextViewState.zoom.toFixed(2))\n };\n\n lastReportedViewState.current = roundedViewState;\n onViewStateChange?.(roundedViewState);\n },\n [onViewStateChange]\n );\n\n const handleMoveEnd = React.useCallback(\n (event: ViewStateChangeEvent) => {\n isUserInteracting.current = false;\n\n if (!onMoveEnd) {\n return;\n }\n\n const map = event.target;\n const nextCenter = map.getCenter();\n const nextZoom = map.getZoom();\n const bounds = map.getBounds();\n\n onMoveEnd(\n {\n lat: Number(nextCenter.lat.toFixed(6)),\n lng: Number(nextCenter.lng.toFixed(6))\n },\n Number(nextZoom.toFixed(2)),\n bounds\n );\n },\n [onMoveEnd]\n );\n\n const handleMapClick = React.useCallback(\n (event: { lngLat: { lng: number; lat: number } }) => {\n if (!onClick) {\n return;\n }\n\n onClick({ latitude: event.lngLat.lat, longitude: event.lngLat.lng });\n },\n [onClick]\n );\n\n const normalizedMarkers = React.useMemo(\n () => normalizeMarkers(markers),\n [markers]\n );\n\n const markerElements = React.useMemo(\n () =>\n normalizedMarkers.map((marker) => (\n <Marker\n key={marker.id}\n longitude={marker.lng}\n latitude={marker.lat}\n draggable={marker.draggable}\n onDragStart={() => {\n isMarkerDragging.current = true;\n }}\n onDrag={(event) => {\n if (!mapRef.current) {\n return;\n }\n\n const nextLngLat = (event as { lngLat?: { lng?: number; lat?: number } }).lngLat;\n if (!nextLngLat || nextLngLat.lng === undefined || nextLngLat.lat === undefined) {\n return;\n }\n const draggedLng = nextLngLat.lng;\n const draggedLat = nextLngLat.lat;\n\n if (dragAnimationFrame.current) {\n cancelAnimationFrame(dragAnimationFrame.current);\n }\n\n dragAnimationFrame.current = requestAnimationFrame(() => {\n if (!mapRef.current) {\n return;\n }\n\n const bounds = mapRef.current.getBounds();\n const viewportWidth = bounds.getEast() - bounds.getWest();\n const viewportHeight = bounds.getNorth() - bounds.getSouth();\n\n const edgePadding = 0.1;\n const westThreshold = bounds.getWest() + viewportWidth * edgePadding;\n const eastThreshold = bounds.getEast() - viewportWidth * edgePadding;\n const southThreshold = bounds.getSouth() + viewportHeight * edgePadding;\n const northThreshold = bounds.getNorth() - viewportHeight * edgePadding;\n\n const nearWestEdge = draggedLng < westThreshold;\n const nearEastEdge = draggedLng > eastThreshold;\n const nearSouthEdge = draggedLat < southThreshold;\n const nearNorthEdge = draggedLat > northThreshold;\n\n if (!nearWestEdge && !nearEastEdge && !nearSouthEdge && !nearNorthEdge) {\n return;\n }\n\n let panLng = draggedLng;\n let panLat = draggedLat;\n const offsetAmount = 0.2;\n\n if (nearWestEdge) {\n panLng = draggedLng - viewportWidth * offsetAmount;\n }\n if (nearEastEdge) {\n panLng = draggedLng + viewportWidth * offsetAmount;\n }\n if (nearSouthEdge) {\n panLat = draggedLat - viewportHeight * offsetAmount;\n }\n if (nearNorthEdge) {\n panLat = draggedLat + viewportHeight * offsetAmount;\n }\n\n mapRef.current?.easeTo({\n center: [panLng, panLat],\n duration: 200\n });\n });\n }}\n onDragEnd={(event) => {\n isMarkerDragging.current = false;\n\n if (dragAnimationFrame.current) {\n cancelAnimationFrame(dragAnimationFrame.current);\n dragAnimationFrame.current = null;\n }\n\n if (!onMarkerDrag) {\n return;\n }\n\n const nextLngLat = (event as { lngLat?: { lng?: number; lat?: number } }).lngLat;\n if (!nextLngLat || nextLngLat.lng === undefined || nextLngLat.lat === undefined) {\n return;\n }\n\n onMarkerDrag(marker.id ?? null, {\n latitude: nextLngLat.lat,\n longitude: nextLngLat.lng\n });\n }}\n >\n {marker.element\n ? typeof marker.element === \"function\"\n ? marker.element()\n : marker.element\n : <DefaultMarker marker={marker} />}\n </Marker>\n )),\n [normalizedMarkers, onMarkerDrag]\n );\n\n const resolvedMapStyleUrl = React.useMemo(() => {\n if (styleUrl) {\n return appendStadiaApiKey(styleUrl, stadiaApiKey);\n }\n\n if (mapStyle) {\n return getMapLibreStyleUrl(mapStyle, stadiaApiKey);\n }\n\n return getMapLibreStyleUrl(\"osm-bright\", stadiaApiKey);\n }, [mapStyle, stadiaApiKey, styleUrl]);\n\n // Detect if we're in an iframe to adjust resize behavior\n const isInIframe = React.useMemo(() => {\n if (typeof window === \"undefined\") return false;\n try {\n return window.self !== window.top;\n } catch {\n return true; // Blocked by same-origin policy means we're in an iframe\n }\n }, []);\n\n // Enhanced resize handling for iframe contexts\n React.useEffect(() => {\n if (!isInIframe || !mapRef.current) return;\n\n let lastHeight = 0;\n let lastWidth = 0;\n let resizeTimeout: NodeJS.Timeout;\n\n const handleResize = (entries: ResizeObserverEntry[]) => {\n clearTimeout(resizeTimeout);\n\n // Get the container dimensions\n const entry = entries[0];\n if (!entry) return;\n\n const { width, height } = entry.contentRect;\n\n // Only trigger resize if dimensions actually changed meaningfully\n const widthChanged = Math.abs(width - lastWidth) > 1;\n const heightChanged = Math.abs(height - lastHeight) > 1;\n\n if (widthChanged || heightChanged) {\n lastWidth = width;\n lastHeight = height;\n\n // Debounce the actual map resize\n resizeTimeout = setTimeout(() => {\n mapRef.current?.resize();\n }, 250);\n }\n };\n\n // Observe the parent container, not the map container itself\n const parentElement = mapRef.current.getContainer().parentElement;\n if (parentElement) {\n const resizeObserver = new ResizeObserver(handleResize);\n resizeObserver.observe(parentElement);\n\n return () => {\n clearTimeout(resizeTimeout);\n resizeObserver.disconnect();\n };\n }\n }, [isInIframe]);\n\n return (\n <div\n className={joinClassNames(\"relative w-full h-full\", className)}\n style={{\n width: \"100%\",\n height: \"100%\",\n // Prevent content from pushing container size in iframes\n ...(isInIframe && { overflow: \"hidden\", position: \"relative\" }),\n ...style\n }}\n >\n <Map\n ref={mapRef}\n {...internalViewState}\n mapStyle={resolvedMapStyleUrl}\n onMoveStart={handleMoveStart}\n onMove={handleMove}\n onMoveEnd={handleMoveEnd}\n onClick={handleMapClick}\n attributionControl={false}\n trackResize={!isInIframe} // Disable automatic resize tracking in iframes, use manual observer instead\n dragRotate={false}\n touchZoomRotate={false}\n >\n {showGeolocateControl ? (\n <GeolocateControl position={geolocateControlPosition} />\n ) : null}\n\n {showNavigationControl ? (\n <NavigationControl position={navigationControlPosition} />\n ) : null}\n\n {markerElements}\n\n {children}\n </Map>\n </div>\n );\n}\n\nexport const DTMapLibreMap = MapLibre;\n"]}
package/dist/index.cjs CHANGED
@@ -478,11 +478,55 @@ function MapLibre({
478
478
  }
479
479
  return getMapLibreStyleUrl("osm-bright", stadiaApiKey);
480
480
  }, [mapStyle, stadiaApiKey, styleUrl]);
481
+ const isInIframe = React3__namespace.default.useMemo(() => {
482
+ if (typeof window === "undefined") return false;
483
+ try {
484
+ return window.self !== window.top;
485
+ } catch {
486
+ return true;
487
+ }
488
+ }, []);
489
+ React3__namespace.default.useEffect(() => {
490
+ if (!isInIframe || !mapRef.current) return;
491
+ let lastHeight = 0;
492
+ let lastWidth = 0;
493
+ let resizeTimeout;
494
+ const handleResize = (entries) => {
495
+ clearTimeout(resizeTimeout);
496
+ const entry = entries[0];
497
+ if (!entry) return;
498
+ const { width, height } = entry.contentRect;
499
+ const widthChanged = Math.abs(width - lastWidth) > 1;
500
+ const heightChanged = Math.abs(height - lastHeight) > 1;
501
+ if (widthChanged || heightChanged) {
502
+ lastWidth = width;
503
+ lastHeight = height;
504
+ resizeTimeout = setTimeout(() => {
505
+ mapRef.current?.resize();
506
+ }, 250);
507
+ }
508
+ };
509
+ const parentElement = mapRef.current.getContainer().parentElement;
510
+ if (parentElement) {
511
+ const resizeObserver = new ResizeObserver(handleResize);
512
+ resizeObserver.observe(parentElement);
513
+ return () => {
514
+ clearTimeout(resizeTimeout);
515
+ resizeObserver.disconnect();
516
+ };
517
+ }
518
+ }, [isInIframe]);
481
519
  return /* @__PURE__ */ jsxRuntime.jsx(
482
520
  "div",
483
521
  {
484
522
  className: joinClassNames("relative w-full h-full", className),
485
- style: { width: "100%", height: "100%", ...style },
523
+ style: {
524
+ width: "100%",
525
+ height: "100%",
526
+ // Prevent content from pushing container size in iframes
527
+ ...isInIframe && { overflow: "hidden", position: "relative" },
528
+ ...style
529
+ },
486
530
  children: /* @__PURE__ */ jsxRuntime.jsxs(
487
531
  maplibre.Map,
488
532
  {
@@ -494,7 +538,7 @@ function MapLibre({
494
538
  onMoveEnd: handleMoveEnd,
495
539
  onClick: handleMapClick,
496
540
  attributionControl: false,
497
- trackResize: true,
541
+ trackResize: !isInIframe,
498
542
  dragRotate: false,
499
543
  touchZoomRotate: false,
500
544
  children: [
@@ -772,10 +816,7 @@ function resolveActionKey(action, index) {
772
816
  }
773
817
  return `action:${index}`;
774
818
  }
775
- var FallbackIcon = ({
776
- size = 20,
777
- className
778
- }) => /* @__PURE__ */ jsxRuntime.jsx(
819
+ var FallbackIcon = ({ size = 20, className }) => /* @__PURE__ */ jsxRuntime.jsx(
779
820
  "svg",
780
821
  {
781
822
  width: size,
@@ -894,7 +935,7 @@ function MarkerMediaCarousel({
894
935
  {
895
936
  type: "button",
896
937
  "aria-label": "Show previous media",
897
- className: "absolute left-4 top-1/2 inline-flex size-10 -translate-y-1/2 items-center justify-center rounded-2xl bg-card text-card-foreground shadow-lg border-4 border-black hover:border-white hover:bg-black hover:text-white transition-all duration-500 z-[2]",
938
+ className: "absolute left-4 top-1/2 inline-flex size-10 -translate-y-1/2 items-center justify-center rounded-2xl bg-card text-card-foreground shadow-lg border-4 border-black hover:border-white hover:bg-black hover:text-white transition-all duration-500 z-2",
898
939
  onClick: () => {
899
940
  setActiveIndex(
900
941
  (current) => (current - 1 + totalItems) % totalItems
@@ -1027,10 +1068,16 @@ function GeoMap({
1027
1068
  const firstCoordinate = React3__namespace.useMemo(() => {
1028
1069
  const allCoords = [];
1029
1070
  normalizedStandaloneMarkers.forEach((marker) => {
1030
- allCoords.push({ latitude: marker.latitude, longitude: marker.longitude });
1071
+ allCoords.push({
1072
+ latitude: marker.latitude,
1073
+ longitude: marker.longitude
1074
+ });
1031
1075
  });
1032
1076
  normalizedClusters.forEach((cluster) => {
1033
- allCoords.push({ latitude: cluster.latitude, longitude: cluster.longitude });
1077
+ allCoords.push({
1078
+ latitude: cluster.latitude,
1079
+ longitude: cluster.longitude
1080
+ });
1034
1081
  });
1035
1082
  if (allCoords.length > 0) {
1036
1083
  const sum = allCoords.reduce(
@@ -1056,10 +1103,16 @@ function GeoMap({
1056
1103
  }
1057
1104
  const allCoords = [];
1058
1105
  normalizedStandaloneMarkers.forEach((marker) => {
1059
- allCoords.push({ latitude: marker.latitude, longitude: marker.longitude });
1106
+ allCoords.push({
1107
+ latitude: marker.latitude,
1108
+ longitude: marker.longitude
1109
+ });
1060
1110
  });
1061
1111
  normalizedClusters.forEach((cluster) => {
1062
- allCoords.push({ latitude: cluster.latitude, longitude: cluster.longitude });
1112
+ allCoords.push({
1113
+ latitude: cluster.latitude,
1114
+ longitude: cluster.longitude
1115
+ });
1063
1116
  });
1064
1117
  if (allCoords.length === 0) {
1065
1118
  return DEFAULT_VIEW_STATE.zoom;
@@ -1287,7 +1340,7 @@ function GeoMap({
1287
1340
  "div",
1288
1341
  {
1289
1342
  className: cn(
1290
- "relative w-[min(24rem,calc(100vw-2rem))] overflow-hidden rounded-xl border border-border bg-card text-card-foreground shadow-2xl",
1343
+ "relative w-80 overflow-hidden rounded-xl border border-border bg-card text-card-foreground shadow-2xl",
1291
1344
  panelClassName
1292
1345
  ),
1293
1346
  children: [
@@ -1361,7 +1414,7 @@ function GeoMap({
1361
1414
  "div",
1362
1415
  {
1363
1416
  className: cn(
1364
- "relative w-[min(24rem,calc(100vw-2rem))] overflow-hidden rounded-xl border border-border bg-card text-card-foreground p-4 shadow-2xl",
1417
+ "relative w-80 overflow-hidden rounded-xl border border-border bg-card text-card-foreground p-4 shadow-2xl",
1365
1418
  panelClassName
1366
1419
  ),
1367
1420
  children: [
@@ -1399,6 +1452,14 @@ function GeoMap({
1399
1452
  }
1400
1453
  return null;
1401
1454
  };
1455
+ const isInIframe = React3__namespace.useMemo(() => {
1456
+ if (typeof window === "undefined") return false;
1457
+ try {
1458
+ return window.self !== window.top;
1459
+ } catch {
1460
+ return true;
1461
+ }
1462
+ }, []);
1402
1463
  return /* @__PURE__ */ jsxRuntime.jsxs(
1403
1464
  "div",
1404
1465
  {
@@ -1406,33 +1467,51 @@ function GeoMap({
1406
1467
  "relative overflow-hidden rounded-2xl border border-border bg-background",
1407
1468
  className
1408
1469
  ),
1470
+ style: {
1471
+ // Use CSS containment to prevent layout shifts in iframes
1472
+ ...isInIframe && { contain: "layout size" }
1473
+ },
1409
1474
  children: [
1410
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("h-[520px] w-full", mapWrapperClassName), children: /* @__PURE__ */ jsxRuntime.jsx(
1411
- MapLibre,
1475
+ /* @__PURE__ */ jsxRuntime.jsx(
1476
+ "div",
1412
1477
  {
1413
- stadiaApiKey,
1414
- mapStyle,
1415
- styleUrl,
1416
- mapLibreCssHref,
1417
- viewState: resolvedViewState,
1418
- onViewStateChange: applyViewState,
1419
- markers: mapMarkers,
1420
- onClick: (coord) => {
1421
- onMapClick?.(coord);
1422
- if (clearSelectionOnMapClick) {
1423
- clearSelection();
1424
- }
1478
+ className: cn(
1479
+ "w-full",
1480
+ // Default height, can be overridden by mapWrapperClassName
1481
+ mapWrapperClassName || "h-[520px]"
1482
+ ),
1483
+ style: {
1484
+ // Ensure proper height containment in iframes
1485
+ ...isInIframe && !mapWrapperClassName && { height: "520px", minHeight: "420px" }
1425
1486
  },
1426
- onMarkerDrag,
1427
- showNavigationControl,
1428
- showGeolocateControl,
1429
- navigationControlPosition,
1430
- geolocateControlPosition,
1431
- flyToOptions,
1432
- className: cn("h-full w-full", mapClassName),
1433
- children: mapChildren
1487
+ children: /* @__PURE__ */ jsxRuntime.jsx(
1488
+ MapLibre,
1489
+ {
1490
+ stadiaApiKey,
1491
+ mapStyle,
1492
+ styleUrl,
1493
+ mapLibreCssHref,
1494
+ viewState: resolvedViewState,
1495
+ onViewStateChange: applyViewState,
1496
+ markers: mapMarkers,
1497
+ onClick: (coord) => {
1498
+ onMapClick?.(coord);
1499
+ if (clearSelectionOnMapClick) {
1500
+ clearSelection();
1501
+ }
1502
+ },
1503
+ onMarkerDrag,
1504
+ showNavigationControl,
1505
+ showGeolocateControl,
1506
+ navigationControlPosition,
1507
+ geolocateControlPosition,
1508
+ flyToOptions,
1509
+ className: cn("h-full w-full", mapClassName),
1510
+ children: mapChildren
1511
+ }
1512
+ )
1434
1513
  }
1435
- ) }),
1514
+ ),
1436
1515
  selection.type !== "none" ? /* @__PURE__ */ jsxRuntime.jsx(
1437
1516
  "div",
1438
1517
  {