import { LitElement, TemplateResult } from 'lit';
import { DateRange } from './DatePickerUtils.js';
import '../../../md/icons/ui-icon.js';
import '../../../md/button/ui-button.js';
import '../../../md/icon-button/ui-icon-button.js';
/**
 * Event dispatched when a single date is selected in immediate mode
 * or confirmed in pending mode.
 */
export interface DateSelectEvent {
    date: Date;
    formattedDate: string;
}
/**
 * Event dispatched when a date range is completed in immediate mode.
 * Only fired when both start and end dates are selected.
 */
export interface DateRangeSelectEvent {
    range: DateRange;
    formattedRange: {
        start: string | null;
        end: string | null;
    };
}
/**
 * Event dispatched when a date range selection is confirmed
 * via the OK button in pending mode.
 */
export interface DateRangeConfirmEvent {
    range: DateRange | null;
    formattedRange: {
        start: string | null;
        end: string | null;
    };
}
/**
 * Event dispatched when user cancels a pending selection
 * via the Cancel button or Escape key.
 */
export interface DateCancelEvent {
    reason?: string;
}
/**
 * A calendar grid component for date selection.
 * Supports single date selection and date range selection with full keyboard navigation.
 *
 * ## Features
 * - Single date and date range selection
 * - Keyboard navigation support (arrow keys, home, end, page up/down)
 * - Configurable date restrictions (min/max dates, disabled dates)
 * - Localization support for date formatting and month/day names
 * - Optional action buttons for pending selections
 * - Accessible design with proper ARIA attributes
 *
 * ## Events
 * - `date-select`: Fired when a single date is selected/confirmed
 * - `date-range-select`: Fired when a date range is completed (immediate mode)
 * - `date-range-confirm`: Fired when a date range is confirmed (pending mode)
 * - `date-cancel`: Fired when a pending selection is cancelled
 *
 * ## Usage
 *
 * ```html
 * <ui-date-picker-calendar></ui-date-picker-calendar>
 * ```
 *
 * ### Single date selection
 * ```html
 * <ui-date-picker-calendar
 *   .selectedDate=${new Date()}
 *   @date-select=${this.handleDateSelect}
 * ></ui-date-picker-calendar>
 * ```
 *
 * ### Date range selection
 * ```html
 * <ui-date-picker-calendar
 *   rangeSelection
 *   .rangeStart=${new Date()}
 *   .rangeEnd=${null}
 *   @date-range-select=${this.handleRangeSelect}
 * ></ui-date-picker-calendar>
 * ```
 *
 * ### With action buttons and restrictions
 * ```html
 * <ui-date-picker-calendar
 *   rangeSelection
 *   showActions
 *   .minDate=${new Date()}
 *   .maxDate=${new Date(Date.now() + 365 * 24 * 60 * 60 * 1000)}
 *   @date-range-confirm=${this.handleRangeConfirm}
 *   @date-cancel=${this.handleCancel}
 * ></ui-date-picker-calendar>
 * ```
 */
