import * as _angular_core from '@angular/core';
import { OnInit, OnChanges, EventEmitter, ElementRef, ChangeDetectorRef, SimpleChanges } from '@angular/core';
import { DatetimeAdapter, DateTimeFormats } from '@fundamental-ngx/core/datetime';
import { Subject } from 'rxjs';
import { Nullable } from '@fundamental-ngx/cdk/utils';
import { SpecialDayRule } from '@fundamental-ngx/core/shared';
import { ControlValueAccessor, Validator } from '@angular/forms';
import * as i8 from '@fundamental-ngx/core/content-density';
import { ContentDensityObserver } from '@fundamental-ngx/core/content-density';
import * as _fundamental_ngx_i18n from '@fundamental-ngx/i18n';

declare class CalendarCloseButtonDirective {
    protected _originalAriaLabel: string;
    protected _originalTitle: string;
    /** @hidden */
    protected _closeCalendarLabel: _angular_core.Signal<string>;
    /** @hidden */
    constructor(_originalAriaLabel: string, _originalTitle: string);
    static ɵfac: _angular_core.ɵɵFactoryDeclaration<CalendarCloseButtonDirective, [{ attribute: "aria-label"; }, { attribute: "title"; }]>;
    static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CalendarCloseButtonDirective, "[fd-calendar-close-button]", never, {}, {}, never, never, true, never>;
}

/**
 * Base Calendar Cell
 */
interface BaseCalendarCell {
    /** Representation in string */
    label: string;
    /** cell unique id */
    id?: string;
    /** currently active (today) */
    current?: boolean;
    /** selected cell */
    selected?: boolean;
    /** disabled cell */
    disabled?: boolean;
    /** cell tabindex */
    tabIndex?: number;
    /** aria-label */
    ariaLabel?: string;
    /** aria-labelledby */
    ariaLabelledBy?: string;
    /** list index */
    index?: number;
}
interface FocusableCalendarView {
    setFocusOnCell(): void;
}
type EscapeFocusFunction = Nullable<(event?: KeyboardEvent) => void>;
type DisableDateFunction<D> = Nullable<(date: D) => boolean>;

declare class CalendarService {
    /** Row amount */
    rowAmount: number;
    /** Column amount */
    colAmount: number;
    /** Event thrown, when the element is selected by space or enter keys */
    onKeySelect: Subject<{
        index: number;
        event: KeyboardEvent;
    }>;
    /** Event thrown, when the focus goes after list of elements */
    onListEndApproach: Subject<number>;
    /** Event thrown, when the focus goes before list of elements */
    onListStartApproach: Subject<number>;
    /** Event thrown, when the focus is changed. */
    onFocusIdChange: Subject<number>;
    /** Left Arrow Id, which will be focused by default on focus escape */
    leftArrowId: string;
    /** Function that is called when the focus would escape the element. */
    focusEscapeFunction: EscapeFocusFunction;
    /** @hidden */
    private readonly _rtlService;
    /**
     * Standardized method to calculate grid [x][y] to index number
     */
    getId(row: number, col: number): number;
    /**
     * Method that handles keydown events, dedicated for All Calendar views, which have a list with row x col elements.
     * Triggers the events, when the focus approaches start and end of list. Or when there is basic change of focus.
     * Triggers also event, when the element is selected by enter key, or space bar.
     * @param event KeyboardEvent
     * @param index which is number (0 - (rowAmount * colAmount))
     */
    onKeydownHandler(event: KeyboardEvent, index: number): void;
    /**
     * @hidden
     * Right Element focus trigger
     */
    focusRightElement(index: number): void;
    /**
     * @hidden
     * Left Element focus trigger
     */
    focusLeftElement(index: number): void;
    static ɵfac: _angular_core.ɵɵFactoryDeclaration<CalendarService, never>;
    static ɵprov: _angular_core.ɵɵInjectableDeclaration<CalendarService>;
}

/**
 * Calendar view current state
 */
interface CalendarCurrent {
    month: number;
    year: number;
}

interface CalendarYearGrid {
    /** Number of rows in year grid */
    rows: number;
    /** Number of columns in year grid */
    cols: number;
    /**
     * Year map method, thanks to it the year can be displayed as user desire.
     */
    yearMapping?: (year: number) => string;
}
interface CalendarYear<D> extends BaseCalendarCell {
    year: number;
    index: number;
    date: D;
    selectedFirst?: boolean;
    selectedLast?: boolean;
    selectedRange?: boolean;
    hoverRange?: boolean;
}

/** Type of calendar */
type CalendarType = 'single' | 'range';
/** Enum of calendarTypes */
declare enum CalendarTypeEnum {
    Single = "single",
    Range = "range"
}
/** Type for the calendar view */
type FdCalendarView = 'day' | 'month' | 'year' | 'aggregatedYear';
/** Type for the calendar view */
declare enum FdCalendarViewEnum {
    Day = "day",
    Month = "month",
    Year = "year",
    AggregatedYear = "aggregatedYear"
}
/** Type for the days of the week. */
type DaysOfWeek = 1 | 2 | 3 | 4 | 5 | 6 | 7;
type NavigationButtonDisableFunction<D> = (date: Nullable<D>, currentlyDisplayedDate: CalendarCurrent, activeView: FdCalendarView) => boolean;

/**
 * Internal use only.
 * Header of the calendar component.
 */
declare class CalendarHeaderComponent<D> implements OnInit, OnChanges {
    private _changeDetRef;
    private _calendarService;
    private _dateTimeAdapter;
    /** Currently active view. Needed for a11y labels. */
    activeView: FdCalendarView;
    /** Currently displayed date on the calendar. */
    currentlyDisplayed: CalendarCurrent;
    /** whether previous navigation button should be disabled in the header. */
    previousButtonDisabled: boolean;
    /** whether next navigation button should be disabled in the header. */
    nextButtonDisabled: boolean;
    /**
     * Object to customize year grid
     */
    set calendarYearGrid(yearGrid: CalendarYearGrid);
    /** Calendar ID */
    id: string;
    /** Whether calendar should be rendered in mobile landscape mode. */
    mobileLandscape: boolean;
    /** Event emitted when the active view should change. */
    readonly activeViewChange: EventEmitter<FdCalendarView>;
    /** Event emitted when the previous button is clicked. */
    readonly previousClicked: EventEmitter<void>;
    /** Event emitted when the next button is clicked. */
    readonly nextClicked: EventEmitter<void>;
    /** @hidden */
    _prevButtonComponent: ElementRef;
    /** Aria label for the previous button. Depends on the active view. */
    get previousAriaLabel(): 'coreCalendar.previousMonthLabel' | 'coreCalendar.previousYearLabel';
    /** Aria label for the next button. Depends on the active view. */
    get nextAriaLabel(): 'coreCalendar.nextMonthLabel' | 'coreCalendar.nextYearLabel';
    /** Button aria label to open month selection view. */
    get selectMonthAriaLabel(): 'coreCalendar.monthSelectionLabel' | 'coreCalendar.dateSelectionLabel';
    /** Button aria label to open aggregated years selection view. */
    get selectAggregatedYearAriaLabel(): 'coreCalendar.yearsRangeSelectionLabel' | 'coreCalendar.dateSelectionLabel';
    /** Button label to open month selection view. */
    selectMonthLabel: string;
    /** Button label to open year selection view. */
    selectYearLabel: string;
    /** Button label to open aggregated years selection view. */
    selectAggregatedYearLabel: string;
    /** Get information is calendar is on aggregated years view */
    get isOnAggregatedYearsView(): boolean;
    /** Get information is calendar is on year view */
    get isOnYearView(): boolean;
    /** Get information is calendar is on month view */
    get isOnMonthView(): boolean;
    /** Get information is calendar is on day view */
    get isOnDayView(): boolean;
    /**
     * Component id
     */
    get viewId(): string;
    /**
     * @hidden
     * Previous button id
     */
    get _prevButtonId(): string;
    /**
     * @hidden
     * Next button id
     */
    get _nextButtonId(): string;
    /**
     * @hidden
     * Month label id
     */
    get _monthButtonLabelId(): string;
    /**
     * @hidden
     * Select month aria label id
     */
    get _selectMonthButtonAriaLabelId(): string;
    /**
     * @hidden
     * Year label id
     */
    get _yearButtonLabelId(): string;
    /**
     * @hidden
     * Select year aria label id
     */
    get _selectYearButtonAriaLabelId(): string;
    /**
     * @hidden
     * Years range label id
     */
    get _yearsRangeButtonLabelId(): string;
    /**
     * @hidden
     * Select years range aria label id
     */
    get _selectYearsRangeButtonAriaLabelId(): string;
    /** Month names */
    private _monthNames;
    /** Get information about amount of years displayed at once on year view  */
    private _amountOfYearsPerPeriod;
    /** @hidden */
    private _initiated;
    /** @hidden */
    constructor(_changeDetRef: ChangeDetectorRef, _calendarService: CalendarService, _dateTimeAdapter: DatetimeAdapter<D>);
    /** @hidden */
    ngOnChanges(changes: SimpleChanges): void;
    /** @hidden */
    ngOnInit(): void;
    /**
     * Focus on focusable control within the header
     */
    focus(): void;
    /** @hidden */
    _processViewChange(type: FdCalendarView, event?: MouseEvent): void;
    /** @hidden */
    private _calculateLabels;
    /** @hidden */
    private _calculateSelectMonthLabel;
    /** @hidden */
    private _calculateSelectYearLabel;
    /** @hidden */
    private _calculateSelectAggregatedYearLabel;
    /** @hidden */
    private _calculateMonthNames;
    /** @hidden */
    private _getYearName;
    /** @hidden */
    private _getNormalizedDate;
    static ɵfac: _angular_core.ɵɵFactoryDeclaration<CalendarHeaderComponent<any>, never>;
    static ɵcmp: _angular_core.ɵɵComponentDeclaration<CalendarHeaderComponent<any>, "fd-calendar-header", never, { "activeView": { "alias": "activeView"; "required": false; }; "currentlyDisplayed": { "alias": "currentlyDisplayed"; "required": false; }; "previousButtonDisabled": { "alias": "previousButtonDisabled"; "required": false; }; "nextButtonDisabled": { "alias": "nextButtonDisabled"; "required": false; }; "calendarYearGrid": { "alias": "calendarYearGrid"; "required": false; }; "id": { "alias": "id"; "required": false; }; "mobileLandscape": { "alias": "mobileLandscape"; "required": false; }; }, { "activeViewChange": "activeViewChange"; "previousClicked": "previousClicked"; "nextClicked": "nextClicked"; }, never, never, true, never>;
}

