import { ComponentFactoryResolver, ComponentRef, OnChanges, ElementRef, EventEmitter, OnDestroy, Type, AfterViewInit, OnInit, SimpleChanges } from '@angular/core';
import { Observable, ReplaySubject, Subject } from 'rxjs';
import { ElOverlayRef } from '../cdk/overlay/mapping';
import { ElAdjustableConnectedPositionStrategy, ElPositionBuilderService } from '../cdk/overlay/overlay-position';
import { ElOverlayService } from '../cdk/overlay/overlay-service';
import { ElTriggerStrategy, ElTriggerStrategyBuilderService } from '../cdk/overlay/overlay-trigger';
import { ElDatepickerContainerComponent } from './datepicker-container.component';
import { ElCalendarRange, ElCalendarRangeComponent } from '../calendar/calendar-range.component';
import { ElCalendarComponent } from '../calendar/calendar.component';
import { ElCalendarCell, ElCalendarSize, ElCalendarViewMode } from '../calendar-kit/model';
import { ElDateService } from '../calendar-kit/services/date.service';
import { ElDatepicker, ElPickerValidatorConfig } from './datepicker.directive';
/**
 * The `ElBasePicker` component concentrates overlay manipulation logic.
 * */
export declare abstract class ElBasePicker<D, T, P> extends ElDatepicker<T> implements OnInit, OnChanges, AfterViewInit, OnDestroy {
    protected document: any;
    protected positionBuilder: ElPositionBuilderService;
    protected triggerStrategyBuilder: ElTriggerStrategyBuilderService;
    protected overlay: ElOverlayService;
    protected cfr: ComponentFactoryResolver;
    protected dateService: ElDateService<D>;
    protected dateServiceOptions: any;
    /**
     * Datepicker date format. Can be used only with date adapters (moment, date-fns) since native date
     * object doesn't support formatting.
     * */
    format: string;
    /**
     * Defines if we should render previous and next months
     * in the current month view.
     * */
    boundingMonth: boolean;
    /**
     * Defines starting view for calendar.
     * */
    startView: ElCalendarViewMode;
    /**
     * Minimum available date for selection.
     * */
    min: T;
    /**
     * Maximum available date for selection.
     * */
    max: T;
    /**
     * Predicate that decides which cells will be disabled.
     * */
    filter: (T: any) => boolean;
    /**
     * Custom day cell component. Have to implement `ElCalendarCell` interface.
     * */
    dayCellComponent: Type<ElCalendarCell<D, T>>;
    /**
     * Custom month cell component. Have to implement `ElCalendarCell` interface.
     * */
    monthCellComponent: Type<ElCalendarCell<D, T>>;
    /**
     * Custom year cell component. Have to implement `ElCalendarCell` interface.
     * */
    yearCellComponent: Type<ElCalendarCell<D, T>>;
    /**
     * Size of the calendar and entire components.
     * Can be 'medium' which is default or 'large'.
     * */
    size: ElCalendarSize;
    /**
     * Depending on this date a particular month is selected in the calendar
     */
    visibleDate: D;
    /**
     * Hide picker when a date or a range is selected, `true` by default
     * @type {boolean}
     */
    hideOnSelect: boolean;
    /**
     * Determines should we show calendars header or not.
     * @type {boolean}
     */
    showHeader: boolean;
    /**
     * Sets symbol used as a header for week numbers column
     * */
    weekNumberSymbol: string;
    /**
     * Determines should we show week numbers column.
     * False by default.
     * */
    showWeekNumber: boolean;
    protected _showWeekNumber: boolean;
    /**
     * Calendar component class that has to be instantiated inside overlay.
     * */
    protected abstract pickerClass: Type<P>;
    /**
     * Overlay reference object.
     * */
    protected ref: ElOverlayRef;
    /**
     * Datepicker container that contains instantiated picker.
     * */
    protected container: ComponentRef<ElDatepickerContainerComponent>;
    /**
     * Positioning strategy used by overlay.
     * */
    protected positionStrategy: ElAdjustableConnectedPositionStrategy;
    /**
     * Trigger strategy used by overlay
     * */
    protected triggerStrategy: ElTriggerStrategy;
    /**
     * HTML input reference to which datepicker connected.
     * */
    protected hostRef: ElementRef;
    protected init$: ReplaySubject<void>;
    /**
     * Stream of picker changes. Required to be the subject because picker hides and shows and picker
     * change stream becomes recreated.
     * */
    protected onChange$: Subject<T>;
    /**
     * Reference to the picker instance itself.
     * */
    protected pickerRef: ComponentRef<any>;
    protected alive: boolean;
    /**
     * Queue contains the last value that was applied to the picker when it was hidden.
     * This value will be passed to the picker as soon as it shown.
     * */
    protected queue: T | undefined;
    protected blur$: Subject<void>;
    constructor(document: any, positionBuilder: ElPositionBuilderService, triggerStrategyBuilder: ElTriggerStrategyBuilderService, overlay: ElOverlayService, cfr: ComponentFactoryResolver, dateService: ElDateService<D>, dateServiceOptions: any);
    /**
     * Returns picker instance.
     * */
    readonly picker: any;
    /**
     * Stream of picker value changes.
     * */
    readonly valueChange: Observable<T>;
    readonly isShown: boolean;
    readonly init: Observable<void>;
    /**
     * Emits when datepicker looses focus.
     */
    readonly blur: Observable<void>;
    protected abstract readonly pickerValueChange: Observable<T>;
    ngOnInit(): void;
    ngOnChanges(changes: SimpleChanges): void;
    ngAfterViewInit(): void;
    ngOnDestroy(): void;
    /**
     * Datepicker knows nothing about host html input element.
     * So, attach method attaches datepicker to the host input element.
     * */
    attach(hostRef: ElementRef): void;
    getValidatorConfig(): ElPickerValidatorConfig<T>;
    show(): void;
    shouldHide(): boolean;
    hide(): void;
    protected abstract writeQueue(): any;
    protected createOverlay(): void;
    protected openDatepicker(): void;
    protected createPositionStrategy(): ElAdjustableConnectedPositionStrategy;
    protected subscribeOnPositionChange(): void;
    protected createTriggerStrategy(): ElTriggerStrategy;
    protected subscribeOnTriggers(): void;
    protected instantiatePicker(): void;
    /**
     * Subscribes on picker value changes and emit data through this.onChange$ subject.
     * */
    protected subscribeOnValueChange(): void;
    protected patchWithInputs(): void;
    protected checkFormat(): void;
}
/**
 * The DatePicker components itself.
 * Provides a proxy to `ElCalendar` options as well as custom picker options.
 */
export declare class ElDatepickerComponent<D> extends ElBasePicker<D, D, ElCalendarComponent<D>> {
    protected pickerClass: Type<ElCalendarComponent<D>>;
    /**
     * Date which will be rendered as selected.
     * */
    date: D;
    /**
     * Emits date when selected.
     * */
    readonly dateChange: EventEmitter<D>;
    value: D | undefined;
    protected readonly pickerValueChange: Observable<D>;
    protected writeQueue(): void;
}
/**
 * The RangeDatePicker components itself.
 * Provides a proxy to `ElCalendarRange` options as well as custom picker options.
 */
export declare class ElRangepickerComponent<D> extends ElBasePicker<D, ElCalendarRange<D>, ElCalendarRangeComponent<D>> {
    protected pickerClass: Type<ElCalendarRangeComponent<D>>;
    /**
     * Range which will be rendered as selected.
     * */
    range: ElCalendarRange<D>;
    /**
     * Emits range when start selected and emits again when end selected.
     * */
    readonly rangeChange: EventEmitter<ElCalendarRange<D>>;
    value: ElCalendarRange<D> | undefined;
    protected readonly pickerValueChange: Observable<ElCalendarRange<D>>;
    shouldHide(): boolean;
    protected writeQueue(): void;
}
