{"version":3,"file":"react-leaflet-marker.cjs","sources":["../src/Marker.types.ts","../src/Marker.tsx","../src/hooks/useMarkerRef.ts","../src/hooks/usePlacementAsPoint.ts","../src/hooks/useLatitudeOffset.ts","../src/hooks/useZoomAnimation.ts","../src/hooks/useZIndex.ts","../src/hooks/useUpdatePosition.ts","../src/MarkerLayer.tsx"],"sourcesContent":["import { LatLngExpression } from \"leaflet\";\nimport { MutableRefObject } from \"react\";\n\nexport type SizeType = [width: number, height: number];\n\nexport enum EPlacement {\n    top = 'top',\n    center = 'center',\n    bottom = 'bottom',\n}\n\nexport type PlacementType = EPlacement | \"top\" | \"center\" | \"bottom\";\n\nexport interface IMarkerProps {\n    position: LatLngExpression;\n    innerRef?: MutableRefObject<HTMLDivElement | null>;\n    /**\n     * If `true`, the marker will get on top of others when you hover the mouse over it.\n     */\n    riseOnHover?: boolean;\n    /**\n     * The z-index offset used for the `riseOnHover` feature.\n     */\n    riseOffset?: number;\n    /**\n     * By default, marker images zIndex is set automatically based on its latitude. Use this option if you want to put the marker on top of all others (or below), specifying a high value like `1000` (or high negative value, respectively).\n     */\n    zIndexOffset?: number;\n    /**\n     * If set `false`, the marker won't respond to mouse\n     * By default `true`\n     */\n    interactive?: boolean;\n    /**\n     * width, height\n     */\n    size?: SizeType;\n    placement?: PlacementType;\n}","import classNames from \"classnames\";\nimport React, {FC, PropsWithChildren} from 'react';\n\nimport useLatitudeOffset from \"./hooks/useLatitudeOffset\";\nimport useMarkerRef from \"./hooks/useMarkerRef\";\nimport usePlacementAsPoint from \"./hooks/usePlacementAsPoint\";\nimport useUpdatePosition from \"./hooks/useUpdatePosition\";\nimport useZIndex from \"./hooks/useZIndex\";\nimport useZoomAnimation from \"./hooks/useZoomAnimation\";\nimport styles from './Marker.module.css';\nimport { EPlacement, IMarkerProps } from \"./Marker.types\";\n\n\nconst Marker: FC<PropsWithChildren<IMarkerProps>> = ({\n    children,\n    position,\n    size,\n    innerRef,\n    riseOffset = 250,\n    zIndexOffset = 0,\n    interactive= false,\n    riseOnHover = false,\n    placement = EPlacement.center,\n}) => {\n    const markerRef = useMarkerRef(innerRef);\n    const placementAsPoint = usePlacementAsPoint(placement, size);\n    const latitudeOffset = useLatitudeOffset(placementAsPoint, position);\n    const hasAnimation = useZoomAnimation(placementAsPoint, position, markerRef);\n    const [ zIndex, domEvents ] = useZIndex(\n        latitudeOffset,\n        zIndexOffset,\n        riseOffset,\n        riseOnHover\n    );\n    useUpdatePosition(\n        placementAsPoint,\n        position,\n        markerRef,\n    );\n    const [width, height] = size ?? [];\n\n    return (\n        <div\n            ref={markerRef}\n            onMouseEnter={domEvents?.onMouseEnter}\n            onMouseLeave={domEvents?.onMouseLeave}\n            className={classNames(styles.wrapper, {\n                [styles.wrapper_interactive]: interactive,\n                ['leaflet-zoom-animated']: hasAnimation,\n                ['leaflet-zoom-hide']: !hasAnimation,\n            })}\n            style={{\n                zIndex,\n                width,\n                height,\n            }}\n        >\n            {children}\n        </div>\n    );\n}\n\nexport default Marker;","import { MutableRefObject, useEffect, useRef } from \"react\";\n\nconst useMarkerRef = (innerRef?: MutableRefObject<HTMLDivElement | null>) => {\n    const markerRef = useRef<HTMLDivElement>(null);\n\n    useEffect(() => {\n        if (innerRef) {\n            innerRef.current = markerRef.current;\n        }\n    }, [innerRef]);\n\n    return markerRef;\n};\n\nexport default useMarkerRef;","import { Point, point } from \"leaflet\";\nimport { useMemo } from \"react\";\n\nimport {EPlacement, PlacementType, SizeType} from \"../Marker.types\";\n\nconst usePlacementAsPoint = (placement: PlacementType, size?: SizeType): Point => {\n    return useMemo(() => {\n        if (!size) return point(0, 0);\n        let subX, subY;\n\n        if (placement === EPlacement.top) {\n            subX = size[0] / 2;\n            subY = size[1];\n        } else if (placement === EPlacement.bottom) {\n            subX = size[0] / 2;\n            subY = 0;\n            // EPlacement.center\n        } else {\n            subX = size[0] / 2;\n            subY = size[1] / 2;\n        }\n\n        return point(subX, subY, true);\n    }, [size, placement]);\n}\n\nexport default usePlacementAsPoint;","import { LatLngExpression, Point } from \"leaflet\";\nimport { useMemo } from \"react\";\nimport { useMap } from \"react-leaflet\";\n\nconst useLatitudeOffset = (placementAsPoint: Point, position: LatLngExpression) => {\n    const map = useMap();\n\n    return useMemo(\n        () => map\n            .latLngToLayerPoint(position)\n            .subtract(placementAsPoint)\n            .round().y,\n        [map, placementAsPoint, position]\n    );\n}\n\nexport default useLatitudeOffset;","import { DomUtil, LatLngExpression, Point, ZoomAnimEventHandlerFn } from \"leaflet\";\nimport { RefObject, useCallback, useEffect } from \"react\";\nimport { useMap } from \"react-leaflet\";\n\nconst useZoomAnimation = (\n    placementPoint: Point,\n    position: LatLngExpression,\n    ref: RefObject<HTMLDivElement>\n) => {\n    const map = useMap();\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-ignore\n    const hasAnimation = map._zoomAnimated && map.options.markerZoomAnimation;\n\n    const animateZoom: ZoomAnimEventHandlerFn = useCallback((e) => {\n        if (!ref.current) return;\n\n        // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n        // @ts-ignore\n        const point = map._latLngToNewLayerPoint(position, e.zoom, e.center).subtract(placementPoint).round();\n\n        DomUtil.setPosition(\n            ref.current,\n            point,\n        );\n    }, [map, placementPoint, position, ref]);\n\n    useEffect(() => {\n        if (!hasAnimation) return;\n        map.on('zoomanim', animateZoom);\n\n        return () => {\n            map.off('zoomanim', animateZoom);\n        }\n    });\n\n    return hasAnimation;\n}\n\nexport default useZoomAnimation;","import { useState } from \"react\";\n\nconst useZIndex = (latitudeOffset: number, zIndexOffset: number, riseOffset: number, riseOnHover: boolean) => {\n    const [bringToFront, setBringToFront] = useState(false);\n\n    const zIndex: number = latitudeOffset + zIndexOffset + (bringToFront ? riseOffset : 0);\n\n    const events: {\n        onMouseEnter: () => void,\n        onMouseLeave: () => void,\n    } | null = riseOnHover ? {\n        onMouseEnter: () => setBringToFront(true),\n        onMouseLeave: () => setBringToFront(false),\n    } : null;\n\n    return [zIndex, events] as const;\n};\n\nexport default useZIndex;","import { DomUtil, LatLngExpression, Point } from \"leaflet\";\nimport { RefObject, useCallback, useEffect, useLayoutEffect } from \"react\";\nimport { useMap } from \"react-leaflet\";\n\nconst useUpdatePosition = (placementAsPoint: Point, position: LatLngExpression, ref: RefObject<HTMLDivElement>) => {\n    const map = useMap()\n    const setPos = useCallback((newPosition: LatLngExpression) => {\n        if (!ref.current) return;\n\n        const point = map.latLngToLayerPoint(newPosition).subtract(placementAsPoint).round();\n\n        DomUtil.setPosition(\n            ref.current,\n            point,\n        );\n    }, [map, placementAsPoint, ref]);\n\n    const update = useCallback(() => {\n        setPos(position);\n    }, [setPos, position]);\n\n    useLayoutEffect(() => {\n        update();\n    }, [update])\n\n    useEffect(() => {\n        map.on('zoom', update);\n        map.on('viewreset', update);\n\n        return () => {\n            map.off('zoom', update);\n            map.off('viewreset', update);\n        }\n    }, [map, update]);\n};\n\nexport default useUpdatePosition;","import React, { FC, ReactElement, useEffect, useRef } from \"react\";\nimport { useMap } from \"react-leaflet\";\n\nimport { IMarkerProps } from \"./Marker.types\";\nimport { IMarkerLayerProps } from \"./MarkerLayer.types\";\n\nconst MarkerLayer: FC<IMarkerLayerProps> = ({\n  children,\n  pane = \"overlayPane\",\n}) => {\n  const map = useMap();\n  const layerRef = useRef<HTMLDivElement>(null);\n\n  useEffect(() => {\n    const element = layerRef.current;\n    if (!element) return;\n\n    const paneElement = map.getPanes()[pane];\n    paneElement.appendChild(element);\n    return () => {\n      paneElement.removeChild(element);\n    };\n  }, [map, pane]);\n\n  return (\n    <div ref={layerRef} className=\"leaflet-objects-pane leaflet-marker-pane\">\n      {React.Children.map(children, (child) =>\n        React.cloneElement(child as ReactElement<IMarkerProps>)\n      )}\n    </div>\n  );\n};\n\nexport default MarkerLayer;\n"],"names":["EPlacement","_ref","_classNames","children","position","size","_ref$riseOffset","riseOffset","_ref$zIndexOffset","zIndexOffset","_ref$interactive","interactive","_ref$riseOnHover","riseOnHover","_ref$placement","placement","center","markerRef","innerRef","useRef","useEffect","current","useMarkerRef","placementAsPoint","useMemo","top","subX","subY","bottom","point","usePlacementAsPoint","latitudeOffset","map","useMap","latLngToLayerPoint","subtract","round","y","useLatitudeOffset","hasAnimation","placementPoint","ref","_zoomAnimated","options","markerZoomAnimation","animateZoom","useCallback","e","_latLngToNewLayerPoint","zoom","DomUtil","setPosition","on","off","useZoomAnimation","_useZIndex","_useState","useState","setBringToFront","onMouseEnter","onMouseLeave","useZIndex","zIndex","domEvents","useUpdatePosition","setPos","newPosition","update","useLayoutEffect","width","height","_ref2","React","createElement","className","classNames","styles","style","pane","_ref$pane","layerRef","element","paneElement","getPanes","appendChild","removeChild","Children","child","cloneElement"],"mappings":"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"}