import type { FC, HTMLAttributes, MutableRefObject, PropsWithChildren, ReactNode } from 'react';
import type { PopoverPlacement, PopoverPlacementBasic } from '../Popover';
import type { CalendarBaseProps } from './CalendarBase/CalendarBase';
import type { CalendarDoubleProps } from './CalendarDouble/CalendarDouble';
import type { CalendarStateType } from './store/types';
export declare enum Keys {
    pageUp = 33,
    pageDown = 34,
    home = 36,
    end = 35,
    left = 37,
    right = 39,
    up = 38,
    down = 40,
    enter = 13,
    space = 32
}
export interface DateObject {
    day: number;
    monthIndex: number;
    year: number;
}
export interface ItemProps {
    isCurrent: boolean;
    isSelected: boolean;
}
export interface DateItem extends ItemProps {
    date: DateObject;
    isDayInCurrentMonth?: boolean;
    inRange?: boolean;
    events?: EventDay[];
    disabled?: boolean;
    isOutOfMinMaxRange?: boolean;
    disabledArrowKey?: string;
    disabledMonths?: string;
    disabledDates?: string;
    disabledYears?: string;
    monthName?: string;
    monthIndex?: number;
    monthFullName?: string;
    yearValue?: number;
    quarterName?: string;
}
export type DateBasePorps = {
    isDouble?: boolean;
    isHovered?: boolean;
    inRange?: boolean;
    sideInRange?: 'left' | 'right';
    disabled?: boolean;
};
export interface DateStructureProps extends Partial<ItemProps>, DateBasePorps {
    isDayInCurrentMonth?: boolean;
    dayOfWeek?: boolean;
}
export type QuarterPartialDate = {
    monthIndex: number;
    day: number;
};
export interface QuarterProps extends Partial<ItemProps>, DateBasePorps {
    quarterName: number;
    quarterIndex: number;
}
export interface MonthsProps extends Partial<ItemProps>, DateBasePorps {
}
export interface MonthsItem extends ItemProps {
    monthName: string;
    monthIndex: number;
    monthFullName?: string;
}
export interface YearsProps extends ItemProps {
}
export interface YearsItem extends ItemProps {
    yearValue: number;
}
export interface EventDay {
    date: Date;
    color?: string;
    eventInfo?: ReactNode;
}
export interface DisabledDay {
    date: Date;
}
export type DateType = Date | undefined | null;
export type CalendarValueType = DateType | [DateType, DateType];
export type DateInfo = {
    name: string;
    fullValue: CalendarValueType;
};
export type Locales = 'ru' | 'en';
export type EventTooltipOptions = {
    /**
     * Обертка для всплывающей подсказки для событий.
     */
    bodyWrapper?: FC<PropsWithChildren>;
    /**
     * Размер всплывающей подсказки для событий.
     */
    size?: string;
    /**
     * Направление раскрытия тултипа.
     */
    placement?: PopoverPlacement | Array<PopoverPlacementBasic>;
    /**
     * Отступ окна относительно элемента, у которого оно вызвано.
     * @default
     * [0, 8]
     */
    offset?: [number, number];
    /**
     * Видимость стрелки (хвоста).
     */
    hasArrow?: boolean;
    /**
     * Анимированное появление/сокрытие.
     */
    animated?: boolean;
    /**
     * Минимальная ширина окна (в rem).
     */
    minWidth?: number | string;
    /**
     * Максимальная ширина окна (в rem).
     */
    maxWidth?: number | string;
};
export interface Calendar extends HTMLAttributes<HTMLDivElement> {
    /**
     * Выбранное значение.
     */
    value: CalendarValueType;
    /**
     * Обработчик изменения значения.
     */
    onChangeValue: (value: Date, dateInfo?: DateInfo) => void;
    /**
     * Дата, определяющая отображаемый период календаря.
     */
    focusedDate?: DateType;
    /**
     * Состояние календаря, отвечающее за отображение.
     */
    date?: DateObject;
    /**
     * Минимальное значение даты.
     */
    min?: Date;
    /**
     * Максимальное значение даты.
     */
    max?: Date;
    /**
     * Дата с которой начинается календарная сетка при отсутсвии значения.
     */
    renderFromDate?: Date;
    /**
     * Должны ли значения минимального и максимального дня включаться в диапазон.
     */
    includeEdgeDates?: boolean;
    /**
     * Свойства всплывающей подсказки для событий.
     */
    eventTooltipOptions?: EventTooltipOptions;
    /**
     * Список событий.
     */
    eventList?: EventDay[];
    /**
     * Список отключенных дней.
     */
    disabledList?: DisabledDay[];
    /**
     * Список событий по месяцам.
     */
    eventMonthList?: EventDay[];
    /**
     * Список отключенных месяцев.
     */
    disabledMonthList?: DisabledDay[];
    /**
     * Список событий по кварталам.
     */
    eventQuarterList?: EventDay[];
    /**
     * Список отключенных кварталов.
     */
    disabledQuarterList?: DisabledDay[];
    /**
     * Список событий по годам.
     */
    eventYearList?: EventDay[];
    /**
     * Список отключенных годов.
     */
    disabledYearList?: DisabledDay[];
    /**
     * Конечный тип отображения календаря: дни, месяца, года, кварталы.
     */
    type?: CalendarStateType;
    /**
     * Выбранный язык календаря. Влияет на название дней, месяцев
     */
    locale?: Locales;
    /**
     * Растянуть календарь на всю доступную ширину и высоту
     */
    stretched?: boolean;
}
export type CalendarConfigProps = {
    /**
     * Размер календаря.
     */
    size?: string;
    /**
     * Вид календаря.
     */
    view?: string;
};
export type CalendarRange<T> = Omit<T, 'value' | 'onChangeValue'> & {
    /**
     * Выбранное значение.
     */
    value: [DateType, DateType];
    /**
     * Обработчик изменения значения.
     */
    onChangeValue: (values: [DateType, DateType], dateInfo?: DateInfo) => void;
    /**
     * Обработчик для выбора стартового значения в диапазоне.
     */
    onChangeStartOfRange?: (value: Date, dateInfo?: DateInfo) => void;
    /**
     * Обработчик для первого клика, когда оба значения диапазона не заданы.
     * Позволяет обрабатывать выбор одиночной даты независимо от диапазонной логики.
     */
    onChangeSingleValue?: (value: Date, dateInfo?: DateInfo) => void;
};
export interface DaysMetaDescription {
    refs: MutableRefObject<HTMLDivElement[][]>;
    rowSize: number;
    newRowIndex: number;
    newColumnIndex: number;
    columnSize: number;
    minColumnIndex: number;
    defaultState?: number[];
}
export type KeyboardArrowKey = 'left' | 'right' | 'up' | 'down';
type BaseProps = {
    /**
     * Выбранное значение.
     */
    value: Date;
    /**
     * Режим выбора: диапазон или одинарный.
     */
    isRange?: false;
    /**
     * Режим отображения: двойной или одинарный.
     */
    isDouble?: false;
} & CalendarBaseProps;
type BaseRangeProps = {
    /**
     * Режим выбора: диапазон или одинарный.
     */
    isRange: true;
    /**
     * Режим отображения: двойной или одинарный.
     */
    isDouble?: false;
} & CalendarRange<CalendarBaseProps>;
type DoubleProps = {
    /**
     * Выбранное значение.
     */
    value: Date;
    /**
     * Режим отображения: двойной или одинарный.
     */
    isDouble?: true;
    /**
     * Режим выбора: диапазон или одинарный.
     */
    isRange?: false;
} & CalendarDoubleProps;
type DoubleRangeProps = {
    /**
     * Режим выбора: диапазон или одинарный.
     */
    isRange: true;
    /**
     * Режим отображения: двойной или одинарный.
     */
    isDouble?: true;
} & CalendarRange<CalendarDoubleProps>;
export type ComponentVariation = {
    base: React.FC<CalendarBaseProps>;
    baseRange: React.FC<CalendarRange<CalendarBaseProps>>;
    double: React.FC<CalendarDoubleProps>;
    doubleRange: React.FC<CalendarRange<CalendarDoubleProps>>;
};
export type CalendarProps = BaseProps | BaseRangeProps | DoubleProps | DoubleRangeProps;
export {};
//# sourceMappingURL=Calendar.types.d.ts.map