declare class CalendarLegendFocusingService {
    /** Signal to track the focused special day number. Only one legend item can have focus at a time. */
    readonly focusedSpecialDayNumber: _angular_core.WritableSignal<Nullable<number>>;
    /** Clearing the focused element */
    clearFocusedElement(): void;
    /** Setting the special day number that is currently focused */
    handleLegendItemFocus(specialDayNumber: Nullable<number>): void;
    static ɵfac: _angular_core.ɵɵFactoryDeclaration<CalendarLegendFocusingService, never>;
    static ɵprov: _angular_core.ɵɵInjectableDeclaration<CalendarLegendFocusingService>;
}

declare class CalendarLegendComponent<D> {
    /**
     * Make it a column instead
     */
    col: _angular_core.InputSignal<boolean>;
    /** Whether to display the legend item for today's date. */
    displayTodayLegendItem: _angular_core.InputSignal<boolean>;
    /** Whether to display the legend item for the currently selected date. */
    displaySelectedLegendItem: _angular_core.InputSignal<boolean>;
    /** Whether to display the legend item for work days. */
    displayWorkDayLegendItem: _angular_core.InputSignal<boolean>;
    /** Whether to display the legend item for non-work days. */
    displayNonWorkDayLegendItem: _angular_core.InputSignal<boolean>;
    /**
     * Special days rules to be displayed in the legend
     */
    specialDaysRules: _angular_core.InputSignal<SpecialDayRule<D>[]>;
    /** @hidden */
    protected readonly ariaLabel: _angular_core.Signal<string>;
    /** @hidden */
    private readonly _focusingService;
    /** @hidden */
    _handleFocusedElementEvent(specialDayNumber: Nullable<number>): void;
    static ɵfac: _angular_core.ɵɵFactoryDeclaration<CalendarLegendComponent<any>, never>;
    static ɵcmp: _angular_core.ɵɵComponentDeclaration<CalendarLegendComponent<any>, "fd-calendar-legend", never, { "col": { "alias": "col"; "required": false; "isSignal": true; }; "displayTodayLegendItem": { "alias": "displayTodayLegendItem"; "required": false; "isSignal": true; }; "displaySelectedLegendItem": { "alias": "displaySelectedLegendItem"; "required": false; "isSignal": true; }; "displayWorkDayLegendItem": { "alias": "displayWorkDayLegendItem"; "required": false; "isSignal": true; }; "displayNonWorkDayLegendItem": { "alias": "displayNonWorkDayLegendItem"; "required": false; "isSignal": true; }; "specialDaysRules": { "alias": "specialDaysRules"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
}

interface AggregatedYear {
    startYear: number;
    endYear: number;
}
interface CalendarAggregatedYear {
    years: AggregatedYear;
    label: string;
    id?: string;
    current?: boolean;
    selected?: boolean;
    tabIndex?: number;
    ariaLabel?: string;
    index: number;
}

declare class CalendarAggregatedYearViewComponent<D> implements OnInit, OnChanges, FocusableCalendarView {
    private _eRef;
    private _changeDetectorRef;
    private _calendarService;
    private _dateTimeAdapter;
    private _dateTimeFormats;
    /** Parameter used in id of years used for help with focusing on the correct element during keyboard navigation. */
    id: string;
    /** Function that is called when the focus would escape the element. */
    focusEscapeFunction: EscapeFocusFunction;
    /** Parameter holding the year that is currently selected. */
    yearSelected: number;
    /**
     * Object to customize aggregated year grid
     */
    aggregatedYearsViewGrid: CalendarYearGrid;
    /**
     * Object to customize year grid
     */
    yearViewGrid: CalendarYearGrid;
    /** Event fired when a year is selected. */
    readonly yearsClicked: EventEmitter<AggregatedYear>;
    /**
     * View ID
     */
    get viewId(): string;
    /**
     * @hidden
     * Today cell label ID
     */
    get _todayLabelId(): string;
    /**
     * @hidden
     * Selected date label ID
     */
    get _selectedDateLabelId(): string;
    /**
     * @hidden
     *  This variable is used to define which year from calendarYearList should be focusable by tab key
     */
    _activeYear: AggregatedYear;
    /**
     * @hidden
     *  Parameter that stores the dozen of years that are currently being displayed.
     */
    _calendarYearListGrid: CalendarAggregatedYear[][];
    /**
     * @hidden
     * Current period of years selected
     */
    _yearsSelected: AggregatedYear | null;
    /**
     * @hidden
     * Parameter storing the year of the present day.
     */
    _currentYear: number;
    /**
     * @hidden
     * Parameter storing first shown year on list
     */
    private _firstYearInList;
    /**
     * @hidden
     */
    private readonly _destroyRef;
    /** @hidden */
    private _initiated;
    /** @hidden */
    constructor(_eRef: ElementRef, _changeDetectorRef: ChangeDetectorRef, _calendarService: CalendarService, _dateTimeAdapter: DatetimeAdapter<D>, _dateTimeFormats: DateTimeFormats);
    /** @hidden */
    ngOnInit(): void;
    /** @hidden */
    ngOnChanges(changes: SimpleChanges): void;
    /** Method that sends the year to the parent component when it is clicked. */
    selectYear(selectedYear: CalendarAggregatedYear, event?: MouseEvent): void;
    /** Method used to load the previous 12 years to be displayed. */
    loadNextYearsList(): void;
    /** Method used to load the next 12 years to be displayed. */
    loadPreviousYearsList(): void;
    /**
     * Set focus on month cell.
     * It can be a selected cell, current month cell or first cell in the list
     */
    setFocusOnCell(): void;
    /** Method for handling the keyboard navigation. */
    _onKeydownYearHandler(event: KeyboardEvent, index: number): void;
    /**
     * @hidden
     * Method that allows to focus elements inside this component
     */
    _focusElementBySelector(elementSelector: string): void;
    /**
     * @hidden
     * Method returning index of aggregated year index cell
     */
    _getIndex(rowIndex: number, colIndex: number): number;
    /**
     * @hidden
     * Get id of calendar's aggregated year item
     */
    _getId(index: number): string;
    /**
     * @hidden
     * Check if specified year is between start year and end year)
     */
    _isBetween(aggregatedYear: AggregatedYear, yearToCheck: number): boolean;
    /** @hidden */
    private _constructYearsGrid;
    /**
     * @hidden
     * Returns year name as a string.
     */
    private _getYearsName;
    /**
     * @hidden
     * Returns aria year name as a string.
     */
    private _getAriaYearsName;
    /**
     * @hidden
     * Returns year name taking into account yearMapping.
     */
    private _getYearString;
    /**
     * @hidden
     * Amount of years displayed in year view
     */
    private _yearsInOnePeriod;
    /**
     * @hidden
     * Amount of years displayed in aggregated year view
     */
    private _periodsAmount;
    /**
     * @hidden
     * Method that returns active cell, which means:
     * if there is any selected year, return selected year
     * if there is no selected year, but there is current year, return current year
     * if there is no current year, or selected, return first one
     */
    private _getActiveYear;
    /**
     * @hidden
     * Returns transformed 1d array from 2d year grid.
     */
    private _getYearsList;
    /**
     * @hidden
     * Method to put configuration and listeners on calendar keyboard service
     */
    private _setupKeyboardService;
    /** @hidden */
    private _focusOnCellByIndex;
    static ɵfac: _angular_core.ɵɵFactoryDeclaration<CalendarAggregatedYearViewComponent<any>, never>;
    static ɵcmp: _angular_core.ɵɵComponentDeclaration<CalendarAggregatedYearViewComponent<any>, "fd-calendar-aggregated-year-view", never, { "id": { "alias": "id"; "required": false; }; "focusEscapeFunction": { "alias": "focusEscapeFunction"; "required": false; }; "yearSelected": { "alias": "yearSelected"; "required": false; }; "aggregatedYearsViewGrid": { "alias": "aggregatedYearsViewGrid"; "required": false; }; "yearViewGrid": { "alias": "yearViewGrid"; "required": false; }; }, { "yearsClicked": "yearsClicked"; }, never, never, true, never>;
}

interface CalendarDay<D> extends BaseCalendarCell {
    date: D;
    weekDay: number;
    weekend: boolean;
    monthStatus?: 'previous' | 'current' | 'next';
    specialDayNumber?: number;
    shouldHideSpecialDayMarker?: boolean;
    blocked?: boolean;
    past?: boolean;
    selectedFirst?: boolean;
    selectedLast?: boolean;
    selectedRange?: boolean;
    hoverRange?: boolean;
    isTabIndexed?: boolean;
}

/** A class representing a range of dates. */
declare class DateRange<D> {
    /** The start date of the range. */
    readonly start: D | null;
    /** The end date of the range. */
    readonly end: D | null;
    /**
     * Date range.
     * @param start
     * @param end
     */
    constructor(
    /** The start date of the range. */
    start: D | null, 
    /** The end date of the range. */
    end: D | null);
}

/** Component representing the day view of the calendar. */
declare class CalendarDayViewComponent<D> implements OnInit, OnChanges, FocusableCalendarView {
    private eRef;
    private changeDetRef;
    private calendarService;
    private _dateTimeFormats;
    _dateTimeAdapter: DatetimeAdapter<D>;
    /** Currently displayed month and year for days */
    set currentlyDisplayed(currentlyDisplayed: CalendarCurrent);
    get currentlyDisplayed(): CalendarCurrent;
    /** The currently selected date model in single mode. */
    set selectedDate(date: Nullable<D>);
    get selectedDate(): Nullable<D>;
    /** The currently selected date model in multiple mode. */
    set selectedMultipleDates(dates: Array<D>);
    get selectedMultipleDates(): Nullable<Array<D>>;
    /** The currently selected FdDates model start and end in range mode. */
    set selectedRangeDate(dateRange: DateRange<D>);
    get selectedRangeDate(): DateRange<D>;
    /** The currently selected FdDates model start and end in multiple range mode. */
    set selectedMultipleDateRanges(dateRanges: Array<DateRange<D>>);
    get selectedMultipleDateRanges(): Array<DateRange<D>>;
    /** Event emitted always, when next month is selected, by focus */
    readonly nextMonthSelect: EventEmitter<void>;
    /** Event emitted always, when previous month is selected, by focus */
    readonly previousMonthSelect: EventEmitter<void>;
    /** Event thrown every time selected date in single mode is changed */
    readonly selectedDateChange: EventEmitter<D>;
    /** Event thrown every time the selected dates in multiple mode are changed. */
    readonly selectedMultipleDatesChange: EventEmitter<Array<D>>;
    /** Event thrown every time selected first or last date in range mode is changed */
    readonly selectedRangeDateChange: EventEmitter<DateRange<D>>;
    /** Event thrown every time the first or last date in multiple range mode is changed. */
    readonly selectedMultipleDateRangesChange: EventEmitter<Array<DateRange<D>>>;
    /**
     * Function used to disable certain dates in the calendar.
     * @param date date type
     */
    disableFunction: _angular_core.ModelSignal<DisableDateFunction<D>>;
    /**
     * Function used to disable certain dates in the calendar for the range start selection.
     * @param date date representation
     */
    disableRangeStartFunction: _angular_core.ModelSignal<DisableDateFunction<D>>;
    /**
     * Function used to disable certain dates in the calendar for the range end selection.
     * @param date date representation
     */
    disableRangeEndFunction: _angular_core.ModelSignal<DisableDateFunction<D>>;
    /** The day of the week the calendar should start on. 1 represents Sunday, 2 is Monday, 3 is Tuesday, and so on. */
    startingDayOfWeek: _angular_core.ModelSignal<DaysOfWeek | undefined>;
    /** The type of calendar, 'single' for single date selection or 'range' for a range of dates. */
    calType: _angular_core.ModelSignal<CalendarType>;
    /** Id of the calendar. If none is provided, one will be generated. */
    id: _angular_core.InputSignal<string | undefined>;
    /**
     * Whether user wants to mark day cells on hover.
     * Works only on range mode, when start date is selected.
     */
    rangeHoverEffect: _angular_core.ModelSignal<boolean>;
    /**
     * Whether user wants to mark sunday/saturday with `fd-calendar__item--weekend` class
     */
    markWeekends: _angular_core.InputSignal<boolean>;
    /**
     * Whether user wants to show week numbers next to days
     */
    showWeekNumbers: _angular_core.InputSignal<boolean>;
    /**
     * Whether the user wants to select multiple days or multiple range dates.
     * If `displayWeekNumbers` is true, the user can click on the week number to mark the related row.
     * The user can click on week days to mark the related column.
     * Note: Clickable selection for week row or column does not work for range selections.
     */
    allowMultipleSelection: _angular_core.ModelSignal<boolean>;
    /** Function that allows to specify which function would be called, when focus wants to escape */
    focusEscapeFunction: _angular_core.InputSignal<EscapeFocusFunction>;
    /**
     * Special days mark, it can be used by passing array of object with
     * Special day number, list 1-20 [class:`fd-calendar__item--legend-{{number}}`] is available there:
     * https://sap.github.io/fundamental-styles/components/calendar.html calendar special days section
     * Rule accepts method with date object as a parameter. ex:
     * `rule: (date: D) => this.dateAdapter.getDay(date) === 1`, which will mark all sundays as special day.
     */
    specialDaysRules: _angular_core.InputSignal<SpecialDayRule<D>[]>;
    /**
     * @hidden
     * Actual day grid with previous/current/next month days
     */
    _dayViewGrid: CalendarDay<D>[][];
    /**
     * @hidden
     * Array of week numbers displayed for current month/year
     */
    _weeks: string[];
    /**
     * @hidden
     * Array of CSS classes for each week day in calendar header, computed based on whether the calendar type is 'multi'
     * and the date is not disabled.
     */
    _weekHeaderClasses: string[];
    /**
     * @hidden
     * Computed signal for the focused special day number
     */
    protected readonly _focusedSpecialDayNumber: _angular_core.Signal<Nullable<number>>;
    /** @hidden */
    private _selectedDate;
    /** @hidden */
    private _selectedMultipleDates;
    /** @hidden */
    private _selectedRangeDate;
    /** @hidden */
    private _selectedMultipleDateRanges;
    /** @hidden */
    private readonly _destroyRef;
    /**
     * @hidden
     * Days per week
     */
    private readonly _amountOfCols;
    /** @hidden */
    private _isOnRangePick;
    /** @hidden */
    private _isInitiated;
    /** @hidden */
    private _currentlyDisplayed;
    /**
     * @hidden
     * Variable that contains short weekday names.
     */
    private _shortWeekDays;
    /**
     * @hidden
     * Variable that contains short weekday names.
     */
    private _longWeekDays;
    /**
     * @hidden
     * global variable to store the new range.
     */
    private _newRange;
    /**
     * @hidden
     * Cache of days with special markers for efficient legend focus updates
     */
    private _daysWithSpecialMarkers;
    /** @hidden */
    private readonly legendFocusedService;
    /** @hidden */
    constructor(eRef: ElementRef, changeDetRef: ChangeDetectorRef, calendarService: CalendarService, _dateTimeFormats: DateTimeFormats, _dateTimeAdapter: DatetimeAdapter<D>);
    /** @hidden */
    ngOnInit(): void;
    /** @hidden */
    ngOnChanges(changes: SimpleChanges): void;
    /**
     * @hidden
     * Selects a date in single mode, toggles selection in multi mode, or sets the range in range mode.
     * Handles the selection of a date based on the calendar type.
     * @param day The calendar day to be selected.
     * @param event Optional mouse event for handling event propagation.
     */
    selectDate(day: CalendarDay<D>, event?: MouseEvent | KeyboardEvent): void;
    /**
     * Toggles the selection of a week on the calendar.
     * If the provided week is already fully selected, it will deselect it.
     * If the provided week is not fully selected, it will select the entire week and clear any previous selections.
     * @param selectedWeek Array of CalendarDay objects representing the week to be toggled.
     */
    handleWeekSelectionByDays(selectedWeek: Array<CalendarDay<D>>): void;
    /**
     * Toggles the selection of a week on the calendar based on the weekday index.
     * If the provided week is already fully selected, it will deselect it.
     * If the provided week is not fully selected, it will select the entire week and clear any previous selections.
     * @param weekDayIndex The index of the weekday to be toggled.
     */
    handleWeekSelectionByIndex(weekDayIndex: number): void;
    /**
     * Set focus on default focusable cell
     */
    setFocusOnCell(): void;
    /** @hidden */
    _refreshHoverRange(day: CalendarDay<D>): void;
    /**
     * @hidden
     *  Amount of selected days
     *  0, when there is no day selected, or start date is invalid,
     *  1, when there is only valid start date, or end date is same as start date,
     *  2, when both dates are valid
     */
    get _selectCounter(): number;
    /**
     * @hidden
     * Total amount of selected days across multiple ranges.
     * Sums the counts of valid days in each date range.
     */
    get _selectMultipleCounter(): number;
    /**
     * @hidden
     * Method that returns short weekday name.
     * Can be changed by user by providing other class which implements DatetimeAdapter
     */
    get shortWeekDays(): string[];
    /**
     * @hidden
     * Method that returns weekday name.
     * Can be changed by user by providing other class which implements DatetimeAdapter
     */
    get longWeekDays(): string[];
    /**
     * @hidden
     * Function that gives array of all displayed CalendarDays
     */
    get _calendarDayList(): CalendarDay<D>[];
    /**
     * View ID
     */
    get viewId(): string;
    /**
     * @hidden
     * Week column header ID
     */
    get _weekNumbersColumnHeaderId(): string;
    /**
     * @hidden
     * Today cell label ID
     */
    get _todayLabelId(): string;
    /**
     * @hidden
     * Selected date label ID
     */
    get _selectedDateLabelId(): string;
    /**
     * @hidden
     * Date range start date label ID
     */
    get _dateRangeStartLabelId(): string;
    /**
     * @hidden
     * Date range end date label ID
     */
    get _dateRangeEndLabelId(): string;
    /**
     * @hidden
     * Date in past label ID
     */
    get _dateInPastLabelId(): string;
    /**
     * @hidden
     * Method that handles day cells keydown events,
     * @param event KeyboardEvent
     * @param cell CalendarDay
     * @param index with specified column and row as a x and y
     */
    _onKeydownDayHandler(event: KeyboardEvent, cell: CalendarDay<D>, index: number): void;
    /**
     * @hidden
     *  Method that allow to focus elements inside this component
     */
    _focusElementBySelector(elementSelector: string): void;
    /**
     * @hidden
     * Standardized method to calculate grid [x][y] to index number of flatten list
     */
    _getIndex(rowIndex: number, colIndex: number): number;
    /**
     * @hidden
     * Method that selects previous month
     * Triggered only when the month is changed during changing focus
     * Also triggers event to parent calendar component and rebuilds day view grid
     */
    private _selectPreviousMonth;
    /**
     * @hidden
     * Method that selects next month
     * Triggered only when the month is changed during changing focus
     * Also triggers event to parent calendar component and rebuilds day view grid
     */
    private _selectNextMonth;
    /**
     * @hidden
     * Updates the legend focus state for calendar days with special markers
     * @param focusedSpecialDayNumber The currently focused special day number, or null/undefined if no legend item is focused
     */
    private _updateLegendFocusState;
    /**
     * @hidden
     * Method that creates array of CalendarDay models which will be shown on day grid,
     * depending on current month and year.
     */
    private _populateCalendar;
    /**
     * @hidden
     * Method that builds 2 dimensions day view grid, also sets up currently displayed month, or year,
     * when there is not any.
     */
    private _buildDayViewGrid;
    /** @hidden */
    private _isInvalidDate;
    /**
     * @hidden
     * Get id of calendar's day item
     */
    private _getCellIdByIndex;
    /**
     * @hidden
     * Method which provides array of CalendarDay,
     * which contains every single day of currently shown month/year.
     */
    private _getCurrentMonthDays;
    /**
     * @hidden
     * Method that returns active cell, which means:
     * if there is any selected day, return selected day
     * if there is no selected day, but there is today day, return today day
     * if there is no today, or selected, return first one
     */
    private _getActiveCell;
    /**
     * @hidden
     * Method which provides array of CalendarDay,
     * which contains last 0-6 days of previous month/year. Theses days
     * fills the gap between starting startingDayOfWeek and first day of current month
     */
    private _getPreviousMonthDays;
    /**
     * @hidden
     * Method which provides array of CalendarDay, which contains first days of next month/year. Theses days
     * fills the gap between last day of current day and end of 6-weeks calendar grid.
     */
    private _getNextMonthDays;
    /** @hidden */
    private _isWeekendDay;
    /**
     * @hidden
     * Method that generates whole day model basing on date, disabling functions, block functions, and actually
     * chosen range / single date.
     */
    private _getDay;
    /**
     * @hidden
     * Method that is called to refresh i18n short week days.
     */
    private _refreshShortWeekDays;
    /**
     * @hidden
     * Gets special day number of specified date model
     */
    private _getSpecialDay;
    /**
     * @hidden
     * Method that returns array of week's count
     */
    private _refreshWeekCount;
    /**
     * @hidden
     * Get year and month for previous year
     */
    private _getPreviousMonth;
    /**
     * @hidden
     * Get year and month for next year
     */
    private _getNextMonth;
    /**
     * @hidden
     * Method to put configuration and listeners on calendar keyboard service
     */
    private _setupKeyboardService;
    /**
     * @hidden
     * Change selection flag on days to false, besides the selected one
     */
    private _changeSelectedSingleDay;
    /**
     * @hidden
     * Change selection flag on days to false, besides the selected one
     *
     * @param dates - An array of CalendarDay objects to be marked as selected
     * @param calendar - The calendar array containing all CalendarDay objects
     */
    private _changeSelectedMultipleDays;
    /**
     * @hidden
     * Change properties of range days, this method is called, to not rebuild whole grid from scratch,
     * it just changes properties of newly selected/unselected days.
     */
    private _changeSelectedRangeDays;
    /**
     * @hidden
     * Change properties of range days for multiple ranges.
     * This method is called to not rebuild the whole grid from scratch.
     * It just changes properties of newly selected/unselected days.
     */
    private _changeSelectedMultipleRangeDays;
    /** @hidden */
    private refreshTabIndex;
    /** @hidden */
    private focusOnCellByIndex;
    /**
     * @hidden
     * Check if dates are equal
     */
    private _isSameDay;
    /**
     * @hidden
     * Selects a single date and updates the selected date in single mode.
     * @param day The calendar day to be selected.
     */
    private _selectSingleDate;
    /**
     * @hidden
     * Toggles the selection of a date in multi mode.
     * Adds the date if not selected, removes it if already selected.
     * @param day The calendar day to be toggled.
     */
    private _toggleMultiDate;
    /**
     * @hidden
     * Selects or updates the range of dates in range mode.
     * Handles the start and end dates and updates the selected range.
     * @param day The calendar day to be selected or updated in the range.
     */
    private _selectRangeDate;
    /**
     * @hidden
     * Selects or updates multiple ranges of dates in range mode.
     * Handles the start and end dates and updates the selected ranges.
     * @param day The calendar day to be selected or updated in the range.
     */
    private _selectMultipleRangeDates;
    /**
     * Merges overlapping date ranges into a single range.
     *
     * @param ranges - An array of date ranges to be merged.
     * @returns An array of merged date ranges.
     */
    private _mergeOverlappingRanges;
    /**
     * Handles the case where the selected day is part of an existing range.
     *
     * @param tempRanges - An array of date ranges to be checked.
     * @param day - The calendar day to be checked.
     * @returns An array of date ranges with the updated range if the selected day is part of an existing range.
     */
    private _handleExistingRange;
    /**
     * @hidden
     * Checks if a date is within a given date range.
     * @param date The date to check.
     * @param range The date range.
     * @returns True if the date is in the range, false otherwise.
     */
    private _isDateInRange;
    /**
     * @hidden
     * Orders the start and end dates for the range selection.
     * Ensures the start date is before or equal to the end date.
     * @param date1 The first date.
     * @param date2 The second date.
     * @returns An object containing the ordered start and end dates.
     */
    private _getOrderedRange;
    /**
     * @hidden
     * Handles the hover effect for range selection.
     * Toggles the hover effect based on the selection state and event.
     * @param event Optional mouse event for handling hover effect.
     */
    private _handleRangeHoverEffect;
    /**
     * Helper method to toggle the selection of a week.
     * @param selectedWeek Array of CalendarDay objects representing the week to be toggled.
     */
    private toggleWeekSelection;
    /**
     * @hidden
     * Computes the CSS class for each week day in calendar header based on whether the calendar type is 'multi'
     * and the date is not disabled.
     * Stores the computed classes in the weekHeaderClasses array.
     */
    private _computeWeekHeaderClasses;
    /**
     * @hidden
     * Handles hover effect for single-range selection mode.
     * @param day The calendar day that is hovered.
     */
    private _handleSingleRangeHover;
    /**
     * @hidden
     * Handles hover effect for multi-range selection mode.
     * @param day The calendar day that is hovered.
     */
    private _handleMultiRangeHover;
    static ɵfac: _angular_core.ɵɵFactoryDeclaration<CalendarDayViewComponent<any>, never>;
    static ɵcmp: _angular_core.ɵɵComponentDeclaration<CalendarDayViewComponent<any>, "fd-calendar-day-view", never, { "currentlyDisplayed": { "alias": "currentlyDisplayed"; "required": false; }; "selectedDate": { "alias": "selectedDate"; "required": false; }; "selectedMultipleDates": { "alias": "selectedMultipleDates"; "required": false; }; "selectedRangeDate": { "alias": "selectedRangeDate"; "required": false; }; "selectedMultipleDateRanges": { "alias": "selectedMultipleDateRanges"; "required": false; }; "disableFunction": { "alias": "disableFunction"; "required": false; "isSignal": true; }; "disableRangeStartFunction": { "alias": "disableRangeStartFunction"; "required": false; "isSignal": true; }; "disableRangeEndFunction": { "alias": "disableRangeEndFunction"; "required": false; "isSignal": true; }; "startingDayOfWeek": { "alias": "startingDayOfWeek"; "required": false; "isSignal": true; }; "calType": { "alias": "calType"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "rangeHoverEffect": { "alias": "rangeHoverEffect"; "required": false; "isSignal": true; }; "markWeekends": { "alias": "markWeekends"; "required": false; "isSignal": true; }; "showWeekNumbers": { "alias": "showWeekNumbers"; "required": false; "isSignal": true; }; "allowMultipleSelection": { "alias": "allowMultipleSelection"; "required": false; "isSignal": true; }; "focusEscapeFunction": { "alias": "focusEscapeFunction"; "required": false; "isSignal": true; }; "specialDaysRules": { "alias": "specialDaysRules"; "required": false; "isSignal": true; }; }, { "nextMonthSelect": "nextMonthSelect"; "previousMonthSelect": "previousMonthSelect"; "selectedDateChange": "selectedDateChange"; "selectedMultipleDatesChange": "selectedMultipleDatesChange"; "selectedRangeDateChange": "selectedRangeDateChange"; "selectedMultipleDateRangesChange": "selectedMultipleDateRangesChange"; "disableFunction": "disableFunctionChange"; "disableRangeStartFunction": "disableRangeStartFunctionChange"; "disableRangeEndFunction": "disableRangeEndFunctionChange"; "startingDayOfWeek": "startingDayOfWeekChange"; "calType": "calTypeChange"; "rangeHoverEffect": "rangeHoverEffectChange"; "allowMultipleSelection": "allowMultipleSelectionChange"; }, never, never, true, never>;
}

interface CalendarMonth<D> extends BaseCalendarCell {
    /** 1 - 12 */
    month: number;
    index: number;
    date: D;
    selectedFirst?: boolean;
    selectedLast?: boolean;
    selectedRange?: boolean;
    hoverRange?: boolean;
}

/** Component representing the month view of the calendar. */
declare class CalendarMonthViewComponent<D> implements OnInit, OnChanges, FocusableCalendarView {
    private _eRef;
    private _changeDetectorRef;
    private _calendarService;
    private _dateTimeFormats;
    private _dateTimeAdapter;
    /** The id of the calendar passed from the parent component */
    id: string;
    /** A number (1-12) representing the selected month */
    monthSelected: number;
    /** A function that handles escape focus */
    focusEscapeFunction: EscapeFocusFunction;
    /** A year the month view is referring to */
    year: number;
    /** Whether to pick the date range in month year format without picking days */
    isDateRangeMonthYearFormat: boolean;
    /** An event fired when a new month is selected */
    readonly monthClicked: EventEmitter<number>;
    /** Event thrown every time selected first or last date in range mode is changed */
    readonly selectedRangeDateChange: EventEmitter<DateRange<D>>;
    /**
     * Whether user wants to mark month cells on hover.
     * Works only on range mode, when start month is selected.
     */
    rangeHoverEffect: boolean;
    /**
     * @hidden
     * Month grid table
     */
    _calendarMonthListGrid: CalendarMonth<D>[][];
    /**
     * @hidden
     * A number offset used to achieve the 1-12 representation of the calendar
     */
    private readonly _monthOffset;
    /** @hidden */
    private readonly _amountOfColPerRow;
    /** @hidden */
    private readonly _amountOfRows;
    /**
     * @hidden
     */
    private readonly _destroyRef;
    /** @hidden */
    private _initiated;
    /** @hidden */
    private _selectedRangeDate;
    private _isOnRangePick;
    /** @hidden */
    constructor(_eRef: ElementRef, _changeDetectorRef: ChangeDetectorRef, _calendarService: CalendarService, _dateTimeFormats: DateTimeFormats, _dateTimeAdapter: DatetimeAdapter<D>);
    /** @hidden */
    ngOnInit(): void;
    /** @hidden */
    ngOnChanges(changes: SimpleChanges): void;
    /** Get a number (1-12) representing the current month  */
    get currentMonth(): number;
    /**  Getter for the private class member _monthOffset */
    get monthOffset(): number;
    /** View ID */
    get viewId(): string;
    /**
     * @hidden
     * Today cell label ID
     */
    get _todayLabelId(): string;
    /**
     * @hidden
     * Selected date label ID
     */
    get _selectedDateLabelId(): string;
    /** The currently selected FdDates model start and end in range mode. */
    set selectedRangeDate(dateRange: DateRange<D>);
    get selectedRangeDate(): DateRange<D>;
    /**
     * @hidden
     *  Amount of selected months
     *  0, when there is no month selected, or start month is invalid,
     *  1, when there is only valid start month, or end month is same as start month,
     *  2, when both dates are valid
     */
    get _selectCounter(): number;
    /**
     * @hidden
     * Method for handling the keyboard events (a11y)
     */
    _onKeydownMonthHandler(event: KeyboardEvent, index: number): void;
    /**
     * @hidden
     * Method that allows to focus elements inside this component
     */
    _focusElementBySelector(elementSelector: string): void;
    /**
     * @hidden
     * Method returning id of month cell
     */
    _getIndex(rowIndex: number, colIndex: number): number;
    /**
     * @hidden
     * @param index month grid cell index
     */
    _getId(index: number): string;
    /**
     * @hidden
     * Method that checks if this is current month
     */
    _isCurrent(id: number): boolean;
    /**
     * @hidden
     * Method that check if this is selected month
     */
    _isSelected(id: number): boolean;
    /** Method for handling the mouse click event when a month is selected  */
    selectMonth(monthCell: CalendarMonth<D>, event?: MouseEvent | KeyboardEvent): void;
    /**
     * Set focus on month cell.
     * It can be a selected cell, current month cell or first cell in the list
     */
    setFocusOnCell(): void;
    /**
     * @hidden
     * Handles hover effect for range selection mode.
     * @param month The calendar month that is hovered.
     */
    _handleRangeHover(month: CalendarMonth<D>): void;
    /**
     * @hidden
     * Handles the hover effect for range selection.
     * Toggles the hover effect based on the selection state and event.
     * @param event Optional mouse event for handling hover effect.
     */
    private _handleRangeHoverEffect;
    /**
     * @hidden
     * Selects or updates the range of dates in range mode.
     * Handles the start and end dates and updates the selected range.
     * @param month The calendar month to be selected or updated in the range.
     */
    private _selectRangeDate;
    /**
     * @hidden
     * Orders the start and end dates for the range selection.
     * Ensures the start date is before or equal to the end date.
     * @param date1 The first date.
     * @param date2 The second date.
     * @returns An object containing the ordered start and end dates.
     */
    private _getOrderedRange;
    /**
     * @hidden
     * Change properties of range months, this method is called, to not rebuild whole grid from scratch,
     * it just changes properties of newly selected/unselected months.
     */
    private _changeSelectedRangeMonths;
    /**
     * @hidden
     * Check if dates are equal
     */
    private _isSameDate;
    /**
     * @hidden
     * Method that create month grid with required meta data
     */
    private _constructMonthGrid;
    /**
     * @hidden
     * Method to put configuration and listeners on calendar keyboard service
     */
    private _setupKeyboardService;
    /**
     * @hidden
     * Returns transformed 1d array from 2d month grid.
     */
    private _getMonthList;
    /** @hidden */
    private _focusOnCellByIndex;
    static ɵfac: _angular_core.ɵɵFactoryDeclaration<CalendarMonthViewComponent<any>, never>;
    static ɵcmp: _angular_core.ɵɵComponentDeclaration<CalendarMonthViewComponent<any>, "fd-calendar-month-view", never, { "id": { "alias": "id"; "required": false; }; "monthSelected": { "alias": "monthSelected"; "required": false; }; "focusEscapeFunction": { "alias": "focusEscapeFunction"; "required": false; }; "year": { "alias": "year"; "required": false; }; "isDateRangeMonthYearFormat": { "alias": "isDateRangeMonthYearFormat"; "required": false; }; "rangeHoverEffect": { "alias": "rangeHoverEffect"; "required": false; }; "selectedRangeDate": { "alias": "selectedRangeDate"; "required": false; }; }, { "monthClicked": "monthClicked"; "selectedRangeDateChange": "selectedRangeDateChange"; }, never, never, true, never>;
}

/** Component representing the YearView of the Calendar Component. */
declare class CalendarYearViewComponent<D> implements OnInit, OnChanges, FocusableCalendarView {
    private _eRef;
    private _changeDetectorRef;
    private _calendarService;
    private _dateTimeAdapter;
    private _dateTimeFormats;
    /** The id of the calendar passed from the parent component */
    id: string;
    /** Function that is called when the focus would escape the element. */
    focusEscapeFunction: EscapeFocusFunction;
    /** Parameter holding the year that is currently selected. */
    yearSelected: number;
    /**
     * Object to customize year grid
     */
    yearViewGrid: CalendarYearGrid;
    /** Whether the date range is year format only excluding month and day */
    isDateRangeYearFormat: boolean;
    /**
     * Whether user wants to mark year cells on hover.
     * Works only on range mode, when start year is selected.
     */
    rangeHoverEffect: boolean;
    /** Event fired when a year is selected. */
    readonly yearClicked: EventEmitter<number>;
    /** Event thrown every time selected first or last date in range mode is changed */
    readonly selectedRangeDateChange: EventEmitter<DateRange<D>>;
    /**
     * @hidden
     * This variable is used to define which year from calendarYearList should be focusable by tab key
     */
    _activeYear: number;
    /**
     * @hidden
     * Parameter that stores the dozen of years that are currently being displayed.
     */
    _calendarYearListGrid: CalendarYear<D>[][];
    /**
     * @hidden
     * Parameter storing the year of the present day.
     */
    _currentYear: number;
    /**
     * @hidden
     * Parameter storing first shown year on list
     */
    _firstYearInList: number;
    /** View ID */
    get viewId(): string;
    /**
     * @hidden
     * Today cell label ID
     */
    get _todayLabelId(): string;
    /**
     * @hidden
     * Selected date label ID
     */
    get _selectedDateLabelId(): string;
    /**
     * @hidden
     */
    private readonly _destroyRef;
    /** @hidden */
    private _initiated;
    /** @hidden */
    private _selectedRangeDate;
    /** @hidden */
    private _isOnRangePick;
    /** @hidden */
    constructor(_eRef: ElementRef, _changeDetectorRef: ChangeDetectorRef, _calendarService: CalendarService, _dateTimeAdapter: DatetimeAdapter<D>, _dateTimeFormats: DateTimeFormats);
    /** @hidden */
    ngOnInit(): void;
    /** @hidden */
    ngOnChanges(changes: SimpleChanges): void;
    /** The currently selected FdDates model start and end in range mode. */
    set selectedRangeDate(dateRange: DateRange<D>);
    get selectedRangeDate(): DateRange<D>;
    /**
     * @hidden
     *  Amount of selected years
     *  0, when there is no year selected, or start year is invalid,
     *  1, when there is only valid start year, or end year is same as start year,
     *  2, when both dates are valid
     */
    get _selectCounter(): number;
    /** Method used to load the previous {{col * row}} years to be displayed. */
    loadNextYearList(): void;
    /** Method used to load the next {{col * row}} years to be displayed. */
    loadPreviousYearList(): void;
    /** Method that sends the year to the parent component when it is clicked. */
    selectYear(selectedYear: CalendarYear<D>, event?: MouseEvent | KeyboardEvent): void;
    /**
     * Set focus on month cell.
     * It can be a selected cell, current month cell or first cell in the list
     */
    setFocusOnCell(): void;
    /**
     * @hidden
     * Method for handling the keyboard navigation.
     */
    _onKeydownYearHandler(event: KeyboardEvent, index: number): void;
    /**
     * @hidden
     * Method that allows to focus elements inside this component
     */
    _focusElementBySelector(elementSelector: string): void;
    /**
     * @hidden
     * Standardized method to calculate grid [x][y] to index number of flatten list
     */
    _getIndex(rowIndex: number, colIndex: number): number;
    /**
     * @hidden
     * Get grid cell id be index
     * @param index
     */
    _getId(index: number): string;
    /**
     * @hidden
     * Handles hover effect for range selection mode.
     * @param year The calendar year that is hovered.
     */
    _handleRangeHover(year: CalendarYear<D>): void;
    /**
     * @hidden
     * Method that returns active cell, which means:
     * if there is any selected year, return selected year
     * if there is no selected year, but there is current year, return current year
     * if there is no current year, or selected, return first one
     */
    private _getActiveYear;
    /** @hidden */
    private _constructYearGrid;
    /**
     * @hidden
     * Handles the hover effect for range selection.
     * Toggles the hover effect based on the selection state and event.
     * @param event Optional mouse event for handling hover effect.
     */
    private _handleRangeHoverEffect;
    /**
     * @hidden
     * Change properties of range years, this method is called, to not rebuild whole grid from scratch,
     * it just changes properties of newly selected/unselected years.
     */
    private _changeSelectedRangeYears;
    /**
     * @hidden
     * Check if dates are equal
     */
    private _isSameDate;
    /**
     * @hidden
     * Selects or updates the range of years in range mode.
     * Handles the start and end years and updates the selected range.
     * @param year The calendar year to be selected or updated in the range.
     */
    private _selectRangeDate;
    /**
     * @hidden
     * Orders the start and end dates for the range selection.
     * Ensures the start date is before or equal to the end date.
     * @param date1 The first date.
     * @param date2 The second date.
     * @returns An object containing the ordered start and end dates.
     */
    private _getOrderedRange;
    /**
     * @hidden
     * Returns year name as a string.
     */
    private _getYearName;
    /**
     * @hidden
     * Returns aria year name as a string.
     */
    private _getAriaYearName;
    /**
     * @hidden
     * Returns year name taking into account yearMapping.
     */
    private _getYearString;
    /**
     * @hidden
     * Returns transformed 1d array from 2d year grid.
     */
    private _getYearList;
    /**
     * @hidden
     * Amount of years displayed in year view
     */
    private _getAmountOfYearsShownAtOnce;
    /**
     * @hidden
     * Method to put configuration and listeners on calendar keyboard service
     */
    private _setupKeyboardService;
    /** @hidden */
    private _focusOnCellByIndex;
    static ɵfac: _angular_core.ɵɵFactoryDeclaration<CalendarYearViewComponent<any>, never>;
    static ɵcmp: _angular_core.ɵɵComponentDeclaration<CalendarYearViewComponent<any>, "fd-calendar-year-view", never, { "id": { "alias": "id"; "required": false; }; "focusEscapeFunction": { "alias": "focusEscapeFunction"; "required": false; }; "yearSelected": { "alias": "yearSelected"; "required": false; }; "yearViewGrid": { "alias": "yearViewGrid"; "required": false; }; "isDateRangeYearFormat": { "alias": "isDateRangeYearFormat"; "required": false; }; "rangeHoverEffect": { "alias": "rangeHoverEffect"; "required": false; }; "selectedRangeDate": { "alias": "selectedRangeDate"; "required": false; }; }, { "yearClicked": "yearClicked"; "selectedRangeDateChange": "selectedRangeDateChange"; }, never, never, true, never>;
}

/**
 * Months: 1 = January, 12 = december.
 * Days: 1 = Sunday, 7 = Saturday
 *
 * Calendar component used for selecting dates, typically used by the DatePicker and DateTimePicker components.
 * Supports the Angular forms module, enabling form validity, ngModel, etc.
 * ```html
 * <fd-calendar></fd-calendar>
 * ```
 *
 */
declare class CalendarComponent<D> implements OnInit, OnChanges, ControlValueAccessor, Validator {
    private _elementRef;
    private _changeDetectorRef;
    private _dateTimeAdapter;
    private _dateTimeFormats;
    /** The currently selected date model in single mode. */
    selectedDate: Nullable<D>;
    /** The currently selected date model in multiple mode. */
    selectedMultipleDates: Array<D>;
    /** The currently selected date model with start and end in range mode. */
    selectedRangeDate: DateRange<D>;
    /** The currently selected date model with multiple ranges. */
    selectedMultipleDateRanges: Array<DateRange<D>>;
    /**
     * Whether user wants to mark sunday/saturday with `fd-calendar__item--weekend` class
     */
    markWeekends: boolean;
    /**
     * Whether user wants to show week numbers next to days
     */
    showWeekNumbers: boolean;
    /**
     * Whether the user wants to select multiple days or multiple range dates.
     * If `displayWeekNumbers` is true, the user can click on the week number to mark the related row.
     * The user can click on week days to mark the related column.
     * Note: Clickable selection for week row or column does not work for range selections.
     */
    allowMultipleSelection: boolean;
    /** Whether calendar is used inside mobile in landscape mode, it also adds close button on right side */
    mobileLandscape: boolean;
    /** Whether calendar is used inside mobile in portrait mode */
    mobilePortrait: boolean;
    /** Actually shown active view one of 'day' | 'month' | 'year' */
    activeView: FdCalendarView;
    /** The day of the week the calendar should start on. 1 represents Sunday, 2 is Monday, 3 is Tuesday, and so on. */
    startingDayOfWeek: DaysOfWeek;
    /**
     * The type of calendar
     * 'single' for single date selection
     * 'range' for a range of dates.
     */
    calType: CalendarType;
    /** Id of the calendar. If none is provided, one will be generated. */
    id: string;
    /**
     * Special days mark, it can be used by passing array of object with
     * Special day number, list 1-20 [class:`fd-calendar__item--legend-{{number}}`] is available there:
     * https://sap.github.io/fundamental-styles/components/calendar.html calendar special days section
     * Rule accepts method with D object as a parameter. ex:
     * `rule: (fdDate: D) => fdDate.getDay() === 1`, which will mark all sundays as special day.
     */
    specialDaysRules: SpecialDayRule<D>[];
    /**
     * Object to customize year grid,
     * Row, Columns and method to display year can be modified
     */
    yearGrid: CalendarYearGrid;
    /**
     * Object to customize aggregated year grid,
     * Row, Columns and method to display year can be modified
     */
    aggregatedYearGrid: CalendarYearGrid;
    /**
     * Whether user wants to mark day cells on hover.
     * Works only on range mode, when start date is selected on Day View.
     */
    rangeHoverEffect: boolean;
    /** Whether to pick the date range in month or year or days format
     * Day format will have a month and year including day
     * Month format will have year including month
     * Year format will have just year
     * Values can be 'month' for Month format, 'year' for Year format or nothing for day format
     */
    dateRangeFormat: string;
    /** Event thrown every time active view is changed */
    readonly activeViewChange: EventEmitter<FdCalendarView>;
    /** Event thrown every time selected date in single mode is changed */
    readonly selectedDateChange: EventEmitter<D>;
    /** Event thrown every time the selected dates in multiple mode are changed. */
    readonly selectedMultipleDatesChange: EventEmitter<Array<D>>;
    /** Event thrown every time selected first or last date in range mode is changed */
    readonly selectedRangeDateChange: EventEmitter<DateRange<D>>;
    /** Event thrown every time the first or last date in multiple range mode is changed. */
    readonly selectedMultipleDateRangesChange: EventEmitter<Array<DateRange<D>>>;
    /** Event thrown every time when value is overwritten from outside and throw back isValid */
    readonly isValidDateChange: EventEmitter<boolean>;
    /** Event thrown every time when calendar should be closed */
    readonly closeCalendar: EventEmitter<void>;
    /** Event thrown, when close button is clicked */
    readonly closeClicked: EventEmitter<void>;
    /** @hidden */
    _dayViewComponent: CalendarDayViewComponent<D>;
    /** @hidden */
    _monthViewComponent: CalendarMonthViewComponent<D>;
    /** @hidden */
    _yearViewComponent: CalendarYearViewComponent<D>;
    /** @hidden */
    _aggregatedYearViewComponent: CalendarAggregatedYearViewComponent<D>;
    /** @hidden */
    _calendarHeaderComponent: CalendarHeaderComponent<D>;
    /**
     * Function used to disable previous button in the calendar header.
     * @param date selected date
     * @param currentlyDisplayedDate currently displayed date
     * @param activeView current view of calendar
     */
    previousButtonDisableFunction: NavigationButtonDisableFunction<D>;
    /**
     * Function used to disable next button in the calendar header.
     * @param date selected date
     * @param currentlyDisplayedDate currently displayed date
     * @param activeView current view of calendar
     */
    nextButtonDisableFunction: NavigationButtonDisableFunction<D>;
    /**
     * Whether to show the calendar legend below the calendar.
     * The legend displays special day markers and their meanings.
     */
    showCalendarLegend: boolean;
    /**
     * Whether to display the legend in column layout (true) or row layout (false).
     * Column layout is useful when legend is displayed alongside the calendar.
     */
    legendCol: boolean;
    /**
     * @hidden
     * Currently displayed days depending on month and year
     */
    _currentlyDisplayed: CalendarCurrent;
    /** @hidden */
    previousButtonDisabled: boolean;
    /** @hidden */
    nextButtonDisabled: boolean;
    /** @hidden */
    /** @hidden */
    protected readonly calendarRoleDescription: _angular_core.Signal<string>;
    /** @hidden */
    private _adapterStartingDayOfWeek;
    /** @hidden */
    constructor(_elementRef: ElementRef, _changeDetectorRef: ChangeDetectorRef, _contentDensityObserver: ContentDensityObserver, _dateTimeAdapter: DatetimeAdapter<D>, _dateTimeFormats: DateTimeFormats);
    /** That allows to define function that should happen, when focus should normally escape of component */
    escapeFocusFunction: EscapeFocusFunction;
    /**
     * Function used to disable certain dates in the calendar.
     */
    disableFunction: DisableDateFunction<D>;
    /**
     * Function used to disable certain dates in the calendar for the range start selection.
     */
    disableRangeStartFunction: DisableDateFunction<D>;
    /**
     * Function used to disable certain dates in the calendar for the range end selection.
     */
    disableRangeEndFunction: DisableDateFunction<D>;
    /** @hidden */
    focusOut(event: FocusEvent): void;
    /** @hidden */
    onChange: (_: D | Array<D> | DateRange<D> | Array<DateRange<D>>) => void;
    /** @hidden */
    onTouched: () => void;
    /** @hidden */
    ngOnInit(): void;
    /** @hidden */
    ngOnChanges(changes: SimpleChanges): void;
    /** @hidden */
    getWeekStartDay(): DaysOfWeek;
    /**
     * @hidden
     * Function that provides support for ControlValueAccessor that allows to use [(ngModel)] or forms.
     */
    writeValue(selected: D | Array<D> | DateRange<D> | Array<DateRange<D>>): void;
    /**
     * @hidden
     * Function that implements Validator Interface, adds validation support for forms
     */
    validate(): {
        [key: string]: any;
    } | null;
    /** @hidden */
    registerOnChange(fn: any): void;
    /** @hidden */
    registerOnTouched(fn: any): void;
    /**
     * Method that handle active view change and throws event.
     *
     * Fired by calendar header component.
     */
    handleActiveViewChange(activeView: FdCalendarView): void;
    /**
     * @hidden
     * Method that is triggered by events from day view component, when there is selected single date changed
     */
    selectedDateChanged(date: D): void;
    /**
     * @hidden
     * Method that is triggered by events from day view component, when there is selected multi date changed
     */
    selectedMultipleDatesChanged(date: Array<D>): void;
    /**
     * @hidden
     * Method that is triggered by events from day view component, when there is selected range date changed
     */
    selectedRangeDateChanged(dates: DateRange<D>): void;
    /**
     * @hidden
     * Method that is triggered by events from day view component, when there is selected range date changed
     */
    selectedMultipleDateRangesChanged(dates: Array<DateRange<D>>): void;
    /** Function that handles next arrow icon click, depending on current view it changes month, year or list of years */
    handleNextArrowClick(): void;
    /** Function that handles previous arrow icon click, depending on current view it changes month, year or list of years */
    handlePreviousArrowClick(): void;
    /** Function that allows to switch actual view to next month */
    displayNextMonth(): void;
    /** Function that allows to switch actual view to previous month */
    displayPreviousMonth(): void;
    /** Function that allows to switch actual view to next year */
    displayNextYear(): void;
    /** Function that allows to switch actual view to previous year */
    displayPreviousYear(): void;
    /** Function that allows to switch actually displayed list of year to next year list*/
    displayNextYearList(): void;
    /** Function that allows to switch actually displayed list of year to previous year list*/
    displayPreviousYearList(): void;
    /** Function that allows to switch actually displayed list of year to next year list*/
    displayNextYearsList(): void;
    /** Function that allows to switch actually displayed list of year to previous year list*/
    displayPreviousYearsList(): void;
    /**
     * Function that allows to change currently displayed month/year configuration,
     * which are connected to days displayed
     */
    setCurrentlyDisplayed(date: Nullable<D>): void;
    /**
     * Set initial focus on one of the calendar's element
     */
    initialFocus(): void;
    /**
     * @hidden
     * Function that handles changes from month view child component, changes actual view and changes currently displayed month
     */
    handleMonthViewChange(month: number): void;
    /** Select year */
    selectedYear(yearSelected: number): void;
    /** Select year range */
    selectedYears(yearsSelected: AggregatedYear): void;
    /** @hidden */
    onDaysViewSelected(): void;
    /** @hidden */
    onMonthViewSelected(): void;
    /** @hidden */
    onYearViewSelected(): void;
    /** @hidden */
    onYearsRangeViewSelected(): void;
    /** Method that provides information if model selected date/dates have properly types and are valid */
    isModelValid(): boolean;
    /** Whether the date range format is month */
    isDateRangeMonthFormat(): boolean;
    /** Whether the date range format is year */
    isDateRangeYearFormat(): boolean;
    /**
     * @hidden
     * Method that sets up the currently displayed variables, like shown month and year.
     * Day grid is based on currently displayed month and year
     */
    private _prepareDisplayedView;
    /** @hidden */
    private _setCurrentlyDisplayed;
    /** @hidden */
    private _getActiveFocusableView;
    /** @hidden */
    private _setNavigationButtonsStates;
    /** @hidden */
    private _isNavigationButtonDisabled;
    static ɵfac: _angular_core.ɵɵFactoryDeclaration<CalendarComponent<any>, [null, null, null, { optional: true; }, { optional: true; }]>;
    static ɵcmp: _angular_core.ɵɵComponentDeclaration<CalendarComponent<any>, "fd-calendar", never, { "selectedDate": { "alias": "selectedDate"; "required": false; }; "selectedMultipleDates": { "alias": "selectedMultipleDates"; "required": false; }; "selectedRangeDate": { "alias": "selectedRangeDate"; "required": false; }; "selectedMultipleDateRanges": { "alias": "selectedMultipleDateRanges"; "required": false; }; "markWeekends": { "alias": "markWeekends"; "required": false; }; "showWeekNumbers": { "alias": "showWeekNumbers"; "required": false; }; "allowMultipleSelection": { "alias": "allowMultipleSelection"; "required": false; }; "mobileLandscape": { "alias": "mobileLandscape"; "required": false; }; "mobilePortrait": { "alias": "mobilePortrait"; "required": false; }; "activeView": { "alias": "activeView"; "required": false; }; "startingDayOfWeek": { "alias": "startingDayOfWeek"; "required": false; }; "calType": { "alias": "calType"; "required": false; }; "id": { "alias": "id"; "required": false; }; "specialDaysRules": { "alias": "specialDaysRules"; "required": false; }; "yearGrid": { "alias": "yearGrid"; "required": false; }; "aggregatedYearGrid": { "alias": "aggregatedYearGrid"; "required": false; }; "rangeHoverEffect": { "alias": "rangeHoverEffect"; "required": false; }; "dateRangeFormat": { "alias": "dateRangeFormat"; "required": false; }; "previousButtonDisableFunction": { "alias": "previousButtonDisableFunction"; "required": false; }; "nextButtonDisableFunction": { "alias": "nextButtonDisableFunction"; "required": false; }; "showCalendarLegend": { "alias": "showCalendarLegend"; "required": false; }; "legendCol": { "alias": "legendCol"; "required": false; }; "escapeFocusFunction": { "alias": "escapeFocusFunction"; "required": false; }; "disableFunction": { "alias": "disableFunction"; "required": false; }; "disableRangeStartFunction": { "alias": "disableRangeStartFunction"; "required": false; }; "disableRangeEndFunction": { "alias": "disableRangeEndFunction"; "required": false; }; }, { "activeViewChange": "activeViewChange"; "selectedDateChange": "selectedDateChange"; "selectedMultipleDatesChange": "selectedMultipleDatesChange"; "selectedRangeDateChange": "selectedRangeDateChange"; "selectedMultipleDateRangesChange": "selectedMultipleDateRangesChange"; "isValidDateChange": "isValidDateChange"; "closeCalendar": "closeCalendar"; "closeClicked": "closeClicked"; }, never, never, true, never>;
}

/**
 * @deprecated
 * Use direct imports of components and directives.
 */
declare class CalendarModule {
    static ɵfac: _angular_core.ɵɵFactoryDeclaration<CalendarModule, never>;
    static ɵmod: _angular_core.ɵɵNgModuleDeclaration<CalendarModule, never, [typeof CalendarComponent, typeof CalendarHeaderComponent, typeof CalendarDayViewComponent, typeof CalendarMonthViewComponent, typeof CalendarYearViewComponent, typeof CalendarAggregatedYearViewComponent, typeof CalendarCloseButtonDirective], [typeof CalendarComponent, typeof CalendarDayViewComponent, typeof CalendarHeaderComponent, typeof CalendarYearViewComponent, typeof CalendarMonthViewComponent, typeof CalendarAggregatedYearViewComponent, typeof CalendarCloseButtonDirective, typeof i8.ContentDensityModule]>;
    static ɵinj: _angular_core.ɵɵInjectorDeclaration<CalendarModule>;
}

/**
 * Provides i18n support for labels inside the calendar component.
 * @deprecated use i18n `coreCalendar` key instead
 */
declare class CalendarI18nLabels {
    /** This is event that should be called, when labels are changed, to let component detect an changes. */
    readonly labelsChange: Subject<void>;
    /** Year selection aria label. Used on the button to navigate to the years view. */
    yearSelectionLabel: _fundamental_ngx_i18n.FdLanguageKey<undefined>;
    /** Years range selection aria label. Used on the button to navigate to the years range view. */
    yearsRangeSelectionLabel: _fundamental_ngx_i18n.FdLanguageKey<undefined>;
    /** Month selection aria label. Used on the button to navigate to the months view. */
    monthSelectionLabel: _fundamental_ngx_i18n.FdLanguageKey<undefined>;
    /** Day selection aria label. Used on the button to navigate to the day view. */
    dateSelectionLabel: _fundamental_ngx_i18n.FdLanguageKey<undefined>;
    /** Previous year aria label. Used on the button to switch to a previous year in the years view. */
    previousYearLabel: _fundamental_ngx_i18n.FdLanguageKey<undefined>;
    /** Next year aria label. Used on the button to switch to a next year in the years view. */
    nextYearLabel: _fundamental_ngx_i18n.FdLanguageKey<undefined>;
    /** Previous month aria label. Used on the button to switch to a previous month in the months view. */
    previousMonthLabel: _fundamental_ngx_i18n.FdLanguageKey<undefined>;
    /** Next month aria label. Used on the button to switch to a next month in the months view. */
    nextMonthLabel: _fundamental_ngx_i18n.FdLanguageKey<undefined>;
    /** Week number column label */
    weekColumnLabel: _fundamental_ngx_i18n.FdLanguageKey<undefined>;
    /** Selected date label. Used on the selected day/month/year cell. */
    dateSelectedLabel: _fundamental_ngx_i18n.FdLanguageKey<undefined>;
    /** Is used to describe present date */
    todayLabel: _fundamental_ngx_i18n.FdLanguageKey<undefined>;
    /** Range start label. Used for date range selection */
    rangeStartLabel: _fundamental_ngx_i18n.FdLanguageKey<undefined>;
    /** Range end label. Used for date range selection */
    rangeEndLabel: _fundamental_ngx_i18n.FdLanguageKey<undefined>;
    /** Past days aria label. Used when days in the past are accessed */
    dayInPastLabel: _fundamental_ngx_i18n.FdLanguageKey<undefined>;
    /** Past days aria label. Used when days in the past are accessed */
    closeCalendarLabel: _fundamental_ngx_i18n.FdLanguageKey<undefined>;
    /** Calendar day view aria role description. */
    calendarDayViewDescription: _fundamental_ngx_i18n.FdLanguageKey<undefined>;
    /** Calendar month view aria role description. */
    calendarMonthViewDescription: _fundamental_ngx_i18n.FdLanguageKey<undefined>;
    /** Calendar years view aria role description. */
    calendarYearsViewDescription: _fundamental_ngx_i18n.FdLanguageKey<undefined>;
    /** Calendar years range view aria role description. */
    calendarYearsRangeViewDescription: _fundamental_ngx_i18n.FdLanguageKey<undefined>;
}

export { CalendarAggregatedYearViewComponent, CalendarCloseButtonDirective, CalendarComponent, CalendarDayViewComponent, CalendarHeaderComponent, CalendarI18nLabels, CalendarLegendComponent, CalendarLegendFocusingService, CalendarModule, CalendarMonthViewComponent, CalendarService, CalendarTypeEnum, CalendarYearViewComponent, DateRange, FdCalendarViewEnum };
export type { AggregatedYear, CalendarAggregatedYear, CalendarCurrent, CalendarType, CalendarYear, CalendarYearGrid, DaysOfWeek, FdCalendarView, NavigationButtonDisableFunction };
