react-naver-maps-kit 1.0.1 → 1.1.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../src/core/loader/loadNaverMapsScript.ts","../src/react/provider/NaverMapProvider.tsx","../src/react/components/NaverMap.tsx","../src/react/hooks/useNaverMap.ts","../src/overlays/marker/Marker.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 {\n forwardRef,\n useCallback,\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\";\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\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(props: MarkerProps): MarkerEventBinding[] {\n return [\n {\n eventName: \"click\",\n invoke: props.onClick\n ? (event) => props.onClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"dblclick\",\n invoke: props.onDblClick\n ? (event) => props.onDblClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"rightclick\",\n invoke: props.onRightClick\n ? (event) => props.onRightClick?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mousedown\",\n invoke: props.onMouseDown\n ? (event) => props.onMouseDown?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"mouseup\",\n invoke: props.onMouseUp\n ? (event) => props.onMouseUp?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchstart\",\n invoke: props.onTouchStart\n ? (event) => props.onTouchStart?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"touchend\",\n invoke: props.onTouchEnd\n ? (event) => props.onTouchEnd?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"dragstart\",\n invoke: props.onDragStart\n ? (event) => props.onDragStart?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"drag\",\n invoke: props.onDrag ? (event) => props.onDrag?.(event as naver.maps.PointerEvent) : undefined\n },\n {\n eventName: \"dragend\",\n invoke: props.onDragEnd\n ? (event) => props.onDragEnd?.(event as naver.maps.PointerEvent)\n : undefined\n },\n {\n eventName: \"clickable_changed\",\n invoke: props.onClickableChanged\n ? (event) => props.onClickableChanged?.(event as boolean)\n : undefined\n },\n {\n eventName: \"cursor_changed\",\n invoke: props.onCursorChanged\n ? (event) => props.onCursorChanged?.(event as string)\n : undefined\n },\n {\n eventName: \"draggable_changed\",\n invoke: props.onDraggableChanged\n ? (event) => props.onDraggableChanged?.(event as boolean)\n : undefined\n },\n {\n eventName: \"icon_changed\",\n invoke: props.onIconChanged\n ? (event) =>\n props.onIconChanged?.(\n event as string | naver.maps.ImageIcon | naver.maps.SymbolIcon | naver.maps.HtmlIcon\n )\n : undefined\n },\n {\n eventName: \"icon_loaded\",\n invoke: props.onIconLoaded\n ? (event) => props.onIconLoaded?.(event as naver.maps.Marker)\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: \"shape_changed\",\n invoke: props.onShapeChanged\n ? (event) => props.onShapeChanged?.(event as naver.maps.MarkerShape)\n : undefined\n },\n {\n eventName: \"title_changed\",\n invoke: props.onTitleChanged ? (event) => props.onTitleChanged?.(event as string) : undefined\n },\n {\n eventName: \"visible_changed\",\n invoke: props.onVisibleChanged\n ? (event) => props.onVisibleChanged?.(event as boolean)\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 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\nexport const Marker = forwardRef<MarkerRef, MarkerProps>(\n function MarkerInner(props, ref): ReactPortal | null {\n const { map: contextMap, sdkStatus } = useNaverMap();\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 useEffect(() => {\n onMarkerDestroyRef.current = props.onMarkerDestroy;\n }, [props.onMarkerDestroy]);\n\n useEffect(() => {\n if (typeof document === \"undefined\") {\n return;\n }\n\n setMarkerDiv(document.createElement(\"div\"));\n }, []);\n\n useEffect(() => {\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 }, [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 (sdkStatus !== \"ready\" || !targetMap || markerRef.current) {\n return;\n }\n\n if (hasChildren && !portalReady) {\n return;\n }\n\n try {\n const resolvedIcon = resolveMarkerIcon(props.icon, markerDiv, hasChildren);\n const marker = new naver.maps.Marker(toMarkerOptions(props, targetMap, resolvedIcon));\n\n markerRef.current = marker;\n\n if (props.collisionBehavior !== undefined) {\n marker.setOptions(\"collisionBehavior\", props.collisionBehavior);\n }\n\n if (props.collisionBoxSize !== undefined) {\n marker.setOptions(\"collisionBoxSize\", props.collisionBoxSize);\n }\n\n bindMarkerEventListeners(marker, markerEventListenersRef, buildMarkerEventBindings(props));\n props.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 props.onMarkerError?.(normalizedError);\n }\n }, [hasChildren, markerDiv, portalReady, props, sdkStatus, targetMap]);\n\n useLayoutEffect(() => {\n const marker = markerRef.current;\n\n if (!marker || !targetMap) {\n return;\n }\n\n const rafId = requestAnimationFrame(() => {\n const resolvedIcon =\n hasChildren && portalReady\n ? resolveMarkerIcon(props.icon, markerDiv, hasChildren)\n : props.icon;\n const nextOptions = toMarkerOptions(props, targetMap, resolvedIcon);\n\n marker.setOptions(nextOptions);\n\n if (props.collisionBehavior !== undefined) {\n marker.setOptions(\"collisionBehavior\", props.collisionBehavior);\n }\n\n if (props.collisionBoxSize !== undefined) {\n marker.setOptions(\"collisionBoxSize\", props.collisionBoxSize);\n }\n });\n\n return () => {\n cancelAnimationFrame(rafId);\n };\n }, [hasChildren, markerDiv, portalReady, props, targetMap]);\n\n useEffect(() => {\n const marker = markerRef.current;\n\n if (!marker) {\n return;\n }\n\n bindMarkerEventListeners(marker, markerEventListenersRef, buildMarkerEventBindings(props));\n\n return () => {\n if (markerEventListenersRef.current.length > 0) {\n naver.maps.Event.removeListener(markerEventListenersRef.current);\n markerEventListenersRef.current = [];\n }\n };\n }, [props]);\n\n useEffect(() => {\n return () => {\n teardownMarker();\n };\n }, [teardownMarker]);\n\n if (!hasChildren || !markerDiv) {\n return null;\n }\n\n return createPortal(props.children, markerDiv);\n }\n);\n\nMarker.displayName = \"Marker\";\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 { 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 { 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"],"mappings":"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"}
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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"}