import { PopoverProps } from '@mui/material/Popover';
import { Theme } from '@mui/material/styles';
import { YearCalendarProps } from '@mui/x-date-pickers/YearCalendar';
import { ButtonBaseProps as SharedButtonBaseProps } from '@m4l/base';
import { TimePickerDisplayVariantSource } from '../TimePicker/types';
import { BadgeProps } from '../extended/mui/Badge/types';
import { M4LOverridesStyleRules } from '../../@types/augmentations';
import { Sizes } from '@m4l/styles';
import { ReactNode, HTMLAttributes } from 'react';
import { DATE_RANGE_CALENDAR_PICKER_KEY_COMPONENT } from './constants';
import { DateRangeCalendarPickerSlots } from './slots/DateRangeCalendarPickerEnum';
export interface DateRangeValue {
    endDate: Date | null;
    startDate: Date | null;
}
export type DateRangeCalendarPickerValue = DateRangeValue;
export type DateRangeCalendarPickerVariant = 'default' | 'column';
export type DateRangeCalendarPickerRangePosition = 'start' | 'end';
export type DateRangeCalendarPickerSelectionState = 'partial' | 'finish';
/**
 * Describe the visual state of a rendered day cell.
 */
export interface DateRangeCalendarPickerDayMetadata {
    disabled: boolean;
    isEndOfRange: boolean;
    isOutsideCurrentMonth: boolean;
    isPreviewing: boolean;
    isSelected: boolean;
    isStartOfRange: boolean;
    isToday: boolean;
    isWithinRange: boolean;
}
/**
 * Configure the shared Badge used to decorate one calendar day button.
 */
export interface DateRangeCalendarPickerDayBadgeConfig extends Pick<BadgeProps, 'anchorOrigin' | 'color' | 'invisible' | 'max' | 'showZero'> {
    badgeContent?: number;
}
export type DateRangeCalendarPickerDayBadgeValue = DateRangeCalendarPickerDayBadgeConfig | ReactNode;
/**
 * Expose the supported slot prop overrides for the custom calendar.
 */
export interface DateRangeCalendarPickerSlotProps {
    root?: HTMLAttributes<HTMLDivElement>;
    yearCalendar?: Partial<Omit<YearCalendarProps<Date>, 'yearsPerRow'>>;
    yearPopover?: Partial<PopoverProps>;
}
/**
 * Define the public props for the first-party date range calendar.
 */
export interface DateRangeCalendarPickerProps {
    calendars?: number;
    className?: string;
    dataTestId?: string;
    dayOfWeekFormatter?: (dayLabel: string, date: Date) => ReactNode;
    defaultCalendarMonth?: Date;
    defaultRangePosition?: DateRangeCalendarPickerRangePosition;
    defaultValue?: DateRangeCalendarPickerValue;
    disableFuture?: boolean;
    disableHighlightToday?: boolean;
    disablePast?: boolean;
    disabled?: boolean;
    getDayBadgeContent?: (date: Date, metadata: DateRangeCalendarPickerDayMetadata) => DateRangeCalendarPickerDayBadgeValue;
    headerFormat?: string;
    maxDate?: Date;
    minDate?: Date;
    maxDays?: number;
    onChange?: (value: DateRangeCalendarPickerValue, selectionState: DateRangeCalendarPickerSelectionState) => void;
    onMonthChange?: (month: Date) => void;
    onRangePositionChange?: (rangePosition: DateRangeCalendarPickerRangePosition) => void;
    rangePosition?: DateRangeCalendarPickerRangePosition;
    readOnly?: boolean;
    referenceDate?: Date;
    shouldDisableDate?: (date: Date) => boolean;
    /**
     * Legacy no-op kept for backward compatibility after same-moment ranges stopped rendering inline validation UI.
     */
    showTimeRangeError?: boolean;
    size?: Extract<Sizes, 'small' | 'medium'>;
    slotProps?: DateRangeCalendarPickerSlotProps;
    enableTimeRange?: boolean;
    timeDisplayVariant?: TimePickerDisplayVariantSource;
    value?: DateRangeCalendarPickerValue;
    variant?: DateRangeCalendarPickerVariant;
}
/**
 * Capture the component state used by slot style overrides.
 */
export interface DateRangeCalendarPickerOwnerState {
    calendars: number;
    disabled: boolean;
    isSkeleton: boolean;
    readOnly: boolean;
    size: Extract<Sizes, 'small' | 'medium'>;
    enableTimeRange: boolean;
    variant: DateRangeCalendarPickerVariant;
    [key: string]: unknown;
}
/**
 * Capture the day-specific state used by the grid slots.
 */
export interface DateRangeCalendarPickerDayOwnerState {
    disabled: boolean;
    isEndOfRange: boolean;
    isOutsideCurrentMonth: boolean;
    isPreviewing: boolean;
    isRangeEnd: boolean;
    isRangeStart: boolean;
    isSkeleton: boolean;
    isSelected: boolean;
    isStartOfRange: boolean;
    isToday: boolean;
    isWithinRange: boolean;
    readOnly: boolean;
    size: Extract<Sizes, 'small' | 'medium'>;
    [key: string]: unknown;
}
/**
 * Define the available slots for theme override typing.
 */
export type DateRangeCalendarPickerSlotsType = keyof typeof DateRangeCalendarPickerSlots;
/**
 * Define the style override contract for the custom date range calendar.
 */
export type DateRangeCalendarPickerStyles = M4LOverridesStyleRules<DateRangeCalendarPickerSlotsType, typeof DATE_RANGE_CALENDAR_PICKER_KEY_COMPONENT, Theme>;
/**
 * Expose the day button props used by custom rendering slots and tests.
 */
export interface DateRangeCalendarPickerDayButtonProps extends Omit<SharedButtonBaseProps, 'children' | 'ownerState'> {
    ownerState: DateRangeCalendarPickerDayOwnerState;
}
/**
 * Describe the skeleton-aware ButtonBase wrapper used by the calendar button slots.
 */
export interface DateRangeCalendarPickerButtonBaseProps extends Omit<SharedButtonBaseProps, 'ownerState'> {
    ownerState: DateRangeCalendarPickerDayOwnerState | DateRangeCalendarPickerOwnerState;
}
//# sourceMappingURL=types.d.ts.map