{"version":3,"file":"index.cjs","sources":["../src/hooks/useIsomorphicLayoutEffect.tsx","../src/util/kakaoMapApiLoader.ts","../src/hooks/useKakaoEvent.tsx","../src/components/Map.tsx","../src/hooks/useMap.tsx","../src/components/InfoWindow.tsx","../src/components/MarkerClusterer.tsx","../src/components/Marker.tsx","../src/components/MapMarker.tsx","../src/components/MapInfoWindow.tsx","../src/components/CustomOverlayMap.tsx","../src/components/MapTypeControl.tsx","../src/components/ZoomControl.tsx","../src/components/Circle.tsx","../src/components/Polyline.tsx","../src/components/Polygon.tsx","../src/components/Rectangle.tsx","../src/components/Ellipse.tsx","../src/components/AbstractOverlay.tsx","../src/components/Roadview.tsx","../src/hooks/useRoadview.tsx","../src/components/CustomOverlayRoadview.tsx","../src/components/RoadviewMarker.tsx","../src/components/RoadviewInfoWindow.tsx","../src/components/DrawingManager.tsx","../src/components/Toolbox.tsx","../src/components/StaticMap.tsx","../src/components/MapTypeId.tsx","../src/hooks/useInjectKakaoMapApi.tsx"],"sourcesContent":["import { useEffect, useLayoutEffect } from \"react\"\n\nconst useIsomorphicLayoutEffect =\n  typeof window !== \"undefined\" && typeof document !== \"undefined\"\n    ? useLayoutEffect\n    : useEffect\n\nexport default useIsomorphicLayoutEffect\n","export type Libraries = (\"services\" | \"clusterer\" | \"drawing\")[]\n\nexport interface LoaderOptions {\n  /**\n   * script 객체 생성시 사용자 정의 id\n   */\n  id?: string\n  /**\n   * 발급 받은 Kakao 지도 Javscript API 키.\n   *\n   * @see [준비하기](https://apis.map.kakao.com/web/guide/#ready)\n   */\n  appkey: string\n  /**\n   * 사용하는 라이브러리 목록\n   *\n   * Kakao 지도 Javascript API 는 지도와 함께 사용할 수 있는 라이브러리 를 지원하고 있습니다.\n   * 라이브러리는 javascript API와 관련되어 있지만 조금 특화된 기능을 묶어둔 것을 말합니다. 이 기능은 추가로 불러와서 사용할 수 있도록 되어있습니다.\n   * 현재 사용할 수 있는 라이브러리는 다음과 같습니다.\n   *\n   * clusterer: 마커를 클러스터링 할 수 있는 클러스터러 라이브러리 입니다.\n   * services: 장소 검색 과 주소-좌표 변환 을 할 수 있는 services 라이브러리 입니다.\n   * drawing: 지도 위에 마커와 그래픽스 객체를 쉽게 그릴 수 있게 그리기 모드를 지원하는 drawing 라이브러리 입니다.\n   * 라이브러리는 계속해서 추가될 예정입니다.\n   */\n  libraries?: Libraries\n  /**\n   * 사용자 정의 Kakao 지도 javascript 경로 지정\n   *\n   * @default \"//dapi.kakao.com/v2/maps/sdk.js\"\n   */\n  url?: string\n  /**\n   * 보안을 위한 nonce 값 설정\n   */\n  nonce?: string\n  /**\n   * 스크립트 로드 재시도 횟수\n   */\n  retries?: number\n}\n\nexport enum LoaderStatus {\n  INITIALIZED,\n  LOADING,\n  SUCCESS,\n  FAILURE,\n}\n\nconst DEFAULT_ID = \"__reactKakaoMapsSdkloaderId\"\n\n/**\n * Kakao Map Api Loader\n *\n * `new Loader(options).load()` 함수를 이용하여 Api를 비동기적으로 삽입할 수 있습니다.\n *\n * 해당 Loader를 이용시 `react-kakao-maps-sdk` 내부에서 injection 되는 이벤트를 감지하여 kakao map api 로딩 이후에 렌더링을 진행합니다.\n */\nexport class Loader {\n  private static instance: Loader\n  private static loadcheckcallbacks: ((e?: ErrorEvent) => void)[] = []\n\n  public readonly id: string\n  public readonly appkey: string\n  public readonly url: string\n  public readonly libraries: Libraries\n  public readonly nonce: string | undefined\n  public readonly retries: number\n\n  private callbacks: ((e?: ErrorEvent) => void)[] = []\n  private done = false\n  private loading = false\n  private errors: ErrorEvent[] = []\n  private onerrorEvent: ErrorEvent | undefined\n\n  constructor({\n    appkey,\n    id = DEFAULT_ID,\n    libraries = [],\n    nonce,\n    retries = 3,\n    url = \"//dapi.kakao.com/v2/maps/sdk.js\",\n  }: LoaderOptions) {\n    this.id = id\n    this.appkey = appkey\n    this.libraries = libraries\n    this.nonce = nonce\n    this.retries = retries\n    this.url = url\n\n    if (Loader.instance) {\n      if (!Loader.equalOptions(this.options, Loader.instance.options)) {\n        throw new Error(\n          `Loader must not be called again with different options. ${JSON.stringify(\n            this.options\n          )} !== ${JSON.stringify(Loader.instance.options)}`\n        )\n      }\n\n      return Loader.instance\n    }\n    Loader.instance = this\n  }\n\n  public get options() {\n    return {\n      appkey: this.appkey,\n      id: this.id,\n      libraries: this.libraries,\n      nonce: this.nonce,\n      retries: this.retries,\n      url: this.url,\n    }\n  }\n\n  public static isLoaded(): Promise<boolean> {\n    return new Promise((resolve) => {\n      if (!Loader.instance) {\n        if (window.kakao && window.kakao.maps) {\n          return window.kakao.maps.load(() => {\n            resolve(true)\n          })\n        }\n        return Loader.loadcheckcallbacks.push((e) => {\n          resolve(!e)\n        })\n      }\n\n      if (\n        Loader.instance.status === LoaderStatus.FAILURE ||\n        Loader.instance.status === LoaderStatus.INITIALIZED\n      ) {\n        return resolve(false)\n      }\n\n      if (Loader.instance.status === LoaderStatus.LOADING) {\n        Loader.loadcheckcallbacks.push((e) => resolve(!e))\n      }\n\n      return resolve(true)\n    })\n  }\n\n  public load(): Promise<typeof kakao> {\n    return new Promise((resolve, reject) => {\n      this.loadCallback((err?: ErrorEvent) => {\n        if (!err) {\n          resolve(window.kakao)\n        } else {\n          reject(err.error)\n        }\n      })\n    })\n  }\n\n  public get status(): LoaderStatus {\n    if (this.onerrorEvent) {\n      return LoaderStatus.FAILURE\n    }\n    if (this.done) {\n      return LoaderStatus.SUCCESS\n    }\n    if (this.loading) {\n      return LoaderStatus.LOADING\n    }\n    return LoaderStatus.INITIALIZED\n  }\n\n  private get failed(): boolean {\n    return this.done && !this.loading && this.errors.length >= this.retries + 1\n  }\n\n  private loadCallback(fn: (e?: ErrorEvent) => void): void {\n    this.callbacks.push(fn)\n    this.execute()\n  }\n\n  private resetIfRetryingFailed(): void {\n    if (this.failed) {\n      this.reset()\n    }\n  }\n\n  private reset(): void {\n    this.deleteScript()\n    this.done = false\n    this.loading = false\n    this.errors = []\n    this.onerrorEvent = undefined\n  }\n\n  private execute() {\n    this.resetIfRetryingFailed()\n\n    if (this.done) {\n      this.callback()\n    } else {\n      if (window.kakao && window.kakao.maps) {\n        console.warn(\n          \"Kakao Maps이 이미 외부 요소에 의해 로딩되어 있습니다.\" +\n            \"설정한 옵션과 일치 하지 않을 수 있으며, 이에 따른 예상치 동작이 발생할 수 있습니다.\"\n        )\n        window.kakao.maps.load(this.callback);\n        return\n      }\n\n      if (!this.loading) {\n        this.loading = true\n        this.setScript()\n      }\n    }\n  }\n\n  private setScript() {\n    if (document.getElementById(this.id)) {\n      this.callback()\n    }\n\n    const url = this.createUrl()\n    const script = document.createElement(\"script\")\n\n    script.id = this.id\n    script.type = \"text/javascript\"\n    script.src = url\n    script.onerror = this.loadErrorCallback.bind(this)\n    script.onload = this.callback.bind(this)\n    script.defer = true\n    script.async = true\n\n    if (this.nonce) {\n      script.nonce = this.nonce\n    }\n\n    document.head.appendChild(script)\n  }\n\n  private loadErrorCallback(\n    event: Event | string,\n    source?: string,\n    lineno?: number,\n    colno?: number,\n    error?: Error\n  ): void {\n    this.errors.push({\n      event,\n      source,\n      // @ts-ignore\n      lineno,\n      // @ts-ignore\n      colno,\n      error,\n    })\n\n    if (this.errors.length <= this.retries) {\n      const delay = this.errors.length * 2 ** this.errors.length\n\n      console.log(`Failed to load Kakao Maps script, retrying in ${delay} ms.`)\n\n      setTimeout(() => {\n        this.deleteScript()\n        this.setScript()\n      }, delay)\n    } else {\n      this.onerrorEvent = this.errors[this.errors.length - 1]\n      this.callback()\n    }\n  }\n\n  public createUrl(): string {\n    let url = this.url\n    url += `?appkey=${this.appkey}`\n\n    if (this.libraries.length) {\n      url += `&libraries=${this.libraries.join(\",\")}`\n    }\n\n    url += `&autoload=false`\n\n    return url\n  }\n\n  private deleteScript() {\n    const script = document.getElementById(this.id)\n    if (script) {\n      script.remove()\n    }\n  }\n\n  private callback() {\n    kakao.maps.load(() => {\n      this.done = true\n      this.loading = false\n\n      this.callbacks.forEach((cb) => {\n        cb(this.onerrorEvent)\n      })\n      this.callbacks = []\n\n      Loader.loadcheckcallbacks.forEach((cb) => {\n        cb(this.onerrorEvent)\n      })\n      Loader.loadcheckcallbacks = []\n    })\n  }\n\n  private static equalOptions(\n    a: typeof Loader.prototype.options,\n    b: typeof Loader.prototype.options\n  ): boolean {\n    if (a.appkey !== b.appkey) return false\n    if (a.id !== b.id) return false\n\n    if (a.libraries.length !== b.libraries.length) return false\n    for (let i = 0; i < a.libraries.length; ++i) {\n      if (a.libraries[i] !== b.libraries[i]) return false\n    }\n    if (a.nonce !== b.nonce) return false\n    if (a.retries !== b.retries) return false\n    if (a.url !== b.url) return false\n    return true\n  }\n}\n","import useIsomorphicLayoutEffect from \"./useIsomorphicLayoutEffect\"\n\nconst useKakaoEvent = <T extends kakao.maps.event.EventTarget>(\n  /**\n   * 이벤트 타겟\n   */\n  target: T | undefined,\n  /**\n   * event 타입\n   */\n  type: \"center_changed\"|\"zoom_start\"|\"zoom_changed\"|\"bounds_changed\"|\"click\"|\"dblclick\"|\"rightclick\"|\"mouseover\"|\"mouseout\"|\"mousemove\"|\"mousedown\"|\"dragstart\"|\"drag\"|\"dragend\"|\"idle\"|\"tilesloaded\"|\"maptypeid_changed\"|\"clusterclick\"|\"clusterover\"|\"clusterout\"|\"clusterdblclick\"|\"clusterrightclick\"|\"clustered\"|\"init\"|\"panoid_changed\"|\"viewpoint_changed\"|\"position_changed\",\n  /**\n   * 호출될 callback\n   */\n  callback: ((target: T, ...args: any[]) => void) | undefined\n) => {\n  useIsomorphicLayoutEffect(() => {\n    if (!target || !callback) return\n\n    const wrapCallback = (...arg: any[]) => {\n      if (arg === undefined) return callback(target)\n      else return callback(target, ...arg)\n    }\n\n    kakao.maps.event.addListener(target, type, wrapCallback)\n\n    return () => {\n      kakao.maps.event.removeListener(target, type, wrapCallback)\n    }\n  }, [target, type, callback])\n}\n\nexport default useKakaoEvent\n","import React, { useRef, useState, useImperativeHandle } from \"react\"\nimport useIsomorphicLayoutEffect from \"../hooks/useIsomorphicLayoutEffect\"\nimport useKakaoEvent from \"../hooks/useKakaoEvent\"\nimport { PolymorphicComponentPropsWithOutRef } from \"../types\"\nimport { Loader } from \"../util/kakaoMapApiLoader\"\n\nexport const KakaoMapContext = React.createContext<kakao.maps.Map>(\n  undefined as unknown as kakao.maps.Map\n)\n\nexport type MapProps = {\n  /**\n   * 중심으로 설정할 위치 입니다.\n   */\n  center:\n    | {\n        lat: number\n        lng: number\n      }\n    | {\n        x: number\n        y: number\n      }\n\n  /**\n   * 중심을 이동시킬때 Panto를 사용할지 정합니다.\n   * @default false\n   */\n  isPanto?: boolean\n\n  /**\n   * 중심 좌표를 지정한 좌표 또는 영역으로 부드럽게 이동한다. 필요하면 확대 또는 축소도 수행한다.\n   * 만약 이동할 거리가 지도 화면의 크기보다 클 경우 애니메이션 없이 이동한다.\n   * padding 만큼 제외하고 영역을 계산하며, padding 을 지정하지 않으면 기본값으로 32가 사용된다.\n   */\n  padding?: number\n\n  /**\n   * 확대 수준 (기본값: 3)\n   */\n  level?: number\n\n  /**\n   * 최대 확대 수준\n   */\n  maxLevel?: number\n\n  /**\n   * 최소 확대 수준\n   */\n  minLevel?: number\n\n  /**\n   * 지도 종류 (기본값: 일반 지도)\n   */\n  mapTypeId?: kakao.maps.MapTypeId\n\n  /**\n   * 마우스 드래그, 휠, 모바일 터치를 이용한 시점 변경(이동, 확대, 축소) 가능 여부\n   */\n  draggable?: boolean\n\n  /**\n   * 마우스 휠이나 멀티터치로 지도 확대, 축소 기능을 막습니다. 상황에 따라 지도 확대, 축소 기능을 제어할 수 있습니다.\n   */\n  zoomable?: boolean\n\n  /**\n   * 마우스 휠, 모바일 터치를 이용한 확대 및 축소 가능 여부\n   */\n  scrollwheel?: boolean\n\n  /**\n   * 더블클릭 이벤트 및 더블클릭 확대 가능 여부\n   */\n  disableDoubleClick?: boolean\n\n  /**\n   * 더블클릭 확대 가능 여부\n   */\n  disableDoubleClickZoom?: boolean\n\n  /**\n   * 투영법 지정 (기본값: kakao.maps.ProjectionId.WCONG)\n   */\n  projectionId?: string\n\n  /**\n   * 지도 타일 애니메이션 설정 여부 (기본값: true)\n   */\n  tileAnimation?: boolean\n\n  /**\n   * 키보드의 방향키와 +, – 키로 지도 이동,확대,축소 가능 여부 (기본값: false)\n   */\n  keyboardShortcuts?:\n    | boolean\n    | {\n        /**\n         * 지도 이동 속도\n         */\n        speed: number\n      }\n\n  /**\n   * map 생성 후 해당 객체를 전달하는 함수\n   */\n  onCreate?: (map: kakao.maps.Map) => void\n\n  /**\n   * 중심 좌표가 변경되면 발생한다.\n   */\n  onCenterChanged?: (target: kakao.maps.Map) => void\n\n  /**\n   * 확대 수준이 변경되기 직전 발생한다.\n   */\n  onZoomStart?: (target: kakao.maps.Map) => void\n\n  /**\n   * 확대 수준이 변경되면 발생한다.\n   */\n  onZoomChanged?: (target: kakao.maps.Map) => void\n\n  /**\n   * 지도 영역이 변경되면 발생한다.\n   */\n  onBoundsChanged?: (target: kakao.maps.Map) => void\n\n  /**\n   * 지도를 클릭하면 발생한다.\n   */\n  onClick?: (\n    target: kakao.maps.Map,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n\n  /**\n   * 지도를 더블클릭하면 발생한다.\n   */\n  onDoubleClick?: (\n    target: kakao.maps.Map,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n\n  /**\n   * 지도를 마우스 오른쪽 버튼으로 클릭하면 발생한다.\n   */\n  onRightClick?: (\n    target: kakao.maps.Map,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n\n  /**\n   * 지도에서 마우스 커서를 이동하면 발생한다.\n   */\n  onMouseMove?: (\n    target: kakao.maps.Map,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n\n  /**\n   * 드래그를 시작할 때 발생한다.\n   */\n  onDragStart?: (\n    target: kakao.maps.Map,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n\n  /**\n   * 드래그를 하는 동안 발생한다.\n   */\n  onDrag?: (\n    target: kakao.maps.Map,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n\n  /**\n   * 드래그가 끝날 때 발생한다.\n   */\n  onDragEnd?: (\n    target: kakao.maps.Map,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n\n  /**\n   * 중심 좌표나 확대 수준이 변경되면 발생한다.\n   * 단, 애니메이션 도중에는 발생하지 않는다.\n   */\n  onIdle?: (target: kakao.maps.Map) => void\n\n  /**\n   * 확대수준이 변경되거나 지도가 이동했을때 타일 이미지 로드가 모두 완료되면 발생한다.\n   * 지도이동이 미세하기 일어나 타일 이미지 로드가 일어나지 않은경우 발생하지 않는다.\n   */\n  onTileLoaded?: (target: kakao.maps.Map) => void\n\n  /**\n   * 지도 기본 타일(일반지도, 스카이뷰, 하이브리드)이 변경되면 발생한다.\n   */\n  onMaptypeidChanged?: (target: kakao.maps.Map) => void\n\n  children?: React.ReactNode | undefined\n}\n\ntype MapComponent = <T extends React.ElementType = \"div\">(\n  props: PolymorphicComponentPropsWithOutRef<T, MapProps> &\n    React.RefAttributes<kakao.maps.Map>\n) => React.ReactElement | null\n\n/**\n * 기본적인 Map 객체를 생성하는 Comeponent 입니다.\n * props로 받는 `on*` 이벤트는 해당 `kakao.maps.Map` 객체를 함께 인자로 전달 합니다.\n *\n * `ref`를 통해 `map` 객체에 직접 접근하여 사용 또는 onCreate 이벤트를 이용하여 접근이 가능합니다.\n *\n * > *주의 사항* `Map`, `RoadView` 컴포넌트에 한하여, ref 객체가 컴포넌트 마운트 시점에 바로 초기화가 안될 수 있습니다.\n * >\n * > 컴포넌트 마운트 시점에 `useEffect` 를 활용하여, 특정 로직을 수행하고 싶은 경우 `ref` 객체를 사용하는 것보다\n * > `onCreate` 이벤트와 `useState`를 함께 활용하여 제어하는 것을 추천 드립니다.\n */\nconst Map: MapComponent = React.forwardRef(\n  <T extends React.ElementType = \"div\">(\n    {\n      id,\n      as,\n      children,\n      center,\n      isPanto = false,\n      padding = 32,\n      disableDoubleClick,\n      disableDoubleClickZoom,\n      draggable,\n      zoomable,\n      keyboardShortcuts,\n      level,\n      maxLevel,\n      minLevel,\n      mapTypeId,\n      projectionId,\n      scrollwheel,\n      tileAnimation,\n      onBoundsChanged,\n      onCenterChanged,\n      onClick,\n      onDoubleClick,\n      onDrag,\n      onDragEnd,\n      onDragStart,\n      onIdle,\n      onMaptypeidChanged,\n      onMouseMove,\n      onRightClick,\n      onTileLoaded,\n      onZoomChanged,\n      onZoomStart,\n      onCreate,\n      ...props\n    }: PolymorphicComponentPropsWithOutRef<T, MapProps>,\n    ref: React.ForwardedRef<kakao.maps.Map>\n  ) => {\n    const Container = as || \"div\"\n    const [isLoaded, setIsLoaded] = useState(false)\n    const [map, setMap] = useState<kakao.maps.Map>()\n    const container = useRef<HTMLDivElement>(null)\n\n    useIsomorphicLayoutEffect(() => {\n      Loader.isLoaded().then(setIsLoaded)\n    }, [])\n\n    useIsomorphicLayoutEffect(() => {\n      if (!isLoaded) return\n\n      const MapContainer = container.current\n\n      if (!MapContainer) {\n        return\n      }\n\n      const initalMapCenter =\n        \"lat\" in center\n          ? new kakao.maps.LatLng(center.lat, center.lng)\n          : new kakao.maps.Coords(center.x, center.y)\n\n      const kakaoMap = new kakao.maps.Map(MapContainer, {\n        center: initalMapCenter,\n        disableDoubleClick: disableDoubleClick,\n        disableDoubleClickZoom: disableDoubleClickZoom,\n        draggable: draggable,\n        keyboardShortcuts: keyboardShortcuts,\n        level: level,\n        mapTypeId: mapTypeId,\n        projectionId: projectionId,\n        scrollwheel: scrollwheel,\n        tileAnimation: tileAnimation,\n      })\n\n      setMap(kakaoMap)\n\n      return () => {\n        MapContainer.innerHTML = \"\"\n      }\n    }, [\n      isLoaded,\n      disableDoubleClick,\n      disableDoubleClickZoom,\n      mapTypeId,\n      tileAnimation,\n    ])\n\n    useImperativeHandle(ref, () => map!, [map])\n\n    useIsomorphicLayoutEffect(() => {\n      if (!map || !onCreate) return\n      onCreate(map)\n    }, [map, onCreate])\n\n    // center position 변경시 map center 변경\n    useIsomorphicLayoutEffect(() => {\n      if (!map) return\n\n      let prevCenter = map.getCenter()\n      if (prevCenter instanceof kakao.maps.Coords) {\n        prevCenter = prevCenter.toLatLng()\n      }\n\n      const centerPosition =\n        \"lat\" in center\n          ? new kakao.maps.LatLng(center.lat, center.lng)\n          : new kakao.maps.Coords(center.x, center.y)\n\n      if (\n        (centerPosition instanceof kakao.maps.LatLng &&\n          centerPosition.equals(prevCenter)) ||\n        (centerPosition instanceof kakao.maps.Coords &&\n          centerPosition.toLatLng().equals(prevCenter))\n      ) {\n        return\n      }\n\n      if (isPanto) {\n        map.panTo(centerPosition, padding)\n      } else {\n        map.setCenter(centerPosition)\n      }\n      // @ts-ignore\n    }, [map, center.lat, center.lng, center.x, center.y])\n\n    useIsomorphicLayoutEffect(() => {\n      if (!map || typeof draggable === \"undefined\") return\n      map.setDraggable(draggable)\n    }, [map, draggable])\n\n    useIsomorphicLayoutEffect(() => {\n      if (!map || typeof zoomable === \"undefined\") return\n      map.setZoomable(zoomable)\n    }, [map, zoomable])\n\n    useIsomorphicLayoutEffect(() => {\n      if (!map || !keyboardShortcuts || typeof keyboardShortcuts !== \"boolean\")\n        return\n      map.setKeyboardShortcuts(keyboardShortcuts)\n    }, [map, keyboardShortcuts])\n\n    useIsomorphicLayoutEffect(() => {\n      if (!map || !level) return\n      map.setLevel(level)\n    }, [map, level])\n\n    useIsomorphicLayoutEffect(() => {\n      if (!map || !mapTypeId) return\n      map.setMapTypeId(mapTypeId)\n    }, [map, mapTypeId])\n\n    useIsomorphicLayoutEffect(() => {\n      if (!map || !projectionId) return\n      map.setProjectionId(projectionId)\n    }, [map, projectionId])\n\n    useIsomorphicLayoutEffect(() => {\n      if (!map || !maxLevel) return\n      map.setMaxLevel(maxLevel)\n    }, [map, maxLevel])\n\n    useIsomorphicLayoutEffect(() => {\n      if (!map || !minLevel) return\n      map.setMinLevel(minLevel)\n    }, [map, minLevel])\n\n    useKakaoEvent(map, \"bounds_changed\", onBoundsChanged)\n    useKakaoEvent(map, \"center_changed\", onCenterChanged)\n    useKakaoEvent(map, \"click\", onClick)\n    useKakaoEvent(map, \"dblclick\", onDoubleClick)\n    useKakaoEvent(map, \"drag\", onDrag)\n    useKakaoEvent(map, \"dragstart\", onDragStart)\n    useKakaoEvent(map, \"dragend\", onDragEnd)\n    useKakaoEvent(map, \"idle\", onIdle)\n    useKakaoEvent(map, \"maptypeid_changed\", onMaptypeidChanged)\n    useKakaoEvent(map, \"mousemove\", onMouseMove)\n    useKakaoEvent(map, \"rightclick\", onRightClick)\n    useKakaoEvent(map, \"tilesloaded\", onTileLoaded)\n    useKakaoEvent(map, \"zoom_changed\", onZoomChanged)\n    useKakaoEvent(map, \"zoom_start\", onZoomStart)\n\n    return (\n      <>\n        <Container\n          id={id || \"react-kakao-maps-sdk-map-container\"}\n          {...props}\n          ref={container}\n        />\n        {map && (\n          <KakaoMapContext.Provider value={map}>\n            {children}\n          </KakaoMapContext.Provider>\n        )}\n      </>\n    )\n  }\n)\n\nexport default Map\n","import { useContext } from \"react\"\nimport { KakaoMapContext } from \"../components/Map\"\n\n/**\n * kakao map 객체를 가져오는 hook 입니다.\n * Map 객체 내부가 아니라면 Error를 발생 시킵니다.\n */\nconst useMap = (componentName?: string) => {\n  const kakaoMap = useContext(KakaoMapContext)\n  if (!kakaoMap) {\n    throw new Error(\n      `${\n        componentName ? componentName + \" Component\" : \"useMap\"\n      } must exist inside Map Component!`\n    )\n  }\n\n  return kakaoMap\n}\n\nexport default useMap\n","import React, {\n  useLayoutEffect,\n  useImperativeHandle,\n  useMemo,\n  useRef,\n} from \"react\"\nimport ReactDom from \"react-dom\"\n\ninterface InfoWindowProps {\n  map: kakao.maps.Map | kakao.maps.Roadview\n  position: kakao.maps.LatLng | kakao.maps.Viewpoint\n  marker?: kakao.maps.Marker\n  /**\n   * 인포윈도우를 열 때 지도가 자동으로 패닝하지 않을지의 여부\n   * @default false\n   */\n  disableAutoPan?: boolean\n\n  /**\n   * 삭제 가능한 인포윈도우\n   */\n  removable?: boolean\n\n  /**\n   * 인포윈도우 엘리먼트의 z-index 속성 값\n   */\n  zIndex?: number\n\n  /**\n   * 로드뷰에 올라있는 인포윈도우의 높이 값(m 단위)\n   */\n  altitude?: number\n\n  /**\n   * 로드뷰 상에서 인포윈도우의 가시반경(m 단위), 두 지점 사이의 거리가 지정한 값보다 멀어지면 인포윈도우는 보이지 않게 된다\n   */\n  range?: number\n\n  /**\n   * 인포윈도우 객체 생성후 해당 객체를 반환하는 함수\n   */\n  onCreate?: (infoWindow: kakao.maps.InfoWindow) => void\n}\n\nconst InfoWindow = React.forwardRef<\n  kakao.maps.InfoWindow,\n  React.PropsWithChildren<InfoWindowProps>\n>(\n  (\n    {\n      map,\n      position,\n      marker,\n      children,\n      altitude,\n      disableAutoPan,\n      range,\n      removable,\n      zIndex,\n      onCreate,\n    },\n    ref\n  ) => {\n    const container = useRef(document.createElement(\"div\"))\n\n    const infoWindow = useMemo(() => {\n      const kakaoInfoWindow = new kakao.maps.InfoWindow({\n        altitude: altitude,\n        disableAutoPan: disableAutoPan,\n        range: range,\n        removable: removable,\n        zIndex: zIndex,\n        content: container.current,\n        position: position,\n      })\n      container.current.style.display = \"none\"\n      return kakaoInfoWindow\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [disableAutoPan, removable])\n\n    useImperativeHandle(ref, () => infoWindow, [infoWindow])\n\n    useLayoutEffect(() => {\n      infoWindow.open(map, marker)\n      return () => {\n        infoWindow.close()\n      }\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [map, marker])\n\n    useLayoutEffect(() => {\n      if (onCreate) onCreate(infoWindow)\n    }, [infoWindow, onCreate])\n\n    useLayoutEffect(() => {\n      if (!infoWindow) return\n      infoWindow.setPosition(position)\n    }, [infoWindow, position])\n\n    useLayoutEffect(() => {\n      if (!infoWindow || !altitude) return\n      infoWindow.setAltitude(altitude)\n    }, [infoWindow, altitude])\n\n    useLayoutEffect(() => {\n      if (!infoWindow || !range) return\n      infoWindow.setRange(range)\n    }, [infoWindow, range])\n\n    useLayoutEffect(() => {\n      if (!infoWindow || !zIndex) return\n      infoWindow.setZIndex(zIndex)\n    }, [infoWindow, zIndex])\n\n    return (\n      container.current.parentElement &&\n      ReactDom.createPortal(children, container.current.parentElement)\n    )\n  }\n)\n\nexport default InfoWindow\n","import React, { useLayoutEffect, useImperativeHandle, useMemo, useContext } from \"react\"\nimport useKakaoEvent from \"../hooks/useKakaoEvent\"\nimport useMap from \"../hooks/useMap\"\nimport useIsomorphicLayoutEffect from \"../hooks/useIsomorphicLayoutEffect\"\n\nexport const KakaoMapMarkerClustererContext =\n  React.createContext<kakao.maps.MarkerClusterer>(\n    undefined as unknown as kakao.maps.MarkerClusterer\n  )\n\nexport interface MarkerClustererProps {\n  /**\n   * 클러스터의 격자 크기. 화면 픽셀 단위이며 해당 격자 영역 안에 마커가 포함되면 클러스터에 포함시킨다\n   * @default 60\n   */\n  gridSize?: number\n  /**\n   * 마커들의 좌표 평균을 클러스터 좌표 설정 여부\n   * @default false\n   */\n  averageCenter?: boolean\n  /**\n   * 클러스터링 할 지도의 최소 레벨 값. 지정한 숫자에 해당하는 레벨 미만에서는 클러스터링 하지 않는다\n   * @default 0\n   */\n  minLevel?: number\n  /**\n   * 클러스터링 할 최소 마커 수\n   * @default 2\n   */\n  minClusterSize?: number\n  /**\n   * 클러스터의 스타일. 여러개를 선언하면 calculator 로 구분된 사이즈 구간마다 서로 다른 스타일을 적용시킬 수 있다\n   */\n  styles?: React.CSSProperties[] | object[]\n  /**\n   * 클러스터에 표시할 문자열 또는 문자열 생성 함수.\n   * @default \"클러스터에 포함된 숫자\"\n   */\n  texts?: string[] | ((size: number) => string)\n  /**\n   * 클러스터 크기를 구분하는 값을 가진 배열 또는 구분값 생성함수\n   * @default [10, 100, 1000, 10000]\n   */\n  calculator?: number[] | ((size: number) => number[])\n  /**\n   * 클러스터 클릭 시 지도 확대 여부. true로 설정하면 클러스터 클릭 시 확대 되지 않는다\n   * @default false\n   */\n  disableClickZoom?: boolean\n  /**\n   * 클러스터 클릭 가능 여부 지정 옵션. false일 경우 클러스터의 clusterclick, clusterdblclick, clusterrightclick 이벤트가 발생하지 않으며, 커서가 변경되지 않는다.\n   * @default true\n   */\n  clickable?: boolean\n  /**\n   * 클러스터에 마우스 over/out 가능 여부 지정 옵션. false일 경우 클러스터의 clusterover, clusterout 이벤트가 발생하지 않는다.\n   * @default true\n   */\n  hoverable?: boolean\n\n  /**\n   * 클러스터 마커를 클릭 했을 때 발생한다.\n   * 이벤트 핸들러 함수 인자로는 Cluster 객체가 넘어온다.\n   * 클러스터 마커 클릭 시 지도가 줌인 되는 경우 원하는 Cluster 객체를 얻지 못할 수도 있다.\n   * 때문에 MarkerClusterer 를 생성할 때 disableClickZoom 옵션을 true로 설정하여\n   * 클러스터 마커를 클릭했을 때 지도가 줌인되지 않도록 설정 후 사용한다.\n   */\n  onClusterclick?: (\n    target: kakao.maps.MarkerClusterer,\n    cluster: kakao.maps.Cluster\n  ) => void\n  /**\n   * 클러스터 마커를 마우스 오버 했을 때 발생한다\n   * 이벤트 핸들러 함수 인자로는 마우스 오버한 Cluster 객체가 넘어온다.\n   */\n  onClusterover?: (\n    target: kakao.maps.MarkerClusterer,\n    cluster: kakao.maps.Cluster\n  ) => void\n  /**\n   * 클러스터 마커를 마우스 아웃 했을 때 발생한다\n   * 이벤트 핸들러 함수 인자로는 마우스 아웃된 Cluster 객체가 넘어온다.\n   */\n  onClusterout?: (\n    target: kakao.maps.MarkerClusterer,\n    cluster: kakao.maps.Cluster\n  ) => void\n  /**\n   * 클러스터 마커를 더블클릭 했을 때 발생한다\n   * 이벤트 핸들러 함수 인자로는 더블클릭한 Cluster 객체가 넘어온다.\n   * MarkerClusterer 를 생성할 때 disableClickZoom 옵션을 true로 설정해야만 이벤트가 발생한다.\n   */\n  onClusterdblclick?: (\n    target: kakao.maps.MarkerClusterer,\n    cluster: kakao.maps.Cluster\n  ) => void\n  /**\n   * 클러스터 마커를 오른쪽 클릭 했을 때 발생한다\n   * 이벤트 핸들러 함수 인자로는 오른쪽 클릭한 Cluster 객체가 넘어온다.\n   */\n  onClusterrightclick?: (\n    target: kakao.maps.MarkerClusterer,\n    cluster: kakao.maps.Cluster\n  ) => void\n  /**\n   * 클러스터링이 완료됐을 때 발생한다.\n   * 이벤트 핸들러 함수 인자로는 생성된 Cluster 객체 전체가 배열로 넘어온다.\n   */\n  onClustered?: (\n    target: kakao.maps.MarkerClusterer,\n    clusters: kakao.maps.Cluster[]\n  ) => void\n  /**\n   * MarkerClusterer 생성 후 해당 객체를 전달하는 함수\n   */\n  onCreate?: (target: kakao.maps.MarkerClusterer) => void\n}\n\nconst MarkerClusterer = React.forwardRef<\n  kakao.maps.MarkerClusterer,\n  React.PropsWithChildren<MarkerClustererProps>\n>(\n  (\n    {\n      children,\n      averageCenter,\n      calculator,\n      clickable,\n      disableClickZoom,\n      gridSize,\n      hoverable,\n      minClusterSize,\n      minLevel,\n      styles,\n      texts,\n      onClusterclick,\n      onClusterdblclick,\n      onClustered,\n      onClusterout,\n      onClusterover,\n      onClusterrightclick,\n      onCreate,\n    },\n    ref\n  ) => {\n    const map = useMap(`MarkerClusterer`)\n    const markerClusterer = useMemo(() => {\n      if (!window.kakao.maps.MarkerClusterer) {\n        console.warn(\n          \"clusterer 라이브러리를 별도 로드 해야 사용 가능합니다. `https://apis.map.kakao.com/web/guide/#loadlibrary`\"\n        )\n        return\n      }\n      return new kakao.maps.MarkerClusterer({\n        averageCenter,\n        calculator,\n        clickable,\n        disableClickZoom,\n        gridSize,\n        hoverable,\n        minClusterSize,\n        minLevel,\n        styles,\n        texts,\n      })\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [])\n\n    useImperativeHandle(ref, () => markerClusterer!, [markerClusterer])\n\n    useLayoutEffect(() => {\n      markerClusterer?.setMap(map)\n    }, [map, markerClusterer])\n\n    useLayoutEffect(() => {\n      if (markerClusterer && onCreate) onCreate(markerClusterer)\n    }, [markerClusterer, onCreate])\n\n    useLayoutEffect(() => {\n      if (markerClusterer && gridSize) {\n        markerClusterer.setGridSize(gridSize)\n        markerClusterer.redraw()\n      }\n    }, [markerClusterer, gridSize])\n\n    useLayoutEffect(() => {\n      if (markerClusterer && minClusterSize) {\n        markerClusterer.setMinClusterSize(minClusterSize)\n        markerClusterer.redraw()\n      }\n    }, [markerClusterer, minClusterSize])\n\n    useLayoutEffect(() => {\n      if (markerClusterer && typeof averageCenter !== \"undefined\") {\n        markerClusterer.setAverageCenter(averageCenter)\n        markerClusterer.redraw()\n      }\n    }, [markerClusterer, averageCenter])\n\n    useLayoutEffect(() => {\n      if (markerClusterer && minLevel) {\n        markerClusterer.setMinLevel(minLevel)\n        markerClusterer.redraw()\n      }\n    }, [markerClusterer, minLevel])\n\n    useLayoutEffect(() => {\n      if (markerClusterer && texts) {\n        markerClusterer.setTexts(texts)\n        markerClusterer.redraw()\n      }\n    }, [markerClusterer, texts])\n\n    useLayoutEffect(() => {\n      if (markerClusterer && calculator) {\n        markerClusterer.setCalculator(calculator)\n        markerClusterer.redraw()\n      }\n    }, [markerClusterer, calculator])\n\n    useKakaoEvent(markerClusterer, \"clustered\", onClustered)\n    useKakaoEvent(markerClusterer, \"clusterclick\", onClusterclick)\n    useKakaoEvent(markerClusterer, \"clusterover\", onClusterover)\n    useKakaoEvent(markerClusterer, \"clusterout\", onClusterout)\n    useKakaoEvent(markerClusterer, \"clusterdblclick\", onClusterdblclick)\n    useKakaoEvent(markerClusterer, \"clusterrightclick\", onClusterrightclick)\n\n    useLayoutEffect(() => {\n      if (markerClusterer && styles) {\n        markerClusterer.setStyles(styles)\n        markerClusterer.redraw()\n      }\n    }, [markerClusterer, styles])\n\n\n\n    if (!markerClusterer) {\n      return null\n    }\n\n    return (\n      <KakaoMapMarkerClustererContext.Provider value={markerClusterer}>\n        {children}\n        <MarkerClustererRedraw children={children} />\n      </KakaoMapMarkerClustererContext.Provider>\n    )\n  }\n)\n\nconst MarkerClustererRedraw: React.FC<{ children: React.ReactNode }> = ({ children: _ }) => {\n  const markerClusterer = useContext(KakaoMapMarkerClustererContext)\n  useIsomorphicLayoutEffect(() => {\n    markerClusterer.redraw()\n  })\n  return null\n}\n\nexport default MarkerClusterer\n","import React, {\n  useContext,\n  useImperativeHandle,\n  useLayoutEffect,\n  useMemo,\n} from \"react\"\nimport useKakaoEvent from \"../hooks/useKakaoEvent\"\nimport InfoWindow from \"./InfoWindow\"\nimport { KakaoMapMarkerClustererContext } from \"./MarkerClusterer\"\n\ninterface MarkerProps {\n  map: kakao.maps.Map | kakao.maps.Roadview\n  position: kakao.maps.LatLng | kakao.maps.Viewpoint\n\n  /**\n   * marker 생성 후 marker 객체를 전달하는 callback\n   */\n  onCreate?: (marker: kakao.maps.Marker) => void\n\n  /**\n   * click 이벤트 핸들러\n   */\n  onClick?: (marker: kakao.maps.Marker) => void\n\n  /**\n   * mouseover 이벤트 핸들러\n   */\n  onMouseOver?: (marker: kakao.maps.Marker) => void\n\n  /**\n   * mouseout 이벤트 핸들러\n   */\n  onMouseOut?: (marker: kakao.maps.Marker) => void\n\n  /**\n   * dragstart 이벤트 핸들러\n   */\n  onDragStart?: (marker: kakao.maps.Marker) => void\n\n  /**\n   * dragend 이벤트 핸들러\n   */\n  onDragEnd?: (marker: kakao.maps.Marker) => void\n\n  /**\n   * 마커의 이미지\n   */\n  image?: kakao.maps.MarkerImage\n\n  /**\n   * 마커 엘리먼트의 타이틀 속성 값 (툴팁)\n   */\n  title?: string\n\n  /**\n   * 드래그 가능한 마커, 로드뷰에 올릴 경우에는 유효하지 않다.\n   */\n  draggable?: boolean\n\n  /**\n   * 클릭 가능한 마커\n   */\n  clickable?: boolean\n\n  /**\n   * 마커 엘리먼트의 z-index 속성 값\n   */\n  zIndex?: number\n\n  /**\n   * 마커 투명도 (0-1)\n   */\n  opacity?: number\n\n  /**\n   * 로드뷰에 올라있는 마커의 높이 값(m 단위)\n   */\n  altitude?: number\n\n  /**\n   * 로드뷰 상에서 마커의 가시반경(m 단위), 두 지점 사이의 거리가 지정한 값보다 멀어지면 마커는 로드뷰에서 보이지 않게 된다.\n   */\n  range?: number\n\n  /**\n   * InfoWindow 옵션\n   */\n  infoWindowOptions?: {\n    /**\n     * 인포윈도우를 열 때 지도가 자동으로 패닝하지 않을지의 여부 (기본값: false)\n     */\n    disableAutoPan?: boolean\n\n    /**\n     * 삭제 가능한 인포윈도우\n     */\n    removable?: boolean\n\n    /**\n     * 인포윈도우 엘리먼트의 z-index 속성 값\n     */\n    zIndex?: number\n\n    /**\n     * 로드뷰에 올라있는 인포윈도우의 높이 값(m 단위)\n     */\n    altitude?: number\n\n    /**\n     * 로드뷰 상에서 인포윈도우의 가시반경(m 단위), 두 지점 사이의 거리가 지정한 값보다 멀어지면 인포윈도우는 보이지 않게 된다\n     */\n    range?: number\n  }\n}\n\nconst Marker = React.forwardRef<\n  kakao.maps.Marker,\n  React.PropsWithChildren<MarkerProps>\n>(\n  (\n    {\n      map,\n      position,\n      children,\n      altitude,\n      clickable,\n      draggable,\n      image,\n      infoWindowOptions,\n      onCreate,\n      onClick,\n      onDragEnd,\n      onDragStart,\n      onMouseOut,\n      onMouseOver,\n      opacity,\n      range,\n      title,\n      zIndex,\n    },\n    ref\n  ) => {\n    const markerCluster = useContext(KakaoMapMarkerClustererContext)\n\n    // Marker 객체는 단 한번만 생성 되도록 함\n    const marker = useMemo(() => {\n      const kakaoMarker = new kakao.maps.Marker({\n        altitude,\n        clickable,\n        draggable,\n        image,\n        opacity,\n        range,\n        title,\n        zIndex,\n        position,\n      })\n\n      return kakaoMarker\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [])\n\n    useImperativeHandle(ref, () => marker, [marker])\n\n    useLayoutEffect(() => {\n      if (markerCluster) {\n        markerCluster.addMarker(marker, true)\n      } else {\n        marker.setMap(map)\n      }\n\n      return () => {\n        if (markerCluster) {\n          markerCluster.removeMarker(marker, true)\n        } else {\n          marker.setMap(null)\n        }\n      }\n    }, [map, markerCluster, marker])\n\n    useLayoutEffect(() => {\n      if (onCreate) onCreate(marker)\n    }, [marker, onCreate])\n\n    useKakaoEvent(marker, \"click\", onClick)\n    useKakaoEvent(marker, \"dragstart\", onDragStart)\n    useKakaoEvent(marker, \"dragend\", onDragEnd)\n    useKakaoEvent(marker, \"mouseout\", onMouseOut)\n    useKakaoEvent(marker, \"mouseover\", onMouseOver)\n\n    // position이 변경되면 객체를 갱신한다.\n    useLayoutEffect(() => {\n      if (!map || !marker || !position) return\n\n      marker.setPosition(position)\n    }, [map, marker, position])\n\n    // image 객체가 존재하면 이미지를 로드한다\n    useLayoutEffect(() => {\n      if (!map || !marker || !image) return\n\n      marker.setImage(image)\n    }, [map, marker, image])\n\n    // altitude 값이 있으면 높이를 조정한다\n    useLayoutEffect(() => {\n      if (!map || !marker || !altitude) return\n\n      marker.setAltitude(altitude)\n    }, [map, marker, altitude])\n\n    // clickable 값이 있으면 클릭이 가능하도록 한다.\n    useLayoutEffect(() => {\n      if (!map || !marker || typeof clickable === \"undefined\") return\n\n      marker.setClickable(clickable)\n    }, [map, marker, clickable])\n\n    // draggable 값이 있으면 드래그가 가능하도록 한다.\n    useLayoutEffect(() => {\n      if (!map || !marker || typeof draggable === \"undefined\") return\n\n      marker.setDraggable(draggable)\n    }, [map, marker, draggable])\n\n    // opacity 값이 있으면 투명도를 조절한다.\n    useLayoutEffect(() => {\n      if (!map || !marker || !opacity) return\n\n      marker.setOpacity(opacity)\n    }, [map, marker, opacity])\n\n    // range 값이 있으면 마커의 가시반경을 조절한다.\n    useLayoutEffect(() => {\n      if (!map || !marker || !range) return\n\n      marker.setRange(range)\n    }, [map, marker, range])\n\n    // title 값이 있으면 마커의 제목을 조절한다.\n    useLayoutEffect(() => {\n      if (!map || !marker || !title) return\n\n      marker.setTitle(title)\n    }, [map, marker, title])\n\n    // zIndex 값이 있으면 마커의 zindex를 조절한다.\n    useLayoutEffect(() => {\n      if (!map || !marker || !zIndex) return\n\n      marker.setZIndex(zIndex)\n    }, [map, marker, zIndex])\n\n    if (children)\n      return (\n        <InfoWindow\n          position={position}\n          map={map}\n          marker={marker}\n          altitude={infoWindowOptions?.altitude}\n          disableAutoPan={infoWindowOptions?.disableAutoPan}\n          range={infoWindowOptions?.range}\n          removable={infoWindowOptions?.removable}\n          zIndex={infoWindowOptions?.zIndex}\n        >\n          {children}\n        </InfoWindow>\n      )\n\n    return null\n  }\n)\n\nexport default Marker\n","import React, { useMemo } from \"react\"\nimport useMap from \"../hooks/useMap\"\nimport Marker from \"./Marker\"\n\nexport interface MapMarkerProps {\n  /**\n   * 표시 위치\n   */\n  position:\n    | {\n        lat: number\n        lng: number\n      }\n    | {\n        x: number\n        y: number\n      }\n\n  image?: {\n    /**\n     * 표시 이미지 src\n     */\n    src: string\n\n    /**\n     * 표시 이미지 크기\n     */\n    size: {\n      width: number\n      height: number\n    }\n\n    options?: {\n      /**\n       * 마커 이미지의 alt 속성값을 정의한다.\n       */\n      alt?: string\n\n      /**\n       * 마커의 클릭 또는 마우스오버 가능한 영역을 표현하는 좌표값\n       */\n      coords?: string\n\n      /**\n       * 마커의 좌표에 일치시킬 이미지 안의 좌표 (기본값: 이미지의 가운데 아래)\n       */\n      offset?: { x: number; y: number }\n\n      /**\n       * 마커의 클릭 또는 마우스오버 가능한 영역의 모양\n       */\n      shape?: \"default\" | \"rect\" | \"circle\" | \"poly\"\n\n      /**\n       * 스프라이트 이미지 중 사용할 영역의 좌상단 좌표\n       */\n      spriteOrigin?: { x: number; y: number }\n\n      /**\n       * 스프라이트 이미지의 전체 크기\n       */\n      spriteSize?: { width: number; height: number }\n    }\n  }\n\n  /**\n   * click 이벤트 핸들러\n   */\n  onClick?: (marker: kakao.maps.Marker) => void\n\n  /**\n   * mouseover 이벤트 핸들러\n   */\n  onMouseOver?: (marker: kakao.maps.Marker) => void\n\n  /**\n   * mouseout 이벤트 핸들러\n   */\n  onMouseOut?: (marker: kakao.maps.Marker) => void\n\n  /**\n   * dragstart 이벤트 핸들러\n   */\n  onDragStart?: (marker: kakao.maps.Marker) => void\n\n  /**\n   * dragend 이벤트 핸들러\n   */\n  onDragEnd?: (marker: kakao.maps.Marker) => void\n\n  /**\n   * Maker 생성 이벤트 핸들러\n   */\n  onCreate?: (maker: kakao.maps.Marker) => void\n\n  /**\n   * 마커 엘리먼트의 타이틀 속성 값 (툴팁)\n   */\n  title?: string\n\n  /**\n   * 드래그 가능한 마커, 로드뷰에 올릴 경우에는 유효하지 않다.\n   */\n  draggable?: boolean\n\n  /**\n   * 클릭 가능한 마커\n   */\n  clickable?: boolean\n\n  /**\n   * 마커 엘리먼트의 z-index 속성 값\n   */\n  zIndex?: number\n\n  /**\n   * 마커 투명도 (0-1)\n   */\n  opacity?: number\n\n  /**\n   * InfoWindow 옵션\n   */\n  infoWindowOptions?: {\n    /**\n     * 인포윈도우를 열 때 지도가 자동으로 패닝하지 않을지의 여부 (기본값: false)\n     */\n    disableAutoPan?: boolean\n\n    /**\n     * 삭제 가능한 인포윈도우\n     */\n    removable?: boolean\n\n    /**\n     * 인포윈도우 엘리먼트의 z-index 속성 값\n     */\n    zIndex?: number\n  }\n}\n\n/**\n * Map에서 Marker를 생성할 때 사용 합니다.\n * `onCreate` 이벤트를 통해 생성 후 `maker` 객체에 직접 접근하여 초기 설정이 가능합니다.\n */\nconst MapMarker = React.forwardRef<\n  kakao.maps.Marker,\n  React.PropsWithChildren<MapMarkerProps>\n>(\n  (\n    {\n      image,\n      position,\n      children,\n      clickable,\n      draggable,\n      infoWindowOptions,\n      onClick,\n      onDragEnd,\n      onDragStart,\n      onMouseOut,\n      onMouseOver,\n      onCreate,\n      opacity,\n      title,\n      zIndex,\n    },\n    ref\n  ) => {\n    const map = useMap(`MapMarker`)\n\n    const markerImage = useMemo(() => {\n      return (\n        image &&\n        new kakao.maps.MarkerImage(\n          image.src,\n          new kakao.maps.Size(image.size.width, image.size.height),\n          {\n            alt: image.options?.alt,\n            coords: image.options?.coords,\n            offset:\n              image.options?.offset &&\n              new kakao.maps.Point(\n                image.options?.offset.x,\n                image.options?.offset.y\n              ),\n            shape: image.options?.shape,\n            spriteOrigin:\n              image.options?.spriteOrigin &&\n              new kakao.maps.Point(\n                image.options?.spriteOrigin.x,\n                image.options?.spriteOrigin.y\n              ),\n            spriteSize:\n              image.options?.spriteSize &&\n              new kakao.maps.Size(\n                image.options?.spriteSize.width,\n                image.options?.spriteSize.height\n              ),\n          }\n        )\n      )\n    }, [image])\n\n    const markerPosition = useMemo(() => {\n      if (\"lat\" in position) {\n        return new kakao.maps.LatLng(position.lat, position.lng)\n      }\n      return new kakao.maps.Coords(position.x, position.y).toLatLng()\n\n      // @ts-ignore\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [position.lat, position.lng, position.x, position.y])\n\n    return (\n      <Marker\n        map={map}\n        position={markerPosition}\n        image={markerImage}\n        clickable={clickable}\n        draggable={draggable}\n        infoWindowOptions={infoWindowOptions}\n        onClick={onClick}\n        onDragEnd={onDragEnd}\n        onDragStart={onDragStart}\n        onMouseOut={onMouseOut}\n        onMouseOver={onMouseOver}\n        onCreate={onCreate}\n        opacity={opacity}\n        title={title}\n        zIndex={zIndex}\n        ref={ref}\n      >\n        {children}\n      </Marker>\n    )\n  }\n)\n\nexport default MapMarker\n","import React, { useMemo } from \"react\"\nimport InfoWindow from \"./InfoWindow\"\nimport useMap from \"../hooks/useMap\"\n\nexport interface MapInfoWindowProps {\n  /**\n   * Contianer id에 대해서 지정합니다.\n   */\n  id?: string\n\n  /**\n   * Contianer className에 대해서 지정합니다.\n   */\n  className?: string\n\n  /**\n   * Contianer style에 대해서 지정합니다.\n   */\n  style?: React.CSSProperties\n\n  /**\n   * 인포윈도가 표시될 위치\n   */\n  position: {\n    lat: number\n    lng: number\n  }\n  /**\n   * 인포윈도우를 열 때 지도가 자동으로 패닝하지 않을지의 여부 (기본값: false)\n   */\n  disableAutoPan?: boolean\n\n  /**\n   * 삭제 가능한 인포윈도우\n   */\n  removable?: boolean\n\n  /**\n   * 인포윈도우 엘리먼트의 z-index 속성 값\n   */\n  zIndex?: number\n\n  /**\n   * 인포윈도우 객체 생성후 해당 객체를 반환하는 함수\n   */\n  onCreate?: (infoWindow: kakao.maps.InfoWindow) => void\n}\n\n/**\n * Map 컴포넌트에서 InfoWindow를 그릴 때 사용됩니다.\n * `onCreate` 이벤트를 통해 생성 후 `infoWindow` 객체에 직접 접근하여 초기 설정이 가능합니다.\n */\nconst MapInfoWindow = React.forwardRef<\n  kakao.maps.InfoWindow,\n  React.PropsWithChildren<MapInfoWindowProps>\n>(\n  (\n    { position, children, disableAutoPan, removable, zIndex, onCreate },\n    ref\n  ) => {\n    const map = useMap(`MapInfoWindow`)\n    const infoPosition = useMemo(() => {\n      return new kakao.maps.LatLng(position.lat, position.lng)\n    }, [position.lat, position.lng])\n\n    return (\n      <InfoWindow\n        disableAutoPan={disableAutoPan}\n        removable={removable}\n        zIndex={zIndex}\n        map={map}\n        position={infoPosition}\n        onCreate={onCreate}\n        ref={ref}\n      >\n        {children}\n      </InfoWindow>\n    )\n  }\n)\n\nexport default MapInfoWindow\n","import React, {\n  useContext,\n  useImperativeHandle,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n} from \"react\"\nimport ReactDOM from \"react-dom\"\nimport useMap from \"../hooks/useMap\"\nimport { KakaoMapMarkerClustererContext } from \"./MarkerClusterer\"\n\nexport interface CustomOverlayMapProps {\n  /**\n   * 커스텀 오버레이의 좌표\n   */\n  position: {\n    lat: number\n    lng: number\n  }\n  /**\n   * true 로 설정하면 컨텐츠 영역을 클릭했을 경우 지도 이벤트를 막아준다.\n   */\n  clickable?: boolean\n\n  /**\n   * 컨텐츠의 x축 위치. 0_1 사이의 값을 가진다. 기본값은 0.5\n   */\n  xAnchor?: number\n\n  /**\n   * 컨텐츠의 y축 위치. 0_1 사이의 값을 가진다. 기본값은 0.5\n   */\n  yAnchor?: number\n\n  /**\n   * 커스텀 오버레이의 z-index\n   */\n  zIndex?: number\n\n  /**\n   * 커스텀 오버레이를 생성 후 해당 객체를 가지고 callback 함수를 실행 시켜줌\n   */\n  onCreate?: (customOverlay: kakao.maps.CustomOverlay) => void\n}\n\n/**\n * Map에 CustomOverlay를 올릴 때 사용하는 컴포넌트 입니다.\n * `onCreate` 이벤트 또는 `ref` 객체를 통해서 `CustomOverlay` 객체에 직접 접근 및 초기 설정 작업을 지정할 수 있습니다.\n */\nconst CustomOverlayMap = React.forwardRef<\n  kakao.maps.CustomOverlay,\n  React.PropsWithChildren<CustomOverlayMapProps>\n>(\n  (\n    { position, children, clickable, xAnchor, yAnchor, zIndex, onCreate },\n    ref\n  ) => {\n    const markerCluster = useContext(KakaoMapMarkerClustererContext)\n\n    const map = useMap(`CustomOverlayMap`)\n    const container = useRef(document.createElement(\"div\"))\n\n    const overlayPosition = useMemo(() => {\n      return new kakao.maps.LatLng(position.lat, position.lng)\n    }, [position.lat, position.lng])\n\n    const overlay = useMemo(() => {\n      const KakaoCustomOverlay = new kakao.maps.CustomOverlay({\n        clickable: clickable,\n        xAnchor: xAnchor,\n        yAnchor: yAnchor,\n        zIndex: zIndex,\n        position: overlayPosition,\n        content: container.current,\n      })\n      container.current.style.display = \"none\"\n\n      return KakaoCustomOverlay\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [clickable, xAnchor, yAnchor])\n\n    useImperativeHandle(ref, () => overlay, [overlay])\n\n    useLayoutEffect(() => {\n      if (!map) return\n\n      if (markerCluster) {\n        markerCluster.addMarker(overlay, true)\n      } else {\n        overlay.setMap(map)\n      }\n\n      return () => {\n        if (markerCluster) {\n          markerCluster.removeMarker(overlay, true)\n        } else {\n          overlay.setMap(null)\n        }\n      }\n    }, [map, markerCluster, overlay])\n\n    useLayoutEffect(() => {\n      if (onCreate) onCreate(overlay)\n    }, [overlay, onCreate])\n\n    useLayoutEffect(() => {\n      overlay.setPosition(overlayPosition)\n    }, [overlay, overlayPosition])\n\n    useLayoutEffect(() => {\n      if (!zIndex) return\n      overlay.setZIndex(zIndex)\n    }, [overlay, zIndex])\n\n    return (\n      container.current.parentElement &&\n      ReactDOM.createPortal(children, container.current.parentElement)\n    )\n  }\n)\n\nexport default CustomOverlayMap\n","import React, { useImperativeHandle, useLayoutEffect, useMemo } from \"react\"\nimport useMap from \"../hooks/useMap\"\n\nexport interface MapTypeControlProps {\n  /**\n   * MapTypeControl의 Position를 정의 한다.\n   */\n  position?: kakao.maps.ControlPosition\n}\n\n/**\n * 일반 지도/하이브리드 간 지도 타입 전환 컨트롤을 생성한다.\n * 현재는 일반 지도/하이브리드 간 전환 컨트롤만 지원되며 다른 지도 타입을 제어하는 컨트롤이 필요할 경우에는 직접 구현해야 한다.\n */\nconst MapTypeControl = React.forwardRef<\n  kakao.maps.MapTypeControl,\n  MapTypeControlProps\n>(({ position = kakao.maps.ControlPosition.TOPRIGHT }, ref) => {\n  const map = useMap(`MapTypeControl`)\n\n  const mapTypeControl = useMemo(() => {\n    return new kakao.maps.MapTypeControl()\n  }, [])\n\n  useImperativeHandle(ref, () => mapTypeControl, [mapTypeControl])\n\n  useLayoutEffect(() => {\n    map.addControl(mapTypeControl, position)\n\n    return () => {\n      map.removeControl(mapTypeControl)\n    }\n  }, [map, mapTypeControl, position])\n\n  return null\n})\n\nexport default MapTypeControl\n","import React, { useEffect, useImperativeHandle, useMemo } from \"react\"\nimport useMap from \"../hooks/useMap\"\n\nexport interface ZoomControlProps {\n  /**\n   * ZoomControl의 Position를 정의 한다.\n   */\n  position?: kakao.maps.ControlPosition\n}\n\n/**\n * 확대·축소 컨트롤을 생성한다.\n */\nconst ZoomControl = React.forwardRef<kakao.maps.ZoomControl, ZoomControlProps>(\n  ({ position = kakao.maps.ControlPosition.RIGHT }, ref) => {\n    const map = useMap(`ZoomControl`)\n\n    const ZoomControl = useMemo(() => {\n      return new kakao.maps.ZoomControl()\n    }, [])\n\n    useImperativeHandle(ref, () => ZoomControl, [ZoomControl])\n\n    useEffect(() => {\n      map.addControl(ZoomControl, position)\n\n      return () => {\n        map.removeControl(ZoomControl)\n      }\n\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [map, position])\n\n    return null\n  }\n)\n\nexport default ZoomControl\n","import React, { useImperativeHandle, useLayoutEffect, useMemo } from \"react\"\nimport useKakaoEvent from \"../hooks/useKakaoEvent\"\nimport useMap from \"../hooks/useMap\"\n\nexport interface CircleProps {\n  /**\n   * 중심 좌표를 지정합니다.\n   */\n  center: {\n    lat: number\n    lng: number\n  }\n  /**\n   * 원의 반지름 크기를 지정합니다 (미터 단위).\n   */\n  radius: number\n\n  /**\n   * #xxxxxx 형태의 채움 색 (기본값: ‘#F10000’)\n   */\n  fillColor?: string\n  /**\n   * 채움 불투명도 (0-1) (기본값: 0)\n   */\n  fillOpacity?: number\n  /**\n   * 픽셀 단위의 선 두께 (기본값: 3)\n   */\n  strokeWeight?: number\n  /**\n   * #xxxxxx 형태의 선 색 (기본값: ‘#F10000’)\n   */\n  strokeColor?: string\n  /**\n   * 선 불투명도 (0-1) (기본값: 0.6)\n   */\n  strokeOpacity?: number\n  /**\n   * 선 스타일 (기본값: ‘solid’)\n   */\n  strokeStyle?: kakao.maps.StrokeStyles\n  /**\n   * 원의 z-index 속성 값\n   */\n  zIndex?: number\n\n  /**\n   * 원에 마우스 커서를 올리면 발생한다.\n   */\n  onMouseover?: (\n    target: kakao.maps.Circle,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n  /**\n   * 마우스 커서가 원에서 벗어나면 발생한다.\n   */\n  onMouseout?: (\n    target: kakao.maps.Circle,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n  /**\n   * 원에서 마우스를 움직이면 발생한다.\n   */\n  onMousemove?: (\n    target: kakao.maps.Circle,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n  /**\n   * 원에서 마우스 버튼을 누르면 발생한다.\n   */\n  onMousedown?: (\n    target: kakao.maps.Circle,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n  /**\n   * 원을 클릭하면 발생한다.\n   */\n  onClick?: (\n    target: kakao.maps.Circle,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n\n  /**\n   * 객체 생성시 호출 됩니다.\n   */\n  onCreate?: (target: kakao.maps.Circle) => void\n}\n\n/**\n * Map 상에 원을 그립니다.\n */\nconst Circle = React.forwardRef<kakao.maps.Circle, CircleProps>(\n  (\n    {\n      center,\n      radius,\n      fillColor,\n      fillOpacity,\n      strokeColor,\n      strokeOpacity,\n      strokeStyle,\n      strokeWeight,\n      zIndex,\n      onMouseover,\n      onMouseout,\n      onMousemove,\n      onMousedown,\n      onClick,\n      onCreate,\n    },\n    ref\n  ) => {\n    const map = useMap(`Circle`)\n\n    const circleCenter = useMemo(() => {\n      return new kakao.maps.LatLng(center.lat, center.lng)\n    }, [center.lat, center.lng])\n\n    const circle = useMemo(() => {\n      return new kakao.maps.Circle({\n        center: circleCenter,\n        radius,\n        fillColor,\n        fillOpacity,\n        strokeColor,\n        strokeOpacity,\n        strokeStyle,\n        strokeWeight,\n        zIndex,\n      })\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [])\n\n    useImperativeHandle(ref, () => circle, [circle])\n\n    useLayoutEffect(() => {\n      circle.setMap(map)\n      return () => {\n        circle.setMap(null)\n      }\n    }, [map, circle])\n\n    useLayoutEffect(() => {\n      if (onCreate) onCreate(circle)\n    }, [circle, onCreate])\n\n    useLayoutEffect(() => {\n      if (circle) circle.setPosition(circleCenter)\n    }, [circle, circleCenter])\n\n    useLayoutEffect(() => {\n      circle.setRadius(radius)\n    }, [circle, radius])\n\n    useLayoutEffect(() => {\n      if (!zIndex) return\n      circle.setZIndex(zIndex)\n    }, [circle, zIndex])\n\n    useLayoutEffect(() => {\n      circle.setOptions({\n        fillColor,\n        fillOpacity,\n        strokeColor,\n        strokeOpacity,\n        strokeStyle,\n        strokeWeight,\n      })\n    }, [\n      circle,\n      fillColor,\n      fillOpacity,\n      strokeColor,\n      strokeOpacity,\n      strokeStyle,\n      strokeWeight,\n    ])\n\n    useKakaoEvent(circle, \"mouseover\", onMouseover)\n    useKakaoEvent(circle, \"mouseout\", onMouseout)\n    useKakaoEvent(circle, \"mousemove\", onMousemove)\n    useKakaoEvent(circle, \"mousedown\", onMousedown)\n    useKakaoEvent(circle, \"click\", onClick)\n\n    return null\n  }\n)\n\nexport default Circle\n","import React, { useImperativeHandle, useLayoutEffect, useMemo } from \"react\"\nimport useKakaoEvent from \"../hooks/useKakaoEvent\"\nimport useMap from \"../hooks/useMap\"\n\ninterface LatLng {\n  lat: number\n  lng: number\n}\n\nexport interface PolylineProps {\n  path: LatLng[] | LatLng[][]\n  /**\n   * 화살표 여부\n   */\n  endArrow?: boolean\n  /**\n   * 픽셀 단위의 선 두께 (기본값: 3)\n   */\n  strokeWeight?: number\n  /**\n   * #xxxxxx 형태의 선 색 (기본값: ‘#F10000’)\n   */\n  strokeColor?: string\n  /**\n   * 선 불투명도 (0-1) (기본값: 0.6)\n   */\n  strokeOpacity?: number\n  /**\n   * 선 스타일 (기본값: ‘solid’)\n   */\n  strokeStyle?: kakao.maps.StrokeStyles\n  /**\n   * 선의 z-index 속성 값\n   */\n  zIndex?: number\n\n  /**\n   * 마우스 커서를 올리면 발생한다.\n   */\n  onMouseover?: (\n    target: kakao.maps.Polyline,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n  /**\n   * 마우스 커서가 벗어나면 발생한다.\n   */\n  onMouseout?: (\n    target: kakao.maps.Polyline,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n  /**\n   * 마우스를 움직이면 발생한다.\n   */\n  onMousemove?: (\n    target: kakao.maps.Polyline,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n  /**\n   * 마우스 버튼을 누르면 발생한다.\n   */\n  onMousedown?: (\n    target: kakao.maps.Polyline,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n  /**\n   * 클릭하면 발생한다.\n   */\n  onClick?: (\n    target: kakao.maps.Polyline,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n  /**\n   * 객체 생성시 호출 됩니다.\n   */\n  onCreate?: (target: kakao.maps.Polyline) => void\n}\n\n/**\n * Map 상에 폴리라인을 그립니다.\n */\nconst Polyline = React.forwardRef<kakao.maps.Polyline, PolylineProps>(\n  (\n    {\n      path,\n      endArrow,\n      onClick,\n      onMousedown,\n      onMousemove,\n      onMouseout,\n      onMouseover,\n      onCreate,\n      strokeColor,\n      strokeOpacity,\n      strokeStyle,\n      strokeWeight,\n      zIndex,\n    },\n    ref\n  ) => {\n    const map = useMap(`Polyline`)\n\n    const polyLinePath = useMemo(() => {\n      if ((path as LatLng[]).every((v) => v instanceof Array)) {\n        return (path as LatLng[][]).map((v) => {\n          return v.map((p) => new kakao.maps.LatLng(p.lat, p.lng))\n        })\n      }\n      return (path as LatLng[]).map((v) => {\n        return new kakao.maps.LatLng(v.lat, v.lng)\n      })\n    }, [path])\n\n    const polyline = useMemo(() => {\n      return new kakao.maps.Polyline({\n        path: polyLinePath,\n        endArrow,\n        strokeColor,\n        strokeOpacity,\n        strokeStyle,\n        strokeWeight,\n        zIndex,\n      })\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [])\n\n    useImperativeHandle(ref, () => polyline, [polyline])\n\n    useLayoutEffect(() => {\n      polyline.setMap(map)\n      return () => polyline.setMap(null)\n    }, [map, polyline])\n\n    useLayoutEffect(() => {\n      if (onCreate) onCreate(polyline)\n    }, [polyline, onCreate])\n\n    useLayoutEffect(() => {\n      polyline.setOptions({\n        endArrow,\n        strokeColor,\n        strokeOpacity,\n        strokeStyle,\n        strokeWeight,\n      })\n    }, [\n      polyline,\n      endArrow,\n      strokeColor,\n      strokeOpacity,\n      strokeStyle,\n      strokeWeight,\n    ])\n\n    useLayoutEffect(() => {\n      polyline.setPath(polyLinePath)\n    }, [polyline, polyLinePath])\n\n    useLayoutEffect(() => {\n      if (zIndex) polyline.setZIndex(zIndex)\n    }, [polyline, zIndex])\n\n    useKakaoEvent(polyline, \"mouseover\", onMouseover)\n    useKakaoEvent(polyline, \"mouseout\", onMouseout)\n    useKakaoEvent(polyline, \"mousemove\", onMousemove)\n    useKakaoEvent(polyline, \"mousedown\", onMousedown)\n    useKakaoEvent(polyline, \"click\", onClick)\n\n    return null\n  }\n)\n\nexport default Polyline\n","import React, { useLayoutEffect, useImperativeHandle, useMemo } from \"react\"\nimport useKakaoEvent from \"../hooks/useKakaoEvent\"\nimport useMap from \"../hooks/useMap\"\n\ninterface LatLng {\n  lat: number\n  lng: number\n}\n\nexport interface PolygonProps {\n  path: LatLng[] | LatLng[][]\n  /**\n   * #xxxxxx 형태의 채움 색 (기본값: ‘#F10000’)\n   */\n  fillColor?: string\n  /**\n   * 채움 불투명도 (0-1) (기본값: 0)\n   */\n  fillOpacity?: number\n  /**\n   * 픽셀 단위의 선 두께 (기본값: 3)\n   */\n  strokeWeight?: number\n  /**\n   * #xxxxxx 형태의 선 색 (기본값: ‘#F10000’)\n   */\n  strokeColor?: string\n  /**\n   * 선 불투명도 (0-1) (기본값: 0.6)\n   */\n  strokeOpacity?: number\n  /**\n   * 선 스타일 (기본값: ‘solid’)\n   */\n  strokeStyle?: kakao.maps.StrokeStyles\n  /**\n   * 선의 z-index 속성 값\n   */\n  zIndex?: number\n\n  /**\n   * 마우스 커서를 올리면 발생한다.\n   */\n  onMouseover?: (\n    target: kakao.maps.Polygon,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n  /**\n   * 마우스 커서가 벗어나면 발생한다.\n   */\n  onMouseout?: (\n    target: kakao.maps.Polygon,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n  /**\n   * 마우스를 움직이면 발생한다.\n   */\n  onMousemove?: (\n    target: kakao.maps.Polygon,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n  /**\n   * 마우스 버튼을 누르면 발생한다.\n   */\n  onMousedown?: (\n    target: kakao.maps.Polygon,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n  /**\n   * 클릭하면 발생한다.\n   */\n  onClick?: (\n    target: kakao.maps.Polygon,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n  /**\n   * 객체 생성시 호출 됩니다.\n   */\n  onCreate?: (target: kakao.maps.Polygon) => void\n}\n\n/**\n * Map 상에 다각형을 그립니다.\n */\nconst Polygon = React.forwardRef<kakao.maps.Polygon, PolygonProps>(\n  (\n    {\n      path,\n      onClick,\n      onMousedown,\n      onMousemove,\n      onMouseout,\n      onMouseover,\n      onCreate,\n      strokeColor,\n      strokeOpacity,\n      strokeStyle,\n      strokeWeight,\n      fillColor,\n      fillOpacity,\n      zIndex,\n    },\n    ref\n  ) => {\n    const map = useMap(`Polygon`)\n\n    const polygonPath = useMemo(() => {\n      if ((path as LatLng[]).every((v) => v instanceof Array)) {\n        return (path as LatLng[][]).map((v) => {\n          return v.map((p) => new kakao.maps.LatLng(p.lat, p.lng))\n        })\n      }\n      return (path as LatLng[]).map((v) => {\n        return new kakao.maps.LatLng(v.lat, v.lng)\n      })\n    }, [path])\n\n    const polygon = useMemo(() => {\n      return new kakao.maps.Polygon({\n        path: polygonPath,\n        fillColor,\n        fillOpacity,\n        strokeColor,\n        strokeOpacity,\n        strokeStyle,\n        strokeWeight,\n        zIndex,\n      })\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [])\n\n    useImperativeHandle(ref, () => polygon, [polygon])\n\n    useLayoutEffect(() => {\n      polygon.setMap(map)\n      return () => polygon.setMap(null)\n    }, [map, polygon])\n\n    useLayoutEffect(() => {\n      if (onCreate) onCreate(polygon)\n    }, [polygon, onCreate])\n\n    useLayoutEffect(() => {\n      polygon.setOptions({\n        fillColor,\n        fillOpacity,\n        strokeColor,\n        strokeOpacity,\n        strokeStyle,\n        strokeWeight,\n      })\n    }, [\n      polygon,\n      fillColor,\n      fillOpacity,\n      strokeColor,\n      strokeOpacity,\n      strokeStyle,\n      strokeWeight,\n    ])\n\n    useLayoutEffect(() => {\n      polygon.setPath(polygonPath)\n    }, [polygon, polygonPath])\n\n    useLayoutEffect(() => {\n      if (zIndex) polygon.setZIndex(zIndex)\n    }, [polygon, zIndex])\n\n    useKakaoEvent(polygon, \"mouseover\", onMouseover)\n    useKakaoEvent(polygon, \"mouseout\", onMouseout)\n    useKakaoEvent(polygon, \"mousemove\", onMousemove)\n    useKakaoEvent(polygon, \"mousedown\", onMousedown)\n    useKakaoEvent(polygon, \"click\", onClick)\n\n    return null\n  }\n)\n\nexport default Polygon\n","import React, { useImperativeHandle, useLayoutEffect, useMemo } from \"react\"\nimport useKakaoEvent from \"../hooks/useKakaoEvent\"\nimport useMap from \"../hooks/useMap\"\n\ninterface LatLng {\n  lat: number\n  lng: number\n}\n\nexport interface RectangleProps {\n  bounds: {\n    sw: LatLng\n    ne: LatLng\n  }\n  /**\n   * #xxxxxx 형태의 채움 색 (기본값: ‘#F10000’)\n   */\n  fillColor?: string\n  /**\n   * 채움 불투명도 (0-1) (기본값: 0)\n   */\n  fillOpacity?: number\n  /**\n   * 픽셀 단위의 선 두께 (기본값: 3)\n   */\n  strokeWeight?: number\n  /**\n   * #xxxxxx 형태의 선 색 (기본값: ‘#F10000’)\n   */\n  strokeColor?: string\n  /**\n   * 선 불투명도 (0-1) (기본값: 0.6)\n   */\n  strokeOpacity?: number\n  /**\n   * 선 스타일 (기본값: ‘solid’)\n   */\n  strokeStyle?: kakao.maps.StrokeStyles\n  /**\n   * 선의 z-index 속성 값\n   */\n  zIndex?: number\n\n  /**\n   * 마우스 커서를 올리면 발생한다.\n   */\n  onMouseover?: (\n    target: kakao.maps.Rectangle,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n  /**\n   * 마우스 커서가 벗어나면 발생한다.\n   */\n  onMouseout?: (\n    target: kakao.maps.Rectangle,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n  /**\n   * 마우스를 움직이면 발생한다.\n   */\n  onMousemove?: (\n    target: kakao.maps.Rectangle,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n  /**\n   * 마우스 버튼을 누르면 발생한다.\n   */\n  onMousedown?: (\n    target: kakao.maps.Rectangle,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n  /**\n   * 클릭하면 발생한다.\n   */\n  onClick?: (\n    target: kakao.maps.Rectangle,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n  /**\n   * 객체 생성시 호출 됩니다.\n   */\n  onCreate?: (target: kakao.maps.Rectangle) => void\n}\n\n/**\n * Map 상에 사각형을 그립니다.\n */\nconst Rectangle = React.forwardRef<kakao.maps.Rectangle, RectangleProps>(\n  (\n    {\n      bounds,\n      onClick,\n      onMousedown,\n      onMousemove,\n      onMouseout,\n      onMouseover,\n      onCreate,\n      strokeColor,\n      strokeOpacity,\n      strokeStyle,\n      strokeWeight,\n      fillColor,\n      fillOpacity,\n      zIndex,\n    },\n    ref\n  ) => {\n    const map = useMap(`Rectangle`)\n\n    const rectangleBounds = useMemo(() => {\n      return new kakao.maps.LatLngBounds(\n        new kakao.maps.LatLng(bounds.sw.lat, bounds.sw.lng),\n        new kakao.maps.LatLng(bounds.ne.lat, bounds.ne.lng)\n      )\n    }, [bounds])\n\n    const rectangle = useMemo(() => {\n      return new kakao.maps.Rectangle({\n        bounds: rectangleBounds,\n        fillColor,\n        fillOpacity,\n        strokeColor,\n        strokeOpacity,\n        strokeStyle,\n        strokeWeight,\n        zIndex,\n      })\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [])\n\n    useImperativeHandle(ref, () => rectangle, [rectangle])\n\n    useLayoutEffect(() => {\n      rectangle.setMap(map)\n      return () => rectangle.setMap(null)\n    }, [map, rectangle])\n\n    useLayoutEffect(() => {\n      if (onCreate) onCreate(rectangle)\n    }, [rectangle, onCreate])\n\n    useLayoutEffect(() => {\n      rectangle.setOptions({\n        fillColor,\n        fillOpacity,\n        strokeColor,\n        strokeOpacity,\n        strokeStyle,\n        strokeWeight,\n      })\n    }, [\n      rectangle,\n      fillColor,\n      fillOpacity,\n      strokeColor,\n      strokeOpacity,\n      strokeStyle,\n      strokeWeight,\n    ])\n\n    useLayoutEffect(() => {\n      rectangle.setBounds(rectangleBounds)\n    }, [rectangle, rectangleBounds])\n\n    useLayoutEffect(() => {\n      if (zIndex) rectangle.setZIndex(zIndex)\n    }, [rectangle, zIndex])\n\n    useKakaoEvent(rectangle, \"mouseover\", onMouseover)\n    useKakaoEvent(rectangle, \"mouseout\", onMouseout)\n    useKakaoEvent(rectangle, \"mousemove\", onMousemove)\n    useKakaoEvent(rectangle, \"mousedown\", onMousedown)\n    useKakaoEvent(rectangle, \"click\", onClick)\n\n    return null\n  }\n)\n\nexport default Rectangle\n","import React, { useImperativeHandle, useLayoutEffect, useMemo } from \"react\"\nimport useKakaoEvent from \"../hooks/useKakaoEvent\"\nimport useMap from \"../hooks/useMap\"\n\nexport interface EllipseProps {\n  /**\n   * 중심 좌표를 지정합니다.\n   */\n  center: {\n    lat: number\n    lng: number\n  }\n  /**\n   * 미터 단위의 x축 반지름\n   */\n  rx: number\n\n  /**\n   * 미터 단위의 y축 반지름\n   */\n  ry: number\n\n  /**\n   * #xxxxxx 형태의 채움 색 (기본값: ‘#F10000’)\n   */\n  fillColor?: string\n\n  /**\n   * 채움 불투명도 (0-1) (기본값: 0)\n   */\n  fillOpacity?: number\n\n  /**\n   * 픽셀 단위의 선 두께 (기본값: 3)\n   */\n  strokeWeight?: number\n\n  /**\n   * #xxxxxx 형태의 선 색 (기본값: ‘#F10000’)\n   */\n  strokeColor?: string\n\n  /**\n   * 선 불투명도 (0-1) (기본값: 0.6)\n   */\n  strokeOpacity?: number\n\n  /**\n   * 선 스타일 (기본값: ‘solid’)\n   */\n  strokeStyle?: kakao.maps.StrokeStyles\n\n  /**\n   * 타원의 z-index 속성 값\n   */\n  zIndex?: number\n\n  /**\n   * 타원에 마우스 커서를 올리면 발생한다.\n   */\n  onMouseover?: (\n    target: kakao.maps.Ellipse,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n  /**\n   * 마우스 커서가 타원에서 벗어나면 발생한다.\n   */\n  onMouseout?: (\n    target: kakao.maps.Ellipse,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n  /**\n   * 타원에서 마우스를 움직이면 발생한다.\n   */\n  onMousemove?: (\n    target: kakao.maps.Ellipse,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n  /**\n   * 타원에서 마우스 버튼을 누르면 발생한다.\n   */\n  onMousedown?: (\n    target: kakao.maps.Ellipse,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n  /**\n   * 타원을 클릭하면 발생한다.\n   */\n  onClick?: (\n    target: kakao.maps.Ellipse,\n    mouseEvent: kakao.maps.event.MouseEvent\n  ) => void\n\n  /**\n   * 객체 생성시 호출 됩니다.\n   */\n  onCreate?: (target: kakao.maps.Ellipse) => void\n}\n\n/**\n * Map 상에 타원을 그립니다.\n */\nconst Ellipse = React.forwardRef<kakao.maps.Ellipse, EllipseProps>(\n  (\n    {\n      center,\n      rx,\n      ry,\n      fillColor,\n      fillOpacity,\n      strokeColor,\n      strokeOpacity,\n      strokeStyle,\n      strokeWeight,\n      zIndex,\n      onMouseover,\n      onMouseout,\n      onMousemove,\n      onMousedown,\n      onClick,\n      onCreate,\n    },\n    ref\n  ) => {\n    const map = useMap(`Ellipse`)\n\n    const ellipseCenter = useMemo(() => {\n      return new kakao.maps.LatLng(center.lat, center.lng)\n    }, [center.lat, center.lng])\n\n    const ellipse = useMemo(() => {\n      return new kakao.maps.Ellipse({\n        center: ellipseCenter,\n        rx,\n        ry,\n        fillColor,\n        fillOpacity,\n        strokeColor,\n        strokeOpacity,\n        strokeStyle,\n        strokeWeight,\n        zIndex,\n      })\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [])\n\n    useImperativeHandle(ref, () => ellipse, [ellipse])\n\n    useLayoutEffect(() => {\n      ellipse.setMap(map)\n\n      return () => {\n        ellipse.setMap(null)\n      }\n    }, [map, ellipse])\n\n    useLayoutEffect(() => {\n      if (onCreate) onCreate(ellipse)\n    }, [ellipse, onCreate])\n\n    useLayoutEffect(() => {\n      if (ellipse) ellipse.setPosition(ellipseCenter)\n    }, [ellipse, ellipseCenter])\n\n    useLayoutEffect(() => {\n      ellipse.setRadius(rx, ry)\n    }, [ellipse, rx, ry])\n\n    useLayoutEffect(() => {\n      if (!zIndex) return\n      ellipse.setZIndex(zIndex)\n    }, [ellipse, zIndex])\n\n    useLayoutEffect(() => {\n      ellipse.setOptions({\n        fillColor,\n        fillOpacity,\n        strokeColor,\n        strokeOpacity,\n        strokeStyle,\n        strokeWeight,\n      })\n    }, [\n      ellipse,\n      fillColor,\n      fillOpacity,\n      strokeColor,\n      strokeOpacity,\n      strokeStyle,\n      strokeWeight,\n    ])\n\n    useKakaoEvent(ellipse, \"mouseover\", onMouseover)\n    useKakaoEvent(ellipse, \"mouseout\", onMouseout)\n    useKakaoEvent(ellipse, \"mousemove\", onMousemove)\n    useKakaoEvent(ellipse, \"mousedown\", onMousedown)\n    useKakaoEvent(ellipse, \"click\", onClick)\n\n    return null\n  }\n)\n\nexport default Ellipse\n","import React, { useImperativeHandle, useLayoutEffect, useMemo } from \"react\"\nimport useMap from \"../hooks/useMap\"\n\nexport interface AbstractOverlayProps {\n  /**\n   * AbstractOverlay에서 필요한 `onAdd` 함수를 구현 합니다.\n   * 위치를 재조정할 필요가 있을 때 호출된다.\n   * 이 함수 내에서 엘리먼트의 위치를 잡아주어야 한다.\n   *\n   * 이때 arrow 함수가 아닌 일반 funtion으로 하여 this 바인딩이 되도록 하여 AbstractOverlay를 상속 받은 객체에 접근하여 필요 기능을 정의 합니다.\n   * ```tsx\n   * const panel = (this as kakao.maps.AbstractOverlay).getPanels().overlayLayer\n   * panel.appendChild(node.current)\n   * ```\n   */\n  draw: () => void\n  /**\n   * 지도에 올릴 때 호출된다.\n   * setMap(map) 을 실행하면 이 함수가 실행된다.\n   * 이 함수 내에서 생성된 `DOM` 객체를 MapPanels에 자식 노드로 넣어주도록 한다.\n   *\n   * ```tsx\n   * var projection = this.getProjection()\n   * var point = projection.pointFromCoords(positionLatlng)\n   * var width = node.current.offsetWidth\n   * var height = node.current.offsetHeight\n   *\n   * console.log(point, width, height)\n   *\n   * node.current.style.left = point.x - width / 2 + \"px\"\n   * node.current.style.top = point.y - height / 2 + \"px\"\n   * ```\n   */\n  onAdd: () => void\n\n  /**\n   * 지도에서 제거할 때 호출된다.\n   * setMap(null) 을 실행하면 이 함수가 실행된다.\n   * 이 함수 내에서 MapPanels에 자식 노드로 넣어준 엘리먼트를 제거하도록 한다.\n   *\n   * ```tsx\n   * this.node.parentNode.removeChild(this.node);\n   * ```\n   */\n  onRemove: () => void\n\n  /**\n   * 생성된 kakao.maps.AbstractOverlay 객체를 받을 수 있는 CallBack 함수 입니다.\n   */\n  onCreate?: (target: kakao.maps.AbstractOverlay) => void\n}\n\n/**\n * `API` 사용자가 직접 정의할 수 있는 오버레이.\n * AbstractOverlay를 상속 받아 사용할 객체를 생성하고 prototype을 연결해 준다.\n * 온전히 동작하는 오버레이를 만들고자 한다면 3가지 인터페이스 메소드( onAdd, draw, onRemove )를 구현해야 한다.\n *\n * 해당 Component 내부에서 `ReactAbstractOveraly` class를 만들어 `onAdd`, `draw`, `onRemove` 를 연결한 후 React Life Cycle에 맞춰 `setMap` 를 자동으로 호출 합니다.\n *\n * *경고* `draw`, `onAdd`, `onRemove` 의 경우 반드시 익명함수가 **아닌** 형태로 만들어서 전달해야 합니다.\n * `this.~` 를 통한 접근이 가능하니 해당 부분을 이용해서 구현 해주세요!\n *\n * ### Example Code\n *\n * ```jsx live\n * function () {\n *  const TooltipMarker = ({\n *    position,\n *  }) => {\n *    const node = useRef(document.createElement(\"div\"))\n *\n *    const positionLatlng = useMemo(() => {\n *      return new kakao.maps.LatLng(position.lat, position.lng)\n *    }, [position.lat, position.lng])\n *\n *    function onAdd() {\n *      const panel = this.getPanels()\n *        .overlayLayer\n *      panel.appendChild(node.current)\n *    }\n *\n *    function onRemove() {\n *      node.current.parentNode.removeChild(node.current)\n *    }\n *\n *    function draw() {\n *      var projection = this.getProjection()\n *      var point = projection.pointFromCoords(positionLatlng)\n *      var width = node.current.offsetWidth\n *      var height = node.current.offsetHeight\n *\n *      console.log(point, width, height)\n *\n *      node.current.style.left = point.x - width / 2 + \"px\"\n *      node.current.style.top = point.y - height / 2 + \"px\"\n *    }\n *\n *    useEffect(() => {\n *      node.current.style.position = \"absolute\"\n *      node.current.style.whiteSpace = \"nowrap\"\n *    }, [])\n *\n *    return (\n *      <>\n *        <AbstractOverlay onAdd={onAdd} onRemove={onRemove} draw={draw} />\n *        {ReactDOM.createPortal(\n *          <div\n *            style={{\n *              color: \"#000\",\n *              backgroundColor: \"#fff\",\n *              padding: \"5px\",\n *              borderRadius: \"15px\",\n *            }}\n *          >\n *            Hello Marker!\n *          </div>,\n *          node.current\n *        )}\n *      </>\n *    )\n *  }\n *\n *  return (\n *    <>\n *      <Map // 지도를 표시할 Container\n *        center={{\n *          // 지도의 중심좌표\n *          lat: 37.54699,\n *          lng: 127.09598,\n *        }}\n *        style={{\n *          // 지도의 크기\n *          width: \"100%\",\n *          height: \"450px\",\n *        }}\n *        level={3} // 지도의 확대 레벨\n *      >\n *        <TooltipMarker\n *          position={{\n *            lat: 37.54699,\n *            lng: 127.09598,\n *          }}\n *        />\n *      </Map>\n *    </>\n *  )\n *}\n * ```\n */\nconst AbstractOverlay = React.forwardRef<\n  kakao.maps.AbstractOverlay,\n  AbstractOverlayProps\n>(({ draw, onAdd, onRemove, onCreate }, ref) => {\n  const map = useMap()\n\n  const reactAbstractOverlay = useMemo(() => {\n    class ReactAbstractOveraly extends kakao.maps.AbstractOverlay {\n      constructor(draw: () => void, onAdd: () => void, onRemove: () => void) {\n        super()\n        this.draw = draw\n        this.onAdd = onAdd\n        this.onRemove = onRemove\n      }\n    }\n    const overlay = new ReactAbstractOveraly(draw, onAdd, onRemove)\n    return overlay\n  }, [draw, onAdd, onRemove])\n\n  useImperativeHandle(ref, () => reactAbstractOverlay, [reactAbstractOverlay])\n\n  useLayoutEffect(() => {\n    reactAbstractOverlay.setMap(map)\n\n    return () => {\n      reactAbstractOverlay.setMap(null)\n    }\n  }, [map, reactAbstractOverlay])\n\n  useLayoutEffect(() => {\n    if (onCreate) onCreate(reactAbstractOverlay)\n  }, [reactAbstractOverlay, onCreate])\n\n  return null\n})\n\nexport default AbstractOverlay\n","import React, { useImperativeHandle, useRef, useState } from \"react\"\nimport useIsomorphicLayoutEffect from \"../hooks/useIsomorphicLayoutEffect\"\nimport useKakaoEvent from \"../hooks/useKakaoEvent\"\nimport {\n  PolymorphicComponentProps,\n  PolymorphicComponentPropsWithOutRef,\n} from \"../types\"\nimport { Loader } from \"../util/kakaoMapApiLoader\"\n\nexport const KakaoRoadviewContext = React.createContext<kakao.maps.Roadview>(\n  undefined as unknown as kakao.maps.Roadview\n)\n\nexport interface RoadviewProps {\n  /**\n   * 중심으로 설정할 위치 입니다.\n   * 해당 lat와 lng에 해당하는 radius범위 안에서 가장가까운 Roadview을 선택합니다.\n   * 만약 없다면 lat, lng로 설정 됩니다.\n   */\n  position: {\n    lat: number\n    lng: number\n    radius: number\n  }\n\n  /**\n   * 로드뷰 시작 지역의 고유 아이디 값.\n   */\n  panoId?: number\n\n  /**\n   * panoId가 유효하지 않을 경우 지도좌표를 기반으로 데이터를 요청할 수평 좌표값.\n   */\n  panoX?: number\n\n  /**\n   * panoId가 유효하지 않을 경우 지도좌표를 기반으로 데이터를 요청할 수직 좌표값.\n   */\n  panoY?: number\n\n  /**\n   * 로드뷰 처음 실행시에 바라봐야 할 수평 각. 0이 정북방향. (0_360)\n   */\n  pan?: number\n\n  /**\n   * 로드뷰 처음 실행시에 바라봐야 할 수직 각.(-90_90)\n   */\n  tilt?: number\n\n  /**\n   * 로드뷰 줌 초기값.(-3_3)\n   */\n  zoom?: number\n\n  /**\n   * 로드뷰 생성후 해당 객체를 전달하는 callback.\n   */\n  onCreate?: (roadview: kakao.maps.Roadview) => void\n\n  /**\n   * 로드뷰가 초기화를 끝내면 발생한다.\n   */\n  onInit?: (target: kakao.maps.Roadview) => void\n\n  /**\n   * 파노라마 ID가 바뀌면 발생한다.\n   */\n  onPanoidChange?: (target: kakao.maps.Roadview) => void\n\n  /**\n   * 시점이 바뀌면 발생한다.\n   */\n  onViewpointChange?: (target: kakao.maps.Roadview) => void\n\n  /**\n   * 지도 좌표가 바뀌면 발생한다.\n   */\n  onPositionChanged?: (target: kakao.maps.Roadview) => void\n\n  /**\n   * getNearestPanoId 동작 실패시 호출 합니다.\n   */\n  onErrorGetNearestPanoId?: (target: kakao.maps.Roadview) => void\n}\n\ntype RoadviewComponent = <T extends React.ElementType = \"div\">(\n  props: PolymorphicComponentPropsWithOutRef<T, RoadviewProps> &\n    React.RefAttributes<kakao.maps.Roadview>\n) => React.ReactElement | null\n\n/**\n * Roadview를 Roadview를 생성하는 컴포넌트 입니다.\n * props로 받는 `on*` 이벤트는 해당 `kakao.maps.Map` 객체를 반환 합니다.\n * `onCreate` 이벤트를 통해 생성 후 `Roadview` 객체에 직접 접근하여 초기 설정이 가능합니다.\n */\nconst Roadview: RoadviewComponent = React.forwardRef(\n  <T extends React.ElementType = \"div\">(\n    {\n      id,\n      as,\n      children,\n      position,\n      pan,\n      panoId,\n      panoX,\n      panoY,\n      tilt,\n      zoom,\n      onCreate,\n      onInit,\n      onPanoidChange,\n      onPositionChanged,\n      onViewpointChange,\n      onErrorGetNearestPanoId,\n      ...props\n    }: PolymorphicComponentProps<T, React.PropsWithChildren<RoadviewProps>>,\n    ref: React.ForwardedRef<kakao.maps.Roadview>\n  ) => {\n    const Container = as || \"div\"\n    const [isLoaded, setIsLoaded] = useState(false)\n    const [isLoading, setIsLoading] = useState(true)\n    const [roadview, setRoadview] = useState<kakao.maps.Roadview>()\n    const container = useRef<HTMLDivElement>(null)\n\n    useIsomorphicLayoutEffect(() => {\n      Loader.isLoaded().then(setIsLoaded)\n    }, [])\n\n    useIsomorphicLayoutEffect(() => {\n      if (!isLoaded) return\n\n      const RoadviewContainer = container.current\n\n      if (!RoadviewContainer) return\n\n      const kakaoRoadview = new kakao.maps.Roadview(RoadviewContainer, {\n        pan: pan,\n        panoId: panoId,\n        panoX: panoX,\n        panoY: panoY,\n        tilt: tilt,\n        zoom: zoom,\n      })\n\n      setRoadview(kakaoRoadview)\n\n      return () => {\n        RoadviewContainer.innerHTML = \"\"\n      }\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [isLoaded, panoX, panoY, zoom])\n\n    useImperativeHandle(ref, () => roadview!, [roadview])\n\n    useIsomorphicLayoutEffect(() => {\n      if (!roadview || !onCreate) return\n      onCreate(roadview)\n    }, [roadview, onCreate])\n\n    useIsomorphicLayoutEffect(() => {\n      if (\n        !roadview ||\n        panoId ||\n        (roadview.getPosition().getLat() === position.lat &&\n          roadview.getPosition().getLng() === position.lng)\n      )\n        return\n\n      const newPostion = new kakao.maps.LatLng(position.lat, position.lng)\n\n      new kakao.maps.RoadviewClient().getNearestPanoId(\n        newPostion,\n        position.radius,\n        (panoId) => {\n          if (panoId === null && onErrorGetNearestPanoId) {\n            onErrorGetNearestPanoId(roadview)\n          } else {\n            roadview.setPanoId(panoId, newPostion)\n          }\n        }\n      )\n    }, [\n      roadview,\n      panoId,\n      position.lat,\n      position.lng,\n      position.radius,\n      onErrorGetNearestPanoId,\n    ])\n\n    useIsomorphicLayoutEffect(() => {\n      if (\n        !roadview ||\n        !panoId ||\n        panoId === roadview.getPanoId() ||\n        (roadview.getPosition().getLat() === position.lat &&\n          roadview.getPosition().getLng() === position.lng)\n      )\n        return\n\n      const newPostion = new kakao.maps.LatLng(position.lat, position.lng)\n      roadview.setPanoId(panoId, newPostion)\n    }, [roadview, panoId, position.lat, position.lng])\n\n    useIsomorphicLayoutEffect(() => {\n      if (!roadview) return\n\n      const prevViewpoint = roadview.getViewpoint()\n\n      if (prevViewpoint.pan === pan && prevViewpoint.tilt === tilt) return\n\n      if (pan) prevViewpoint.pan = pan\n      if (tilt) prevViewpoint.tilt = tilt\n      roadview.setViewpoint(prevViewpoint)\n    }, [roadview, pan, tilt])\n\n    useKakaoEvent(roadview, \"init\", (target) => {\n      setIsLoading(false)\n      if (onInit) onInit(target)\n    })\n    useKakaoEvent(roadview, \"panoid_changed\", onPanoidChange)\n    useKakaoEvent(roadview, \"viewpoint_changed\", onViewpointChange)\n    useKakaoEvent(roadview, \"position_changed\", onPositionChanged)\n\n    return (\n      <>\n        <Container\n          ref={container}\n          id={id || \"react-kakao-maps-sdk-roadview-container\"}\n          {...props}\n        />\n        {roadview && !isLoading && (\n          <KakaoRoadviewContext.Provider value={roadview}>\n            {children}\n          </KakaoRoadviewContext.Provider>\n        )}\n      </>\n    )\n  }\n)\n\nexport default Roadview\n","import { useContext } from \"react\"\nimport { KakaoRoadviewContext } from \"../components/Roadview\"\n\n/**\n * kakao roadview 객체를 가져오는 hook 입니다.\n * Roadview 객체 내부가 아니라면 Error를 발생 시킵니다.\n */\nconst useRoadview = (componentName?: string) => {\n  const kakaoRoadview = useContext(KakaoRoadviewContext)\n  if (!kakaoRoadview) {\n    throw new Error(\n      `${\n        componentName ? componentName + \" Component\" : \"useRoadview\"\n      } must exist inside Roadview Component!`\n    )\n  }\n\n  return kakaoRoadview\n}\n\nexport default useRoadview\n","import React, {\n  useImperativeHandle,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n} from \"react\"\nimport ReactDOM from \"react-dom\"\nimport useRoadview from \"../hooks/useRoadview\"\n\nexport interface CustomOverlayRoadviewProps {\n  /**\n   * 커스텀 오버레이의 좌표\n   */\n  position:\n    | {\n        lat: number\n        lng: number\n      }\n    | {\n        /**\n         * 가로 각도, 0부터 360 사이의 값으로 북쪽부터 시계방향으로 대응한다.\n         */\n        pan: number\n        /**\n         * 세로 각도, -90부터 90 사이의 값으로 위쪽부터 아래쪽으로 대응한다.\n         */\n        tilt: number\n        /**\n         * 확대 수준, -3부터 3 사이의 정수이다.\n         */\n        zoom?: number\n        /**\n         * 특정 위치의 로드뷰 고유의 아이디 값\n         */\n        panoId?: number\n      }\n  /**\n   * true 로 설정하면 컨텐츠 영역을 클릭했을 경우 지도 이벤트를 막아준다.\n   */\n  clickable?: boolean\n\n  /**\n   * 컨텐츠의 x축 위치. 0_1 사이의 값을 가진다. 기본값은 0.5\n   */\n  xAnchor?: number\n\n  /**\n   * 컨텐츠의 y축 위치. 0_1 사이의 값을 가진다. 기본값은 0.5\n   */\n  yAnchor?: number\n\n  /**\n   * 커스텀 오버레이의 z-index\n   */\n  zIndex?: number\n\n  /**\n   * 로드뷰상에서 커스텀 오버레이의 높이(위치)를 지정한다.\n   * 단위는 m(미터)이며 현재 로드뷰의 바닥 높이를 기준으로 떨어져있는 높이를 말한다.\n   */\n  altitude?: number\n\n  /**\n   * 커스텀 오버레이의 가시반경을 설정한다.\n   * 로드뷰의 위치와 커스텀 오버레이의 위치 사이의 거리가 가시반경 이내일 경우에만 로드뷰상에 노출된다.\n   * 단위는 m(미터)이며 기본값은 500m이다.\n   */\n  range?: number\n\n  /**\n   * 커스텀 오버레이를 생성 후 해당 객체를 가지고 callback 함수를 실행 시켜줌\n   */\n  onCreate?: (customOverlay: kakao.maps.CustomOverlay) => void\n}\n\n/**\n * Roadview에 CustomOverlay를 올릴 때 사용하는 컴포넌트 입니다.\n * `onCreate` 이벤트 또는 `ref` 객체를 통해서 `CustomOverlay` 객체에 직접 접근 및 초기 설정 작업을 지정할 수 있습니다.\n */\nconst CustomOverlayRoadview = React.forwardRef<\n  kakao.maps.CustomOverlay,\n  React.PropsWithChildren<CustomOverlayRoadviewProps>\n>(\n  (\n    {\n      position,\n      children,\n      clickable,\n      xAnchor,\n      yAnchor,\n      zIndex,\n      altitude,\n      range,\n      onCreate,\n    },\n    ref\n  ) => {\n    const roadview = useRoadview(`CustomOverlayRoadview`)\n    const container = useRef(document.createElement(\"div\"))\n\n    const overlayPosition = useMemo(() => {\n      if (\"lat\" in position) {\n        return new kakao.maps.LatLng(position.lat, position.lng)\n      }\n      return new kakao.maps.Viewpoint(\n        position.pan,\n        position.tilt,\n        position.zoom,\n        position.panoId\n      )\n      /* eslint-disable react-hooks/exhaustive-deps */\n    }, [\n      // @ts-ignore\n      position.lat,\n      // @ts-ignore\n      position.lng,\n      // @ts-ignore\n      position.pan,\n      // @ts-ignore\n      position.tilt,\n      // @ts-ignore\n      position.zoom,\n      // @ts-ignore\n      position.panoId,\n    ])\n    /* eslint-enable react-hooks/exhaustive-deps */\n\n    const overlay = useMemo(() => {\n      const KakaoCustomOverlay = new kakao.maps.CustomOverlay({\n        clickable: clickable,\n        xAnchor: xAnchor,\n        yAnchor: yAnchor,\n        zIndex: zIndex,\n        position: overlayPosition,\n        content: container.current,\n      })\n      container.current.style.display = \"none\"\n      return KakaoCustomOverlay\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [clickable, xAnchor, yAnchor])\n\n    useImperativeHandle(ref, () => overlay, [overlay])\n\n    useLayoutEffect(() => {\n      if (!roadview) return\n\n      overlay.setMap(roadview)\n\n      return () => {\n        overlay.setMap(null)\n      }\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [overlay, roadview])\n\n    useLayoutEffect(() => {\n      if (onCreate) onCreate(overlay)\n    }, [overlay, onCreate])\n\n    useLayoutEffect(() => {\n      overlay.setPosition(overlayPosition)\n    }, [overlay, overlayPosition])\n\n    useLayoutEffect(() => {\n      if (!zIndex) return\n      overlay.setZIndex(zIndex)\n    }, [overlay, zIndex])\n\n    useLayoutEffect(() => {\n      if (!altitude) return\n      overlay.setAltitude(altitude)\n    }, [overlay, altitude])\n\n    useLayoutEffect(() => {\n      if (!range) return\n      overlay.setRange(range)\n    }, [overlay, range])\n\n    return (\n      container.current.parentElement &&\n      ReactDOM.createPortal(children, container.current.parentElement)\n    )\n  }\n)\n\nexport default CustomOverlayRoadview\n","import React, { useMemo } from \"react\"\nimport useRoadview from \"../hooks/useRoadview\"\nimport Marker from \"./Marker\"\n\nexport interface RoadviewMarkerProps {\n  /**\n   * 표시 위치\n   */\n  position:\n    | {\n        lat: number\n        lng: number\n      }\n    | {\n        x: number\n        y: number\n      }\n    | {\n        /**\n         * 가로 각도, 0부터 360 사이의 값으로 북쪽부터 시계방향으로 대응한다.\n         */\n        pan: number\n        /**\n         * 세로 각도, -90부터 90 사이의 값으로 위쪽부터 아래쪽으로 대응한다.\n         */\n        tilt: number\n        /**\n         * 확대 수준, -3부터 3 사이의 정수이다.\n         */\n        zoom?: number\n        /**\n         * 특정 위치의 로드뷰 고유의 아이디 값\n         */\n        panoId?: number\n      }\n\n  image?: {\n    /**\n     * 표시 이미지 src\n     */\n    src: string\n\n    /**\n     * 표시 이미지 크기\n     */\n    size: {\n      width: number\n      height: number\n    }\n\n    options?: {\n      /**\n       * 마커 이미지의 alt 속성값을 정의한다.\n       */\n      alt?: string\n\n      /**\n       * 마커의 클릭 또는 마우스오버 가능한 영역을 표현하는 좌표값\n       */\n      coords?: string\n\n      /**\n       * 마커의 좌표에 일치시킬 이미지 안의 좌표 (기본값: 이미지의 가운데 아래)\n       */\n      offset?: { x: number; y: number }\n\n      /**\n       * 마커의 클릭 또는 마우스오버 가능한 영역의 모양\n       */\n      shape?: \"default\" | \"rect\" | \"circle\" | \"poly\"\n\n      /**\n       * 스프라이트 이미지 중 사용할 영역의 좌상단 좌표\n       */\n      spriteOrigin?: { x: number; y: number }\n\n      /**\n       * 스프라이트 이미지의 전체 크기\n       */\n      spriteSize?: { width: number; height: number }\n    }\n  }\n\n  /**\n   * click 이벤트 핸들러\n   */\n  onClick?: (marker: kakao.maps.Marker) => void\n\n  /**\n   * mouseover 이벤트 핸들러\n   */\n  onMouseOver?: (marker: kakao.maps.Marker) => void\n\n  /**\n   * mouseout 이벤트 핸들러\n   */\n  onMouseOut?: (marker: kakao.maps.Marker) => void\n\n  /**\n   * dragstart 이벤트 핸들러\n   */\n  onDragStart?: (marker: kakao.maps.Marker) => void\n\n  /**\n   * dragend 이벤트 핸들러\n   */\n  onDragEnd?: (marker: kakao.maps.Marker) => void\n\n  /**\n   * Maker 생성 이벤트 핸들러\n   */\n  onCreate?: (maker: kakao.maps.Marker) => void\n\n  /**\n   * 마커 엘리먼트의 타이틀 속성 값 (툴팁)\n   */\n  title?: string\n\n  /**\n   * 클릭 가능한 마커\n   */\n  clickable?: boolean\n\n  /**\n   * 마커 엘리먼트의 z-index 속성 값\n   */\n  zIndex?: number\n\n  /**\n   * 마커 투명도 (0-1)\n   */\n  opacity?: number\n\n  /**\n   * 로드뷰에 올라있는 마커의 높이 값(m 단위)\n   */\n  altitude?: number\n\n  /**\n   * 로드뷰 상에서 마커의 가시반경(m 단위), 두 지점 사이의 거리가 지정한 값보다 멀어지면 마커는 로드뷰에서 보이지 않게 된다.\n   */\n  range?: number\n\n  /**\n   * InfoWindow 옵션\n   */\n  infoWindowOptions?: {\n    /**\n     * 인포윈도우를 열 때 지도가 자동으로 패닝하지 않을지의 여부 (기본값: false)\n     */\n    disableAutoPan?: boolean\n\n    /**\n     * 삭제 가능한 인포윈도우\n     */\n    removable?: boolean\n\n    /**\n     * 인포윈도우 엘리먼트의 z-index 속성 값\n     */\n    zIndex?: number\n  }\n}\n\n/**\n * Map에서 Marker를 생성할 때 사용 합니다.\n * `onCreate` 이벤트를 통해 생성 후 `maker` 객체에 직접 접근하여 초기 설정이 가능합니다.\n */\nconst RoadviewMarker = React.forwardRef<\n  kakao.maps.Marker,\n  React.PropsWithChildren<RoadviewMarkerProps>\n>(\n  (\n    {\n      image,\n      position,\n      children,\n      altitude,\n      clickable,\n      infoWindowOptions,\n      onClick,\n      onDragEnd,\n      onDragStart,\n      onMouseOut,\n      onMouseOver,\n      onCreate,\n      opacity,\n      range,\n      title,\n      zIndex,\n    },\n    ref\n  ) => {\n    const roadview = useRoadview(`RoadviewMarker`)\n\n    const markerImage = useMemo(() => {\n      return (\n        image &&\n        new kakao.maps.MarkerImage(\n          image.src,\n          new kakao.maps.Size(image.size.width, image.size.height),\n          {\n            alt: image.options?.alt,\n            coords: image.options?.coords,\n            offset:\n              image.options?.offset &&\n              new kakao.maps.Point(\n                image.options?.offset.x,\n                image.options?.offset.y\n              ),\n            shape: image.options?.shape,\n            spriteOrigin:\n              image.options?.spriteOrigin &&\n              new kakao.maps.Point(\n                image.options?.spriteOrigin.x,\n                image.options?.spriteOrigin.y\n              ),\n            spriteSize:\n              image.options?.spriteSize &&\n              new kakao.maps.Size(\n                image.options?.spriteSize.width,\n                image.options?.spriteSize.height\n              ),\n          }\n        )\n      )\n    }, [image])\n\n    const markerPosition = useMemo(() => {\n      if (\"lat\" in position) {\n        return new kakao.maps.LatLng(position.lat, position.lng)\n      }\n      if (\"x\" in position) {\n        return new kakao.maps.Coords(position.x, position.y).toLatLng()\n      }\n      return new kakao.maps.Viewpoint(\n        position.pan,\n        position.tilt,\n        position.zoom,\n        position.panoId\n      )\n\n      /* eslint-disable react-hooks/exhaustive-deps */\n    }, [\n      // @ts-ignore\n      position.lat,\n      // @ts-ignore\n      position.lng,\n      // @ts-ignore\n      position.x,\n      // @ts-ignore\n      position.y,\n      // @ts-ignore\n      position.pan,\n      // @ts-ignore\n      position.tilt,\n      // @ts-ignore\n      position.zoom,\n      // @ts-ignore\n      position?.panoId,\n    ])\n    /* eslint-enable react-hooks/exhaustive-deps */\n\n    return (\n      <Marker\n        map={roadview}\n        position={markerPosition}\n        image={markerImage}\n        altitude={altitude}\n        clickable={clickable}\n        infoWindowOptions={infoWindowOptions}\n        onClick={onClick}\n        onDragEnd={onDragEnd}\n        onDragStart={onDragStart}\n        onMouseOut={onMouseOut}\n        onMouseOver={onMouseOver}\n        onCreate={onCreate}\n        opacity={opacity}\n        range={range}\n        title={title}\n        zIndex={zIndex}\n        ref={ref}\n      >\n        {children}\n      </Marker>\n    )\n  }\n)\n\nexport default RoadviewMarker\n","import React, { useMemo } from \"react\"\nimport InfoWindow from \"./InfoWindow\"\nimport useRoadview from \"../hooks/useRoadview\"\n\nexport interface RoadviewInfoWindowProps {\n  /**\n   * 인포윈도가 표시될 위치\n   */\n  position:\n    | {\n        lat: number\n        lng: number\n      }\n    | {\n        /**\n         * 가로 각도, 0부터 360 사이의 값으로 북쪽부터 시계방향으로 대응한다.\n         */\n        pan: number\n        /**\n         * 세로 각도, -90부터 90 사이의 값으로 위쪽부터 아래쪽으로 대응한다.\n         */\n        tilt: number\n        /**\n         * 확대 수준, -3부터 3 사이의 정수이다.\n         */\n        zoom?: number\n        /**\n         * 특정 위치의 로드뷰 고유의 아이디 값\n         */\n        panoId?: number\n      }\n\n  /**\n   * 인포윈도우를 열 때 지도가 자동으로 패닝하지 않을지의 여부 (기본값: false)\n   */\n  disableAutoPan?: boolean\n\n  /**\n   * 삭제 가능한 인포윈도우\n   */\n  removable?: boolean\n\n  /**\n   * 인포윈도우 엘리먼트의 z-index 속성 값\n   */\n  zIndex?: number\n\n  /**\n   * 로드뷰에 올라있는 인포윈도우의 높이 값(m 단위)\n   */\n  altitude?: number\n\n  /**\n   * 로드뷰 상에서 인포윈도우의 가시반경(m 단위), 두 지점 사이의 거리가 지정한 값보다 멀어지면 인포윈도우는 보이지 않게 된다\n   */\n  range?: number\n\n  /**\n   * 인포윈도우 객체 생성후 해당 객체를 반환하는 함수\n   */\n  onCreate?: (infoWindow: kakao.maps.InfoWindow) => void\n}\n\n/**\n * Map 컴포넌트에서 InfoWindow를 그릴 때 사용됩니다.\n * `onCreate` 이벤트를 통해 생성 후 `infoWindow` 객체에 직접 접근하여 초기 설정이 가능합니다.\n */\nconst RoadviewInfoWindow = React.forwardRef<\n  kakao.maps.InfoWindow,\n  React.PropsWithChildren<RoadviewInfoWindowProps>\n>(\n  (\n    {\n      position,\n      children,\n      altitude,\n      disableAutoPan,\n      range,\n      removable,\n      zIndex,\n      onCreate,\n    },\n    ref\n  ) => {\n    const roadview = useRoadview(`RoadviewInfoWindow`)\n    const infoPosition = useMemo(() => {\n      if (\"lat\" in position) {\n        return new kakao.maps.LatLng(position.lat, position.lng)\n      }\n      return new kakao.maps.Viewpoint(\n        position.pan,\n        position.tilt,\n        position.zoom,\n        position.panoId\n      )\n      /* eslint-disable react-hooks/exhaustive-deps */\n    }, [\n      // @ts-ignore\n      position.lat,\n      // @ts-ignore\n      position.lng,\n      // @ts-ignore\n      position.pan,\n      // @ts-ignore\n      position.tilt,\n      // @ts-ignore\n      position.zoom,\n      // @ts-ignore\n      position.panoId,\n    ])\n    /* eslint-enable react-hooks/exhaustive-deps */\n\n    return (\n      <InfoWindow\n        altitude={altitude}\n        disableAutoPan={disableAutoPan}\n        range={range}\n        removable={removable}\n        zIndex={zIndex}\n        map={roadview}\n        position={infoPosition}\n        onCreate={onCreate}\n        ref={ref}\n      >\n        {children}\n      </InfoWindow>\n    )\n  }\n)\n\nexport default RoadviewInfoWindow\n","import React, {\n  ReactNode,\n  Ref,\n  useImperativeHandle,\n  useLayoutEffect,\n  useMemo,\n} from \"react\"\nimport useMap from \"../hooks/useMap\"\n\nexport const DrawingManagerContext =\n  React.createContext<kakao.maps.drawing.DrawingManager>(\n    undefined as unknown as kakao.maps.drawing.DrawingManager\n  )\n\nexport type DrawingManagerProps<\n  T extends kakao.maps.drawing.OverlayType = kakao.maps.drawing.OverlayType\n> = Partial<kakao.maps.drawing.OverlayOptions> &\n  Pick<kakao.maps.drawing.OverlayOptions, `${T}Options`> & {\n    /**\n     * 마우스 오버 시 가이드 툴팁 표시 여부. ‘draw’, ‘drag’, ‘edit’ 3가지를 지정할 수 있다 (기본값: 모두 표시 안함)\n     * 예를들어 [‘draw’]로 설정하면 객체를 그릴때 가이드 툴팁이 표시된다\n     */\n    guideTooltip?: Array<\"draw\" | \"drag\" | \"edit\">\n    /**\n     * 사용할 그리기 요소 지정한다 (기본값: 모든 그리기 요소)\n     */\n    drawingMode?: Array<T | `${T}`>\n\n    /**\n     * 그리기 요소를 선택하면 발생한다.\n     */\n    onSelect?: (\n      drawingManager: kakao.maps.drawing.DrawingManager<T>,\n      event: kakao.maps.drawing.MouseEvent\n    ) => void\n\n    /**\n     * 그리기를 시작하면 발생한다.\n     */\n    onDrawstart?: (\n      drawingManager: kakao.maps.drawing.DrawingManager<T>,\n      event: kakao.maps.drawing.MouseEvent\n    ) => void\n\n    /**\n     * 그리기 시작 후, 마우스를 이동하면 발생한다.\n     */\n    onDraw?: (\n      drawingManager: kakao.maps.drawing.DrawingManager<T>,\n      event: kakao.maps.drawing.MouseEvent\n    ) => void\n\n    /**\n     * 그리기를 시작하면 발생한다.\n     */\n    onDrawend?: (\n      drawingManager: kakao.maps.drawing.DrawingManager<T>,\n      event: kakao.maps.drawing.MouseEvent\n    ) => void\n\n    /**\n     * 다음 단계 그리기를 하면 발생한다. (Polyline, Polygon, Arrow 한정)\n     */\n    onDrawnext?: (\n      drawingManager: kakao.maps.drawing.DrawingManager<T>,\n      event: kakao.maps.drawing.MouseEvent\n    ) => void\n\n    /**\n     * 그리기를 취소하면 발생한다.\n     */\n    onCancle?: (\n      drawingManager: kakao.maps.drawing.DrawingManager<T>,\n      event: kakao.maps.drawing.MouseEvent\n    ) => void\n\n    /**\n     * 그리기 요소를 삭제하면 발생한다.\n     */\n    onRemove?: (\n      drawingManager: kakao.maps.drawing.DrawingManager<T>,\n      event: kakao.maps.drawing.MouseEvent\n    ) => void\n\n    /**\n     * 그리기 요소들의 상태가 변경되면 발생한다.\n     * 각 요소의 생성/수정/이동/삭제 동작과 undo 또는 redo 함수 호출이 이에 해당한다.\n     */\n    onStateChanged?: (\n      drawingManager: kakao.maps.drawing.DrawingManager<T>\n    ) => void\n\n    /**\n     * 객체 생성후 해당 이벤트가 발생합니다.\n     */\n    onCreate?: (drawingManager: kakao.maps.drawing.DrawingManager<T>) => void\n\n    /**\n     * Toolbox에 대해서 추가할 때 사용합니다.\n     */\n    children?: ReactNode\n  }\n\nfunction useDrawingManagerEvent<T extends kakao.maps.drawing.OverlayType>(\n  target: kakao.maps.drawing.DrawingManager<T> | undefined,\n  type:\n    | \"drawstart\"\n    | \"draw\"\n    | \"drawend\"\n    | \"drawnext\"\n    | \"select\"\n    | \"cancel\"\n    | \"remove\"\n    | \"state_changed\",\n  callback:\n    | ((target: kakao.maps.drawing.DrawingManager<T>, ...args: any) => void)\n    | undefined\n) {\n  useLayoutEffect(() => {\n    if (!target || !callback) return\n\n    const wrapCallback = (...arg: any[]) => {\n      if (arg === undefined) return callback(target)\n      else return callback(target, ...arg)\n    }\n\n    // @ts-ignore\n    target.addListener(type, wrapCallback)\n  }, [callback, target, type])\n}\n\n/**\n * 그리기 관리자 객체를 생성하는 컴포넌트 입니다.\n *\n * 초기 생성자에 필요한 Props는 최초 렌더링에만 반영을 하고 이후에는 값이 변경되더라도 적용되지 않습니다.\n *\n * > `on~` 시리즈를 제외한 props는 초기 렌더링 이후 작동 안함\n *\n * DrawingManager는 이전 Map, Marker, CustomOverlay와 달리 Props를 통해 제어를 하는 것이 아닌 직접 DrawingManager 객체를 이용하여 제어를 해야 합니다.\n *\n * 이를 위해 ref 객체를 통해 `DrawingManager` 객체를 접근 할 수 있으며, 이를 활용하여 여러 이벤트 처리 및 제어가 가능합니다.\n *\n * TypeScript 사용자를 위한 `Generic`이 적용되어 있으므로, `ref` 객체에 대한 typing 및 `drawingMode`에 대해 확실하게 정의해야 합니다.\n *\n * ```tsx\n * const Main = () => {\n *     const managerRef = useRef<kakao.maps.drawing.DrawingManager<\n *       kakao.maps.drawing.OverlayType.POLYLINE\n *     >>(null);\n *\n *     function selectOverlay(type: string) {\n *       const manager = managerRef.current;\n *       manager.cancel();\n *       manager.select(kakao.maps.drawing.OverlayType.POLYLINE);\n *     }\n *\n *     return (\n *       <>\n *         <Map\n *           center={{\n *             // 지도의 중심좌표\n *             lat: 33.450701,\n *             lng: 126.570667,\n *           }}\n *           style={{\n *             width: \"100%\",\n *             height: \"450px\",\n *           }}\n *           level={3} // 지도의 확대 레벨\n *         >\n *           <DrawingManager\n *             ref={managerRef}\n *             drawingMode={[\n *               kakao.maps.drawing.OverlayType.POLYLINE,\n *             ]}\n *             guideTooltip={['draw', 'drag', 'edit']}\n *             polylineOptions={{\n *               draggable: true,\n *               removable: true,\n *               editable: true\n *             }}\n *           />\n *         </Map>\n *         <button onClick={(e) => {\n *           selectOverlay('POLYLINE')\n *         }}>선</button>\n *       </>\n *     )\n *   }\n * ```\n *\n * > JavaScript 코드 버전\n *\n * ```jsx live\n * function() {\n *   const Main = () => {\n *     const managerRef = useRef(null);\n *\n *     function selectOverlay() {\n *       const manager = managerRef.current;\n *       manager.cancel();\n *       manager.select(kakao.maps.drawing.OverlayType.POLYLINE);\n *     }\n *\n *     return (\n *       <>\n *         <Map\n *           center={{\n *             // 지도의 중심좌표\n *             lat: 33.450701,\n *             lng: 126.570667,\n *           }}\n *           style={{\n *             width: \"100%\",\n *             height: \"450px\",\n *           }}\n *           level={3} // 지도의 확대 레벨\n *         >\n *           <DrawingManager\n *             ref={managerRef}\n *             drawingMode={[\n *               kakao.maps.drawing.OverlayType.POLYLINE,\n *             ]}\n *             guideTooltip={['draw', 'drag', 'edit']}\n *             polylineOptions={{\n *               draggable: true,\n *               removable: true,\n *               editable: true\n *             }}\n *           />\n *         </Map>\n *         <button onClick={selectOverlay}>선</button>\n *       </>\n *     )\n *   }\n *   return (<Main />)\n * }\n * ```\n */\nconst DrawingManager = React.forwardRef(function <\n  T extends kakao.maps.drawing.OverlayType\n>(\n  {\n    arrowOptions,\n    circleOptions,\n    ellipseOptions,\n    markerOptions,\n    polygonOptions,\n    polylineOptions,\n    rectangleOptions,\n    drawingMode,\n    guideTooltip,\n    onSelect,\n    onDrawstart,\n    onDraw,\n    onDrawend,\n    onDrawnext,\n    onCancle,\n    onRemove,\n    onStateChanged,\n    onCreate,\n    children,\n  }: DrawingManagerProps<T>,\n  ref: Ref<kakao.maps.drawing.DrawingManager<T>>\n) {\n  const map = useMap(\"Toolbox\")\n\n  const drawingManager = useMemo(\n    () => {\n      if (!window.kakao.maps.drawing) {\n        console.warn(\n          \"drawing 라이브러리를 별도 로드 해야 사용 가능합니다. `https://apis.map.kakao.com/web/guide/#loadlibrary`\"\n        )\n        return\n      }\n\n      return new kakao.maps.drawing.DrawingManager<T>({\n        // @ts-ignore\n        map,\n        drawingMode,\n        guideTooltip,\n        arrowOptions,\n        circleOptions,\n        ellipseOptions,\n        markerOptions,\n        polygonOptions,\n        polylineOptions,\n        rectangleOptions,\n      })\n    },\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    []\n  )\n  useImperativeHandle(ref, () => drawingManager!, [drawingManager])\n\n  useLayoutEffect(() => {\n    drawingManager && onCreate && onCreate(drawingManager)\n  }, [drawingManager, onCreate])\n\n  useDrawingManagerEvent(drawingManager, \"select\", onSelect)\n  useDrawingManagerEvent(drawingManager, \"drawstart\", onDrawstart)\n  useDrawingManagerEvent(drawingManager, \"draw\", onDraw)\n  useDrawingManagerEvent(drawingManager, \"drawend\", onDrawend)\n  useDrawingManagerEvent(drawingManager, \"drawnext\", onDrawnext)\n  useDrawingManagerEvent(drawingManager, \"cancel\", onCancle)\n  useDrawingManagerEvent(drawingManager, \"remove\", onRemove)\n  useDrawingManagerEvent(drawingManager, \"state_changed\", onStateChanged)\n\n  if (!drawingManager) return null\n\n  return (\n    <DrawingManagerContext.Provider value={drawingManager}>\n      {children}\n    </DrawingManagerContext.Provider>\n  )\n}) as unknown as <\n  T extends kakao.maps.drawing.OverlayType = kakao.maps.drawing.OverlayType\n>(\n  _props: DrawingManagerProps<T> &\n    React.RefAttributes<kakao.maps.drawing.DrawingManager<T>>\n) => null\n\nexport default DrawingManager\n","import React, {\n  Ref,\n  useContext,\n  useImperativeHandle,\n  useLayoutEffect,\n  useMemo,\n} from \"react\"\nimport useMap from \"../hooks/useMap\"\nimport { DrawingManagerContext } from \"./DrawingManager\"\n\nexport type ToolboxProps = {\n  /**\n   * Toolbox의 Position를 정의 한다.\n   */\n  position?: kakao.maps.ControlPosition\n}\n\n/**\n * 그리기 툴박스를 생성합니다.\n *\n * 해당 컴포넌트는 반드시 `DrawingManager` 컴포넌트의 자식으로 존재해야 합니다.\n */\nconst Toolbox = React.forwardRef(function (\n  { position }: ToolboxProps,\n  ref: Ref<kakao.maps.drawing.Toolbox>\n) {\n  position = position || kakao.maps.ControlPosition.TOP\n\n  const map = useMap(\"Toolbox\")\n  const drawingmanager = useContext(DrawingManagerContext)\n\n  if (!drawingmanager) {\n    throw new Error(\"Toolbox must exist inside DrawingManager Component!`\")\n  }\n\n  const toolbox = useMemo(\n    () =>\n      new kakao.maps.drawing.Toolbox({\n        drawingManager: drawingmanager,\n      }),\n    [drawingmanager]\n  )\n  useImperativeHandle(ref, () => toolbox, [toolbox])\n\n  useLayoutEffect(() => {\n    const element = toolbox.getElement()\n    map.addControl(element, position!)\n    return () => {\n      map.removeControl(element)\n    }\n  }, [map, toolbox, position])\n\n  return null\n})\n\nexport default Toolbox\n","import React, { useRef, useState, useImperativeHandle } from \"react\"\nimport useIsomorphicLayoutEffect from \"../hooks/useIsomorphicLayoutEffect\"\n\nexport interface StaticMapProps {\n  /**\n   * MapContinaer의 id에 대해서 지정합니다.\n   */\n  id?: string\n\n  /**\n   * MapContainer의 className에 대해서 지정합니다.\n   */\n  className?: string\n\n  /**\n   * MapContainer의 style에 대해서 지정합니다.\n   */\n  style?: React.CSSProperties\n\n  /**\n   * 중심으로 설정할 위치 입니다.\n   */\n  center: {\n    lat: number\n    lng: number\n  }\n\n  /**\n   * 확대 수준\n   * @default 3\n   */\n  level?: number\n\n  /**\n   * 지도 종류 (기본값: 일반 지도)\n   */\n  mapTypeId?: kakao.maps.MapTypeId\n\n  /**\n   * 이미지 지도에 표시할 마커 또는 마커 배열\n   */\n  marker:\n    | boolean\n    | {\n        /**\n         * 마커 tooltip에 표시될 내용\n         */\n        text?: string\n        /**\n         * 마커 포지션\n         */\n        position?: {\n          lat: number\n          lng: number\n        }\n      }\n    | Array<{\n        /**\n         * 마커 tooltip에 표시될 내용\n         */\n        text?: string\n        /**\n         * 마커 포지션\n         */\n        position: {\n          lat: number\n          lng: number\n        }\n      }>\n  /**\n   * StaticMap 생성 이벤트 핸들러\n   */\n  onCreate?: (maker: kakao.maps.StaticMap) => void\n}\n\nconst StaticMap = React.forwardRef<kakao.maps.StaticMap, StaticMapProps>(\n  (\n    {\n      id = \"react-kakao-maps-sdk-staticmap-container\",\n      style,\n      className,\n      center,\n      marker,\n      level,\n      mapTypeId,\n      onCreate,\n    },\n    ref\n  ) => {\n    const [map, setMap] = useState<kakao.maps.StaticMap>()\n    const container = useRef<HTMLDivElement>(null)\n\n    useIsomorphicLayoutEffect(() => {\n      if (!window.kakao) {\n        console.warn(\n          \"kakao map javascript api를 먼저 불러와야 합니다. `https://apis.map.kakao.com/web/guide`\"\n        )\n        return\n      }\n\n      const mapContainer = container.current\n      if (!mapContainer) return\n\n      kakao.maps.load(() => {\n        const _marker = (() => {\n          if (Array.isArray(marker)) {\n            return marker.map((mk) => {\n              return {\n                ...mk,\n                position: new kakao.maps.LatLng(\n                  mk.position.lat,\n                  mk.position.lng\n                ),\n              }\n            })\n          }\n          if (typeof marker === \"object\") {\n            if (!!marker.position) {\n              return {\n                ...marker,\n                position: new kakao.maps.LatLng(\n                  marker.position.lat,\n                  marker.position.lng\n                ),\n              }\n            }\n            return marker as { text: string }\n          }\n          return marker\n        })()\n        const kakaoStaticMap = new kakao.maps.StaticMap(mapContainer, {\n          center: new kakao.maps.LatLng(center.lat, center.lng),\n          level,\n          mapTypeId,\n          marker: _marker,\n        })\n\n        setMap(kakaoStaticMap)\n      })\n    }, [JSON.stringify(marker)])\n\n    useImperativeHandle(ref, () => map!, [map])\n\n    useIsomorphicLayoutEffect(() => {\n      if (map) map.setCenter(new kakao.maps.LatLng(center.lat, center.lng))\n    }, [map, center.lat, center.lng])\n\n    useIsomorphicLayoutEffect(() => {\n      if (map && level) map.setLevel(level)\n    }, [map, level])\n\n    useIsomorphicLayoutEffect(() => {\n      if (map && mapTypeId) map.setMapTypeId(mapTypeId)\n    }, [map, mapTypeId])\n\n    useIsomorphicLayoutEffect(() => {\n      if (map && onCreate) onCreate(map)\n    }, [map, onCreate])\n\n    return (\n      <div id={id} style={style} className={className} ref={container}></div>\n    )\n  }\n)\n\nexport default StaticMap\n","import React, { useEffect } from \"react\"\nimport useMap from \"../hooks/useMap\"\n\nexport interface MapTypeIdProps {\n  /**\n   * MapTypeId를 정의 한다.\n   */\n  type: kakao.maps.MapTypeId\n}\n\n/**\n * 추가적으로 보이고 싶은 지도 타입을 추가 할 때 사용한다.\n */\nconst MapTypeId: React.FC<MapTypeIdProps> = ({ type }) => {\n  const map = useMap(`MapTypeId`)\n\n  useEffect(() => {\n    map.addOverlayMapTypeId(type)\n\n    return () => {\n      map.removeOverlayMapTypeId(type)\n    }\n  }, [map, type])\n\n  return null\n}\n\nexport default MapTypeId\n","import { useEffect, useMemo, useState } from \"react\"\nimport { Loader, LoaderOptions } from \"../util/kakaoMapApiLoader\"\n\n/**\n * Kakao Map Api를 injection 합니다.\n *\n * 해당 hook은 cleanup 시점에도 Kakao Map Api를 제거 하지 않고, 동일한 hook를 여러 위치에서 호출 하더라도 최초 한번만 injection 됩니다.\n */\nconst useInjectKakaoMapApi = (options: LoaderOptions) => {\n  const [state, setState] = useState<{\n    loading: boolean\n    error: ErrorEvent | undefined\n  }>({\n    loading: true,\n    error: undefined,\n  })\n\n  const loader = useMemo(\n    () => new Loader(options),\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [JSON.stringify(options)]\n  )\n\n  useEffect(() => {\n    loader\n      .load()\n      .then(() =>\n        setState({\n          loading: false,\n          error: undefined,\n        })\n      )\n      .catch((error) =>\n        setState({\n          loading: false,\n          error: error,\n        })\n      )\n  }, [loader])\n\n  return state\n}\n\nexport default useInjectKakaoMapApi\n"],"names":["LoaderStatus","useIsomorphicLayoutEffect","window","document","useLayoutEffect","useEffect","useKakaoEvent","target","type","callback","wrapCallback","arg","slice","call","arguments","undefined","apply","concat","kakao","maps","event","addListener","removeListener","Loader","_ref","appkey","id","_ref$id","_ref$libraries","libraries","nonce","retries","_ref$retries","url","_ref$url","this","callbacks","done","loading","errors","onerrorEvent","instance","equalOptions","options","Error","JSON","stringify","isLoaded","Promise","resolve","status","FAILURE","INITIALIZED","LOADING","loadcheckcallbacks","push","e","load","_proto","prototype","_this","reject","loadCallback","err","error","fn","execute","resetIfRetryingFailed","failed","reset","deleteScript","console","warn","setScript","getElementById","createUrl","script","createElement","src","onerror","loadErrorCallback","bind","onload","defer","async","head","appendChild","source","lineno","colno","_this2","length","delay","Math","pow","log","setTimeout","join","remove","_this3","forEach","cb","a","b","i","key","get","SUCCESS","KakaoMapContext","React","createContext","Map","forwardRef","ref","as","children","center","isPanto","_ref$isPanto","padding","_ref$padding","disableDoubleClick","disableDoubleClickZoom","draggable","zoomable","keyboardShortcuts","level","maxLevel","minLevel","mapTypeId","projectionId","scrollwheel","tileAnimation","onBoundsChanged","onCenterChanged","onClick","onDoubleClick","onDrag","onDragEnd","onDragStart","onIdle","onMaptypeidChanged","onMouseMove","onRightClick","onTileLoaded","onZoomChanged","onZoomStart","onCreate","props","_objectWithoutPropertiesLoose","_excluded","Container","_useState","useState","setIsLoaded","_useState2","map","setMap","container","useRef","then","MapContainer","current","initalMapCenter","LatLng","lat","lng","Coords","x","y","kakaoMap","innerHTML","useImperativeHandle","prevCenter","getCenter","toLatLng","centerPosition","equals","panTo","setCenter","setDraggable","setZoomable","setKeyboardShortcuts","setLevel","setMapTypeId","setProjectionId","setMaxLevel","setMinLevel","Fragment","Provider","value","useMap","componentName","useContext","InfoWindow","position","marker","altitude","disableAutoPan","range","removable","zIndex","infoWindow","useMemo","kakaoInfoWindow","content","style","display","open","close","setPosition","setAltitude","setRange","setZIndex","parentElement","ReactDom","createPortal","KakaoMapMarkerClustererContext","MarkerClusterer","averageCenter","calculator","clickable","disableClickZoom","gridSize","hoverable","minClusterSize","styles","texts","onClusterclick","onClusterdblclick","onClustered","onClusterout","onClusterover","onClusterrightclick","markerClusterer","setGridSize","redraw","setMinClusterSize","setAverageCenter","setTexts","setCalculator","setStyles","MarkerClustererRedraw","_ref2","Marker","image","infoWindowOptions","onMouseOut","onMouseOver","opacity","title","markerCluster","addMarker","removeMarker","setImage","setClickable","setOpacity","setTitle","MapMarker","markerImage","_image$options","_image$options2","_image$options3","_image$options4","_image$options5","_image$options6","_image$options7","_image$options8","_image$options9","_image$options10","_image$options11","_image$options12","MarkerImage","Size","size","width","height","alt","coords","offset","Point","shape","spriteOrigin","spriteSize","markerPosition","MapInfoWindow","infoPosition","CustomOverlayMap","xAnchor","yAnchor","overlayPosition","overlay","KakaoCustomOverlay","CustomOverlay","ReactDOM","MapTypeControl","_ref$position","ControlPosition","TOPRIGHT","mapTypeControl","addControl","removeControl","ZoomControl","RIGHT","Circle","radius","fillColor","fillOpacity","strokeColor","strokeOpacity","strokeStyle","strokeWeight","onMouseover","onMouseout","onMousemove","onMousedown","circleCenter","circle","setRadius","setOptions","Polyline","path","endArrow","polyLinePath","every","v","Array","p","polyline","setPath","Polygon","polygonPath","polygon","Rectangle","bounds","rectangleBounds","LatLngBounds","sw","ne","rectangle","setBounds","Ellipse","rx","ry","ellipseCenter","ellipse","AbstractOverlay","draw","onAdd","onRemove","reactAbstractOverlay","ReactAbstractOveraly","_kakao$maps$AbstractO","KakaoRoadviewContext","Roadview","pan","panoId","panoX","panoY","tilt","zoom","onInit","onPanoidChange","onPositionChanged","onViewpointChange","onErrorGetNearestPanoId","isLoading","setIsLoading","roadview","setRoadview","_useState3","RoadviewContainer","kakaoRoadview","getPosition","getLat","getLng","newPostion","RoadviewClient","getNearestPanoId","setPanoId","getPanoId","prevViewpoint","getViewpoint","setViewpoint","_extends","useRoadview","CustomOverlayRoadview","Viewpoint","RoadviewMarker","RoadviewInfoWindow","DrawingManagerContext","useDrawingManagerEvent","DrawingManager","arrowOptions","circleOptions","ellipseOptions","markerOptions","polygonOptions","polylineOptions","rectangleOptions","drawingMode","guideTooltip","onSelect","onDrawstart","onDraw","onDrawend","onDrawnext","onCancle","onStateChanged","drawingManager","drawing","Toolbox","TOP","drawingmanager","toolbox","element","getElement","StaticMap","className","mapContainer","_marker","isArray","mk","kakaoStaticMap","addOverlayMapTypeId","removeOverlayMapTypeId","state","setState","loader","catch"],"mappings":"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"}