import type { IStore } from '../../store';
import type { IPlayerControlsRef } from '../../types';
/**
 * Если смотреть по порядку расположения типов, то чем дальше тип, тем выше у него zIndex.
 *
 * over_video - слот будет находиться над видео;
 * over_controls - слот будет находиться над контролами, но под меню настроек.
 */
export type SlotOverlay = 'over_video' | 'over_controls';
export declare const SLOT_NAME = "annotation";
export type HideControlsWhenIntersectedOptions = {
    observedSlotElementId: string;
    controlsToObserve: (keyof IPlayerControlsRef)[];
};
type AddOptions = {
    id: string;
    overlay: SlotOverlay;
    hideAllControls?: boolean;
    controlsBehaviour?: HideControlsWhenIntersectedOptions;
};
type AddReturnType = {
    success: true;
} | {
    success: false;
    message: string;
};
export declare class SlotsApi {
    private shadowRootContainer;
    private slots;
    private store;
    private disabledIds;
    constructor(disabledIds: string[]);
    init(shadowRootContainer: HTMLElement, store: IStore | undefined): void;
    add(elementParam: HTMLElement | (() => HTMLElement), options: AddOptions): AddReturnType;
    private setupSlotStyles;
    /**
     * Запускаем отслеживание пересечения между переданным элементом внутри слота и контролами.
     */
    private runHidingControlsWhenIntersected;
    /**
     * Ищем внутри рутового элемента слота элемент, с которым хотим отслеживать пересечение контролов.
     * Приходится делать через mutationObserver, так как данный элемент в силу асинхронной работы внешнего
     * фреймворка может появиться позже.
     * @param slotRootElement Рутовый элемент слота.
     * @param slotElementId Идентификатор элемента внутри слота, с которым хотим отслеживать пересечение контролов.
     * @param slotId Идентификатор слота.
     */
    private findSlotElement;
    remove(id: string): void;
    destroy(): void;
    haveSlots(): boolean;
}
export {};
