import type { Newable } from '@difizen/mana-common';
import { Emitter } from '@difizen/mana-common';
import { Deferred } from '@difizen/mana-common';
import { Disposable } from '@difizen/mana-common';
import type { Contribution } from '@difizen/mana-syringe';
import { DebugService } from '../common/debug';
import { ViewManager } from './view-manager';
import type { View } from './view-protocol';
import type { SlotPreference, ViewOpenOption } from './view-protocol';
import { SlotPreferenceContribution, SlotView } from './view-protocol';
interface ViewAddArgs {
    view?: View;
    slot: string;
    option?: ViewOpenOption;
}
interface SlotSetArgs {
    view?: View;
    slot: string;
}
export declare class SlotViewManager {
    protected preferences: Map<string, SlotPreference>;
    protected componentPreferences: Map<string, SlotPreference>;
    protected slotRenderingDeferred: Map<string, Deferred<void>>;
    protected onViewAddedEmitter: Emitter<ViewAddArgs>;
    protected onSlotChangedEmitter: Emitter<SlotSetArgs>;
    get onViewAdded(): import("@difizen/mana-common").Event<ViewAddArgs>;
    get onSlotChanged(): import("@difizen/mana-common").Event<SlotSetArgs>;
    /**
     * slot -> slotview
     */
    slotViewMap: Map<string, View>;
    /**
     * view -> child slotview
     */
    slotChildrenMap: Map<View, string[]>;
    protected readonly preferenceProvider: Contribution.Provider<SlotPreferenceContribution>;
    protected readonly debugService: DebugService;
    protected readonly viewManager: ViewManager;
    constructor(preferenceProvider: Contribution.Provider<SlotPreferenceContribution>, debugService: DebugService, viewManager: ViewManager);
    protected setPreferencesFromContribution(): void;
    protected getPreferences(): Map<string, SlotPreference>;
    setSlotPreference(slot: string, preference: SlotPreference): void;
    setComponentSlotPreference(slot: string, preference: SlotPreference): void;
    protected waitSlotRendering(slot: string): Promise<void>;
    slotRendering(slot: string): void;
    getOrCreateSlotView(slot: string, defaultSlotView?: Newable<View>): Promise<SlotView | View>;
    getSlotView(slot: string): View | undefined;
    setSlotView(slot: string, view: View): Disposable;
    addView(view: View, slot: string, option?: ViewOpenOption): Promise<void>;
    removeView(view: View, slot: string): Promise<void>;
    hasSlot(slot: string): boolean;
    getSlotChildren(view: View): string[] | undefined;
    addSlotToView(slot: string, slotView: SlotView): void;
    removeSlotFromView(slot: string, slotView: SlotView): void;
}
export {};
//# sourceMappingURL=slot-view-manager.d.ts.map