@revivejs/react-google-maps 18.0.0 → 18.0.1
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.
- package/README.md +5 -4
- package/dist/index.cjs +27 -19
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +27 -19
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/GoogleMapsProvider.tsx","../src/internal.tsx","../src/loadGoogleMapsApi.ts","../src/clusterRenderer.ts","../src/GoogleMap.tsx","../src/hooks.ts","../src/utils.ts","../src/markers.tsx","../src/shapes.tsx","../src/layers.tsx","../src/directions.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from 'react';\nimport { GoogleMapsApiContext, type GoogleMapsStatus } from './internal';\nimport { loadGoogleMapsApi, type GoogleMapsApiLoadOptions } from './loadGoogleMapsApi';\n\nexport type GoogleMapsProviderProps = GoogleMapsApiLoadOptions & {\n children: ReactNode;\n};\n\nexport function GoogleMapsProvider({ children, ...options }: GoogleMapsProviderProps) {\n const [status, setStatus] = useState<GoogleMapsStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n const [googleApi, setGoogleApi] = useState<typeof google | null>(() =>\n typeof window !== 'undefined' && window.google?.maps ? window.google : null\n );\n\n const serializedOptions = JSON.stringify({\n ...options,\n libraries: options.libraries || [],\n mapIds: options.mapIds || []\n });\n\n useEffect(() => {\n let cancelled = false;\n\n if (!options.apiKey) {\n setStatus('idle');\n setError(null);\n setGoogleApi(null);\n return;\n }\n\n setStatus((current) => (current === 'ready' ? current : 'loading'));\n setError(null);\n\n loadGoogleMapsApi(options)\n .then((googleNamespace) => {\n if (cancelled) {\n return;\n }\n setGoogleApi(googleNamespace);\n setStatus('ready');\n })\n .catch((nextError) => {\n if (cancelled) {\n return;\n }\n setError(nextError instanceof Error ? nextError : new Error(String(nextError)));\n setStatus('error');\n });\n\n return () => {\n cancelled = true;\n };\n }, [serializedOptions]);\n\n const value = useMemo(\n () => ({\n status,\n error,\n google: googleApi,\n options\n }),\n [status, error, googleApi, serializedOptions]\n );\n\n return <GoogleMapsApiContext.Provider value={value}>{children}</GoogleMapsApiContext.Provider>;\n}\n","import { createContext, useContext } from 'react';\nimport type { MarkerClusterer } from '@googlemaps/markerclusterer';\nimport type { GoogleMapsApiLoadOptions } from './loadGoogleMapsApi';\n\nexport type GoogleMapsStatus = 'idle' | 'loading' | 'ready' | 'error';\n\nexport type GoogleMapsApiContextValue = {\n status: GoogleMapsStatus;\n error: Error | null;\n google: typeof google | null;\n options: GoogleMapsApiLoadOptions | null;\n};\n\nexport type MarkerLike = google.maps.Marker | google.maps.marker.AdvancedMarkerElement;\n\nexport type MarkerClustererContextValue = {\n clusterer: MarkerClusterer | null;\n registerMarker: (marker: MarkerLike) => void;\n unregisterMarker: (marker: MarkerLike) => void;\n};\n\nexport const GoogleMapsApiContext = createContext<GoogleMapsApiContextValue>({\n status: 'idle',\n error: null,\n google: null,\n options: null\n});\n\nexport const GoogleMapContext = createContext<google.maps.Map | null>(null);\nexport const MarkerClustererContext = createContext<MarkerClustererContextValue | null>(null);\n\nexport function useRequiredGoogleMap(componentName: string) {\n const map = useContext(GoogleMapContext);\n if (!map) {\n throw new Error(`${componentName} must be rendered inside <GoogleMap>.`);\n }\n return map;\n}\n\nexport function useGoogleMapsApiContext() {\n return useContext(GoogleMapsApiContext);\n}\n\nexport function useMarkerClustererContext() {\n return useContext(MarkerClustererContext);\n}\n","export type GoogleMapsApiLoadOptions = {\n apiKey: string;\n version?: string;\n language?: string;\n region?: string;\n libraries?: string[];\n mapIds?: string[];\n authReferrerPolicy?: string;\n channel?: string;\n solutionChannel?: string;\n nonce?: string;\n};\n\nconst DEFAULT_LIBRARIES = ['marker', 'places', 'geometry', 'visualization'] as const;\n\nlet loaderPromise: Promise<typeof google> | null = null;\nlet loadedOptionsKey: string | null = null;\ntype CallbackWindow = Window & { [key: string]: (() => void) | undefined };\n\nexport function getDefaultGoogleMapsLibraries() {\n return [...DEFAULT_LIBRARIES];\n}\n\nexport function loadGoogleMapsApi(options: GoogleMapsApiLoadOptions): Promise<typeof google> {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return Promise.reject(new Error('@revivejs/react-google-maps can only load the Google Maps API in a browser environment.'));\n }\n\n if (!options.apiKey) {\n return Promise.reject(new Error('A Google Maps API key is required to load the Google Maps JavaScript API.'));\n }\n\n if (window.google?.maps) {\n return Promise.resolve(window.google);\n }\n\n const normalizedOptions = normalizeLoaderOptions(options);\n const nextKey = JSON.stringify(normalizedOptions);\n\n if (loaderPromise) {\n if (loadedOptionsKey && loadedOptionsKey !== nextKey) {\n console.warn(\n '@revivejs/react-google-maps only loads the Google Maps JavaScript API once per page. ' +\n 'Ignoring subsequent loader options and reusing the first loaded configuration.'\n );\n }\n return loaderPromise;\n }\n\n loadedOptionsKey = nextKey;\n\n loaderPromise = new Promise<typeof google>((resolve, reject) => {\n const callbackName = '__revivejsReactGoogleMapsInit';\n const existingScript = document.querySelector<HTMLScriptElement>('script[data-revivejs-google-maps-loader=\"true\"]');\n\n if (existingScript) {\n existingScript.addEventListener('load', () => {\n if (window.google?.maps) {\n resolve(window.google);\n } else {\n reject(new Error('Google Maps script loaded but the google.maps namespace is still unavailable.'));\n }\n });\n existingScript.addEventListener('error', () => reject(new Error('The Google Maps JavaScript API script failed to load.')));\n return;\n }\n\n const params = new URLSearchParams();\n params.set('key', normalizedOptions.apiKey);\n params.set('v', normalizedOptions.version);\n params.set('loading', 'async');\n params.set('callback', callbackName);\n\n if (normalizedOptions.language) {\n params.set('language', normalizedOptions.language);\n }\n if (normalizedOptions.region) {\n params.set('region', normalizedOptions.region);\n }\n if (normalizedOptions.libraries.length) {\n params.set('libraries', normalizedOptions.libraries.join(','));\n }\n if (normalizedOptions.mapIds.length) {\n params.set('map_ids', normalizedOptions.mapIds.join(','));\n }\n if (normalizedOptions.authReferrerPolicy) {\n params.set('auth_referrer_policy', normalizedOptions.authReferrerPolicy);\n }\n if (normalizedOptions.channel) {\n params.set('channel', normalizedOptions.channel);\n }\n if (normalizedOptions.solutionChannel) {\n params.set('solution_channel', normalizedOptions.solutionChannel);\n }\n\n const script = document.createElement('script');\n script.async = true;\n script.defer = true;\n script.dataset.revivejsGoogleMapsLoader = 'true';\n script.src = `https://maps.googleapis.com/maps/api/js?${params.toString()}`;\n\n if (normalizedOptions.nonce) {\n script.nonce = normalizedOptions.nonce;\n }\n\n (window as unknown as CallbackWindow)[callbackName] = () => {\n delete (window as unknown as CallbackWindow)[callbackName];\n if (window.google?.maps) {\n resolve(window.google);\n } else {\n reject(new Error('Google Maps callback fired but the google.maps namespace is unavailable.'));\n }\n };\n\n script.onerror = () => {\n loaderPromise = null;\n loadedOptionsKey = null;\n delete (window as unknown as CallbackWindow)[callbackName];\n reject(new Error('The Google Maps JavaScript API script failed to load.'));\n };\n\n document.head.appendChild(script);\n });\n\n return loaderPromise;\n}\n\nfunction normalizeLoaderOptions(options: GoogleMapsApiLoadOptions): Required<Omit<GoogleMapsApiLoadOptions, 'language' | 'region' | 'authReferrerPolicy' | 'channel' | 'solutionChannel' | 'nonce'>> & Pick<GoogleMapsApiLoadOptions, 'language' | 'region' | 'authReferrerPolicy' | 'channel' | 'solutionChannel' | 'nonce'> {\n return {\n ...options,\n version: options.version || 'weekly',\n libraries: Array.from(new Set([...(options.libraries || []), ...DEFAULT_LIBRARIES])).sort(),\n mapIds: Array.from(new Set(options.mapIds || [])).sort()\n };\n}\n","import type { Cluster, ClusterStats, Renderer } from '@googlemaps/markerclusterer';\n\nexport type ClusterRendererContext = {\n cluster: Cluster;\n stats: ClusterStats;\n map: google.maps.Map;\n count: number;\n position: google.maps.LatLng;\n color: string;\n isAdvancedMarkerAvailable: boolean;\n};\n\nexport type CreateClusterRendererOptions = {\n className?: string;\n useAdvancedMarker?: boolean;\n zIndexBase?: number;\n title?: string | ((context: ClusterRendererContext) => string);\n render?: (context: ClusterRendererContext) => HTMLElement | string;\n fallbackTextColor?: string;\n fallbackBorderColor?: string;\n color?: string | ((context: ClusterRendererContext) => string);\n};\n\nexport function createClusterRenderer(options: CreateClusterRendererOptions = {}): Renderer {\n return {\n render(cluster, stats, map) {\n const count = cluster.count;\n const position = cluster.position;\n const contextBase = {\n cluster,\n stats,\n map,\n count,\n position,\n color: '',\n isAdvancedMarkerAvailable: false\n } satisfies Omit<ClusterRendererContext, 'color' | 'isAdvancedMarkerAvailable'> & {\n color: string;\n isAdvancedMarkerAvailable: boolean;\n };\n\n const color =\n typeof options.color === 'function'\n ? options.color(contextBase)\n : options.color || getDefaultClusterColor(count, stats);\n\n const isAdvancedMarkerAvailable =\n options.useAdvancedMarker !== false &&\n !!google.maps.marker?.AdvancedMarkerElement &&\n !!map.get('mapId');\n\n const context: ClusterRendererContext = {\n ...contextBase,\n color,\n isAdvancedMarkerAvailable\n };\n\n const title = typeof options.title === 'function' ? options.title(context) : options.title || `Cluster with ${count} markers`;\n const zIndex = (options.zIndexBase || 1000) + count;\n\n if (isAdvancedMarkerAvailable) {\n return new google.maps.marker.AdvancedMarkerElement({\n position,\n title,\n zIndex,\n content: buildAdvancedClusterContent(context, options)\n });\n }\n\n return new google.maps.Marker({\n position,\n title,\n zIndex,\n label: {\n text: String(count),\n color: options.fallbackTextColor || '#ffffff',\n fontSize: '12px',\n fontWeight: '700'\n },\n icon: {\n url: buildFallbackClusterSvg(\n color,\n options.fallbackBorderColor || 'rgba(255,255,255,0.92)'\n ),\n scaledSize: new google.maps.Size(46, 46)\n }\n });\n }\n };\n}\n\nfunction buildAdvancedClusterContent(\n context: ClusterRendererContext,\n options: CreateClusterRendererOptions\n) {\n const customContent = options.render?.(context);\n if (customContent instanceof HTMLElement) {\n return customContent;\n }\n\n const element = document.createElement('div');\n element.className = options.className || 'revivejs-cluster-badge';\n element.style.display = 'grid';\n element.style.gap = '2px';\n element.style.minWidth = '52px';\n element.style.padding = '10px 12px';\n element.style.borderRadius = '999px';\n element.style.background = context.color;\n element.style.color = '#ffffff';\n element.style.boxShadow = '0 12px 24px rgba(16, 32, 51, 0.18)';\n element.style.border = '2px solid rgba(255,255,255,0.88)';\n element.style.textAlign = 'center';\n element.style.fontFamily = 'Avenir Next, Segoe UI, sans-serif';\n\n const countNode = document.createElement('strong');\n countNode.textContent = String(context.count);\n countNode.style.fontSize = '14px';\n countNode.style.lineHeight = '1';\n\n const labelNode = document.createElement('span');\n labelNode.textContent = typeof customContent === 'string' ? customContent : 'markers';\n labelNode.style.fontSize = '10px';\n labelNode.style.opacity = '0.92';\n labelNode.style.lineHeight = '1';\n\n element.append(countNode, labelNode);\n return element;\n}\n\nfunction getDefaultClusterColor(count: number, stats: ClusterStats) {\n return count > Math.max(10, stats.clusters.markers.mean) ? '#d94b2b' : '#0d5c9e';\n}\n\nfunction buildFallbackClusterSvg(fill: string, stroke: string) {\n const svg = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 64 64\">\n <circle cx=\"32\" cy=\"32\" r=\"28\" fill=\"${fill}\" stroke=\"${stroke}\" stroke-width=\"4\" />\n </svg>\n `;\n\n return `data:image/svg+xml;base64,${window.btoa(svg)}`;\n}\n","import {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode\n} from 'react';\nimport { GoogleMapContext } from './internal';\nimport { useGoogleMapsApi } from './hooks';\nimport { addListener, composeMapOptions, toLatLng, type LatLngLike } from './utils';\n\nexport type GoogleMapHandle = {\n map: google.maps.Map | null;\n fitBounds: (bounds: google.maps.LatLngBounds | google.maps.LatLngBoundsLiteral) => void;\n panBy: (x: number, y: number) => void;\n panTo: (position: google.maps.LatLng | google.maps.LatLngLiteral) => void;\n panToBounds: (\n bounds: google.maps.LatLngBounds | google.maps.LatLngBoundsLiteral,\n padding?: number | google.maps.Padding\n ) => void;\n setZoom: (zoom: number) => void;\n setCenter: (position: google.maps.LatLng | google.maps.LatLngLiteral) => void;\n setOptions: (options: google.maps.MapOptions) => void;\n getBounds: () => google.maps.LatLngBounds | null;\n getCenter: () => google.maps.LatLng | undefined;\n getClickableIcons: () => boolean | undefined;\n getHeading: () => number | undefined;\n getMapTypeId: () => google.maps.MapTypeId | string | undefined;\n getProjection: () => google.maps.Projection | null;\n getStreetView: () => google.maps.StreetViewPanorama | null;\n getTilt: () => number | undefined;\n getZoom: () => number | undefined;\n controls: () => google.maps.MVCArray<Node>[] | null;\n data: () => google.maps.Data | null;\n mapTypes: () => google.maps.MapTypeRegistry | null;\n overlayMapTypes: () => google.maps.MVCArray<google.maps.MapType | null> | null;\n};\n\nexport type GoogleMapProps = Omit<HTMLAttributes<HTMLDivElement>, 'onClick'> & {\n children?: ReactNode;\n center?: LatLngLike;\n zoom?: number;\n mapId?: string;\n options?: google.maps.MapOptions;\n width?: CSSProperties['width'];\n height?: CSSProperties['height'];\n loadingFallback?: ReactNode;\n errorFallback?: ReactNode;\n onMapLoad?: (map: google.maps.Map) => void;\n onMapUnmount?: (map: google.maps.Map) => void;\n onClick?: (event: google.maps.MapMouseEvent | google.maps.IconMouseEvent) => void;\n onDblClick?: (event: google.maps.MapMouseEvent) => void;\n onDrag?: () => void;\n onDragStart?: () => void;\n onDragEnd?: () => void;\n onIdle?: () => void;\n onBoundsChanged?: () => void;\n onCenterChanged?: () => void;\n onHeadingChanged?: () => void;\n onMapTypeIdChanged?: () => void;\n onMouseMove?: (event: google.maps.MapMouseEvent) => void;\n onMouseOut?: (event: google.maps.MapMouseEvent) => void;\n onMouseOver?: (event: google.maps.MapMouseEvent) => void;\n onProjectionChanged?: () => void;\n onRightClick?: (event: google.maps.MapMouseEvent) => void;\n onTilesLoaded?: () => void;\n onTiltChanged?: () => void;\n onZoomChanged?: () => void;\n};\n\nconst DEFAULT_CENTER = { lat: 37.421995, lng: -122.084092 };\nconst DEFAULT_ZOOM = 13;\n\nexport const GoogleMap = forwardRef<GoogleMapHandle, GoogleMapProps>(function GoogleMap(\n {\n children,\n center = DEFAULT_CENTER,\n zoom = DEFAULT_ZOOM,\n mapId,\n options,\n width = '100%',\n height = 460,\n loadingFallback,\n errorFallback,\n onMapLoad,\n onMapUnmount,\n onClick,\n onDblClick,\n onDrag,\n onDragStart,\n onDragEnd,\n onIdle,\n onBoundsChanged,\n onCenterChanged,\n onHeadingChanged,\n onMapTypeIdChanged,\n onMouseMove,\n onMouseOut,\n onMouseOver,\n onProjectionChanged,\n onRightClick,\n onTilesLoaded,\n onTiltChanged,\n onZoomChanged,\n className,\n style,\n ...divProps\n },\n ref\n) {\n const { isLoaded, status, error, google } = useGoogleMapsApi();\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [map, setMap] = useState<google.maps.Map | null>(null);\n const initialMapIdRef = useRef(mapId);\n\n useImperativeHandle(\n ref,\n () => ({\n map,\n fitBounds(bounds) {\n map?.fitBounds(bounds);\n },\n panBy(x, y) {\n map?.panBy(x, y);\n },\n panTo(position) {\n map?.panTo(position);\n },\n panToBounds(bounds, padding) {\n map?.panToBounds(bounds, padding);\n },\n setZoom(nextZoom) {\n map?.setZoom(nextZoom);\n },\n setCenter(position) {\n map?.setCenter(position);\n },\n setOptions(nextOptions) {\n map?.setOptions(nextOptions);\n },\n getBounds() {\n return map?.getBounds() || null;\n },\n getCenter() {\n return map?.getCenter();\n },\n getClickableIcons() {\n return map?.getClickableIcons();\n },\n getHeading() {\n return map?.getHeading();\n },\n getMapTypeId() {\n return map?.getMapTypeId();\n },\n getProjection() {\n return map?.getProjection() || null;\n },\n getStreetView() {\n return map?.getStreetView() || null;\n },\n getTilt() {\n return map?.getTilt();\n },\n getZoom() {\n return map?.getZoom();\n },\n controls() {\n return map?.controls || null;\n },\n data() {\n return map?.data || null;\n },\n mapTypes() {\n return map?.mapTypes || null;\n },\n overlayMapTypes() {\n return map?.overlayMapTypes || null;\n }\n }),\n [map]\n );\n\n useEffect(() => {\n if (!isLoaded || !google || !containerRef.current || map) {\n return;\n }\n\n const nextMap = new google.maps.Map(\n containerRef.current,\n composeMapOptions(options, {\n center,\n zoom,\n mapId: initialMapIdRef.current\n })\n );\n\n setMap(nextMap);\n onMapLoad?.(nextMap);\n\n return () => {\n onMapUnmount?.(nextMap);\n setMap(null);\n };\n }, [isLoaded, google, map]);\n\n useEffect(() => {\n if (!map) {\n return;\n }\n\n map.setOptions(\n composeMapOptions(options, {\n center,\n zoom\n })\n );\n }, [map, options, center, zoom]);\n\n useEffect(() => {\n if (!map || !center) {\n return;\n }\n\n const nextCenter = toLatLng(center);\n if (nextCenter) {\n map.setCenter(nextCenter);\n }\n }, [map, center]);\n\n useEffect(() => {\n if (!map || zoom === undefined) {\n return;\n }\n\n if (map.getZoom() !== zoom) {\n map.setZoom(zoom);\n }\n }, [map, zoom]);\n\n useEffect(() => {\n if (!map) {\n return;\n }\n\n const listeners = [\n addListener(map, 'click', onClick),\n addListener(map, 'dblclick', onDblClick),\n addListener(map, 'drag', onDrag),\n addListener(map, 'dragstart', onDragStart),\n addListener(map, 'dragend', onDragEnd),\n addListener(map, 'idle', onIdle),\n addListener(map, 'bounds_changed', onBoundsChanged),\n addListener(map, 'center_changed', onCenterChanged),\n addListener(map, 'heading_changed', onHeadingChanged),\n addListener(map, 'maptypeid_changed', onMapTypeIdChanged),\n addListener(map, 'mousemove', onMouseMove),\n addListener(map, 'mouseout', onMouseOut),\n addListener(map, 'mouseover', onMouseOver),\n addListener(map, 'projection_changed', onProjectionChanged),\n addListener(map, 'rightclick', onRightClick),\n addListener(map, 'tilesloaded', onTilesLoaded),\n addListener(map, 'tilt_changed', onTiltChanged),\n addListener(map, 'zoom_changed', onZoomChanged)\n ].filter(Boolean);\n\n return () => {\n listeners.forEach((listener) => listener?.remove());\n };\n }, [\n map,\n onClick,\n onDblClick,\n onDrag,\n onDragStart,\n onDragEnd,\n onIdle,\n onBoundsChanged,\n onCenterChanged,\n onHeadingChanged,\n onMapTypeIdChanged,\n onMouseMove,\n onMouseOut,\n onMouseOver,\n onProjectionChanged,\n onRightClick,\n onTilesLoaded,\n onTiltChanged,\n onZoomChanged\n ]);\n\n useEffect(() => {\n if (!map || !google || !containerRef.current || typeof ResizeObserver === 'undefined') {\n return;\n }\n\n const observer = new ResizeObserver(() => {\n const currentCenter = map.getCenter();\n google.maps.event.trigger(map, 'resize');\n if (currentCenter) {\n map.setCenter(currentCenter);\n }\n });\n\n observer.observe(containerRef.current);\n\n return () => {\n observer.disconnect();\n };\n }, [map, google]);\n\n const mergedStyle = useMemo<CSSProperties>(\n () => ({\n width,\n height,\n minHeight: typeof height === 'number' ? `${height}px` : undefined,\n position: 'relative',\n overflow: 'hidden',\n ...style\n }),\n [width, height, style]\n );\n\n return (\n <div {...divProps} className={className} style={mergedStyle} ref={containerRef}>\n {status === 'error' ? errorFallback || <MapStatus message={error?.message || 'The Google Maps API failed to load.'} tone=\"error\" /> : null}\n {!isLoaded && status !== 'error' ? loadingFallback || <MapStatus message=\"Loading Google Maps JavaScript API…\" tone=\"loading\" /> : null}\n {map ? <GoogleMapContext.Provider value={map}>{children}</GoogleMapContext.Provider> : null}\n </div>\n );\n});\n\nfunction MapStatus({ message, tone }: { message: string; tone: 'loading' | 'error' }) {\n return (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n display: 'grid',\n placeItems: 'center',\n padding: '1rem',\n background: tone === 'error' ? 'rgba(255, 245, 245, 0.9)' : 'rgba(244, 249, 255, 0.9)',\n color: tone === 'error' ? '#8c2b2b' : '#24415f',\n fontSize: '0.95rem',\n zIndex: 0\n }}\n >\n <div>{message}</div>\n </div>\n );\n}\n","import { useContext, useRef } from 'react';\nimport { GoogleMapContext, useGoogleMapsApiContext } from './internal';\n\nexport function useGoogleMapsApi() {\n const context = useGoogleMapsApiContext();\n return {\n ...context,\n isLoaded: context.status === 'ready' && !!context.google\n };\n}\n\nexport function useGoogleMap() {\n return useContext(GoogleMapContext);\n}\n\nexport function useMapGeocoder() {\n const { google, isLoaded } = useGoogleMapsApi();\n const geocoderRef = useRef<google.maps.Geocoder | null>(null);\n\n if (isLoaded && google && !geocoderRef.current) {\n geocoderRef.current = new google.maps.Geocoder();\n }\n\n return geocoderRef.current;\n}\n\nexport function useDirectionsService() {\n const { google, isLoaded } = useGoogleMapsApi();\n const directionsServiceRef = useRef<google.maps.DirectionsService | null>(null);\n\n if (isLoaded && google && !directionsServiceRef.current) {\n directionsServiceRef.current = new google.maps.DirectionsService();\n }\n\n return directionsServiceRef.current;\n}\n","import type { MarkerLike } from './internal';\n\nexport type LatLngLike = google.maps.LatLngLiteral | google.maps.LatLng;\n\nexport function addListener<T extends object>(\n target: T | null | undefined,\n eventName: string,\n handler: ((...args: any[]) => void) | undefined\n) {\n if (!target || !handler) {\n return null;\n }\n\n return google.maps.event.addListener(target as any, eventName, (...args: any[]) => {\n handler(...args);\n });\n}\n\nexport function composeMapOptions(options: google.maps.MapOptions | undefined, extra: Partial<google.maps.MapOptions>) {\n return {\n ...options,\n ...removeUndefined(extra)\n };\n}\n\nexport function removeUndefined<T extends Record<string, any>>(input: T) {\n return Object.fromEntries(Object.entries(input).filter(([, value]) => value !== undefined)) as Partial<T>;\n}\n\nexport function toLatLng(value: LatLngLike | undefined | null) {\n if (!value) {\n return null;\n }\n\n if (value instanceof google.maps.LatLng) {\n return value;\n }\n\n return new google.maps.LatLng(value);\n}\n\nexport function toMVCArrayPath(path: Array<LatLngLike>) {\n return path.map((point) => (point instanceof google.maps.LatLng ? point : new google.maps.LatLng(point)));\n}\n\nexport function isLatLngLiteral(value: unknown): value is google.maps.LatLngLiteral {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'lat' in (value as any) &&\n 'lng' in (value as any)\n );\n}\n\nexport function markerToAnchor(marker: MarkerLike) {\n return marker as unknown as google.maps.MVCObject;\n}\n\nexport function shallowBoundsEqual(\n left: google.maps.LatLngBoundsLiteral | undefined,\n right: google.maps.LatLngBoundsLiteral | undefined\n) {\n return (\n left?.east === right?.east &&\n left?.west === right?.west &&\n left?.north === right?.north &&\n left?.south === right?.south\n );\n}\n","import { MarkerClusterer, type Algorithm, type Cluster, type Renderer } from '@googlemaps/markerclusterer';\nimport {\n useContext,\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type ReactNode\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { MarkerClustererContext, type MarkerLike } from './internal';\nimport { useGoogleMap, useGoogleMapsApi } from './hooks';\nimport { addListener, removeUndefined, toLatLng, type LatLngLike } from './utils';\n\nexport type MapMarkerHandle = {\n marker: google.maps.Marker | null;\n getAnimation: () => google.maps.Animation | null | undefined;\n getClickable: () => boolean | undefined;\n getDraggable: () => boolean | undefined;\n getIcon: () => string | google.maps.Icon | google.maps.Symbol | null | undefined;\n getLabel: () => string | google.maps.MarkerLabel | null | undefined;\n getPosition: () => google.maps.LatLng | null | undefined;\n getTitle: () => string | null | undefined;\n getVisible: () => boolean | undefined;\n getZIndex: () => number | null | undefined;\n setAnimation: (animation: google.maps.Animation | null) => void;\n setOptions: (options: google.maps.MarkerOptions) => void;\n setPosition: (position: google.maps.LatLng | google.maps.LatLngLiteral) => void;\n setTitle: (title: string) => void;\n setVisible: (visible: boolean) => void;\n setZIndex: (zIndex: number) => void;\n};\n\nexport type MapAdvancedMarkerHandle = {\n marker: google.maps.marker.AdvancedMarkerElement | null;\n content: HTMLElement | null;\n setMap: (map: google.maps.Map | null) => void;\n setPosition: (position: google.maps.LatLng | google.maps.LatLngLiteral) => void;\n setZIndex: (zIndex: number) => void;\n};\n\nexport type MapInfoWindowHandle = {\n infoWindow: google.maps.InfoWindow | null;\n open: (anchor?: MarkerLike | null) => void;\n close: () => void;\n getContent: () => string | Node | null | undefined;\n getPosition: () => google.maps.LatLng | null | undefined;\n getZIndex: () => number | undefined;\n setContent: (content: string | Element | Text) => void;\n setPosition: (position: google.maps.LatLng | google.maps.LatLngLiteral) => void;\n setZIndex: (zIndex: number) => void;\n};\n\nexport type MapMarkerClustererHandle = {\n clusterer: MarkerClusterer | null;\n addMarker: (marker: MarkerLike, noDraw?: boolean) => void;\n addMarkers: (markers: MarkerLike[], noDraw?: boolean) => void;\n removeMarker: (marker: MarkerLike, noDraw?: boolean) => boolean;\n clearMarkers: (noDraw?: boolean) => void;\n render: () => void;\n};\n\nexport type MapMarkerProps = {\n position: LatLngLike;\n title?: string;\n label?: string | google.maps.MarkerLabel;\n clickable?: boolean;\n draggable?: boolean;\n icon?: string | google.maps.Icon | google.maps.Symbol;\n visible?: boolean;\n zIndex?: number;\n animation?: google.maps.Animation;\n options?: google.maps.MarkerOptions;\n onLoad?: (marker: google.maps.Marker) => void;\n onUnmount?: (marker: google.maps.Marker) => void;\n onClick?: (event: google.maps.MapMouseEvent) => void;\n onDblClick?: (event: google.maps.MapMouseEvent) => void;\n onDrag?: (event: google.maps.MapMouseEvent) => void;\n onDragEnd?: (event: google.maps.MapMouseEvent) => void;\n onDragStart?: (event: google.maps.MapMouseEvent) => void;\n onMouseDown?: (event: google.maps.MapMouseEvent) => void;\n onMouseOut?: (event: google.maps.MapMouseEvent) => void;\n onMouseOver?: (event: google.maps.MapMouseEvent) => void;\n onMouseUp?: (event: google.maps.MapMouseEvent) => void;\n onRightClick?: (event: google.maps.MapMouseEvent) => void;\n};\n\nexport type MapAdvancedMarkerProps = {\n position: LatLngLike;\n title?: string;\n zIndex?: number;\n gmpClickable?: boolean;\n gmpDraggable?: boolean;\n options?: google.maps.marker.AdvancedMarkerElementOptions;\n collisionBehavior?: google.maps.CollisionBehavior;\n children?: ReactNode;\n onLoad?: (marker: google.maps.marker.AdvancedMarkerElement) => void;\n onUnmount?: (marker: google.maps.marker.AdvancedMarkerElement) => void;\n onClick?: (event: google.maps.MapMouseEvent) => void;\n onDragStart?: (event: google.maps.MapMouseEvent) => void;\n onDrag?: (event: google.maps.MapMouseEvent) => void;\n onDragEnd?: (event: google.maps.MapMouseEvent) => void;\n};\n\nexport type MapInfoWindowProps = {\n anchor?: MarkerLike | null;\n open?: boolean;\n position?: LatLngLike;\n zIndex?: number;\n options?: google.maps.InfoWindowOptions;\n children?: ReactNode;\n onLoad?: (infoWindow: google.maps.InfoWindow) => void;\n onUnmount?: (infoWindow: google.maps.InfoWindow) => void;\n onCloseClick?: () => void;\n onDomReady?: () => void;\n onContentChanged?: () => void;\n onPositionChanged?: () => void;\n onZIndexChanged?: () => void;\n};\n\nexport type MapMarkerClustererProps = {\n children?: ReactNode;\n algorithm?: Algorithm;\n renderer?: Renderer;\n onLoad?: (clusterer: MarkerClusterer) => void;\n onUnmount?: (clusterer: MarkerClusterer) => void;\n onClusterClick?: (event: google.maps.MapMouseEvent, cluster: Cluster, map: google.maps.Map) => void;\n};\n\nexport const MapMarker = forwardRef<MapMarkerHandle, MapMarkerProps>(function MapMarker(\n {\n position,\n title,\n label,\n clickable,\n draggable,\n icon,\n visible,\n zIndex,\n animation,\n options,\n onLoad,\n onUnmount,\n onClick,\n onDblClick,\n onDrag,\n onDragEnd,\n onDragStart,\n onMouseDown,\n onMouseOut,\n onMouseOver,\n onMouseUp,\n onRightClick\n },\n ref\n) {\n const map = useGoogleMap();\n const clustererContext = useContext(MarkerClustererContext);\n const [marker, setMarker] = useState<google.maps.Marker | null>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n marker,\n getAnimation() {\n return marker?.getAnimation();\n },\n getClickable() {\n return marker?.getClickable();\n },\n getDraggable() {\n return marker?.getDraggable();\n },\n getIcon() {\n return marker?.getIcon();\n },\n getLabel() {\n return marker?.getLabel();\n },\n getPosition() {\n return marker?.getPosition();\n },\n getTitle() {\n return marker?.getTitle();\n },\n getVisible() {\n return marker?.getVisible();\n },\n getZIndex() {\n return marker?.getZIndex();\n },\n setAnimation(nextAnimation) {\n marker?.setAnimation(nextAnimation);\n },\n setOptions(nextOptions) {\n marker?.setOptions(nextOptions);\n },\n setPosition(nextPosition) {\n marker?.setPosition(nextPosition);\n },\n setTitle(nextTitle) {\n marker?.setTitle(nextTitle);\n },\n setVisible(nextVisible) {\n marker?.setVisible(nextVisible);\n },\n setZIndex(nextZIndex) {\n marker?.setZIndex(nextZIndex);\n }\n }),\n [marker]\n );\n\n useEffect(() => {\n if (!map || marker) {\n return;\n }\n\n const instance = new google.maps.Marker();\n setMarker(instance);\n onLoad?.(instance);\n\n return () => {\n onUnmount?.(instance);\n clustererContext?.unregisterMarker(instance);\n instance.setMap(null);\n };\n }, [map, marker]);\n\n useEffect(() => {\n if (!marker || !map) {\n return;\n }\n\n marker.setOptions({\n ...options,\n ...removeUndefined({\n position,\n title,\n label,\n clickable,\n draggable,\n icon,\n visible,\n zIndex,\n animation\n })\n });\n\n if (clustererContext) {\n marker.setMap(null);\n clustererContext.registerMarker(marker);\n } else {\n marker.setMap(map);\n }\n }, [marker, map, clustererContext, position, title, label, clickable, draggable, icon, visible, zIndex, animation, options]);\n\n useEffect(() => {\n if (!marker) {\n return;\n }\n\n const listeners = [\n addListener(marker, 'click', onClick),\n addListener(marker, 'dblclick', onDblClick),\n addListener(marker, 'drag', onDrag),\n addListener(marker, 'dragend', onDragEnd),\n addListener(marker, 'dragstart', onDragStart),\n addListener(marker, 'mousedown', onMouseDown),\n addListener(marker, 'mouseout', onMouseOut),\n addListener(marker, 'mouseover', onMouseOver),\n addListener(marker, 'mouseup', onMouseUp),\n addListener(marker, 'rightclick', onRightClick)\n ].filter(Boolean);\n\n return () => {\n listeners.forEach((listener) => listener?.remove());\n };\n }, [marker, onClick, onDblClick, onDrag, onDragEnd, onDragStart, onMouseDown, onMouseOut, onMouseOver, onMouseUp, onRightClick]);\n\n return null;\n});\n\nexport const MapAdvancedMarker = forwardRef<MapAdvancedMarkerHandle, MapAdvancedMarkerProps>(function MapAdvancedMarker(\n {\n position,\n title,\n zIndex,\n gmpClickable,\n gmpDraggable,\n options,\n collisionBehavior,\n children,\n onLoad,\n onUnmount,\n onClick,\n onDragStart,\n onDrag,\n onDragEnd\n },\n ref\n) {\n const map = useGoogleMap();\n const { isLoaded } = useGoogleMapsApi();\n const clustererContext = useContext(MarkerClustererContext);\n const [marker, setMarker] = useState<google.maps.marker.AdvancedMarkerElement | null>(null);\n const [contentElement] = useState(() => (typeof document !== 'undefined' ? document.createElement('div') : null));\n\n useImperativeHandle(\n ref,\n () => ({\n marker,\n content: contentElement,\n setMap(nextMap) {\n if (marker) {\n marker.map = nextMap;\n }\n },\n setPosition(nextPosition) {\n if (marker) {\n marker.position = toLatLng(nextPosition) || nextPosition;\n }\n },\n setZIndex(nextZIndex) {\n if (marker) {\n marker.zIndex = nextZIndex;\n }\n }\n }),\n [marker, contentElement]\n );\n\n useEffect(() => {\n if (!map || !isLoaded || marker) {\n return;\n }\n\n if (!google.maps.marker?.AdvancedMarkerElement) {\n throw new Error(\n 'AdvancedMarkerElement is unavailable. Make sure the marker library is enabled and the map uses a valid mapId.'\n );\n }\n\n const instance = new google.maps.marker.AdvancedMarkerElement({\n map: clustererContext ? undefined : map,\n content: children && contentElement ? contentElement : options?.content,\n ...options\n });\n\n setMarker(instance);\n onLoad?.(instance);\n\n return () => {\n onUnmount?.(instance);\n clustererContext?.unregisterMarker(instance);\n instance.map = null;\n };\n }, [map, isLoaded, marker, clustererContext, children, contentElement, options]);\n\n useEffect(() => {\n if (!marker || !map) {\n return;\n }\n\n marker.position = toLatLng(position) || position;\n if (title !== undefined) {\n marker.title = title;\n }\n marker.zIndex = zIndex;\n marker.gmpClickable = gmpClickable;\n marker.gmpDraggable = gmpDraggable;\n if (collisionBehavior !== undefined) {\n marker.collisionBehavior = collisionBehavior;\n }\n if (children && contentElement) {\n marker.content = contentElement;\n }\n\n if (clustererContext) {\n marker.map = null;\n clustererContext.registerMarker(marker);\n } else {\n marker.map = map;\n }\n }, [marker, map, clustererContext, position, title, zIndex, gmpClickable, gmpDraggable, collisionBehavior, children, contentElement]);\n\n useEffect(() => {\n if (!marker) {\n return;\n }\n\n const listeners = [\n addListener(marker, 'click', onClick),\n addListener(marker, 'dragstart', onDragStart),\n addListener(marker, 'drag', onDrag),\n addListener(marker, 'dragend', onDragEnd)\n ].filter(Boolean);\n\n return () => {\n listeners.forEach((listener) => listener?.remove());\n };\n }, [marker, onClick, onDragStart, onDrag, onDragEnd]);\n\n return children && contentElement ? createPortal(children, contentElement) : null;\n});\n\nexport const MapInfoWindow = forwardRef<MapInfoWindowHandle, MapInfoWindowProps>(function MapInfoWindow(\n {\n anchor,\n open = true,\n position,\n zIndex,\n options,\n children,\n onLoad,\n onUnmount,\n onCloseClick,\n onDomReady,\n onContentChanged,\n onPositionChanged,\n onZIndexChanged\n },\n ref\n) {\n const map = useGoogleMap();\n const [infoWindow, setInfoWindow] = useState<google.maps.InfoWindow | null>(null);\n const [contentElement] = useState(() => (typeof document !== 'undefined' ? document.createElement('div') : null));\n\n useImperativeHandle(\n ref,\n () => ({\n infoWindow,\n open(nextAnchor) {\n if (!infoWindow) {\n return;\n }\n infoWindow.open({\n map,\n anchor: (nextAnchor || anchor || undefined) as any\n });\n },\n close() {\n infoWindow?.close();\n },\n getContent() {\n return infoWindow?.getContent();\n },\n getPosition() {\n return infoWindow?.getPosition() || null;\n },\n getZIndex() {\n return infoWindow?.getZIndex();\n },\n setContent(content) {\n infoWindow?.setContent(content);\n },\n setPosition(nextPosition) {\n infoWindow?.setPosition(nextPosition);\n },\n setZIndex(nextZIndex) {\n infoWindow?.setZIndex(nextZIndex);\n }\n }),\n [infoWindow, map, anchor]\n );\n\n useEffect(() => {\n if (!map || infoWindow) {\n return;\n }\n\n const instance = new google.maps.InfoWindow({\n ...options,\n content: contentElement || options?.content,\n position,\n zIndex\n });\n\n setInfoWindow(instance);\n onLoad?.(instance);\n\n return () => {\n onUnmount?.(instance);\n instance.close();\n };\n }, [map, infoWindow, options, contentElement, position, zIndex]);\n\n useEffect(() => {\n if (!infoWindow) {\n return;\n }\n\n infoWindow.setOptions({\n ...options,\n content: children && contentElement ? contentElement : options?.content,\n position,\n zIndex\n });\n }, [infoWindow, options, position, zIndex, children, contentElement]);\n\n useEffect(() => {\n if (!infoWindow) {\n return;\n }\n\n if (!open) {\n infoWindow.close();\n return;\n }\n\n infoWindow.open({\n map,\n anchor: anchor as any\n });\n }, [infoWindow, map, anchor, open, position]);\n\n useEffect(() => {\n if (!infoWindow) {\n return;\n }\n\n const listeners = [\n addListener(infoWindow, 'closeclick', onCloseClick),\n addListener(infoWindow, 'domready', onDomReady),\n addListener(infoWindow, 'content_changed', onContentChanged),\n addListener(infoWindow, 'position_changed', onPositionChanged),\n addListener(infoWindow, 'zindex_changed', onZIndexChanged)\n ].filter(Boolean);\n\n return () => {\n listeners.forEach((listener) => listener?.remove());\n };\n }, [infoWindow, onCloseClick, onDomReady, onContentChanged, onPositionChanged, onZIndexChanged]);\n\n return children && contentElement ? createPortal(children, contentElement) : null;\n});\n\nexport const MapMarkerClusterer = forwardRef<MapMarkerClustererHandle, MapMarkerClustererProps>(function MapMarkerClusterer({\n children,\n algorithm,\n renderer,\n onLoad,\n onUnmount,\n onClusterClick\n}, ref) {\n const map = useGoogleMap();\n const [clusterer, setClusterer] = useState<MarkerClusterer | null>(null);\n const pendingMarkersRef = useRef<Set<MarkerLike>>(new Set());\n\n useImperativeHandle(\n ref,\n () => ({\n clusterer,\n addMarker(marker, noDraw) {\n clusterer?.addMarker(marker, noDraw);\n },\n addMarkers(markers, noDraw) {\n clusterer?.addMarkers(markers, noDraw);\n },\n removeMarker(marker, noDraw) {\n return clusterer?.removeMarker(marker, noDraw) ?? false;\n },\n clearMarkers(noDraw) {\n clusterer?.clearMarkers(noDraw);\n },\n render() {\n clusterer?.render();\n }\n }),\n [clusterer]\n );\n\n useEffect(() => {\n if (!map || clusterer) {\n return;\n }\n\n const instance = new MarkerClusterer({\n map,\n markers: Array.from(pendingMarkersRef.current),\n algorithm,\n renderer,\n onClusterClick: onClusterClick as any\n });\n\n setClusterer(instance);\n onLoad?.(instance);\n\n return () => {\n onUnmount?.(instance);\n instance.clearMarkers();\n (instance as any).setMap?.(null);\n };\n }, [map, clusterer, algorithm, renderer, onClusterClick]);\n\n const contextValue = useMemo(\n () => ({\n clusterer,\n registerMarker(marker: MarkerLike) {\n if (clusterer) {\n clusterer.addMarker(marker, true);\n clusterer.render();\n } else {\n pendingMarkersRef.current.add(marker);\n }\n },\n unregisterMarker(marker: MarkerLike) {\n pendingMarkersRef.current.delete(marker);\n if (clusterer) {\n clusterer.removeMarker(marker, true);\n clusterer.render();\n }\n }\n }),\n [clusterer]\n );\n\n return <MarkerClustererContext.Provider value={contextValue}>{children}</MarkerClustererContext.Provider>;\n});\n","import { createPortal } from 'react-dom';\nimport { forwardRef, useEffect, useImperativeHandle, useState, type ReactNode } from 'react';\nimport { useGoogleMap } from './hooks';\nimport { addListener, removeUndefined, shallowBoundsEqual, toLatLng, toMVCArrayPath, type LatLngLike } from './utils';\n\ntype ShapeBaseProps<T> = {\n options?: T;\n onLoad?: (instance: any) => void;\n onUnmount?: (instance: any) => void;\n onClick?: (event: google.maps.MapMouseEvent) => void;\n onDblClick?: (event: google.maps.MapMouseEvent) => void;\n onMouseDown?: (event: google.maps.MapMouseEvent) => void;\n onMouseMove?: (event: google.maps.MapMouseEvent) => void;\n onMouseOut?: (event: google.maps.MapMouseEvent) => void;\n onMouseOver?: (event: google.maps.MapMouseEvent) => void;\n onMouseUp?: (event: google.maps.MapMouseEvent) => void;\n onRightClick?: (event: google.maps.MapMouseEvent) => void;\n onDrag?: (event: google.maps.MapMouseEvent) => void;\n onDragEnd?: (event: google.maps.MapMouseEvent) => void;\n onDragStart?: (event: google.maps.MapMouseEvent) => void;\n};\n\nexport type MapPolylineProps = ShapeBaseProps<google.maps.PolylineOptions> & {\n path: LatLngLike[];\n};\n\nexport type MapPolygonProps = ShapeBaseProps<google.maps.PolygonOptions> & {\n paths: LatLngLike[] | LatLngLike[][];\n};\n\nexport type MapRectangleProps = ShapeBaseProps<google.maps.RectangleOptions> & {\n bounds: google.maps.LatLngBoundsLiteral;\n};\n\nexport type MapCircleProps = ShapeBaseProps<google.maps.CircleOptions> & {\n center: LatLngLike;\n radius: number;\n};\n\nexport type MapGroundOverlayProps = {\n url: string;\n bounds: google.maps.LatLngBoundsLiteral;\n opacity?: number;\n clickable?: boolean;\n onLoad?: (overlay: google.maps.GroundOverlay) => void;\n onUnmount?: (overlay: google.maps.GroundOverlay) => void;\n onClick?: (event: google.maps.MapMouseEvent) => void;\n};\n\nexport type MapControlProps = {\n position: google.maps.ControlPosition;\n children: ReactNode;\n index?: number;\n};\n\nexport type MapPolylineHandle = {\n polyline: google.maps.Polyline | null;\n getPath: () => google.maps.MVCArray<google.maps.LatLng> | null;\n getVisible: () => boolean | undefined;\n getDraggable: () => boolean | undefined;\n getEditable: () => boolean | undefined;\n setPath: (path: LatLngLike[]) => void;\n setOptions: (options: google.maps.PolylineOptions) => void;\n};\n\nexport type MapPolygonHandle = {\n polygon: google.maps.Polygon | null;\n getPath: () => google.maps.MVCArray<google.maps.LatLng> | null;\n getPaths: () => google.maps.MVCArray<google.maps.MVCArray<google.maps.LatLng>> | null;\n getVisible: () => boolean | undefined;\n getDraggable: () => boolean | undefined;\n getEditable: () => boolean | undefined;\n setPaths: (paths: LatLngLike[] | LatLngLike[][]) => void;\n setOptions: (options: google.maps.PolygonOptions) => void;\n};\n\nexport type MapRectangleHandle = {\n rectangle: google.maps.Rectangle | null;\n getBounds: () => google.maps.LatLngBounds | null;\n getVisible: () => boolean | undefined;\n getDraggable: () => boolean | undefined;\n getEditable: () => boolean | undefined;\n setBounds: (bounds: google.maps.LatLngBounds | google.maps.LatLngBoundsLiteral) => void;\n setOptions: (options: google.maps.RectangleOptions) => void;\n};\n\nexport type MapCircleHandle = {\n circle: google.maps.Circle | null;\n getBounds: () => google.maps.LatLngBounds | null;\n getCenter: () => google.maps.LatLng | null;\n getRadius: () => number | undefined;\n getVisible: () => boolean | undefined;\n getDraggable: () => boolean | undefined;\n getEditable: () => boolean | undefined;\n setCenter: (center: google.maps.LatLng | google.maps.LatLngLiteral) => void;\n setRadius: (radius: number) => void;\n setOptions: (options: google.maps.CircleOptions) => void;\n};\n\nexport type MapGroundOverlayHandle = {\n overlay: google.maps.GroundOverlay | null;\n getBounds: () => google.maps.LatLngBounds | null;\n getOpacity: () => number | null | undefined;\n getUrl: () => string | undefined;\n setOpacity: (opacity: number) => void;\n setMap: (map: google.maps.Map | null) => void;\n};\n\nexport const MapPolyline = forwardRef<MapPolylineHandle, MapPolylineProps>(function MapPolyline({\n path,\n options,\n onLoad,\n onUnmount,\n onClick,\n onDblClick,\n onMouseDown,\n onMouseMove,\n onMouseOut,\n onMouseOver,\n onMouseUp,\n onRightClick,\n onDrag,\n onDragEnd,\n onDragStart\n}: MapPolylineProps, ref) {\n const map = useGoogleMap();\n const [polyline, setPolyline] = useState<google.maps.Polyline | null>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n polyline,\n getPath() {\n return polyline?.getPath() || null;\n },\n getVisible() {\n return polyline?.getVisible();\n },\n getDraggable() {\n return polyline?.getDraggable();\n },\n getEditable() {\n return polyline?.getEditable();\n },\n setPath(nextPath) {\n polyline?.setPath(toMVCArrayPath(nextPath));\n },\n setOptions(nextOptions) {\n polyline?.setOptions(nextOptions);\n }\n }),\n [polyline]\n );\n\n useEffect(() => {\n if (!map || polyline) {\n return;\n }\n\n const instance = new google.maps.Polyline({ map });\n setPolyline(instance);\n onLoad?.(instance);\n\n return () => {\n onUnmount?.(instance);\n instance.setMap(null);\n };\n }, [map, polyline]);\n\n useEffect(() => {\n if (!polyline) {\n return;\n }\n\n polyline.setOptions({\n ...options,\n path: toMVCArrayPath(path),\n map\n });\n }, [polyline, map, path, options]);\n\n useShapeEvents(polyline, { onClick, onDblClick, onMouseDown, onMouseMove, onMouseOut, onMouseOver, onMouseUp, onRightClick, onDrag, onDragEnd, onDragStart });\n return null;\n});\n\nexport const MapPolygon = forwardRef<MapPolygonHandle, MapPolygonProps>(function MapPolygon({\n paths,\n options,\n onLoad,\n onUnmount,\n onClick,\n onDblClick,\n onMouseDown,\n onMouseMove,\n onMouseOut,\n onMouseOver,\n onMouseUp,\n onRightClick,\n onDrag,\n onDragEnd,\n onDragStart\n}: MapPolygonProps, ref) {\n const map = useGoogleMap();\n const [polygon, setPolygon] = useState<google.maps.Polygon | null>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n polygon,\n getPath() {\n return polygon?.getPath() || null;\n },\n getPaths() {\n return polygon?.getPaths() || null;\n },\n getVisible() {\n return polygon?.getVisible();\n },\n getDraggable() {\n return polygon?.getDraggable();\n },\n getEditable() {\n return polygon?.getEditable();\n },\n setPaths(nextPaths) {\n const value = Array.isArray(nextPaths[0])\n ? (nextPaths as LatLngLike[][]).map((path) => toMVCArrayPath(path))\n : toMVCArrayPath(nextPaths as LatLngLike[]);\n polygon?.setPaths(value as any);\n },\n setOptions(nextOptions) {\n polygon?.setOptions(nextOptions);\n }\n }),\n [polygon]\n );\n\n useEffect(() => {\n if (!map || polygon) {\n return;\n }\n\n const instance = new google.maps.Polygon({ map });\n setPolygon(instance);\n onLoad?.(instance);\n\n return () => {\n onUnmount?.(instance);\n instance.setMap(null);\n };\n }, [map, polygon]);\n\n useEffect(() => {\n if (!polygon) {\n return;\n }\n\n const nextPaths = Array.isArray(paths[0])\n ? (paths as LatLngLike[][]).map((path) => toMVCArrayPath(path))\n : toMVCArrayPath(paths as LatLngLike[]);\n\n polygon.setOptions({\n ...options,\n paths: nextPaths as any,\n map\n });\n }, [polygon, map, paths, options]);\n\n useShapeEvents(polygon, { onClick, onDblClick, onMouseDown, onMouseMove, onMouseOut, onMouseOver, onMouseUp, onRightClick, onDrag, onDragEnd, onDragStart });\n return null;\n});\n\nexport const MapRectangle = forwardRef<MapRectangleHandle, MapRectangleProps>(function MapRectangle({\n bounds,\n options,\n onLoad,\n onUnmount,\n onClick,\n onDblClick,\n onMouseDown,\n onMouseMove,\n onMouseOut,\n onMouseOver,\n onMouseUp,\n onRightClick,\n onDrag,\n onDragEnd,\n onDragStart\n}: MapRectangleProps, ref) {\n const map = useGoogleMap();\n const [rectangle, setRectangle] = useState<google.maps.Rectangle | null>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n rectangle,\n getBounds() {\n return rectangle?.getBounds() || null;\n },\n getVisible() {\n return rectangle?.getVisible();\n },\n getDraggable() {\n return rectangle?.getDraggable();\n },\n getEditable() {\n return rectangle?.getEditable();\n },\n setBounds(nextBounds) {\n rectangle?.setBounds(nextBounds);\n },\n setOptions(nextOptions) {\n rectangle?.setOptions(nextOptions);\n }\n }),\n [rectangle]\n );\n\n useEffect(() => {\n if (!map || rectangle) {\n return;\n }\n\n const instance = new google.maps.Rectangle({ map });\n setRectangle(instance);\n onLoad?.(instance);\n\n return () => {\n onUnmount?.(instance);\n instance.setMap(null);\n };\n }, [map, rectangle]);\n\n useEffect(() => {\n if (!rectangle) {\n return;\n }\n\n if (!shallowBoundsEqual(rectangle.getBounds()?.toJSON(), bounds)) {\n rectangle.setBounds(bounds);\n }\n\n rectangle.setOptions({\n ...options,\n map\n });\n }, [rectangle, map, bounds, options]);\n\n useShapeEvents(rectangle, { onClick, onDblClick, onMouseDown, onMouseMove, onMouseOut, onMouseOver, onMouseUp, onRightClick, onDrag, onDragEnd, onDragStart });\n return null;\n});\n\nexport const MapCircle = forwardRef<MapCircleHandle, MapCircleProps>(function MapCircle({\n center,\n radius,\n options,\n onLoad,\n onUnmount,\n onClick,\n onDblClick,\n onMouseDown,\n onMouseMove,\n onMouseOut,\n onMouseOver,\n onMouseUp,\n onRightClick,\n onDrag,\n onDragEnd,\n onDragStart\n}: MapCircleProps, ref) {\n const map = useGoogleMap();\n const [circle, setCircle] = useState<google.maps.Circle | null>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n circle,\n getBounds() {\n return circle?.getBounds() || null;\n },\n getCenter() {\n return circle?.getCenter() || null;\n },\n getRadius() {\n return circle?.getRadius();\n },\n getVisible() {\n return circle?.getVisible();\n },\n getDraggable() {\n return circle?.getDraggable();\n },\n getEditable() {\n return circle?.getEditable();\n },\n setCenter(nextCenter) {\n circle?.setCenter(nextCenter);\n },\n setRadius(nextRadius) {\n circle?.setRadius(nextRadius);\n },\n setOptions(nextOptions) {\n circle?.setOptions(nextOptions);\n }\n }),\n [circle]\n );\n\n useEffect(() => {\n if (!map || circle) {\n return;\n }\n\n const instance = new google.maps.Circle({ map });\n setCircle(instance);\n onLoad?.(instance);\n\n return () => {\n onUnmount?.(instance);\n instance.setMap(null);\n };\n }, [map, circle]);\n\n useEffect(() => {\n if (!circle) {\n return;\n }\n\n circle.setOptions({\n ...options,\n center,\n radius,\n map\n });\n }, [circle, map, center, radius, options]);\n\n useShapeEvents(circle, { onClick, onDblClick, onMouseDown, onMouseMove, onMouseOut, onMouseOver, onMouseUp, onRightClick, onDrag, onDragEnd, onDragStart });\n return null;\n});\n\nexport const MapGroundOverlay = forwardRef<MapGroundOverlayHandle, MapGroundOverlayProps>(function MapGroundOverlay({ url, bounds, opacity, clickable, onLoad, onUnmount, onClick }: MapGroundOverlayProps, ref) {\n const map = useGoogleMap();\n const [overlay, setOverlay] = useState<google.maps.GroundOverlay | null>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n overlay,\n getBounds() {\n return overlay?.getBounds() || null;\n },\n getOpacity() {\n return overlay?.getOpacity();\n },\n getUrl() {\n return overlay?.getUrl();\n },\n setOpacity(nextOpacity) {\n overlay?.setOpacity(nextOpacity);\n },\n setMap(nextMap) {\n overlay?.setMap(nextMap);\n }\n }),\n [overlay]\n );\n\n useEffect(() => {\n if (!map) {\n return;\n }\n\n const instance = new google.maps.GroundOverlay(url, bounds, removeUndefined({ opacity, clickable }));\n instance.setMap(map);\n setOverlay(instance);\n onLoad?.(instance);\n\n return () => {\n onUnmount?.(instance);\n instance.setMap(null);\n };\n }, [map, url, JSON.stringify(bounds), opacity, clickable]);\n\n useEffect(() => {\n if (!overlay) {\n return;\n }\n\n const listener = addListener(overlay, 'click', onClick);\n return () => {\n listener?.remove();\n };\n }, [overlay, onClick]);\n\n return null;\n});\n\nexport function MapControl({ position, children, index }: MapControlProps) {\n const map = useGoogleMap();\n const [element] = useState(() => (typeof document !== 'undefined' ? document.createElement('div') : null));\n\n useEffect(() => {\n if (!map || !element) {\n return;\n }\n\n const controls = map.controls[position];\n if (typeof index === 'number' && index >= 0 && index < controls.getLength()) {\n controls.insertAt(index, element);\n } else {\n controls.push(element);\n }\n\n return () => {\n const nextControls = map.controls[position];\n for (let currentIndex = 0; currentIndex < nextControls.getLength(); currentIndex += 1) {\n if (nextControls.getAt(currentIndex) === element) {\n nextControls.removeAt(currentIndex);\n break;\n }\n }\n };\n }, [map, element, position, index]);\n\n return element ? createPortal(children, element) : null;\n}\n\nfunction useShapeEvents(\n shape: google.maps.Polyline | google.maps.Polygon | google.maps.Rectangle | google.maps.Circle | null,\n handlers: {\n onClick?: (event: google.maps.MapMouseEvent) => void;\n onDblClick?: (event: google.maps.MapMouseEvent) => void;\n onMouseDown?: (event: google.maps.MapMouseEvent) => void;\n onMouseMove?: (event: google.maps.MapMouseEvent) => void;\n onMouseOut?: (event: google.maps.MapMouseEvent) => void;\n onMouseOver?: (event: google.maps.MapMouseEvent) => void;\n onMouseUp?: (event: google.maps.MapMouseEvent) => void;\n onRightClick?: (event: google.maps.MapMouseEvent) => void;\n onDrag?: (event: google.maps.MapMouseEvent) => void;\n onDragEnd?: (event: google.maps.MapMouseEvent) => void;\n onDragStart?: (event: google.maps.MapMouseEvent) => void;\n }\n) {\n useEffect(() => {\n if (!shape) {\n return;\n }\n\n const listeners = [\n addListener(shape, 'click', handlers.onClick),\n addListener(shape, 'dblclick', handlers.onDblClick),\n addListener(shape, 'mousedown', handlers.onMouseDown),\n addListener(shape, 'mousemove', handlers.onMouseMove),\n addListener(shape, 'mouseout', handlers.onMouseOut),\n addListener(shape, 'mouseover', handlers.onMouseOver),\n addListener(shape, 'mouseup', handlers.onMouseUp),\n addListener(shape, 'rightclick', handlers.onRightClick),\n addListener(shape, 'drag', handlers.onDrag),\n addListener(shape, 'dragend', handlers.onDragEnd),\n addListener(shape, 'dragstart', handlers.onDragStart)\n ].filter(Boolean);\n\n return () => {\n listeners.forEach((listener) => listener?.remove());\n };\n }, [shape, handlers.onClick, handlers.onDblClick, handlers.onMouseDown, handlers.onMouseMove, handlers.onMouseOut, handlers.onMouseOver, handlers.onMouseUp, handlers.onRightClick, handlers.onDrag, handlers.onDragEnd, handlers.onDragStart]);\n}\n","import { forwardRef, useEffect, useImperativeHandle, useState } from 'react';\nimport { useGoogleMap } from './hooks';\nimport { removeUndefined, toLatLng, type LatLngLike } from './utils';\n\nexport type HeatmapDatum =\n | LatLngLike\n | google.maps.visualization.WeightedLocation\n | {\n location: LatLngLike;\n weight: number;\n };\n\nexport type MapTrafficLayerHandle = {\n layer: google.maps.TrafficLayer | null;\n setMap: (map: google.maps.Map | null) => void;\n setOptions: (options: google.maps.TrafficLayerOptions) => void;\n};\n\nexport type MapTransitLayerHandle = {\n layer: google.maps.TransitLayer | null;\n setMap: (map: google.maps.Map | null) => void;\n};\n\nexport type MapBicyclingLayerHandle = {\n layer: google.maps.BicyclingLayer | null;\n setMap: (map: google.maps.Map | null) => void;\n};\n\nexport type MapKmlLayerHandle = {\n layer: google.maps.KmlLayer | null;\n getDefaultViewport: () => google.maps.LatLngBounds | null;\n getMetadata: () => google.maps.KmlLayerMetadata | null;\n getStatus: () => google.maps.KmlLayerStatus | null;\n getUrl: () => string | null;\n setMap: (map: google.maps.Map | null) => void;\n setOptions: (options: google.maps.KmlLayerOptions) => void;\n setUrl: (url: string) => void;\n};\n\nexport type MapHeatmapLayerHandle = {\n layer: google.maps.visualization.HeatmapLayer | null;\n getData: () => google.maps.MVCArray<google.maps.LatLng | google.maps.visualization.WeightedLocation> | null;\n setData: (data: HeatmapDatum[]) => void;\n setMap: (map: google.maps.Map | null) => void;\n setOptions: (options: google.maps.visualization.HeatmapLayerOptions) => void;\n};\n\nexport type MapKmlLayerProps = {\n url: string;\n options?: google.maps.KmlLayerOptions;\n onLoad?: (layer: google.maps.KmlLayer) => void;\n onUnmount?: (layer: google.maps.KmlLayer) => void;\n};\n\nexport type MapHeatmapLayerProps = {\n data: HeatmapDatum[];\n options?: google.maps.visualization.HeatmapLayerOptions;\n onLoad?: (layer: google.maps.visualization.HeatmapLayer) => void;\n onUnmount?: (layer: google.maps.visualization.HeatmapLayer) => void;\n};\n\nexport const MapTrafficLayer = forwardRef<MapTrafficLayerHandle, { options?: google.maps.TrafficLayerOptions; onLoad?: (layer: google.maps.TrafficLayer) => void; onUnmount?: (layer: google.maps.TrafficLayer) => void }>(function MapTrafficLayer({ options, onLoad, onUnmount }, ref) {\n const map = useGoogleMap();\n const [layer, setLayer] = useState<google.maps.TrafficLayer | null>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n layer,\n setMap(nextMap) {\n layer?.setMap(nextMap);\n },\n setOptions(nextOptions) {\n layer?.setOptions(nextOptions);\n }\n }),\n [layer]\n );\n\n useEffect(() => {\n if (!map || layer) {\n return;\n }\n\n const instance = new google.maps.TrafficLayer(options);\n instance.setMap(map);\n setLayer(instance);\n onLoad?.(instance);\n\n return () => {\n onUnmount?.(instance);\n instance.setMap(null);\n };\n }, [map, layer]);\n\n useEffect(() => {\n if (layer && options) {\n layer.setOptions(options);\n }\n }, [layer, options]);\n\n return null;\n});\n\nexport const MapTransitLayer = forwardRef<MapTransitLayerHandle, { onLoad?: (layer: google.maps.TransitLayer) => void; onUnmount?: (layer: google.maps.TransitLayer) => void }>(function MapTransitLayer({ onLoad, onUnmount }, ref) {\n const map = useGoogleMap();\n const [layer, setLayer] = useState<google.maps.TransitLayer | null>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n layer,\n setMap(nextMap) {\n layer?.setMap(nextMap);\n }\n }),\n [layer]\n );\n\n useEffect(() => {\n if (!map) {\n return;\n }\n\n const layer = new google.maps.TransitLayer();\n layer.setMap(map);\n setLayer(layer);\n onLoad?.(layer);\n\n return () => {\n onUnmount?.(layer);\n layer.setMap(null);\n };\n }, [map]);\n\n return null;\n});\n\nexport const MapBicyclingLayer = forwardRef<MapBicyclingLayerHandle, { onLoad?: (layer: google.maps.BicyclingLayer) => void; onUnmount?: (layer: google.maps.BicyclingLayer) => void }>(function MapBicyclingLayer({ onLoad, onUnmount }, ref) {\n const map = useGoogleMap();\n const [layer, setLayer] = useState<google.maps.BicyclingLayer | null>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n layer,\n setMap(nextMap) {\n layer?.setMap(nextMap);\n }\n }),\n [layer]\n );\n\n useEffect(() => {\n if (!map) {\n return;\n }\n\n const layer = new google.maps.BicyclingLayer();\n layer.setMap(map);\n setLayer(layer);\n onLoad?.(layer);\n\n return () => {\n onUnmount?.(layer);\n layer.setMap(null);\n };\n }, [map]);\n\n return null;\n});\n\nexport const MapKmlLayer = forwardRef<MapKmlLayerHandle, MapKmlLayerProps>(function MapKmlLayer({\n url,\n options,\n onLoad,\n onUnmount\n}, ref) {\n const map = useGoogleMap();\n const [layer, setLayer] = useState<google.maps.KmlLayer | null>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n layer,\n getDefaultViewport() {\n return layer?.getDefaultViewport() || null;\n },\n getMetadata() {\n return layer?.getMetadata() || null;\n },\n getStatus() {\n return layer?.getStatus() || null;\n },\n getUrl() {\n return layer?.getUrl() || null;\n },\n setMap(nextMap) {\n layer?.setMap(nextMap);\n },\n setOptions(nextOptions) {\n layer?.setOptions(nextOptions);\n },\n setUrl(nextUrl) {\n layer?.setUrl(nextUrl);\n }\n }),\n [layer]\n );\n\n useEffect(() => {\n if (!map) {\n return;\n }\n\n const instance = new google.maps.KmlLayer({\n ...options,\n map,\n url\n });\n setLayer(instance);\n onLoad?.(instance);\n\n return () => {\n onUnmount?.(instance);\n instance.setMap(null);\n };\n }, [map, url]);\n\n useEffect(() => {\n if (!layer) {\n return;\n }\n\n layer.setOptions({\n ...options,\n map\n });\n layer.setUrl(url);\n }, [layer, options, map, url]);\n\n return null;\n});\n\nexport const MapHeatmapLayer = forwardRef<MapHeatmapLayerHandle, MapHeatmapLayerProps>(function MapHeatmapLayer({\n data,\n options,\n onLoad,\n onUnmount\n}, ref) {\n const map = useGoogleMap();\n const [layer, setLayer] = useState<google.maps.visualization.HeatmapLayer | null>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n layer,\n getData() {\n return layer?.getData() || null;\n },\n setData(nextData) {\n layer?.setData(normalizeHeatmapData(nextData));\n },\n setMap(nextMap) {\n layer?.setMap(nextMap);\n },\n setOptions(nextOptions) {\n layer?.setOptions(nextOptions);\n }\n }),\n [layer]\n );\n\n useEffect(() => {\n if (!map) {\n return;\n }\n\n if (!google.maps.visualization?.HeatmapLayer) {\n throw new Error('HeatmapLayer is unavailable. Make sure the visualization library is enabled.');\n }\n\n const instance = new google.maps.visualization.HeatmapLayer({\n ...options,\n map,\n data: normalizeHeatmapData(data)\n });\n setLayer(instance);\n onLoad?.(instance);\n\n return () => {\n onUnmount?.(instance);\n instance.setMap(null);\n };\n }, [map]);\n\n useEffect(() => {\n if (!layer) {\n return;\n }\n\n layer.setOptions({\n ...options,\n data: normalizeHeatmapData(data),\n map\n });\n }, [layer, options, data, map]);\n\n return null;\n});\n\nfunction normalizeHeatmapData(data: HeatmapDatum[]) {\n return data.map((entry) => {\n if ('location' in (entry as any)) {\n const weighted = entry as { location: LatLngLike; weight: number };\n return {\n location: toLatLng(weighted.location)!,\n weight: weighted.weight\n } as google.maps.visualization.WeightedLocation;\n }\n\n return toLatLng(entry as LatLngLike)!;\n });\n}\n","import { forwardRef, useEffect, useImperativeHandle, useRef, useState } from 'react';\nimport { useDirectionsService, useGoogleMap } from './hooks';\nimport { addListener } from './utils';\n\nexport type DirectionsServiceResult = {\n status: google.maps.DirectionsStatus;\n result: google.maps.DirectionsResult | null;\n};\n\nexport type MapDirectionsRendererHandle = {\n renderer: google.maps.DirectionsRenderer | null;\n getDirections: () => google.maps.DirectionsResult | null | undefined;\n getPanel: () => Node | null | undefined;\n getRouteIndex: () => number | undefined;\n setDirections: (directions: google.maps.DirectionsResult | null) => void;\n setOptions: (options: google.maps.DirectionsRendererOptions) => void;\n setRouteIndex: (routeIndex: number) => void;\n};\n\nexport type MapDirectionsRendererProps = {\n directions?: google.maps.DirectionsResult | null;\n options?: google.maps.DirectionsRendererOptions;\n onLoad?: (renderer: google.maps.DirectionsRenderer) => void;\n onUnmount?: (renderer: google.maps.DirectionsRenderer) => void;\n onDirectionsChanged?: () => void;\n};\n\nexport const MapDirectionsRenderer = forwardRef<MapDirectionsRendererHandle, MapDirectionsRendererProps>(function MapDirectionsRenderer({\n directions,\n options,\n onLoad,\n onUnmount,\n onDirectionsChanged\n}, ref) {\n const map = useGoogleMap();\n const [renderer, setRenderer] = useState<google.maps.DirectionsRenderer | null>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n renderer,\n getDirections() {\n return renderer?.getDirections() || null;\n },\n getPanel() {\n return renderer?.getPanel() || null;\n },\n getRouteIndex() {\n return renderer?.getRouteIndex();\n },\n setDirections(nextDirections) {\n renderer?.setDirections(nextDirections);\n },\n setOptions(nextOptions) {\n renderer?.setOptions(nextOptions);\n },\n setRouteIndex(nextRouteIndex) {\n renderer?.setRouteIndex(nextRouteIndex);\n }\n }),\n [renderer]\n );\n\n useEffect(() => {\n if (!map || renderer) {\n return;\n }\n\n const instance = new google.maps.DirectionsRenderer({\n ...options,\n map\n });\n setRenderer(instance);\n onLoad?.(instance);\n\n return () => {\n onUnmount?.(instance);\n instance.setMap(null);\n };\n }, [map, renderer]);\n\n useEffect(() => {\n if (!renderer) {\n return;\n }\n\n renderer.setOptions({\n ...options,\n directions: directions || undefined,\n map\n });\n }, [renderer, directions, options, map]);\n\n useEffect(() => {\n if (!renderer) {\n return;\n }\n\n const listener = addListener(renderer, 'directions_changed', onDirectionsChanged);\n return () => {\n listener?.remove();\n };\n }, [renderer, onDirectionsChanged]);\n\n return null;\n});\n\nexport function MapDirectionsService({\n request,\n onResult,\n onError\n}: {\n request?: google.maps.DirectionsRequest | null;\n onResult: (response: DirectionsServiceResult) => void;\n onError?: (error: Error) => void;\n}) {\n const service = useDirectionsService();\n const requestIdRef = useRef(0);\n\n useEffect(() => {\n if (!service || !request) {\n return;\n }\n\n requestIdRef.current += 1;\n const currentRequestId = requestIdRef.current;\n\n service.route(request, (result, status) => {\n if (currentRequestId !== requestIdRef.current) {\n return;\n }\n\n if (status === google.maps.DirectionsStatus.OK && result) {\n onResult({ status, result });\n } else {\n const error = new Error(`Directions request failed with status ${status}.`);\n onResult({ status, result: result || null });\n onError?.(error);\n }\n });\n }, [service, request, onResult, onError]);\n\n return null;\n}\n"],"mappings":"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","names":["useEffect","useMemo","useRef","useState","useContext","useContext","google","jsx","GoogleMap","google","useRef","useState","useEffect","useMemo","useContext","forwardRef","useEffect","useImperativeHandle","useMemo","useRef","useState","jsx","forwardRef","MapMarker","useContext","useState","useImperativeHandle","useEffect","MapAdvancedMarker","MapInfoWindow","MapMarkerClusterer","useRef","useMemo","createPortal","forwardRef","useEffect","useImperativeHandle","useState","forwardRef","MapPolyline","useState","useImperativeHandle","useEffect","MapPolygon","MapRectangle","MapCircle","MapGroundOverlay","createPortal","forwardRef","useEffect","useImperativeHandle","useState","forwardRef","MapTrafficLayer","useState","useImperativeHandle","useEffect","MapTransitLayer","layer","MapBicyclingLayer","MapKmlLayer","MapHeatmapLayer","forwardRef","useEffect","useImperativeHandle","useRef","useState","forwardRef","MapDirectionsRenderer","useState","useImperativeHandle","useEffect","useRef"]}
|
|
1
|
+
{"version":3,"sources":["../src/GoogleMapsProvider.tsx","../src/internal.tsx","../src/loadGoogleMapsApi.ts","../src/clusterRenderer.ts","../src/GoogleMap.tsx","../src/hooks.ts","../src/utils.ts","../src/markers.tsx","../src/shapes.tsx","../src/layers.tsx","../src/directions.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from 'react';\nimport { GoogleMapsApiContext, type GoogleMapsStatus } from './internal';\nimport { loadGoogleMapsApi, type GoogleMapsApiLoadOptions } from './loadGoogleMapsApi';\n\nexport type GoogleMapsProviderProps = GoogleMapsApiLoadOptions & {\n children: ReactNode;\n};\n\nexport function GoogleMapsProvider({ children, ...options }: GoogleMapsProviderProps) {\n const [status, setStatus] = useState<GoogleMapsStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n const [googleApi, setGoogleApi] = useState<typeof google | null>(() =>\n typeof window !== 'undefined' && window.google?.maps ? window.google : null\n );\n\n const serializedOptions = JSON.stringify({\n ...options,\n libraries: options.libraries || [],\n mapIds: options.mapIds || []\n });\n\n useEffect(() => {\n let cancelled = false;\n\n setStatus((current) => (current === 'ready' ? current : 'loading'));\n setError(null);\n\n loadGoogleMapsApi(options)\n .then((googleNamespace) => {\n if (cancelled) {\n return;\n }\n setGoogleApi(googleNamespace);\n setStatus('ready');\n })\n .catch((nextError) => {\n if (cancelled) {\n return;\n }\n setError(nextError instanceof Error ? nextError : new Error(String(nextError)));\n setStatus('error');\n });\n\n return () => {\n cancelled = true;\n };\n }, [serializedOptions]);\n\n const value = useMemo(\n () => ({\n status,\n error,\n google: googleApi,\n options\n }),\n [status, error, googleApi, serializedOptions]\n );\n\n return <GoogleMapsApiContext.Provider value={value}>{children}</GoogleMapsApiContext.Provider>;\n}\n","import { createContext, useContext } from 'react';\nimport type { MarkerClusterer } from '@googlemaps/markerclusterer';\nimport type { GoogleMapsApiLoadOptions } from './loadGoogleMapsApi';\n\nexport type GoogleMapsStatus = 'idle' | 'loading' | 'ready' | 'error';\n\nexport type GoogleMapsApiContextValue = {\n status: GoogleMapsStatus;\n error: Error | null;\n google: typeof google | null;\n options: GoogleMapsApiLoadOptions | null;\n};\n\nexport type MarkerLike = google.maps.Marker | google.maps.marker.AdvancedMarkerElement;\n\nexport type MarkerClustererContextValue = {\n clusterer: MarkerClusterer | null;\n registerMarker: (marker: MarkerLike) => void;\n unregisterMarker: (marker: MarkerLike) => void;\n};\n\nexport const GoogleMapsApiContext = createContext<GoogleMapsApiContextValue>({\n status: 'idle',\n error: null,\n google: null,\n options: null\n});\n\nexport const GoogleMapContext = createContext<google.maps.Map | null>(null);\nexport const MarkerClustererContext = createContext<MarkerClustererContextValue | null>(null);\n\nexport function useRequiredGoogleMap(componentName: string) {\n const map = useContext(GoogleMapContext);\n if (!map) {\n throw new Error(`${componentName} must be rendered inside <GoogleMap>.`);\n }\n return map;\n}\n\nexport function useGoogleMapsApiContext() {\n return useContext(GoogleMapsApiContext);\n}\n\nexport function useMarkerClustererContext() {\n return useContext(MarkerClustererContext);\n}\n","export type GoogleMapsApiLoadOptions = {\n apiKey?: string;\n version?: string;\n language?: string;\n region?: string;\n libraries?: string[];\n mapIds?: string[];\n authReferrerPolicy?: string;\n channel?: string;\n solutionChannel?: string;\n nonce?: string;\n};\n\nconst DEFAULT_LIBRARIES = [] as const;\n\nlet loaderPromise: Promise<typeof google> | null = null;\nlet loadedOptionsKey: string | null = null;\ntype CallbackWindow = Window & { [key: string]: (() => void) | undefined };\n\nexport function getDefaultGoogleMapsLibraries() {\n return [...DEFAULT_LIBRARIES];\n}\n\nexport function loadGoogleMapsApi(options: GoogleMapsApiLoadOptions): Promise<typeof google> {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return Promise.reject(new Error('@revivejs/react-google-maps can only load the Google Maps API in a browser environment.'));\n }\n\n if (window.google?.maps) {\n return Promise.resolve(window.google);\n }\n\n const normalizedOptions = normalizeLoaderOptions(options);\n const nextKey = JSON.stringify(normalizedOptions);\n\n if (loaderPromise) {\n if (loadedOptionsKey && loadedOptionsKey !== nextKey) {\n console.warn(\n '@revivejs/react-google-maps only loads the Google Maps JavaScript API once per page. ' +\n 'Ignoring subsequent loader options and reusing the first loaded configuration.'\n );\n }\n return loaderPromise;\n }\n\n loadedOptionsKey = nextKey;\n\n loaderPromise = new Promise<typeof google>((resolve, reject) => {\n const callbackName = '__revivejsReactGoogleMapsInit';\n const existingScript = document.querySelector<HTMLScriptElement>('script[data-revivejs-google-maps-loader=\"true\"]');\n\n if (existingScript) {\n existingScript.addEventListener('load', () => {\n if (window.google?.maps) {\n resolve(window.google);\n } else {\n reject(new Error('Google Maps script loaded but the google.maps namespace is still unavailable.'));\n }\n });\n existingScript.addEventListener('error', () => reject(new Error('The Google Maps JavaScript API script failed to load.')));\n return;\n }\n\n const params = new URLSearchParams();\n params.set('key', normalizedOptions.apiKey ?? '');\n params.set('v', normalizedOptions.version);\n params.set('loading', 'async');\n params.set('callback', callbackName);\n\n if (normalizedOptions.language) {\n params.set('language', normalizedOptions.language);\n }\n if (normalizedOptions.region) {\n params.set('region', normalizedOptions.region);\n }\n if (normalizedOptions.libraries.length) {\n params.set('libraries', normalizedOptions.libraries.join(','));\n }\n if (normalizedOptions.mapIds.length) {\n params.set('map_ids', normalizedOptions.mapIds.join(','));\n }\n if (normalizedOptions.authReferrerPolicy) {\n params.set('auth_referrer_policy', normalizedOptions.authReferrerPolicy);\n }\n if (normalizedOptions.channel) {\n params.set('channel', normalizedOptions.channel);\n }\n if (normalizedOptions.solutionChannel) {\n params.set('solution_channel', normalizedOptions.solutionChannel);\n }\n\n const script = document.createElement('script');\n script.async = true;\n script.defer = true;\n script.dataset.revivejsGoogleMapsLoader = 'true';\n script.src = `https://maps.googleapis.com/maps/api/js?${params.toString()}`;\n\n if (normalizedOptions.nonce) {\n script.nonce = normalizedOptions.nonce;\n }\n\n (window as unknown as CallbackWindow)[callbackName] = () => {\n delete (window as unknown as CallbackWindow)[callbackName];\n if (window.google?.maps) {\n resolve(window.google);\n } else {\n reject(new Error('Google Maps callback fired but the google.maps namespace is unavailable.'));\n }\n };\n\n script.onerror = () => {\n loaderPromise = null;\n loadedOptionsKey = null;\n delete (window as unknown as CallbackWindow)[callbackName];\n reject(new Error('The Google Maps JavaScript API script failed to load.'));\n };\n\n document.head.appendChild(script);\n });\n\n return loaderPromise;\n}\n\ntype NormalizedGoogleMapsApiLoadOptions = Omit<\n GoogleMapsApiLoadOptions,\n 'version' | 'libraries' | 'mapIds'\n> & {\n version: string;\n libraries: string[];\n mapIds: string[];\n};\n\nfunction normalizeLoaderOptions(options: GoogleMapsApiLoadOptions): NormalizedGoogleMapsApiLoadOptions {\n return {\n ...options,\n version: options.version || 'weekly',\n libraries: Array.from(new Set([...(options.libraries || []), ...DEFAULT_LIBRARIES])).sort(),\n mapIds: Array.from(new Set(options.mapIds || [])).sort()\n };\n}\n","import type { Cluster, ClusterStats, Renderer } from '@googlemaps/markerclusterer';\n\nexport type ClusterRendererContext = {\n cluster: Cluster;\n stats: ClusterStats;\n map: google.maps.Map;\n count: number;\n position: google.maps.LatLng;\n color: string;\n isAdvancedMarkerAvailable: boolean;\n};\n\nexport type CreateClusterRendererOptions = {\n className?: string;\n useAdvancedMarker?: boolean;\n zIndexBase?: number;\n title?: string | ((context: ClusterRendererContext) => string);\n render?: (context: ClusterRendererContext) => HTMLElement | string;\n fallbackTextColor?: string;\n fallbackBorderColor?: string;\n color?: string | ((context: ClusterRendererContext) => string);\n};\n\nexport function createClusterRenderer(options: CreateClusterRendererOptions = {}): Renderer {\n return {\n render(cluster, stats, map) {\n const count = cluster.count;\n const position = cluster.position;\n const contextBase = {\n cluster,\n stats,\n map,\n count,\n position,\n color: '',\n isAdvancedMarkerAvailable: false\n } satisfies Omit<ClusterRendererContext, 'color' | 'isAdvancedMarkerAvailable'> & {\n color: string;\n isAdvancedMarkerAvailable: boolean;\n };\n\n const color =\n typeof options.color === 'function'\n ? options.color(contextBase)\n : options.color || getDefaultClusterColor(count, stats);\n\n const isAdvancedMarkerAvailable =\n options.useAdvancedMarker !== false &&\n !!google.maps.marker?.AdvancedMarkerElement &&\n !!map.get('mapId');\n\n const context: ClusterRendererContext = {\n ...contextBase,\n color,\n isAdvancedMarkerAvailable\n };\n\n const title = typeof options.title === 'function' ? options.title(context) : options.title || `Cluster with ${count} markers`;\n const zIndex = (options.zIndexBase || 1000) + count;\n\n if (isAdvancedMarkerAvailable) {\n return new google.maps.marker.AdvancedMarkerElement({\n position,\n title,\n zIndex,\n content: buildAdvancedClusterContent(context, options)\n });\n }\n\n return new google.maps.Marker({\n position,\n title,\n zIndex,\n label: {\n text: String(count),\n color: options.fallbackTextColor || '#ffffff',\n fontSize: '12px',\n fontWeight: '700'\n },\n icon: {\n url: buildFallbackClusterSvg(\n color,\n options.fallbackBorderColor || 'rgba(255,255,255,0.92)'\n ),\n scaledSize: new google.maps.Size(46, 46)\n }\n });\n }\n };\n}\n\nfunction buildAdvancedClusterContent(\n context: ClusterRendererContext,\n options: CreateClusterRendererOptions\n) {\n const customContent = options.render?.(context);\n if (customContent instanceof HTMLElement) {\n return customContent;\n }\n\n const element = document.createElement('div');\n element.className = options.className || 'revivejs-cluster-badge';\n element.style.display = 'grid';\n element.style.gap = '2px';\n element.style.minWidth = '52px';\n element.style.padding = '10px 12px';\n element.style.borderRadius = '999px';\n element.style.background = context.color;\n element.style.color = '#ffffff';\n element.style.boxShadow = '0 12px 24px rgba(16, 32, 51, 0.18)';\n element.style.border = '2px solid rgba(255,255,255,0.88)';\n element.style.textAlign = 'center';\n element.style.fontFamily = 'Avenir Next, Segoe UI, sans-serif';\n\n const countNode = document.createElement('strong');\n countNode.textContent = String(context.count);\n countNode.style.fontSize = '14px';\n countNode.style.lineHeight = '1';\n\n const labelNode = document.createElement('span');\n labelNode.textContent = typeof customContent === 'string' ? customContent : 'markers';\n labelNode.style.fontSize = '10px';\n labelNode.style.opacity = '0.92';\n labelNode.style.lineHeight = '1';\n\n element.append(countNode, labelNode);\n return element;\n}\n\nfunction getDefaultClusterColor(count: number, stats: ClusterStats) {\n return count > Math.max(10, stats.clusters.markers.mean) ? '#d94b2b' : '#0d5c9e';\n}\n\nfunction buildFallbackClusterSvg(fill: string, stroke: string) {\n const svg = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 64 64\">\n <circle cx=\"32\" cy=\"32\" r=\"28\" fill=\"${fill}\" stroke=\"${stroke}\" stroke-width=\"4\" />\n </svg>\n `;\n\n return `data:image/svg+xml;base64,${window.btoa(svg)}`;\n}\n","import {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode\n} from 'react';\nimport { GoogleMapContext } from './internal';\nimport { useGoogleMapsApi } from './hooks';\nimport { addListener, composeMapOptions, toLatLng, type LatLngLike } from './utils';\n\nexport type GoogleMapHandle = {\n map: google.maps.Map | null;\n fitBounds: (bounds: google.maps.LatLngBounds | google.maps.LatLngBoundsLiteral) => void;\n panBy: (x: number, y: number) => void;\n panTo: (position: google.maps.LatLng | google.maps.LatLngLiteral) => void;\n panToBounds: (\n bounds: google.maps.LatLngBounds | google.maps.LatLngBoundsLiteral,\n padding?: number | google.maps.Padding\n ) => void;\n setZoom: (zoom: number) => void;\n setCenter: (position: google.maps.LatLng | google.maps.LatLngLiteral) => void;\n setOptions: (options: google.maps.MapOptions) => void;\n getBounds: () => google.maps.LatLngBounds | null;\n getCenter: () => google.maps.LatLng | undefined;\n getClickableIcons: () => boolean | undefined;\n getHeading: () => number | undefined;\n getMapTypeId: () => google.maps.MapTypeId | string | undefined;\n getProjection: () => google.maps.Projection | null;\n getStreetView: () => google.maps.StreetViewPanorama | null;\n getTilt: () => number | undefined;\n getZoom: () => number | undefined;\n controls: () => google.maps.MVCArray<Node>[] | null;\n data: () => google.maps.Data | null;\n mapTypes: () => google.maps.MapTypeRegistry | null;\n overlayMapTypes: () => google.maps.MVCArray<google.maps.MapType | null> | null;\n};\n\nexport type GoogleMapProps = Omit<HTMLAttributes<HTMLDivElement>, 'onClick'> & {\n children?: ReactNode;\n center?: LatLngLike;\n zoom?: number;\n mapId?: string;\n options?: google.maps.MapOptions;\n width?: CSSProperties['width'];\n height?: CSSProperties['height'];\n loadingFallback?: ReactNode;\n errorFallback?: ReactNode;\n onMapLoad?: (map: google.maps.Map) => void;\n onMapUnmount?: (map: google.maps.Map) => void;\n onClick?: (event: google.maps.MapMouseEvent | google.maps.IconMouseEvent) => void;\n onDblClick?: (event: google.maps.MapMouseEvent) => void;\n onDrag?: () => void;\n onDragStart?: () => void;\n onDragEnd?: () => void;\n onIdle?: () => void;\n onBoundsChanged?: () => void;\n onCenterChanged?: () => void;\n onHeadingChanged?: () => void;\n onMapTypeIdChanged?: () => void;\n onMouseMove?: (event: google.maps.MapMouseEvent) => void;\n onMouseOut?: (event: google.maps.MapMouseEvent) => void;\n onMouseOver?: (event: google.maps.MapMouseEvent) => void;\n onProjectionChanged?: () => void;\n onRightClick?: (event: google.maps.MapMouseEvent) => void;\n onTilesLoaded?: () => void;\n onTiltChanged?: () => void;\n onZoomChanged?: () => void;\n};\n\nconst DEFAULT_CENTER = { lat: 37.421995, lng: -122.084092 };\nconst DEFAULT_ZOOM = 13;\n\nexport const GoogleMap = forwardRef<GoogleMapHandle, GoogleMapProps>(function GoogleMap(\n {\n children,\n center = DEFAULT_CENTER,\n zoom = DEFAULT_ZOOM,\n mapId,\n options,\n width = '100%',\n height = 460,\n loadingFallback,\n errorFallback,\n onMapLoad,\n onMapUnmount,\n onClick,\n onDblClick,\n onDrag,\n onDragStart,\n onDragEnd,\n onIdle,\n onBoundsChanged,\n onCenterChanged,\n onHeadingChanged,\n onMapTypeIdChanged,\n onMouseMove,\n onMouseOut,\n onMouseOver,\n onProjectionChanged,\n onRightClick,\n onTilesLoaded,\n onTiltChanged,\n onZoomChanged,\n className,\n style,\n ...divProps\n },\n ref\n) {\n const { isLoaded, status, error, google } = useGoogleMapsApi();\n const containerRef = useRef<HTMLDivElement | null>(null);\n const mapRef = useRef<google.maps.Map | null>(null);\n const onMapLoadRef = useRef(onMapLoad);\n const onMapUnmountRef = useRef(onMapUnmount);\n const [map, setMap] = useState<google.maps.Map | null>(null);\n const initialMapIdRef = useRef(mapId);\n\n onMapLoadRef.current = onMapLoad;\n onMapUnmountRef.current = onMapUnmount;\n\n useImperativeHandle(\n ref,\n () => ({\n map,\n fitBounds(bounds) {\n map?.fitBounds(bounds);\n },\n panBy(x, y) {\n map?.panBy(x, y);\n },\n panTo(position) {\n map?.panTo(position);\n },\n panToBounds(bounds, padding) {\n map?.panToBounds(bounds, padding);\n },\n setZoom(nextZoom) {\n map?.setZoom(nextZoom);\n },\n setCenter(position) {\n map?.setCenter(position);\n },\n setOptions(nextOptions) {\n map?.setOptions(nextOptions);\n },\n getBounds() {\n return map?.getBounds() || null;\n },\n getCenter() {\n return map?.getCenter();\n },\n getClickableIcons() {\n return map?.getClickableIcons();\n },\n getHeading() {\n return map?.getHeading();\n },\n getMapTypeId() {\n return map?.getMapTypeId();\n },\n getProjection() {\n return map?.getProjection() || null;\n },\n getStreetView() {\n return map?.getStreetView() || null;\n },\n getTilt() {\n return map?.getTilt();\n },\n getZoom() {\n return map?.getZoom();\n },\n controls() {\n return map?.controls || null;\n },\n data() {\n return map?.data || null;\n },\n mapTypes() {\n return map?.mapTypes || null;\n },\n overlayMapTypes() {\n return map?.overlayMapTypes || null;\n }\n }),\n [map]\n );\n\n useEffect(() => {\n if (!isLoaded || !google || !containerRef.current || mapRef.current) {\n return;\n }\n\n const nextMap = new google.maps.Map(\n containerRef.current,\n composeMapOptions(options, {\n center,\n zoom,\n mapId: initialMapIdRef.current\n })\n );\n\n mapRef.current = nextMap;\n setMap(nextMap);\n onMapLoadRef.current?.(nextMap);\n\n return () => {\n google.maps.event.clearInstanceListeners(nextMap);\n onMapUnmountRef.current?.(nextMap);\n mapRef.current = null;\n setMap(null);\n };\n }, [isLoaded, google]);\n\n useEffect(() => {\n if (!map) {\n return;\n }\n\n map.setOptions(\n composeMapOptions(options, {\n center,\n zoom\n })\n );\n }, [map, options, center, zoom]);\n\n useEffect(() => {\n if (!map || !center) {\n return;\n }\n\n const nextCenter = toLatLng(center);\n if (nextCenter) {\n map.setCenter(nextCenter);\n }\n }, [map, center]);\n\n useEffect(() => {\n if (!map || zoom === undefined) {\n return;\n }\n\n if (map.getZoom() !== zoom) {\n map.setZoom(zoom);\n }\n }, [map, zoom]);\n\n useEffect(() => {\n if (!map) {\n return;\n }\n\n const listeners = [\n addListener(map, 'click', onClick),\n addListener(map, 'dblclick', onDblClick),\n addListener(map, 'drag', onDrag),\n addListener(map, 'dragstart', onDragStart),\n addListener(map, 'dragend', onDragEnd),\n addListener(map, 'idle', onIdle),\n addListener(map, 'bounds_changed', onBoundsChanged),\n addListener(map, 'center_changed', onCenterChanged),\n addListener(map, 'heading_changed', onHeadingChanged),\n addListener(map, 'maptypeid_changed', onMapTypeIdChanged),\n addListener(map, 'mousemove', onMouseMove),\n addListener(map, 'mouseout', onMouseOut),\n addListener(map, 'mouseover', onMouseOver),\n addListener(map, 'projection_changed', onProjectionChanged),\n addListener(map, 'rightclick', onRightClick),\n addListener(map, 'tilesloaded', onTilesLoaded),\n addListener(map, 'tilt_changed', onTiltChanged),\n addListener(map, 'zoom_changed', onZoomChanged)\n ].filter(Boolean);\n\n return () => {\n listeners.forEach((listener) => listener?.remove());\n };\n }, [\n map,\n onClick,\n onDblClick,\n onDrag,\n onDragStart,\n onDragEnd,\n onIdle,\n onBoundsChanged,\n onCenterChanged,\n onHeadingChanged,\n onMapTypeIdChanged,\n onMouseMove,\n onMouseOut,\n onMouseOver,\n onProjectionChanged,\n onRightClick,\n onTilesLoaded,\n onTiltChanged,\n onZoomChanged\n ]);\n\n useEffect(() => {\n if (!map || !google || !containerRef.current || typeof ResizeObserver === 'undefined') {\n return;\n }\n\n const observer = new ResizeObserver(() => {\n const currentCenter = map.getCenter();\n google.maps.event.trigger(map, 'resize');\n if (currentCenter) {\n map.setCenter(currentCenter);\n }\n });\n\n observer.observe(containerRef.current);\n\n return () => {\n observer.disconnect();\n };\n }, [map, google]);\n\n const mergedStyle = useMemo<CSSProperties>(\n () => ({\n width,\n height,\n minHeight: typeof height === 'number' ? `${height}px` : undefined,\n position: 'relative',\n overflow: 'hidden',\n ...style\n }),\n [width, height, style]\n );\n\n return (\n <div {...divProps} className={className} style={mergedStyle} ref={containerRef}>\n {status === 'error' ? errorFallback || <MapStatus message={error?.message || 'The Google Maps API failed to load.'} tone=\"error\" /> : null}\n {!isLoaded && status !== 'error' ? loadingFallback || <MapStatus message=\"Loading Google Maps JavaScript API…\" tone=\"loading\" /> : null}\n {map ? <GoogleMapContext.Provider value={map}>{children}</GoogleMapContext.Provider> : null}\n </div>\n );\n});\n\nfunction MapStatus({ message, tone }: { message: string; tone: 'loading' | 'error' }) {\n return (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n display: 'grid',\n placeItems: 'center',\n padding: '1rem',\n background: tone === 'error' ? 'rgba(255, 245, 245, 0.9)' : 'rgba(244, 249, 255, 0.9)',\n color: tone === 'error' ? '#8c2b2b' : '#24415f',\n fontSize: '0.95rem',\n zIndex: 0\n }}\n >\n <div>{message}</div>\n </div>\n );\n}\n","import { useContext, useRef } from 'react';\nimport { GoogleMapContext, useGoogleMapsApiContext } from './internal';\n\nexport function useGoogleMapsApi() {\n const context = useGoogleMapsApiContext();\n return {\n ...context,\n isLoaded: context.status === 'ready' && !!context.google\n };\n}\n\nexport function useGoogleMap() {\n return useContext(GoogleMapContext);\n}\n\nexport function useMapGeocoder() {\n const { google, isLoaded } = useGoogleMapsApi();\n const geocoderRef = useRef<google.maps.Geocoder | null>(null);\n\n if (isLoaded && google && !geocoderRef.current) {\n geocoderRef.current = new google.maps.Geocoder();\n }\n\n return geocoderRef.current;\n}\n\nexport function useDirectionsService() {\n const { google, isLoaded } = useGoogleMapsApi();\n const directionsServiceRef = useRef<google.maps.DirectionsService | null>(null);\n\n if (isLoaded && google && !directionsServiceRef.current) {\n directionsServiceRef.current = new google.maps.DirectionsService();\n }\n\n return directionsServiceRef.current;\n}\n","import type { MarkerLike } from './internal';\n\nexport type LatLngLike = google.maps.LatLngLiteral | google.maps.LatLng;\n\nexport function addListener<T extends object>(\n target: T | null | undefined,\n eventName: string,\n handler: ((...args: any[]) => void) | undefined\n) {\n if (!target || !handler) {\n return null;\n }\n\n return google.maps.event.addListener(target as any, eventName, (...args: any[]) => {\n handler(...args);\n });\n}\n\nexport function composeMapOptions(options: google.maps.MapOptions | undefined, extra: Partial<google.maps.MapOptions>) {\n return {\n ...options,\n ...removeUndefined(extra)\n };\n}\n\nexport function removeUndefined<T extends Record<string, any>>(input: T) {\n return Object.fromEntries(Object.entries(input).filter(([, value]) => value !== undefined)) as Partial<T>;\n}\n\nexport function toLatLng(value: LatLngLike | undefined | null) {\n if (!value) {\n return null;\n }\n\n if (value instanceof google.maps.LatLng) {\n return value;\n }\n\n return new google.maps.LatLng(value);\n}\n\nexport function toMVCArrayPath(path: Array<LatLngLike>) {\n return path.map((point) => (point instanceof google.maps.LatLng ? point : new google.maps.LatLng(point)));\n}\n\nexport function isLatLngLiteral(value: unknown): value is google.maps.LatLngLiteral {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'lat' in (value as any) &&\n 'lng' in (value as any)\n );\n}\n\nexport function markerToAnchor(marker: MarkerLike) {\n return marker as unknown as google.maps.MVCObject;\n}\n\nexport function shallowBoundsEqual(\n left: google.maps.LatLngBoundsLiteral | undefined,\n right: google.maps.LatLngBoundsLiteral | undefined\n) {\n return (\n left?.east === right?.east &&\n left?.west === right?.west &&\n left?.north === right?.north &&\n left?.south === right?.south\n );\n}\n","import { MarkerClusterer, type Algorithm, type Cluster, type Renderer } from '@googlemaps/markerclusterer';\nimport {\n useContext,\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type ReactNode\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { MarkerClustererContext, type MarkerLike } from './internal';\nimport { useGoogleMap, useGoogleMapsApi } from './hooks';\nimport { addListener, removeUndefined, toLatLng, type LatLngLike } from './utils';\n\nexport type MapMarkerHandle = {\n marker: google.maps.Marker | null;\n getAnimation: () => google.maps.Animation | null | undefined;\n getClickable: () => boolean | undefined;\n getDraggable: () => boolean | undefined;\n getIcon: () => string | google.maps.Icon | google.maps.Symbol | null | undefined;\n getLabel: () => string | google.maps.MarkerLabel | null | undefined;\n getPosition: () => google.maps.LatLng | null | undefined;\n getTitle: () => string | null | undefined;\n getVisible: () => boolean | undefined;\n getZIndex: () => number | null | undefined;\n setAnimation: (animation: google.maps.Animation | null) => void;\n setOptions: (options: google.maps.MarkerOptions) => void;\n setPosition: (position: google.maps.LatLng | google.maps.LatLngLiteral) => void;\n setTitle: (title: string) => void;\n setVisible: (visible: boolean) => void;\n setZIndex: (zIndex: number) => void;\n};\n\nexport type MapAdvancedMarkerHandle = {\n marker: google.maps.marker.AdvancedMarkerElement | null;\n content: HTMLElement | null;\n setMap: (map: google.maps.Map | null) => void;\n setPosition: (position: google.maps.LatLng | google.maps.LatLngLiteral) => void;\n setZIndex: (zIndex: number) => void;\n};\n\nexport type MapInfoWindowHandle = {\n infoWindow: google.maps.InfoWindow | null;\n open: (anchor?: MarkerLike | null) => void;\n close: () => void;\n getContent: () => string | Node | null | undefined;\n getPosition: () => google.maps.LatLng | null | undefined;\n getZIndex: () => number | undefined;\n setContent: (content: string | Element | Text) => void;\n setPosition: (position: google.maps.LatLng | google.maps.LatLngLiteral) => void;\n setZIndex: (zIndex: number) => void;\n};\n\nexport type MapMarkerClustererHandle = {\n clusterer: MarkerClusterer | null;\n addMarker: (marker: MarkerLike, noDraw?: boolean) => void;\n addMarkers: (markers: MarkerLike[], noDraw?: boolean) => void;\n removeMarker: (marker: MarkerLike, noDraw?: boolean) => boolean;\n clearMarkers: (noDraw?: boolean) => void;\n render: () => void;\n};\n\nexport type MapMarkerProps = {\n position: LatLngLike;\n title?: string;\n label?: string | google.maps.MarkerLabel;\n clickable?: boolean;\n draggable?: boolean;\n icon?: string | google.maps.Icon | google.maps.Symbol;\n visible?: boolean;\n zIndex?: number;\n animation?: google.maps.Animation;\n options?: google.maps.MarkerOptions;\n onLoad?: (marker: google.maps.Marker) => void;\n onUnmount?: (marker: google.maps.Marker) => void;\n onClick?: (event: google.maps.MapMouseEvent) => void;\n onDblClick?: (event: google.maps.MapMouseEvent) => void;\n onDrag?: (event: google.maps.MapMouseEvent) => void;\n onDragEnd?: (event: google.maps.MapMouseEvent) => void;\n onDragStart?: (event: google.maps.MapMouseEvent) => void;\n onMouseDown?: (event: google.maps.MapMouseEvent) => void;\n onMouseOut?: (event: google.maps.MapMouseEvent) => void;\n onMouseOver?: (event: google.maps.MapMouseEvent) => void;\n onMouseUp?: (event: google.maps.MapMouseEvent) => void;\n onRightClick?: (event: google.maps.MapMouseEvent) => void;\n};\n\nexport type MapAdvancedMarkerProps = {\n position: LatLngLike;\n title?: string;\n zIndex?: number;\n gmpClickable?: boolean;\n gmpDraggable?: boolean;\n options?: google.maps.marker.AdvancedMarkerElementOptions;\n collisionBehavior?: google.maps.CollisionBehavior;\n children?: ReactNode;\n onLoad?: (marker: google.maps.marker.AdvancedMarkerElement) => void;\n onUnmount?: (marker: google.maps.marker.AdvancedMarkerElement) => void;\n onClick?: (event: google.maps.MapMouseEvent) => void;\n onDragStart?: (event: google.maps.MapMouseEvent) => void;\n onDrag?: (event: google.maps.MapMouseEvent) => void;\n onDragEnd?: (event: google.maps.MapMouseEvent) => void;\n};\n\nexport type MapInfoWindowProps = {\n anchor?: MarkerLike | null;\n open?: boolean;\n position?: LatLngLike;\n zIndex?: number;\n options?: google.maps.InfoWindowOptions;\n children?: ReactNode;\n onLoad?: (infoWindow: google.maps.InfoWindow) => void;\n onUnmount?: (infoWindow: google.maps.InfoWindow) => void;\n onCloseClick?: () => void;\n onDomReady?: () => void;\n onContentChanged?: () => void;\n onPositionChanged?: () => void;\n onZIndexChanged?: () => void;\n};\n\nexport type MapMarkerClustererProps = {\n children?: ReactNode;\n algorithm?: Algorithm;\n renderer?: Renderer;\n onLoad?: (clusterer: MarkerClusterer) => void;\n onUnmount?: (clusterer: MarkerClusterer) => void;\n onClusterClick?: (event: google.maps.MapMouseEvent, cluster: Cluster, map: google.maps.Map) => void;\n};\n\nexport const MapMarker = forwardRef<MapMarkerHandle, MapMarkerProps>(function MapMarker(\n {\n position,\n title,\n label,\n clickable,\n draggable,\n icon,\n visible,\n zIndex,\n animation,\n options,\n onLoad,\n onUnmount,\n onClick,\n onDblClick,\n onDrag,\n onDragEnd,\n onDragStart,\n onMouseDown,\n onMouseOut,\n onMouseOver,\n onMouseUp,\n onRightClick\n },\n ref\n) {\n const map = useGoogleMap();\n const clustererContext = useContext(MarkerClustererContext);\n const markerRef = useRef<google.maps.Marker | null>(null);\n const onLoadRef = useRef(onLoad);\n const onUnmountRef = useRef(onUnmount);\n const [marker, setMarker] = useState<google.maps.Marker | null>(null);\n\n onLoadRef.current = onLoad;\n onUnmountRef.current = onUnmount;\n\n useImperativeHandle(\n ref,\n () => ({\n marker,\n getAnimation() {\n return marker?.getAnimation();\n },\n getClickable() {\n return marker?.getClickable();\n },\n getDraggable() {\n return marker?.getDraggable();\n },\n getIcon() {\n return marker?.getIcon();\n },\n getLabel() {\n return marker?.getLabel();\n },\n getPosition() {\n return marker?.getPosition();\n },\n getTitle() {\n return marker?.getTitle();\n },\n getVisible() {\n return marker?.getVisible();\n },\n getZIndex() {\n return marker?.getZIndex();\n },\n setAnimation(nextAnimation) {\n marker?.setAnimation(nextAnimation);\n },\n setOptions(nextOptions) {\n marker?.setOptions(nextOptions);\n },\n setPosition(nextPosition) {\n marker?.setPosition(nextPosition);\n },\n setTitle(nextTitle) {\n marker?.setTitle(nextTitle);\n },\n setVisible(nextVisible) {\n marker?.setVisible(nextVisible);\n },\n setZIndex(nextZIndex) {\n marker?.setZIndex(nextZIndex);\n }\n }),\n [marker]\n );\n\n useEffect(() => {\n if (!map || markerRef.current) {\n return;\n }\n\n const instance = new google.maps.Marker();\n markerRef.current = instance;\n setMarker(instance);\n onLoadRef.current?.(instance);\n\n return () => {\n google.maps.event.clearInstanceListeners(instance);\n onUnmountRef.current?.(instance);\n clustererContext?.unregisterMarker(instance);\n instance.setMap(null);\n markerRef.current = null;\n setMarker(null);\n };\n }, [map, clustererContext]);\n\n useEffect(() => {\n if (!marker || !map) {\n return;\n }\n\n marker.setOptions({\n ...options,\n ...removeUndefined({\n position,\n title,\n label,\n clickable,\n draggable,\n icon,\n visible,\n zIndex,\n animation\n })\n });\n\n if (clustererContext) {\n marker.setMap(null);\n clustererContext.registerMarker(marker);\n } else {\n marker.setMap(map);\n }\n }, [marker, map, clustererContext, position, title, label, clickable, draggable, icon, visible, zIndex, animation, options]);\n\n useEffect(() => {\n if (!marker) {\n return;\n }\n\n const listeners = [\n addListener(marker, 'click', onClick),\n addListener(marker, 'dblclick', onDblClick),\n addListener(marker, 'drag', onDrag),\n addListener(marker, 'dragend', onDragEnd),\n addListener(marker, 'dragstart', onDragStart),\n addListener(marker, 'mousedown', onMouseDown),\n addListener(marker, 'mouseout', onMouseOut),\n addListener(marker, 'mouseover', onMouseOver),\n addListener(marker, 'mouseup', onMouseUp),\n addListener(marker, 'rightclick', onRightClick)\n ].filter(Boolean);\n\n return () => {\n listeners.forEach((listener) => listener?.remove());\n };\n }, [marker, onClick, onDblClick, onDrag, onDragEnd, onDragStart, onMouseDown, onMouseOut, onMouseOver, onMouseUp, onRightClick]);\n\n return null;\n});\n\nexport const MapAdvancedMarker = forwardRef<MapAdvancedMarkerHandle, MapAdvancedMarkerProps>(function MapAdvancedMarker(\n {\n position,\n title,\n zIndex,\n gmpClickable,\n gmpDraggable,\n options,\n collisionBehavior,\n children,\n onLoad,\n onUnmount,\n onClick,\n onDragStart,\n onDrag,\n onDragEnd\n },\n ref\n) {\n const map = useGoogleMap();\n const { isLoaded } = useGoogleMapsApi();\n const clustererContext = useContext(MarkerClustererContext);\n const [marker, setMarker] = useState<google.maps.marker.AdvancedMarkerElement | null>(null);\n const [contentElement] = useState(() => (typeof document !== 'undefined' ? document.createElement('div') : null));\n\n useImperativeHandle(\n ref,\n () => ({\n marker,\n content: contentElement,\n setMap(nextMap) {\n if (marker) {\n marker.map = nextMap;\n }\n },\n setPosition(nextPosition) {\n if (marker) {\n marker.position = toLatLng(nextPosition) || nextPosition;\n }\n },\n setZIndex(nextZIndex) {\n if (marker) {\n marker.zIndex = nextZIndex;\n }\n }\n }),\n [marker, contentElement]\n );\n\n useEffect(() => {\n if (!map || !isLoaded || marker) {\n return;\n }\n\n if (!google.maps.marker?.AdvancedMarkerElement) {\n throw new Error(\n 'AdvancedMarkerElement is unavailable. Make sure the marker library is enabled and the map uses a valid mapId.'\n );\n }\n\n const instance = new google.maps.marker.AdvancedMarkerElement({\n map: clustererContext ? undefined : map,\n content: children && contentElement ? contentElement : options?.content,\n ...options\n });\n\n setMarker(instance);\n onLoad?.(instance);\n\n return () => {\n onUnmount?.(instance);\n clustererContext?.unregisterMarker(instance);\n instance.map = null;\n };\n }, [map, isLoaded, marker, clustererContext, children, contentElement, options]);\n\n useEffect(() => {\n if (!marker || !map) {\n return;\n }\n\n marker.position = toLatLng(position) || position;\n if (title !== undefined) {\n marker.title = title;\n }\n marker.zIndex = zIndex;\n marker.gmpClickable = gmpClickable;\n marker.gmpDraggable = gmpDraggable;\n if (collisionBehavior !== undefined) {\n marker.collisionBehavior = collisionBehavior;\n }\n if (children && contentElement) {\n marker.content = contentElement;\n }\n\n if (clustererContext) {\n marker.map = null;\n clustererContext.registerMarker(marker);\n } else {\n marker.map = map;\n }\n }, [marker, map, clustererContext, position, title, zIndex, gmpClickable, gmpDraggable, collisionBehavior, children, contentElement]);\n\n useEffect(() => {\n if (!marker) {\n return;\n }\n\n const listeners = [\n addListener(marker, 'click', onClick),\n addListener(marker, 'dragstart', onDragStart),\n addListener(marker, 'drag', onDrag),\n addListener(marker, 'dragend', onDragEnd)\n ].filter(Boolean);\n\n return () => {\n listeners.forEach((listener) => listener?.remove());\n };\n }, [marker, onClick, onDragStart, onDrag, onDragEnd]);\n\n return children && contentElement ? createPortal(children, contentElement) : null;\n});\n\nexport const MapInfoWindow = forwardRef<MapInfoWindowHandle, MapInfoWindowProps>(function MapInfoWindow(\n {\n anchor,\n open = true,\n position,\n zIndex,\n options,\n children,\n onLoad,\n onUnmount,\n onCloseClick,\n onDomReady,\n onContentChanged,\n onPositionChanged,\n onZIndexChanged\n },\n ref\n) {\n const map = useGoogleMap();\n const [infoWindow, setInfoWindow] = useState<google.maps.InfoWindow | null>(null);\n const [contentElement] = useState(() => (typeof document !== 'undefined' ? document.createElement('div') : null));\n\n useImperativeHandle(\n ref,\n () => ({\n infoWindow,\n open(nextAnchor) {\n if (!infoWindow) {\n return;\n }\n infoWindow.open({\n map,\n anchor: (nextAnchor || anchor || undefined) as any\n });\n },\n close() {\n infoWindow?.close();\n },\n getContent() {\n return infoWindow?.getContent();\n },\n getPosition() {\n return infoWindow?.getPosition() || null;\n },\n getZIndex() {\n return infoWindow?.getZIndex();\n },\n setContent(content) {\n infoWindow?.setContent(content);\n },\n setPosition(nextPosition) {\n infoWindow?.setPosition(nextPosition);\n },\n setZIndex(nextZIndex) {\n infoWindow?.setZIndex(nextZIndex);\n }\n }),\n [infoWindow, map, anchor]\n );\n\n useEffect(() => {\n if (!map || infoWindow) {\n return;\n }\n\n const instance = new google.maps.InfoWindow({\n ...options,\n content: contentElement || options?.content,\n position,\n zIndex\n });\n\n setInfoWindow(instance);\n onLoad?.(instance);\n\n return () => {\n onUnmount?.(instance);\n instance.close();\n };\n }, [map, infoWindow, options, contentElement, position, zIndex]);\n\n useEffect(() => {\n if (!infoWindow) {\n return;\n }\n\n infoWindow.setOptions({\n ...options,\n content: children && contentElement ? contentElement : options?.content,\n position,\n zIndex\n });\n }, [infoWindow, options, position, zIndex, children, contentElement]);\n\n useEffect(() => {\n if (!infoWindow) {\n return;\n }\n\n if (!open) {\n infoWindow.close();\n return;\n }\n\n infoWindow.open({\n map,\n anchor: anchor as any\n });\n }, [infoWindow, map, anchor, open, position]);\n\n useEffect(() => {\n if (!infoWindow) {\n return;\n }\n\n const listeners = [\n addListener(infoWindow, 'closeclick', onCloseClick),\n addListener(infoWindow, 'domready', onDomReady),\n addListener(infoWindow, 'content_changed', onContentChanged),\n addListener(infoWindow, 'position_changed', onPositionChanged),\n addListener(infoWindow, 'zindex_changed', onZIndexChanged)\n ].filter(Boolean);\n\n return () => {\n listeners.forEach((listener) => listener?.remove());\n };\n }, [infoWindow, onCloseClick, onDomReady, onContentChanged, onPositionChanged, onZIndexChanged]);\n\n return children && contentElement ? createPortal(children, contentElement) : null;\n});\n\nexport const MapMarkerClusterer = forwardRef<MapMarkerClustererHandle, MapMarkerClustererProps>(function MapMarkerClusterer({\n children,\n algorithm,\n renderer,\n onLoad,\n onUnmount,\n onClusterClick\n}, ref) {\n const map = useGoogleMap();\n const [clusterer, setClusterer] = useState<MarkerClusterer | null>(null);\n const pendingMarkersRef = useRef<Set<MarkerLike>>(new Set());\n\n useImperativeHandle(\n ref,\n () => ({\n clusterer,\n addMarker(marker, noDraw) {\n clusterer?.addMarker(marker, noDraw);\n },\n addMarkers(markers, noDraw) {\n clusterer?.addMarkers(markers, noDraw);\n },\n removeMarker(marker, noDraw) {\n return clusterer?.removeMarker(marker, noDraw) ?? false;\n },\n clearMarkers(noDraw) {\n clusterer?.clearMarkers(noDraw);\n },\n render() {\n clusterer?.render();\n }\n }),\n [clusterer]\n );\n\n useEffect(() => {\n if (!map || clusterer) {\n return;\n }\n\n const instance = new MarkerClusterer({\n map,\n markers: Array.from(pendingMarkersRef.current),\n algorithm,\n renderer,\n onClusterClick: onClusterClick as any\n });\n\n setClusterer(instance);\n onLoad?.(instance);\n\n return () => {\n onUnmount?.(instance);\n instance.clearMarkers();\n (instance as any).setMap?.(null);\n };\n }, [map, clusterer, algorithm, renderer, onClusterClick]);\n\n const contextValue = useMemo(\n () => ({\n clusterer,\n registerMarker(marker: MarkerLike) {\n if (clusterer) {\n clusterer.addMarker(marker, true);\n clusterer.render();\n } else {\n pendingMarkersRef.current.add(marker);\n }\n },\n unregisterMarker(marker: MarkerLike) {\n pendingMarkersRef.current.delete(marker);\n if (clusterer) {\n clusterer.removeMarker(marker, true);\n clusterer.render();\n }\n }\n }),\n [clusterer]\n );\n\n return <MarkerClustererContext.Provider value={contextValue}>{children}</MarkerClustererContext.Provider>;\n});\n","import { createPortal } from 'react-dom';\nimport { forwardRef, useEffect, useImperativeHandle, useState, type ReactNode } from 'react';\nimport { useGoogleMap } from './hooks';\nimport { addListener, removeUndefined, shallowBoundsEqual, toLatLng, toMVCArrayPath, type LatLngLike } from './utils';\n\ntype ShapeBaseProps<T> = {\n options?: T;\n onLoad?: (instance: any) => void;\n onUnmount?: (instance: any) => void;\n onClick?: (event: google.maps.MapMouseEvent) => void;\n onDblClick?: (event: google.maps.MapMouseEvent) => void;\n onMouseDown?: (event: google.maps.MapMouseEvent) => void;\n onMouseMove?: (event: google.maps.MapMouseEvent) => void;\n onMouseOut?: (event: google.maps.MapMouseEvent) => void;\n onMouseOver?: (event: google.maps.MapMouseEvent) => void;\n onMouseUp?: (event: google.maps.MapMouseEvent) => void;\n onRightClick?: (event: google.maps.MapMouseEvent) => void;\n onDrag?: (event: google.maps.MapMouseEvent) => void;\n onDragEnd?: (event: google.maps.MapMouseEvent) => void;\n onDragStart?: (event: google.maps.MapMouseEvent) => void;\n};\n\nexport type MapPolylineProps = ShapeBaseProps<google.maps.PolylineOptions> & {\n path: LatLngLike[];\n};\n\nexport type MapPolygonProps = ShapeBaseProps<google.maps.PolygonOptions> & {\n paths: LatLngLike[] | LatLngLike[][];\n};\n\nexport type MapRectangleProps = ShapeBaseProps<google.maps.RectangleOptions> & {\n bounds: google.maps.LatLngBoundsLiteral;\n};\n\nexport type MapCircleProps = ShapeBaseProps<google.maps.CircleOptions> & {\n center: LatLngLike;\n radius: number;\n};\n\nexport type MapGroundOverlayProps = {\n url: string;\n bounds: google.maps.LatLngBoundsLiteral;\n opacity?: number;\n clickable?: boolean;\n onLoad?: (overlay: google.maps.GroundOverlay) => void;\n onUnmount?: (overlay: google.maps.GroundOverlay) => void;\n onClick?: (event: google.maps.MapMouseEvent) => void;\n};\n\nexport type MapControlProps = {\n position: google.maps.ControlPosition;\n children: ReactNode;\n index?: number;\n};\n\nexport type MapPolylineHandle = {\n polyline: google.maps.Polyline | null;\n getPath: () => google.maps.MVCArray<google.maps.LatLng> | null;\n getVisible: () => boolean | undefined;\n getDraggable: () => boolean | undefined;\n getEditable: () => boolean | undefined;\n setPath: (path: LatLngLike[]) => void;\n setOptions: (options: google.maps.PolylineOptions) => void;\n};\n\nexport type MapPolygonHandle = {\n polygon: google.maps.Polygon | null;\n getPath: () => google.maps.MVCArray<google.maps.LatLng> | null;\n getPaths: () => google.maps.MVCArray<google.maps.MVCArray<google.maps.LatLng>> | null;\n getVisible: () => boolean | undefined;\n getDraggable: () => boolean | undefined;\n getEditable: () => boolean | undefined;\n setPaths: (paths: LatLngLike[] | LatLngLike[][]) => void;\n setOptions: (options: google.maps.PolygonOptions) => void;\n};\n\nexport type MapRectangleHandle = {\n rectangle: google.maps.Rectangle | null;\n getBounds: () => google.maps.LatLngBounds | null;\n getVisible: () => boolean | undefined;\n getDraggable: () => boolean | undefined;\n getEditable: () => boolean | undefined;\n setBounds: (bounds: google.maps.LatLngBounds | google.maps.LatLngBoundsLiteral) => void;\n setOptions: (options: google.maps.RectangleOptions) => void;\n};\n\nexport type MapCircleHandle = {\n circle: google.maps.Circle | null;\n getBounds: () => google.maps.LatLngBounds | null;\n getCenter: () => google.maps.LatLng | null;\n getRadius: () => number | undefined;\n getVisible: () => boolean | undefined;\n getDraggable: () => boolean | undefined;\n getEditable: () => boolean | undefined;\n setCenter: (center: google.maps.LatLng | google.maps.LatLngLiteral) => void;\n setRadius: (radius: number) => void;\n setOptions: (options: google.maps.CircleOptions) => void;\n};\n\nexport type MapGroundOverlayHandle = {\n overlay: google.maps.GroundOverlay | null;\n getBounds: () => google.maps.LatLngBounds | null;\n getOpacity: () => number | null | undefined;\n getUrl: () => string | undefined;\n setOpacity: (opacity: number) => void;\n setMap: (map: google.maps.Map | null) => void;\n};\n\nexport const MapPolyline = forwardRef<MapPolylineHandle, MapPolylineProps>(function MapPolyline({\n path,\n options,\n onLoad,\n onUnmount,\n onClick,\n onDblClick,\n onMouseDown,\n onMouseMove,\n onMouseOut,\n onMouseOver,\n onMouseUp,\n onRightClick,\n onDrag,\n onDragEnd,\n onDragStart\n}: MapPolylineProps, ref) {\n const map = useGoogleMap();\n const [polyline, setPolyline] = useState<google.maps.Polyline | null>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n polyline,\n getPath() {\n return polyline?.getPath() || null;\n },\n getVisible() {\n return polyline?.getVisible();\n },\n getDraggable() {\n return polyline?.getDraggable();\n },\n getEditable() {\n return polyline?.getEditable();\n },\n setPath(nextPath) {\n polyline?.setPath(toMVCArrayPath(nextPath));\n },\n setOptions(nextOptions) {\n polyline?.setOptions(nextOptions);\n }\n }),\n [polyline]\n );\n\n useEffect(() => {\n if (!map || polyline) {\n return;\n }\n\n const instance = new google.maps.Polyline({ map });\n setPolyline(instance);\n onLoad?.(instance);\n\n return () => {\n onUnmount?.(instance);\n instance.setMap(null);\n };\n }, [map, polyline]);\n\n useEffect(() => {\n if (!polyline) {\n return;\n }\n\n polyline.setOptions({\n ...options,\n path: toMVCArrayPath(path),\n map\n });\n }, [polyline, map, path, options]);\n\n useShapeEvents(polyline, { onClick, onDblClick, onMouseDown, onMouseMove, onMouseOut, onMouseOver, onMouseUp, onRightClick, onDrag, onDragEnd, onDragStart });\n return null;\n});\n\nexport const MapPolygon = forwardRef<MapPolygonHandle, MapPolygonProps>(function MapPolygon({\n paths,\n options,\n onLoad,\n onUnmount,\n onClick,\n onDblClick,\n onMouseDown,\n onMouseMove,\n onMouseOut,\n onMouseOver,\n onMouseUp,\n onRightClick,\n onDrag,\n onDragEnd,\n onDragStart\n}: MapPolygonProps, ref) {\n const map = useGoogleMap();\n const [polygon, setPolygon] = useState<google.maps.Polygon | null>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n polygon,\n getPath() {\n return polygon?.getPath() || null;\n },\n getPaths() {\n return polygon?.getPaths() || null;\n },\n getVisible() {\n return polygon?.getVisible();\n },\n getDraggable() {\n return polygon?.getDraggable();\n },\n getEditable() {\n return polygon?.getEditable();\n },\n setPaths(nextPaths) {\n const value = Array.isArray(nextPaths[0])\n ? (nextPaths as LatLngLike[][]).map((path) => toMVCArrayPath(path))\n : toMVCArrayPath(nextPaths as LatLngLike[]);\n polygon?.setPaths(value as any);\n },\n setOptions(nextOptions) {\n polygon?.setOptions(nextOptions);\n }\n }),\n [polygon]\n );\n\n useEffect(() => {\n if (!map || polygon) {\n return;\n }\n\n const instance = new google.maps.Polygon({ map });\n setPolygon(instance);\n onLoad?.(instance);\n\n return () => {\n onUnmount?.(instance);\n instance.setMap(null);\n };\n }, [map, polygon]);\n\n useEffect(() => {\n if (!polygon) {\n return;\n }\n\n const nextPaths = Array.isArray(paths[0])\n ? (paths as LatLngLike[][]).map((path) => toMVCArrayPath(path))\n : toMVCArrayPath(paths as LatLngLike[]);\n\n polygon.setOptions({\n ...options,\n paths: nextPaths as any,\n map\n });\n }, [polygon, map, paths, options]);\n\n useShapeEvents(polygon, { onClick, onDblClick, onMouseDown, onMouseMove, onMouseOut, onMouseOver, onMouseUp, onRightClick, onDrag, onDragEnd, onDragStart });\n return null;\n});\n\nexport const MapRectangle = forwardRef<MapRectangleHandle, MapRectangleProps>(function MapRectangle({\n bounds,\n options,\n onLoad,\n onUnmount,\n onClick,\n onDblClick,\n onMouseDown,\n onMouseMove,\n onMouseOut,\n onMouseOver,\n onMouseUp,\n onRightClick,\n onDrag,\n onDragEnd,\n onDragStart\n}: MapRectangleProps, ref) {\n const map = useGoogleMap();\n const [rectangle, setRectangle] = useState<google.maps.Rectangle | null>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n rectangle,\n getBounds() {\n return rectangle?.getBounds() || null;\n },\n getVisible() {\n return rectangle?.getVisible();\n },\n getDraggable() {\n return rectangle?.getDraggable();\n },\n getEditable() {\n return rectangle?.getEditable();\n },\n setBounds(nextBounds) {\n rectangle?.setBounds(nextBounds);\n },\n setOptions(nextOptions) {\n rectangle?.setOptions(nextOptions);\n }\n }),\n [rectangle]\n );\n\n useEffect(() => {\n if (!map || rectangle) {\n return;\n }\n\n const instance = new google.maps.Rectangle({ map });\n setRectangle(instance);\n onLoad?.(instance);\n\n return () => {\n onUnmount?.(instance);\n instance.setMap(null);\n };\n }, [map, rectangle]);\n\n useEffect(() => {\n if (!rectangle) {\n return;\n }\n\n if (!shallowBoundsEqual(rectangle.getBounds()?.toJSON(), bounds)) {\n rectangle.setBounds(bounds);\n }\n\n rectangle.setOptions({\n ...options,\n map\n });\n }, [rectangle, map, bounds, options]);\n\n useShapeEvents(rectangle, { onClick, onDblClick, onMouseDown, onMouseMove, onMouseOut, onMouseOver, onMouseUp, onRightClick, onDrag, onDragEnd, onDragStart });\n return null;\n});\n\nexport const MapCircle = forwardRef<MapCircleHandle, MapCircleProps>(function MapCircle({\n center,\n radius,\n options,\n onLoad,\n onUnmount,\n onClick,\n onDblClick,\n onMouseDown,\n onMouseMove,\n onMouseOut,\n onMouseOver,\n onMouseUp,\n onRightClick,\n onDrag,\n onDragEnd,\n onDragStart\n}: MapCircleProps, ref) {\n const map = useGoogleMap();\n const [circle, setCircle] = useState<google.maps.Circle | null>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n circle,\n getBounds() {\n return circle?.getBounds() || null;\n },\n getCenter() {\n return circle?.getCenter() || null;\n },\n getRadius() {\n return circle?.getRadius();\n },\n getVisible() {\n return circle?.getVisible();\n },\n getDraggable() {\n return circle?.getDraggable();\n },\n getEditable() {\n return circle?.getEditable();\n },\n setCenter(nextCenter) {\n circle?.setCenter(nextCenter);\n },\n setRadius(nextRadius) {\n circle?.setRadius(nextRadius);\n },\n setOptions(nextOptions) {\n circle?.setOptions(nextOptions);\n }\n }),\n [circle]\n );\n\n useEffect(() => {\n if (!map || circle) {\n return;\n }\n\n const instance = new google.maps.Circle({ map });\n setCircle(instance);\n onLoad?.(instance);\n\n return () => {\n onUnmount?.(instance);\n instance.setMap(null);\n };\n }, [map, circle]);\n\n useEffect(() => {\n if (!circle) {\n return;\n }\n\n circle.setOptions({\n ...options,\n center,\n radius,\n map\n });\n }, [circle, map, center, radius, options]);\n\n useShapeEvents(circle, { onClick, onDblClick, onMouseDown, onMouseMove, onMouseOut, onMouseOver, onMouseUp, onRightClick, onDrag, onDragEnd, onDragStart });\n return null;\n});\n\nexport const MapGroundOverlay = forwardRef<MapGroundOverlayHandle, MapGroundOverlayProps>(function MapGroundOverlay({ url, bounds, opacity, clickable, onLoad, onUnmount, onClick }: MapGroundOverlayProps, ref) {\n const map = useGoogleMap();\n const [overlay, setOverlay] = useState<google.maps.GroundOverlay | null>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n overlay,\n getBounds() {\n return overlay?.getBounds() || null;\n },\n getOpacity() {\n return overlay?.getOpacity();\n },\n getUrl() {\n return overlay?.getUrl();\n },\n setOpacity(nextOpacity) {\n overlay?.setOpacity(nextOpacity);\n },\n setMap(nextMap) {\n overlay?.setMap(nextMap);\n }\n }),\n [overlay]\n );\n\n useEffect(() => {\n if (!map) {\n return;\n }\n\n const instance = new google.maps.GroundOverlay(url, bounds, removeUndefined({ opacity, clickable }));\n instance.setMap(map);\n setOverlay(instance);\n onLoad?.(instance);\n\n return () => {\n onUnmount?.(instance);\n instance.setMap(null);\n };\n }, [map, url, JSON.stringify(bounds), opacity, clickable]);\n\n useEffect(() => {\n if (!overlay) {\n return;\n }\n\n const listener = addListener(overlay, 'click', onClick);\n return () => {\n listener?.remove();\n };\n }, [overlay, onClick]);\n\n return null;\n});\n\nexport function MapControl({ position, children, index }: MapControlProps) {\n const map = useGoogleMap();\n const [element] = useState(() => (typeof document !== 'undefined' ? document.createElement('div') : null));\n\n useEffect(() => {\n if (!map || !element) {\n return;\n }\n\n const controls = map.controls[position];\n if (typeof index === 'number' && index >= 0 && index < controls.getLength()) {\n controls.insertAt(index, element);\n } else {\n controls.push(element);\n }\n\n return () => {\n const nextControls = map.controls[position];\n for (let currentIndex = 0; currentIndex < nextControls.getLength(); currentIndex += 1) {\n if (nextControls.getAt(currentIndex) === element) {\n nextControls.removeAt(currentIndex);\n break;\n }\n }\n };\n }, [map, element, position, index]);\n\n return element ? createPortal(children, element) : null;\n}\n\nfunction useShapeEvents(\n shape: google.maps.Polyline | google.maps.Polygon | google.maps.Rectangle | google.maps.Circle | null,\n handlers: {\n onClick?: (event: google.maps.MapMouseEvent) => void;\n onDblClick?: (event: google.maps.MapMouseEvent) => void;\n onMouseDown?: (event: google.maps.MapMouseEvent) => void;\n onMouseMove?: (event: google.maps.MapMouseEvent) => void;\n onMouseOut?: (event: google.maps.MapMouseEvent) => void;\n onMouseOver?: (event: google.maps.MapMouseEvent) => void;\n onMouseUp?: (event: google.maps.MapMouseEvent) => void;\n onRightClick?: (event: google.maps.MapMouseEvent) => void;\n onDrag?: (event: google.maps.MapMouseEvent) => void;\n onDragEnd?: (event: google.maps.MapMouseEvent) => void;\n onDragStart?: (event: google.maps.MapMouseEvent) => void;\n }\n) {\n useEffect(() => {\n if (!shape) {\n return;\n }\n\n const listeners = [\n addListener(shape, 'click', handlers.onClick),\n addListener(shape, 'dblclick', handlers.onDblClick),\n addListener(shape, 'mousedown', handlers.onMouseDown),\n addListener(shape, 'mousemove', handlers.onMouseMove),\n addListener(shape, 'mouseout', handlers.onMouseOut),\n addListener(shape, 'mouseover', handlers.onMouseOver),\n addListener(shape, 'mouseup', handlers.onMouseUp),\n addListener(shape, 'rightclick', handlers.onRightClick),\n addListener(shape, 'drag', handlers.onDrag),\n addListener(shape, 'dragend', handlers.onDragEnd),\n addListener(shape, 'dragstart', handlers.onDragStart)\n ].filter(Boolean);\n\n return () => {\n listeners.forEach((listener) => listener?.remove());\n };\n }, [shape, handlers.onClick, handlers.onDblClick, handlers.onMouseDown, handlers.onMouseMove, handlers.onMouseOut, handlers.onMouseOver, handlers.onMouseUp, handlers.onRightClick, handlers.onDrag, handlers.onDragEnd, handlers.onDragStart]);\n}\n","import { forwardRef, useEffect, useImperativeHandle, useState } from 'react';\nimport { useGoogleMap } from './hooks';\nimport { removeUndefined, toLatLng, type LatLngLike } from './utils';\n\nexport type HeatmapDatum =\n | LatLngLike\n | google.maps.visualization.WeightedLocation\n | {\n location: LatLngLike;\n weight: number;\n };\n\nexport type MapTrafficLayerHandle = {\n layer: google.maps.TrafficLayer | null;\n setMap: (map: google.maps.Map | null) => void;\n setOptions: (options: google.maps.TrafficLayerOptions) => void;\n};\n\nexport type MapTransitLayerHandle = {\n layer: google.maps.TransitLayer | null;\n setMap: (map: google.maps.Map | null) => void;\n};\n\nexport type MapBicyclingLayerHandle = {\n layer: google.maps.BicyclingLayer | null;\n setMap: (map: google.maps.Map | null) => void;\n};\n\nexport type MapKmlLayerHandle = {\n layer: google.maps.KmlLayer | null;\n getDefaultViewport: () => google.maps.LatLngBounds | null;\n getMetadata: () => google.maps.KmlLayerMetadata | null;\n getStatus: () => google.maps.KmlLayerStatus | null;\n getUrl: () => string | null;\n setMap: (map: google.maps.Map | null) => void;\n setOptions: (options: google.maps.KmlLayerOptions) => void;\n setUrl: (url: string) => void;\n};\n\nexport type MapHeatmapLayerHandle = {\n layer: google.maps.visualization.HeatmapLayer | null;\n getData: () => google.maps.MVCArray<google.maps.LatLng | google.maps.visualization.WeightedLocation> | null;\n setData: (data: HeatmapDatum[]) => void;\n setMap: (map: google.maps.Map | null) => void;\n setOptions: (options: google.maps.visualization.HeatmapLayerOptions) => void;\n};\n\nexport type MapKmlLayerProps = {\n url: string;\n options?: google.maps.KmlLayerOptions;\n onLoad?: (layer: google.maps.KmlLayer) => void;\n onUnmount?: (layer: google.maps.KmlLayer) => void;\n};\n\nexport type MapHeatmapLayerProps = {\n data: HeatmapDatum[];\n options?: google.maps.visualization.HeatmapLayerOptions;\n onLoad?: (layer: google.maps.visualization.HeatmapLayer) => void;\n onUnmount?: (layer: google.maps.visualization.HeatmapLayer) => void;\n};\n\nexport const MapTrafficLayer = forwardRef<MapTrafficLayerHandle, { options?: google.maps.TrafficLayerOptions; onLoad?: (layer: google.maps.TrafficLayer) => void; onUnmount?: (layer: google.maps.TrafficLayer) => void }>(function MapTrafficLayer({ options, onLoad, onUnmount }, ref) {\n const map = useGoogleMap();\n const [layer, setLayer] = useState<google.maps.TrafficLayer | null>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n layer,\n setMap(nextMap) {\n layer?.setMap(nextMap);\n },\n setOptions(nextOptions) {\n layer?.setOptions(nextOptions);\n }\n }),\n [layer]\n );\n\n useEffect(() => {\n if (!map || layer) {\n return;\n }\n\n const instance = new google.maps.TrafficLayer(options);\n instance.setMap(map);\n setLayer(instance);\n onLoad?.(instance);\n\n return () => {\n onUnmount?.(instance);\n instance.setMap(null);\n };\n }, [map, layer]);\n\n useEffect(() => {\n if (layer && options) {\n layer.setOptions(options);\n }\n }, [layer, options]);\n\n return null;\n});\n\nexport const MapTransitLayer = forwardRef<MapTransitLayerHandle, { onLoad?: (layer: google.maps.TransitLayer) => void; onUnmount?: (layer: google.maps.TransitLayer) => void }>(function MapTransitLayer({ onLoad, onUnmount }, ref) {\n const map = useGoogleMap();\n const [layer, setLayer] = useState<google.maps.TransitLayer | null>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n layer,\n setMap(nextMap) {\n layer?.setMap(nextMap);\n }\n }),\n [layer]\n );\n\n useEffect(() => {\n if (!map) {\n return;\n }\n\n const layer = new google.maps.TransitLayer();\n layer.setMap(map);\n setLayer(layer);\n onLoad?.(layer);\n\n return () => {\n onUnmount?.(layer);\n layer.setMap(null);\n };\n }, [map]);\n\n return null;\n});\n\nexport const MapBicyclingLayer = forwardRef<MapBicyclingLayerHandle, { onLoad?: (layer: google.maps.BicyclingLayer) => void; onUnmount?: (layer: google.maps.BicyclingLayer) => void }>(function MapBicyclingLayer({ onLoad, onUnmount }, ref) {\n const map = useGoogleMap();\n const [layer, setLayer] = useState<google.maps.BicyclingLayer | null>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n layer,\n setMap(nextMap) {\n layer?.setMap(nextMap);\n }\n }),\n [layer]\n );\n\n useEffect(() => {\n if (!map) {\n return;\n }\n\n const layer = new google.maps.BicyclingLayer();\n layer.setMap(map);\n setLayer(layer);\n onLoad?.(layer);\n\n return () => {\n onUnmount?.(layer);\n layer.setMap(null);\n };\n }, [map]);\n\n return null;\n});\n\nexport const MapKmlLayer = forwardRef<MapKmlLayerHandle, MapKmlLayerProps>(function MapKmlLayer({\n url,\n options,\n onLoad,\n onUnmount\n}, ref) {\n const map = useGoogleMap();\n const [layer, setLayer] = useState<google.maps.KmlLayer | null>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n layer,\n getDefaultViewport() {\n return layer?.getDefaultViewport() || null;\n },\n getMetadata() {\n return layer?.getMetadata() || null;\n },\n getStatus() {\n return layer?.getStatus() || null;\n },\n getUrl() {\n return layer?.getUrl() || null;\n },\n setMap(nextMap) {\n layer?.setMap(nextMap);\n },\n setOptions(nextOptions) {\n layer?.setOptions(nextOptions);\n },\n setUrl(nextUrl) {\n layer?.setUrl(nextUrl);\n }\n }),\n [layer]\n );\n\n useEffect(() => {\n if (!map) {\n return;\n }\n\n const instance = new google.maps.KmlLayer({\n ...options,\n map,\n url\n });\n setLayer(instance);\n onLoad?.(instance);\n\n return () => {\n onUnmount?.(instance);\n instance.setMap(null);\n };\n }, [map, url]);\n\n useEffect(() => {\n if (!layer) {\n return;\n }\n\n layer.setOptions({\n ...options,\n map\n });\n layer.setUrl(url);\n }, [layer, options, map, url]);\n\n return null;\n});\n\nexport const MapHeatmapLayer = forwardRef<MapHeatmapLayerHandle, MapHeatmapLayerProps>(function MapHeatmapLayer({\n data,\n options,\n onLoad,\n onUnmount\n}, ref) {\n const map = useGoogleMap();\n const [layer, setLayer] = useState<google.maps.visualization.HeatmapLayer | null>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n layer,\n getData() {\n return layer?.getData() || null;\n },\n setData(nextData) {\n layer?.setData(normalizeHeatmapData(nextData));\n },\n setMap(nextMap) {\n layer?.setMap(nextMap);\n },\n setOptions(nextOptions) {\n layer?.setOptions(nextOptions);\n }\n }),\n [layer]\n );\n\n useEffect(() => {\n if (!map) {\n return;\n }\n\n if (!google.maps.visualization?.HeatmapLayer) {\n throw new Error('HeatmapLayer is unavailable. Make sure the visualization library is enabled.');\n }\n\n const instance = new google.maps.visualization.HeatmapLayer({\n ...options,\n map,\n data: normalizeHeatmapData(data)\n });\n setLayer(instance);\n onLoad?.(instance);\n\n return () => {\n onUnmount?.(instance);\n instance.setMap(null);\n };\n }, [map]);\n\n useEffect(() => {\n if (!layer) {\n return;\n }\n\n layer.setOptions({\n ...options,\n data: normalizeHeatmapData(data),\n map\n });\n }, [layer, options, data, map]);\n\n return null;\n});\n\nfunction normalizeHeatmapData(data: HeatmapDatum[]) {\n return data.map((entry) => {\n if ('location' in (entry as any)) {\n const weighted = entry as { location: LatLngLike; weight: number };\n return {\n location: toLatLng(weighted.location)!,\n weight: weighted.weight\n } as google.maps.visualization.WeightedLocation;\n }\n\n return toLatLng(entry as LatLngLike)!;\n });\n}\n","import { forwardRef, useEffect, useImperativeHandle, useRef, useState } from 'react';\nimport { useDirectionsService, useGoogleMap } from './hooks';\nimport { addListener } from './utils';\n\nexport type DirectionsServiceResult = {\n status: google.maps.DirectionsStatus;\n result: google.maps.DirectionsResult | null;\n};\n\nexport type MapDirectionsRendererHandle = {\n renderer: google.maps.DirectionsRenderer | null;\n getDirections: () => google.maps.DirectionsResult | null | undefined;\n getPanel: () => Node | null | undefined;\n getRouteIndex: () => number | undefined;\n setDirections: (directions: google.maps.DirectionsResult | null) => void;\n setOptions: (options: google.maps.DirectionsRendererOptions) => void;\n setRouteIndex: (routeIndex: number) => void;\n};\n\nexport type MapDirectionsRendererProps = {\n directions?: google.maps.DirectionsResult | null;\n options?: google.maps.DirectionsRendererOptions;\n onLoad?: (renderer: google.maps.DirectionsRenderer) => void;\n onUnmount?: (renderer: google.maps.DirectionsRenderer) => void;\n onDirectionsChanged?: () => void;\n};\n\nexport const MapDirectionsRenderer = forwardRef<MapDirectionsRendererHandle, MapDirectionsRendererProps>(function MapDirectionsRenderer({\n directions,\n options,\n onLoad,\n onUnmount,\n onDirectionsChanged\n}, ref) {\n const map = useGoogleMap();\n const [renderer, setRenderer] = useState<google.maps.DirectionsRenderer | null>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n renderer,\n getDirections() {\n return renderer?.getDirections() || null;\n },\n getPanel() {\n return renderer?.getPanel() || null;\n },\n getRouteIndex() {\n return renderer?.getRouteIndex();\n },\n setDirections(nextDirections) {\n renderer?.setDirections(nextDirections);\n },\n setOptions(nextOptions) {\n renderer?.setOptions(nextOptions);\n },\n setRouteIndex(nextRouteIndex) {\n renderer?.setRouteIndex(nextRouteIndex);\n }\n }),\n [renderer]\n );\n\n useEffect(() => {\n if (!map || renderer) {\n return;\n }\n\n const instance = new google.maps.DirectionsRenderer({\n ...options,\n map\n });\n setRenderer(instance);\n onLoad?.(instance);\n\n return () => {\n onUnmount?.(instance);\n instance.setMap(null);\n };\n }, [map, renderer]);\n\n useEffect(() => {\n if (!renderer) {\n return;\n }\n\n renderer.setOptions({\n ...options,\n directions: directions || undefined,\n map\n });\n }, [renderer, directions, options, map]);\n\n useEffect(() => {\n if (!renderer) {\n return;\n }\n\n const listener = addListener(renderer, 'directions_changed', onDirectionsChanged);\n return () => {\n listener?.remove();\n };\n }, [renderer, onDirectionsChanged]);\n\n return null;\n});\n\nexport function MapDirectionsService({\n request,\n onResult,\n onError\n}: {\n request?: google.maps.DirectionsRequest | null;\n onResult: (response: DirectionsServiceResult) => void;\n onError?: (error: Error) => void;\n}) {\n const service = useDirectionsService();\n const requestIdRef = useRef(0);\n\n useEffect(() => {\n if (!service || !request) {\n return;\n }\n\n requestIdRef.current += 1;\n const currentRequestId = requestIdRef.current;\n\n service.route(request, (result, status) => {\n if (currentRequestId !== requestIdRef.current) {\n return;\n }\n\n if (status === google.maps.DirectionsStatus.OK && result) {\n onResult({ status, result });\n } else {\n const error = new Error(`Directions request failed with status ${status}.`);\n onResult({ status, result: result || null });\n onError?.(error);\n }\n });\n }, [service, request, onResult, onError]);\n\n return null;\n}\n"],"mappings":"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","names":["useEffect","useMemo","useRef","useState","useContext","useContext","google","jsx","GoogleMap","google","useRef","useState","useEffect","useMemo","useContext","forwardRef","useEffect","useImperativeHandle","useMemo","useRef","useState","jsx","forwardRef","MapMarker","useContext","useRef","useState","useImperativeHandle","useEffect","MapAdvancedMarker","MapInfoWindow","MapMarkerClusterer","useMemo","createPortal","forwardRef","useEffect","useImperativeHandle","useState","forwardRef","MapPolyline","useState","useImperativeHandle","useEffect","MapPolygon","MapRectangle","MapCircle","MapGroundOverlay","createPortal","forwardRef","useEffect","useImperativeHandle","useState","forwardRef","MapTrafficLayer","useState","useImperativeHandle","useEffect","MapTransitLayer","layer","MapBicyclingLayer","MapKmlLayer","MapHeatmapLayer","forwardRef","useEffect","useImperativeHandle","useRef","useState","forwardRef","MapDirectionsRenderer","useState","useImperativeHandle","useEffect","useRef"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@revivejs/react-google-maps",
|
|
3
|
-
"version": "18.0.
|
|
4
|
-
"description": "A React 18 wrapper for the Google Maps JavaScript API with versioned docs, marker clustering, and migration-friendly components.",
|
|
3
|
+
"version": "18.0.1",
|
|
4
|
+
"description": "A maintained React 18 wrapper for the Google Maps JavaScript API with versioned docs, marker clustering, and migration-friendly components.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react",
|
|
7
7
|
"react-library",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"build:docs:react-17": "cd docs-src/react-17 && npm run build",
|
|
57
57
|
"build:docs:react-18": "cd docs-src/react-18 && npm run build",
|
|
58
58
|
"build:docs:react-19": "cd docs-src/react-19 && npm run build",
|
|
59
|
-
"build:docs": "npm run build:docs:react-
|
|
59
|
+
"build:docs": "npm run build:docs:react-19",
|
|
60
60
|
"typecheck": "tsc --noEmit"
|
|
61
61
|
},
|
|
62
62
|
"peerDependencies": {
|