import { Component } from 'vue';
export type MarkerConfig = {
    kind: 'pin';
    pinOptions?: google.maps.marker.PinElementOptions;
    title?: string;
} | {
    kind: 'img';
    src: string;
    title?: string;
} | {
    kind: 'svgString';
    svg: string;
    title?: string;
} | {
    kind: 'customElement';
    createElement: () => HTMLElement;
    title?: string;
};
export interface MapControl {
    position?: google.maps.ControlPosition;
    index?: number;
    createElement: (ctx: {
        map: google.maps.Map;
    }) => HTMLElement;
}
export interface MapFocusConfig {
    name: string;
    featureType: google.maps.FeatureType;
    featureStyleOptions: google.maps.FeatureStyleOptions;
}
export interface CustomMarkerOptions {
    position: {
        lat: number;
        lng: number;
    };
    marker?: MarkerConfig;
    title?: string;
    popup?: string;
    hoverable?: boolean;
    draggable?: boolean;
    clickable?: boolean;
    onClick?: (marker: google.maps.marker.AdvancedMarkerElement) => void;
    onDragEnd?: (marker: google.maps.marker.AdvancedMarkerElement) => void;
    onHover?: (marker: google.maps.marker.AdvancedMarkerElement, isHovering: boolean) => void;
}
export declare const createMarker: (options: CustomMarkerOptions) => Promise<google.maps.marker.AdvancedMarkerElement>;
type MarkerContext<T = unknown> = {
    id: string;
    marker: google.maps.marker.AdvancedMarkerElement;
    data: T;
};
type UseMapMarkersReturn<T = unknown> = {
    markers: Map<string, MarkerContext<T>>;
    setMap: (nextMap: google.maps.Map) => void;
    addMarker: (id: string, marker: google.maps.marker.AdvancedMarkerElement, data: T, onClick?: () => void) => void;
    openMarker: (id: string, options?: {
        component?: Component;
        props?: Record<string, unknown>;
        loadData?: () => Promise<Record<string, unknown>>;
    }) => Promise<void>;
    clearMarkers: () => void;
};
export declare const useMapMarkers: <T = unknown>() => UseMapMarkersReturn<T>;
export {};
