react-naver-maps-kit 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +330 -0
- package/dist/core/loader/loadNaverMapsScript.d.ts +13 -0
- package/dist/core/loader/loadNaverMapsScript.d.ts.map +1 -0
- package/dist/index.cjs +2646 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2631 -0
- package/dist/index.js.map +1 -0
- package/dist/overlays/circle/Circle.d.ts +79 -0
- package/dist/overlays/circle/Circle.d.ts.map +1 -0
- package/dist/overlays/ellipse/Ellipse.d.ts +74 -0
- package/dist/overlays/ellipse/Ellipse.d.ts.map +1 -0
- package/dist/overlays/ground-overlay/GroundOverlay.d.ts +46 -0
- package/dist/overlays/ground-overlay/GroundOverlay.d.ts.map +1 -0
- package/dist/overlays/infowindow/InfoWindow.d.ts +67 -0
- package/dist/overlays/infowindow/InfoWindow.d.ts.map +1 -0
- package/dist/overlays/marker/Marker.d.ts +81 -0
- package/dist/overlays/marker/Marker.d.ts.map +1 -0
- package/dist/overlays/polygon/Polygon.d.ts +78 -0
- package/dist/overlays/polygon/Polygon.d.ts.map +1 -0
- package/dist/overlays/polyline/Polyline.d.ts +79 -0
- package/dist/overlays/polyline/Polyline.d.ts.map +1 -0
- package/dist/overlays/rectangle/Rectangle.d.ts +74 -0
- package/dist/overlays/rectangle/Rectangle.d.ts.map +1 -0
- package/dist/overlays/shared/overlayUtils.d.ts +9 -0
- package/dist/overlays/shared/overlayUtils.d.ts.map +1 -0
- package/dist/react/components/NaverMap.d.ts +137 -0
- package/dist/react/components/NaverMap.d.ts.map +1 -0
- package/dist/react/components/NaverMap.test.d.ts +2 -0
- package/dist/react/components/NaverMap.test.d.ts.map +1 -0
- package/dist/react/hooks/useNaverMap.d.ts +10 -0
- package/dist/react/hooks/useNaverMap.d.ts.map +1 -0
- package/dist/react/provider/NaverMapProvider.d.ts +21 -0
- package/dist/react/provider/NaverMapProvider.d.ts.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +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 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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export type NaverMapKitVersion = "0.0.1";
|
|
2
|
+
export declare const version: NaverMapKitVersion;
|
|
3
|
+
export { loadNaverMapsScript } from "./core/loader/loadNaverMapsScript";
|
|
4
|
+
export type { LoadNaverMapsScriptOptions } from "./core/loader/loadNaverMapsScript";
|
|
5
|
+
export { NaverMapProvider, NaverMapContext } from "./react/provider/NaverMapProvider";
|
|
6
|
+
export { NaverMap } from "./react/components/NaverMap";
|
|
7
|
+
export { Marker } from "./overlays/marker/Marker";
|
|
8
|
+
export { InfoWindow } from "./overlays/infowindow/InfoWindow";
|
|
9
|
+
export { Circle } from "./overlays/circle/Circle";
|
|
10
|
+
export { Ellipse } from "./overlays/ellipse/Ellipse";
|
|
11
|
+
export { GroundOverlay } from "./overlays/ground-overlay/GroundOverlay";
|
|
12
|
+
export { Polygon } from "./overlays/polygon/Polygon";
|
|
13
|
+
export { Polyline } from "./overlays/polyline/Polyline";
|
|
14
|
+
export { Rectangle } from "./overlays/rectangle/Rectangle";
|
|
15
|
+
export { useNaverMap, useNaverMapInstance } from "./react/hooks/useNaverMap";
|
|
16
|
+
export type { NaverMapContextValue, NaverMapProviderProps, NaverMapSdkStatus } from "./react/provider/NaverMapProvider";
|
|
17
|
+
export type { NaverMapProps } from "./react/components/NaverMap";
|
|
18
|
+
export type { NaverMapRef } from "./react/components/NaverMap";
|
|
19
|
+
export type { MarkerProps } from "./overlays/marker/Marker";
|
|
20
|
+
export type { MarkerRef } from "./overlays/marker/Marker";
|
|
21
|
+
export type { InfoWindowProps } from "./overlays/infowindow/InfoWindow";
|
|
22
|
+
export type { InfoWindowRef } from "./overlays/infowindow/InfoWindow";
|
|
23
|
+
export type { CircleProps } from "./overlays/circle/Circle";
|
|
24
|
+
export type { CircleRef } from "./overlays/circle/Circle";
|
|
25
|
+
export type { EllipseProps } from "./overlays/ellipse/Ellipse";
|
|
26
|
+
export type { EllipseRef } from "./overlays/ellipse/Ellipse";
|
|
27
|
+
export type { GroundOverlayProps } from "./overlays/ground-overlay/GroundOverlay";
|
|
28
|
+
export type { GroundOverlayRef } from "./overlays/ground-overlay/GroundOverlay";
|
|
29
|
+
export type { PolygonProps } from "./overlays/polygon/Polygon";
|
|
30
|
+
export type { PolygonRef } from "./overlays/polygon/Polygon";
|
|
31
|
+
export type { PolylineProps } from "./overlays/polyline/Polyline";
|
|
32
|
+
export type { PolylineRef } from "./overlays/polyline/Polyline";
|
|
33
|
+
export type { RectangleProps } from "./overlays/rectangle/Rectangle";
|
|
34
|
+
export type { RectangleRef } from "./overlays/rectangle/Rectangle";
|
|
35
|
+
export type { UseNaverMapOptions } from "./react/hooks/useNaverMap";
|
|
36
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAEzC,eAAO,MAAM,OAAO,EAAE,kBAA4B,CAAC;AAEnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,YAAY,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACtF,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAC7E,YAAY,EACV,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,YAAY,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,YAAY,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,YAAY,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,YAAY,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACtE,YAAY,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,YAAY,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,YAAY,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,YAAY,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,YAAY,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAClF,YAAY,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAChF,YAAY,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,YAAY,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,YAAY,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,YAAY,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,YAAY,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,YAAY,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,YAAY,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC"}
|