react-naver-maps-kit 1.1.0 → 1.2.0
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/dist/index.cjs +978 -138
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +10 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +972 -141
- package/dist/index.js.map +1 -1
- package/dist/overlays/data/GeoJson.d.ts +43 -0
- package/dist/overlays/data/GeoJson.d.ts.map +1 -0
- package/dist/overlays/data/Gpx.d.ts +42 -0
- package/dist/overlays/data/Gpx.d.ts.map +1 -0
- package/dist/overlays/data/Kmz.d.ts +42 -0
- package/dist/overlays/data/Kmz.d.ts.map +1 -0
- package/dist/overlays/marker/Marker.d.ts.map +1 -1
- package/dist/overlays/marker-clusterer/ClustererContext.d.ts +10 -17
- package/dist/overlays/marker-clusterer/ClustererContext.d.ts.map +1 -1
- package/dist/overlays/marker-clusterer/MarkerClusterer.d.ts +5 -4
- package/dist/overlays/marker-clusterer/MarkerClusterer.d.ts.map +1 -1
- package/dist/react/components/NaverMap.d.ts +2 -1
- package/dist/react/components/NaverMap.d.ts.map +1 -1
- package/package.json +15 -16
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["DEFAULT_OPTIONS","DEFAULT_OPTIONS"],"sources":["../src/core/loader/loadNaverMapsScript.ts","../src/react/provider/NaverMapProvider.tsx","../src/react/components/NaverMap.tsx","../src/react/hooks/useNaverMap.ts","../src/overlays/marker-clusterer/ClustererContext.ts","../src/overlays/marker/Marker.tsx","../src/overlays/marker-clusterer/algorithms/grid.ts","../src/overlays/marker-clusterer/algorithms/radius.ts","../../../node_modules/.pnpm/kdbush@4.0.2/node_modules/kdbush/index.js","../../../node_modules/.pnpm/supercluster@8.0.1/node_modules/supercluster/index.js","../src/overlays/marker-clusterer/algorithms/supercluster.ts","../src/overlays/marker-clusterer/algorithms/createAlgorithm.ts","../src/overlays/marker-clusterer/MarkerClusterer.tsx","../src/overlays/infowindow/InfoWindow.tsx","../src/overlays/shared/overlayUtils.ts","../src/overlays/circle/Circle.tsx","../src/overlays/ellipse/Ellipse.tsx","../src/overlays/ground-overlay/GroundOverlay.tsx","../src/overlays/polygon/Polygon.tsx","../src/overlays/polyline/Polyline.tsx","../src/overlays/rectangle/Rectangle.tsx","../src/index.ts"],"sourcesContent":["const NAVER_MAPS_SCRIPT_BASE_URL = \"https://oapi.map.naver.com/openapi/v3/maps.js\";\n\ntype LegacyClientIdParam = \"ncpClientId\" | \"govClientId\" | \"finClientId\";\n\ntype Submodule = \"geocoder\" | \"panorama\" | \"drawing\" | \"visualization\";\n\nexport interface LoadNaverMapsScriptOptions {\n ncpKeyId?: string;\n ncpClientId?: string;\n govClientId?: string;\n finClientId?: string;\n submodules?: Array<Submodule>;\n timeoutMs?: number;\n nonce?: string;\n}\n\ntype BrowserWindow = Window & {\n naver?: {\n maps?: unknown;\n };\n navermap_authFailure?: () => void;\n};\n\nlet inFlightLoad: Promise<void> | null = null;\nlet inFlightScriptUrl: string | null = null;\n\nfunction getClientKey(options: LoadNaverMapsScriptOptions): { param: string; value: string } {\n if (options.ncpKeyId) {\n return { param: \"ncpKeyId\", value: options.ncpKeyId };\n }\n\n const legacyPairs: Array<{ param: LegacyClientIdParam; value?: string }> = [\n { param: \"ncpClientId\", value: options.ncpClientId },\n { param: \"govClientId\", value: options.govClientId },\n { param: \"finClientId\", value: options.finClientId }\n ];\n\n const legacy = legacyPairs.find((candidate) => Boolean(candidate.value));\n\n if (legacy?.value) {\n return { param: legacy.param, value: legacy.value };\n }\n\n throw new Error(\n \"loadNaverMapsScript requires ncpKeyId. For backward compatibility, ncpClientId, govClientId, or finClientId can be provided.\"\n );\n}\n\nfunction isNaverMapsReady(): boolean {\n if (typeof window === \"undefined\") {\n return false;\n }\n\n const browserWindow = window as BrowserWindow;\n\n return Boolean(browserWindow.naver?.maps);\n}\n\nfunction createScriptUrl(options: LoadNaverMapsScriptOptions): string {\n const clientKey = getClientKey(options);\n const params = new URLSearchParams();\n\n params.set(clientKey.param, clientKey.value);\n\n if (options.submodules && options.submodules.length > 0) {\n params.set(\"submodules\", options.submodules.join(\",\"));\n }\n\n return `${NAVER_MAPS_SCRIPT_BASE_URL}?${params.toString()}`;\n}\n\nfunction waitForNaverMapsReady(timeoutMs: number): Promise<void> {\n return new Promise((resolve, reject) => {\n if (isNaverMapsReady()) {\n resolve();\n return;\n }\n\n const startedAt = Date.now();\n const intervalId = setInterval(() => {\n if (isNaverMapsReady()) {\n clearInterval(intervalId);\n resolve();\n return;\n }\n\n if (Date.now() - startedAt >= timeoutMs) {\n clearInterval(intervalId);\n reject(new Error(`Timed out after ${timeoutMs}ms while waiting for window.naver.maps.`));\n }\n }, 50);\n });\n}\n\nfunction attachAuthFailureHandler(reject: (error: Error) => void): () => void {\n const browserWindow = window as BrowserWindow;\n const previousAuthFailure = browserWindow.navermap_authFailure;\n\n browserWindow.navermap_authFailure = () => {\n reject(\n new Error(\"Naver Maps authentication failed. Check your client key and allowed domains.\")\n );\n\n if (previousAuthFailure) {\n previousAuthFailure();\n }\n };\n\n return () => {\n browserWindow.navermap_authFailure = previousAuthFailure;\n };\n}\n\nexport function loadNaverMapsScript(options: LoadNaverMapsScriptOptions): Promise<void> {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return Promise.reject(new Error(\"loadNaverMapsScript can only run in a browser environment.\"));\n }\n\n if (isNaverMapsReady()) {\n return Promise.resolve();\n }\n\n const scriptUrl = createScriptUrl(options);\n\n if (inFlightLoad && inFlightScriptUrl === scriptUrl) {\n return inFlightLoad;\n }\n\n const existingScript = document.querySelector<HTMLScriptElement>(`script[src=\"${scriptUrl}\"]`);\n\n if (existingScript) {\n const trackedPromise = new Promise<void>((resolve, reject) => {\n const existingScriptWithState = existingScript as HTMLScriptElement & { readyState?: string };\n const timeoutMs = options.timeoutMs ?? 10000;\n const restoreAuthFailure = attachAuthFailureHandler(reject);\n const timeoutId = setTimeout(() => {\n restoreAuthFailure();\n reject(new Error(`Timed out after ${timeoutMs}ms while waiting for Naver Maps script.`));\n }, timeoutMs);\n\n const cleanup = () => {\n clearTimeout(timeoutId);\n restoreAuthFailure();\n };\n\n const handleReady = () => {\n waitForNaverMapsReady(timeoutMs)\n .then(() => {\n cleanup();\n resolve();\n })\n .catch((error) => {\n cleanup();\n reject(error instanceof Error ? error : new Error(\"Naver Maps is not ready.\"));\n });\n };\n\n const onLoad = () => {\n handleReady();\n };\n\n const onError = () => {\n cleanup();\n reject(new Error(\"Failed to load Naver Maps script.\"));\n };\n\n if (existingScript.dataset.reactNaverMapsKitLoaded === \"true\") {\n handleReady();\n return;\n }\n\n if (\n existingScriptWithState.readyState === \"loaded\" ||\n existingScriptWithState.readyState === \"complete\"\n ) {\n handleReady();\n return;\n }\n\n existingScript.addEventListener(\"load\", onLoad, { once: true });\n existingScript.addEventListener(\"error\", onError, { once: true });\n }).finally(() => {\n inFlightLoad = null;\n inFlightScriptUrl = null;\n });\n\n inFlightLoad = trackedPromise;\n inFlightScriptUrl = scriptUrl;\n return trackedPromise;\n }\n\n const trackedPromise = new Promise<void>((resolve, reject) => {\n const timeoutMs = options.timeoutMs ?? 10000;\n const script = document.createElement(\"script\");\n const restoreAuthFailure = attachAuthFailureHandler(reject);\n const timeoutId = setTimeout(() => {\n cleanup();\n script.remove();\n reject(new Error(`Timed out after ${timeoutMs}ms while loading Naver Maps script.`));\n }, timeoutMs);\n\n const cleanup = () => {\n script.removeEventListener(\"load\", onLoad);\n script.removeEventListener(\"error\", onError);\n clearTimeout(timeoutId);\n restoreAuthFailure();\n };\n\n const onLoad = () => {\n script.dataset.reactNaverMapsKitLoaded = \"true\";\n\n waitForNaverMapsReady(timeoutMs)\n .then(() => {\n cleanup();\n resolve();\n })\n .catch((error) => {\n cleanup();\n reject(error instanceof Error ? error : new Error(\"Naver Maps is not ready.\"));\n });\n };\n\n const onError = () => {\n cleanup();\n reject(new Error(\"Failed to load Naver Maps script.\"));\n };\n\n script.src = scriptUrl;\n script.setAttribute(\"data-react-naver-maps-kit\", \"true\");\n script.type = \"text/javascript\";\n script.async = true;\n script.defer = true;\n\n if (options.nonce) {\n script.nonce = options.nonce;\n }\n\n script.addEventListener(\"load\", onLoad);\n script.addEventListener(\"error\", onError);\n\n document.head.append(script);\n }).finally(() => {\n inFlightLoad = null;\n inFlightScriptUrl = null;\n });\n\n inFlightLoad = trackedPromise;\n inFlightScriptUrl = scriptUrl;\n\n return trackedPromise;\n}\n","import { createContext, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport {\n loadNaverMapsScript,\n type LoadNaverMapsScriptOptions\n} from \"../../core/loader/loadNaverMapsScript\";\n\nimport type { ReactNode } from \"react\";\n\ntype BrowserWindow = Window & {\n navermap_authFailure?: () => void;\n};\n\nexport type NaverMapSdkStatus = \"idle\" | \"loading\" | \"ready\" | \"error\";\n\nexport interface NaverMapContextValue {\n sdkStatus: NaverMapSdkStatus;\n sdkError: Error | null;\n map: naver.maps.Map | null;\n setMap: (map: naver.maps.Map | null) => void;\n reloadSdk: () => Promise<void>;\n retrySdk: () => Promise<void>;\n clearSdkError: () => void;\n}\n\nexport interface NaverMapProviderProps extends LoadNaverMapsScriptOptions {\n children: ReactNode;\n autoLoad?: boolean;\n onReady?: () => void;\n onError?: (error: Error) => void;\n}\n\nexport const NaverMapContext = createContext<NaverMapContextValue | null>(null);\n\nexport function NaverMapProvider({\n children,\n autoLoad = true,\n onReady,\n onError,\n ncpKeyId,\n ncpClientId,\n govClientId,\n finClientId,\n submodules,\n timeoutMs,\n nonce\n}: NaverMapProviderProps) {\n const [sdkStatus, setSdkStatus] = useState<NaverMapSdkStatus>(\"idle\");\n const [sdkError, setSdkError] = useState<Error | null>(null);\n const [map, setMap] = useState<naver.maps.Map | null>(null);\n const mountedRef = useRef(true);\n const inFlightLoadRef = useRef<Promise<void> | null>(null);\n\n useEffect(() => {\n mountedRef.current = true;\n\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const browserWindow = window as BrowserWindow;\n const previousAuthFailure = browserWindow.navermap_authFailure;\n\n browserWindow.navermap_authFailure = () => {\n const error = new Error(\n \"Naver Maps authentication failed. Check key type (ncpKeyId) and allowed domain settings.\"\n );\n\n if (mountedRef.current) {\n setSdkStatus(\"error\");\n setSdkError(error);\n }\n\n onError?.(error);\n\n if (previousAuthFailure) {\n previousAuthFailure();\n }\n };\n\n return () => {\n browserWindow.navermap_authFailure = previousAuthFailure;\n };\n }, [onError]);\n\n const reloadSdk = useCallback(async () => {\n if (inFlightLoadRef.current) {\n return inFlightLoadRef.current;\n }\n\n if (mountedRef.current) {\n setSdkStatus(\"loading\");\n setSdkError(null);\n }\n\n const loadPromise = loadNaverMapsScript({\n ncpKeyId,\n ncpClientId,\n govClientId,\n finClientId,\n submodules,\n timeoutMs,\n nonce\n })\n .then(() => {\n if (mountedRef.current) {\n setSdkStatus(\"ready\");\n setSdkError(null);\n }\n\n onReady?.();\n })\n .catch((error) => {\n const normalizedError =\n error instanceof Error ? error : new Error(\"Failed to load Naver Maps SDK.\");\n\n if (mountedRef.current) {\n setSdkStatus(\"error\");\n setSdkError(normalizedError);\n }\n\n onError?.(normalizedError);\n throw normalizedError;\n })\n .finally(() => {\n inFlightLoadRef.current = null;\n });\n\n inFlightLoadRef.current = loadPromise;\n\n return loadPromise;\n }, [\n finClientId,\n govClientId,\n ncpClientId,\n ncpKeyId,\n nonce,\n onError,\n onReady,\n submodules,\n timeoutMs\n ]);\n\n useEffect(() => {\n if (!autoLoad) {\n return;\n }\n\n void reloadSdk().catch(() => undefined);\n }, [autoLoad, reloadSdk]);\n\n const clearSdkError = useCallback(() => {\n if (mountedRef.current) {\n setSdkError(null);\n setSdkStatus((current) => (current === \"error\" ? \"idle\" : current));\n }\n }, []);\n\n const value = useMemo<NaverMapContextValue>(\n () => ({\n sdkStatus,\n sdkError,\n map,\n setMap,\n reloadSdk,\n retrySdk: reloadSdk,\n clearSdkError\n }),\n [clearSdkError, map, reloadSdk, sdkError, sdkStatus]\n );\n\n return <NaverMapContext.Provider value={value}>{children}</NaverMapContext.Provider>;\n}\n","import {\n forwardRef,\n memo,\n useCallback,\n useContext,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState\n} from \"react\";\n\nimport { NaverMapContext } from \"../provider/NaverMapProvider\";\n\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\n\ntype MapOptions = naver.maps.MapOptions;\n\ninterface NaverMapOptionProps {\n background?: MapOptions[\"background\"];\n baseTileOpacity?: MapOptions[\"baseTileOpacity\"];\n bounds?: MapOptions[\"bounds\"];\n center?: MapOptions[\"center\"];\n defaultCenter?: MapOptions[\"center\"];\n zoom?: MapOptions[\"zoom\"];\n defaultZoom?: MapOptions[\"zoom\"];\n disableDoubleClickZoom?: MapOptions[\"disableDoubleClickZoom\"];\n disableDoubleTapZoom?: MapOptions[\"disableDoubleTapZoom\"];\n disableKineticPan?: MapOptions[\"disableKineticPan\"];\n disableTwoFingerTapZoom?: MapOptions[\"disableTwoFingerTapZoom\"];\n draggable?: MapOptions[\"draggable\"];\n keyboardShortcuts?: MapOptions[\"keyboardShortcuts\"];\n logoControl?: MapOptions[\"logoControl\"];\n logoControlOptions?: MapOptions[\"logoControlOptions\"];\n mapDataControl?: MapOptions[\"mapDataControl\"];\n mapDataControlOptions?: MapOptions[\"mapDataControlOptions\"];\n mapTypeControl?: MapOptions[\"mapTypeControl\"];\n mapTypeControlOptions?: MapOptions[\"mapTypeControlOptions\"];\n mapTypeId?: MapOptions[\"mapTypeId\"];\n mapTypes?: MapOptions[\"mapTypes\"];\n maxBounds?: MapOptions[\"maxBounds\"];\n maxZoom?: MapOptions[\"maxZoom\"];\n minZoom?: MapOptions[\"minZoom\"];\n padding?: MapOptions[\"padding\"];\n pinchZoom?: MapOptions[\"pinchZoom\"];\n resizeOrigin?: MapOptions[\"resizeOrigin\"];\n scaleControl?: MapOptions[\"scaleControl\"];\n scaleControlOptions?: MapOptions[\"scaleControlOptions\"];\n scrollWheel?: MapOptions[\"scrollWheel\"];\n size?: MapOptions[\"size\"];\n overlayZoomEffect?: MapOptions[\"overlayZoomEffect\"];\n tileSpare?: MapOptions[\"tileSpare\"];\n tileTransition?: MapOptions[\"tileTransition\"];\n tileDuration?: MapOptions[\"tileDuration\"];\n zoomControl?: MapOptions[\"zoomControl\"];\n zoomControlOptions?: MapOptions[\"zoomControlOptions\"];\n zoomOrigin?: MapOptions[\"zoomOrigin\"];\n blankTileImage?: MapOptions[\"blankTileImage\"];\n gl?: MapOptions[\"gl\"];\n customStyleId?: MapOptions[\"customStyleId\"];\n}\n\ninterface NaverMapLifecycleProps {\n onMapReady?: (map: naver.maps.Map) => void;\n onMapDestroy?: () => void;\n onMapError?: (error: Error) => void;\n retryOnError?: boolean;\n retryDelayMs?: number;\n fallback?: ReactNode;\n}\n\ninterface NaverMapEventProps {\n onAddLayer?: (layer: naver.maps.Layer) => void;\n onBoundsChanged?: (bounds: naver.maps.Bounds) => void;\n onCenterChanged?: (center: naver.maps.Coord) => void;\n onCenterPointChanged?: (centerPoint: naver.maps.Point) => void;\n onClick?: (pointerEvent: naver.maps.PointerEvent) => void;\n onDblClick?: (pointerEvent: naver.maps.PointerEvent) => void;\n onDoubleTap?: (pointerEvent: naver.maps.PointerEvent) => void;\n onDrag?: (pointerEvent: naver.maps.PointerEvent) => void;\n onDragEnd?: (pointerEvent: naver.maps.PointerEvent) => void;\n onDragStart?: (pointerEvent: naver.maps.PointerEvent) => void;\n onIdle?: () => void;\n onInit?: () => void;\n onKeyDown?: (keyboardEvent: KeyboardEvent) => void;\n onKeyUp?: (keyboardEvent: KeyboardEvent) => void;\n onLongTap?: (pointerEvent: naver.maps.PointerEvent) => void;\n onMapTypeChanged?: (mapType: naver.maps.MapType) => void;\n onMapTypeIdChanged?: (mapTypeId: string) => void;\n onMouseDown?: (pointerEvent: naver.maps.PointerEvent) => void;\n onMouseMove?: (pointerEvent: naver.maps.PointerEvent) => void;\n onMouseOut?: (pointerEvent: naver.maps.PointerEvent) => void;\n onMouseOver?: (pointerEvent: naver.maps.PointerEvent) => void;\n onMouseUp?: (pointerEvent: naver.maps.PointerEvent) => void;\n onPanning?: () => void;\n onPinch?: (pointerEvent: naver.maps.PointerEvent) => void;\n onPinchEnd?: (pointerEvent: naver.maps.PointerEvent) => void;\n onPinchStart?: (pointerEvent: naver.maps.PointerEvent) => void;\n onProjectionChanged?: (projection: naver.maps.Projection) => void;\n onRemoveLayer?: (layerName: string) => void;\n onResize?: () => void;\n onRightClick?: (pointerEvent: naver.maps.PointerEvent) => void;\n onSingleTap?: (pointerEvent: naver.maps.PointerEvent) => void;\n onTouchEnd?: (pointerEvent: naver.maps.PointerEvent) => void;\n onTouchMove?: (pointerEvent: naver.maps.PointerEvent) => void;\n onTouchStart?: (pointerEvent: naver.maps.PointerEvent) => void;\n onTwoFingerTap?: (pointerEvent: naver.maps.PointerEvent) => void;\n onWheel?: (pointerEvent: naver.maps.PointerEvent) => void;\n onZoomChanged?: (zoom: number) => void;\n onZooming?: () => void;\n onZoomStart?: () => void;\n}\n\ntype NaverMapDivProps = Omit<ComponentPropsWithoutRef<\"div\">, \"draggable\">;\n\nexport type NaverMapProps = NaverMapOptionProps &\n NaverMapLifecycleProps &\n NaverMapEventProps &\n NaverMapDivProps;\n\ntype NaverMapMethod<K extends keyof naver.maps.Map> = naver.maps.Map[K] extends (\n ...args: infer A\n) => infer R\n ? (...args: A) => R | undefined\n : never;\n\nexport interface NaverMapRef {\n getInstance: () => naver.maps.Map | null;\n addOverlayPane: (name: string, elementOrZIndex: HTMLElement | number) => void;\n addPane: NaverMapMethod<\"addPane\">;\n autoResize: NaverMapMethod<\"autoResize\">;\n destroy: NaverMapMethod<\"destroy\">;\n fitBounds: NaverMapMethod<\"fitBounds\">;\n getBounds: NaverMapMethod<\"getBounds\">;\n getCenter: NaverMapMethod<\"getCenter\">;\n getCenterPoint: NaverMapMethod<\"getCenterPoint\">;\n getElement: NaverMapMethod<\"getElement\">;\n getMapTypeId: NaverMapMethod<\"getMapTypeId\">;\n getMaxZoom: NaverMapMethod<\"getMaxZoom\">;\n getMinZoom: NaverMapMethod<\"getMinZoom\">;\n getOptions: NaverMapMethod<\"getOptions\">;\n getPanes: NaverMapMethod<\"getPanes\">;\n getPrimitiveProjection: NaverMapMethod<\"getPrimitiveProjection\">;\n getProjection: NaverMapMethod<\"getProjection\">;\n getSize: NaverMapMethod<\"getSize\">;\n getZoom: NaverMapMethod<\"getZoom\">;\n morph: NaverMapMethod<\"morph\">;\n panBy: NaverMapMethod<\"panBy\">;\n panTo: NaverMapMethod<\"panTo\">;\n panToBounds: NaverMapMethod<\"panToBounds\">;\n refresh: NaverMapMethod<\"refresh\">;\n removeOverlayPane: (name: string) => void;\n removePane: NaverMapMethod<\"removePane\">;\n setCenter: NaverMapMethod<\"setCenter\">;\n setCenterPoint: NaverMapMethod<\"setCenterPoint\">;\n setMapTypeId: NaverMapMethod<\"setMapTypeId\">;\n setOptions: NaverMapMethod<\"setOptions\">;\n setSize: NaverMapMethod<\"setSize\">;\n setZoom: NaverMapMethod<\"setZoom\">;\n stop: NaverMapMethod<\"stop\">;\n updateBy: NaverMapMethod<\"updateBy\">;\n zoomBy: NaverMapMethod<\"zoomBy\">;\n}\n\n/* ─── 상수 ─── */\n\nconst MAP_OPTION_KEYS = [\n \"background\",\n \"baseTileOpacity\",\n \"bounds\",\n \"center\",\n \"zoom\",\n \"disableDoubleClickZoom\",\n \"disableDoubleTapZoom\",\n \"disableKineticPan\",\n \"disableTwoFingerTapZoom\",\n \"draggable\",\n \"keyboardShortcuts\",\n \"logoControl\",\n \"logoControlOptions\",\n \"mapDataControl\",\n \"mapDataControlOptions\",\n \"mapTypeControl\",\n \"mapTypeControlOptions\",\n \"mapTypeId\",\n \"mapTypes\",\n \"maxBounds\",\n \"maxZoom\",\n \"minZoom\",\n \"padding\",\n \"pinchZoom\",\n \"resizeOrigin\",\n \"scaleControl\",\n \"scaleControlOptions\",\n \"scrollWheel\",\n \"size\",\n \"overlayZoomEffect\",\n \"tileSpare\",\n \"tileTransition\",\n \"tileDuration\",\n \"zoomControl\",\n \"zoomControlOptions\",\n \"zoomOrigin\",\n \"blankTileImage\",\n \"gl\",\n \"customStyleId\"\n] as const satisfies readonly (keyof NaverMapOptionProps)[];\n\nconst MAP_OPTION_KEY_SET = new Set<string>(MAP_OPTION_KEYS as readonly string[]);\n\nconst MAP_EVENT_PROP_KEYS = [\n \"onAddLayer\",\n \"onBoundsChanged\",\n \"onCenterChanged\",\n \"onCenterPointChanged\",\n \"onClick\",\n \"onDblClick\",\n \"onDoubleTap\",\n \"onDrag\",\n \"onDragEnd\",\n \"onDragStart\",\n \"onIdle\",\n \"onInit\",\n \"onKeyDown\",\n \"onKeyUp\",\n \"onLongTap\",\n \"onMapTypeChanged\",\n \"onMapTypeIdChanged\",\n \"onMouseDown\",\n \"onMouseMove\",\n \"onMouseOut\",\n \"onMouseOver\",\n \"onMouseUp\",\n \"onPanning\",\n \"onPinch\",\n \"onPinchEnd\",\n \"onPinchStart\",\n \"onProjectionChanged\",\n \"onRemoveLayer\",\n \"onResize\",\n \"onRightClick\",\n \"onSingleTap\",\n \"onTouchEnd\",\n \"onTouchMove\",\n \"onTouchStart\",\n \"onTwoFingerTap\",\n \"onWheel\",\n \"onZoomChanged\",\n \"onZooming\",\n \"onZoomStart\"\n] as const satisfies readonly (keyof NaverMapEventProps)[];\n\nconst MAP_EVENT_PROP_KEY_SET = new Set<string>(MAP_EVENT_PROP_KEYS as readonly string[]);\n\ntype MapEventBinding = {\n prop: keyof NaverMapEventProps;\n eventName: string;\n hasPayload: boolean;\n};\n\nconst MAP_EVENT_BINDINGS: readonly MapEventBinding[] = [\n { prop: \"onAddLayer\", eventName: \"addLayer\", hasPayload: true },\n { prop: \"onBoundsChanged\", eventName: \"bounds_changed\", hasPayload: true },\n { prop: \"onCenterChanged\", eventName: \"center_changed\", hasPayload: true },\n { prop: \"onCenterPointChanged\", eventName: \"centerPoint_changed\", hasPayload: true },\n { prop: \"onClick\", eventName: \"click\", hasPayload: true },\n { prop: \"onDblClick\", eventName: \"dblclick\", hasPayload: true },\n { prop: \"onDoubleTap\", eventName: \"doubletap\", hasPayload: true },\n { prop: \"onDrag\", eventName: \"drag\", hasPayload: true },\n { prop: \"onDragEnd\", eventName: \"dragend\", hasPayload: true },\n { prop: \"onDragStart\", eventName: \"dragstart\", hasPayload: true },\n { prop: \"onIdle\", eventName: \"idle\", hasPayload: false },\n { prop: \"onInit\", eventName: \"init\", hasPayload: false },\n { prop: \"onKeyDown\", eventName: \"keydown\", hasPayload: true },\n { prop: \"onKeyUp\", eventName: \"keyup\", hasPayload: true },\n { prop: \"onLongTap\", eventName: \"longtap\", hasPayload: true },\n { prop: \"onMapTypeChanged\", eventName: \"mapType_changed\", hasPayload: true },\n { prop: \"onMapTypeIdChanged\", eventName: \"mapTypeId_changed\", hasPayload: true },\n { prop: \"onMouseDown\", eventName: \"mousedown\", hasPayload: true },\n { prop: \"onMouseMove\", eventName: \"mousemove\", hasPayload: true },\n { prop: \"onMouseOut\", eventName: \"mouseout\", hasPayload: true },\n { prop: \"onMouseOver\", eventName: \"mouseover\", hasPayload: true },\n { prop: \"onMouseUp\", eventName: \"mouseup\", hasPayload: true },\n { prop: \"onPanning\", eventName: \"panning\", hasPayload: false },\n { prop: \"onPinch\", eventName: \"pinch\", hasPayload: true },\n { prop: \"onPinchEnd\", eventName: \"pinchend\", hasPayload: true },\n { prop: \"onPinchStart\", eventName: \"pinchstart\", hasPayload: true },\n { prop: \"onProjectionChanged\", eventName: \"projection_changed\", hasPayload: true },\n { prop: \"onRemoveLayer\", eventName: \"removeLayer\", hasPayload: true },\n { prop: \"onResize\", eventName: \"resize\", hasPayload: false },\n { prop: \"onRightClick\", eventName: \"rightclick\", hasPayload: true },\n { prop: \"onSingleTap\", eventName: \"singletap\", hasPayload: true },\n { prop: \"onTouchEnd\", eventName: \"touchend\", hasPayload: true },\n { prop: \"onTouchMove\", eventName: \"touchmove\", hasPayload: true },\n { prop: \"onTouchStart\", eventName: \"touchstart\", hasPayload: true },\n { prop: \"onTwoFingerTap\", eventName: \"twofingertap\", hasPayload: true },\n { prop: \"onWheel\", eventName: \"wheel\", hasPayload: true },\n { prop: \"onZoomChanged\", eventName: \"zoom_changed\", hasPayload: true },\n { prop: \"onZooming\", eventName: \"zooming\", hasPayload: false },\n { prop: \"onZoomStart\", eventName: \"zoomstart\", hasPayload: false }\n];\n\nconst NON_DIV_KEYS = new Set([\n \"onMapReady\",\n \"onMapDestroy\",\n \"onMapError\",\n \"retryOnError\",\n \"retryDelayMs\",\n \"fallback\",\n \"defaultCenter\",\n \"defaultZoom\",\n \"children\"\n]);\n\n/* ─── 유틸 ─── */\n\nfunction toCenterSignature(center: MapOptions[\"center\"] | undefined): string {\n if (!center) {\n return \"\";\n }\n\n if (typeof center === \"object\") {\n const candidate = center as unknown as Record<string, unknown>;\n const rawLat = candidate.lat;\n const rawLng = candidate.lng;\n const lat = typeof rawLat === \"function\" ? (rawLat as () => number)() : rawLat;\n const lng = typeof rawLng === \"function\" ? (rawLng as () => number)() : rawLng;\n\n if (typeof lat === \"number\" && typeof lng === \"number\") {\n return `latlng:${lat},${lng}`;\n }\n\n const rawX = candidate.x;\n const rawY = candidate.y;\n const x = typeof rawX === \"function\" ? (rawX as () => number)() : rawX;\n const y = typeof rawY === \"function\" ? (rawY as () => number)() : rawY;\n\n if (typeof x === \"number\" && typeof y === \"number\") {\n return `xy:${x},${y}`;\n }\n }\n\n return String(center);\n}\n\nfunction areValuesEqual(left: unknown, right: unknown): boolean {\n if (left === right) {\n return true;\n }\n\n if (left === null || right === null || left === undefined || right === undefined) {\n return false;\n }\n\n if (typeof left === \"object\" && typeof right === \"object\") {\n const leftCenter = toCenterSignature(left as MapOptions[\"center\"]);\n const rightCenter = toCenterSignature(right as MapOptions[\"center\"]);\n\n if (leftCenter !== \"\" && rightCenter !== \"\") {\n return leftCenter === rightCenter;\n }\n\n return JSON.stringify(left) === JSON.stringify(right);\n }\n\n return false;\n}\n\nfunction getChangedOptions(\n previous: naver.maps.MapOptions,\n next: naver.maps.MapOptions\n): Partial<naver.maps.MapOptions> {\n const keys = new Set([...Object.keys(previous), ...Object.keys(next)]);\n const changed: Array<[string, unknown]> = [];\n\n for (const key of keys) {\n const typedKey = key as keyof naver.maps.MapOptions;\n const previousValue = previous[typedKey];\n const nextValue = next[typedKey];\n\n if (!areValuesEqual(previousValue, nextValue) && nextValue !== undefined) {\n changed.push([key, nextValue]);\n }\n }\n\n return Object.fromEntries(changed) as Partial<naver.maps.MapOptions>;\n}\n\nfunction getDivProps(props: NaverMapProps): NaverMapDivProps {\n const entries: Array<[string, unknown]> = [];\n for (const [key, value] of Object.entries(props)) {\n if (NON_DIV_KEYS.has(key) || MAP_OPTION_KEY_SET.has(key) || MAP_EVENT_PROP_KEY_SET.has(key)) {\n continue;\n }\n entries.push([key, value]);\n }\n return Object.fromEntries(entries) as NaverMapDivProps;\n}\n\n/**\n * memo 비교: children과 함수(콜백)는 skip.\n * - children: React element는 JSON.stringify 불가\n * - 함수: ref를 통해 항상 최신 값을 읽으므로 비교 불필요\n */\nfunction areNaverMapPropsEqual(previousProps: NaverMapProps, nextProps: NaverMapProps): boolean {\n const keys = new Set([...Object.keys(previousProps), ...Object.keys(nextProps)]);\n\n for (const key of keys) {\n if (key === \"children\") {\n if (previousProps.children !== nextProps.children) {\n return false;\n }\n continue;\n }\n\n const previousValue = previousProps[key as keyof NaverMapProps];\n const nextValue = nextProps[key as keyof NaverMapProps];\n\n if (typeof previousValue === \"function\" && typeof nextValue === \"function\") {\n continue;\n }\n\n if (!areValuesEqual(previousValue, nextValue)) {\n return false;\n }\n }\n\n return true;\n}\n\n/* ─── 컴포넌트 ─── */\n\nconst NaverMapBase = forwardRef<NaverMapRef, NaverMapProps>(function NaverMapInner(props, ref) {\n const context = useContext(NaverMapContext);\n\n if (!context) {\n throw new Error(\"NaverMap must be used inside NaverMapProvider.\");\n }\n\n const { sdkStatus, setMap, reloadSdk } = context;\n\n // ─── mapReady state: children 렌더 트리거 ───\n const [mapReady, setMapReady] = useState(false);\n\n // ─── 콜백/이벤트 핸들러를 ref로 관리 (effect 재실행 방지) ───\n const propsRef = useRef(props);\n useEffect(() => {\n propsRef.current = props;\n });\n\n // ─── 초기값 (최초 1회만 캡처) ───\n const initialCenterRef = useRef(props.center ?? props.defaultCenter);\n const initialZoomRef = useRef(props.zoom ?? props.defaultZoom);\n\n // ─── controlled 여부 ───\n const isControlledCenter = props.center !== undefined;\n const isControlledZoom = props.zoom !== undefined;\n\n // ─── map options (개별 prop 의존성, defaultCenter/defaultZoom 제외) ───\n const mapOptions = useMemo(() => {\n const entries: Array<[string, unknown]> = [];\n for (const key of MAP_OPTION_KEYS) {\n const value = props[key];\n if (value !== undefined) {\n entries.push([key, value]);\n }\n }\n return Object.fromEntries(entries) as naver.maps.MapOptions;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n props.background,\n props.baseTileOpacity,\n props.bounds,\n props.center,\n props.zoom,\n props.disableDoubleClickZoom,\n props.disableDoubleTapZoom,\n props.disableKineticPan,\n props.disableTwoFingerTapZoom,\n props.draggable,\n props.keyboardShortcuts,\n props.logoControl,\n props.logoControlOptions,\n props.mapDataControl,\n props.mapDataControlOptions,\n props.mapTypeControl,\n props.mapTypeControlOptions,\n props.mapTypeId,\n props.mapTypes,\n props.maxBounds,\n props.maxZoom,\n props.minZoom,\n props.padding,\n props.pinchZoom,\n props.resizeOrigin,\n props.scaleControl,\n props.scaleControlOptions,\n props.scrollWheel,\n props.size,\n props.overlayZoomEffect,\n props.tileSpare,\n props.tileTransition,\n props.tileDuration,\n props.zoomControl,\n props.zoomControlOptions,\n props.zoomOrigin,\n props.blankTileImage,\n props.gl,\n props.customStyleId\n ]);\n\n // ─── div props ───\n const divProps = useMemo(() => getDivProps(props), [props]);\n\n // ─── 내부 refs ───\n const containerRef = useRef<HTMLDivElement | null>(null);\n const mapRef = useRef<naver.maps.Map | null>(null);\n const appliedOptionsRef = useRef<naver.maps.MapOptions>({});\n const retryTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const mapOptionsRef = useRef(mapOptions);\n mapOptionsRef.current = mapOptions;\n\n // ─── invokeMapMethod (안정적 ref) ───\n const invokeMapMethod = useCallback(\n <K extends keyof naver.maps.Map>(\n methodName: K,\n ...args: Parameters<Extract<naver.maps.Map[K], (...params: never[]) => unknown>>\n ): ReturnType<Extract<naver.maps.Map[K], (...params: never[]) => unknown>> | undefined => {\n const mapInstance = mapRef.current;\n\n if (!mapInstance) {\n return undefined;\n }\n\n const method = mapInstance[methodName] as unknown;\n\n if (typeof method !== \"function\") {\n return undefined;\n }\n\n return (method as (...params: unknown[]) => unknown).apply(mapInstance, args) as ReturnType<\n Extract<naver.maps.Map[K], (...params: never[]) => unknown>\n >;\n },\n []\n );\n\n // ─── imperative handle ───\n useImperativeHandle(\n ref,\n (): NaverMapRef => ({\n getInstance: () => mapRef.current,\n addOverlayPane: (name, elementOrZIndex) => {\n const mapInstance = mapRef.current as naver.maps.Map & {\n addOverlayPane?: (paneName: string, elementOrIndex: HTMLElement | number) => void;\n };\n mapInstance?.addOverlayPane?.(name, elementOrZIndex);\n },\n addPane: (...args) => invokeMapMethod(\"addPane\", ...args),\n autoResize: (...args) => invokeMapMethod(\"autoResize\", ...args),\n destroy: (...args) => {\n const mapInstance = mapRef.current as naver.maps.Map & { destroy?: () => void };\n\n if (!mapInstance) {\n return undefined;\n }\n\n try {\n return mapInstance.destroy?.(...args);\n } catch {\n return undefined;\n }\n },\n fitBounds: (...args) => invokeMapMethod(\"fitBounds\", ...args),\n getBounds: (...args) => invokeMapMethod(\"getBounds\", ...args),\n getCenter: (...args) => invokeMapMethod(\"getCenter\", ...args),\n getCenterPoint: (...args) => invokeMapMethod(\"getCenterPoint\", ...args),\n getElement: (...args) => invokeMapMethod(\"getElement\", ...args),\n getMapTypeId: (...args) => invokeMapMethod(\"getMapTypeId\", ...args),\n getMaxZoom: (...args) => invokeMapMethod(\"getMaxZoom\", ...args),\n getMinZoom: (...args) => invokeMapMethod(\"getMinZoom\", ...args),\n getOptions: (...args) => invokeMapMethod(\"getOptions\", ...args),\n getPanes: (...args) => invokeMapMethod(\"getPanes\", ...args),\n getPrimitiveProjection: (...args) => invokeMapMethod(\"getPrimitiveProjection\", ...args),\n getProjection: (...args) => invokeMapMethod(\"getProjection\", ...args),\n getSize: (...args) => invokeMapMethod(\"getSize\", ...args),\n getZoom: (...args) => invokeMapMethod(\"getZoom\", ...args),\n morph: (...args) => invokeMapMethod(\"morph\", ...args),\n panBy: (...args) => invokeMapMethod(\"panBy\", ...args),\n panTo: (...args) => invokeMapMethod(\"panTo\", ...args),\n panToBounds: (...args) => invokeMapMethod(\"panToBounds\", ...args),\n refresh: (...args) => invokeMapMethod(\"refresh\", ...args),\n removeOverlayPane: (name) => {\n const mapInstance = mapRef.current as naver.maps.Map & {\n removeOverlayPane?: (paneName: string) => void;\n };\n mapInstance?.removeOverlayPane?.(name);\n },\n removePane: (...args) => invokeMapMethod(\"removePane\", ...args),\n setCenter: (...args) => invokeMapMethod(\"setCenter\", ...args),\n setCenterPoint: (...args) => invokeMapMethod(\"setCenterPoint\", ...args),\n setMapTypeId: (...args) => invokeMapMethod(\"setMapTypeId\", ...args),\n setOptions: (...args) => invokeMapMethod(\"setOptions\", ...args),\n setSize: (...args) => invokeMapMethod(\"setSize\", ...args),\n setZoom: (...args) => invokeMapMethod(\"setZoom\", ...args),\n stop: (...args) => invokeMapMethod(\"stop\", ...args),\n updateBy: (...args) => invokeMapMethod(\"updateBy\", ...args),\n zoomBy: (...args) => invokeMapMethod(\"zoomBy\", ...args)\n }),\n [invokeMapMethod]\n );\n\n // ─── 지도 생성 + 이벤트 바인딩 (sdkStatus만 의존) ───\n useEffect(() => {\n if (sdkStatus !== \"ready\" || !containerRef.current) {\n return;\n }\n\n const container = containerRef.current;\n\n // 생성 시점의 옵션 스냅샷\n const initOptions = { ...mapOptionsRef.current };\n if (initOptions.center === undefined && initialCenterRef.current !== undefined) {\n initOptions.center = initialCenterRef.current;\n }\n if (initOptions.zoom === undefined && initialZoomRef.current !== undefined) {\n initOptions.zoom = initialZoomRef.current;\n }\n\n let mapInstance: naver.maps.Map;\n try {\n mapInstance = new naver.maps.Map(container, initOptions);\n } catch (error) {\n const normalizedError =\n error instanceof Error ? error : new Error(\"Failed to create naver.maps.Map instance.\");\n propsRef.current.onMapError?.(normalizedError);\n\n if (propsRef.current.retryOnError) {\n retryTimerRef.current = setTimeout(() => {\n void reloadSdk().catch(() => undefined);\n }, propsRef.current.retryDelayMs ?? 1000);\n }\n\n return () => {\n if (retryTimerRef.current) {\n clearTimeout(retryTimerRef.current);\n retryTimerRef.current = null;\n }\n };\n }\n\n mapRef.current = mapInstance;\n appliedOptionsRef.current = initOptions;\n setMap(mapInstance);\n setMapReady(true);\n propsRef.current.onMapReady?.(mapInstance);\n\n // 이벤트 리스너 — ref를 통해 항상 최신 핸들러를 읽으므로 1회만 바인딩\n const listeners = MAP_EVENT_BINDINGS.map((binding) =>\n naver.maps.Event.addListener(mapInstance, binding.eventName, (event: unknown) => {\n const handler = propsRef.current[binding.prop];\n if (typeof handler !== \"function\") {\n return;\n }\n if (binding.hasPayload) {\n (handler as (payload: unknown) => void)(event);\n } else {\n (handler as () => void)();\n }\n })\n );\n\n return () => {\n // 이벤트 해제\n try {\n naver.maps.Event.removeListener(listeners);\n naver.maps.Event.clearInstanceListeners(mapInstance);\n } catch {\n // 이미 해제된 경우 무시\n }\n\n // 타이머 정리\n if (retryTimerRef.current) {\n clearTimeout(retryTimerRef.current);\n retryTimerRef.current = null;\n }\n\n // DOM 정리\n container.innerHTML = \"\";\n\n // 상태 초기화\n mapRef.current = null;\n appliedOptionsRef.current = {};\n setMap(null);\n setMapReady(false);\n propsRef.current.onMapDestroy?.();\n };\n }, [sdkStatus, setMap, reloadSdk]);\n\n // ─── 옵션 동기화 (controlled prop만 지도에 반영) ───\n useEffect(() => {\n const mapInstance = mapRef.current;\n if (!mapInstance) {\n return;\n }\n\n const changed = getChangedOptions(appliedOptionsRef.current, mapOptions);\n if (Object.keys(changed).length === 0) {\n appliedOptionsRef.current = mapOptions;\n return;\n }\n\n const {\n center: changedCenter,\n zoom: changedZoom,\n mapTypeId: changedMapTypeId,\n ...otherChanged\n } = changed;\n\n // uncontrolled 상태 보존: setOptions/setMapTypeId 등이\n // 내부적으로 center/zoom을 리셋할 수 있으므로 미리 저장\n const savedCenter = !isControlledCenter ? mapInstance.getCenter() : null;\n const savedZoom = !isControlledZoom ? mapInstance.getZoom() : null;\n\n // center/zoom/mapTypeId 이외 옵션 → setOptions\n if (Object.keys(otherChanged).length > 0) {\n mapInstance.setOptions(otherChanged);\n }\n\n // mapTypeId 동기화\n if (changedMapTypeId !== undefined && mapOptions.mapTypeId !== undefined) {\n mapInstance.setMapTypeId(mapOptions.mapTypeId);\n }\n\n // controlled center 동기화\n if (isControlledCenter && changedCenter !== undefined) {\n mapInstance.setCenter(changedCenter as naver.maps.Coord);\n }\n\n // controlled zoom 동기화\n if (isControlledZoom && changedZoom !== undefined && mapOptions.zoom !== undefined) {\n mapInstance.setZoom(mapOptions.zoom);\n }\n\n // uncontrolled center/zoom 복원: 다른 옵션 변경으로 리셋됐을 수 있음\n if (savedCenter) {\n mapInstance.setCenter(savedCenter);\n }\n if (savedZoom !== null) {\n mapInstance.setZoom(savedZoom);\n }\n\n appliedOptionsRef.current = mapOptions;\n }, [mapOptions, isControlledCenter, isControlledZoom]);\n\n // ─── 렌더 ───\n if (sdkStatus === \"error\") {\n return <>{props.fallback ?? <div {...divProps}>지도를 불러올 수 없습니다.</div>}</>;\n }\n\n if (sdkStatus === \"loading\") {\n return <>{props.fallback ?? <div {...divProps} />}</>;\n }\n\n return (\n <div ref={containerRef} {...divProps}>\n {mapReady ? props.children : null}\n </div>\n );\n});\n\nNaverMapBase.displayName = \"NaverMap\";\n\nexport const NaverMap = memo(NaverMapBase, areNaverMapPropsEqual);\n","import { useContext } from \"react\";\n\nimport { NaverMapContext } from \"../provider/NaverMapProvider\";\n\nimport type { NaverMapContextValue } from \"../provider/NaverMapProvider\";\n\nexport interface UseNaverMapOptions {\n requireReady?: boolean;\n requireMapInstance?: boolean;\n}\n\nexport function useNaverMap(options: UseNaverMapOptions = {}): NaverMapContextValue {\n const context = useContext(NaverMapContext);\n\n if (!context) {\n throw new Error(\"useNaverMap must be used within NaverMapProvider.\");\n }\n\n if (options.requireReady && context.sdkStatus !== \"ready\") {\n throw new Error(`Naver Maps SDK is not ready. Current status: ${context.sdkStatus}.`);\n }\n\n if (options.requireMapInstance && !context.map) {\n throw new Error(\"Naver map instance is not available yet.\");\n }\n\n return context;\n}\n\nexport function useNaverMapInstance(\n options: { requireReady?: boolean } = {}\n): naver.maps.Map | null {\n const context = useNaverMap({\n requireReady: options.requireReady,\n requireMapInstance: false\n });\n\n return context.map;\n}\n","import { createContext, useContext } from \"react\";\n\nimport type { ItemRecord } from \"./types\";\n\n/**\n * `<MarkerClusterer>` 내부에서 `<Marker>`가 사용하는 registry 인터페이스.\n *\n * `<Marker>`는 이 인터페이스를 통해 클러스터러에 자신의 위치·데이터를 등록하고,\n * 언마운트 시 등록을 해제합니다.\n *\n * `enabled`가 `false`이면 `<Marker>`는 registry 대신 직접 `naver.maps.Marker`를 생성합니다.\n *\n * @typeParam TData - `<Marker item={...}>`의 데이터 타입\n */\nexport interface ClustererRegistry<TData = unknown> {\n /**\n * 클러스터링 활성화 여부.\n * `false`이면 `<Marker>`가 개별 마커로 직접 렌더링됩니다.\n */\n readonly enabled: boolean;\n\n /**\n * 마커를 registry에 등록합니다.\n * 등록 후 클러스터러가 다음 재계산 사이클에서 이 마커를 처리합니다.\n *\n * @param item - 등록할 마커 레코드\n */\n register(item: ItemRecord<TData>): void;\n\n /**\n * 마커를 registry에서 제거합니다.\n * `<Marker>` 언마운트 시 자동으로 호출됩니다.\n *\n * @param id - 제거할 마커의 ID\n */\n unregister(id: string | number): void;\n}\n\n/**\n * `<MarkerClusterer>`가 제공하는 React Context.\n *\n * `<Marker>`는 이 context를 통해 클러스터러에 자신을 등록합니다.\n * `null`이면 클러스터러 밖에 있는 것이므로 일반 마커로 동작합니다.\n *\n * @internal 라이브러리 내부 전용. 직접 사용하지 마세요.\n */\nexport const ClustererContext = createContext<ClustererRegistry | null>(null);\n\nClustererContext.displayName = \"ClustererContext\";\n\n/**\n * `<MarkerClusterer>` context를 읽는 hook.\n *\n * `<MarkerClusterer>` 내부에서만 non-null 값을 반환합니다.\n * 외부에서 호출하면 `null`을 반환합니다.\n *\n * @returns registry 인스턴스 또는 `null`\n *\n * @internal 라이브러리 내부 전용.\n */\nexport function useClustererContext(): ClustererRegistry | null {\n return useContext(ClustererContext);\n}\n","import {\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useRef,\n useState\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { useNaverMap } from \"../../react/hooks/useNaverMap\";\nimport { ClustererContext } from \"../marker-clusterer/ClustererContext\";\n\nimport type { ReactNode, ReactPortal } from \"react\";\n\ntype MarkerOptions = naver.maps.MarkerOptions;\ntype MarkerIcon = NonNullable<MarkerOptions[\"icon\"]>;\ntype MarkerIconObject = Exclude<MarkerIcon, string>;\n\ninterface MarkerOverlayProps {\n map?: naver.maps.Map | null;\n position: MarkerOptions[\"position\"];\n icon?: MarkerOptions[\"icon\"];\n animation?: MarkerOptions[\"animation\"];\n shape?: MarkerOptions[\"shape\"];\n title?: MarkerOptions[\"title\"];\n cursor?: MarkerOptions[\"cursor\"];\n clickable?: MarkerOptions[\"clickable\"];\n draggable?: MarkerOptions[\"draggable\"];\n visible?: MarkerOptions[\"visible\"];\n zIndex?: MarkerOptions[\"zIndex\"];\n collisionBehavior?: boolean;\n collisionBoxSize?: naver.maps.Size | naver.maps.SizeLiteral;\n\n /** Used by MarkerClusterer to identify this marker. Falls back to React key if not provided. */\n clustererItemId?: string | number;\n /** Data object passed to MarkerClusterer's algorithm via registry. */\n item?: unknown;\n}\n\ninterface MarkerLifecycleProps {\n children?: ReactNode;\n onMarkerReady?: (marker: naver.maps.Marker) => void;\n onMarkerDestroy?: () => void;\n onMarkerError?: (error: Error) => void;\n}\n\ninterface MarkerEventProps {\n onClick?: (event: naver.maps.PointerEvent) => void;\n onDblClick?: (event: naver.maps.PointerEvent) => void;\n onRightClick?: (event: naver.maps.PointerEvent) => void;\n onMouseDown?: (event: naver.maps.PointerEvent) => void;\n onMouseUp?: (event: naver.maps.PointerEvent) => void;\n onTouchStart?: (event: naver.maps.PointerEvent) => void;\n onTouchEnd?: (event: naver.maps.PointerEvent) => void;\n onDragStart?: (event: naver.maps.PointerEvent) => void;\n onDrag?: (event: naver.maps.PointerEvent) => void;\n onDragEnd?: (event: naver.maps.PointerEvent) => void;\n onClickableChanged?: (clickable: boolean) => void;\n onCursorChanged?: (cursor: string) => void;\n onDraggableChanged?: (draggable: boolean) => void;\n onIconChanged?: (\n icon: string | naver.maps.ImageIcon | naver.maps.SymbolIcon | naver.maps.HtmlIcon\n ) => void;\n onIconLoaded?: (marker: naver.maps.Marker) => void;\n onPositionChanged?: (position: naver.maps.Coord) => void;\n onShapeChanged?: (shape: naver.maps.MarkerShape) => void;\n onTitleChanged?: (title: string) => void;\n onVisibleChanged?: (visible: boolean) => void;\n onZIndexChanged?: (zIndex: number) => void;\n}\n\nexport type MarkerProps = MarkerOverlayProps & MarkerLifecycleProps & MarkerEventProps;\n\ntype MarkerMethod<K extends keyof naver.maps.Marker> = naver.maps.Marker[K] extends (\n ...args: infer A\n) => infer R\n ? (...args: A) => R | undefined\n : never;\n\nexport interface MarkerRef {\n getInstance: () => naver.maps.Marker | null;\n getAnimation: MarkerMethod<\"getAnimation\">;\n getClickable: MarkerMethod<\"getClickable\">;\n getCursor: MarkerMethod<\"getCursor\">;\n getDraggable: MarkerMethod<\"getDraggable\">;\n getDrawingRect: MarkerMethod<\"getDrawingRect\">;\n getElement: MarkerMethod<\"getElement\">;\n getIcon: MarkerMethod<\"getIcon\">;\n getMap: MarkerMethod<\"getMap\">;\n getOptions: MarkerMethod<\"getOptions\">;\n getPanes: MarkerMethod<\"getPanes\">;\n getPosition: MarkerMethod<\"getPosition\">;\n getProjection: MarkerMethod<\"getProjection\">;\n getShape: MarkerMethod<\"getShape\">;\n getTitle: MarkerMethod<\"getTitle\">;\n getVisible: MarkerMethod<\"getVisible\">;\n getZIndex: MarkerMethod<\"getZIndex\">;\n setAnimation: MarkerMethod<\"setAnimation\">;\n setClickable: MarkerMethod<\"setClickable\">;\n setCursor: MarkerMethod<\"setCursor\">;\n setDraggable: MarkerMethod<\"setDraggable\">;\n setIcon: MarkerMethod<\"setIcon\">;\n setMap: MarkerMethod<\"setMap\">;\n setOptions: MarkerMethod<\"setOptions\">;\n setPosition: MarkerMethod<\"setPosition\">;\n setShape: MarkerMethod<\"setShape\">;\n setTitle: MarkerMethod<\"setTitle\">;\n setVisible: MarkerMethod<\"setVisible\">;\n setZIndex: MarkerMethod<\"setZIndex\">;\n}\n\ninterface MarkerEventBinding {\n eventName: string;\n invoke?: (event: unknown) => void;\n}\n\nfunction pickHtmlIconAnchor(icon: MarkerIconObject): naver.maps.HtmlIcon[\"anchor\"] | undefined {\n if (\"anchor\" in icon) {\n return icon.anchor;\n }\n\n return undefined;\n}\n\nfunction pickHtmlIconSize(icon: MarkerIconObject): naver.maps.HtmlIcon[\"size\"] | undefined {\n if (\"size\" in icon) {\n return icon.size;\n }\n\n return undefined;\n}\n\nfunction resolveMarkerIcon(\n icon: MarkerOptions[\"icon\"],\n childrenContainer: HTMLDivElement | null,\n hasChildren: boolean\n): MarkerOptions[\"icon\"] {\n if (!hasChildren || !childrenContainer) {\n return icon;\n }\n\n const iconObject = typeof icon === \"object\" && icon !== null ? icon : undefined;\n\n return {\n content: childrenContainer,\n anchor: iconObject ? pickHtmlIconAnchor(iconObject) : undefined,\n size: iconObject ? pickHtmlIconSize(iconObject) : undefined\n };\n}\n\nfunction toMarkerOptions(\n props: MarkerProps,\n targetMap: naver.maps.Map | null,\n icon: MarkerOptions[\"icon\"]\n): MarkerOptions {\n const options: MarkerOptions = {\n position: props.position,\n icon\n };\n\n if (targetMap) {\n options.map = targetMap;\n }\n\n if (props.animation !== undefined) {\n options.animation = props.animation;\n }\n\n if (props.shape !== undefined) {\n options.shape = props.shape;\n }\n\n if (props.title !== undefined) {\n options.title = props.title;\n }\n\n if (props.cursor !== undefined) {\n options.cursor = props.cursor;\n }\n\n if (props.clickable !== undefined) {\n options.clickable = props.clickable;\n }\n\n if (props.draggable !== undefined) {\n options.draggable = props.draggable;\n }\n\n if (props.visible !== undefined) {\n options.visible = props.visible;\n }\n\n if (props.zIndex !== undefined) {\n options.zIndex = props.zIndex;\n }\n\n return options;\n}\n\nfunction buildMarkerEventBindings(propsRef: { current: MarkerProps }): MarkerEventBinding[] {\n return [\n {\n eventName: \"click\",\n invoke: (event) => propsRef.current.onClick?.(event as naver.maps.PointerEvent)\n },\n {\n eventName: \"dblclick\",\n invoke: (event) => propsRef.current.onDblClick?.(event as naver.maps.PointerEvent)\n },\n {\n eventName: \"rightclick\",\n invoke: (event) => propsRef.current.onRightClick?.(event as naver.maps.PointerEvent)\n },\n {\n eventName: \"mousedown\",\n invoke: (event) => propsRef.current.onMouseDown?.(event as naver.maps.PointerEvent)\n },\n {\n eventName: \"mouseup\",\n invoke: (event) => propsRef.current.onMouseUp?.(event as naver.maps.PointerEvent)\n },\n {\n eventName: \"touchstart\",\n invoke: (event) => propsRef.current.onTouchStart?.(event as naver.maps.PointerEvent)\n },\n {\n eventName: \"touchend\",\n invoke: (event) => propsRef.current.onTouchEnd?.(event as naver.maps.PointerEvent)\n },\n {\n eventName: \"dragstart\",\n invoke: (event) => propsRef.current.onDragStart?.(event as naver.maps.PointerEvent)\n },\n {\n eventName: \"drag\",\n invoke: (event) => propsRef.current.onDrag?.(event as naver.maps.PointerEvent)\n },\n {\n eventName: \"dragend\",\n invoke: (event) => propsRef.current.onDragEnd?.(event as naver.maps.PointerEvent)\n },\n {\n eventName: \"clickable_changed\",\n invoke: (event) => propsRef.current.onClickableChanged?.(event as boolean)\n },\n {\n eventName: \"cursor_changed\",\n invoke: (event) => propsRef.current.onCursorChanged?.(event as string)\n },\n {\n eventName: \"draggable_changed\",\n invoke: (event) => propsRef.current.onDraggableChanged?.(event as boolean)\n },\n {\n eventName: \"icon_changed\",\n invoke: (event) =>\n propsRef.current.onIconChanged?.(\n event as string | naver.maps.ImageIcon | naver.maps.SymbolIcon | naver.maps.HtmlIcon\n )\n },\n {\n eventName: \"icon_loaded\",\n invoke: (event) => propsRef.current.onIconLoaded?.(event as naver.maps.Marker)\n },\n {\n eventName: \"position_changed\",\n invoke: (event) => propsRef.current.onPositionChanged?.(event as naver.maps.Coord)\n },\n {\n eventName: \"shape_changed\",\n invoke: (event) => propsRef.current.onShapeChanged?.(event as naver.maps.MarkerShape)\n },\n {\n eventName: \"title_changed\",\n invoke: (event) => propsRef.current.onTitleChanged?.(event as string)\n },\n {\n eventName: \"visible_changed\",\n invoke: (event) => propsRef.current.onVisibleChanged?.(event as boolean)\n },\n {\n eventName: \"zIndex_changed\",\n invoke: (event) => propsRef.current.onZIndexChanged?.(event as number)\n }\n ];\n}\n\nfunction bindMarkerEventListeners(\n marker: naver.maps.Marker,\n listenersRef: { current: naver.maps.MapEventListener[] },\n bindings: MarkerEventBinding[]\n): void {\n if (listenersRef.current.length > 0) {\n naver.maps.Event.removeListener(listenersRef.current);\n listenersRef.current = [];\n }\n\n listenersRef.current = bindings\n .filter((binding) => typeof binding.invoke === \"function\")\n .map((binding) =>\n naver.maps.Event.addListener(marker, binding.eventName, (event: unknown) => {\n binding.invoke?.(event);\n })\n );\n}\n\n// ─── Resolve position to LatLngLiteral for registry ───────────────\n\nfunction toLatLngLiteral(position: MarkerOptions[\"position\"]): { lat: number; lng: number } | null {\n if (!position) return null;\n\n if (typeof position === \"object\" && \"lat\" in position && \"lng\" in position) {\n if (typeof position.lat === \"number\" && typeof position.lng === \"number\") {\n return { lat: position.lat, lng: position.lng };\n }\n if (typeof position.lat === \"function\" && typeof position.lng === \"function\") {\n return {\n lat: (position as naver.maps.LatLng).lat(),\n lng: (position as naver.maps.LatLng).lng()\n };\n }\n }\n\n if (typeof position === \"object\" && \"x\" in position && \"y\" in position) {\n const p = position as naver.maps.Point;\n if (typeof p.x === \"number\" && typeof p.y === \"number\") {\n return { lat: p.y, lng: p.x };\n }\n }\n\n return null;\n}\n\nexport const Marker = forwardRef<MarkerRef, MarkerProps>(\n function MarkerInner(props, ref): ReactPortal | null {\n const { map: contextMap, sdkStatus } = useNaverMap();\n const clustererRegistry = useContext(ClustererContext);\n const isInsideClusterer = clustererRegistry !== null && clustererRegistry.enabled;\n const markerRef = useRef<naver.maps.Marker | null>(null);\n const markerEventListenersRef = useRef<naver.maps.MapEventListener[]>([]);\n const onMarkerDestroyRef = useRef<MarkerProps[\"onMarkerDestroy\"]>(props.onMarkerDestroy);\n const [markerDiv, setMarkerDiv] = useState<HTMLDivElement | null>(null);\n const [portalReady, setPortalReady] = useState(false);\n const hasChildren = props.children !== undefined && props.children !== null;\n const targetMap = props.map ?? contextMap;\n\n // ── props를 ref로 관리 (effect 재실행 방지) ───────────────────────\n const propsRef = useRef(props);\n useEffect(() => {\n propsRef.current = props;\n });\n\n // ── Clusterer registry mode ───────────────────────────────\n\n useEffect(() => {\n if (!clustererRegistry) return;\n\n const id = props.clustererItemId;\n if (id === undefined || id === null) return;\n\n const latLng = toLatLngLiteral(props.position);\n if (!latLng) return;\n\n clustererRegistry.register({\n id,\n position: latLng,\n data: props.item ?? null,\n markerOptions: props.icon !== undefined ? { icon: props.icon } : undefined\n });\n\n return () => {\n clustererRegistry.unregister(id);\n };\n }, [clustererRegistry, props.clustererItemId, props.position, props.item, props.icon]);\n\n // ── Normal marker mode hooks (always called, but guarded) ─\n\n useEffect(() => {\n if (isInsideClusterer) return;\n onMarkerDestroyRef.current = props.onMarkerDestroy;\n }, [isInsideClusterer, props.onMarkerDestroy]);\n\n useEffect(() => {\n if (isInsideClusterer) return;\n if (typeof document === \"undefined\") {\n return;\n }\n\n setMarkerDiv(document.createElement(\"div\"));\n }, [isInsideClusterer]);\n\n useEffect(() => {\n if (isInsideClusterer) return;\n if (!hasChildren || !markerDiv) {\n setPortalReady(false);\n return;\n }\n\n const updateReadyState = () => {\n setPortalReady(markerDiv.childNodes.length > 0);\n };\n\n updateReadyState();\n\n const observer = new MutationObserver(updateReadyState);\n observer.observe(markerDiv, {\n childList: true,\n subtree: true\n });\n\n return () => {\n observer.disconnect();\n };\n }, [isInsideClusterer, hasChildren, markerDiv]);\n\n const invokeMarkerMethod = useCallback(\n <K extends keyof naver.maps.Marker>(\n methodName: K,\n ...args: Parameters<Extract<naver.maps.Marker[K], (...params: never[]) => unknown>>\n ): ReturnType<Extract<naver.maps.Marker[K], (...params: never[]) => unknown>> | undefined => {\n const marker = markerRef.current;\n\n if (!marker) {\n return undefined;\n }\n\n const method = marker[methodName] as unknown;\n\n if (typeof method !== \"function\") {\n return undefined;\n }\n\n return (method as (...params: unknown[]) => unknown).apply(marker, args) as ReturnType<\n Extract<naver.maps.Marker[K], (...params: never[]) => unknown>\n >;\n },\n []\n );\n\n const teardownMarker = useCallback(() => {\n const marker = markerRef.current;\n\n if (!marker) {\n return;\n }\n\n try {\n if (markerEventListenersRef.current.length > 0) {\n naver.maps.Event.removeListener(markerEventListenersRef.current);\n markerEventListenersRef.current = [];\n }\n\n naver.maps.Event.clearInstanceListeners(marker);\n } catch (error) {\n console.error(\"[react-naver-maps-kit] failed to clear marker listeners\", error);\n }\n\n marker.setMap(null);\n markerRef.current = null;\n onMarkerDestroyRef.current?.();\n }, []);\n\n useImperativeHandle(\n ref,\n (): MarkerRef => ({\n getInstance: () => markerRef.current,\n getAnimation: (...args) => invokeMarkerMethod(\"getAnimation\", ...args),\n getClickable: (...args) => invokeMarkerMethod(\"getClickable\", ...args),\n getCursor: (...args) => invokeMarkerMethod(\"getCursor\", ...args),\n getDraggable: (...args) => invokeMarkerMethod(\"getDraggable\", ...args),\n getDrawingRect: (...args) => invokeMarkerMethod(\"getDrawingRect\", ...args),\n getElement: (...args) => invokeMarkerMethod(\"getElement\", ...args),\n getIcon: (...args) => invokeMarkerMethod(\"getIcon\", ...args),\n getMap: (...args) => invokeMarkerMethod(\"getMap\", ...args),\n getOptions: (...args) => invokeMarkerMethod(\"getOptions\", ...args),\n getPanes: (...args) => invokeMarkerMethod(\"getPanes\", ...args),\n getPosition: (...args) => invokeMarkerMethod(\"getPosition\", ...args),\n getProjection: (...args) => invokeMarkerMethod(\"getProjection\", ...args),\n getShape: (...args) => invokeMarkerMethod(\"getShape\", ...args),\n getTitle: (...args) => invokeMarkerMethod(\"getTitle\", ...args),\n getVisible: (...args) => invokeMarkerMethod(\"getVisible\", ...args),\n getZIndex: (...args) => invokeMarkerMethod(\"getZIndex\", ...args),\n setAnimation: (...args) => invokeMarkerMethod(\"setAnimation\", ...args),\n setClickable: (...args) => invokeMarkerMethod(\"setClickable\", ...args),\n setCursor: (...args) => invokeMarkerMethod(\"setCursor\", ...args),\n setDraggable: (...args) => invokeMarkerMethod(\"setDraggable\", ...args),\n setIcon: (...args) => invokeMarkerMethod(\"setIcon\", ...args),\n setMap: (...args) => invokeMarkerMethod(\"setMap\", ...args),\n setOptions: (...args) => invokeMarkerMethod(\"setOptions\", ...args),\n setPosition: (...args) => invokeMarkerMethod(\"setPosition\", ...args),\n setShape: (...args) => invokeMarkerMethod(\"setShape\", ...args),\n setTitle: (...args) => invokeMarkerMethod(\"setTitle\", ...args),\n setVisible: (...args) => invokeMarkerMethod(\"setVisible\", ...args),\n setZIndex: (...args) => invokeMarkerMethod(\"setZIndex\", ...args)\n }),\n [invokeMarkerMethod]\n );\n\n useEffect(() => {\n if (isInsideClusterer) return;\n if (sdkStatus !== \"ready\" || !targetMap || markerRef.current) {\n return;\n }\n\n if (hasChildren && !portalReady) {\n return;\n }\n\n try {\n const resolvedIcon = resolveMarkerIcon(propsRef.current.icon, markerDiv, hasChildren);\n const marker = new naver.maps.Marker(\n toMarkerOptions(propsRef.current, targetMap, resolvedIcon)\n );\n\n markerRef.current = marker;\n\n if (propsRef.current.collisionBehavior !== undefined) {\n marker.setOptions(\"collisionBehavior\", propsRef.current.collisionBehavior);\n }\n\n if (propsRef.current.collisionBoxSize !== undefined) {\n marker.setOptions(\"collisionBoxSize\", propsRef.current.collisionBoxSize);\n }\n\n bindMarkerEventListeners(\n marker,\n markerEventListenersRef,\n buildMarkerEventBindings(propsRef)\n );\n propsRef.current.onMarkerReady?.(marker);\n } catch (error) {\n const normalizedError =\n error instanceof Error\n ? error\n : new Error(\"Failed to create naver.maps.Marker instance.\");\n\n propsRef.current.onMarkerError?.(normalizedError);\n }\n }, [isInsideClusterer, hasChildren, markerDiv, portalReady, sdkStatus, targetMap]);\n\n useLayoutEffect(() => {\n if (isInsideClusterer) return;\n const marker = markerRef.current;\n\n if (!marker || !targetMap) {\n return;\n }\n\n const rafId = requestAnimationFrame(() => {\n const currentProps = propsRef.current;\n const resolvedIcon =\n hasChildren && portalReady\n ? resolveMarkerIcon(currentProps.icon, markerDiv, hasChildren)\n : currentProps.icon;\n const nextOptions = toMarkerOptions(currentProps, targetMap, resolvedIcon);\n\n marker.setOptions(nextOptions);\n\n if (currentProps.collisionBehavior !== undefined) {\n marker.setOptions(\"collisionBehavior\", currentProps.collisionBehavior);\n }\n\n if (currentProps.collisionBoxSize !== undefined) {\n marker.setOptions(\"collisionBoxSize\", currentProps.collisionBoxSize);\n }\n });\n\n return () => {\n cancelAnimationFrame(rafId);\n };\n }, [\n isInsideClusterer,\n hasChildren,\n markerDiv,\n portalReady,\n targetMap,\n props.position,\n props.icon,\n props.animation,\n props.shape,\n props.title,\n props.cursor,\n props.clickable,\n props.draggable,\n props.visible,\n props.zIndex,\n props.collisionBehavior,\n props.collisionBoxSize\n ]);\n\n useEffect(() => {\n if (isInsideClusterer) return;\n const marker = markerRef.current;\n\n if (!marker) {\n return;\n }\n\n bindMarkerEventListeners(marker, markerEventListenersRef, buildMarkerEventBindings(propsRef));\n\n return () => {\n if (markerEventListenersRef.current.length > 0) {\n naver.maps.Event.removeListener(markerEventListenersRef.current);\n markerEventListenersRef.current = [];\n }\n };\n }, [isInsideClusterer]);\n\n useEffect(() => {\n if (isInsideClusterer) return;\n return () => {\n teardownMarker();\n };\n }, [isInsideClusterer, teardownMarker]);\n\n // If inside a clusterer, render nothing (data registered via effect above)\n if (isInsideClusterer) {\n return null;\n }\n\n if (!hasChildren || !markerDiv) {\n return null;\n }\n\n return createPortal(props.children, markerDiv);\n }\n);\n\nMarker.displayName = \"Marker\";\n","import type { AlgorithmContext, Cluster, ClusterAlgorithm, ItemRecord } from \"../types\";\n\ninterface GridAlgorithmOptions {\n readonly gridSize: number;\n readonly minClusterSize: number;\n readonly maxZoom: number;\n}\n\nconst DEFAULT_OPTIONS: GridAlgorithmOptions = {\n gridSize: 60,\n minClusterSize: 2,\n maxZoom: 21\n};\n\nexport class GridAlgorithm<TData> implements ClusterAlgorithm<TData> {\n private options: GridAlgorithmOptions;\n\n constructor(options?: Partial<GridAlgorithmOptions>) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n\n cluster(\n items: readonly ItemRecord<TData>[],\n ctx: AlgorithmContext\n ): {\n readonly clusters: readonly Cluster<TData>[];\n readonly points: readonly ItemRecord<TData>[];\n } {\n if (ctx.zoom >= this.options.maxZoom) {\n return { clusters: [], points: items };\n }\n\n const { gridSize } = this.options;\n const scale = Math.pow(2, ctx.zoom);\n const cellMap = new Map<string, ItemRecord<TData>[]>();\n\n for (const item of items) {\n const worldX = ((item.position.lng + 180) / 360) * scale;\n const latRad = (item.position.lat * Math.PI) / 180;\n const worldY = ((1 - Math.log(Math.tan(latRad) + 1 / Math.cos(latRad)) / Math.PI) / 2) * scale;\n\n const cellX = Math.floor((worldX * 256) / gridSize);\n const cellY = Math.floor((worldY * 256) / gridSize);\n const key = `${cellX}:${cellY}`;\n\n let cell = cellMap.get(key);\n if (!cell) {\n cell = [];\n cellMap.set(key, cell);\n }\n cell.push(item);\n }\n\n const clusters: Cluster<TData>[] = [];\n const points: ItemRecord<TData>[] = [];\n\n for (const [key, cellItems] of cellMap) {\n if (cellItems.length < this.options.minClusterSize) {\n points.push(...cellItems);\n continue;\n }\n\n let sumLat = 0;\n let sumLng = 0;\n let minLat = Infinity;\n let maxLat = -Infinity;\n let minLng = Infinity;\n let maxLng = -Infinity;\n\n for (const item of cellItems) {\n sumLat += item.position.lat;\n sumLng += item.position.lng;\n minLat = Math.min(minLat, item.position.lat);\n maxLat = Math.max(maxLat, item.position.lat);\n minLng = Math.min(minLng, item.position.lng);\n maxLng = Math.max(maxLng, item.position.lng);\n }\n\n clusters.push({\n id: `grid-${key}`,\n position: {\n lat: sumLat / cellItems.length,\n lng: sumLng / cellItems.length\n },\n count: cellItems.length,\n bounds: {\n south: minLat,\n north: maxLat,\n west: minLng,\n east: maxLng\n },\n items: cellItems\n });\n }\n\n return { clusters, points };\n }\n\n setOptions(options: unknown): void {\n if (typeof options === \"object\" && options !== null) {\n this.options = { ...this.options, ...(options as Partial<GridAlgorithmOptions>) };\n }\n }\n}\n","import type { AlgorithmContext, Cluster, ClusterAlgorithm, ItemRecord } from \"../types\";\n\ninterface RadiusAlgorithmOptions {\n readonly radius: number;\n readonly minClusterSize: number;\n readonly maxZoom: number;\n}\n\nconst DEFAULT_OPTIONS: RadiusAlgorithmOptions = {\n radius: 60,\n minClusterSize: 2,\n maxZoom: 21\n};\n\nfunction toWorldPixel(lat: number, lng: number, zoom: number): { x: number; y: number } {\n const scale = Math.pow(2, zoom) * 256;\n const x = ((lng + 180) / 360) * scale;\n const latRad = (lat * Math.PI) / 180;\n const y = ((1 - Math.log(Math.tan(latRad) + 1 / Math.cos(latRad)) / Math.PI) / 2) * scale;\n return { x, y };\n}\n\nfunction pixelDistance(\n a: { x: number; y: number },\n b: { x: number; y: number }\n): number {\n const dx = a.x - b.x;\n const dy = a.y - b.y;\n return Math.sqrt(dx * dx + dy * dy);\n}\n\nexport class RadiusAlgorithm<TData> implements ClusterAlgorithm<TData> {\n private options: RadiusAlgorithmOptions;\n\n constructor(options?: Partial<RadiusAlgorithmOptions>) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n\n cluster(\n items: readonly ItemRecord<TData>[],\n ctx: AlgorithmContext\n ): {\n readonly clusters: readonly Cluster<TData>[];\n readonly points: readonly ItemRecord<TData>[];\n } {\n if (ctx.zoom >= this.options.maxZoom) {\n return { clusters: [], points: items };\n }\n\n const { radius } = this.options;\n const used = new Set<string | number>();\n const clusters: Cluster<TData>[] = [];\n const points: ItemRecord<TData>[] = [];\n\n const pixelPositions = items.map((item) =>\n toWorldPixel(item.position.lat, item.position.lng, ctx.zoom)\n );\n\n for (let i = 0; i < items.length; i++) {\n if (used.has(items[i].id)) continue;\n\n const center = pixelPositions[i];\n const group: ItemRecord<TData>[] = [items[i]];\n used.add(items[i].id);\n\n for (let j = i + 1; j < items.length; j++) {\n if (used.has(items[j].id)) continue;\n if (pixelDistance(center, pixelPositions[j]) <= radius) {\n group.push(items[j]);\n used.add(items[j].id);\n }\n }\n\n if (group.length < this.options.minClusterSize) {\n points.push(...group);\n continue;\n }\n\n let sumLat = 0;\n let sumLng = 0;\n let minLat = Infinity;\n let maxLat = -Infinity;\n let minLng = Infinity;\n let maxLng = -Infinity;\n\n for (const item of group) {\n sumLat += item.position.lat;\n sumLng += item.position.lng;\n minLat = Math.min(minLat, item.position.lat);\n maxLat = Math.max(maxLat, item.position.lat);\n minLng = Math.min(minLng, item.position.lng);\n maxLng = Math.max(maxLng, item.position.lng);\n }\n\n const avgLat = sumLat / group.length;\n const avgLng = sumLng / group.length;\n\n clusters.push({\n id: `radius-${avgLat.toFixed(6)}-${avgLng.toFixed(6)}-${group.length}`,\n position: { lat: avgLat, lng: avgLng },\n count: group.length,\n bounds: { south: minLat, north: maxLat, west: minLng, east: maxLng },\n items: group\n });\n }\n\n return { clusters, points };\n }\n\n setOptions(options: unknown): void {\n if (typeof options === \"object\" && options !== null) {\n this.options = { ...this.options, ...(options as Partial<RadiusAlgorithmOptions>) };\n }\n }\n}\n","\nconst ARRAY_TYPES = [\n Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array,\n Int32Array, Uint32Array, Float32Array, Float64Array\n];\n\n/** @typedef {Int8ArrayConstructor | Uint8ArrayConstructor | Uint8ClampedArrayConstructor | Int16ArrayConstructor | Uint16ArrayConstructor | Int32ArrayConstructor | Uint32ArrayConstructor | Float32ArrayConstructor | Float64ArrayConstructor} TypedArrayConstructor */\n\nconst VERSION = 1; // serialized format version\nconst HEADER_SIZE = 8;\n\nexport default class KDBush {\n\n /**\n * Creates an index from raw `ArrayBuffer` data.\n * @param {ArrayBuffer} data\n */\n static from(data) {\n if (!(data instanceof ArrayBuffer)) {\n throw new Error('Data must be an instance of ArrayBuffer.');\n }\n const [magic, versionAndType] = new Uint8Array(data, 0, 2);\n if (magic !== 0xdb) {\n throw new Error('Data does not appear to be in a KDBush format.');\n }\n const version = versionAndType >> 4;\n if (version !== VERSION) {\n throw new Error(`Got v${version} data when expected v${VERSION}.`);\n }\n const ArrayType = ARRAY_TYPES[versionAndType & 0x0f];\n if (!ArrayType) {\n throw new Error('Unrecognized array type.');\n }\n const [nodeSize] = new Uint16Array(data, 2, 1);\n const [numItems] = new Uint32Array(data, 4, 1);\n\n return new KDBush(numItems, nodeSize, ArrayType, data);\n }\n\n /**\n * Creates an index that will hold a given number of items.\n * @param {number} numItems\n * @param {number} [nodeSize=64] Size of the KD-tree node (64 by default).\n * @param {TypedArrayConstructor} [ArrayType=Float64Array] The array type used for coordinates storage (`Float64Array` by default).\n * @param {ArrayBuffer} [data] (For internal use only)\n */\n constructor(numItems, nodeSize = 64, ArrayType = Float64Array, data) {\n if (isNaN(numItems) || numItems < 0) throw new Error(`Unpexpected numItems value: ${numItems}.`);\n\n this.numItems = +numItems;\n this.nodeSize = Math.min(Math.max(+nodeSize, 2), 65535);\n this.ArrayType = ArrayType;\n this.IndexArrayType = numItems < 65536 ? Uint16Array : Uint32Array;\n\n const arrayTypeIndex = ARRAY_TYPES.indexOf(this.ArrayType);\n const coordsByteSize = numItems * 2 * this.ArrayType.BYTES_PER_ELEMENT;\n const idsByteSize = numItems * this.IndexArrayType.BYTES_PER_ELEMENT;\n const padCoords = (8 - idsByteSize % 8) % 8;\n\n if (arrayTypeIndex < 0) {\n throw new Error(`Unexpected typed array class: ${ArrayType}.`);\n }\n\n if (data && (data instanceof ArrayBuffer)) { // reconstruct an index from a buffer\n this.data = data;\n this.ids = new this.IndexArrayType(this.data, HEADER_SIZE, numItems);\n this.coords = new this.ArrayType(this.data, HEADER_SIZE + idsByteSize + padCoords, numItems * 2);\n this._pos = numItems * 2;\n this._finished = true;\n } else { // initialize a new index\n this.data = new ArrayBuffer(HEADER_SIZE + coordsByteSize + idsByteSize + padCoords);\n this.ids = new this.IndexArrayType(this.data, HEADER_SIZE, numItems);\n this.coords = new this.ArrayType(this.data, HEADER_SIZE + idsByteSize + padCoords, numItems * 2);\n this._pos = 0;\n this._finished = false;\n\n // set header\n new Uint8Array(this.data, 0, 2).set([0xdb, (VERSION << 4) + arrayTypeIndex]);\n new Uint16Array(this.data, 2, 1)[0] = nodeSize;\n new Uint32Array(this.data, 4, 1)[0] = numItems;\n }\n }\n\n /**\n * Add a point to the index.\n * @param {number} x\n * @param {number} y\n * @returns {number} An incremental index associated with the added item (starting from `0`).\n */\n add(x, y) {\n const index = this._pos >> 1;\n this.ids[index] = index;\n this.coords[this._pos++] = x;\n this.coords[this._pos++] = y;\n return index;\n }\n\n /**\n * Perform indexing of the added points.\n */\n finish() {\n const numAdded = this._pos >> 1;\n if (numAdded !== this.numItems) {\n throw new Error(`Added ${numAdded} items when expected ${this.numItems}.`);\n }\n // kd-sort both arrays for efficient search\n sort(this.ids, this.coords, this.nodeSize, 0, this.numItems - 1, 0);\n\n this._finished = true;\n return this;\n }\n\n /**\n * Search the index for items within a given bounding box.\n * @param {number} minX\n * @param {number} minY\n * @param {number} maxX\n * @param {number} maxY\n * @returns {number[]} An array of indices correponding to the found items.\n */\n range(minX, minY, maxX, maxY) {\n if (!this._finished) throw new Error('Data not yet indexed - call index.finish().');\n\n const {ids, coords, nodeSize} = this;\n const stack = [0, ids.length - 1, 0];\n const result = [];\n\n // recursively search for items in range in the kd-sorted arrays\n while (stack.length) {\n const axis = stack.pop() || 0;\n const right = stack.pop() || 0;\n const left = stack.pop() || 0;\n\n // if we reached \"tree node\", search linearly\n if (right - left <= nodeSize) {\n for (let i = left; i <= right; i++) {\n const x = coords[2 * i];\n const y = coords[2 * i + 1];\n if (x >= minX && x <= maxX && y >= minY && y <= maxY) result.push(ids[i]);\n }\n continue;\n }\n\n // otherwise find the middle index\n const m = (left + right) >> 1;\n\n // include the middle item if it's in range\n const x = coords[2 * m];\n const y = coords[2 * m + 1];\n if (x >= minX && x <= maxX && y >= minY && y <= maxY) result.push(ids[m]);\n\n // queue search in halves that intersect the query\n if (axis === 0 ? minX <= x : minY <= y) {\n stack.push(left);\n stack.push(m - 1);\n stack.push(1 - axis);\n }\n if (axis === 0 ? maxX >= x : maxY >= y) {\n stack.push(m + 1);\n stack.push(right);\n stack.push(1 - axis);\n }\n }\n\n return result;\n }\n\n /**\n * Search the index for items within a given radius.\n * @param {number} qx\n * @param {number} qy\n * @param {number} r Query radius.\n * @returns {number[]} An array of indices correponding to the found items.\n */\n within(qx, qy, r) {\n if (!this._finished) throw new Error('Data not yet indexed - call index.finish().');\n\n const {ids, coords, nodeSize} = this;\n const stack = [0, ids.length - 1, 0];\n const result = [];\n const r2 = r * r;\n\n // recursively search for items within radius in the kd-sorted arrays\n while (stack.length) {\n const axis = stack.pop() || 0;\n const right = stack.pop() || 0;\n const left = stack.pop() || 0;\n\n // if we reached \"tree node\", search linearly\n if (right - left <= nodeSize) {\n for (let i = left; i <= right; i++) {\n if (sqDist(coords[2 * i], coords[2 * i + 1], qx, qy) <= r2) result.push(ids[i]);\n }\n continue;\n }\n\n // otherwise find the middle index\n const m = (left + right) >> 1;\n\n // include the middle item if it's in range\n const x = coords[2 * m];\n const y = coords[2 * m + 1];\n if (sqDist(x, y, qx, qy) <= r2) result.push(ids[m]);\n\n // queue search in halves that intersect the query\n if (axis === 0 ? qx - r <= x : qy - r <= y) {\n stack.push(left);\n stack.push(m - 1);\n stack.push(1 - axis);\n }\n if (axis === 0 ? qx + r >= x : qy + r >= y) {\n stack.push(m + 1);\n stack.push(right);\n stack.push(1 - axis);\n }\n }\n\n return result;\n }\n}\n\n/**\n * @param {Uint16Array | Uint32Array} ids\n * @param {InstanceType<TypedArrayConstructor>} coords\n * @param {number} nodeSize\n * @param {number} left\n * @param {number} right\n * @param {number} axis\n */\nfunction sort(ids, coords, nodeSize, left, right, axis) {\n if (right - left <= nodeSize) return;\n\n const m = (left + right) >> 1; // middle index\n\n // sort ids and coords around the middle index so that the halves lie\n // either left/right or top/bottom correspondingly (taking turns)\n select(ids, coords, m, left, right, axis);\n\n // recursively kd-sort first half and second half on the opposite axis\n sort(ids, coords, nodeSize, left, m - 1, 1 - axis);\n sort(ids, coords, nodeSize, m + 1, right, 1 - axis);\n}\n\n/**\n * Custom Floyd-Rivest selection algorithm: sort ids and coords so that\n * [left..k-1] items are smaller than k-th item (on either x or y axis)\n * @param {Uint16Array | Uint32Array} ids\n * @param {InstanceType<TypedArrayConstructor>} coords\n * @param {number} k\n * @param {number} left\n * @param {number} right\n * @param {number} axis\n */\nfunction select(ids, coords, k, left, right, axis) {\n\n while (right > left) {\n if (right - left > 600) {\n const n = right - left + 1;\n const m = k - left + 1;\n const z = Math.log(n);\n const s = 0.5 * Math.exp(2 * z / 3);\n const sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);\n const newLeft = Math.max(left, Math.floor(k - m * s / n + sd));\n const newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));\n select(ids, coords, k, newLeft, newRight, axis);\n }\n\n const t = coords[2 * k + axis];\n let i = left;\n let j = right;\n\n swapItem(ids, coords, left, k);\n if (coords[2 * right + axis] > t) swapItem(ids, coords, left, right);\n\n while (i < j) {\n swapItem(ids, coords, i, j);\n i++;\n j--;\n while (coords[2 * i + axis] < t) i++;\n while (coords[2 * j + axis] > t) j--;\n }\n\n if (coords[2 * left + axis] === t) swapItem(ids, coords, left, j);\n else {\n j++;\n swapItem(ids, coords, j, right);\n }\n\n if (j <= k) left = j + 1;\n if (k <= j) right = j - 1;\n }\n}\n\n/**\n * @param {Uint16Array | Uint32Array} ids\n * @param {InstanceType<TypedArrayConstructor>} coords\n * @param {number} i\n * @param {number} j\n */\nfunction swapItem(ids, coords, i, j) {\n swap(ids, i, j);\n swap(coords, 2 * i, 2 * j);\n swap(coords, 2 * i + 1, 2 * j + 1);\n}\n\n/**\n * @param {InstanceType<TypedArrayConstructor>} arr\n * @param {number} i\n * @param {number} j\n */\nfunction swap(arr, i, j) {\n const tmp = arr[i];\n arr[i] = arr[j];\n arr[j] = tmp;\n}\n\n/**\n * @param {number} ax\n * @param {number} ay\n * @param {number} bx\n * @param {number} by\n */\nfunction sqDist(ax, ay, bx, by) {\n const dx = ax - bx;\n const dy = ay - by;\n return dx * dx + dy * dy;\n}\n","\nimport KDBush from 'kdbush';\n\nconst defaultOptions = {\n minZoom: 0, // min zoom to generate clusters on\n maxZoom: 16, // max zoom level to cluster the points on\n minPoints: 2, // minimum points to form a cluster\n radius: 40, // cluster radius in pixels\n extent: 512, // tile extent (radius is calculated relative to it)\n nodeSize: 64, // size of the KD-tree leaf node, affects performance\n log: false, // whether to log timing info\n\n // whether to generate numeric ids for input features (in vector tiles)\n generateId: false,\n\n // a reduce function for calculating custom cluster properties\n reduce: null, // (accumulated, props) => { accumulated.sum += props.sum; }\n\n // properties to use for individual points when running the reducer\n map: props => props // props => ({sum: props.my_value})\n};\n\nconst fround = Math.fround || (tmp => ((x) => { tmp[0] = +x; return tmp[0]; }))(new Float32Array(1));\n\nconst OFFSET_ZOOM = 2;\nconst OFFSET_ID = 3;\nconst OFFSET_PARENT = 4;\nconst OFFSET_NUM = 5;\nconst OFFSET_PROP = 6;\n\nexport default class Supercluster {\n constructor(options) {\n this.options = Object.assign(Object.create(defaultOptions), options);\n this.trees = new Array(this.options.maxZoom + 1);\n this.stride = this.options.reduce ? 7 : 6;\n this.clusterProps = [];\n }\n\n load(points) {\n const {log, minZoom, maxZoom} = this.options;\n\n if (log) console.time('total time');\n\n const timerId = `prepare ${ points.length } points`;\n if (log) console.time(timerId);\n\n this.points = points;\n\n // generate a cluster object for each point and index input points into a KD-tree\n const data = [];\n\n for (let i = 0; i < points.length; i++) {\n const p = points[i];\n if (!p.geometry) continue;\n\n const [lng, lat] = p.geometry.coordinates;\n const x = fround(lngX(lng));\n const y = fround(latY(lat));\n // store internal point/cluster data in flat numeric arrays for performance\n data.push(\n x, y, // projected point coordinates\n Infinity, // the last zoom the point was processed at\n i, // index of the source feature in the original input array\n -1, // parent cluster id\n 1 // number of points in a cluster\n );\n if (this.options.reduce) data.push(0); // noop\n }\n let tree = this.trees[maxZoom + 1] = this._createTree(data);\n\n if (log) console.timeEnd(timerId);\n\n // cluster points on max zoom, then cluster the results on previous zoom, etc.;\n // results in a cluster hierarchy across zoom levels\n for (let z = maxZoom; z >= minZoom; z--) {\n const now = +Date.now();\n\n // create a new set of clusters for the zoom and index them with a KD-tree\n tree = this.trees[z] = this._createTree(this._cluster(tree, z));\n\n if (log) console.log('z%d: %d clusters in %dms', z, tree.numItems, +Date.now() - now);\n }\n\n if (log) console.timeEnd('total time');\n\n return this;\n }\n\n getClusters(bbox, zoom) {\n let minLng = ((bbox[0] + 180) % 360 + 360) % 360 - 180;\n const minLat = Math.max(-90, Math.min(90, bbox[1]));\n let maxLng = bbox[2] === 180 ? 180 : ((bbox[2] + 180) % 360 + 360) % 360 - 180;\n const maxLat = Math.max(-90, Math.min(90, bbox[3]));\n\n if (bbox[2] - bbox[0] >= 360) {\n minLng = -180;\n maxLng = 180;\n } else if (minLng > maxLng) {\n const easternHem = this.getClusters([minLng, minLat, 180, maxLat], zoom);\n const westernHem = this.getClusters([-180, minLat, maxLng, maxLat], zoom);\n return easternHem.concat(westernHem);\n }\n\n const tree = this.trees[this._limitZoom(zoom)];\n const ids = tree.range(lngX(minLng), latY(maxLat), lngX(maxLng), latY(minLat));\n const data = tree.data;\n const clusters = [];\n for (const id of ids) {\n const k = this.stride * id;\n clusters.push(data[k + OFFSET_NUM] > 1 ? getClusterJSON(data, k, this.clusterProps) : this.points[data[k + OFFSET_ID]]);\n }\n return clusters;\n }\n\n getChildren(clusterId) {\n const originId = this._getOriginId(clusterId);\n const originZoom = this._getOriginZoom(clusterId);\n const errorMsg = 'No cluster with the specified id.';\n\n const tree = this.trees[originZoom];\n if (!tree) throw new Error(errorMsg);\n\n const data = tree.data;\n if (originId * this.stride >= data.length) throw new Error(errorMsg);\n\n const r = this.options.radius / (this.options.extent * Math.pow(2, originZoom - 1));\n const x = data[originId * this.stride];\n const y = data[originId * this.stride + 1];\n const ids = tree.within(x, y, r);\n const children = [];\n for (const id of ids) {\n const k = id * this.stride;\n if (data[k + OFFSET_PARENT] === clusterId) {\n children.push(data[k + OFFSET_NUM] > 1 ? getClusterJSON(data, k, this.clusterProps) : this.points[data[k + OFFSET_ID]]);\n }\n }\n\n if (children.length === 0) throw new Error(errorMsg);\n\n return children;\n }\n\n getLeaves(clusterId, limit, offset) {\n limit = limit || 10;\n offset = offset || 0;\n\n const leaves = [];\n this._appendLeaves(leaves, clusterId, limit, offset, 0);\n\n return leaves;\n }\n\n getTile(z, x, y) {\n const tree = this.trees[this._limitZoom(z)];\n const z2 = Math.pow(2, z);\n const {extent, radius} = this.options;\n const p = radius / extent;\n const top = (y - p) / z2;\n const bottom = (y + 1 + p) / z2;\n\n const tile = {\n features: []\n };\n\n this._addTileFeatures(\n tree.range((x - p) / z2, top, (x + 1 + p) / z2, bottom),\n tree.data, x, y, z2, tile);\n\n if (x === 0) {\n this._addTileFeatures(\n tree.range(1 - p / z2, top, 1, bottom),\n tree.data, z2, y, z2, tile);\n }\n if (x === z2 - 1) {\n this._addTileFeatures(\n tree.range(0, top, p / z2, bottom),\n tree.data, -1, y, z2, tile);\n }\n\n return tile.features.length ? tile : null;\n }\n\n getClusterExpansionZoom(clusterId) {\n let expansionZoom = this._getOriginZoom(clusterId) - 1;\n while (expansionZoom <= this.options.maxZoom) {\n const children = this.getChildren(clusterId);\n expansionZoom++;\n if (children.length !== 1) break;\n clusterId = children[0].properties.cluster_id;\n }\n return expansionZoom;\n }\n\n _appendLeaves(result, clusterId, limit, offset, skipped) {\n const children = this.getChildren(clusterId);\n\n for (const child of children) {\n const props = child.properties;\n\n if (props && props.cluster) {\n if (skipped + props.point_count <= offset) {\n // skip the whole cluster\n skipped += props.point_count;\n } else {\n // enter the cluster\n skipped = this._appendLeaves(result, props.cluster_id, limit, offset, skipped);\n // exit the cluster\n }\n } else if (skipped < offset) {\n // skip a single point\n skipped++;\n } else {\n // add a single point\n result.push(child);\n }\n if (result.length === limit) break;\n }\n\n return skipped;\n }\n\n _createTree(data) {\n const tree = new KDBush(data.length / this.stride | 0, this.options.nodeSize, Float32Array);\n for (let i = 0; i < data.length; i += this.stride) tree.add(data[i], data[i + 1]);\n tree.finish();\n tree.data = data;\n return tree;\n }\n\n _addTileFeatures(ids, data, x, y, z2, tile) {\n for (const i of ids) {\n const k = i * this.stride;\n const isCluster = data[k + OFFSET_NUM] > 1;\n\n let tags, px, py;\n if (isCluster) {\n tags = getClusterProperties(data, k, this.clusterProps);\n px = data[k];\n py = data[k + 1];\n } else {\n const p = this.points[data[k + OFFSET_ID]];\n tags = p.properties;\n const [lng, lat] = p.geometry.coordinates;\n px = lngX(lng);\n py = latY(lat);\n }\n\n const f = {\n type: 1,\n geometry: [[\n Math.round(this.options.extent * (px * z2 - x)),\n Math.round(this.options.extent * (py * z2 - y))\n ]],\n tags\n };\n\n // assign id\n let id;\n if (isCluster || this.options.generateId) {\n // optionally generate id for points\n id = data[k + OFFSET_ID];\n } else {\n // keep id if already assigned\n id = this.points[data[k + OFFSET_ID]].id;\n }\n\n if (id !== undefined) f.id = id;\n\n tile.features.push(f);\n }\n }\n\n _limitZoom(z) {\n return Math.max(this.options.minZoom, Math.min(Math.floor(+z), this.options.maxZoom + 1));\n }\n\n _cluster(tree, zoom) {\n const {radius, extent, reduce, minPoints} = this.options;\n const r = radius / (extent * Math.pow(2, zoom));\n const data = tree.data;\n const nextData = [];\n const stride = this.stride;\n\n // loop through each point\n for (let i = 0; i < data.length; i += stride) {\n // if we've already visited the point at this zoom level, skip it\n if (data[i + OFFSET_ZOOM] <= zoom) continue;\n data[i + OFFSET_ZOOM] = zoom;\n\n // find all nearby points\n const x = data[i];\n const y = data[i + 1];\n const neighborIds = tree.within(data[i], data[i + 1], r);\n\n const numPointsOrigin = data[i + OFFSET_NUM];\n let numPoints = numPointsOrigin;\n\n // count the number of points in a potential cluster\n for (const neighborId of neighborIds) {\n const k = neighborId * stride;\n // filter out neighbors that are already processed\n if (data[k + OFFSET_ZOOM] > zoom) numPoints += data[k + OFFSET_NUM];\n }\n\n // if there were neighbors to merge, and there are enough points to form a cluster\n if (numPoints > numPointsOrigin && numPoints >= minPoints) {\n let wx = x * numPointsOrigin;\n let wy = y * numPointsOrigin;\n\n let clusterProperties;\n let clusterPropIndex = -1;\n\n // encode both zoom and point index on which the cluster originated -- offset by total length of features\n const id = ((i / stride | 0) << 5) + (zoom + 1) + this.points.length;\n\n for (const neighborId of neighborIds) {\n const k = neighborId * stride;\n\n if (data[k + OFFSET_ZOOM] <= zoom) continue;\n data[k + OFFSET_ZOOM] = zoom; // save the zoom (so it doesn't get processed twice)\n\n const numPoints2 = data[k + OFFSET_NUM];\n wx += data[k] * numPoints2; // accumulate coordinates for calculating weighted center\n wy += data[k + 1] * numPoints2;\n\n data[k + OFFSET_PARENT] = id;\n\n if (reduce) {\n if (!clusterProperties) {\n clusterProperties = this._map(data, i, true);\n clusterPropIndex = this.clusterProps.length;\n this.clusterProps.push(clusterProperties);\n }\n reduce(clusterProperties, this._map(data, k));\n }\n }\n\n data[i + OFFSET_PARENT] = id;\n nextData.push(wx / numPoints, wy / numPoints, Infinity, id, -1, numPoints);\n if (reduce) nextData.push(clusterPropIndex);\n\n } else { // left points as unclustered\n for (let j = 0; j < stride; j++) nextData.push(data[i + j]);\n\n if (numPoints > 1) {\n for (const neighborId of neighborIds) {\n const k = neighborId * stride;\n if (data[k + OFFSET_ZOOM] <= zoom) continue;\n data[k + OFFSET_ZOOM] = zoom;\n for (let j = 0; j < stride; j++) nextData.push(data[k + j]);\n }\n }\n }\n }\n\n return nextData;\n }\n\n // get index of the point from which the cluster originated\n _getOriginId(clusterId) {\n return (clusterId - this.points.length) >> 5;\n }\n\n // get zoom of the point from which the cluster originated\n _getOriginZoom(clusterId) {\n return (clusterId - this.points.length) % 32;\n }\n\n _map(data, i, clone) {\n if (data[i + OFFSET_NUM] > 1) {\n const props = this.clusterProps[data[i + OFFSET_PROP]];\n return clone ? Object.assign({}, props) : props;\n }\n const original = this.points[data[i + OFFSET_ID]].properties;\n const result = this.options.map(original);\n return clone && result === original ? Object.assign({}, result) : result;\n }\n}\n\nfunction getClusterJSON(data, i, clusterProps) {\n return {\n type: 'Feature',\n id: data[i + OFFSET_ID],\n properties: getClusterProperties(data, i, clusterProps),\n geometry: {\n type: 'Point',\n coordinates: [xLng(data[i]), yLat(data[i + 1])]\n }\n };\n}\n\nfunction getClusterProperties(data, i, clusterProps) {\n const count = data[i + OFFSET_NUM];\n const abbrev =\n count >= 10000 ? `${Math.round(count / 1000) }k` :\n count >= 1000 ? `${Math.round(count / 100) / 10 }k` : count;\n const propIndex = data[i + OFFSET_PROP];\n const properties = propIndex === -1 ? {} : Object.assign({}, clusterProps[propIndex]);\n return Object.assign(properties, {\n cluster: true,\n cluster_id: data[i + OFFSET_ID],\n point_count: count,\n point_count_abbreviated: abbrev\n });\n}\n\n// longitude/latitude to spherical mercator in [0..1] range\nfunction lngX(lng) {\n return lng / 360 + 0.5;\n}\nfunction latY(lat) {\n const sin = Math.sin(lat * Math.PI / 180);\n const y = (0.5 - 0.25 * Math.log((1 + sin) / (1 - sin)) / Math.PI);\n return y < 0 ? 0 : y > 1 ? 1 : y;\n}\n\n// spherical mercator to longitude/latitude\nfunction xLng(x) {\n return (x - 0.5) * 360;\n}\nfunction yLat(y) {\n const y2 = (180 - y * 360) * Math.PI / 180;\n return 360 * Math.atan(Math.exp(y2)) / Math.PI - 90;\n}\n","import Supercluster from \"supercluster\";\n\nimport type { AlgorithmContext, Cluster, ClusterAlgorithm, ItemRecord } from \"../types\";\n\ninterface SuperclusterAlgorithmOptions {\n readonly radius: number;\n readonly minZoom: number;\n readonly maxZoom: number;\n readonly extent: number;\n readonly nodeSize: number;\n}\n\nconst DEFAULT_OPTIONS: SuperclusterAlgorithmOptions = {\n radius: 60,\n minZoom: 0,\n maxZoom: 16,\n extent: 512,\n nodeSize: 64\n};\n\ninterface PointProperties<TData> {\n itemId: string | number;\n data: TData;\n markerOptions?: Readonly<Partial<naver.maps.MarkerOptions>>;\n}\n\nexport class SuperclusterAlgorithm<TData> implements ClusterAlgorithm<TData> {\n private options: SuperclusterAlgorithmOptions;\n private index: Supercluster<PointProperties<TData>, Supercluster.AnyProps>;\n private itemMap: Map<string | number, ItemRecord<TData>> = new Map();\n private dirty = true;\n\n constructor(options?: Partial<SuperclusterAlgorithmOptions>) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n this.index = new Supercluster({\n radius: this.options.radius,\n minZoom: this.options.minZoom,\n maxZoom: this.options.maxZoom,\n extent: this.options.extent,\n nodeSize: this.options.nodeSize\n });\n }\n\n cluster(\n items: readonly ItemRecord<TData>[],\n ctx: AlgorithmContext\n ): {\n readonly clusters: readonly Cluster<TData>[];\n readonly points: readonly ItemRecord<TData>[];\n } {\n if (this.dirty || this.itemMap.size !== items.length) {\n this.load(items);\n }\n\n const { south, west, north, east } = ctx.bounds;\n const rawClusters = this.index.getClusters([west, south, east, north], Math.floor(ctx.zoom));\n\n const clusters: Cluster<TData>[] = [];\n const singlePoints: ItemRecord<TData>[] = [];\n\n for (const feature of rawClusters) {\n const [lng, lat] = feature.geometry.coordinates;\n const props = feature.properties;\n\n if (\"cluster\" in props && props.cluster === true) {\n const clusterProps = props as Supercluster.ClusterProperties & Supercluster.AnyProps;\n const clusterId = feature.id;\n const leaves = this.getLeaves(clusterId);\n\n let minLat = Infinity;\n let maxLat = -Infinity;\n let minLng = Infinity;\n let maxLng = -Infinity;\n\n for (const leaf of leaves) {\n minLat = Math.min(minLat, leaf.position.lat);\n maxLat = Math.max(maxLat, leaf.position.lat);\n minLng = Math.min(minLng, leaf.position.lng);\n maxLng = Math.max(maxLng, leaf.position.lng);\n }\n\n clusters.push({\n id: `sc-${String(clusterId)}`,\n position: { lat, lng },\n count: clusterProps.point_count,\n bounds: { south: minLat, north: maxLat, west: minLng, east: maxLng },\n items: leaves\n });\n } else {\n const pointProps = props as PointProperties<TData>;\n const item = this.itemMap.get(pointProps.itemId);\n if (item) {\n singlePoints.push(item);\n }\n }\n }\n\n return { clusters, points: singlePoints };\n }\n\n setOptions(options: unknown): void {\n if (typeof options === \"object\" && options !== null) {\n const next = { ...this.options, ...(options as Partial<SuperclusterAlgorithmOptions>) };\n this.options = next;\n this.index = new Supercluster({\n radius: next.radius,\n minZoom: next.minZoom,\n maxZoom: next.maxZoom,\n extent: next.extent,\n nodeSize: next.nodeSize\n });\n this.dirty = true;\n }\n }\n\n destroy(): void {\n this.itemMap.clear();\n }\n\n private load(items: readonly ItemRecord<TData>[]): void {\n this.itemMap.clear();\n\n const features: Array<Supercluster.PointFeature<PointProperties<TData>>> = [];\n\n for (const item of items) {\n this.itemMap.set(item.id, item);\n features.push({\n type: \"Feature\",\n geometry: {\n type: \"Point\",\n coordinates: [item.position.lng, item.position.lat]\n },\n properties: {\n itemId: item.id,\n data: item.data,\n markerOptions: item.markerOptions\n }\n });\n }\n\n this.index.load(features);\n this.dirty = false;\n }\n\n private getLeaves(clusterId: number | string | undefined): ItemRecord<TData>[] {\n if (clusterId === undefined) return [];\n\n const numericId = typeof clusterId === \"string\" ? parseInt(clusterId, 10) : clusterId;\n if (typeof numericId !== \"number\" || isNaN(numericId)) return [];\n\n const leaves = this.index.getLeaves(numericId, Infinity);\n const result: ItemRecord<TData>[] = [];\n\n for (const leaf of leaves) {\n const props = leaf.properties as PointProperties<TData>;\n const item = this.itemMap.get(props.itemId);\n if (item) {\n result.push(item);\n }\n }\n\n return result;\n }\n}\n","import type { BuiltInAlgorithmConfig, ClusterAlgorithm } from \"../types\";\nimport { GridAlgorithm } from \"./grid\";\nimport { RadiusAlgorithm } from \"./radius\";\nimport { SuperclusterAlgorithm } from \"./supercluster\";\n\nexport function isBuiltInConfig(\n value: BuiltInAlgorithmConfig | ClusterAlgorithm<unknown>\n): value is BuiltInAlgorithmConfig {\n return \"type\" in value && typeof (value as BuiltInAlgorithmConfig).type === \"string\";\n}\n\nfunction omitUndefined<T extends Record<string, unknown>>(obj: T): Partial<T> {\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n if (obj[key] !== undefined) {\n result[key] = obj[key];\n }\n }\n return result as Partial<T>;\n}\n\nexport function createAlgorithm<TData>(\n config: BuiltInAlgorithmConfig\n): ClusterAlgorithm<TData> {\n switch (config.type) {\n case \"grid\":\n return new GridAlgorithm<TData>(omitUndefined({\n gridSize: config.gridSize,\n minClusterSize: config.minClusterSize,\n maxZoom: config.maxZoom\n }));\n case \"radius\":\n return new RadiusAlgorithm<TData>(omitUndefined({\n radius: config.radius,\n minClusterSize: config.minClusterSize,\n maxZoom: config.maxZoom\n }));\n case \"supercluster\":\n return new SuperclusterAlgorithm<TData>(omitUndefined({\n radius: config.radius,\n minZoom: config.minZoom,\n maxZoom: config.maxZoom,\n extent: config.extent,\n nodeSize: config.nodeSize\n }));\n }\n}\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState\n} from \"react\";\nimport { createRoot } from \"react-dom/client\";\n\nimport { useNaverMap } from \"../../react/hooks/useNaverMap\";\nimport { ClustererContext } from \"./ClustererContext\";\nimport { createAlgorithm, isBuiltInConfig } from \"./algorithms/createAlgorithm\";\n\nimport type { Root } from \"react-dom/client\";\nimport type { ClustererRegistry } from \"./ClustererContext\";\nimport type {\n Cluster,\n ClusterAlgorithm,\n ItemRecord,\n LatLngBoundsLiteral,\n MarkerClustererHelpers,\n MarkerClustererProps\n} from \"./types\";\n\n// ─── Default cluster icon (simple circle with count) ─────────────\n\nfunction DefaultClusterIcon({ count }: { count: number }) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 40,\n height: 40,\n borderRadius: \"50%\",\n backgroundColor: \"rgba(0, 100, 255, 0.7)\",\n color: \"#fff\",\n fontWeight: \"bold\",\n fontSize: 14,\n border: \"2px solid rgba(0, 100, 255, 0.9)\"\n }}\n >\n {count}\n </div>\n );\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────\n\nfunction getMapBounds(map: naver.maps.Map): LatLngBoundsLiteral {\n const bounds = map.getBounds();\n\n if (bounds instanceof naver.maps.LatLngBounds) {\n const sw = bounds.getSW();\n const ne = bounds.getNE();\n return {\n south: sw.lat(),\n west: sw.lng(),\n north: ne.lat(),\n east: ne.lng()\n };\n }\n\n // bounds may be a PointBoundsLiteral — extract manually\n const b = bounds as unknown as Record<string, unknown>;\n if (\"south\" in b && \"north\" in b && \"west\" in b && \"east\" in b) {\n return {\n south: b.south as number,\n north: b.north as number,\n west: b.west as number,\n east: b.east as number\n };\n }\n\n // Fallback: return a large bounds\n return { south: -90, north: 90, west: -180, east: 180 };\n}\n\nfunction padBounds(\n bounds: LatLngBoundsLiteral,\n padding: number\n): LatLngBoundsLiteral {\n const latPad = (bounds.north - bounds.south) * padding * 0.01;\n const lngPad = (bounds.east - bounds.west) * padding * 0.01;\n return {\n south: bounds.south - latPad,\n north: bounds.north + latPad,\n west: bounds.west - lngPad,\n east: bounds.east + lngPad\n };\n}\n\n// ─── Component ────────────────────────────────────────────────────\n\n/**\n * 다수의 `<Marker>`를 자동으로 클러스터링해주는 컴포넌트.\n *\n * ## 동작 방식\n *\n * 1. `<Marker>`는 `<MarkerClusterer>` 내부에서 직접 마커를 생성하지 않고\n * 내부 registry에 위치·데이터를 등록합니다.\n * 2. `MarkerClusterer`는 지도 이벤트(`idle`, `move`, `zoom`) 발생 시\n * 현재 줌·뷰포트 기준으로 클러스터를 재계산합니다.\n * 3. 클러스터 마커는 `createRoot`를 이용해 React 컴포넌트를 HTML 아이콘으로 렌더링합니다.\n *\n * ## 기본 사용법\n *\n * ```tsx\n * <NaverMap ...>\n * <MarkerClusterer\n * algorithm={{ type: \"supercluster\", radius: 60 }}\n * clusterIcon={({ count }) => <ClusterBadge count={count} />}\n * onClusterClick={({ cluster, helpers }) =>\n * helpers.zoomToCluster(cluster, { maxZoom: 16 })\n * }\n * >\n * {points.map(p => (\n * <Marker\n * key={p.id}\n * clustererItemId={p.id}\n * position={p.position}\n * item={p}\n * />\n * ))}\n * </MarkerClusterer>\n * </NaverMap>\n * ```\n *\n * ## 주의 사항\n *\n * - `<Marker>`에 반드시 `clustererItemId` prop을 지정해야 합니다.\n * - `<MarkerClusterer>`는 반드시 `<NaverMap>` 내부에 위치해야 합니다.\n * - `enabled={false}`로 설정하면 클러스터링이 해제되고 각 `<Marker>`가 개별 마커로 렌더링됩니다.\n *\n * @typeParam TData - children `<Marker>`의 `item` prop 타입\n */\nexport function MarkerClusterer<TData = unknown>(\n props: MarkerClustererProps<TData>\n) {\n const {\n algorithm: algorithmProp,\n clusterIcon,\n onClusterClick,\n behavior,\n clusterData,\n enabled = true,\n children\n } = props;\n\n const { map, sdkStatus } = useNaverMap();\n\n // ── Registry ──────────────────────────────────────────────────\n\n const registryRef = useRef(new Map<string | number, ItemRecord<TData>>());\n const [registryVersion, setRegistryVersion] = useState(0);\n\n const registry: ClustererRegistry<TData> = useMemo(\n () => ({\n enabled,\n register(item: ItemRecord<TData>) {\n registryRef.current.set(item.id, item);\n setRegistryVersion((v) => v + 1);\n },\n unregister(id: string | number) {\n registryRef.current.delete(id);\n setRegistryVersion((v) => v + 1);\n }\n }),\n [enabled]\n );\n\n // ── Algorithm ─────────────────────────────────────────────────\n\n const algorithmRef = useRef<ClusterAlgorithm<TData> | null>(null);\n\n const algorithm = useMemo<ClusterAlgorithm<TData>>(() => {\n if (algorithmProp && !isBuiltInConfig(algorithmProp)) {\n return algorithmProp as ClusterAlgorithm<TData>;\n }\n const config = algorithmProp ?? { type: \"supercluster\" as const, radius: 60 };\n if (!isBuiltInConfig(config)) {\n return config as ClusterAlgorithm<TData>;\n }\n return createAlgorithm<TData>(config);\n }, [algorithmProp]);\n\n useEffect(() => {\n const prev = algorithmRef.current;\n algorithmRef.current = algorithm;\n return () => {\n if (prev && prev !== algorithm) {\n prev.destroy?.();\n }\n };\n }, [algorithm]);\n\n // ── Marker storage ────────────────────────────────────────────\n\n const pointMarkersRef = useRef(new Map<string | number, naver.maps.Marker>());\n const clusterMarkersRef = useRef(new Map<string, naver.maps.Marker>());\n const clusterIconRootsRef = useRef(new Map<string, Root>());\n const clusterIconContainersRef = useRef(new Map<string, HTMLDivElement>());\n\n // ── Helpers ───────────────────────────────────────────────────\n\n const helpersRef = useRef<MarkerClustererHelpers<TData>>({\n zoomToCluster: () => {},\n fitBounds: () => {}\n });\n\n useEffect(() => {\n if (!map) return;\n\n helpersRef.current = {\n zoomToCluster(\n cluster: Cluster<TData>,\n options?: { readonly padding?: number; readonly maxZoom?: number }\n ) {\n if (cluster.bounds) {\n const bounds = options?.padding\n ? padBounds(cluster.bounds, options.padding)\n : cluster.bounds;\n\n const latLngBounds = new naver.maps.LatLngBounds(\n new naver.maps.LatLng(bounds.south, bounds.west),\n new naver.maps.LatLng(bounds.north, bounds.east)\n );\n\n map.fitBounds(latLngBounds);\n\n if (options?.maxZoom !== undefined) {\n const currentZoom = map.getZoom();\n if (currentZoom > options.maxZoom) {\n map.setZoom(options.maxZoom);\n }\n }\n } else {\n const nextZoom = Math.min(\n map.getZoom() + 1,\n options?.maxZoom ?? 21\n );\n map.setCenter(new naver.maps.LatLng(cluster.position.lat, cluster.position.lng));\n map.setZoom(nextZoom);\n }\n },\n\n fitBounds(\n bounds: LatLngBoundsLiteral,\n options?: { readonly padding?: number }\n ) {\n const paddedBounds = options?.padding\n ? padBounds(bounds, options.padding)\n : bounds;\n\n const latLngBounds = new naver.maps.LatLngBounds(\n new naver.maps.LatLng(paddedBounds.south, paddedBounds.west),\n new naver.maps.LatLng(paddedBounds.north, paddedBounds.east)\n );\n\n map.fitBounds(latLngBounds);\n }\n };\n }, [map]);\n\n // ── onClusterClick ref ────────────────────────────────────────\n\n const onClusterClickRef = useRef(onClusterClick);\n useEffect(() => {\n onClusterClickRef.current = onClusterClick;\n }, [onClusterClick]);\n\n // ── clusterIcon ref ───────────────────────────────────────────\n\n const clusterIconRef = useRef(clusterIcon);\n useEffect(() => {\n clusterIconRef.current = clusterIcon;\n }, [clusterIcon]);\n\n // ── Recompute ─────────────────────────────────────────────────\n\n const recompute = useCallback(() => {\n if (!map || sdkStatus !== \"ready\" || !enabled) return;\n\n const zoom = map.getZoom();\n const bounds = getMapBounds(map);\n const items = Array.from(registryRef.current.values());\n\n const { clusters, points } = algorithm.cluster(items, { zoom, bounds });\n\n // Optionally trim items from cluster data\n const maxItems = clusterData?.maxItemsInCluster;\n const includeItems = clusterData?.includeItems ?? true;\n\n const processedClusters: readonly Cluster<TData>[] = clusters.map((c) => ({\n ...c,\n items: includeItems\n ? maxItems !== undefined\n ? c.items?.slice(0, maxItems)\n : c.items\n : undefined\n }));\n\n // ── Diff: single points ───────────────────────────────────\n\n const nextPointIds = new Set(points.map((p) => p.id));\n const prevPointMarkers = pointMarkersRef.current;\n\n // Remove old\n for (const [id, marker] of prevPointMarkers) {\n if (!nextPointIds.has(id)) {\n marker.setMap(null);\n prevPointMarkers.delete(id);\n }\n }\n\n // Add/update\n for (const point of points) {\n const existing = prevPointMarkers.get(point.id);\n if (existing) {\n const pos = new naver.maps.LatLng(point.position.lat, point.position.lng);\n existing.setPosition(pos);\n if (point.markerOptions) {\n existing.setOptions({ ...point.markerOptions } as naver.maps.MarkerOptions);\n }\n } else {\n const opts: naver.maps.MarkerOptions = {\n position: new naver.maps.LatLng(point.position.lat, point.position.lng),\n map\n };\n if (point.markerOptions) {\n Object.assign(opts, point.markerOptions);\n }\n const marker = new naver.maps.Marker(opts);\n prevPointMarkers.set(point.id, marker);\n }\n }\n\n // ── Diff: clusters ────────────────────────────────────────\n\n const nextClusterIds = new Set(processedClusters.map((c) => c.id));\n const prevClusterMarkers = clusterMarkersRef.current;\n const prevRoots = clusterIconRootsRef.current;\n const prevContainers = clusterIconContainersRef.current;\n\n // Remove old clusters\n for (const [id, marker] of prevClusterMarkers) {\n if (!nextClusterIds.has(id)) {\n marker.setMap(null);\n prevClusterMarkers.delete(id);\n\n const root = prevRoots.get(id);\n if (root) {\n root.unmount();\n prevRoots.delete(id);\n }\n prevContainers.delete(id);\n }\n }\n\n // Add/update clusters\n for (const cluster of processedClusters) {\n const existingMarker = prevClusterMarkers.get(cluster.id);\n const renderer = clusterIconRef.current;\n\n const iconNode = renderer\n ? renderer({ cluster, count: cluster.count })\n : DefaultClusterIcon({ count: cluster.count });\n\n if (existingMarker) {\n // Update position\n existingMarker.setPosition(\n new naver.maps.LatLng(cluster.position.lat, cluster.position.lng)\n );\n\n // Re-render icon\n const root = prevRoots.get(cluster.id);\n if (root) {\n root.render(iconNode);\n }\n } else {\n // Create container + root\n const container = document.createElement(\"div\");\n container.style.cursor = \"pointer\";\n const root = createRoot(container);\n root.render(iconNode);\n\n prevContainers.set(cluster.id, container);\n prevRoots.set(cluster.id, root);\n\n // Create marker\n const marker = new naver.maps.Marker({\n position: new naver.maps.LatLng(cluster.position.lat, cluster.position.lng),\n map,\n icon: { content: container },\n clickable: true\n });\n\n // Bind click\n naver.maps.Event.addListener(marker, \"click\", () => {\n onClusterClickRef.current?.({\n cluster,\n helpers: helpersRef.current\n });\n });\n\n prevClusterMarkers.set(cluster.id, marker);\n }\n }\n }, [map, sdkStatus, enabled, algorithm, clusterData?.includeItems, clusterData?.maxItemsInCluster]);\n\n // ── Trigger recompute on registry change ──────────────────────\n\n useEffect(() => {\n recompute();\n }, [recompute, registryVersion]);\n\n // ── Map event listeners for recompute ─────────────────────────\n\n useEffect(() => {\n if (!map || sdkStatus !== \"ready\" || !enabled) return;\n\n const recomputeOn = behavior?.recomputeOn ?? \"idle\";\n const debounceMs = behavior?.debounceMs ?? 200;\n\n let timerId: ReturnType<typeof setTimeout> | null = null;\n const listeners: naver.maps.MapEventListener[] = [];\n\n const debouncedRecompute = () => {\n if (timerId !== null) {\n clearTimeout(timerId);\n }\n timerId = setTimeout(() => {\n recompute();\n timerId = null;\n }, debounceMs);\n };\n\n if (recomputeOn === \"idle\") {\n listeners.push(\n naver.maps.Event.addListener(map, \"idle\", debouncedRecompute)\n );\n } else if (recomputeOn === \"move\") {\n listeners.push(\n naver.maps.Event.addListener(map, \"bounds_changed\", debouncedRecompute)\n );\n } else if (recomputeOn === \"zoom\") {\n listeners.push(\n naver.maps.Event.addListener(map, \"zoom_changed\", debouncedRecompute)\n );\n }\n\n // Initial compute\n recompute();\n\n return () => {\n if (timerId !== null) {\n clearTimeout(timerId);\n }\n if (listeners.length > 0) {\n naver.maps.Event.removeListener(listeners);\n }\n };\n }, [map, sdkStatus, enabled, behavior?.recomputeOn, behavior?.debounceMs, recompute]);\n\n // ── Cleanup on unmount ────────────────────────────────────────\n\n useEffect(() => {\n return () => {\n // Clean up point markers\n for (const marker of pointMarkersRef.current.values()) {\n marker.setMap(null);\n }\n pointMarkersRef.current.clear();\n\n // Clean up cluster markers + roots\n for (const marker of clusterMarkersRef.current.values()) {\n marker.setMap(null);\n }\n clusterMarkersRef.current.clear();\n\n for (const root of clusterIconRootsRef.current.values()) {\n root.unmount();\n }\n clusterIconRootsRef.current.clear();\n clusterIconContainersRef.current.clear();\n };\n }, []);\n\n // ── Disable: clear everything when enabled becomes false ──────\n\n useEffect(() => {\n if (enabled) return;\n\n for (const marker of pointMarkersRef.current.values()) {\n marker.setMap(null);\n }\n pointMarkersRef.current.clear();\n\n for (const marker of clusterMarkersRef.current.values()) {\n marker.setMap(null);\n }\n clusterMarkersRef.current.clear();\n\n for (const root of clusterIconRootsRef.current.values()) {\n root.unmount();\n }\n clusterIconRootsRef.current.clear();\n clusterIconContainersRef.current.clear();\n }, [enabled]);\n\n // ── Render ────────────────────────────────────────────────────\n\n return (\n <ClustererContext.Provider value={registry as ClustererRegistry}>\n {children}\n </ClustererContext.Provider>\n );\n}\n\nMarkerClusterer.displayName = \"MarkerClusterer\";\n","import { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { useNaverMap } from \"../../react/hooks/useNaverMap\";\n\nimport type { ReactNode, ReactPortal } from \"react\";\n\ntype InfoWindowOptions = naver.maps.InfoWindowOptions;\ntype InfoWindowAnchor = naver.maps.Coord | naver.maps.CoordLiteral | naver.maps.Marker;\n\ninterface InfoWindowOptionProps {\n position?: InfoWindowOptions[\"position\"];\n content?: InfoWindowOptions[\"content\"];\n zIndex?: InfoWindowOptions[\"zIndex\"];\n maxWidth?: InfoWindowOptions[\"maxWidth\"];\n pixelOffset?: InfoWindowOptions[\"pixelOffset\"];\n backgroundColor?: InfoWindowOptions[\"backgroundColor\"];\n borderColor?: InfoWindowOptions[\"borderColor\"];\n borderWidth?: InfoWindowOptions[\"borderWidth\"];\n disableAutoPan?: InfoWindowOptions[\"disableAutoPan\"];\n disableAnchor?: InfoWindowOptions[\"disableAnchor\"];\n anchorSkew?: InfoWindowOptions[\"anchorSkew\"];\n anchorSize?: InfoWindowOptions[\"anchorSize\"];\n anchorColor?: InfoWindowOptions[\"anchorColor\"];\n autoPanPadding?: naver.maps.Point | naver.maps.PointLiteral;\n}\n\ninterface InfoWindowLifecycleProps {\n anchor?: InfoWindowAnchor;\n visible?: boolean;\n children?: ReactNode;\n onInfoWindowReady?: (infoWindow: naver.maps.InfoWindow) => void;\n onInfoWindowDestroy?: () => void;\n onInfoWindowError?: (error: Error) => void;\n}\n\ninterface InfoWindowEventProps {\n onOpen?: (pointerEvent: naver.maps.PointerEvent) => void;\n onClose?: (pointerEvent: naver.maps.PointerEvent) => void;\n onAnchorColorChanged?: (anchorColor: string) => void;\n onAnchorSizeChanged?: (anchorSize: naver.maps.Size) => void;\n onAnchorSkewChanged?: (anchorSkew: boolean) => void;\n onBackgroundColorChanged?: (backgroundColor: string) => void;\n onBorderColorChanged?: (borderColor: string) => void;\n onBorderWidthChanged?: (borderWidth: number) => void;\n onContentChanged?: (content: string | HTMLElement) => void;\n onDisableAnchorChanged?: (disableAnchor: boolean) => void;\n onDisableAutoPanChanged?: (disableAutoPan: boolean) => void;\n onMaxWidthChanged?: (maxWidth: number) => void;\n onPixelOffsetChanged?: (pixelOffset: naver.maps.Point) => void;\n onPositionChanged?: (position: naver.maps.Coord) => void;\n onZIndexChanged?: (zIndex: number) => void;\n}\n\nexport type InfoWindowProps = InfoWindowOptionProps &\n InfoWindowLifecycleProps &\n InfoWindowEventProps;\n\ntype InfoWindowMethod<K extends keyof naver.maps.InfoWindow> = naver.maps.InfoWindow[K] extends (\n ...args: infer A\n) => infer R\n ? (...args: A) => R | undefined\n : never;\n\nexport interface InfoWindowRef {\n getInstance: () => naver.maps.InfoWindow | null;\n close: InfoWindowMethod<\"close\">;\n getContent: InfoWindowMethod<\"getContent\">;\n getContentElement: InfoWindowMethod<\"getContentElement\">;\n getMap: InfoWindowMethod<\"getMap\">;\n getOptions: InfoWindowMethod<\"getOptions\">;\n getPanes: InfoWindowMethod<\"getPanes\">;\n getPosition: InfoWindowMethod<\"getPosition\">;\n getProjection: InfoWindowMethod<\"getProjection\">;\n getZIndex: InfoWindowMethod<\"getZIndex\">;\n open: InfoWindowMethod<\"open\">;\n setContent: InfoWindowMethod<\"setContent\">;\n setMap: InfoWindowMethod<\"setMap\">;\n setOptions: InfoWindowMethod<\"setOptions\">;\n setPosition: InfoWindowMethod<\"setPosition\">;\n setZIndex: InfoWindowMethod<\"setZIndex\">;\n}\n\ninterface InfoWindowEventBinding {\n eventName: string;\n invoke?: (event: unknown) => void;\n}\n\nfunction toInfoWindowOptions(props: InfoWindowProps): Omit<InfoWindowOptions, \"content\"> {\n const {\n anchorColor,\n anchorSize,\n anchorSkew,\n backgroundColor,\n borderColor,\n borderWidth,\n disableAnchor,\n disableAutoPan,\n maxWidth,\n pixelOffset,\n position,\n zIndex\n } = props;\n\n const options: Omit<InfoWindowOptions, \"content\"> = {};\n\n if (anchorColor !== undefined) {\n options.anchorColor = anchorColor;\n }\n\n if (anchorSize !== undefined) {\n options.anchorSize = anchorSize;\n }\n\n if (anchorSkew !== undefined) {\n options.anchorSkew = anchorSkew;\n }\n\n if (backgroundColor !== undefined) {\n options.backgroundColor = backgroundColor;\n }\n\n if (borderColor !== undefined) {\n options.borderColor = borderColor;\n }\n\n if (borderWidth !== undefined) {\n options.borderWidth = borderWidth;\n }\n\n if (disableAnchor !== undefined) {\n options.disableAnchor = disableAnchor;\n }\n\n if (disableAutoPan !== undefined) {\n options.disableAutoPan = disableAutoPan;\n }\n\n if (maxWidth !== undefined) {\n options.maxWidth = maxWidth;\n }\n\n if (pixelOffset !== undefined) {\n options.pixelOffset = pixelOffset;\n }\n\n if (position !== undefined) {\n options.position = position;\n }\n\n if (zIndex !== undefined) {\n options.zIndex = zIndex;\n }\n\n return options;\n}\n\nfunction resolveInfoWindowContent(\n content: InfoWindowOptions[\"content\"] | undefined,\n childrenContainer: HTMLElement | null,\n hasChildren: boolean\n): string | HTMLElement {\n if (hasChildren && childrenContainer) {\n return childrenContainer;\n }\n\n if (content !== undefined) {\n return content;\n }\n\n return \"\";\n}\n\nfunction buildInfoWindowEventBindings(props: InfoWindowProps): InfoWindowEventBinding[] {\n return [\n {\n eventName: \"open\",\n invoke: props.onOpen ? (event) => props.onOpen?.(event as naver.maps.PointerEvent) : undefined\n },\n {\n eventName: \"close\",\n invoke: props.onClose\n ? (event) => props.onClose?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"anchorColor_changed\",\n invoke: props.onAnchorColorChanged\n ? (event) => props.onAnchorColorChanged?.(event as string)\n : undefined\n },\n {\n eventName: \"anchorSize_changed\",\n invoke: props.onAnchorSizeChanged\n ? (event) => props.onAnchorSizeChanged?.(event as naver.maps.Size)\n : undefined\n },\n {\n eventName: \"anchorSkew_changed\",\n invoke: props.onAnchorSkewChanged\n ? (event) => props.onAnchorSkewChanged?.(event as boolean)\n : undefined\n },\n {\n eventName: \"backgroundColor_changed\",\n invoke: props.onBackgroundColorChanged\n ? (event) => props.onBackgroundColorChanged?.(event as string)\n : undefined\n },\n {\n eventName: \"borderColor_changed\",\n invoke: props.onBorderColorChanged\n ? (event) => props.onBorderColorChanged?.(event as string)\n : undefined\n },\n {\n eventName: \"borderWidth_changed\",\n invoke: props.onBorderWidthChanged\n ? (event) => props.onBorderWidthChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"content_changed\",\n invoke: props.onContentChanged\n ? (event) => props.onContentChanged?.(event as string | HTMLElement)\n : undefined\n },\n {\n eventName: \"disableAnchor_changed\",\n invoke: props.onDisableAnchorChanged\n ? (event) => props.onDisableAnchorChanged?.(event as boolean)\n : undefined\n },\n {\n eventName: \"disableAutoPan_changed\",\n invoke: props.onDisableAutoPanChanged\n ? (event) => props.onDisableAutoPanChanged?.(event as boolean)\n : undefined\n },\n {\n eventName: \"maxWidth_changed\",\n invoke: props.onMaxWidthChanged\n ? (event) => props.onMaxWidthChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"pixelOffset_changed\",\n invoke: props.onPixelOffsetChanged\n ? (event) => props.onPixelOffsetChanged?.(event as naver.maps.Point)\n : undefined\n },\n {\n eventName: \"position_changed\",\n invoke: props.onPositionChanged\n ? (event) => props.onPositionChanged?.(event as naver.maps.Coord)\n : undefined\n },\n {\n eventName: \"zIndex_changed\",\n invoke: props.onZIndexChanged\n ? (event) => props.onZIndexChanged?.(event as number)\n : undefined\n }\n ];\n}\n\nfunction bindInfoWindowEventListeners(\n infoWindow: naver.maps.InfoWindow,\n listenersRef: { current: naver.maps.MapEventListener[] },\n bindings: InfoWindowEventBinding[]\n): void {\n if (listenersRef.current.length > 0) {\n naver.maps.Event.removeListener(listenersRef.current);\n listenersRef.current = [];\n }\n\n listenersRef.current = bindings\n .filter((binding) => typeof binding.invoke === \"function\")\n .map((binding) =>\n naver.maps.Event.addListener(infoWindow, binding.eventName, (event: unknown) => {\n binding.invoke?.(event);\n })\n );\n}\n\nfunction setInfoWindowOptionByKey(\n infoWindow: naver.maps.InfoWindow,\n key: string,\n value: unknown\n): void {\n const optionSettable = infoWindow as naver.maps.InfoWindow & {\n setOptions: (key: string, value: unknown) => void;\n };\n\n optionSettable.setOptions(key, value);\n}\n\nexport const InfoWindow = forwardRef<InfoWindowRef, InfoWindowProps>(\n function InfoWindowInner(props, ref): ReactPortal | null {\n const { map, sdkStatus } = useNaverMap();\n const infoWindowRef = useRef<naver.maps.InfoWindow | null>(null);\n const infoWindowEventListenersRef = useRef<naver.maps.MapEventListener[]>([]);\n const onInfoWindowDestroyRef = useRef<InfoWindowProps[\"onInfoWindowDestroy\"]>(\n props.onInfoWindowDestroy\n );\n const childrenContainer = useMemo<HTMLElement | null>(() => {\n if (typeof document === \"undefined\") {\n return null;\n }\n\n return document.createElement(\"div\");\n }, []);\n const visible = props.visible ?? true;\n const hasChildren = props.children !== undefined && props.children !== null;\n const optionSnapshot = useMemo(() => toInfoWindowOptions(props), [props]);\n\n useEffect(() => {\n onInfoWindowDestroyRef.current = props.onInfoWindowDestroy;\n }, [props.onInfoWindowDestroy]);\n\n const invokeInfoWindowMethod = useCallback(\n <K extends keyof naver.maps.InfoWindow>(\n methodName: K,\n ...args: Parameters<Extract<naver.maps.InfoWindow[K], (...params: never[]) => unknown>>\n ):\n | ReturnType<Extract<naver.maps.InfoWindow[K], (...params: never[]) => unknown>>\n | undefined => {\n const infoWindow = infoWindowRef.current;\n\n if (!infoWindow) {\n return undefined;\n }\n\n const method = infoWindow[methodName] as unknown;\n\n if (typeof method !== \"function\") {\n return undefined;\n }\n\n return (method as (...params: unknown[]) => unknown).apply(infoWindow, args) as ReturnType<\n Extract<naver.maps.InfoWindow[K], (...params: never[]) => unknown>\n >;\n },\n []\n );\n\n const teardownInfoWindow = useCallback(() => {\n const infoWindow = infoWindowRef.current;\n\n if (!infoWindow) {\n return;\n }\n\n try {\n if (infoWindowEventListenersRef.current.length > 0) {\n naver.maps.Event.removeListener(infoWindowEventListenersRef.current);\n infoWindowEventListenersRef.current = [];\n }\n\n naver.maps.Event.clearInstanceListeners(infoWindow);\n } catch (error) {\n console.error(\"[react-naver-maps-kit] failed to clear infoWindow listeners\", error);\n }\n\n infoWindow.close();\n infoWindow.setMap(null);\n infoWindowRef.current = null;\n onInfoWindowDestroyRef.current?.();\n }, []);\n\n useImperativeHandle(\n ref,\n (): InfoWindowRef => ({\n getInstance: () => infoWindowRef.current,\n close: (...args) => invokeInfoWindowMethod(\"close\", ...args),\n getContent: (...args) => invokeInfoWindowMethod(\"getContent\", ...args),\n getContentElement: (...args) => invokeInfoWindowMethod(\"getContentElement\", ...args),\n getMap: (...args) => invokeInfoWindowMethod(\"getMap\", ...args),\n getOptions: (...args) => invokeInfoWindowMethod(\"getOptions\", ...args),\n getPanes: (...args) => invokeInfoWindowMethod(\"getPanes\", ...args),\n getPosition: (...args) => invokeInfoWindowMethod(\"getPosition\", ...args),\n getProjection: (...args) => invokeInfoWindowMethod(\"getProjection\", ...args),\n getZIndex: (...args) => invokeInfoWindowMethod(\"getZIndex\", ...args),\n open: (...args) => invokeInfoWindowMethod(\"open\", ...args),\n setContent: (...args) => invokeInfoWindowMethod(\"setContent\", ...args),\n setMap: (...args) => invokeInfoWindowMethod(\"setMap\", ...args),\n setOptions: (...args) => invokeInfoWindowMethod(\"setOptions\", ...args),\n setPosition: (...args) => invokeInfoWindowMethod(\"setPosition\", ...args),\n setZIndex: (...args) => invokeInfoWindowMethod(\"setZIndex\", ...args)\n }),\n [invokeInfoWindowMethod]\n );\n\n useEffect(() => {\n if (sdkStatus !== \"ready\" || !map || infoWindowRef.current) {\n return;\n }\n\n try {\n const infoWindow = new naver.maps.InfoWindow({\n ...optionSnapshot,\n content: resolveInfoWindowContent(props.content, childrenContainer, hasChildren)\n });\n\n if (props.autoPanPadding !== undefined) {\n setInfoWindowOptionByKey(infoWindow, \"autoPanPadding\", props.autoPanPadding);\n }\n\n infoWindowRef.current = infoWindow;\n bindInfoWindowEventListeners(\n infoWindow,\n infoWindowEventListenersRef,\n buildInfoWindowEventBindings(props)\n );\n props.onInfoWindowReady?.(infoWindow);\n } catch (error) {\n const normalizedError =\n error instanceof Error\n ? error\n : new Error(\"Failed to create naver.maps.InfoWindow instance.\");\n\n props.onInfoWindowError?.(normalizedError);\n }\n }, [childrenContainer, hasChildren, map, optionSnapshot, props, sdkStatus]);\n\n useEffect(() => {\n const infoWindow = infoWindowRef.current;\n\n if (!infoWindow) {\n return;\n }\n\n const resolvedContent = resolveInfoWindowContent(\n props.content,\n childrenContainer,\n hasChildren\n );\n\n infoWindow.setOptions({\n ...optionSnapshot,\n content: resolvedContent\n });\n infoWindow.setContent(resolvedContent);\n\n if (props.autoPanPadding !== undefined) {\n setInfoWindowOptionByKey(infoWindow, \"autoPanPadding\", props.autoPanPadding);\n }\n\n if (props.position) {\n infoWindow.setPosition(props.position);\n }\n\n if (!map || !visible) {\n infoWindow.close();\n return;\n }\n\n if (props.anchor) {\n infoWindow.open(map, props.anchor);\n return;\n }\n\n if (props.position) {\n infoWindow.open(map, props.position);\n return;\n }\n\n infoWindow.open(map);\n }, [\n childrenContainer,\n hasChildren,\n map,\n optionSnapshot,\n props.anchor,\n props.content,\n props.position,\n props.autoPanPadding,\n visible\n ]);\n\n useEffect(() => {\n const infoWindow = infoWindowRef.current;\n\n if (!infoWindow) {\n return;\n }\n\n bindInfoWindowEventListeners(\n infoWindow,\n infoWindowEventListenersRef,\n buildInfoWindowEventBindings(props)\n );\n\n return () => {\n if (infoWindowEventListenersRef.current.length > 0) {\n naver.maps.Event.removeListener(infoWindowEventListenersRef.current);\n infoWindowEventListenersRef.current = [];\n }\n };\n }, [props]);\n\n useEffect(() => {\n return () => {\n teardownInfoWindow();\n };\n }, [teardownInfoWindow]);\n\n if (!hasChildren || !childrenContainer) {\n return null;\n }\n\n return createPortal(props.children, childrenContainer);\n }\n);\n\nInfoWindow.displayName = \"InfoWindow\";\n","export interface OverlayEventBinding {\n eventName: string;\n invoke?: (event: unknown) => void;\n}\n\nexport function bindOverlayEventListeners(\n target: unknown,\n listenersRef: { current: naver.maps.MapEventListener[] },\n bindings: OverlayEventBinding[]\n): void {\n if (listenersRef.current.length > 0) {\n naver.maps.Event.removeListener(listenersRef.current);\n listenersRef.current = [];\n }\n\n listenersRef.current = bindings\n .filter((binding) => typeof binding.invoke === \"function\")\n .map((binding) =>\n naver.maps.Event.addListener(target, binding.eventName, (event: unknown) => {\n binding.invoke?.(event);\n })\n );\n}\n\nexport function removeOverlayEventListeners(listeners: naver.maps.MapEventListener[]): void {\n if (listeners.length > 0) {\n naver.maps.Event.removeListener(listeners);\n }\n}\n","import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef } from \"react\";\n\nimport { useNaverMap } from \"../../react/hooks/useNaverMap\";\nimport { bindOverlayEventListeners, removeOverlayEventListeners } from \"../shared/overlayUtils\";\n\ntype CircleOptions = naver.maps.CircleOptions;\n\ninterface CircleOptionProps {\n map?: naver.maps.Map | null;\n center: CircleOptions[\"center\"];\n radius?: CircleOptions[\"radius\"];\n strokeWeight?: CircleOptions[\"strokeWeight\"];\n strokeOpacity?: CircleOptions[\"strokeOpacity\"];\n strokeColor?: CircleOptions[\"strokeColor\"];\n strokeStyle?: CircleOptions[\"strokeStyle\"];\n strokeLineCap?: CircleOptions[\"strokeLineCap\"];\n strokeLineJoin?: CircleOptions[\"strokeLineJoin\"];\n fillColor?: CircleOptions[\"fillColor\"];\n fillOpacity?: CircleOptions[\"fillOpacity\"];\n clickable?: CircleOptions[\"clickable\"];\n visible?: CircleOptions[\"visible\"];\n zIndex?: CircleOptions[\"zIndex\"];\n}\n\ninterface CircleLifecycleProps {\n onCircleReady?: (circle: naver.maps.Circle) => void;\n onCircleDestroy?: () => void;\n onCircleError?: (error: Error) => void;\n}\n\ninterface CircleEventProps {\n onClick?: (event: naver.maps.PointerEvent) => void;\n onDblClick?: (event: naver.maps.PointerEvent) => void;\n onMouseDown?: (event: naver.maps.PointerEvent) => void;\n onMouseMove?: (event: naver.maps.PointerEvent) => void;\n onMouseOut?: (event: naver.maps.PointerEvent) => void;\n onMouseOver?: (event: naver.maps.PointerEvent) => void;\n onMouseUp?: (event: naver.maps.PointerEvent) => void;\n onRightClick?: (event: naver.maps.PointerEvent) => void;\n onTouchStart?: (event: naver.maps.PointerEvent) => void;\n onTouchMove?: (event: naver.maps.PointerEvent) => void;\n onTouchEnd?: (event: naver.maps.PointerEvent) => void;\n onCenterChanged?: (center: naver.maps.Coord) => void;\n onClickableChanged?: (clickable: boolean) => void;\n onFillColorChanged?: (fillColor: string) => void;\n onFillOpacityChanged?: (fillOpacity: number) => void;\n onMapChanged?: (map: naver.maps.Map | null) => void;\n onRadiusChanged?: (radius: number) => void;\n onStrokeColorChanged?: (strokeColor: string) => void;\n onStrokeLineCapChanged?: (strokeLineCap: naver.maps.StrokeLineCapType) => void;\n onStrokeLineJoinChanged?: (strokeLineJoin: naver.maps.StrokeLineJoinType) => void;\n onStrokeOpacityChanged?: (strokeOpacity: number) => void;\n onStrokeStyleChanged?: (strokeStyle: naver.maps.StrokeStyleType) => void;\n onStrokeWeightChanged?: (strokeWeight: number) => void;\n onVisibleChanged?: (visible: boolean) => void;\n onZIndexChanged?: (zIndex: number) => void;\n}\n\nexport type CircleProps = CircleOptionProps & CircleLifecycleProps & CircleEventProps;\n\ntype CircleMethod<K extends keyof naver.maps.Circle> = naver.maps.Circle[K] extends (\n ...args: infer A\n) => infer R\n ? (...args: A) => R | undefined\n : never;\n\nexport interface CircleRef {\n getInstance: () => naver.maps.Circle | null;\n getAreaSize: CircleMethod<\"getAreaSize\">;\n getBounds: CircleMethod<\"getBounds\">;\n getCenter: CircleMethod<\"getCenter\">;\n getClickable: CircleMethod<\"getClickable\">;\n getDrawingRect: CircleMethod<\"getDrawingRect\">;\n getElement: CircleMethod<\"getElement\">;\n getMap: CircleMethod<\"getMap\">;\n getOptions: CircleMethod<\"getOptions\">;\n getPanes: CircleMethod<\"getPanes\">;\n getProjection: CircleMethod<\"getProjection\">;\n getRadius: CircleMethod<\"getRadius\">;\n getStyles: CircleMethod<\"getStyles\">;\n getVisible: CircleMethod<\"getVisible\">;\n getZIndex: CircleMethod<\"getZIndex\">;\n setCenter: CircleMethod<\"setCenter\">;\n setClickable: CircleMethod<\"setClickable\">;\n setMap: CircleMethod<\"setMap\">;\n setOptions: CircleMethod<\"setOptions\">;\n setRadius: CircleMethod<\"setRadius\">;\n setStyles: CircleMethod<\"setStyles\">;\n setVisible: CircleMethod<\"setVisible\">;\n setZIndex: CircleMethod<\"setZIndex\">;\n}\n\nfunction toCircleOptions(props: CircleProps, targetMap: naver.maps.Map | null): CircleOptions {\n const options: CircleOptions = {\n center: props.center\n };\n\n if (targetMap) {\n options.map = targetMap;\n }\n\n if (props.radius !== undefined) {\n options.radius = props.radius;\n }\n\n if (props.strokeWeight !== undefined) {\n options.strokeWeight = props.strokeWeight;\n }\n\n if (props.strokeOpacity !== undefined) {\n options.strokeOpacity = props.strokeOpacity;\n }\n\n if (props.strokeColor !== undefined) {\n options.strokeColor = props.strokeColor;\n }\n\n if (props.strokeStyle !== undefined) {\n options.strokeStyle = props.strokeStyle;\n }\n\n if (props.strokeLineCap !== undefined) {\n options.strokeLineCap = props.strokeLineCap;\n }\n\n if (props.strokeLineJoin !== undefined) {\n options.strokeLineJoin = props.strokeLineJoin;\n }\n\n if (props.fillColor !== undefined) {\n options.fillColor = props.fillColor;\n }\n\n if (props.fillOpacity !== undefined) {\n options.fillOpacity = props.fillOpacity;\n }\n\n if (props.clickable !== undefined) {\n options.clickable = props.clickable;\n }\n\n if (props.visible !== undefined) {\n options.visible = props.visible;\n }\n\n if (props.zIndex !== undefined) {\n options.zIndex = props.zIndex;\n }\n\n return options;\n}\n\nfunction buildCircleEventBindings(props: CircleProps) {\n return [\n {\n eventName: \"click\",\n invoke: props.onClick\n ? (event: unknown) => props.onClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"dblclick\",\n invoke: props.onDblClick\n ? (event: unknown) => props.onDblClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mousedown\",\n invoke: props.onMouseDown\n ? (event: unknown) => props.onMouseDown?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mousemove\",\n invoke: props.onMouseMove\n ? (event: unknown) => props.onMouseMove?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseout\",\n invoke: props.onMouseOut\n ? (event: unknown) => props.onMouseOut?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseover\",\n invoke: props.onMouseOver\n ? (event: unknown) => props.onMouseOver?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseup\",\n invoke: props.onMouseUp\n ? (event: unknown) => props.onMouseUp?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"rightclick\",\n invoke: props.onRightClick\n ? (event: unknown) => props.onRightClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchstart\",\n invoke: props.onTouchStart\n ? (event: unknown) => props.onTouchStart?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchmove\",\n invoke: props.onTouchMove\n ? (event: unknown) => props.onTouchMove?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchend\",\n invoke: props.onTouchEnd\n ? (event: unknown) => props.onTouchEnd?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"center_changed\",\n invoke: props.onCenterChanged\n ? (event: unknown) => props.onCenterChanged?.(event as naver.maps.Coord)\n : undefined\n },\n {\n eventName: \"clickable_changed\",\n invoke: props.onClickableChanged\n ? (event: unknown) => props.onClickableChanged?.(event as boolean)\n : undefined\n },\n {\n eventName: \"fillColor_changed\",\n invoke: props.onFillColorChanged\n ? (event: unknown) => props.onFillColorChanged?.(event as string)\n : undefined\n },\n {\n eventName: \"fillOpacity_changed\",\n invoke: props.onFillOpacityChanged\n ? (event: unknown) => props.onFillOpacityChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"map_changed\",\n invoke: props.onMapChanged\n ? (event: unknown) => props.onMapChanged?.(event as naver.maps.Map | null)\n : undefined\n },\n {\n eventName: \"radius_changed\",\n invoke: props.onRadiusChanged\n ? (event: unknown) => props.onRadiusChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"strokeColor_changed\",\n invoke: props.onStrokeColorChanged\n ? (event: unknown) => props.onStrokeColorChanged?.(event as string)\n : undefined\n },\n {\n eventName: \"strokeLineCap_changed\",\n invoke: props.onStrokeLineCapChanged\n ? (event: unknown) => props.onStrokeLineCapChanged?.(event as naver.maps.StrokeLineCapType)\n : undefined\n },\n {\n eventName: \"strokeLineJoin_changed\",\n invoke: props.onStrokeLineJoinChanged\n ? (event: unknown) =>\n props.onStrokeLineJoinChanged?.(event as naver.maps.StrokeLineJoinType)\n : undefined\n },\n {\n eventName: \"strokeOpacity_changed\",\n invoke: props.onStrokeOpacityChanged\n ? (event: unknown) => props.onStrokeOpacityChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"strokeStyle_changed\",\n invoke: props.onStrokeStyleChanged\n ? (event: unknown) => props.onStrokeStyleChanged?.(event as naver.maps.StrokeStyleType)\n : undefined\n },\n {\n eventName: \"strokeWeight_changed\",\n invoke: props.onStrokeWeightChanged\n ? (event: unknown) => props.onStrokeWeightChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"visible_changed\",\n invoke: props.onVisibleChanged\n ? (event: unknown) => props.onVisibleChanged?.(event as boolean)\n : undefined\n },\n {\n eventName: \"zIndex_changed\",\n invoke: props.onZIndexChanged\n ? (event: unknown) => props.onZIndexChanged?.(event as number)\n : undefined\n }\n ];\n}\n\nexport const Circle = forwardRef<CircleRef, CircleProps>(function CircleInner(props, ref) {\n const { map: contextMap, sdkStatus } = useNaverMap();\n const circleRef = useRef<naver.maps.Circle | null>(null);\n const circleEventListenersRef = useRef<naver.maps.MapEventListener[]>([]);\n const onCircleDestroyRef = useRef<CircleProps[\"onCircleDestroy\"]>(props.onCircleDestroy);\n const targetMap = props.map ?? contextMap;\n\n useEffect(() => {\n onCircleDestroyRef.current = props.onCircleDestroy;\n }, [props.onCircleDestroy]);\n\n const invokeCircleMethod = useCallback(\n <K extends keyof naver.maps.Circle>(\n methodName: K,\n ...args: Parameters<Extract<naver.maps.Circle[K], (...params: never[]) => unknown>>\n ): ReturnType<Extract<naver.maps.Circle[K], (...params: never[]) => unknown>> | undefined => {\n const circle = circleRef.current;\n\n if (!circle) {\n return undefined;\n }\n\n const method = circle[methodName] as unknown;\n\n if (typeof method !== \"function\") {\n return undefined;\n }\n\n return (method as (...params: unknown[]) => unknown).apply(circle, args) as ReturnType<\n Extract<naver.maps.Circle[K], (...params: never[]) => unknown>\n >;\n },\n []\n );\n\n const teardownCircle = useCallback(() => {\n const circle = circleRef.current;\n\n if (!circle) {\n return;\n }\n\n try {\n removeOverlayEventListeners(circleEventListenersRef.current);\n circleEventListenersRef.current = [];\n naver.maps.Event.clearInstanceListeners(circle);\n } catch (error) {\n console.error(\"[react-naver-maps-kit] failed to clear circle listeners\", error);\n }\n\n circle.setMap(null);\n circleRef.current = null;\n onCircleDestroyRef.current?.();\n }, []);\n\n useImperativeHandle(\n ref,\n (): CircleRef => ({\n getInstance: () => circleRef.current,\n getAreaSize: (...args) => invokeCircleMethod(\"getAreaSize\", ...args),\n getBounds: (...args) => invokeCircleMethod(\"getBounds\", ...args),\n getCenter: (...args) => invokeCircleMethod(\"getCenter\", ...args),\n getClickable: (...args) => invokeCircleMethod(\"getClickable\", ...args),\n getDrawingRect: (...args) => invokeCircleMethod(\"getDrawingRect\", ...args),\n getElement: (...args) => invokeCircleMethod(\"getElement\", ...args),\n getMap: (...args) => invokeCircleMethod(\"getMap\", ...args),\n getOptions: (...args) => invokeCircleMethod(\"getOptions\", ...args),\n getPanes: (...args) => invokeCircleMethod(\"getPanes\", ...args),\n getProjection: (...args) => invokeCircleMethod(\"getProjection\", ...args),\n getRadius: (...args) => invokeCircleMethod(\"getRadius\", ...args),\n getStyles: (...args) => invokeCircleMethod(\"getStyles\", ...args),\n getVisible: (...args) => invokeCircleMethod(\"getVisible\", ...args),\n getZIndex: (...args) => invokeCircleMethod(\"getZIndex\", ...args),\n setCenter: (...args) => invokeCircleMethod(\"setCenter\", ...args),\n setClickable: (...args) => invokeCircleMethod(\"setClickable\", ...args),\n setMap: (...args) => invokeCircleMethod(\"setMap\", ...args),\n setOptions: (...args) => invokeCircleMethod(\"setOptions\", ...args),\n setRadius: (...args) => invokeCircleMethod(\"setRadius\", ...args),\n setStyles: (...args) => invokeCircleMethod(\"setStyles\", ...args),\n setVisible: (...args) => invokeCircleMethod(\"setVisible\", ...args),\n setZIndex: (...args) => invokeCircleMethod(\"setZIndex\", ...args)\n }),\n [invokeCircleMethod]\n );\n\n useEffect(() => {\n if (sdkStatus !== \"ready\" || !targetMap || circleRef.current) {\n return;\n }\n\n try {\n const circle = new naver.maps.Circle(toCircleOptions(props, targetMap));\n\n circleRef.current = circle;\n bindOverlayEventListeners(circle, circleEventListenersRef, buildCircleEventBindings(props));\n props.onCircleReady?.(circle);\n } catch (error) {\n const normalizedError =\n error instanceof Error ? error : new Error(\"Failed to create naver.maps.Circle instance.\");\n\n props.onCircleError?.(normalizedError);\n }\n }, [props, sdkStatus, targetMap]);\n\n useEffect(() => {\n const circle = circleRef.current;\n\n if (!circle || !targetMap) {\n return;\n }\n\n circle.setOptions(toCircleOptions(props, targetMap));\n }, [props, targetMap]);\n\n useEffect(() => {\n const circle = circleRef.current;\n\n if (!circle) {\n return;\n }\n\n bindOverlayEventListeners(circle, circleEventListenersRef, buildCircleEventBindings(props));\n\n return () => {\n removeOverlayEventListeners(circleEventListenersRef.current);\n circleEventListenersRef.current = [];\n };\n }, [props]);\n\n useEffect(() => {\n return () => {\n teardownCircle();\n };\n }, [teardownCircle]);\n\n return null;\n});\n\nCircle.displayName = \"Circle\";\n","import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef } from \"react\";\n\nimport { useNaverMap } from \"../../react/hooks/useNaverMap\";\nimport { bindOverlayEventListeners, removeOverlayEventListeners } from \"../shared/overlayUtils\";\n\ntype EllipseOptions = naver.maps.EllipseOptions;\n\ninterface EllipseOptionProps {\n map?: naver.maps.Map | null;\n bounds: EllipseOptions[\"bounds\"];\n strokeWeight?: EllipseOptions[\"strokeWeight\"];\n strokeOpacity?: EllipseOptions[\"strokeOpacity\"];\n strokeColor?: EllipseOptions[\"strokeColor\"];\n strokeStyle?: EllipseOptions[\"strokeStyle\"];\n strokeLineCap?: EllipseOptions[\"strokeLineCap\"];\n strokeLineJoin?: EllipseOptions[\"strokeLineJoin\"];\n fillColor?: EllipseOptions[\"fillColor\"];\n fillOpacity?: EllipseOptions[\"fillOpacity\"];\n clickable?: EllipseOptions[\"clickable\"];\n visible?: EllipseOptions[\"visible\"];\n zIndex?: EllipseOptions[\"zIndex\"];\n}\n\ninterface EllipseLifecycleProps {\n onEllipseReady?: (ellipse: naver.maps.Ellipse) => void;\n onEllipseDestroy?: () => void;\n onEllipseError?: (error: Error) => void;\n}\n\ninterface EllipseEventProps {\n onClick?: (event: naver.maps.PointerEvent) => void;\n onDblClick?: (event: naver.maps.PointerEvent) => void;\n onMouseDown?: (event: naver.maps.PointerEvent) => void;\n onMouseMove?: (event: naver.maps.PointerEvent) => void;\n onMouseOut?: (event: naver.maps.PointerEvent) => void;\n onMouseOver?: (event: naver.maps.PointerEvent) => void;\n onMouseUp?: (event: naver.maps.PointerEvent) => void;\n onRightClick?: (event: naver.maps.PointerEvent) => void;\n onTouchStart?: (event: naver.maps.PointerEvent) => void;\n onTouchMove?: (event: naver.maps.PointerEvent) => void;\n onTouchEnd?: (event: naver.maps.PointerEvent) => void;\n onBoundsChanged?: (bounds: naver.maps.Bounds) => void;\n onClickableChanged?: (clickable: boolean) => void;\n onFillColorChanged?: (fillColor: string) => void;\n onFillOpacityChanged?: (fillOpacity: number) => void;\n onMapChanged?: (map: naver.maps.Map | null) => void;\n onStrokeColorChanged?: (strokeColor: string) => void;\n onStrokeLineCapChanged?: (strokeLineCap: naver.maps.StrokeLineCapType) => void;\n onStrokeLineJoinChanged?: (strokeLineJoin: naver.maps.StrokeLineJoinType) => void;\n onStrokeOpacityChanged?: (strokeOpacity: number) => void;\n onStrokeStyleChanged?: (strokeStyle: naver.maps.StrokeStyleType) => void;\n onStrokeWeightChanged?: (strokeWeight: number) => void;\n onVisibleChanged?: (visible: boolean) => void;\n onZIndexChanged?: (zIndex: number) => void;\n}\n\nexport type EllipseProps = EllipseOptionProps & EllipseLifecycleProps & EllipseEventProps;\n\ntype EllipseMethod<K extends keyof naver.maps.Ellipse> = naver.maps.Ellipse[K] extends (\n ...args: infer A\n) => infer R\n ? (...args: A) => R | undefined\n : never;\n\nexport interface EllipseRef {\n getInstance: () => naver.maps.Ellipse | null;\n getAreaSize: EllipseMethod<\"getAreaSize\">;\n getBounds: EllipseMethod<\"getBounds\">;\n getClickable: EllipseMethod<\"getClickable\">;\n getDrawingRect: EllipseMethod<\"getDrawingRect\">;\n getElement: EllipseMethod<\"getElement\">;\n getMap: EllipseMethod<\"getMap\">;\n getOptions: EllipseMethod<\"getOptions\">;\n getPanes: EllipseMethod<\"getPanes\">;\n getProjection: EllipseMethod<\"getProjection\">;\n getStyles: EllipseMethod<\"getStyles\">;\n getVisible: EllipseMethod<\"getVisible\">;\n getZIndex: EllipseMethod<\"getZIndex\">;\n setBounds: EllipseMethod<\"setBounds\">;\n setClickable: EllipseMethod<\"setClickable\">;\n setMap: EllipseMethod<\"setMap\">;\n setOptions: EllipseMethod<\"setOptions\">;\n setStyles: EllipseMethod<\"setStyles\">;\n setVisible: EllipseMethod<\"setVisible\">;\n setZIndex: EllipseMethod<\"setZIndex\">;\n}\n\nfunction toEllipseOptions(props: EllipseProps, targetMap: naver.maps.Map | null): EllipseOptions {\n const options: EllipseOptions = {\n bounds: props.bounds\n };\n\n if (targetMap) {\n options.map = targetMap;\n }\n\n if (props.strokeWeight !== undefined) {\n options.strokeWeight = props.strokeWeight;\n }\n\n if (props.strokeOpacity !== undefined) {\n options.strokeOpacity = props.strokeOpacity;\n }\n\n if (props.strokeColor !== undefined) {\n options.strokeColor = props.strokeColor;\n }\n\n if (props.strokeStyle !== undefined) {\n options.strokeStyle = props.strokeStyle;\n }\n\n if (props.strokeLineCap !== undefined) {\n options.strokeLineCap = props.strokeLineCap;\n }\n\n if (props.strokeLineJoin !== undefined) {\n options.strokeLineJoin = props.strokeLineJoin;\n }\n\n if (props.fillColor !== undefined) {\n options.fillColor = props.fillColor;\n }\n\n if (props.fillOpacity !== undefined) {\n options.fillOpacity = props.fillOpacity;\n }\n\n if (props.clickable !== undefined) {\n options.clickable = props.clickable;\n }\n\n if (props.visible !== undefined) {\n options.visible = props.visible;\n }\n\n if (props.zIndex !== undefined) {\n options.zIndex = props.zIndex;\n }\n\n return options;\n}\n\nfunction buildEllipseEventBindings(props: EllipseProps) {\n return [\n {\n eventName: \"click\",\n invoke: props.onClick\n ? (event: unknown) => props.onClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"dblclick\",\n invoke: props.onDblClick\n ? (event: unknown) => props.onDblClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mousedown\",\n invoke: props.onMouseDown\n ? (event: unknown) => props.onMouseDown?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mousemove\",\n invoke: props.onMouseMove\n ? (event: unknown) => props.onMouseMove?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseout\",\n invoke: props.onMouseOut\n ? (event: unknown) => props.onMouseOut?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseover\",\n invoke: props.onMouseOver\n ? (event: unknown) => props.onMouseOver?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseup\",\n invoke: props.onMouseUp\n ? (event: unknown) => props.onMouseUp?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"rightclick\",\n invoke: props.onRightClick\n ? (event: unknown) => props.onRightClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchstart\",\n invoke: props.onTouchStart\n ? (event: unknown) => props.onTouchStart?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchmove\",\n invoke: props.onTouchMove\n ? (event: unknown) => props.onTouchMove?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchend\",\n invoke: props.onTouchEnd\n ? (event: unknown) => props.onTouchEnd?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"bounds_changed\",\n invoke: props.onBoundsChanged\n ? (event: unknown) => props.onBoundsChanged?.(event as naver.maps.Bounds)\n : undefined\n },\n {\n eventName: \"clickable_changed\",\n invoke: props.onClickableChanged\n ? (event: unknown) => props.onClickableChanged?.(event as boolean)\n : undefined\n },\n {\n eventName: \"fillColor_changed\",\n invoke: props.onFillColorChanged\n ? (event: unknown) => props.onFillColorChanged?.(event as string)\n : undefined\n },\n {\n eventName: \"fillOpacity_changed\",\n invoke: props.onFillOpacityChanged\n ? (event: unknown) => props.onFillOpacityChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"map_changed\",\n invoke: props.onMapChanged\n ? (event: unknown) => props.onMapChanged?.(event as naver.maps.Map | null)\n : undefined\n },\n {\n eventName: \"strokeColor_changed\",\n invoke: props.onStrokeColorChanged\n ? (event: unknown) => props.onStrokeColorChanged?.(event as string)\n : undefined\n },\n {\n eventName: \"strokeLineCap_changed\",\n invoke: props.onStrokeLineCapChanged\n ? (event: unknown) => props.onStrokeLineCapChanged?.(event as naver.maps.StrokeLineCapType)\n : undefined\n },\n {\n eventName: \"strokeLineJoin_changed\",\n invoke: props.onStrokeLineJoinChanged\n ? (event: unknown) =>\n props.onStrokeLineJoinChanged?.(event as naver.maps.StrokeLineJoinType)\n : undefined\n },\n {\n eventName: \"strokeOpacity_changed\",\n invoke: props.onStrokeOpacityChanged\n ? (event: unknown) => props.onStrokeOpacityChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"strokeStyle_changed\",\n invoke: props.onStrokeStyleChanged\n ? (event: unknown) => props.onStrokeStyleChanged?.(event as naver.maps.StrokeStyleType)\n : undefined\n },\n {\n eventName: \"strokeWeight_changed\",\n invoke: props.onStrokeWeightChanged\n ? (event: unknown) => props.onStrokeWeightChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"visible_changed\",\n invoke: props.onVisibleChanged\n ? (event: unknown) => props.onVisibleChanged?.(event as boolean)\n : undefined\n },\n {\n eventName: \"zIndex_changed\",\n invoke: props.onZIndexChanged\n ? (event: unknown) => props.onZIndexChanged?.(event as number)\n : undefined\n }\n ];\n}\n\nexport const Ellipse = forwardRef<EllipseRef, EllipseProps>(function EllipseInner(props, ref) {\n const { map: contextMap, sdkStatus } = useNaverMap();\n const ellipseRef = useRef<naver.maps.Ellipse | null>(null);\n const ellipseEventListenersRef = useRef<naver.maps.MapEventListener[]>([]);\n const onEllipseDestroyRef = useRef<EllipseProps[\"onEllipseDestroy\"]>(props.onEllipseDestroy);\n const targetMap = props.map ?? contextMap;\n\n useEffect(() => {\n onEllipseDestroyRef.current = props.onEllipseDestroy;\n }, [props.onEllipseDestroy]);\n\n const invokeEllipseMethod = useCallback(\n <K extends keyof naver.maps.Ellipse>(\n methodName: K,\n ...args: Parameters<Extract<naver.maps.Ellipse[K], (...params: never[]) => unknown>>\n ): ReturnType<Extract<naver.maps.Ellipse[K], (...params: never[]) => unknown>> | undefined => {\n const ellipse = ellipseRef.current;\n\n if (!ellipse) {\n return undefined;\n }\n\n const method = ellipse[methodName] as unknown;\n\n if (typeof method !== \"function\") {\n return undefined;\n }\n\n return (method as (...params: unknown[]) => unknown).apply(ellipse, args) as ReturnType<\n Extract<naver.maps.Ellipse[K], (...params: never[]) => unknown>\n >;\n },\n []\n );\n\n const teardownEllipse = useCallback(() => {\n const ellipse = ellipseRef.current;\n\n if (!ellipse) {\n return;\n }\n\n try {\n removeOverlayEventListeners(ellipseEventListenersRef.current);\n ellipseEventListenersRef.current = [];\n naver.maps.Event.clearInstanceListeners(ellipse);\n } catch (error) {\n console.error(\"[react-naver-maps-kit] failed to clear ellipse listeners\", error);\n }\n\n ellipse.setMap(null);\n ellipseRef.current = null;\n onEllipseDestroyRef.current?.();\n }, []);\n\n useImperativeHandle(\n ref,\n (): EllipseRef => ({\n getInstance: () => ellipseRef.current,\n getAreaSize: (...args) => invokeEllipseMethod(\"getAreaSize\", ...args),\n getBounds: (...args) => invokeEllipseMethod(\"getBounds\", ...args),\n getClickable: (...args) => invokeEllipseMethod(\"getClickable\", ...args),\n getDrawingRect: (...args) => invokeEllipseMethod(\"getDrawingRect\", ...args),\n getElement: (...args) => invokeEllipseMethod(\"getElement\", ...args),\n getMap: (...args) => invokeEllipseMethod(\"getMap\", ...args),\n getOptions: (...args) => invokeEllipseMethod(\"getOptions\", ...args),\n getPanes: (...args) => invokeEllipseMethod(\"getPanes\", ...args),\n getProjection: (...args) => invokeEllipseMethod(\"getProjection\", ...args),\n getStyles: (...args) => invokeEllipseMethod(\"getStyles\", ...args),\n getVisible: (...args) => invokeEllipseMethod(\"getVisible\", ...args),\n getZIndex: (...args) => invokeEllipseMethod(\"getZIndex\", ...args),\n setBounds: (...args) => invokeEllipseMethod(\"setBounds\", ...args),\n setClickable: (...args) => invokeEllipseMethod(\"setClickable\", ...args),\n setMap: (...args) => invokeEllipseMethod(\"setMap\", ...args),\n setOptions: (...args) => invokeEllipseMethod(\"setOptions\", ...args),\n setStyles: (...args) => invokeEllipseMethod(\"setStyles\", ...args),\n setVisible: (...args) => invokeEllipseMethod(\"setVisible\", ...args),\n setZIndex: (...args) => invokeEllipseMethod(\"setZIndex\", ...args)\n }),\n [invokeEllipseMethod]\n );\n\n useEffect(() => {\n if (sdkStatus !== \"ready\" || !targetMap || ellipseRef.current) {\n return;\n }\n\n try {\n const ellipse = new naver.maps.Ellipse(toEllipseOptions(props, targetMap));\n\n ellipseRef.current = ellipse;\n bindOverlayEventListeners(\n ellipse,\n ellipseEventListenersRef,\n buildEllipseEventBindings(props)\n );\n props.onEllipseReady?.(ellipse);\n } catch (error) {\n const normalizedError =\n error instanceof Error ? error : new Error(\"Failed to create naver.maps.Ellipse instance.\");\n\n props.onEllipseError?.(normalizedError);\n }\n }, [props, sdkStatus, targetMap]);\n\n useEffect(() => {\n const ellipse = ellipseRef.current;\n\n if (!ellipse || !targetMap) {\n return;\n }\n\n ellipse.setOptions(toEllipseOptions(props, targetMap));\n }, [props, targetMap]);\n\n useEffect(() => {\n const ellipse = ellipseRef.current;\n\n if (!ellipse) {\n return;\n }\n\n bindOverlayEventListeners(ellipse, ellipseEventListenersRef, buildEllipseEventBindings(props));\n\n return () => {\n removeOverlayEventListeners(ellipseEventListenersRef.current);\n ellipseEventListenersRef.current = [];\n };\n }, [props]);\n\n useEffect(() => {\n return () => {\n teardownEllipse();\n };\n }, [teardownEllipse]);\n\n return null;\n});\n\nEllipse.displayName = \"Ellipse\";\n","import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef } from \"react\";\n\nimport { useNaverMap } from \"../../react/hooks/useNaverMap\";\nimport { bindOverlayEventListeners, removeOverlayEventListeners } from \"../shared/overlayUtils\";\n\ntype GroundOverlayOptions = naver.maps.GroundOverlayOptions;\n\ninterface GroundOverlayOptionProps {\n map?: naver.maps.Map | null;\n url: string;\n bounds: naver.maps.Bounds | naver.maps.BoundsLiteral;\n clickable?: GroundOverlayOptions[\"clickable\"];\n opacity?: GroundOverlayOptions[\"opacity\"];\n}\n\ninterface GroundOverlayLifecycleProps {\n onGroundOverlayReady?: (groundOverlay: naver.maps.GroundOverlay) => void;\n onGroundOverlayDestroy?: () => void;\n onGroundOverlayError?: (error: Error) => void;\n}\n\ninterface GroundOverlayEventProps {\n onClick?: (event: naver.maps.PointerEvent) => void;\n onDblClick?: (event: naver.maps.PointerEvent) => void;\n onMouseDown?: (event: naver.maps.PointerEvent) => void;\n onMouseMove?: (event: naver.maps.PointerEvent) => void;\n onMouseOut?: (event: naver.maps.PointerEvent) => void;\n onMouseOver?: (event: naver.maps.PointerEvent) => void;\n onMouseUp?: (event: naver.maps.PointerEvent) => void;\n onRightClick?: (event: naver.maps.PointerEvent) => void;\n onTouchStart?: (event: naver.maps.PointerEvent) => void;\n onTouchMove?: (event: naver.maps.PointerEvent) => void;\n onTouchEnd?: (event: naver.maps.PointerEvent) => void;\n onBoundsChanged?: (bounds: naver.maps.Bounds) => void;\n onClickableChanged?: (clickable: boolean) => void;\n onMapChanged?: (map: naver.maps.Map | null) => void;\n onOpacityChanged?: (opacity: number) => void;\n}\n\nexport type GroundOverlayProps = GroundOverlayOptionProps &\n GroundOverlayLifecycleProps &\n GroundOverlayEventProps;\n\ntype GroundOverlayMethod<K extends keyof naver.maps.GroundOverlay> =\n naver.maps.GroundOverlay[K] extends (...args: infer A) => infer R\n ? (...args: A) => R | undefined\n : never;\n\nexport interface GroundOverlayRef {\n getInstance: () => naver.maps.GroundOverlay | null;\n getBounds: GroundOverlayMethod<\"getBounds\">;\n getMap: GroundOverlayMethod<\"getMap\">;\n getOpacity: GroundOverlayMethod<\"getOpacity\">;\n getPanes: GroundOverlayMethod<\"getPanes\">;\n getProjection: GroundOverlayMethod<\"getProjection\">;\n getUrl: GroundOverlayMethod<\"getUrl\">;\n setMap: GroundOverlayMethod<\"setMap\">;\n setOpacity: GroundOverlayMethod<\"setOpacity\">;\n}\n\nfunction toGroundOverlayOptions(\n props: GroundOverlayProps,\n targetMap: naver.maps.Map | null\n): GroundOverlayOptions {\n const options: GroundOverlayOptions = {};\n\n if (targetMap) {\n options.map = targetMap;\n }\n\n if (props.clickable !== undefined) {\n options.clickable = props.clickable;\n }\n\n if (props.opacity !== undefined) {\n options.opacity = props.opacity;\n }\n\n return options;\n}\n\nfunction buildGroundOverlayEventBindings(props: GroundOverlayProps) {\n return [\n {\n eventName: \"click\",\n invoke: props.onClick\n ? (event: unknown) => props.onClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"dblclick\",\n invoke: props.onDblClick\n ? (event: unknown) => props.onDblClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mousedown\",\n invoke: props.onMouseDown\n ? (event: unknown) => props.onMouseDown?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mousemove\",\n invoke: props.onMouseMove\n ? (event: unknown) => props.onMouseMove?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseout\",\n invoke: props.onMouseOut\n ? (event: unknown) => props.onMouseOut?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseover\",\n invoke: props.onMouseOver\n ? (event: unknown) => props.onMouseOver?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseup\",\n invoke: props.onMouseUp\n ? (event: unknown) => props.onMouseUp?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"rightclick\",\n invoke: props.onRightClick\n ? (event: unknown) => props.onRightClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchstart\",\n invoke: props.onTouchStart\n ? (event: unknown) => props.onTouchStart?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchmove\",\n invoke: props.onTouchMove\n ? (event: unknown) => props.onTouchMove?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchend\",\n invoke: props.onTouchEnd\n ? (event: unknown) => props.onTouchEnd?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"bounds_changed\",\n invoke: props.onBoundsChanged\n ? (event: unknown) => props.onBoundsChanged?.(event as naver.maps.Bounds)\n : undefined\n },\n {\n eventName: \"clickable_changed\",\n invoke: props.onClickableChanged\n ? (event: unknown) => props.onClickableChanged?.(event as boolean)\n : undefined\n },\n {\n eventName: \"map_changed\",\n invoke: props.onMapChanged\n ? (event: unknown) => props.onMapChanged?.(event as naver.maps.Map | null)\n : undefined\n },\n {\n eventName: \"opacity_changed\",\n invoke: props.onOpacityChanged\n ? (event: unknown) => props.onOpacityChanged?.(event as number)\n : undefined\n }\n ];\n}\n\nexport const GroundOverlay = forwardRef<GroundOverlayRef, GroundOverlayProps>(\n function GroundOverlayInner(props, ref) {\n const { map: contextMap, sdkStatus } = useNaverMap();\n const groundOverlayRef = useRef<naver.maps.GroundOverlay | null>(null);\n const groundOverlayEventListenersRef = useRef<naver.maps.MapEventListener[]>([]);\n const onGroundOverlayDestroyRef = useRef<GroundOverlayProps[\"onGroundOverlayDestroy\"]>(\n props.onGroundOverlayDestroy\n );\n const targetMap = props.map ?? contextMap;\n\n useEffect(() => {\n onGroundOverlayDestroyRef.current = props.onGroundOverlayDestroy;\n }, [props.onGroundOverlayDestroy]);\n\n const invokeGroundOverlayMethod = useCallback(\n <K extends keyof naver.maps.GroundOverlay>(\n methodName: K,\n ...args: Parameters<Extract<naver.maps.GroundOverlay[K], (...params: never[]) => unknown>>\n ):\n | ReturnType<Extract<naver.maps.GroundOverlay[K], (...params: never[]) => unknown>>\n | undefined => {\n const groundOverlay = groundOverlayRef.current;\n\n if (!groundOverlay) {\n return undefined;\n }\n\n const method = groundOverlay[methodName] as unknown;\n\n if (typeof method !== \"function\") {\n return undefined;\n }\n\n return (method as (...params: unknown[]) => unknown).apply(\n groundOverlay,\n args\n ) as ReturnType<Extract<naver.maps.GroundOverlay[K], (...params: never[]) => unknown>>;\n },\n []\n );\n\n const teardownGroundOverlay = useCallback(() => {\n const groundOverlay = groundOverlayRef.current;\n\n if (!groundOverlay) {\n return;\n }\n\n try {\n removeOverlayEventListeners(groundOverlayEventListenersRef.current);\n groundOverlayEventListenersRef.current = [];\n naver.maps.Event.clearInstanceListeners(groundOverlay);\n } catch (error) {\n console.error(\"[react-naver-maps-kit] failed to clear ground overlay listeners\", error);\n }\n\n groundOverlay.setMap(null);\n groundOverlayRef.current = null;\n onGroundOverlayDestroyRef.current?.();\n }, []);\n\n useImperativeHandle(\n ref,\n (): GroundOverlayRef => ({\n getInstance: () => groundOverlayRef.current,\n getBounds: (...args) => invokeGroundOverlayMethod(\"getBounds\", ...args),\n getMap: (...args) => invokeGroundOverlayMethod(\"getMap\", ...args),\n getOpacity: (...args) => invokeGroundOverlayMethod(\"getOpacity\", ...args),\n getPanes: (...args) => invokeGroundOverlayMethod(\"getPanes\", ...args),\n getProjection: (...args) => invokeGroundOverlayMethod(\"getProjection\", ...args),\n getUrl: (...args) => invokeGroundOverlayMethod(\"getUrl\", ...args),\n setMap: (...args) => invokeGroundOverlayMethod(\"setMap\", ...args),\n setOpacity: (...args) => invokeGroundOverlayMethod(\"setOpacity\", ...args)\n }),\n [invokeGroundOverlayMethod]\n );\n\n useEffect(() => {\n if (sdkStatus !== \"ready\" || !targetMap || groundOverlayRef.current) {\n return;\n }\n\n try {\n const groundOverlay = new naver.maps.GroundOverlay(\n props.url,\n props.bounds,\n toGroundOverlayOptions(props, targetMap)\n );\n\n groundOverlayRef.current = groundOverlay;\n bindOverlayEventListeners(\n groundOverlay,\n groundOverlayEventListenersRef,\n buildGroundOverlayEventBindings(props)\n );\n props.onGroundOverlayReady?.(groundOverlay);\n } catch (error) {\n const normalizedError =\n error instanceof Error\n ? error\n : new Error(\"Failed to create naver.maps.GroundOverlay instance.\");\n\n props.onGroundOverlayError?.(normalizedError);\n }\n }, [props, sdkStatus, targetMap]);\n\n useEffect(() => {\n const groundOverlay = groundOverlayRef.current;\n\n if (!groundOverlay || !targetMap) {\n return;\n }\n\n groundOverlay.setMap(targetMap);\n\n if (props.opacity !== undefined) {\n groundOverlay.setOpacity(props.opacity);\n }\n\n const optionsSettable = groundOverlay as naver.maps.GroundOverlay & {\n setOptions?: (options: GroundOverlayOptions) => void;\n };\n\n optionsSettable.setOptions?.(toGroundOverlayOptions(props, targetMap));\n }, [props, targetMap]);\n\n useEffect(() => {\n const groundOverlay = groundOverlayRef.current;\n\n if (!groundOverlay) {\n return;\n }\n\n bindOverlayEventListeners(\n groundOverlay,\n groundOverlayEventListenersRef,\n buildGroundOverlayEventBindings(props)\n );\n\n return () => {\n removeOverlayEventListeners(groundOverlayEventListenersRef.current);\n groundOverlayEventListenersRef.current = [];\n };\n }, [props]);\n\n useEffect(() => {\n return () => {\n teardownGroundOverlay();\n };\n }, [teardownGroundOverlay]);\n\n return null;\n }\n);\n\nGroundOverlay.displayName = \"GroundOverlay\";\n","import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef } from \"react\";\n\nimport { useNaverMap } from \"../../react/hooks/useNaverMap\";\nimport { bindOverlayEventListeners, removeOverlayEventListeners } from \"../shared/overlayUtils\";\n\ntype PolygonOptions = naver.maps.PolygonOptions;\n\ninterface PolygonOptionProps {\n map?: naver.maps.Map | null;\n paths: PolygonOptions[\"paths\"];\n strokeWeight?: PolygonOptions[\"strokeWeight\"];\n strokeOpacity?: PolygonOptions[\"strokeOpacity\"];\n strokeColor?: PolygonOptions[\"strokeColor\"];\n strokeStyle?: PolygonOptions[\"strokeStyle\"];\n strokeLineCap?: PolygonOptions[\"strokeLineCap\"];\n strokeLineJoin?: PolygonOptions[\"strokeLineJoin\"];\n fillColor?: PolygonOptions[\"fillColor\"];\n fillOpacity?: PolygonOptions[\"fillOpacity\"];\n clickable?: PolygonOptions[\"clickable\"];\n visible?: PolygonOptions[\"visible\"];\n zIndex?: PolygonOptions[\"zIndex\"];\n}\n\ninterface PolygonLifecycleProps {\n onPolygonReady?: (polygon: naver.maps.Polygon) => void;\n onPolygonDestroy?: () => void;\n onPolygonError?: (error: Error) => void;\n}\n\ninterface PolygonEventProps {\n onClick?: (event: naver.maps.PointerEvent) => void;\n onDblClick?: (event: naver.maps.PointerEvent) => void;\n onMouseDown?: (event: naver.maps.PointerEvent) => void;\n onMouseMove?: (event: naver.maps.PointerEvent) => void;\n onMouseOut?: (event: naver.maps.PointerEvent) => void;\n onMouseOver?: (event: naver.maps.PointerEvent) => void;\n onMouseUp?: (event: naver.maps.PointerEvent) => void;\n onRightClick?: (event: naver.maps.PointerEvent) => void;\n onTouchStart?: (event: naver.maps.PointerEvent) => void;\n onTouchMove?: (event: naver.maps.PointerEvent) => void;\n onTouchEnd?: (event: naver.maps.PointerEvent) => void;\n onClickableChanged?: (clickable: boolean) => void;\n onFillColorChanged?: (fillColor: string) => void;\n onFillOpacityChanged?: (fillOpacity: number) => void;\n onMapChanged?: (map: naver.maps.Map | null) => void;\n onPathChanged?: (\n path: naver.maps.ArrayOfCoords | naver.maps.KVOArrayOfCoords | naver.maps.ArrayOfCoordsLiteral\n ) => void;\n onPathsChanged?: (\n paths:\n | naver.maps.ArrayOfCoords[]\n | naver.maps.KVOArray<naver.maps.KVOArrayOfCoords>\n | naver.maps.ArrayOfCoordsLiteral[]\n ) => void;\n onStrokeColorChanged?: (strokeColor: string) => void;\n onStrokeLineCapChanged?: (strokeLineCap: naver.maps.StrokeLineCapType) => void;\n onStrokeLineJoinChanged?: (strokeLineJoin: naver.maps.StrokeLineJoinType) => void;\n onStrokeOpacityChanged?: (strokeOpacity: number) => void;\n onStrokeStyleChanged?: (strokeStyle: naver.maps.StrokeStyleType) => void;\n onStrokeWeightChanged?: (strokeWeight: number) => void;\n onVisibleChanged?: (visible: boolean) => void;\n onZIndexChanged?: (zIndex: number) => void;\n}\n\nexport type PolygonProps = PolygonOptionProps & PolygonLifecycleProps & PolygonEventProps;\n\ntype PolygonMethod<K extends keyof naver.maps.Polygon> = naver.maps.Polygon[K] extends (\n ...args: infer A\n) => infer R\n ? (...args: A) => R | undefined\n : never;\n\nexport interface PolygonRef {\n getInstance: () => naver.maps.Polygon | null;\n getAreaSize: PolygonMethod<\"getAreaSize\">;\n getBounds: PolygonMethod<\"getBounds\">;\n getClickable: PolygonMethod<\"getClickable\">;\n getDrawingRect: PolygonMethod<\"getDrawingRect\">;\n getElement: PolygonMethod<\"getElement\">;\n getMap: PolygonMethod<\"getMap\">;\n getOptions: PolygonMethod<\"getOptions\">;\n getPanes: PolygonMethod<\"getPanes\">;\n getPath: PolygonMethod<\"getPath\">;\n getPaths: PolygonMethod<\"getPaths\">;\n getProjection: PolygonMethod<\"getProjection\">;\n getStyles: PolygonMethod<\"getStyles\">;\n getVisible: PolygonMethod<\"getVisible\">;\n getZIndex: PolygonMethod<\"getZIndex\">;\n setClickable: PolygonMethod<\"setClickable\">;\n setMap: PolygonMethod<\"setMap\">;\n setOptions: PolygonMethod<\"setOptions\">;\n setPath: PolygonMethod<\"setPath\">;\n setPaths: PolygonMethod<\"setPaths\">;\n setStyles: PolygonMethod<\"setStyles\">;\n setVisible: PolygonMethod<\"setVisible\">;\n setZIndex: PolygonMethod<\"setZIndex\">;\n}\n\nfunction toPolygonOptions(props: PolygonProps, targetMap: naver.maps.Map | null): PolygonOptions {\n const options: PolygonOptions = {\n paths: props.paths\n };\n\n if (targetMap) {\n options.map = targetMap;\n }\n\n if (props.strokeWeight !== undefined) {\n options.strokeWeight = props.strokeWeight;\n }\n\n if (props.strokeOpacity !== undefined) {\n options.strokeOpacity = props.strokeOpacity;\n }\n\n if (props.strokeColor !== undefined) {\n options.strokeColor = props.strokeColor;\n }\n\n if (props.strokeStyle !== undefined) {\n options.strokeStyle = props.strokeStyle;\n }\n\n if (props.strokeLineCap !== undefined) {\n options.strokeLineCap = props.strokeLineCap;\n }\n\n if (props.strokeLineJoin !== undefined) {\n options.strokeLineJoin = props.strokeLineJoin;\n }\n\n if (props.fillColor !== undefined) {\n options.fillColor = props.fillColor;\n }\n\n if (props.fillOpacity !== undefined) {\n options.fillOpacity = props.fillOpacity;\n }\n\n if (props.clickable !== undefined) {\n options.clickable = props.clickable;\n }\n\n if (props.visible !== undefined) {\n options.visible = props.visible;\n }\n\n if (props.zIndex !== undefined) {\n options.zIndex = props.zIndex;\n }\n\n return options;\n}\n\nfunction buildPolygonEventBindings(props: PolygonProps) {\n return [\n {\n eventName: \"click\",\n invoke: props.onClick\n ? (event: unknown) => props.onClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"dblclick\",\n invoke: props.onDblClick\n ? (event: unknown) => props.onDblClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mousedown\",\n invoke: props.onMouseDown\n ? (event: unknown) => props.onMouseDown?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mousemove\",\n invoke: props.onMouseMove\n ? (event: unknown) => props.onMouseMove?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseout\",\n invoke: props.onMouseOut\n ? (event: unknown) => props.onMouseOut?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseover\",\n invoke: props.onMouseOver\n ? (event: unknown) => props.onMouseOver?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseup\",\n invoke: props.onMouseUp\n ? (event: unknown) => props.onMouseUp?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"rightclick\",\n invoke: props.onRightClick\n ? (event: unknown) => props.onRightClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchstart\",\n invoke: props.onTouchStart\n ? (event: unknown) => props.onTouchStart?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchmove\",\n invoke: props.onTouchMove\n ? (event: unknown) => props.onTouchMove?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchend\",\n invoke: props.onTouchEnd\n ? (event: unknown) => props.onTouchEnd?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"clickable_changed\",\n invoke: props.onClickableChanged\n ? (event: unknown) => props.onClickableChanged?.(event as boolean)\n : undefined\n },\n {\n eventName: \"fillColor_changed\",\n invoke: props.onFillColorChanged\n ? (event: unknown) => props.onFillColorChanged?.(event as string)\n : undefined\n },\n {\n eventName: \"fillOpacity_changed\",\n invoke: props.onFillOpacityChanged\n ? (event: unknown) => props.onFillOpacityChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"map_changed\",\n invoke: props.onMapChanged\n ? (event: unknown) => props.onMapChanged?.(event as naver.maps.Map | null)\n : undefined\n },\n {\n eventName: \"path_changed\",\n invoke: props.onPathChanged\n ? (event: unknown) =>\n props.onPathChanged?.(\n event as\n | naver.maps.ArrayOfCoords\n | naver.maps.KVOArrayOfCoords\n | naver.maps.ArrayOfCoordsLiteral\n )\n : undefined\n },\n {\n eventName: \"paths_changed\",\n invoke: props.onPathsChanged\n ? (event: unknown) =>\n props.onPathsChanged?.(\n event as\n | naver.maps.ArrayOfCoords[]\n | naver.maps.KVOArray<naver.maps.KVOArrayOfCoords>\n | naver.maps.ArrayOfCoordsLiteral[]\n )\n : undefined\n },\n {\n eventName: \"strokeColor_changed\",\n invoke: props.onStrokeColorChanged\n ? (event: unknown) => props.onStrokeColorChanged?.(event as string)\n : undefined\n },\n {\n eventName: \"strokeLineCap_changed\",\n invoke: props.onStrokeLineCapChanged\n ? (event: unknown) => props.onStrokeLineCapChanged?.(event as naver.maps.StrokeLineCapType)\n : undefined\n },\n {\n eventName: \"strokeLineJoin_changed\",\n invoke: props.onStrokeLineJoinChanged\n ? (event: unknown) =>\n props.onStrokeLineJoinChanged?.(event as naver.maps.StrokeLineJoinType)\n : undefined\n },\n {\n eventName: \"strokeOpacity_changed\",\n invoke: props.onStrokeOpacityChanged\n ? (event: unknown) => props.onStrokeOpacityChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"strokeStyle_changed\",\n invoke: props.onStrokeStyleChanged\n ? (event: unknown) => props.onStrokeStyleChanged?.(event as naver.maps.StrokeStyleType)\n : undefined\n },\n {\n eventName: \"strokeWeight_changed\",\n invoke: props.onStrokeWeightChanged\n ? (event: unknown) => props.onStrokeWeightChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"visible_changed\",\n invoke: props.onVisibleChanged\n ? (event: unknown) => props.onVisibleChanged?.(event as boolean)\n : undefined\n },\n {\n eventName: \"zIndex_changed\",\n invoke: props.onZIndexChanged\n ? (event: unknown) => props.onZIndexChanged?.(event as number)\n : undefined\n }\n ];\n}\n\nexport const Polygon = forwardRef<PolygonRef, PolygonProps>(function PolygonInner(props, ref) {\n const { map: contextMap, sdkStatus } = useNaverMap();\n const polygonRef = useRef<naver.maps.Polygon | null>(null);\n const polygonEventListenersRef = useRef<naver.maps.MapEventListener[]>([]);\n const onPolygonDestroyRef = useRef<PolygonProps[\"onPolygonDestroy\"]>(props.onPolygonDestroy);\n const targetMap = props.map ?? contextMap;\n\n useEffect(() => {\n onPolygonDestroyRef.current = props.onPolygonDestroy;\n }, [props.onPolygonDestroy]);\n\n const invokePolygonMethod = useCallback(\n <K extends keyof naver.maps.Polygon>(\n methodName: K,\n ...args: Parameters<Extract<naver.maps.Polygon[K], (...params: never[]) => unknown>>\n ): ReturnType<Extract<naver.maps.Polygon[K], (...params: never[]) => unknown>> | undefined => {\n const polygon = polygonRef.current;\n\n if (!polygon) {\n return undefined;\n }\n\n const method = polygon[methodName] as unknown;\n\n if (typeof method !== \"function\") {\n return undefined;\n }\n\n return (method as (...params: unknown[]) => unknown).apply(polygon, args) as ReturnType<\n Extract<naver.maps.Polygon[K], (...params: never[]) => unknown>\n >;\n },\n []\n );\n\n const teardownPolygon = useCallback(() => {\n const polygon = polygonRef.current;\n\n if (!polygon) {\n return;\n }\n\n try {\n removeOverlayEventListeners(polygonEventListenersRef.current);\n polygonEventListenersRef.current = [];\n naver.maps.Event.clearInstanceListeners(polygon);\n } catch (error) {\n console.error(\"[react-naver-maps-kit] failed to clear polygon listeners\", error);\n }\n\n polygon.setMap(null);\n polygonRef.current = null;\n onPolygonDestroyRef.current?.();\n }, []);\n\n useImperativeHandle(\n ref,\n (): PolygonRef => ({\n getInstance: () => polygonRef.current,\n getAreaSize: (...args) => invokePolygonMethod(\"getAreaSize\", ...args),\n getBounds: (...args) => invokePolygonMethod(\"getBounds\", ...args),\n getClickable: (...args) => invokePolygonMethod(\"getClickable\", ...args),\n getDrawingRect: (...args) => invokePolygonMethod(\"getDrawingRect\", ...args),\n getElement: (...args) => invokePolygonMethod(\"getElement\", ...args),\n getMap: (...args) => invokePolygonMethod(\"getMap\", ...args),\n getOptions: (...args) => invokePolygonMethod(\"getOptions\", ...args),\n getPanes: (...args) => invokePolygonMethod(\"getPanes\", ...args),\n getPath: (...args) => invokePolygonMethod(\"getPath\", ...args),\n getPaths: (...args) => invokePolygonMethod(\"getPaths\", ...args),\n getProjection: (...args) => invokePolygonMethod(\"getProjection\", ...args),\n getStyles: (...args) => invokePolygonMethod(\"getStyles\", ...args),\n getVisible: (...args) => invokePolygonMethod(\"getVisible\", ...args),\n getZIndex: (...args) => invokePolygonMethod(\"getZIndex\", ...args),\n setClickable: (...args) => invokePolygonMethod(\"setClickable\", ...args),\n setMap: (...args) => invokePolygonMethod(\"setMap\", ...args),\n setOptions: (...args) => invokePolygonMethod(\"setOptions\", ...args),\n setPath: (...args) => invokePolygonMethod(\"setPath\", ...args),\n setPaths: (...args) => invokePolygonMethod(\"setPaths\", ...args),\n setStyles: (...args) => invokePolygonMethod(\"setStyles\", ...args),\n setVisible: (...args) => invokePolygonMethod(\"setVisible\", ...args),\n setZIndex: (...args) => invokePolygonMethod(\"setZIndex\", ...args)\n }),\n [invokePolygonMethod]\n );\n\n useEffect(() => {\n if (sdkStatus !== \"ready\" || !targetMap || polygonRef.current) {\n return;\n }\n\n try {\n const polygon = new naver.maps.Polygon(toPolygonOptions(props, targetMap));\n\n polygonRef.current = polygon;\n bindOverlayEventListeners(\n polygon,\n polygonEventListenersRef,\n buildPolygonEventBindings(props)\n );\n props.onPolygonReady?.(polygon);\n } catch (error) {\n const normalizedError =\n error instanceof Error ? error : new Error(\"Failed to create naver.maps.Polygon instance.\");\n\n props.onPolygonError?.(normalizedError);\n }\n }, [props, sdkStatus, targetMap]);\n\n useEffect(() => {\n const polygon = polygonRef.current;\n\n if (!polygon || !targetMap) {\n return;\n }\n\n polygon.setOptions(toPolygonOptions(props, targetMap));\n }, [props, targetMap]);\n\n useEffect(() => {\n const polygon = polygonRef.current;\n\n if (!polygon) {\n return;\n }\n\n bindOverlayEventListeners(polygon, polygonEventListenersRef, buildPolygonEventBindings(props));\n\n return () => {\n removeOverlayEventListeners(polygonEventListenersRef.current);\n polygonEventListenersRef.current = [];\n };\n }, [props]);\n\n useEffect(() => {\n return () => {\n teardownPolygon();\n };\n }, [teardownPolygon]);\n\n return null;\n});\n\nPolygon.displayName = \"Polygon\";\n","import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef } from \"react\";\n\nimport { useNaverMap } from \"../../react/hooks/useNaverMap\";\nimport { bindOverlayEventListeners, removeOverlayEventListeners } from \"../shared/overlayUtils\";\n\ntype PolylineOptions = naver.maps.PolylineOptions;\n\ninterface PolylineOptionProps {\n map?: naver.maps.Map | null;\n path: PolylineOptions[\"path\"];\n strokeWeight?: PolylineOptions[\"strokeWeight\"];\n strokeOpacity?: PolylineOptions[\"strokeOpacity\"];\n strokeColor?: PolylineOptions[\"strokeColor\"];\n strokeStyle?: PolylineOptions[\"strokeStyle\"];\n strokeLineCap?: PolylineOptions[\"strokeLineCap\"];\n strokeLineJoin?: PolylineOptions[\"strokeLineJoin\"];\n clickable?: PolylineOptions[\"clickable\"];\n visible?: PolylineOptions[\"visible\"];\n zIndex?: PolylineOptions[\"zIndex\"];\n startIcon?: PolylineOptions[\"startIcon\"];\n startIconSize?: PolylineOptions[\"startIconSize\"];\n endIcon?: PolylineOptions[\"endIcon\"];\n endIconSize?: PolylineOptions[\"endIconSize\"];\n}\n\ninterface PolylineLifecycleProps {\n onPolylineReady?: (polyline: naver.maps.Polyline) => void;\n onPolylineDestroy?: () => void;\n onPolylineError?: (error: Error) => void;\n}\n\ninterface PolylineEventProps {\n onClick?: (event: naver.maps.PointerEvent) => void;\n onDblClick?: (event: naver.maps.PointerEvent) => void;\n onMouseDown?: (event: naver.maps.PointerEvent) => void;\n onMouseMove?: (event: naver.maps.PointerEvent) => void;\n onMouseOut?: (event: naver.maps.PointerEvent) => void;\n onMouseOver?: (event: naver.maps.PointerEvent) => void;\n onMouseUp?: (event: naver.maps.PointerEvent) => void;\n onRightClick?: (event: naver.maps.PointerEvent) => void;\n onTouchStart?: (event: naver.maps.PointerEvent) => void;\n onTouchMove?: (event: naver.maps.PointerEvent) => void;\n onTouchEnd?: (event: naver.maps.PointerEvent) => void;\n onClickableChanged?: (clickable: boolean) => void;\n onEndIconChanged?: (icon: naver.maps.PointingIcon) => void;\n onEndIconSizeChanged?: (size: number) => void;\n onMapChanged?: (map: naver.maps.Map | null) => void;\n onPathChanged?: (\n path: naver.maps.ArrayOfCoords | naver.maps.KVOArrayOfCoords | naver.maps.ArrayOfCoordsLiteral\n ) => void;\n onStartIconChanged?: (icon: naver.maps.PointingIcon) => void;\n onStartIconSizeChanged?: (size: number) => void;\n onStrokeColorChanged?: (strokeColor: string) => void;\n onStrokeLineCapChanged?: (strokeLineCap: naver.maps.StrokeLineCapType) => void;\n onStrokeLineJoinChanged?: (strokeLineJoin: naver.maps.StrokeLineJoinType) => void;\n onStrokeOpacityChanged?: (strokeOpacity: number) => void;\n onStrokeStyleChanged?: (strokeStyle: naver.maps.StrokeStyleType) => void;\n onStrokeWeightChanged?: (strokeWeight: number) => void;\n onVisibleChanged?: (visible: boolean) => void;\n onZIndexChanged?: (zIndex: number) => void;\n}\n\nexport type PolylineProps = PolylineOptionProps & PolylineLifecycleProps & PolylineEventProps;\n\ntype PolylineMethod<K extends keyof naver.maps.Polyline> = naver.maps.Polyline[K] extends (\n ...args: infer A\n) => infer R\n ? (...args: A) => R | undefined\n : never;\n\nexport interface PolylineRef {\n getInstance: () => naver.maps.Polyline | null;\n getBounds: PolylineMethod<\"getBounds\">;\n getClickable: PolylineMethod<\"getClickable\">;\n getDistance: PolylineMethod<\"getDistance\">;\n getDrawingRect: PolylineMethod<\"getDrawingRect\">;\n getElement: PolylineMethod<\"getElement\">;\n getMap: PolylineMethod<\"getMap\">;\n getOptions: PolylineMethod<\"getOptions\">;\n getPanes: PolylineMethod<\"getPanes\">;\n getPath: PolylineMethod<\"getPath\">;\n getProjection: PolylineMethod<\"getProjection\">;\n getStyles: PolylineMethod<\"getStyles\">;\n getVisible: PolylineMethod<\"getVisible\">;\n getZIndex: PolylineMethod<\"getZIndex\">;\n setClickable: PolylineMethod<\"setClickable\">;\n setMap: PolylineMethod<\"setMap\">;\n setOptions: PolylineMethod<\"setOptions\">;\n setPath: PolylineMethod<\"setPath\">;\n setStyles: PolylineMethod<\"setStyles\">;\n setVisible: PolylineMethod<\"setVisible\">;\n setZIndex: PolylineMethod<\"setZIndex\">;\n}\n\nfunction toPolylineOptions(\n props: PolylineProps,\n targetMap: naver.maps.Map | null\n): PolylineOptions {\n const options: PolylineOptions = {\n path: props.path\n };\n\n if (targetMap) {\n options.map = targetMap;\n }\n\n if (props.strokeWeight !== undefined) {\n options.strokeWeight = props.strokeWeight;\n }\n\n if (props.strokeOpacity !== undefined) {\n options.strokeOpacity = props.strokeOpacity;\n }\n\n if (props.strokeColor !== undefined) {\n options.strokeColor = props.strokeColor;\n }\n\n if (props.strokeStyle !== undefined) {\n options.strokeStyle = props.strokeStyle;\n }\n\n if (props.strokeLineCap !== undefined) {\n options.strokeLineCap = props.strokeLineCap;\n }\n\n if (props.strokeLineJoin !== undefined) {\n options.strokeLineJoin = props.strokeLineJoin;\n }\n\n if (props.clickable !== undefined) {\n options.clickable = props.clickable;\n }\n\n if (props.visible !== undefined) {\n options.visible = props.visible;\n }\n\n if (props.zIndex !== undefined) {\n options.zIndex = props.zIndex;\n }\n\n if (props.startIcon !== undefined) {\n options.startIcon = props.startIcon;\n }\n\n if (props.startIconSize !== undefined) {\n options.startIconSize = props.startIconSize;\n }\n\n if (props.endIcon !== undefined) {\n options.endIcon = props.endIcon;\n }\n\n if (props.endIconSize !== undefined) {\n options.endIconSize = props.endIconSize;\n }\n\n return options;\n}\n\nfunction buildPolylineEventBindings(props: PolylineProps) {\n return [\n {\n eventName: \"click\",\n invoke: props.onClick\n ? (event: unknown) => props.onClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"dblclick\",\n invoke: props.onDblClick\n ? (event: unknown) => props.onDblClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mousedown\",\n invoke: props.onMouseDown\n ? (event: unknown) => props.onMouseDown?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mousemove\",\n invoke: props.onMouseMove\n ? (event: unknown) => props.onMouseMove?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseout\",\n invoke: props.onMouseOut\n ? (event: unknown) => props.onMouseOut?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseover\",\n invoke: props.onMouseOver\n ? (event: unknown) => props.onMouseOver?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseup\",\n invoke: props.onMouseUp\n ? (event: unknown) => props.onMouseUp?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"rightclick\",\n invoke: props.onRightClick\n ? (event: unknown) => props.onRightClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchstart\",\n invoke: props.onTouchStart\n ? (event: unknown) => props.onTouchStart?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchmove\",\n invoke: props.onTouchMove\n ? (event: unknown) => props.onTouchMove?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchend\",\n invoke: props.onTouchEnd\n ? (event: unknown) => props.onTouchEnd?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"clickable_changed\",\n invoke: props.onClickableChanged\n ? (event: unknown) => props.onClickableChanged?.(event as boolean)\n : undefined\n },\n {\n eventName: \"endIcon_changed\",\n invoke: props.onEndIconChanged\n ? (event: unknown) => props.onEndIconChanged?.(event as naver.maps.PointingIcon)\n : undefined\n },\n {\n eventName: \"endIconSize_changed\",\n invoke: props.onEndIconSizeChanged\n ? (event: unknown) => props.onEndIconSizeChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"map_changed\",\n invoke: props.onMapChanged\n ? (event: unknown) => props.onMapChanged?.(event as naver.maps.Map | null)\n : undefined\n },\n {\n eventName: \"path_changed\",\n invoke: props.onPathChanged\n ? (event: unknown) =>\n props.onPathChanged?.(\n event as\n | naver.maps.ArrayOfCoords\n | naver.maps.KVOArrayOfCoords\n | naver.maps.ArrayOfCoordsLiteral\n )\n : undefined\n },\n {\n eventName: \"startIcon_changed\",\n invoke: props.onStartIconChanged\n ? (event: unknown) => props.onStartIconChanged?.(event as naver.maps.PointingIcon)\n : undefined\n },\n {\n eventName: \"startIconSize_changed\",\n invoke: props.onStartIconSizeChanged\n ? (event: unknown) => props.onStartIconSizeChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"strokeColor_changed\",\n invoke: props.onStrokeColorChanged\n ? (event: unknown) => props.onStrokeColorChanged?.(event as string)\n : undefined\n },\n {\n eventName: \"strokeLineCap_changed\",\n invoke: props.onStrokeLineCapChanged\n ? (event: unknown) => props.onStrokeLineCapChanged?.(event as naver.maps.StrokeLineCapType)\n : undefined\n },\n {\n eventName: \"strokeLineJoin_changed\",\n invoke: props.onStrokeLineJoinChanged\n ? (event: unknown) =>\n props.onStrokeLineJoinChanged?.(event as naver.maps.StrokeLineJoinType)\n : undefined\n },\n {\n eventName: \"strokeOpacity_changed\",\n invoke: props.onStrokeOpacityChanged\n ? (event: unknown) => props.onStrokeOpacityChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"strokeStyle_changed\",\n invoke: props.onStrokeStyleChanged\n ? (event: unknown) => props.onStrokeStyleChanged?.(event as naver.maps.StrokeStyleType)\n : undefined\n },\n {\n eventName: \"strokeWeight_changed\",\n invoke: props.onStrokeWeightChanged\n ? (event: unknown) => props.onStrokeWeightChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"visible_changed\",\n invoke: props.onVisibleChanged\n ? (event: unknown) => props.onVisibleChanged?.(event as boolean)\n : undefined\n },\n {\n eventName: \"zIndex_changed\",\n invoke: props.onZIndexChanged\n ? (event: unknown) => props.onZIndexChanged?.(event as number)\n : undefined\n }\n ];\n}\n\nexport const Polyline = forwardRef<PolylineRef, PolylineProps>(function PolylineInner(props, ref) {\n const { map: contextMap, sdkStatus } = useNaverMap();\n const polylineRef = useRef<naver.maps.Polyline | null>(null);\n const polylineEventListenersRef = useRef<naver.maps.MapEventListener[]>([]);\n const onPolylineDestroyRef = useRef<PolylineProps[\"onPolylineDestroy\"]>(props.onPolylineDestroy);\n const targetMap = props.map ?? contextMap;\n\n useEffect(() => {\n onPolylineDestroyRef.current = props.onPolylineDestroy;\n }, [props.onPolylineDestroy]);\n\n const invokePolylineMethod = useCallback(\n <K extends keyof naver.maps.Polyline>(\n methodName: K,\n ...args: Parameters<Extract<naver.maps.Polyline[K], (...params: never[]) => unknown>>\n ): ReturnType<Extract<naver.maps.Polyline[K], (...params: never[]) => unknown>> | undefined => {\n const polyline = polylineRef.current;\n\n if (!polyline) {\n return undefined;\n }\n\n const method = polyline[methodName] as unknown;\n\n if (typeof method !== \"function\") {\n return undefined;\n }\n\n return (method as (...params: unknown[]) => unknown).apply(polyline, args) as ReturnType<\n Extract<naver.maps.Polyline[K], (...params: never[]) => unknown>\n >;\n },\n []\n );\n\n const teardownPolyline = useCallback(() => {\n const polyline = polylineRef.current;\n\n if (!polyline) {\n return;\n }\n\n try {\n removeOverlayEventListeners(polylineEventListenersRef.current);\n polylineEventListenersRef.current = [];\n naver.maps.Event.clearInstanceListeners(polyline);\n } catch (error) {\n console.error(\"[react-naver-maps-kit] failed to clear polyline listeners\", error);\n }\n\n polyline.setMap(null);\n polylineRef.current = null;\n onPolylineDestroyRef.current?.();\n }, []);\n\n useImperativeHandle(\n ref,\n (): PolylineRef => ({\n getInstance: () => polylineRef.current,\n getBounds: (...args) => invokePolylineMethod(\"getBounds\", ...args),\n getClickable: (...args) => invokePolylineMethod(\"getClickable\", ...args),\n getDistance: (...args) => invokePolylineMethod(\"getDistance\", ...args),\n getDrawingRect: (...args) => invokePolylineMethod(\"getDrawingRect\", ...args),\n getElement: (...args) => invokePolylineMethod(\"getElement\", ...args),\n getMap: (...args) => invokePolylineMethod(\"getMap\", ...args),\n getOptions: (...args) => invokePolylineMethod(\"getOptions\", ...args),\n getPanes: (...args) => invokePolylineMethod(\"getPanes\", ...args),\n getPath: (...args) => invokePolylineMethod(\"getPath\", ...args),\n getProjection: (...args) => invokePolylineMethod(\"getProjection\", ...args),\n getStyles: (...args) => invokePolylineMethod(\"getStyles\", ...args),\n getVisible: (...args) => invokePolylineMethod(\"getVisible\", ...args),\n getZIndex: (...args) => invokePolylineMethod(\"getZIndex\", ...args),\n setClickable: (...args) => invokePolylineMethod(\"setClickable\", ...args),\n setMap: (...args) => invokePolylineMethod(\"setMap\", ...args),\n setOptions: (...args) => invokePolylineMethod(\"setOptions\", ...args),\n setPath: (...args) => invokePolylineMethod(\"setPath\", ...args),\n setStyles: (...args) => invokePolylineMethod(\"setStyles\", ...args),\n setVisible: (...args) => invokePolylineMethod(\"setVisible\", ...args),\n setZIndex: (...args) => invokePolylineMethod(\"setZIndex\", ...args)\n }),\n [invokePolylineMethod]\n );\n\n useEffect(() => {\n if (sdkStatus !== \"ready\" || !targetMap || polylineRef.current) {\n return;\n }\n\n try {\n const polyline = new naver.maps.Polyline(toPolylineOptions(props, targetMap));\n\n polylineRef.current = polyline;\n bindOverlayEventListeners(\n polyline,\n polylineEventListenersRef,\n buildPolylineEventBindings(props)\n );\n props.onPolylineReady?.(polyline);\n } catch (error) {\n const normalizedError =\n error instanceof Error\n ? error\n : new Error(\"Failed to create naver.maps.Polyline instance.\");\n\n props.onPolylineError?.(normalizedError);\n }\n }, [props, sdkStatus, targetMap]);\n\n useEffect(() => {\n const polyline = polylineRef.current;\n\n if (!polyline || !targetMap) {\n return;\n }\n\n polyline.setOptions(toPolylineOptions(props, targetMap));\n }, [props, targetMap]);\n\n useEffect(() => {\n const polyline = polylineRef.current;\n\n if (!polyline) {\n return;\n }\n\n bindOverlayEventListeners(\n polyline,\n polylineEventListenersRef,\n buildPolylineEventBindings(props)\n );\n\n return () => {\n removeOverlayEventListeners(polylineEventListenersRef.current);\n polylineEventListenersRef.current = [];\n };\n }, [props]);\n\n useEffect(() => {\n return () => {\n teardownPolyline();\n };\n }, [teardownPolyline]);\n\n return null;\n});\n\nPolyline.displayName = \"Polyline\";\n","import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef } from \"react\";\n\nimport { useNaverMap } from \"../../react/hooks/useNaverMap\";\nimport { bindOverlayEventListeners, removeOverlayEventListeners } from \"../shared/overlayUtils\";\n\ntype RectangleOptions = naver.maps.RectangleOptions;\n\ninterface RectangleOptionProps {\n map?: naver.maps.Map | null;\n bounds: RectangleOptions[\"bounds\"];\n strokeWeight?: RectangleOptions[\"strokeWeight\"];\n strokeOpacity?: RectangleOptions[\"strokeOpacity\"];\n strokeColor?: RectangleOptions[\"strokeColor\"];\n strokeStyle?: RectangleOptions[\"strokeStyle\"];\n strokeLineCap?: RectangleOptions[\"strokeLineCap\"];\n strokeLineJoin?: RectangleOptions[\"strokeLineJoin\"];\n fillColor?: RectangleOptions[\"fillColor\"];\n fillOpacity?: RectangleOptions[\"fillOpacity\"];\n clickable?: RectangleOptions[\"clickable\"];\n visible?: RectangleOptions[\"visible\"];\n zIndex?: RectangleOptions[\"zIndex\"];\n}\n\ninterface RectangleLifecycleProps {\n onRectangleReady?: (rectangle: naver.maps.Rectangle) => void;\n onRectangleDestroy?: () => void;\n onRectangleError?: (error: Error) => void;\n}\n\ninterface RectangleEventProps {\n onClick?: (event: naver.maps.PointerEvent) => void;\n onDblClick?: (event: naver.maps.PointerEvent) => void;\n onMouseDown?: (event: naver.maps.PointerEvent) => void;\n onMouseMove?: (event: naver.maps.PointerEvent) => void;\n onMouseOut?: (event: naver.maps.PointerEvent) => void;\n onMouseOver?: (event: naver.maps.PointerEvent) => void;\n onMouseUp?: (event: naver.maps.PointerEvent) => void;\n onRightClick?: (event: naver.maps.PointerEvent) => void;\n onTouchStart?: (event: naver.maps.PointerEvent) => void;\n onTouchMove?: (event: naver.maps.PointerEvent) => void;\n onTouchEnd?: (event: naver.maps.PointerEvent) => void;\n onBoundsChanged?: (bounds: naver.maps.Bounds) => void;\n onClickableChanged?: (clickable: boolean) => void;\n onFillColorChanged?: (fillColor: string) => void;\n onFillOpacityChanged?: (fillOpacity: number) => void;\n onMapChanged?: (map: naver.maps.Map | null) => void;\n onStrokeColorChanged?: (strokeColor: string) => void;\n onStrokeLineCapChanged?: (strokeLineCap: naver.maps.StrokeLineCapType) => void;\n onStrokeLineJoinChanged?: (strokeLineJoin: naver.maps.StrokeLineJoinType) => void;\n onStrokeOpacityChanged?: (strokeOpacity: number) => void;\n onStrokeStyleChanged?: (strokeStyle: naver.maps.StrokeStyleType) => void;\n onStrokeWeightChanged?: (strokeWeight: number) => void;\n onVisibleChanged?: (visible: boolean) => void;\n onZIndexChanged?: (zIndex: number) => void;\n}\n\nexport type RectangleProps = RectangleOptionProps & RectangleLifecycleProps & RectangleEventProps;\n\ntype RectangleMethod<K extends keyof naver.maps.Rectangle> = naver.maps.Rectangle[K] extends (\n ...args: infer A\n) => infer R\n ? (...args: A) => R | undefined\n : never;\n\nexport interface RectangleRef {\n getInstance: () => naver.maps.Rectangle | null;\n getAreaSize: RectangleMethod<\"getAreaSize\">;\n getBounds: RectangleMethod<\"getBounds\">;\n getClickable: RectangleMethod<\"getClickable\">;\n getDrawingRect: RectangleMethod<\"getDrawingRect\">;\n getElement: RectangleMethod<\"getElement\">;\n getMap: RectangleMethod<\"getMap\">;\n getOptions: RectangleMethod<\"getOptions\">;\n getPanes: RectangleMethod<\"getPanes\">;\n getProjection: RectangleMethod<\"getProjection\">;\n getStyles: RectangleMethod<\"getStyles\">;\n getVisible: RectangleMethod<\"getVisible\">;\n getZIndex: RectangleMethod<\"getZIndex\">;\n setBounds: RectangleMethod<\"setBounds\">;\n setClickable: RectangleMethod<\"setClickable\">;\n setMap: RectangleMethod<\"setMap\">;\n setOptions: RectangleMethod<\"setOptions\">;\n setStyles: RectangleMethod<\"setStyles\">;\n setVisible: RectangleMethod<\"setVisible\">;\n setZIndex: RectangleMethod<\"setZIndex\">;\n}\n\nfunction toRectangleOptions(\n props: RectangleProps,\n targetMap: naver.maps.Map | null\n): RectangleOptions {\n const options: RectangleOptions = {\n bounds: props.bounds\n };\n\n if (targetMap) {\n options.map = targetMap;\n }\n\n if (props.strokeWeight !== undefined) {\n options.strokeWeight = props.strokeWeight;\n }\n\n if (props.strokeOpacity !== undefined) {\n options.strokeOpacity = props.strokeOpacity;\n }\n\n if (props.strokeColor !== undefined) {\n options.strokeColor = props.strokeColor;\n }\n\n if (props.strokeStyle !== undefined) {\n options.strokeStyle = props.strokeStyle;\n }\n\n if (props.strokeLineCap !== undefined) {\n options.strokeLineCap = props.strokeLineCap;\n }\n\n if (props.strokeLineJoin !== undefined) {\n options.strokeLineJoin = props.strokeLineJoin;\n }\n\n if (props.fillColor !== undefined) {\n options.fillColor = props.fillColor;\n }\n\n if (props.fillOpacity !== undefined) {\n options.fillOpacity = props.fillOpacity;\n }\n\n if (props.clickable !== undefined) {\n options.clickable = props.clickable;\n }\n\n if (props.visible !== undefined) {\n options.visible = props.visible;\n }\n\n if (props.zIndex !== undefined) {\n options.zIndex = props.zIndex;\n }\n\n return options;\n}\n\nfunction buildRectangleEventBindings(props: RectangleProps) {\n return [\n {\n eventName: \"click\",\n invoke: props.onClick\n ? (event: unknown) => props.onClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"dblclick\",\n invoke: props.onDblClick\n ? (event: unknown) => props.onDblClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mousedown\",\n invoke: props.onMouseDown\n ? (event: unknown) => props.onMouseDown?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mousemove\",\n invoke: props.onMouseMove\n ? (event: unknown) => props.onMouseMove?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseout\",\n invoke: props.onMouseOut\n ? (event: unknown) => props.onMouseOut?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseover\",\n invoke: props.onMouseOver\n ? (event: unknown) => props.onMouseOver?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseup\",\n invoke: props.onMouseUp\n ? (event: unknown) => props.onMouseUp?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"rightclick\",\n invoke: props.onRightClick\n ? (event: unknown) => props.onRightClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchstart\",\n invoke: props.onTouchStart\n ? (event: unknown) => props.onTouchStart?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchmove\",\n invoke: props.onTouchMove\n ? (event: unknown) => props.onTouchMove?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchend\",\n invoke: props.onTouchEnd\n ? (event: unknown) => props.onTouchEnd?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"bounds_changed\",\n invoke: props.onBoundsChanged\n ? (event: unknown) => props.onBoundsChanged?.(event as naver.maps.Bounds)\n : undefined\n },\n {\n eventName: \"clickable_changed\",\n invoke: props.onClickableChanged\n ? (event: unknown) => props.onClickableChanged?.(event as boolean)\n : undefined\n },\n {\n eventName: \"fillColor_changed\",\n invoke: props.onFillColorChanged\n ? (event: unknown) => props.onFillColorChanged?.(event as string)\n : undefined\n },\n {\n eventName: \"fillOpacity_changed\",\n invoke: props.onFillOpacityChanged\n ? (event: unknown) => props.onFillOpacityChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"map_changed\",\n invoke: props.onMapChanged\n ? (event: unknown) => props.onMapChanged?.(event as naver.maps.Map | null)\n : undefined\n },\n {\n eventName: \"strokeColor_changed\",\n invoke: props.onStrokeColorChanged\n ? (event: unknown) => props.onStrokeColorChanged?.(event as string)\n : undefined\n },\n {\n eventName: \"strokeLineCap_changed\",\n invoke: props.onStrokeLineCapChanged\n ? (event: unknown) => props.onStrokeLineCapChanged?.(event as naver.maps.StrokeLineCapType)\n : undefined\n },\n {\n eventName: \"strokeLineJoin_changed\",\n invoke: props.onStrokeLineJoinChanged\n ? (event: unknown) =>\n props.onStrokeLineJoinChanged?.(event as naver.maps.StrokeLineJoinType)\n : undefined\n },\n {\n eventName: \"strokeOpacity_changed\",\n invoke: props.onStrokeOpacityChanged\n ? (event: unknown) => props.onStrokeOpacityChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"strokeStyle_changed\",\n invoke: props.onStrokeStyleChanged\n ? (event: unknown) => props.onStrokeStyleChanged?.(event as naver.maps.StrokeStyleType)\n : undefined\n },\n {\n eventName: \"strokeWeight_changed\",\n invoke: props.onStrokeWeightChanged\n ? (event: unknown) => props.onStrokeWeightChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"visible_changed\",\n invoke: props.onVisibleChanged\n ? (event: unknown) => props.onVisibleChanged?.(event as boolean)\n : undefined\n },\n {\n eventName: \"zIndex_changed\",\n invoke: props.onZIndexChanged\n ? (event: unknown) => props.onZIndexChanged?.(event as number)\n : undefined\n }\n ];\n}\n\nexport const Rectangle = forwardRef<RectangleRef, RectangleProps>(\n function RectangleInner(props, ref) {\n const { map: contextMap, sdkStatus } = useNaverMap();\n const rectangleRef = useRef<naver.maps.Rectangle | null>(null);\n const rectangleEventListenersRef = useRef<naver.maps.MapEventListener[]>([]);\n const onRectangleDestroyRef = useRef<RectangleProps[\"onRectangleDestroy\"]>(\n props.onRectangleDestroy\n );\n const targetMap = props.map ?? contextMap;\n\n useEffect(() => {\n onRectangleDestroyRef.current = props.onRectangleDestroy;\n }, [props.onRectangleDestroy]);\n\n const invokeRectangleMethod = useCallback(\n <K extends keyof naver.maps.Rectangle>(\n methodName: K,\n ...args: Parameters<Extract<naver.maps.Rectangle[K], (...params: never[]) => unknown>>\n ):\n | ReturnType<Extract<naver.maps.Rectangle[K], (...params: never[]) => unknown>>\n | undefined => {\n const rectangle = rectangleRef.current;\n\n if (!rectangle) {\n return undefined;\n }\n\n const method = rectangle[methodName] as unknown;\n\n if (typeof method !== \"function\") {\n return undefined;\n }\n\n return (method as (...params: unknown[]) => unknown).apply(rectangle, args) as ReturnType<\n Extract<naver.maps.Rectangle[K], (...params: never[]) => unknown>\n >;\n },\n []\n );\n\n const teardownRectangle = useCallback(() => {\n const rectangle = rectangleRef.current;\n\n if (!rectangle) {\n return;\n }\n\n try {\n removeOverlayEventListeners(rectangleEventListenersRef.current);\n rectangleEventListenersRef.current = [];\n naver.maps.Event.clearInstanceListeners(rectangle);\n } catch (error) {\n console.error(\"[react-naver-maps-kit] failed to clear rectangle listeners\", error);\n }\n\n rectangle.setMap(null);\n rectangleRef.current = null;\n onRectangleDestroyRef.current?.();\n }, []);\n\n useImperativeHandle(\n ref,\n (): RectangleRef => ({\n getInstance: () => rectangleRef.current,\n getAreaSize: (...args) => invokeRectangleMethod(\"getAreaSize\", ...args),\n getBounds: (...args) => invokeRectangleMethod(\"getBounds\", ...args),\n getClickable: (...args) => invokeRectangleMethod(\"getClickable\", ...args),\n getDrawingRect: (...args) => invokeRectangleMethod(\"getDrawingRect\", ...args),\n getElement: (...args) => invokeRectangleMethod(\"getElement\", ...args),\n getMap: (...args) => invokeRectangleMethod(\"getMap\", ...args),\n getOptions: (...args) => invokeRectangleMethod(\"getOptions\", ...args),\n getPanes: (...args) => invokeRectangleMethod(\"getPanes\", ...args),\n getProjection: (...args) => invokeRectangleMethod(\"getProjection\", ...args),\n getStyles: (...args) => invokeRectangleMethod(\"getStyles\", ...args),\n getVisible: (...args) => invokeRectangleMethod(\"getVisible\", ...args),\n getZIndex: (...args) => invokeRectangleMethod(\"getZIndex\", ...args),\n setBounds: (...args) => invokeRectangleMethod(\"setBounds\", ...args),\n setClickable: (...args) => invokeRectangleMethod(\"setClickable\", ...args),\n setMap: (...args) => invokeRectangleMethod(\"setMap\", ...args),\n setOptions: (...args) => invokeRectangleMethod(\"setOptions\", ...args),\n setStyles: (...args) => invokeRectangleMethod(\"setStyles\", ...args),\n setVisible: (...args) => invokeRectangleMethod(\"setVisible\", ...args),\n setZIndex: (...args) => invokeRectangleMethod(\"setZIndex\", ...args)\n }),\n [invokeRectangleMethod]\n );\n\n useEffect(() => {\n if (sdkStatus !== \"ready\" || !targetMap || rectangleRef.current) {\n return;\n }\n\n try {\n const rectangle = new naver.maps.Rectangle(toRectangleOptions(props, targetMap));\n\n rectangleRef.current = rectangle;\n bindOverlayEventListeners(\n rectangle,\n rectangleEventListenersRef,\n buildRectangleEventBindings(props)\n );\n props.onRectangleReady?.(rectangle);\n } catch (error) {\n const normalizedError =\n error instanceof Error\n ? error\n : new Error(\"Failed to create naver.maps.Rectangle instance.\");\n\n props.onRectangleError?.(normalizedError);\n }\n }, [props, sdkStatus, targetMap]);\n\n useEffect(() => {\n const rectangle = rectangleRef.current;\n\n if (!rectangle || !targetMap) {\n return;\n }\n\n rectangle.setOptions(toRectangleOptions(props, targetMap));\n }, [props, targetMap]);\n\n useEffect(() => {\n const rectangle = rectangleRef.current;\n\n if (!rectangle) {\n return;\n }\n\n bindOverlayEventListeners(\n rectangle,\n rectangleEventListenersRef,\n buildRectangleEventBindings(props)\n );\n\n return () => {\n removeOverlayEventListeners(rectangleEventListenersRef.current);\n rectangleEventListenersRef.current = [];\n };\n }, [props]);\n\n useEffect(() => {\n return () => {\n teardownRectangle();\n };\n }, [teardownRectangle]);\n\n return null;\n }\n);\n\nRectangle.displayName = \"Rectangle\";\n","export type NaverMapKitVersion = \"0.0.1\";\n\nexport const version: NaverMapKitVersion = \"0.0.1\";\n\nexport { loadNaverMapsScript } from \"./core/loader/loadNaverMapsScript\";\nexport type { LoadNaverMapsScriptOptions } from \"./core/loader/loadNaverMapsScript\";\nexport { NaverMapProvider, NaverMapContext } from \"./react/provider/NaverMapProvider\";\nexport { NaverMap } from \"./react/components/NaverMap\";\nexport { Marker } from \"./overlays/marker/Marker\";\nexport { MarkerClusterer } from \"./overlays/marker-clusterer/MarkerClusterer\";\nexport { ClustererContext } from \"./overlays/marker-clusterer/ClustererContext\";\nexport { InfoWindow } from \"./overlays/infowindow/InfoWindow\";\nexport { Circle } from \"./overlays/circle/Circle\";\nexport { Ellipse } from \"./overlays/ellipse/Ellipse\";\nexport { GroundOverlay } from \"./overlays/ground-overlay/GroundOverlay\";\nexport { Polygon } from \"./overlays/polygon/Polygon\";\nexport { Polyline } from \"./overlays/polyline/Polyline\";\nexport { Rectangle } from \"./overlays/rectangle/Rectangle\";\nexport { useNaverMap, useNaverMapInstance } from \"./react/hooks/useNaverMap\";\nexport type {\n NaverMapContextValue,\n NaverMapProviderProps,\n NaverMapSdkStatus\n} from \"./react/provider/NaverMapProvider\";\nexport type { NaverMapProps } from \"./react/components/NaverMap\";\nexport type { NaverMapRef } from \"./react/components/NaverMap\";\nexport type { MarkerProps } from \"./overlays/marker/Marker\";\nexport type { MarkerRef } from \"./overlays/marker/Marker\";\nexport type {\n ItemRecord,\n Cluster,\n AlgorithmContext,\n ClusterAlgorithm,\n BuiltInAlgorithmConfig,\n ClusterIconRenderer,\n MarkerClustererHelpers,\n MarkerClustererProps\n} from \"./overlays/marker-clusterer/types\";\nexport type { ClustererRegistry } from \"./overlays/marker-clusterer/ClustererContext\";\nexport type { InfoWindowProps } from \"./overlays/infowindow/InfoWindow\";\nexport type { InfoWindowRef } from \"./overlays/infowindow/InfoWindow\";\nexport type { CircleProps } from \"./overlays/circle/Circle\";\nexport type { CircleRef } from \"./overlays/circle/Circle\";\nexport type { EllipseProps } from \"./overlays/ellipse/Ellipse\";\nexport type { EllipseRef } from \"./overlays/ellipse/Ellipse\";\nexport type { GroundOverlayProps } from \"./overlays/ground-overlay/GroundOverlay\";\nexport type { GroundOverlayRef } from \"./overlays/ground-overlay/GroundOverlay\";\nexport type { PolygonProps } from \"./overlays/polygon/Polygon\";\nexport type { PolygonRef } from \"./overlays/polygon/Polygon\";\nexport type { PolylineProps } from \"./overlays/polyline/Polyline\";\nexport type { PolylineRef } from \"./overlays/polyline/Polyline\";\nexport type { RectangleProps } from \"./overlays/rectangle/Rectangle\";\nexport type { RectangleRef } from \"./overlays/rectangle/Rectangle\";\nexport type { UseNaverMapOptions } from \"./react/hooks/useNaverMap\";\n"],"x_google_ignoreList":[8,9],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["DEFAULT_OPTIONS","DEFAULT_OPTIONS","require"],"sources":["../src/core/loader/loadNaverMapsScript.ts","../src/react/provider/NaverMapProvider.tsx","../src/react/components/NaverMap.tsx","../src/react/hooks/useNaverMap.ts","../src/overlays/marker-clusterer/ClustererContext.ts","../src/overlays/marker/Marker.tsx","../src/overlays/marker-clusterer/algorithms/grid.ts","../src/overlays/marker-clusterer/algorithms/radius.ts","../../../node_modules/.pnpm/kdbush@4.0.2/node_modules/kdbush/index.js","../../../node_modules/.pnpm/supercluster@8.0.1/node_modules/supercluster/index.js","../src/overlays/marker-clusterer/algorithms/supercluster.ts","../src/overlays/marker-clusterer/algorithms/createAlgorithm.ts","../src/overlays/marker-clusterer/MarkerClusterer.tsx","../src/overlays/infowindow/InfoWindow.tsx","../src/overlays/shared/overlayUtils.ts","../src/overlays/circle/Circle.tsx","../src/overlays/ellipse/Ellipse.tsx","../src/overlays/ground-overlay/GroundOverlay.tsx","../src/overlays/polygon/Polygon.tsx","../src/overlays/polyline/Polyline.tsx","../src/overlays/rectangle/Rectangle.tsx","../src/overlays/data/GeoJson.tsx","../src/overlays/data/Gpx.tsx","../../../node_modules/.pnpm/fflate@0.8.2/node_modules/fflate/esm/index.mjs","../src/overlays/data/Kmz.tsx","../src/index.ts"],"sourcesContent":["const NAVER_MAPS_SCRIPT_BASE_URL = \"https://oapi.map.naver.com/openapi/v3/maps.js\";\n\ntype LegacyClientIdParam = \"ncpClientId\" | \"govClientId\" | \"finClientId\";\n\ntype Submodule = \"geocoder\" | \"panorama\" | \"drawing\" | \"visualization\";\n\nexport interface LoadNaverMapsScriptOptions {\n ncpKeyId?: string;\n ncpClientId?: string;\n govClientId?: string;\n finClientId?: string;\n submodules?: Array<Submodule>;\n timeoutMs?: number;\n nonce?: string;\n}\n\ntype BrowserWindow = Window & {\n naver?: {\n maps?: unknown;\n };\n navermap_authFailure?: () => void;\n};\n\nlet inFlightLoad: Promise<void> | null = null;\nlet inFlightScriptUrl: string | null = null;\n\nfunction getClientKey(options: LoadNaverMapsScriptOptions): { param: string; value: string } {\n if (options.ncpKeyId) {\n return { param: \"ncpKeyId\", value: options.ncpKeyId };\n }\n\n const legacyPairs: Array<{ param: LegacyClientIdParam; value?: string }> = [\n { param: \"ncpClientId\", value: options.ncpClientId },\n { param: \"govClientId\", value: options.govClientId },\n { param: \"finClientId\", value: options.finClientId }\n ];\n\n const legacy = legacyPairs.find((candidate) => Boolean(candidate.value));\n\n if (legacy?.value) {\n return { param: legacy.param, value: legacy.value };\n }\n\n throw new Error(\n \"loadNaverMapsScript requires ncpKeyId. For backward compatibility, ncpClientId, govClientId, or finClientId can be provided.\"\n );\n}\n\nfunction isNaverMapsReady(): boolean {\n if (typeof window === \"undefined\") {\n return false;\n }\n\n const browserWindow = window as BrowserWindow;\n\n return Boolean(browserWindow.naver?.maps);\n}\n\nfunction createScriptUrl(options: LoadNaverMapsScriptOptions): string {\n const clientKey = getClientKey(options);\n const params = new URLSearchParams();\n\n params.set(clientKey.param, clientKey.value);\n\n if (options.submodules && options.submodules.length > 0) {\n params.set(\"submodules\", options.submodules.join(\",\"));\n }\n\n return `${NAVER_MAPS_SCRIPT_BASE_URL}?${params.toString()}`;\n}\n\nfunction waitForNaverMapsReady(timeoutMs: number): Promise<void> {\n return new Promise((resolve, reject) => {\n if (isNaverMapsReady()) {\n resolve();\n return;\n }\n\n const startedAt = Date.now();\n const intervalId = setInterval(() => {\n if (isNaverMapsReady()) {\n clearInterval(intervalId);\n resolve();\n return;\n }\n\n if (Date.now() - startedAt >= timeoutMs) {\n clearInterval(intervalId);\n reject(new Error(`Timed out after ${timeoutMs}ms while waiting for window.naver.maps.`));\n }\n }, 50);\n });\n}\n\nfunction attachAuthFailureHandler(reject: (error: Error) => void): () => void {\n const browserWindow = window as BrowserWindow;\n const previousAuthFailure = browserWindow.navermap_authFailure;\n\n browserWindow.navermap_authFailure = () => {\n reject(\n new Error(\"Naver Maps authentication failed. Check your client key and allowed domains.\")\n );\n\n if (previousAuthFailure) {\n previousAuthFailure();\n }\n };\n\n return () => {\n browserWindow.navermap_authFailure = previousAuthFailure;\n };\n}\n\nexport function loadNaverMapsScript(options: LoadNaverMapsScriptOptions): Promise<void> {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return Promise.reject(new Error(\"loadNaverMapsScript can only run in a browser environment.\"));\n }\n\n if (isNaverMapsReady()) {\n return Promise.resolve();\n }\n\n const scriptUrl = createScriptUrl(options);\n\n if (inFlightLoad && inFlightScriptUrl === scriptUrl) {\n return inFlightLoad;\n }\n\n const existingScript = document.querySelector<HTMLScriptElement>(`script[src=\"${scriptUrl}\"]`);\n\n if (existingScript) {\n const trackedPromise = new Promise<void>((resolve, reject) => {\n const existingScriptWithState = existingScript as HTMLScriptElement & { readyState?: string };\n const timeoutMs = options.timeoutMs ?? 10000;\n const restoreAuthFailure = attachAuthFailureHandler(reject);\n const timeoutId = setTimeout(() => {\n restoreAuthFailure();\n reject(new Error(`Timed out after ${timeoutMs}ms while waiting for Naver Maps script.`));\n }, timeoutMs);\n\n const cleanup = () => {\n clearTimeout(timeoutId);\n restoreAuthFailure();\n };\n\n const handleReady = () => {\n waitForNaverMapsReady(timeoutMs)\n .then(() => {\n cleanup();\n resolve();\n })\n .catch((error) => {\n cleanup();\n reject(error instanceof Error ? error : new Error(\"Naver Maps is not ready.\"));\n });\n };\n\n const onLoad = () => {\n handleReady();\n };\n\n const onError = () => {\n cleanup();\n reject(new Error(\"Failed to load Naver Maps script.\"));\n };\n\n if (existingScript.dataset.reactNaverMapsKitLoaded === \"true\") {\n handleReady();\n return;\n }\n\n if (\n existingScriptWithState.readyState === \"loaded\" ||\n existingScriptWithState.readyState === \"complete\"\n ) {\n handleReady();\n return;\n }\n\n existingScript.addEventListener(\"load\", onLoad, { once: true });\n existingScript.addEventListener(\"error\", onError, { once: true });\n }).finally(() => {\n inFlightLoad = null;\n inFlightScriptUrl = null;\n });\n\n inFlightLoad = trackedPromise;\n inFlightScriptUrl = scriptUrl;\n return trackedPromise;\n }\n\n const trackedPromise = new Promise<void>((resolve, reject) => {\n const timeoutMs = options.timeoutMs ?? 10000;\n const script = document.createElement(\"script\");\n const restoreAuthFailure = attachAuthFailureHandler(reject);\n const timeoutId = setTimeout(() => {\n cleanup();\n script.remove();\n reject(new Error(`Timed out after ${timeoutMs}ms while loading Naver Maps script.`));\n }, timeoutMs);\n\n const cleanup = () => {\n script.removeEventListener(\"load\", onLoad);\n script.removeEventListener(\"error\", onError);\n clearTimeout(timeoutId);\n restoreAuthFailure();\n };\n\n const onLoad = () => {\n script.dataset.reactNaverMapsKitLoaded = \"true\";\n\n waitForNaverMapsReady(timeoutMs)\n .then(() => {\n cleanup();\n resolve();\n })\n .catch((error) => {\n cleanup();\n reject(error instanceof Error ? error : new Error(\"Naver Maps is not ready.\"));\n });\n };\n\n const onError = () => {\n cleanup();\n reject(new Error(\"Failed to load Naver Maps script.\"));\n };\n\n script.src = scriptUrl;\n script.setAttribute(\"data-react-naver-maps-kit\", \"true\");\n script.type = \"text/javascript\";\n script.async = true;\n script.defer = true;\n\n if (options.nonce) {\n script.nonce = options.nonce;\n }\n\n script.addEventListener(\"load\", onLoad);\n script.addEventListener(\"error\", onError);\n\n document.head.append(script);\n }).finally(() => {\n inFlightLoad = null;\n inFlightScriptUrl = null;\n });\n\n inFlightLoad = trackedPromise;\n inFlightScriptUrl = scriptUrl;\n\n return trackedPromise;\n}\n","import { createContext, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport {\n loadNaverMapsScript,\n type LoadNaverMapsScriptOptions\n} from \"../../core/loader/loadNaverMapsScript\";\n\nimport type { ReactNode } from \"react\";\n\ntype BrowserWindow = Window & {\n navermap_authFailure?: () => void;\n};\n\nexport type NaverMapSdkStatus = \"idle\" | \"loading\" | \"ready\" | \"error\";\n\nexport interface NaverMapContextValue {\n sdkStatus: NaverMapSdkStatus;\n sdkError: Error | null;\n map: naver.maps.Map | null;\n setMap: (map: naver.maps.Map | null) => void;\n reloadSdk: () => Promise<void>;\n retrySdk: () => Promise<void>;\n clearSdkError: () => void;\n}\n\nexport interface NaverMapProviderProps extends LoadNaverMapsScriptOptions {\n children: ReactNode;\n autoLoad?: boolean;\n onReady?: () => void;\n onError?: (error: Error) => void;\n}\n\nexport const NaverMapContext = createContext<NaverMapContextValue | null>(null);\n\nexport function NaverMapProvider({\n children,\n autoLoad = true,\n onReady,\n onError,\n ncpKeyId,\n ncpClientId,\n govClientId,\n finClientId,\n submodules,\n timeoutMs,\n nonce\n}: NaverMapProviderProps) {\n const [sdkStatus, setSdkStatus] = useState<NaverMapSdkStatus>(\"idle\");\n const [sdkError, setSdkError] = useState<Error | null>(null);\n const [map, setMap] = useState<naver.maps.Map | null>(null);\n const mountedRef = useRef(true);\n const inFlightLoadRef = useRef<Promise<void> | null>(null);\n\n useEffect(() => {\n mountedRef.current = true;\n\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const browserWindow = window as BrowserWindow;\n const previousAuthFailure = browserWindow.navermap_authFailure;\n\n browserWindow.navermap_authFailure = () => {\n const error = new Error(\n \"Naver Maps authentication failed. Check key type (ncpKeyId) and allowed domain settings.\"\n );\n\n if (mountedRef.current) {\n setSdkStatus(\"error\");\n setSdkError(error);\n }\n\n onError?.(error);\n\n if (previousAuthFailure) {\n previousAuthFailure();\n }\n };\n\n return () => {\n browserWindow.navermap_authFailure = previousAuthFailure;\n };\n }, [onError]);\n\n const reloadSdk = useCallback(async () => {\n if (inFlightLoadRef.current) {\n return inFlightLoadRef.current;\n }\n\n if (mountedRef.current) {\n setSdkStatus(\"loading\");\n setSdkError(null);\n }\n\n const loadPromise = loadNaverMapsScript({\n ncpKeyId,\n ncpClientId,\n govClientId,\n finClientId,\n submodules,\n timeoutMs,\n nonce\n })\n .then(() => {\n if (mountedRef.current) {\n setSdkStatus(\"ready\");\n setSdkError(null);\n }\n\n onReady?.();\n })\n .catch((error) => {\n const normalizedError =\n error instanceof Error ? error : new Error(\"Failed to load Naver Maps SDK.\");\n\n if (mountedRef.current) {\n setSdkStatus(\"error\");\n setSdkError(normalizedError);\n }\n\n onError?.(normalizedError);\n throw normalizedError;\n })\n .finally(() => {\n inFlightLoadRef.current = null;\n });\n\n inFlightLoadRef.current = loadPromise;\n\n return loadPromise;\n }, [\n finClientId,\n govClientId,\n ncpClientId,\n ncpKeyId,\n nonce,\n onError,\n onReady,\n submodules,\n timeoutMs\n ]);\n\n useEffect(() => {\n if (!autoLoad) {\n return;\n }\n\n void reloadSdk().catch(() => undefined);\n }, [autoLoad, reloadSdk]);\n\n const clearSdkError = useCallback(() => {\n if (mountedRef.current) {\n setSdkError(null);\n setSdkStatus((current) => (current === \"error\" ? \"idle\" : current));\n }\n }, []);\n\n const value = useMemo<NaverMapContextValue>(\n () => ({\n sdkStatus,\n sdkError,\n map,\n setMap,\n reloadSdk,\n retrySdk: reloadSdk,\n clearSdkError\n }),\n [clearSdkError, map, reloadSdk, sdkError, sdkStatus]\n );\n\n return <NaverMapContext.Provider value={value}>{children}</NaverMapContext.Provider>;\n}\n","import {\n forwardRef,\n memo,\n useCallback,\n useContext,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState\n} from \"react\";\n\nimport { NaverMapContext } from \"../provider/NaverMapProvider\";\n\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\n\ntype MapOptions = naver.maps.MapOptions;\n\ninterface NaverMapOptionProps {\n background?: MapOptions[\"background\"];\n baseTileOpacity?: MapOptions[\"baseTileOpacity\"];\n bounds?: MapOptions[\"bounds\"];\n center?: MapOptions[\"center\"];\n defaultCenter?: MapOptions[\"center\"];\n zoom?: MapOptions[\"zoom\"];\n defaultZoom?: MapOptions[\"zoom\"];\n disableDoubleClickZoom?: MapOptions[\"disableDoubleClickZoom\"];\n disableDoubleTapZoom?: MapOptions[\"disableDoubleTapZoom\"];\n disableKineticPan?: MapOptions[\"disableKineticPan\"];\n disableTwoFingerTapZoom?: MapOptions[\"disableTwoFingerTapZoom\"];\n draggable?: MapOptions[\"draggable\"];\n keyboardShortcuts?: MapOptions[\"keyboardShortcuts\"];\n logoControl?: MapOptions[\"logoControl\"];\n logoControlOptions?: MapOptions[\"logoControlOptions\"];\n mapDataControl?: MapOptions[\"mapDataControl\"];\n mapDataControlOptions?: MapOptions[\"mapDataControlOptions\"];\n mapTypeControl?: MapOptions[\"mapTypeControl\"];\n mapTypeControlOptions?: MapOptions[\"mapTypeControlOptions\"];\n mapTypeId?: MapOptions[\"mapTypeId\"];\n mapTypes?: MapOptions[\"mapTypes\"];\n maxBounds?: MapOptions[\"maxBounds\"];\n maxZoom?: MapOptions[\"maxZoom\"];\n minZoom?: MapOptions[\"minZoom\"];\n padding?: MapOptions[\"padding\"];\n pinchZoom?: MapOptions[\"pinchZoom\"];\n resizeOrigin?: MapOptions[\"resizeOrigin\"];\n scaleControl?: MapOptions[\"scaleControl\"];\n scaleControlOptions?: MapOptions[\"scaleControlOptions\"];\n scrollWheel?: MapOptions[\"scrollWheel\"];\n size?: MapOptions[\"size\"];\n overlayZoomEffect?: MapOptions[\"overlayZoomEffect\"];\n tileSpare?: MapOptions[\"tileSpare\"];\n tileTransition?: MapOptions[\"tileTransition\"];\n tileDuration?: MapOptions[\"tileDuration\"];\n zoomControl?: MapOptions[\"zoomControl\"];\n zoomControlOptions?: MapOptions[\"zoomControlOptions\"];\n zoomOrigin?: MapOptions[\"zoomOrigin\"];\n blankTileImage?: MapOptions[\"blankTileImage\"];\n gl?: MapOptions[\"gl\"];\n customStyleId?: MapOptions[\"customStyleId\"];\n}\n\ninterface NaverMapLifecycleProps {\n children?: ReactNode;\n onMapReady?: (map: naver.maps.Map) => void;\n onMapDestroy?: () => void;\n onMapError?: (error: Error) => void;\n retryOnError?: boolean;\n retryDelayMs?: number;\n fallback?: ReactNode;\n}\n\ninterface NaverMapEventProps {\n onAddLayer?: (layer: naver.maps.Layer) => void;\n onBoundsChanged?: (bounds: naver.maps.Bounds) => void;\n onCenterChanged?: (center: naver.maps.Coord) => void;\n onCenterPointChanged?: (centerPoint: naver.maps.Point) => void;\n onClick?: (pointerEvent: naver.maps.PointerEvent) => void;\n onDblClick?: (pointerEvent: naver.maps.PointerEvent) => void;\n onDoubleTap?: (pointerEvent: naver.maps.PointerEvent) => void;\n onDrag?: (pointerEvent: naver.maps.PointerEvent) => void;\n onDragEnd?: (pointerEvent: naver.maps.PointerEvent) => void;\n onDragStart?: (pointerEvent: naver.maps.PointerEvent) => void;\n onIdle?: () => void;\n onInit?: () => void;\n onKeyDown?: (keyboardEvent: KeyboardEvent) => void;\n onKeyUp?: (keyboardEvent: KeyboardEvent) => void;\n onLongTap?: (pointerEvent: naver.maps.PointerEvent) => void;\n onMapTypeChanged?: (mapType: naver.maps.MapType) => void;\n onMapTypeIdChanged?: (mapTypeId: string) => void;\n onMouseDown?: (pointerEvent: naver.maps.PointerEvent) => void;\n onMouseMove?: (pointerEvent: naver.maps.PointerEvent) => void;\n onMouseOut?: (pointerEvent: naver.maps.PointerEvent) => void;\n onMouseOver?: (pointerEvent: naver.maps.PointerEvent) => void;\n onMouseUp?: (pointerEvent: naver.maps.PointerEvent) => void;\n onPanning?: () => void;\n onPinch?: (pointerEvent: naver.maps.PointerEvent) => void;\n onPinchEnd?: (pointerEvent: naver.maps.PointerEvent) => void;\n onPinchStart?: (pointerEvent: naver.maps.PointerEvent) => void;\n onProjectionChanged?: (projection: naver.maps.Projection) => void;\n onRemoveLayer?: (layerName: string) => void;\n onResize?: () => void;\n onRightClick?: (pointerEvent: naver.maps.PointerEvent) => void;\n onSingleTap?: (pointerEvent: naver.maps.PointerEvent) => void;\n onTouchEnd?: (pointerEvent: naver.maps.PointerEvent) => void;\n onTouchMove?: (pointerEvent: naver.maps.PointerEvent) => void;\n onTouchStart?: (pointerEvent: naver.maps.PointerEvent) => void;\n onTwoFingerTap?: (pointerEvent: naver.maps.PointerEvent) => void;\n onWheel?: (pointerEvent: naver.maps.PointerEvent) => void;\n onZoomChanged?: (zoom: number) => void;\n onZooming?: () => void;\n onZoomStart?: () => void;\n}\n\ntype NaverMapDivProps = Omit<ComponentPropsWithoutRef<\"div\">, \"draggable\">;\n\nexport type NaverMapProps = NaverMapOptionProps &\n NaverMapLifecycleProps &\n NaverMapEventProps &\n NaverMapDivProps;\n\ntype NaverMapMethod<K extends keyof naver.maps.Map> = naver.maps.Map[K] extends (\n ...args: infer A\n) => infer R\n ? (...args: A) => R | undefined\n : never;\n\nexport interface NaverMapRef {\n getInstance: () => naver.maps.Map | null;\n addOverlayPane: (name: string, elementOrZIndex: HTMLElement | number) => void;\n addPane: NaverMapMethod<\"addPane\">;\n autoResize: NaverMapMethod<\"autoResize\">;\n destroy: NaverMapMethod<\"destroy\">;\n fitBounds: NaverMapMethod<\"fitBounds\">;\n getBounds: NaverMapMethod<\"getBounds\">;\n getCenter: NaverMapMethod<\"getCenter\">;\n getCenterPoint: NaverMapMethod<\"getCenterPoint\">;\n getElement: NaverMapMethod<\"getElement\">;\n getMapTypeId: NaverMapMethod<\"getMapTypeId\">;\n getMaxZoom: NaverMapMethod<\"getMaxZoom\">;\n getMinZoom: NaverMapMethod<\"getMinZoom\">;\n getOptions: NaverMapMethod<\"getOptions\">;\n getPanes: NaverMapMethod<\"getPanes\">;\n getPrimitiveProjection: NaverMapMethod<\"getPrimitiveProjection\">;\n getProjection: NaverMapMethod<\"getProjection\">;\n getSize: NaverMapMethod<\"getSize\">;\n getZoom: NaverMapMethod<\"getZoom\">;\n morph: NaverMapMethod<\"morph\">;\n panBy: NaverMapMethod<\"panBy\">;\n panTo: NaverMapMethod<\"panTo\">;\n panToBounds: NaverMapMethod<\"panToBounds\">;\n refresh: NaverMapMethod<\"refresh\">;\n removeOverlayPane: (name: string) => void;\n removePane: NaverMapMethod<\"removePane\">;\n setCenter: NaverMapMethod<\"setCenter\">;\n setCenterPoint: NaverMapMethod<\"setCenterPoint\">;\n setMapTypeId: NaverMapMethod<\"setMapTypeId\">;\n setOptions: NaverMapMethod<\"setOptions\">;\n setSize: NaverMapMethod<\"setSize\">;\n setZoom: NaverMapMethod<\"setZoom\">;\n stop: NaverMapMethod<\"stop\">;\n updateBy: NaverMapMethod<\"updateBy\">;\n zoomBy: NaverMapMethod<\"zoomBy\">;\n}\n\n/* ─── 상수 ─── */\n\nconst MAP_OPTION_KEYS = [\n \"background\",\n \"baseTileOpacity\",\n \"bounds\",\n \"center\",\n \"zoom\",\n \"disableDoubleClickZoom\",\n \"disableDoubleTapZoom\",\n \"disableKineticPan\",\n \"disableTwoFingerTapZoom\",\n \"draggable\",\n \"keyboardShortcuts\",\n \"logoControl\",\n \"logoControlOptions\",\n \"mapDataControl\",\n \"mapDataControlOptions\",\n \"mapTypeControl\",\n \"mapTypeControlOptions\",\n \"mapTypeId\",\n \"mapTypes\",\n \"maxBounds\",\n \"maxZoom\",\n \"minZoom\",\n \"padding\",\n \"pinchZoom\",\n \"resizeOrigin\",\n \"scaleControl\",\n \"scaleControlOptions\",\n \"scrollWheel\",\n \"size\",\n \"overlayZoomEffect\",\n \"tileSpare\",\n \"tileTransition\",\n \"tileDuration\",\n \"zoomControl\",\n \"zoomControlOptions\",\n \"zoomOrigin\",\n \"blankTileImage\",\n \"gl\",\n \"customStyleId\"\n] as const satisfies readonly (keyof NaverMapOptionProps)[];\n\nconst MAP_OPTION_KEY_SET = new Set<string>(MAP_OPTION_KEYS as readonly string[]);\n\nconst MAP_EVENT_PROP_KEYS = [\n \"onAddLayer\",\n \"onBoundsChanged\",\n \"onCenterChanged\",\n \"onCenterPointChanged\",\n \"onClick\",\n \"onDblClick\",\n \"onDoubleTap\",\n \"onDrag\",\n \"onDragEnd\",\n \"onDragStart\",\n \"onIdle\",\n \"onInit\",\n \"onKeyDown\",\n \"onKeyUp\",\n \"onLongTap\",\n \"onMapTypeChanged\",\n \"onMapTypeIdChanged\",\n \"onMouseDown\",\n \"onMouseMove\",\n \"onMouseOut\",\n \"onMouseOver\",\n \"onMouseUp\",\n \"onPanning\",\n \"onPinch\",\n \"onPinchEnd\",\n \"onPinchStart\",\n \"onProjectionChanged\",\n \"onRemoveLayer\",\n \"onResize\",\n \"onRightClick\",\n \"onSingleTap\",\n \"onTouchEnd\",\n \"onTouchMove\",\n \"onTouchStart\",\n \"onTwoFingerTap\",\n \"onWheel\",\n \"onZoomChanged\",\n \"onZooming\",\n \"onZoomStart\"\n] as const satisfies readonly (keyof NaverMapEventProps)[];\n\nconst MAP_EVENT_PROP_KEY_SET = new Set<string>(MAP_EVENT_PROP_KEYS as readonly string[]);\n\ntype MapEventBinding = {\n prop: keyof NaverMapEventProps;\n eventName: string;\n hasPayload: boolean;\n};\n\nconst MAP_EVENT_BINDINGS: readonly MapEventBinding[] = [\n { prop: \"onAddLayer\", eventName: \"addLayer\", hasPayload: true },\n { prop: \"onBoundsChanged\", eventName: \"bounds_changed\", hasPayload: true },\n { prop: \"onCenterChanged\", eventName: \"center_changed\", hasPayload: true },\n { prop: \"onCenterPointChanged\", eventName: \"centerPoint_changed\", hasPayload: true },\n { prop: \"onClick\", eventName: \"click\", hasPayload: true },\n { prop: \"onDblClick\", eventName: \"dblclick\", hasPayload: true },\n { prop: \"onDoubleTap\", eventName: \"doubletap\", hasPayload: true },\n { prop: \"onDrag\", eventName: \"drag\", hasPayload: true },\n { prop: \"onDragEnd\", eventName: \"dragend\", hasPayload: true },\n { prop: \"onDragStart\", eventName: \"dragstart\", hasPayload: true },\n { prop: \"onIdle\", eventName: \"idle\", hasPayload: false },\n { prop: \"onInit\", eventName: \"init\", hasPayload: false },\n { prop: \"onKeyDown\", eventName: \"keydown\", hasPayload: true },\n { prop: \"onKeyUp\", eventName: \"keyup\", hasPayload: true },\n { prop: \"onLongTap\", eventName: \"longtap\", hasPayload: true },\n { prop: \"onMapTypeChanged\", eventName: \"mapType_changed\", hasPayload: true },\n { prop: \"onMapTypeIdChanged\", eventName: \"mapTypeId_changed\", hasPayload: true },\n { prop: \"onMouseDown\", eventName: \"mousedown\", hasPayload: true },\n { prop: \"onMouseMove\", eventName: \"mousemove\", hasPayload: true },\n { prop: \"onMouseOut\", eventName: \"mouseout\", hasPayload: true },\n { prop: \"onMouseOver\", eventName: \"mouseover\", hasPayload: true },\n { prop: \"onMouseUp\", eventName: \"mouseup\", hasPayload: true },\n { prop: \"onPanning\", eventName: \"panning\", hasPayload: false },\n { prop: \"onPinch\", eventName: \"pinch\", hasPayload: true },\n { prop: \"onPinchEnd\", eventName: \"pinchend\", hasPayload: true },\n { prop: \"onPinchStart\", eventName: \"pinchstart\", hasPayload: true },\n { prop: \"onProjectionChanged\", eventName: \"projection_changed\", hasPayload: true },\n { prop: \"onRemoveLayer\", eventName: \"removeLayer\", hasPayload: true },\n { prop: \"onResize\", eventName: \"resize\", hasPayload: false },\n { prop: \"onRightClick\", eventName: \"rightclick\", hasPayload: true },\n { prop: \"onSingleTap\", eventName: \"singletap\", hasPayload: true },\n { prop: \"onTouchEnd\", eventName: \"touchend\", hasPayload: true },\n { prop: \"onTouchMove\", eventName: \"touchmove\", hasPayload: true },\n { prop: \"onTouchStart\", eventName: \"touchstart\", hasPayload: true },\n { prop: \"onTwoFingerTap\", eventName: \"twofingertap\", hasPayload: true },\n { prop: \"onWheel\", eventName: \"wheel\", hasPayload: true },\n { prop: \"onZoomChanged\", eventName: \"zoom_changed\", hasPayload: true },\n { prop: \"onZooming\", eventName: \"zooming\", hasPayload: false },\n { prop: \"onZoomStart\", eventName: \"zoomstart\", hasPayload: false }\n];\n\nconst NON_DIV_KEYS = new Set([\n \"onMapReady\",\n \"onMapDestroy\",\n \"onMapError\",\n \"retryOnError\",\n \"retryDelayMs\",\n \"fallback\",\n \"defaultCenter\",\n \"defaultZoom\",\n \"children\"\n]);\n\n/* ─── 유틸 ─── */\n\nfunction toCenterSignature(center: MapOptions[\"center\"] | undefined): string {\n if (!center) {\n return \"\";\n }\n\n if (typeof center === \"object\") {\n const candidate = center as unknown as Record<string, unknown>;\n const rawLat = candidate.lat;\n const rawLng = candidate.lng;\n const lat = typeof rawLat === \"function\" ? (rawLat as () => number)() : rawLat;\n const lng = typeof rawLng === \"function\" ? (rawLng as () => number)() : rawLng;\n\n if (typeof lat === \"number\" && typeof lng === \"number\") {\n return `latlng:${lat},${lng}`;\n }\n\n const rawX = candidate.x;\n const rawY = candidate.y;\n const x = typeof rawX === \"function\" ? (rawX as () => number)() : rawX;\n const y = typeof rawY === \"function\" ? (rawY as () => number)() : rawY;\n\n if (typeof x === \"number\" && typeof y === \"number\") {\n return `xy:${x},${y}`;\n }\n }\n\n return String(center);\n}\n\nfunction areValuesEqual(left: unknown, right: unknown): boolean {\n if (left === right) {\n return true;\n }\n\n if (left === null || right === null || left === undefined || right === undefined) {\n return false;\n }\n\n if (typeof left === \"object\" && typeof right === \"object\") {\n const leftCenter = toCenterSignature(left as MapOptions[\"center\"]);\n const rightCenter = toCenterSignature(right as MapOptions[\"center\"]);\n\n if (leftCenter !== \"\" && rightCenter !== \"\") {\n return leftCenter === rightCenter;\n }\n\n return JSON.stringify(left) === JSON.stringify(right);\n }\n\n return false;\n}\n\nfunction getChangedOptions(\n previous: naver.maps.MapOptions,\n next: naver.maps.MapOptions\n): Partial<naver.maps.MapOptions> {\n const keys = new Set([...Object.keys(previous), ...Object.keys(next)]);\n const changed: Array<[string, unknown]> = [];\n\n for (const key of keys) {\n const typedKey = key as keyof naver.maps.MapOptions;\n const previousValue = previous[typedKey];\n const nextValue = next[typedKey];\n\n if (!areValuesEqual(previousValue, nextValue) && nextValue !== undefined) {\n changed.push([key, nextValue]);\n }\n }\n\n return Object.fromEntries(changed) as Partial<naver.maps.MapOptions>;\n}\n\nfunction getDivProps(props: NaverMapProps): NaverMapDivProps {\n const entries: Array<[string, unknown]> = [];\n for (const [key, value] of Object.entries(props)) {\n if (NON_DIV_KEYS.has(key) || MAP_OPTION_KEY_SET.has(key) || MAP_EVENT_PROP_KEY_SET.has(key)) {\n continue;\n }\n entries.push([key, value]);\n }\n return Object.fromEntries(entries) as NaverMapDivProps;\n}\n\n/**\n * memo 비교: children과 함수(콜백)는 skip.\n * - children: React element는 JSON.stringify 불가\n * - 함수: ref를 통해 항상 최신 값을 읽으므로 비교 불필요\n */\nfunction areNaverMapPropsEqual(previousProps: NaverMapProps, nextProps: NaverMapProps): boolean {\n const keys = new Set([...Object.keys(previousProps), ...Object.keys(nextProps)]);\n\n for (const key of keys) {\n if (key === \"children\") {\n if (previousProps.children !== nextProps.children) {\n return false;\n }\n continue;\n }\n\n const previousValue = previousProps[key as keyof NaverMapProps];\n const nextValue = nextProps[key as keyof NaverMapProps];\n\n if (typeof previousValue === \"function\" && typeof nextValue === \"function\") {\n continue;\n }\n\n if (!areValuesEqual(previousValue, nextValue)) {\n return false;\n }\n }\n\n return true;\n}\n\n/* ─── 컴포넌트 ─── */\n\nconst NaverMapBase = forwardRef<NaverMapRef, NaverMapProps>(function NaverMapInner(props, ref) {\n const context = useContext(NaverMapContext);\n\n if (!context) {\n throw new Error(\"NaverMap must be used inside NaverMapProvider.\");\n }\n\n const { sdkStatus, setMap, reloadSdk } = context;\n\n // ─── mapReady state: children 렌더 트리거 ───\n const [mapReady, setMapReady] = useState(false);\n\n // ─── 콜백/이벤트 핸들러를 ref로 관리 (effect 재실행 방지) ───\n const propsRef = useRef(props);\n useEffect(() => {\n propsRef.current = props;\n });\n\n // ─── 초기값 (최초 1회만 캡처) ───\n const initialCenterRef = useRef(props.center ?? props.defaultCenter);\n const initialZoomRef = useRef(props.zoom ?? props.defaultZoom);\n\n // ─── controlled 여부 ───\n const isControlledCenter = props.center !== undefined;\n const isControlledZoom = props.zoom !== undefined;\n\n // ─── map options (개별 prop 의존성, defaultCenter/defaultZoom 제외) ───\n const mapOptions = useMemo(() => {\n const entries: Array<[string, unknown]> = [];\n for (const key of MAP_OPTION_KEYS) {\n const value = props[key];\n if (value !== undefined) {\n entries.push([key, value]);\n }\n }\n return Object.fromEntries(entries) as naver.maps.MapOptions;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n props.background,\n props.baseTileOpacity,\n props.bounds,\n props.center,\n props.zoom,\n props.disableDoubleClickZoom,\n props.disableDoubleTapZoom,\n props.disableKineticPan,\n props.disableTwoFingerTapZoom,\n props.draggable,\n props.keyboardShortcuts,\n props.logoControl,\n props.logoControlOptions,\n props.mapDataControl,\n props.mapDataControlOptions,\n props.mapTypeControl,\n props.mapTypeControlOptions,\n props.mapTypeId,\n props.mapTypes,\n props.maxBounds,\n props.maxZoom,\n props.minZoom,\n props.padding,\n props.pinchZoom,\n props.resizeOrigin,\n props.scaleControl,\n props.scaleControlOptions,\n props.scrollWheel,\n props.size,\n props.overlayZoomEffect,\n props.tileSpare,\n props.tileTransition,\n props.tileDuration,\n props.zoomControl,\n props.zoomControlOptions,\n props.zoomOrigin,\n props.blankTileImage,\n props.gl,\n props.customStyleId\n ]);\n\n // ─── div props ───\n const divProps = useMemo(() => getDivProps(props), [props]);\n\n // ─── 내부 refs ───\n const containerRef = useRef<HTMLDivElement | null>(null);\n const mapRef = useRef<naver.maps.Map | null>(null);\n const appliedOptionsRef = useRef<naver.maps.MapOptions>({});\n const retryTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const mapOptionsRef = useRef(mapOptions);\n mapOptionsRef.current = mapOptions;\n\n // ─── invokeMapMethod (안정적 ref) ───\n const invokeMapMethod = useCallback(\n <K extends keyof naver.maps.Map>(\n methodName: K,\n ...args: Parameters<Extract<naver.maps.Map[K], (...params: never[]) => unknown>>\n ): ReturnType<Extract<naver.maps.Map[K], (...params: never[]) => unknown>> | undefined => {\n const mapInstance = mapRef.current;\n\n if (!mapInstance) {\n return undefined;\n }\n\n const method = mapInstance[methodName] as unknown;\n\n if (typeof method !== \"function\") {\n return undefined;\n }\n\n return (method as (...params: unknown[]) => unknown).apply(mapInstance, args) as ReturnType<\n Extract<naver.maps.Map[K], (...params: never[]) => unknown>\n >;\n },\n []\n );\n\n // ─── imperative handle ───\n useImperativeHandle(\n ref,\n (): NaverMapRef => ({\n getInstance: () => mapRef.current,\n addOverlayPane: (name, elementOrZIndex) => {\n const mapInstance = mapRef.current as naver.maps.Map & {\n addOverlayPane?: (paneName: string, elementOrIndex: HTMLElement | number) => void;\n };\n mapInstance?.addOverlayPane?.(name, elementOrZIndex);\n },\n addPane: (...args) => invokeMapMethod(\"addPane\", ...args),\n autoResize: (...args) => invokeMapMethod(\"autoResize\", ...args),\n destroy: (...args) => {\n const mapInstance = mapRef.current as naver.maps.Map & { destroy?: () => void };\n\n if (!mapInstance) {\n return undefined;\n }\n\n try {\n return mapInstance.destroy?.(...args);\n } catch {\n return undefined;\n }\n },\n fitBounds: (...args) => invokeMapMethod(\"fitBounds\", ...args),\n getBounds: (...args) => invokeMapMethod(\"getBounds\", ...args),\n getCenter: (...args) => invokeMapMethod(\"getCenter\", ...args),\n getCenterPoint: (...args) => invokeMapMethod(\"getCenterPoint\", ...args),\n getElement: (...args) => invokeMapMethod(\"getElement\", ...args),\n getMapTypeId: (...args) => invokeMapMethod(\"getMapTypeId\", ...args),\n getMaxZoom: (...args) => invokeMapMethod(\"getMaxZoom\", ...args),\n getMinZoom: (...args) => invokeMapMethod(\"getMinZoom\", ...args),\n getOptions: (...args) => invokeMapMethod(\"getOptions\", ...args),\n getPanes: (...args) => invokeMapMethod(\"getPanes\", ...args),\n getPrimitiveProjection: (...args) => invokeMapMethod(\"getPrimitiveProjection\", ...args),\n getProjection: (...args) => invokeMapMethod(\"getProjection\", ...args),\n getSize: (...args) => invokeMapMethod(\"getSize\", ...args),\n getZoom: (...args) => invokeMapMethod(\"getZoom\", ...args),\n morph: (...args) => invokeMapMethod(\"morph\", ...args),\n panBy: (...args) => invokeMapMethod(\"panBy\", ...args),\n panTo: (...args) => invokeMapMethod(\"panTo\", ...args),\n panToBounds: (...args) => invokeMapMethod(\"panToBounds\", ...args),\n refresh: (...args) => invokeMapMethod(\"refresh\", ...args),\n removeOverlayPane: (name) => {\n const mapInstance = mapRef.current as naver.maps.Map & {\n removeOverlayPane?: (paneName: string) => void;\n };\n mapInstance?.removeOverlayPane?.(name);\n },\n removePane: (...args) => invokeMapMethod(\"removePane\", ...args),\n setCenter: (...args) => invokeMapMethod(\"setCenter\", ...args),\n setCenterPoint: (...args) => invokeMapMethod(\"setCenterPoint\", ...args),\n setMapTypeId: (...args) => invokeMapMethod(\"setMapTypeId\", ...args),\n setOptions: (...args) => invokeMapMethod(\"setOptions\", ...args),\n setSize: (...args) => invokeMapMethod(\"setSize\", ...args),\n setZoom: (...args) => invokeMapMethod(\"setZoom\", ...args),\n stop: (...args) => invokeMapMethod(\"stop\", ...args),\n updateBy: (...args) => invokeMapMethod(\"updateBy\", ...args),\n zoomBy: (...args) => invokeMapMethod(\"zoomBy\", ...args)\n }),\n [invokeMapMethod]\n );\n\n // ─── 지도 생성 + 이벤트 바인딩 (sdkStatus만 의존) ───\n useEffect(() => {\n if (sdkStatus !== \"ready\" || !containerRef.current) {\n return;\n }\n\n const container = containerRef.current;\n\n // 생성 시점의 옵션 스냅샷\n const initOptions = { ...mapOptionsRef.current };\n if (initOptions.center === undefined && initialCenterRef.current !== undefined) {\n initOptions.center = initialCenterRef.current;\n }\n if (initOptions.zoom === undefined && initialZoomRef.current !== undefined) {\n initOptions.zoom = initialZoomRef.current;\n }\n\n let mapInstance: naver.maps.Map;\n try {\n mapInstance = new naver.maps.Map(container, initOptions);\n } catch (error) {\n const normalizedError =\n error instanceof Error ? error : new Error(\"Failed to create naver.maps.Map instance.\");\n propsRef.current.onMapError?.(normalizedError);\n\n if (propsRef.current.retryOnError) {\n retryTimerRef.current = setTimeout(() => {\n void reloadSdk().catch(() => undefined);\n }, propsRef.current.retryDelayMs ?? 1000);\n }\n\n return () => {\n if (retryTimerRef.current) {\n clearTimeout(retryTimerRef.current);\n retryTimerRef.current = null;\n }\n };\n }\n\n mapRef.current = mapInstance;\n appliedOptionsRef.current = initOptions;\n setMap(mapInstance);\n setMapReady(true);\n propsRef.current.onMapReady?.(mapInstance);\n\n // 이벤트 리스너 — ref를 통해 항상 최신 핸들러를 읽으므로 1회만 바인딩\n const listeners = MAP_EVENT_BINDINGS.map((binding) =>\n naver.maps.Event.addListener(mapInstance, binding.eventName, (event: unknown) => {\n const handler = propsRef.current[binding.prop];\n if (typeof handler !== \"function\") {\n return;\n }\n if (binding.hasPayload) {\n (handler as (payload: unknown) => void)(event);\n } else {\n (handler as () => void)();\n }\n })\n );\n\n return () => {\n // 이벤트 해제\n try {\n naver.maps.Event.removeListener(listeners);\n naver.maps.Event.clearInstanceListeners(mapInstance);\n } catch {\n // 이미 해제된 경우 무시\n }\n\n // 타이머 정리\n if (retryTimerRef.current) {\n clearTimeout(retryTimerRef.current);\n retryTimerRef.current = null;\n }\n\n // DOM 정리\n container.innerHTML = \"\";\n\n // 상태 초기화\n mapRef.current = null;\n appliedOptionsRef.current = {};\n setMap(null);\n setMapReady(false);\n propsRef.current.onMapDestroy?.();\n };\n }, [sdkStatus, setMap, reloadSdk]);\n\n // ─── 옵션 동기화 (controlled prop만 지도에 반영) ───\n useEffect(() => {\n const mapInstance = mapRef.current;\n if (!mapInstance) {\n return;\n }\n\n const changed = getChangedOptions(appliedOptionsRef.current, mapOptions);\n if (Object.keys(changed).length === 0) {\n appliedOptionsRef.current = mapOptions;\n return;\n }\n\n const {\n center: changedCenter,\n zoom: changedZoom,\n mapTypeId: changedMapTypeId,\n ...otherChanged\n } = changed;\n\n // uncontrolled 상태 보존: setOptions/setMapTypeId 등이\n // 내부적으로 center/zoom을 리셋할 수 있으므로 미리 저장\n const savedCenter = !isControlledCenter ? mapInstance.getCenter() : null;\n const savedZoom = !isControlledZoom ? mapInstance.getZoom() : null;\n\n // center/zoom/mapTypeId 이외 옵션 → setOptions\n if (Object.keys(otherChanged).length > 0) {\n mapInstance.setOptions(otherChanged);\n }\n\n // mapTypeId 동기화\n if (changedMapTypeId !== undefined && mapOptions.mapTypeId !== undefined) {\n mapInstance.setMapTypeId(mapOptions.mapTypeId);\n }\n\n // controlled center 동기화\n if (isControlledCenter && changedCenter !== undefined) {\n mapInstance.setCenter(changedCenter as naver.maps.Coord);\n }\n\n // controlled zoom 동기화\n if (isControlledZoom && changedZoom !== undefined && mapOptions.zoom !== undefined) {\n mapInstance.setZoom(mapOptions.zoom);\n }\n\n // uncontrolled center/zoom 복원: 다른 옵션 변경으로 리셋됐을 수 있음\n if (savedCenter) {\n mapInstance.setCenter(savedCenter);\n }\n if (savedZoom !== null) {\n mapInstance.setZoom(savedZoom);\n }\n\n appliedOptionsRef.current = mapOptions;\n }, [mapOptions, isControlledCenter, isControlledZoom]);\n\n // ─── 렌더 ───\n if (sdkStatus === \"error\") {\n return <>{props.fallback ?? <div {...divProps}>지도를 불러올 수 없습니다.</div>}</>;\n }\n\n if (sdkStatus === \"loading\") {\n return <>{props.fallback ?? <div {...divProps} />}</>;\n }\n\n return (\n <div ref={containerRef} {...divProps}>\n {mapReady ? props.children : null}\n </div>\n );\n});\n\nNaverMapBase.displayName = \"NaverMap\";\n\nexport const NaverMap = memo(NaverMapBase, areNaverMapPropsEqual);\n","import { useContext } from \"react\";\n\nimport { NaverMapContext } from \"../provider/NaverMapProvider\";\n\nimport type { NaverMapContextValue } from \"../provider/NaverMapProvider\";\n\nexport interface UseNaverMapOptions {\n requireReady?: boolean;\n requireMapInstance?: boolean;\n}\n\nexport function useNaverMap(options: UseNaverMapOptions = {}): NaverMapContextValue {\n const context = useContext(NaverMapContext);\n\n if (!context) {\n throw new Error(\"useNaverMap must be used within NaverMapProvider.\");\n }\n\n if (options.requireReady && context.sdkStatus !== \"ready\") {\n throw new Error(`Naver Maps SDK is not ready. Current status: ${context.sdkStatus}.`);\n }\n\n if (options.requireMapInstance && !context.map) {\n throw new Error(\"Naver map instance is not available yet.\");\n }\n\n return context;\n}\n\nexport function useNaverMapInstance(\n options: { requireReady?: boolean } = {}\n): naver.maps.Map | null {\n const context = useNaverMap({\n requireReady: options.requireReady,\n requireMapInstance: false\n });\n\n return context.map;\n}\n","import { createContext, useContext } from \"react\";\n\nimport type { ItemRecord } from \"./types\";\n\n/**\n * `<MarkerClusterer>` 내부에서 `<Marker>`가 사용하는 registry 인터페이스.\n *\n * `enabled`가 `false`이면 `<Marker>`는 직접 `naver.maps.Marker`를 생성합니다.\n *\n * @typeParam TData - `<Marker item={...}>`의 데이터 타입\n */\nexport interface ClustererRegistry<TData = unknown> {\n /**\n * 클러스터링 활성화 여부.\n * `false`이면 `<Marker>`가 개별 마커로 직접 렌더링됩니다.\n */\n readonly enabled: boolean;\n\n /**\n * 마커를 registry에 등록합니다.\n *\n * @param item - 등록할 마커 레코드\n */\n register(item: ItemRecord<TData>): void;\n\n /**\n * 마커를 registry에서 제거합니다.\n *\n * @param id - 제거할 마커의 ID\n */\n unregister(id: string | number): void;\n}\n\n/**\n * `<MarkerClusterer>`가 제공하는 registry Context.\n * register/unregister/enabled만 포함하며, enabled가 바뀔 때만 갱신됩니다.\n *\n * @internal\n */\nexport const ClustererContext = createContext<ClustererRegistry | null>(null);\n\nClustererContext.displayName = \"ClustererContext\";\n\n/**\n * `<MarkerClusterer>`가 제공하는 visibility Context.\n * 재계산 시마다 갱신되며, 클러스터링 안 된 마커 ID 집합을 담습니다.\n *\n * `<Marker>`는 이 context를 읽어 자신이 보여야 할지 판단합니다.\n *\n * @internal\n */\nexport const ClustererVisibilityContext = createContext<ReadonlySet<string | number>>(new Set());\n\nClustererVisibilityContext.displayName = \"ClustererVisibilityContext\";\n\n/** @internal */\nexport function useClustererContext(): ClustererRegistry | null {\n return useContext(ClustererContext);\n}\n","import {\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useImperativeHandle,\n useLayoutEffect,\n useRef,\n useState\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { useNaverMap } from \"../../react/hooks/useNaverMap\";\nimport { ClustererContext, ClustererVisibilityContext } from \"../marker-clusterer/ClustererContext\";\n\nimport type { ReactNode, ReactPortal } from \"react\";\n\ntype MarkerOptions = naver.maps.MarkerOptions;\ntype MarkerIcon = NonNullable<MarkerOptions[\"icon\"]>;\ntype MarkerIconObject = Exclude<MarkerIcon, string>;\n\ninterface MarkerOverlayProps {\n map?: naver.maps.Map | null;\n position: MarkerOptions[\"position\"];\n icon?: MarkerOptions[\"icon\"];\n animation?: MarkerOptions[\"animation\"];\n shape?: MarkerOptions[\"shape\"];\n title?: MarkerOptions[\"title\"];\n cursor?: MarkerOptions[\"cursor\"];\n clickable?: MarkerOptions[\"clickable\"];\n draggable?: MarkerOptions[\"draggable\"];\n visible?: MarkerOptions[\"visible\"];\n zIndex?: MarkerOptions[\"zIndex\"];\n collisionBehavior?: boolean;\n collisionBoxSize?: naver.maps.Size | naver.maps.SizeLiteral;\n\n /** Used by MarkerClusterer to identify this marker. Falls back to React key if not provided. */\n clustererItemId?: string | number;\n /** Data object passed to MarkerClusterer's algorithm via registry. */\n item?: unknown;\n}\n\ninterface MarkerLifecycleProps {\n children?: ReactNode;\n onMarkerReady?: (marker: naver.maps.Marker) => void;\n onMarkerDestroy?: () => void;\n onMarkerError?: (error: Error) => void;\n}\n\ninterface MarkerEventProps {\n onClick?: (event: naver.maps.PointerEvent) => void;\n onDblClick?: (event: naver.maps.PointerEvent) => void;\n onRightClick?: (event: naver.maps.PointerEvent) => void;\n onMouseDown?: (event: naver.maps.PointerEvent) => void;\n onMouseUp?: (event: naver.maps.PointerEvent) => void;\n onTouchStart?: (event: naver.maps.PointerEvent) => void;\n onTouchEnd?: (event: naver.maps.PointerEvent) => void;\n onDragStart?: (event: naver.maps.PointerEvent) => void;\n onDrag?: (event: naver.maps.PointerEvent) => void;\n onDragEnd?: (event: naver.maps.PointerEvent) => void;\n onClickableChanged?: (clickable: boolean) => void;\n onCursorChanged?: (cursor: string) => void;\n onDraggableChanged?: (draggable: boolean) => void;\n onIconChanged?: (\n icon: string | naver.maps.ImageIcon | naver.maps.SymbolIcon | naver.maps.HtmlIcon\n ) => void;\n onIconLoaded?: (marker: naver.maps.Marker) => void;\n onPositionChanged?: (position: naver.maps.Coord) => void;\n onShapeChanged?: (shape: naver.maps.MarkerShape) => void;\n onTitleChanged?: (title: string) => void;\n onVisibleChanged?: (visible: boolean) => void;\n onZIndexChanged?: (zIndex: number) => void;\n}\n\nexport type MarkerProps = MarkerOverlayProps & MarkerLifecycleProps & MarkerEventProps;\n\ntype MarkerMethod<K extends keyof naver.maps.Marker> = naver.maps.Marker[K] extends (\n ...args: infer A\n) => infer R\n ? (...args: A) => R | undefined\n : never;\n\nexport interface MarkerRef {\n getInstance: () => naver.maps.Marker | null;\n getAnimation: MarkerMethod<\"getAnimation\">;\n getClickable: MarkerMethod<\"getClickable\">;\n getCursor: MarkerMethod<\"getCursor\">;\n getDraggable: MarkerMethod<\"getDraggable\">;\n getDrawingRect: MarkerMethod<\"getDrawingRect\">;\n getElement: MarkerMethod<\"getElement\">;\n getIcon: MarkerMethod<\"getIcon\">;\n getMap: MarkerMethod<\"getMap\">;\n getOptions: MarkerMethod<\"getOptions\">;\n getPanes: MarkerMethod<\"getPanes\">;\n getPosition: MarkerMethod<\"getPosition\">;\n getProjection: MarkerMethod<\"getProjection\">;\n getShape: MarkerMethod<\"getShape\">;\n getTitle: MarkerMethod<\"getTitle\">;\n getVisible: MarkerMethod<\"getVisible\">;\n getZIndex: MarkerMethod<\"getZIndex\">;\n setAnimation: MarkerMethod<\"setAnimation\">;\n setClickable: MarkerMethod<\"setClickable\">;\n setCursor: MarkerMethod<\"setCursor\">;\n setDraggable: MarkerMethod<\"setDraggable\">;\n setIcon: MarkerMethod<\"setIcon\">;\n setMap: MarkerMethod<\"setMap\">;\n setOptions: MarkerMethod<\"setOptions\">;\n setPosition: MarkerMethod<\"setPosition\">;\n setShape: MarkerMethod<\"setShape\">;\n setTitle: MarkerMethod<\"setTitle\">;\n setVisible: MarkerMethod<\"setVisible\">;\n setZIndex: MarkerMethod<\"setZIndex\">;\n}\n\ninterface MarkerEventBinding {\n eventName: string;\n invoke?: (event: unknown) => void;\n}\n\nfunction pickHtmlIconAnchor(icon: MarkerIconObject): naver.maps.HtmlIcon[\"anchor\"] | undefined {\n if (\"anchor\" in icon) {\n return icon.anchor;\n }\n\n return undefined;\n}\n\nfunction pickHtmlIconSize(icon: MarkerIconObject): naver.maps.HtmlIcon[\"size\"] | undefined {\n if (\"size\" in icon) {\n return icon.size;\n }\n\n return undefined;\n}\n\nfunction resolveMarkerIcon(\n icon: MarkerOptions[\"icon\"],\n childrenContainer: HTMLDivElement | null,\n hasChildren: boolean\n): MarkerOptions[\"icon\"] {\n if (!hasChildren || !childrenContainer) {\n return icon;\n }\n\n const iconObject = typeof icon === \"object\" && icon !== null ? icon : undefined;\n\n return {\n content: childrenContainer,\n anchor: iconObject ? pickHtmlIconAnchor(iconObject) : undefined,\n size: iconObject ? pickHtmlIconSize(iconObject) : undefined\n };\n}\n\nfunction toMarkerOptions(\n props: MarkerProps,\n targetMap: naver.maps.Map | null,\n icon: MarkerOptions[\"icon\"]\n): MarkerOptions {\n const options: MarkerOptions = {\n position: props.position,\n icon\n };\n\n if (targetMap) {\n options.map = targetMap;\n }\n\n if (props.animation !== undefined) {\n options.animation = props.animation;\n }\n\n if (props.shape !== undefined) {\n options.shape = props.shape;\n }\n\n if (props.title !== undefined) {\n options.title = props.title;\n }\n\n if (props.cursor !== undefined) {\n options.cursor = props.cursor;\n }\n\n if (props.clickable !== undefined) {\n options.clickable = props.clickable;\n }\n\n if (props.draggable !== undefined) {\n options.draggable = props.draggable;\n }\n\n if (props.visible !== undefined) {\n options.visible = props.visible;\n }\n\n if (props.zIndex !== undefined) {\n options.zIndex = props.zIndex;\n }\n\n return options;\n}\n\nfunction buildMarkerEventBindings(propsRef: { current: MarkerProps }): MarkerEventBinding[] {\n return [\n {\n eventName: \"click\",\n invoke: (event) => propsRef.current.onClick?.(event as naver.maps.PointerEvent)\n },\n {\n eventName: \"dblclick\",\n invoke: (event) => propsRef.current.onDblClick?.(event as naver.maps.PointerEvent)\n },\n {\n eventName: \"rightclick\",\n invoke: (event) => propsRef.current.onRightClick?.(event as naver.maps.PointerEvent)\n },\n {\n eventName: \"mousedown\",\n invoke: (event) => propsRef.current.onMouseDown?.(event as naver.maps.PointerEvent)\n },\n {\n eventName: \"mouseup\",\n invoke: (event) => propsRef.current.onMouseUp?.(event as naver.maps.PointerEvent)\n },\n {\n eventName: \"touchstart\",\n invoke: (event) => propsRef.current.onTouchStart?.(event as naver.maps.PointerEvent)\n },\n {\n eventName: \"touchend\",\n invoke: (event) => propsRef.current.onTouchEnd?.(event as naver.maps.PointerEvent)\n },\n {\n eventName: \"dragstart\",\n invoke: (event) => propsRef.current.onDragStart?.(event as naver.maps.PointerEvent)\n },\n {\n eventName: \"drag\",\n invoke: (event) => propsRef.current.onDrag?.(event as naver.maps.PointerEvent)\n },\n {\n eventName: \"dragend\",\n invoke: (event) => propsRef.current.onDragEnd?.(event as naver.maps.PointerEvent)\n },\n {\n eventName: \"clickable_changed\",\n invoke: (event) => propsRef.current.onClickableChanged?.(event as boolean)\n },\n {\n eventName: \"cursor_changed\",\n invoke: (event) => propsRef.current.onCursorChanged?.(event as string)\n },\n {\n eventName: \"draggable_changed\",\n invoke: (event) => propsRef.current.onDraggableChanged?.(event as boolean)\n },\n {\n eventName: \"icon_changed\",\n invoke: (event) =>\n propsRef.current.onIconChanged?.(\n event as string | naver.maps.ImageIcon | naver.maps.SymbolIcon | naver.maps.HtmlIcon\n )\n },\n {\n eventName: \"icon_loaded\",\n invoke: (event) => propsRef.current.onIconLoaded?.(event as naver.maps.Marker)\n },\n {\n eventName: \"position_changed\",\n invoke: (event) => propsRef.current.onPositionChanged?.(event as naver.maps.Coord)\n },\n {\n eventName: \"shape_changed\",\n invoke: (event) => propsRef.current.onShapeChanged?.(event as naver.maps.MarkerShape)\n },\n {\n eventName: \"title_changed\",\n invoke: (event) => propsRef.current.onTitleChanged?.(event as string)\n },\n {\n eventName: \"visible_changed\",\n invoke: (event) => propsRef.current.onVisibleChanged?.(event as boolean)\n },\n {\n eventName: \"zIndex_changed\",\n invoke: (event) => propsRef.current.onZIndexChanged?.(event as number)\n }\n ];\n}\n\nfunction bindMarkerEventListeners(\n marker: naver.maps.Marker,\n listenersRef: { current: naver.maps.MapEventListener[] },\n bindings: MarkerEventBinding[]\n): void {\n if (listenersRef.current.length > 0) {\n naver.maps.Event.removeListener(listenersRef.current);\n listenersRef.current = [];\n }\n\n listenersRef.current = bindings\n .filter((binding) => typeof binding.invoke === \"function\")\n .map((binding) =>\n naver.maps.Event.addListener(marker, binding.eventName, (event: unknown) => {\n binding.invoke?.(event);\n })\n );\n}\n\n// ─── Resolve position to LatLngLiteral for registry ───────────────\n\nfunction toLatLngLiteral(position: MarkerOptions[\"position\"]): { lat: number; lng: number } | null {\n if (!position) return null;\n\n if (typeof position === \"object\" && \"lat\" in position && \"lng\" in position) {\n if (typeof position.lat === \"number\" && typeof position.lng === \"number\") {\n return { lat: position.lat, lng: position.lng };\n }\n if (typeof position.lat === \"function\" && typeof position.lng === \"function\") {\n return {\n lat: (position as naver.maps.LatLng).lat(),\n lng: (position as naver.maps.LatLng).lng()\n };\n }\n }\n\n if (typeof position === \"object\" && \"x\" in position && \"y\" in position) {\n const p = position as naver.maps.Point;\n if (typeof p.x === \"number\" && typeof p.y === \"number\") {\n return { lat: p.y, lng: p.x };\n }\n }\n\n return null;\n}\n\nexport const Marker = forwardRef<MarkerRef, MarkerProps>(\n function MarkerInner(props, ref): ReactPortal | null {\n const { map: contextMap, sdkStatus } = useNaverMap();\n const clustererRegistry = useContext(ClustererContext);\n const visibleIds = useContext(ClustererVisibilityContext);\n const isInsideClusterer = clustererRegistry !== null && clustererRegistry.enabled;\n const autoId = useId();\n const effectiveId = props.clustererItemId ?? autoId;\n const isHiddenByClusterer = isInsideClusterer && !visibleIds.has(effectiveId);\n const markerRef = useRef<naver.maps.Marker | null>(null);\n const markerEventListenersRef = useRef<naver.maps.MapEventListener[]>([]);\n const onMarkerDestroyRef = useRef<MarkerProps[\"onMarkerDestroy\"]>(props.onMarkerDestroy);\n const [markerDiv] = useState<HTMLDivElement>(() => document.createElement(\"div\"));\n const [portalReady, setPortalReady] = useState(false);\n const hasChildren = props.children !== undefined && props.children !== null;\n const targetMap = props.map ?? contextMap;\n\n // ── props를 ref로 관리 (effect 재실행 방지) ───────────────────────\n const propsRef = useRef(props);\n useEffect(() => {\n propsRef.current = props;\n });\n\n // ── Clusterer registry mode ───────────────────────────────\n\n useEffect(() => {\n if (!clustererRegistry) return;\n\n const id = props.clustererItemId ?? autoId;\n\n const latLng = toLatLngLiteral(props.position);\n if (!latLng) return;\n\n clustererRegistry.register({\n id,\n position: latLng,\n data: props.item ?? null,\n markerOptions: props.icon !== undefined ? { icon: props.icon } : undefined\n });\n\n return () => {\n clustererRegistry.unregister(id);\n };\n }, [autoId, clustererRegistry, props.clustererItemId, props.position, props.item, props.icon]);\n\n // ── Normal marker mode hooks (always called, but guarded) ─\n\n useEffect(() => {\n onMarkerDestroyRef.current = props.onMarkerDestroy;\n }, [props.onMarkerDestroy]);\n\n useEffect(() => {\n if (!hasChildren) {\n setPortalReady(false);\n return;\n }\n\n const updateReadyState = () => {\n setPortalReady(markerDiv.childNodes.length > 0);\n };\n\n updateReadyState();\n\n const observer = new MutationObserver(updateReadyState);\n observer.observe(markerDiv, {\n childList: true,\n subtree: true\n });\n\n return () => {\n observer.disconnect();\n };\n }, [hasChildren, markerDiv]);\n\n const invokeMarkerMethod = useCallback(\n <K extends keyof naver.maps.Marker>(\n methodName: K,\n ...args: Parameters<Extract<naver.maps.Marker[K], (...params: never[]) => unknown>>\n ): ReturnType<Extract<naver.maps.Marker[K], (...params: never[]) => unknown>> | undefined => {\n const marker = markerRef.current;\n\n if (!marker) {\n return undefined;\n }\n\n const method = marker[methodName] as unknown;\n\n if (typeof method !== \"function\") {\n return undefined;\n }\n\n return (method as (...params: unknown[]) => unknown).apply(marker, args) as ReturnType<\n Extract<naver.maps.Marker[K], (...params: never[]) => unknown>\n >;\n },\n []\n );\n\n const teardownMarker = useCallback(() => {\n const marker = markerRef.current;\n\n if (!marker) {\n return;\n }\n\n try {\n if (markerEventListenersRef.current.length > 0) {\n naver.maps.Event.removeListener(markerEventListenersRef.current);\n markerEventListenersRef.current = [];\n }\n\n naver.maps.Event.clearInstanceListeners(marker);\n } catch (error) {\n console.error(\"[react-naver-maps-kit] failed to clear marker listeners\", error);\n }\n\n marker.setMap(null);\n markerRef.current = null;\n onMarkerDestroyRef.current?.();\n }, []);\n\n useImperativeHandle(\n ref,\n (): MarkerRef => ({\n getInstance: () => markerRef.current,\n getAnimation: (...args) => invokeMarkerMethod(\"getAnimation\", ...args),\n getClickable: (...args) => invokeMarkerMethod(\"getClickable\", ...args),\n getCursor: (...args) => invokeMarkerMethod(\"getCursor\", ...args),\n getDraggable: (...args) => invokeMarkerMethod(\"getDraggable\", ...args),\n getDrawingRect: (...args) => invokeMarkerMethod(\"getDrawingRect\", ...args),\n getElement: (...args) => invokeMarkerMethod(\"getElement\", ...args),\n getIcon: (...args) => invokeMarkerMethod(\"getIcon\", ...args),\n getMap: (...args) => invokeMarkerMethod(\"getMap\", ...args),\n getOptions: (...args) => invokeMarkerMethod(\"getOptions\", ...args),\n getPanes: (...args) => invokeMarkerMethod(\"getPanes\", ...args),\n getPosition: (...args) => invokeMarkerMethod(\"getPosition\", ...args),\n getProjection: (...args) => invokeMarkerMethod(\"getProjection\", ...args),\n getShape: (...args) => invokeMarkerMethod(\"getShape\", ...args),\n getTitle: (...args) => invokeMarkerMethod(\"getTitle\", ...args),\n getVisible: (...args) => invokeMarkerMethod(\"getVisible\", ...args),\n getZIndex: (...args) => invokeMarkerMethod(\"getZIndex\", ...args),\n setAnimation: (...args) => invokeMarkerMethod(\"setAnimation\", ...args),\n setClickable: (...args) => invokeMarkerMethod(\"setClickable\", ...args),\n setCursor: (...args) => invokeMarkerMethod(\"setCursor\", ...args),\n setDraggable: (...args) => invokeMarkerMethod(\"setDraggable\", ...args),\n setIcon: (...args) => invokeMarkerMethod(\"setIcon\", ...args),\n setMap: (...args) => invokeMarkerMethod(\"setMap\", ...args),\n setOptions: (...args) => invokeMarkerMethod(\"setOptions\", ...args),\n setPosition: (...args) => invokeMarkerMethod(\"setPosition\", ...args),\n setShape: (...args) => invokeMarkerMethod(\"setShape\", ...args),\n setTitle: (...args) => invokeMarkerMethod(\"setTitle\", ...args),\n setVisible: (...args) => invokeMarkerMethod(\"setVisible\", ...args),\n setZIndex: (...args) => invokeMarkerMethod(\"setZIndex\", ...args)\n }),\n [invokeMarkerMethod]\n );\n\n useEffect(() => {\n if (isHiddenByClusterer) return;\n if (sdkStatus !== \"ready\" || !targetMap || markerRef.current) {\n return;\n }\n\n if (hasChildren && !portalReady) {\n return;\n }\n\n try {\n const resolvedIcon = resolveMarkerIcon(propsRef.current.icon, markerDiv, hasChildren);\n const marker = new naver.maps.Marker(\n toMarkerOptions(propsRef.current, targetMap, resolvedIcon)\n );\n\n markerRef.current = marker;\n\n if (propsRef.current.collisionBehavior !== undefined) {\n marker.setOptions(\"collisionBehavior\", propsRef.current.collisionBehavior);\n }\n\n if (propsRef.current.collisionBoxSize !== undefined) {\n marker.setOptions(\"collisionBoxSize\", propsRef.current.collisionBoxSize);\n }\n\n bindMarkerEventListeners(\n marker,\n markerEventListenersRef,\n buildMarkerEventBindings(propsRef)\n );\n propsRef.current.onMarkerReady?.(marker);\n } catch (error) {\n const normalizedError =\n error instanceof Error\n ? error\n : new Error(\"Failed to create naver.maps.Marker instance.\");\n\n propsRef.current.onMarkerError?.(normalizedError);\n }\n }, [isHiddenByClusterer, hasChildren, markerDiv, portalReady, sdkStatus, targetMap]);\n\n useLayoutEffect(() => {\n if (isHiddenByClusterer) return;\n const marker = markerRef.current;\n\n if (!marker || !targetMap) {\n return;\n }\n\n const rafId = requestAnimationFrame(() => {\n const currentProps = propsRef.current;\n const resolvedIcon =\n hasChildren && portalReady\n ? resolveMarkerIcon(currentProps.icon, markerDiv, hasChildren)\n : currentProps.icon;\n const nextOptions = toMarkerOptions(currentProps, targetMap, resolvedIcon);\n\n marker.setOptions(nextOptions);\n\n if (currentProps.collisionBehavior !== undefined) {\n marker.setOptions(\"collisionBehavior\", currentProps.collisionBehavior);\n }\n\n if (currentProps.collisionBoxSize !== undefined) {\n marker.setOptions(\"collisionBoxSize\", currentProps.collisionBoxSize);\n }\n });\n\n return () => {\n cancelAnimationFrame(rafId);\n };\n }, [\n isHiddenByClusterer,\n hasChildren,\n markerDiv,\n portalReady,\n targetMap,\n props.position,\n props.icon,\n props.animation,\n props.shape,\n props.title,\n props.cursor,\n props.clickable,\n props.draggable,\n props.visible,\n props.zIndex,\n props.collisionBehavior,\n props.collisionBoxSize\n ]);\n\n useEffect(() => {\n if (isHiddenByClusterer) return;\n const marker = markerRef.current;\n\n if (!marker) {\n return;\n }\n\n bindMarkerEventListeners(marker, markerEventListenersRef, buildMarkerEventBindings(propsRef));\n\n return () => {\n if (markerEventListenersRef.current.length > 0) {\n naver.maps.Event.removeListener(markerEventListenersRef.current);\n markerEventListenersRef.current = [];\n }\n };\n }, [isHiddenByClusterer]);\n\n useEffect(() => {\n if (isHiddenByClusterer) return;\n return () => {\n teardownMarker();\n };\n }, [isHiddenByClusterer, teardownMarker]);\n\n // Hidden by clusterer: registered in registry but not rendered on map\n if (isHiddenByClusterer) {\n return null;\n }\n\n if (!hasChildren || !markerDiv) {\n return null;\n }\n\n return createPortal(props.children, markerDiv);\n }\n);\n\nMarker.displayName = \"Marker\";\n","import type { AlgorithmContext, Cluster, ClusterAlgorithm, ItemRecord } from \"../types\";\n\ninterface GridAlgorithmOptions {\n readonly gridSize: number;\n readonly minClusterSize: number;\n readonly maxZoom: number;\n}\n\nconst DEFAULT_OPTIONS: GridAlgorithmOptions = {\n gridSize: 60,\n minClusterSize: 2,\n maxZoom: 21\n};\n\nexport class GridAlgorithm<TData> implements ClusterAlgorithm<TData> {\n private options: GridAlgorithmOptions;\n\n constructor(options?: Partial<GridAlgorithmOptions>) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n\n cluster(\n items: readonly ItemRecord<TData>[],\n ctx: AlgorithmContext\n ): {\n readonly clusters: readonly Cluster<TData>[];\n readonly points: readonly ItemRecord<TData>[];\n } {\n if (ctx.zoom >= this.options.maxZoom) {\n return { clusters: [], points: items };\n }\n\n const { gridSize } = this.options;\n const scale = Math.pow(2, ctx.zoom);\n const cellMap = new Map<string, ItemRecord<TData>[]>();\n\n for (const item of items) {\n const worldX = ((item.position.lng + 180) / 360) * scale;\n const latRad = (item.position.lat * Math.PI) / 180;\n const worldY = ((1 - Math.log(Math.tan(latRad) + 1 / Math.cos(latRad)) / Math.PI) / 2) * scale;\n\n const cellX = Math.floor((worldX * 256) / gridSize);\n const cellY = Math.floor((worldY * 256) / gridSize);\n const key = `${cellX}:${cellY}`;\n\n let cell = cellMap.get(key);\n if (!cell) {\n cell = [];\n cellMap.set(key, cell);\n }\n cell.push(item);\n }\n\n const clusters: Cluster<TData>[] = [];\n const points: ItemRecord<TData>[] = [];\n\n for (const [key, cellItems] of cellMap) {\n if (cellItems.length < this.options.minClusterSize) {\n points.push(...cellItems);\n continue;\n }\n\n let sumLat = 0;\n let sumLng = 0;\n let minLat = Infinity;\n let maxLat = -Infinity;\n let minLng = Infinity;\n let maxLng = -Infinity;\n\n for (const item of cellItems) {\n sumLat += item.position.lat;\n sumLng += item.position.lng;\n minLat = Math.min(minLat, item.position.lat);\n maxLat = Math.max(maxLat, item.position.lat);\n minLng = Math.min(minLng, item.position.lng);\n maxLng = Math.max(maxLng, item.position.lng);\n }\n\n clusters.push({\n id: `grid-${key}`,\n position: {\n lat: sumLat / cellItems.length,\n lng: sumLng / cellItems.length\n },\n count: cellItems.length,\n bounds: {\n south: minLat,\n north: maxLat,\n west: minLng,\n east: maxLng\n },\n items: cellItems\n });\n }\n\n return { clusters, points };\n }\n\n setOptions(options: unknown): void {\n if (typeof options === \"object\" && options !== null) {\n this.options = { ...this.options, ...(options as Partial<GridAlgorithmOptions>) };\n }\n }\n}\n","import type { AlgorithmContext, Cluster, ClusterAlgorithm, ItemRecord } from \"../types\";\n\ninterface RadiusAlgorithmOptions {\n readonly radius: number;\n readonly minClusterSize: number;\n readonly maxZoom: number;\n}\n\nconst DEFAULT_OPTIONS: RadiusAlgorithmOptions = {\n radius: 60,\n minClusterSize: 2,\n maxZoom: 21\n};\n\nfunction toWorldPixel(lat: number, lng: number, zoom: number): { x: number; y: number } {\n const scale = Math.pow(2, zoom) * 256;\n const x = ((lng + 180) / 360) * scale;\n const latRad = (lat * Math.PI) / 180;\n const y = ((1 - Math.log(Math.tan(latRad) + 1 / Math.cos(latRad)) / Math.PI) / 2) * scale;\n return { x, y };\n}\n\nfunction pixelDistance(\n a: { x: number; y: number },\n b: { x: number; y: number }\n): number {\n const dx = a.x - b.x;\n const dy = a.y - b.y;\n return Math.sqrt(dx * dx + dy * dy);\n}\n\nexport class RadiusAlgorithm<TData> implements ClusterAlgorithm<TData> {\n private options: RadiusAlgorithmOptions;\n\n constructor(options?: Partial<RadiusAlgorithmOptions>) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n\n cluster(\n items: readonly ItemRecord<TData>[],\n ctx: AlgorithmContext\n ): {\n readonly clusters: readonly Cluster<TData>[];\n readonly points: readonly ItemRecord<TData>[];\n } {\n if (ctx.zoom >= this.options.maxZoom) {\n return { clusters: [], points: items };\n }\n\n const { radius } = this.options;\n const used = new Set<string | number>();\n const clusters: Cluster<TData>[] = [];\n const points: ItemRecord<TData>[] = [];\n\n const pixelPositions = items.map((item) =>\n toWorldPixel(item.position.lat, item.position.lng, ctx.zoom)\n );\n\n for (let i = 0; i < items.length; i++) {\n if (used.has(items[i].id)) continue;\n\n const center = pixelPositions[i];\n const group: ItemRecord<TData>[] = [items[i]];\n used.add(items[i].id);\n\n for (let j = i + 1; j < items.length; j++) {\n if (used.has(items[j].id)) continue;\n if (pixelDistance(center, pixelPositions[j]) <= radius) {\n group.push(items[j]);\n used.add(items[j].id);\n }\n }\n\n if (group.length < this.options.minClusterSize) {\n points.push(...group);\n continue;\n }\n\n let sumLat = 0;\n let sumLng = 0;\n let minLat = Infinity;\n let maxLat = -Infinity;\n let minLng = Infinity;\n let maxLng = -Infinity;\n\n for (const item of group) {\n sumLat += item.position.lat;\n sumLng += item.position.lng;\n minLat = Math.min(minLat, item.position.lat);\n maxLat = Math.max(maxLat, item.position.lat);\n minLng = Math.min(minLng, item.position.lng);\n maxLng = Math.max(maxLng, item.position.lng);\n }\n\n const avgLat = sumLat / group.length;\n const avgLng = sumLng / group.length;\n\n clusters.push({\n id: `radius-${avgLat.toFixed(6)}-${avgLng.toFixed(6)}-${group.length}`,\n position: { lat: avgLat, lng: avgLng },\n count: group.length,\n bounds: { south: minLat, north: maxLat, west: minLng, east: maxLng },\n items: group\n });\n }\n\n return { clusters, points };\n }\n\n setOptions(options: unknown): void {\n if (typeof options === \"object\" && options !== null) {\n this.options = { ...this.options, ...(options as Partial<RadiusAlgorithmOptions>) };\n }\n }\n}\n","\nconst ARRAY_TYPES = [\n Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array,\n Int32Array, Uint32Array, Float32Array, Float64Array\n];\n\n/** @typedef {Int8ArrayConstructor | Uint8ArrayConstructor | Uint8ClampedArrayConstructor | Int16ArrayConstructor | Uint16ArrayConstructor | Int32ArrayConstructor | Uint32ArrayConstructor | Float32ArrayConstructor | Float64ArrayConstructor} TypedArrayConstructor */\n\nconst VERSION = 1; // serialized format version\nconst HEADER_SIZE = 8;\n\nexport default class KDBush {\n\n /**\n * Creates an index from raw `ArrayBuffer` data.\n * @param {ArrayBuffer} data\n */\n static from(data) {\n if (!(data instanceof ArrayBuffer)) {\n throw new Error('Data must be an instance of ArrayBuffer.');\n }\n const [magic, versionAndType] = new Uint8Array(data, 0, 2);\n if (magic !== 0xdb) {\n throw new Error('Data does not appear to be in a KDBush format.');\n }\n const version = versionAndType >> 4;\n if (version !== VERSION) {\n throw new Error(`Got v${version} data when expected v${VERSION}.`);\n }\n const ArrayType = ARRAY_TYPES[versionAndType & 0x0f];\n if (!ArrayType) {\n throw new Error('Unrecognized array type.');\n }\n const [nodeSize] = new Uint16Array(data, 2, 1);\n const [numItems] = new Uint32Array(data, 4, 1);\n\n return new KDBush(numItems, nodeSize, ArrayType, data);\n }\n\n /**\n * Creates an index that will hold a given number of items.\n * @param {number} numItems\n * @param {number} [nodeSize=64] Size of the KD-tree node (64 by default).\n * @param {TypedArrayConstructor} [ArrayType=Float64Array] The array type used for coordinates storage (`Float64Array` by default).\n * @param {ArrayBuffer} [data] (For internal use only)\n */\n constructor(numItems, nodeSize = 64, ArrayType = Float64Array, data) {\n if (isNaN(numItems) || numItems < 0) throw new Error(`Unpexpected numItems value: ${numItems}.`);\n\n this.numItems = +numItems;\n this.nodeSize = Math.min(Math.max(+nodeSize, 2), 65535);\n this.ArrayType = ArrayType;\n this.IndexArrayType = numItems < 65536 ? Uint16Array : Uint32Array;\n\n const arrayTypeIndex = ARRAY_TYPES.indexOf(this.ArrayType);\n const coordsByteSize = numItems * 2 * this.ArrayType.BYTES_PER_ELEMENT;\n const idsByteSize = numItems * this.IndexArrayType.BYTES_PER_ELEMENT;\n const padCoords = (8 - idsByteSize % 8) % 8;\n\n if (arrayTypeIndex < 0) {\n throw new Error(`Unexpected typed array class: ${ArrayType}.`);\n }\n\n if (data && (data instanceof ArrayBuffer)) { // reconstruct an index from a buffer\n this.data = data;\n this.ids = new this.IndexArrayType(this.data, HEADER_SIZE, numItems);\n this.coords = new this.ArrayType(this.data, HEADER_SIZE + idsByteSize + padCoords, numItems * 2);\n this._pos = numItems * 2;\n this._finished = true;\n } else { // initialize a new index\n this.data = new ArrayBuffer(HEADER_SIZE + coordsByteSize + idsByteSize + padCoords);\n this.ids = new this.IndexArrayType(this.data, HEADER_SIZE, numItems);\n this.coords = new this.ArrayType(this.data, HEADER_SIZE + idsByteSize + padCoords, numItems * 2);\n this._pos = 0;\n this._finished = false;\n\n // set header\n new Uint8Array(this.data, 0, 2).set([0xdb, (VERSION << 4) + arrayTypeIndex]);\n new Uint16Array(this.data, 2, 1)[0] = nodeSize;\n new Uint32Array(this.data, 4, 1)[0] = numItems;\n }\n }\n\n /**\n * Add a point to the index.\n * @param {number} x\n * @param {number} y\n * @returns {number} An incremental index associated with the added item (starting from `0`).\n */\n add(x, y) {\n const index = this._pos >> 1;\n this.ids[index] = index;\n this.coords[this._pos++] = x;\n this.coords[this._pos++] = y;\n return index;\n }\n\n /**\n * Perform indexing of the added points.\n */\n finish() {\n const numAdded = this._pos >> 1;\n if (numAdded !== this.numItems) {\n throw new Error(`Added ${numAdded} items when expected ${this.numItems}.`);\n }\n // kd-sort both arrays for efficient search\n sort(this.ids, this.coords, this.nodeSize, 0, this.numItems - 1, 0);\n\n this._finished = true;\n return this;\n }\n\n /**\n * Search the index for items within a given bounding box.\n * @param {number} minX\n * @param {number} minY\n * @param {number} maxX\n * @param {number} maxY\n * @returns {number[]} An array of indices correponding to the found items.\n */\n range(minX, minY, maxX, maxY) {\n if (!this._finished) throw new Error('Data not yet indexed - call index.finish().');\n\n const {ids, coords, nodeSize} = this;\n const stack = [0, ids.length - 1, 0];\n const result = [];\n\n // recursively search for items in range in the kd-sorted arrays\n while (stack.length) {\n const axis = stack.pop() || 0;\n const right = stack.pop() || 0;\n const left = stack.pop() || 0;\n\n // if we reached \"tree node\", search linearly\n if (right - left <= nodeSize) {\n for (let i = left; i <= right; i++) {\n const x = coords[2 * i];\n const y = coords[2 * i + 1];\n if (x >= minX && x <= maxX && y >= minY && y <= maxY) result.push(ids[i]);\n }\n continue;\n }\n\n // otherwise find the middle index\n const m = (left + right) >> 1;\n\n // include the middle item if it's in range\n const x = coords[2 * m];\n const y = coords[2 * m + 1];\n if (x >= minX && x <= maxX && y >= minY && y <= maxY) result.push(ids[m]);\n\n // queue search in halves that intersect the query\n if (axis === 0 ? minX <= x : minY <= y) {\n stack.push(left);\n stack.push(m - 1);\n stack.push(1 - axis);\n }\n if (axis === 0 ? maxX >= x : maxY >= y) {\n stack.push(m + 1);\n stack.push(right);\n stack.push(1 - axis);\n }\n }\n\n return result;\n }\n\n /**\n * Search the index for items within a given radius.\n * @param {number} qx\n * @param {number} qy\n * @param {number} r Query radius.\n * @returns {number[]} An array of indices correponding to the found items.\n */\n within(qx, qy, r) {\n if (!this._finished) throw new Error('Data not yet indexed - call index.finish().');\n\n const {ids, coords, nodeSize} = this;\n const stack = [0, ids.length - 1, 0];\n const result = [];\n const r2 = r * r;\n\n // recursively search for items within radius in the kd-sorted arrays\n while (stack.length) {\n const axis = stack.pop() || 0;\n const right = stack.pop() || 0;\n const left = stack.pop() || 0;\n\n // if we reached \"tree node\", search linearly\n if (right - left <= nodeSize) {\n for (let i = left; i <= right; i++) {\n if (sqDist(coords[2 * i], coords[2 * i + 1], qx, qy) <= r2) result.push(ids[i]);\n }\n continue;\n }\n\n // otherwise find the middle index\n const m = (left + right) >> 1;\n\n // include the middle item if it's in range\n const x = coords[2 * m];\n const y = coords[2 * m + 1];\n if (sqDist(x, y, qx, qy) <= r2) result.push(ids[m]);\n\n // queue search in halves that intersect the query\n if (axis === 0 ? qx - r <= x : qy - r <= y) {\n stack.push(left);\n stack.push(m - 1);\n stack.push(1 - axis);\n }\n if (axis === 0 ? qx + r >= x : qy + r >= y) {\n stack.push(m + 1);\n stack.push(right);\n stack.push(1 - axis);\n }\n }\n\n return result;\n }\n}\n\n/**\n * @param {Uint16Array | Uint32Array} ids\n * @param {InstanceType<TypedArrayConstructor>} coords\n * @param {number} nodeSize\n * @param {number} left\n * @param {number} right\n * @param {number} axis\n */\nfunction sort(ids, coords, nodeSize, left, right, axis) {\n if (right - left <= nodeSize) return;\n\n const m = (left + right) >> 1; // middle index\n\n // sort ids and coords around the middle index so that the halves lie\n // either left/right or top/bottom correspondingly (taking turns)\n select(ids, coords, m, left, right, axis);\n\n // recursively kd-sort first half and second half on the opposite axis\n sort(ids, coords, nodeSize, left, m - 1, 1 - axis);\n sort(ids, coords, nodeSize, m + 1, right, 1 - axis);\n}\n\n/**\n * Custom Floyd-Rivest selection algorithm: sort ids and coords so that\n * [left..k-1] items are smaller than k-th item (on either x or y axis)\n * @param {Uint16Array | Uint32Array} ids\n * @param {InstanceType<TypedArrayConstructor>} coords\n * @param {number} k\n * @param {number} left\n * @param {number} right\n * @param {number} axis\n */\nfunction select(ids, coords, k, left, right, axis) {\n\n while (right > left) {\n if (right - left > 600) {\n const n = right - left + 1;\n const m = k - left + 1;\n const z = Math.log(n);\n const s = 0.5 * Math.exp(2 * z / 3);\n const sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);\n const newLeft = Math.max(left, Math.floor(k - m * s / n + sd));\n const newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));\n select(ids, coords, k, newLeft, newRight, axis);\n }\n\n const t = coords[2 * k + axis];\n let i = left;\n let j = right;\n\n swapItem(ids, coords, left, k);\n if (coords[2 * right + axis] > t) swapItem(ids, coords, left, right);\n\n while (i < j) {\n swapItem(ids, coords, i, j);\n i++;\n j--;\n while (coords[2 * i + axis] < t) i++;\n while (coords[2 * j + axis] > t) j--;\n }\n\n if (coords[2 * left + axis] === t) swapItem(ids, coords, left, j);\n else {\n j++;\n swapItem(ids, coords, j, right);\n }\n\n if (j <= k) left = j + 1;\n if (k <= j) right = j - 1;\n }\n}\n\n/**\n * @param {Uint16Array | Uint32Array} ids\n * @param {InstanceType<TypedArrayConstructor>} coords\n * @param {number} i\n * @param {number} j\n */\nfunction swapItem(ids, coords, i, j) {\n swap(ids, i, j);\n swap(coords, 2 * i, 2 * j);\n swap(coords, 2 * i + 1, 2 * j + 1);\n}\n\n/**\n * @param {InstanceType<TypedArrayConstructor>} arr\n * @param {number} i\n * @param {number} j\n */\nfunction swap(arr, i, j) {\n const tmp = arr[i];\n arr[i] = arr[j];\n arr[j] = tmp;\n}\n\n/**\n * @param {number} ax\n * @param {number} ay\n * @param {number} bx\n * @param {number} by\n */\nfunction sqDist(ax, ay, bx, by) {\n const dx = ax - bx;\n const dy = ay - by;\n return dx * dx + dy * dy;\n}\n","\nimport KDBush from 'kdbush';\n\nconst defaultOptions = {\n minZoom: 0, // min zoom to generate clusters on\n maxZoom: 16, // max zoom level to cluster the points on\n minPoints: 2, // minimum points to form a cluster\n radius: 40, // cluster radius in pixels\n extent: 512, // tile extent (radius is calculated relative to it)\n nodeSize: 64, // size of the KD-tree leaf node, affects performance\n log: false, // whether to log timing info\n\n // whether to generate numeric ids for input features (in vector tiles)\n generateId: false,\n\n // a reduce function for calculating custom cluster properties\n reduce: null, // (accumulated, props) => { accumulated.sum += props.sum; }\n\n // properties to use for individual points when running the reducer\n map: props => props // props => ({sum: props.my_value})\n};\n\nconst fround = Math.fround || (tmp => ((x) => { tmp[0] = +x; return tmp[0]; }))(new Float32Array(1));\n\nconst OFFSET_ZOOM = 2;\nconst OFFSET_ID = 3;\nconst OFFSET_PARENT = 4;\nconst OFFSET_NUM = 5;\nconst OFFSET_PROP = 6;\n\nexport default class Supercluster {\n constructor(options) {\n this.options = Object.assign(Object.create(defaultOptions), options);\n this.trees = new Array(this.options.maxZoom + 1);\n this.stride = this.options.reduce ? 7 : 6;\n this.clusterProps = [];\n }\n\n load(points) {\n const {log, minZoom, maxZoom} = this.options;\n\n if (log) console.time('total time');\n\n const timerId = `prepare ${ points.length } points`;\n if (log) console.time(timerId);\n\n this.points = points;\n\n // generate a cluster object for each point and index input points into a KD-tree\n const data = [];\n\n for (let i = 0; i < points.length; i++) {\n const p = points[i];\n if (!p.geometry) continue;\n\n const [lng, lat] = p.geometry.coordinates;\n const x = fround(lngX(lng));\n const y = fround(latY(lat));\n // store internal point/cluster data in flat numeric arrays for performance\n data.push(\n x, y, // projected point coordinates\n Infinity, // the last zoom the point was processed at\n i, // index of the source feature in the original input array\n -1, // parent cluster id\n 1 // number of points in a cluster\n );\n if (this.options.reduce) data.push(0); // noop\n }\n let tree = this.trees[maxZoom + 1] = this._createTree(data);\n\n if (log) console.timeEnd(timerId);\n\n // cluster points on max zoom, then cluster the results on previous zoom, etc.;\n // results in a cluster hierarchy across zoom levels\n for (let z = maxZoom; z >= minZoom; z--) {\n const now = +Date.now();\n\n // create a new set of clusters for the zoom and index them with a KD-tree\n tree = this.trees[z] = this._createTree(this._cluster(tree, z));\n\n if (log) console.log('z%d: %d clusters in %dms', z, tree.numItems, +Date.now() - now);\n }\n\n if (log) console.timeEnd('total time');\n\n return this;\n }\n\n getClusters(bbox, zoom) {\n let minLng = ((bbox[0] + 180) % 360 + 360) % 360 - 180;\n const minLat = Math.max(-90, Math.min(90, bbox[1]));\n let maxLng = bbox[2] === 180 ? 180 : ((bbox[2] + 180) % 360 + 360) % 360 - 180;\n const maxLat = Math.max(-90, Math.min(90, bbox[3]));\n\n if (bbox[2] - bbox[0] >= 360) {\n minLng = -180;\n maxLng = 180;\n } else if (minLng > maxLng) {\n const easternHem = this.getClusters([minLng, minLat, 180, maxLat], zoom);\n const westernHem = this.getClusters([-180, minLat, maxLng, maxLat], zoom);\n return easternHem.concat(westernHem);\n }\n\n const tree = this.trees[this._limitZoom(zoom)];\n const ids = tree.range(lngX(minLng), latY(maxLat), lngX(maxLng), latY(minLat));\n const data = tree.data;\n const clusters = [];\n for (const id of ids) {\n const k = this.stride * id;\n clusters.push(data[k + OFFSET_NUM] > 1 ? getClusterJSON(data, k, this.clusterProps) : this.points[data[k + OFFSET_ID]]);\n }\n return clusters;\n }\n\n getChildren(clusterId) {\n const originId = this._getOriginId(clusterId);\n const originZoom = this._getOriginZoom(clusterId);\n const errorMsg = 'No cluster with the specified id.';\n\n const tree = this.trees[originZoom];\n if (!tree) throw new Error(errorMsg);\n\n const data = tree.data;\n if (originId * this.stride >= data.length) throw new Error(errorMsg);\n\n const r = this.options.radius / (this.options.extent * Math.pow(2, originZoom - 1));\n const x = data[originId * this.stride];\n const y = data[originId * this.stride + 1];\n const ids = tree.within(x, y, r);\n const children = [];\n for (const id of ids) {\n const k = id * this.stride;\n if (data[k + OFFSET_PARENT] === clusterId) {\n children.push(data[k + OFFSET_NUM] > 1 ? getClusterJSON(data, k, this.clusterProps) : this.points[data[k + OFFSET_ID]]);\n }\n }\n\n if (children.length === 0) throw new Error(errorMsg);\n\n return children;\n }\n\n getLeaves(clusterId, limit, offset) {\n limit = limit || 10;\n offset = offset || 0;\n\n const leaves = [];\n this._appendLeaves(leaves, clusterId, limit, offset, 0);\n\n return leaves;\n }\n\n getTile(z, x, y) {\n const tree = this.trees[this._limitZoom(z)];\n const z2 = Math.pow(2, z);\n const {extent, radius} = this.options;\n const p = radius / extent;\n const top = (y - p) / z2;\n const bottom = (y + 1 + p) / z2;\n\n const tile = {\n features: []\n };\n\n this._addTileFeatures(\n tree.range((x - p) / z2, top, (x + 1 + p) / z2, bottom),\n tree.data, x, y, z2, tile);\n\n if (x === 0) {\n this._addTileFeatures(\n tree.range(1 - p / z2, top, 1, bottom),\n tree.data, z2, y, z2, tile);\n }\n if (x === z2 - 1) {\n this._addTileFeatures(\n tree.range(0, top, p / z2, bottom),\n tree.data, -1, y, z2, tile);\n }\n\n return tile.features.length ? tile : null;\n }\n\n getClusterExpansionZoom(clusterId) {\n let expansionZoom = this._getOriginZoom(clusterId) - 1;\n while (expansionZoom <= this.options.maxZoom) {\n const children = this.getChildren(clusterId);\n expansionZoom++;\n if (children.length !== 1) break;\n clusterId = children[0].properties.cluster_id;\n }\n return expansionZoom;\n }\n\n _appendLeaves(result, clusterId, limit, offset, skipped) {\n const children = this.getChildren(clusterId);\n\n for (const child of children) {\n const props = child.properties;\n\n if (props && props.cluster) {\n if (skipped + props.point_count <= offset) {\n // skip the whole cluster\n skipped += props.point_count;\n } else {\n // enter the cluster\n skipped = this._appendLeaves(result, props.cluster_id, limit, offset, skipped);\n // exit the cluster\n }\n } else if (skipped < offset) {\n // skip a single point\n skipped++;\n } else {\n // add a single point\n result.push(child);\n }\n if (result.length === limit) break;\n }\n\n return skipped;\n }\n\n _createTree(data) {\n const tree = new KDBush(data.length / this.stride | 0, this.options.nodeSize, Float32Array);\n for (let i = 0; i < data.length; i += this.stride) tree.add(data[i], data[i + 1]);\n tree.finish();\n tree.data = data;\n return tree;\n }\n\n _addTileFeatures(ids, data, x, y, z2, tile) {\n for (const i of ids) {\n const k = i * this.stride;\n const isCluster = data[k + OFFSET_NUM] > 1;\n\n let tags, px, py;\n if (isCluster) {\n tags = getClusterProperties(data, k, this.clusterProps);\n px = data[k];\n py = data[k + 1];\n } else {\n const p = this.points[data[k + OFFSET_ID]];\n tags = p.properties;\n const [lng, lat] = p.geometry.coordinates;\n px = lngX(lng);\n py = latY(lat);\n }\n\n const f = {\n type: 1,\n geometry: [[\n Math.round(this.options.extent * (px * z2 - x)),\n Math.round(this.options.extent * (py * z2 - y))\n ]],\n tags\n };\n\n // assign id\n let id;\n if (isCluster || this.options.generateId) {\n // optionally generate id for points\n id = data[k + OFFSET_ID];\n } else {\n // keep id if already assigned\n id = this.points[data[k + OFFSET_ID]].id;\n }\n\n if (id !== undefined) f.id = id;\n\n tile.features.push(f);\n }\n }\n\n _limitZoom(z) {\n return Math.max(this.options.minZoom, Math.min(Math.floor(+z), this.options.maxZoom + 1));\n }\n\n _cluster(tree, zoom) {\n const {radius, extent, reduce, minPoints} = this.options;\n const r = radius / (extent * Math.pow(2, zoom));\n const data = tree.data;\n const nextData = [];\n const stride = this.stride;\n\n // loop through each point\n for (let i = 0; i < data.length; i += stride) {\n // if we've already visited the point at this zoom level, skip it\n if (data[i + OFFSET_ZOOM] <= zoom) continue;\n data[i + OFFSET_ZOOM] = zoom;\n\n // find all nearby points\n const x = data[i];\n const y = data[i + 1];\n const neighborIds = tree.within(data[i], data[i + 1], r);\n\n const numPointsOrigin = data[i + OFFSET_NUM];\n let numPoints = numPointsOrigin;\n\n // count the number of points in a potential cluster\n for (const neighborId of neighborIds) {\n const k = neighborId * stride;\n // filter out neighbors that are already processed\n if (data[k + OFFSET_ZOOM] > zoom) numPoints += data[k + OFFSET_NUM];\n }\n\n // if there were neighbors to merge, and there are enough points to form a cluster\n if (numPoints > numPointsOrigin && numPoints >= minPoints) {\n let wx = x * numPointsOrigin;\n let wy = y * numPointsOrigin;\n\n let clusterProperties;\n let clusterPropIndex = -1;\n\n // encode both zoom and point index on which the cluster originated -- offset by total length of features\n const id = ((i / stride | 0) << 5) + (zoom + 1) + this.points.length;\n\n for (const neighborId of neighborIds) {\n const k = neighborId * stride;\n\n if (data[k + OFFSET_ZOOM] <= zoom) continue;\n data[k + OFFSET_ZOOM] = zoom; // save the zoom (so it doesn't get processed twice)\n\n const numPoints2 = data[k + OFFSET_NUM];\n wx += data[k] * numPoints2; // accumulate coordinates for calculating weighted center\n wy += data[k + 1] * numPoints2;\n\n data[k + OFFSET_PARENT] = id;\n\n if (reduce) {\n if (!clusterProperties) {\n clusterProperties = this._map(data, i, true);\n clusterPropIndex = this.clusterProps.length;\n this.clusterProps.push(clusterProperties);\n }\n reduce(clusterProperties, this._map(data, k));\n }\n }\n\n data[i + OFFSET_PARENT] = id;\n nextData.push(wx / numPoints, wy / numPoints, Infinity, id, -1, numPoints);\n if (reduce) nextData.push(clusterPropIndex);\n\n } else { // left points as unclustered\n for (let j = 0; j < stride; j++) nextData.push(data[i + j]);\n\n if (numPoints > 1) {\n for (const neighborId of neighborIds) {\n const k = neighborId * stride;\n if (data[k + OFFSET_ZOOM] <= zoom) continue;\n data[k + OFFSET_ZOOM] = zoom;\n for (let j = 0; j < stride; j++) nextData.push(data[k + j]);\n }\n }\n }\n }\n\n return nextData;\n }\n\n // get index of the point from which the cluster originated\n _getOriginId(clusterId) {\n return (clusterId - this.points.length) >> 5;\n }\n\n // get zoom of the point from which the cluster originated\n _getOriginZoom(clusterId) {\n return (clusterId - this.points.length) % 32;\n }\n\n _map(data, i, clone) {\n if (data[i + OFFSET_NUM] > 1) {\n const props = this.clusterProps[data[i + OFFSET_PROP]];\n return clone ? Object.assign({}, props) : props;\n }\n const original = this.points[data[i + OFFSET_ID]].properties;\n const result = this.options.map(original);\n return clone && result === original ? Object.assign({}, result) : result;\n }\n}\n\nfunction getClusterJSON(data, i, clusterProps) {\n return {\n type: 'Feature',\n id: data[i + OFFSET_ID],\n properties: getClusterProperties(data, i, clusterProps),\n geometry: {\n type: 'Point',\n coordinates: [xLng(data[i]), yLat(data[i + 1])]\n }\n };\n}\n\nfunction getClusterProperties(data, i, clusterProps) {\n const count = data[i + OFFSET_NUM];\n const abbrev =\n count >= 10000 ? `${Math.round(count / 1000) }k` :\n count >= 1000 ? `${Math.round(count / 100) / 10 }k` : count;\n const propIndex = data[i + OFFSET_PROP];\n const properties = propIndex === -1 ? {} : Object.assign({}, clusterProps[propIndex]);\n return Object.assign(properties, {\n cluster: true,\n cluster_id: data[i + OFFSET_ID],\n point_count: count,\n point_count_abbreviated: abbrev\n });\n}\n\n// longitude/latitude to spherical mercator in [0..1] range\nfunction lngX(lng) {\n return lng / 360 + 0.5;\n}\nfunction latY(lat) {\n const sin = Math.sin(lat * Math.PI / 180);\n const y = (0.5 - 0.25 * Math.log((1 + sin) / (1 - sin)) / Math.PI);\n return y < 0 ? 0 : y > 1 ? 1 : y;\n}\n\n// spherical mercator to longitude/latitude\nfunction xLng(x) {\n return (x - 0.5) * 360;\n}\nfunction yLat(y) {\n const y2 = (180 - y * 360) * Math.PI / 180;\n return 360 * Math.atan(Math.exp(y2)) / Math.PI - 90;\n}\n","import Supercluster from \"supercluster\";\n\nimport type { AlgorithmContext, Cluster, ClusterAlgorithm, ItemRecord } from \"../types\";\n\ninterface SuperclusterAlgorithmOptions {\n readonly radius: number;\n readonly minZoom: number;\n readonly maxZoom: number;\n readonly extent: number;\n readonly nodeSize: number;\n}\n\nconst DEFAULT_OPTIONS: SuperclusterAlgorithmOptions = {\n radius: 60,\n minZoom: 0,\n maxZoom: 16,\n extent: 512,\n nodeSize: 64\n};\n\ninterface PointProperties<TData> {\n itemId: string | number;\n data: TData;\n markerOptions?: Readonly<Partial<naver.maps.MarkerOptions>>;\n}\n\nexport class SuperclusterAlgorithm<TData> implements ClusterAlgorithm<TData> {\n private options: SuperclusterAlgorithmOptions;\n private index: Supercluster<PointProperties<TData>, Supercluster.AnyProps>;\n private itemMap: Map<string | number, ItemRecord<TData>> = new Map();\n private dirty = true;\n\n constructor(options?: Partial<SuperclusterAlgorithmOptions>) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n this.index = new Supercluster({\n radius: this.options.radius,\n minZoom: this.options.minZoom,\n maxZoom: this.options.maxZoom,\n extent: this.options.extent,\n nodeSize: this.options.nodeSize\n });\n }\n\n cluster(\n items: readonly ItemRecord<TData>[],\n ctx: AlgorithmContext\n ): {\n readonly clusters: readonly Cluster<TData>[];\n readonly points: readonly ItemRecord<TData>[];\n } {\n if (this.dirty || this.itemMap.size !== items.length) {\n this.load(items);\n }\n\n const { south, west, north, east } = ctx.bounds;\n const rawClusters = this.index.getClusters([west, south, east, north], Math.floor(ctx.zoom));\n\n const clusters: Cluster<TData>[] = [];\n const singlePoints: ItemRecord<TData>[] = [];\n\n for (const feature of rawClusters) {\n const [lng, lat] = feature.geometry.coordinates;\n const props = feature.properties;\n\n if (\"cluster\" in props && props.cluster === true) {\n const clusterProps = props as Supercluster.ClusterProperties & Supercluster.AnyProps;\n const clusterId = feature.id;\n const leaves = this.getLeaves(clusterId);\n\n let minLat = Infinity;\n let maxLat = -Infinity;\n let minLng = Infinity;\n let maxLng = -Infinity;\n\n for (const leaf of leaves) {\n minLat = Math.min(minLat, leaf.position.lat);\n maxLat = Math.max(maxLat, leaf.position.lat);\n minLng = Math.min(minLng, leaf.position.lng);\n maxLng = Math.max(maxLng, leaf.position.lng);\n }\n\n clusters.push({\n id: `sc-${String(clusterId)}`,\n position: { lat, lng },\n count: clusterProps.point_count,\n bounds: { south: minLat, north: maxLat, west: minLng, east: maxLng },\n items: leaves\n });\n } else {\n const pointProps = props as PointProperties<TData>;\n const item = this.itemMap.get(pointProps.itemId);\n if (item) {\n singlePoints.push(item);\n }\n }\n }\n\n return { clusters, points: singlePoints };\n }\n\n setOptions(options: unknown): void {\n if (typeof options === \"object\" && options !== null) {\n const next = { ...this.options, ...(options as Partial<SuperclusterAlgorithmOptions>) };\n this.options = next;\n this.index = new Supercluster({\n radius: next.radius,\n minZoom: next.minZoom,\n maxZoom: next.maxZoom,\n extent: next.extent,\n nodeSize: next.nodeSize\n });\n this.dirty = true;\n }\n }\n\n destroy(): void {\n this.itemMap.clear();\n }\n\n private load(items: readonly ItemRecord<TData>[]): void {\n this.itemMap.clear();\n\n const features: Array<Supercluster.PointFeature<PointProperties<TData>>> = [];\n\n for (const item of items) {\n this.itemMap.set(item.id, item);\n features.push({\n type: \"Feature\",\n geometry: {\n type: \"Point\",\n coordinates: [item.position.lng, item.position.lat]\n },\n properties: {\n itemId: item.id,\n data: item.data,\n markerOptions: item.markerOptions\n }\n });\n }\n\n this.index.load(features);\n this.dirty = false;\n }\n\n private getLeaves(clusterId: number | string | undefined): ItemRecord<TData>[] {\n if (clusterId === undefined) return [];\n\n const numericId = typeof clusterId === \"string\" ? parseInt(clusterId, 10) : clusterId;\n if (typeof numericId !== \"number\" || isNaN(numericId)) return [];\n\n const leaves = this.index.getLeaves(numericId, Infinity);\n const result: ItemRecord<TData>[] = [];\n\n for (const leaf of leaves) {\n const props = leaf.properties as PointProperties<TData>;\n const item = this.itemMap.get(props.itemId);\n if (item) {\n result.push(item);\n }\n }\n\n return result;\n }\n}\n","import type { BuiltInAlgorithmConfig, ClusterAlgorithm } from \"../types\";\nimport { GridAlgorithm } from \"./grid\";\nimport { RadiusAlgorithm } from \"./radius\";\nimport { SuperclusterAlgorithm } from \"./supercluster\";\n\nexport function isBuiltInConfig(\n value: BuiltInAlgorithmConfig | ClusterAlgorithm<unknown>\n): value is BuiltInAlgorithmConfig {\n return \"type\" in value && typeof (value as BuiltInAlgorithmConfig).type === \"string\";\n}\n\nfunction omitUndefined<T extends Record<string, unknown>>(obj: T): Partial<T> {\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n if (obj[key] !== undefined) {\n result[key] = obj[key];\n }\n }\n return result as Partial<T>;\n}\n\nexport function createAlgorithm<TData>(\n config: BuiltInAlgorithmConfig\n): ClusterAlgorithm<TData> {\n switch (config.type) {\n case \"grid\":\n return new GridAlgorithm<TData>(omitUndefined({\n gridSize: config.gridSize,\n minClusterSize: config.minClusterSize,\n maxZoom: config.maxZoom\n }));\n case \"radius\":\n return new RadiusAlgorithm<TData>(omitUndefined({\n radius: config.radius,\n minClusterSize: config.minClusterSize,\n maxZoom: config.maxZoom\n }));\n case \"supercluster\":\n return new SuperclusterAlgorithm<TData>(omitUndefined({\n radius: config.radius,\n minZoom: config.minZoom,\n maxZoom: config.maxZoom,\n extent: config.extent,\n nodeSize: config.nodeSize\n }));\n }\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { useNaverMap } from \"../../react/hooks/useNaverMap\";\nimport { Marker } from \"../marker/Marker\";\n\nimport { createAlgorithm, isBuiltInConfig } from \"./algorithms/createAlgorithm\";\nimport { ClustererContext, ClustererVisibilityContext } from \"./ClustererContext\";\n\nimport type { ClustererRegistry } from \"./ClustererContext\";\nimport type {\n Cluster,\n ClusterAlgorithm,\n ItemRecord,\n LatLngBoundsLiteral,\n MarkerClustererHelpers,\n MarkerClustererProps\n} from \"./types\";\n\n// ─── Default cluster icon (simple circle with count) ─────────────\n\nfunction DefaultClusterIcon({ count }: { count: number }) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 40,\n height: 40,\n borderRadius: \"50%\",\n backgroundColor: \"rgba(0, 100, 255, 0.7)\",\n color: \"#fff\",\n fontWeight: \"bold\",\n fontSize: 14,\n border: \"2px solid rgba(0, 100, 255, 0.9)\"\n }}\n >\n {count}\n </div>\n );\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────\n\nfunction getMapBounds(map: naver.maps.Map): LatLngBoundsLiteral {\n const bounds = map.getBounds();\n\n if (bounds instanceof naver.maps.LatLngBounds) {\n const sw = bounds.getSW();\n const ne = bounds.getNE();\n return {\n south: sw.lat(),\n west: sw.lng(),\n north: ne.lat(),\n east: ne.lng()\n };\n }\n\n // bounds may be a PointBoundsLiteral — extract manually\n const b = bounds as unknown as Record<string, unknown>;\n if (\"south\" in b && \"north\" in b && \"west\" in b && \"east\" in b) {\n return {\n south: b.south as number,\n north: b.north as number,\n west: b.west as number,\n east: b.east as number\n };\n }\n\n // Fallback: return a large bounds\n return { south: -90, north: 90, west: -180, east: 180 };\n}\n\nfunction padBounds(bounds: LatLngBoundsLiteral, padding: number): LatLngBoundsLiteral {\n const latPad = (bounds.north - bounds.south) * padding * 0.01;\n const lngPad = (bounds.east - bounds.west) * padding * 0.01;\n return {\n south: bounds.south - latPad,\n north: bounds.north + latPad,\n west: bounds.west - lngPad,\n east: bounds.east + lngPad\n };\n}\n\n// ─── Component ────────────────────────────────────────────────────\n\n/**\n * 다수의 `<Marker>`를 자동으로 클러스터링해주는 컴포넌트.\n *\n * ## 동작 방식\n *\n * 1. `<Marker>`는 `<MarkerClusterer>` 내부에서 직접 마커를 생성하지 않고\n * 내부 registry에 위치·데이터를 등록합니다.\n * 2. `MarkerClusterer`는 지도 이벤트(`idle`, `move`, `zoom`) 발생 시\n * 현재 줌·뷰포트 기준으로 클러스터를 재계산합니다.\n * 3. 클러스터 마커는 `<Marker>` JSX로 렌더링되며, children으로 클러스터 아이콘이 전달됩니다.\n * 4. 클러스터에 포함되지 않은 단독 포인트는 원래 `<Marker>` children을 그대로 표시합니다.\n *\n * ## 기본 사용법\n *\n * ```tsx\n * <NaverMap ...>\n * <MarkerClusterer\n * algorithm={{ type: \"supercluster\", radius: 60 }}\n * clusterIcon={({ count }) => <ClusterBadge count={count} />}\n * onClusterClick={({ cluster, helpers }) =>\n * helpers.zoomToCluster(cluster, { maxZoom: 16 })\n * }\n * >\n * {points.map(p => (\n * <Marker\n * key={p.id}\n * position={p.position}\n * item={p}\n * >\n * <CustomPin />\n * </Marker>\n * ))}\n * </MarkerClusterer>\n * </NaverMap>\n * ```\n *\n * ## 주의 사항\n *\n * - `<MarkerClusterer>`는 반드시 `<NaverMap>` 내부에 위치해야 합니다.\n * - `enabled={false}`로 설정하면 클러스터링이 해제되고 각 `<Marker>`가 개별 마커로 렌더링됩니다.\n *\n * @typeParam TData - children `<Marker>`의 `item` prop 타입\n */\nexport function MarkerClusterer<TData = unknown>(props: MarkerClustererProps<TData>) {\n const {\n algorithm: algorithmProp,\n clusterIcon,\n onClusterClick,\n behavior,\n clusterData,\n enabled = true,\n children\n } = props;\n\n const { map, sdkStatus } = useNaverMap();\n\n // ── Registry ──────────────────────────────────────────────────\n\n const registryRef = useRef(new Map<string | number, ItemRecord<TData>>());\n const [registryVersion, setRegistryVersion] = useState(0);\n\n const registry: ClustererRegistry<TData> = useMemo(\n () => ({\n enabled,\n register(item: ItemRecord<TData>) {\n registryRef.current.set(item.id, item);\n setRegistryVersion((v) => v + 1);\n },\n unregister(id: string | number) {\n registryRef.current.delete(id);\n setRegistryVersion((v) => v + 1);\n }\n }),\n [enabled]\n );\n\n // ── Algorithm ─────────────────────────────────────────────────\n\n const algorithmRef = useRef<ClusterAlgorithm<TData> | null>(null);\n\n const algorithm = useMemo<ClusterAlgorithm<TData>>(() => {\n if (algorithmProp && !isBuiltInConfig(algorithmProp)) {\n return algorithmProp as ClusterAlgorithm<TData>;\n }\n const config = algorithmProp ?? { type: \"supercluster\" as const, radius: 60 };\n if (!isBuiltInConfig(config)) {\n return config as ClusterAlgorithm<TData>;\n }\n return createAlgorithm<TData>(config);\n }, [algorithmProp]);\n\n useEffect(() => {\n const prev = algorithmRef.current;\n algorithmRef.current = algorithm;\n return () => {\n if (prev && prev !== algorithm) {\n prev.destroy?.();\n }\n };\n }, [algorithm]);\n\n // ── Computed cluster state ─────────────────────────────────────\n\n const [clusters, setClusters] = useState<readonly Cluster<TData>[]>([]);\n const [visibleIds, setVisibleIds] = useState<ReadonlySet<string | number>>(new Set());\n\n // ── Helpers ───────────────────────────────────────────────────\n\n const helpersRef = useRef<MarkerClustererHelpers<TData>>({\n zoomToCluster: () => {},\n fitBounds: () => {}\n });\n\n useEffect(() => {\n if (!map) return;\n\n helpersRef.current = {\n zoomToCluster(\n cluster: Cluster<TData>,\n options?: { readonly padding?: number; readonly maxZoom?: number }\n ) {\n if (cluster.bounds) {\n const bounds = options?.padding\n ? padBounds(cluster.bounds, options.padding)\n : cluster.bounds;\n\n const latLngBounds = new naver.maps.LatLngBounds(\n new naver.maps.LatLng(bounds.south, bounds.west),\n new naver.maps.LatLng(bounds.north, bounds.east)\n );\n\n map.fitBounds(latLngBounds);\n\n if (options?.maxZoom !== undefined) {\n const currentZoom = map.getZoom();\n if (currentZoom > options.maxZoom) {\n map.setZoom(options.maxZoom);\n }\n }\n } else {\n const nextZoom = Math.min(map.getZoom() + 1, options?.maxZoom ?? 21);\n map.setCenter(new naver.maps.LatLng(cluster.position.lat, cluster.position.lng));\n map.setZoom(nextZoom);\n }\n },\n\n fitBounds(bounds: LatLngBoundsLiteral, options?: { readonly padding?: number }) {\n const paddedBounds = options?.padding ? padBounds(bounds, options.padding) : bounds;\n\n const latLngBounds = new naver.maps.LatLngBounds(\n new naver.maps.LatLng(paddedBounds.south, paddedBounds.west),\n new naver.maps.LatLng(paddedBounds.north, paddedBounds.east)\n );\n\n map.fitBounds(latLngBounds);\n }\n };\n }, [map]);\n\n // ── onClusterClick ref ────────────────────────────────────────\n\n const onClusterClickRef = useRef(onClusterClick);\n useEffect(() => {\n onClusterClickRef.current = onClusterClick;\n }, [onClusterClick]);\n\n // ── Recompute ─────────────────────────────────────────────────\n\n const recompute = useCallback(() => {\n if (!map || sdkStatus !== \"ready\" || !enabled) return;\n\n const zoom = map.getZoom();\n const bounds = getMapBounds(map);\n const items = Array.from(registryRef.current.values());\n\n const { clusters: rawClusters, points } = algorithm.cluster(items, { zoom, bounds });\n\n // Optionally trim items from cluster data\n const maxItems = clusterData?.maxItemsInCluster;\n const includeItems = clusterData?.includeItems ?? true;\n\n const processedClusters: readonly Cluster<TData>[] = rawClusters.map((c) => ({\n ...c,\n items: includeItems\n ? maxItems !== undefined\n ? c.items?.slice(0, maxItems)\n : c.items\n : undefined\n }));\n\n setClusters(processedClusters);\n setVisibleIds(new Set(points.map((p) => p.id)));\n }, [\n map,\n sdkStatus,\n enabled,\n algorithm,\n clusterData?.includeItems,\n clusterData?.maxItemsInCluster\n ]);\n\n // ── Trigger recompute on registry change ──────────────────────\n\n useEffect(() => {\n recompute();\n }, [recompute, registryVersion]);\n\n // ── Map event listeners for recompute ─────────────────────────\n\n useEffect(() => {\n if (!map || sdkStatus !== \"ready\" || !enabled) return;\n\n const recomputeOn = behavior?.recomputeOn ?? \"idle\";\n const debounceMs = behavior?.debounceMs ?? 200;\n\n let timerId: ReturnType<typeof setTimeout> | null = null;\n const listeners: naver.maps.MapEventListener[] = [];\n\n const debouncedRecompute = () => {\n if (timerId !== null) {\n clearTimeout(timerId);\n }\n timerId = setTimeout(() => {\n recompute();\n timerId = null;\n }, debounceMs);\n };\n\n if (recomputeOn === \"idle\") {\n listeners.push(naver.maps.Event.addListener(map, \"idle\", debouncedRecompute));\n } else if (recomputeOn === \"move\") {\n listeners.push(naver.maps.Event.addListener(map, \"bounds_changed\", debouncedRecompute));\n } else if (recomputeOn === \"zoom\") {\n listeners.push(naver.maps.Event.addListener(map, \"zoom_changed\", debouncedRecompute));\n }\n\n // Initial compute\n recompute();\n\n return () => {\n if (timerId !== null) {\n clearTimeout(timerId);\n }\n if (listeners.length > 0) {\n naver.maps.Event.removeListener(listeners);\n }\n };\n }, [map, sdkStatus, enabled, behavior?.recomputeOn, behavior?.debounceMs, recompute]);\n\n // ── Disable: clear cluster state when enabled becomes false ───\n\n useEffect(() => {\n if (enabled) return;\n setClusters([]);\n setVisibleIds(new Set());\n }, [enabled]);\n\n // ── Render ────────────────────────────────────────────────────\n\n return (\n <>\n <ClustererContext.Provider value={registry as ClustererRegistry}>\n <ClustererVisibilityContext.Provider value={visibleIds}>\n {children}\n </ClustererVisibilityContext.Provider>\n </ClustererContext.Provider>\n {enabled &&\n clusters.map((cluster) => (\n <Marker\n key={cluster.id}\n position={cluster.position}\n clickable\n onClick={() => {\n onClusterClickRef.current?.({ cluster, helpers: helpersRef.current });\n }}\n >\n {clusterIcon ? (\n clusterIcon({ cluster, count: cluster.count })\n ) : (\n <DefaultClusterIcon count={cluster.count} />\n )}\n </Marker>\n ))}\n </>\n );\n}\n\nMarkerClusterer.displayName = \"MarkerClusterer\";\n","import { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { useNaverMap } from \"../../react/hooks/useNaverMap\";\n\nimport type { ReactNode, ReactPortal } from \"react\";\n\ntype InfoWindowOptions = naver.maps.InfoWindowOptions;\ntype InfoWindowAnchor = naver.maps.Coord | naver.maps.CoordLiteral | naver.maps.Marker;\n\ninterface InfoWindowOptionProps {\n position?: InfoWindowOptions[\"position\"];\n content?: InfoWindowOptions[\"content\"];\n zIndex?: InfoWindowOptions[\"zIndex\"];\n maxWidth?: InfoWindowOptions[\"maxWidth\"];\n pixelOffset?: InfoWindowOptions[\"pixelOffset\"];\n backgroundColor?: InfoWindowOptions[\"backgroundColor\"];\n borderColor?: InfoWindowOptions[\"borderColor\"];\n borderWidth?: InfoWindowOptions[\"borderWidth\"];\n disableAutoPan?: InfoWindowOptions[\"disableAutoPan\"];\n disableAnchor?: InfoWindowOptions[\"disableAnchor\"];\n anchorSkew?: InfoWindowOptions[\"anchorSkew\"];\n anchorSize?: InfoWindowOptions[\"anchorSize\"];\n anchorColor?: InfoWindowOptions[\"anchorColor\"];\n autoPanPadding?: naver.maps.Point | naver.maps.PointLiteral;\n}\n\ninterface InfoWindowLifecycleProps {\n anchor?: InfoWindowAnchor;\n visible?: boolean;\n children?: ReactNode;\n onInfoWindowReady?: (infoWindow: naver.maps.InfoWindow) => void;\n onInfoWindowDestroy?: () => void;\n onInfoWindowError?: (error: Error) => void;\n}\n\ninterface InfoWindowEventProps {\n onOpen?: (pointerEvent: naver.maps.PointerEvent) => void;\n onClose?: (pointerEvent: naver.maps.PointerEvent) => void;\n onAnchorColorChanged?: (anchorColor: string) => void;\n onAnchorSizeChanged?: (anchorSize: naver.maps.Size) => void;\n onAnchorSkewChanged?: (anchorSkew: boolean) => void;\n onBackgroundColorChanged?: (backgroundColor: string) => void;\n onBorderColorChanged?: (borderColor: string) => void;\n onBorderWidthChanged?: (borderWidth: number) => void;\n onContentChanged?: (content: string | HTMLElement) => void;\n onDisableAnchorChanged?: (disableAnchor: boolean) => void;\n onDisableAutoPanChanged?: (disableAutoPan: boolean) => void;\n onMaxWidthChanged?: (maxWidth: number) => void;\n onPixelOffsetChanged?: (pixelOffset: naver.maps.Point) => void;\n onPositionChanged?: (position: naver.maps.Coord) => void;\n onZIndexChanged?: (zIndex: number) => void;\n}\n\nexport type InfoWindowProps = InfoWindowOptionProps &\n InfoWindowLifecycleProps &\n InfoWindowEventProps;\n\ntype InfoWindowMethod<K extends keyof naver.maps.InfoWindow> = naver.maps.InfoWindow[K] extends (\n ...args: infer A\n) => infer R\n ? (...args: A) => R | undefined\n : never;\n\nexport interface InfoWindowRef {\n getInstance: () => naver.maps.InfoWindow | null;\n close: InfoWindowMethod<\"close\">;\n getContent: InfoWindowMethod<\"getContent\">;\n getContentElement: InfoWindowMethod<\"getContentElement\">;\n getMap: InfoWindowMethod<\"getMap\">;\n getOptions: InfoWindowMethod<\"getOptions\">;\n getPanes: InfoWindowMethod<\"getPanes\">;\n getPosition: InfoWindowMethod<\"getPosition\">;\n getProjection: InfoWindowMethod<\"getProjection\">;\n getZIndex: InfoWindowMethod<\"getZIndex\">;\n open: InfoWindowMethod<\"open\">;\n setContent: InfoWindowMethod<\"setContent\">;\n setMap: InfoWindowMethod<\"setMap\">;\n setOptions: InfoWindowMethod<\"setOptions\">;\n setPosition: InfoWindowMethod<\"setPosition\">;\n setZIndex: InfoWindowMethod<\"setZIndex\">;\n}\n\ninterface InfoWindowEventBinding {\n eventName: string;\n invoke?: (event: unknown) => void;\n}\n\nfunction toInfoWindowOptions(props: InfoWindowProps): Omit<InfoWindowOptions, \"content\"> {\n const {\n anchorColor,\n anchorSize,\n anchorSkew,\n backgroundColor,\n borderColor,\n borderWidth,\n disableAnchor,\n disableAutoPan,\n maxWidth,\n pixelOffset,\n position,\n zIndex\n } = props;\n\n const options: Omit<InfoWindowOptions, \"content\"> = {};\n\n if (anchorColor !== undefined) {\n options.anchorColor = anchorColor;\n }\n\n if (anchorSize !== undefined) {\n options.anchorSize = anchorSize;\n }\n\n if (anchorSkew !== undefined) {\n options.anchorSkew = anchorSkew;\n }\n\n if (backgroundColor !== undefined) {\n options.backgroundColor = backgroundColor;\n }\n\n if (borderColor !== undefined) {\n options.borderColor = borderColor;\n }\n\n if (borderWidth !== undefined) {\n options.borderWidth = borderWidth;\n }\n\n if (disableAnchor !== undefined) {\n options.disableAnchor = disableAnchor;\n }\n\n if (disableAutoPan !== undefined) {\n options.disableAutoPan = disableAutoPan;\n }\n\n if (maxWidth !== undefined) {\n options.maxWidth = maxWidth;\n }\n\n if (pixelOffset !== undefined) {\n options.pixelOffset = pixelOffset;\n }\n\n if (position !== undefined) {\n options.position = position;\n }\n\n if (zIndex !== undefined) {\n options.zIndex = zIndex;\n }\n\n return options;\n}\n\nfunction resolveInfoWindowContent(\n content: InfoWindowOptions[\"content\"] | undefined,\n childrenContainer: HTMLElement | null,\n hasChildren: boolean\n): string | HTMLElement {\n if (hasChildren && childrenContainer) {\n return childrenContainer;\n }\n\n if (content !== undefined) {\n return content;\n }\n\n return \"\";\n}\n\nfunction buildInfoWindowEventBindings(props: InfoWindowProps): InfoWindowEventBinding[] {\n return [\n {\n eventName: \"open\",\n invoke: props.onOpen ? (event) => props.onOpen?.(event as naver.maps.PointerEvent) : undefined\n },\n {\n eventName: \"close\",\n invoke: props.onClose\n ? (event) => props.onClose?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"anchorColor_changed\",\n invoke: props.onAnchorColorChanged\n ? (event) => props.onAnchorColorChanged?.(event as string)\n : undefined\n },\n {\n eventName: \"anchorSize_changed\",\n invoke: props.onAnchorSizeChanged\n ? (event) => props.onAnchorSizeChanged?.(event as naver.maps.Size)\n : undefined\n },\n {\n eventName: \"anchorSkew_changed\",\n invoke: props.onAnchorSkewChanged\n ? (event) => props.onAnchorSkewChanged?.(event as boolean)\n : undefined\n },\n {\n eventName: \"backgroundColor_changed\",\n invoke: props.onBackgroundColorChanged\n ? (event) => props.onBackgroundColorChanged?.(event as string)\n : undefined\n },\n {\n eventName: \"borderColor_changed\",\n invoke: props.onBorderColorChanged\n ? (event) => props.onBorderColorChanged?.(event as string)\n : undefined\n },\n {\n eventName: \"borderWidth_changed\",\n invoke: props.onBorderWidthChanged\n ? (event) => props.onBorderWidthChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"content_changed\",\n invoke: props.onContentChanged\n ? (event) => props.onContentChanged?.(event as string | HTMLElement)\n : undefined\n },\n {\n eventName: \"disableAnchor_changed\",\n invoke: props.onDisableAnchorChanged\n ? (event) => props.onDisableAnchorChanged?.(event as boolean)\n : undefined\n },\n {\n eventName: \"disableAutoPan_changed\",\n invoke: props.onDisableAutoPanChanged\n ? (event) => props.onDisableAutoPanChanged?.(event as boolean)\n : undefined\n },\n {\n eventName: \"maxWidth_changed\",\n invoke: props.onMaxWidthChanged\n ? (event) => props.onMaxWidthChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"pixelOffset_changed\",\n invoke: props.onPixelOffsetChanged\n ? (event) => props.onPixelOffsetChanged?.(event as naver.maps.Point)\n : undefined\n },\n {\n eventName: \"position_changed\",\n invoke: props.onPositionChanged\n ? (event) => props.onPositionChanged?.(event as naver.maps.Coord)\n : undefined\n },\n {\n eventName: \"zIndex_changed\",\n invoke: props.onZIndexChanged\n ? (event) => props.onZIndexChanged?.(event as number)\n : undefined\n }\n ];\n}\n\nfunction bindInfoWindowEventListeners(\n infoWindow: naver.maps.InfoWindow,\n listenersRef: { current: naver.maps.MapEventListener[] },\n bindings: InfoWindowEventBinding[]\n): void {\n if (listenersRef.current.length > 0) {\n naver.maps.Event.removeListener(listenersRef.current);\n listenersRef.current = [];\n }\n\n listenersRef.current = bindings\n .filter((binding) => typeof binding.invoke === \"function\")\n .map((binding) =>\n naver.maps.Event.addListener(infoWindow, binding.eventName, (event: unknown) => {\n binding.invoke?.(event);\n })\n );\n}\n\nfunction setInfoWindowOptionByKey(\n infoWindow: naver.maps.InfoWindow,\n key: string,\n value: unknown\n): void {\n const optionSettable = infoWindow as naver.maps.InfoWindow & {\n setOptions: (key: string, value: unknown) => void;\n };\n\n optionSettable.setOptions(key, value);\n}\n\nexport const InfoWindow = forwardRef<InfoWindowRef, InfoWindowProps>(\n function InfoWindowInner(props, ref): ReactPortal | null {\n const { map, sdkStatus } = useNaverMap();\n const infoWindowRef = useRef<naver.maps.InfoWindow | null>(null);\n const infoWindowEventListenersRef = useRef<naver.maps.MapEventListener[]>([]);\n const onInfoWindowDestroyRef = useRef<InfoWindowProps[\"onInfoWindowDestroy\"]>(\n props.onInfoWindowDestroy\n );\n const childrenContainer = useMemo<HTMLElement | null>(() => {\n if (typeof document === \"undefined\") {\n return null;\n }\n\n return document.createElement(\"div\");\n }, []);\n const visible = props.visible ?? true;\n const hasChildren = props.children !== undefined && props.children !== null;\n const optionSnapshot = useMemo(() => toInfoWindowOptions(props), [props]);\n\n useEffect(() => {\n onInfoWindowDestroyRef.current = props.onInfoWindowDestroy;\n }, [props.onInfoWindowDestroy]);\n\n const invokeInfoWindowMethod = useCallback(\n <K extends keyof naver.maps.InfoWindow>(\n methodName: K,\n ...args: Parameters<Extract<naver.maps.InfoWindow[K], (...params: never[]) => unknown>>\n ):\n | ReturnType<Extract<naver.maps.InfoWindow[K], (...params: never[]) => unknown>>\n | undefined => {\n const infoWindow = infoWindowRef.current;\n\n if (!infoWindow) {\n return undefined;\n }\n\n const method = infoWindow[methodName] as unknown;\n\n if (typeof method !== \"function\") {\n return undefined;\n }\n\n return (method as (...params: unknown[]) => unknown).apply(infoWindow, args) as ReturnType<\n Extract<naver.maps.InfoWindow[K], (...params: never[]) => unknown>\n >;\n },\n []\n );\n\n const teardownInfoWindow = useCallback(() => {\n const infoWindow = infoWindowRef.current;\n\n if (!infoWindow) {\n return;\n }\n\n try {\n if (infoWindowEventListenersRef.current.length > 0) {\n naver.maps.Event.removeListener(infoWindowEventListenersRef.current);\n infoWindowEventListenersRef.current = [];\n }\n\n naver.maps.Event.clearInstanceListeners(infoWindow);\n } catch (error) {\n console.error(\"[react-naver-maps-kit] failed to clear infoWindow listeners\", error);\n }\n\n infoWindow.close();\n infoWindow.setMap(null);\n infoWindowRef.current = null;\n onInfoWindowDestroyRef.current?.();\n }, []);\n\n useImperativeHandle(\n ref,\n (): InfoWindowRef => ({\n getInstance: () => infoWindowRef.current,\n close: (...args) => invokeInfoWindowMethod(\"close\", ...args),\n getContent: (...args) => invokeInfoWindowMethod(\"getContent\", ...args),\n getContentElement: (...args) => invokeInfoWindowMethod(\"getContentElement\", ...args),\n getMap: (...args) => invokeInfoWindowMethod(\"getMap\", ...args),\n getOptions: (...args) => invokeInfoWindowMethod(\"getOptions\", ...args),\n getPanes: (...args) => invokeInfoWindowMethod(\"getPanes\", ...args),\n getPosition: (...args) => invokeInfoWindowMethod(\"getPosition\", ...args),\n getProjection: (...args) => invokeInfoWindowMethod(\"getProjection\", ...args),\n getZIndex: (...args) => invokeInfoWindowMethod(\"getZIndex\", ...args),\n open: (...args) => invokeInfoWindowMethod(\"open\", ...args),\n setContent: (...args) => invokeInfoWindowMethod(\"setContent\", ...args),\n setMap: (...args) => invokeInfoWindowMethod(\"setMap\", ...args),\n setOptions: (...args) => invokeInfoWindowMethod(\"setOptions\", ...args),\n setPosition: (...args) => invokeInfoWindowMethod(\"setPosition\", ...args),\n setZIndex: (...args) => invokeInfoWindowMethod(\"setZIndex\", ...args)\n }),\n [invokeInfoWindowMethod]\n );\n\n useEffect(() => {\n if (sdkStatus !== \"ready\" || !map || infoWindowRef.current) {\n return;\n }\n\n try {\n const infoWindow = new naver.maps.InfoWindow({\n ...optionSnapshot,\n content: resolveInfoWindowContent(props.content, childrenContainer, hasChildren)\n });\n\n if (props.autoPanPadding !== undefined) {\n setInfoWindowOptionByKey(infoWindow, \"autoPanPadding\", props.autoPanPadding);\n }\n\n infoWindowRef.current = infoWindow;\n bindInfoWindowEventListeners(\n infoWindow,\n infoWindowEventListenersRef,\n buildInfoWindowEventBindings(props)\n );\n props.onInfoWindowReady?.(infoWindow);\n } catch (error) {\n const normalizedError =\n error instanceof Error\n ? error\n : new Error(\"Failed to create naver.maps.InfoWindow instance.\");\n\n props.onInfoWindowError?.(normalizedError);\n }\n }, [childrenContainer, hasChildren, map, optionSnapshot, props, sdkStatus]);\n\n useEffect(() => {\n const infoWindow = infoWindowRef.current;\n\n if (!infoWindow) {\n return;\n }\n\n const resolvedContent = resolveInfoWindowContent(\n props.content,\n childrenContainer,\n hasChildren\n );\n\n infoWindow.setOptions({\n ...optionSnapshot,\n content: resolvedContent\n });\n infoWindow.setContent(resolvedContent);\n\n if (props.autoPanPadding !== undefined) {\n setInfoWindowOptionByKey(infoWindow, \"autoPanPadding\", props.autoPanPadding);\n }\n\n if (props.position) {\n infoWindow.setPosition(props.position);\n }\n\n if (!map || !visible) {\n infoWindow.close();\n return;\n }\n\n if (props.anchor) {\n infoWindow.open(map, props.anchor);\n return;\n }\n\n if (props.position) {\n infoWindow.open(map, props.position);\n return;\n }\n\n infoWindow.open(map);\n }, [\n childrenContainer,\n hasChildren,\n map,\n optionSnapshot,\n props.anchor,\n props.content,\n props.position,\n props.autoPanPadding,\n visible\n ]);\n\n useEffect(() => {\n const infoWindow = infoWindowRef.current;\n\n if (!infoWindow) {\n return;\n }\n\n bindInfoWindowEventListeners(\n infoWindow,\n infoWindowEventListenersRef,\n buildInfoWindowEventBindings(props)\n );\n\n return () => {\n if (infoWindowEventListenersRef.current.length > 0) {\n naver.maps.Event.removeListener(infoWindowEventListenersRef.current);\n infoWindowEventListenersRef.current = [];\n }\n };\n }, [props]);\n\n useEffect(() => {\n return () => {\n teardownInfoWindow();\n };\n }, [teardownInfoWindow]);\n\n if (!hasChildren || !childrenContainer) {\n return null;\n }\n\n return createPortal(props.children, childrenContainer);\n }\n);\n\nInfoWindow.displayName = \"InfoWindow\";\n","export interface OverlayEventBinding {\n eventName: string;\n invoke?: (event: unknown) => void;\n}\n\nexport function bindOverlayEventListeners(\n target: unknown,\n listenersRef: { current: naver.maps.MapEventListener[] },\n bindings: OverlayEventBinding[]\n): void {\n if (listenersRef.current.length > 0) {\n naver.maps.Event.removeListener(listenersRef.current);\n listenersRef.current = [];\n }\n\n listenersRef.current = bindings\n .filter((binding) => typeof binding.invoke === \"function\")\n .map((binding) =>\n naver.maps.Event.addListener(target, binding.eventName, (event: unknown) => {\n binding.invoke?.(event);\n })\n );\n}\n\nexport function removeOverlayEventListeners(listeners: naver.maps.MapEventListener[]): void {\n if (listeners.length > 0) {\n naver.maps.Event.removeListener(listeners);\n }\n}\n","import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef } from \"react\";\n\nimport { useNaverMap } from \"../../react/hooks/useNaverMap\";\nimport { bindOverlayEventListeners, removeOverlayEventListeners } from \"../shared/overlayUtils\";\n\ntype CircleOptions = naver.maps.CircleOptions;\n\ninterface CircleOptionProps {\n map?: naver.maps.Map | null;\n center: CircleOptions[\"center\"];\n radius?: CircleOptions[\"radius\"];\n strokeWeight?: CircleOptions[\"strokeWeight\"];\n strokeOpacity?: CircleOptions[\"strokeOpacity\"];\n strokeColor?: CircleOptions[\"strokeColor\"];\n strokeStyle?: CircleOptions[\"strokeStyle\"];\n strokeLineCap?: CircleOptions[\"strokeLineCap\"];\n strokeLineJoin?: CircleOptions[\"strokeLineJoin\"];\n fillColor?: CircleOptions[\"fillColor\"];\n fillOpacity?: CircleOptions[\"fillOpacity\"];\n clickable?: CircleOptions[\"clickable\"];\n visible?: CircleOptions[\"visible\"];\n zIndex?: CircleOptions[\"zIndex\"];\n}\n\ninterface CircleLifecycleProps {\n onCircleReady?: (circle: naver.maps.Circle) => void;\n onCircleDestroy?: () => void;\n onCircleError?: (error: Error) => void;\n}\n\ninterface CircleEventProps {\n onClick?: (event: naver.maps.PointerEvent) => void;\n onDblClick?: (event: naver.maps.PointerEvent) => void;\n onMouseDown?: (event: naver.maps.PointerEvent) => void;\n onMouseMove?: (event: naver.maps.PointerEvent) => void;\n onMouseOut?: (event: naver.maps.PointerEvent) => void;\n onMouseOver?: (event: naver.maps.PointerEvent) => void;\n onMouseUp?: (event: naver.maps.PointerEvent) => void;\n onRightClick?: (event: naver.maps.PointerEvent) => void;\n onTouchStart?: (event: naver.maps.PointerEvent) => void;\n onTouchMove?: (event: naver.maps.PointerEvent) => void;\n onTouchEnd?: (event: naver.maps.PointerEvent) => void;\n onCenterChanged?: (center: naver.maps.Coord) => void;\n onClickableChanged?: (clickable: boolean) => void;\n onFillColorChanged?: (fillColor: string) => void;\n onFillOpacityChanged?: (fillOpacity: number) => void;\n onMapChanged?: (map: naver.maps.Map | null) => void;\n onRadiusChanged?: (radius: number) => void;\n onStrokeColorChanged?: (strokeColor: string) => void;\n onStrokeLineCapChanged?: (strokeLineCap: naver.maps.StrokeLineCapType) => void;\n onStrokeLineJoinChanged?: (strokeLineJoin: naver.maps.StrokeLineJoinType) => void;\n onStrokeOpacityChanged?: (strokeOpacity: number) => void;\n onStrokeStyleChanged?: (strokeStyle: naver.maps.StrokeStyleType) => void;\n onStrokeWeightChanged?: (strokeWeight: number) => void;\n onVisibleChanged?: (visible: boolean) => void;\n onZIndexChanged?: (zIndex: number) => void;\n}\n\nexport type CircleProps = CircleOptionProps & CircleLifecycleProps & CircleEventProps;\n\ntype CircleMethod<K extends keyof naver.maps.Circle> = naver.maps.Circle[K] extends (\n ...args: infer A\n) => infer R\n ? (...args: A) => R | undefined\n : never;\n\nexport interface CircleRef {\n getInstance: () => naver.maps.Circle | null;\n getAreaSize: CircleMethod<\"getAreaSize\">;\n getBounds: CircleMethod<\"getBounds\">;\n getCenter: CircleMethod<\"getCenter\">;\n getClickable: CircleMethod<\"getClickable\">;\n getDrawingRect: CircleMethod<\"getDrawingRect\">;\n getElement: CircleMethod<\"getElement\">;\n getMap: CircleMethod<\"getMap\">;\n getOptions: CircleMethod<\"getOptions\">;\n getPanes: CircleMethod<\"getPanes\">;\n getProjection: CircleMethod<\"getProjection\">;\n getRadius: CircleMethod<\"getRadius\">;\n getStyles: CircleMethod<\"getStyles\">;\n getVisible: CircleMethod<\"getVisible\">;\n getZIndex: CircleMethod<\"getZIndex\">;\n setCenter: CircleMethod<\"setCenter\">;\n setClickable: CircleMethod<\"setClickable\">;\n setMap: CircleMethod<\"setMap\">;\n setOptions: CircleMethod<\"setOptions\">;\n setRadius: CircleMethod<\"setRadius\">;\n setStyles: CircleMethod<\"setStyles\">;\n setVisible: CircleMethod<\"setVisible\">;\n setZIndex: CircleMethod<\"setZIndex\">;\n}\n\nfunction toCircleOptions(props: CircleProps, targetMap: naver.maps.Map | null): CircleOptions {\n const options: CircleOptions = {\n center: props.center\n };\n\n if (targetMap) {\n options.map = targetMap;\n }\n\n if (props.radius !== undefined) {\n options.radius = props.radius;\n }\n\n if (props.strokeWeight !== undefined) {\n options.strokeWeight = props.strokeWeight;\n }\n\n if (props.strokeOpacity !== undefined) {\n options.strokeOpacity = props.strokeOpacity;\n }\n\n if (props.strokeColor !== undefined) {\n options.strokeColor = props.strokeColor;\n }\n\n if (props.strokeStyle !== undefined) {\n options.strokeStyle = props.strokeStyle;\n }\n\n if (props.strokeLineCap !== undefined) {\n options.strokeLineCap = props.strokeLineCap;\n }\n\n if (props.strokeLineJoin !== undefined) {\n options.strokeLineJoin = props.strokeLineJoin;\n }\n\n if (props.fillColor !== undefined) {\n options.fillColor = props.fillColor;\n }\n\n if (props.fillOpacity !== undefined) {\n options.fillOpacity = props.fillOpacity;\n }\n\n if (props.clickable !== undefined) {\n options.clickable = props.clickable;\n }\n\n if (props.visible !== undefined) {\n options.visible = props.visible;\n }\n\n if (props.zIndex !== undefined) {\n options.zIndex = props.zIndex;\n }\n\n return options;\n}\n\nfunction buildCircleEventBindings(props: CircleProps) {\n return [\n {\n eventName: \"click\",\n invoke: props.onClick\n ? (event: unknown) => props.onClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"dblclick\",\n invoke: props.onDblClick\n ? (event: unknown) => props.onDblClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mousedown\",\n invoke: props.onMouseDown\n ? (event: unknown) => props.onMouseDown?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mousemove\",\n invoke: props.onMouseMove\n ? (event: unknown) => props.onMouseMove?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseout\",\n invoke: props.onMouseOut\n ? (event: unknown) => props.onMouseOut?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseover\",\n invoke: props.onMouseOver\n ? (event: unknown) => props.onMouseOver?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseup\",\n invoke: props.onMouseUp\n ? (event: unknown) => props.onMouseUp?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"rightclick\",\n invoke: props.onRightClick\n ? (event: unknown) => props.onRightClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchstart\",\n invoke: props.onTouchStart\n ? (event: unknown) => props.onTouchStart?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchmove\",\n invoke: props.onTouchMove\n ? (event: unknown) => props.onTouchMove?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchend\",\n invoke: props.onTouchEnd\n ? (event: unknown) => props.onTouchEnd?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"center_changed\",\n invoke: props.onCenterChanged\n ? (event: unknown) => props.onCenterChanged?.(event as naver.maps.Coord)\n : undefined\n },\n {\n eventName: \"clickable_changed\",\n invoke: props.onClickableChanged\n ? (event: unknown) => props.onClickableChanged?.(event as boolean)\n : undefined\n },\n {\n eventName: \"fillColor_changed\",\n invoke: props.onFillColorChanged\n ? (event: unknown) => props.onFillColorChanged?.(event as string)\n : undefined\n },\n {\n eventName: \"fillOpacity_changed\",\n invoke: props.onFillOpacityChanged\n ? (event: unknown) => props.onFillOpacityChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"map_changed\",\n invoke: props.onMapChanged\n ? (event: unknown) => props.onMapChanged?.(event as naver.maps.Map | null)\n : undefined\n },\n {\n eventName: \"radius_changed\",\n invoke: props.onRadiusChanged\n ? (event: unknown) => props.onRadiusChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"strokeColor_changed\",\n invoke: props.onStrokeColorChanged\n ? (event: unknown) => props.onStrokeColorChanged?.(event as string)\n : undefined\n },\n {\n eventName: \"strokeLineCap_changed\",\n invoke: props.onStrokeLineCapChanged\n ? (event: unknown) => props.onStrokeLineCapChanged?.(event as naver.maps.StrokeLineCapType)\n : undefined\n },\n {\n eventName: \"strokeLineJoin_changed\",\n invoke: props.onStrokeLineJoinChanged\n ? (event: unknown) =>\n props.onStrokeLineJoinChanged?.(event as naver.maps.StrokeLineJoinType)\n : undefined\n },\n {\n eventName: \"strokeOpacity_changed\",\n invoke: props.onStrokeOpacityChanged\n ? (event: unknown) => props.onStrokeOpacityChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"strokeStyle_changed\",\n invoke: props.onStrokeStyleChanged\n ? (event: unknown) => props.onStrokeStyleChanged?.(event as naver.maps.StrokeStyleType)\n : undefined\n },\n {\n eventName: \"strokeWeight_changed\",\n invoke: props.onStrokeWeightChanged\n ? (event: unknown) => props.onStrokeWeightChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"visible_changed\",\n invoke: props.onVisibleChanged\n ? (event: unknown) => props.onVisibleChanged?.(event as boolean)\n : undefined\n },\n {\n eventName: \"zIndex_changed\",\n invoke: props.onZIndexChanged\n ? (event: unknown) => props.onZIndexChanged?.(event as number)\n : undefined\n }\n ];\n}\n\nexport const Circle = forwardRef<CircleRef, CircleProps>(function CircleInner(props, ref) {\n const { map: contextMap, sdkStatus } = useNaverMap();\n const circleRef = useRef<naver.maps.Circle | null>(null);\n const circleEventListenersRef = useRef<naver.maps.MapEventListener[]>([]);\n const onCircleDestroyRef = useRef<CircleProps[\"onCircleDestroy\"]>(props.onCircleDestroy);\n const targetMap = props.map ?? contextMap;\n\n useEffect(() => {\n onCircleDestroyRef.current = props.onCircleDestroy;\n }, [props.onCircleDestroy]);\n\n const invokeCircleMethod = useCallback(\n <K extends keyof naver.maps.Circle>(\n methodName: K,\n ...args: Parameters<Extract<naver.maps.Circle[K], (...params: never[]) => unknown>>\n ): ReturnType<Extract<naver.maps.Circle[K], (...params: never[]) => unknown>> | undefined => {\n const circle = circleRef.current;\n\n if (!circle) {\n return undefined;\n }\n\n const method = circle[methodName] as unknown;\n\n if (typeof method !== \"function\") {\n return undefined;\n }\n\n return (method as (...params: unknown[]) => unknown).apply(circle, args) as ReturnType<\n Extract<naver.maps.Circle[K], (...params: never[]) => unknown>\n >;\n },\n []\n );\n\n const teardownCircle = useCallback(() => {\n const circle = circleRef.current;\n\n if (!circle) {\n return;\n }\n\n try {\n removeOverlayEventListeners(circleEventListenersRef.current);\n circleEventListenersRef.current = [];\n naver.maps.Event.clearInstanceListeners(circle);\n } catch (error) {\n console.error(\"[react-naver-maps-kit] failed to clear circle listeners\", error);\n }\n\n circle.setMap(null);\n circleRef.current = null;\n onCircleDestroyRef.current?.();\n }, []);\n\n useImperativeHandle(\n ref,\n (): CircleRef => ({\n getInstance: () => circleRef.current,\n getAreaSize: (...args) => invokeCircleMethod(\"getAreaSize\", ...args),\n getBounds: (...args) => invokeCircleMethod(\"getBounds\", ...args),\n getCenter: (...args) => invokeCircleMethod(\"getCenter\", ...args),\n getClickable: (...args) => invokeCircleMethod(\"getClickable\", ...args),\n getDrawingRect: (...args) => invokeCircleMethod(\"getDrawingRect\", ...args),\n getElement: (...args) => invokeCircleMethod(\"getElement\", ...args),\n getMap: (...args) => invokeCircleMethod(\"getMap\", ...args),\n getOptions: (...args) => invokeCircleMethod(\"getOptions\", ...args),\n getPanes: (...args) => invokeCircleMethod(\"getPanes\", ...args),\n getProjection: (...args) => invokeCircleMethod(\"getProjection\", ...args),\n getRadius: (...args) => invokeCircleMethod(\"getRadius\", ...args),\n getStyles: (...args) => invokeCircleMethod(\"getStyles\", ...args),\n getVisible: (...args) => invokeCircleMethod(\"getVisible\", ...args),\n getZIndex: (...args) => invokeCircleMethod(\"getZIndex\", ...args),\n setCenter: (...args) => invokeCircleMethod(\"setCenter\", ...args),\n setClickable: (...args) => invokeCircleMethod(\"setClickable\", ...args),\n setMap: (...args) => invokeCircleMethod(\"setMap\", ...args),\n setOptions: (...args) => invokeCircleMethod(\"setOptions\", ...args),\n setRadius: (...args) => invokeCircleMethod(\"setRadius\", ...args),\n setStyles: (...args) => invokeCircleMethod(\"setStyles\", ...args),\n setVisible: (...args) => invokeCircleMethod(\"setVisible\", ...args),\n setZIndex: (...args) => invokeCircleMethod(\"setZIndex\", ...args)\n }),\n [invokeCircleMethod]\n );\n\n useEffect(() => {\n if (sdkStatus !== \"ready\" || !targetMap || circleRef.current) {\n return;\n }\n\n try {\n const circle = new naver.maps.Circle(toCircleOptions(props, targetMap));\n\n circleRef.current = circle;\n bindOverlayEventListeners(circle, circleEventListenersRef, buildCircleEventBindings(props));\n props.onCircleReady?.(circle);\n } catch (error) {\n const normalizedError =\n error instanceof Error ? error : new Error(\"Failed to create naver.maps.Circle instance.\");\n\n props.onCircleError?.(normalizedError);\n }\n }, [props, sdkStatus, targetMap]);\n\n useEffect(() => {\n const circle = circleRef.current;\n\n if (!circle || !targetMap) {\n return;\n }\n\n circle.setOptions(toCircleOptions(props, targetMap));\n }, [props, targetMap]);\n\n useEffect(() => {\n const circle = circleRef.current;\n\n if (!circle) {\n return;\n }\n\n bindOverlayEventListeners(circle, circleEventListenersRef, buildCircleEventBindings(props));\n\n return () => {\n removeOverlayEventListeners(circleEventListenersRef.current);\n circleEventListenersRef.current = [];\n };\n }, [props]);\n\n useEffect(() => {\n return () => {\n teardownCircle();\n };\n }, [teardownCircle]);\n\n return null;\n});\n\nCircle.displayName = \"Circle\";\n","import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef } from \"react\";\n\nimport { useNaverMap } from \"../../react/hooks/useNaverMap\";\nimport { bindOverlayEventListeners, removeOverlayEventListeners } from \"../shared/overlayUtils\";\n\ntype EllipseOptions = naver.maps.EllipseOptions;\n\ninterface EllipseOptionProps {\n map?: naver.maps.Map | null;\n bounds: EllipseOptions[\"bounds\"];\n strokeWeight?: EllipseOptions[\"strokeWeight\"];\n strokeOpacity?: EllipseOptions[\"strokeOpacity\"];\n strokeColor?: EllipseOptions[\"strokeColor\"];\n strokeStyle?: EllipseOptions[\"strokeStyle\"];\n strokeLineCap?: EllipseOptions[\"strokeLineCap\"];\n strokeLineJoin?: EllipseOptions[\"strokeLineJoin\"];\n fillColor?: EllipseOptions[\"fillColor\"];\n fillOpacity?: EllipseOptions[\"fillOpacity\"];\n clickable?: EllipseOptions[\"clickable\"];\n visible?: EllipseOptions[\"visible\"];\n zIndex?: EllipseOptions[\"zIndex\"];\n}\n\ninterface EllipseLifecycleProps {\n onEllipseReady?: (ellipse: naver.maps.Ellipse) => void;\n onEllipseDestroy?: () => void;\n onEllipseError?: (error: Error) => void;\n}\n\ninterface EllipseEventProps {\n onClick?: (event: naver.maps.PointerEvent) => void;\n onDblClick?: (event: naver.maps.PointerEvent) => void;\n onMouseDown?: (event: naver.maps.PointerEvent) => void;\n onMouseMove?: (event: naver.maps.PointerEvent) => void;\n onMouseOut?: (event: naver.maps.PointerEvent) => void;\n onMouseOver?: (event: naver.maps.PointerEvent) => void;\n onMouseUp?: (event: naver.maps.PointerEvent) => void;\n onRightClick?: (event: naver.maps.PointerEvent) => void;\n onTouchStart?: (event: naver.maps.PointerEvent) => void;\n onTouchMove?: (event: naver.maps.PointerEvent) => void;\n onTouchEnd?: (event: naver.maps.PointerEvent) => void;\n onBoundsChanged?: (bounds: naver.maps.Bounds) => void;\n onClickableChanged?: (clickable: boolean) => void;\n onFillColorChanged?: (fillColor: string) => void;\n onFillOpacityChanged?: (fillOpacity: number) => void;\n onMapChanged?: (map: naver.maps.Map | null) => void;\n onStrokeColorChanged?: (strokeColor: string) => void;\n onStrokeLineCapChanged?: (strokeLineCap: naver.maps.StrokeLineCapType) => void;\n onStrokeLineJoinChanged?: (strokeLineJoin: naver.maps.StrokeLineJoinType) => void;\n onStrokeOpacityChanged?: (strokeOpacity: number) => void;\n onStrokeStyleChanged?: (strokeStyle: naver.maps.StrokeStyleType) => void;\n onStrokeWeightChanged?: (strokeWeight: number) => void;\n onVisibleChanged?: (visible: boolean) => void;\n onZIndexChanged?: (zIndex: number) => void;\n}\n\nexport type EllipseProps = EllipseOptionProps & EllipseLifecycleProps & EllipseEventProps;\n\ntype EllipseMethod<K extends keyof naver.maps.Ellipse> = naver.maps.Ellipse[K] extends (\n ...args: infer A\n) => infer R\n ? (...args: A) => R | undefined\n : never;\n\nexport interface EllipseRef {\n getInstance: () => naver.maps.Ellipse | null;\n getAreaSize: EllipseMethod<\"getAreaSize\">;\n getBounds: EllipseMethod<\"getBounds\">;\n getClickable: EllipseMethod<\"getClickable\">;\n getDrawingRect: EllipseMethod<\"getDrawingRect\">;\n getElement: EllipseMethod<\"getElement\">;\n getMap: EllipseMethod<\"getMap\">;\n getOptions: EllipseMethod<\"getOptions\">;\n getPanes: EllipseMethod<\"getPanes\">;\n getProjection: EllipseMethod<\"getProjection\">;\n getStyles: EllipseMethod<\"getStyles\">;\n getVisible: EllipseMethod<\"getVisible\">;\n getZIndex: EllipseMethod<\"getZIndex\">;\n setBounds: EllipseMethod<\"setBounds\">;\n setClickable: EllipseMethod<\"setClickable\">;\n setMap: EllipseMethod<\"setMap\">;\n setOptions: EllipseMethod<\"setOptions\">;\n setStyles: EllipseMethod<\"setStyles\">;\n setVisible: EllipseMethod<\"setVisible\">;\n setZIndex: EllipseMethod<\"setZIndex\">;\n}\n\nfunction toEllipseOptions(props: EllipseProps, targetMap: naver.maps.Map | null): EllipseOptions {\n const options: EllipseOptions = {\n bounds: props.bounds\n };\n\n if (targetMap) {\n options.map = targetMap;\n }\n\n if (props.strokeWeight !== undefined) {\n options.strokeWeight = props.strokeWeight;\n }\n\n if (props.strokeOpacity !== undefined) {\n options.strokeOpacity = props.strokeOpacity;\n }\n\n if (props.strokeColor !== undefined) {\n options.strokeColor = props.strokeColor;\n }\n\n if (props.strokeStyle !== undefined) {\n options.strokeStyle = props.strokeStyle;\n }\n\n if (props.strokeLineCap !== undefined) {\n options.strokeLineCap = props.strokeLineCap;\n }\n\n if (props.strokeLineJoin !== undefined) {\n options.strokeLineJoin = props.strokeLineJoin;\n }\n\n if (props.fillColor !== undefined) {\n options.fillColor = props.fillColor;\n }\n\n if (props.fillOpacity !== undefined) {\n options.fillOpacity = props.fillOpacity;\n }\n\n if (props.clickable !== undefined) {\n options.clickable = props.clickable;\n }\n\n if (props.visible !== undefined) {\n options.visible = props.visible;\n }\n\n if (props.zIndex !== undefined) {\n options.zIndex = props.zIndex;\n }\n\n return options;\n}\n\nfunction buildEllipseEventBindings(props: EllipseProps) {\n return [\n {\n eventName: \"click\",\n invoke: props.onClick\n ? (event: unknown) => props.onClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"dblclick\",\n invoke: props.onDblClick\n ? (event: unknown) => props.onDblClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mousedown\",\n invoke: props.onMouseDown\n ? (event: unknown) => props.onMouseDown?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mousemove\",\n invoke: props.onMouseMove\n ? (event: unknown) => props.onMouseMove?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseout\",\n invoke: props.onMouseOut\n ? (event: unknown) => props.onMouseOut?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseover\",\n invoke: props.onMouseOver\n ? (event: unknown) => props.onMouseOver?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseup\",\n invoke: props.onMouseUp\n ? (event: unknown) => props.onMouseUp?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"rightclick\",\n invoke: props.onRightClick\n ? (event: unknown) => props.onRightClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchstart\",\n invoke: props.onTouchStart\n ? (event: unknown) => props.onTouchStart?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchmove\",\n invoke: props.onTouchMove\n ? (event: unknown) => props.onTouchMove?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchend\",\n invoke: props.onTouchEnd\n ? (event: unknown) => props.onTouchEnd?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"bounds_changed\",\n invoke: props.onBoundsChanged\n ? (event: unknown) => props.onBoundsChanged?.(event as naver.maps.Bounds)\n : undefined\n },\n {\n eventName: \"clickable_changed\",\n invoke: props.onClickableChanged\n ? (event: unknown) => props.onClickableChanged?.(event as boolean)\n : undefined\n },\n {\n eventName: \"fillColor_changed\",\n invoke: props.onFillColorChanged\n ? (event: unknown) => props.onFillColorChanged?.(event as string)\n : undefined\n },\n {\n eventName: \"fillOpacity_changed\",\n invoke: props.onFillOpacityChanged\n ? (event: unknown) => props.onFillOpacityChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"map_changed\",\n invoke: props.onMapChanged\n ? (event: unknown) => props.onMapChanged?.(event as naver.maps.Map | null)\n : undefined\n },\n {\n eventName: \"strokeColor_changed\",\n invoke: props.onStrokeColorChanged\n ? (event: unknown) => props.onStrokeColorChanged?.(event as string)\n : undefined\n },\n {\n eventName: \"strokeLineCap_changed\",\n invoke: props.onStrokeLineCapChanged\n ? (event: unknown) => props.onStrokeLineCapChanged?.(event as naver.maps.StrokeLineCapType)\n : undefined\n },\n {\n eventName: \"strokeLineJoin_changed\",\n invoke: props.onStrokeLineJoinChanged\n ? (event: unknown) =>\n props.onStrokeLineJoinChanged?.(event as naver.maps.StrokeLineJoinType)\n : undefined\n },\n {\n eventName: \"strokeOpacity_changed\",\n invoke: props.onStrokeOpacityChanged\n ? (event: unknown) => props.onStrokeOpacityChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"strokeStyle_changed\",\n invoke: props.onStrokeStyleChanged\n ? (event: unknown) => props.onStrokeStyleChanged?.(event as naver.maps.StrokeStyleType)\n : undefined\n },\n {\n eventName: \"strokeWeight_changed\",\n invoke: props.onStrokeWeightChanged\n ? (event: unknown) => props.onStrokeWeightChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"visible_changed\",\n invoke: props.onVisibleChanged\n ? (event: unknown) => props.onVisibleChanged?.(event as boolean)\n : undefined\n },\n {\n eventName: \"zIndex_changed\",\n invoke: props.onZIndexChanged\n ? (event: unknown) => props.onZIndexChanged?.(event as number)\n : undefined\n }\n ];\n}\n\nexport const Ellipse = forwardRef<EllipseRef, EllipseProps>(function EllipseInner(props, ref) {\n const { map: contextMap, sdkStatus } = useNaverMap();\n const ellipseRef = useRef<naver.maps.Ellipse | null>(null);\n const ellipseEventListenersRef = useRef<naver.maps.MapEventListener[]>([]);\n const onEllipseDestroyRef = useRef<EllipseProps[\"onEllipseDestroy\"]>(props.onEllipseDestroy);\n const targetMap = props.map ?? contextMap;\n\n useEffect(() => {\n onEllipseDestroyRef.current = props.onEllipseDestroy;\n }, [props.onEllipseDestroy]);\n\n const invokeEllipseMethod = useCallback(\n <K extends keyof naver.maps.Ellipse>(\n methodName: K,\n ...args: Parameters<Extract<naver.maps.Ellipse[K], (...params: never[]) => unknown>>\n ): ReturnType<Extract<naver.maps.Ellipse[K], (...params: never[]) => unknown>> | undefined => {\n const ellipse = ellipseRef.current;\n\n if (!ellipse) {\n return undefined;\n }\n\n const method = ellipse[methodName] as unknown;\n\n if (typeof method !== \"function\") {\n return undefined;\n }\n\n return (method as (...params: unknown[]) => unknown).apply(ellipse, args) as ReturnType<\n Extract<naver.maps.Ellipse[K], (...params: never[]) => unknown>\n >;\n },\n []\n );\n\n const teardownEllipse = useCallback(() => {\n const ellipse = ellipseRef.current;\n\n if (!ellipse) {\n return;\n }\n\n try {\n removeOverlayEventListeners(ellipseEventListenersRef.current);\n ellipseEventListenersRef.current = [];\n naver.maps.Event.clearInstanceListeners(ellipse);\n } catch (error) {\n console.error(\"[react-naver-maps-kit] failed to clear ellipse listeners\", error);\n }\n\n ellipse.setMap(null);\n ellipseRef.current = null;\n onEllipseDestroyRef.current?.();\n }, []);\n\n useImperativeHandle(\n ref,\n (): EllipseRef => ({\n getInstance: () => ellipseRef.current,\n getAreaSize: (...args) => invokeEllipseMethod(\"getAreaSize\", ...args),\n getBounds: (...args) => invokeEllipseMethod(\"getBounds\", ...args),\n getClickable: (...args) => invokeEllipseMethod(\"getClickable\", ...args),\n getDrawingRect: (...args) => invokeEllipseMethod(\"getDrawingRect\", ...args),\n getElement: (...args) => invokeEllipseMethod(\"getElement\", ...args),\n getMap: (...args) => invokeEllipseMethod(\"getMap\", ...args),\n getOptions: (...args) => invokeEllipseMethod(\"getOptions\", ...args),\n getPanes: (...args) => invokeEllipseMethod(\"getPanes\", ...args),\n getProjection: (...args) => invokeEllipseMethod(\"getProjection\", ...args),\n getStyles: (...args) => invokeEllipseMethod(\"getStyles\", ...args),\n getVisible: (...args) => invokeEllipseMethod(\"getVisible\", ...args),\n getZIndex: (...args) => invokeEllipseMethod(\"getZIndex\", ...args),\n setBounds: (...args) => invokeEllipseMethod(\"setBounds\", ...args),\n setClickable: (...args) => invokeEllipseMethod(\"setClickable\", ...args),\n setMap: (...args) => invokeEllipseMethod(\"setMap\", ...args),\n setOptions: (...args) => invokeEllipseMethod(\"setOptions\", ...args),\n setStyles: (...args) => invokeEllipseMethod(\"setStyles\", ...args),\n setVisible: (...args) => invokeEllipseMethod(\"setVisible\", ...args),\n setZIndex: (...args) => invokeEllipseMethod(\"setZIndex\", ...args)\n }),\n [invokeEllipseMethod]\n );\n\n useEffect(() => {\n if (sdkStatus !== \"ready\" || !targetMap || ellipseRef.current) {\n return;\n }\n\n try {\n const ellipse = new naver.maps.Ellipse(toEllipseOptions(props, targetMap));\n\n ellipseRef.current = ellipse;\n bindOverlayEventListeners(\n ellipse,\n ellipseEventListenersRef,\n buildEllipseEventBindings(props)\n );\n props.onEllipseReady?.(ellipse);\n } catch (error) {\n const normalizedError =\n error instanceof Error ? error : new Error(\"Failed to create naver.maps.Ellipse instance.\");\n\n props.onEllipseError?.(normalizedError);\n }\n }, [props, sdkStatus, targetMap]);\n\n useEffect(() => {\n const ellipse = ellipseRef.current;\n\n if (!ellipse || !targetMap) {\n return;\n }\n\n ellipse.setOptions(toEllipseOptions(props, targetMap));\n }, [props, targetMap]);\n\n useEffect(() => {\n const ellipse = ellipseRef.current;\n\n if (!ellipse) {\n return;\n }\n\n bindOverlayEventListeners(ellipse, ellipseEventListenersRef, buildEllipseEventBindings(props));\n\n return () => {\n removeOverlayEventListeners(ellipseEventListenersRef.current);\n ellipseEventListenersRef.current = [];\n };\n }, [props]);\n\n useEffect(() => {\n return () => {\n teardownEllipse();\n };\n }, [teardownEllipse]);\n\n return null;\n});\n\nEllipse.displayName = \"Ellipse\";\n","import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef } from \"react\";\n\nimport { useNaverMap } from \"../../react/hooks/useNaverMap\";\nimport { bindOverlayEventListeners, removeOverlayEventListeners } from \"../shared/overlayUtils\";\n\ntype GroundOverlayOptions = naver.maps.GroundOverlayOptions;\n\ninterface GroundOverlayOptionProps {\n map?: naver.maps.Map | null;\n url: string;\n bounds: naver.maps.Bounds | naver.maps.BoundsLiteral;\n clickable?: GroundOverlayOptions[\"clickable\"];\n opacity?: GroundOverlayOptions[\"opacity\"];\n}\n\ninterface GroundOverlayLifecycleProps {\n onGroundOverlayReady?: (groundOverlay: naver.maps.GroundOverlay) => void;\n onGroundOverlayDestroy?: () => void;\n onGroundOverlayError?: (error: Error) => void;\n}\n\ninterface GroundOverlayEventProps {\n onClick?: (event: naver.maps.PointerEvent) => void;\n onDblClick?: (event: naver.maps.PointerEvent) => void;\n onMouseDown?: (event: naver.maps.PointerEvent) => void;\n onMouseMove?: (event: naver.maps.PointerEvent) => void;\n onMouseOut?: (event: naver.maps.PointerEvent) => void;\n onMouseOver?: (event: naver.maps.PointerEvent) => void;\n onMouseUp?: (event: naver.maps.PointerEvent) => void;\n onRightClick?: (event: naver.maps.PointerEvent) => void;\n onTouchStart?: (event: naver.maps.PointerEvent) => void;\n onTouchMove?: (event: naver.maps.PointerEvent) => void;\n onTouchEnd?: (event: naver.maps.PointerEvent) => void;\n onBoundsChanged?: (bounds: naver.maps.Bounds) => void;\n onClickableChanged?: (clickable: boolean) => void;\n onMapChanged?: (map: naver.maps.Map | null) => void;\n onOpacityChanged?: (opacity: number) => void;\n}\n\nexport type GroundOverlayProps = GroundOverlayOptionProps &\n GroundOverlayLifecycleProps &\n GroundOverlayEventProps;\n\ntype GroundOverlayMethod<K extends keyof naver.maps.GroundOverlay> =\n naver.maps.GroundOverlay[K] extends (...args: infer A) => infer R\n ? (...args: A) => R | undefined\n : never;\n\nexport interface GroundOverlayRef {\n getInstance: () => naver.maps.GroundOverlay | null;\n getBounds: GroundOverlayMethod<\"getBounds\">;\n getMap: GroundOverlayMethod<\"getMap\">;\n getOpacity: GroundOverlayMethod<\"getOpacity\">;\n getPanes: GroundOverlayMethod<\"getPanes\">;\n getProjection: GroundOverlayMethod<\"getProjection\">;\n getUrl: GroundOverlayMethod<\"getUrl\">;\n setMap: GroundOverlayMethod<\"setMap\">;\n setOpacity: GroundOverlayMethod<\"setOpacity\">;\n}\n\nfunction toGroundOverlayOptions(\n props: GroundOverlayProps,\n targetMap: naver.maps.Map | null\n): GroundOverlayOptions {\n const options: GroundOverlayOptions = {};\n\n if (targetMap) {\n options.map = targetMap;\n }\n\n if (props.clickable !== undefined) {\n options.clickable = props.clickable;\n }\n\n if (props.opacity !== undefined) {\n options.opacity = props.opacity;\n }\n\n return options;\n}\n\nfunction buildGroundOverlayEventBindings(props: GroundOverlayProps) {\n return [\n {\n eventName: \"click\",\n invoke: props.onClick\n ? (event: unknown) => props.onClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"dblclick\",\n invoke: props.onDblClick\n ? (event: unknown) => props.onDblClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mousedown\",\n invoke: props.onMouseDown\n ? (event: unknown) => props.onMouseDown?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mousemove\",\n invoke: props.onMouseMove\n ? (event: unknown) => props.onMouseMove?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseout\",\n invoke: props.onMouseOut\n ? (event: unknown) => props.onMouseOut?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseover\",\n invoke: props.onMouseOver\n ? (event: unknown) => props.onMouseOver?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseup\",\n invoke: props.onMouseUp\n ? (event: unknown) => props.onMouseUp?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"rightclick\",\n invoke: props.onRightClick\n ? (event: unknown) => props.onRightClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchstart\",\n invoke: props.onTouchStart\n ? (event: unknown) => props.onTouchStart?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchmove\",\n invoke: props.onTouchMove\n ? (event: unknown) => props.onTouchMove?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchend\",\n invoke: props.onTouchEnd\n ? (event: unknown) => props.onTouchEnd?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"bounds_changed\",\n invoke: props.onBoundsChanged\n ? (event: unknown) => props.onBoundsChanged?.(event as naver.maps.Bounds)\n : undefined\n },\n {\n eventName: \"clickable_changed\",\n invoke: props.onClickableChanged\n ? (event: unknown) => props.onClickableChanged?.(event as boolean)\n : undefined\n },\n {\n eventName: \"map_changed\",\n invoke: props.onMapChanged\n ? (event: unknown) => props.onMapChanged?.(event as naver.maps.Map | null)\n : undefined\n },\n {\n eventName: \"opacity_changed\",\n invoke: props.onOpacityChanged\n ? (event: unknown) => props.onOpacityChanged?.(event as number)\n : undefined\n }\n ];\n}\n\nexport const GroundOverlay = forwardRef<GroundOverlayRef, GroundOverlayProps>(\n function GroundOverlayInner(props, ref) {\n const { map: contextMap, sdkStatus } = useNaverMap();\n const groundOverlayRef = useRef<naver.maps.GroundOverlay | null>(null);\n const groundOverlayEventListenersRef = useRef<naver.maps.MapEventListener[]>([]);\n const onGroundOverlayDestroyRef = useRef<GroundOverlayProps[\"onGroundOverlayDestroy\"]>(\n props.onGroundOverlayDestroy\n );\n const targetMap = props.map ?? contextMap;\n\n useEffect(() => {\n onGroundOverlayDestroyRef.current = props.onGroundOverlayDestroy;\n }, [props.onGroundOverlayDestroy]);\n\n const invokeGroundOverlayMethod = useCallback(\n <K extends keyof naver.maps.GroundOverlay>(\n methodName: K,\n ...args: Parameters<Extract<naver.maps.GroundOverlay[K], (...params: never[]) => unknown>>\n ):\n | ReturnType<Extract<naver.maps.GroundOverlay[K], (...params: never[]) => unknown>>\n | undefined => {\n const groundOverlay = groundOverlayRef.current;\n\n if (!groundOverlay) {\n return undefined;\n }\n\n const method = groundOverlay[methodName] as unknown;\n\n if (typeof method !== \"function\") {\n return undefined;\n }\n\n return (method as (...params: unknown[]) => unknown).apply(\n groundOverlay,\n args\n ) as ReturnType<Extract<naver.maps.GroundOverlay[K], (...params: never[]) => unknown>>;\n },\n []\n );\n\n const teardownGroundOverlay = useCallback(() => {\n const groundOverlay = groundOverlayRef.current;\n\n if (!groundOverlay) {\n return;\n }\n\n try {\n removeOverlayEventListeners(groundOverlayEventListenersRef.current);\n groundOverlayEventListenersRef.current = [];\n naver.maps.Event.clearInstanceListeners(groundOverlay);\n } catch (error) {\n console.error(\"[react-naver-maps-kit] failed to clear ground overlay listeners\", error);\n }\n\n groundOverlay.setMap(null);\n groundOverlayRef.current = null;\n onGroundOverlayDestroyRef.current?.();\n }, []);\n\n useImperativeHandle(\n ref,\n (): GroundOverlayRef => ({\n getInstance: () => groundOverlayRef.current,\n getBounds: (...args) => invokeGroundOverlayMethod(\"getBounds\", ...args),\n getMap: (...args) => invokeGroundOverlayMethod(\"getMap\", ...args),\n getOpacity: (...args) => invokeGroundOverlayMethod(\"getOpacity\", ...args),\n getPanes: (...args) => invokeGroundOverlayMethod(\"getPanes\", ...args),\n getProjection: (...args) => invokeGroundOverlayMethod(\"getProjection\", ...args),\n getUrl: (...args) => invokeGroundOverlayMethod(\"getUrl\", ...args),\n setMap: (...args) => invokeGroundOverlayMethod(\"setMap\", ...args),\n setOpacity: (...args) => invokeGroundOverlayMethod(\"setOpacity\", ...args)\n }),\n [invokeGroundOverlayMethod]\n );\n\n useEffect(() => {\n if (sdkStatus !== \"ready\" || !targetMap || groundOverlayRef.current) {\n return;\n }\n\n try {\n const groundOverlay = new naver.maps.GroundOverlay(\n props.url,\n props.bounds,\n toGroundOverlayOptions(props, targetMap)\n );\n\n groundOverlayRef.current = groundOverlay;\n bindOverlayEventListeners(\n groundOverlay,\n groundOverlayEventListenersRef,\n buildGroundOverlayEventBindings(props)\n );\n props.onGroundOverlayReady?.(groundOverlay);\n } catch (error) {\n const normalizedError =\n error instanceof Error\n ? error\n : new Error(\"Failed to create naver.maps.GroundOverlay instance.\");\n\n props.onGroundOverlayError?.(normalizedError);\n }\n }, [props, sdkStatus, targetMap]);\n\n useEffect(() => {\n const groundOverlay = groundOverlayRef.current;\n\n if (!groundOverlay || !targetMap) {\n return;\n }\n\n groundOverlay.setMap(targetMap);\n\n if (props.opacity !== undefined) {\n groundOverlay.setOpacity(props.opacity);\n }\n\n const optionsSettable = groundOverlay as naver.maps.GroundOverlay & {\n setOptions?: (options: GroundOverlayOptions) => void;\n };\n\n optionsSettable.setOptions?.(toGroundOverlayOptions(props, targetMap));\n }, [props, targetMap]);\n\n useEffect(() => {\n const groundOverlay = groundOverlayRef.current;\n\n if (!groundOverlay) {\n return;\n }\n\n bindOverlayEventListeners(\n groundOverlay,\n groundOverlayEventListenersRef,\n buildGroundOverlayEventBindings(props)\n );\n\n return () => {\n removeOverlayEventListeners(groundOverlayEventListenersRef.current);\n groundOverlayEventListenersRef.current = [];\n };\n }, [props]);\n\n useEffect(() => {\n return () => {\n teardownGroundOverlay();\n };\n }, [teardownGroundOverlay]);\n\n return null;\n }\n);\n\nGroundOverlay.displayName = \"GroundOverlay\";\n","import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef } from \"react\";\n\nimport { useNaverMap } from \"../../react/hooks/useNaverMap\";\nimport { bindOverlayEventListeners, removeOverlayEventListeners } from \"../shared/overlayUtils\";\n\ntype PolygonOptions = naver.maps.PolygonOptions;\n\ninterface PolygonOptionProps {\n map?: naver.maps.Map | null;\n paths: PolygonOptions[\"paths\"];\n strokeWeight?: PolygonOptions[\"strokeWeight\"];\n strokeOpacity?: PolygonOptions[\"strokeOpacity\"];\n strokeColor?: PolygonOptions[\"strokeColor\"];\n strokeStyle?: PolygonOptions[\"strokeStyle\"];\n strokeLineCap?: PolygonOptions[\"strokeLineCap\"];\n strokeLineJoin?: PolygonOptions[\"strokeLineJoin\"];\n fillColor?: PolygonOptions[\"fillColor\"];\n fillOpacity?: PolygonOptions[\"fillOpacity\"];\n clickable?: PolygonOptions[\"clickable\"];\n visible?: PolygonOptions[\"visible\"];\n zIndex?: PolygonOptions[\"zIndex\"];\n}\n\ninterface PolygonLifecycleProps {\n onPolygonReady?: (polygon: naver.maps.Polygon) => void;\n onPolygonDestroy?: () => void;\n onPolygonError?: (error: Error) => void;\n}\n\ninterface PolygonEventProps {\n onClick?: (event: naver.maps.PointerEvent) => void;\n onDblClick?: (event: naver.maps.PointerEvent) => void;\n onMouseDown?: (event: naver.maps.PointerEvent) => void;\n onMouseMove?: (event: naver.maps.PointerEvent) => void;\n onMouseOut?: (event: naver.maps.PointerEvent) => void;\n onMouseOver?: (event: naver.maps.PointerEvent) => void;\n onMouseUp?: (event: naver.maps.PointerEvent) => void;\n onRightClick?: (event: naver.maps.PointerEvent) => void;\n onTouchStart?: (event: naver.maps.PointerEvent) => void;\n onTouchMove?: (event: naver.maps.PointerEvent) => void;\n onTouchEnd?: (event: naver.maps.PointerEvent) => void;\n onClickableChanged?: (clickable: boolean) => void;\n onFillColorChanged?: (fillColor: string) => void;\n onFillOpacityChanged?: (fillOpacity: number) => void;\n onMapChanged?: (map: naver.maps.Map | null) => void;\n onPathChanged?: (\n path: naver.maps.ArrayOfCoords | naver.maps.KVOArrayOfCoords | naver.maps.ArrayOfCoordsLiteral\n ) => void;\n onPathsChanged?: (\n paths:\n | naver.maps.ArrayOfCoords[]\n | naver.maps.KVOArray<naver.maps.KVOArrayOfCoords>\n | naver.maps.ArrayOfCoordsLiteral[]\n ) => void;\n onStrokeColorChanged?: (strokeColor: string) => void;\n onStrokeLineCapChanged?: (strokeLineCap: naver.maps.StrokeLineCapType) => void;\n onStrokeLineJoinChanged?: (strokeLineJoin: naver.maps.StrokeLineJoinType) => void;\n onStrokeOpacityChanged?: (strokeOpacity: number) => void;\n onStrokeStyleChanged?: (strokeStyle: naver.maps.StrokeStyleType) => void;\n onStrokeWeightChanged?: (strokeWeight: number) => void;\n onVisibleChanged?: (visible: boolean) => void;\n onZIndexChanged?: (zIndex: number) => void;\n}\n\nexport type PolygonProps = PolygonOptionProps & PolygonLifecycleProps & PolygonEventProps;\n\ntype PolygonMethod<K extends keyof naver.maps.Polygon> = naver.maps.Polygon[K] extends (\n ...args: infer A\n) => infer R\n ? (...args: A) => R | undefined\n : never;\n\nexport interface PolygonRef {\n getInstance: () => naver.maps.Polygon | null;\n getAreaSize: PolygonMethod<\"getAreaSize\">;\n getBounds: PolygonMethod<\"getBounds\">;\n getClickable: PolygonMethod<\"getClickable\">;\n getDrawingRect: PolygonMethod<\"getDrawingRect\">;\n getElement: PolygonMethod<\"getElement\">;\n getMap: PolygonMethod<\"getMap\">;\n getOptions: PolygonMethod<\"getOptions\">;\n getPanes: PolygonMethod<\"getPanes\">;\n getPath: PolygonMethod<\"getPath\">;\n getPaths: PolygonMethod<\"getPaths\">;\n getProjection: PolygonMethod<\"getProjection\">;\n getStyles: PolygonMethod<\"getStyles\">;\n getVisible: PolygonMethod<\"getVisible\">;\n getZIndex: PolygonMethod<\"getZIndex\">;\n setClickable: PolygonMethod<\"setClickable\">;\n setMap: PolygonMethod<\"setMap\">;\n setOptions: PolygonMethod<\"setOptions\">;\n setPath: PolygonMethod<\"setPath\">;\n setPaths: PolygonMethod<\"setPaths\">;\n setStyles: PolygonMethod<\"setStyles\">;\n setVisible: PolygonMethod<\"setVisible\">;\n setZIndex: PolygonMethod<\"setZIndex\">;\n}\n\nfunction toPolygonOptions(props: PolygonProps, targetMap: naver.maps.Map | null): PolygonOptions {\n const options: PolygonOptions = {\n paths: props.paths\n };\n\n if (targetMap) {\n options.map = targetMap;\n }\n\n if (props.strokeWeight !== undefined) {\n options.strokeWeight = props.strokeWeight;\n }\n\n if (props.strokeOpacity !== undefined) {\n options.strokeOpacity = props.strokeOpacity;\n }\n\n if (props.strokeColor !== undefined) {\n options.strokeColor = props.strokeColor;\n }\n\n if (props.strokeStyle !== undefined) {\n options.strokeStyle = props.strokeStyle;\n }\n\n if (props.strokeLineCap !== undefined) {\n options.strokeLineCap = props.strokeLineCap;\n }\n\n if (props.strokeLineJoin !== undefined) {\n options.strokeLineJoin = props.strokeLineJoin;\n }\n\n if (props.fillColor !== undefined) {\n options.fillColor = props.fillColor;\n }\n\n if (props.fillOpacity !== undefined) {\n options.fillOpacity = props.fillOpacity;\n }\n\n if (props.clickable !== undefined) {\n options.clickable = props.clickable;\n }\n\n if (props.visible !== undefined) {\n options.visible = props.visible;\n }\n\n if (props.zIndex !== undefined) {\n options.zIndex = props.zIndex;\n }\n\n return options;\n}\n\nfunction buildPolygonEventBindings(props: PolygonProps) {\n return [\n {\n eventName: \"click\",\n invoke: props.onClick\n ? (event: unknown) => props.onClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"dblclick\",\n invoke: props.onDblClick\n ? (event: unknown) => props.onDblClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mousedown\",\n invoke: props.onMouseDown\n ? (event: unknown) => props.onMouseDown?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mousemove\",\n invoke: props.onMouseMove\n ? (event: unknown) => props.onMouseMove?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseout\",\n invoke: props.onMouseOut\n ? (event: unknown) => props.onMouseOut?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseover\",\n invoke: props.onMouseOver\n ? (event: unknown) => props.onMouseOver?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseup\",\n invoke: props.onMouseUp\n ? (event: unknown) => props.onMouseUp?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"rightclick\",\n invoke: props.onRightClick\n ? (event: unknown) => props.onRightClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchstart\",\n invoke: props.onTouchStart\n ? (event: unknown) => props.onTouchStart?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchmove\",\n invoke: props.onTouchMove\n ? (event: unknown) => props.onTouchMove?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchend\",\n invoke: props.onTouchEnd\n ? (event: unknown) => props.onTouchEnd?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"clickable_changed\",\n invoke: props.onClickableChanged\n ? (event: unknown) => props.onClickableChanged?.(event as boolean)\n : undefined\n },\n {\n eventName: \"fillColor_changed\",\n invoke: props.onFillColorChanged\n ? (event: unknown) => props.onFillColorChanged?.(event as string)\n : undefined\n },\n {\n eventName: \"fillOpacity_changed\",\n invoke: props.onFillOpacityChanged\n ? (event: unknown) => props.onFillOpacityChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"map_changed\",\n invoke: props.onMapChanged\n ? (event: unknown) => props.onMapChanged?.(event as naver.maps.Map | null)\n : undefined\n },\n {\n eventName: \"path_changed\",\n invoke: props.onPathChanged\n ? (event: unknown) =>\n props.onPathChanged?.(\n event as\n | naver.maps.ArrayOfCoords\n | naver.maps.KVOArrayOfCoords\n | naver.maps.ArrayOfCoordsLiteral\n )\n : undefined\n },\n {\n eventName: \"paths_changed\",\n invoke: props.onPathsChanged\n ? (event: unknown) =>\n props.onPathsChanged?.(\n event as\n | naver.maps.ArrayOfCoords[]\n | naver.maps.KVOArray<naver.maps.KVOArrayOfCoords>\n | naver.maps.ArrayOfCoordsLiteral[]\n )\n : undefined\n },\n {\n eventName: \"strokeColor_changed\",\n invoke: props.onStrokeColorChanged\n ? (event: unknown) => props.onStrokeColorChanged?.(event as string)\n : undefined\n },\n {\n eventName: \"strokeLineCap_changed\",\n invoke: props.onStrokeLineCapChanged\n ? (event: unknown) => props.onStrokeLineCapChanged?.(event as naver.maps.StrokeLineCapType)\n : undefined\n },\n {\n eventName: \"strokeLineJoin_changed\",\n invoke: props.onStrokeLineJoinChanged\n ? (event: unknown) =>\n props.onStrokeLineJoinChanged?.(event as naver.maps.StrokeLineJoinType)\n : undefined\n },\n {\n eventName: \"strokeOpacity_changed\",\n invoke: props.onStrokeOpacityChanged\n ? (event: unknown) => props.onStrokeOpacityChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"strokeStyle_changed\",\n invoke: props.onStrokeStyleChanged\n ? (event: unknown) => props.onStrokeStyleChanged?.(event as naver.maps.StrokeStyleType)\n : undefined\n },\n {\n eventName: \"strokeWeight_changed\",\n invoke: props.onStrokeWeightChanged\n ? (event: unknown) => props.onStrokeWeightChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"visible_changed\",\n invoke: props.onVisibleChanged\n ? (event: unknown) => props.onVisibleChanged?.(event as boolean)\n : undefined\n },\n {\n eventName: \"zIndex_changed\",\n invoke: props.onZIndexChanged\n ? (event: unknown) => props.onZIndexChanged?.(event as number)\n : undefined\n }\n ];\n}\n\nexport const Polygon = forwardRef<PolygonRef, PolygonProps>(function PolygonInner(props, ref) {\n const { map: contextMap, sdkStatus } = useNaverMap();\n const polygonRef = useRef<naver.maps.Polygon | null>(null);\n const polygonEventListenersRef = useRef<naver.maps.MapEventListener[]>([]);\n const onPolygonDestroyRef = useRef<PolygonProps[\"onPolygonDestroy\"]>(props.onPolygonDestroy);\n const targetMap = props.map ?? contextMap;\n\n useEffect(() => {\n onPolygonDestroyRef.current = props.onPolygonDestroy;\n }, [props.onPolygonDestroy]);\n\n const invokePolygonMethod = useCallback(\n <K extends keyof naver.maps.Polygon>(\n methodName: K,\n ...args: Parameters<Extract<naver.maps.Polygon[K], (...params: never[]) => unknown>>\n ): ReturnType<Extract<naver.maps.Polygon[K], (...params: never[]) => unknown>> | undefined => {\n const polygon = polygonRef.current;\n\n if (!polygon) {\n return undefined;\n }\n\n const method = polygon[methodName] as unknown;\n\n if (typeof method !== \"function\") {\n return undefined;\n }\n\n return (method as (...params: unknown[]) => unknown).apply(polygon, args) as ReturnType<\n Extract<naver.maps.Polygon[K], (...params: never[]) => unknown>\n >;\n },\n []\n );\n\n const teardownPolygon = useCallback(() => {\n const polygon = polygonRef.current;\n\n if (!polygon) {\n return;\n }\n\n try {\n removeOverlayEventListeners(polygonEventListenersRef.current);\n polygonEventListenersRef.current = [];\n naver.maps.Event.clearInstanceListeners(polygon);\n } catch (error) {\n console.error(\"[react-naver-maps-kit] failed to clear polygon listeners\", error);\n }\n\n polygon.setMap(null);\n polygonRef.current = null;\n onPolygonDestroyRef.current?.();\n }, []);\n\n useImperativeHandle(\n ref,\n (): PolygonRef => ({\n getInstance: () => polygonRef.current,\n getAreaSize: (...args) => invokePolygonMethod(\"getAreaSize\", ...args),\n getBounds: (...args) => invokePolygonMethod(\"getBounds\", ...args),\n getClickable: (...args) => invokePolygonMethod(\"getClickable\", ...args),\n getDrawingRect: (...args) => invokePolygonMethod(\"getDrawingRect\", ...args),\n getElement: (...args) => invokePolygonMethod(\"getElement\", ...args),\n getMap: (...args) => invokePolygonMethod(\"getMap\", ...args),\n getOptions: (...args) => invokePolygonMethod(\"getOptions\", ...args),\n getPanes: (...args) => invokePolygonMethod(\"getPanes\", ...args),\n getPath: (...args) => invokePolygonMethod(\"getPath\", ...args),\n getPaths: (...args) => invokePolygonMethod(\"getPaths\", ...args),\n getProjection: (...args) => invokePolygonMethod(\"getProjection\", ...args),\n getStyles: (...args) => invokePolygonMethod(\"getStyles\", ...args),\n getVisible: (...args) => invokePolygonMethod(\"getVisible\", ...args),\n getZIndex: (...args) => invokePolygonMethod(\"getZIndex\", ...args),\n setClickable: (...args) => invokePolygonMethod(\"setClickable\", ...args),\n setMap: (...args) => invokePolygonMethod(\"setMap\", ...args),\n setOptions: (...args) => invokePolygonMethod(\"setOptions\", ...args),\n setPath: (...args) => invokePolygonMethod(\"setPath\", ...args),\n setPaths: (...args) => invokePolygonMethod(\"setPaths\", ...args),\n setStyles: (...args) => invokePolygonMethod(\"setStyles\", ...args),\n setVisible: (...args) => invokePolygonMethod(\"setVisible\", ...args),\n setZIndex: (...args) => invokePolygonMethod(\"setZIndex\", ...args)\n }),\n [invokePolygonMethod]\n );\n\n useEffect(() => {\n if (sdkStatus !== \"ready\" || !targetMap || polygonRef.current) {\n return;\n }\n\n try {\n const polygon = new naver.maps.Polygon(toPolygonOptions(props, targetMap));\n\n polygonRef.current = polygon;\n bindOverlayEventListeners(\n polygon,\n polygonEventListenersRef,\n buildPolygonEventBindings(props)\n );\n props.onPolygonReady?.(polygon);\n } catch (error) {\n const normalizedError =\n error instanceof Error ? error : new Error(\"Failed to create naver.maps.Polygon instance.\");\n\n props.onPolygonError?.(normalizedError);\n }\n }, [props, sdkStatus, targetMap]);\n\n useEffect(() => {\n const polygon = polygonRef.current;\n\n if (!polygon || !targetMap) {\n return;\n }\n\n polygon.setOptions(toPolygonOptions(props, targetMap));\n }, [props, targetMap]);\n\n useEffect(() => {\n const polygon = polygonRef.current;\n\n if (!polygon) {\n return;\n }\n\n bindOverlayEventListeners(polygon, polygonEventListenersRef, buildPolygonEventBindings(props));\n\n return () => {\n removeOverlayEventListeners(polygonEventListenersRef.current);\n polygonEventListenersRef.current = [];\n };\n }, [props]);\n\n useEffect(() => {\n return () => {\n teardownPolygon();\n };\n }, [teardownPolygon]);\n\n return null;\n});\n\nPolygon.displayName = \"Polygon\";\n","import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef } from \"react\";\n\nimport { useNaverMap } from \"../../react/hooks/useNaverMap\";\nimport { bindOverlayEventListeners, removeOverlayEventListeners } from \"../shared/overlayUtils\";\n\ntype PolylineOptions = naver.maps.PolylineOptions;\n\ninterface PolylineOptionProps {\n map?: naver.maps.Map | null;\n path: PolylineOptions[\"path\"];\n strokeWeight?: PolylineOptions[\"strokeWeight\"];\n strokeOpacity?: PolylineOptions[\"strokeOpacity\"];\n strokeColor?: PolylineOptions[\"strokeColor\"];\n strokeStyle?: PolylineOptions[\"strokeStyle\"];\n strokeLineCap?: PolylineOptions[\"strokeLineCap\"];\n strokeLineJoin?: PolylineOptions[\"strokeLineJoin\"];\n clickable?: PolylineOptions[\"clickable\"];\n visible?: PolylineOptions[\"visible\"];\n zIndex?: PolylineOptions[\"zIndex\"];\n startIcon?: PolylineOptions[\"startIcon\"];\n startIconSize?: PolylineOptions[\"startIconSize\"];\n endIcon?: PolylineOptions[\"endIcon\"];\n endIconSize?: PolylineOptions[\"endIconSize\"];\n}\n\ninterface PolylineLifecycleProps {\n onPolylineReady?: (polyline: naver.maps.Polyline) => void;\n onPolylineDestroy?: () => void;\n onPolylineError?: (error: Error) => void;\n}\n\ninterface PolylineEventProps {\n onClick?: (event: naver.maps.PointerEvent) => void;\n onDblClick?: (event: naver.maps.PointerEvent) => void;\n onMouseDown?: (event: naver.maps.PointerEvent) => void;\n onMouseMove?: (event: naver.maps.PointerEvent) => void;\n onMouseOut?: (event: naver.maps.PointerEvent) => void;\n onMouseOver?: (event: naver.maps.PointerEvent) => void;\n onMouseUp?: (event: naver.maps.PointerEvent) => void;\n onRightClick?: (event: naver.maps.PointerEvent) => void;\n onTouchStart?: (event: naver.maps.PointerEvent) => void;\n onTouchMove?: (event: naver.maps.PointerEvent) => void;\n onTouchEnd?: (event: naver.maps.PointerEvent) => void;\n onClickableChanged?: (clickable: boolean) => void;\n onEndIconChanged?: (icon: naver.maps.PointingIcon) => void;\n onEndIconSizeChanged?: (size: number) => void;\n onMapChanged?: (map: naver.maps.Map | null) => void;\n onPathChanged?: (\n path: naver.maps.ArrayOfCoords | naver.maps.KVOArrayOfCoords | naver.maps.ArrayOfCoordsLiteral\n ) => void;\n onStartIconChanged?: (icon: naver.maps.PointingIcon) => void;\n onStartIconSizeChanged?: (size: number) => void;\n onStrokeColorChanged?: (strokeColor: string) => void;\n onStrokeLineCapChanged?: (strokeLineCap: naver.maps.StrokeLineCapType) => void;\n onStrokeLineJoinChanged?: (strokeLineJoin: naver.maps.StrokeLineJoinType) => void;\n onStrokeOpacityChanged?: (strokeOpacity: number) => void;\n onStrokeStyleChanged?: (strokeStyle: naver.maps.StrokeStyleType) => void;\n onStrokeWeightChanged?: (strokeWeight: number) => void;\n onVisibleChanged?: (visible: boolean) => void;\n onZIndexChanged?: (zIndex: number) => void;\n}\n\nexport type PolylineProps = PolylineOptionProps & PolylineLifecycleProps & PolylineEventProps;\n\ntype PolylineMethod<K extends keyof naver.maps.Polyline> = naver.maps.Polyline[K] extends (\n ...args: infer A\n) => infer R\n ? (...args: A) => R | undefined\n : never;\n\nexport interface PolylineRef {\n getInstance: () => naver.maps.Polyline | null;\n getBounds: PolylineMethod<\"getBounds\">;\n getClickable: PolylineMethod<\"getClickable\">;\n getDistance: PolylineMethod<\"getDistance\">;\n getDrawingRect: PolylineMethod<\"getDrawingRect\">;\n getElement: PolylineMethod<\"getElement\">;\n getMap: PolylineMethod<\"getMap\">;\n getOptions: PolylineMethod<\"getOptions\">;\n getPanes: PolylineMethod<\"getPanes\">;\n getPath: PolylineMethod<\"getPath\">;\n getProjection: PolylineMethod<\"getProjection\">;\n getStyles: PolylineMethod<\"getStyles\">;\n getVisible: PolylineMethod<\"getVisible\">;\n getZIndex: PolylineMethod<\"getZIndex\">;\n setClickable: PolylineMethod<\"setClickable\">;\n setMap: PolylineMethod<\"setMap\">;\n setOptions: PolylineMethod<\"setOptions\">;\n setPath: PolylineMethod<\"setPath\">;\n setStyles: PolylineMethod<\"setStyles\">;\n setVisible: PolylineMethod<\"setVisible\">;\n setZIndex: PolylineMethod<\"setZIndex\">;\n}\n\nfunction toPolylineOptions(\n props: PolylineProps,\n targetMap: naver.maps.Map | null\n): PolylineOptions {\n const options: PolylineOptions = {\n path: props.path\n };\n\n if (targetMap) {\n options.map = targetMap;\n }\n\n if (props.strokeWeight !== undefined) {\n options.strokeWeight = props.strokeWeight;\n }\n\n if (props.strokeOpacity !== undefined) {\n options.strokeOpacity = props.strokeOpacity;\n }\n\n if (props.strokeColor !== undefined) {\n options.strokeColor = props.strokeColor;\n }\n\n if (props.strokeStyle !== undefined) {\n options.strokeStyle = props.strokeStyle;\n }\n\n if (props.strokeLineCap !== undefined) {\n options.strokeLineCap = props.strokeLineCap;\n }\n\n if (props.strokeLineJoin !== undefined) {\n options.strokeLineJoin = props.strokeLineJoin;\n }\n\n if (props.clickable !== undefined) {\n options.clickable = props.clickable;\n }\n\n if (props.visible !== undefined) {\n options.visible = props.visible;\n }\n\n if (props.zIndex !== undefined) {\n options.zIndex = props.zIndex;\n }\n\n if (props.startIcon !== undefined) {\n options.startIcon = props.startIcon;\n }\n\n if (props.startIconSize !== undefined) {\n options.startIconSize = props.startIconSize;\n }\n\n if (props.endIcon !== undefined) {\n options.endIcon = props.endIcon;\n }\n\n if (props.endIconSize !== undefined) {\n options.endIconSize = props.endIconSize;\n }\n\n return options;\n}\n\nfunction buildPolylineEventBindings(props: PolylineProps) {\n return [\n {\n eventName: \"click\",\n invoke: props.onClick\n ? (event: unknown) => props.onClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"dblclick\",\n invoke: props.onDblClick\n ? (event: unknown) => props.onDblClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mousedown\",\n invoke: props.onMouseDown\n ? (event: unknown) => props.onMouseDown?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mousemove\",\n invoke: props.onMouseMove\n ? (event: unknown) => props.onMouseMove?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseout\",\n invoke: props.onMouseOut\n ? (event: unknown) => props.onMouseOut?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseover\",\n invoke: props.onMouseOver\n ? (event: unknown) => props.onMouseOver?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseup\",\n invoke: props.onMouseUp\n ? (event: unknown) => props.onMouseUp?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"rightclick\",\n invoke: props.onRightClick\n ? (event: unknown) => props.onRightClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchstart\",\n invoke: props.onTouchStart\n ? (event: unknown) => props.onTouchStart?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchmove\",\n invoke: props.onTouchMove\n ? (event: unknown) => props.onTouchMove?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchend\",\n invoke: props.onTouchEnd\n ? (event: unknown) => props.onTouchEnd?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"clickable_changed\",\n invoke: props.onClickableChanged\n ? (event: unknown) => props.onClickableChanged?.(event as boolean)\n : undefined\n },\n {\n eventName: \"endIcon_changed\",\n invoke: props.onEndIconChanged\n ? (event: unknown) => props.onEndIconChanged?.(event as naver.maps.PointingIcon)\n : undefined\n },\n {\n eventName: \"endIconSize_changed\",\n invoke: props.onEndIconSizeChanged\n ? (event: unknown) => props.onEndIconSizeChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"map_changed\",\n invoke: props.onMapChanged\n ? (event: unknown) => props.onMapChanged?.(event as naver.maps.Map | null)\n : undefined\n },\n {\n eventName: \"path_changed\",\n invoke: props.onPathChanged\n ? (event: unknown) =>\n props.onPathChanged?.(\n event as\n | naver.maps.ArrayOfCoords\n | naver.maps.KVOArrayOfCoords\n | naver.maps.ArrayOfCoordsLiteral\n )\n : undefined\n },\n {\n eventName: \"startIcon_changed\",\n invoke: props.onStartIconChanged\n ? (event: unknown) => props.onStartIconChanged?.(event as naver.maps.PointingIcon)\n : undefined\n },\n {\n eventName: \"startIconSize_changed\",\n invoke: props.onStartIconSizeChanged\n ? (event: unknown) => props.onStartIconSizeChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"strokeColor_changed\",\n invoke: props.onStrokeColorChanged\n ? (event: unknown) => props.onStrokeColorChanged?.(event as string)\n : undefined\n },\n {\n eventName: \"strokeLineCap_changed\",\n invoke: props.onStrokeLineCapChanged\n ? (event: unknown) => props.onStrokeLineCapChanged?.(event as naver.maps.StrokeLineCapType)\n : undefined\n },\n {\n eventName: \"strokeLineJoin_changed\",\n invoke: props.onStrokeLineJoinChanged\n ? (event: unknown) =>\n props.onStrokeLineJoinChanged?.(event as naver.maps.StrokeLineJoinType)\n : undefined\n },\n {\n eventName: \"strokeOpacity_changed\",\n invoke: props.onStrokeOpacityChanged\n ? (event: unknown) => props.onStrokeOpacityChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"strokeStyle_changed\",\n invoke: props.onStrokeStyleChanged\n ? (event: unknown) => props.onStrokeStyleChanged?.(event as naver.maps.StrokeStyleType)\n : undefined\n },\n {\n eventName: \"strokeWeight_changed\",\n invoke: props.onStrokeWeightChanged\n ? (event: unknown) => props.onStrokeWeightChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"visible_changed\",\n invoke: props.onVisibleChanged\n ? (event: unknown) => props.onVisibleChanged?.(event as boolean)\n : undefined\n },\n {\n eventName: \"zIndex_changed\",\n invoke: props.onZIndexChanged\n ? (event: unknown) => props.onZIndexChanged?.(event as number)\n : undefined\n }\n ];\n}\n\nexport const Polyline = forwardRef<PolylineRef, PolylineProps>(function PolylineInner(props, ref) {\n const { map: contextMap, sdkStatus } = useNaverMap();\n const polylineRef = useRef<naver.maps.Polyline | null>(null);\n const polylineEventListenersRef = useRef<naver.maps.MapEventListener[]>([]);\n const onPolylineDestroyRef = useRef<PolylineProps[\"onPolylineDestroy\"]>(props.onPolylineDestroy);\n const targetMap = props.map ?? contextMap;\n\n useEffect(() => {\n onPolylineDestroyRef.current = props.onPolylineDestroy;\n }, [props.onPolylineDestroy]);\n\n const invokePolylineMethod = useCallback(\n <K extends keyof naver.maps.Polyline>(\n methodName: K,\n ...args: Parameters<Extract<naver.maps.Polyline[K], (...params: never[]) => unknown>>\n ): ReturnType<Extract<naver.maps.Polyline[K], (...params: never[]) => unknown>> | undefined => {\n const polyline = polylineRef.current;\n\n if (!polyline) {\n return undefined;\n }\n\n const method = polyline[methodName] as unknown;\n\n if (typeof method !== \"function\") {\n return undefined;\n }\n\n return (method as (...params: unknown[]) => unknown).apply(polyline, args) as ReturnType<\n Extract<naver.maps.Polyline[K], (...params: never[]) => unknown>\n >;\n },\n []\n );\n\n const teardownPolyline = useCallback(() => {\n const polyline = polylineRef.current;\n\n if (!polyline) {\n return;\n }\n\n try {\n removeOverlayEventListeners(polylineEventListenersRef.current);\n polylineEventListenersRef.current = [];\n naver.maps.Event.clearInstanceListeners(polyline);\n } catch (error) {\n console.error(\"[react-naver-maps-kit] failed to clear polyline listeners\", error);\n }\n\n polyline.setMap(null);\n polylineRef.current = null;\n onPolylineDestroyRef.current?.();\n }, []);\n\n useImperativeHandle(\n ref,\n (): PolylineRef => ({\n getInstance: () => polylineRef.current,\n getBounds: (...args) => invokePolylineMethod(\"getBounds\", ...args),\n getClickable: (...args) => invokePolylineMethod(\"getClickable\", ...args),\n getDistance: (...args) => invokePolylineMethod(\"getDistance\", ...args),\n getDrawingRect: (...args) => invokePolylineMethod(\"getDrawingRect\", ...args),\n getElement: (...args) => invokePolylineMethod(\"getElement\", ...args),\n getMap: (...args) => invokePolylineMethod(\"getMap\", ...args),\n getOptions: (...args) => invokePolylineMethod(\"getOptions\", ...args),\n getPanes: (...args) => invokePolylineMethod(\"getPanes\", ...args),\n getPath: (...args) => invokePolylineMethod(\"getPath\", ...args),\n getProjection: (...args) => invokePolylineMethod(\"getProjection\", ...args),\n getStyles: (...args) => invokePolylineMethod(\"getStyles\", ...args),\n getVisible: (...args) => invokePolylineMethod(\"getVisible\", ...args),\n getZIndex: (...args) => invokePolylineMethod(\"getZIndex\", ...args),\n setClickable: (...args) => invokePolylineMethod(\"setClickable\", ...args),\n setMap: (...args) => invokePolylineMethod(\"setMap\", ...args),\n setOptions: (...args) => invokePolylineMethod(\"setOptions\", ...args),\n setPath: (...args) => invokePolylineMethod(\"setPath\", ...args),\n setStyles: (...args) => invokePolylineMethod(\"setStyles\", ...args),\n setVisible: (...args) => invokePolylineMethod(\"setVisible\", ...args),\n setZIndex: (...args) => invokePolylineMethod(\"setZIndex\", ...args)\n }),\n [invokePolylineMethod]\n );\n\n useEffect(() => {\n if (sdkStatus !== \"ready\" || !targetMap || polylineRef.current) {\n return;\n }\n\n try {\n const polyline = new naver.maps.Polyline(toPolylineOptions(props, targetMap));\n\n polylineRef.current = polyline;\n bindOverlayEventListeners(\n polyline,\n polylineEventListenersRef,\n buildPolylineEventBindings(props)\n );\n props.onPolylineReady?.(polyline);\n } catch (error) {\n const normalizedError =\n error instanceof Error\n ? error\n : new Error(\"Failed to create naver.maps.Polyline instance.\");\n\n props.onPolylineError?.(normalizedError);\n }\n }, [props, sdkStatus, targetMap]);\n\n useEffect(() => {\n const polyline = polylineRef.current;\n\n if (!polyline || !targetMap) {\n return;\n }\n\n polyline.setOptions(toPolylineOptions(props, targetMap));\n }, [props, targetMap]);\n\n useEffect(() => {\n const polyline = polylineRef.current;\n\n if (!polyline) {\n return;\n }\n\n bindOverlayEventListeners(\n polyline,\n polylineEventListenersRef,\n buildPolylineEventBindings(props)\n );\n\n return () => {\n removeOverlayEventListeners(polylineEventListenersRef.current);\n polylineEventListenersRef.current = [];\n };\n }, [props]);\n\n useEffect(() => {\n return () => {\n teardownPolyline();\n };\n }, [teardownPolyline]);\n\n return null;\n});\n\nPolyline.displayName = \"Polyline\";\n","import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef } from \"react\";\n\nimport { useNaverMap } from \"../../react/hooks/useNaverMap\";\nimport { bindOverlayEventListeners, removeOverlayEventListeners } from \"../shared/overlayUtils\";\n\ntype RectangleOptions = naver.maps.RectangleOptions;\n\ninterface RectangleOptionProps {\n map?: naver.maps.Map | null;\n bounds: RectangleOptions[\"bounds\"];\n strokeWeight?: RectangleOptions[\"strokeWeight\"];\n strokeOpacity?: RectangleOptions[\"strokeOpacity\"];\n strokeColor?: RectangleOptions[\"strokeColor\"];\n strokeStyle?: RectangleOptions[\"strokeStyle\"];\n strokeLineCap?: RectangleOptions[\"strokeLineCap\"];\n strokeLineJoin?: RectangleOptions[\"strokeLineJoin\"];\n fillColor?: RectangleOptions[\"fillColor\"];\n fillOpacity?: RectangleOptions[\"fillOpacity\"];\n clickable?: RectangleOptions[\"clickable\"];\n visible?: RectangleOptions[\"visible\"];\n zIndex?: RectangleOptions[\"zIndex\"];\n}\n\ninterface RectangleLifecycleProps {\n onRectangleReady?: (rectangle: naver.maps.Rectangle) => void;\n onRectangleDestroy?: () => void;\n onRectangleError?: (error: Error) => void;\n}\n\ninterface RectangleEventProps {\n onClick?: (event: naver.maps.PointerEvent) => void;\n onDblClick?: (event: naver.maps.PointerEvent) => void;\n onMouseDown?: (event: naver.maps.PointerEvent) => void;\n onMouseMove?: (event: naver.maps.PointerEvent) => void;\n onMouseOut?: (event: naver.maps.PointerEvent) => void;\n onMouseOver?: (event: naver.maps.PointerEvent) => void;\n onMouseUp?: (event: naver.maps.PointerEvent) => void;\n onRightClick?: (event: naver.maps.PointerEvent) => void;\n onTouchStart?: (event: naver.maps.PointerEvent) => void;\n onTouchMove?: (event: naver.maps.PointerEvent) => void;\n onTouchEnd?: (event: naver.maps.PointerEvent) => void;\n onBoundsChanged?: (bounds: naver.maps.Bounds) => void;\n onClickableChanged?: (clickable: boolean) => void;\n onFillColorChanged?: (fillColor: string) => void;\n onFillOpacityChanged?: (fillOpacity: number) => void;\n onMapChanged?: (map: naver.maps.Map | null) => void;\n onStrokeColorChanged?: (strokeColor: string) => void;\n onStrokeLineCapChanged?: (strokeLineCap: naver.maps.StrokeLineCapType) => void;\n onStrokeLineJoinChanged?: (strokeLineJoin: naver.maps.StrokeLineJoinType) => void;\n onStrokeOpacityChanged?: (strokeOpacity: number) => void;\n onStrokeStyleChanged?: (strokeStyle: naver.maps.StrokeStyleType) => void;\n onStrokeWeightChanged?: (strokeWeight: number) => void;\n onVisibleChanged?: (visible: boolean) => void;\n onZIndexChanged?: (zIndex: number) => void;\n}\n\nexport type RectangleProps = RectangleOptionProps & RectangleLifecycleProps & RectangleEventProps;\n\ntype RectangleMethod<K extends keyof naver.maps.Rectangle> = naver.maps.Rectangle[K] extends (\n ...args: infer A\n) => infer R\n ? (...args: A) => R | undefined\n : never;\n\nexport interface RectangleRef {\n getInstance: () => naver.maps.Rectangle | null;\n getAreaSize: RectangleMethod<\"getAreaSize\">;\n getBounds: RectangleMethod<\"getBounds\">;\n getClickable: RectangleMethod<\"getClickable\">;\n getDrawingRect: RectangleMethod<\"getDrawingRect\">;\n getElement: RectangleMethod<\"getElement\">;\n getMap: RectangleMethod<\"getMap\">;\n getOptions: RectangleMethod<\"getOptions\">;\n getPanes: RectangleMethod<\"getPanes\">;\n getProjection: RectangleMethod<\"getProjection\">;\n getStyles: RectangleMethod<\"getStyles\">;\n getVisible: RectangleMethod<\"getVisible\">;\n getZIndex: RectangleMethod<\"getZIndex\">;\n setBounds: RectangleMethod<\"setBounds\">;\n setClickable: RectangleMethod<\"setClickable\">;\n setMap: RectangleMethod<\"setMap\">;\n setOptions: RectangleMethod<\"setOptions\">;\n setStyles: RectangleMethod<\"setStyles\">;\n setVisible: RectangleMethod<\"setVisible\">;\n setZIndex: RectangleMethod<\"setZIndex\">;\n}\n\nfunction toRectangleOptions(\n props: RectangleProps,\n targetMap: naver.maps.Map | null\n): RectangleOptions {\n const options: RectangleOptions = {\n bounds: props.bounds\n };\n\n if (targetMap) {\n options.map = targetMap;\n }\n\n if (props.strokeWeight !== undefined) {\n options.strokeWeight = props.strokeWeight;\n }\n\n if (props.strokeOpacity !== undefined) {\n options.strokeOpacity = props.strokeOpacity;\n }\n\n if (props.strokeColor !== undefined) {\n options.strokeColor = props.strokeColor;\n }\n\n if (props.strokeStyle !== undefined) {\n options.strokeStyle = props.strokeStyle;\n }\n\n if (props.strokeLineCap !== undefined) {\n options.strokeLineCap = props.strokeLineCap;\n }\n\n if (props.strokeLineJoin !== undefined) {\n options.strokeLineJoin = props.strokeLineJoin;\n }\n\n if (props.fillColor !== undefined) {\n options.fillColor = props.fillColor;\n }\n\n if (props.fillOpacity !== undefined) {\n options.fillOpacity = props.fillOpacity;\n }\n\n if (props.clickable !== undefined) {\n options.clickable = props.clickable;\n }\n\n if (props.visible !== undefined) {\n options.visible = props.visible;\n }\n\n if (props.zIndex !== undefined) {\n options.zIndex = props.zIndex;\n }\n\n return options;\n}\n\nfunction buildRectangleEventBindings(props: RectangleProps) {\n return [\n {\n eventName: \"click\",\n invoke: props.onClick\n ? (event: unknown) => props.onClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"dblclick\",\n invoke: props.onDblClick\n ? (event: unknown) => props.onDblClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mousedown\",\n invoke: props.onMouseDown\n ? (event: unknown) => props.onMouseDown?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mousemove\",\n invoke: props.onMouseMove\n ? (event: unknown) => props.onMouseMove?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseout\",\n invoke: props.onMouseOut\n ? (event: unknown) => props.onMouseOut?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseover\",\n invoke: props.onMouseOver\n ? (event: unknown) => props.onMouseOver?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseup\",\n invoke: props.onMouseUp\n ? (event: unknown) => props.onMouseUp?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"rightclick\",\n invoke: props.onRightClick\n ? (event: unknown) => props.onRightClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchstart\",\n invoke: props.onTouchStart\n ? (event: unknown) => props.onTouchStart?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchmove\",\n invoke: props.onTouchMove\n ? (event: unknown) => props.onTouchMove?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchend\",\n invoke: props.onTouchEnd\n ? (event: unknown) => props.onTouchEnd?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"bounds_changed\",\n invoke: props.onBoundsChanged\n ? (event: unknown) => props.onBoundsChanged?.(event as naver.maps.Bounds)\n : undefined\n },\n {\n eventName: \"clickable_changed\",\n invoke: props.onClickableChanged\n ? (event: unknown) => props.onClickableChanged?.(event as boolean)\n : undefined\n },\n {\n eventName: \"fillColor_changed\",\n invoke: props.onFillColorChanged\n ? (event: unknown) => props.onFillColorChanged?.(event as string)\n : undefined\n },\n {\n eventName: \"fillOpacity_changed\",\n invoke: props.onFillOpacityChanged\n ? (event: unknown) => props.onFillOpacityChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"map_changed\",\n invoke: props.onMapChanged\n ? (event: unknown) => props.onMapChanged?.(event as naver.maps.Map | null)\n : undefined\n },\n {\n eventName: \"strokeColor_changed\",\n invoke: props.onStrokeColorChanged\n ? (event: unknown) => props.onStrokeColorChanged?.(event as string)\n : undefined\n },\n {\n eventName: \"strokeLineCap_changed\",\n invoke: props.onStrokeLineCapChanged\n ? (event: unknown) => props.onStrokeLineCapChanged?.(event as naver.maps.StrokeLineCapType)\n : undefined\n },\n {\n eventName: \"strokeLineJoin_changed\",\n invoke: props.onStrokeLineJoinChanged\n ? (event: unknown) =>\n props.onStrokeLineJoinChanged?.(event as naver.maps.StrokeLineJoinType)\n : undefined\n },\n {\n eventName: \"strokeOpacity_changed\",\n invoke: props.onStrokeOpacityChanged\n ? (event: unknown) => props.onStrokeOpacityChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"strokeStyle_changed\",\n invoke: props.onStrokeStyleChanged\n ? (event: unknown) => props.onStrokeStyleChanged?.(event as naver.maps.StrokeStyleType)\n : undefined\n },\n {\n eventName: \"strokeWeight_changed\",\n invoke: props.onStrokeWeightChanged\n ? (event: unknown) => props.onStrokeWeightChanged?.(event as number)\n : undefined\n },\n {\n eventName: \"visible_changed\",\n invoke: props.onVisibleChanged\n ? (event: unknown) => props.onVisibleChanged?.(event as boolean)\n : undefined\n },\n {\n eventName: \"zIndex_changed\",\n invoke: props.onZIndexChanged\n ? (event: unknown) => props.onZIndexChanged?.(event as number)\n : undefined\n }\n ];\n}\n\nexport const Rectangle = forwardRef<RectangleRef, RectangleProps>(\n function RectangleInner(props, ref) {\n const { map: contextMap, sdkStatus } = useNaverMap();\n const rectangleRef = useRef<naver.maps.Rectangle | null>(null);\n const rectangleEventListenersRef = useRef<naver.maps.MapEventListener[]>([]);\n const onRectangleDestroyRef = useRef<RectangleProps[\"onRectangleDestroy\"]>(\n props.onRectangleDestroy\n );\n const targetMap = props.map ?? contextMap;\n\n useEffect(() => {\n onRectangleDestroyRef.current = props.onRectangleDestroy;\n }, [props.onRectangleDestroy]);\n\n const invokeRectangleMethod = useCallback(\n <K extends keyof naver.maps.Rectangle>(\n methodName: K,\n ...args: Parameters<Extract<naver.maps.Rectangle[K], (...params: never[]) => unknown>>\n ):\n | ReturnType<Extract<naver.maps.Rectangle[K], (...params: never[]) => unknown>>\n | undefined => {\n const rectangle = rectangleRef.current;\n\n if (!rectangle) {\n return undefined;\n }\n\n const method = rectangle[methodName] as unknown;\n\n if (typeof method !== \"function\") {\n return undefined;\n }\n\n return (method as (...params: unknown[]) => unknown).apply(rectangle, args) as ReturnType<\n Extract<naver.maps.Rectangle[K], (...params: never[]) => unknown>\n >;\n },\n []\n );\n\n const teardownRectangle = useCallback(() => {\n const rectangle = rectangleRef.current;\n\n if (!rectangle) {\n return;\n }\n\n try {\n removeOverlayEventListeners(rectangleEventListenersRef.current);\n rectangleEventListenersRef.current = [];\n naver.maps.Event.clearInstanceListeners(rectangle);\n } catch (error) {\n console.error(\"[react-naver-maps-kit] failed to clear rectangle listeners\", error);\n }\n\n rectangle.setMap(null);\n rectangleRef.current = null;\n onRectangleDestroyRef.current?.();\n }, []);\n\n useImperativeHandle(\n ref,\n (): RectangleRef => ({\n getInstance: () => rectangleRef.current,\n getAreaSize: (...args) => invokeRectangleMethod(\"getAreaSize\", ...args),\n getBounds: (...args) => invokeRectangleMethod(\"getBounds\", ...args),\n getClickable: (...args) => invokeRectangleMethod(\"getClickable\", ...args),\n getDrawingRect: (...args) => invokeRectangleMethod(\"getDrawingRect\", ...args),\n getElement: (...args) => invokeRectangleMethod(\"getElement\", ...args),\n getMap: (...args) => invokeRectangleMethod(\"getMap\", ...args),\n getOptions: (...args) => invokeRectangleMethod(\"getOptions\", ...args),\n getPanes: (...args) => invokeRectangleMethod(\"getPanes\", ...args),\n getProjection: (...args) => invokeRectangleMethod(\"getProjection\", ...args),\n getStyles: (...args) => invokeRectangleMethod(\"getStyles\", ...args),\n getVisible: (...args) => invokeRectangleMethod(\"getVisible\", ...args),\n getZIndex: (...args) => invokeRectangleMethod(\"getZIndex\", ...args),\n setBounds: (...args) => invokeRectangleMethod(\"setBounds\", ...args),\n setClickable: (...args) => invokeRectangleMethod(\"setClickable\", ...args),\n setMap: (...args) => invokeRectangleMethod(\"setMap\", ...args),\n setOptions: (...args) => invokeRectangleMethod(\"setOptions\", ...args),\n setStyles: (...args) => invokeRectangleMethod(\"setStyles\", ...args),\n setVisible: (...args) => invokeRectangleMethod(\"setVisible\", ...args),\n setZIndex: (...args) => invokeRectangleMethod(\"setZIndex\", ...args)\n }),\n [invokeRectangleMethod]\n );\n\n useEffect(() => {\n if (sdkStatus !== \"ready\" || !targetMap || rectangleRef.current) {\n return;\n }\n\n try {\n const rectangle = new naver.maps.Rectangle(toRectangleOptions(props, targetMap));\n\n rectangleRef.current = rectangle;\n bindOverlayEventListeners(\n rectangle,\n rectangleEventListenersRef,\n buildRectangleEventBindings(props)\n );\n props.onRectangleReady?.(rectangle);\n } catch (error) {\n const normalizedError =\n error instanceof Error\n ? error\n : new Error(\"Failed to create naver.maps.Rectangle instance.\");\n\n props.onRectangleError?.(normalizedError);\n }\n }, [props, sdkStatus, targetMap]);\n\n useEffect(() => {\n const rectangle = rectangleRef.current;\n\n if (!rectangle || !targetMap) {\n return;\n }\n\n rectangle.setOptions(toRectangleOptions(props, targetMap));\n }, [props, targetMap]);\n\n useEffect(() => {\n const rectangle = rectangleRef.current;\n\n if (!rectangle) {\n return;\n }\n\n bindOverlayEventListeners(\n rectangle,\n rectangleEventListenersRef,\n buildRectangleEventBindings(props)\n );\n\n return () => {\n removeOverlayEventListeners(rectangleEventListenersRef.current);\n rectangleEventListenersRef.current = [];\n };\n }, [props]);\n\n useEffect(() => {\n return () => {\n teardownRectangle();\n };\n }, [teardownRectangle]);\n\n return null;\n }\n);\n\nRectangle.displayName = \"Rectangle\";\n","import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef } from \"react\";\n\nimport { useNaverMap } from \"../../react/hooks/useNaverMap\";\nimport { bindOverlayEventListeners, removeOverlayEventListeners } from \"../shared/overlayUtils\";\n\ntype StyleOptions = naver.maps.StyleOptions;\ntype StylingFunction = naver.maps.StylingFunction;\ntype GeoJSONData = naver.maps.GeoJSON;\n\ninterface GeoJsonOptionProps {\n data: GeoJSONData;\n autoStyle?: boolean;\n style?: StyleOptions | StylingFunction;\n}\n\ninterface GeoJsonLifecycleProps {\n onDataReady?: (data: naver.maps.Data) => void;\n onDataDestroy?: () => void;\n onDataError?: (error: Error) => void;\n onFeaturesAdded?: (features: naver.maps.Feature[]) => void;\n}\n\ninterface GeoJsonEventProps {\n onAddFeature?: (event: naver.maps.FeatureEvent) => void;\n onRemoveFeature?: (event: naver.maps.FeatureEvent) => void;\n onPropertyChanged?: (event: naver.maps.PropertyEvent) => void;\n onClick?: (event: naver.maps.PointerEvent) => void;\n onDblClick?: (event: naver.maps.PointerEvent) => void;\n onRightClick?: (event: naver.maps.PointerEvent) => void;\n onMouseDown?: (event: naver.maps.PointerEvent) => void;\n onMouseUp?: (event: naver.maps.PointerEvent) => void;\n onMouseOver?: (event: naver.maps.PointerEvent) => void;\n onMouseOut?: (event: naver.maps.PointerEvent) => void;\n}\n\nexport type GeoJsonProps = GeoJsonOptionProps & GeoJsonLifecycleProps & GeoJsonEventProps;\n\ntype DataMethod<K extends keyof naver.maps.Data> = naver.maps.Data[K] extends (\n ...args: infer A\n) => infer R\n ? (...args: A) => R | undefined\n : never;\n\nexport interface GeoJsonRef {\n getInstance: () => naver.maps.Data | null;\n getAllFeature: DataMethod<\"getAllFeature\">;\n getFeatureById: DataMethod<\"getFeatureById\">;\n getMap: DataMethod<\"getMap\">;\n getStyle: DataMethod<\"getStyle\">;\n overrideStyle: DataMethod<\"overrideStyle\">;\n removeFeature: DataMethod<\"removeFeature\">;\n revertStyle: DataMethod<\"revertStyle\">;\n setStyle: DataMethod<\"setStyle\">;\n toGeoJson: DataMethod<\"toGeoJson\">;\n}\n\nfunction buildGeoJsonEventBindings(props: GeoJsonProps) {\n return [\n {\n eventName: \"addfeature\",\n invoke: props.onAddFeature\n ? (event: unknown) => props.onAddFeature?.(event as naver.maps.FeatureEvent)\n : undefined\n },\n {\n eventName: \"removefeature\",\n invoke: props.onRemoveFeature\n ? (event: unknown) => props.onRemoveFeature?.(event as naver.maps.FeatureEvent)\n : undefined\n },\n {\n eventName: \"property_changed\",\n invoke: props.onPropertyChanged\n ? (event: unknown) => props.onPropertyChanged?.(event as naver.maps.PropertyEvent)\n : undefined\n },\n {\n eventName: \"click\",\n invoke: props.onClick\n ? (event: unknown) => props.onClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"dblclick\",\n invoke: props.onDblClick\n ? (event: unknown) => props.onDblClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"rightclick\",\n invoke: props.onRightClick\n ? (event: unknown) => props.onRightClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mousedown\",\n invoke: props.onMouseDown\n ? (event: unknown) => props.onMouseDown?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseup\",\n invoke: props.onMouseUp\n ? (event: unknown) => props.onMouseUp?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseover\",\n invoke: props.onMouseOver\n ? (event: unknown) => props.onMouseOver?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseout\",\n invoke: props.onMouseOut\n ? (event: unknown) => props.onMouseOut?.(event as naver.maps.PointerEvent)\n : undefined\n }\n ];\n}\n\nexport const GeoJson = forwardRef<GeoJsonRef, GeoJsonProps>(function GeoJsonInner(props, ref) {\n const { map: contextMap, sdkStatus } = useNaverMap();\n const dataRef = useRef<naver.maps.Data | null>(null);\n const dataEventListenersRef = useRef<naver.maps.MapEventListener[]>([]);\n const onDataDestroyRef = useRef<GeoJsonProps[\"onDataDestroy\"]>(props.onDataDestroy);\n const prevDataRef = useRef<GeoJSONData | null>(null);\n\n useEffect(() => {\n onDataDestroyRef.current = props.onDataDestroy;\n }, [props.onDataDestroy]);\n\n const invokeDataMethod = useCallback(\n <K extends keyof naver.maps.Data>(\n methodName: K,\n ...args: Parameters<Extract<naver.maps.Data[K], (...params: never[]) => unknown>>\n ): ReturnType<Extract<naver.maps.Data[K], (...params: never[]) => unknown>> | undefined => {\n const data = dataRef.current;\n\n if (!data) {\n return undefined;\n }\n\n const method = data[methodName] as unknown;\n\n if (typeof method !== \"function\") {\n return undefined;\n }\n\n return (method as (...params: unknown[]) => unknown).apply(data, args) as ReturnType<\n Extract<naver.maps.Data[K], (...params: never[]) => unknown>\n >;\n },\n []\n );\n\n const teardownData = useCallback(() => {\n const data = dataRef.current;\n\n if (!data) {\n return;\n }\n\n try {\n removeOverlayEventListeners(dataEventListenersRef.current);\n dataEventListenersRef.current = [];\n naver.maps.Event.clearInstanceListeners(data);\n } catch (error) {\n console.error(\"[react-naver-maps-kit] failed to clear GeoJson data layer listeners\", error);\n }\n\n data.setMap(null);\n dataRef.current = null;\n prevDataRef.current = null;\n onDataDestroyRef.current?.();\n }, []);\n\n useImperativeHandle(\n ref,\n (): GeoJsonRef => ({\n getInstance: () => dataRef.current,\n getAllFeature: (...args) => invokeDataMethod(\"getAllFeature\", ...args),\n getFeatureById: (...args) => invokeDataMethod(\"getFeatureById\", ...args),\n getMap: (...args) => invokeDataMethod(\"getMap\", ...args),\n getStyle: (...args) => invokeDataMethod(\"getStyle\", ...args),\n overrideStyle: (...args) => invokeDataMethod(\"overrideStyle\", ...args),\n removeFeature: (...args) => invokeDataMethod(\"removeFeature\", ...args),\n revertStyle: (...args) => invokeDataMethod(\"revertStyle\", ...args),\n setStyle: (...args) => invokeDataMethod(\"setStyle\", ...args),\n toGeoJson: (...args) => invokeDataMethod(\"toGeoJson\", ...args)\n }),\n [invokeDataMethod]\n );\n\n useEffect(() => {\n if (sdkStatus !== \"ready\" || !contextMap || dataRef.current) {\n return;\n }\n\n try {\n const data = new naver.maps.Data();\n data.setMap(contextMap);\n\n if (props.style) {\n data.setStyle(props.style);\n }\n\n const features = data.addGeoJson(props.data, props.autoStyle ?? true);\n prevDataRef.current = props.data;\n\n dataRef.current = data;\n bindOverlayEventListeners(data, dataEventListenersRef, buildGeoJsonEventBindings(props));\n props.onDataReady?.(data);\n props.onFeaturesAdded?.(features as unknown as naver.maps.Feature[]);\n } catch (error) {\n const normalizedError =\n error instanceof Error\n ? error\n : new Error(\"Failed to create naver.maps.Data instance for GeoJson.\");\n\n props.onDataError?.(normalizedError);\n }\n }, [sdkStatus, contextMap]);\n\n useEffect(() => {\n const data = dataRef.current;\n\n if (!data || props.data === prevDataRef.current) {\n return;\n }\n\n try {\n if (prevDataRef.current) {\n data.removeGeoJson(prevDataRef.current);\n }\n\n const features = data.addGeoJson(props.data, props.autoStyle ?? true);\n prevDataRef.current = props.data;\n props.onFeaturesAdded?.(features as unknown as naver.maps.Feature[]);\n } catch (error) {\n const normalizedError =\n error instanceof Error ? error : new Error(\"Failed to update GeoJson data.\");\n\n props.onDataError?.(normalizedError);\n }\n }, [props.data, props.autoStyle]);\n\n useEffect(() => {\n const data = dataRef.current;\n\n if (!data) {\n return;\n }\n\n if (props.style) {\n data.setStyle(props.style);\n }\n }, [props.style]);\n\n useEffect(() => {\n const data = dataRef.current;\n\n if (!data) {\n return;\n }\n\n bindOverlayEventListeners(data, dataEventListenersRef, buildGeoJsonEventBindings(props));\n\n return () => {\n removeOverlayEventListeners(dataEventListenersRef.current);\n dataEventListenersRef.current = [];\n };\n }, [props]);\n\n useEffect(() => {\n return () => {\n teardownData();\n };\n }, [teardownData]);\n\n return null;\n});\n\nGeoJson.displayName = \"GeoJson\";\n","import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef } from \"react\";\n\nimport { useNaverMap } from \"../../react/hooks/useNaverMap\";\nimport { bindOverlayEventListeners, removeOverlayEventListeners } from \"../shared/overlayUtils\";\n\ntype StyleOptions = naver.maps.StyleOptions;\ntype StylingFunction = naver.maps.StylingFunction;\n\ninterface GpxOptionProps {\n url: string;\n autoStyle?: boolean;\n style?: StyleOptions | StylingFunction;\n}\n\ninterface GpxLifecycleProps {\n onDataReady?: (data: naver.maps.Data) => void;\n onDataDestroy?: () => void;\n onDataError?: (error: Error) => void;\n onFeaturesAdded?: (features: naver.maps.Feature[]) => void;\n}\n\ninterface GpxEventProps {\n onAddFeature?: (event: naver.maps.FeatureEvent) => void;\n onRemoveFeature?: (event: naver.maps.FeatureEvent) => void;\n onPropertyChanged?: (event: naver.maps.PropertyEvent) => void;\n onClick?: (event: naver.maps.PointerEvent) => void;\n onDblClick?: (event: naver.maps.PointerEvent) => void;\n onRightClick?: (event: naver.maps.PointerEvent) => void;\n onMouseDown?: (event: naver.maps.PointerEvent) => void;\n onMouseUp?: (event: naver.maps.PointerEvent) => void;\n onMouseOver?: (event: naver.maps.PointerEvent) => void;\n onMouseOut?: (event: naver.maps.PointerEvent) => void;\n}\n\nexport type GpxProps = GpxOptionProps & GpxLifecycleProps & GpxEventProps;\n\ntype DataMethod<K extends keyof naver.maps.Data> = naver.maps.Data[K] extends (\n ...args: infer A\n) => infer R\n ? (...args: A) => R | undefined\n : never;\n\nexport interface GpxRef {\n getInstance: () => naver.maps.Data | null;\n getAllFeature: DataMethod<\"getAllFeature\">;\n getFeatureById: DataMethod<\"getFeatureById\">;\n getMap: DataMethod<\"getMap\">;\n getStyle: DataMethod<\"getStyle\">;\n overrideStyle: DataMethod<\"overrideStyle\">;\n removeFeature: DataMethod<\"removeFeature\">;\n revertStyle: DataMethod<\"revertStyle\">;\n setStyle: DataMethod<\"setStyle\">;\n toGeoJson: DataMethod<\"toGeoJson\">;\n}\n\nfunction buildGpxEventBindings(props: GpxProps) {\n return [\n {\n eventName: \"addfeature\",\n invoke: props.onAddFeature\n ? (event: unknown) => props.onAddFeature?.(event as naver.maps.FeatureEvent)\n : undefined\n },\n {\n eventName: \"removefeature\",\n invoke: props.onRemoveFeature\n ? (event: unknown) => props.onRemoveFeature?.(event as naver.maps.FeatureEvent)\n : undefined\n },\n {\n eventName: \"property_changed\",\n invoke: props.onPropertyChanged\n ? (event: unknown) => props.onPropertyChanged?.(event as naver.maps.PropertyEvent)\n : undefined\n },\n {\n eventName: \"click\",\n invoke: props.onClick\n ? (event: unknown) => props.onClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"dblclick\",\n invoke: props.onDblClick\n ? (event: unknown) => props.onDblClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"rightclick\",\n invoke: props.onRightClick\n ? (event: unknown) => props.onRightClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mousedown\",\n invoke: props.onMouseDown\n ? (event: unknown) => props.onMouseDown?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseup\",\n invoke: props.onMouseUp\n ? (event: unknown) => props.onMouseUp?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseover\",\n invoke: props.onMouseOver\n ? (event: unknown) => props.onMouseOver?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseout\",\n invoke: props.onMouseOut\n ? (event: unknown) => props.onMouseOut?.(event as naver.maps.PointerEvent)\n : undefined\n }\n ];\n}\n\nfunction parseXml(xmlString: string): Document {\n const parser = new DOMParser();\n const doc = parser.parseFromString(xmlString, \"application/xml\");\n const parseError = doc.querySelector(\"parsererror\");\n\n if (parseError) {\n throw new Error(`XML parse error: ${parseError.textContent}`);\n }\n\n return doc;\n}\n\nexport const Gpx = forwardRef<GpxRef, GpxProps>(function GpxInner(props, ref) {\n const { map: contextMap, sdkStatus } = useNaverMap();\n const dataRef = useRef<naver.maps.Data | null>(null);\n const dataEventListenersRef = useRef<naver.maps.MapEventListener[]>([]);\n const onDataDestroyRef = useRef<GpxProps[\"onDataDestroy\"]>(props.onDataDestroy);\n const prevUrlRef = useRef<string | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n\n useEffect(() => {\n onDataDestroyRef.current = props.onDataDestroy;\n }, [props.onDataDestroy]);\n\n const invokeDataMethod = useCallback(\n <K extends keyof naver.maps.Data>(\n methodName: K,\n ...args: Parameters<Extract<naver.maps.Data[K], (...params: never[]) => unknown>>\n ): ReturnType<Extract<naver.maps.Data[K], (...params: never[]) => unknown>> | undefined => {\n const data = dataRef.current;\n\n if (!data) {\n return undefined;\n }\n\n const method = data[methodName] as unknown;\n\n if (typeof method !== \"function\") {\n return undefined;\n }\n\n return (method as (...params: unknown[]) => unknown).apply(data, args) as ReturnType<\n Extract<naver.maps.Data[K], (...params: never[]) => unknown>\n >;\n },\n []\n );\n\n const teardownData = useCallback(() => {\n abortRef.current?.abort();\n abortRef.current = null;\n\n const data = dataRef.current;\n\n if (!data) {\n return;\n }\n\n try {\n removeOverlayEventListeners(dataEventListenersRef.current);\n dataEventListenersRef.current = [];\n naver.maps.Event.clearInstanceListeners(data);\n } catch (error) {\n console.error(\"[react-naver-maps-kit] failed to clear GPX data layer listeners\", error);\n }\n\n data.setMap(null);\n dataRef.current = null;\n prevUrlRef.current = null;\n onDataDestroyRef.current?.();\n }, []);\n\n useImperativeHandle(\n ref,\n (): GpxRef => ({\n getInstance: () => dataRef.current,\n getAllFeature: (...args) => invokeDataMethod(\"getAllFeature\", ...args),\n getFeatureById: (...args) => invokeDataMethod(\"getFeatureById\", ...args),\n getMap: (...args) => invokeDataMethod(\"getMap\", ...args),\n getStyle: (...args) => invokeDataMethod(\"getStyle\", ...args),\n overrideStyle: (...args) => invokeDataMethod(\"overrideStyle\", ...args),\n removeFeature: (...args) => invokeDataMethod(\"removeFeature\", ...args),\n revertStyle: (...args) => invokeDataMethod(\"revertStyle\", ...args),\n setStyle: (...args) => invokeDataMethod(\"setStyle\", ...args),\n toGeoJson: (...args) => invokeDataMethod(\"toGeoJson\", ...args)\n }),\n [invokeDataMethod]\n );\n\n const loadAndAddGpx = useCallback(\n async (data: naver.maps.Data, url: string, isInitial: boolean) => {\n const controller = new AbortController();\n abortRef.current = controller;\n\n try {\n const response = await fetch(url, { signal: controller.signal });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch GPX: ${response.status} ${response.statusText}`);\n }\n\n const xmlString = await response.text();\n const xmlDoc = parseXml(xmlString);\n\n if (controller.signal.aborted) {\n return;\n }\n\n if (!isInitial) {\n const existingFeatures = data.getAllFeature();\n existingFeatures.forEach((feature) => data.removeFeature(feature));\n }\n\n const features = data.addGpx(xmlDoc, props.autoStyle ?? true);\n prevUrlRef.current = url;\n props.onFeaturesAdded?.(features as unknown as naver.maps.Feature[]);\n } catch (error) {\n if (controller.signal.aborted) {\n return;\n }\n\n const normalizedError =\n error instanceof Error ? error : new Error(\"Failed to load GPX data.\");\n\n props.onDataError?.(normalizedError);\n }\n },\n [props.autoStyle, props.onFeaturesAdded, props.onDataError]\n );\n\n useEffect(() => {\n if (sdkStatus !== \"ready\" || !contextMap || dataRef.current) {\n return;\n }\n\n try {\n const data = new naver.maps.Data();\n data.setMap(contextMap);\n\n if (props.style) {\n data.setStyle(props.style);\n }\n\n dataRef.current = data;\n bindOverlayEventListeners(data, dataEventListenersRef, buildGpxEventBindings(props));\n props.onDataReady?.(data);\n loadAndAddGpx(data, props.url, true);\n } catch (error) {\n const normalizedError =\n error instanceof Error ? error : new Error(\"Failed to create naver.maps.Data instance.\");\n\n props.onDataError?.(normalizedError);\n }\n }, [sdkStatus, contextMap]);\n\n useEffect(() => {\n const data = dataRef.current;\n\n if (!data || props.url === prevUrlRef.current) {\n return;\n }\n\n abortRef.current?.abort();\n loadAndAddGpx(data, props.url, false);\n }, [props.url, loadAndAddGpx]);\n\n useEffect(() => {\n const data = dataRef.current;\n\n if (!data) {\n return;\n }\n\n if (props.style) {\n data.setStyle(props.style);\n }\n }, [props.style]);\n\n useEffect(() => {\n const data = dataRef.current;\n\n if (!data) {\n return;\n }\n\n bindOverlayEventListeners(data, dataEventListenersRef, buildGpxEventBindings(props));\n\n return () => {\n removeOverlayEventListeners(dataEventListenersRef.current);\n dataEventListenersRef.current = [];\n };\n }, [props]);\n\n useEffect(() => {\n return () => {\n teardownData();\n };\n }, [teardownData]);\n\n return null;\n});\n\nGpx.displayName = \"Gpx\";\n","import { createRequire } from 'module';\nvar require = createRequire('/');\n// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Some of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\n// Mediocre shim\nvar Worker;\nvar workerAdd = \";var __w=require('worker_threads');__w.parentPort.on('message',function(m){onmessage({data:m})}),postMessage=function(m,t){__w.parentPort.postMessage(m,t)},close=process.exit;self=global\";\ntry {\n Worker = require('worker_threads').Worker;\n}\ncatch (e) {\n}\nvar wk = Worker ? function (c, _, msg, transfer, cb) {\n var done = false;\n var w = new Worker(c + workerAdd, { eval: true })\n .on('error', function (e) { return cb(e, null); })\n .on('message', function (m) { return cb(null, m); })\n .on('exit', function (c) {\n if (c && !done)\n cb(new Error('exited with code ' + c), null);\n });\n w.postMessage(msg, transfer);\n w.terminate = function () {\n done = true;\n return Worker.prototype.terminate.call(w);\n };\n return w;\n} : function (_, __, ___, ____, cb) {\n setImmediate(function () { return cb(new Error('async operations unsupported - update to Node 12+ (or Node 10-11 with the --experimental-worker CLI flag)'), null); });\n var NOP = function () { };\n return {\n terminate: NOP,\n postMessage: NOP\n };\n};\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, i32 = Int32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n var b = new u16(31);\n for (var i = 0; i < 31; ++i) {\n b[i] = start += 1 << eb[i - 1];\n }\n // numbers here are at max 18 bits\n var r = new i32(b[30]);\n for (var i = 1; i < 30; ++i) {\n for (var j = b[i]; j < b[i + 1]; ++j) {\n r[j] = ((j - b[i]) << 5) | i;\n }\n }\n return { b: b, r: r };\n};\nvar _a = freb(fleb, 2), fl = _a.b, revfl = _a.r;\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b.b, revfd = _b.r;\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n // reverse table algorithm from SO\n var x = ((i & 0xAAAA) >> 1) | ((i & 0x5555) << 1);\n x = ((x & 0xCCCC) >> 2) | ((x & 0x3333) << 2);\n x = ((x & 0xF0F0) >> 4) | ((x & 0x0F0F) << 4);\n rev[i] = (((x & 0xFF00) >> 8) | ((x & 0x00FF) << 8)) >> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n var s = cd.length;\n // index\n var i = 0;\n // u16 \"map\": index -> # of codes with bit length = index\n var l = new u16(mb);\n // length of cd must be 288 (total # of codes)\n for (; i < s; ++i) {\n if (cd[i])\n ++l[cd[i] - 1];\n }\n // u16 \"map\": index -> minimum code for bit length = index\n var le = new u16(mb);\n for (i = 1; i < mb; ++i) {\n le[i] = (le[i - 1] + l[i - 1]) << 1;\n }\n var co;\n if (r) {\n // u16 \"map\": index -> number of actual bits, symbol for code\n co = new u16(1 << mb);\n // bits to remove for reverser\n var rvb = 15 - mb;\n for (i = 0; i < s; ++i) {\n // ignore 0 lengths\n if (cd[i]) {\n // num encoding both symbol and bits read\n var sv = (i << 4) | cd[i];\n // free bits\n var r_1 = mb - cd[i];\n // start value\n var v = le[cd[i] - 1]++ << r_1;\n // m is end value\n for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n // every 16 bit value starting with the code yields the same result\n co[rev[v] >> rvb] = sv;\n }\n }\n }\n }\n else {\n co = new u16(s);\n for (i = 0; i < s; ++i) {\n if (cd[i]) {\n co[i] = rev[le[cd[i] - 1]++] >> (15 - cd[i]);\n }\n }\n }\n return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n var m = a[0];\n for (var i = 1; i < a.length; ++i) {\n if (a[i] > m)\n m = a[i];\n }\n return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p + 7) / 8) | 0; };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n // can't use .constructor in case user-supplied\n return new u8(v.subarray(s, e));\n};\n/**\n * Codes for errors generated within this library\n */\nexport var FlateErrorCode = {\n UnexpectedEOF: 0,\n InvalidBlockType: 1,\n InvalidLengthLiteral: 2,\n InvalidDistance: 3,\n StreamFinished: 4,\n NoStreamHandler: 5,\n InvalidHeader: 6,\n NoCallback: 7,\n InvalidUTF8: 8,\n ExtraFieldTooLong: 9,\n InvalidDate: 10,\n FilenameTooLong: 11,\n StreamFinishing: 12,\n InvalidZipData: 13,\n UnknownCompressionMethod: 14\n};\n// error codes\nvar ec = [\n 'unexpected EOF',\n 'invalid block type',\n 'invalid length/literal',\n 'invalid distance',\n 'stream finished',\n 'no stream handler',\n ,\n 'no callback',\n 'invalid UTF-8 data',\n 'extra field too long',\n 'date not in range 1980-2099',\n 'filename too long',\n 'stream finishing',\n 'invalid zip data'\n // determined by unknown compression method\n];\n;\nvar err = function (ind, msg, nt) {\n var e = new Error(msg || ec[ind]);\n e.code = ind;\n if (Error.captureStackTrace)\n Error.captureStackTrace(e, err);\n if (!nt)\n throw e;\n return e;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, st, buf, dict) {\n // source length dict length\n var sl = dat.length, dl = dict ? dict.length : 0;\n if (!sl || st.f && !st.l)\n return buf || new u8(0);\n var noBuf = !buf;\n // have to estimate size\n var resize = noBuf || st.i != 2;\n // no state\n var noSt = st.i;\n // Assumes roughly 33% compression ratio average\n if (noBuf)\n buf = new u8(sl * 3);\n // ensure buffer can fit at least l elements\n var cbuf = function (l) {\n var bl = buf.length;\n // need to increase size to fit\n if (l > bl) {\n // Double or set to necessary, whichever is greater\n var nbuf = new u8(Math.max(bl * 2, l));\n nbuf.set(buf);\n buf = nbuf;\n }\n };\n // last chunk bitpos bytes\n var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n // total bits\n var tbts = sl * 8;\n do {\n if (!lm) {\n // BFINAL - this is only 1 when last chunk is next\n final = bits(dat, pos, 1);\n // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n var type = bits(dat, pos + 1, 3);\n pos += 3;\n if (!type) {\n // go to end of byte boundary\n var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n if (t > sl) {\n if (noSt)\n err(0);\n break;\n }\n // ensure size\n if (resize)\n cbuf(bt + l);\n // Copy over uncompressed data\n buf.set(dat.subarray(s, t), bt);\n // Get new bitpos, update byte count\n st.b = bt += l, st.p = pos = t * 8, st.f = final;\n continue;\n }\n else if (type == 1)\n lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n else if (type == 2) {\n // literal lengths\n var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n var tl = hLit + bits(dat, pos + 5, 31) + 1;\n pos += 14;\n // length+distance tree\n var ldt = new u8(tl);\n // code length tree\n var clt = new u8(19);\n for (var i = 0; i < hcLen; ++i) {\n // use index map to get real code\n clt[clim[i]] = bits(dat, pos + i * 3, 7);\n }\n pos += hcLen * 3;\n // code lengths bits\n var clb = max(clt), clbmsk = (1 << clb) - 1;\n // code lengths map\n var clm = hMap(clt, clb, 1);\n for (var i = 0; i < tl;) {\n var r = clm[bits(dat, pos, clbmsk)];\n // bits read\n pos += r & 15;\n // symbol\n var s = r >> 4;\n // code length to copy\n if (s < 16) {\n ldt[i++] = s;\n }\n else {\n // copy count\n var c = 0, n = 0;\n if (s == 16)\n n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n else if (s == 17)\n n = 3 + bits(dat, pos, 7), pos += 3;\n else if (s == 18)\n n = 11 + bits(dat, pos, 127), pos += 7;\n while (n--)\n ldt[i++] = c;\n }\n }\n // length tree distance tree\n var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n // max length bits\n lbt = max(lt);\n // max dist bits\n dbt = max(dt);\n lm = hMap(lt, lbt, 1);\n dm = hMap(dt, dbt, 1);\n }\n else\n err(1);\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n }\n // Make sure the buffer can hold this + the largest possible addition\n // Maximum chunk size (practically, theoretically infinite) is 2^17\n if (resize)\n cbuf(bt + 131072);\n var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n var lpos = pos;\n for (;; lpos = pos) {\n // bits read, code\n var c = lm[bits16(dat, pos) & lms], sym = c >> 4;\n pos += c & 15;\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (!c)\n err(2);\n if (sym < 256)\n buf[bt++] = sym;\n else if (sym == 256) {\n lpos = pos, lm = null;\n break;\n }\n else {\n var add = sym - 254;\n // no extra bits needed if less\n if (sym > 264) {\n // index\n var i = sym - 257, b = fleb[i];\n add = bits(dat, pos, (1 << b) - 1) + fl[i];\n pos += b;\n }\n // dist\n var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;\n if (!d)\n err(3);\n pos += d & 15;\n var dt = fd[dsym];\n if (dsym > 3) {\n var b = fdeb[dsym];\n dt += bits16(dat, pos) & (1 << b) - 1, pos += b;\n }\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (resize)\n cbuf(bt + 131072);\n var end = bt + add;\n if (bt < dt) {\n var shift = dl - dt, dend = Math.min(dt, end);\n if (shift + bt < 0)\n err(3);\n for (; bt < dend; ++bt)\n buf[bt] = dict[shift + bt];\n }\n for (; bt < end; ++bt)\n buf[bt] = buf[bt - dt];\n }\n }\n st.l = lm, st.p = lpos, st.b = bt, st.f = final;\n if (lm)\n final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n } while (!final);\n // don't reallocate for streams or user buffers\n return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n d[o + 2] |= v >> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n // Need extra info to make a tree\n var t = [];\n for (var i = 0; i < d.length; ++i) {\n if (d[i])\n t.push({ s: i, f: d[i] });\n }\n var s = t.length;\n var t2 = t.slice();\n if (!s)\n return { t: et, l: 0 };\n if (s == 1) {\n var v = new u8(t[0].s + 1);\n v[t[0].s] = 1;\n return { t: v, l: 1 };\n }\n t.sort(function (a, b) { return a.f - b.f; });\n // after i2 reaches last ind, will be stopped\n // freq must be greater than largest possible number of symbols\n t.push({ s: -1, f: 25001 });\n var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n // efficient algorithm from UZIP.js\n // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n // symbols that combined have high freq, will start processing i2 (high-freq,\n // non-composite) symbols instead\n // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n while (i1 != s - 1) {\n l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n }\n var maxSym = t2[0].s;\n for (var i = 1; i < s; ++i) {\n if (t2[i].s > maxSym)\n maxSym = t2[i].s;\n }\n // code lengths\n var tr = new u16(maxSym + 1);\n // max bits in tree\n var mbt = ln(t[i1 - 1], tr, 0);\n if (mbt > mb) {\n // more algorithms from UZIP.js\n // TODO: find out how this code works (debt)\n // ind debt\n var i = 0, dt = 0;\n // left cost\n var lft = mbt - mb, cst = 1 << lft;\n t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n for (; i < s; ++i) {\n var i2_1 = t2[i].s;\n if (tr[i2_1] > mb) {\n dt += cst - (1 << (mbt - tr[i2_1]));\n tr[i2_1] = mb;\n }\n else\n break;\n }\n dt >>= lft;\n while (dt > 0) {\n var i2_2 = t2[i].s;\n if (tr[i2_2] < mb)\n dt -= 1 << (mb - tr[i2_2]++ - 1);\n else\n ++i;\n }\n for (; i >= 0 && dt; --i) {\n var i2_3 = t2[i].s;\n if (tr[i2_3] == mb) {\n --tr[i2_3];\n ++dt;\n }\n }\n mbt = mb;\n }\n return { t: new u8(tr), l: mbt };\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n return n.s == -1\n ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n var s = c.length;\n // Note that the semicolon was intentional\n while (s && !c[--s])\n ;\n var cl = new u16(++s);\n // ind num streak\n var cli = 0, cln = c[0], cls = 1;\n var w = function (v) { cl[cli++] = v; };\n for (var i = 1; i <= s; ++i) {\n if (c[i] == cln && i != s)\n ++cls;\n else {\n if (!cln && cls > 2) {\n for (; cls > 138; cls -= 138)\n w(32754);\n if (cls > 2) {\n w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n cls = 0;\n }\n }\n else if (cls > 3) {\n w(cln), --cls;\n for (; cls > 6; cls -= 6)\n w(8304);\n if (cls > 2)\n w(((cls - 3) << 5) | 8208), cls = 0;\n }\n while (cls--)\n w(cln);\n cls = 1;\n cln = c[i];\n }\n }\n return { c: cl.subarray(0, cli), n: s };\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n var l = 0;\n for (var i = 0; i < cl.length; ++i)\n l += cf[i] * cl[i];\n return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n // no need to write 00 as type: TypedArray defaults to 0\n var s = dat.length;\n var o = shft(pos + 2);\n out[o] = s & 255;\n out[o + 1] = s >> 8;\n out[o + 2] = out[o] ^ 255;\n out[o + 3] = out[o + 1] ^ 255;\n for (var i = 0; i < s; ++i)\n out[o + i + 4] = dat[i];\n return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n wbits(out, p++, final);\n ++lf[256];\n var _a = hTree(lf, 15), dlt = _a.t, mlb = _a.l;\n var _b = hTree(df, 15), ddt = _b.t, mdb = _b.l;\n var _c = lc(dlt), lclt = _c.c, nlc = _c.n;\n var _d = lc(ddt), lcdt = _d.c, ndc = _d.n;\n var lcfreq = new u16(19);\n for (var i = 0; i < lclt.length; ++i)\n ++lcfreq[lclt[i] & 31];\n for (var i = 0; i < lcdt.length; ++i)\n ++lcfreq[lcdt[i] & 31];\n var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l;\n var nlcc = 19;\n for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n ;\n var flen = (bl + 5) << 3;\n var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];\n if (bs >= 0 && flen <= ftlen && flen <= dtlen)\n return wfblk(out, p, dat.subarray(bs, bs + bl));\n var lm, ll, dm, dl;\n wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n if (dtlen < ftlen) {\n lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n var llm = hMap(lct, mlcb, 0);\n wbits(out, p, nlc - 257);\n wbits(out, p + 5, ndc - 1);\n wbits(out, p + 10, nlcc - 4);\n p += 14;\n for (var i = 0; i < nlcc; ++i)\n wbits(out, p + 3 * i, lct[clim[i]]);\n p += 3 * nlcc;\n var lcts = [lclt, lcdt];\n for (var it = 0; it < 2; ++it) {\n var clct = lcts[it];\n for (var i = 0; i < clct.length; ++i) {\n var len = clct[i] & 31;\n wbits(out, p, llm[len]), p += lct[len];\n if (len > 15)\n wbits(out, p, (clct[i] >> 5) & 127), p += clct[i] >> 12;\n }\n }\n }\n else {\n lm = flm, ll = flt, dm = fdm, dl = fdt;\n }\n for (var i = 0; i < li; ++i) {\n var sym = syms[i];\n if (sym > 255) {\n var len = (sym >> 18) & 31;\n wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n if (len > 7)\n wbits(out, p, (sym >> 23) & 31), p += fleb[len];\n var dst = sym & 31;\n wbits16(out, p, dm[dst]), p += dl[dst];\n if (dst > 3)\n wbits16(out, p, (sym >> 5) & 8191), p += fdeb[dst];\n }\n else {\n wbits16(out, p, lm[sym]), p += ll[sym];\n }\n }\n wbits16(out, p, lm[256]);\n return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, st) {\n var s = st.z || dat.length;\n var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post);\n // writing to this writes to the output buffer\n var w = o.subarray(pre, o.length - post);\n var lst = st.l;\n var pos = (st.r || 0) & 7;\n if (lvl) {\n if (pos)\n w[0] = st.r >> 3;\n var opt = deo[lvl - 1];\n var n = opt >> 13, c = opt & 8191;\n var msk_1 = (1 << plvl) - 1;\n // prev 2-byte val map curr 2-byte val map\n var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1);\n var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n // 24576 is an arbitrary number of maximum symbols per block\n // 424 buffer for last block\n var syms = new i32(25000);\n // length/literal freq distance freq\n var lf = new u16(288), df = new u16(32);\n // l/lcnt exbits index l/lind waitdx blkpos\n var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0;\n for (; i + 2 < s; ++i) {\n // hash value\n var hv = hsh(i);\n // index mod 32768 previous index mod\n var imod = i & 32767, pimod = head[hv];\n prev[imod] = pimod;\n head[hv] = imod;\n // We always should modify head and prev, but only add symbols if\n // this data is not yet processed (\"wait\" for wait index)\n if (wi <= i) {\n // bytes remaining\n var rem = s - i;\n if ((lc_1 > 7000 || li > 24576) && (rem > 423 || !lst)) {\n pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n li = lc_1 = eb = 0, bs = i;\n for (var j = 0; j < 286; ++j)\n lf[j] = 0;\n for (var j = 0; j < 30; ++j)\n df[j] = 0;\n }\n // len dist chain\n var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;\n if (rem > 2 && hv == hsh(i - dif)) {\n var maxn = Math.min(n, rem) - 1;\n var maxd = Math.min(32767, i);\n // max possible length\n // not capped at dif because decompressors implement \"rolling\" index population\n var ml = Math.min(258, rem);\n while (dif <= maxd && --ch_1 && imod != pimod) {\n if (dat[i + l] == dat[i + l - dif]) {\n var nl = 0;\n for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n ;\n if (nl > l) {\n l = nl, d = dif;\n // break out early when we reach \"nice\" (we are satisfied enough)\n if (nl > maxn)\n break;\n // now, find the rarest 2-byte sequence within this\n // length of literals and search for that instead.\n // Much faster than just using the start\n var mmd = Math.min(dif, nl - 2);\n var md = 0;\n for (var j = 0; j < mmd; ++j) {\n var ti = i - dif + j & 32767;\n var pti = prev[ti];\n var cd = ti - pti & 32767;\n if (cd > md)\n md = cd, pimod = ti;\n }\n }\n }\n // check the previous match\n imod = pimod, pimod = prev[imod];\n dif += imod - pimod & 32767;\n }\n }\n // d will be nonzero only when a match was found\n if (d) {\n // store both dist and len data in one int32\n // Make sure this is recognized as a len/dist with 28th bit (2^28)\n syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n var lin = revfl[l] & 31, din = revfd[d] & 31;\n eb += fleb[lin] + fdeb[din];\n ++lf[257 + lin];\n ++df[din];\n wi = i + l;\n ++lc_1;\n }\n else {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n }\n }\n for (i = Math.max(i, wi); i < s; ++i) {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n if (!lst) {\n st.r = (pos & 7) | w[(pos / 8) | 0] << 3;\n // shft(pos) now 1 less if pos & 7 != 0\n pos -= 7;\n st.h = head, st.p = prev, st.i = i, st.w = wi;\n }\n }\n else {\n for (var i = st.w || 0; i < s + lst; i += 65535) {\n // end\n var e = i + 65535;\n if (e >= s) {\n // write final block\n w[(pos / 8) | 0] = lst;\n e = s;\n }\n pos = wfblk(w, pos + 1, dat.subarray(i, e));\n }\n st.i = s;\n }\n return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n var t = new Int32Array(256);\n for (var i = 0; i < 256; ++i) {\n var c = i, k = 9;\n while (--k)\n c = ((c & 1) && -306674912) ^ (c >>> 1);\n t[i] = c;\n }\n return t;\n})();\n// CRC32\nvar crc = function () {\n var c = -1;\n return {\n p: function (d) {\n // closures have awful performance\n var cr = c;\n for (var i = 0; i < d.length; ++i)\n cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n c = cr;\n },\n d: function () { return ~c; }\n };\n};\n// Adler32\nvar adler = function () {\n var a = 1, b = 0;\n return {\n p: function (d) {\n // closures have awful performance\n var n = a, m = b;\n var l = d.length | 0;\n for (var i = 0; i != l;) {\n var e = Math.min(i + 2655, l);\n for (; i < e; ++i)\n m += n += d[i];\n n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16);\n }\n a = n, b = m;\n },\n d: function () {\n a %= 65521, b %= 65521;\n return (a & 255) << 24 | (a & 0xFF00) << 8 | (b & 255) << 8 | (b >> 8);\n }\n };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n if (!st) {\n st = { l: 1 };\n if (opt.dictionary) {\n var dict = opt.dictionary.subarray(-32768);\n var newDat = new u8(dict.length + dat.length);\n newDat.set(dict);\n newDat.set(dat, dict.length);\n dat = newDat;\n st.w = dict.length;\n }\n }\n return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? (st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20) : (12 + opt.mem), pre, post, st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n var o = {};\n for (var k in a)\n o[k] = a[k];\n for (var k in b)\n o[k] = b[k];\n return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n var dt = fn();\n var st = fn.toString();\n var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/\\s+/g, '').split(',');\n for (var i = 0; i < dt.length; ++i) {\n var v = dt[i], k = ks[i];\n if (typeof v == 'function') {\n fnStr += ';' + k + '=';\n var st_1 = v.toString();\n if (v.prototype) {\n // for global objects\n if (st_1.indexOf('[native code]') != -1) {\n var spInd = st_1.indexOf(' ', 8) + 1;\n fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n }\n else {\n fnStr += st_1;\n for (var t in v.prototype)\n fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n }\n }\n else\n fnStr += st_1;\n }\n else\n td[k] = v;\n }\n return fnStr;\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n var tl = [];\n for (var k in v) {\n if (v[k].buffer) {\n tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n }\n }\n return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n if (!ch[id]) {\n var fnStr = '', td_1 = {}, m = fns.length - 1;\n for (var i = 0; i < m; ++i)\n fnStr = wcln(fns[i], fnStr, td_1);\n ch[id] = { c: wcln(fns[m], fnStr, td_1), e: td_1 };\n }\n var td = mrg({}, ch[id].e);\n return wk(ch[id].c + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, i32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, ec, hMap, max, bits, bits16, shft, slc, err, inflt, inflateSync, pbf, gopt]; };\nvar bDflt = function () { return [u8, u16, i32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zls]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get opts\nvar gopt = function (o) { return o && {\n out: o.size && new u8(o.size),\n dictionary: o.dictionary\n}; };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n var w = wrkr(fns, init, id, function (err, dat) {\n w.terminate();\n cb(err, dat);\n });\n w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []);\n return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n return function (ev) {\n if (ev.data.length) {\n strm.push(ev.data[0], ev.data[1]);\n postMessage([ev.data[0].length]);\n }\n else\n strm.flush();\n };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id, flush, ext) {\n var t;\n var w = wrkr(fns, init, id, function (err, dat) {\n if (err)\n w.terminate(), strm.ondata.call(strm, err);\n else if (!Array.isArray(dat))\n ext(dat);\n else if (dat.length == 1) {\n strm.queuedSize -= dat[0];\n if (strm.ondrain)\n strm.ondrain(dat[0]);\n }\n else {\n if (dat[1])\n w.terminate();\n strm.ondata.call(strm, err, dat[0], dat[1]);\n }\n });\n w.postMessage(opts);\n strm.queuedSize = 0;\n strm.push = function (d, f) {\n if (!strm.ondata)\n err(5);\n if (t)\n strm.ondata(err(4, 0, 1), null, !!f);\n strm.queuedSize += d.length;\n w.postMessage([d, t = f], [d.buffer]);\n };\n strm.terminate = function () { w.terminate(); };\n if (flush) {\n strm.flush = function () { w.postMessage([]); };\n }\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\nvar b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };\n// write bytes\nvar wbytes = function (d, b, v) {\n for (; v; ++b)\n d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n var fn = o.filename;\n c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n if (o.mtime != 0)\n wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n if (fn) {\n c[3] = 8;\n for (var i = 0; i <= fn.length; ++i)\n c[i + 10] = fn.charCodeAt(i);\n }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n err(6, 'invalid gzip data');\n var flg = d[3];\n var st = 10;\n if (flg & 4)\n st += (d[10] | d[11] << 8) + 2;\n for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n ;\n return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n var l = d.length;\n return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16 | d[l - 1] << 24) >>> 0;\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + (o.filename ? o.filename.length + 1 : 0); };\n// zlib header\nvar zlh = function (c, o) {\n var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n c[0] = 120, c[1] = (fl << 6) | (o.dictionary && 32);\n c[1] |= 31 - ((c[0] << 8) | c[1]) % 31;\n if (o.dictionary) {\n var h = adler();\n h.p(o.dictionary);\n wbytes(c, 2, h.d());\n }\n};\n// zlib start\nvar zls = function (d, dict) {\n if ((d[0] & 15) != 8 || (d[0] >> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n err(6, 'invalid zlib data');\n if ((d[1] >> 5 & 1) == +!dict)\n err(6, 'invalid zlib data: ' + (d[1] & 32 ? 'need' : 'unexpected') + ' dictionary');\n return (d[1] >> 3 & 4) + 2;\n};\nfunction StrmOpt(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n return opts;\n}\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n function Deflate(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n this.o = opts || {};\n this.s = { l: 0, i: 32768, w: 32768, z: 32768 };\n // Buffer length must always be 0 mod 32768 for index calculations to be correct when modifying head and prev\n // 98304 = 32768 (lookback) + 65536 (common chunk size)\n this.b = new u8(98304);\n if (this.o.dictionary) {\n var dict = this.o.dictionary.subarray(-32768);\n this.b.set(dict, 32768 - dict.length);\n this.s.i = 32768 - dict.length;\n }\n }\n Deflate.prototype.p = function (c, f) {\n this.ondata(dopt(c, this.o, 0, 0, this.s), f);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Deflate.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n var endLen = chunk.length + this.s.z;\n if (endLen > this.b.length) {\n if (endLen > 2 * this.b.length - 32768) {\n var newBuf = new u8(endLen & -32768);\n newBuf.set(this.b.subarray(0, this.s.z));\n this.b = newBuf;\n }\n var split = this.b.length - this.s.z;\n this.b.set(chunk.subarray(0, split), this.s.z);\n this.s.z = this.b.length;\n this.p(this.b, false);\n this.b.set(this.b.subarray(-32768));\n this.b.set(chunk.subarray(split), 32768);\n this.s.z = chunk.length - split + 32768;\n this.s.i = 32766, this.s.w = 32768;\n }\n else {\n this.b.set(chunk, this.s.z);\n this.s.z += chunk.length;\n }\n this.s.l = final & 1;\n if (this.s.z > this.s.w + 8191 || final) {\n this.p(this.b, final || false);\n this.s.w = this.s.i, this.s.i -= 2;\n }\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * deflated output for small inputs.\n */\n Deflate.prototype.flush = function () {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n this.p(this.b, false);\n this.s.w = this.s.i, this.s.i -= 2;\n };\n return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n function AsyncDeflate(opts, cb) {\n astrmify([\n bDflt,\n function () { return [astrm, Deflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Deflate(ev.data);\n onmessage = astrm(strm);\n }, 6, 1);\n }\n return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n return dopt(data, opts || {}, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n function Inflate(opts, cb) {\n // no StrmOpt here to avoid adding to workerizer\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n var dict = opts && opts.dictionary && opts.dictionary.subarray(-32768);\n this.s = { i: 0, b: dict ? dict.length : 0 };\n this.o = new u8(32768);\n this.p = new u8(0);\n if (dict)\n this.o.set(dict);\n }\n Inflate.prototype.e = function (c) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n if (!this.p.length)\n this.p = c;\n else if (c.length) {\n var n = new u8(this.p.length + c.length);\n n.set(this.p), n.set(c, this.p.length), this.p = n;\n }\n };\n Inflate.prototype.c = function (final) {\n this.s.i = +(this.d = final || false);\n var bts = this.s.b;\n var dt = inflt(this.p, this.s, this.o);\n this.ondata(slc(dt, bts, this.s.b), this.d);\n this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n this.p = slc(this.p, (this.s.p / 8) | 0), this.s.p &= 7;\n };\n /**\n * Pushes a chunk to be inflated\n * @param chunk The chunk to push\n * @param final Whether this is the final chunk\n */\n Inflate.prototype.push = function (chunk, final) {\n this.e(chunk), this.c(final);\n };\n return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n function AsyncInflate(opts, cb) {\n astrmify([\n bInflt,\n function () { return [astrm, Inflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Inflate(ev.data);\n onmessage = astrm(strm);\n }, 7, 0);\n }\n return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt\n ], function (ev) { return pbf(inflateSync(ev.data[0], gopt(ev.data[1]))); }, 1, cb);\n}\n/**\n * Expands DEFLATE data with no wrapper\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function inflateSync(data, opts) {\n return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n function Gzip(opts, cb) {\n this.c = crc();\n this.l = 0;\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gzip.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n this.l += chunk.length;\n Deflate.prototype.push.call(this, chunk, final);\n };\n Gzip.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, this.s);\n if (this.v)\n gzh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * GZIPped output for small inputs.\n */\n Gzip.prototype.flush = function () {\n Deflate.prototype.flush.call(this);\n };\n return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n function AsyncGzip(opts, cb) {\n astrmify([\n bDflt,\n gze,\n function () { return [astrm, Deflate, Gzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gzip(ev.data);\n onmessage = astrm(strm);\n }, 8, 1);\n }\n return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n gze,\n function () { return [gzipSync]; }\n ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n if (!opts)\n opts = {};\n var c = crc(), l = data.length;\n c.p(data);\n var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming single or multi-member GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n function Gunzip(opts, cb) {\n this.v = 1;\n this.r = 0;\n Inflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GUNZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gunzip.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n this.r += chunk.length;\n if (this.v) {\n var p = this.p.subarray(this.v - 1);\n var s = p.length > 3 ? gzs(p) : 4;\n if (s > p.length) {\n if (!final)\n return;\n }\n else if (this.v > 1 && this.onmember) {\n this.onmember(this.r - p.length);\n }\n this.p = p.subarray(s), this.v = 0;\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n // process concatenated GZIP\n if (this.s.f && !this.s.l && !final) {\n this.v = shft(this.s.p) + 9;\n this.s = { i: 0 };\n this.o = new u8(0);\n this.push(new u8(0), final);\n }\n };\n return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming single or multi-member GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n function AsyncGunzip(opts, cb) {\n var _this = this;\n astrmify([\n bInflt,\n guze,\n function () { return [astrm, Inflate, Gunzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gunzip(ev.data);\n strm.onmember = function (offset) { return postMessage(offset); };\n onmessage = astrm(strm);\n }, 9, 0, function (offset) { return _this.onmember && _this.onmember(offset); });\n }\n return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n guze,\n function () { return [gunzipSync]; }\n ], function (ev) { return pbf(gunzipSync(ev.data[0], ev.data[1])); }, 3, cb);\n}\n/**\n * Expands GZIP data\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function gunzipSync(data, opts) {\n var st = gzs(data);\n if (st + 8 > data.length)\n err(6, 'invalid gzip data');\n return inflt(data.subarray(st, -8), { i: 2 }, opts && opts.out || new u8(gzl(data)), opts && opts.dictionary);\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n function Zlib(opts, cb) {\n this.c = adler();\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be zlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Zlib.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n Deflate.prototype.push.call(this, chunk, final);\n };\n Zlib.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && (this.o.dictionary ? 6 : 2), f && 4, this.s);\n if (this.v)\n zlh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 4, this.c.d());\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * zlibbed output for small inputs.\n */\n Zlib.prototype.flush = function () {\n Deflate.prototype.flush.call(this);\n };\n return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n function AsyncZlib(opts, cb) {\n astrmify([\n bDflt,\n zle,\n function () { return [astrm, Deflate, Zlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Zlib(ev.data);\n onmessage = astrm(strm);\n }, 10, 1);\n }\n return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n zle,\n function () { return [zlibSync]; }\n ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n if (!opts)\n opts = {};\n var a = adler();\n a.p(data);\n var d = dopt(data, opts, opts.dictionary ? 6 : 2, 4);\n return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n function Unzlib(opts, cb) {\n Inflate.call(this, opts, cb);\n this.v = opts && opts.dictionary ? 2 : 1;\n }\n /**\n * Pushes a chunk to be unzlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzlib.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n if (this.p.length < 6 && !final)\n return;\n this.p = this.p.subarray(zls(this.p, this.v - 1)), this.v = 0;\n }\n if (final) {\n if (this.p.length < 4)\n err(6, 'invalid zlib data');\n this.p = this.p.subarray(0, -4);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n function AsyncUnzlib(opts, cb) {\n astrmify([\n bInflt,\n zule,\n function () { return [astrm, Inflate, Unzlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Unzlib(ev.data);\n onmessage = astrm(strm);\n }, 11, 0);\n }\n return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n zule,\n function () { return [unzlibSync]; }\n ], function (ev) { return pbf(unzlibSync(ev.data[0], gopt(ev.data[1]))); }, 5, cb);\n}\n/**\n * Expands Zlib data\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function unzlibSync(data, opts) {\n return inflt(data.subarray(zls(data, opts && opts.dictionary), -4), { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n function Decompress(opts, cb) {\n this.o = StrmOpt.call(this, opts, cb) || {};\n this.G = Gunzip;\n this.I = Inflate;\n this.Z = Unzlib;\n }\n // init substream\n // overriden by AsyncDecompress\n Decompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (dat, final) {\n _this.ondata(dat, final);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Decompress.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (!this.s) {\n if (this.p && this.p.length) {\n var n = new u8(this.p.length + chunk.length);\n n.set(this.p), n.set(chunk, this.p.length);\n }\n else\n this.p = chunk;\n if (this.p.length > 2) {\n this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n ? new this.G(this.o)\n : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n ? new this.I(this.o)\n : new this.Z(this.o);\n this.i();\n this.s.push(this.p, final);\n this.p = null;\n }\n }\n else\n this.s.push(chunk, final);\n };\n return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n function AsyncDecompress(opts, cb) {\n Decompress.call(this, opts, cb);\n this.queuedSize = 0;\n this.G = AsyncGunzip;\n this.I = AsyncInflate;\n this.Z = AsyncUnzlib;\n }\n AsyncDecompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (err, dat, final) {\n _this.ondata(err, dat, final);\n };\n this.s.ondrain = function (size) {\n _this.queuedSize -= size;\n if (_this.ondrain)\n _this.ondrain(size);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncDecompress.prototype.push = function (chunk, final) {\n this.queuedSize += chunk.length;\n Decompress.prototype.push.call(this, chunk, final);\n };\n return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzip(data, opts, cb)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflate(data, opts, cb)\n : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, opts) {\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzipSync(data, opts)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflateSync(data, opts)\n : unzlibSync(data, opts);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n for (var k in d) {\n var val = d[k], n = p + k, op = o;\n if (Array.isArray(val))\n op = mrg(o, val[1]), val = val[0];\n if (val instanceof u8)\n t[n] = [val, op];\n else {\n t[n += '/'] = [new u8(0), op];\n fltn(val, n, t, o);\n }\n }\n};\n// text encoder\nvar te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder();\n// text decoder\nvar td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();\n// text decoder stream\nvar tds = 0;\ntry {\n td.decode(et, { stream: true });\n tds = 1;\n}\ncatch (e) { }\n// decode UTF8\nvar dutf8 = function (d) {\n for (var r = '', i = 0;;) {\n var c = d[i++];\n var eb = (c > 127) + (c > 223) + (c > 239);\n if (i + eb > d.length)\n return { s: r, r: slc(d, i - 1) };\n if (!eb)\n r += String.fromCharCode(c);\n else if (eb == 3) {\n c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,\n r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n }\n else if (eb & 1)\n r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));\n else\n r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));\n }\n};\n/**\n * Streaming UTF-8 decoding\n */\nvar DecodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is decoded\n */\n function DecodeUTF8(cb) {\n this.ondata = cb;\n if (tds)\n this.t = new TextDecoder();\n else\n this.p = et;\n }\n /**\n * Pushes a chunk to be decoded from UTF-8 binary\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n DecodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n final = !!final;\n if (this.t) {\n this.ondata(this.t.decode(chunk, { stream: true }), final);\n if (final) {\n if (this.t.decode().length)\n err(8);\n this.t = null;\n }\n return;\n }\n if (!this.p)\n err(4);\n var dat = new u8(this.p.length + chunk.length);\n dat.set(this.p);\n dat.set(chunk, this.p.length);\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (final) {\n if (r.length)\n err(8);\n this.p = null;\n }\n else\n this.p = r;\n this.ondata(s, final);\n };\n return DecodeUTF8;\n}());\nexport { DecodeUTF8 };\n/**\n * Streaming UTF-8 encoding\n */\nvar EncodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is encoded\n */\n function EncodeUTF8(cb) {\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be encoded to UTF-8\n * @param chunk The string data to push\n * @param final Whether this is the last chunk\n */\n EncodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n this.ondata(strToU8(chunk), this.d = final || false);\n };\n return EncodeUTF8;\n}());\nexport { EncodeUTF8 };\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n if (latin1) {\n var ar_1 = new u8(str.length);\n for (var i = 0; i < str.length; ++i)\n ar_1[i] = str.charCodeAt(i);\n return ar_1;\n }\n if (te)\n return te.encode(str);\n var l = str.length;\n var ar = new u8(str.length + (str.length >> 1));\n var ai = 0;\n var w = function (v) { ar[ai++] = v; };\n for (var i = 0; i < l; ++i) {\n if (ai + 5 > ar.length) {\n var n = new u8(ai + 8 + ((l - i) << 1));\n n.set(ar);\n ar = n;\n }\n var c = str.charCodeAt(i);\n if (c < 128 || latin1)\n w(c);\n else if (c < 2048)\n w(192 | (c >> 6)), w(128 | (c & 63));\n else if (c > 55295 && c < 57344)\n c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n else\n w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n }\n return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n if (latin1) {\n var r = '';\n for (var i = 0; i < dat.length; i += 16384)\n r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));\n return r;\n }\n else if (td) {\n return td.decode(dat);\n }\n else {\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (r.length)\n err(8);\n return s;\n }\n}\n;\n// deflate bit flag\nvar dbf = function (l) { return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; };\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n var fnl = b2(d, b + 28), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl, bs = b4(d, b + 20);\n var _a = z && bs == 4294967295 ? z64e(d, es) : [bs, b4(d, b + 24), b4(d, b + 42)], sc = _a[0], su = _a[1], off = _a[2];\n return [b2(d, b + 10), sc, su, fn, es + b2(d, b + 30) + b2(d, b + 32), off];\n};\n// read zip64 extra field\nvar z64e = function (d, b) {\n for (; b2(d, b) != 1; b += 4 + b2(d, b + 2))\n ;\n return [b8(d, b + 12), b8(d, b + 4), b8(d, b + 20)];\n};\n// extra field length\nvar exfl = function (ex) {\n var le = 0;\n if (ex) {\n for (var k in ex) {\n var l = ex[k].length;\n if (l > 65535)\n err(9);\n le += l + 4;\n }\n }\n return le;\n};\n// write zip header\nvar wzh = function (d, b, f, fn, u, c, ce, co) {\n var fl = fn.length, ex = f.extra, col = co && co.length;\n var exl = exfl(ex);\n wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n if (ce != null)\n d[b++] = 20, d[b++] = f.os;\n d[b] = 20, b += 2; // spec compliance? what's that?\n d[b++] = (f.flag << 1) | (c < 0 && 8), d[b++] = u && 8;\n d[b++] = f.compression & 255, d[b++] = f.compression >> 8;\n var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;\n if (y < 0 || y > 119)\n err(10);\n wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >> 1)), b += 4;\n if (c != -1) {\n wbytes(d, b, f.crc);\n wbytes(d, b + 4, c < 0 ? -c - 2 : c);\n wbytes(d, b + 8, f.size);\n }\n wbytes(d, b + 12, fl);\n wbytes(d, b + 14, exl), b += 16;\n if (ce != null) {\n wbytes(d, b, col);\n wbytes(d, b + 6, f.attrs);\n wbytes(d, b + 10, ce), b += 14;\n }\n d.set(fn, b);\n b += fl;\n if (exl) {\n for (var k in ex) {\n var exf = ex[k], l = exf.length;\n wbytes(d, b, +k);\n wbytes(d, b + 2, l);\n d.set(exf, b + 4), b += 4 + l;\n }\n }\n if (col)\n d.set(co, b), b += col;\n return b;\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n wbytes(o, b, 0x6054B50); // skip disk\n wbytes(o, b + 8, c);\n wbytes(o, b + 10, c);\n wbytes(o, b + 12, d);\n wbytes(o, b + 16, e);\n};\n/**\n * A pass-through stream to keep data uncompressed in a ZIP archive.\n */\nvar ZipPassThrough = /*#__PURE__*/ (function () {\n /**\n * Creates a pass-through stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n */\n function ZipPassThrough(filename) {\n this.filename = filename;\n this.c = crc();\n this.size = 0;\n this.compression = 0;\n }\n /**\n * Processes a chunk and pushes to the output stream. You can override this\n * method in a subclass for custom behavior, but by default this passes\n * the data through. You must call this.ondata(err, chunk, final) at some\n * point in this method.\n * @param chunk The chunk to process\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.process = function (chunk, final) {\n this.ondata(null, chunk, final);\n };\n /**\n * Pushes a chunk to be added. If you are subclassing this with a custom\n * compression algorithm, note that you must push data from the source\n * file only, pre-compression.\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n this.c.p(chunk);\n this.size += chunk.length;\n if (final)\n this.crc = this.c.d();\n this.process(chunk, final || false);\n };\n return ZipPassThrough;\n}());\nexport { ZipPassThrough };\n// I don't extend because TypeScript extension adds 1kB of runtime bloat\n/**\n * Streaming DEFLATE compression for ZIP archives. Prefer using AsyncZipDeflate\n * for better performance\n */\nvar ZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function ZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new Deflate(opts, function (dat, final) {\n _this.ondata(null, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n }\n ZipDeflate.prototype.process = function (chunk, final) {\n try {\n this.d.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return ZipDeflate;\n}());\nexport { ZipDeflate };\n/**\n * Asynchronous streaming DEFLATE compression for ZIP archives\n */\nvar AsyncZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function AsyncZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new AsyncDeflate(opts, function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n this.terminate = this.d.terminate;\n }\n AsyncZipDeflate.prototype.process = function (chunk, final) {\n this.d.push(chunk, final);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return AsyncZipDeflate;\n}());\nexport { AsyncZipDeflate };\n// TODO: Better tree shaking\n/**\n * A zippable archive to which files can incrementally be added\n */\nvar Zip = /*#__PURE__*/ (function () {\n /**\n * Creates an empty ZIP archive to which files can be added\n * @param cb The callback to call whenever data for the generated ZIP archive\n * is available\n */\n function Zip(cb) {\n this.ondata = cb;\n this.u = [];\n this.d = 1;\n }\n /**\n * Adds a file to the ZIP archive\n * @param file The file stream to add\n */\n Zip.prototype.add = function (file) {\n var _this = this;\n if (!this.ondata)\n err(5);\n // finishing or finished\n if (this.d & 2)\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, false);\n else {\n var f = strToU8(file.filename), fl_1 = f.length;\n var com = file.comment, o = com && strToU8(com);\n var u = fl_1 != file.filename.length || (o && (com.length != o.length));\n var hl_1 = fl_1 + exfl(file.extra) + 30;\n if (fl_1 > 65535)\n this.ondata(err(11, 0, 1), null, false);\n var header = new u8(hl_1);\n wzh(header, 0, file, f, u, -1);\n var chks_1 = [header];\n var pAll_1 = function () {\n for (var _i = 0, chks_2 = chks_1; _i < chks_2.length; _i++) {\n var chk = chks_2[_i];\n _this.ondata(null, chk, false);\n }\n chks_1 = [];\n };\n var tr_1 = this.d;\n this.d = 0;\n var ind_1 = this.u.length;\n var uf_1 = mrg(file, {\n f: f,\n u: u,\n o: o,\n t: function () {\n if (file.terminate)\n file.terminate();\n },\n r: function () {\n pAll_1();\n if (tr_1) {\n var nxt = _this.u[ind_1 + 1];\n if (nxt)\n nxt.r();\n else\n _this.d = 1;\n }\n tr_1 = 1;\n }\n });\n var cl_1 = 0;\n file.ondata = function (err, dat, final) {\n if (err) {\n _this.ondata(err, dat, final);\n _this.terminate();\n }\n else {\n cl_1 += dat.length;\n chks_1.push(dat);\n if (final) {\n var dd = new u8(16);\n wbytes(dd, 0, 0x8074B50);\n wbytes(dd, 4, file.crc);\n wbytes(dd, 8, cl_1);\n wbytes(dd, 12, file.size);\n chks_1.push(dd);\n uf_1.c = cl_1, uf_1.b = hl_1 + cl_1 + 16, uf_1.crc = file.crc, uf_1.size = file.size;\n if (tr_1)\n uf_1.r();\n tr_1 = 1;\n }\n else if (tr_1)\n pAll_1();\n }\n };\n this.u.push(uf_1);\n }\n };\n /**\n * Ends the process of adding files and prepares to emit the final chunks.\n * This *must* be called after adding all desired files for the resulting\n * ZIP file to work properly.\n */\n Zip.prototype.end = function () {\n var _this = this;\n if (this.d & 2) {\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, true);\n return;\n }\n if (this.d)\n this.e();\n else\n this.u.push({\n r: function () {\n if (!(_this.d & 1))\n return;\n _this.u.splice(-1, 1);\n _this.e();\n },\n t: function () { }\n });\n this.d = 3;\n };\n Zip.prototype.e = function () {\n var bt = 0, l = 0, tl = 0;\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0);\n }\n var out = new u8(tl + 22);\n for (var _b = 0, _c = this.u; _b < _c.length; _b++) {\n var f = _c[_b];\n wzh(out, bt, f, f.f, f.u, -f.c - 2, l, f.o);\n bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b;\n }\n wzf(out, bt, this.u.length, tl, l);\n this.ondata(null, out, true);\n this.d = 2;\n };\n /**\n * A method to terminate any internal workers used by the stream. Subsequent\n * calls to add() will fail.\n */\n Zip.prototype.terminate = function () {\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n f.t();\n }\n this.d = 2;\n };\n return Zip;\n}());\nexport { Zip };\nexport function zip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var r = {};\n fltn(data, '', r, opts);\n var k = Object.keys(r);\n var lft = k.length, o = 0, tot = 0;\n var slft = lft, files = new Array(lft);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var cbf = function () {\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n tot = 0;\n for (var i = 0; i < slft; ++i) {\n var f = files[i];\n try {\n var l = f.c.length;\n wzh(out, tot, f, f.f, f.u, l);\n var badd = 30 + f.f.length + exfl(f.extra);\n var loc = tot + badd;\n out.set(f.c, loc);\n wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l;\n }\n catch (e) {\n return cbd(e, null);\n }\n }\n wzf(out, o, files.length, cdl, oe);\n cbd(null, out);\n };\n if (!lft)\n cbf();\n var _loop_1 = function (i) {\n var fn = k[i];\n var _a = r[fn], file = _a[0], p = _a[1];\n var c = crc(), size = file.length;\n c.p(file);\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n var compression = p.level == 0 ? 0 : 8;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n var l = d.length;\n files[i] = mrg(p, {\n size: size,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n compression: compression\n });\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n if (!--lft)\n cbf();\n }\n };\n if (s > 65535)\n cbl(err(11, 0, 1), null);\n if (!compression)\n cbl(null, file);\n else if (size < 160000) {\n try {\n cbl(null, deflateSync(file, p));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(deflate(file, p, cbl));\n };\n // Cannot use lft because it can decrease\n for (var i = 0; i < slft; ++i) {\n _loop_1(i);\n }\n return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n if (!opts)\n opts = {};\n var r = {};\n var files = [];\n fltn(data, '', r, opts);\n var o = 0;\n var tot = 0;\n for (var fn in r) {\n var _a = r[fn], file = _a[0], p = _a[1];\n var compression = p.level == 0 ? 0 : 8;\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n if (s > 65535)\n err(11);\n var d = compression ? deflateSync(file, p) : file, l = d.length;\n var c = crc();\n c.p(file);\n files.push(mrg(p, {\n size: file.length,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n o: o,\n compression: compression\n }));\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n }\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n for (var i = 0; i < files.length; ++i) {\n var f = files[i];\n wzh(out, f.o, f, f.f, f.u, f.c.length);\n var badd = 30 + f.f.length + exfl(f.extra);\n out.set(f.c, f.o + badd);\n wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);\n }\n wzf(out, o, files.length, cdl, oe);\n return out;\n}\n/**\n * Streaming pass-through decompression for ZIP archives\n */\nvar UnzipPassThrough = /*#__PURE__*/ (function () {\n function UnzipPassThrough() {\n }\n UnzipPassThrough.prototype.push = function (data, final) {\n this.ondata(null, data, final);\n };\n UnzipPassThrough.compression = 0;\n return UnzipPassThrough;\n}());\nexport { UnzipPassThrough };\n/**\n * Streaming DEFLATE decompression for ZIP archives. Prefer AsyncZipInflate for\n * better performance.\n */\nvar UnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function UnzipInflate() {\n var _this = this;\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n UnzipInflate.prototype.push = function (data, final) {\n try {\n this.i.push(data, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n UnzipInflate.compression = 8;\n return UnzipInflate;\n}());\nexport { UnzipInflate };\n/**\n * Asynchronous streaming DEFLATE decompression for ZIP archives\n */\nvar AsyncUnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function AsyncUnzipInflate(_, sz) {\n var _this = this;\n if (sz < 320000) {\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n else {\n this.i = new AsyncInflate(function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.terminate = this.i.terminate;\n }\n }\n AsyncUnzipInflate.prototype.push = function (data, final) {\n if (this.i.terminate)\n data = slc(data, 0);\n this.i.push(data, final);\n };\n AsyncUnzipInflate.compression = 8;\n return AsyncUnzipInflate;\n}());\nexport { AsyncUnzipInflate };\n/**\n * A ZIP archive decompression stream that emits files as they are discovered\n */\nvar Unzip = /*#__PURE__*/ (function () {\n /**\n * Creates a ZIP decompression stream\n * @param cb The callback to call whenever a file in the ZIP archive is found\n */\n function Unzip(cb) {\n this.onfile = cb;\n this.k = [];\n this.o = {\n 0: UnzipPassThrough\n };\n this.p = et;\n }\n /**\n * Pushes a chunk to be unzipped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzip.prototype.push = function (chunk, final) {\n var _this = this;\n if (!this.onfile)\n err(5);\n if (!this.p)\n err(4);\n if (this.c > 0) {\n var len = Math.min(this.c, chunk.length);\n var toAdd = chunk.subarray(0, len);\n this.c -= len;\n if (this.d)\n this.d.push(toAdd, !this.c);\n else\n this.k[0].push(toAdd);\n chunk = chunk.subarray(len);\n if (chunk.length)\n return this.push(chunk, final);\n }\n else {\n var f = 0, i = 0, is = void 0, buf = void 0;\n if (!this.p.length)\n buf = chunk;\n else if (!chunk.length)\n buf = this.p;\n else {\n buf = new u8(this.p.length + chunk.length);\n buf.set(this.p), buf.set(chunk, this.p.length);\n }\n var l = buf.length, oc = this.c, add = oc && this.d;\n var _loop_2 = function () {\n var _a;\n var sig = b4(buf, i);\n if (sig == 0x4034B50) {\n f = 1, is = i;\n this_1.d = null;\n this_1.c = 0;\n var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28);\n if (l > i + 30 + fnl + es) {\n var chks_3 = [];\n this_1.k.unshift(chks_3);\n f = 2;\n var sc_1 = b4(buf, i + 18), su_1 = b4(buf, i + 22);\n var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u);\n if (sc_1 == 4294967295) {\n _a = dd ? [-2] : z64e(buf, i), sc_1 = _a[0], su_1 = _a[1];\n }\n else if (dd)\n sc_1 = -1;\n i += es;\n this_1.c = sc_1;\n var d_1;\n var file_1 = {\n name: fn_1,\n compression: cmp_1,\n start: function () {\n if (!file_1.ondata)\n err(5);\n if (!sc_1)\n file_1.ondata(null, et, true);\n else {\n var ctr = _this.o[cmp_1];\n if (!ctr)\n file_1.ondata(err(14, 'unknown compression type ' + cmp_1, 1), null, false);\n d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);\n d_1.ondata = function (err, dat, final) { file_1.ondata(err, dat, final); };\n for (var _i = 0, chks_4 = chks_3; _i < chks_4.length; _i++) {\n var dat = chks_4[_i];\n d_1.push(dat, false);\n }\n if (_this.k[0] == chks_3 && _this.c)\n _this.d = d_1;\n else\n d_1.push(et, true);\n }\n },\n terminate: function () {\n if (d_1 && d_1.terminate)\n d_1.terminate();\n }\n };\n if (sc_1 >= 0)\n file_1.size = sc_1, file_1.originalSize = su_1;\n this_1.onfile(file_1);\n }\n return \"break\";\n }\n else if (oc) {\n if (sig == 0x8074B50) {\n is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;\n return \"break\";\n }\n else if (sig == 0x2014B50) {\n is = i -= 4, f = 3, this_1.c = 0;\n return \"break\";\n }\n }\n };\n var this_1 = this;\n for (; i < l - 4; ++i) {\n var state_1 = _loop_2();\n if (state_1 === \"break\")\n break;\n }\n this.p = et;\n if (oc < 0) {\n var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 0x8074B50 && 4)) : buf.subarray(0, i);\n if (add)\n add.push(dat, !!f);\n else\n this.k[+(f == 2)].push(dat);\n }\n if (f & 2)\n return this.push(buf.subarray(i), final);\n this.p = buf.subarray(i);\n }\n if (final) {\n if (this.c)\n err(13);\n this.p = null;\n }\n };\n /**\n * Registers a decoder with the stream, allowing for files compressed with\n * the compression type provided to be expanded correctly\n * @param decoder The decoder constructor\n */\n Unzip.prototype.register = function (decoder) {\n this.o[decoder.compression] = decoder;\n };\n return Unzip;\n}());\nexport { Unzip };\nvar mt = typeof queueMicrotask == 'function' ? queueMicrotask : typeof setTimeout == 'function' ? setTimeout : function (fn) { fn(); };\nexport function unzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var files = {};\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558) {\n cbd(err(13, 0, 1), null);\n return tAll;\n }\n }\n ;\n var lft = b2(data, e + 8);\n if (lft) {\n var c = lft;\n var o = b4(data, e + 16);\n var z = o == 4294967295 || c == 65535;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = lft = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n var _loop_3 = function (i) {\n var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n if (d)\n files[fn] = d;\n if (!--lft)\n cbd(null, files);\n }\n };\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_1\n })) {\n if (!c_1)\n cbl(null, slc(data, b, b + sc));\n else if (c_1 == 8) {\n var infl = data.subarray(b, b + sc);\n // Synchronously decompress under 512KB, or barely-compressed data\n if (su < 524288 || sc > 0.8 * su) {\n try {\n cbl(null, inflateSync(infl, { out: new u8(su) }));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(inflate(infl, { size: su }, cbl));\n }\n else\n cbl(err(14, 'unknown compression type ' + c_1, 1), null);\n }\n else\n cbl(null, null);\n };\n for (var i = 0; i < c; ++i) {\n _loop_3(i);\n }\n }\n else\n cbd(null, {});\n return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @param opts The ZIP extraction options\n * @returns The decompressed files\n */\nexport function unzipSync(data, opts) {\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558)\n err(13);\n }\n ;\n var c = b2(data, e + 8);\n if (!c)\n return {};\n var o = b4(data, e + 16);\n var z = o == 4294967295 || c == 65535;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n for (var i = 0; i < c; ++i) {\n var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_2\n })) {\n if (!c_2)\n files[fn] = slc(data, b, b + sc);\n else if (c_2 == 8)\n files[fn] = inflateSync(data.subarray(b, b + sc), { out: new u8(su) });\n else\n err(14, 'unknown compression type ' + c_2);\n }\n }\n return files;\n}\n","import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef } from \"react\";\nimport { unzipSync } from \"fflate\";\n\nimport { useNaverMap } from \"../../react/hooks/useNaverMap\";\nimport { bindOverlayEventListeners, removeOverlayEventListeners } from \"../shared/overlayUtils\";\n\ntype StyleOptions = naver.maps.StyleOptions;\ntype StylingFunction = naver.maps.StylingFunction;\n\ninterface KmzOptionProps {\n url: string;\n autoStyle?: boolean;\n style?: StyleOptions | StylingFunction;\n}\n\ninterface KmzLifecycleProps {\n onDataReady?: (data: naver.maps.Data) => void;\n onDataDestroy?: () => void;\n onDataError?: (error: Error) => void;\n onFeaturesAdded?: (features: naver.maps.Feature[]) => void;\n}\n\ninterface KmzEventProps {\n onAddFeature?: (event: naver.maps.FeatureEvent) => void;\n onRemoveFeature?: (event: naver.maps.FeatureEvent) => void;\n onPropertyChanged?: (event: naver.maps.PropertyEvent) => void;\n onClick?: (event: naver.maps.PointerEvent) => void;\n onDblClick?: (event: naver.maps.PointerEvent) => void;\n onRightClick?: (event: naver.maps.PointerEvent) => void;\n onMouseDown?: (event: naver.maps.PointerEvent) => void;\n onMouseUp?: (event: naver.maps.PointerEvent) => void;\n onMouseOver?: (event: naver.maps.PointerEvent) => void;\n onMouseOut?: (event: naver.maps.PointerEvent) => void;\n}\n\nexport type KmzProps = KmzOptionProps & KmzLifecycleProps & KmzEventProps;\n\ntype DataMethod<K extends keyof naver.maps.Data> = naver.maps.Data[K] extends (\n ...args: infer A\n) => infer R\n ? (...args: A) => R | undefined\n : never;\n\nexport interface KmzRef {\n getInstance: () => naver.maps.Data | null;\n getAllFeature: DataMethod<\"getAllFeature\">;\n getFeatureById: DataMethod<\"getFeatureById\">;\n getMap: DataMethod<\"getMap\">;\n getStyle: DataMethod<\"getStyle\">;\n overrideStyle: DataMethod<\"overrideStyle\">;\n removeFeature: DataMethod<\"removeFeature\">;\n revertStyle: DataMethod<\"revertStyle\">;\n setStyle: DataMethod<\"setStyle\">;\n toGeoJson: DataMethod<\"toGeoJson\">;\n}\n\nfunction buildKmzEventBindings(props: KmzProps) {\n return [\n {\n eventName: \"addfeature\",\n invoke: props.onAddFeature\n ? (event: unknown) => props.onAddFeature?.(event as naver.maps.FeatureEvent)\n : undefined\n },\n {\n eventName: \"removefeature\",\n invoke: props.onRemoveFeature\n ? (event: unknown) => props.onRemoveFeature?.(event as naver.maps.FeatureEvent)\n : undefined\n },\n {\n eventName: \"property_changed\",\n invoke: props.onPropertyChanged\n ? (event: unknown) => props.onPropertyChanged?.(event as naver.maps.PropertyEvent)\n : undefined\n },\n {\n eventName: \"click\",\n invoke: props.onClick\n ? (event: unknown) => props.onClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"dblclick\",\n invoke: props.onDblClick\n ? (event: unknown) => props.onDblClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"rightclick\",\n invoke: props.onRightClick\n ? (event: unknown) => props.onRightClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mousedown\",\n invoke: props.onMouseDown\n ? (event: unknown) => props.onMouseDown?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseup\",\n invoke: props.onMouseUp\n ? (event: unknown) => props.onMouseUp?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseover\",\n invoke: props.onMouseOver\n ? (event: unknown) => props.onMouseOver?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseout\",\n invoke: props.onMouseOut\n ? (event: unknown) => props.onMouseOut?.(event as naver.maps.PointerEvent)\n : undefined\n }\n ];\n}\n\nfunction extractKmlFromKmz(arrayBuffer: ArrayBuffer): Document {\n const uint8 = new Uint8Array(arrayBuffer);\n const files = unzipSync(uint8);\n\n const kmlFileName = Object.keys(files).find(\n (name) => name.endsWith(\".kml\") || name === \"doc.kml\"\n );\n\n if (!kmlFileName) {\n throw new Error(\"No KML file found in KMZ archive.\");\n }\n\n const kmlBytes = files[kmlFileName];\n const decoder = new TextDecoder(\"utf-8\");\n const kmlString = decoder.decode(kmlBytes);\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(kmlString, \"application/xml\");\n const parseError = doc.querySelector(\"parsererror\");\n\n if (parseError) {\n throw new Error(`KML parse error: ${parseError.textContent}`);\n }\n\n return doc;\n}\n\nexport const Kmz = forwardRef<KmzRef, KmzProps>(function KmzInner(props, ref) {\n const { map: contextMap, sdkStatus } = useNaverMap();\n const dataRef = useRef<naver.maps.Data | null>(null);\n const dataEventListenersRef = useRef<naver.maps.MapEventListener[]>([]);\n const onDataDestroyRef = useRef<KmzProps[\"onDataDestroy\"]>(props.onDataDestroy);\n const prevUrlRef = useRef<string | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n\n useEffect(() => {\n onDataDestroyRef.current = props.onDataDestroy;\n }, [props.onDataDestroy]);\n\n const invokeDataMethod = useCallback(\n <K extends keyof naver.maps.Data>(\n methodName: K,\n ...args: Parameters<Extract<naver.maps.Data[K], (...params: never[]) => unknown>>\n ): ReturnType<Extract<naver.maps.Data[K], (...params: never[]) => unknown>> | undefined => {\n const data = dataRef.current;\n\n if (!data) {\n return undefined;\n }\n\n const method = data[methodName] as unknown;\n\n if (typeof method !== \"function\") {\n return undefined;\n }\n\n return (method as (...params: unknown[]) => unknown).apply(data, args) as ReturnType<\n Extract<naver.maps.Data[K], (...params: never[]) => unknown>\n >;\n },\n []\n );\n\n const teardownData = useCallback(() => {\n abortRef.current?.abort();\n abortRef.current = null;\n\n const data = dataRef.current;\n\n if (!data) {\n return;\n }\n\n try {\n removeOverlayEventListeners(dataEventListenersRef.current);\n dataEventListenersRef.current = [];\n naver.maps.Event.clearInstanceListeners(data);\n } catch (error) {\n console.error(\"[react-naver-maps-kit] failed to clear KMZ data layer listeners\", error);\n }\n\n data.setMap(null);\n dataRef.current = null;\n prevUrlRef.current = null;\n onDataDestroyRef.current?.();\n }, []);\n\n useImperativeHandle(\n ref,\n (): KmzRef => ({\n getInstance: () => dataRef.current,\n getAllFeature: (...args) => invokeDataMethod(\"getAllFeature\", ...args),\n getFeatureById: (...args) => invokeDataMethod(\"getFeatureById\", ...args),\n getMap: (...args) => invokeDataMethod(\"getMap\", ...args),\n getStyle: (...args) => invokeDataMethod(\"getStyle\", ...args),\n overrideStyle: (...args) => invokeDataMethod(\"overrideStyle\", ...args),\n removeFeature: (...args) => invokeDataMethod(\"removeFeature\", ...args),\n revertStyle: (...args) => invokeDataMethod(\"revertStyle\", ...args),\n setStyle: (...args) => invokeDataMethod(\"setStyle\", ...args),\n toGeoJson: (...args) => invokeDataMethod(\"toGeoJson\", ...args)\n }),\n [invokeDataMethod]\n );\n\n const loadAndAddKmz = useCallback(\n async (data: naver.maps.Data, url: string, isInitial: boolean) => {\n const controller = new AbortController();\n abortRef.current = controller;\n\n try {\n const response = await fetch(url, { signal: controller.signal });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch KMZ: ${response.status} ${response.statusText}`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n\n if (controller.signal.aborted) {\n return;\n }\n\n const kmlDoc = extractKmlFromKmz(arrayBuffer);\n\n if (!isInitial) {\n const existingFeatures = data.getAllFeature();\n existingFeatures.forEach((feature) => data.removeFeature(feature));\n }\n\n const features = data.addKml(kmlDoc, props.autoStyle ?? true);\n prevUrlRef.current = url;\n props.onFeaturesAdded?.(features as unknown as naver.maps.Feature[]);\n } catch (error) {\n if (controller.signal.aborted) {\n return;\n }\n\n const normalizedError =\n error instanceof Error ? error : new Error(\"Failed to load KMZ data.\");\n\n props.onDataError?.(normalizedError);\n }\n },\n [props.autoStyle, props.onFeaturesAdded, props.onDataError]\n );\n\n useEffect(() => {\n if (sdkStatus !== \"ready\" || !contextMap || dataRef.current) {\n return;\n }\n\n try {\n const data = new naver.maps.Data();\n data.setMap(contextMap);\n\n if (props.style) {\n data.setStyle(props.style);\n }\n\n dataRef.current = data;\n bindOverlayEventListeners(data, dataEventListenersRef, buildKmzEventBindings(props));\n props.onDataReady?.(data);\n loadAndAddKmz(data, props.url, true);\n } catch (error) {\n const normalizedError =\n error instanceof Error ? error : new Error(\"Failed to create naver.maps.Data instance.\");\n\n props.onDataError?.(normalizedError);\n }\n }, [sdkStatus, contextMap]);\n\n useEffect(() => {\n const data = dataRef.current;\n\n if (!data || props.url === prevUrlRef.current) {\n return;\n }\n\n abortRef.current?.abort();\n loadAndAddKmz(data, props.url, false);\n }, [props.url, loadAndAddKmz]);\n\n useEffect(() => {\n const data = dataRef.current;\n\n if (!data) {\n return;\n }\n\n if (props.style) {\n data.setStyle(props.style);\n }\n }, [props.style]);\n\n useEffect(() => {\n const data = dataRef.current;\n\n if (!data) {\n return;\n }\n\n bindOverlayEventListeners(data, dataEventListenersRef, buildKmzEventBindings(props));\n\n return () => {\n removeOverlayEventListeners(dataEventListenersRef.current);\n dataEventListenersRef.current = [];\n };\n }, [props]);\n\n useEffect(() => {\n return () => {\n teardownData();\n };\n }, [teardownData]);\n\n return null;\n});\n\nKmz.displayName = \"Kmz\";\n","export type NaverMapKitVersion = \"1.2.0\";\n\nexport const version: NaverMapKitVersion = \"1.2.0\";\n\nexport { loadNaverMapsScript } from \"./core/loader/loadNaverMapsScript\";\nexport type { LoadNaverMapsScriptOptions } from \"./core/loader/loadNaverMapsScript\";\nexport { NaverMapProvider, NaverMapContext } from \"./react/provider/NaverMapProvider\";\nexport { NaverMap } from \"./react/components/NaverMap\";\nexport { Marker } from \"./overlays/marker/Marker\";\nexport { MarkerClusterer } from \"./overlays/marker-clusterer/MarkerClusterer\";\nexport { ClustererContext } from \"./overlays/marker-clusterer/ClustererContext\";\nexport { InfoWindow } from \"./overlays/infowindow/InfoWindow\";\nexport { Circle } from \"./overlays/circle/Circle\";\nexport { Ellipse } from \"./overlays/ellipse/Ellipse\";\nexport { GroundOverlay } from \"./overlays/ground-overlay/GroundOverlay\";\nexport { Polygon } from \"./overlays/polygon/Polygon\";\nexport { Polyline } from \"./overlays/polyline/Polyline\";\nexport { Rectangle } from \"./overlays/rectangle/Rectangle\";\nexport { GeoJson } from \"./overlays/data/GeoJson\";\nexport { Gpx } from \"./overlays/data/Gpx\";\nexport { Kmz } from \"./overlays/data/Kmz\";\nexport { useNaverMap, useNaverMapInstance } from \"./react/hooks/useNaverMap\";\nexport type {\n NaverMapContextValue,\n NaverMapProviderProps,\n NaverMapSdkStatus\n} from \"./react/provider/NaverMapProvider\";\nexport type { NaverMapProps } from \"./react/components/NaverMap\";\nexport type { NaverMapRef } from \"./react/components/NaverMap\";\nexport type { MarkerProps } from \"./overlays/marker/Marker\";\nexport type { MarkerRef } from \"./overlays/marker/Marker\";\nexport type {\n ItemRecord,\n Cluster,\n AlgorithmContext,\n ClusterAlgorithm,\n BuiltInAlgorithmConfig,\n ClusterIconRenderer,\n MarkerClustererHelpers,\n MarkerClustererProps\n} from \"./overlays/marker-clusterer/types\";\nexport type { ClustererRegistry } from \"./overlays/marker-clusterer/ClustererContext\";\nexport type { InfoWindowProps } from \"./overlays/infowindow/InfoWindow\";\nexport type { InfoWindowRef } from \"./overlays/infowindow/InfoWindow\";\nexport type { CircleProps } from \"./overlays/circle/Circle\";\nexport type { CircleRef } from \"./overlays/circle/Circle\";\nexport type { EllipseProps } from \"./overlays/ellipse/Ellipse\";\nexport type { EllipseRef } from \"./overlays/ellipse/Ellipse\";\nexport type { GroundOverlayProps } from \"./overlays/ground-overlay/GroundOverlay\";\nexport type { GroundOverlayRef } from \"./overlays/ground-overlay/GroundOverlay\";\nexport type { PolygonProps } from \"./overlays/polygon/Polygon\";\nexport type { PolygonRef } from \"./overlays/polygon/Polygon\";\nexport type { PolylineProps } from \"./overlays/polyline/Polyline\";\nexport type { PolylineRef } from \"./overlays/polyline/Polyline\";\nexport type { RectangleProps } from \"./overlays/rectangle/Rectangle\";\nexport type { RectangleRef } from \"./overlays/rectangle/Rectangle\";\nexport type { GeoJsonProps } from \"./overlays/data/GeoJson\";\nexport type { GeoJsonRef } from \"./overlays/data/GeoJson\";\nexport type { GpxProps } from \"./overlays/data/Gpx\";\nexport type { GpxRef } from \"./overlays/data/Gpx\";\nexport type { KmzProps } from \"./overlays/data/Kmz\";\nexport type { KmzRef } from \"./overlays/data/Kmz\";\nexport type { UseNaverMapOptions } from \"./react/hooks/useNaverMap\";\n"],"x_google_ignoreList":[8,9,23],"mappings":"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"}
|