import { HTMLAttributes, ReactNode, KeyboardEvent } from 'react';
import { PopoverProps } from '@mui/material/Popover';
import { YearCalendarProps } from '@mui/x-date-pickers/YearCalendar';
import { TimePickerDisplayVariant } from '../../../TimePicker/types';
import { BadgeProps } from '../../../extended/mui/Badge/types';
import { DateRangeCalendarPickerDayMetadata, DateRangeCalendarPickerDayOwnerState, DateRangeCalendarPickerOwnerState, DateRangeCalendarPickerProps, DateRangeCalendarPickerRangePosition, DateRangeCalendarPickerValue } from '../../types';
/**
 * Describe the weekday header data consumed by the calendar UI.
 */
export interface UseDateRangeCalendarPickerWeekdayHeader {
    ariaLabel: string;
    date: Date;
    label: ReactNode;
}
/**
 * Describe the month-level view model consumed by the calendar UI.
 */
export interface UseDateRangeCalendarPickerMonthModel {
    headerButtonAriaLabel: string;
    headerLabel: string;
    index: number;
    isYearPopoverOpen: boolean;
    key: string;
    month: Date;
    monthAriaLabel: string;
    weeks: Date[][];
}
/**
 * Describe the per-day render model consumed by the calendar UI.
 */
export interface UseDateRangeCalendarPickerDayModel {
    ariaCurrent?: 'date';
    ariaLabel: string;
    badge: Pick<BadgeProps, 'anchorOrigin' | 'badgeContent' | 'color' | 'invisible' | 'max' | 'showZero' | 'variant'> | null;
    dayKey: string;
    label: string;
    metadata: DateRangeCalendarPickerDayMetadata;
    ownerState: DateRangeCalendarPickerDayOwnerState;
    tabIndex: -1 | 0;
}
/**
 * Group the stable day-model config inputs that should invalidate all day cells.
 */
export interface UseDateRangeCalendarPickerDayModelConfig {
    adjustedSize: Extract<DateRangeCalendarPickerOwnerState['size'], 'small' | 'medium'>;
    disableHighlightToday: boolean;
    getDayBadgeContent: DateRangeCalendarPickerProps['getDayBadgeContent'];
    isDayDisabled: (date: Date) => boolean;
    isSkeleton: boolean;
    readOnly: boolean;
    todayKey: string;
}
/**
 * Group the localized labels used by the calendar chrome.
 */
export interface UseDateRangeCalendarPickerLabels {
    dateTableLabel: string;
    nextMonth: string;
    previousMonth: string;
}
/**
 * Describe the optional date-time range controls rendered below the calendar.
 */
export interface UseDateRangeCalendarPickerTimeRangeModel {
    endSummary: string;
    endTimeLabel: string;
    endTimeValue: string;
    handleEndTimeChange: (value: string) => void;
    handleStartTimeChange: (value: string) => void;
    isEndDisabled: boolean;
    isStartDisabled: boolean;
    startSummary: string;
    startTimeLabel: string;
    startTimeValue: string;
    timeDisplayVariant: TimePickerDisplayVariant;
}
/**
 * Describe the full state and handlers exposed by the custom calendar hook.
 */
export interface UseDateRangeCalendarPickerReturn {
    activeYearMonth: Date | null;
    currentRangePosition: DateRangeCalendarPickerRangePosition;
    currentValue: DateRangeCalendarPickerValue;
    maxDaysError: string | null;
    dayModelConfig: UseDateRangeCalendarPickerDayModelConfig;
    firstEnabledVisibleDate: Date | null;
    getDayModel: (day: Date, month: Date, previousDay: Date | null, nextDay: Date | null) => UseDateRangeCalendarPickerDayModel;
    getDayRenderToken: (day: Date, month: Date, previousDay: Date | null, nextDay: Date | null) => string;
    handleCalendarMouseLeave: () => void;
    handleCloseYearPopover: () => void;
    handleDayFocus: (day: Date) => void;
    handleDayKeyDown: (event: KeyboardEvent<HTMLButtonElement>, currentDay: Date, weekStart: Date, weekEnd: Date) => void;
    handleDayMouseEnter: (day: Date) => void;
    handleOpenYearPopover: (index: number, anchor: HTMLElement) => void;
    handleSelectDay: (day: Date) => void;
    isNextDisabled: boolean;
    isPreviousDisabled: boolean;
    isSkeleton: boolean;
    labels: UseDateRangeCalendarPickerLabels;
    monthModels: UseDateRangeCalendarPickerMonthModel[];
    openYearPopoverIndex: number | null;
    ownerState: DateRangeCalendarPickerOwnerState;
    rootClassName: string;
    rootSlotProps?: HTMLAttributes<HTMLDivElement>;
    setDayRef: (dayKey: string, element: HTMLButtonElement | null) => void;
    shiftVisibleMonths: (amount: number) => void;
    timeRange: UseDateRangeCalendarPickerTimeRangeModel | null;
    yearCalendarProps: (Partial<Omit<YearCalendarProps<Date>, 'yearsPerRow'>> & {
        disableFuture?: boolean;
        disableHighlightToday: boolean;
        disablePast?: boolean;
        disabled: boolean;
        maxDate?: Date;
        minDate?: Date;
        onChange: (year: Date) => void;
        ownerState: DateRangeCalendarPickerOwnerState;
        readOnly: boolean;
        referenceDate: Date;
        value: Date;
        yearsPerRow: 4;
    }) | null;
    yearPopoverProps: Partial<PopoverProps> & {
        anchorEl: HTMLElement | null;
        anchorOrigin: NonNullable<PopoverProps['anchorOrigin']>;
        disableScrollLock: boolean;
        onClose: () => void;
        open: boolean;
        ownerState: DateRangeCalendarPickerOwnerState;
        transformOrigin: NonNullable<PopoverProps['transformOrigin']>;
    };
    weekdayHeaders: UseDateRangeCalendarPickerWeekdayHeader[];
}
//# sourceMappingURL=types.d.ts.map