export declare class UiDatePickerCalendar extends LitElement {
    static styles: import("lit").CSSResult;
    /**
     * The currently displayed year
     */
    accessor year: number;
    /**
     * The currently displayed month (0-indexed, where 0 = January)
     */
    accessor month: number;
    /**
     * The currently selected date for single selection mode.
     * Set to null for no selection.
     */
    accessor selectedDate: Date | null;
    /**
     * The start date of the selected range for range selection mode.
     * Used in combination with rangeEnd to define a date range.
     */
    accessor rangeStart: Date | null;
    /**
     * The end date of the selected range for range selection mode.
     * Used in combination with rangeStart to define a date range.
     */
    accessor rangeEnd: Date | null;
    /**
     * Enable range selection mode. When true, users can select date ranges
     * instead of single dates. Affects event dispatching and UI behavior.
     */
    accessor rangeSelection: boolean;
    /**
     * Minimum selectable date. Dates before this will be disabled.
     * Set to undefined for no minimum restriction.
     */
    accessor minDate: Date | undefined;
    /**
     * Maximum selectable date. Dates after this will be disabled.
     * Set to undefined for no maximum restriction.
     */
    accessor maxDate: Date | undefined;
    /**
     * Array of specific dates to disable. These dates will not be selectable
     * regardless of minDate and maxDate settings.
     */
    accessor disabledDates: Date[] | undefined;
    /**
     * Locale for date formatting and month/day names (e.g., 'en-US', 'fr-FR').
     * Defaults to browser locale if not specified.
     */
    accessor locale: string | undefined;
    /**
     * Whether to show navigation controls (previous/next month and year buttons).
     * When false, users can only navigate using keyboard or programmatically.
     */
    accessor showNavigation: boolean;
    /**
     * Whether to show action buttons (OK/Cancel). When true, selections are pending
     * until confirmed with the OK button. When false, selections are immediate.
     */
    accessor showActions: boolean;
    /**
     * Text label for the OK/confirm button. Only visible when showActions is true.
     */
    accessor okButtonText: string;
    /**
     * Text label for the Cancel button. Only visible when showActions is true.
     */
    accessor cancelButtonText: string;
    private accessor calendarData;
    private accessor monthNames;
    private accessor showMonthDropdown;
    private accessor showYearDropdown;
    private accessor pendingDate;
    private accessor pendingRangeStart;
    private accessor pendingRangeEnd;
    private accessor focusedDate;
    connectedCallback(): void;
    firstUpdated(): void;
    disconnectedCallback(): void;
    willUpdate(changedProperties: Map<string | number | symbol, unknown>): void;
    updated(changedProperties: Map<string | number | symbol, unknown>): void;
    private updateFocus;
    private scrollSelectedYearIntoView;
    private updateFocusedDateForMonthChange;
    private updateCalendar;
    private updateMonthNames;
    private navigateMonth;
    private handlePrevMonth;
    private handleNextMonth;
    private handlePrevYear;
    private handleNextYear;
    private handleMonthClick;
    private handleYearClick;
    private handleMonthSelect;
    private handleYearSelect;
    private closeDropdowns;
    private navigateDate;
    private findNextAvailableDate;
    private focusFirstDayOfMonth;
    private focusLastDayOfMonth;
    private selectFocusedDate;
    private handleDayClick;
    private handleSingleSelection;
    private handleRangeSelection;
    /**
     * Helper to get the current range state (either immediate or pending)
     */
    private getCurrentRange;
    /**
     * Helper to check if we have a complete range in the current mode
     */
    private hasCompleteRange;
    private setRangeValues;
    /**
     * Helper to dispatch date selection events
     */
    private dispatchDateEvent;
    /**
     * Helper to dispatch range selection events
     */
    private dispatchRangeEvent;
    /**
     * Helper to dispatch range confirmation events
     */
    private dispatchRangeConfirmEvent;
    /**
     * Helper to dispatch cancel events
     */
    private dispatchCancelEvent;
    private isDateDisabled;
    private handleConfirm;
    private handleCancel;
    /**
     * Helper to render navigation buttons
     */
    private renderNavButton;
    private renderNavigation;
    private renderWeekdays;
    /**
     * Helper to determine day selection state for rendering
     */
    private getDaySelectionState;
    /**
     * Helper to determine button color for a day
     */
    private getDayButtonColor;
    private renderDay;
    private renderDays;
    private renderActions;
    /**
     * Helper to render dropdown option buttons
     */
    private renderDropdownOption;
    private renderMonthDropdown;
    private renderYearDropdown;
    private findFirstAvailableDate;
    private handleKeyDown;
    /**
     * Helper to check if a date is in the current month and not disabled
     */
    private isDateAvailable;
    private initializeFocusedDate;
    render(): TemplateResult;
}
declare global {
    interface HTMLElementTagNameMap {
        'ui-date-picker-calendar': UiDatePickerCalendar;
    }
    interface HTMLElementEventMap {
        'date-select': CustomEvent<DateSelectEvent>;
        'date-range-select': CustomEvent<DateRangeSelectEvent>;
        'date-range-confirm': CustomEvent<DateRangeConfirmEvent>;
        'date-cancel': CustomEvent<DateCancelEvent>;
    }
}
//# sourceMappingURL=DatePickerCalendar.d.ts.map