{"version":3,"file":"MapPlacemark.mjs","sources":[""],"sourcesContent":["import { Placemark, useYMaps } from \"@pbe/react-yandex-maps\";\r\nimport { isMediaQuery } from \"@web3r/flowerkit/css\";\r\nimport type { FC, ReactNode, RefObject } from \"react\";\r\nimport {\r\n  useMemo, useEffect, useState, useCallback, useRef, useContext,\r\n} from \"react\";\r\nimport type { IEvent, Placemark as PlacemarkInstance } from \"yandex-maps\";\r\nimport { constants } from \"../../../constants\";\r\nimport { mapDefaults, pointDefaults } from \"../config\";\r\nimport type {\r\n  TPoint,\r\n  TPointOptions,\r\n  TMapContext,\r\n  TFactoryCallback,\r\n  TMapActionArg,\r\n  TConstructorInstance,\r\n  TCluster,\r\n  TPanelData, TMapInstance, ILayoutHint, ILayoutBalloon, ILayoutIcon, TBalloonInstance,\r\n} from \"../config/types\";\r\nimport { MapContext } from \"../context\";\r\nimport {\r\n  bindEvents, manageGeoObjectClass, getNodeFromElementInstance, getMapMoveWithPx,\r\n} from \"../lib\";\r\nimport {\r\n  PlacemarkInstanceLayout,\r\n  getNodeFromPlacemarkEvent,\r\n  getPropFromInstanceLayout,\r\n  handlePreventableEvent,\r\n  getPointDataForCallback,\r\n  getInView,\r\n  getWithBalloon,\r\n  getNextClustersByPointClick,\r\n  handleBalloonDestroy,\r\n} from \"../lib/placemark\";\r\n\r\ntype TMapPlacemarkProps = {\r\n  point: TPoint;\r\n  cluster: TCluster;\r\n  activePointsCountRef: RefObject<number>;\r\n  isPanel: boolean;\r\n};\r\n\r\n\r\n/**\r\n * Внутренний компонент содержимого карты\r\n\r\n * @returns {ReactElement}\r\n */\r\nexport const MapPlacemark: FC<TMapPlacemarkProps> = ({\r\n  point,\r\n  activePointsCountRef,\r\n  isPanel,\r\n}: TMapPlacemarkProps): ReactNode => {\r\n\r\n  const {\r\n    onAction,\r\n    stateActions: { setClusters, setPanelData, setPointState },\r\n    getCN,\r\n    api,\r\n    instanceRef: mapRef,\r\n    balloonRef,\r\n    containerRef,\r\n    maxActivePoints,\r\n    currentClusters,\r\n  } = useContext<TMapContext>(MapContext);\r\n\r\n  const ymaps = useYMaps(api?.load ?? mapDefaults.api!.load);\r\n\r\n  // Panel data\r\n  const pointPanelDataRef = useRef<TPanelData>(null);\r\n\r\n  // instance state\r\n  const [ instance, setInstance ] = useState<PlacemarkInstance | null>(null);\r\n\r\n  // clicked state\r\n  const [ isActive, setIsActive ] = useState<boolean>(point.state?.isActive ?? pointDefaults.state.isActive);\r\n\r\n  // visibility state\r\n  const [ isDisabled, setIsDisabled ] = useState<boolean>(point.state?.isDisabled ?? pointDefaults.state.isDisabled);\r\n\r\n  // interactivity state\r\n  const [ isInteract, setIsInteract ] = useState<boolean>(point.state?.isHasInteraction ?? pointDefaults.state.isHasInteraction);\r\n\r\n  // prev activity state\r\n  const prevActive = useRef<boolean>(isActive);\r\n\r\n  // prev disabled state\r\n  const prevDisabled = useRef<boolean>(isDisabled);\r\n\r\n  // stored calculated nextIsActive for onAction callback\r\n  const nextIsActiveRef = useRef<boolean>(false);\r\n\r\n  // first sync flag for initial active point handling\r\n  const isFirstStateSyncRef = useRef<boolean>(true);\r\n\r\n  // Balloon opening flag\r\n  const isBalloonOpening = useRef<boolean>(false);\r\n\r\n  // layout state\r\n  const [ layout, setLayout ] = useState<{\r\n    isReady: boolean;\r\n    instance: {\r\n      icon: TConstructorInstance<ILayoutIcon> | \"\";\r\n      hint: TConstructorInstance<ILayoutHint> | \"\";\r\n      balloon: TConstructorInstance<ILayoutBalloon> | \"\";\r\n    };\r\n  }>({\r\n    isReady: false,\r\n    instance: {\r\n      icon: \"\",\r\n      hint: \"\",\r\n      balloon: \"\",\r\n    },\r\n  });\r\n\r\n  // stateActions\r\n  const stateActions = {\r\n    setIsActive,\r\n    setIsDisabled,\r\n    setIsInteract,\r\n    setPanelData,\r\n  };\r\n\r\n  const openPanelForPoint = useCallback(() => {\r\n    if (!isPanel) {\r\n      return;\r\n    }\r\n    const panelData = {\r\n      ...getPointDataForCallback(point),\r\n      onClose: () => {\r\n        pointPanelDataRef.current = null;\r\n        setIsActive(false);\r\n      },\r\n    };\r\n    setPanelData((prevData: TPanelData) => {\r\n      if (typeof prevData?.onClose === \"function\" && prevData?.id !== point.id) {\r\n        prevData.onClose();\r\n      }\r\n      return panelData;\r\n    });\r\n    pointPanelDataRef.current = panelData;\r\n  }, [ isPanel, point, setPanelData ]);\r\n\r\n  useEffect(() => {\r\n    if (!isPanel || !isActive || pointPanelDataRef.current) {\r\n      return;\r\n    }\r\n    openPanelForPoint();\r\n  }, [ isPanel, isActive, openPanelForPoint ]);\r\n\r\n  useEffect(() => {\r\n    const currentActiveState = point.state?.isActive ?? pointDefaults.state.isActive;\r\n    if (currentActiveState !== isActive) {\r\n      setIsActive(currentActiveState);\r\n    }\r\n    if (point.state?.isDisabled !== isDisabled) {\r\n      setIsDisabled(point.state?.isDisabled ?? pointDefaults.state.isDisabled);\r\n    }\r\n    if (point.state?.isHasInteraction !== isInteract) {\r\n      setIsInteract(point.state?.isHasInteraction ?? pointDefaults.state.isHasInteraction);\r\n    }\r\n  }, [ point.state?.isActive, point.state?.isDisabled, point.state?.isHasInteraction, point ]);\r\n\r\n  // balloon activity\r\n  const handleBalloonActivity = useCallback<TFactoryCallback<TBalloonInstance>>((type, Balloon) => {\r\n\r\n    function onBalloonClick(e: IEvent<PointerEvent>) {\r\n      const originalEvent = e.get(\"domEvent\").originalEvent;\r\n      const target: EventTarget | null = originalEvent.target;\r\n      if (target && (target as HTMLElement).hasAttribute(\"data-js-map-balloon-close\")) {\r\n        originalEvent.preventDefault();\r\n        Balloon.events.fire(\"close\");\r\n      }\r\n    }\r\n\r\n    // balloon closing\r\n    function onBalloonClose() {\r\n      setIsActive(false);\r\n    }\r\n\r\n    const getActionArgs = (type: \"balloonOpen\" | \"balloonClose\"): TMapActionArg => {\r\n      return {\r\n        stateActions,\r\n        el: Balloon.getElement(),\r\n        ref: instance,\r\n        getData: () => {\r\n          return {\r\n            type,\r\n            point,\r\n          };\r\n        },\r\n      };\r\n    };\r\n    switch (type) {\r\n      case \"build\": {\r\n        Balloon.events.add(\"click\", onBalloonClick);\r\n        Balloon.events.add(\"close\", onBalloonClose);\r\n\r\n        // append current instance\r\n        balloonRef.current = Balloon;\r\n\r\n        const geoObject = Balloon?.getData()?.geoObject;\r\n        if (geoObject) {\r\n          const map: TMapInstance = geoObject.getMap();\r\n          if (map) {\r\n            const balloonNode: HTMLElement = Balloon.getElement();\r\n            const balloonLayout = balloonNode.children[0];\r\n            balloonLayout.classList.add(\"isAnimating\");\r\n\r\n            const parentLayout: HTMLElement = Balloon.getParentElement();\r\n            parentLayout.classList.add(getCN(\"balloons\"));\r\n\r\n            (parentLayout.parentNode as HTMLElement)!.style.zIndex = point.options?.panelZIndex ?? \"6003\";\r\n\r\n            const coords = geoObject?.geometry?.getCoordinates() as [ number, number ];\r\n\r\n            balloonNode.addEventListener(\"transitionend\", async () => {\r\n              const callback = () => {\r\n                balloonLayout.classList.remove(\"isAnimating\");\r\n                if (typeof onAction === \"function\") {\r\n                  onAction(getActionArgs(\"balloonOpen\"));\r\n                }\r\n              };\r\n              if (isMediaQuery(`(${constants.mediaQueries.mobile})`)) {\r\n                callback();\r\n              } else { // desktop-only centering\r\n                const x = balloonNode.offsetWidth / 2;\r\n                const y = (balloonNode.offsetHeight / 2);\r\n                await getMapMoveWithPx(map, coords, x, y)\r\n                  .then(() => {\r\n                    return callback();\r\n                  })\r\n                  .catch((err: Error) => {\r\n                    console.error(err);\r\n                  });\r\n              }\r\n            }, {\r\n              once: true,\r\n            });\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      case \"destroy\": {\r\n        // remove current instance\r\n        balloonRef.current = null;\r\n\r\n        // @ts-expect-error (api)\r\n        Balloon.events.remove(\"click\", onBalloonClick);\r\n        Balloon.events.remove(\"close\", onBalloonClose);\r\n        handleBalloonDestroy({\r\n          setIsActive,\r\n          onAction,\r\n          getActionArgs: () => getActionArgs(\"balloonClose\"),\r\n        });\r\n        break;\r\n      }\r\n    }\r\n  }, [ instance, getCN, balloonRef, point, stateActions, onAction ]);\r\n\r\n  // onClick\r\n  const handleClick = useCallback((event: IEvent) => {\r\n\r\n    // @ts-expect-error (api)\r\n    const clickedPointId: string = event.originalEvent?.target?.properties?.get?.(\"idPoint\");\r\n\r\n    if (clickedPointId !== point.id) {\r\n      return;\r\n    }\r\n\r\n    const getNextByClick = (clusters: TCluster[]) => getNextClustersByPointClick({\r\n      clusters,\r\n      pointId: point.id,\r\n      maxActivePoints,\r\n    });\r\n\r\n    nextIsActiveRef.current = getNextByClick(currentClusters).nextIsActive;\r\n\r\n    const defaultFn = () => {\r\n      if (isInteract) {\r\n        setClusters((clustersState: TCluster[]) => {\r\n          const { nextClusters, nextIsActive } = getNextByClick(clustersState);\r\n          nextIsActiveRef.current = nextIsActive;\r\n          return nextClusters;\r\n        }, false);\r\n      }\r\n    };\r\n\r\n    const action = typeof onAction === \"function\" ? () => {\r\n      onAction({\r\n        event,\r\n        stateActions,\r\n        el: getNodeFromPlacemarkEvent(event),\r\n        ref: instance,\r\n        getData: () => {\r\n          return {\r\n            type: \"pointClick\",\r\n            point: getPointDataForCallback(point),\r\n            state: {\r\n              isActive: nextIsActiveRef.current,\r\n              isInteract,\r\n              isDisabled,\r\n            },\r\n          };\r\n        },\r\n      });\r\n    } : undefined;\r\n\r\n    handlePreventableEvent({ event, action, defaultFn });\r\n  }, [ point, maxActivePoints, isInteract, onAction, instance, stateActions, setClusters, isDisabled, currentClusters ]);\r\n\r\n  // onMouseLeave\r\n  const handleMouseLeave = (event: IEvent) => {\r\n\r\n    const defaultFn = async () => {\r\n      const Hint = instance?.hint;\r\n      if (Hint?.isOpen()) {\r\n        await getNodeFromElementInstance(Hint)\r\n          .then((node) => {\r\n            return manageGeoObjectClass(node, constants.stateClasses.visible, false, () => {\r\n              Hint?.close();\r\n            });\r\n          })\r\n          .catch((err: Error) => {\r\n            console.error(err);\r\n          });\r\n      }\r\n    };\r\n\r\n    const action = typeof onAction === \"function\" ? () => {\r\n      onAction({\r\n        event,\r\n        stateActions,\r\n        el: getNodeFromPlacemarkEvent(event),\r\n        ref: instance,\r\n        getData: () => {\r\n          return {\r\n            type: \"pointMouseleave\",\r\n            point: getPointDataForCallback(point),\r\n          };\r\n        },\r\n      });\r\n    } : undefined;\r\n\r\n    handlePreventableEvent({ event, action, defaultFn });\r\n\r\n  };\r\n\r\n  // onMouseEnter\r\n  const handleMouseEnter = (event: IEvent) => {\r\n\r\n    const defaultFn = async () => {\r\n      const Hint = instance?.hint;\r\n      if (!Hint?.isOpen() && !instance?.balloon?.isOpen()) {\r\n        await Hint?.open()\r\n          .then(async () => {\r\n            const node = await getNodeFromElementInstance(Hint);\r\n            return manageGeoObjectClass(node, constants.stateClasses.visible, true);\r\n          })\r\n          .catch((err: Error) => {\r\n            console.error(err);\r\n          });\r\n      }\r\n    };\r\n\r\n    const action = typeof onAction === \"function\" ? () => {\r\n      onAction({\r\n        event,\r\n        stateActions,\r\n        el: getNodeFromPlacemarkEvent(event),\r\n        ref: instance,\r\n        getData: () => {\r\n          return {\r\n            type: \"pointMouseenter\",\r\n            point: getPointDataForCallback(point),\r\n          };\r\n        },\r\n      });\r\n    } : undefined;\r\n\r\n    handlePreventableEvent({ event, action, defaultFn });\r\n  };\r\n\r\n  // placemark options\r\n  const computedOptions = useMemo<TPointOptions>(() => {\r\n\r\n    // default sizes\r\n    const [ defaultWidth, defaultHeight ] = pointDefaults.icon.size;\r\n\r\n    // user sizes\r\n    const [\r\n      currentWidth = defaultWidth,\r\n      currentHeight = defaultHeight,\r\n    ] = point.icon?.size ?? pointDefaults.icon.size;\r\n\r\n    // balloon offset\r\n    const balloonOffset: [ number, number ] = [ currentWidth / 2, currentHeight / 2 ];\r\n\r\n    // hint offset\r\n    const hintOffset: [ number, number ] = [ currentWidth / 2, currentHeight / 2 ];\r\n\r\n    // icon offset\r\n    const iconOffset: [ number, number ] = [ currentWidth / -2, currentHeight / -2 ];\r\n\r\n    // layouts\r\n    const { hint, balloon, icon } = layout.instance;\r\n\r\n    // elements\r\n    const isBalloon = !!getPropFromInstanceLayout(balloon, \"title\") || !!getPropFromInstanceLayout(balloon, \"description\");\r\n    const isHint = !!getPropFromInstanceLayout(hint, \"title\") || !!getPropFromInstanceLayout(hint, \"description\");\r\n\r\n    // cursor\r\n    const cursor = (isInteract || isHint) ? \"pointer\" : \"default\";\r\n\r\n    return {\r\n      iconOffset,\r\n      iconShape: {\r\n        type: \"Rectangle\",\r\n        coordinates: [\r\n          [ 0, 0 ],\r\n          [ currentWidth, currentHeight ],\r\n        ],\r\n      },\r\n      openBalloonOnClick: false,\r\n      openHintOnHover: false,\r\n      hideIconOnBalloonOpen: false,\r\n      balloonAutoPan: true,\r\n      balloonAutoPanUseMapMargin: true,\r\n      balloonAutoPanCheckZoomRange: true,\r\n      balloonShadow: false,\r\n      cursor,\r\n      balloonOffset,\r\n      hintOffset,\r\n      hintLayout: hint,\r\n      hintCloseTimeout: 200,\r\n      hintOpenTimeout: 0,\r\n      iconLayout: icon,\r\n      balloonLayout: balloon,\r\n      balloonCloseTimeout: 200,\r\n      visible: !isDisabled,\r\n      hasBalloon: isBalloon,\r\n      hasHint: isHint,\r\n      draggable: false,\r\n      balloonPanelMaxMapArea: 0,\r\n      ...point.options,\r\n    };\r\n  }, [ isInteract, isDisabled, point.options, layout ]);\r\n\r\n  // placemark props\r\n  const computedProperties = useMemo(() => {\r\n    const { hint, balloon } = layout.instance;\r\n    return {\r\n      // balloon\r\n      balloonHeader: getPropFromInstanceLayout(balloon, \"title\"),\r\n      balloonContent: getPropFromInstanceLayout(balloon, \"description\"),\r\n\r\n      // hint\r\n      hintHeader: getPropFromInstanceLayout(hint, \"title\"),\r\n      hintContent: getPropFromInstanceLayout(hint, \"description\"),\r\n\r\n      // states\r\n      isDisabled,\r\n      isActive,\r\n      isInteract,\r\n\r\n      // meta\r\n      idPoint: point.id,\r\n      coords: point.coords,\r\n    };\r\n  }, [ isInteract, isActive, isDisabled, layout ]);\r\n\r\n  useEffect(() => {\r\n    if (!!instance) {\r\n\r\n      // set layout\r\n      if (!layout.isReady) {\r\n        const commonArgs = {\r\n          ymaps, props: point, getCN, map: mapRef.current,\r\n        };\r\n        Promise.all([\r\n          PlacemarkInstanceLayout<ILayoutBalloon>({ ...commonArgs, type: \"balloon\", callback: handleBalloonActivity }),\r\n          PlacemarkInstanceLayout<ILayoutIcon>({ ...commonArgs, type: \"icon\" }),\r\n          PlacemarkInstanceLayout<ILayoutHint>({ ...commonArgs, type: \"hint\" }),\r\n        ])\r\n          .then(([ balloon, icon, hint ]) => {\r\n            return setLayout({\r\n              isReady: true,\r\n              instance: {\r\n                balloon,\r\n                icon,\r\n                hint,\r\n              },\r\n            });\r\n          })\r\n          .catch((err: Error) => {\r\n            console.error(err);\r\n          });\r\n      }\r\n\r\n      // set/remove events\r\n      const events = [\r\n        {\r\n          event: \"click\",\r\n          handler: handleClick,\r\n        },\r\n        {\r\n          event: \"mouseenter\",\r\n          handler: handleMouseEnter,\r\n        },\r\n        {\r\n          event: \"mouseleave\",\r\n          handler: handleMouseLeave,\r\n        },\r\n      ];\r\n      bindEvents(instance, events, false);\r\n      bindEvents(instance, events, true);\r\n\r\n      const shouldSyncInitialActiveState = isFirstStateSyncRef.current && isActive;\r\n      isFirstStateSyncRef.current = false;\r\n\r\n      if (shouldSyncInitialActiveState && isPanel) {\r\n        openPanelForPoint();\r\n      }\r\n\r\n      // set activity or disabled state (only for interactive point)\r\n      if (isInteract) {\r\n\r\n        const isDisabledChanged = prevDisabled.current !== isDisabled;\r\n        const isActivityChanged = prevActive.current !== isActive;\r\n\r\n        // set a disabled state\r\n        if (isDisabledChanged) {\r\n          // update prev ref of disabled state\r\n          prevDisabled.current = isDisabled;\r\n        }\r\n\r\n        // check activity if changed or initially active\r\n        if (isActivityChanged || shouldSyncInitialActiveState) {\r\n\r\n          // update prev ref of activity\r\n          prevActive.current = isActive;\r\n\r\n          if (isActive) {\r\n\r\n            // increase active count only when state is changed by user interaction\r\n            if (isActivityChanged) {\r\n              activePointsCountRef.current++;\r\n            }\r\n\r\n            // show panel if exist\r\n            if (isPanel && isActivityChanged) {\r\n              openPanelForPoint();\r\n            }\r\n\r\n          } else {\r\n            // decrease active count\r\n            if (activePointsCountRef.current > 0) {\r\n              activePointsCountRef.current--;\r\n            }\r\n\r\n            // clear panel data\r\n            if (isPanel && pointPanelDataRef.current) {\r\n              setPanelData(null);\r\n            }\r\n          }\r\n        }\r\n\r\n        // update cluster state\r\n        if (isActivityChanged || isDisabledChanged || shouldSyncInitialActiveState) {\r\n          setPointState(point.id, {\r\n            isActive,\r\n            isDisabled,\r\n          });\r\n        }\r\n      }\r\n\r\n      return () => {\r\n        // remove listeners on unmounting\r\n        bindEvents(instance, events, false);\r\n      };\r\n    }\r\n  }, [ instance, isActive, isDisabled, ymaps, handleClick, isPanel, openPanelForPoint ]);\r\n\r\n  useEffect(() => {\r\n    // open or close balloon if API are ready\r\n    if (!instance?.balloon) {\r\n      isBalloonOpening.current = false;\r\n      return;\r\n    }\r\n\r\n    let isDisposed = false;\r\n\r\n    const applyBalloonState = async () => {\r\n\r\n      // Update loading ref\r\n      isBalloonOpening.current = true;\r\n\r\n      if (isActive) {\r\n        if (instance.balloon.isOpen()) {\r\n          return;\r\n        }\r\n\r\n        // When switching active points we should release link to previous balloon\r\n        // so new active point can be opened in the same cycle.\r\n        const prevBalloon = balloonRef.current;\r\n        if (prevBalloon && prevBalloon !== instance.balloon) {\r\n          try {\r\n            if (prevBalloon.isOpen?.()) {\r\n              await prevBalloon.close();\r\n            }\r\n          } catch (err) {\r\n            console.error(\"[Map] Failed to close previous balloon:\", err);\r\n          } finally {\r\n            if (balloonRef.current === prevBalloon) {\r\n              balloonRef.current = null;\r\n            }\r\n          }\r\n        }\r\n\r\n        if (isDisposed) {\r\n          return;\r\n        }\r\n\r\n        balloonRef.current = instance.balloon;\r\n        await getInView(instance, mapRef, point, containerRef)\r\n          .then(() => getNodeFromElementInstance(instance.balloon))\r\n          .then((node: HTMLElement | null) => manageGeoObjectClass(node, constants.stateClasses.visible, true))\r\n          .catch((err: Error) => {\r\n            console.error(err);\r\n            if (balloonRef.current === instance.balloon) {\r\n              balloonRef.current = null;\r\n            }\r\n          });\r\n      } else {\r\n        if (instance.balloon.isOpen()) { // check if balloon is open\r\n          await getNodeFromElementInstance(instance.balloon)\r\n            .then((node) => {\r\n              return manageGeoObjectClass(node, constants.stateClasses.visible, false, async () => {\r\n                return getWithBalloon(instance, false, containerRef);\r\n              });\r\n            })\r\n            .catch((err: Error) => {\r\n              console.error(err);\r\n            });\r\n        }\r\n        // clear ref if this is current balloon\r\n        if (balloonRef.current === instance.balloon) {\r\n          balloonRef.current = null;\r\n        }\r\n      }\r\n    };\r\n\r\n    if (!isBalloonOpening.current) {\r\n      applyBalloonState()\r\n        .finally(() => {\r\n          isBalloonOpening.current = false;\r\n        });\r\n    }\r\n    return () => {\r\n      isDisposed = true;\r\n    };\r\n  }, [ instance?.balloon, isActive, layout.isReady ]);\r\n\r\n  return (\r\n    <Placemark\r\n      // @ts-expect-error (api bug)\r\n      instanceRef={(inst: PlacemarkInstance) => {\r\n        if (inst && !instance) {\r\n          setInstance(inst);\r\n        }\r\n      }}\r\n      properties={computedProperties}\r\n      geometry={point.coords}\r\n      options={computedOptions}\r\n    />\r\n  );\r\n\r\n};\r\n"],"names":["MapPlacemark","point","activePointsCountRef","isPanel","onAction","stateActions","setClusters","setPanelData","setPointState","getCN","api","instanceRef","mapRef","balloonRef","containerRef","maxActivePoints","currentClusters","useContext","MapContext","ymaps","useYMaps","load","mapDefaults","pointPanelDataRef","useRef","instance","setInstance","useState","isActive","setIsActive","state","pointDefaults","isDisabled","setIsDisabled","isInteract","setIsInteract","isHasInteraction","prevActive","prevDisabled","nextIsActiveRef","isFirstStateSyncRef","isBalloonOpening","layout","setLayout","isReady","icon","hint","balloon","openPanelForPoint","useCallback","panelData","getPointDataForCallback","onClose","current","prevData","id","useEffect","currentActiveState","handleBalloonActivity","type","Balloon","onBalloonClick","e","originalEvent","get","target","hasAttribute","preventDefault","events","fire","onBalloonClose","getActionArgs","el","getElement","ref","getData","add","geoObject","map","getMap","balloonNode","balloonLayout","children","classList","parentLayout","getParentElement","parentNode","style","zIndex","options","panelZIndex","coords","geometry","getCoordinates","addEventListener","async","callback","remove","isMediaQuery","constants","mediaQueries","mobile","x","offsetWidth","y","offsetHeight","getMapMoveWithPx","then","catch","err","console","error","once","handleBalloonDestroy","handleClick","event","clickedPointId","properties","getNextByClick","clusters","getNextClustersByPointClick","pointId","nextIsActive","defaultFn","clustersState","nextClusters","action","getNodeFromPlacemarkEvent","undefined","handlePreventableEvent","handleMouseLeave","Hint","isOpen","getNodeFromElementInstance","node","manageGeoObjectClass","stateClasses","visible","close","handleMouseEnter","open","computedOptions","useMemo","defaultWidth","defaultHeight","size","currentWidth","currentHeight","balloonOffset","hintOffset","iconOffset","isBalloon","getPropFromInstanceLayout","isHint","cursor","iconShape","coordinates","openBalloonOnClick","openHintOnHover","hideIconOnBalloonOpen","balloonAutoPan","balloonAutoPanUseMapMargin","balloonAutoPanCheckZoomRange","balloonShadow","hintLayout","hintCloseTimeout","hintOpenTimeout","iconLayout","balloonCloseTimeout","hasBalloon","hasHint","draggable","balloonPanelMaxMapArea","computedProperties","balloonHeader","balloonContent","hintHeader","hintContent","idPoint","commonArgs","props","Promise","all","PlacemarkInstanceLayout","handler","bindEvents","shouldSyncInitialActiveState","isDisabledChanged","isActivityChanged","isDisposed","applyBalloonState","prevBalloon","getInView","getWithBalloon","finally","_jsx","Placemark","inst"],"mappings":"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"}