import { TDatetimeValueRange } from '../../../composable';
import { IRawDate, TDateLocale } from '../../../utils';
import { PropType, Ref } from 'vue';
export type TCalendarView = typeof availableViews[number];
export type TCalendarAllowedDates = string[] | ((date: string) => boolean);
export type TCalendarEvents = string[] | ((date: string) => boolean);
export type TCalendarEventsColor = 'default' | 'success' | 'danger' | 'warning' | ((date: string) => boolean);
export interface ICalendarProps {
    title?: string;
    description?: string;
    header?: boolean;
    todayBtn?: boolean;
    defaultYearMonth?: string;
    view: TCalendarView;
    multiple?: boolean;
    range?: boolean;
    firstDayOfWeek: number | string;
    allowedDates?: TCalendarAllowedDates;
    minYearMonth?: string;
    maxYearMonth?: string;
    noUnset?: boolean;
    events?: TCalendarEvents;
    eventsColor?: TCalendarEventsColor;
    emitImmediately?: boolean;
    hideSiblingMonth?: boolean;
}
export declare const YEARS_INTERVAL = 14;
export declare const lineStr = " \u2014 ";
export declare const availableViews: readonly ["Calendar", "Years", "Months"];
export declare const makeCalendarProps: <Defaults extends {
    title?: unknown;
    description?: unknown;
    header?: unknown;
    todayBtn?: unknown;
    defaultYearMonth?: unknown;
    view?: unknown;
    multiple?: unknown;
    range?: unknown;
    firstDayOfWeek?: unknown;
    allowedDates?: unknown;
    minYearMonth?: unknown;
    maxYearMonth?: unknown;
    noUnset?: unknown;
    events?: unknown;
    eventsColor?: unknown;
    emitImmediately?: unknown;
    hideSiblingMonth?: unknown;
} = {}>(defaults?: Defaults | undefined) => import('../../../utils').AppendDefault<{
    /**
     * Заголовок календаря. Отображается в шапке календаря.
     */
    title: {
        type: PropType<string>;
        default: undefined;
    };
    /**
     * Описание календаря. Отображается в шапке календаря.
     */
    description: {
        type: PropType<string>;
        default: undefined;
    };
    /**
     * Отображать шапку календаря
     */
    header: {
        type: PropType<boolean>;
        default: boolean;
    };
    /**
     * Отображать кнопку "Сегодня" в шапке календаря
     */
    todayBtn: {
        type: PropType<boolean>;
        default: boolean;
    };
    /**
     * Отображаемый год/месяц в формате YYYY/MM. По-умолчанию это текущий год/месяц если не указана v-model.
     */
    defaultYearMonth: {
        type: PropType<string>;
        default: undefined;
        validator: (value: string) => boolean;
    };
    /**
     * Вид календаря по-умолчанию. Возможные значения: 'Calendar', 'Year', 'Month'.
     */
    view: {
        type: PropType<TCalendarView>;
        default: string;
        validator: (value: TCalendarView) => boolean;
    };
    /**
     * Разрешает множественный выбор дат. v-model должна быть массивом.
     */
    multiple: {
        type: PropType<boolean>;
        default: boolean;
    };
    /**
     * Разрешает выбор диапазона дат. v-model должна быть массивом.
     */
    range: {
        type: PropType<boolean>;
        default: boolean;
    };
    /**
     * Первый день недели (понедельник по-умолчанию).
     */
    firstDayOfWeek: {
        type: PropType<string | number>;
        default: number;
    };
    /**
     * Массив дат, которые будут отображаться в календаре.
     * При использовании функции, функция поучает дату в формате YYYY/MM/DD и должна вернуть true или false.
     */
    allowedDates: {
        type: PropType<TCalendarAllowedDates>;
    };
    /**
     * Запретить навигацию в календаре до указанной минимальной даты в формате YYYY/MM.
     */
    minYearMonth: {
        type: PropType<string>;
        default: undefined;
        validator: (value: string) => boolean;
    };
    /**
     * Запретить навигацию в календаре после указанной максимальной даты в формате YYYY/MM.
     */
    maxYearMonth: {
        type: PropType<string>;
        default: undefined;
        validator: (value: string) => boolean;
    };
    /**
     * Запретить сброс даты в календаре.
     */
    noUnset: {
        type: PropType<boolean>;
        default: boolean;
    };
    /**
     * Список событий, которые будут отображаться в календаре. Формат: YYYY/MM/DD.
     */
    events: {
        type: PropType<TCalendarEvents>;
    };
    /**
     * Цвет событий в календаре.
     */
    eventsColor: {
        type: PropType<TCalendarEventsColor>;
        default: string;
    };
    /**
     * Эмитировать событие update:modelValue при смене месяца и года сразу.
     * Недоступно при multiple и range.
     */
    emitImmediately: {
        type: PropType<boolean>;
        default: boolean;
    };
    /**
     * Скрыть дни соседних месяцев в календаре.
     */
    hideSiblingMonth: {
        type: PropType<boolean>;
        default: boolean;
    };
}, Defaults>;
export declare function useCalendar(props: ICalendarProps, model: Ref<readonly (string | TDatetimeValueRange)[]> & {
    readonly externalValue: string | TDatetimeValueRange | (string | TDatetimeValueRange)[];
}, internalLocale: Ref<TDateLocale>, internalMask: Ref<string>, getCurrentDate: () => IRawDate, decodeString: (date: string) => IRawDate, emitValue: (value: any, action: string, date: IRawDate | TDatetimeValueRange) => void, emitImmediately: (reason: string) => void): {
    today: import('vue').ComputedRef<IRawDate>;
    editRange: Ref<{
        init: {
            year?: number | undefined;
            month?: number | undefined;
            day?: number | undefined;
            hour?: number | undefined;
            minute?: number | undefined;
            second?: number | undefined;
            millisecond?: number | undefined;
            timezoneOffset?: number | undefined;
            dateHash?: string | undefined;
            timeHash?: string | undefined;
            date?: number | undefined;
            changed?: boolean | undefined;
        } | null;
        initHash: number;
        final: {
            year?: number | undefined;
            month?: number | undefined;
            day?: number | undefined;
            hour?: number | undefined;
            minute?: number | undefined;
            second?: number | undefined;
            millisecond?: number | undefined;
            timezoneOffset?: number | undefined;
            dateHash?: string | undefined;
            timeHash?: string | undefined;
            date?: number | undefined;
            changed?: boolean | undefined;
        } | null;
        finalHash: number;
    } | null, {
        init: IRawDate | null;
        initHash: number;
        final: IRawDate | null;
        finalHash: number;
    } | {
        init: {
            year?: number | undefined;
            month?: number | undefined;
            day?: number | undefined;
            hour?: number | undefined;
            minute?: number | undefined;
            second?: number | undefined;
            millisecond?: number | undefined;
            timezoneOffset?: number | undefined;
            dateHash?: string | undefined;
            timeHash?: string | undefined;
            date?: number | undefined;
            changed?: boolean | undefined;
        } | null;
        initHash: number;
        final: {
            year?: number | undefined;
            month?: number | undefined;
            day?: number | undefined;
            hour?: number | undefined;
            minute?: number | undefined;
            second?: number | undefined;
            millisecond?: number | undefined;
            timezoneOffset?: number | undefined;
            dateHash?: string | undefined;
            timeHash?: string | undefined;
            date?: number | undefined;
            changed?: boolean | undefined;
        } | null;
        finalHash: number;
    } | null>;
    getNativeDateFn: import('vue').ComputedRef<(model: IRawDate) => Date>;
    defaultView: Ref<"Calendar" | "Years" | "Months", "Calendar" | "Years" | "Months">;
    monthDirection: Ref<"left" | "right", "left" | "right">;
    yearDirection: Ref<"left" | "right", "left" | "right">;
    isImmediate: import('vue').ComputedRef<boolean | undefined>;
    viewModel: Ref<{
        year?: number | undefined;
        month?: number | undefined;
        day?: number | undefined;
        hour?: number | undefined;
        minute?: number | undefined;
        second?: number | undefined;
        millisecond?: number | undefined;
        timezoneOffset?: number | undefined;
        dateHash?: string | undefined;
        timeHash?: string | undefined;
        date?: number | undefined;
        changed?: boolean | undefined;
    }, IRawDate | {
        year?: number | undefined;
        month?: number | undefined;
        day?: number | undefined;
        hour?: number | undefined;
        minute?: number | undefined;
        second?: number | undefined;
        millisecond?: number | undefined;
        timezoneOffset?: number | undefined;
        dateHash?: string | undefined;
        timeHash?: string | undefined;
        date?: number | undefined;
        changed?: boolean | undefined;
    }>;
    daysModel: import('vue').ComputedRef<IRawDate[]>;
    rangeModel: import('vue').ComputedRef<{
        from: IRawDate;
        to: IRawDate;
    }[]>;
    minSelectedModel: import('vue').ComputedRef<IRawDate>;
    maxSelectedModel: import('vue').ComputedRef<IRawDate>;
    daysInModel: import('vue').ComputedRef<number>;
    startYear: Ref<number | undefined, number | undefined>;
    daysOfWeek: import('vue').ComputedRef<string[]>;
    daysInMonth: import('vue').ComputedRef<number>;
    viewMonthHash: import('vue').ComputedRef<string>;
    minNav: import('vue').ComputedRef<{
        year: number;
        month: number;
    } | undefined>;
    maxNav: import('vue').ComputedRef<{
        year: number;
        month: number;
    } | undefined>;
    navBoundaries: import('vue').ComputedRef<{
        month: {
            prev: boolean;
            next: boolean;
        };
        year: {
            prev: boolean;
            next: boolean;
        };
    }>;
    days: import('vue').ComputedRef<{
        i: number;
        fill?: boolean;
        event?: boolean | TCalendarEventsColor;
        classes?: string[];
        in?: boolean;
        flat?: boolean;
        selected?: boolean;
        unelevated?: boolean;
        range?: {
            from: IRawDate;
            to: IRawDate;
        };
        rangeFrom?: boolean;
        rangeTo?: boolean;
        editRange?: boolean;
        editRangeFrom?: boolean;
        editRangeTo?: boolean;
        today?: boolean;
        color?: string;
    }[]>;
    daysMap: import('vue').ComputedRef<Record<string, number[]>>;
    rangeMap: import('vue').ComputedRef<Record<string, {
        from?: number;
        to?: number;
        range: {
            from: IRawDate;
            to: IRawDate;
        };
    }[]>>;
    rangeView: import('vue').ComputedRef<{
        from?: number;
        includeFrom: boolean;
        to?: number;
        includeTo: boolean;
    } | undefined>;
    selectionDaysMap: import('vue').ComputedRef<Record<string, boolean>>;
    getViewModel: () => IRawDate;
    updateViewModel: (year: number, month: number, time?: IRawDate) => void;
    setToday: () => void;
    setCalendarTo: (year: number, month: number) => void;
    goToMonth: (offset: number) => void;
    goToYear: (offset: number) => void;
    setMonth: (month: number) => void;
    setYear: (year: number) => void;
    setView: (viewMode: TCalendarView) => void;
    setEditingRange: (from: IRawDate, to: IRawDate) => void;
    toggleDate: (date: IRawDate | TDatetimeValueRange, monthHash: string) => void;
    addToModel: (date: IRawDate) => void;
    addToModelRange: (date: TDatetimeValueRange) => void;
    removeFromModel: (date: IRawDate) => void;
    removeFromModelRange: (date: TDatetimeValueRange) => void;
    offsetCalendar: (type: "month" | "year", descending: number) => void;
    encodeEntry: (date: any, mask?: string, locale?: TDateLocale) => string | {
        from: string | undefined;
        to: string | undefined;
    } | undefined;
};
export declare function getMonthHash(date: IRawDate): string;
